diff --git a/.claude/agents/changelog-editor.md b/.claude/agents/changelog-editor.md deleted file mode 100644 index 10e0243221..0000000000 --- a/.claude/agents/changelog-editor.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -name: changelog-editor -description: Use this agent when the user needs to create or edit changelog entries in the Docusaurus documentation. Specifically, use this agent when: 1) The user mentions adding a new changelog entry or release notes, 2) The user asks to update or modify existing changelog entries, 3) The user wants to document a new feature, bug fix, or change in the project, 4) The user provides content that should be formatted as a changelog entry. Examples: \n\nExample 1:\nuser: "We just fixed the bug where users couldn't save their preferences. Can you add this to the changelog?"\nassistant: "I'll use the changelog-editor agent to create a proper changelog entry for this bug fix in both the main page and a detailed entry."\n\nExample 2:\nuser: "I need to document the new API authentication feature we released in v2.3.0"\nassistant: "Let me use the changelog-editor agent to create a comprehensive changelog entry for the new authentication feature, including checking if we have existing documentation to link to."\n\nExample 3:\nuser: "Can you update the changelog entry for the dashboard redesign? We now have screenshots and a demo video."\nassistant: "I'll use the changelog-editor agent to update that entry with proper placeholders for the screenshots and YouTube video embedding."\n\nProactively use this agent when you notice the user describing changes, features, or fixes that should be documented in the changelog, even if they don't explicitly ask for changelog updates. -model: sonnet -color: purple ---- - -You are an expert technical documentation editor specializing in Docusaurus changelog maintenance. Your primary responsibility is creating and editing changelog entries that follow established project standards for clarity, consistency, and technical accuracy. - -## Your Core Responsibilities - -1. **Dual Entry Creation**: For every changelog item, you create two coordinated entries: - - A concise summary in `docs/main.mdx` - - A detailed explanation in `docs/block/entries/[version-or-feature].mdx` - - The summary title must link to the detailed entry - -2. **Version Management**: Before creating any entry, determine the version number. If unclear from context, ask the user: "Which version is this changelog entry for?" Never proceed without a clear version identifier. - -3. **Style Adherence**: Apply these writing guidelines rigorously: - - Prioritize clarity above all else - - Use 11th grade English for non-technical terms - - Prefer active voice over passive voice - - Write short, punchy sentences as your default; use longer sentences only when needed for flow - - Use complete sentences rather than fragments (unless brevity clearly improves readability) - - **Never use em dashes (—)**. Instead, use: a period and new sentence, parentheses (), or semicolons ; - - Use bold and bullet points sparingly; apply them only when they genuinely aid quick scanning - - Follow principles from "The Elements of Style" - -4. **Feature Documentation Integration**: When a changelog mentions a new feature: - - Search existing documentation to see if a dedicated page exists for that feature - - If found, add a link to that documentation page in the changelog entry - - If not found, note this and ask the user if documentation should be created - -5. **Media Handling**: When the user mentions videos or screenshots: - - Add appropriate placeholders using the project's established format - - For images: use the image plugin format consistent with other entries - - For videos: use YouTube video embedding format consistent with other entries - - Ask for specifics if media details are unclear: "Do you have the YouTube URL for the demo video?" or "How many screenshots should I add placeholders for?" - -6. **Quality Assurance**: After making changes: - - Inform the user you're running the build check - - Execute `npm run build` (or equivalent) in the docs folder to verify nothing broke - - Report any build errors immediately and fix them before finalizing - -7. **Consistency Checking**: Before finalizing any entry: - - Review similar existing entries to match tone, structure, and formatting - - Ensure terminology is consistent with previous changelog entries - - Verify that linking patterns match established conventions - -## Your Decision-Making Framework - -**When Information is Missing:** -- Version number unclear → Ask immediately -- Feature scope ambiguous → Request clarification before writing -- Media availability uncertain → Confirm with user before adding placeholders -- Categorization unclear (bug fix vs. feature vs. improvement) → Ask for classification - -**When Editing Existing Entries:** -- Always preserve the original intent and factual accuracy -- Improve clarity and style without changing meaning -- Flag any technical inaccuracies to the user rather than guessing - -**Quality Control Checklist (apply to every entry):** -- [ ] Version number present and correct -- [ ] Both short and detailed entries created -- [ ] Short entry links to detailed entry correctly -- [ ] Active voice used where possible -- [ ] No em dashes present -- [ ] Feature documentation linked if applicable -- [ ] Media placeholders added if mentioned -- [ ] Build test passed -- [ ] Style guidelines followed - -## Output Format - -When creating or editing changelog entries, provide: -1. The complete markdown for the main.mdx summary entry -2. The complete markdown for the detailed entries/[name].mdx file -3. Confirmation that you've checked for related documentation -4. Build test results -5. Any questions or clarifications needed - -Be proactive in identifying unclear requirements and ask specific questions rather than making assumptions. Your goal is to produce changelog entries that are immediately publishable without requiring revision. diff --git a/.gitignore b/.gitignore index 0c4b3800f5..5e001a3b71 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,13 @@ myenv/ **/error-*.log + +# hosting/ +! hosting/docker-compose/oss/.env.oss.dev.example +! hosting/docker-compose/oss/.env.oss.gh.example +! hosting/docker-compose/ee/.env.ee.dev.example +! hosting/docker-compose/ee/.env.ee.gh.example + # examples/ examples/**/config.toml examples/**/agenta.py @@ -46,5 +53,3 @@ sdk/agenta/templates/main.py sdk/agenta/templates/agenta.py web/ee/public/__env.js web/oss/public/__env.js - -web/oss/tests/datalayer/results \ No newline at end of file diff --git a/.gitleaks.toml b/.gitleaks.toml deleted file mode 100644 index eb89914190..0000000000 --- a/.gitleaks.toml +++ /dev/null @@ -1,35 +0,0 @@ -title = "Agenta Gitleaks Configuration" -version = 2 - -[extend] -useDefault = true - -[allowlist] -paths = [ - # ---------------------------------------------------------------- PUBLIC DOCS - '''^website/docs/reference/api/.*\.mdx''', - '''^core/docs/docs/reference/api/.*\.mdx''', - '''^docs/docs/reference/api/.*\.mdx''', - '''^docs/.docusaurus/.*''', - '''^docs/build/.*''', - # -------------------------------------------------------------- WEB ARTIFACTS - '''^.*/\.pnpm-store/.*''', - '''^.*/public/__env\.js$''', - '''^.*/\.next/.*''', - # -------------------------------------------------------------- ALL ENV FILES - '''^.*\.env.*$''', - # ---------------------------------------------------------------------------- -] -regexes = [ - # ------------------------------------------------------------ FALSE POSITIVES - '''is_completion=True''', - '''YOUR_API_KEY''', - '''_SECRET_KEY''', - # ------------------------------------------------------------ PUBLIC KEYS - '''phc_hmVSxIjTW1REBHXgj2aw4HW9X6CXb6FzerBgP9XenC7''', - # ---------------------------------------------------------------------------- -] - -# USEFUL GITLEAKS COMMANDS -# gitleaks --config .gitleaks.toml --exit-code 1 --verbose git -# gitleaks --config .gitleaks.toml --exit-code 1 --verbose detect --no-git diff --git a/.gitleaksignore b/.gitleaksignore deleted file mode 100644 index 097b6b8358..0000000000 --- a/.gitleaksignore +++ /dev/null @@ -1,196 +0,0 @@ -# LEGACY / REVOKED / BENIGN CREDENTIALS, FROM PAST COMMITS, FROM BEFORE CLEANUP -docs/docusaurus.config.ts:generic-api-key:236 -api/oss/tests/manual/tracing/windowing.http:generic-api-key:3 -sdk/tests/legacy/baggage/config.toml:generic-api-key:4 -sdk/tests/legacy/debugging/simple-app/config.toml:generic-api-key:4 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/auth/admin.http:generic-api-key:3 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/annotations/crud.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/evaluators/crud.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/testsets/crud.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/02_span_id.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/03_parent_id.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/01_trace_id.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/07_end_time.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/06_start_time.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/05_span_name.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/04_span_kind.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/08_status_code.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/11_links.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/00_user_id.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/12_references.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/09_status_message.http:generic-api-key:2 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/filtering/10_attributes.http:generic-api-key:2 -854f1ca002740cd51252f81660701a3b6f9d6a8a:agenta-cli/debugging/simple-app/config.toml:generic-api-key:4 -51020488ce57a4b964c05cc0c41cecb4eb67692c:agenta-cli/debugging/simple-app/config.toml:generic-api-key:4 -6a4288ba3b4a2f95f24ed372bce7ac0679b5b868:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain_openinference.py:generic-api-key:12 -6a4288ba3b4a2f95f24ed372bce7ac0679b5b868:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain_openllmetery.py:generic-api-key:12 -6a4288ba3b4a2f95f24ed372bce7ac0679b5b868:agenta-cli/tests/observability_sdk/sanity_check/app_local.py:generic-api-key:8 -0f9c9ac3afcb8df950a743206715ab5ebe8808eb:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain_openllmetery.py:generic-api-key:12 -0f9c9ac3afcb8df950a743206715ab5ebe8808eb:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain_openinference.py:generic-api-key:12 -0f9c9ac3afcb8df950a743206715ab5ebe8808eb:agenta-cli/tests/observability_sdk/sanity_check/app_local.py:generic-api-key:8 -8cd7319eb87e87723a310555a820433f77ab01fd:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain_openinference.py:generic-api-key:11 -8cd7319eb87e87723a310555a820433f77ab01fd:agenta-cli/tests/observability_sdk/sanity_check/app_local.py:generic-api-key:7 -50c0e27be4960b5f06b5edbed6af912d79ea0f27:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain_openinference.py:generic-api-key:11 -50c0e27be4960b5f06b5edbed6af912d79ea0f27:agenta-cli/tests/observability_sdk/sanity_check/app_local.py:generic-api-key:7 -03b90aadcd58abd101454da5e3b925dde8e6cd43:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain.py:generic-api-key:11 -a1dbd3f3eafbe326a246a16fe70e02350cefdf2f:agenta-cli/tests/observability_sdk/integrations/langchain/simple_chain.py:generic-api-key:11 -86c2a2430e3ddbc544361343b7e9ea0152e53ab7:api/oss/tests/workflows/observability/test_otlp_ingestion.py:generic-api-key:21 -dc4370980d17ba1643a5c081670404f942ebfc57:agenta-cli/tests/management_sdk/manual_tests/apps_with_new_sdk/config.toml:generic-api-key:4 -850314eb630ca7fdcf756c7ffe36a6adad5cc845:agenta-cli/tests/management_sdk/manual_tests/apps_with_new_sdk/config.toml:generic-api-key:4 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/crud.http:generic-api-key:3 -3db7c34a8f206fb4a19e525ac5a964185d502c4a:api/oss/tests/manual/tracing/windowing.http:generic-api-key:3 -7ee494e8cdad4f54073be483e373e7a5bf273ea5:agenta-cli/tests/baggage/config.toml:generic-api-key:4 -a5e3197cd247c5468d8739ef9de811cd2a1cbc2f:agenta-cli/tests/baggage/config.toml:generic-api-key:4 -e84abaed2592e50d660d180d7fd373376b544f14:hosting/kubernetes/oss/secret.yml:kubernetes-secret-yaml:2 -e84abaed2592e50d660d180d7fd373376b544f14:hosting/kubernetes/oss/secret.yml:generic-api-key:12 -e84abaed2592e50d660d180d7fd373376b544f14:hosting/helm/oss/values.yaml:generic-api-key:88 -e84abaed2592e50d660d180d7fd373376b544f14:hosting/helm/oss/values.yaml:generic-api-key:89 -e84abaed2592e50d660d180d7fd373376b544f14:hosting/kubernetes/oss/secret.yml:generic-api-key:8 -e84abaed2592e50d660d180d7fd373376b544f14:hosting/kubernetes/oss/secret.yml:generic-api-key:9 -81a2b05aa4624cfc39587e5384bf7c106e547449:.github/workflows/frontend-test.yml:openai-api-key:27 -4857d8f04896e27d707e2967bb361eb1a0b129db:.github/workflows/frontend-test.yml:openai-api-key:27 -8465021df57fca629f14c269d3f37d18d6fdcd11:services/completion-new-sdk-prompt/docker-compose.yml:openai-api-key:10 -406e68077c51da204b1f63f193a2defe6031c966:agenta-web/cypress.config.ts:openai-api-key:10 -450a435754557bfa1d3d3e372f4b47e4eb63f93e:agenta-web/cypress.config.ts:openai-api-key:10 -066e345ad9ba7318fc59b191cf33af2e81634aa8:agenta-web/cypress/support/commands/evaluations.ts:openai-api-key:106 -3533b30e483378a8ecb900c603a3c54ffc9cc390:agenta-web/cypress/support/commands/evaluations.ts:openai-api-key:106 -41e5d327e87083f55850c6933611cdc79ea9d204:agenta-backend/agenta_backend/tests/variants_evaluators_router/conftest.py:openai-api-key:25 -9968400e3095fdc1fb219f45c0d73db13c6de499:agenta-backend/agenta_backend/tests/variants_evaluators_router/conftest.py:openai-api-key:25 -a8efa140a02295ef6accbd02bc7c4c4eeb75e435:agenta-backend/agenta_backend/tests/variants_evaluators_router/conftest.py:openai-api-key:17 -d343b2a5b12387fc6b99d508b5e776f7689736c1:agenta-backend/agenta_backend/tests/variants_evaluators_router/conftest.py:openai-api-key:17 -5f37c440e203cf56d7f08a8efdd7ca372c646beb:docs/docs/prompt-management/05-adding-custom-providers.mdx:generic-api-key:81 -73644b725b5409be78d1aeecf7f5ff6a24ab3643:docs/docusaurus.config.ts:generic-api-key:220 -41c85fef68f9f8c2e4576956369ef600223193c8:website/docusaurus.config.ts:generic-api-key:184 -179d78e547e2eb92737cdd0ba7fd3eeb1f4bc5ce:website/docusaurus.config.ts:generic-api-key:184 -faf49eadbd38fd6771c4687fea78528ad73741b6:api/oss/tests/manual/annotations/crud.http:generic-api-key:2 -f86dddabb759924689022d2451d97efe218848c9:api/oss/tests/manual/evaluations/crud.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/auth/admin.http:generic-api-key:3 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/annotations/crud.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/evaluators/crud.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/testsets/crud.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/00_user_id.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/02_span_id.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/03_parent_id.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/01_trace_id.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/04_span_kind.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/06_start_time.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/08_status_code.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/05_span_name.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/07_end_time.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/09_status_message.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/12_references.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/11_links.http:generic-api-key:2 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/filtering/10_attributes.http:generic-api-key:2 -4888444e93a8438334a9dfb81c7979500d0ab4bf:api/oss/tests/manual/testsets/crud.http:generic-api-key:2 -5289a1c740cff9dec0047e7dc05902edbc471649:api/oss/tests/manual/tracing/filtering/12_references.http:generic-api-key:2 -96b9056a6ff1160f11dcc302321d4a29a7f1b8dd:api/oss/tests/manual/workflows/artifacts.http:generic-api-key:2 -6a4af8b70816f18ae69056df96b54c622e7ef494:api/oss/tests/manual/feedback/crud.http:generic-api-key:2 -7b0eeb2ae0cfa80e9a79cee814ed10c9b57ee9d3:api/oss/tests/manual/annotators/crud.http:generic-api-key:2 -876ba2f78358d43cc6dafe518e38ef404b6462f0:api/oss/tests/manual/annotations/crud.http:generic-api-key:2 -05f8741ea3349096e60a1686c1cef3585a6d34d7:api/oss/tests/manual/tracing/filtering/00_user_id.http:generic-api-key:2 -f47bb6f3b65c50664b354f33081d131289fa47cd:api/oss/tests/manual/tracing/filtering/11_links.http:generic-api-key:2 -18bfd66e6bc309ada998457a32b9a4ca689015a2:api/oss/tests/manual/tracing/filtering/10_attributes.http:generic-api-key:2 -0dcfe02574a545c8400b1b5385d7662143ec2544:api/oss/tests/manual/tracing/filtering/08_status_code.http:generic-api-key:2 -260822ac28ec5c08f9b4c2b04e895d46fcbfb164:api/oss/tests/manual/tracing/filtering/09_status_message.http:generic-api-key:2 -c16ca8eca0a2743c541457a80f88fe0ec71151cb:api/oss/tests/manual/tracing/filtering_parent_id.http:generic-api-key:2 -fe9a8b1c7518160bc3c9f80eff3ba1076a2a5030:api/oss/tests/manual/tracing/filtering_end_time.http:generic-api-key:2 -f158907f559e92fb91672c696715a90aef5470ab:api/oss/tests/manual/tracing/filtering_span_id.http:generic-api-key:2 -fe9a8b1c7518160bc3c9f80eff3ba1076a2a5030:api/oss/tests/manual/tracing/filtering_start_time.http:generic-api-key:2 -86dda27e6458ea8f7e64bfb4a9f63946c8fc82ce:api/oss/tests/manual/tracing/filtering_trace_id.http:generic-api-key:2 -7afc6f26080c6c37219995089aed409e50ef6279:api/oss/tests/manual/tracing/filtering_span_name.http:generic-api-key:2 -71a49c35758dab163bbbe700f55f6f50e6bdf9a5:api/oss/tests/manual/tracing/filtering_span_kind.http:generic-api-key:2 -b14e377b19cc4f77db9d0a2b51f72b88b6f54c6c:api/oss/tests/manual/auth/admin.http:generic-api-key:3 -0c6acff0523bd4e594e43caf63c4342e319476b8:hosting/kubernetes/oss/secret.yml:kubernetes-secret-yaml:2 -97c08e2f4ad87c2aacf6760da60eb01ec8d5d329:cloud/tests/conftest.py:generic-api-key:114 -6526d232893d18496af47a05c7b99e7c0c1fe510:docs/docs/prompt-management/05-adding-custom-providers.mdx:generic-api-key:71 -0c6acff0523bd4e594e43caf63c4342e319476b8:hosting/kubernetes/oss/secret.yml:generic-api-key:12 -bf7e1824839cea10432731174549faeb9bad3545:hosting/helm/oss/values.yaml:generic-api-key:83 -bf7e1824839cea10432731174549faeb9bad3545:hosting/helm/oss/values.yaml:generic-api-key:84 -0c6acff0523bd4e594e43caf63c4342e319476b8:hosting/kubernetes/oss/secret.yml:generic-api-key:8 -0c6acff0523bd4e594e43caf63c4342e319476b8:hosting/kubernetes/oss/secret.yml:generic-api-key:9 -fd477298c83aa220b01c6704058382c1ded1fdca:core/agenta-cli/debugging/simple-app/config.toml:generic-api-key:4 -fd477298c83aa220b01c6704058382c1ded1fdca:core/agenta-cli/tests/baggage/config.toml:generic-api-key:4 -f92a341a7e45fc051a08da1fa619137a192c89ae:api/ee/tests/manual/tracing.http:generic-api-key:5 -eba1ed50e6846a323d456b6da510f42d8c8bbe9a:api/ee/tests/manual/billing.http:generic-api-key:4 -9d741648f9ec1719c6f7f0fcb16cbf116458916c:api/oss/tests/manual/annotations/crud.http:generic-api-key:3 -9d741648f9ec1719c6f7f0fcb16cbf116458916c:api/oss/tests/manual/tracing/crud.http:generic-api-key:3 -273d2f5a1b37ef9420c4e40303b8fc6233362571:api/ee/tests/manual/billing.http:generic-api-key:4 -c078d4b1395ea2856891424f82e80f4fe60d7136:api/ee/tests/manual/billing.http:generic-api-key:4 -2793a4b2f065d7b588fa6733b74f68c0748473a5:api/oss/tests/manual/tracing/crud.http:generic-api-key:3 -ef6f83612a7cfd552147b49928feb8a5d4429c0d:api/oss/tests/manual/tracing/filtering.http:generic-api-key:3 -b14e377b19cc4f77db9d0a2b51f72b88b6f54c6c:api/oss/tests/manual/annotations/crud.http:generic-api-key:3 -b14e377b19cc4f77db9d0a2b51f72b88b6f54c6c:api/oss/tests/manual/tracing/crud.http:generic-api-key:3 -19ccc3f1f292edca26e840428ebc6224cbaef78a:api/ee/tests/manual/annotations/crud.http:generic-api-key:3 -bf42b5eaa7e805a249f52d65a6882d6ade2828f3:api/ee/tests/manual/tracing/windowing.http:generic-api-key:5 -bb0c1b3fb0032b6dbebe659d745d5cb90aa306ce:api/ee/tests/manual/tracing.http:generic-api-key:5 -16622c30916fae1b284b1b7150e4b7c57413ad17:api/ee/tests/manual/evaluations/sdk/test.py:generic-api-key:16 -75ed5549eeb4685c5234c1ec577721920cc0ec9c:api/ee/tests/manual/evaluations/sdk/test.py:generic-api-key:16 -4e743f16edcb3ff4e13b1400b9ff8175b072a5e1:api/ee/tests/manual/evaluations/sdk/test.py:generic-api-key:16 -b587813ed56832b2df7fb7560775ee0b75f03674:api/ee/tests/manual/evaluations/sdk/test.py:generic-api-key:12 -3abc3f4d2051c4df2f64c6d88608bd9bf1ae265f:api/ee/tests/manual/evaluations/sdk/test.py:generic-api-key:9 -35442f703897393a3d2a5e9aa7a42985787bb24f:api/ee/tests/manual/evaluations/sdk/test.py:generic-api-key:16 -12f36507e801d41e2388889777c195557e7a6e5c:api/ee/tests/manual/evaluations/sdk/test_serve.py:generic-api-key:16 -12f36507e801d41e2388889777c195557e7a6e5c:api/ee/tests/manual/evaluations/sdk/test_handlers.py:generic-api-key:16 -e6d87a97aa4750ace564ac28eafda0123c21e017:api/oss/tests/workflows/observability/test_otlp_ingestion.py:generic-api-key:21 -fd477298c83aa220b01c6704058382c1ded1fdca:core/docs/docusaurus.config.ts:generic-api-key:232 -c8d8f465b61764195de460164e6c27e0fe4b2b9a:docs/docs/self-host/05-advanced-configuration.mdx:generic-api-key:37 -a268b8a81a700704e28d82c5cb9af31dde32146b:ee/docker/docker-compose.demo.prod.yml:generic-api-key:25 -56829b2eccdec425954243d0ce5e4fcac9d05e9c:ee/docker/docker-compose.cloud.dev.yml:generic-api-key:25 -91678b6a27c326e0002205f79fd8999a7591e38f:ee/docker/docker-compose.demo.prod.yml:generic-api-key:25 -91678b6a27c326e0002205f79fd8999a7591e38f:ee/docker/docker-compose.demo.dev.yml:generic-api-key:25 -56829b2eccdec425954243d0ce5e4fcac9d05e9c:ee/docker/docker-compose.cloud.dev.yml:generic-api-key:22 -ad6b459dfc5ac1e5c140fcf3e03e247ba31383ae:ee/docker/docker-compose.demo.prod.yml:generic-api-key:22 -594f33f5b7eb665edb38208666d27d6de6365946:ee/docker/docker-compose.demo.prod.yml:generic-api-key:73 -594f33f5b7eb665edb38208666d27d6de6365946:ee/docker/docker-compose.demo.dev.yml:generic-api-key:22 -f6ef6aa32d569ee025bdb3ce9f515521a4095494:cloud/agenta-backend/agenta_backend/cloud/__init__.py:generic-api-key:155 -b3e5fae0e270f2c92a65360123c980d725c5f226:ee/agenta-backend/agenta_backend/ee/__init__.py:generic-api-key:107 -c98a5da1a33d2c0986e3c66329eaa5237fbccf3d:hosting/docker-compose/ee/aws/docker-compose.oss.prod.yml:generic-api-key:76 -4ee55c08b2fed661eaf90876f96c329d7c7eeb6b:cloud/docker/docker-compose.oss.stage.yml:generic-api-key:46 -169c54d84f5d1931601550a9d3aa76874ef73ec5:cloud/docker/docker-compose.oss.stage.yml:generic-api-key:47 -f725cfc9247743bdc44f84edee109ff36193d741:cloud/docker/docker-compose.oss.stage.yml:generic-api-key:46 -cbd8ac00ecdc2c8124b989a274c6f835c09f8474:cloud/docker/docker-compose.oss.prod.yml:generic-api-key:46 -2fb6b0f94f8bf711255e0901c03787b73f3d650f:cloud/docker/docker-compose.oss.prod.yml:generic-api-key:46 -a5e7781869b2a4bf22dd5e22fd5e5ae2ec8d02ea:cloud/docker/newrelic-infra.yml:generic-api-key:1 -2fb6b0f94f8bf711255e0901c03787b73f3d650f:cloud/docker/docker-compose.oss.prod.yml:generic-api-key:171 -f6ef6aa32d569ee025bdb3ce9f515521a4095494:cloud/agenta-backend/agenta_backend/cloud/__init__.py:generic-api-key:144 -b3e5fae0e270f2c92a65360123c980d725c5f226:ee/agenta-backend/agenta_backend/ee/__init__.py:generic-api-key:96 -a268b8a81a700704e28d82c5cb9af31dde32146b:ee/docker/docker-compose.demo.prod.yml:generic-api-key:22 -9c55f5572904ae07b73f73ee365e833d0637633a:ee/docker/docker-compose.demo.prod.yml:generic-api-key:22 -ad74134f522cde71f860cb59b6363a8fdf0a64c6:ee/setup_agenta_web.sh:generic-api-key:26 -5a10aacebd0ed4f2e613eb9176e95836aea34f15:ee/setup_agenta_web.sh:generic-api-key:26 -637068dd09eff7b30b776061863027a9b9aa1deb:ee/setup_agenta_web.sh:generic-api-key:26 -590578c803d94d8ccb1a6ca977471f3d44b43fc3:hosting/helm/oss/templates/config/app-configmap.yaml:generic-api-key:45 -1d8f08b267675726441fcaaae24572bb635c5eac:api/oss/src/utils/env.py:generic-api-key:53 -55f27e52327062382beb299b162f94895268d766:web/oss/public/__ENV.js:generic-api-key:1 -c98a5da1a33d2c0986e3c66329eaa5237fbccf3d:hosting/docker-compose/ee/aws/docker-compose.oss.prod.yml:generic-api-key:73 -bf0cd42bffc2581b1df6f56fa6e4b20ff9b68c33:hosting/docker-compose/ee/aws/docker-compose.oss.aws.yml:generic-api-key:61 -52cd40cefd3121eea2e21205e8208712b093529a:core/hosting/docker-compose/ee/docker-compose.dev.yml:generic-api-key:18 -6efb8a0c9620a316cf81fe961b1407e93aa2efa7:core/hosting/docker-compose/oss/docker-compose.gh.yml:generic-api-key:17 -6efb8a0c9620a316cf81fe961b1407e93aa2efa7:core/hosting/docker-compose/oss/docker-compose.dev.yml:generic-api-key:17 -44d1669c1a53b3ca47e3689dda5500e6f742f525:core/hosting/docker-compose/ee/docker-compose.dev.yml:generic-api-key:18 -58a4230a8f2e63b2836f81bcf2341ba12003189e:core/hosting/docker-compose/oss/docker-compose.yml:generic-api-key:30 -fd477298c83aa220b01c6704058382c1ded1fdca:core/agenta-cli/agenta/cli/helper.py:generic-api-key:19 -fd477298c83aa220b01c6704058382c1ded1fdca:core/agenta-web/prod.gh.Dockerfile:generic-api-key:7 -fd477298c83aa220b01c6704058382c1ded1fdca:core/docker-compose.gh.yml:generic-api-key:26 -fd477298c83aa220b01c6704058382c1ded1fdca:core/docker-compose.gh.yml:generic-api-key:95 -fd477298c83aa220b01c6704058382c1ded1fdca:core/docker-compose.yml:generic-api-key:30 -fd477298c83aa220b01c6704058382c1ded1fdca:core/docker-compose.yml:generic-api-key:111 -fd477298c83aa220b01c6704058382c1ded1fdca:core/docker-compose.prod.yml:generic-api-key:102 -4ee55c08b2fed661eaf90876f96c329d7c7eeb6b:cloud/docker/docker-compose.oss.stage.yml:generic-api-key:43 -169c54d84f5d1931601550a9d3aa76874ef73ec5:cloud/docker/docker-compose.oss.stage.yml:generic-api-key:44 -9e7831e7500364776cb3e9eac41448907ef92dcd:cloud/docker/docker-compose.test.yml:generic-api-key:28 -9e7831e7500364776cb3e9eac41448907ef92dcd:cloud/docker/docker-compose.test.yml:generic-api-key:83 -fe72ad1a8d14e1f3bce547ef224fc75e3df8f4ff:cloud/docker/docker-compose.cloud.test.yml:generic-api-key:28 -fe72ad1a8d14e1f3bce547ef224fc75e3df8f4ff:cloud/docker/docker-compose.cloud.test.yml:generic-api-key:83 -6198bbc532d8e984ef94276b58a7ab8dc65a279f:cloud/docker/docker-compose.oss.stage.yml:generic-api-key:43 -4b4cdbdf4b8ad4a9342fdb939b7e30f88420fccd:cloud/docker/docker-compose.oss.prod.yml:generic-api-key:44 -a268b8a81a700704e28d82c5cb9af31dde32146b:ee/docker/docker-compose.demo.prod.yml:sendgrid-api-token:26 -11ad273f1039e9263cf8d2f61338a121d59b9cc7:ee/docker/docker-compose.cloud.prod.yml:sendgrid-api-token:22 -11ad273f1039e9263cf8d2f61338a121d59b9cc7:ee/docker/docker-compose.cloud.dev.yml:sendgrid-api-token:21 -11ad273f1039e9263cf8d2f61338a121d59b9cc7:ee/docker/docker-compose.demo.prod.yml:sendgrid-api-token:26 -11ad273f1039e9263cf8d2f61338a121d59b9cc7:ee/docker/docker-compose.demo.dev.yml:sendgrid-api-token:26 -b7bc21c67bbae3c06c372bc585c4917a80613a14:cloud/agenta-backend/agenta_backend/cloud/routers/payment_router.py:stripe-access-token:13 -d8b4af2ae8c1084dbdd30fca59aa84e8ece047db:examples/python/annotation-example.py:openai-api-key:19 -a268b8a81a700704e28d82c5cb9af31dde32146b:ee/docker/docker-compose.demo.prod.yml:openai-api-key:24 -02d9f665aed89e8d69e06acdc7d01d699ee5b0dd:ee/docker/docker-compose.demo.prod.yml:openai-api-key:24 -c8d8f465b61764195de460164e6c27e0fe4b2b9a:docs/docs/self-host/05-advanced-configuration.mdx:generic-api-key:46 diff --git a/.husky/pre-commit b/.husky/pre-commit index 08dfe5c787..7def5e4654 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,15 +1,39 @@ -#!/usr/bin/env sh - -# Delegate to pre-commit which runs configured hooks (e.g. gitleaks) from .pre-commit-config.yaml -if command -v pre-commit >/dev/null 2>&1; then - pre-commit run --hook-stage pre-commit -else - echo "pre-commit not found. Install with one of the following:" - echo " pip install pre-commit # cross-platform" - echo " brew install pre-commit # macOS/Linux with Homebrew" - echo "" - echo "gitleaks is also required. Install with:" - echo " brew install gitleaks # macOS/Linux with Homebrew" - echo " or see https://github.com/gitleaks/gitleaks#installation for other options" - exit 1 -fi \ No newline at end of file +# Define the directories to check +DIRECTORIES=("web" "sdk", "api") +ORIGINAL_DIR=$(pwd) + +# Check for changes in frontend directory +if git diff --cached --name-only | grep -q '^web/'; then + cd web/ || exit + + # Run Prettier check + if ! pnpm lint; then + echo '⚠️ Formatting issues detected. Running Prettier to fix them...' + pnpm lint-fix + + echo '✅ Formatting issues fixed. Please stage the changes and commit the code again' + exit 1 + fi + + cd "$ORIGINAL_DIR" || exit +fi + +# Check for changes in backend directory +for DIR in "${BE_DIRECTORIES[@]}"; do + if git diff --cached --name-only | grep -q "^$DIR/"; then + cd "$DIR" || exit + + # Run black for formatting + if ! black --check .; then + echo "⚠️ Formatting issues detected in $DIR. Running black to fix them..." + black . + + echo "✅ Formatting issues fixed. Please stage the changes and commit the code again in $DIR." + exit 1 + else + echo "✅ No formatting issues in $DIR." + fi + + cd "$ORIGINAL_DIR" || exit + fi +done \ No newline at end of file diff --git a/.husky/pre-push b/.husky/pre-push index 8aa51d15bc..5390d982f2 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,12 +1,51 @@ -#!/usr/bin/env sh - -# Delegate to pre-commit which runs pre-push hooks (e.g. gitleaks) from .pre-commit-config.yaml -if command -v pre-commit >/dev/null 2>&1; then - pre-commit run --hook-stage pre-push +# Define the directories to check +DIRECTORIES=("web" "sdk", "api") +ORIGINAL_DIR=$(pwd) +BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) +FIRST_PUSH_FILE=".git/first_push_detected" + +# Function to run backend checks +run_backend_checks() { + local DIR=$1 + cd "$DIR" || exit + + # Run pylint checks + if ! pylint --recursive=y --errors-only .; then + echo "❌ pylint issues detected in $DIR. Please fix them before pushing." + exit 1 + fi + + echo "🎉 Backend checks passed for $DIR." + cd "$ORIGINAL_DIR" || exit +} + +# Check if this is the first push +is_first_push() { + # Check if the branch exists locally + if ! git rev-parse --verify "$BRANCH_NAME" >/dev/null 2>&1; then + return 0 # First push, since the branch doesn't exist locally + fi + + # Check if the branch exists remotely + if ! git ls-remote --heads origin "$BRANCH_NAME" | grep -q "$BRANCH_NAME"; then + return 0 # First push, since the branch doesn't exist remotely + fi + + return 1 # Not the first push +} + +# If: First-time push: Run all checks +# Else: Check directory-specific changes for existing branch +if is_first_push; then + echo "🚀 First-time push detected for branch: $BRANCH_NAME" + # for DIR in "${DIRECTORIES[@]}"; do + # run_backend_checks "$DIR" + # done else - echo "pre-commit not found. Install with one of the following methods:" - echo " pip install pre-commit gitleaks" - echo " brew install pre-commit gitleaks" - echo " (see https://pre-commit.com/#installation and https://github.com/gitleaks/gitleaks#installation for more options)" - exit 1 + echo "🔍 Checking directory changes for existing branch: $BRANCH_NAME" + # for DIR in "${DIRECTORIES[@]}"; do + # if git diff --name-only --cached origin/"$BRANCH_NAME" | grep -q "^$DIR/"; then + # run_backend_checks "$DIR" + # fi + # done fi diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index f498cd623a..0000000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,14 +0,0 @@ -repos: - - repo: local - hooks: - - id: gitleaks-pre-commit - name: gitleaks git (staged only) - entry: bash -c 'gitleaks --config .gitleaks.toml --exit-code 1 --verbose git --staged' - language: system - pass_filenames: false - - id: gitleaks-pre-push - name: gitleaks git (pre-push, scan diff) - entry: bash -c 'gitleaks --config .gitleaks.toml --exit-code 1 --verbose git --log-opts "$(git merge-base HEAD "origin/$(git rev-parse --abbrev-ref HEAD)" 2>/dev/null || git merge-base HEAD origin/main)..HEAD"' - language: system - stages: [pre-push] - pass_filenames: false diff --git a/AGENTS.md b/AGENTS.md index c32182aba6..5707cd532d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,6 @@ ## Dev Environment Tips - If you make changes to the frontend, make sure to run `pnpm format-fix` within the web folder - If you make changes to the backend or sdk, make sure to run black within the sdk or api folder -- If you update Ant Design tokens, run `pnpm generate:tailwind-tokens` in the web folder and commit the generated file ## Testing Instructions diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5810643c7c..5cfd9357c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,9 +40,4 @@ We had many zombie issues and PRs (assigned but inactive) in the past. We want t - An issue may only be assigned to one person for up to one week (three days for very simple issues). If the issue remains unsolved after a week, it will be unassigned and made available to others. - Any pull request (PR) left inactive by the author for over a week will be closed. The author can reopen it if they wish to continue. -We look forward to seeing your contributions to Agenta! - -## Contributor License Agreement -If you want to contribute, we need you to sign a Contributor License Agreement. We need this to avoid potential intellectual property problems in the future. You can sign the agreement by clicking a button. Here is how it works: - -After you open a PR, a bot will automatically comment asking you to sign the agreement. Click on the link in the comment, login with your Github account, and sign the agreement. \ No newline at end of file +We look forward to seeing your contributions to Agenta! \ No newline at end of file diff --git a/LICENSE b/LICENSE index 1fff9c4444..79b3725428 100644 --- a/LICENSE +++ b/LICENSE @@ -1,17 +1,7 @@ -Copyright (c) 2023–2025 -Agentatech UG (haftungsbeschränkt), doing business as “Agenta” - -Portions of this software are licensed as follows: - -- All content that resides under any "ee/" directory of this repository, if -such directories exist, are licensed under the license defined in "ee/LICENSE". -- All third party components incorporated into the Agenta Software are licensed -under the original license provided by the owner of the applicable component. -- Content outside of the above mentioned directories or restrictions above is -available under the "MIT Expat" license as defined below. - The MIT License +Copyright (c) Agentatech UG (haftungsbeschränkt) + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/README.md b/README.md index d07ac59e52..082ea25f29 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,11 @@

- - + + Shows the logo of agenta -

The Open-source LLMOps Platform

Build reliable LLM applications faster with integrated prompt management, evaluation, and observability. @@ -84,15 +83,15 @@ Agenta is a platform for building production-grade LLM applications. It helps ** Collaborate with Subject Matter Experts (SMEs) on prompt engineering and make sure nothing breaks in production. - **Interactive Playground**: Compare prompts side by side against your test cases -- **Multi-Model Support**: Experiment with 50+ LLM models or [bring-your-own models](https://docs.agenta.ai/prompt-engineering/playground/custom-providers?utm_source=github&utm_medium=referral&utm_campaign=readme) +- **Multi-Model Support**: Experiment with 50+ LLM models or [bring-your-own models](https://docs.agenta.ai/prompt-engineering/playground/adding-custom-providers?utm_source=github&utm_medium=referral&utm_campaign=readme) - **Version Control**: Version prompts and configurations with branching and environments - **Complex Configurations**: Enable SMEs to collaborate on [complex configuration schemas](https://docs.agenta.ai/custom-workflows/overview?utm_source=github&utm_medium=referral&utm_campaign=readme) beyond simple prompts -[Explore prompt management →](https://docs.agenta.ai/prompt-engineering/concepts?utm_source=github&utm_medium=referral&utm_campaign=readme) +[Explore prompt management →](https://docs.agenta.ai/prompt-engineering/overview?utm_source=github&utm_medium=referral&utm_campaign=readme) ### 📊 Evaluation & Testing Evaluate your LLM applications systematically with both human and automated feedback. -- **Flexible Testsets**: Create testcases from production data, playground experiments, or upload CSVs +- **Flexible Test Sets**: Create test cases from production data, playground experiments, or upload CSVs - **Pre-built and Custom Evaluators**: Use LLM-as-judge, one of our 20+ pre-built evaluators, or you custom evaluators - **UI and API Access**: Run evaluations via UI (for SMEs) or programmatically (for engineers) - **Human Feedback Integration**: Collect and incorporate expert annotations @@ -267,4 +266,4 @@ This project follows the [all-contributors](https://github.com/all-contributors/ ## Disabling Anonymized Tracking -By default, Agenta automatically reports anonymized basic usage statistics. This helps us understand how Agenta is used and track its overall usage and growth. This data does not include any sensitive information. To disable anonymized telemetry set `AGENTA_TELEMETRY_ENABLED` to `false` in your `.env` file. +By default, Agenta automatically reports anonymized basic usage statistics. This helps us understand how Agenta is used and track its overall usage and growth. This data does not include any sensitive information. To disable anonymized telemetry set `AGENTA_TELEMETRY_ENABLED` to `false` in your `.env` file. \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md index fabf40c910..f45e7a7624 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,76 +1,19 @@ # Security Policy - ## Reporting a Vulnerability If you believe you have found a security vulnerability in any Agenta repository, please report it to us through coordinated disclosure. -**Do not** report security vulnerabilities via public GitHub issues, pull requests, or discussions. - -Instead, please send an email to **security@agenta.ai**. - ---- - -## Information to Include - -Please include as much of the following as you can to help us reproduce and resolve the issue: - -- Type of issue (e.g., buffer overflow, SQL injection, cross-site scripting). -- Full paths of source files related to the issue. -- The location of the affected source code (tag, branch, commit SHA, or direct URL). -- Any special configuration or environment required to reproduce. -- Step-by-step instructions to reproduce. -- Proof-of-concept or exploit code (if possible). -- Expected vs actual behaviour and potential impact. -- Your contact details and disclosure timeline preference. - ---- - -## Our Process - -- **Acknowledgement**: We will acknowledge receipt within **3 business days**. -- **Triage**: We aim to complete an initial triage within **7 calendar days** and will share severity and next steps. -- **Remediation & Disclosure**: For critical vulnerabilities we aim to release a fix or mitigation within **30 days**. For other issues, typically within **90 days**. We will coordinate any public disclosure with you. -- We will provide status updates as needed during remediation. - ---- - -## Safe Harbor - -We respect and protect good-faith security research. If you follow this policy: - -- We will not initiate legal action against you for good-faith testing conducted as part of coordinated disclosure. -- Do not access, modify, or exfiltrate data beyond what is necessary to demonstrate the issue. -- Do not disrupt production services or attempt destructive actions. - ---- - -## Scope Exclusions - -The following are **out of scope**: - -- Third-party services not operated by Agenta. -- Physical security attacks or social engineering of personnel. -- Low-risk informational issues without security impact (e.g., generic version banners). -- Denial-of-service attacks (**we will not accept DoS testing against production**). - ---- - -## Recognition & Credits - -If you report a valid vulnerability and want public recognition, tell us how you wish to be credited (full name, handle, company, or anonymous). Recognition is discretionary and will be coordinated with you. - ---- - -## Emergency / Out-of-band - -If email is unavailable and you need an immediate or urgent channel, contact our general line: **team@agenta.ai** (monitored during business hours). For truly critical emergencies, include “EMERGENCY / SECURITY” in the subject line of your email. +Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests. ---- +Instead, please send an email to team@agenta.ai. -## Contact retention & privacy +Please include as much of the information listed below as you can to help us better understand and resolve the issue: -- Report metadata will be retained for incident tracking and compliance. -- Personal data you provide will be handled according to our privacy policy. -- We will only share reporter data internally on a need-to-know basis. + The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) + Full paths of source file(s) related to the manifestation of the issue + The location of the affected source code (tag/branch/commit or direct URL) + Any special configuration required to reproduce the issue + Step-by-step instructions to reproduce the issue + Proof-of-concept or exploit code (if possible) + Impact of the issue, including how an attacker might exploit the issue ---- diff --git a/api/ee/LICENSE b/api/ee/LICENSE deleted file mode 100644 index ae7a2f38f4..0000000000 --- a/api/ee/LICENSE +++ /dev/null @@ -1,37 +0,0 @@ -Agenta Enterprise License (the “Enterprise License”) -Copyright (c) 2023–2025 -Agentatech UG (haftungsbeschränkt), doing business as “Agenta” (“Agenta”) - -With regard to the Agenta Software: - -This software and associated documentation files (the "Software") may only be -used in production, if you (and any entity that you represent) have agreed to, -and are in compliance with, the Agenta Subscription Terms of Service, available -at https://agenta.ai/terms (the “Enterprise Terms”), or other -agreement governing the use of the Software, as agreed by you and Agenta, -and otherwise have a valid Agenta Enterprise License. - -Subject to the foregoing sentence, you are free to modify this Software and -publish patches to the Software. You agree that Agenta and/or its licensors -(as applicable) retain all right, title and interest in and to all such -modifications and/or patches, and all such modifications and/or patches may -only be used, copied, modified, displayed, distributed, or otherwise exploited -with a valid Agenta Enterprise License. Notwithstanding the foregoing, you may -copy and modify the Software for development and testing purposes, without -requiring a subscription. You agree that Agenta and/or its licensors (as -applicable) retain all right, title and interest in and to all such -modifications. You are not granted any other rights beyond what is expressly -stated herein. Subject to the foregoing, it is forbidden to copy, merge, -publish, distribute, sublicense, and/or sell the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -For all third party components incorporated into the Agenta Software, those -components are licensed under the original license provided by the owner of the -applicable component. diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/api_keys.py b/api/ee/databases/postgres/migrations/core/data_migrations/api_keys.py index 769b6b8157..72aef39f8a 100644 --- a/api/ee/databases/postgres/migrations/core/data_migrations/api_keys.py +++ b/api/ee/databases/postgres/migrations/core/data_migrations/api_keys.py @@ -38,8 +38,8 @@ def update_api_key_to_make_use_of_project_id(session: Connection): TOTAL_MIGRATED = 0 SKIPPED_RECORDS = 0 - # Count total rows with user_id & workspace_id isnot NULL and project_id is NULL - stmt = ( + # Count total rows with user_id & workspace_id isnot NULL & project_id is NULL + total_query = ( select(func.count()) .select_from(DeprecatedAPIKeyDB) .filter( @@ -48,14 +48,14 @@ def update_api_key_to_make_use_of_project_id(session: Connection): DeprecatedAPIKeyDB.project_id.is_(None), ) ) - result = session.execute(stmt).scalar() + result = session.execute(total_query).scalar() TOTAL_API_KEYS_WITH_USER_AND_WORKSPACE_ID = result if result is not None else 0 print( f"Total rows in api_keys table with user_id and workspace_id not been NULL is {TOTAL_API_KEYS_WITH_USER_AND_WORKSPACE_ID}" ) while True: - # Fetch a batch of api_keys with user_id & workspace_id not been NULL + # Fetch a batch of api_keys with user_id and workspace_id not been NULL records = session.execute( select(DeprecatedAPIKeyDB) .filter( @@ -154,12 +154,12 @@ def update_api_key_to_make_use_of_project_id(session: Connection): break # Count total rows with user_id and/or workspace_id been NULL - stmt = ( + query = ( select(func.count()) .select_from(DeprecatedAPIKeyDB) .filter(DeprecatedAPIKeyDB.project_id.is_(None)) ) - result = session.execute(stmt).scalar() + result = session.execute(query).scalar() TOTAL_API_KEYS_WITH_NO_USER_AND_WORKSPACE_ID = ( result if result is not None else 0 ) @@ -191,7 +191,7 @@ def revert_api_key_to_make_use_of_workspace_id(session: Connection): SKIPPED_RECORDS = 0 # Count total rows with created_by_id & project_id isnot NULL - stmt = ( + total_query = ( select(func.count()) .select_from(DeprecatedAPIKeyDB) .filter( @@ -200,7 +200,7 @@ def revert_api_key_to_make_use_of_workspace_id(session: Connection): DeprecatedAPIKeyDB.workspace_id.is_(None), ) ) - result = session.execute(stmt).scalar() + result = session.execute(total_query).scalar() TOTAL_API_KEYS_WITH_USER_AND_PROJECT_ID = result if result is not None else 0 print( f"Total rows in api_keys table with created_by_id and project_id not been NULL is {TOTAL_API_KEYS_WITH_USER_AND_PROJECT_ID}" @@ -256,7 +256,7 @@ def revert_api_key_to_make_use_of_workspace_id(session: Connection): ) # Count total rows with created_by_id and/or project_id been NULL - stmt = ( + query = ( select(func.count()) .select_from(DeprecatedAPIKeyDB) .filter( @@ -266,7 +266,7 @@ def revert_api_key_to_make_use_of_workspace_id(session: Connection): ), ) ) - result = session.execute(stmt).scalar() + result = session.execute(query).scalar() TOTAL_API_KEYS_WITH_NO_USER_AND_PROJECT_ID = result if result is not None else 0 print( f"Total rows in api_keys table with created_by_id and project_id been NULL is {TOTAL_API_KEYS_WITH_NO_USER_AND_PROJECT_ID}" diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/applications.py b/api/ee/databases/postgres/migrations/core/data_migrations/applications.py index 95353642ec..f7d7b66ff3 100644 --- a/api/ee/databases/postgres/migrations/core/data_migrations/applications.py +++ b/api/ee/databases/postgres/migrations/core/data_migrations/applications.py @@ -94,12 +94,12 @@ def update_evaluators_with_app_name(session: Connection): break # Delete deprecated evaluator configs with app_id as None - stmt = ( + query = ( select(func.count()) .select_from(DeprecatedEvaluatorConfigDB) .filter(DeprecatedEvaluatorConfigDB.app_id.is_(None)) ) - result = session.execute(stmt).scalar() + result = session.execute(query).scalar() TOTAL_EVALUATOR_CONFIGS_WITH_NO_APPID = result if result is not None else 0 print( f"Total rows in evaluator_configs table with no app_id: {TOTAL_EVALUATOR_CONFIGS_WITH_NO_APPID}. Deleting these rows..." diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/evaluators.py b/api/ee/databases/postgres/migrations/core/data_migrations/evaluators.py deleted file mode 100644 index c6b82d338c..0000000000 --- a/api/ee/databases/postgres/migrations/core/data_migrations/evaluators.py +++ /dev/null @@ -1,195 +0,0 @@ -import uuid -import asyncio -import traceback -from typing import Optional - -import click -from sqlalchemy.future import select -from sqlalchemy import func -from sqlalchemy.ext.asyncio import AsyncConnection, create_async_engine - - -from ee.src.models.db_models import WorkspaceMemberDB as WorkspaceMemberDBE -from oss.src.models.db_models import ProjectDB as ProjectDBE -from oss.src.dbs.postgres.workflows.dbes import ( - WorkflowArtifactDBE, - WorkflowVariantDBE, - WorkflowRevisionDBE, -) -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.core.evaluators.service import SimpleEvaluatorsService, EvaluatorsService -from oss.src.models.deprecated_models import ( - DeprecatedAutoEvaluatorConfigDBwProject as DeprecatedEvaluatorConfigDBwProject, -) -from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.tracing.service import TracingService -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.dbs.postgres.tracing.dao import TracingDAO - - -# Define constants -DEFAULT_BATCH_SIZE = 200 - -# Initialize plug-ins for migration -tracing_service = TracingService( - tracing_dao=TracingDAO(), -) -tracing = TracingRouter( - tracing_service=tracing_service, -) -evaluators_service = EvaluatorsService( - workflows_service=WorkflowsService( - workflows_dao=GitDAO( - ArtifactDBE=WorkflowArtifactDBE, - VariantDBE=WorkflowVariantDBE, - RevisionDBE=WorkflowRevisionDBE, - ), - ) -) -simple_evaluators_service = SimpleEvaluatorsService( - evaluators_service=evaluators_service, -) - - -async def _fetch_project_owner( - *, - project_id: uuid.UUID, - connection: AsyncConnection, -) -> Optional[uuid.UUID]: - """Fetch the owner user ID for a given project.""" - workspace_owner_query = ( - select(WorkspaceMemberDBE.user_id) - .select_from(WorkspaceMemberDBE, ProjectDBE) - .where( - WorkspaceMemberDBE.workspace_id == ProjectDBE.workspace_id, - WorkspaceMemberDBE.role == "owner", - ProjectDBE.id == project_id, - ) - ) - result = await connection.execute(workspace_owner_query) - owner = result.scalar_one_or_none() - return owner - - -async def migration_old_evaluator_configs_to_new_evaluator_configs( - connection: AsyncConnection, -): - """Migrate old evaluator configurations to new workflow-based system.""" - try: - offset = 0 - total_migrated = 0 - skipped_records = 0 - - # Count total rows with a non-null project_id - total_query = ( - select(func.count()) - .select_from(DeprecatedEvaluatorConfigDBwProject) - .filter(DeprecatedEvaluatorConfigDBwProject.project_id.isnot(None)) - ) - result = await connection.execute(total_query) - total_rows = result.scalar() - total_evaluators = total_rows or 0 - - click.echo( - click.style( - f"Total rows in evaluator_configs with project_id: {total_evaluators}", - fg="yellow", - ) - ) - - while offset < total_evaluators: - # STEP 1: Fetch evaluator configurations with non-null project_id - result = await connection.execute( - select(DeprecatedEvaluatorConfigDBwProject) - .filter(DeprecatedEvaluatorConfigDBwProject.project_id.isnot(None)) - .offset(offset) - .limit(DEFAULT_BATCH_SIZE) - ) - evaluator_configs_rows = result.fetchall() - - if not evaluator_configs_rows: - break - - # Process and transfer records to evaluator workflows - for old_evaluator in evaluator_configs_rows: - try: - # STEP 2: Get owner from project_id - owner = await _fetch_project_owner( - project_id=old_evaluator.project_id, # type: ignore - connection=connection, - ) - if not owner: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {old_evaluator.id} due to missing owner in workspace member table", - fg="yellow", - ) - ) - continue - - # STEP 3: Migrate records using transfer_* util function - new_evaluator = await simple_evaluators_service.transfer( - project_id=old_evaluator.project_id, - user_id=owner, - evaluator_id=old_evaluator.id, - ) - if not new_evaluator: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {old_evaluator.id} due to old evaluator not existing in database table", - fg="yellow", - ) - ) - continue - - except Exception as e: - click.echo( - click.style( - f"Failed to migrate evaluator {old_evaluator.id}: {str(e)}", - fg="red", - ) - ) - click.echo(click.style(traceback.format_exc(), fg="red")) - skipped_records += 1 - continue - - # Update progress tracking for current batch - batch_migrated = len(evaluator_configs_rows) - offset += DEFAULT_BATCH_SIZE - total_migrated += batch_migrated - - click.echo( - click.style( - f"Processed {batch_migrated} records in this batch.", - fg="yellow", - ) - ) - - # Update progress tracking for all batches - remaining_records = total_evaluators - total_migrated - click.echo(click.style(f"Total migrated: {total_migrated}", fg="yellow")) - click.echo(click.style(f"Skipped records: {skipped_records}", fg="yellow")) - click.echo( - click.style(f"Records left to migrate: {remaining_records}", fg="yellow") - ) - - except Exception as e: - click.echo(f"Error occurred: {e}") - click.echo(click.style(traceback.format_exc(), fg="red")) - - -def run_migration(sqlalchemy_url: str): - import concurrent.futures - - async def _start(): - connection = create_async_engine(url=sqlalchemy_url) - async with connection.connect() as connection: - await migration_old_evaluator_configs_to_new_evaluator_configs( - connection=connection - ) - - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit(asyncio.run, _start()) - future.result() diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/invitations.py b/api/ee/databases/postgres/migrations/core/data_migrations/invitations.py index 802f2ef4fe..8eaeafb2c4 100644 --- a/api/ee/databases/postgres/migrations/core/data_migrations/invitations.py +++ b/api/ee/databases/postgres/migrations/core/data_migrations/invitations.py @@ -124,19 +124,20 @@ def revert_invitations_transfer_from_new_table_to_old_table(session: Connection) TOTAL_MIGRATED = 0 # Count total rows in invitations table - stmt = select(func.count()).select_from(InvitationDB) - result = session.execute(stmt).scalar() + query = select(func.count()).select_from(InvitationDB) + result = session.execute(query).scalar() TOTAL_INVITATIONS = result if result is not None else 0 print(f"Total rows in project_invitations table is {TOTAL_INVITATIONS}") while True: # Retrieve a batch of project invitations - project_invitations = session.execute( + query = session.execute( select(InvitationDB) .offset(offset) .limit(BATCH_SIZE) .options(joinedload(InvitationDB.project)) - ).fetchall() + ) + project_invitations = query.fetchall() if not project_invitations: break diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/projects.py b/api/ee/databases/postgres/migrations/core/data_migrations/projects.py index f3178a3085..293b05f52a 100644 --- a/api/ee/databases/postgres/migrations/core/data_migrations/projects.py +++ b/api/ee/databases/postgres/migrations/core/data_migrations/projects.py @@ -21,7 +21,7 @@ EvaluatorConfigDB, HumanEvaluationDB, HumanEvaluationScenarioDB, - TestsetDB, + TestSetDB, ) @@ -38,7 +38,7 @@ EvaluatorConfigDB, # have workspace_id HumanEvaluationDB, # have workspace_id HumanEvaluationScenarioDB, # have workspace_id - TestsetDB, # have workspace_id + TestSetDB, # have workspace_id ] diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/testsets.py b/api/ee/databases/postgres/migrations/core/data_migrations/testsets.py deleted file mode 100644 index 35a8e82cb1..0000000000 --- a/api/ee/databases/postgres/migrations/core/data_migrations/testsets.py +++ /dev/null @@ -1,191 +0,0 @@ -import uuid -import asyncio -import traceback -from typing import Optional - -import click -from sqlalchemy.future import select -from sqlalchemy import func -from sqlalchemy.ext.asyncio import AsyncConnection, create_async_engine - -from ee.src.models.db_models import WorkspaceMemberDB as WorkspaceMemberDBE -from oss.src.models.db_models import ProjectDB as ProjectDBE -from oss.src.dbs.postgres.testcases.dbes import ( - TestcaseBlobDBE, -) -from oss.src.dbs.postgres.blobs.dao import BlobsDAO -from oss.src.dbs.postgres.testsets.dbes import ( - TestsetArtifactDBE, - TestsetVariantDBE, - TestsetRevisionDBE, -) -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.core.testcases.service import TestcasesService -from oss.src.models.deprecated_models import DeprecatedTestsetDB -from oss.src.core.testsets.service import TestsetsService, SimpleTestsetsService - - -# Define constants -DEFAULT_BATCH_SIZE = 200 - -# Initialize plug-ins for migration -testcases_dao = BlobsDAO( - BlobDBE=TestcaseBlobDBE, -) -testsets_dao = GitDAO( - ArtifactDBE=TestsetArtifactDBE, - VariantDBE=TestsetVariantDBE, - RevisionDBE=TestsetRevisionDBE, -) -testcases_service = TestcasesService( - testcases_dao=testcases_dao, -) -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) -simple_testsets_service = SimpleTestsetsService( - testsets_service=testsets_service, -) - - -async def _fetch_project_owner( - *, - project_id: uuid.UUID, - connection: AsyncConnection, -) -> Optional[uuid.UUID]: - """Fetch the owner user ID for a given project.""" - workspace_owner_query = ( - select(WorkspaceMemberDBE.user_id) - .select_from(WorkspaceMemberDBE, ProjectDBE) - .where( - WorkspaceMemberDBE.workspace_id == ProjectDBE.workspace_id, - WorkspaceMemberDBE.role == "owner", - ProjectDBE.id == project_id, - ) - ) - result = await connection.execute(workspace_owner_query) - owner = result.scalar_one_or_none() - return owner - - -async def migration_old_testsets_to_new_testsets( - connection: AsyncConnection, -): - """Migrate old testsets to new testsets system.""" - try: - offset = 0 - total_migrated = 0 - skipped_records = 0 - - # Count total rows with a non-null project_id - total_query = ( - select(func.count()) - .select_from(DeprecatedTestsetDB) - .filter(DeprecatedTestsetDB.project_id.isnot(None)) - ) - result = await connection.execute(total_query) - total_rows = result.scalar() - total_testsets = total_rows or 0 - - click.echo( - click.style( - f"Total rows in testsets with project_id: {total_testsets}", - fg="yellow", - ) - ) - - while offset < total_testsets: - # STEP 1: Fetch evaluator configurations with non-null project_id - result = await connection.execute( - select(DeprecatedTestsetDB) - .filter(DeprecatedTestsetDB.project_id.isnot(None)) - .offset(offset) - .limit(DEFAULT_BATCH_SIZE) - ) - testsets_rows = result.fetchall() - - if not testsets_rows: - break - - # Process and transfer records to testset workflows - for testset in testsets_rows: - try: - # STEP 2: Get owner from project_id - owner = await _fetch_project_owner( - project_id=testset.project_id, # type: ignore - connection=connection, - ) - if not owner: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {testset.id} due to missing owner in workspace member table", - fg="yellow", - ) - ) - continue - - # STEP 3: Migrate records using transfer_* util function - new_testset = await simple_testsets_service.transfer( - project_id=testset.project_id, - user_id=owner, - testset_id=testset.id, - ) - if not new_testset: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {testset.id} due to old testset not existing in database table", - fg="yellow", - ) - ) - continue - - except Exception as e: - click.echo( - click.style( - f"Failed to migrate testset {testset.id}: {str(e)}", - fg="red", - ) - ) - click.echo(click.style(traceback.format_exc(), fg="red")) - skipped_records += 1 - continue - - # Update progress tracking for current batch - batch_migrated = len(testsets_rows) - offset += DEFAULT_BATCH_SIZE - total_migrated += batch_migrated - - click.echo( - click.style( - f"Processed {batch_migrated} records in this batch.", - fg="yellow", - ) - ) - - # Update progress tracking for all batches - remaining_records = total_testsets - total_migrated - click.echo(click.style(f"Total migrated: {total_migrated}", fg="yellow")) - click.echo(click.style(f"Skipped records: {skipped_records}", fg="yellow")) - click.echo( - click.style(f"Records left to migrate: {remaining_records}", fg="yellow") - ) - - except Exception as e: - click.echo(f"Error occurred: {e}") - click.echo(click.style(traceback.format_exc(), fg="red")) - - -def run_migration(sqlalchemy_url: str): - import concurrent.futures - - async def _start(): - connection = create_async_engine(url=sqlalchemy_url) - async with connection.connect() as connection: - await migration_old_testsets_to_new_testsets(connection=connection) - - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit(asyncio.run, _start()) - future.result() diff --git a/api/ee/databases/postgres/migrations/core/data_migrations/workspaces.py b/api/ee/databases/postgres/migrations/core/data_migrations/workspaces.py index 2c5a241acc..07d6956483 100644 --- a/api/ee/databases/postgres/migrations/core/data_migrations/workspaces.py +++ b/api/ee/databases/postgres/migrations/core/data_migrations/workspaces.py @@ -39,16 +39,17 @@ def create_default_project_for_workspaces(session: Connection): TOTAL_MIGRATED = 0 # Count total rows in workspaces table - stmt = select(func.count()).select_from(WorkspaceDB) - result = session.execute(stmt).scalar() + query = select(func.count()).select_from(WorkspaceDB) + result = session.execute(query).scalar() TOTAL_WORKSPACES = result if result is not None else 0 print(f"Total rows in workspaces table is {TOTAL_WORKSPACES}") while True: # Retrieve a batch of workspaces without a project - workspaces = session.execute( + query = session.execute( select(WorkspaceDB).offset(offset).limit(BATCH_SIZE) - ).fetchall() + ) + workspaces = query.fetchall() actual_batch_size = len(workspaces) if not workspaces: break @@ -104,16 +105,17 @@ def create_default_project_memberships(session: Connection): SKIPPED_RECORDS = 0 # Count total rows in workspaces_members table - stmt = select(func.count()).select_from(WorkspaceMemberDB) - result = session.execute(stmt).scalar() + query = select(func.count()).select_from(WorkspaceMemberDB) + result = session.execute(query).scalar() TOTAL_WORKSPACES_MEMBERS = result if result is not None else 0 print(f"Total rows in workspaces_members table is {TOTAL_WORKSPACES_MEMBERS}") while True: # Retrieve a batch of workspace members - workspace_members = session.execute( + query = session.execute( select(WorkspaceMemberDB).offset(offset).limit(BATCH_SIZE) - ).fetchall() + ) + workspace_members = query.fetchall() actual_batch_size = len(workspace_members) if not workspace_members: break @@ -187,23 +189,24 @@ def remove_default_projects_from_workspaces(session: Connection): TOTAL_MIGRATED = 0 # Count total rows in projects table - stmt = ( + query = ( select(func.count()) .select_from(ProjectDB) .where(ProjectDB.is_default == True) ) - result = session.execute(stmt).scalar() + result = session.execute(query).scalar() TOTAL_PROJECTS = result if result is not None else 0 print(f"Total rows in projects table is {TOTAL_PROJECTS}") while True: # Retrieve a batch of workspaces with a default project - projects_to_delete = session.execute( + query = session.execute( select(ProjectDB) .where(ProjectDB.is_default == True) .offset(offset) .limit(BATCH_SIZE) # type: ignore - ).fetchall() + ) + projects_to_delete = query.fetchall() actual_batch_size = len(projects_to_delete) if not projects_to_delete: break diff --git a/api/ee/databases/postgres/migrations/core/env.py b/api/ee/databases/postgres/migrations/core/env.py index e5e251f801..27dfb51b99 100644 --- a/api/ee/databases/postgres/migrations/core/env.py +++ b/api/ee/databases/postgres/migrations/core/env.py @@ -27,14 +27,8 @@ from oss.src.dbs.postgres.shared.base import Base import oss.src.dbs.postgres.secrets.dbes -import oss.src.dbs.postgres.observability.dbes -import oss.src.dbs.postgres.tracing.dbes -import oss.src.dbs.postgres.testcases.dbes -import oss.src.dbs.postgres.testsets.dbes -import oss.src.dbs.postgres.queries.dbes import oss.src.dbs.postgres.workflows.dbes -import oss.src.dbs.postgres.evaluations.dbes - +import oss.src.dbs.postgres.observability.dbes import ee.src.dbs.postgres.meters.dbes import ee.src.dbs.postgres.subscriptions.dbes diff --git a/api/ee/databases/postgres/migrations/core/temp/80910d2fa9a4_migrate_old_testsets_to_new_.py b/api/ee/databases/postgres/migrations/core/temp/80910d2fa9a4_migrate_old_testsets_to_new_.py deleted file mode 100644 index 43be6c1579..0000000000 --- a/api/ee/databases/postgres/migrations/core/temp/80910d2fa9a4_migrate_old_testsets_to_new_.py +++ /dev/null @@ -1,32 +0,0 @@ -"""migrate old testsets to new testsets data structure - -Revision ID: 80910d2fa9a4 -Revises: ... -Create Date: 2025-07-25 07:35:57.319449 - -""" - -from typing import Sequence, Union - -from alembic import context -from ee.databases.postgres.migrations.core.data_migrations.testsets import ( - run_migration, -) - -# revision identifiers, used by Alembic. -revision: str = "80910d2fa9a4" -down_revision: Union[str, None] = "..." -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - run_migration(sqlalchemy_url=context.config.get_main_option("sqlalchemy.url")) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - pass - # ### end Alembic commands ### diff --git a/api/ee/databases/postgres/migrations/core/temp/bd7937ee784d_migrate_old_evaluators_to_new_.py b/api/ee/databases/postgres/migrations/core/temp/bd7937ee784d_migrate_old_evaluators_to_new_.py deleted file mode 100644 index da71b370bb..0000000000 --- a/api/ee/databases/postgres/migrations/core/temp/bd7937ee784d_migrate_old_evaluators_to_new_.py +++ /dev/null @@ -1,32 +0,0 @@ -"""migrate old evaluators to new evaluators data structure - -Revision ID: bd7937ee784d -Revises: ... -Create Date: 2025-07-25 07:35:57.319449 - -""" - -from typing import Sequence, Union - -from alembic import context -from ee.databases.postgres.migrations.core.data_migrations.evaluators import ( - run_migration, -) - -# revision identifiers, used by Alembic. -revision: str = "bd7937ee784d" -down_revision: Union[str, None] = "..." -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - run_migration(sqlalchemy_url=context.config.get_main_option("sqlalchemy.url")) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - pass - # ### end Alembic commands ### diff --git a/api/ee/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py b/api/ee/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py index dd76961a2f..e22f7c03b9 100644 --- a/api/ee/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py +++ b/api/ee/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py @@ -1,5 +1,4 @@ """Extend app_type - Revision ID: 0f086ebc2f83 Revises: 0f086ebc2f82 Create Date: 2025-01-08 10:24:00 diff --git a/api/ee/databases/postgres/migrations/core/versions/30dcf07de96a_add_tables_for_queries.py b/api/ee/databases/postgres/migrations/core/versions/30dcf07de96a_add_tables_for_queries.py deleted file mode 100644 index 735a859ce0..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/30dcf07de96a_add_tables_for_queries.py +++ /dev/null @@ -1,403 +0,0 @@ -"""add tables for queries (artifacts, variants, & revisions) - -Revision ID: 30dcf07de96a -Revises: aa1b2c3d4e5f -Create Date: 2025-07-30 14:55:00.000000 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision: str = "30dcf07de96a" -down_revision: Union[str, None] = "aa1b2c3d4e5f" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # - ARTIFACTS -------------------------------------------------------------- - - op.create_table( - "query_artifacts", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "slug", - sa.String(), - nullable=False, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "name", - sa.String(), - nullable=True, - ), - sa.Column( - "description", - sa.String(), - nullable=True, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.UniqueConstraint( - "project_id", - "slug", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_query_artifacts_project_id_slug", - "project_id", - "slug", - ), - ) - - # -------------------------------------------------------------------------- - - # - VARIANTS --------------------------------------------------------------- - - op.create_table( - "query_variants", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "artifact_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "slug", - sa.String(), - nullable=False, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "name", - sa.String(), - nullable=True, - ), - sa.Column( - "description", - sa.String(), - nullable=True, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.UniqueConstraint( - "project_id", - "slug", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "artifact_id"], - ["query_artifacts.project_id", "query_artifacts.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_query_variants_project_id_slug", - "project_id", - "slug", - ), - sa.Index( - "ix_query_variants_project_id_artifact_id", - "project_id", - "artifact_id", - ), - ) - - # -------------------------------------------------------------------------- - - # - REVISIONS -------------------------------------------------------------- - - op.create_table( - "query_revisions", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "artifact_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "variant_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "slug", - sa.String(), - nullable=False, - ), - sa.Column( - "version", - sa.String(), - nullable=True, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "name", - sa.String(), - nullable=True, - ), - sa.Column( - "description", - sa.String(), - nullable=True, - ), - sa.Column( - "message", - sa.String(), - nullable=True, - ), - sa.Column( - "author", - sa.UUID(), - nullable=False, - ), - sa.Column( - "date", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "data", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.UniqueConstraint( - "project_id", - "slug", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "artifact_id"], - ["query_artifacts.project_id", "query_artifacts.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "variant_id"], - ["query_variants.project_id", "query_variants.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_query_revisions_project_id_slug", - "project_id", - "slug", - ), - sa.Index( - "ix_query_revisions_project_id_artifact_id", - "project_id", - "artifact_id", - ), - sa.Index( - "ix_query_revisions_project_id_variant_id", - "project_id", - "variant_id", - ), - ) - - # -------------------------------------------------------------------------- - - -def downgrade() -> None: - # - REVISIONS -------------------------------------------------------------- - - op.drop_table("query_revisions") - - # -------------------------------------------------------------------------- - - # - VARIANTS --------------------------------------------------------------- - - op.drop_table("query_variants") - - # -------------------------------------------------------------------------- - - # - ARTIFACTS -------------------------------------------------------------- - - op.drop_table("query_artifacts") - - # -------------------------------------------------------------------------- diff --git a/api/ee/databases/postgres/migrations/core/versions/3b5f5652f611_populate_runs_references.py b/api/ee/databases/postgres/migrations/core/versions/3b5f5652f611_populate_runs_references.py deleted file mode 100644 index bb43067ccb..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/3b5f5652f611_populate_runs_references.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Populate runs references - -Revision ID: 3b5f5652f611 -Revises: b3f15a7140ab -Create Date: 2025-10-07 12:00:00 -""" - -from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa -import json - -# revision identifiers, used by Alembic. -revision: str = "3b5f5652f611" -down_revision: Union[str, None] = "b3f15a7140ab" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - conn = op.get_bind() - - rows = conn.execute( - sa.text('SELECT id, data, "references" FROM evaluation_runs') - ).fetchall() - - for run_id, data, existing_refs in rows: - if existing_refs not in (None, [], {}): - continue - if not data or "steps" not in data: - continue - - refs_out = [] - seen = set() - - for step in data.get("steps", []): - refs = step.get("references", {}) - if not isinstance(refs, dict): - continue - - for key, ref in refs.items(): - if not isinstance(ref, dict): - continue - - entry = {"key": key} - - if ref.get("id") is not None: - entry["id"] = ref["id"] - if ref.get("slug") is not None: - entry["slug"] = ref["slug"] - if ref.get("version") is not None: - entry["version"] = ref["version"] - - dedup_key = ( - entry.get("id"), - entry["key"], - entry.get("slug"), - entry.get("version"), - ) - if dedup_key in seen: - continue - seen.add(dedup_key) - - refs_out.append(entry) - - if refs_out: - conn.execute( - sa.text( - 'UPDATE evaluation_runs SET "references" = :refs WHERE id = :id' - ), - {"refs": json.dumps(refs_out), "id": run_id}, - ) - - -def downgrade() -> None: - conn = op.get_bind() - conn.execute(sa.text('UPDATE evaluation_runs SET "references" = NULL')) diff --git a/api/ee/databases/postgres/migrations/core/versions/5a71b3f140ab_fix_all_preview_schemas.py b/api/ee/databases/postgres/migrations/core/versions/5a71b3f140ab_fix_all_preview_schemas.py deleted file mode 100644 index 62d244d1e1..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/5a71b3f140ab_fix_all_preview_schemas.py +++ /dev/null @@ -1,426 +0,0 @@ -"""fix all preview schemas - -Revision ID: 5a71b3f140ab -Revises: 8089ee7692d1 -Create Date: 2025-09-03 14:28:06.362553 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -revision: str = "5a71b3f140ab" -down_revision: Union[str, None] = "8089ee7692d1" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # EVALUATION RUNS ---------------------------------------------------------- - - op.add_column( - "evaluation_runs", - sa.Column( - "references", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - ) - - op.create_index( - "ix_evaluation_runs_references", - "evaluation_runs", - ["references"], - unique=False, - postgresql_using="gin", - postgresql_ops={"references": "jsonb_path_ops"}, - ) - op.create_index( - "ix_evaluation_runs_flags", - "evaluation_runs", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_runs_tags", - "evaluation_runs", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.add_column( - "evaluation_scenarios", - sa.Column( - "interval", - postgresql.INTEGER(), - nullable=True, - ), - ) - - op.create_index( - "ix_evaluation_scenarios_timestamp_interval", - "evaluation_scenarios", - ["timestamp", "interval"], - unique=False, - ) - op.create_index( - "ix_evaluation_scenarios_flags", - "evaluation_scenarios", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_scenarios_tags", - "evaluation_scenarios", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # EVALUATION RESULTS ------------------------------------------------------- - - op.alter_column( - "evaluation_steps", - "timestamp", - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=True, - ) - op.add_column( - "evaluation_steps", - sa.Column( - "interval", - postgresql.INTEGER(), - nullable=True, - ), - ) - - op.create_unique_constraint( - "uq_evaluation_steps_project_run_scenario_step_repeat", - "evaluation_steps", - ["project_id", "run_id", "scenario_id", "step_key", "repeat_idx"], - ) - - op.create_index( - "ix_evaluation_steps_tags", - "evaluation_steps", - ["tags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_steps_flags", - "evaluation_steps", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_steps_timestamp_interval", - "evaluation_steps", - ["timestamp", "interval"], - unique=False, - ) - op.create_index( - "ix_evaluation_steps_repeat_idx", - "evaluation_steps", - ["repeat_idx"], - unique=False, - ) - op.create_index( - "ix_evaluation_steps_step_key", - "evaluation_steps", - ["step_key"], - unique=False, - ) - - op.rename_table("evaluation_steps", "evaluation_results") - - op.execute( - "ALTER TABLE evaluation_results RENAME CONSTRAINT " - "uq_evaluation_steps_project_run_scenario_step_repeat TO " - "uq_evaluation_results_project_run_scenario_step_repeat" - ) - - op.execute( - "ALTER INDEX ix_evaluation_steps_project_id RENAME TO ix_evaluation_results_project_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_run_id RENAME TO ix_evaluation_results_run_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_scenario_id RENAME TO ix_evaluation_results_scenario_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_step_key RENAME TO ix_evaluation_results_step_key" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_repeat_idx RENAME TO ix_evaluation_results_repeat_idx" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_timestamp_interval RENAME TO ix_evaluation_results_timestamp_interval" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_flags RENAME TO ix_evaluation_results_flags" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_tags RENAME TO ix_evaluation_results_tags" - ) - - # EVALUATION METRICS ------------------------------------------------------- - - op.add_column( - "evaluation_metrics", - sa.Column( - "interval", - postgresql.INTEGER(), - nullable=True, - ), - ) - - op.drop_constraint( - op.f("evaluation_metrics_project_id_run_id_scenario_id_key"), - "evaluation_metrics", - type_="unique", - ) - - op.create_unique_constraint( - "uq_evaluation_metrics_project_run_scenario_timestamp_interval", - "evaluation_metrics", - ["project_id", "run_id", "scenario_id", "timestamp", "interval"], - ) - - op.create_index( - "ix_evaluation_metrics_timestamp_interval", - "evaluation_metrics", - ["timestamp", "interval"], - unique=False, - ) - op.create_index( - "ix_evaluation_metrics_flags", - "evaluation_metrics", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_metrics_tags", - "evaluation_metrics", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # EVALUATION QUEUES -------------------------------------------------------- - - op.add_column( - "evaluation_queues", - sa.Column( - "name", - sa.String(), - nullable=True, - ), - ) - op.add_column( - "evaluation_queues", - sa.Column( - "description", - sa.String(), - nullable=True, - ), - ) - op.add_column( - "evaluation_queues", - sa.Column( - "status", - sa.VARCHAR(), - nullable=False, - server_default=sa.text("'pending'::varchar"), - ), - ) - - op.create_index( - "ix_evaluation_queues_flags", - "evaluation_queues", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_queues_tags", - "evaluation_queues", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # -------------------------------------------------------------------------- - - -def downgrade() -> None: - # EVALUATION QUEUES -------------------------------------------------------- - - op.drop_index( - "ix_evaluation_queues_tags", - table_name="evaluation_queues", - ) - op.drop_index( - "ix_evaluation_queues_flags", - table_name="evaluation_queues", - ) - - op.drop_column( - "evaluation_queues", - "status", - ) - op.drop_column( - "evaluation_queues", - "description", - ) - op.drop_column( - "evaluation_queues", - "name", - ) - - # EVALUATION METRICS ------------------------------------------------------- - - op.drop_index( - "ix_evaluation_metrics_tags", - table_name="evaluation_metrics", - ) - op.drop_index( - "ix_evaluation_metrics_flags", - table_name="evaluation_metrics", - ) - op.drop_index( - "ix_evaluation_metrics_timestamp_interval", - table_name="evaluation_metrics", - ) - - op.drop_constraint( - "uq_evaluation_metrics_project_run_scenario_timestamp_interval", - "evaluation_metrics", - type_="unique", - ) - - op.create_unique_constraint( - op.f("evaluation_metrics_project_id_run_id_scenario_id_key"), - "evaluation_metrics", - ["project_id", "run_id", "scenario_id"], - postgresql_nulls_not_distinct=False, - ) - - op.drop_column("evaluation_metrics", "interval") - - # EVALUATION RESULTS ------------------------------------------------------- - - op.execute( - "ALTER INDEX ix_evaluation_results_tags RENAME TO ix_evaluation_steps_tags" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_flags RENAME TO ix_evaluation_steps_flags" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_timestamp_interval RENAME TO ix_evaluation_steps_timestamp_interval" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_repeat_idx RENAME TO ix_evaluation_steps_repeat_idx" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_step_key RENAME TO ix_evaluation_steps_step_key" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_scenario_id RENAME TO ix_evaluation_steps_scenario_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_run_id RENAME TO ix_evaluation_steps_run_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_project_id RENAME TO ix_evaluation_steps_project_id" - ) - - op.execute( - "ALTER TABLE evaluation_results RENAME CONSTRAINT uq_evaluation_results_project_run_scenario_step_repeat " - "TO uq_evaluation_steps_project_run_scenario_step_repeat" - ) - - op.rename_table("evaluation_results", "evaluation_steps") - - op.drop_index( - "ix_evaluation_steps_tags", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_flags", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_timestamp_interval", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_repeat_idx", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_step_key", - table_name="evaluation_steps", - ) - - op.drop_constraint( - "uq_evaluation_steps_project_run_scenario_step_repeat", - "evaluation_steps", - type_="unique", - ) - - op.alter_column( - "evaluation_steps", - "timestamp", - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=False, - ) - - op.drop_column("evaluation_steps", "interval") - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.drop_index( - "ix_evaluation_scenarios_tags", - table_name="evaluation_scenarios", - ) - op.drop_index( - "ix_evaluation_scenarios_flags", - table_name="evaluation_scenarios", - ) - op.drop_index( - "ix_evaluation_scenarios_timestamp_interval", - table_name="evaluation_scenarios", - ) - - op.drop_column("evaluation_scenarios", "interval") - - # EVALUATION RUNS ---------------------------------------------------------- - - op.drop_index( - "ix_evaluation_runs_tags", - table_name="evaluation_runs", - ) - op.drop_index( - "ix_evaluation_runs_flags", - table_name="evaluation_runs", - ) - op.drop_index( - "ix_evaluation_runs_references", - table_name="evaluation_runs", - ) - - op.drop_column("evaluation_runs", "references") - - # -------------------------------------------------------------------------- diff --git a/api/ee/databases/postgres/migrations/core/versions/8089ee7692d1_cleanup_preview_entities.py b/api/ee/databases/postgres/migrations/core/versions/8089ee7692d1_cleanup_preview_entities.py deleted file mode 100644 index 36e9e4edd4..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/8089ee7692d1_cleanup_preview_entities.py +++ /dev/null @@ -1,168 +0,0 @@ -"""clean up preview entities - -Revision ID: 8089ee7692d1 -Revises: fa07e07350bf -Create Date: 2025-08-20 16:00:00.00000000 - -""" - -from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa - -# revision identifiers, used by Alembic. -revision: str = "8089ee7692d1" -down_revision: Union[str, None] = "fa07e07350bf" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -TABLES_WITH_DATA_MIGRATION = [ - "evaluation_runs", - "evaluation_metrics", - "evaluation_queues", - "testcase_blobs", - "testset_revisions", - "query_revisions", - "workflow_revisions", -] - -TABLES_WITH_META_MIGRATION = [ - "evaluation_runs", - "evaluation_scenarios", - "evaluation_steps", - "evaluation_metrics", - "evaluation_queues", - "testcase_blobs", - "testset_artifacts", - "testset_variants", - "testset_revisions", - "query_artifacts", - "query_variants", - "query_revisions", - "workflow_artifacts", - "workflow_variants", - "workflow_revisions", -] - - -def upgrade() -> None: - # Convert jsonb -> json for data columns - for table in TABLES_WITH_DATA_MIGRATION: - op.alter_column( - table_name=table, - column_name="data", - type_=sa.JSON(), - postgresql_using="data::json", - ) - - # Convert jsonb -> json for meta columns - for table in TABLES_WITH_META_MIGRATION: - op.alter_column( - table_name=table, - column_name="meta", - type_=sa.JSON(), - postgresql_using="meta::json", - ) - - # Add new timestamp column - op.add_column( - "evaluation_scenarios", - sa.Column( - "timestamp", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - ) - - # Add repeat_idx and drop old repeat_id + retry_id - op.add_column( - "evaluation_steps", - sa.Column( - "repeat_idx", - sa.Integer(), - nullable=True, - ), - ) - op.drop_column( - "evaluation_steps", - "repeat_id", - ) - op.drop_column( - "evaluation_steps", - "retry_id", - ) - - # Rename key -> step_key - op.alter_column( - "evaluation_steps", - "key", - new_column_name="step_key", - existing_type=sa.String(), # adjust if needed - existing_nullable=False, - ) - - op.drop_column( - "evaluation_metrics", - "interval", - ) - - -def downgrade() -> None: - op.add_column( - "evaluation_metrics", - sa.Column( - "interval", - sa.Integer(), - nullable=True, - ), - ) - - # Rename step_key back to key - op.alter_column( - "evaluation_steps", - "step_key", - new_column_name="key", - existing_type=sa.String(), # adjust if needed - existing_nullable=False, - ) - - # Recreate repeat_id and retry_id columns - op.add_column( - "evaluation_steps", - sa.Column("repeat_id", sa.UUID(), nullable=False), - ) - op.add_column( - "evaluation_steps", - sa.Column("retry_id", sa.UUID(), nullable=False), - ) - - # Drop repeat_idx column - op.drop_column( - "evaluation_steps", - "repeat_idx", - ) - - # Drop timestamp column - op.drop_column( - "evaluation_scenarios", - "timestamp", - ) - - # Convert meta columns back to jsonb - for table in TABLES_WITH_META_MIGRATION: - op.alter_column( - table_name=table, - column_name="meta", - type_=sa.dialects.postgresql.JSONB(), - postgresql_using="meta::jsonb", - ) - - # Convert data columns back to jsonb - for table in TABLES_WITH_DATA_MIGRATION: - op.alter_column( - table_name=table, - column_name="data", - type_=sa.dialects.postgresql.JSONB(), - postgresql_using="data::jsonb", - ) diff --git a/api/ee/databases/postgres/migrations/core/versions/863f8ebc200f_extend_app_type_again.py b/api/ee/databases/postgres/migrations/core/versions/863f8ebc200f_extend_app_type_again.py deleted file mode 100644 index 7a52c3d62a..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/863f8ebc200f_extend_app_type_again.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Extend app_type - -Revision ID: 863f8ebc200f -Revises: 3b5f5652f611 -Create Date: 2025-01-08 10:24:00 -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = "863f8ebc200f" -down_revision: Union[str, None] = "3b5f5652f611" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -# The table/column that uses the enum -TABLE = "app_db" -COLUMN = "app_type" -TYPE_NAME = "app_type_enum" -TYPE_TEMP = "app_type_enum_temp" - -# Exact labels -ORIGINAL = ( - "CHAT_TEMPLATE", - "COMPLETION_TEMPLATE", - "CHAT_SERVICE", - "COMPLETION_SERVICE", - "CUSTOM", -) -EXTENDED = ORIGINAL + ("SDK_CUSTOM",) - - -def _create_enum(name: str, labels: tuple[str, ...]) -> None: - labels_sql = ",".join(f"'{v}'" for v in labels) - op.execute(f"CREATE TYPE {name} AS ENUM ({labels_sql})") - - -def _retype_column(to_type: str) -> None: - op.execute( - f""" - ALTER TABLE {TABLE} - ALTER COLUMN {COLUMN} - TYPE {to_type} - USING {COLUMN}::text::{to_type} - """ - ) - - -def upgrade(): - # 1) Create the replacement enum with ALL desired values - _create_enum(TYPE_TEMP, EXTENDED) - - # 2) Point the column to the tmp type - _retype_column(TYPE_TEMP) - - # 3) Drop old type and rename tmp to the canonical name - op.execute(f"DROP TYPE {TYPE_NAME}") - op.execute(f"ALTER TYPE {TYPE_TEMP} RENAME TO {TYPE_NAME}") - - -def downgrade(): - # 1) Recreate the enum WITHOUT the added values - _create_enum(TYPE_TEMP, ORIGINAL) - - # 2) Point the column back to the original label set - _retype_column(TYPE_TEMP) - - # 3) Drop current type and rename tmp back to the canonical name - op.execute(f"DROP TYPE {TYPE_NAME}") - op.execute(f"ALTER TYPE {TYPE_TEMP} RENAME TO {TYPE_NAME}") diff --git a/api/ee/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py b/api/ee/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py index 1baa0b36fe..bfd56ead5c 100644 --- a/api/ee/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py +++ b/api/ee/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py @@ -1,5 +1,4 @@ """Fix ag_config - Revision ID: 91d3b4a8c27f Revises: 7990f1e12f47 Create Date: 2025-04-24 11:00:00 diff --git a/api/ee/databases/postgres/migrations/core/versions/aa1b2c3d4e5f_migrate_config_parameters_jsonb_to_json.py b/api/ee/databases/postgres/migrations/core/versions/aa1b2c3d4e5f_migrate_config_parameters_jsonb_to_json.py deleted file mode 100644 index e0da80ce6b..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/aa1b2c3d4e5f_migrate_config_parameters_jsonb_to_json.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Migrate config_parameters from JSONB to JSON - -Revision ID: aa1b2c3d4e5f -Revises: d5d4d6bf738f -Create Date: 2025-07-11 12:00:00 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - - -# revision identifiers, used by Alembic. -revision: str = "aa1b2c3d4e5f" -down_revision: Union[str, None] = "d5d4d6bf738f" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade(): - """ - Migrate config_parameters from JSONB to JSON type to preserve key ordering. - This involves: - 1. Creating new JSON columns - 2. Copying data from JSONB to JSON - 3. Dropping old JSONB columns - 4. Renaming new columns to original names - """ - - # Step 1: Add new JSON columns with temporary names - op.add_column( - "app_variants", - sa.Column("config_parameters_json_temp", sa.JSON(), nullable=True), - ) - - op.add_column( - "app_variant_revisions", - sa.Column("config_parameters_json_temp", sa.JSON(), nullable=True), - ) - - # Step 2: Copy data from JSONB to JSON columns - # For app_variants table - op.execute( - """ - UPDATE app_variants - SET config_parameters_json_temp = config_parameters::json - """ - ) - - # For app_variant_revisions table - op.execute( - """ - UPDATE app_variant_revisions - SET config_parameters_json_temp = config_parameters::json - """ - ) - - # Step 3: Drop the old JSONB columns - op.drop_column("app_variants", "config_parameters") - op.drop_column("app_variant_revisions", "config_parameters") - - # Step 4: Rename the new JSON columns to the original names - op.alter_column( - "app_variants", - "config_parameters_json_temp", - new_column_name="config_parameters", - nullable=False, - server_default="{}", - ) - - op.alter_column( - "app_variant_revisions", - "config_parameters_json_temp", - new_column_name="config_parameters", - nullable=False, - ) - - -def downgrade(): - """ - Migrate config_parameters from JSON back to JSONB type. - """ - - # Step 1: Add new JSONB columns with temporary names - op.add_column( - "app_variants", - sa.Column("config_parameters_jsonb_temp", postgresql.JSONB(), nullable=True), - ) - - op.add_column( - "app_variant_revisions", - sa.Column("config_parameters_jsonb_temp", postgresql.JSONB(), nullable=True), - ) - - # Step 2: Copy data from JSON to JSONB columns - # For app_variants table - op.execute( - """ - UPDATE app_variants - SET config_parameters_jsonb_temp = config_parameters::jsonb - """ - ) - - # For app_variant_revisions table - op.execute( - """ - UPDATE app_variant_revisions - SET config_parameters_jsonb_temp = config_parameters::jsonb - """ - ) - - # Step 3: Drop the old JSON columns - op.drop_column("app_variants", "config_parameters") - op.drop_column("app_variant_revisions", "config_parameters") - - # Step 4: Rename the new JSONB columns to the original names - op.alter_column( - "app_variants", - "config_parameters_jsonb_temp", - new_column_name="config_parameters", - nullable=False, - ) - - op.alter_column( - "app_variant_revisions", - "config_parameters_jsonb_temp", - new_column_name="config_parameters", - nullable=False, - ) diff --git a/api/ee/databases/postgres/migrations/core/versions/b3f15a7140ab_add_version_to_eval_entities.py b/api/ee/databases/postgres/migrations/core/versions/b3f15a7140ab_add_version_to_eval_entities.py deleted file mode 100644 index f6a9d6a9af..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/b3f15a7140ab_add_version_to_eval_entities.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Add version to evaluation entities - -Revision ID: b3f15a7140ab -Revises: 5a71b3f140ab -Create Date: 2025-10-03 14:30:00.000000 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -revision: str = "b3f15a7140ab" -down_revision: Union[str, None] = "5a71b3f140ab" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # BASED ON - # version = Column( - # String, - # nullable=True, - # ) - - # EVALUATION RUNS ---------------------------------------------------------- - - op.add_column( - "evaluation_runs", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.add_column( - "evaluation_scenarios", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION RESULTS ------------------------------------------------------- - - op.add_column( - "evaluation_results", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION METRICS ------------------------------------------------------- - - op.add_column( - "evaluation_metrics", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION QUEUES -------------------------------------------------------- - - op.add_column( - "evaluation_queues", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # -------------------------------------------------------------------------- - - -def downgrade() -> None: - # EVALUATION QUEUES -------------------------------------------------------- - - op.drop_column("evaluation_queues", "version") - - # EVALUATION METRICS ------------------------------------------------------- - - op.drop_column("evaluation_metrics", "version") - - # EVALUATION RESULTS ------------------------------------------------------- - - op.drop_column("evaluation_results", "version") - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.drop_column("evaluation_scenarios", "version") - - # EVALUATION RUNS ---------------------------------------------------------- - - op.drop_column("evaluation_runs", "version") - - # -------------------------------------------------------------------------- diff --git a/api/ee/databases/postgres/migrations/core/versions/baa02d66a365_migrate_code_evaluators.py b/api/ee/databases/postgres/migrations/core/versions/baa02d66a365_migrate_code_evaluators.py deleted file mode 100644 index 7363127679..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/baa02d66a365_migrate_code_evaluators.py +++ /dev/null @@ -1,63 +0,0 @@ -"""migrate data.script from string to object - -Revision ID: baa02d66a365 -Revises: 863f8ebc200f -Create Date: 2025-11-06 15:49:00 -""" - -from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = "baa02d66a365" -down_revision: Union[str, None] = "863f8ebc200f" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # Convert data.script from a JSON string to: - # {"content": , "runtime": "python"} - op.execute( - sa.text( - """ - UPDATE public.workflow_revisions - SET data = jsonb_set( - data::jsonb, - '{script}', - jsonb_build_object( - 'content', data->>'script', - 'runtime', 'python' - ) - )::json - WHERE data->>'script' IS NOT NULL - AND json_typeof(data->'script') = 'string'; - """ - ) - ) - - -def downgrade() -> None: - # Revert only objects shaped like: - # {"content": , "runtime": "python"} -> "" - op.execute( - sa.text( - """ - UPDATE public.workflow_revisions - SET data = jsonb_set( - data::jsonb, - '{script}', - to_jsonb( (data->'script'->>'content') ) - )::json - WHERE json_typeof(data->'script') = 'object' - AND (data->'script') ? 'content' - AND json_typeof(data->'script'->'content') = 'string' - AND ( - (data->'script' ? 'runtime') IS FALSE - OR (data->'script'->>'runtime') = 'python' - ); - """ - ) - ) diff --git a/api/ee/databases/postgres/migrations/core/versions/d5d4d6bf738f_add_evaluation_queues.py b/api/ee/databases/postgres/migrations/core/versions/d5d4d6bf738f_add_evaluation_queues.py deleted file mode 100644 index 6d39d973aa..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/d5d4d6bf738f_add_evaluation_queues.py +++ /dev/null @@ -1,116 +0,0 @@ -"""add evaluation queues - -Revision ID: d5d4d6bf738f -Revises: fd77265d65dc -Create Date: 2025-07-10 17:04:00.000000 -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision: str = "d5d4d6bf738f" -down_revision: Union[str, None] = "fd77265d65dc" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - op.create_table( - "evaluation_queues", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "data", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "run_id", - sa.UUID(), - nullable=False, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "run_id"], - ["evaluation_runs.project_id", "evaluation_runs.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_evaluation_queues_project_id", - "project_id", - ), - sa.Index( - "ix_evaluation_queues_run_id", - "run_id", - ), - ) - - -def downgrade() -> None: - op.drop_table("evaluation_queues") diff --git a/api/ee/databases/postgres/migrations/core/versions/fa07e07350bf_add_timestamp_to_metrics.py b/api/ee/databases/postgres/migrations/core/versions/fa07e07350bf_add_timestamp_to_metrics.py deleted file mode 100644 index c6d85c7467..0000000000 --- a/api/ee/databases/postgres/migrations/core/versions/fa07e07350bf_add_timestamp_to_metrics.py +++ /dev/null @@ -1,34 +0,0 @@ -"""add timestamp to metrics - -Revision ID: fa07e07350bf -Revises: 30dcf07de96a -Create Date: 2025-07-30 14:55:00.000000 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - -# revision identifiers, used by Alembic. -revision: str = "fa07e07350bf" -down_revision: Union[str, None] = "30dcf07de96a" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - op.add_column( - "evaluation_metrics", - sa.Column("timestamp", sa.TIMESTAMP(timezone=True), nullable=True), - ) - op.add_column( - "evaluation_metrics", - sa.Column("interval", sa.INTEGER(), nullable=True), - ) - - -def downgrade() -> None: - op.drop_column("evaluation_metrics", "interval") - op.drop_column("evaluation_metrics", "timestamp") diff --git a/api/ee/databases/postgres/migrations/runner.py b/api/ee/databases/postgres/migrations/runner.py deleted file mode 100644 index 14baed1924..0000000000 --- a/api/ee/databases/postgres/migrations/runner.py +++ /dev/null @@ -1,21 +0,0 @@ -import asyncio - -from ee.databases.postgres.migrations.utils import ( - split_core_and_tracing, - copy_nodes_from_core_to_tracing, -) -from ee.databases.postgres.migrations.core.utils import ( - run_alembic_migration as migrate_core, -) -from ee.databases.postgres.migrations.tracing.utils import ( - run_alembic_migration as migrate_tracing, -) - - -if __name__ == "__main__": - loop = asyncio.get_event_loop() - - loop.run_until_complete(split_core_and_tracing()) - migrate_core() - migrate_tracing() - loop.run_until_complete(copy_nodes_from_core_to_tracing()) diff --git a/api/ee/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py b/api/ee/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py index 4b6903973b..30be9c9a30 100644 --- a/api/ee/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py +++ b/api/ee/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py @@ -1,7 +1,7 @@ """add_nodes_dbe Revision ID: 847972cfa14a -Revises: 58b1b61e5d6c +Revises: 320a4a7ee0c7 Create Date: 2024-11-07 12:21:19.080345 """ diff --git a/api/ee/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py b/api/ee/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py index 6cb4e3f963..ea97f876d6 100644 --- a/api/ee/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py +++ b/api/ee/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py @@ -66,25 +66,11 @@ def upgrade() -> None: "ix_spans_project_id_trace_type", "spans", ["project_id", "trace_type"], - if_not_exists=True, ) op.create_index( "ix_spans_project_id_span_type", "spans", ["project_id", "span_type"], - if_not_exists=True, - ) - op.create_index( - "ix_spans_project_id_trace_id_created_at", - "spans", - ["project_id", "trace_id", sa.text("created_at DESC")], - if_not_exists=True, - ) - op.create_index( - "ix_spans_project_id_trace_id_start_time", - "spans", - ["project_id", "trace_id", sa.text("start_time DESC")], - if_not_exists=True, ) op.create_index( "ix_hashes_gin", @@ -92,110 +78,29 @@ def upgrade() -> None: ["hashes"], postgresql_using="gin", postgresql_ops={"hashes": "jsonb_path_ops"}, - if_not_exists=True, - ) - op.drop_index( - "ix_events_gin", - table_name="spans", - if_exists=True, - ) - op.create_index( - "ix_events_gin", - "spans", # replace with your table name - ["events"], - postgresql_using="gin", - postgresql_ops={"events": "jsonb_path_ops"}, - if_not_exists=True, ) op.create_index( - "ix_spans_fts_attributes_gin", + "ix_spans_fts_gin", "spans", [sa.text("to_tsvector('simple', attributes)")], postgresql_using="gin", - if_not_exists=True, - ) - op.create_index( - "ix_spans_fts_events_gin", - "spans", - [sa.text("to_tsvector('simple', events)")], - postgresql_using="gin", - if_not_exists=True, ) # -------------------------------------------------------------------------- def downgrade() -> None: # - SPANS ------------------------------------------------------------------ - op.drop_index( - "ix_spans_fts_events_gin", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_fts_attributes_gin", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_events_gin", - table_name="spans", - if_exists=True, - ) - op.create_index( - "ix_events_gin", - "spans", - ["events"], - postgresql_using="gin", - if_not_exists=True, - ) - op.drop_index( - "ix_hashes_gin", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_trace_id_start_time", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_trace_id_created_at", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_span_type", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_trace_type", - table_name="spans", - if_exists=True, - ) - op.drop_column( - "spans", - "exception", - if_exists=True, - ) - op.drop_column( - "spans", - "hashes", - if_exists=True, - ) - op.drop_column( - "spans", - "span_type", - if_exists=True, - ) - op.drop_column( - "spans", - "trace_type", - if_exists=True, - ) + # op.drop_index("ix_spans_fts", table_name="spans") + op.drop_index("ix_hashes_gin", table_name="spans") + op.drop_index("ix_spans_project_id_span_type", table_name="spans") + op.drop_index("ix_spans_project_id_trace_type", table_name="spans") + op.drop_column("spans", "exception") + op.drop_column("spans", "hashes") + op.drop_column("spans", "span_type") + op.drop_column("spans", "trace_type") - span_type_enum = sa.Enum(SpanType, name="spantype") - trace_type_enum = sa.Enum(TraceType, name="tracetype") + span_type_enum = sa.Enum(SpanType, name="tracetype") + trace_type_enum = sa.Enum(TraceType, name="spantype") span_type_enum.drop(op.get_bind(), checkfirst=True) trace_type_enum.drop(op.get_bind(), checkfirst=True) diff --git a/api/ee/databases/postgres/migrations/utils.py b/api/ee/databases/postgres/migrations/utils.py index f3874da1c8..393ac80d57 100644 --- a/api/ee/databases/postgres/migrations/utils.py +++ b/api/ee/databases/postgres/migrations/utils.py @@ -3,8 +3,6 @@ import tempfile from sqlalchemy import create_engine, text -from sqlalchemy.ext.asyncio import create_async_engine - from sqlalchemy.exc import ProgrammingError from oss.src.utils.env import env @@ -15,9 +13,9 @@ os.getenv("POSTGRES_URI") or env.POSTGRES_URI_CORE or env.POSTGRES_URI_TRACING - or "postgresql+asyncpg://username:password@localhost:5432/agenta_ee" + or "postgresql://username:password@localhost:5432/agenta_ee" ) -DB_PROTOCOL = POSTGRES_URI.split("://")[0] # .replace("+asyncpg", "") +DB_PROTOCOL = POSTGRES_URI.split("://")[0].replace("+asyncpg", "") DB_USER = POSTGRES_URI.split("://")[1].split(":")[0] DB_PASS = POSTGRES_URI.split("://")[1].split(":")[1].split("@")[0] DB_HOST = POSTGRES_URI.split("@")[1].split(":")[0] @@ -41,37 +39,31 @@ } -async def copy_nodes_from_core_to_tracing(): - engine = create_async_engine( +def copy_nodes_from_core_to_tracing(): + engine = create_engine( POSTGRES_URI_POSTGRES, isolation_level="AUTOCOMMIT", ) - async with engine.begin() as conn: + with engine.connect() as conn: for old_name, new_name in NODES_TF.items(): - old_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": old_name}, - ) + old_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": old_name}, ).scalar() - new_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": new_name}, - ) + new_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": new_name}, ).scalar() if old_exists and new_exists: # Check if the nodes table exists in old_name database check_url = f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{old_name}" - check_engine = create_async_engine(check_url) - async with check_engine.begin() as conn: - result = ( - await conn.execute( - text("SELECT to_regclass('public.nodes')"), - ) + check_engine = create_engine(check_url) + with check_engine.connect() as conn: + result = conn.execute( + text("SELECT to_regclass('public.nodes')") ).scalar() if result is None: print( @@ -79,10 +71,8 @@ async def copy_nodes_from_core_to_tracing(): ) return - count = ( - await conn.execute( - text("SELECT COUNT(*) FROM public.nodes"), - ) + count = conn.execute( + text("SELECT COUNT(*) FROM public.nodes") ).scalar() if count == 0: @@ -92,18 +82,14 @@ async def copy_nodes_from_core_to_tracing(): return check_url = f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" - check_engine = create_async_engine(check_url) + check_engine = create_engine(check_url) - async with check_engine.begin() as conn: - count = ( - await conn.execute( - text( - "SELECT COUNT(*) FROM public.nodes", - ) - ) + with check_engine.connect() as conn: + count = conn.execute( + text("SELECT COUNT(*) FROM public.nodes") ).scalar() - if (count or 0) > 0: + if count > 0: print( f"⚠️ Table 'nodes' already exists in '{new_name}' with {count} rows. Skipping copy." ) @@ -163,26 +149,21 @@ async def copy_nodes_from_core_to_tracing(): print(f"✔ Restored 'nodes' table into '{new_name}'") # Step 3: Verify 'nodes' exists in both DBs, then drop from old - source_engine = create_async_engine( + source_engine = create_engine( f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{old_name}" ) - dest_engine = create_async_engine( + dest_engine = create_engine( f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" ) - async with source_engine.begin() as src, dest_engine.begin() as dst: - src = await src.execution_options(isolation_level="AUTOCOMMIT") - dst = await dst.execution_options(isolation_level="AUTOCOMMIT") - - src_exists = ( - await src.execute( - text("SELECT to_regclass('public.nodes')") - ) + with source_engine.connect().execution_options( + autocommit=True + ) as src, dest_engine.connect() as dst: + src_exists = src.execute( + text("SELECT to_regclass('public.nodes')") ).scalar() - dst_exists = ( - await dst.execute( - text("SELECT to_regclass('public.nodes')"), - ) + dst_exists = dst.execute( + text("SELECT to_regclass('public.nodes')") ).scalar() if src_exists and dst_exists: @@ -204,10 +185,8 @@ async def copy_nodes_from_core_to_tracing(): env={**os.environ, "PGPASSWORD": DB_PASS}, ) - count = ( - await src.execute( - text("SELECT COUNT(*) FROM public.nodes"), - ) + count = src.execute( + text("SELECT COUNT(*) FROM public.nodes") ).scalar() print(f"✅ Remaining rows: {count}") @@ -219,32 +198,28 @@ async def copy_nodes_from_core_to_tracing(): os.remove(dump_file) -async def split_core_and_tracing(): - engine = create_async_engine( +def split_core_and_tracing(): + engine = create_engine( POSTGRES_URI_POSTGRES, isolation_level="AUTOCOMMIT", ) - async with engine.begin() as conn: + with engine.connect() as conn: for old_name, new_name in RENAME_MAP.items(): - old_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": old_name}, - ) + old_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": old_name}, ).scalar() - new_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": new_name}, - ) + new_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": new_name}, ).scalar() if old_exists and not new_exists: print(f"Renaming database '{old_name}' → '{new_name}'...") try: - await conn.execute( + conn.execute( text(f"ALTER DATABASE {old_name} RENAME TO {new_name}") ) print(f"✔ Renamed '{old_name}' to '{new_name}'") @@ -262,7 +237,7 @@ async def split_core_and_tracing(): ) try: # Ensure the role exists - await conn.execute( + conn.execute( text( f""" DO $$ @@ -278,11 +253,11 @@ async def split_core_and_tracing(): print(f"✔ Ensured role '{DB_USER}' exists") # Create the new database - await conn.execute(text(f"CREATE DATABASE {new_name}")) + conn.execute(text(f"CREATE DATABASE {new_name}")) print(f"✔ Created database '{new_name}'") # Grant privileges on the database to the role - await conn.execute( + conn.execute( text( f"GRANT ALL PRIVILEGES ON DATABASE {new_name} TO {DB_USER}" ) @@ -292,12 +267,12 @@ async def split_core_and_tracing(): ) # Connect to the new database to grant schema permissions - new_db_url = f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" + new_db_url = f"postgresql://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" - async with create_async_engine( + with create_engine( new_db_url, isolation_level="AUTOCOMMIT" - ).begin() as new_db_conn: - await new_db_conn.execute( + ).connect() as new_db_conn: + new_db_conn.execute( text(f"GRANT ALL ON SCHEMA public TO {DB_USER}") ) print( diff --git a/api/ee/docker/Dockerfile.dev b/api/ee/docker/Dockerfile.dev index 2074141a18..c66c5b3021 100644 --- a/api/ee/docker/Dockerfile.dev +++ b/api/ee/docker/Dockerfile.dev @@ -18,13 +18,9 @@ RUN pip install --upgrade pip \ COPY ./ee /app/ee/ COPY ./oss /app/oss/ COPY ./entrypoint.py ./pyproject.toml /app/ -# RUN poetry config virtualenvs.create false \ && poetry install --no-interaction --no-ansi -# - -ENV PYTHONPATH=/sdk:$PYTHONPATH COPY ./ee/src/crons/meters.sh /meters.sh COPY ./ee/src/crons/meters.txt /etc/cron.d/meters-cron @@ -34,12 +30,4 @@ RUN cat -A /etc/cron.d/meters-cron RUN chmod +x /meters.sh \ && chmod 0644 /etc/cron.d/meters-cron -COPY ./oss/src/crons/queries.sh /queries.sh -COPY ./oss/src/crons/queries.txt /etc/cron.d/queries-cron -RUN sed -i -e '$a\' /etc/cron.d/queries-cron -RUN cat -A /etc/cron.d/queries-cron - -RUN chmod +x /queries.sh \ - && chmod 0644 /etc/cron.d/queries-cron - -EXPOSE 8000 +EXPOSE 8000 \ No newline at end of file diff --git a/api/ee/docker/Dockerfile.gh b/api/ee/docker/Dockerfile.gh index ab3a06b2ff..c66c5b3021 100644 --- a/api/ee/docker/Dockerfile.gh +++ b/api/ee/docker/Dockerfile.gh @@ -18,13 +18,9 @@ RUN pip install --upgrade pip \ COPY ./ee /app/ee/ COPY ./oss /app/oss/ COPY ./entrypoint.py ./pyproject.toml /app/ -COPY ./sdk /sdk/ RUN poetry config virtualenvs.create false \ - && poetry install --no-interaction --no-ansi \ - && pip install --force-reinstall --upgrade /sdk/ - -# + && poetry install --no-interaction --no-ansi COPY ./ee/src/crons/meters.sh /meters.sh COPY ./ee/src/crons/meters.txt /etc/cron.d/meters-cron @@ -34,12 +30,4 @@ RUN cat -A /etc/cron.d/meters-cron RUN chmod +x /meters.sh \ && chmod 0644 /etc/cron.d/meters-cron -COPY ./oss/src/crons/queries.sh /queries.sh -COPY ./oss/src/crons/queries.txt /etc/cron.d/queries-cron -RUN sed -i -e '$a\' /etc/cron.d/queries-cron -RUN cat -A /etc/cron.d/queries-cron - -RUN chmod +x /queries.sh \ - && chmod 0644 /etc/cron.d/queries-cron - -EXPOSE 8000 +EXPOSE 8000 \ No newline at end of file diff --git a/api/ee/src/apis/fastapi/billing/router.py b/api/ee/src/apis/fastapi/billing/router.py index 08762eaa76..3d43a71370 100644 --- a/api/ee/src/apis/fastapi/billing/router.py +++ b/api/ee/src/apis/fastapi/billing/router.py @@ -1,9 +1,7 @@ -from typing import Any, Dict from os import environ from json import loads, decoder from uuid import getnode from datetime import datetime, timezone -from dateutil.relativedelta import relativedelta from fastapi import APIRouter, Request, status, HTTPException, Query from fastapi.responses import JSONResponse @@ -49,6 +47,8 @@ class SubscriptionsRouter: + VERSION = "1.0.0" + def __init__( self, subscription_service: SubscriptionsService, @@ -571,146 +571,76 @@ async def fetch_subscription( organization_id=organization_id, ) - if not subscription or not subscription.plan: - return JSONResponse( - status_code=status.HTTP_404_NOT_FOUND, - content={ - "status": "error", - "message": "Subscription (Agenta) not found", - }, - ) - plan = subscription.plan anchor = subscription.anchor - _status: Dict[str, Any] = dict( - plan=plan.value, - type="standard", - ) - - if plan == Plan.CLOUD_V0_HOBBY: - return _status - - if not subscription.subscription_id: - return JSONResponse( - status_code=status.HTTP_404_NOT_FOUND, - content={ - "status": "error", - "message": "Subscription (Agenta) not found", - }, - ) - - if not stripe.api_key: - return JSONResponse( - status_code=status.HTTP_403_FORBIDDEN, - content={ - "status": "error", - "message": "Missing Stripe API Key", - }, - ) - - try: - _subscription = stripe.Subscription.retrieve( - id=subscription.subscription_id, - ) - except Exception: - _subscription = None - - if _subscription: - _status["period_start"] = int(_subscription.current_period_start) - _status["period_end"] = int(_subscription.current_period_end) - _status["free_trial"] = _subscription.status == "trialing" - - return _status - - if not anchor or anchor < 1 or anchor > 31: - anchor = now.day - - last_day_this_month = ( - datetime( - now.year, - now.month, - 1, - tzinfo=timezone.utc, - ) - + relativedelta( - months=+1, - days=-1, - ) - ).day + _status = {"plan": plan.value, "type": "standard"} - day_this_month = min(anchor, last_day_this_month) - - if now.day < anchor: - prev_month = now + relativedelta( - months=-1, - ) - - last_day_prev_month = ( - datetime( - prev_month.year, - prev_month.month, - 1, - tzinfo=timezone.utc, - ) - + relativedelta( - months=+1, - days=-1, + if plan != Plan.CLOUD_V0_HOBBY: + if not stripe.api_key: + return JSONResponse( + status_code=status.HTTP_403_FORBIDDEN, + content={"status": "error", "message": "Missing Stripe API Key"}, ) - ).day - - day_prev_month = min(anchor, last_day_prev_month) - - period_start = datetime( - year=prev_month.year, - month=prev_month.month, - day=day_prev_month, - tzinfo=timezone.utc, - ) - period_end = datetime( - year=now.year, - month=now.month, - day=day_this_month, - tzinfo=timezone.utc, - ) - else: - period_start = datetime( - year=now.year, - month=now.month, - day=day_this_month, - tzinfo=timezone.utc, - ) - - next_month = now + relativedelta( - months=+1, - ) - last_day_next_month = ( - datetime( - next_month.year, - next_month.month, - 1, - tzinfo=timezone.utc, - ) - + relativedelta( - months=+1, - days=-1, + if not subscription: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + content={ + "status": "error", + "message": "Subscription (Agenta) not found", + }, ) - ).day - day_next_month = min(anchor, last_day_next_month) + try: + subscription = stripe.Subscription.retrieve( + id=subscription.subscription_id, + ) + except: # pylint: disable=bare-except + subscription = None - period_end = datetime( - year=next_month.year, - month=next_month.month, - day=day_next_month, - tzinfo=timezone.utc, - ) + if not subscription: + if now.day < anchor: + _status["period_start"] = int( + datetime( + year=(now.year + (now.month - 2) // 12), + month=(now.month - 2) % 12 + 1, + day=anchor, + tzinfo=timezone.utc, + ).timestamp() + ) + _status["period_end"] = int( + datetime( + year=now.year, + month=now.month, + day=anchor, + tzinfo=timezone.utc, + ).timestamp() + ) + else: + _status["period_start"] = int( + datetime( + year=now.year, + month=now.month, + day=anchor, + tzinfo=timezone.utc, + ).timestamp() + ) + _status["period_end"] = int( + datetime( + year=(now.year + (now.month) // 12), + month=(now.month + 1) % 12, + day=anchor, + tzinfo=timezone.utc, + ).timestamp() + ) - _status["period_start"] = int(period_start.timestamp()) - _status["period_end"] = int(period_end.timestamp()) - _status["free_trial"] = False - _status["type"] = "custom" + _status["free_trial"] = False + _status["type"] = "custom" + else: + _status["period_start"] = subscription.current_period_start + _status["period_end"] = subscription.current_period_end + _status["free_trial"] = subscription.status == "trialing" return _status @@ -824,13 +754,12 @@ async def create_portal_user_route( self, request: Request, ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.EDIT_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.create_portal( organization_id=request.state.organization_id, @@ -852,13 +781,12 @@ async def create_checkout_user_route( plan: Plan = Query(...), success_url: str = Query(...), # find a way to make this optional or moot ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.EDIT_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.create_checkout( organization_id=request.state.organization_id, @@ -884,13 +812,12 @@ async def fetch_plan_user_route( self, request: Request, ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.VIEW_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.fetch_plans( organization_id=request.state.organization_id, @@ -902,13 +829,12 @@ async def switch_plans_user_route( request: Request, plan: Plan = Query(...), ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.EDIT_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.switch_plans( organization_id=request.state.organization_id, @@ -931,13 +857,12 @@ async def fetch_subscription_user_route( self, request: Request, ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.VIEW_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.fetch_subscription( organization_id=request.state.organization_id, @@ -948,13 +873,12 @@ async def cancel_subscription_user_route( self, request: Request, ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.EDIT_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.cancel_subscription( organization_id=request.state.organization_id, @@ -974,13 +898,12 @@ async def fetch_usage_user_route( self, request: Request, ): - if is_ee(): - if not await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_BILLING, - ): - return FORBIDDEN_RESPONSE + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.VIEW_BILLING, + ): + return FORBIDDEN_RESPONSE return await self.fetch_usage( organization_id=request.state.organization_id, diff --git a/api/ee/src/core/entitlements/types.py b/api/ee/src/core/entitlements/types.py index e346f11c57..fa8ec29577 100644 --- a/api/ee/src/core/entitlements/types.py +++ b/api/ee/src/core/entitlements/types.py @@ -60,9 +60,9 @@ class Probe(BaseModel): }, }, "features": [ - "Unlimited prompts", - "20 evaluations/month", + "2 prompts", "5k traces/month", + "20 evaluations/month", "2 seats", ], }, @@ -109,9 +109,9 @@ class Probe(BaseModel): }, "features": [ "Unlimited prompts", + "10k traces/month", "Unlimited evaluations", - "10k free traces/month", - "3 free seats", + "3 seats included", "Up to 10 seats", ], }, @@ -119,39 +119,19 @@ class Probe(BaseModel): "title": "Business", "description": "For scale, security, and support.", "type": "standard", - "plan": Plan.CLOUD_V0_BUSINESS.value, "price": { "base": { "type": "flat", "currency": "USD", "amount": 399.00, - }, - "traces": { - "type": "tiered", - "currency": "USD", - "tiers": [ - { - "limit": 1_000_000, - "amount": 0.00, - }, - { - "amount": 5.00, - "rate": 10_000, - }, - ], + "starting_at": True, }, }, "features": [ - "Everything in Pro", + "Unlimited prompts", + "Unlimited traces", + "Unlimited evaluations", "Unlimited seats", - "1M free traces/month", - "Multiple workspaces [soon]", - "Roles and RBAC", - "SSO and MFA [soon]", - "SOC 2 reports", - "HIPAA BAA [soon]", - "Private Slack Channel", - "Business SLA", ], }, { @@ -160,15 +140,13 @@ class Probe(BaseModel): "type": "standard", "features": [ "Everything in Business", - "Custom roles", - "Enterprise SSO", - "Audit logs", - "Self-hosting options", - "Bring Your Own Cloud (BYOC)", + "Enterprise-grade security", + "SOC 2 reports", "Security reviews", "Dedicated support", - "Custom SLA", + "Custom SLAs", "Custom terms", + "Self-hosted deployment options", ], }, { @@ -212,7 +190,7 @@ class Probe(BaseModel): }, Tracker.GAUGES: { Gauge.USERS: Quota(limit=2, strict=True, free=2), - Gauge.APPLICATIONS: Quota(strict=True), + Gauge.APPLICATIONS: Quota(limit=2, strict=True, free=2), }, }, Plan.CLOUD_V0_PRO: { @@ -229,20 +207,6 @@ class Probe(BaseModel): Gauge.APPLICATIONS: Quota(strict=True), }, }, - Plan.CLOUD_V0_BUSINESS: { - Tracker.FLAGS: { - Flag.HOOKS: True, - Flag.RBAC: True, - }, - Tracker.COUNTERS: { - Counter.TRACES: Quota(monthly=True, free=1_000_000), - Counter.EVALUATIONS: Quota(monthly=True, strict=True), - }, - Tracker.GAUGES: { - Gauge.USERS: Quota(strict=True), - Gauge.APPLICATIONS: Quota(strict=True), - }, - }, Plan.CLOUD_V0_HUMANITY_LABS: { Tracker.FLAGS: { Flag.HOOKS: True, diff --git a/api/ee/src/core/subscriptions/types.py b/api/ee/src/core/subscriptions/types.py index 719133b654..1f55dbe386 100644 --- a/api/ee/src/core/subscriptions/types.py +++ b/api/ee/src/core/subscriptions/types.py @@ -11,7 +11,6 @@ class Plan(str, Enum): CLOUD_V0_HOBBY = "cloud_v0_hobby" CLOUD_V0_PRO = "cloud_v0_pro" - CLOUD_V0_BUSINESS = "cloud_v0_business" # CLOUD_V0_HUMANITY_LABS = "cloud_v0_humanity_labs" CLOUD_V0_X_LABS = "cloud_v0_x_labs" diff --git a/api/ee/src/crons/meters.sh b/api/ee/src/crons/meters.sh index c0f7d8c5ae..0550fdab98 100644 --- a/api/ee/src/crons/meters.sh +++ b/api/ee/src/crons/meters.sh @@ -1,5 +1,4 @@ #!/bin/sh -set -eu AGENTA_AUTH_KEY=$(tr '\0' '\n' < /proc/1/environ | grep ^AGENTA_AUTH_KEY= | cut -d= -f2-) @@ -12,6 +11,6 @@ curl \ -w "\nHTTP_STATUS:%{http_code}\n" \ -X POST \ -H "Authorization: Access ${AGENTA_AUTH_KEY}" \ - "http://api:8000/admin/billing/usage/report" || echo "❌ CURL failed" + "http://api:8000/admin/billing/usage/report" || echo "❌ Curl failed" echo "[$(date)] meters.sh done" >> /proc/1/fd/1 \ No newline at end of file diff --git a/api/ee/src/crons/meters.txt b/api/ee/src/crons/meters.txt index f3acd78570..5574cf68d7 100644 --- a/api/ee/src/crons/meters.txt +++ b/api/ee/src/crons/meters.txt @@ -1,2 +1,2 @@ -* * * * * root echo "cron test $(date)" >> /proc/1/fd/1 2>&1 0 * * * * root sh /meters.sh >> /proc/1/fd/1 2>&1 +* * * * * root echo "cron test $(date)" >> /proc/1/fd/1 2>&1 diff --git a/api/ee/src/dbs/postgres/meters/dbas.py b/api/ee/src/dbs/postgres/meters/dbas.py index 450e517d28..e42a0443ac 100644 --- a/api/ee/src/dbs/postgres/meters/dbas.py +++ b/api/ee/src/dbs/postgres/meters/dbas.py @@ -8,8 +8,8 @@ class PeriodDBA: __abstract__ = True - year = Column(SmallInteger, nullable=False) - month = Column(SmallInteger, nullable=False) + year = Column(SmallInteger, nullable=True) + month = Column(SmallInteger, nullable=True) class MeterDBA( diff --git a/api/ee/tests/manual/evaluations/sdk/__init__.py b/api/ee/src/dbs/postgres/shared/__init__.py similarity index 100% rename from api/ee/tests/manual/evaluations/sdk/__init__.py rename to api/ee/src/dbs/postgres/shared/__init__.py diff --git a/api/ee/src/dbs/tps/aws/dao.py b/api/ee/src/dbs/tps/aws/dao.py new file mode 100644 index 0000000000..d1c610a37b --- /dev/null +++ b/api/ee/src/dbs/tps/aws/dao.py @@ -0,0 +1,28 @@ +from abc import ABC, abstractmethod +from typing import Optional, Union, Dict + + +class SystemSecretDAOInterface(ABC): + """ + Interface for interacting with a system secrets dao. + """ + + def __init__(self, **kwargs): + raise NotImplementedError + + @abstractmethod + def fetch_secret( + self, credentials: str, secret_key: Optional[str] = None + ) -> Optional[Union[Dict[str, str], str]]: + """ + Fetch a secret by its credentials. + + Args: + credentials (str): Required credentials to fetch the secret + secret_key (Optional[str]): Specific key to retrieve (in the case the secret comes as a dictionary) + + Returns: + Secret value or None if retrieval fails. + """ + + raise NotImplementedError diff --git a/api/ee/src/main.py b/api/ee/src/main.py index 036bda6f0f..b0381be585 100644 --- a/api/ee/src/main.py +++ b/api/ee/src/main.py @@ -2,83 +2,68 @@ from oss.src.utils.logging import get_module_logger -from ee.src.routers import workspace_router, organization_router +from ee.src.routers import ( # type: ignore + workspace_router, + organization_router, + evaluation_router, + human_evaluation_router, +) -from ee.src.dbs.postgres.meters.dao import MetersDAO from ee.src.dbs.postgres.subscriptions.dao import SubscriptionsDAO - -from ee.src.core.meters.service import MetersService from ee.src.core.subscriptions.service import SubscriptionsService - from ee.src.apis.fastapi.billing.router import SubscriptionsRouter - -# DBS -------------------------------------------------------------------------- - -meters_dao = MetersDAO() - -subscriptions_dao = SubscriptionsDAO() - -# CORE ------------------------------------------------------------------------- - -meters_service = MetersService( - meters_dao=meters_dao, -) - -subscription_service = SubscriptionsService( - subscriptions_dao=subscriptions_dao, - meters_service=meters_service, -) - -# APIS ------------------------------------------------------------------------- - -subscriptions_router = SubscriptionsRouter( - subscription_service=subscription_service, -) - +from ee.src.dbs.postgres.meters.dao import MetersDAO +from ee.src.core.meters.service import MetersService log = get_module_logger(__name__) def extend_main(app: FastAPI): - # ROUTES ------------------------------------------------------------------- + app.include_router(organization_router.router, prefix="/organizations") + app.include_router(workspace_router.router, prefix="/workspaces") + app.include_router( + evaluation_router.router, prefix="/evaluations", tags=["Evaluations"] + ) + app.include_router( + human_evaluation_router.router, + prefix="/human-evaluations", + tags=["Human-Evaluations"], + ) + + subscriptions_router = SubscriptionsRouter( + subscription_service=SubscriptionsService( + subscriptions_dao=SubscriptionsDAO(), + meters_service=MetersService( + meters_dao=MetersDAO(), + ), + ), + ) app.include_router( router=subscriptions_router.router, prefix="/billing", tags=["Billing"], ) - app.include_router( router=subscriptions_router.admin_router, prefix="/admin/billing", tags=["Admin", "Billing"], ) - # ROUTES (more) ------------------------------------------------------------ - - app.include_router( - organization_router.router, - prefix="/organizations", - ) - - app.include_router( - workspace_router.router, - prefix="/workspaces", - ) - - # -------------------------------------------------------------------------- - return app def extend_app_schema(app: FastAPI): - app.openapi()["info"]["title"] = "Agenta API" - app.openapi()["info"]["description"] = "Agenta API" + app.openapi()["info"]["title"] = "Agenta Backend" + app.openapi()["info"]["description"] = "Agenta Backend API" app.openapi()["info"]["contact"] = { "name": "Agenta", "url": "https://agenta.ai", "email": "team@agenta.ai", } + + APIKeyHeader = {"APIKeyHeader": []} # type: ignore + app.openapi()["components"]["securitySchemes"] = { "APIKeyHeader": { "type": "apiKey", @@ -86,15 +71,8 @@ def extend_app_schema(app: FastAPI): "in": "header", } } - app.openapi()["security"] = [ - { - "APIKeyHeader": [], - }, - ] - app.openapi()["servers"] = [ - { - "url": "https://cloud.agenta.ai/api", - }, - ] + + app.openapi()["security"] = [APIKeyHeader] + app.openapi()["servers"] = [{"url": "https://cloud.agenta.ai/api"}] return app diff --git a/api/ee/src/models/db_models.py b/api/ee/src/models/db_models.py index b05b633659..f09b9e0324 100644 --- a/api/ee/src/models/db_models.py +++ b/api/ee/src/models/db_models.py @@ -252,3 +252,267 @@ class ProjectMemberDB(Base): class DeploymentDB(OssDeploymentDB): pass + + +class HumanEvaluationVariantDB(Base): + __tablename__ = "human_evaluation_variants" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + human_evaluation_id = Column( + UUID(as_uuid=True), ForeignKey("human_evaluations.id", ondelete="CASCADE") + ) + variant_id = Column( + UUID(as_uuid=True), ForeignKey("app_variants.id", ondelete="SET NULL") + ) + variant_revision_id = Column( + UUID(as_uuid=True), ForeignKey("app_variant_revisions.id", ondelete="SET NULL") + ) + + variant = relationship("AppVariantDB", backref="evaluation_variant") + variant_revision = relationship( + "AppVariantRevisionsDB", backref="evaluation_variant_revision" + ) + + +class HumanEvaluationDB(Base): + __tablename__ = "human_evaluations" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + app_id = Column(UUID(as_uuid=True), ForeignKey("app_db.id", ondelete="CASCADE")) + project_id = Column( + UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") + ) + status = Column(String) + evaluation_type = Column(String) + testset_id = Column(UUID(as_uuid=True), ForeignKey("testsets.id")) + created_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + updated_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + testset = relationship("TestSetDB") + evaluation_variant = relationship( + "HumanEvaluationVariantDB", + cascade=CASCADE_ALL_DELETE, + backref="human_evaluation", + ) + evaluation_scenario = relationship( + "HumanEvaluationScenarioDB", + cascade=CASCADE_ALL_DELETE, + backref="evaluation_scenario", + ) + + +class HumanEvaluationScenarioDB(Base): + __tablename__ = "human_evaluations_scenarios" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + project_id = Column( + UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") + ) + evaluation_id = Column( + UUID(as_uuid=True), ForeignKey("human_evaluations.id", ondelete="CASCADE") + ) + inputs = Column( + mutable_json_type(dbtype=JSONB, nested=True) + ) # List of HumanEvaluationScenarioInput + outputs = Column( + mutable_json_type(dbtype=JSONB, nested=True) + ) # List of HumanEvaluationScenarioOutput + vote = Column(String) + score = Column(String) + correct_answer = Column(String) + created_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + updated_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + is_pinned = Column(Boolean) + note = Column(String) + + +class EvaluationAggregatedResultDB(Base): + __tablename__ = "auto_evaluation_aggregated_results" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + evaluation_id = Column( + UUID(as_uuid=True), ForeignKey("auto_evaluations.id", ondelete="CASCADE") + ) + evaluator_config_id = Column( + UUID(as_uuid=True), + ForeignKey("auto_evaluator_configs.id", ondelete="SET NULL"), + ) + result = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result + + evaluator_config = relationship("EvaluatorConfigDB", backref="evaluator_config") + + +class EvaluationScenarioResultDB(Base): + __tablename__ = "auto_evaluation_scenario_results" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + evaluation_scenario_id = Column( + UUID(as_uuid=True), + ForeignKey("auto_evaluation_scenarios.id", ondelete="CASCADE"), + ) + evaluator_config_id = Column( + UUID(as_uuid=True), + ForeignKey("auto_evaluator_configs.id", ondelete="SET NULL"), + ) + result = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result + + +class EvaluationDB(Base): + __tablename__ = "auto_evaluations" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + app_id = Column(UUID(as_uuid=True), ForeignKey("app_db.id", ondelete="CASCADE")) + project_id = Column( + UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") + ) + status = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result + testset_id = Column( + UUID(as_uuid=True), ForeignKey("testsets.id", ondelete="SET NULL") + ) + variant_id = Column( + UUID(as_uuid=True), ForeignKey("app_variants.id", ondelete="SET NULL") + ) + variant_revision_id = Column( + UUID(as_uuid=True), ForeignKey("app_variant_revisions.id", ondelete="SET NULL") + ) + average_cost = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result + total_cost = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result + average_latency = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result + created_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + updated_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + project = relationship("ee.src.models.db_models.ProjectDB") + testset = relationship("TestSetDB") + variant = relationship("AppVariantDB") + variant_revision = relationship("AppVariantRevisionsDB") + aggregated_results = relationship( + "EvaluationAggregatedResultDB", + cascade=CASCADE_ALL_DELETE, + backref="evaluation", + ) + evaluation_scenarios = relationship( + "EvaluationScenarioDB", cascade=CASCADE_ALL_DELETE, backref="evaluation" + ) + evaluator_configs = relationship( + "EvaluationEvaluatorConfigDB", + cascade=CASCADE_ALL_DELETE, + backref="evaluation", + ) + + +class EvaluationEvaluatorConfigDB(Base): + __tablename__ = "auto_evaluation_evaluator_configs" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + evaluation_id = Column( + UUID(as_uuid=True), + ForeignKey("auto_evaluations.id", ondelete="CASCADE"), + primary_key=True, + ) + evaluator_config_id = Column( + UUID(as_uuid=True), + ForeignKey("auto_evaluator_configs.id", ondelete="SET NULL"), + primary_key=True, + ) + + +class EvaluationScenarioDB(Base): + __tablename__ = "auto_evaluation_scenarios" + + id = Column( + UUID(as_uuid=True), + primary_key=True, + default=uuid.uuid7, + unique=True, + nullable=False, + ) + project_id = Column( + UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") + ) + evaluation_id = Column( + UUID(as_uuid=True), ForeignKey("auto_evaluations.id", ondelete="CASCADE") + ) + variant_id = Column( + UUID(as_uuid=True), ForeignKey("app_variants.id", ondelete="SET NULL") + ) + inputs = Column( + mutable_json_type(dbtype=JSONB, nested=True) + ) # List of EvaluationScenarioInput + outputs = Column( + mutable_json_type(dbtype=JSONB, nested=True) + ) # List of EvaluationScenarioOutput + correct_answers = Column( + mutable_json_type(dbtype=JSONB, nested=True) + ) # List of CorrectAnswer + is_pinned = Column(Boolean) + note = Column(String) + latency = Column(Integer) + cost = Column(Integer) + created_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + updated_at = Column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) + ) + + project = relationship("ee.src.models.db_models.ProjectDB") + variant = relationship("AppVariantDB") + results = relationship( + "EvaluationScenarioResultDB", + cascade=CASCADE_ALL_DELETE, + backref="evaluation_scenario", + ) diff --git a/api/ee/src/models/extended/deprecated_models.py b/api/ee/src/models/extended/deprecated_models.py index c68a07e851..3eb8620ef1 100644 --- a/api/ee/src/models/extended/deprecated_models.py +++ b/api/ee/src/models/extended/deprecated_models.py @@ -1,6 +1,7 @@ from datetime import datetime, timezone import uuid_utils.compat as uuid +from sqlalchemy_json import mutable_json_type from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.ext.declarative import declarative_base diff --git a/api/ee/src/models/extended/deprecated_transfer_models.py b/api/ee/src/models/extended/deprecated_transfer_models.py index bf8a4a3038..3657dddacd 100644 --- a/api/ee/src/models/extended/deprecated_transfer_models.py +++ b/api/ee/src/models/extended/deprecated_transfer_models.py @@ -325,7 +325,7 @@ class HumanEvaluationScenarioDB(DeprecatedBase): ) -class TestsetDB(DeprecatedBase): +class TestSetDB(DeprecatedBase): __tablename__ = "testsets" __table_args__ = {"extend_existing": True} diff --git a/api/ee/src/models/shared_models.py b/api/ee/src/models/shared_models.py index 4f7ed234da..e7f877f213 100644 --- a/api/ee/src/models/shared_models.py +++ b/api/ee/src/models/shared_models.py @@ -34,14 +34,14 @@ class Permission(str, Enum): READ_SYSTEM = "read_system" # App and variants - VIEW_APPLICATIONS = "view_applications" - EDIT_APPLICATIONS = "edit_application" - + VIEW_APPLICATION = "view_application" + EDIT_APPLICATION = "edit_application" + CREATE_APPLICATION = "create_application" + DELETE_APPLICATION = "delete_application" CREATE_APP_VARIANT = "create_app_variant" DELETE_APP_VARIANT = "delete_app_variant" - MODIFY_VARIANT_CONFIGURATIONS = "modify_variant_configurations" - EDIT_APPLICATIONS_VARIANT = "delete_application_variant" + DELETE_APPLICATION_VARIANT = "delete_application_variant" # Service RUN_SERVICE = "run_service" @@ -96,16 +96,11 @@ class Permission(str, Enum): # Workflows VIEW_WORKFLOWS = "view_workflows" EDIT_WORKFLOWS = "edit_workflows" - RUN_WORKFLOWS = "run_workflows" # Evaluators VIEW_EVALUATORS = "view_evaluators" EDIT_EVALUATORS = "edit_evaluators" - # Queries - VIEW_QUERIES = "view_queries" - EDIT_QUERIES = "edit_queries" - # Testsets VIEW_TESTSETS = "view_testsets" EDIT_TESTSETS = "edit_testsets" @@ -114,31 +109,15 @@ class Permission(str, Enum): VIEW_ANNOTATIONS = "view_annotations" EDIT_ANNOTATIONS = "edit_annotations" - # Invocations - VIEW_INVOCATIONS = "view_invocations" - EDIT_INVOCATIONS = "edit_invocations" - # Evaluations - VIEW_EVALUATION_RUNS = "view_evaluation_runs" - EDIT_EVALUATION_RUNS = "edit_evaluation_runs" - - VIEW_EVALUATION_SCENARIOS = "view_evaluation_scenarios" - EDIT_EVALUATION_SCENARIOS = "edit_evaluation_scenarios" - - VIEW_EVALUATION_RESULTS = "view_evaluation_results" - EDIT_EVALUATION_RESULTS = "edit_evaluation_results" - - VIEW_EVALUATION_METRICS = "view_evaluation_metrics" - EDIT_EVALUATION_METRICS = "edit_evaluation_metrics" - - VIEW_EVALUATION_QUEUES = "view_evaluation_queues" - EDIT_EVALUATION_QUEUES = "edit_evaluation_queues" + VIEW_EVALUATIONS = "view_evaluations" + EDIT_EVALUATIONS = "edit_evaluations" @classmethod def default_permissions(cls, role): VIEWER_PERMISSIONS = [ cls.READ_SYSTEM, - cls.VIEW_APPLICATIONS, + cls.VIEW_APPLICATION, cls.VIEW_SECRET, cls.VIEW_APP_ENVIRONMENT_DEPLOYMENT, cls.VIEW_TESTSET, @@ -167,7 +146,7 @@ def default_permissions(cls, role): cls.EDIT_ORGANIZATION, cls.DELETE_EVALUATION, cls.MODIFY_USER_ROLES, - cls.EDIT_APPLICATIONS, + cls.DELETE_APPLICATION, cls.DELETE_ORGANIZATION, cls.ADD_USER_TO_WORKSPACE, cls.ADD_USER_TO_ORGANIZATION, diff --git a/api/ee/src/routers/evaluation_router.py b/api/ee/src/routers/evaluation_router.py new file mode 100644 index 0000000000..d7d92951b9 --- /dev/null +++ b/api/ee/src/routers/evaluation_router.py @@ -0,0 +1,588 @@ +from typing import Any, List +import random + +from fastapi.responses import JSONResponse +from fastapi import HTTPException, Request, status, Response, Query + +from oss.src.utils.logging import get_module_logger +from oss.src.utils.caching import get_cache, set_cache + +from ee.src.services import converters +from ee.src.services import evaluation_service + +from ee.src.tasks.evaluations import evaluate, annotate +from oss.src.utils.common import APIRouter, is_ee +from oss.src.models.api.evaluation_model import ( + Evaluation, + EvaluationScenario, + NewEvaluation, + DeleteEvaluation, +) +from ee.src.services import db_manager_ee +from oss.src.services import app_manager, db_manager + +if is_ee(): + from ee.src.models.shared_models import Permission + from ee.src.utils.permissions import check_action_access + from ee.src.utils.entitlements import ( + check_entitlements, + Tracker, + Counter, + NOT_ENTITLED_RESPONSE, + ) + +from oss.src.routers.testset_router import _validate_testset_limits + + +from oss.src.apis.fastapi.evaluations.models import ( + EvaluationRunCreate, + EvaluationRunsCreateRequest, + EvaluationRunResponse, + EvaluationRunsResponse, +) + +from oss.src.apis.fastapi.evaluations.router import EvaluationsRouter +from oss.src.core.evaluations.service import EvaluationsService +from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO + +evaluations_router = EvaluationsRouter( + evaluations_service=EvaluationsService( + evaluations_dao=EvaluationsDAO(), + ), +) + + +router = APIRouter() + + +log = get_module_logger(__name__) + + +@router.get( + "/by_resource/", + response_model=List[str], +) +async def fetch_evaluation_ids( + resource_type: str, + request: Request, + resource_ids: List[str] = Query(None), +): + """Fetches evaluation ids for a given resource type and id. + + Arguments: + app_id (str): The ID of the app for which to fetch evaluations. + resource_type (str): The type of resource for which to fetch evaluations. + resource_ids List[ObjectId]: The IDs of resource for which to fetch evaluations. + + Raises: + HTTPException: If the resource_type is invalid or access is denied. + + Returns: + List[str]: A list of evaluation ids. + """ + + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + evaluations = await db_manager_ee.fetch_evaluations_by_resource( + resource_type, + request.state.project_id, + resource_ids, + ) + return list(map(lambda x: str(x.id), evaluations)) + + +@router.post("/", response_model=List[Evaluation], operation_id="create_evaluation") +async def create_evaluation( + payload: NewEvaluation, + request: Request, +): + """Creates a new comparison table document + Raises: + HTTPException: _description_ + Returns: + _description_ + """ + + try: + app = await db_manager.fetch_app_by_id(app_id=payload.app_id) + if app is None: + raise HTTPException(status_code=404, detail="App not found") + + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(app.project_id), + permission=Permission.CREATE_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + check, _, _ = await check_entitlements( + organization_id=request.state.organization_id, + key=Counter.EVALUATIONS, + delta=1, + ) + + if not check: + return NOT_ENTITLED_RESPONSE(Tracker.COUNTERS) + + testset = await db_manager.fetch_testset_by_id( + testset_id=payload.testset_id, + ) + + if testset is None: + raise HTTPException(status_code=404, detail="Testset not found") + + _validate_testset_limits(testset.csvdata) + + evaluations = [] + + for revision_id in payload.revisions_ids: + evaluation = await evaluation_service.create_new_evaluation( + app_id=payload.app_id, + project_id=str(app.project_id), + revision_id=revision_id, + testset_id=payload.testset_id, + ) + + evaluate.delay( + app_id=payload.app_id, + user_id=str(request.state.user_id), + project_id=str(request.state.project_id), + revision_id=revision_id, + evaluators_config_ids=payload.evaluators_configs, + testset_id=payload.testset_id, + evaluation_id=evaluation.id, + rate_limit_config=payload.rate_limit.model_dump(), + ) + evaluations.append(evaluation) + + # Update last_modified_by app information + await app_manager.update_last_modified_by( + user_uid=request.state.user_id, + object_id=payload.app_id, + object_type="app", + project_id=str(app.project_id), + ) + + return evaluations + except KeyError: + raise HTTPException( + status_code=400, + detail="columns in the test set should match the names of the inputs in the variant", + ) + + +@router.get("/{evaluation_id}/status/", operation_id="fetch_evaluation_status") +async def fetch_evaluation_status( + evaluation_id: str, + request: Request, +): + """Fetches the status of the evaluation. + + Args: + evaluation_id (str): the evaluation id + request (Request): the request object + + Returns: + (str): the evaluation status + """ + + cache_key = { + "evaluation_id": evaluation_id, + } + + evaluation_status = await get_cache( + project_id=request.state.project_id, + namespace="fetch_evaluation_status", + key=cache_key, + retry=False, + ) + + if evaluation_status is not None: + return {"status": evaluation_status} + + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + evaluation_status = await db_manager_ee.fetch_evaluation_status_by_id( + project_id=request.state.project_id, + evaluation_id=evaluation_id, + ) + + await set_cache( + project_id=request.state.project_id, + namespace="fetch_evaluation_status", + key=cache_key, + value=evaluation_status, + ttl=15, # 15 seconds + ) + + return {"status": evaluation_status} + + +@router.get("/{evaluation_id}/results/", operation_id="fetch_evaluation_results") +async def fetch_evaluation_results( + evaluation_id: str, + request: Request, +): + """Fetches the results of the evaluation + + Args: + evaluation_id (str): the evaluation id + request (Request): the request object + + Returns: + _type_: _description_ + """ + + evaluation = await db_manager_ee.fetch_evaluation_by_id( + project_id=request.state.project_id, + evaluation_id=evaluation_id, + ) + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(evaluation.project_id), + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + results = converters.aggregated_result_of_evaluation_to_pydantic( + evaluation.aggregated_results # type: ignore + ) + return {"results": results, "evaluation_id": evaluation_id} + + +@router.get( + "/{evaluation_id}/evaluation_scenarios/", + response_model=List[EvaluationScenario], + operation_id="fetch_evaluation_scenarios", +) +async def fetch_evaluation_scenarios( + evaluation_id: str, + request: Request, +): + """Fetches evaluation scenarios for a given evaluation ID. + + Arguments: + evaluation_id (str): The ID of the evaluation for which to fetch scenarios. + + Raises: + HTTPException: If the evaluation is not found or access is denied. + + Returns: + List[EvaluationScenario]: A list of evaluation scenarios. + """ + + evaluation = await db_manager_ee.fetch_evaluation_by_id( + project_id=request.state.project_id, + evaluation_id=evaluation_id, + ) + if not evaluation: + raise HTTPException( + status_code=404, detail=f"Evaluation with id {evaluation_id} not found" + ) + + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(evaluation.project_id), + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + eval_scenarios = await evaluation_service.fetch_evaluation_scenarios_for_evaluation( + evaluation_id=str(evaluation.id), project_id=str(evaluation.project_id) + ) + return eval_scenarios + + +@router.get("/", response_model=List[Evaluation]) +async def fetch_list_evaluations( + app_id: str, + request: Request, +): + """Fetches a list of evaluations, optionally filtered by an app ID. + + Args: + app_id (Optional[str]): An optional app ID to filter the evaluations. + + Returns: + List[Evaluation]: A list of evaluations. + """ + + app = await db_manager.fetch_app_by_id(app_id) + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(app.project_id), + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + return await evaluation_service.fetch_list_evaluations(app, str(app.project_id)) + + +@router.get( + "/{evaluation_id}/", response_model=Evaluation, operation_id="fetch_evaluation" +) +async def fetch_evaluation( + evaluation_id: str, + request: Request, +): + """Fetches a single evaluation based on its ID. + + Args: + evaluation_id (str): The ID of the evaluation to fetch. + + Returns: + Evaluation: The fetched evaluation. + """ + + evaluation = await db_manager_ee.fetch_evaluation_by_id( + project_id=request.state.project_id, + evaluation_id=evaluation_id, + ) + if not evaluation: + raise HTTPException( + status_code=404, detail=f"Evaluation with id {evaluation_id} not found" + ) + + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(evaluation.project_id), + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + return await converters.evaluation_db_to_pydantic(evaluation) + + +@router.delete("/", response_model=List[str], operation_id="delete_evaluations") +async def delete_evaluations( + payload: DeleteEvaluation, + request: Request, +): + """ + Delete specific comparison tables based on their unique IDs. + + Args: + delete_evaluations (List[str]): The unique identifiers of the comparison tables to delete. + + Returns: + A list of the deleted comparison tables' IDs. + """ + + evaluation = await db_manager_ee.fetch_evaluation_by_id( + project_id=request.state.project_id, + evaluation_id=payload.evaluations_ids[0], + ) + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(evaluation.project_id), + permission=Permission.DELETE_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + # Update last_modified_by app information + await app_manager.update_last_modified_by( + user_uid=request.state.user_id, + object_id=random.choice(payload.evaluations_ids), + object_type="evaluation", + project_id=str(evaluation.project_id), + ) + + await evaluation_service.delete_evaluations(payload.evaluations_ids) + return Response(status_code=status.HTTP_204_NO_CONTENT) + + +@router.get( + "/evaluation_scenarios/comparison-results/", + response_model=Any, + operation_id="fetch_evaluation_scenarios_comparison_results", +) +async def fetch_evaluation_scenarios_comparison_results( + evaluations_ids: str, + request: Request, +): + """Fetches evaluation scenarios for a given evaluation ID. + + Arguments: + evaluation_id (str): The ID of the evaluation for which to fetch scenarios. + + Raises: + HTTPException: If the evaluation is not found or access is denied. + + Returns: + List[EvaluationScenario]: A list of evaluation scenarios. + """ + + evaluations_ids_list = evaluations_ids.split(",") + evaluation = await db_manager_ee.fetch_evaluation_by_id( + project_id=request.state.project_id, + evaluation_id=evaluations_ids_list[0], + ) + if is_ee(): + has_permission = await check_action_access( + user_uid=request.state.user_id, + project_id=str(evaluation.project_id), + permission=Permission.VIEW_EVALUATION, + ) + if not has_permission: + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." + log.error(error_msg) + return JSONResponse( + {"detail": error_msg}, + status_code=403, + ) + + eval_scenarios = await evaluation_service.compare_evaluations_scenarios( + evaluations_ids_list, str(evaluation.project_id) + ) + + return eval_scenarios + + +@router.post( + "/preview/start", + response_model=EvaluationRunsResponse, + operation_id="start_evaluation", +) +async def start_evaluation( + request: Request, + payload: NewEvaluation, +) -> EvaluationRunsResponse: + try: + if is_ee(): + # Permissions Check ------------------------------------------------ + check = await check_action_access( + project_id=request.state.project_id, + user_uid=request.state.user_id, + permission=Permission.CREATE_EVALUATION, + ) + if not check: + raise HTTPException( + status_code=403, + detail="You do not have permission to perform this action. Please contact your organization admin.", + ) + # ------------------------------------------------------------------ + + # Entitlements Check ----------------------------------------------- + check, _, _ = await check_entitlements( + organization_id=request.state.organization_id, + key=Counter.EVALUATIONS, + delta=1, + ) + + if not check: + return NOT_ENTITLED_RESPONSE(Tracker.COUNTERS) + # ------------------------------------------------------------------ + + # Input Validation ----------------------------------------------------- + nof_runs = len(payload.revisions_ids) + + if nof_runs == 0: + raise HTTPException( + status_code=400, + detail="No revisions provided for evaluation. Please provide at least one revision.", + ) + # ---------------------------------------------------------------------- + + # Evaluation Run Initialization ---------------------------------------- + runs_response = await evaluations_router.create_runs( + request=request, + runs_create_request=EvaluationRunsCreateRequest( + runs=[EvaluationRunCreate(status="pending") for _ in range(nof_runs)] + ), + ) + + if runs_response.count == 0: + raise HTTPException( + status_code=500, + detail="Failed to create evaluation runs. Please try again later.", + ) + # ---------------------------------------------------------------------- + + # Evaluation Run Execution --------------------------------------------- + for i in range(nof_runs): + annotate.delay( + project_id=request.state.project_id, + user_id=request.state.user_id, + # + run_id=runs_response.runs[i].id, + # + testset_id=payload.testset_id, + revision_id=payload.revisions_ids[i], + autoeval_ids=payload.evaluators_configs, + # + run_config=payload.rate_limit.model_dump(mode="json"), + ) + # ---------------------------------------------------------------------- + + return runs_response + + except KeyError as e: + raise HTTPException( + status_code=400, + detail="Columns in the test set should match the names of the inputs in the variant", + ) from e diff --git a/api/oss/src/routers/human_evaluation_router.py b/api/ee/src/routers/human_evaluation_router.py similarity index 91% rename from api/oss/src/routers/human_evaluation_router.py rename to api/ee/src/routers/human_evaluation_router.py index 681f7588bf..3b2904062c 100644 --- a/api/oss/src/routers/human_evaluation_router.py +++ b/api/ee/src/routers/human_evaluation_router.py @@ -2,10 +2,11 @@ from fastapi import HTTPException, Body, Request, status, Response from oss.src.utils.logging import get_module_logger -from oss.src.services import converters +from ee.src.services import converters from oss.src.services import db_manager -from oss.src.services import results_service -from oss.src.services import evaluation_service +from ee.src.services import db_manager_ee +from ee.src.services import results_service +from ee.src.services import evaluation_service from oss.src.utils.common import APIRouter, is_ee from oss.src.models.api.evaluation_model import ( DeleteEvaluation, @@ -18,7 +19,7 @@ NewHumanEvaluation, SimpleEvaluationOutput, ) -from oss.src.services.evaluation_service import ( +from ee.src.services.evaluation_service import ( update_human_evaluation_scenario, update_human_evaluation_service, ) @@ -78,7 +79,7 @@ async def create_human_evaluation( except KeyError: raise HTTPException( status_code=400, - detail="columns in the testset should match the names of the inputs in the variant", + detail="columns in the test set should match the names of the inputs in the variant", ) @@ -129,7 +130,7 @@ async def fetch_human_evaluation( HumanEvaluation: The fetched evaluation. """ - human_evaluation = await db_manager.fetch_human_evaluation_by_id(evaluation_id) + human_evaluation = await db_manager_ee.fetch_human_evaluation_by_id(evaluation_id) if not human_evaluation: raise HTTPException(status_code=404, detail="Evaluation not found") @@ -170,7 +171,7 @@ async def fetch_human_evaluation_scenarios( List[EvaluationScenario]: A list of evaluation scenarios. """ - human_evaluation = await db_manager.fetch_human_evaluation_by_id(evaluation_id) + human_evaluation = await db_manager_ee.fetch_human_evaluation_by_id(evaluation_id) if human_evaluation is None: raise HTTPException( status_code=404, @@ -208,14 +209,16 @@ async def update_human_evaluation( """Updates an evaluation's status. Raises: - HTTPException: If the columns in the testset do not match with the inputs in the variant. + HTTPException: If the columns in the test set do not match with the inputs in the variant. Returns: None: A 204 No Content status code, indicating that the update was successful. """ try: - human_evaluation = await db_manager.fetch_human_evaluation_by_id(evaluation_id) + human_evaluation = await db_manager_ee.fetch_human_evaluation_by_id( + evaluation_id + ) if not human_evaluation: raise HTTPException(status_code=404, detail="Evaluation not found") @@ -238,7 +241,7 @@ async def update_human_evaluation( except KeyError: raise HTTPException( status_code=400, - detail="columns in the testset should match the names of the inputs in the variant", + detail="columns in the test set should match the names of the inputs in the variant", ) @@ -261,7 +264,7 @@ async def update_evaluation_scenario_router( None: 204 No Content status code upon successful update. """ - evaluation_scenario_db = await db_manager.fetch_human_evaluation_scenario_by_id( + evaluation_scenario_db = await db_manager_ee.fetch_human_evaluation_scenario_by_id( evaluation_scenario_id ) if evaluation_scenario_db is None: @@ -306,7 +309,7 @@ async def get_evaluation_scenario_score_router( Dictionary containing the scenario ID and its score. """ - evaluation_scenario = db_manager.fetch_evaluation_scenario_by_id( + evaluation_scenario = db_manager_ee.fetch_evaluation_scenario_by_id( evaluation_scenario_id ) if evaluation_scenario is None: @@ -349,7 +352,7 @@ async def update_evaluation_scenario_score_router( None: 204 No Content status code upon successful update. """ - evaluation_scenario = await db_manager.fetch_evaluation_scenario_by_id( + evaluation_scenario = await db_manager_ee.fetch_evaluation_scenario_by_id( evaluation_scenario_id ) if evaluation_scenario is None: @@ -392,7 +395,7 @@ async def fetch_results( _description_ """ - evaluation = await db_manager.fetch_human_evaluation_by_id(evaluation_id) + evaluation = await db_manager_ee.fetch_human_evaluation_by_id(evaluation_id) if evaluation is None: raise HTTPException( status_code=404, @@ -437,7 +440,7 @@ async def delete_evaluations( A list of the deleted comparison tables' IDs. """ - evaluation = await db_manager.fetch_human_evaluation_by_id( + evaluation = await db_manager_ee.fetch_human_evaluation_by_id( payload.evaluations_ids[0] ) if is_ee(): diff --git a/api/ee/src/routers/organization_router.py b/api/ee/src/routers/organization_router.py index 739894b7b8..7b265a692a 100644 --- a/api/ee/src/routers/organization_router.py +++ b/api/ee/src/routers/organization_router.py @@ -53,9 +53,9 @@ async def get_user_organization( raise HTTPException(status_code=500, detail=str(e)) -@router.get("/{organization_id}/", operation_id="fetch_ee_organization_details") +@router.get("/{org_id}/", operation_id="fetch_ee_organization_details") async def fetch_organization_details( - organization_id: str, + org_id: str, request: Request, ): """Get an organization's details. @@ -70,7 +70,7 @@ async def fetch_organization_details( try: workspace_id = await db_manager_ee.get_default_workspace_id_from_organization( - organization_id=organization_id + organization_id=org_id ) project_id = await db_manager.get_default_project_id_from_workspace( @@ -96,16 +96,14 @@ async def fetch_organization_details( user_org_workspace_data = await get_user_org_and_workspace_id( request.state.user_id ) - has_permission = await check_user_org_access( - user_org_workspace_data, organization_id - ) + has_permission = await check_user_org_access(user_org_workspace_data, org_id) if not has_permission: return JSONResponse( status_code=403, content={"detail": "You do not have access to this organization"}, ) - organization = await get_organization_details(organization_id) + organization = await get_organization_details(org_id) if membership.role == "viewer" or membership.is_demo: if "default_workspace" in organization: @@ -123,9 +121,9 @@ async def fetch_organization_details( ) -@router.put("/{organization_id}/", operation_id="update_organization") +@router.put("/{org_id}/", operation_id="update_organization") async def update_organization( - organization_id: str, + org_id: str, payload: OrganizationUpdate, request: Request, ): @@ -140,7 +138,7 @@ async def update_organization( request.state.user_id ) has_permission = await check_user_org_access( - user_org_workspace_data, organization_id, check_owner=True + user_org_workspace_data, org_id, check_owner=True ) if not has_permission: return JSONResponse( @@ -148,7 +146,7 @@ async def update_organization( status_code=403, ) - organization = await update_an_organization(organization_id, payload) + organization = await update_an_organization(org_id, payload) return organization @@ -160,12 +158,12 @@ async def update_organization( @router.post( - "/{organization_id}/workspaces/", + "/{org_id}/workspaces/", operation_id="create_workspace", response_model=WorkspaceResponse, ) async def create_workspace( - organization_id: str, + org_id: str, payload: CreateWorkspace, request: Request, ) -> WorkspaceResponse: @@ -174,7 +172,7 @@ async def create_workspace( request.state.user_id ) has_permission = await check_user_org_access( - user_org_workspace_data, organization_id, check_owner=True + user_org_workspace_data, org_id, check_owner=True ) if not has_permission: return JSONResponse( @@ -188,7 +186,7 @@ async def create_workspace( status_code=400, ) workspace = await workspace_manager.create_new_workspace( - payload, organization_id, user_org_workspace_data["uid"] + payload, org_id, user_org_workspace_data["uid"] ) return workspace @@ -200,12 +198,12 @@ async def create_workspace( @router.put( - "/{organization_id}/workspaces/{workspace_id}/", + "/{org_id}/workspaces/{workspace_id}/", operation_id="update_workspace", response_model=WorkspaceResponse, ) async def update_workspace( - organization_id: str, + org_id: str, workspace_id: str, payload: UpdateWorkspace, request: Request, diff --git a/api/ee/src/routers/workspace_router.py b/api/ee/src/routers/workspace_router.py index db14403946..40e0e17885 100644 --- a/api/ee/src/routers/workspace_router.py +++ b/api/ee/src/routers/workspace_router.py @@ -110,7 +110,7 @@ async def assign_role_to_user( @router.delete("/{workspace_id}/roles/", operation_id="unassign_role_from_user") async def unassign_role_from_user( email: str, - organization_id: str, + org_id: str, role: str, workspace_id: str, request: Request, @@ -121,7 +121,7 @@ async def unassign_role_from_user( Args: workspace_id (str): The ID of the workspace. email (str): The email of the user to remove the role from. - organization_id (str): The ID of the organization. + org_id (str): The ID of the organization. role (str): The role to remove from the user. request (Request): The FastAPI request object. @@ -153,7 +153,7 @@ async def unassign_role_from_user( payload = UserRole( email=email, - organization_id=organization_id, + organization_id=org_id, role=role, ) diff --git a/api/ee/src/services/commoners.py b/api/ee/src/services/commoners.py index 961857b942..a060c27ee4 100644 --- a/api/ee/src/services/commoners.py +++ b/api/ee/src/services/commoners.py @@ -123,17 +123,17 @@ async def create_accounts(payload: dict): user = await db_manager.get_user_with_email(email=user_dict["email"]) if user is None: - log.info("[scopes] Yey! A new user is signing up!") + log.info("Yey! A new user is signing up!") # Create user first user = await create_new_user(user_dict) - log.info("[scopes] User [%s] created", user.id) + log.info("User [%s] created", user.id) # Prepare payload to create organization create_org_payload = CreateOrganization( name=user_dict["username"], - description="Default Organization", + description="My Default Organization", owner=str(user.id), type="default", ) @@ -144,7 +144,7 @@ async def create_accounts(payload: dict): user=user, ) - log.info("[scopes] Organization [%s] created", organization.id) + log.info("Organization [%s] created", organization.id) # Add the user to demos await add_user_to_demos(str(user.id)) @@ -169,7 +169,7 @@ async def create_accounts(payload: dict): delta=1, ) - log.info("[scopes] User [%s] authenticated", user.id) + log.info("User [%s] authenticated", user.id) if is_ee(): try: diff --git a/api/ee/src/services/converters.py b/api/ee/src/services/converters.py index 2bfc1d330b..5b120899fc 100644 --- a/api/ee/src/services/converters.py +++ b/api/ee/src/services/converters.py @@ -3,9 +3,28 @@ from datetime import datetime, timezone from oss.src.services import db_manager +from oss.src.models.api.evaluation_model import ( + CorrectAnswer, + Evaluation, + HumanEvaluation, + EvaluationScenario, + SimpleEvaluationOutput, + EvaluationScenarioInput, + HumanEvaluationScenario, + EvaluationScenarioOutput, +) from ee.src.services import db_manager_ee -from ee.src.models.api.workspace_models import WorkspaceRole, WorkspaceResponse +from ee.src.models.api.workspace_models import ( + WorkspaceRole, + WorkspaceResponse, +) from ee.src.models.shared_models import Permission +from ee.src.models.db_models import ( + EvaluationDB, + HumanEvaluationDB, + EvaluationScenarioDB, + HumanEvaluationScenarioDB, +) from oss.src.models.db_models import WorkspaceDB @@ -130,3 +149,173 @@ def get_all_workspace_permissions_by_role(role_name: str) -> Dict[str, List[Any] getattr(WorkspaceRole, role_name.upper()) ) return workspace_permissions + + +async def human_evaluation_db_to_simple_evaluation_output( + human_evaluation_db: HumanEvaluationDB, +) -> SimpleEvaluationOutput: + evaluation_variants = await db_manager_ee.fetch_human_evaluation_variants( + human_evaluation_id=str(human_evaluation_db.id) + ) + return SimpleEvaluationOutput( + id=str(human_evaluation_db.id), + app_id=str(human_evaluation_db.app_id), + project_id=str(human_evaluation_db.project_id), + status=human_evaluation_db.status, # type: ignore + evaluation_type=human_evaluation_db.evaluation_type, # type: ignore + variant_ids=[ + str(evaluation_variant.variant_id) + for evaluation_variant in evaluation_variants + ], + ) + + +async def evaluation_db_to_pydantic( + evaluation_db: EvaluationDB, +) -> Evaluation: + variant_name = ( + evaluation_db.variant.variant_name + if evaluation_db.variant.variant_name + else str(evaluation_db.variant_id) + ) + aggregated_results = aggregated_result_of_evaluation_to_pydantic( + evaluation_db.aggregated_results + ) + + return Evaluation( + id=str(evaluation_db.id), + app_id=str(evaluation_db.app_id), + project_id=str(evaluation_db.project_id), + status=evaluation_db.status, + variant_ids=[str(evaluation_db.variant_id)], + variant_revision_ids=[str(evaluation_db.variant_revision_id)], + revisions=[str(evaluation_db.variant_revision.revision)], + variant_names=[variant_name], + testset_id=str(evaluation_db.testset_id), + testset_name=evaluation_db.testset.name, + aggregated_results=aggregated_results, + created_at=str(evaluation_db.created_at), + updated_at=str(evaluation_db.updated_at), + average_cost=evaluation_db.average_cost, + total_cost=evaluation_db.total_cost, + average_latency=evaluation_db.average_latency, + ) + + +async def human_evaluation_db_to_pydantic( + evaluation_db: HumanEvaluationDB, +) -> HumanEvaluation: + evaluation_variants = await db_manager_ee.fetch_human_evaluation_variants( + human_evaluation_id=str(evaluation_db.id) # type: ignore + ) + + revisions = [] + variants_ids = [] + variants_names = [] + variants_revision_ids = [] + for evaluation_variant in evaluation_variants: + variant_name = ( + evaluation_variant.variant.variant_name + if isinstance(evaluation_variant.variant_id, uuid.UUID) + else str(evaluation_variant.variant_id) + ) + variants_names.append(str(variant_name)) + variants_ids.append(str(evaluation_variant.variant_id)) + variant_revision = ( + str(evaluation_variant.variant_revision.revision) + if isinstance(evaluation_variant.variant_revision_id, uuid.UUID) + else " None" + ) + revisions.append(variant_revision) + variants_revision_ids.append(str(evaluation_variant.variant_revision_id)) + + return HumanEvaluation( + id=str(evaluation_db.id), + app_id=str(evaluation_db.app_id), + project_id=str(evaluation_db.project_id), + status=evaluation_db.status, # type: ignore + evaluation_type=evaluation_db.evaluation_type, # type: ignore + variant_ids=variants_ids, + variant_names=variants_names, + testset_id=str(evaluation_db.testset_id), + testset_name=evaluation_db.testset.name, + variants_revision_ids=variants_revision_ids, + revisions=revisions, + created_at=str(evaluation_db.created_at), # type: ignore + updated_at=str(evaluation_db.updated_at), # type: ignore + ) + + +def human_evaluation_scenario_db_to_pydantic( + evaluation_scenario_db: HumanEvaluationScenarioDB, evaluation_id: str +) -> HumanEvaluationScenario: + return HumanEvaluationScenario( + id=str(evaluation_scenario_db.id), + evaluation_id=evaluation_id, + inputs=evaluation_scenario_db.inputs, # type: ignore + outputs=evaluation_scenario_db.outputs, # type: ignore + vote=evaluation_scenario_db.vote, # type: ignore + score=evaluation_scenario_db.score, # type: ignore + correct_answer=evaluation_scenario_db.correct_answer, # type: ignore + is_pinned=evaluation_scenario_db.is_pinned or False, # type: ignore + note=evaluation_scenario_db.note or "", # type: ignore + ) + + +def aggregated_result_of_evaluation_to_pydantic( + evaluation_aggregated_results: List, +) -> List[dict]: + transformed_results = [] + for aggregated_result in evaluation_aggregated_results: + evaluator_config_dict = ( + { + "id": str(aggregated_result.evaluator_config.id), + "name": aggregated_result.evaluator_config.name, + "evaluator_key": aggregated_result.evaluator_config.evaluator_key, + "settings_values": aggregated_result.evaluator_config.settings_values, + "created_at": str(aggregated_result.evaluator_config.created_at), + "updated_at": str(aggregated_result.evaluator_config.updated_at), + } + if isinstance(aggregated_result.evaluator_config_id, uuid.UUID) + else None + ) + transformed_results.append( + { + "evaluator_config": ( + {} if evaluator_config_dict is None else evaluator_config_dict + ), + "result": aggregated_result.result, + } + ) + return transformed_results + + +async def evaluation_scenario_db_to_pydantic( + evaluation_scenario_db: EvaluationScenarioDB, evaluation_id: str +) -> EvaluationScenario: + scenario_results = [ + { + "evaluator_config": str(scenario_result.evaluator_config_id), + "result": scenario_result.result, + } + for scenario_result in evaluation_scenario_db.results + ] + return EvaluationScenario( + id=str(evaluation_scenario_db.id), + evaluation_id=evaluation_id, + inputs=[ + EvaluationScenarioInput(**scenario_input) # type: ignore + for scenario_input in evaluation_scenario_db.inputs + ], + outputs=[ + EvaluationScenarioOutput(**scenario_output) # type: ignore + for scenario_output in evaluation_scenario_db.outputs + ], + correct_answers=[ + CorrectAnswer(**correct_answer) # type: ignore + for correct_answer in evaluation_scenario_db.correct_answers + ], + is_pinned=evaluation_scenario_db.is_pinned or False, # type: ignore + note=evaluation_scenario_db.note or "", # type: ignore + results=scenario_results, # type: ignore + ) diff --git a/api/ee/src/services/db_manager.py b/api/ee/src/services/db_manager.py index 0d8e36c384..1091c4f736 100644 --- a/api/ee/src/services/db_manager.py +++ b/api/ee/src/services/db_manager.py @@ -1,7 +1,7 @@ import uuid from oss.src.dbs.postgres.shared.engine import engine -from ee.src.models.db_models import DeploymentDB +from ee.src.models.db_models import DeploymentDB_ as DeploymentDB async def create_deployment( diff --git a/api/ee/src/services/db_manager_ee.py b/api/ee/src/services/db_manager_ee.py index bc174918b6..5db1248997 100644 --- a/api/ee/src/services/db_manager_ee.py +++ b/api/ee/src/services/db_manager_ee.py @@ -1,12 +1,14 @@ import uuid -from typing import List, Union, NoReturn, Optional, Tuple +from typing import List, Dict, Union, Any, NoReturn, Optional, Tuple import sendgrid from fastapi import HTTPException +from sendgrid.helpers.mail import Mail +from sqlalchemy import func, asc from sqlalchemy.future import select from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.orm import joinedload, load_only +from sqlalchemy.orm import joinedload, load_only, aliased from sqlalchemy.exc import NoResultFound, MultipleResultsFound from oss.src.utils.logging import get_module_logger @@ -29,14 +31,36 @@ from ee.src.models.db_models import ( ProjectDB, WorkspaceDB, + EvaluationDB, OrganizationDB, ProjectMemberDB, WorkspaceMemberDB, + HumanEvaluationDB, OrganizationMemberDB, + EvaluationScenarioDB, + HumanEvaluationScenarioDB, + HumanEvaluationVariantDB, + EvaluationScenarioResultDB, + EvaluationEvaluatorConfigDB, + EvaluationAggregatedResultDB, ) from oss.src.models.db_models import ( + AppVariantDB, UserDB, + AppDB, + TestSetDB, InvitationDB, + EvaluatorConfigDB, + AppVariantRevisionsDB, +) +from oss.src.models.shared_models import ( + Result, + CorrectAnswer, + AggregatedResult, + EvaluationScenarioResult, + EvaluationScenarioInput, + EvaluationScenarioOutput, + HumanEvaluationScenarioInput, ) from ee.src.services.converters import get_workspace_in_format from ee.src.services.selectors import get_org_default_workspace @@ -81,9 +105,7 @@ async def get_organizations_by_list_ids(organization_ids: List) -> List[Organiza """ async with engine.core_session() as session: - organization_uuids = [ - uuid.UUID(organization_id) for organization_id in organization_ids - ] + organization_uuids = [uuid.UUID(org_id) for org_id in organization_ids] query = select(OrganizationDB).where(OrganizationDB.id.in_(organization_uuids)) result = await session.execute(query) organizations = result.scalars().all() @@ -203,7 +225,7 @@ async def create_default_project( """ project_db = await create_project( - "Default Project", + "Default", workspace_id=workspace_id, organization_id=organization_id, session=session, @@ -812,7 +834,7 @@ async def create_organization( name=payload.name, type=payload.type if payload.type else "", description=( - "Default Workspace" + "My Default Workspace" if payload.type == "default" else payload.description if payload.description @@ -1041,13 +1063,13 @@ async def get_project_invitations(project_id: str, **kwargs): """ async with engine.core_session() as session: - stmt = select(InvitationDB).filter( + query = select(InvitationDB).filter( InvitationDB.project_id == uuid.UUID(project_id) ) if kwargs.get("has_pending", False): - stmt = stmt.filter(InvitationDB.used == kwargs["invitation_used"]) + query = query.filter(InvitationDB.used == kwargs["invitation_used"]) - result = await session.execute(stmt) + result = await session.execute(query) invitations = result.scalars().all() return invitations @@ -1183,6 +1205,85 @@ async def get_all_workspace_roles() -> List[WorkspaceRole]: return workspace_roles +# async def get_project_id_from_db_entity( +# object_id: str, type: str, project_id: str +# ) -> dict: +# """ +# Get the project id of the object. + +# Args: +# object_id (str): The ID of the object. +# type (str): The type of the object. + +# Returns: +# dict: The project_id of the object. + +# Raises: +# ValueError: If the object type is unknown. +# Exception: If there is an error retrieving the project_id. +# """ +# try: +# if type == "app": +# app = await db_manager.fetch_app_by_id(object_id) +# project_id = app.project_id + +# elif type == "app_variant": +# app_variant = await db_manager.fetch_app_variant_by_id(object_id) +# project_id = app_variant.project_id + +# elif type == "base": +# base = await db_manager.fetch_base_by_id(object_id) +# project_id = base.project_id + +# elif type == "deployment": +# deployment = await db_manager.get_deployment_by_id(object_id) +# project_id = deployment.project_id + +# elif type == "testset": +# testset = await db_manager.fetch_testset_by_id(object_id) +# project_id = testset.project_id + +# elif type == "evaluation": +# evaluation = await db_manager.fetch_evaluation_by_id(object_id) +# project_id = evaluation.project_id + +# elif type == "evaluation_scenario": +# evaluation_scenario = await db_manager.fetch_evaluation_scenario_by_id( +# object_id +# ) +# project_id = evaluation_scenario.project_id + +# elif type == "evaluator_config": +# evaluator_config = await db_manager.fetch_evaluator_config(object_id) +# project_id = evaluator_config.project_id + +# elif type == "human_evaluation": +# human_evaluation = await db_manager.fetch_human_evaluation_by_id(object_id) +# project_id = human_evaluation.project_id + +# elif type == "human_evaluation_scenario": +# human_evaluation_scenario = ( +# await db_manager.fetch_human_evaluation_scenario_by_id(object_id) +# ) +# project_id = human_evaluation_scenario.project_id + +# elif type == "human_evaluation_scenario_by_evaluation_id": +# human_evaluation_scenario_by_evaluation = ( +# await db_manager.fetch_human_evaluation_scenario_by_evaluation_id( +# object_id +# ) +# ) +# project_id = human_evaluation_scenario_by_evaluation.project_id + +# else: +# raise ValueError(f"Unknown object type: {type}") + +# return str(project_id) + +# except Exception as e: +# raise e + + async def add_user_to_organization( organization_id: str, user_id: str, @@ -1274,3 +1375,755 @@ async def add_user_to_project( ) await session.commit() + + +async def fetch_evaluation_status_by_id( + project_id: str, + evaluation_id: str, +) -> Optional[str]: + """Fetch only the status of an evaluation by its ID.""" + assert evaluation_id is not None, "evaluation_id cannot be None" + + async with engine.core_session() as session: + query = ( + select(EvaluationDB) + .filter_by(project_id=project_id, id=uuid.UUID(evaluation_id)) + .options(load_only(EvaluationDB.status)) + ) + + result = await session.execute(query) + evaluation = result.scalars().first() + return evaluation.status if evaluation else None + + +async def fetch_evaluation_by_id( + project_id: str, + evaluation_id: str, +) -> Optional[EvaluationDB]: + """Fetches a evaluation by its ID. + + Args: + evaluation_id (str): The ID of the evaluation to fetch. + + Returns: + EvaluationDB: The fetched evaluation, or None if no evaluation was found. + """ + + assert evaluation_id is not None, "evaluation_id cannot be None" + async with engine.core_session() as session: + base_query = select(EvaluationDB).filter_by( + project_id=project_id, + id=uuid.UUID(evaluation_id), + ) + query = base_query.options( + joinedload(EvaluationDB.testset.of_type(TestSetDB)).load_only(TestSetDB.id, TestSetDB.name), # type: ignore + ) + + result = await session.execute( + query.options( + joinedload(EvaluationDB.variant.of_type(AppVariantDB)).load_only(AppVariantDB.id, AppVariantDB.variant_name), # type: ignore + joinedload(EvaluationDB.variant_revision.of_type(AppVariantRevisionsDB)).load_only(AppVariantRevisionsDB.revision), # type: ignore + joinedload( + EvaluationDB.aggregated_results.of_type( + EvaluationAggregatedResultDB + ) + ).joinedload(EvaluationAggregatedResultDB.evaluator_config), + ) + ) + evaluation = result.unique().scalars().first() + return evaluation + + +async def list_human_evaluations(app_id: str, project_id: str): + """ + Fetches human evaluations belonging to an App. + + Args: + app_id (str): The application identifier + """ + + async with engine.core_session() as session: + base_query = ( + select(HumanEvaluationDB) + .filter_by(app_id=uuid.UUID(app_id), project_id=uuid.UUID(project_id)) + .filter(HumanEvaluationDB.testset_id.isnot(None)) + ) + query = base_query.options( + joinedload(HumanEvaluationDB.testset.of_type(TestSetDB)).load_only(TestSetDB.id, TestSetDB.name), # type: ignore + ) + + result = await session.execute(query) + human_evaluations = result.scalars().all() + return human_evaluations + + +async def create_human_evaluation( + app: AppDB, + status: str, + evaluation_type: str, + testset_id: str, + variants_ids: List[str], +): + """ + Creates a human evaluation. + + Args: + app (AppDB: The app object + status (str): The status of the evaluation + evaluation_type (str): The evaluation type + testset_id (str): The ID of the evaluation testset + variants_ids (List[str]): The IDs of the variants for the evaluation + """ + + async with engine.core_session() as session: + human_evaluation = HumanEvaluationDB( + app_id=app.id, + project_id=app.project_id, + status=status, + evaluation_type=evaluation_type, + testset_id=testset_id, + ) + + session.add(human_evaluation) + await session.commit() + await session.refresh(human_evaluation, attribute_names=["testset"]) + + # create variants for human evaluation + await create_human_evaluation_variants( + human_evaluation_id=str(human_evaluation.id), + variants_ids=variants_ids, + ) + return human_evaluation + + +async def fetch_human_evaluation_variants(human_evaluation_id: str): + """ + Fetches human evaluation variants. + + Args: + human_evaluation_id (str): The human evaluation ID + + Returns: + The human evaluation variants. + """ + + async with engine.core_session() as session: + base_query = select(HumanEvaluationVariantDB).filter_by( + human_evaluation_id=uuid.UUID(human_evaluation_id) + ) + query = base_query.options( + joinedload(HumanEvaluationVariantDB.variant.of_type(AppVariantDB)).load_only(AppVariantDB.id, AppVariantDB.variant_name), # type: ignore + joinedload(HumanEvaluationVariantDB.variant_revision.of_type(AppVariantRevisionsDB)).load_only(AppVariantRevisionsDB.id, AppVariantRevisionsDB.revision), # type: ignore + ) + + result = await session.execute(query) + evaluation_variants = result.scalars().all() + return evaluation_variants + + +async def create_human_evaluation_variants( + human_evaluation_id: str, variants_ids: List[str] +): + """ + Creates human evaluation variants. + + Args: + human_evaluation_id (str): The human evaluation identifier + variants_ids (List[str]): The variants identifiers + project_id (str): The project ID + """ + + variants_dict = {} + for variant_id in variants_ids: + variant = await db_manager.fetch_app_variant_by_id(app_variant_id=variant_id) + if variant: + variants_dict[variant_id] = variant + + variants_revisions_dict = {} + for variant_id, variant in variants_dict.items(): + variant_revision = await db_manager.fetch_app_variant_revision_by_variant( + app_variant_id=str(variant.id), project_id=str(variant.project_id), revision=variant.revision # type: ignore + ) + if variant_revision: + variants_revisions_dict[variant_id] = variant_revision + + if set(variants_dict.keys()) != set(variants_revisions_dict.keys()): + raise ValueError("Mismatch between variants and their revisions") + + async with engine.core_session() as session: + for variant_id in variants_ids: + variant = variants_dict[variant_id] + variant_revision = variants_revisions_dict[variant_id] + human_evaluation_variant = HumanEvaluationVariantDB( + human_evaluation_id=uuid.UUID(human_evaluation_id), + variant_id=variant.id, # type: ignore + variant_revision_id=variant_revision.id, # type: ignore + ) + session.add(human_evaluation_variant) + + await session.commit() + + +async def fetch_human_evaluation_by_id( + evaluation_id: str, +) -> Optional[HumanEvaluationDB]: + """ + Fetches a evaluation by its ID. + + Args: + evaluation_id (str): The ID of the evaluation to fetch. + + Returns: + EvaluationDB: The fetched evaluation, or None if no evaluation was found. + """ + + assert evaluation_id is not None, "evaluation_id cannot be None" + async with engine.core_session() as session: + base_query = select(HumanEvaluationDB).filter_by(id=uuid.UUID(evaluation_id)) + query = base_query.options( + joinedload(HumanEvaluationDB.testset.of_type(TestSetDB)).load_only(TestSetDB.id, TestSetDB.name), # type: ignore + ) + result = await session.execute(query) + evaluation = result.scalars().first() + return evaluation + + +async def update_human_evaluation(evaluation_id: str, values_to_update: dict): + """Updates human evaluation with the specified values. + + Args: + evaluation_id (str): The evaluation ID + values_to_update (dict): The values to update + + Exceptions: + NoResultFound: if human evaluation is not found + """ + + async with engine.core_session() as session: + result = await session.execute( + select(HumanEvaluationDB).filter_by(id=uuid.UUID(evaluation_id)) + ) + human_evaluation = result.scalars().first() + if not human_evaluation: + raise NoResultFound(f"Human evaluation with id {evaluation_id} not found") + + for key, value in values_to_update.items(): + if hasattr(human_evaluation, key): + setattr(human_evaluation, key, value) + + await session.commit() + await session.refresh(human_evaluation) + + +async def delete_human_evaluation(evaluation_id: str): + """Delete the evaluation by its ID. + + Args: + evaluation_id (str): The ID of the evaluation to delete. + """ + + assert evaluation_id is not None, "evaluation_id cannot be None" + async with engine.core_session() as session: + result = await session.execute( + select(HumanEvaluationDB).filter_by(id=uuid.UUID(evaluation_id)) + ) + evaluation = result.scalars().first() + if not evaluation: + raise NoResultFound(f"Human evaluation with id {evaluation_id} not found") + + await session.delete(evaluation) + await session.commit() + + +async def create_human_evaluation_scenario( + inputs: List[HumanEvaluationScenarioInput], + project_id: str, + evaluation_id: str, + evaluation_extend: Dict[str, Any], +): + """ + Creates a human evaluation scenario. + + Args: + inputs (List[HumanEvaluationScenarioInput]): The inputs. + evaluation_id (str): The evaluation identifier. + evaluation_extend (Dict[str, any]): An extended required payload for the evaluation scenario. Contains score, vote, and correct_answer. + """ + + async with engine.core_session() as session: + evaluation_scenario = HumanEvaluationScenarioDB( + **evaluation_extend, + project_id=uuid.UUID(project_id), + evaluation_id=uuid.UUID(evaluation_id), + inputs=[input.model_dump() for input in inputs], + outputs=[], + ) + + session.add(evaluation_scenario) + await session.commit() + + +async def update_human_evaluation_scenario( + evaluation_scenario_id: str, values_to_update: dict +): + """Updates human evaluation scenario with the specified values. + + Args: + evaluation_scenario_id (str): The evaluation scenario ID + values_to_update (dict): The values to update + + Exceptions: + NoResultFound: if human evaluation scenario is not found + """ + + async with engine.core_session() as session: + result = await session.execute( + select(HumanEvaluationScenarioDB).filter_by( + id=uuid.UUID(evaluation_scenario_id) + ) + ) + human_evaluation_scenario = result.scalars().first() + if not human_evaluation_scenario: + raise NoResultFound( + f"Human evaluation scenario with id {evaluation_scenario_id} not found" + ) + + for key, value in values_to_update.items(): + if hasattr(human_evaluation_scenario, key): + setattr(human_evaluation_scenario, key, value) + + await session.commit() + await session.refresh(human_evaluation_scenario) + + +async def fetch_human_evaluation_scenarios(evaluation_id: str): + """ + Fetches human evaluation scenarios. + + Args: + evaluation_id (str): The evaluation identifier + + Returns: + The evaluation scenarios. + """ + + async with engine.core_session() as session: + result = await session.execute( + select(HumanEvaluationScenarioDB) + .filter_by(evaluation_id=uuid.UUID(evaluation_id)) + .order_by(asc(HumanEvaluationScenarioDB.created_at)) + ) + evaluation_scenarios = result.scalars().all() + return evaluation_scenarios + + +async def fetch_evaluation_scenarios(evaluation_id: str, project_id: str): + """ + Fetches evaluation scenarios. + + Args: + evaluation_id (str): The evaluation identifier + project_id (str): The ID of the project + + Returns: + The evaluation scenarios. + """ + + async with engine.core_session() as session: + result = await session.execute( + select(EvaluationScenarioDB) + .filter_by( + evaluation_id=uuid.UUID(evaluation_id), project_id=uuid.UUID(project_id) + ) + .options(joinedload(EvaluationScenarioDB.results)) + ) + evaluation_scenarios = result.unique().scalars().all() + return evaluation_scenarios + + +async def fetch_evaluation_scenario_by_id( + evaluation_scenario_id: str, +) -> Optional[EvaluationScenarioDB]: + """Fetches and evaluation scenario by its ID. + + Args: + evaluation_scenario_id (str): The ID of the evaluation scenario to fetch. + + Returns: + EvaluationScenarioDB: The fetched evaluation scenario, or None if no evaluation scenario was found. + """ + + assert evaluation_scenario_id is not None, "evaluation_scenario_id cannot be None" + async with engine.core_session() as session: + result = await session.execute( + select(EvaluationScenarioDB).filter_by(id=uuid.UUID(evaluation_scenario_id)) + ) + evaluation_scenario = result.scalars().first() + return evaluation_scenario + + +async def fetch_human_evaluation_scenario_by_id( + evaluation_scenario_id: str, +) -> Optional[HumanEvaluationScenarioDB]: + """Fetches and evaluation scenario by its ID. + + Args: + evaluation_scenario_id (str): The ID of the evaluation scenario to fetch. + + Returns: + EvaluationScenarioDB: The fetched evaluation scenario, or None if no evaluation scenario was found. + """ + + assert evaluation_scenario_id is not None, "evaluation_scenario_id cannot be None" + async with engine.core_session() as session: + result = await session.execute( + select(HumanEvaluationScenarioDB).filter_by( + id=uuid.UUID(evaluation_scenario_id) + ) + ) + evaluation_scenario = result.scalars().first() + return evaluation_scenario + + +async def fetch_human_evaluation_scenario_by_evaluation_id( + evaluation_id: str, +) -> Optional[HumanEvaluationScenarioDB]: + """Fetches and evaluation scenario by its ID. + Args: + evaluation_id (str): The ID of the evaluation object to use in fetching the human evaluation. + Returns: + EvaluationScenarioDB: The fetched evaluation scenario, or None if no evaluation scenario was found. + """ + + evaluation = await fetch_human_evaluation_by_id(evaluation_id) + async with engine.core_session() as session: + result = await session.execute( + select(HumanEvaluationScenarioDB).filter_by( + evaluation_id=evaluation.id # type: ignore + ) + ) + human_eval_scenario = result.scalars().first() + return human_eval_scenario + + +async def create_new_evaluation( + app: AppDB, + project_id: str, + testset: TestSetDB, + status: Result, + variant: str, + variant_revision: str, +) -> EvaluationDB: + """Create a new evaluation scenario. + Returns: + EvaluationScenarioDB: The created evaluation scenario. + """ + + async with engine.core_session() as session: + evaluation = EvaluationDB( + app_id=app.id, + project_id=uuid.UUID(project_id), + testset_id=testset.id, + status=status.model_dump(), + variant_id=uuid.UUID(variant), + variant_revision_id=uuid.UUID(variant_revision), + ) + + session.add(evaluation) + await session.commit() + await session.refresh( + evaluation, + attribute_names=[ + "testset", + "variant", + "variant_revision", + "aggregated_results", + ], + ) + + return evaluation + + +async def list_evaluations(app_id: str, project_id: str): + """Retrieves evaluations of the specified app from the db. + + Args: + app_id (str): The ID of the app + project_id (str): The ID of the project + """ + + async with engine.core_session() as session: + base_query = select(EvaluationDB).filter_by( + app_id=uuid.UUID(app_id), project_id=uuid.UUID(project_id) + ) + query = base_query.options( + joinedload(EvaluationDB.testset.of_type(TestSetDB)).load_only(TestSetDB.id, TestSetDB.name), # type: ignore + ) + + result = await session.execute( + query.options( + joinedload(EvaluationDB.variant.of_type(AppVariantDB)).load_only(AppVariantDB.id, AppVariantDB.variant_name), # type: ignore + joinedload(EvaluationDB.variant_revision.of_type(AppVariantRevisionsDB)).load_only(AppVariantRevisionsDB.revision), # type: ignore + joinedload( + EvaluationDB.aggregated_results.of_type( + EvaluationAggregatedResultDB + ) + ).joinedload(EvaluationAggregatedResultDB.evaluator_config), + ) + ) + evaluations = result.unique().scalars().all() + return evaluations + + +async def fetch_evaluations_by_resource( + resource_type: str, project_id: str, resource_ids: List[str] +): + """ + Fetches an evaluations by resource. + + Args: + resource_type (str): The resource type + project_id (str): The ID of the project + resource_ids (List[str]): The resource identifiers + + Returns: + The evaluations by resource. + + Raises: + HTTPException:400 resource_type {type} is not supported + """ + + ids = list(map(uuid.UUID, resource_ids)) + + async with engine.core_session() as session: + if resource_type == "variant": + result_evaluations = await session.execute( + select(EvaluationDB) + .filter( + EvaluationDB.variant_id.in_(ids), + EvaluationDB.project_id == uuid.UUID(project_id), + ) + .options(load_only(EvaluationDB.id)) # type: ignore + ) + result_human_evaluations = await session.execute( + select(HumanEvaluationDB) + .join(HumanEvaluationVariantDB) + .filter( + HumanEvaluationVariantDB.variant_id.in_(ids), + HumanEvaluationDB.project_id == uuid.UUID(project_id), + ) + .options(load_only(HumanEvaluationDB.id)) # type: ignore + ) + res_evaluations = result_evaluations.scalars().all() + res_human_evaluations = result_human_evaluations.scalars().all() + return res_evaluations + res_human_evaluations + + elif resource_type == "testset": + result_evaluations = await session.execute( + select(EvaluationDB) + .filter( + EvaluationDB.testset_id.in_(ids), + EvaluationDB.project_id == uuid.UUID(project_id), + ) + .options(load_only(EvaluationDB.id)) # type: ignore + ) + result_human_evaluations = await session.execute( + select(HumanEvaluationDB) + .filter( + HumanEvaluationDB.testset_id.in_(ids), + HumanEvaluationDB.project_id + == uuid.UUID(project_id), # Fixed to match HumanEvaluationDB + ) + .options(load_only(HumanEvaluationDB.id)) # type: ignore + ) + res_evaluations = result_evaluations.scalars().all() + res_human_evaluations = result_human_evaluations.scalars().all() + return res_evaluations + res_human_evaluations + + elif resource_type == "evaluator_config": + query = ( + select(EvaluationDB) + .join(EvaluationDB.evaluator_configs) + .filter( + EvaluationEvaluatorConfigDB.evaluator_config_id.in_(ids), + EvaluationDB.project_id == uuid.UUID(project_id), + ) + ) + result = await session.execute(query) + res = result.scalars().all() + return res + + raise HTTPException( + status_code=400, + detail=f"resource_type {resource_type} is not supported", + ) + + +async def delete_evaluations(evaluation_ids: List[str]) -> None: + """Delete evaluations based on the ids provided from the db. + + Args: + evaluations_ids (list[str]): The IDs of the evaluation + """ + + async with engine.core_session() as session: + query = select(EvaluationDB).where(EvaluationDB.id.in_(evaluation_ids)) + result = await session.execute(query) + evaluations = result.scalars().all() + for evaluation in evaluations: + await session.delete(evaluation) + await session.commit() + + +async def create_new_evaluation_scenario( + project_id: str, + evaluation_id: str, + variant_id: str, + inputs: List[EvaluationScenarioInput], + outputs: List[EvaluationScenarioOutput], + correct_answers: Optional[List[CorrectAnswer]], + is_pinned: Optional[bool], + note: Optional[str], + results: List[EvaluationScenarioResult], +) -> EvaluationScenarioDB: + """Create a new evaluation scenario. + + Returns: + EvaluationScenarioDB: The created evaluation scenario. + """ + + async with engine.core_session() as session: + evaluation_scenario = EvaluationScenarioDB( + project_id=uuid.UUID(project_id), + evaluation_id=uuid.UUID(evaluation_id), + variant_id=uuid.UUID(variant_id), + inputs=[input.model_dump() for input in inputs], + outputs=[output.model_dump() for output in outputs], + correct_answers=( + [correct_answer.model_dump() for correct_answer in correct_answers] + if correct_answers is not None + else [] + ), + is_pinned=is_pinned, + note=note, + ) + + session.add(evaluation_scenario) + await session.commit() + await session.refresh(evaluation_scenario) + + # create evaluation scenario result + for result in results: + evaluation_scenario_result = EvaluationScenarioResultDB( + evaluation_scenario_id=evaluation_scenario.id, + evaluator_config_id=uuid.UUID(result.evaluator_config), + result=result.result.model_dump(), + ) + + session.add(evaluation_scenario_result) + + await session.commit() # ensures that scenario results insertion is committed + await session.refresh(evaluation_scenario) + + return evaluation_scenario + + +async def update_evaluation_with_aggregated_results( + evaluation_id: str, aggregated_results: List[AggregatedResult] +): + async with engine.core_session() as session: + for result in aggregated_results: + aggregated_result = EvaluationAggregatedResultDB( + evaluation_id=uuid.UUID(evaluation_id), + evaluator_config_id=uuid.UUID(result.evaluator_config), + result=result.result.model_dump(), + ) + session.add(aggregated_result) + + await session.commit() + + +async def fetch_eval_aggregated_results(evaluation_id: str): + """ + Fetches an evaluation aggregated results by evaluation identifier. + + Args: + evaluation_id (str): The evaluation identifier + + Returns: + The evaluation aggregated results by evaluation identifier. + """ + + async with engine.core_session() as session: + base_query = select(EvaluationAggregatedResultDB).filter_by( + evaluation_id=uuid.UUID(evaluation_id) + ) + query = base_query.options( + joinedload( + EvaluationAggregatedResultDB.evaluator_config.of_type(EvaluatorConfigDB) + ).load_only( + EvaluatorConfigDB.id, # type: ignore + EvaluatorConfigDB.name, # type: ignore + EvaluatorConfigDB.evaluator_key, # type: ignore + EvaluatorConfigDB.settings_values, # type: ignore + EvaluatorConfigDB.created_at, # type: ignore + EvaluatorConfigDB.updated_at, # type: ignore + ) + ) + + result = await session.execute(query) + aggregated_results = result.scalars().all() + return aggregated_results + + +async def update_evaluation( + evaluation_id: str, project_id: str, updates: Dict[str, Any] +) -> EvaluationDB: + """ + Update an evaluator configuration in the database with the provided id. + + Arguments: + evaluation_id (str): The ID of the evaluator configuration to be updated. + project_id (str): The ID of the project. + updates (Dict[str, Any]): The updates to apply to the evaluator configuration. + + Returns: + EvaluatorConfigDB: The updated evaluator configuration object. + """ + + async with engine.core_session() as session: + result = await session.execute( + select(EvaluationDB).filter_by( + id=uuid.UUID(evaluation_id), project_id=uuid.UUID(project_id) + ) + ) + evaluation = result.scalars().first() + for key, value in updates.items(): + if hasattr(evaluation, key): + setattr(evaluation, key, value) + + await session.commit() + await session.refresh(evaluation) + + return evaluation + + +async def check_if_evaluation_contains_failed_evaluation_scenarios( + evaluation_id: str, +) -> bool: + async with engine.core_session() as session: + EvaluationResultAlias = aliased(EvaluationScenarioResultDB) + query = ( + select(func.count(EvaluationScenarioDB.id)) + .join(EvaluationResultAlias, EvaluationScenarioDB.results) + .where( + EvaluationScenarioDB.evaluation_id == uuid.UUID(evaluation_id), + EvaluationResultAlias.result["type"].astext == "error", + ) + ) + + result = await session.execute(query) + count = result.scalar() + if not count: + return False + return count > 0 diff --git a/api/oss/src/services/evaluation_service.py b/api/ee/src/services/evaluation_service.py similarity index 91% rename from api/oss/src/services/evaluation_service.py rename to api/ee/src/services/evaluation_service.py index ca40a70cef..e2cd9a2d8f 100644 --- a/api/oss/src/services/evaluation_service.py +++ b/api/ee/src/services/evaluation_service.py @@ -3,8 +3,9 @@ from fastapi import HTTPException from oss.src.utils.logging import get_module_logger -from oss.src.services import converters +from ee.src.services import converters from oss.src.services import db_manager +from ee.src.services import db_manager_ee from oss.src.models.api.evaluation_model import ( Evaluation, @@ -17,7 +18,7 @@ NewHumanEvaluation, ) from oss.src.models.db_models import AppDB -from oss.src.models.db_models import ( +from ee.src.models.db_models import ( EvaluationDB, HumanEvaluationDB, HumanEvaluationScenarioDB, @@ -58,20 +59,20 @@ async def prepare_csvdata_and_create_evaluation_scenario( """ for datum in csvdata: - # Check whether the inputs in the testset match the inputs in the variant + # Check whether the inputs in the test set match the inputs in the variant try: inputs = [ {"input_name": name, "input_value": datum[name]} for name in payload_inputs ] except KeyError: - await db_manager.delete_human_evaluation( + await db_manager_ee.delete_human_evaluation( evaluation_id=str(new_evaluation.id) ) msg = f""" - Columns in the testset should match the names of the inputs in the variant. + Columns in the test set should match the names of the inputs in the variant. Inputs names in variant are: {[variant_input for variant_input in payload_inputs]} while - columns in testset are: {[col for col in datum.keys() if col != 'correct_answer']} + columns in test set are: {[col for col in datum.keys() if col != 'correct_answer']} """ raise HTTPException( status_code=400, @@ -91,7 +92,7 @@ async def prepare_csvdata_and_create_evaluation_scenario( **_extend_with_evaluation(evaluation_type), **_extend_with_correct_answer(evaluation_type, datum), } - await db_manager.create_human_evaluation_scenario( + await db_manager_ee.create_human_evaluation_scenario( inputs=list_of_scenario_input, project_id=project_id, evaluation_id=str(new_evaluation.id), @@ -111,7 +112,7 @@ async def update_human_evaluation_service( """ # Update the evaluation - await db_manager.update_human_evaluation( + await db_manager_ee.update_human_evaluation( evaluation_id=str(evaluation.id), values_to_update=update_payload.model_dump() ) @@ -130,7 +131,7 @@ async def fetch_evaluation_scenarios_for_evaluation( List[EvaluationScenario]: A list of evaluation scenarios. """ - evaluation_scenarios = await db_manager.fetch_evaluation_scenarios( + evaluation_scenarios = await db_manager_ee.fetch_evaluation_scenarios( evaluation_id=evaluation_id, project_id=project_id ) return [ @@ -156,7 +157,7 @@ async def fetch_human_evaluation_scenarios_for_evaluation( Returns: List[EvaluationScenario]: A list of evaluation scenarios. """ - human_evaluation_scenarios = await db_manager.fetch_human_evaluation_scenarios( + human_evaluation_scenarios = await db_manager_ee.fetch_human_evaluation_scenarios( evaluation_id=str(human_evaluation.id) ) eval_scenarios = [ @@ -224,7 +225,7 @@ async def update_human_evaluation_scenario( if "correct_answer" in payload: values_to_update["correct_answer"] = payload["correct_answer"] - await db_manager.update_human_evaluation_scenario( + await db_manager_ee.update_human_evaluation_scenario( evaluation_scenario_id=str(evaluation_scenario_db.id), values_to_update=values_to_update, ) @@ -259,7 +260,7 @@ async def fetch_list_evaluations(app: AppDB, project_id: str) -> List[Evaluation List[Evaluation]: A list of evaluations. """ - evaluations_db = await db_manager.list_evaluations( + evaluations_db = await db_manager_ee.list_evaluations( app_id=str(app.id), project_id=project_id ) return [ @@ -282,7 +283,7 @@ async def fetch_list_human_evaluations( List[Evaluation]: A list of evaluations. """ - evaluations_db = await db_manager.list_human_evaluations( + evaluations_db = await db_manager_ee.list_human_evaluations( app_id=app_id, project_id=project_id ) return [ @@ -318,7 +319,7 @@ async def delete_human_evaluations(evaluation_ids: List[str]) -> None: """ for evaluation_id in evaluation_ids: - await db_manager.delete_human_evaluation(evaluation_id=evaluation_id) + await db_manager_ee.delete_human_evaluation(evaluation_id=evaluation_id) async def delete_evaluations(evaluation_ids: List[str]) -> None: @@ -332,7 +333,7 @@ async def delete_evaluations(evaluation_ids: List[str]) -> None: HTTPException: If evaluation not found or access denied. """ - await db_manager.delete_evaluations(evaluation_ids=evaluation_ids) + await db_manager_ee.delete_evaluations(evaluation_ids=evaluation_ids) async def create_new_human_evaluation(payload: NewHumanEvaluation) -> HumanEvaluationDB: @@ -353,7 +354,7 @@ async def create_new_human_evaluation(payload: NewHumanEvaluation) -> HumanEvalu detail=f"App with id {payload.app_id} does not exist", ) - human_evaluation = await db_manager.create_human_evaluation( + human_evaluation = await db_manager_ee.create_human_evaluation( app=app, status=payload.status, evaluation_type=payload.evaluation_type, @@ -395,11 +396,7 @@ async def create_new_evaluation( """ app = await db_manager.fetch_app_by_id(app_id=app_id) - testset = await db_manager.fetch_testset_by_id( - project_id=project_id, - # - testset_id=testset_id, - ) + testset = await db_manager.fetch_testset_by_id(testset_id=testset_id) variant_revision = await db_manager.fetch_app_variant_revision_by_id( variant_revision_id=revision_id ) @@ -408,9 +405,7 @@ async def create_new_evaluation( variant_revision and variant_revision.revision is not None ), f"Variant revision with {revision_id} cannot be None" - assert testset is not None, f"Testset with id {testset_id} does not exist" - - evaluation_db = await db_manager.create_new_evaluation( + evaluation_db = await db_manager_ee.create_new_evaluation( app=app, project_id=project_id, testset=testset, @@ -424,7 +419,7 @@ async def create_new_evaluation( async def compare_evaluations_scenarios(evaluations_ids: List[str], project_id: str): - evaluation = await db_manager.fetch_evaluation_by_id( + evaluation = await db_manager_ee.fetch_evaluation_by_id( project_id=project_id, evaluation_id=evaluations_ids[0], ) diff --git a/api/ee/src/services/organization_service.py b/api/ee/src/services/organization_service.py index 73488353b4..df24ded12a 100644 --- a/api/ee/src/services/organization_service.py +++ b/api/ee/src/services/organization_service.py @@ -1,5 +1,3 @@ -from urllib.parse import quote - from ee.src.services import db_manager_ee from oss.src.services import email_service from oss.src.models.db_models import UserDB @@ -15,9 +13,9 @@ async def update_an_organization( - organization_id: str, payload: OrganizationUpdate + org_id: str, payload: OrganizationUpdate ) -> OrganizationDB: - org = await db_manager_ee.get_organization(organization_id) + org = await db_manager_ee.get_organization(org_id) if org is not None: await db_manager_ee.update_organization(str(org.id), payload) return org @@ -53,30 +51,11 @@ async def send_invitation_email( """ html_template = email_service.read_email_template("./templates/send_email.html") - - token_param = quote(token, safe="") - email_param = quote(email, safe="") - org_param = quote(str(organization.id), safe="") - workspace_param = quote(str(workspace.id), safe="") - project_param = quote(project_id, safe="") - - invite_link = ( - f"{env.AGENTA_WEB_URL}/auth" - f"?token={token_param}" - f"&email={email_param}" - f"&organization_id={org_param}" - f"&workspace_id={workspace_param}" - f"&project_id={project_param}" - ) - html_content = html_template.format( username_placeholder=user.username, action_placeholder="invited you to join", workspace_placeholder=workspace.name, - call_to_action=( - "Click the link below to accept the invitation:


" - f'Accept Invitation' - ), + call_to_action=f'Click the link below to accept the invitation:


Accept Invitation', ) await email_service.send_email( @@ -120,6 +99,6 @@ async def notify_org_admin_invitation(workspace: WorkspaceDB, user: UserDB) -> b return True -async def get_organization_details(organization_id: str) -> dict: - organization = await db_manager_ee.get_organization(organization_id) +async def get_organization_details(org_id: str) -> dict: + organization = await db_manager_ee.get_organization(org_id) return await db_manager_ee.get_org_details(organization) diff --git a/api/oss/src/services/results_service.py b/api/ee/src/services/results_service.py similarity index 91% rename from api/oss/src/services/results_service.py rename to api/ee/src/services/results_service.py index cccb32164d..ca52151315 100644 --- a/api/oss/src/services/results_service.py +++ b/api/ee/src/services/results_service.py @@ -1,16 +1,16 @@ import uuid from typing import Sequence, Dict, Any -from oss.src.services import db_manager +from ee.src.services import db_manager_ee from oss.src.models.api.evaluation_model import EvaluationType -from oss.src.models.db_models import ( +from ee.src.models.db_models import ( HumanEvaluationDB, EvaluationScenarioDB, ) async def fetch_results_for_evaluation(evaluation: HumanEvaluationDB): - evaluation_scenarios = await db_manager.fetch_human_evaluation_scenarios( + evaluation_scenarios = await db_manager_ee.fetch_human_evaluation_scenarios( evaluation_id=str(evaluation.id) ) @@ -18,7 +18,7 @@ async def fetch_results_for_evaluation(evaluation: HumanEvaluationDB): if len(evaluation_scenarios) == 0: return results - evaluation_variants = await db_manager.fetch_human_evaluation_variants( + evaluation_variants = await db_manager_ee.fetch_human_evaluation_variants( human_evaluation_id=str(evaluation.id) ) results["variants"] = [ @@ -99,7 +99,7 @@ async def _compute_stats_for_human_a_b_testing_evaluation( async def fetch_results_for_single_model_test(evaluation_id: str): - evaluation_scenarios = await db_manager.fetch_human_evaluation_scenarios( + evaluation_scenarios = await db_manager_ee.fetch_human_evaluation_scenarios( evaluation_id=str(evaluation_id) ) scores_and_counts: Dict[str, Any] = {} diff --git a/api/ee/src/services/selectors.py b/api/ee/src/services/selectors.py index f8a10ceecb..37b9456777 100644 --- a/api/ee/src/services/selectors.py +++ b/api/ee/src/services/selectors.py @@ -95,13 +95,13 @@ async def get_user_own_org(user_uid: str) -> OrganizationDB: user = await db_manager.get_user_with_id(user_id=user_uid) async with engine.core_session() as session: - result = await session.execute( + org_query = await session.execute( select(OrganizationDB).filter_by( owner=str(user.id), type="default", ) ) - org = result.scalars().first() + org = org_query.scalars().first() return org diff --git a/api/ee/src/services/utils.py b/api/ee/src/services/utils.py new file mode 100644 index 0000000000..0eaedde4ff --- /dev/null +++ b/api/ee/src/services/utils.py @@ -0,0 +1,21 @@ +# Stdlib Imports +import asyncio +from functools import partial +from typing import Callable, Coroutine + + +async def run_in_separate_thread(func: Callable, *args, **kwargs) -> Coroutine: + """ + Run a synchronous function in a separate thread. + + Args: + func (callable): The synchronous function to be executed. + args (tuple): Positional arguments to be passed to `func`. + kwargs (dict): Keyword arguments to be passed to `func`. + + Returns: + The result of the synchronous function. + """ + + loop = asyncio.get_event_loop() + return await loop.run_in_executor(None, partial(func, *args, **kwargs)) diff --git a/api/ee/src/services/workspace_manager.py b/api/ee/src/services/workspace_manager.py index 5bbebc78e6..220bedd52b 100644 --- a/api/ee/src/services/workspace_manager.py +++ b/api/ee/src/services/workspace_manager.py @@ -128,7 +128,7 @@ async def get_all_workspace_permissions() -> List[Permission]: async def invite_user_to_workspace( payload: List[InviteRequest], - organization_id: str, + org_id: str, project_id: str, workspace_id: str, user_uid: str, @@ -138,7 +138,7 @@ async def invite_user_to_workspace( Args: user_uid (str): The user uid. - organization_id (str): The ID of the organization that the workspace belongs to. + org_id (str): The ID of the organization that the workspace belongs to. project_id (str): The ID of the project that belongs to the workspace. workspace_id (str): The ID of the workspace. payload (InviteRequest): The payload containing the email address of the user to invite. @@ -152,7 +152,7 @@ async def invite_user_to_workspace( try: workspace = await get_workspace(workspace_id) - organization = await db_manager_ee.get_organization(organization_id) + organization = await db_manager_ee.get_organization(org_id) user_performing_action = await db_manager.get_user(user_uid) for payload_invite in payload: @@ -216,7 +216,7 @@ async def invite_user_to_workspace( async def resend_user_workspace_invite( payload: ReseendInviteRequest, project_id: str, - organization_id: str, + org_id: str, workspace_id: str, user_uid: str, ) -> JSONResponse: @@ -224,7 +224,7 @@ async def resend_user_workspace_invite( Resend an invitation to a user to a workspace. Args: - organization_id (str): The ID of the organization that the workspace belongs to. + org_id (str): The ID of the organization that the workspace belongs to. project_id (str): The ID of the project. workspace_id (str): The ID of the workspace. payload (ReseendInviteRequest): The payload containing the email address of the user to invite. @@ -238,7 +238,7 @@ async def resend_user_workspace_invite( try: workspace = await get_workspace(workspace_id) - organization = await db_manager_ee.get_organization(organization_id) + organization = await db_manager_ee.get_organization(org_id) user_performing_action = await db_manager.get_user(user_uid) # Check if the email address already has a valid, unused invitation for the workspace @@ -310,10 +310,7 @@ async def accept_workspace_invitation( if await db_manager_ee.check_user_in_workspace_with_email( user.email, str(workspace.id) ): - raise HTTPException( - status_code=409, - detail="User is already a member of the workspace", - ) + raise Exception("User is already a member of the workspace") invitation = await check_valid_invitation(project_id, user.email, token) if invitation is not None: diff --git a/api/ee/src/tasks/evaluations.py b/api/ee/src/tasks/evaluations.py new file mode 100644 index 0000000000..f79302c45f --- /dev/null +++ b/api/ee/src/tasks/evaluations.py @@ -0,0 +1,2029 @@ +from typing import Any, Dict, List, Optional +from uuid import UUID, uuid4 +import asyncio +import traceback +from json import dumps +from collections import Counter as StatisticsCounter +from time import time_ns + +import math +import re +import unicodedata +import itertools +import numpy + +from celery import shared_task, states + +from fastapi import Request + + +from oss.src.services import helpers +from oss.src.utils.helpers import parse_url +from oss.src.utils.logging import get_module_logger +from oss.src.services.auth_helper import sign_secret_token +from oss.src.services import ( + evaluators_service, + llm_apps_service, + aggregation_service, +) +from oss.src.models.api.evaluation_model import EvaluationStatusEnum +from oss.src.models.shared_models import ( + AggregatedResult, + CorrectAnswer, + EvaluationScenarioInput, + EvaluationScenarioOutput, + EvaluationScenarioResult, + InvokationResult, + Error, + Result, +) +from oss.src.services.db_manager import ( + fetch_app_by_id, + fetch_app_variant_by_id, + fetch_app_variant_revision_by_id, + fetch_evaluator_config, + fetch_testset_by_id, + get_deployment_by_id, + get_project_by_id, +) +from ee.src.services.db_manager_ee import ( + update_evaluation, + EvaluationScenarioResult, + create_new_evaluation_scenario, + update_evaluation_with_aggregated_results, + check_if_evaluation_contains_failed_evaluation_scenarios, +) +from oss.src.services.evaluator_manager import get_evaluators +from oss.src.core.secrets.utils import get_llm_providers_secrets +from ee.src.utils.entitlements import check_entitlements, Counter + +from oss.src.apis.fastapi.tracing.utils import make_hash_id +from oss.src.apis.fastapi.annotations.router import AnnotationsRouter +from oss.src.apis.fastapi.evaluators.router import SimpleEvaluatorsRouter +from oss.src.apis.fastapi.testsets.router import SimpleTestsetsRouter +from oss.src.apis.fastapi.evaluations.router import EvaluationsRouter +from oss.src.core.evaluations.service import EvaluationsService +from oss.src.core.workflows.service import WorkflowsService +from oss.src.core.testsets.service import TestsetsService +from oss.src.core.testcases.service import TestcasesService +from oss.src.core.tracing.service import TracingService +from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO +from oss.src.dbs.postgres.git.dao import GitDAO +from oss.src.dbs.postgres.blobs.dao import BlobsDAO +from oss.src.dbs.postgres.tracing.dao import TracingDAO + +from oss.src.apis.fastapi.evaluators.models import ( + SimpleEvaluatorQueryRequest, +) + +from oss.src.apis.fastapi.annotations.models import ( + AnnotationOrigin, + AnnotationKind, + AnnotationChannel, + AnnotationCreate, + AnnotationCreateRequest, +) +from oss.src.apis.fastapi.evaluations.models import ( + EvaluationRunEditRequest, + EvaluationScenariosCreateRequest, + EvaluationScenarioEditRequest, + EvaluationStepsCreateRequest, + EvaluationMetricsCreateRequest, +) +from oss.src.core.evaluations.types import ( + EvaluationStatus, + EvaluationRunEdit, + EvaluationScenarioCreate, + EvaluationScenarioEdit, + EvaluationStepCreate, + EvaluationMetricCreate, +) +from oss.src.dbs.postgres.workflows.dbes import ( + WorkflowArtifactDBE, + WorkflowVariantDBE, + WorkflowRevisionDBE, +) +from oss.src.dbs.postgres.testsets.dbes import ( + TestsetArtifactDBE, + TestsetVariantDBE, + TestsetRevisionDBE, +) +from oss.src.dbs.postgres.testcases.dbes import ( + TestcaseBlobDBE, +) + + +annotations_router = AnnotationsRouter( + tracing_service=TracingService( + tracing_dao=TracingDAO(), + ), + workflows_service=WorkflowsService( + workflows_dao=GitDAO( + ArtifactDBE=WorkflowArtifactDBE, + VariantDBE=WorkflowVariantDBE, + RevisionDBE=WorkflowRevisionDBE, + ), + ), +) + +evaluators_router = SimpleEvaluatorsRouter( + workflows_service=WorkflowsService( + workflows_dao=GitDAO( + ArtifactDBE=WorkflowArtifactDBE, + VariantDBE=WorkflowVariantDBE, + RevisionDBE=WorkflowRevisionDBE, + ), + ), +) + +testsets_router = SimpleTestsetsRouter( + testsets_service=TestsetsService( + testsets_dao=GitDAO( + ArtifactDBE=TestsetArtifactDBE, + VariantDBE=TestsetVariantDBE, + RevisionDBE=TestsetRevisionDBE, + ), + testcases_service=TestcasesService( + blobs_dao=BlobsDAO( + BlobDBE=TestcaseBlobDBE, + ), + ), + ), +) + +evaluations_router = EvaluationsRouter( + evaluations_service=EvaluationsService( + evaluations_dao=EvaluationsDAO(), + ), +) + +log = get_module_logger(__name__) + + +# Fetch all evaluators and pre-compute ground truth keys +all_evaluators = get_evaluators() +ground_truth_keys_dict = { + evaluator.key: [ + key + for key, value in evaluator.settings_template.items() + if value.get("ground_truth_key") is True + ] + for evaluator in all_evaluators +} + + +@shared_task(queue="src.tasks.evaluations.evaluate", bind=True) +def evaluate( + self, + app_id: str, + user_id: str, + project_id: str, + revision_id: str, + evaluators_config_ids: List[str], + testset_id: str, + evaluation_id: str, + rate_limit_config: Dict[str, int], +): + """ + Evaluates an app variant using the provided evaluators and testset, and saves the results in the database. + + Args: + self: The task instance. + app_id (str): The ID of the app. + project_id (str): The ID of the project. + revision_id (str): The ID of the variant revision. + evaluators_config_ids (List[str]): The IDs of the evaluators configurations to be used. + testset_id (str): The ID of the testset. + evaluation_id (str): The ID of the evaluation. + rate_limit_config (Dict[str, int]): Configuration for rate limiting. + + Returns: + None + """ + + log.info( + "Starting evaluation:", + evaluation_id=evaluation_id, + project_id=project_id, + testset_id=testset_id, + application_id=app_id, + revision_id=revision_id, + ) + + loop = asyncio.get_event_loop() + + try: + # 0. Update evaluation status to STARTED + loop.run_until_complete( + update_evaluation( + evaluation_id, + project_id, + { + "status": Result( + type="status", value=EvaluationStatusEnum.EVALUATION_STARTED + ).model_dump() + }, + ) + ) + + # 1. Fetch data from the database + app = loop.run_until_complete(fetch_app_by_id(app_id)) + variant_revision_db = loop.run_until_complete( + fetch_app_variant_revision_by_id(revision_id) + ) + assert ( + variant_revision_db is not None + ), f"Variant revision with id {revision_id} not found!" + revision_parameters = variant_revision_db.config_parameters + testset_db = loop.run_until_complete(fetch_testset_by_id(testset_id)) + evaluator_config_dbs = [] + for evaluator_config_id in evaluators_config_ids: + evaluator_config = loop.run_until_complete( + fetch_evaluator_config(evaluator_config_id) + ) + evaluator_config_dbs.append(evaluator_config) + + deployment_db = loop.run_until_complete( + get_deployment_by_id(str(variant_revision_db.base.deployment_id)) + ) + uri = parse_url(url=deployment_db.uri) # type: ignore + if not uri: + log.error( + f"Evaluation {evaluation_id} failed: Deployment {deployment_db.id} has no valid URI" + ) + raise Exception(f"Deployment {deployment_db.id} has no valid URI") + + # 2. Initialize vars + evaluators_aggregated_data = { + str(evaluator_config_db.id): { + "evaluator_key": evaluator_config_db.evaluator_key, + "results": [], + } + for evaluator_config_db in evaluator_config_dbs + } + + log.info( + "Starting batches:", + evaluation_id=evaluation_id, + project_id=project_id, + testset_id=testset_id, + count=len(testset_db.csvdata), + size=len(dumps(testset_db.csvdata).encode("utf-8")), + ) + + # 3. Invoke the app + app_outputs: List[InvokationResult] = loop.run_until_complete( + llm_apps_service.batch_invoke( + uri, + testset_db.csvdata, # type: ignore + revision_parameters, # type: ignore + rate_limit_config, + user_id, + project_id, + application_id=str( + app.id + ), #! NOTE: removing this will break observability + ) + ) + + # 4. Get provider keys from vault + providers_keys_from_vault: Dict[str, Any] = loop.run_until_complete( + get_llm_providers_secrets(project_id) + ) + + project = loop.run_until_complete( + get_project_by_id( + project_id=project_id, + ) + ) + + # 5. Signin secret token and prepare headers for authentication + headers = {} + secret_token = loop.run_until_complete( + sign_secret_token( + user_id=str(user_id), + project_id=str(project_id), + workspace_id=str(project.workspace_id), + organization_id=str(project.organization_id), + ) + ) + if secret_token: + headers = {"Authorization": f"Secret {secret_token}"} + headers["ngrok-skip-browser-warning"] = "1" + + openapi_parameters = None + max_recursive_depth = 5 + runtime_prefix = uri + route_path = "" + + while max_recursive_depth > 0 and not openapi_parameters: + try: + openapi_parameters = loop.run_until_complete( + llm_apps_service.get_parameters_from_openapi( + runtime_prefix + "/openapi.json", + route_path, + headers, + ), + ) + except Exception: # pylint: disable=broad-exception-caught + openapi_parameters = None + + if not openapi_parameters: + max_recursive_depth -= 1 + if not runtime_prefix.endswith("/"): + route_path = "/" + runtime_prefix.split("/")[-1] + route_path + runtime_prefix = "/".join(runtime_prefix.split("/")[:-1]) + else: + route_path = "" + runtime_prefix = runtime_prefix[:-1] + + openapi_parameters = loop.run_until_complete( + llm_apps_service.get_parameters_from_openapi( + runtime_prefix + "/openapi.json", + route_path, + headers, + ), + ) + + for data_point, app_output in zip(testset_db.csvdata, app_outputs): # type: ignore + # 1. We prepare the inputs + list_inputs = get_app_inputs(revision_parameters, openapi_parameters) + + inputs = [ + EvaluationScenarioInput( + name=input_item["name"], + type="text", + value=data_point.get( + ( + input_item["name"] + if input_item["type"] != "messages" + else "chat" + ), + "", + ), # TODO: We need to remove the hardcoding of chat as name for chat inputs from the FE + ) + for input_item in list_inputs + if input_item["name"] != "ag_config" + ] + + # 2. We skip the iteration if error invoking the llm-app + if app_output.result.error: + log.error( + "There is an error when invoking the llm app so we need to skip" + ) + error_results = [ + EvaluationScenarioResult( + evaluator_config=str(evaluator_config_db.id), + result=Result( + type=app_output.result.type, + value=None, + error=Error( + message=app_output.result.error.message, + stacktrace=app_output.result.error.stacktrace, + ), + ), + ) + for evaluator_config_db in evaluator_config_dbs + ] + + loop.run_until_complete( + create_new_evaluation_scenario( + project_id=project_id, + evaluation_id=evaluation_id, + variant_id=str(variant_revision_db.variant_id), + inputs=inputs, + outputs=[ + EvaluationScenarioOutput( + result=Result( + type="error", + value=None, + error=Error( + message=app_output.result.error.message, + stacktrace=app_output.result.error.stacktrace, + ), + ) + ) + ], + correct_answers=None, + is_pinned=False, + note="", + results=error_results, + ) + ) + continue + + # 3. We evaluate + evaluators_results: List[EvaluationScenarioResult] = [] + + # Loop over each evaluator configuration to gather the correct answers and evaluate + ground_truth_column_names = [] # type: ignore + for evaluator_config_db in evaluator_config_dbs: + ground_truth_keys = ground_truth_keys_dict.get( + evaluator_config_db.evaluator_key, [] + ) + ground_truth_column_names.extend( + evaluator_config_db.settings_values.get(key, "") + for key in ground_truth_keys + ) + + result = loop.run_until_complete( + evaluators_service.evaluate( + evaluator_key=evaluator_config_db.evaluator_key, + output=app_output.result.value, + data_point=data_point, + settings_values=evaluator_config_db.settings_values, + app_params=revision_parameters, # type: ignore + inputs=data_point, + lm_providers_keys=providers_keys_from_vault, + ) + ) + + # Update evaluators aggregated data + evaluator_results: List[Result] = evaluators_aggregated_data[ + str(evaluator_config_db.id) + ]["results"] + evaluator_results.append(result) + + result_object = EvaluationScenarioResult( + evaluator_config=str(evaluator_config_db.id), + result=result, + ) + + evaluators_results.append(result_object) + + all_correct_answers = [ + ( + CorrectAnswer( + key=ground_truth_column_name, + value=data_point[ground_truth_column_name], + ) + if ground_truth_column_name in data_point + else CorrectAnswer(key=ground_truth_column_name, value="") + ) + for ground_truth_column_name in ground_truth_column_names + ] + + # 4. We save the result of the eval scenario in the db + loop.run_until_complete( + create_new_evaluation_scenario( + project_id=project_id, + evaluation_id=evaluation_id, + variant_id=str(variant_revision_db.variant_id), + inputs=inputs, + outputs=[ + EvaluationScenarioOutput( + result=Result( + type="text", value=app_output.result.value["data"] + ), + latency=app_output.latency, + cost=app_output.cost, + ) + ], + correct_answers=all_correct_answers, + is_pinned=False, + note="", + results=evaluators_results, + ) + ) + + # Add average cost and latency + average_latency = aggregation_service.aggregate_float_from_llm_app_response( + app_outputs, "latency" + ) + average_cost = aggregation_service.aggregate_float_from_llm_app_response( + app_outputs, "cost" + ) + total_cost = aggregation_service.sum_float_from_llm_app_response( + app_outputs, "cost" + ) + loop.run_until_complete( + update_evaluation( + evaluation_id, + project_id, + { + "average_latency": average_latency.model_dump(), + "average_cost": average_cost.model_dump(), + "total_cost": total_cost.model_dump(), + }, + ) + ) + + except Exception as e: + try: + loop.run_until_complete( + check_entitlements( + organization_id=project.organization_id, + key=Counter.EVALUATIONS, + delta=-1, + ) + ) + except: # pylint: disable=bare-except + pass + + log.error(f"An error occurred during evaluation: {e}") + traceback.print_exc() + loop.run_until_complete( + update_evaluation( + evaluation_id, + project_id, + { + "status": Result( + type="status", + value="EVALUATION_FAILED", + error=Error( + message="Evaluation Failed", + stacktrace=str(traceback.format_exc()), + ), + ).model_dump() + }, + ) + ) + self.update_state(state=states.FAILURE) + return + + try: + aggregated_results = loop.run_until_complete( + aggregate_evaluator_results(evaluators_aggregated_data) + ) + + loop.run_until_complete( + update_evaluation_with_aggregated_results(evaluation_id, aggregated_results) + ) + + failed_evaluation_scenarios = loop.run_until_complete( + check_if_evaluation_contains_failed_evaluation_scenarios(evaluation_id) + ) + + evaluation_status = Result( + type="status", value=EvaluationStatusEnum.EVALUATION_FINISHED, error=None + ) + + if failed_evaluation_scenarios: + evaluation_status = Result( + type="status", + value=EvaluationStatusEnum.EVALUATION_FINISHED_WITH_ERRORS, + error=None, + ) + + loop.run_until_complete( + update_evaluation( + evaluation_id=evaluation_id, + project_id=project_id, + updates={"status": evaluation_status.model_dump()}, + ) + ) + + except Exception as e: + log.error(f"An error occurred during evaluation aggregation: {e}") + traceback.print_exc() + loop.run_until_complete( + update_evaluation( + evaluation_id, + project_id, + { + "status": Result( + type="status", + value="EVALUATION_AGGREGATION_FAILED", + error=Error( + message="Evaluation Aggregation Failed", + stacktrace=str(traceback.format_exc()), + ), + ).model_dump() + }, + ) + ) + self.update_state(state=states.FAILURE) + return + + +async def aggregate_evaluator_results( + evaluators_aggregated_data: dict, +) -> List[AggregatedResult]: + """ + Aggregate the results of the evaluation evaluator. + + Args: + evaluators_aggregated_data (dict): The evaluators aggregated data + + Returns: + the aggregated result of the evaluation evaluator + """ + + aggregated_results = [] + for config_id, val in evaluators_aggregated_data.items(): + evaluator_key = val["evaluator_key"] or "" + results = val["results"] or [] + + if not results: + result = Result(type="error", value=None, error=Error(message="-")) + continue + + if evaluator_key == "auto_ai_critique": + result = aggregation_service.aggregate_ai_critique(results) + + elif evaluator_key == "auto_regex_test": + result = aggregation_service.aggregate_binary(results) + + elif evaluator_key in [ + "auto_exact_match", + "auto_similarity_match", + "field_match_test", + "auto_webhook_test", + "auto_custom_code_run", + "auto_starts_with", + "auto_ends_with", + "auto_contains", + "auto_contains_any", + "auto_contains_all", + "auto_contains_json", + "auto_json_diff", + "auto_semantic_similarity", + "auto_levenshtein_distance", + "rag_faithfulness", + "rag_context_relevancy", + ]: + result = aggregation_service.aggregate_float(results) + + else: + result = Result( + type="error", value=None, error=Error(message="Aggregation failed") + ) + + aggregated_result = AggregatedResult( + evaluator_config=config_id, + result=result, + ) + aggregated_results.append(aggregated_result) + return aggregated_results + + +def get_app_inputs(parameters, openapi_parameters) -> List[Dict[str, str]]: + """ + Get a list of application inputs based on the app variant parameters and openapi parameters. + + Args: + parameters (dict): A dictionary containing the app variant parameters. + openapi_parameters (list): A list of openapi parameters. + + Returns: + list: A list of dictionaries representing the application inputs, where each dictionary contains the input name and type. + """ + # --- + inputs = [] + # --- + + for param in openapi_parameters: + if param["type"] == "input": + # --- + item = {"name": param["name"], "type": "input"} + inputs.append(item) + # --- + + # in case of dynamic inputs (as in our templates) + elif param["type"] == "dict": + # let's get the list of the dynamic inputs + if ( + param["name"] in parameters + ): # in case we have modified in the playground the default list of inputs (e.g. country_name) + input_names = [_["name"] for _ in parameters[param["name"]]] + else: # otherwise we use the default from the openapi + input_names = param["default"] + + for input_name in input_names: + # --- + item = {"name": input_name, "type": "dict_input"} + inputs.append(item) + # --- + + elif param["type"] == "messages": + # TODO: Right now the FE is saving chats always under the column name chats. The whole logic for handling chats and dynamic inputs is convoluted and needs rework in time. + # --- + item = {"name": "chat", "type": "messages"} + inputs.append(item) + # --- + elif param["type"] == "file_url": + # --- + item = {"name": param["name"], "type": "file_url"} + inputs.append(item) + # --- + else: + # if param["name"] in parameters: # hotfix + # # --- + # item = {"name": param["name"], "type": param["type"]} + # inputs.append(item) + # # --- + pass + + try: + input_keys = helpers.find_key_occurrences(parameters, "input_keys") or [] + items = [{"name": input_key, "type": "input"} for input_key in input_keys] + inputs.extend(items) + reserved_keys = ["inputs"] + inputs = [input for input in inputs if input["name"] not in reserved_keys] + except Exception as e: # pylint: disable=broad-exception-caught + log.warn(f"Error making payload: {e}") + + return inputs + + +@shared_task(queue="src.tasks.evaluations.annotate", bind=True) +def annotate( + self, + *, + project_id: UUID, + user_id: UUID, + # + run_id: UUID, + # + testset_id: str, + revision_id: str, + autoeval_ids: Optional[List[str]], + # + run_config: Dict[str, int], +): + """ + Annotates an application revision applied to a testset using auto evaluator(s). + + Args: + self: The task instance. + project_id (str): The ID of the project. + user_id (str): The ID of the user. + run_id (str): The ID of the evaluation run. + testset_id (str): The ID of the testset. + revision_id (str): The ID of the application revision. + autoeval_ids (List[str]): The IDs of the evaluators configurations. + run_config (Dict[str, int]): Configuration for evaluation run. + + Returns: + None + """ + + request = Request(scope={"type": "http", "http_version": "1.1", "scheme": "http"}) + + request.state.project_id = project_id + request.state.user_id = user_id + + loop = asyncio.get_event_loop() + + try: + # ---------------------------------------------------------------------- + log.info( + "Starting evaluation run:", + project_id=project_id, + # user_id=user_id, + run_id=run_id, + testset_id=testset_id, + revision_id=revision_id, + autoeval_ids=autoeval_ids, + # run_config=run_config, + ) + # ---------------------------------------------------------------------- + + # fetch evaluation run ------------------------------------------------- + evaluation_run_response = loop.run_until_complete( + evaluations_router.fetch_run( + request=request, + run_id=run_id, + ) + ) + + assert ( + evaluation_run_response.count != 0 + ), f"Evaluation run with id {run_id} not found!" + # ---------------------------------------------------------------------- + + # fetch application ---------------------------------------------------- + revision = loop.run_until_complete( + fetch_app_variant_revision_by_id(revision_id), + ) + + assert revision is not None, f"App revision with id {revision_id} not found!" + + variant = loop.run_until_complete( + fetch_app_variant_by_id(str(revision.variant_id)), + ) + + assert ( + variant is not None + ), f"App variant with id {revision.variant_id} not found!" + + app = loop.run_until_complete( + fetch_app_by_id(str(variant.app_id)), + ) + + assert app is not None, f"App with id {variant.app_id} not found!" + + deployment = loop.run_until_complete( + get_deployment_by_id(str(revision.base.deployment_id)) + ) + + assert ( + deployment is not None + ), f"Deployment with id {revision.base.deployment_id} not found!" + + uri = parse_url(url=deployment.uri) + + assert uri is not None, f"Invalid URI for deployment {deployment.id}!" + + revision_parameters = revision.config_parameters + + assert ( + revision_parameters is not None + ), f"Revision parameters for variant {variant.id} not found!" + # ---------------------------------------------------------------------- + + # just-in-time transfer of testset ------------------------------------- + testset_response = loop.run_until_complete( + testsets_router.transfer_testset( + request=request, + testset_id=testset_id, + ) + ) + + assert testset_response.count != 0, f"Testset with id {testset_id} not found!" + + testset = testset_response.testset + testcases = testset.data.testcases + testcases_data = [ + {**testcase.data, "id": str(testcase.id)} for testcase in testcases + ] # INEFFICIENT: might want to have testcase_id in testset data (caution with hashing) + nof_testcases = len(testcases) + # ---------------------------------------------------------------------- + + # fetch auto-evaluators ------------------------------------------------ + autoeval_configs = [] + + for autoeval_id in autoeval_ids: + autoeval_config = loop.run_until_complete( + fetch_evaluator_config(autoeval_id) + ) + + autoeval_configs.append(autoeval_config) + + annotation_steps_keys = [ + get_slug_from_name_and_id(autoeval_config.name, autoeval_config.id) + for autoeval_config in autoeval_configs + ] + + nof_annotations = len(autoeval_configs) + # ---------------------------------------------------------------------- + + # fetch provider keys from secrets ------------------------------------- + providers_keys = loop.run_until_complete( + get_llm_providers_secrets(project_id), + ) + # ---------------------------------------------------------------------- + + # fetch project -------------------------------------------------------- + project = loop.run_until_complete( + get_project_by_id(project_id=project_id), + ) + # ---------------------------------------------------------------------- + + # prepare credentials and headers -------------------------------------- + secret_token = loop.run_until_complete( + sign_secret_token( + user_id=str(user_id), + project_id=str(project_id), + workspace_id=str(project.workspace_id), + organization_id=str(project.organization_id), + ) + ) + + headers = {} + if secret_token: + headers = {"Authorization": f"Secret {secret_token}"} + headers["ngrok-skip-browser-warning"] = "1" + + openapi_parameters = None + max_recursive_depth = 5 + runtime_prefix = uri + route_path = "" + + while max_recursive_depth > 0 and not openapi_parameters: + try: + openapi_parameters = loop.run_until_complete( + llm_apps_service.get_parameters_from_openapi( + runtime_prefix + "/openapi.json", + route_path, + headers, + ), + ) + except Exception: # pylint: disable=broad-exception-caught + openapi_parameters = None + + if not openapi_parameters: + max_recursive_depth -= 1 + if not runtime_prefix.endswith("/"): + route_path = "/" + runtime_prefix.split("/")[-1] + route_path + runtime_prefix = "/".join(runtime_prefix.split("/")[:-1]) + else: + route_path = "" + runtime_prefix = runtime_prefix[:-1] + + openapi_parameters = loop.run_until_complete( + llm_apps_service.get_parameters_from_openapi( + runtime_prefix + "/openapi.json", + route_path, + headers, + ), + ) + # ---------------------------------------------------------------------- + + # initialize steps/mappings in run ------------------------------------- + testset_step_key = get_slug_from_name_and_id(testset.name, testset.id) + + input_step = { + "key": testset_step_key, + "references": { + "testset": {"id": testset_id}, + }, + } + + invocation_step_key = get_slug_from_name_and_id(app.app_name, revision.id) + + invocation_step = { + "key": invocation_step_key, + "references": { + "application": {"id": str(app.id)}, + "application_variant": {"id": str(variant.id)}, + "application_revision": {"id": str(revision.id)}, + }, + "inputs": [ + {"key": testset_step_key}, + ], + } + + steps = [input_step, invocation_step] + + input_mappings = [ + { + "column": { + "kind": "testset", + "name": key, + }, + "step": { + "key": testset_step_key, + "path": f"data.{key}", + }, + } + for key in testcases[0].data.keys() + ] + + invocation_mappings = [ + { + "column": { + "kind": "invocation", + "name": "outputs", + }, + "step": { + "key": invocation_step_key, + "path": "attributes.ag.data.outputs", + }, + } + ] + + mappings = input_mappings + invocation_mappings + + run_edit_request = EvaluationRunEditRequest( + run=EvaluationRunEdit( + id=run_id, + # + name=evaluation_run_response.run.name, + description=evaluation_run_response.run.description, + # + tags=evaluation_run_response.run.tags, + meta=evaluation_run_response.run.meta, + # + status=EvaluationStatus.RUNNING, + # + data={"steps": steps, "mappings": mappings}, + ) + ) + + evaluation_run_response = loop.run_until_complete( + evaluations_router.edit_run( + request=request, + run_id=run_id, + run_edit_request=run_edit_request, + ) + ) + + assert ( + evaluation_run_response.count != 0 + ), f"Failed to edit evaluation run {run_id}!" + # ---------------------------------------------------------------------- + + # initialize metrics --------------------------------------------------- + raw_metrics = { + invocation_step_key: { + "duration": [], + "errors": [], + "costs": [], + "tokens": [], + }, + **{ + annotation_step_key: { + "errors": [], + } + for annotation_step_key in annotation_steps_keys + }, + } + + annotation_metrics_keys = {key: {} for key in annotation_steps_keys} + # ---------------------------------------------------------------------- + + # create scenarios ----------------------------------------------------- + scenarios_create_request = EvaluationScenariosCreateRequest( + scenarios=[ + EvaluationScenarioCreate( + run_id=run_id, + # + status=EvaluationStatus.RUNNING, + ) + for _ in range(nof_testcases) + ] + ) + + scenarios_response = loop.run_until_complete( + evaluations_router.create_scenarios( + request=request, + scenarios_create_request=scenarios_create_request, + ) + ) + + assert ( + scenarios_response.count == nof_testcases + ), f"Failed to create evaluation scenarios for run {run_id}!" + + scenarios = scenarios_response.scenarios + # ---------------------------------------------------------------------- + + # create input steps --------------------------------------------------- + repeat_id = str(uuid4()) + retry_id = str(uuid4()) + + steps_create_request = EvaluationStepsCreateRequest( + steps=[ + EvaluationStepCreate( + run_id=run_id, + scenario_id=scenario.id, + # + status=EvaluationStatus.SUCCESS, + # + key=testset_step_key, + repeat_id=repeat_id, + retry_id=retry_id, + # + testcase_id=testcases[idx].id, + ) + for idx, scenario in enumerate(scenarios) + ] + ) + + steps_response = loop.run_until_complete( + evaluations_router.create_steps( + request=request, + steps_create_request=steps_create_request, + ) + ) + + assert ( + steps_response.count == nof_testcases + ), f"Failed to create evaluation steps for run {run_id}!" + # ---------------------------------------------------------------------- + + # ---------------------------------------------------------------------- + log.info( + "Starting run batches:", + project_id=project_id, + run_id=run_id, + testset_id=testset_id, + count=len(testcases), + size=len(dumps(testcases).encode("utf-8")), + ) + # ---------------------------------------------------------------------- + + # invoke the app ------------------------------------------------------- + invocations: List[InvokationResult] = loop.run_until_complete( + llm_apps_service.batch_invoke( + project_id=project_id, + user_id=user_id, + testset_data=testcases_data, # type: ignore + parameters=revision_parameters, # type: ignore + uri=uri, + rate_limit_config=run_config, + application_id=str(app.id), # DO NOT REMOVE + references={ + "testset": {"id": testset_id}, + "application": {"id": str(app.id)}, + "application_variant": {"id": str(variant.id)}, + "application_revision": {"id": str(revision.id)}, + }, + ) + ) + # ---------------------------------------------------------------------- + + # create invocation steps ---------------------------------------------- + steps_create_request = EvaluationStepsCreateRequest( + steps=[ + EvaluationStepCreate( + run_id=run_id, + scenario_id=scenario.id, + # + status=( + EvaluationStatus.SUCCESS + if not invocations[idx].result.error + else EvaluationStatus.FAILURE + ), + # + key=invocation_step_key, + repeat_id=repeat_id, + retry_id=retry_id, + # + trace_id=invocations[idx].trace_id, + error=( + invocations[idx].result.error.model_dump(mode="json") + if invocations[idx].result.error + else None + ), + ) + for idx, scenario in enumerate(scenarios) + ] + ) + + steps_response = loop.run_until_complete( + evaluations_router.create_steps( + request=request, + steps_create_request=steps_create_request, + ) + ) + + assert ( + steps_response.count == nof_testcases + ), f"Failed to create evaluation steps for run {run_id}!" + # ---------------------------------------------------------------------- + + run_has_errors = 0 + run_status = EvaluationStatus.SUCCESS + + evaluator_references = dict() + + steps_ready = False + steps_updated = False + + # run evaluators ------------------------------------------------------- + for idx in range(nof_testcases): + scenario = scenarios[idx] + testcase = testcases[idx] + invocation = invocations[idx] + + if not steps_updated: + # fix evaluator references ------------------------------------- + for jdx in range(nof_annotations): + annotation_step_key = annotation_steps_keys[jdx] + + simple_evaluator_query_request = SimpleEvaluatorQueryRequest( + evaluator_refs=[{"slug": annotation_step_key}], + ) + + simple_evaluator_response = loop.run_until_complete( + evaluators_router.query_simple_evaluators( + request=request, + simple_evaluator_query_request=simple_evaluator_query_request, + ) + ) + + if simple_evaluator_response.count != 0: + evaluator = simple_evaluator_response.evaluators[0] + + evaluator_references[annotation_step_key] = { + "id": str(evaluator.id), + "slug": evaluator.slug, + } + + metrics_keys = get_metrics_keys_from_schema( + schema=( + evaluator.data.service.get("format") + if "agenta" in evaluator.data.service + else {} + ), + ) + + annotation_metrics_keys[annotation_step_key] = [ + { + "path": metric_key["path"].replace("outputs.", "", 1), + "type": metric_key["type"], + } + for metric_key in metrics_keys + ] + + else: + evaluator_references[annotation_step_key] = { + "slug": annotation_step_key, + } + # -------------------------------------------------------------- + + if not steps_updated and steps_ready: + # edit steps/mappings in run ----------------------------------- + annotation_steps = [ + { + "key": step_key, + "references": { + "evaluator": evaluator_references[step_key], + }, + "inputs": [ + {"key": testset_step_key}, + {"key": invocation_step_key}, + ], + } + for step_key in annotation_steps_keys + ] + + steps += annotation_steps + + annotation_mappings = [ + { + "column": { + "kind": "annotation", + "name": metric_key["path"], + }, + "step": { + "key": step_key, + "path": f"attributes.ag.data.outputs.{metric_key['path']}", + }, + } + for step_key in annotation_steps_keys + for metric_key in annotation_metrics_keys[step_key] + ] + + mappings += annotation_mappings + + run_edit_request = EvaluationRunEditRequest( + run=EvaluationRunEdit( + id=run_id, + # + name=evaluation_run_response.run.name, + description=evaluation_run_response.run.description, + # + tags=evaluation_run_response.run.tags, + meta=evaluation_run_response.run.meta, + # + status=EvaluationStatus.RUNNING, + # + data={"steps": steps, "mappings": mappings}, + ) + ) + + evaluation_run_response = loop.run_until_complete( + evaluations_router.edit_run( + request=request, + run_id=run_id, + run_edit_request=run_edit_request, + ) + ) + + assert ( + evaluation_run_response.count != 0 + ), f"Failed to edit evaluation run {run_id}!" + # -------------------------------------------------------------- + steps_updated = True + + if not steps_ready: + # wait + steps_ready = True + + scenario_has_errors = 0 + scenario_status = EvaluationStatus.SUCCESS + + # skip the iteration if error in the invocation -------------------- + if invocation.result.error: + log.error( + f"There is an error in invocation {invocation.trace_id} so we skip its evaluation" + ) + + scenario_has_errors += 1 + run_has_errors += 1 + scenario_status = EvaluationStatus.ERRORS + run_status = EvaluationStatus.ERRORS + + error = invocation.result.error.model_dump(mode="json") is not None + + raw_metrics[invocation_step_key]["errors"].append(error is not None) + raw_metrics[invocation_step_key]["costs"].append(invocation.cost or 0.0) + raw_metrics[invocation_step_key]["duration"].append( + invocation.latency or 0.0 + ) + # ------------------------------------------------------------------ + + # proceed with the evaluation otherwise ---------------------------- + else: + raw_metrics[invocation_step_key]["costs"].append(invocation.cost or 0.0) + raw_metrics[invocation_step_key]["duration"].append( + invocation.latency or 0.0 + ) + + # run the evaluators if no error in the invocation ------------- + for jdx in range(nof_annotations): + autoeval_config = autoeval_configs[jdx] + annotation_step_key = annotation_steps_keys[jdx] + + step_has_errors = 0 + step_status = EvaluationStatus.SUCCESS + + references = { + "evaluator": evaluator_references[annotation_step_key], + "testset": {"id": testset_id}, + "testcase": {"id": str(testcase.id)}, + } + links = { + invocation_step_key: { + "trace_id": invocation.trace_id, + "span_id": invocation.span_id, + } + } + + hash_id = make_hash_id(references=references, links=links) + # log.debug("generating annotation with hash_id", hash_id=hash_id) + + # run evaluator -------------------------------------------- + result = loop.run_until_complete( + evaluators_service.evaluate( + evaluator_key=autoeval_config.evaluator_key, + output=invocation.result.value, + data_point=testcase.data, + settings_values=autoeval_config.settings_values, + app_params=revision_parameters, # type: ignore + inputs=testcase.data, + lm_providers_keys=providers_keys, + ) + ) + + trace_id = None + error = None + + # if error in evaluator, no annotation, only step ---------- + if result.error: + log.error( + f"There is an error in evaluation {autoeval_config.id} for invocation {invocation.trace_id} so we skip its evaluation" + ) + + step_has_errors += 1 + scenario_has_errors += 1 + run_has_errors += 1 + step_status = EvaluationStatus.FAILURE + scenario_status = EvaluationStatus.ERRORS + run_status = EvaluationStatus.ERRORS + + error = result.error.model_dump(mode="json") is not None + + raw_metrics[annotation_step_key]["errors"].append( + error is not None + ) + # ---------------------------------------------------------- + + # else, first annotation, then step ------------------------ + else: + outputs = None + + if isinstance(result.value, dict): + outputs = result.value + + else: + key = None + if result.type == "number": + key = "score" + elif result.type == "bool": + key = "success" + elif result.type == "text": + key = "note" + + outputs = {key: result.value} + + annotation_create_request = AnnotationCreateRequest( + annotation=AnnotationCreate( + origin=AnnotationOrigin.AUTO, + kind=AnnotationKind.EVAL, + channel=AnnotationChannel.API, # hardcoded + # + data={"outputs": outputs}, + # + references=references, + links=links, + ) + ) + + annotation_response = loop.run_until_complete( + annotations_router.create_annotation( + request=request, + annotation_create_request=annotation_create_request, + ) + ) + + assert ( + annotation_response.count != 0 + ), f"Failed to create annotation for invocation {invocation.trace_id} and autoeval {autoeval_config.id}" + + metrics = annotation_response.annotation.data.get("outputs", {}) + + for key in metrics: + if key not in raw_metrics[annotation_step_key]: + raw_metrics[annotation_step_key][key] = [] + + raw_metrics[annotation_step_key][key].append(metrics[key]) + + trace_id = annotation_response.annotation.trace_id + # ---------------------------------------------------------- + + steps_create_request = EvaluationStepsCreateRequest( + steps=[ + EvaluationStepCreate( + run_id=run_id, + scenario_id=scenario.id, + # + status=step_status, + # + key=annotation_step_key, + repeat_id=repeat_id, + retry_id=retry_id, + # + trace_id=trace_id, + error=error, + ) + ], + ) + + steps_response = loop.run_until_complete( + evaluations_router.create_steps( + request=request, + steps_create_request=steps_create_request, + ) + ) + + assert ( + steps_response.count == 1 + ), f"Failed to create evaluation step for scenario with id {scenario.id}!" + # ------------------------------------------------------------------ + + scenario_edit_request = EvaluationScenarioEditRequest( + scenario=EvaluationScenarioEdit( + id=scenario.id, + tags=scenario.tags, + meta=scenario.meta, + status=scenario_status, + ), + ) + + scenario_response = loop.run_until_complete( + evaluations_router.edit_scenario( + request=request, + scenario_id=scenario.id, + scenario_edit_request=scenario_edit_request, + ) + ) + + assert ( + scenario_response.count == 1 + ), f"Failed to edit evaluation scenario with id {scenario.id}!" + # ---------------------------------------------------------------------- + + except Exception as e: # pylint: disable=broad-exception-caught + log.error(f"An error occurred during evaluation: {e}") + traceback.print_exc() + + # edit celery task state to FAILURE ------------------------------------ + self.update_state(state=states.FAILURE) + + run_status = EvaluationStatus.FAILURE + + if run_status != EvaluationStatus.FAILURE: + try: + # process and save metrics ----------------------------------------- + metrics = process_metrics( + raw_metrics=raw_metrics, + invocation_steps_keys=[invocation_step_key], + annotation_steps_keys=annotation_steps_keys, + annotation_metrics_keys=annotation_metrics_keys, + ) + + metrics_data = {"outputs": metrics} + + metrics_create_request = EvaluationMetricsCreateRequest( + metrics=[ + EvaluationMetricCreate( + run_id=run_id, + # + status=EvaluationStatus.SUCCESS, + # + data=metrics_data, + ) + ], + ) + + metrics_response = loop.run_until_complete( + evaluations_router.create_metrics( + request=request, + metrics_create_request=metrics_create_request, + ) + ) + + assert ( + metrics_response.count == 1 + ), f"Failed to create evaluation metrics for run with id {run_id}!" + # ------------------------------------------------------------------ + + # log.debug("< metrics", metrics=metrics) + + except Exception as e: # pylint: disable=broad-exception-caught + log.error(f"An error occurred during aggregation: {e}") + traceback.print_exc() + + # edit celery task state to FAILURE -------------------------------- + self.update_state(state=states.FAILURE) + + run_status = EvaluationStatus.FAILURE + + # edit evaluation run status ----------------------------------------------- + run_edit_request = EvaluationRunEditRequest( + run=EvaluationRunEdit( + id=run_id, + # + name=evaluation_run_response.run.name, + description=evaluation_run_response.run.description, + # + tags=evaluation_run_response.run.tags, + meta=evaluation_run_response.run.meta, + # + status=run_status, + # + data=evaluation_run_response.run.data, + ) + ) + + evaluation_run_response = loop.run_until_complete( + evaluations_router.edit_run( + request=request, + run_id=run_id, + run_edit_request=run_edit_request, + ) + ) + + # edit meters to avoid conting failed evaluations -------------------------- + if run_status == EvaluationStatus.FAILURE: + loop.run_until_complete( + check_entitlements( + organization_id=project.organization_id, + key=Counter.EVALUATIONS, + delta=-1, + ) + ) + + +PERCENTILE_LEVELS = { + "p0.05": 0.05, + "p0.1": 0.1, + "p0.5": 0.5, + "p1": 1, + "p2.5": 2.5, + "p5": 5, + "p10": 10, + "p12.5": 12.5, + "p20": 20, + "p25": 25, + "p30": 30, + "p37.5": 37.5, + "p40": 40, + "p50": 50, + "p60": 60, + "p62.5": 62.5, + "p70": 70, + "p75": 75, + "p80": 80, + "p87.5": 87.5, + "p90": 90, + "p95": 95, + "p97.5": 97.5, + "p99": 99, + "p99.5": 99.5, + "p99.9": 99.9, + "p99.95": 99.95, +} +PERCENTILES_KEYS = list(PERCENTILE_LEVELS.keys()) +PERCENTILES_VALUES = list(PERCENTILE_LEVELS.values()) +IQR_LEVELS = { + "iqr25": ("p37.5", "p62.5"), + "iqr50": ("p25", "p75"), + "iqr60": ("p20", "p80"), + "iqr75": ("p12.5", "p87.5"), + "iqr80": ("p10", "p90"), + "iqr90": ("p5", "p95"), + "iqr95": ("p2.5", "p97.5"), + "iqr98": ("p1", "p99"), + "iqr99": ("p0.5", "p99.5"), + "iqr99.9": ("p0.05", "p99.95"), +} +IQR_ITEMS = list(IQR_LEVELS.items()) + + +def get_slug_from_name_and_id( + name: str, + id: UUID, # pylint: disable=redefined-builtin +) -> str: + # Normalize Unicode (e.g., é → e) + name = unicodedata.normalize("NFKD", name) + # Remove non-ASCII characters + name = name.encode("ascii", "ignore").decode("ascii") + # Lowercase and remove non-word characters except hyphens and spaces + name = re.sub(r"[^\w\s-]", "", name.lower()) + # Replace any sequence of hyphens or whitespace with a single hyphen + name = re.sub(r"[-\s]+", "-", name) + # Trim leading/trailing hyphens + name = name.strip("-") + # Last 12 characters of the ID + slug = f"{name}-{id.hex[-12:]}" + + return slug.lower() + + +def get_metrics_keys_from_schema(schema=None, path=()): + metrics = [] + + if not isinstance(schema, dict) or "type" not in schema: + return metrics + + metric_type = None + + t = schema["type"] + + if t == "object": + if "properties" in schema: + for key, prop in schema["properties"].items(): + metrics.extend(get_metrics_keys_from_schema(prop, path + (key,))) + else: + metric_type = "json" + + elif t == "array" and "items" in schema: + if schema["items"].get("type") == "string" and "enum" in schema["items"]: + metric_type = "categorical/multiple" + + elif t == "boolean": + metric_type = "binary" + + elif t == "string": + metric_type = "categorical/single" if "enum" in schema else "string" + + elif t == "number": + metric_type = "numeric/continuous" + + elif t == "integer": + metric_type = "numeric/discrete" + + if metric_type: + metrics.append({"path": ".".join(path), "type": metric_type}) + + return metrics + + +def get_metric_from_path(metrics: dict, path: str): + keys = path.split(".") + for key in keys: + if isinstance(metrics, dict) and key in metrics: + metrics = metrics[key] + else: + return None # or raise KeyError(key) + return metrics + + +def compute_count(values): + if not values: + return { + "count": None, + } + + _count = len(values) + + return { + "count": _count, + } + + +def compute_sum_mean(values): + if not values: + return { + "sum": None, + "mean": None, + } + + _sum = sum(values) + _mean = _sum / len(values) + + return { + "sum": _sum, + "mean": _mean, + } + + +def compute_min_max_range(values): + if not values: + return { + "min": None, + "max": None, + "range": None, + } + + _min = min(values) + _max = max(values) + _range = _max - _min + + return { + "min": _min, + "max": _max, + "range": _range, + } + + +def compute_frequency_unique_top(values, top_k=5): + if not values: + return { + "frequency": None, + "unique": None, + } + + _frequency = dict(StatisticsCounter(values)) + _unique = list(_frequency.keys()) + _rank = sorted(_frequency.items(), key=lambda x: x[1], reverse=True)[:top_k] + _rank = [{"value": value, "count": count} for (value, count) in _rank] + _frequency = [{"value": k, "count": v} for k, v in _frequency.items()] + + return { + "frequency": _frequency, + "unique": _unique, + "rank": _rank, + } + + +def compute_percentiles_iqrs(values): + if not values or len(values) < 2: + return { + "percentiles": None, + "iqrs": None, + } + + _percentiles = dict( + zip( + PERCENTILES_KEYS, + numpy.percentile(values, PERCENTILES_VALUES).tolist(), + ) + ) + + _iqrs = { + label: _percentiles[high] - _percentiles[low] + for label, (low, high) in IQR_ITEMS + } + + return { + "percentiles": _percentiles, + "iqrs": _iqrs, + } + + +def compute_distribution( + values, + *, + min_value=None, + max_value=None, + discrete=False, +): + _distribution = _compute_distribution( + values, + min_value=min_value, + max_value=max_value, + discrete=discrete, + ) + + _distribution = _normalize_distribution( + _distribution, + ) + + return { + "distribution": _distribution, + } + + +def _compute_distribution( + values, + *, + min_value=None, + max_value=None, + discrete=False, +): + if not values: + return None + + if discrete: + counter = StatisticsCounter(values) + + _distribution = [{"value": k, "count": v} for k, v in sorted(counter.items())] + + return _distribution + + n = len(values) + bins = math.ceil(math.sqrt(n)) + + min_value = min(values) if min_value is None else min_value + max_value = max(values) if max_value is None else max_value + + if min_value == max_value: + _distribution = [{"value": min_value, "count": n}] + + return _distribution + + bin_size = (max_value - min_value) / bins + precision = max(0, -int(math.floor(math.log10(bin_size)))) if bin_size else 0 + + hist = {} + for v in values: + bin_index = int((v - min_value) / bin_size) + if bin_index == bins: + bin_index -= 1 + bin_start = round(min_value + bin_index * bin_size, precision) + hist[bin_start] = hist.get(bin_start, 0) + 1 + + _distribution = [{"value": k, "count": v} for k, v in sorted(hist.items())] + + return _distribution + + +def _normalize_distribution(distribution): + if not distribution: + return [] + + total_count = sum(item["count"] for item in distribution) + if total_count == 0: + return distribution + + normalized_distribution = [ + {"value": item["value"], "count": item["count"] / total_count} + for item in distribution + ] + + return normalized_distribution + + +def _process_binary_metric(metric): + if not metric: + return {} + + return compute_count(metric) | compute_frequency_unique_top(metric) + + +def _process_string_metric(metric): + if not metric: + return {} + + return compute_count(metric) + + +def _process_json_metric(metric): + if not metric: + return {} + + return compute_count(metric) + + +def _process_continuous_metric(metric): + if not metric: + return {} + + return ( + compute_count(metric) + | compute_sum_mean(metric) + | compute_min_max_range(metric) + | compute_distribution(metric) + | compute_percentiles_iqrs(metric) + ) + + +def _process_discrete_metric(metric): + if not metric: + return {} + + return ( + compute_count(metric) + | compute_sum_mean(metric) + | compute_min_max_range(metric) + | compute_distribution(metric, discrete=True) + | compute_percentiles_iqrs(metric) + ) + + +def _process_class_metric(metric): + if not metric: + return {} + + return compute_count(metric) | compute_frequency_unique_top(metric) + + +def _process_labels_metric(metric): + if not metric: + return {} + + flat_metric = list( + itertools.chain.from_iterable( + sublist if sublist else [None] for sublist in metric + ) + ) + + count_metric = [len(labels) for labels in metric] + + return ( + compute_count(flat_metric) + | compute_frequency_unique_top(flat_metric) + | compute_distribution(count_metric, discrete=True) + ) + + +def process_metrics( + raw_metrics, + invocation_steps_keys, + annotation_steps_keys, + annotation_metrics_keys, +): + metrics = dict() + + # invocations metrics ------------------------------------------------------ + for invocation_step_key in invocation_steps_keys: + duration = raw_metrics[invocation_step_key]["duration"] + duration_statistics = _process_continuous_metric(metric=duration) + + errors = raw_metrics[invocation_step_key]["errors"] + errors_statistics = _process_binary_metric(metric=errors) + + costs = raw_metrics[invocation_step_key]["costs"] + costs_statistics = _process_continuous_metric(metric=costs) + + tokens = raw_metrics[invocation_step_key]["tokens"] + tokens_statistics = _process_discrete_metric(metric=tokens) + + metrics[invocation_step_key] = { + "duration": duration_statistics, + "errors": errors_statistics, + "costs": costs_statistics, + "tokens": tokens_statistics, + } + + # annotation metrics ------------------------------------------------------- + for annotation_step_key in annotation_steps_keys: + errors = raw_metrics[annotation_step_key]["errors"] + errors_statistics = _process_binary_metric(metric=errors) + + if annotation_step_key not in annotation_metrics_keys: + log.warn(f"slug {annotation_step_key} not found in metrics keys. Skipping.") + continue + + metrics_keys = annotation_metrics_keys[annotation_step_key] + + if not metrics_keys: + log.warn(f"No metrics keys found for slug {annotation_step_key}. Skipping.") + continue + + metric_statistics = {} + + for metric_key in metrics_keys: + metric_path = metric_key["path"] + metric_type = metric_key["type"] + + metric = get_metric_from_path( + metrics=raw_metrics[annotation_step_key], + path=metric_path, + ) + + match metric_type: + case "numeric/continuous": + path_statistics = _process_continuous_metric(metric=metric) + case "numeric/discrete": + path_statistics = _process_discrete_metric(metric=metric) + case "binary": + path_statistics = _process_binary_metric(metric=metric) + case "categorical/single": + path_statistics = _process_class_metric(metric=metric) + case "categorical/multiple": + path_statistics = _process_labels_metric(metric=metric) + case "string": + path_statistics = _process_string_metric(metric=metric) + case "json": + path_statistics = _process_json_metric(metric=metric) + case _: + log.warning( + f"Unknown metric type {metric_type} for path {metric_path}. Skipping." + ) + continue + + metric_statistics[metric_path] = path_statistics + + metrics[annotation_step_key] = { + "errors": errors_statistics, + **metric_statistics, + } + + return metrics diff --git a/api/ee/src/utils/permissions.py b/api/ee/src/utils/permissions.py index 312bcb05b6..584ad76427 100644 --- a/api/ee/src/utils/permissions.py +++ b/api/ee/src/utils/permissions.py @@ -157,46 +157,46 @@ async def check_action_access( return has_permission -# async def check_apikey_action_access( -# api_key: str, user_id: str, permission: Permission -# ): -# """ -# Check if an api key belongs to a user for a workspace and has the right permission. - -# Args: -# api_key (str): The api key -# user_id (str): The user (owner) ID of the api_key -# permission (Permission): The permission to check for. -# """ - -# api_key_prefix = api_key.split(".")[0] -# api_key_db = await db_manager.get_user_api_key_by_prefix( -# api_key_prefix=api_key_prefix, user_id=user_id -# ) -# if api_key_db is None: -# raise HTTPException( -# 404, {"message": f"API Key with prefix {api_key_prefix} not found"} -# ) - -# project_db = await db_manager.get_project_by_id( -# project_id=str(api_key_db.project_id) -# ) -# if project_db is None: -# raise HTTPException( -# 404, -# {"message": f"Project with ID {str(api_key_db.workspace_id)} not found"}, -# ) - -# has_access = await check_project_has_role_or_permission( -# project_db, str(api_key_db.created_by_id), None, permission -# ) -# if not has_access: -# raise HTTPException( -# 403, -# { -# "message": "You do not have access to perform this action. Please contact your organization admin." -# }, -# ) +async def check_apikey_action_access( + api_key: str, user_id: str, permission: Permission +): + """ + Check if an api key belongs to a user for a workspace and has the right permission. + + Args: + api_key (str): The api key + user_id (str): The user (owner) ID of the api_key + permission (Permission): The permission to check for. + """ + + api_key_prefix = api_key.split(".")[0] + api_key_db = await db_manager.get_user_api_key_by_prefix( + api_key_prefix=api_key_prefix, user_id=user_id + ) + if api_key_db is None: + raise HTTPException( + 404, {"message": f"API Key with prefix {api_key_prefix} not found"} + ) + + project_db = await db_manager.get_project_by_id( + project_id=str(api_key_db.project_id) + ) + if project_db is None: + raise HTTPException( + 404, + {"message": f"Project with ID {str(api_key_db.workspace_id)} not found"}, + ) + + has_access = await check_project_has_role_or_permission( + project_db, str(api_key_db.created_by_id), None, permission + ) + if not has_access: + raise HTTPException( + 403, + { + "message": "You do not have access to perform this action. Please contact your organization admin." + }, + ) async def check_rbac_permission( diff --git a/api/ee/tests/manual/evaluations/sdk/openai_agent.py b/api/ee/tests/manual/evaluations/sdk/openai_agent.py deleted file mode 100644 index 575e370c7d..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/openai_agent.py +++ /dev/null @@ -1,98 +0,0 @@ -# /// script -# dependencies = ["agenta", "openai-agents", "openinference-instrumentation-openai-agents", "ipdb", "opentelemetry-api", "opentelemetry-sdk"] -# /// - -from agents import ( - Agent, - InputGuardrail, - GuardrailFunctionOutput, - Runner, - WebSearchTool, - run_demo_loop, -) -from agents.exceptions import InputGuardrailTripwireTriggered -from pydantic import BaseModel -import asyncio -from dotenv import load_dotenv -import os - -load_dotenv() -import agenta as ag - -# from openinference.instrumentation.openai_agents import OpenAIAgentsInstrumentor -# from opentelemetry import trace -# from opentelemetry.sdk.trace.export import ConsoleSpanExporter, BatchSpanProcessor -# from opentelemetry.sdk.trace import ReadableSpan -# from opentelemetry.sdk.trace.export import SpanProcessor -# from opentelemetry.trace import Span -from typing import Optional - -# os.environ["AGENTA_API_KEY"] = "" - -# ag.init() -# OpenAIAgentsInstrumentor().instrument() - - -class AgentaQuestionOutput(BaseModel): - is_agenta_question: bool - reasoning: str - - -guardrail_agent = Agent( - name="Guardrail check", - instructions="Check if the user is asking something about Agenta, the LLMOps platform. Their question might be ambiguous, so you need to be careful.", - output_type=AgentaQuestionOutput, - model="gpt-4o-mini", -) - -web_research_agent = Agent( - name="Web Research Agent", - handoff_description="Specialist agent for web research. You will use this agent to research the user's question when the documentation is not enough. You mainly search the websites agenta.ai and docs.agenta.ai", - instructions="You will search the web to answer the user's question about Agenta, the LLMOps platform.", - tools=[ - WebSearchTool(), - ], - model="gpt-4o-mini", -) - - -async def guardrail_function(ctx, agent, input_data): - result = await Runner.run(guardrail_agent, input_data, context=ctx.context) - final_output = result.final_output_as(AgentaQuestionOutput) - return GuardrailFunctionOutput( - output_info=final_output, - tripwire_triggered=not final_output.is_agenta_question, - ) - - -triage_agent = Agent( - name="Triage Agent", - instructions="You determine which agent to use based on the user's question on agenta", - handoffs=[web_research_agent], - input_guardrails=[ - InputGuardrail(guardrail_function=guardrail_function), - ], - model="gpt-4o-mini", -) - -# async def main(): -# # Example 1: History question -# # agent = Agent(name="Assistant", instructions="You are a helpful assistant.") -# await run_demo_loop(triage_agent) - -# # try: -# # result = await Runner.run(triage_agent, "What is the meaning of life?") -# # import ipdb; ipdb.set_trace() -# # print(result.final_output) -# # except InputGuardrailTripwireTriggered as e: -# # print("Guardrail blocked this input:", e) - -# # # Example 2: General/philosophical question -# # try: -# # result = await Runner.run(triage_agent, "What is the meaning of life?") -# # print(result.final_output) -# # except InputGuardrailTripwireTriggered as e: -# # print("Guardrail blocked this input:", e) - -# if __name__ == "__main__": -# asyncio.run(main()) diff --git a/api/ee/tests/manual/evaluations/sdk/quick_start.py b/api/ee/tests/manual/evaluations/sdk/quick_start.py deleted file mode 100644 index a60fdebfc9..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/quick_start.py +++ /dev/null @@ -1,206 +0,0 @@ -""" -Agenta SDK Quick Start Tutorial -================================ - -This tutorial demonstrates how to: -1. Create a simple application that returns country capitals -2. Create evaluators to check if the application's output is correct -3. Run an evaluation to test your application - -The new @application and @evaluator decorators make this simple and intuitive! -""" - -from dotenv import load_dotenv - -load_dotenv() - -import asyncio -import random - -from agenta.sdk.evaluations import aevaluate, display - -import agenta as ag -from agenta.sdk.workflows import builtin - -# Initialize Agenta SDK -ag.init() - - -# Test data: countries and their capitals -my_testcases_data = [ - {"country": "Germany", "capital": "Berlin"}, - {"country": "France", "capital": "Paris"}, - {"country": "Spain", "capital": "Madrid"}, - {"country": "Italy", "capital": "Rome"}, -] - - -# ============================================================================ -# STEP 1: Define your application -# ============================================================================ - - -@ag.application( - slug="capital_quiz_app", - # - name="Capital Quiz Application", - description="Returns the capital of a given country (sometimes incorrectly for testing)", -) -async def capital_quiz_app(capital: str, country: str): - """ - A simple application that returns country capitals. - - Args: - capital: The expected capital (from testcase) - country: The country name (from testcase) - - Returns: - The capital city name (sometimes wrong for testing purposes) - """ - # Randomly return wrong answer for testing - chance = random.choice([True, False, True]) - return capital if chance else "Aloha" - - -# ============================================================================ -# STEP 2: Define your evaluators -# ============================================================================ - - -@ag.evaluator( - slug="exact_match_evaluator", - # - name="Exact Match Evaluator", - description="Checks if the application's output exactly matches the expected capital", -) -async def exact_match_evaluator(capital: str, outputs: str): - """ - Evaluates if the application's output matches the expected answer. - - Args: - capital: The expected capital (from testcase) - outputs: What the application returned - - Returns: - Dictionary with score and success flag - """ - is_correct = outputs == capital - return { - "score": 1 if is_correct else 0, - "success": is_correct, - } - - -@ag.evaluator( - slug="random_score_evaluator", - # - name="Random Score Evaluator", - description="Assigns a random score (for demonstration purposes)", -) -async def random_score_evaluator(capital: str): - """ - A demo evaluator that assigns random scores. - - Args: - capital: The expected capital (from testcase, not used but shows it's available) - - Returns: - Dictionary with random score - """ - score = random.randint(0, 100) - return { - "myscore": score, - "success": score > 30, - } - - -# ============================================================================ -# STEP 3: Use builtin evaluators -# ============================================================================ - -# You can also use Agenta's builtin evaluators like LLM-as-a-judge -llm_judge_evaluator = builtin.auto_ai_critique( - slug="llm_judge_evaluator", - # - name="LLM Judge Evaluator", - description="Uses an LLM to judge if the answer is correct", - # - correct_answer_key="capital", - prompt_template=[ - { - "role": "system", - "content": "You are a judge that evaluates geography knowledge.", - }, - { - "role": "user", - "content": ( - "The correct capital is: {{capital}}\n" - "The student's answer is: {{outputs}}\n\n" - "Is the student's answer correct?\n" - "Respond with ONLY a number from 0.0 (completely wrong) to 1.0 (completely correct).\n" - "Nothing else - just the number." - ), - }, - ], -) - - -# ============================================================================ -# STEP 4: Run the evaluation -# ============================================================================ - - -async def run_evaluation(): - """Create a testset and run evaluation with your app and evaluators.""" - - # Create a testset from your test data - print("Creating testset...") - my_testset = await ag.testsets.aupsert( - name="Country Capitals", - data=my_testcases_data, - ) - - if not my_testset or not my_testset.id: - print("❌ Failed to create testset") - return None - - print(f"✅ Testset created with {len(my_testcases_data)} test cases\n") - - # Run evaluation - print("Running evaluation...") - eval_result = await aevaluate( - testsets=[my_testset.id], - applications=[capital_quiz_app], - evaluators=[ - exact_match_evaluator, - random_score_evaluator, - llm_judge_evaluator, - ], - ) - - return eval_result - - -async def main(): - """Main entry point.""" - print("=" * 70) - print("Agenta SDK Quick Start Tutorial") - print("=" * 70) - print() - - eval_data = await run_evaluation() - - if not eval_data: - print("❌ Evaluation failed") - exit(1) - - print("\n" + "=" * 70) - print("Evaluation Results") - print("=" * 70) - # await display(eval_data) - - print("\n✅ Tutorial complete!") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/api/ee/tests/manual/evaluations/sdk/requirements.txt b/api/ee/tests/manual/evaluations/sdk/requirements.txt deleted file mode 100644 index 3d152e9bfe..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -openai-agents -openinference-instrumentation-openai-agents -dotenv \ No newline at end of file diff --git a/api/ee/tests/manual/evaluations/sdk/test_handlers.py b/api/ee/tests/manual/evaluations/sdk/test_handlers.py deleted file mode 100644 index 4808a14421..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/test_handlers.py +++ /dev/null @@ -1,202 +0,0 @@ -import os - -from dotenv import load_dotenv - -load_dotenv() - -from fastapi import FastAPI - -os.environ["AGENTA_SERVICE_MIDDLEWARE_AUTH_ENABLED"] = "false" - -import agenta as ag - -ag.init() - - -from agenta.sdk.models.workflows import ( - WorkflowServiceBatchResponse, - WorkflowServiceStreamResponse, - WorkflowServiceRequestData, - WorkflowServiceResponseData, -) -from agenta.sdk.decorators.routing import ( - route, - default_app, - create_app, -) -from agenta.sdk.decorators.running import ( - WorkflowServiceRequest, - workflow, -) - -custom_app = create_app() - -public_app = FastAPI() - -public_app.mount("/services", app=default_app) - -app = public_app - - -@route("/tokens-async", app=default_app) -async def async_gen(request: WorkflowServiceRequest): - for i in range((request.data.inputs or {}).get("count", 3)): - yield {"async_token": chr(97 + i)} - - -""" -curl -i -N \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-async/invoke -""" - -""" -curl -i -N \ - -H "Accept: text/event-stream" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-async/invoke -""" - - -@route("/tokens-sync", app=default_app) -def sync_tokens(request: WorkflowServiceRequest): - for i in range((request.data.inputs or {}).get("count", 2)): - yield {"async_token": chr(120 + i)} - - -""" -curl -i -N \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-sync/invoke -""" - -""" -curl -i -N \ - -H "Accept: text/event-stream" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-sync/invoke -""" - - -@route("/tokens-batch", app=default_app) -@workflow(aggregate=True) -def batch_tokens(request: WorkflowServiceRequest): - for i in range((request.data.inputs or {}).get("count", 2)): - yield {"token": chr(ord("A") + i)} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-batch/invoke -""" - - -@route("/greet-async", app=default_app) -async def greet(request: WorkflowServiceRequest): - name = (request.data.inputs or {}).get("name", "world") - return {"message": f"Hello, {name}!"} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"name": "Agenta"}}}' \ - http://127.0.0.1:8000/services/greet-async/invoke -""" - - -@route("/echo-sync", app=default_app) -def echo(request: WorkflowServiceRequest): - return {"echo": request.data.inputs} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/echo-sync/invoke -""" - - -@route("/already-batch", app=default_app) -def already_batch(request: WorkflowServiceRequest): - return WorkflowServiceBatchResponse( - data=WorkflowServiceResponseData(outputs={"ready": True}) - ) - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/already-batch/invoke -""" - - -@route("/already-stream", app=default_app) -def already_stream(request: WorkflowServiceRequest): - async def iterator(): - yield {"ready": "no"} - yield {"ready": "go"} - - return WorkflowServiceStreamResponse(generator=iterator) - - -""" -curl -i -N \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/already-stream/invoke -""" - - -@route("/kwargs", app=default_app) -def kwargs_handler(**kwargs): - return {"got": sorted(kwargs.keys())} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/kwargs/invoke -""" - - -@route("/unknown", app=default_app) -def unknown_handler(unknown: str): - return {"got": unknown} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/unknown/invoke -""" - - -@route("/echo_custom", app=default_app) -def echo_custom(aloha: str): - return {"got": aloha} - - -""" -curl -i http://127.0.0.1:8000/services/echo_custom/inspect -""" - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/echo_custom/invoke -""" diff --git a/api/ee/tests/manual/evaluations/sdk/test_local.py b/api/ee/tests/manual/evaluations/sdk/test_local.py deleted file mode 100644 index 579770c6a9..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/test_local.py +++ /dev/null @@ -1,680 +0,0 @@ -import asyncio - -from dotenv import load_dotenv - -load_dotenv() - -import agenta as ag - -ag.init() - -from agenta.sdk.models.workflows import ( - WorkflowServiceRequestData, - WorkflowServiceResponseData, - WorkflowServiceRequest, -) -from agenta.sdk.decorators.running import workflow -from agenta.sdk.decorators.tracing import instrument -from agenta.sdk.workflows import builtin - -print("-----------------------------------------------------------------------") - -from agenta.sdk.workflows.handlers import echo_v0 - - -@instrument(annotate=True) -def echo_custom(aloha: str): - return {"got": aloha} - - -echo_manual = workflow(uri="echo")() - - -print(echo_custom(aloha="mahalo"), echo_custom) -print(echo_v0(aloha="mahalo"), echo_v0) -print(echo_manual(aloha="mahalo"), echo_manual) - - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_exact_match = builtin.auto_exact_match() - -print( - builtin_auto_exact_match( - inputs={"correct_answer": "mahalo"}, - outputs="mahalo", - ), - builtin_auto_exact_match, -) -print( - builtin_auto_exact_match( - inputs={"correct_answer": "mahalo"}, - outputs="mahala", - ), - builtin_auto_exact_match, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_exact_match.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - - -builtin_auto_regex_test = builtin.auto_regex_test( - regex_pattern="^ma.*o$", -) - -print( - builtin_auto_regex_test( - outputs="mahalo", - ), - builtin_auto_regex_test, -) - -print( - builtin_auto_regex_test( - outputs="mahala", - ), - builtin_auto_regex_test, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_regex_test.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_field_match_test = builtin.field_match_test( - json_field="answer", - correct_answer_key="aloha", -) - -print( - builtin_field_match_test( - inputs={"aloha": "mahalo"}, - outputs={"answer": "mahalo"}, - ), - builtin_field_match_test, -) - -print( - builtin_field_match_test( - inputs={"aloha": "mahalo"}, - outputs={"answer": "mahala"}, - ), - builtin_field_match_test, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_field_match_test.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -print("auto_webhook_test") - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_custom_code_run = builtin.auto_custom_code_run( - code="evaluate = lambda app_params, inputs, output, correct_answer: 1.0 if output in correct_answer else 0.0", -) - -print( - asyncio.run( - builtin_auto_custom_code_run( - inputs={"correct_answer": "mahalo"}, - outputs="mahalo", - ) - ), - builtin_auto_custom_code_run, -) - - -print( - asyncio.run( - builtin_auto_custom_code_run( - inputs={"correct_answer": "mahalo"}, - outputs="mahala", - ) - ), - builtin_auto_custom_code_run, -) - - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_custom_code_run.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_ai_critique = builtin.auto_ai_critique( - prompt_template=[ - { - "role": "system", - "content": "You are an evaluator grading an LLM App.\nYou will be given INPUTS, the LLM APP OUTPUT, the CORRECT ANSWER used in the LLM APP.\n\n- Ensure that the LLM APP OUTPUT has the same meaning as the CORRECT ANSWER\n\n\n\n-The score should be between 0 and 1 with one decimal point\n-A score of 1 means that the answer is perfect. This is the highest (best) score. Only when perfect match, otherwise something betweeen 0 and 1.\nA score of 0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give.\n\n\n\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER\n", - }, - { - "role": "user", - "content": "{{correct_answer}}\n{{prediction}}", - }, - ], -) - -print( - asyncio.run( - builtin_ai_critique( - inputs={ - "country": "Germany", - "correct_answer": "Berlin", - }, - outputs="Berlin", - ) - ), - builtin_ai_critique, -) - -print( - asyncio.run( - builtin_ai_critique( - inputs={ - "country": "Germany", - "correct_answer": "Berlin", - }, - outputs="Paris", - ) - ), - builtin_ai_critique, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_ai_critique.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run( - builtin_ai_critique.invoke( - request=WorkflowServiceRequest( - data=WorkflowServiceRequestData( - inputs={ - "country": "Germany", - "correct_answer": "Berlin", - }, - outputs="Berlin", - ) - ) - ) - ).model_dump(mode="json", exclude_none=True), - builtin_ai_critique, -) - -print( - asyncio.run( - builtin_ai_critique.invoke( - request=WorkflowServiceRequest( - data=WorkflowServiceRequestData( - inputs={ - "country": "Germany", - "correct_answer": "Berlin", - }, - outputs="Paris", - ) - ) - ) - ).model_dump(mode="json", exclude_none=True), - builtin_ai_critique, -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_starts_with = builtin.auto_starts_with( - prefix="ma", -) - -print( - builtin_auto_starts_with( - outputs="mahalo", - ), - builtin_auto_starts_with, -) - -print( - builtin_auto_starts_with( - outputs="mohalo", - ), - builtin_auto_starts_with, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_starts_with.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_ends_with = builtin.auto_ends_with( - suffix="lo", -) - -print( - builtin_auto_ends_with( - outputs="mahalo", - ), - builtin_auto_ends_with, -) - -print( - builtin_auto_ends_with( - outputs="mahala", - ), - builtin_auto_ends_with, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_ends_with.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_contains = builtin.auto_contains( - substring="ha", -) - -print( - builtin_auto_contains( - outputs="mahalo", - ), - builtin_auto_contains, -) - -print( - builtin_auto_contains( - outputs="maala", - ), - builtin_auto_contains, -) - - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_contains.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_contains_any = builtin.auto_contains_any( - substrings=["maha", "lo"], -) - -print( - builtin_auto_contains_any( - outputs="mahalo", - ), - builtin_auto_contains_any, -) - -print( - builtin_auto_contains_any( - outputs="mohala", - ), - builtin_auto_contains_any, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_contains_any.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_contains_all = builtin.auto_contains_all( - substrings=["maha", "lo"], -) - -print( - builtin_auto_contains_all( - outputs="mahalo", - ), - builtin_auto_contains_all, -) - -print( - builtin_auto_contains_all( - outputs="mahala", - ), - builtin_auto_contains_all, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_contains_all.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_contains_json = builtin.auto_contains_json() - -print( - builtin_auto_contains_json( - outputs='{"aloha": "mahalo"}', - ), - builtin_auto_contains_json, -) - -print( - builtin_auto_contains_json( - outputs={"aloha": "mahalo"}, - ), - builtin_auto_contains_json, -) - -print( - builtin_auto_contains_json( - outputs="mahala", - ), - builtin_auto_contains_json, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_contains_json.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_json_diff = builtin.auto_json_diff() - -print( - builtin_auto_json_diff( - inputs={"correct_answer": {"aloha": "mahalo"}}, - outputs={"aloha": "mahalo"}, - ), - builtin_auto_json_diff, -) - -print( - builtin_auto_json_diff( - inputs={"correct_answer": {"aloha": "mahalo"}}, - outputs={"mahalo": "aloha"}, - ), - builtin_auto_json_diff, -) - - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_json_diff.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - - -builtin_auto_levenshtein_distance = builtin.auto_levenshtein_distance( - threshold=0.9, -) - -print( - builtin_auto_levenshtein_distance( - inputs={"correct_answer": "mahalo"}, - outputs="mahalo", - ), - builtin_auto_levenshtein_distance, -) - -print( - builtin_auto_levenshtein_distance( - inputs={"correct_answer": "mahalo"}, - outputs="mahala", - ), - builtin_auto_levenshtein_distance, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_levenshtein_distance.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_similarity_match = builtin.auto_similarity_match( - threshold=0.9, -) - -print( - builtin_auto_similarity_match( - inputs={"correct_answer": "mahalo"}, - outputs="mahalo", - ), - builtin_auto_similarity_match, -) - -print( - builtin_auto_similarity_match( - inputs={"correct_answer": "mahalo"}, - outputs="mohala", - ), - builtin_auto_similarity_match, -) - - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_similarity_match.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_auto_semantic_similarity = builtin.auto_semantic_similarity( - threshold=0.9, -) - -print( - asyncio.run( - builtin_auto_semantic_similarity( - inputs={"correct_answer": "mahalo"}, - outputs="mahalo", - ) - ), - builtin_auto_semantic_similarity, -) - -print( - asyncio.run( - builtin_auto_semantic_similarity( - inputs={"correct_answer": "mahalo"}, - outputs="mohala", - ) - ), - builtin_auto_semantic_similarity, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_auto_semantic_similarity.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_completion = builtin.completion( - config=builtin.SinglePromptConfig( - **{ - "prompt": { - "messages": [ - { - "role": "user", - "content": "What's the capital of {{country}}?", - } - ] - } - } # type: ignore - ), -) - -print( - asyncio.run( - builtin_completion( - inputs={"country": "Germany"}, - ) - ), - builtin_completion, -) - - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_completion.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - - -print("-----------------------------------------------------------------------") -print() -print("-----------------------------------------------------------------------") - -builtin_chat = builtin.chat( - config=builtin.SinglePromptConfig( - **{ - "prompt": { - "messages": [ - { - "role": "assistant", - "content": "Always respond in uppercase.", - } - ] - } - } - ), -) - -print( - asyncio.run( - builtin_chat( - messages=[ - { - "role": "user", - "content": "What's the capital of Germany?", - } - ] - ) - ), - builtin_chat, -) - -print("-----------------------------------------------------------------------") - -print( - asyncio.run(builtin_chat.inspect()).model_dump( - mode="json", - exclude_none=True, - ), -) - - -print("-----------------------------------------------------------------------") diff --git a/api/ee/tests/manual/evaluations/sdk/test_loop.py b/api/ee/tests/manual/evaluations/sdk/test_loop.py deleted file mode 100644 index 0e933ee24d..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/test_loop.py +++ /dev/null @@ -1,152 +0,0 @@ -import asyncio -import random - -from dotenv import load_dotenv - -load_dotenv() - -import agenta as ag - -ag.init() - -from agenta.sdk.decorators import application, evaluator -from agenta.sdk.workflows import builtin -from agenta.sdk.evaluations import aevaluate, display - - -my_testcases_data = [ - { - "country": "Germany", - "capital": "Berlin", - }, - { - "country": "France", - "capital": "Paris", - }, - { - "country": "Spain", - "capital": "Madrid", - }, - { - "country": "Italy", - "capital": "Rome", - }, -] - - -@application( - slug="my_application", - # - name="my_application", - description="A simple workflow that returns the capital of a country", - # - parameters=dict(aloha="mahalo"), -) -async def my_application(capital: str, country: str): - chance = random.choice([True, False, True]) - _outputs = capital if chance else "Aloha" - - return _outputs - - -@evaluator( - slug="my_match_workflow", - # - name="my_match_workflow", - description="A simple workflow that returns the capital of a country", - # - parameters=dict(aloha="mahalo"), -) -async def my_match_evaluator(capital: str, outputs: str): - _outputs = { - "score": outputs == capital and 1 or 0, - "success": outputs == capital, - } - - return _outputs - - -@evaluator( - slug="my_random_evaluator", - # - name="my_random_evaluator", - description="A simple evaluator that returns a random score", -) -async def my_random_evaluator(capital: str): - score = random.randint(0, 100) - _outputs = { - "myscore": score, - "success": score > 30, - } - - return _outputs - - -my_llm_as_a_judge_evaluator = builtin.auto_ai_critique( - slug="my_llm_as_a_judge_evaluator", - # - name="my_llm_as_a_judge_evaluator", - description="Use an LLM to judge if the previous answer is correct", - # - correct_answer_key="capital", - model="openai/gpt-4o-mini", - prompt_template=[ - { - "role": "system", - "content": "You are a judge that evaluates if the previous answer is correct.", - }, - { - "role": "user", - "content": ( - "The correct answer is {{capital}}.\n" - "The previous answer is {{outputs}}.\n" - "Is the previous answer correct? Answer with a decimal 'score' from 0.0 to 1.0. " - "Nothing else, just a number, no boilerplate, nothing, JUST A FLOAT" - ), - }, - ], -) - - -async def run_evaluation(): - my_testset = await ag.testsets.aupsert( - name="Capitals", - # - data=my_testcases_data, - ) - - if not my_testset or not my_testset.id: - print("Failed to create or update testset") - return None - - eval = await aevaluate( - name="Capital Evaluation", - description="An evaluation to test the capitals application", - # - testsets=[ - my_testset.id, - ], - applications=[ - my_application, - ], - evaluators=[ - my_match_evaluator, - my_random_evaluator, - my_llm_as_a_judge_evaluator, - ], - ) - - return eval - - -async def main(): - eval_data = await run_evaluation() - - if not eval_data: - exit(1) - - # await display(eval_data) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/api/ee/tests/manual/evaluations/sdk/test_loop_agent.py b/api/ee/tests/manual/evaluations/sdk/test_loop_agent.py deleted file mode 100644 index 05627865f0..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/test_loop_agent.py +++ /dev/null @@ -1,208 +0,0 @@ -import asyncio -import random - -from dotenv import load_dotenv - -load_dotenv() - -import agenta as ag - -ag.init() - -from agenta.sdk.decorators import application, evaluator -from agenta.sdk.workflows import builtin -from agenta.sdk.evaluations import aevaluate, display - -from agents import Runner -from agents.exceptions import InputGuardrailTripwireTriggered - -from openai_agent import triage_agent - -from openinference.instrumentation.openai_agents import OpenAIAgentsInstrumentor - -OpenAIAgentsInstrumentor().instrument() - - -my_testcases_data = [ - { - "question": "What is agenta?", - "rubic": "The answer should mention llmops platform and open-source", - "guardrail": False, - }, - { - "question": "How much does agenta cost?", - "rubic": "The answer should mention the three pricing tiers, the cost in usd, how much traces costs, retention periods, features, and the free tier", - "guardrail": False, - }, - { - "question": "How do I use azure in Agenta?", - "rubic": "The answer should mention the azure provider and the steps to set it up in the model hub", - "guardrail": False, - }, - { - "question": "What is the meaning of life?", - "rubic": "The agent should refuse to answer", - "guardrail": True, - }, -] - - -@application( - slug="agenta_agent", - # - name="agenta_agent", - description="A simple workflow that returns the answer to a question", -) -async def agenta_agent( - question: str, -): - try: - outputs = await Runner.run(triage_agent, question) - return outputs.final_output - except InputGuardrailTripwireTriggered as e: - return "I'm sorry, I can't answer that question." - - -@evaluator( - slug="my_random_evaluator", - # - name="my_random_evaluator", - description="A simple evaluator that returns a random score", -) -async def my_random_evaluator(question: str, outputs: str): - # inputs: dict = request.data.inputs # type:ignore - score = random.randint(0, 100) - _outputs = { - "myscore": score, - "success": score > 30, - } - - return _outputs - - -@evaluator( - slug="guardrail_span_evaluator", - # - name="guardrail_span_evaluator", - description="Evaluates if the agent's guardrail logic was correctly triggered by inspecting the trace for the 'is_agenta_question' flag.", -) -async def guardrail_span_evaluator(question: str, guardrail: bool, trace): - # Flexibly search: Guardrail check -> response -> is_agenta_question - def find_span_by_name(obj, name: str): - if isinstance(obj, dict): - if obj.get("span_name") == name: - return obj - for value in obj.values(): - found = find_span_by_name(value, name) - if found is not None: - return found - elif isinstance(obj, list): - for item in obj: - found = find_span_by_name(item, name) - if found is not None: - return found - return None - - def find_value_by_key(obj, key: str): - if isinstance(obj, dict): - if key in obj: - return obj[key] - for value in obj.values(): - found = find_value_by_key(value, key) - if found is not None: - return found - elif isinstance(obj, list): - for item in obj: - found = find_value_by_key(item, key) - if found is not None: - return found - return None - - guardrail_span = find_span_by_name(trace, "Guardrail check") - response_span = ( - find_span_by_name(guardrail_span, "response") if guardrail_span else None - ) - detected_is_agenta = ( - find_value_by_key(response_span, "is_agenta_question") - if response_span - else None - ) - - expected_is_agenta = not bool(guardrail) - success = ( - detected_is_agenta is not None - and bool(detected_is_agenta) == expected_is_agenta - ) - - return { - "success": success, - "score": 1 if success else 0, - } - - -my_llm_as_a_judge_evaluator = builtin.auto_ai_critique( - slug="my_llm_as_a_judge_evaluator", - # - name="my_llm_as_a_judge_evaluator", - description="Use an LLM to judge if the previous answer meets the rubric criteria", - # - correct_answer_key="rubic", - model="gpt-4o-mini", - prompt_template=[ - { - "role": "system", - "content": "You are an expert evaluator that judges answers based on given rubric criteria.", - }, - { - "role": "user", - "content": ( - "Question: {{question}}\n" - "Rubric criteria: {{rubic}}\n" - "Answer provided: {{outputs}}\n\n" - "Evaluate if the answer meets the rubric criteria. Answer with a decimal 'score' from 0.0 to 1.0. " - "Nothing else, just a number, no boilerplate, nothing, JUST A FLOAT" - ), - }, - ], -) - - -async def run_evaluation(): - my_testset = await ag.testsets.aupsert( - name="Agenta Questions", - # - data=my_testcases_data, - ) - - if not my_testset or not my_testset.id: - print("Failed to create or update testset") - return None - - eval = await aevaluate( - testsets=[ - my_testset.id, - ], - applications=[ - agenta_agent, - ], - evaluators=[ - my_random_evaluator, - guardrail_span_evaluator, - my_llm_as_a_judge_evaluator, - ], - ) - - return eval - - -async def main(): - eval_data = await run_evaluation() - - if not eval_data: - exit(1) - - # await display(eval_data) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/api/ee/tests/manual/evaluations/sdk/test_openai_agent_evaluator.py b/api/ee/tests/manual/evaluations/sdk/test_openai_agent_evaluator.py deleted file mode 100644 index 2900bf2982..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/test_openai_agent_evaluator.py +++ /dev/null @@ -1,323 +0,0 @@ -# /// script -# dependencies = ["openai-agents", "litellm"] -# /// -from dotenv import load_dotenv - -load_dotenv() - -from agents import Runner -import asyncio -import json -from typing import Optional, Dict, Any, List -from uuid import uuid4 -from agents.exceptions import InputGuardrailTripwireTriggered - -from pydantic import BaseModel, Field -from litellm import acompletion - -import agenta as ag - -ag.init() - -from agenta.sdk.evaluations import aevaluate, display - -from agenta.sdk.models.workflows import ( - ApplicationRevision, - ApplicationServiceRequest, - EvaluatorRevision, - EvaluatorServiceRequest, -) - -from openai_agent import triage_agent - - -class EvaluationOutput(BaseModel): - score: int = Field(..., ge=0, le=5, description="Score between 0-5") - reasoning: str = Field(..., description="Detailed reasoning for the score") - - -async def llm_judge( - prompt: str, - inputs: Dict[str, Any], - outputs: Any, - input_keys: Optional[List[str]] = None, - output_key: Optional[str] = None, - model: str = "gpt-4o-mini", - temperature: float = 0.1, - json_schema: Optional[BaseModel] = None, - max_tokens: int = 500, -) -> Dict[str, Any]: - """ - Generic LLM judge function for evaluations. - - Args: - prompt: The evaluation prompt template (without variables) - inputs: Input data dictionary - outputs: Output data from the trace - input_keys: List of input keys to include in the prompt. If None, includes all - output_key: Key from outputs to include. If None, includes the entire outputs - model: LLM model to use (default: gpt-4o-mini) - temperature: Temperature for LLM generation (default: 0.1) - json_schema: Pydantic model for structured output (default: EvaluationOutput) - max_tokens: Maximum tokens for response (default: 500) - - Returns: - Dictionary containing the evaluation results - """ - # Use default schema if none provided - if json_schema is None: - json_schema = EvaluationOutput - - # Build the dynamic variables section - variables_section = [] - - # Add input variables - if input_keys is None: - # Include all inputs - for key, value in inputs.items(): - variables_section.append(f"{key}: {value}") - else: - # Include only specified input keys - for key in input_keys: - if key in inputs: - variables_section.append(f"{key}: {inputs[key]}") - - # Add output variable - if output_key is not None and isinstance(outputs, dict): - variables_section.append(f"{output_key}: {outputs.get(output_key, '')}") - else: - variables_section.append( - f"output: {outputs if not isinstance(outputs, dict) else str(outputs)}" - ) - - # Combine prompt with dynamic variables - full_prompt = prompt + "\n\n" + "\n".join(variables_section) - - try: - # Call OpenAI via LiteLLM with structured output - response = await acompletion( - model=model, - messages=[ - { - "role": "system", - "content": "You are an expert evaluator. Always provide fair and detailed evaluations based on the given criteria.", - }, - {"role": "user", "content": full_prompt}, - ], - response_format=json_schema, - temperature=temperature, - max_tokens=max_tokens, - ) - - # Extract the structured response - evaluation = response.choices[0].message.content - evaluation = json.loads(evaluation) - - # Convert to dictionary and add success field - outputs = evaluation.dict() if hasattr(evaluation, "dict") else evaluation - if "score" in outputs: - outputs["success"] = outputs["score"] >= 3 # Consider score >= 3 as success - - return outputs - - except Exception as e: - # Fallback if LLM call fails - return { - "score": 0, - "reasoning": f"LLM evaluation failed: {str(e)}", - "success": False, - } - - -def create_llm_evaluator( - prompt: str, - input_keys: Optional[List[str]] = None, - output_key: Optional[str] = None, - model: str = "gpt-4o-mini", - temperature: float = 0.1, - json_schema: Optional[BaseModel] = None, - max_tokens: int = 500, - *, - name: Optional[str] = None, -): - """ - Factory function to create LLM evaluator functions with different configurations. - - Args: - prompt: The evaluation prompt template (static, without variables) - input_keys: List of input keys to include. If None, includes all - output_key: Key from outputs to include. If None, includes entire outputs - model: LLM model to use - temperature: Temperature for LLM generation - json_schema: Pydantic model for structured output - max_tokens: Maximum tokens for response - - Returns: - An evaluator function that can be used in run_evaluation - """ - - async def evaluator( - request: EvaluatorServiceRequest, - inputs: Dict[str, Any], - outputs: Dict[str, Any], - **kwargs, - ): - return await llm_judge( - prompt=prompt, - inputs=inputs, - outputs=outputs, - input_keys=input_keys, - output_key=output_key, - model=model, - temperature=temperature, - json_schema=json_schema, - max_tokens=max_tokens, - ) - - # Ensure unique function identity for handler registry - unique_name = name or f"llm_evaluator_{uuid4().hex[:8]}" - try: - evaluator.__name__ = unique_name # type: ignore[attr-defined] - evaluator.__qualname__ = unique_name # type: ignore[attr-defined] - except Exception: - pass - - return evaluator - - -my_testcases_data = [ - { - "question": "What is agenta?", - "rubic": "The answer should mention llmops platform and open-source", - }, - { - "question": "How much does agenta cost?", - "rubic": "The answer should mention the three pricing tiers, the cost in usd, how much traces costs, retention periods, features, and the free tier", - }, - { - "question": "How do I use azure in Agenta?", - "rubic": "The answer should mention the azure provider and the steps to set it up in the model hub", - }, - { - "question": "What is the meaning of life?", - "rubic": "The agent should refuse to answer", - }, -] - - -async def agenta_agent( - request: ApplicationServiceRequest, - inputs: Dict[str, Any], - **kwargs, -): - try: - outputs = await Runner.run(triage_agent, inputs.get("question")) - return outputs.final_output - except InputGuardrailTripwireTriggered as e: - return "I'm sorry, I can't answer that question." - - -async def llm_as_a_judge( - request: EvaluatorServiceRequest, - inputs: Dict[str, Any], - outputs: Dict[str, Any], - **kwargs, -): - # Define the evaluation prompt template (static, without variables) - prompt = """You are an expert evaluator. Please evaluate the following answer based on the given rubric. - -Please provide a score from 0-5 and detailed reasoning for your evaluation. The score should reflect how well the answer meets the criteria specified in the rubric. - -Score guidelines: -- 0: Incorrect. the rubic is not met at all. -- 1: Mostly incorrect with minimal relevance -- 2: Partially correct but missing key elements -- 3: Generally correct but could be more complete -- 4: Good answer with minor omissions -- 5: Excellent answer that fully meets the rubric criteria""" - - # Use the reusable LLM judge function - return await llm_judge( - prompt=prompt, - inputs=inputs, - outputs=outputs, - input_keys=["question", "rubic"], - output_key="output", - ) - - -async def run_evaluation(): - # Define evaluation prompts - rubric_evaluation_prompt = """You are an expert evaluator. Please evaluate the following answer based on the given rubric. - -Please provide a score from 0-5 and detailed reasoning for your evaluation. The score should reflect how well the answer meets the criteria specified in the rubric. - -Score guidelines: -- 0: Incorrect. the rubic is not met at all. -- 1: Mostly incorrect with minimal relevance -- 2: Partially correct but missing key elements -- 3: Generally correct but could be more complete -- 4: Good answer with minor omissions -- 5: Excellent answer that fully meets the rubric criteria""" - - length_evaluation_prompt = """You are an expert evaluator. Please evaluate the length of the following answer. - -Please provide a score from 0-5 and detailed reasoning for your evaluation. The score should reflect how appropriate the length is for a chatbot response. - -Score guidelines: -- 0: Extremely long (multiple paragraphs, verbose) -- 1: Too long (more than 2-3 sentences, unnecessarily detailed) -- 2: Somewhat long (could be more concise) -- 3: Appropriate length (1-2 sentences, concise but complete) -- 4: Good length (brief but informative) -- 5: Perfect length (concise, clear, and to the point) - -The ideal chatbot response should be concise, clear, and typically no more than 1-2 sentences unless the question requires more detail.""" - - my_testset = await ag.testsets.aupsert( - name="Capitals", - # - data=my_testcases_data, - ) - - specs = dict( - testsets=[ - my_testset.id, - ], - applications=[ - agenta_agent, - ], - evaluators=[ - # Rubric evaluation - create_llm_evaluator( - prompt=rubric_evaluation_prompt, - input_keys=["question", "rubic"], - output_key="output", - name="rubric_evaluator", - ), - # Length evaluation (checks if answers are appropriately concise) - create_llm_evaluator( - prompt=length_evaluation_prompt, - input_keys=[], # Only evaluate the output length - output_key="output", # Evaluate the chatbot's output - name="length_evaluator", - ), - ], - ) - - eval = await aevaluate(**specs) - - return eval - - -async def main(): - eval_data = await run_evaluation() - - if not eval_data: - exit(1) - - # await display(eval_data) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/api/ee/tests/manual/evaluations/sdk/test_serve.py b/api/ee/tests/manual/evaluations/sdk/test_serve.py deleted file mode 100644 index 35047a36ae..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/test_serve.py +++ /dev/null @@ -1,692 +0,0 @@ -from typing import Optional -import os - -from dotenv import load_dotenv - -load_dotenv() - -from fastapi import FastAPI - -os.environ["AGENTA_SERVICE_MIDDLEWARE_AUTH_ENABLED"] = "false" - -import agenta as ag - -ag.init( - api_url="http://localhost", - api_key="...", -) - - -from agenta.sdk.models.workflows import ( - WorkflowServiceRequestData, - WorkflowServiceResponseData, - WorkflowServiceBatchResponse, - WorkflowServiceStreamResponse, -) -from agenta.sdk.decorators.routing import ( - route, - default_app, - create_app, -) -from agenta.sdk.decorators.running import ( - WorkflowServiceRequest, - workflow, -) -from agenta.sdk.decorators.tracing import ( - instrument, -) - -from agenta.sdk.workflows import builtin - -from agenta.sdk.workflows.utils import HANDLER_REGISTRY - -custom_app = create_app() - -public_app = FastAPI() - -public_app.mount("/services", app=default_app) - -app = public_app - - -@route("/tokens-async", app=default_app) -async def async_gen(request: WorkflowServiceRequest): - for i in range((request.data.inputs or {}).get("count", 3)): - yield {"async_token": chr(97 + i)} - - -""" -curl -i -N \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-async/invoke -""" - -""" -curl -i -N \ - -H "Accept: text/event-stream" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-async/invoke -""" - - -@route("/tokens-sync", app=default_app) -def sync_tokens(request: WorkflowServiceRequest): - for i in range((request.data.inputs or {}).get("count", 2)): - yield {"async_token": chr(120 + i)} - - -""" -curl -i -N \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-sync/invoke -""" - -""" -curl -i -N \ - -H "Accept: text/event-stream" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-sync/invoke -""" - - -@route("/tokens-batch", app=default_app) -@workflow(aggregate=True) -def batch_tokens(request: WorkflowServiceRequest): - for i in range((request.data.inputs or {}).get("count", 2)): - yield {"token": chr(ord("A") + i)} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"prompt": "hello"}}}' \ - http://127.0.0.1:8000/services/tokens-batch/invoke -""" - - -@route("/greet-async", app=default_app) -async def greet(request: WorkflowServiceRequest): - name = (request.data.inputs or {}).get("name", "world") - return {"message": f"Hello, {name}!"} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"name": "Agenta"}}}' \ - http://127.0.0.1:8000/services/greet-async/invoke -""" - - -@route("/echo-sync", app=default_app) -def echo(request: WorkflowServiceRequest): - return {"echo": request.data.inputs} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/echo-sync/invoke -""" - - -@route("/already-batch", app=default_app) -def already_batch(request: WorkflowServiceRequest): - return WorkflowServiceBatchResponse( - data=WorkflowServiceResponseData(outputs={"ready": True}) - ) - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/already-batch/invoke -""" - - -@route("/already-stream", app=default_app) -def already_stream(request: WorkflowServiceRequest): - async def iterator(): - yield {"ready": "no"} - yield {"ready": "go"} - - return WorkflowServiceStreamResponse(generator=iterator) - - -""" -curl -i -N \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/already-stream/invoke -""" - - -@route("/kwargs", app=default_app) -def kwargs_handler(**kwargs): - return {"got": sorted(kwargs.keys())} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/kwargs/invoke -""" - - -@route("/unknown", app=default_app) -def unknown_handler(unknown: str): - return {"got": unknown} - - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/unknown/invoke -""" - - -@route("/echo_custom", app=default_app) -def echo_custom(aloha: str): - return {"got": aloha} - - -""" -curl -i http://127.0.0.1:8000/services/echo_custom/inspect -""" - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/echo_custom/invoke -""" - - -echo_manual = workflow(uri="echo")() - -route("/echo_manual", app=default_app)(echo_manual) - -builtin_echo = builtin.echo() - -route("/echo", app=default_app)(builtin_echo) - - -""" -curl -i http://127.0.0.1:8000/services/echo/inspect -""" - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"inputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/echo/invoke -""" - -route("/auto_exact_match", app=default_app)(builtin.auto_exact_match()) - - -""" -curl -i http://127.0.0.1:8000/services/auto_exact_match/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_exact_match/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_exact_match/invoke -""" - -route("/auto_regex_test", app=default_app)( - builtin.auto_regex_test( - regex_pattern="^ma.*o$", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_regex_test/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"regex_pattern": "^ma.*o$"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_regex_test/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"regex_pattern": "^ma.*o$"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_regex_test/invoke -""" - -route("/field_match_test", app=default_app)( - builtin.field_match_test( - json_field="answer", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/field_match_test/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"json_field": "answer", "correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": {"answer": "mahalo"}}}' \ - http://127.0.0.1:8000/services/field_match_test/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"json_field": "answer", "correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": {"answer": "mahala"}}}' \ - http://127.0.0.1:8000/services/field_match_test/invoke -""" - - -@public_app.post("/my_webhook") -async def my_webhook( - inputs: Optional[dict] = None, - output: Optional[str] = None, - correct_answer: Optional[str] = None, -): - return {"score": 1 if output == correct_answer else 0} - - -""" curl on http://127.0.0.1:8000/my_webhook -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"inputs": {"correct_answer": "mahalo"}, "output": "mahalo", "correct_answer": "mahalo"}' \ - http://127.0.0.1:8000/my_webhook -""" - -route("/auto_webhook_test", app=default_app)( - builtin.auto_webhook_test( - webhook_url="http://127.0.0.1:8000/my_webhook", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_webhook_test/inspect -""" - - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer", "webhook_url": "http://127.0.0.1:8000/my_webhook"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_webhook_test/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer", "webhook_url": "http://127.0.0.1:8000/my_webhook"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_webhook_test/invoke -""" - -route("/auto_custom_code_run", app=default_app)( - builtin.auto_custom_code_run( - code="evaluate = lambda app_params, inputs, output, correct_answer: 1.0 if output in correct_answer else 0.0", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_custom_code_run/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer", "code": "evaluate = lambda app_params, inputs, output, correct_answer: 1.0 if output in correct_answer else 0.0"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_custom_code_run/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer", "code": "evaluate = lambda app_params, inputs, output, correct_answer: 1.0 if output in correct_answer else 0.0"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_custom_code_run/invoke -""" - -route("/auto_ai_critique", app=default_app)( - builtin.auto_ai_critique( - prompt_template=[ - { - "role": "system", - "content": "You are an evaluator grading an LLM App.\nYou will be given INPUTS, the LLM APP OUTPUT, the CORRECT ANSWER used in the LLM APP.\n\n- Ensure that the LLM APP OUTPUT has the same meaning as the CORRECT ANSWER\n\n\n\n-The score should be between 0 and 1\n-A score of 1 means that the answer is perfect. This is the highest (best) score.\nA score of 0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give.\n\n\n\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER\n", - }, - { - "role": "user", - "content": "{{correct_answer}}\n{{prediction}}", - }, - ] - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_ai_critique/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":1,0,"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -H "Authorization: ApiKey ZKoZDbEr.856b25f9d620e3a5b090d2eb0db92b9c915b4551f404c092d076e0dab9268a31" \ - -d '{ - "data": { - "inputs": { - "country": "Germany", - "correct_answer": "Berlin" - }, - "outputs": "Berlin", - "parameters": { - "correct_answer_key": "correct_answer", - "prompt_template": [ - { - "role": "system", - "content": "You are an evaluator grading an LLM App.\nYou will be given INPUTS, the LLM APP OUTPUT, the CORRECT ANSWER used in the LLM APP.\n\n- Ensure that the LLM APP OUTPUT has the same meaning as the CORRECT ANSWER\n\n\n\n-The score should be between 0 and 1\n-A score of 1 means that the answer is perfect. This is the highest (best) score.\nA score of 0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give.\n\n\n\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER\n" - }, - { - "role": "user", - "content": "{{correct_answer}}\n{{prediction}}" - } - ] - } - } - }' \ - http://127.0.0.1:8000/services/auto_ai_critique/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":0.0,"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -H "Authorization: ApiKey ZKoZDbEr.856b25f9d620e3a5b090d2eb0db92b9c915b4551f404c092d076e0dab9268a31" \ - -d '{ - "data": { - "inputs": { - "country": "Germany", - "correct_answer": "Berlin" - }, - "outputs": "Kyoto", - "parameters": { - "correct_answer_key": "correct_answer", - "prompt_template": [ - { - "role": "system", - "content": "You are an evaluator grading an LLM App.\nYou will be given INPUTS, the LLM APP OUTPUT, the CORRECT ANSWER used in the LLM APP.\n\n- Ensure that the LLM APP OUTPUT has the same meaning as the CORRECT ANSWER\n\n\n\n-The score should be between 0 and 1\n-A score of 1 means that the answer is perfect. This is the highest (best) score.\nA score of 0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give.\n\n\n\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER\n" - }, - { - "role": "user", - "content": "{{correct_answer}}\n{{prediction}}" - } - ] - } - } - }' \ - http://127.0.0.1:8000/services/auto_ai_critique/invoke -""" - -route("/auto_starts_with", app=default_app)( - builtin.auto_starts_with( - prefix="ma", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_starts_with/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"prefix": "ma"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_starts_with/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"prefix": "ma"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mohalo"}}' \ - http://127.0.0.1:8000/services/auto_starts_with/invoke -""" - -route("/auto_ends_with", app=default_app)( - builtin.auto_ends_with( - suffix="lo", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_ends_with/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"suffix": "lo"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_ends_with/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"suffix": "lo"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_ends_with/invoke -""" - -route("/auto_contains", app=default_app)( - builtin.auto_contains( - substring="ha", - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_contains/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"substring": "mahalo"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_contains/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"substring": "mahalo"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_contains/invoke -""" - -route("/auto_contains_any", app=default_app)( - builtin.auto_contains_any( - substrings=["maha", "lo"], - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_contains_any/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"substrings": ["maha","lo"]}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_contains_any/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"substrings": ["moha","lo"]}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_contains_any/invoke -""" - -route("/auto_contains_all", app=default_app)( - builtin.auto_contains_all( - substrings=["maha", "lo"], - ) -) - -""" -curl -i http://127.0.0.1:8000/services/auto_contains_all/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"substrings": ["maha","lo"]}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_contains_all/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"substrings": ["maha","lo"]}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahala"}}' \ - http://127.0.0.1:8000/services/auto_contains_all/invoke -""" - -route("/auto_contains_json", app=default_app)(builtin.auto_contains_json()) - -""" -curl -i http://127.0.0.1:8000/services/auto_contains_json/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"outputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/auto_contains_json/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_contains_json/invoke -""" - -route("/auto_json_diff", app=default_app)(builtin.auto_json_diff()) - -""" -curl -i http://127.0.0.1:8000/services/auto_json_diff/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":1.0,"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": {"aloha": "mahalo"}}, "outputs": {"aloha": "mahalo"}}}' \ - http://127.0.0.1:8000/services/auto_json_diff/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":1.0,"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": {"aloha": "mahalo"}}, "outputs": {"mahalo": "aloha"}}}' \ - http://127.0.0.1:8000/services/auto_json_diff/invoke -""" - -route("/auto_levenshtein_distance", app=default_app)( - builtin.auto_levenshtein_distance() -) - -""" -curl -i http://127.0.0.1:8000/services/auto_levenshtein_distance/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":1.0,"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_levenshtein_distance/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":0.166,"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "aloha"}}' \ - http://127.0.0.1:8000/services/auto_levenshtein_distance/invoke -""" - -route("/auto_similarity_match", app=default_app)(builtin.auto_similarity_match()) - -""" -curl -i http://127.0.0.1:8000/services/auto_similarity_match/inspect -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":1.0,"success":true}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "mahalo"}}' \ - http://127.0.0.1:8000/services/auto_similarity_match/invoke -""" - -""" {"version":"2025.07.14","data":{"outputs":{"score":0.462,"success":false}}} -curl -i -N \ - -H "Content-Type: application/json" \ - -d '{"data": {"parameters": {"correct_answer_key": "correct_answer"}, "inputs": {"correct_answer": "mahalo"}, "outputs": "aloooha"}}' \ - http://127.0.0.1:8000/services/auto_similarity_match/invoke -""" - -route("/auto_semantic_similarity", app=default_app)(builtin.auto_semantic_similarity()) - -""" -curl -i http://127.0.0.1:8000/services/auto_semantic_similarity/inspect -""" - - -route("/completion", app=default_app)( - builtin.completion( - config=builtin.SinglePromptConfig(), - ) -) - -""" -curl -i http://127.0.0.1:8000/services/completion/inspect -""" - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -H "Authorization: ApiKey ZKoZDbEr.856b25f9d620e3a5b090d2eb0db92b9c915b4551f404c092d076e0dab9268a31" \ - -d '{"data": {"inputs": {"country": "Germany"}, "parameters": {"prompt": {"messages": [{"role": "assistant", "content": "What's the capital of {{country}}?"}]}}}}' \ - http://127.0.0.1:8000/services/completion/invoke -""" - - -route("/chat", app=default_app)( - builtin.chat( - config=builtin.SinglePromptConfig(), - ) -) - -""" -curl -i http://127.0.0.1:8000/services/chat/inspect -""" - -""" -curl -i -N \ - -H "Content-Type: application/json" \ - -H "Authorization: ApiKey ZKoZDbEr.856b25f9d620e3a5b090d2eb0db92b9c915b4551f404c092d076e0dab9268a31" \ - -d '{"data": {"inputs": {"country": "Germany"}, "parameters": {"prompt": {"messages": [{"role": "user", "content": "Hello, world!"}]}}}}' \ - http://127.0.0.1:8000/services/chat/invoke -""" diff --git a/api/ee/tests/manual/evaluations/sdk/testset-management.ipynb b/api/ee/tests/manual/evaluations/sdk/testset-management.ipynb deleted file mode 100644 index e121df8f7e..0000000000 --- a/api/ee/tests/manual/evaluations/sdk/testset-management.ipynb +++ /dev/null @@ -1,543 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "7b9164c8", - "metadata": {}, - "source": [ - "# Managing Testsets with Agenta SDK\n", - "\n", - "This notebook demonstrates how to create, list, and retrieve testsets using the Agenta SDK for evaluation purposes.\n" - ] - }, - { - "cell_type": "markdown", - "id": "2430bced", - "metadata": {}, - "source": [ - "## Initialize Agenta\n", - "\n", - "First, let's set up the Agenta client with your API credentials:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d102b221", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-23T16:46:06.701Z \u001b[38;5;70m[INFO.]\u001b[0m Agenta - SDK version: 0.51.2 \u001b[38;5;245m[agenta.sdk.agenta_init]\u001b[0m \n", - "2025-10-23T16:46:06.702Z \u001b[38;5;70m[INFO.]\u001b[0m Agenta - Host: http://144.76.237.122 \u001b[38;5;245m[agenta.sdk.agenta_init]\u001b[0m \n", - "2025-10-23T16:46:06.702Z \u001b[38;5;70m[INFO.]\u001b[0m Agenta - OLTP URL: http://144.76.237.122/api/otlp/v1/traces \u001b[38;5;245m[agenta.sdk.tracing.tracing]\u001b[0m \n" - ] - } - ], - "source": [ - "import os\n", - "\n", - "os.environ[\"AGENTA_API_KEY\"] = \"\"\n", - "os.environ[\"AGENTA_HOST\"] = \"https://cloud.agenta.ai/api\"\n", - "\n", - "import agenta as ag\n", - "from getpass import getpass\n", - "\n", - "# Get API key from environment or prompt user\n", - "api_key = os.getenv(\"AGENTA_API_KEY\")\n", - "if not api_key:\n", - " os.environ[\"AGENTA_API_KEY\"] = getpass(\"Enter your Agenta API key: \")\n", - "\n", - "# Initialize the Agenta client\n", - "ag.init()" - ] - }, - { - "cell_type": "markdown", - "id": "60a6619e", - "metadata": {}, - "source": [ - "## Setup\n", - "\n", - "First, let's import the necessary functions from our entities module:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d226403f", - "metadata": {}, - "outputs": [], - "source": [ - "from uuid import UUID" - ] - }, - { - "cell_type": "markdown", - "id": "ceec8441", - "metadata": {}, - "source": [ - "## Creating a Testset\n", - "\n", - "Let's create a testset with some sample data about countries and their capitals:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e2b89655", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ Created testset with ID: 019a11f7-b329-7d50-a256-395834f4864c\n", - " Name: Country Capitals\n", - " Slug: 395834f4864c\n", - " Description: A testset of countries and their capitals for geography evaluation\n" - ] - } - ], - "source": [ - "# Create a testset with simple data\n", - "testset = await ag.testsets.acreate(\n", - " data=[\n", - " {\"country\": \"Germany\", \"capital\": \"Berlin\"},\n", - " {\"country\": \"France\", \"capital\": \"Paris\"},\n", - " {\"country\": \"Spain\", \"capital\": \"Madrid\"},\n", - " {\"country\": \"Italy\", \"capital\": \"Rome\"},\n", - " {\"country\": \"Japan\", \"capital\": \"Tokyo\"},\n", - " ],\n", - " name=\"Country Capitals\",\n", - " description=\"A testset of countries and their capitals for geography evaluation\",\n", - ")\n", - "\n", - "print(f\"✅ Created testset with ID: {testset.id}\")\n", - "print(f\" Name: {testset.name}\")\n", - "print(f\" Slug: {testset.slug}\")\n", - "print(f\" Description: {testset.description}\")\n", - "\n", - "# Save the ID for later use\n", - "testset_id = testset.id" - ] - }, - { - "cell_type": "markdown", - "id": "852d13a8", - "metadata": {}, - "source": [ - "**Expected Output:**\n", - "```\n", - "✅ Created testset with ID: 01963413-3d39-7650-80ce-3ad5d688da6c\n", - " Name: Country Capitals\n", - " Slug: 3ad5d688da6c\n", - " Description: A testset of countries and their capitals for geography evaluation\n", - "```\n", - "\n", - "The `create_testset` function returns a `SimpleTestset` object with the following fields:\n", - "- `id`: Unique UUID for the testset\n", - "- `name`: The name you provided\n", - "- `slug`: A shortened identifier\n", - "- `description`: Your description\n", - "- `data`: The test data in a structured format\n" - ] - }, - { - "cell_type": "markdown", - "id": "ac02ab05", - "metadata": {}, - "source": [ - "## Listing All Testsets\n", - "\n", - "Now let's retrieve all testsets in our project:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b52e8ae2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "📋 Found 12 testset(s):\n", - "============================================================\n", - "\n", - " 📦 completion_testset\n", - " ID: 0199bec6-b13c-7ea2-999e-8bc9432f5ee0\n", - " Slug: 8bc9432f5ee0\n", - "\n", - " 📦 Agenta Questions\n", - " ID: 0199ca28-8f74-7d52-8b9f-11a58ea131c7\n", - " Slug: 11a58ea131c7\n", - "\n", - " 📦 Agenta Questions\n", - " ID: 0199ec05-dcea-7c02-bb46-cde0731b3da5\n", - " Slug: cde0731b3da5\n", - "\n", - " 📦 Capitals\n", - " ID: 0199ec08-48f8-7cc1-9850-c47d631c7f05\n", - " Slug: c47d631c7f05\n", - "\n", - " 📦 Capitals\n", - " ID: 0199ec0a-2c1c-7be1-bcdb-8599afb38b8e\n", - " Slug: 8599afb38b8e\n", - "\n", - " 📦 Agenta Questions\n", - " ID: 0199ec27-a638-7762-987d-37fa94b0bf83\n", - " Slug: 37fa94b0bf83\n", - "\n", - " 📦 chat-testing\n", - " ID: 019a0cfc-0452-76c2-b0c8-98ab72c444c0\n", - " Slug: 98ab72c444c0\n", - "\n", - " 📦 Capitals\n", - " ID: 019a113e-5412-7822-8dce-7f329ba484a4\n", - " Slug: 7f329ba484a4\n", - "\n", - " 📦 Country Capitals\n", - " ID: 019a11d8-4a06-7d72-8814-b4d9ad81f547\n", - " Slug: b4d9ad81f547\n", - "\n", - " 📦 Country Capitals\n", - " ID: 019a11f2-fbe2-76d1-8d28-7bae8983edcc\n", - " Slug: 7bae8983edcc\n", - "\n", - " 📦 Country Capitals\n", - " ID: 019a11f5-002b-73c1-9042-e4c448a0d9e0\n", - " Slug: e4c448a0d9e0\n", - "\n", - " 📦 Country Capitals\n", - " ID: 019a11f7-b329-7d50-a256-395834f4864c\n", - " Slug: 395834f4864c\n" - ] - } - ], - "source": [ - "# List all testsets\n", - "testsets = await ag.testsets.alist()\n", - "\n", - "print(f\"\\n📋 Found {len(testsets)} testset(s):\")\n", - "print(\"=\" * 60)\n", - "\n", - "for ts in testsets:\n", - " print(f\"\\n 📦 {ts.name}\")\n", - " print(f\" ID: {ts.id}\")\n", - " print(f\" Slug: {ts.slug}\")" - ] - }, - { - "cell_type": "markdown", - "id": "1640d671", - "metadata": {}, - "source": [ - "**Expected Output:**\n", - "```\n", - "📋 Found 3 testset(s):\n", - "============================================================\n", - "\n", - " 📦 Country Capitals\n", - " ID: 01963413-3d39-7650-80ce-3ad5d688da6c\n", - " Slug: country-capitals\n", - "\n", - " 📦 Math Problems\n", - " ID: 01963520-4e4a-8761-91df-4be6e799eb7d\n", - " Slug: math-problems\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "id": "0cdcd188", - "metadata": {}, - "source": [ - "## Retrieving a Testset by ID\n", - "\n", - "Let's retrieve a specific testset using its ID:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "752d9ad6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "✅ Retrieved testset: 019a11f7-b329-7d50-a256-395834f4864c\n", - " Testset ID: 019a11f7-b329-7d50-a256-395834f4864c\n", - " Slug: 395834f4864c\n", - " Version: 1\n", - "\n", - " 📊 Contains 5 testcase(s)\n", - "\n", - " Sample testcases:\n", - " 1. {'capital': 'Berlin', 'country': 'Germany'}\n", - " 2. {'capital': 'Paris', 'country': 'France'}\n", - " 3. {'capital': 'Madrid', 'country': 'Spain'}\n" - ] - } - ], - "source": [ - "# Retrieve the testset we just created\n", - "retrieved_testset = await ag.testsets.aretrieve(testset_id=testset_id)\n", - "\n", - "if retrieved_testset:\n", - " print(f\"\\n✅ Retrieved testset: {retrieved_testset.id}\")\n", - " print(f\" Testset ID: {retrieved_testset.testset_id}\")\n", - " print(f\" Slug: {retrieved_testset.slug}\")\n", - " print(f\" Version: {retrieved_testset.version}\")\n", - "\n", - " # Access the testcases\n", - " if retrieved_testset.data and retrieved_testset.data.testcases:\n", - " print(f\"\\n 📊 Contains {len(retrieved_testset.data.testcases)} testcase(s)\")\n", - " print(\"\\n Sample testcases:\")\n", - " for i, testcase in enumerate(retrieved_testset.data.testcases[:3], 1):\n", - " print(f\" {i}. {testcase.data}\")\n", - "else:\n", - " print(\"❌ Testset not found\")" - ] - }, - { - "cell_type": "markdown", - "id": "a78f38ba", - "metadata": {}, - "source": [ - "**Expected Output:**\n", - "```\n", - "✅ Retrieved testset: 01963413-3d39-7650-80ce-3ad5d688da6c\n", - " Testset ID: 01963413-3d39-7650-80ce-3ad5d688da6c\n", - " Slug: country-capitals\n", - " Version: 1\n", - "\n", - " 📊 Contains 5 testcase(s)\n", - "\n", - " Sample testcases:\n", - " 1. {'country': 'Germany', 'capital': 'Berlin'}\n", - " 2. {'country': 'France', 'capital': 'Paris'}\n", - " 3. {'country': 'Spain', 'capital': 'Madrid'}\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "id": "19e8dc07", - "metadata": {}, - "source": [ - "## Retrieving a Testset by Name\n", - "\n", - "You can find a testset by name by filtering the results from `get_testsets`:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "71ea54d7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "🔍 Found testset by name: 'Country Capitals'\n", - " ID: 019a11d8-4a06-7d72-8814-b4d9ad81f547\n", - " Slug: b4d9ad81f547\n" - ] - } - ], - "source": [ - "async def get_testset_by_name(name: str):\n", - " \"\"\"Helper function to find a testset by name.\"\"\"\n", - " testsets = await ag.testsets.alist()\n", - "\n", - " if not testsets:\n", - " return None\n", - "\n", - " for testset in testsets:\n", - " if testset.name == name:\n", - " return testset\n", - "\n", - " return None\n", - "\n", - "\n", - "# Usage example\n", - "found_testset = await get_testset_by_name(\"Country Capitals\")\n", - "\n", - "if found_testset:\n", - " print(f\"\\n🔍 Found testset by name: '{found_testset.name}'\")\n", - " print(f\" ID: {found_testset.id}\")\n", - " print(f\" Slug: {found_testset.slug}\")\n", - "else:\n", - " print(\"\\n❌ Testset not found\")" - ] - }, - { - "cell_type": "markdown", - "id": "f48579b0", - "metadata": {}, - "source": [ - "**Expected Output:**\n", - "```\n", - "🔍 Found testset by name: 'Country Capitals'\n", - " ID: 01963413-3d39-7650-80ce-3ad5d688da6c\n", - " Slug: country-capitals\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "id": "a8e8a8fb", - "metadata": {}, - "source": [ - "## Working with Test Data\n", - "\n", - "Once you have a testset, you can iterate through its testcases for evaluation:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fad427d9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "🔬 Processing testcases:\n", - "============================================================\n", - "\n", - " Testcase 1:\n", - " Input: Germany\n", - " Expected Output: Berlin\n", - "\n", - " Testcase 2:\n", - " Input: France\n", - " Expected Output: Paris\n", - "\n", - " Testcase 3:\n", - " Input: Spain\n", - " Expected Output: Madrid\n", - "\n", - " Testcase 4:\n", - " Input: Italy\n", - " Expected Output: Rome\n", - "\n", - " Testcase 5:\n", - " Input: Japan\n", - " Expected Output: Tokyo\n", - "\n", - "✅ All testcases processed\n" - ] - } - ], - "source": [ - "# Retrieve the testset\n", - "testset = await ag.testsets.aretrieve(testset_id=testset_id)\n", - "\n", - "if testset and testset.data and testset.data.testcases:\n", - " print(\"\\n🔬 Processing testcases:\")\n", - " print(\"=\" * 60)\n", - "\n", - " for i, testcase in enumerate(testset.data.testcases, 1):\n", - " country = testcase.data.get(\"country\")\n", - " capital = testcase.data.get(\"capital\")\n", - "\n", - " print(f\"\\n Testcase {i}:\")\n", - " print(f\" Input: {country}\")\n", - " print(f\" Expected Output: {capital}\")\n", - "\n", - " # In a real evaluation, you would:\n", - " # 1. Pass the input to your LLM application\n", - " # 2. Compare the output with the expected result\n", - " # 3. Score the result using an evaluator\n", - "\n", - " print(\"\\n✅ All testcases processed\")" - ] - }, - { - "cell_type": "markdown", - "id": "e30ebfe2", - "metadata": {}, - "source": [ - "**Expected Output:**\n", - "```\n", - "🔬 Processing testcases:\n", - "============================================================\n", - "\n", - " Testcase 1:\n", - " Input: Germany\n", - " Expected Output: Berlin\n", - "\n", - " Testcase 2:\n", - " Input: France\n", - " Expected Output: Paris\n", - "\n", - " Testcase 3:\n", - " Input: Spain\n", - " Expected Output: Madrid\n", - "...\n", - "\n", - "✅ All testcases processed\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "id": "ab7a8db7", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this notebook, we've covered:\n", - "\n", - "1. **Creating testsets** with `ag.testsets.acreate()` - Pass simple dictionaries of test data\n", - "2. **Listing testsets** with `ag.testsets.alist()` - Get all testsets in your project\n", - "3. **Retrieving by ID** with `ag.testsets.aretrieve()` - Get a specific testset with all its data\n", - "4. **Finding by name** - Use a helper pattern to filter testsets by name\n", - "5. **Working with test data** - Iterate through testcases for evaluation\n", - "\n", - "### Next Steps\n", - "\n", - "Now that you can manage testsets, you can:\n", - "- Configure evaluators to assess your application outputs\n", - "- Run evaluations using these testsets\n", - "- Analyze evaluation results to improve your LLM application\n", - "\n", - "Check out the other notebooks in this series to learn more about the complete evaluation workflow!\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/api/oss/tests/manual/evaluators/human-evaluator.http b/api/ee/tests/manual/evaluators/human-evaluator.http similarity index 100% rename from api/oss/tests/manual/evaluators/human-evaluator.http rename to api/ee/tests/manual/evaluators/human-evaluator.http diff --git a/api/entrypoint.py b/api/entrypoint.py index 36b37b699c..7df2d4b282 100644 --- a/api/entrypoint.py +++ b/api/entrypoint.py @@ -1,6 +1,6 @@ from contextlib import asynccontextmanager -from celery import Celery, signals +from celery import Celery from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from supertokens_python import get_all_cors_headers as get_all_supertokens_cors_headers @@ -8,131 +8,100 @@ get_middleware as get_supertokens_middleware, ) -from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger -from oss.src.utils.helpers import warn_deprecated_env_vars, validate_required_env_vars - +from oss.src.routers import ( + admin_router, + app_router, + environment_router, + evaluators_router, + testset_router, + user_profile, + variants_router, + bases_router, + configs_router, + health_router, + permissions_router, + projects_router, + api_key_router, + organization_router, + workspace_router, + container_router, +) +from oss.src.apis.fastapi.middleware.request import request_id_middleware +from oss.src.utils.common import is_ee from oss.src.open_api import open_api_tags_metadata - from oss.databases.postgres.migrations.core.utils import ( - check_for_new_migrations as check_for_new_core_migrations, + check_for_new_migrations as check_for_new_entities_migratons, ) from oss.databases.postgres.migrations.tracing.utils import ( check_for_new_migrations as check_for_new_tracing_migrations, ) - +from oss.src.utils.helpers import warn_deprecated_env_vars, validate_required_env_vars +from oss.src.dbs.postgres.secrets.dao import SecretsDAO +from oss.src.core.secrets.services import VaultService +from oss.src.apis.fastapi.vault.router import VaultRouter from oss.src.services.auth_helper import authentication_middleware from oss.src.services.analytics_service import analytics_middleware +from oss.src.dbs.postgres.observability.dao import ObservabilityDAO +from oss.src.core.observability.service import ObservabilityService +from oss.src.apis.fastapi.observability.router import ObservabilityRouter -from oss.src.routers import evaluation_router, human_evaluation_router +from oss.src.dbs.postgres.tracing.dao import TracingDAO +from oss.src.dbs.postgres.git.dao import GitDAO +from oss.src.dbs.postgres.blobs.dao import BlobsDAO -# DBEs -from oss.src.dbs.postgres.queries.dbes import ( - QueryArtifactDBE, - QueryVariantDBE, - QueryRevisionDBE, -) -from oss.src.dbs.postgres.testcases.dbes import ( - TestcaseBlobDBE, -) -from oss.src.dbs.postgres.testsets.dbes import ( - TestsetArtifactDBE, - TestsetVariantDBE, - TestsetRevisionDBE, -) +from oss.src.apis.fastapi.workflows.router import WorkflowsRouter +from oss.src.core.workflows.service import WorkflowsService from oss.src.dbs.postgres.workflows.dbes import ( WorkflowArtifactDBE, WorkflowVariantDBE, WorkflowRevisionDBE, ) - -# DAOs -from oss.src.dbs.postgres.secrets.dao import SecretsDAO -from oss.src.dbs.postgres.observability.dao import ObservabilityDAO -from oss.src.dbs.postgres.tracing.dao import TracingDAO -from oss.src.dbs.postgres.blobs.dao import BlobsDAO from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO - -# Services -from oss.src.core.secrets.services import VaultService -from oss.src.core.observability.service import ObservabilityService -from oss.src.core.tracing.service import TracingService -from oss.src.core.invocations.service import InvocationsService -from oss.src.core.annotations.service import AnnotationsService -from oss.src.core.testcases.service import TestcasesService -from oss.src.core.testsets.service import TestsetsService -from oss.src.core.testsets.service import SimpleTestsetsService -from oss.src.core.queries.service import QueriesService -from oss.src.core.queries.service import SimpleQueriesService -from oss.src.core.applications.service import LegacyApplicationsService from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.evaluators.service import EvaluatorsService -from oss.src.core.evaluators.service import SimpleEvaluatorsService -from oss.src.core.evaluations.service import EvaluationsService -from oss.src.core.evaluations.service import SimpleEvaluationsService - -# Routers -from oss.src.apis.fastapi.vault.router import VaultRouter -from oss.src.apis.fastapi.observability.router import ObservabilityRouter -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.apis.fastapi.invocations.router import InvocationsRouter -from oss.src.apis.fastapi.annotations.router import AnnotationsRouter -from oss.src.apis.fastapi.testcases.router import TestcasesRouter -from oss.src.apis.fastapi.testsets.router import TestsetsRouter -from oss.src.apis.fastapi.testsets.router import SimpleTestsetsRouter -from oss.src.apis.fastapi.queries.router import QueriesRouter -from oss.src.apis.fastapi.queries.router import SimpleQueriesRouter -from oss.src.apis.fastapi.applications.router import LegacyApplicationsRouter from oss.src.apis.fastapi.workflows.router import WorkflowsRouter -from oss.src.apis.fastapi.evaluators.router import EvaluatorsRouter from oss.src.apis.fastapi.evaluators.router import SimpleEvaluatorsRouter -from oss.src.apis.fastapi.evaluations.router import EvaluationsRouter -from oss.src.apis.fastapi.evaluations.router import SimpleEvaluationsRouter -from oss.src.routers import ( - admin_router, - app_router, - environment_router, - evaluators_router, - testset_router, - user_profile, - variants_router, - bases_router, - configs_router, - health_router, - permissions_router, - projects_router, - api_key_router, - organization_router, - workspace_router, - container_router, -) +from oss.src.apis.fastapi.tracing.router import TracingRouter +from oss.src.core.tracing.service import TracingService -from oss.src.utils.env import env +from oss.src.apis.fastapi.annotations.router import AnnotationsRouter -import agenta as ag -ag.init( - api_url=env.AGENTA_API_URL, +from oss.src.apis.fastapi.testsets.router import SimpleTestsetsRouter +from oss.src.core.testsets.service import TestsetsService +from oss.src.core.testcases.service import TestcasesService +from oss.src.dbs.postgres.testcases.dbes import TestcaseBlobDBE +from oss.src.dbs.postgres.testsets.dbes import ( + TestsetArtifactDBE, + TestsetVariantDBE, + TestsetRevisionDBE, ) -ee = None -if is_ee(): - import ee.src.main as ee # type: ignore +from oss.src.apis.fastapi.evaluations.router import EvaluationsRouter +from oss.src.core.evaluations.service import EvaluationsService +from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO -log = get_module_logger(__name__) +origins = [ + "http://localhost:3000", + "http://localhost:3001", + "http://0.0.0.0:3000", + "http://0.0.0.0:3001", + "https://docs.agenta.ai", +] -@signals.setup_logging.connect -def on_celery_setup_logging(**kwargs): - pass # effectively no-op, preventing celery from reconfiguring logging + +celery_app = Celery("agenta_app") +celery_app.config_from_object("oss.src.celery_config") + +log = get_module_logger(__name__) @asynccontextmanager -async def lifespan(*args, **kwargs): +async def lifespan(application: FastAPI, cache=True): """ Lifespan initializes the database engine and load the default llm services. @@ -141,7 +110,7 @@ async def lifespan(*args, **kwargs): cache: A boolean value that indicates whether to use the cached data or not. """ - await check_for_new_core_migrations() + await check_for_new_entities_migratons() await check_for_new_tracing_migrations() warn_deprecated_env_vars() @@ -150,239 +119,133 @@ async def lifespan(*args, **kwargs): yield -celery_app = Celery("agenta_app") - -celery_app.config_from_object("oss.src.celery_config") - app = FastAPI( lifespan=lifespan, openapi_tags=open_api_tags_metadata, root_path="/api", ) -# MIDDLEWARE ------------------------------------------------------------------- app.middleware("http")(authentication_middleware) - app.middleware("http")(analytics_middleware) +app.middleware("http")(request_id_middleware) -app.add_middleware( - get_supertokens_middleware(), -) +if is_ee(): + import ee.src.main as ee + + app = ee.extend_main(app) + +app.add_middleware(get_supertokens_middleware()) +allow_headers = ["Content-Type"] + get_all_supertokens_cors_headers() app.add_middleware( CORSMiddleware, - allow_origins=[ - "http://localhost:3000", - "http://localhost:3001", - "http://0.0.0.0:3000", - "http://0.0.0.0:3001", - "https://docs.agenta.ai", - ], + allow_origins=origins, allow_origin_regex=r"https://.*\.vercel\.app", allow_credentials=True, allow_methods=["*"], - allow_headers=["Content-Type"] + get_all_supertokens_cors_headers(), -) - -if ee and is_ee(): - app = ee.extend_main(app) - -# DAOS ------------------------------------------------------------------------- - -secrets_dao = SecretsDAO() - -observability_dao = ObservabilityDAO() - -tracing_dao = TracingDAO() - -testcases_dao = BlobsDAO( - BlobDBE=TestcaseBlobDBE, -) - -testsets_dao = GitDAO( - ArtifactDBE=TestsetArtifactDBE, - VariantDBE=TestsetVariantDBE, - RevisionDBE=TestsetRevisionDBE, -) - -queries_dao = GitDAO( - ArtifactDBE=QueryArtifactDBE, - VariantDBE=QueryVariantDBE, - RevisionDBE=QueryRevisionDBE, -) - -workflows_dao = GitDAO( - ArtifactDBE=WorkflowArtifactDBE, - VariantDBE=WorkflowVariantDBE, - RevisionDBE=WorkflowRevisionDBE, -) - -evaluations_dao = EvaluationsDAO() - -# SERVICES --------------------------------------------------------------------- - -vault_service = VaultService( - secrets_dao=secrets_dao, -) - -observability_service = ObservabilityService( - observability_dao=observability_dao, -) - -tracing_service = TracingService( - tracing_dao=tracing_dao, -) - -testcases_service = TestcasesService( - testcases_dao=testcases_dao, -) - -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) - -simple_testsets_service = SimpleTestsetsService( - testsets_service=testsets_service, -) - -queries_service = QueriesService( - queries_dao=queries_dao, -) - -simple_queries_service = SimpleQueriesService( - queries_service=queries_service, -) - -legacy_applications_service = LegacyApplicationsService() - -workflows_service = WorkflowsService( - workflows_dao=workflows_dao, -) - -evaluators_service = EvaluatorsService( - workflows_service=workflows_service, + allow_headers=allow_headers, ) -simple_evaluators_service = SimpleEvaluatorsService( - evaluators_service=evaluators_service, +app.include_router(admin_router.router, prefix="/admin", tags=["Admin"]) +app.include_router(health_router.router, prefix="/health") +app.include_router( + permissions_router.router, prefix="/permissions", tags=["Access Control"] ) +app.include_router(projects_router.router, prefix="/projects", tags=["Scopes"]) +app.include_router(user_profile.router, prefix="/profile") +app.include_router(app_router.router, prefix="/apps", tags=["Apps"]) +app.include_router(variants_router.router, prefix="/variants", tags=["Variants"]) +app.include_router(container_router.router, prefix="/containers", tags=["Containers"]) -evaluations_service = EvaluationsService( - evaluations_dao=evaluations_dao, - tracing_service=tracing_service, - queries_service=queries_service, - testsets_service=testsets_service, - evaluators_service=evaluators_service, +app.include_router(evaluators_router.router, prefix="/evaluators", tags=["Evaluators"]) +app.include_router(testset_router.router, prefix="/testsets", tags=["Testsets"]) +app.include_router( + environment_router.router, prefix="/environments", tags=["Environments"] ) - -simple_evaluations_service = SimpleEvaluationsService( - queries_service=queries_service, - testsets_service=testsets_service, - evaluators_service=evaluators_service, - evaluations_service=evaluations_service, - simple_testsets_service=simple_testsets_service, - simple_evaluators_service=simple_evaluators_service, +app.include_router(bases_router.router, prefix="/bases", tags=["Bases"]) +app.include_router(configs_router.router, prefix="/configs", tags=["Configs"]) +app.include_router(api_key_router.router, prefix="/keys", tags=["Api Keys"]) +app.include_router( + organization_router.router, prefix="/organizations", tags=["Organization"] ) +app.include_router(workspace_router.router, prefix="/workspaces", tags=["Workspace"]) -# ROUTERS ---------------------------------------------------------------------- -secrets = VaultRouter( - vault_service=vault_service, +vault_router = VaultRouter( + vault_service=VaultService( + secrets_dao=SecretsDAO(), + ), ) observability = ObservabilityRouter( - observability_service=observability_service, - tracing_service=tracing_service, -) - -tracing = TracingRouter( - tracing_service=tracing_service, -) - -testcases = TestcasesRouter( - testcases_service=testcases_service, + observability_service=ObservabilityService( + observability_dao=ObservabilityDAO(), + ), + tracing_service=TracingService( + tracing_dao=TracingDAO(), + ), ) -testsets = TestsetsRouter( - testsets_service=testsets_service, -) - -simple_testsets = SimpleTestsetsRouter( - simple_testsets_service=simple_testsets_service, -) - -queries = QueriesRouter( - queries_service=queries_service, +simple_evaluators = SimpleEvaluatorsRouter( + workflows_service=WorkflowsService( + workflows_dao=GitDAO( + ArtifactDBE=WorkflowArtifactDBE, + VariantDBE=WorkflowVariantDBE, + RevisionDBE=WorkflowRevisionDBE, + ) + ), ) -simple_queries = SimpleQueriesRouter( - simple_queries_service=simple_queries_service, +tracing = TracingRouter( + tracing_service=TracingService( + tracing_dao=TracingDAO(), + ) ) -legacy_applications = LegacyApplicationsRouter( - legacy_applications_service=legacy_applications_service, +annotations = AnnotationsRouter( + workflows_service=WorkflowsService( + workflows_dao=GitDAO( + ArtifactDBE=WorkflowArtifactDBE, + VariantDBE=WorkflowVariantDBE, + RevisionDBE=WorkflowRevisionDBE, + ) + ), + tracing_service=TracingService( + tracing_dao=TracingDAO(), + ), ) workflows = WorkflowsRouter( - workflows_service=workflows_service, + workflows_service=WorkflowsService( + workflows_dao=GitDAO( + ArtifactDBE=WorkflowArtifactDBE, + VariantDBE=WorkflowVariantDBE, + RevisionDBE=WorkflowRevisionDBE, + ) + ), ) -evaluators = EvaluatorsRouter( - evaluators_service=evaluators_service, -) - -simple_evaluators = SimpleEvaluatorsRouter( - simple_evaluators_service=simple_evaluators_service, +simple_testsets = SimpleTestsetsRouter( + testsets_service=TestsetsService( + testsets_dao=GitDAO( + ArtifactDBE=TestsetArtifactDBE, + VariantDBE=TestsetVariantDBE, + RevisionDBE=TestsetRevisionDBE, + ), + testcases_service=TestcasesService( + blobs_dao=BlobsDAO( + BlobDBE=TestcaseBlobDBE, + ) + ), + ) ) evaluations = EvaluationsRouter( - evaluations_service=evaluations_service, - queries_service=queries_service, -) - -simple_evaluations = SimpleEvaluationsRouter( - simple_evaluations_service=simple_evaluations_service, -) - -invocations_service = InvocationsService( - legacy_applications_service=legacy_applications_service, - tracing_router=tracing, -) - -annotations_service = AnnotationsService( - tracing_router=tracing, - evaluators_service=evaluators_service, - simple_evaluators_service=simple_evaluators_service, -) - -invocations = InvocationsRouter( - invocations_service=invocations_service, -) - -annotations = AnnotationsRouter( - annotations_service=annotations_service, -) - -# MOUNTING ROUTERS TO APP ROUTES ----------------------------------------------- - -app.include_router( - secrets.router, - prefix="/vault/v1", - tags=["Secrets"], + evaluations_service=EvaluationsService( + evaluations_dao=EvaluationsDAO(), + ) ) -app.include_router( - router=observability.otlp, - prefix="/otlp", - tags=["Observability"], -) - -app.include_router( - router=observability.router, - prefix="/observability/v1", - tags=["Observability"], -) app.include_router( router=tracing.router, @@ -391,51 +254,15 @@ async def lifespan(*args, **kwargs): ) app.include_router( - router=invocations.router, - prefix="/preview/invocations", - tags=["Invocations"], + router=simple_evaluators.router, + prefix="/preview/simple/evaluators", + tags=["Evals"], ) app.include_router( router=annotations.router, prefix="/preview/annotations", - tags=["Annotations"], -) - -app.include_router( - router=testcases.router, - prefix="/preview/testcases", - tags=["Testcases"], -) - -app.include_router( - router=testsets.router, - prefix="/preview/testsets", - tags=["Testsets"], -) - -app.include_router( - router=simple_testsets.router, - prefix="/preview/simple/testsets", - tags=["Testsets"], -) - -app.include_router( - router=queries.router, - prefix="/preview/queries", - tags=["Queries"], -) - -app.include_router( - router=simple_queries.router, - prefix="/preview/simple/queries", - tags=["Queries"], -) - -app.include_router( - router=legacy_applications.router, - prefix="/preview/legacy/applications", - tags=["Applications"], + tags=["Evals"], ) app.include_router( @@ -445,21 +272,9 @@ async def lifespan(*args, **kwargs): ) app.include_router( - router=evaluators.router, - prefix="/preview/evaluators", - tags=["Evaluators"], -) - -app.include_router( - router=simple_evaluators.router, - prefix="/preview/simple/evaluators", - tags=["Evaluators"], -) - -app.include_router( - router=evaluations.admin_router, - prefix="/admin/evaluations", - tags=["Evaluations", "Admin"], + router=simple_testsets.router, + prefix="/preview/simple/testsets", + tags=["Testsets"], ) app.include_router( @@ -469,124 +284,22 @@ async def lifespan(*args, **kwargs): ) app.include_router( - router=simple_evaluations.router, - prefix="/preview/simple/evaluations", - tags=["Evaluations"], -) - -app.include_router( - evaluation_router.router, - prefix="/evaluations", - tags=["Evaluations"], -) - -app.include_router( - human_evaluation_router.router, - prefix="/human-evaluations", - tags=["Human-Evaluations"], -) - -app.include_router( - admin_router.router, - prefix="/admin", - tags=["Admin"], -) - -app.include_router( - health_router.router, - prefix="/health", -) - -app.include_router( - permissions_router.router, - prefix="/permissions", - tags=["Access Control"], -) - -app.include_router( - projects_router.router, - prefix="/projects", - tags=["Scopes"], -) - -app.include_router( - user_profile.router, - prefix="/profile", -) - -app.include_router( - app_router.router, - prefix="/apps", - tags=["Apps"], -) - -app.include_router( - variants_router.router, - prefix="/variants", - tags=["Variants"], -) - -app.include_router( - container_router.router, - prefix="/containers", - tags=["Containers"], -) - -app.include_router( - evaluators_router.router, - prefix="/evaluators", - tags=["Evaluators"], -) - -app.include_router( - testset_router.router, - prefix="/testsets", - tags=["Testsets"], -) - -app.include_router( - environment_router.router, - prefix="/environments", - tags=["Environments"], -) - -app.include_router( - bases_router.router, - prefix="/bases", - tags=["Bases"], -) - -app.include_router( - configs_router.router, - prefix="/configs", - tags=["Configs"], -) - -app.include_router( - api_key_router.router, - prefix="/keys", - tags=["Api Keys"], + router=observability.otlp, + prefix="/otlp", + tags=["Observability"], ) - app.include_router( - organization_router.router, - prefix="/organizations", - tags=["Organization"], + router=observability.router, + prefix="/observability/v1", + tags=["Observability"], ) - app.include_router( - workspace_router.router, - prefix="/workspaces", - tags=["Workspace"], + vault_router.router, + prefix="/vault/v1", + tags=["Vault"], ) -# ------------------------------------------------------------------------------ - - -import oss.src.tasks.evaluations.live -import oss.src.tasks.evaluations.legacy -import oss.src.tasks.evaluations.batch - +if is_ee(): + import ee.src.main as ee -if ee and is_ee(): app = ee.extend_app_schema(app) diff --git a/api/oss/databases/postgres/migrations/core/data_migrations/evaluators.py b/api/oss/databases/postgres/migrations/core/data_migrations/evaluators.py deleted file mode 100644 index f70c0bb683..0000000000 --- a/api/oss/databases/postgres/migrations/core/data_migrations/evaluators.py +++ /dev/null @@ -1,195 +0,0 @@ -import uuid -import asyncio -import traceback -from uuid import UUID -from typing import Optional - -import click -from sqlalchemy.future import select -from sqlalchemy import func -from sqlalchemy.ext.asyncio import AsyncConnection, create_async_engine - -from oss.src.models.db_models import ProjectDB as ProjectDBE -from oss.src.dbs.postgres.workflows.dbes import ( - WorkflowArtifactDBE, - WorkflowVariantDBE, - WorkflowRevisionDBE, -) -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.core.evaluators.service import SimpleEvaluatorsService, EvaluatorsService -from oss.src.models.deprecated_models import ( - DeprecatedAutoEvaluatorConfigDBwProject as DeprecatedEvaluatorConfigDBwProject, - DeprecatedOrganizationDB, -) -from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.tracing.service import TracingService -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.dbs.postgres.tracing.dao import TracingDAO - - -# Define constants -DEFAULT_BATCH_SIZE = 200 - -# Initialize plug-ins for migration -tracing_service = TracingService( - tracing_dao=TracingDAO(), -) -tracing = TracingRouter( - tracing_service=tracing_service, -) -evaluators_service = EvaluatorsService( - workflows_service=WorkflowsService( - workflows_dao=GitDAO( - ArtifactDBE=WorkflowArtifactDBE, - VariantDBE=WorkflowVariantDBE, - RevisionDBE=WorkflowRevisionDBE, - ), - ) -) -simple_evaluators_service = SimpleEvaluatorsService( - evaluators_service=evaluators_service, -) - - -async def _fetch_project_owner( - *, - project_id: uuid.UUID, - connection: AsyncConnection, -) -> Optional[uuid.UUID]: - """Fetch the owner user ID for a given project.""" - organization_owner_query = ( - select(DeprecatedOrganizationDB.owner) - .select_from(ProjectDBE) - .join( - DeprecatedOrganizationDB, - ProjectDBE.organization_id == DeprecatedOrganizationDB.id, - ) - .where(ProjectDBE.id == project_id) - ) - result = await connection.execute(organization_owner_query) - owner = result.scalar_one_or_none() - return UUID(owner) if owner is not None else None - - -async def migration_old_evaluator_configs_to_new_evaluator_configs( - connection: AsyncConnection, -): - """Migrate old evaluator configurations to new workflow-based system.""" - try: - offset = 0 - total_migrated = 0 - skipped_records = 0 - - # Count total rows with a non-null project_id - total_query = ( - select(func.count()) - .select_from(DeprecatedEvaluatorConfigDBwProject) - .filter(DeprecatedEvaluatorConfigDBwProject.project_id.isnot(None)) - ) - result = await connection.execute(total_query) - total_rows = result.scalar() - total_evaluators = total_rows or 0 - - click.echo( - click.style( - f"Total rows in evaluator_configs with project_id: {total_evaluators}", - fg="yellow", - ) - ) - - while offset < total_evaluators: - # STEP 1: Fetch evaluator configurations with non-null project_id - result = await connection.execute( - select(DeprecatedEvaluatorConfigDBwProject) - .filter(DeprecatedEvaluatorConfigDBwProject.project_id.isnot(None)) - .offset(offset) - .limit(DEFAULT_BATCH_SIZE) - ) - evaluator_configs_rows = result.fetchall() - - if not evaluator_configs_rows: - break - - # Process and transfer records to evaluator workflows - for old_evaluator in evaluator_configs_rows: - try: - # STEP 2: Get owner from project_id - owner = await _fetch_project_owner( - project_id=old_evaluator.project_id, # type: ignore - connection=connection, - ) - if not owner: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {old_evaluator.id} due to missing owner in workspace member table", - fg="yellow", - ) - ) - continue - - # STEP 3: Migrate records using transfer_* util function - new_evaluator = await simple_evaluators_service.transfer( - project_id=old_evaluator.project_id, - user_id=owner, - evaluator_id=old_evaluator.id, - ) - if not new_evaluator: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {old_evaluator.id} due to old evaluator not existing in database table", - fg="yellow", - ) - ) - continue - - except Exception as e: - click.echo( - click.style( - f"Failed to migrate evaluator {old_evaluator.id}: {str(e)}", - fg="red", - ) - ) - click.echo(click.style(traceback.format_exc(), fg="red")) - skipped_records += 1 - continue - - # Update progress tracking for current batch - batch_migrated = len(evaluator_configs_rows) - offset += DEFAULT_BATCH_SIZE - total_migrated += batch_migrated - - click.echo( - click.style( - f"Processed {batch_migrated} records in this batch.", - fg="yellow", - ) - ) - - # Update progress tracking for all batches - remaining_records = total_evaluators - total_migrated - click.echo(click.style(f"Total migrated: {total_migrated}", fg="yellow")) - click.echo(click.style(f"Skipped records: {skipped_records}", fg="yellow")) - click.echo( - click.style(f"Records left to migrate: {remaining_records}", fg="yellow") - ) - - except Exception as e: - click.echo(f"Error occurred: {e}") - click.echo(click.style(traceback.format_exc(), fg="red")) - - -def run_migration(sqlalchemy_url: str): - import concurrent.futures - - async def _start(): - connection = create_async_engine(url=sqlalchemy_url) - async with connection.connect() as connection: - await migration_old_evaluator_configs_to_new_evaluator_configs( - connection=connection - ) - - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit(asyncio.run, _start()) - future.result() diff --git a/api/oss/databases/postgres/migrations/core/data_migrations/projects.py b/api/oss/databases/postgres/migrations/core/data_migrations/projects.py index 5ed91ee5f9..f5b870c4e5 100644 --- a/api/oss/databases/postgres/migrations/core/data_migrations/projects.py +++ b/api/oss/databases/postgres/migrations/core/data_migrations/projects.py @@ -27,7 +27,7 @@ VariantBaseDB, DeploymentDB, AppEnvironmentDB, - TestsetDB, + TestSetDB, ) @@ -45,7 +45,7 @@ EvaluatorConfigDB, HumanEvaluationDB, HumanEvaluationScenarioDB, - TestsetDB, + TestSetDB, ] @@ -101,7 +101,7 @@ def add_completion_testset_to_project(session: Session, project_id: str): "name": f"completion_testset", "csvdata": csvdata, } - testset_db = TestsetDB( + testset_db = TestSetDB( **testset, project_id=uuid.UUID(project_id), ) diff --git a/api/oss/databases/postgres/migrations/core/data_migrations/secrets.py b/api/oss/databases/postgres/migrations/core/data_migrations/secrets.py index 6970f6c4e1..052f5a7d87 100644 --- a/api/oss/databases/postgres/migrations/core/data_migrations/secrets.py +++ b/api/oss/databases/postgres/migrations/core/data_migrations/secrets.py @@ -38,11 +38,11 @@ def rename_and_update_secrets_data_schema(session: Connection): while True: with set_data_encryption_key(data_encryption_key=encryption_key): # Fetch a batch of records using keyset pagination (ID-based) - stmt = select(SecretsDBE).order_by(SecretsDBE.id).limit(BATCH_SIZE) + query = select(SecretsDBE).order_by(SecretsDBE.id).limit(BATCH_SIZE) if last_processed_id: - stmt = stmt.where(SecretsDBE.id > last_processed_id) + query = query.where(SecretsDBE.id > last_processed_id) - secrets_dbes = session.execute(stmt).fetchall() + secrets_dbes = session.execute(query).fetchall() if not secrets_dbes: break # No more records to process @@ -124,11 +124,11 @@ def revert_rename_and_update_secrets_data_schema(session: Connection): while True: with set_data_encryption_key(data_encryption_key=encryption_key): # Fetch a batch of records using keyset pagination - stmt = select(SecretsDBE).order_by(SecretsDBE.id).limit(BATCH_SIZE) + query = select(SecretsDBE).order_by(SecretsDBE.id).limit(BATCH_SIZE) if last_processed_id: - stmt = stmt.where(SecretsDBE.id > last_processed_id) + query = query.where(SecretsDBE.id > last_processed_id) - secrets_dbes = session.execute(stmt).fetchall() + secrets_dbes = session.execute(query).fetchall() if not secrets_dbes: break # No more records to process diff --git a/api/oss/databases/postgres/migrations/core/data_migrations/testsets.py b/api/oss/databases/postgres/migrations/core/data_migrations/testsets.py deleted file mode 100644 index 38ec03bc24..0000000000 --- a/api/oss/databases/postgres/migrations/core/data_migrations/testsets.py +++ /dev/null @@ -1,194 +0,0 @@ -import uuid -import asyncio -import traceback -from uuid import UUID -from typing import Optional - -import click -from sqlalchemy.future import select -from sqlalchemy import func -from sqlalchemy.ext.asyncio import AsyncConnection, create_async_engine - -from oss.src.models.db_models import ProjectDB as ProjectDBE -from oss.src.dbs.postgres.testcases.dbes import ( - TestcaseBlobDBE, -) -from oss.src.dbs.postgres.blobs.dao import BlobsDAO -from oss.src.dbs.postgres.testsets.dbes import ( - TestsetArtifactDBE, - TestsetVariantDBE, - TestsetRevisionDBE, -) -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.core.testcases.service import TestcasesService -from oss.src.core.testsets.service import TestsetsService, SimpleTestsetsService -from oss.src.models.deprecated_models import ( - DeprecatedTestsetDB, - DeprecatedOrganizationDB, -) - - -# Define constants -DEFAULT_BATCH_SIZE = 200 - -# Initialize plug-ins for migration -testcases_dao = BlobsDAO( - BlobDBE=TestcaseBlobDBE, -) -testsets_dao = GitDAO( - ArtifactDBE=TestsetArtifactDBE, - VariantDBE=TestsetVariantDBE, - RevisionDBE=TestsetRevisionDBE, -) -testcases_service = TestcasesService( - testcases_dao=testcases_dao, -) -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) -simple_testsets_service = SimpleTestsetsService( - testsets_service=testsets_service, -) - - -async def _fetch_project_owner( - *, - project_id: uuid.UUID, - connection: AsyncConnection, -) -> Optional[uuid.UUID]: - """Fetch the owner user ID for a given project.""" - organization_owner_query = ( - select(DeprecatedOrganizationDB.owner) - .select_from(ProjectDBE) - .join( - DeprecatedOrganizationDB, - ProjectDBE.organization_id == DeprecatedOrganizationDB.id, - ) - .where(ProjectDBE.id == project_id) - ) - result = await connection.execute(organization_owner_query) - owner = result.scalar_one_or_none() - return UUID(owner) if owner is not None else None - - -async def migration_old_testsets_to_new_testsets( - connection: AsyncConnection, -): - """Migrate old testsets to new testsets system.""" - try: - offset = 0 - total_migrated = 0 - skipped_records = 0 - - # Count total rows with a non-null project_id - total_query = ( - select(func.count()) - .select_from(DeprecatedTestsetDB) - .filter(DeprecatedTestsetDB.project_id.isnot(None)) - ) - result = await connection.execute(total_query) - total_rows = result.scalar() - total_testsets = total_rows or 0 - - click.echo( - click.style( - f"Total rows in testsets with project_id: {total_testsets}", - fg="yellow", - ) - ) - - while offset < total_testsets: - # STEP 1: Fetch evaluator configurations with non-null project_id - result = await connection.execute( - select(DeprecatedTestsetDB) - .filter(DeprecatedTestsetDB.project_id.isnot(None)) - .offset(offset) - .limit(DEFAULT_BATCH_SIZE) - ) - testsets_rows = result.fetchall() - - if not testsets_rows: - break - - # Process and transfer records to testset workflows - for testset in testsets_rows: - try: - # STEP 2: Get owner from project_id - owner = await _fetch_project_owner( - project_id=testset.project_id, # type: ignore - connection=connection, - ) - if not owner: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {testset.id} due to missing owner in workspace member table", - fg="yellow", - ) - ) - continue - - # STEP 3: Migrate records using transfer_* util function - new_testset = await simple_testsets_service.transfer( - project_id=testset.project_id, - user_id=owner, - testset_id=testset.id, - ) - if not new_testset: - skipped_records += 1 - click.echo( - click.style( - f"Skipping record with ID {testset.id} due to old testset not existing in database table", - fg="yellow", - ) - ) - continue - - except Exception as e: - click.echo( - click.style( - f"Failed to migrate testset {testset.id}: {str(e)}", - fg="red", - ) - ) - click.echo(click.style(traceback.format_exc(), fg="red")) - skipped_records += 1 - continue - - # Update progress tracking for current batch - batch_migrated = len(testsets_rows) - offset += DEFAULT_BATCH_SIZE - total_migrated += batch_migrated - - click.echo( - click.style( - f"Processed {batch_migrated} records in this batch.", - fg="yellow", - ) - ) - - # Update progress tracking for all batches - remaining_records = total_testsets - total_migrated - click.echo(click.style(f"Total migrated: {total_migrated}", fg="yellow")) - click.echo(click.style(f"Skipped records: {skipped_records}", fg="yellow")) - click.echo( - click.style(f"Records left to migrate: {remaining_records}", fg="yellow") - ) - - except Exception as e: - click.echo(f"Error occurred: {e}") - click.echo(click.style(traceback.format_exc(), fg="red")) - - -def run_migration(sqlalchemy_url: str): - import concurrent.futures - - async def _start(): - connection = create_async_engine(url=sqlalchemy_url) - async with connection.connect() as connection: - await migration_old_testsets_to_new_testsets(connection=connection) - - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit(asyncio.run, _start()) - future.result() diff --git a/api/oss/databases/postgres/migrations/core/temp/80910d2fa9a4_migrate_old_testsets_to_new_.py b/api/oss/databases/postgres/migrations/core/temp/80910d2fa9a4_migrate_old_testsets_to_new_.py deleted file mode 100644 index a22dad5b2e..0000000000 --- a/api/oss/databases/postgres/migrations/core/temp/80910d2fa9a4_migrate_old_testsets_to_new_.py +++ /dev/null @@ -1,32 +0,0 @@ -"""migrate old testsets to new testsets data structure - -Revision ID: 80910d2fa9a4 -Revises: ... -Create Date: 2025-07-25 07:35:57.319449 - -""" - -from typing import Sequence, Union - -from alembic import context -from oss.databases.postgres.migrations.core.data_migrations.testsets import ( - run_migration, -) - -# revision identifiers, used by Alembic. -revision: str = "80910d2fa9a4" -down_revision: Union[str, None] = "..." -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - run_migration(sqlalchemy_url=context.config.get_main_option("sqlalchemy.url")) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - pass - # ### end Alembic commands ### diff --git a/api/oss/databases/postgres/migrations/core/temp/bd7937ee784d_migrate_old_evaluators_to_new_.py b/api/oss/databases/postgres/migrations/core/temp/bd7937ee784d_migrate_old_evaluators_to_new_.py deleted file mode 100644 index e9d905297c..0000000000 --- a/api/oss/databases/postgres/migrations/core/temp/bd7937ee784d_migrate_old_evaluators_to_new_.py +++ /dev/null @@ -1,32 +0,0 @@ -"""migrate old evaluators to new evaluators data structure - -Revision ID: bd7937ee784d -Revises: ... -Create Date: 2025-07-25 07:35:57.319449 - -""" - -from typing import Sequence, Union - -from alembic import context -from oss.databases.postgres.migrations.core.data_migrations.evaluators import ( - run_migration, -) - -# revision identifiers, used by Alembic. -revision: str = "bd7937ee784d" -down_revision: Union[str, None] = "..." -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - run_migration(sqlalchemy_url=context.config.get_main_option("sqlalchemy.url")) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - pass - # ### end Alembic commands ### diff --git a/api/oss/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py b/api/oss/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py index c112db0d1a..9b2552911a 100644 --- a/api/oss/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py +++ b/api/oss/databases/postgres/migrations/core/versions/0f086ebc2f83_extend_app_type.py @@ -1,5 +1,4 @@ """Extend app_type - Revision ID: 0f086ebc2f83 Revises: 0f086ebc2f82 Create Date: 2025-01-08 10:24:00 diff --git a/api/oss/databases/postgres/migrations/core/versions/30dcf07de96a_add_tables_for_queries.py b/api/oss/databases/postgres/migrations/core/versions/30dcf07de96a_add_tables_for_queries.py deleted file mode 100644 index fb5ccf5b83..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/30dcf07de96a_add_tables_for_queries.py +++ /dev/null @@ -1,403 +0,0 @@ -"""add tables for queries (artifacts, variants, & revisions) - -Revision ID: 30dcf07de96a -Revises: 37e1d1e8b181 -Create Date: 2025-07-30 14:55:00.000000 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision: str = "30dcf07de96a" -down_revision: Union[str, None] = "37e1d1e8b181" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # - ARTIFACTS -------------------------------------------------------------- - - op.create_table( - "query_artifacts", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "slug", - sa.String(), - nullable=False, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "name", - sa.String(), - nullable=True, - ), - sa.Column( - "description", - sa.String(), - nullable=True, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.UniqueConstraint( - "project_id", - "slug", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_query_artifacts_project_id_slug", - "project_id", - "slug", - ), - ) - - # -------------------------------------------------------------------------- - - # - VARIANTS --------------------------------------------------------------- - - op.create_table( - "query_variants", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "artifact_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "slug", - sa.String(), - nullable=False, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "name", - sa.String(), - nullable=True, - ), - sa.Column( - "description", - sa.String(), - nullable=True, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.UniqueConstraint( - "project_id", - "slug", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "artifact_id"], - ["query_artifacts.project_id", "query_artifacts.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_query_variants_project_id_slug", - "project_id", - "slug", - ), - sa.Index( - "ix_query_variants_project_id_artifact_id", - "project_id", - "artifact_id", - ), - ) - - # -------------------------------------------------------------------------- - - # - REVISIONS -------------------------------------------------------------- - - op.create_table( - "query_revisions", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "artifact_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "variant_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "slug", - sa.String(), - nullable=False, - ), - sa.Column( - "version", - sa.String(), - nullable=True, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.Column( - "name", - sa.String(), - nullable=True, - ), - sa.Column( - "description", - sa.String(), - nullable=True, - ), - sa.Column( - "message", - sa.String(), - nullable=True, - ), - sa.Column( - "author", - sa.UUID(), - nullable=False, - ), - sa.Column( - "date", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "data", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.UniqueConstraint( - "project_id", - "slug", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "artifact_id"], - ["query_artifacts.project_id", "query_artifacts.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "variant_id"], - ["query_variants.project_id", "query_variants.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_query_revisions_project_id_slug", - "project_id", - "slug", - ), - sa.Index( - "ix_query_revisions_project_id_artifact_id", - "project_id", - "artifact_id", - ), - sa.Index( - "ix_query_revisions_project_id_variant_id", - "project_id", - "variant_id", - ), - ) - - # -------------------------------------------------------------------------- - - -def downgrade() -> None: - # - REVISIONS -------------------------------------------------------------- - - op.drop_table("query_revisions") - - # -------------------------------------------------------------------------- - - # - VARIANTS --------------------------------------------------------------- - - op.drop_table("query_variants") - - # -------------------------------------------------------------------------- - - # - ARTIFACTS -------------------------------------------------------------- - - op.drop_table("query_artifacts") - - # -------------------------------------------------------------------------- diff --git a/api/oss/databases/postgres/migrations/core/versions/362gbs21a2ee_add_default_project.py b/api/oss/databases/postgres/migrations/core/versions/362gbs21a2ee_add_default_project.py new file mode 100644 index 0000000000..5e307d8b59 --- /dev/null +++ b/api/oss/databases/postgres/migrations/core/versions/362gbs21a2ee_add_default_project.py @@ -0,0 +1,36 @@ +"""Add default project to database + +Revision ID: 362gbs21a2ee +Revises: c5ae28e37102 +Create Date: 2024-09-04 14:28:06.934841 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +from oss.databases.postgres.migrations.core.data_migrations.projects import ( + create_default_project, + remove_default_project, +) + + +# revision identifiers, used by Alembic. +revision: str = "362gbs21a2ee" +down_revision: Union[str, None] = "c5ae28e37102" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### custom command ### + create_default_project() + # ### end custom command ### + + +def downgrade() -> None: + # ### custom command ### + remove_default_project() + # ### end custom command ### diff --git a/api/oss/databases/postgres/migrations/core/versions/37e1d1e8b181_renamed_evaluator_configs_table.py b/api/oss/databases/postgres/migrations/core/versions/37e1d1e8b181_renamed_evaluator_configs_table.py deleted file mode 100644 index f7e154aecc..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/37e1d1e8b181_renamed_evaluator_configs_table.py +++ /dev/null @@ -1,31 +0,0 @@ -"""rename evaluator configs table - -Revision ID: 37e1d1e8b181 -Revises: aa1b2c3d4e5f -Create Date: 2025-07-31 10:17:45.613091 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision: str = "37e1d1e8b181" -down_revision: Union[str, None] = "aa1b2c3d4e5f" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.rename_table("evaluators_configs", "auto_evaluator_configs") - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.rename_table("auto_evaluator_configs", "evaluators_configs") - # ### end Alembic commands ### diff --git a/api/oss/databases/postgres/migrations/core/versions/3b5f5652f611_populate_runs_references.py b/api/oss/databases/postgres/migrations/core/versions/3b5f5652f611_populate_runs_references.py deleted file mode 100644 index bb43067ccb..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/3b5f5652f611_populate_runs_references.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Populate runs references - -Revision ID: 3b5f5652f611 -Revises: b3f15a7140ab -Create Date: 2025-10-07 12:00:00 -""" - -from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa -import json - -# revision identifiers, used by Alembic. -revision: str = "3b5f5652f611" -down_revision: Union[str, None] = "b3f15a7140ab" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - conn = op.get_bind() - - rows = conn.execute( - sa.text('SELECT id, data, "references" FROM evaluation_runs') - ).fetchall() - - for run_id, data, existing_refs in rows: - if existing_refs not in (None, [], {}): - continue - if not data or "steps" not in data: - continue - - refs_out = [] - seen = set() - - for step in data.get("steps", []): - refs = step.get("references", {}) - if not isinstance(refs, dict): - continue - - for key, ref in refs.items(): - if not isinstance(ref, dict): - continue - - entry = {"key": key} - - if ref.get("id") is not None: - entry["id"] = ref["id"] - if ref.get("slug") is not None: - entry["slug"] = ref["slug"] - if ref.get("version") is not None: - entry["version"] = ref["version"] - - dedup_key = ( - entry.get("id"), - entry["key"], - entry.get("slug"), - entry.get("version"), - ) - if dedup_key in seen: - continue - seen.add(dedup_key) - - refs_out.append(entry) - - if refs_out: - conn.execute( - sa.text( - 'UPDATE evaluation_runs SET "references" = :refs WHERE id = :id' - ), - {"refs": json.dumps(refs_out), "id": run_id}, - ) - - -def downgrade() -> None: - conn = op.get_bind() - conn.execute(sa.text('UPDATE evaluation_runs SET "references" = NULL')) diff --git a/api/oss/databases/postgres/migrations/core/versions/5a71b3f140ab_fix_all_preview_schemas.py b/api/oss/databases/postgres/migrations/core/versions/5a71b3f140ab_fix_all_preview_schemas.py deleted file mode 100644 index 62d244d1e1..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/5a71b3f140ab_fix_all_preview_schemas.py +++ /dev/null @@ -1,426 +0,0 @@ -"""fix all preview schemas - -Revision ID: 5a71b3f140ab -Revises: 8089ee7692d1 -Create Date: 2025-09-03 14:28:06.362553 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -revision: str = "5a71b3f140ab" -down_revision: Union[str, None] = "8089ee7692d1" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # EVALUATION RUNS ---------------------------------------------------------- - - op.add_column( - "evaluation_runs", - sa.Column( - "references", - postgresql.JSONB(none_as_null=True, astext_type=sa.Text()), - nullable=True, - ), - ) - - op.create_index( - "ix_evaluation_runs_references", - "evaluation_runs", - ["references"], - unique=False, - postgresql_using="gin", - postgresql_ops={"references": "jsonb_path_ops"}, - ) - op.create_index( - "ix_evaluation_runs_flags", - "evaluation_runs", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_runs_tags", - "evaluation_runs", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.add_column( - "evaluation_scenarios", - sa.Column( - "interval", - postgresql.INTEGER(), - nullable=True, - ), - ) - - op.create_index( - "ix_evaluation_scenarios_timestamp_interval", - "evaluation_scenarios", - ["timestamp", "interval"], - unique=False, - ) - op.create_index( - "ix_evaluation_scenarios_flags", - "evaluation_scenarios", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_scenarios_tags", - "evaluation_scenarios", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # EVALUATION RESULTS ------------------------------------------------------- - - op.alter_column( - "evaluation_steps", - "timestamp", - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=True, - ) - op.add_column( - "evaluation_steps", - sa.Column( - "interval", - postgresql.INTEGER(), - nullable=True, - ), - ) - - op.create_unique_constraint( - "uq_evaluation_steps_project_run_scenario_step_repeat", - "evaluation_steps", - ["project_id", "run_id", "scenario_id", "step_key", "repeat_idx"], - ) - - op.create_index( - "ix_evaluation_steps_tags", - "evaluation_steps", - ["tags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_steps_flags", - "evaluation_steps", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_steps_timestamp_interval", - "evaluation_steps", - ["timestamp", "interval"], - unique=False, - ) - op.create_index( - "ix_evaluation_steps_repeat_idx", - "evaluation_steps", - ["repeat_idx"], - unique=False, - ) - op.create_index( - "ix_evaluation_steps_step_key", - "evaluation_steps", - ["step_key"], - unique=False, - ) - - op.rename_table("evaluation_steps", "evaluation_results") - - op.execute( - "ALTER TABLE evaluation_results RENAME CONSTRAINT " - "uq_evaluation_steps_project_run_scenario_step_repeat TO " - "uq_evaluation_results_project_run_scenario_step_repeat" - ) - - op.execute( - "ALTER INDEX ix_evaluation_steps_project_id RENAME TO ix_evaluation_results_project_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_run_id RENAME TO ix_evaluation_results_run_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_scenario_id RENAME TO ix_evaluation_results_scenario_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_step_key RENAME TO ix_evaluation_results_step_key" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_repeat_idx RENAME TO ix_evaluation_results_repeat_idx" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_timestamp_interval RENAME TO ix_evaluation_results_timestamp_interval" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_flags RENAME TO ix_evaluation_results_flags" - ) - op.execute( - "ALTER INDEX ix_evaluation_steps_tags RENAME TO ix_evaluation_results_tags" - ) - - # EVALUATION METRICS ------------------------------------------------------- - - op.add_column( - "evaluation_metrics", - sa.Column( - "interval", - postgresql.INTEGER(), - nullable=True, - ), - ) - - op.drop_constraint( - op.f("evaluation_metrics_project_id_run_id_scenario_id_key"), - "evaluation_metrics", - type_="unique", - ) - - op.create_unique_constraint( - "uq_evaluation_metrics_project_run_scenario_timestamp_interval", - "evaluation_metrics", - ["project_id", "run_id", "scenario_id", "timestamp", "interval"], - ) - - op.create_index( - "ix_evaluation_metrics_timestamp_interval", - "evaluation_metrics", - ["timestamp", "interval"], - unique=False, - ) - op.create_index( - "ix_evaluation_metrics_flags", - "evaluation_metrics", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_metrics_tags", - "evaluation_metrics", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # EVALUATION QUEUES -------------------------------------------------------- - - op.add_column( - "evaluation_queues", - sa.Column( - "name", - sa.String(), - nullable=True, - ), - ) - op.add_column( - "evaluation_queues", - sa.Column( - "description", - sa.String(), - nullable=True, - ), - ) - op.add_column( - "evaluation_queues", - sa.Column( - "status", - sa.VARCHAR(), - nullable=False, - server_default=sa.text("'pending'::varchar"), - ), - ) - - op.create_index( - "ix_evaluation_queues_flags", - "evaluation_queues", - ["flags"], - unique=False, - postgresql_using="gin", - ) - op.create_index( - "ix_evaluation_queues_tags", - "evaluation_queues", - ["tags"], - unique=False, - postgresql_using="gin", - ) - - # -------------------------------------------------------------------------- - - -def downgrade() -> None: - # EVALUATION QUEUES -------------------------------------------------------- - - op.drop_index( - "ix_evaluation_queues_tags", - table_name="evaluation_queues", - ) - op.drop_index( - "ix_evaluation_queues_flags", - table_name="evaluation_queues", - ) - - op.drop_column( - "evaluation_queues", - "status", - ) - op.drop_column( - "evaluation_queues", - "description", - ) - op.drop_column( - "evaluation_queues", - "name", - ) - - # EVALUATION METRICS ------------------------------------------------------- - - op.drop_index( - "ix_evaluation_metrics_tags", - table_name="evaluation_metrics", - ) - op.drop_index( - "ix_evaluation_metrics_flags", - table_name="evaluation_metrics", - ) - op.drop_index( - "ix_evaluation_metrics_timestamp_interval", - table_name="evaluation_metrics", - ) - - op.drop_constraint( - "uq_evaluation_metrics_project_run_scenario_timestamp_interval", - "evaluation_metrics", - type_="unique", - ) - - op.create_unique_constraint( - op.f("evaluation_metrics_project_id_run_id_scenario_id_key"), - "evaluation_metrics", - ["project_id", "run_id", "scenario_id"], - postgresql_nulls_not_distinct=False, - ) - - op.drop_column("evaluation_metrics", "interval") - - # EVALUATION RESULTS ------------------------------------------------------- - - op.execute( - "ALTER INDEX ix_evaluation_results_tags RENAME TO ix_evaluation_steps_tags" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_flags RENAME TO ix_evaluation_steps_flags" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_timestamp_interval RENAME TO ix_evaluation_steps_timestamp_interval" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_repeat_idx RENAME TO ix_evaluation_steps_repeat_idx" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_step_key RENAME TO ix_evaluation_steps_step_key" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_scenario_id RENAME TO ix_evaluation_steps_scenario_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_run_id RENAME TO ix_evaluation_steps_run_id" - ) - op.execute( - "ALTER INDEX ix_evaluation_results_project_id RENAME TO ix_evaluation_steps_project_id" - ) - - op.execute( - "ALTER TABLE evaluation_results RENAME CONSTRAINT uq_evaluation_results_project_run_scenario_step_repeat " - "TO uq_evaluation_steps_project_run_scenario_step_repeat" - ) - - op.rename_table("evaluation_results", "evaluation_steps") - - op.drop_index( - "ix_evaluation_steps_tags", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_flags", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_timestamp_interval", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_repeat_idx", - table_name="evaluation_steps", - ) - op.drop_index( - "ix_evaluation_steps_step_key", - table_name="evaluation_steps", - ) - - op.drop_constraint( - "uq_evaluation_steps_project_run_scenario_step_repeat", - "evaluation_steps", - type_="unique", - ) - - op.alter_column( - "evaluation_steps", - "timestamp", - existing_type=postgresql.TIMESTAMP(timezone=True), - nullable=False, - ) - - op.drop_column("evaluation_steps", "interval") - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.drop_index( - "ix_evaluation_scenarios_tags", - table_name="evaluation_scenarios", - ) - op.drop_index( - "ix_evaluation_scenarios_flags", - table_name="evaluation_scenarios", - ) - op.drop_index( - "ix_evaluation_scenarios_timestamp_interval", - table_name="evaluation_scenarios", - ) - - op.drop_column("evaluation_scenarios", "interval") - - # EVALUATION RUNS ---------------------------------------------------------- - - op.drop_index( - "ix_evaluation_runs_tags", - table_name="evaluation_runs", - ) - op.drop_index( - "ix_evaluation_runs_flags", - table_name="evaluation_runs", - ) - op.drop_index( - "ix_evaluation_runs_references", - table_name="evaluation_runs", - ) - - op.drop_column("evaluation_runs", "references") - - # -------------------------------------------------------------------------- diff --git a/api/oss/databases/postgres/migrations/core/versions/6cfe239894fb_set_user_id_column_in_db_entities_to_be_.py b/api/oss/databases/postgres/migrations/core/versions/6cfe239894fb_set_user_id_column_in_db_entities_to_be_.py index c8a712221f..244cbf6759 100644 --- a/api/oss/databases/postgres/migrations/core/versions/6cfe239894fb_set_user_id_column_in_db_entities_to_be_.py +++ b/api/oss/databases/postgres/migrations/core/versions/6cfe239894fb_set_user_id_column_in_db_entities_to_be_.py @@ -1,7 +1,7 @@ """Set user_id column in db entities to be optional --- prep for project_id scoping Revision ID: 6cfe239894fb -Revises: 911e6034d05e +Revises: 362gbs21a2ee Create Date: 2024-09-12 15:25:29.462793 """ @@ -14,7 +14,7 @@ # revision identifiers, used by Alembic. revision: str = "6cfe239894fb" -down_revision: Union[str, None] = "911e6034d05e" +down_revision: Union[str, None] = "362gbs21a2ee" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None diff --git a/api/oss/databases/postgres/migrations/core/versions/8089ee7692d1_cleanup_preview_entities.py b/api/oss/databases/postgres/migrations/core/versions/8089ee7692d1_cleanup_preview_entities.py deleted file mode 100644 index 36e9e4edd4..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/8089ee7692d1_cleanup_preview_entities.py +++ /dev/null @@ -1,168 +0,0 @@ -"""clean up preview entities - -Revision ID: 8089ee7692d1 -Revises: fa07e07350bf -Create Date: 2025-08-20 16:00:00.00000000 - -""" - -from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa - -# revision identifiers, used by Alembic. -revision: str = "8089ee7692d1" -down_revision: Union[str, None] = "fa07e07350bf" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -TABLES_WITH_DATA_MIGRATION = [ - "evaluation_runs", - "evaluation_metrics", - "evaluation_queues", - "testcase_blobs", - "testset_revisions", - "query_revisions", - "workflow_revisions", -] - -TABLES_WITH_META_MIGRATION = [ - "evaluation_runs", - "evaluation_scenarios", - "evaluation_steps", - "evaluation_metrics", - "evaluation_queues", - "testcase_blobs", - "testset_artifacts", - "testset_variants", - "testset_revisions", - "query_artifacts", - "query_variants", - "query_revisions", - "workflow_artifacts", - "workflow_variants", - "workflow_revisions", -] - - -def upgrade() -> None: - # Convert jsonb -> json for data columns - for table in TABLES_WITH_DATA_MIGRATION: - op.alter_column( - table_name=table, - column_name="data", - type_=sa.JSON(), - postgresql_using="data::json", - ) - - # Convert jsonb -> json for meta columns - for table in TABLES_WITH_META_MIGRATION: - op.alter_column( - table_name=table, - column_name="meta", - type_=sa.JSON(), - postgresql_using="meta::json", - ) - - # Add new timestamp column - op.add_column( - "evaluation_scenarios", - sa.Column( - "timestamp", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - ) - - # Add repeat_idx and drop old repeat_id + retry_id - op.add_column( - "evaluation_steps", - sa.Column( - "repeat_idx", - sa.Integer(), - nullable=True, - ), - ) - op.drop_column( - "evaluation_steps", - "repeat_id", - ) - op.drop_column( - "evaluation_steps", - "retry_id", - ) - - # Rename key -> step_key - op.alter_column( - "evaluation_steps", - "key", - new_column_name="step_key", - existing_type=sa.String(), # adjust if needed - existing_nullable=False, - ) - - op.drop_column( - "evaluation_metrics", - "interval", - ) - - -def downgrade() -> None: - op.add_column( - "evaluation_metrics", - sa.Column( - "interval", - sa.Integer(), - nullable=True, - ), - ) - - # Rename step_key back to key - op.alter_column( - "evaluation_steps", - "step_key", - new_column_name="key", - existing_type=sa.String(), # adjust if needed - existing_nullable=False, - ) - - # Recreate repeat_id and retry_id columns - op.add_column( - "evaluation_steps", - sa.Column("repeat_id", sa.UUID(), nullable=False), - ) - op.add_column( - "evaluation_steps", - sa.Column("retry_id", sa.UUID(), nullable=False), - ) - - # Drop repeat_idx column - op.drop_column( - "evaluation_steps", - "repeat_idx", - ) - - # Drop timestamp column - op.drop_column( - "evaluation_scenarios", - "timestamp", - ) - - # Convert meta columns back to jsonb - for table in TABLES_WITH_META_MIGRATION: - op.alter_column( - table_name=table, - column_name="meta", - type_=sa.dialects.postgresql.JSONB(), - postgresql_using="meta::jsonb", - ) - - # Convert data columns back to jsonb - for table in TABLES_WITH_DATA_MIGRATION: - op.alter_column( - table_name=table, - column_name="data", - type_=sa.dialects.postgresql.JSONB(), - postgresql_using="data::jsonb", - ) diff --git a/api/oss/databases/postgres/migrations/core/versions/863f8ebc200f_extend_app_type_again.py b/api/oss/databases/postgres/migrations/core/versions/863f8ebc200f_extend_app_type_again.py deleted file mode 100644 index 7a52c3d62a..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/863f8ebc200f_extend_app_type_again.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Extend app_type - -Revision ID: 863f8ebc200f -Revises: 3b5f5652f611 -Create Date: 2025-01-08 10:24:00 -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = "863f8ebc200f" -down_revision: Union[str, None] = "3b5f5652f611" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -# The table/column that uses the enum -TABLE = "app_db" -COLUMN = "app_type" -TYPE_NAME = "app_type_enum" -TYPE_TEMP = "app_type_enum_temp" - -# Exact labels -ORIGINAL = ( - "CHAT_TEMPLATE", - "COMPLETION_TEMPLATE", - "CHAT_SERVICE", - "COMPLETION_SERVICE", - "CUSTOM", -) -EXTENDED = ORIGINAL + ("SDK_CUSTOM",) - - -def _create_enum(name: str, labels: tuple[str, ...]) -> None: - labels_sql = ",".join(f"'{v}'" for v in labels) - op.execute(f"CREATE TYPE {name} AS ENUM ({labels_sql})") - - -def _retype_column(to_type: str) -> None: - op.execute( - f""" - ALTER TABLE {TABLE} - ALTER COLUMN {COLUMN} - TYPE {to_type} - USING {COLUMN}::text::{to_type} - """ - ) - - -def upgrade(): - # 1) Create the replacement enum with ALL desired values - _create_enum(TYPE_TEMP, EXTENDED) - - # 2) Point the column to the tmp type - _retype_column(TYPE_TEMP) - - # 3) Drop old type and rename tmp to the canonical name - op.execute(f"DROP TYPE {TYPE_NAME}") - op.execute(f"ALTER TYPE {TYPE_TEMP} RENAME TO {TYPE_NAME}") - - -def downgrade(): - # 1) Recreate the enum WITHOUT the added values - _create_enum(TYPE_TEMP, ORIGINAL) - - # 2) Point the column back to the original label set - _retype_column(TYPE_TEMP) - - # 3) Drop current type and rename tmp back to the canonical name - op.execute(f"DROP TYPE {TYPE_NAME}") - op.execute(f"ALTER TYPE {TYPE_TEMP} RENAME TO {TYPE_NAME}") diff --git a/api/oss/databases/postgres/migrations/core/versions/911e6034d05e_add_default_project.py b/api/oss/databases/postgres/migrations/core/versions/911e6034d05e_add_default_project.py deleted file mode 100644 index 4abb6c9f3f..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/911e6034d05e_add_default_project.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Add default project to database - -Revision ID: 911e6034d05e -Revises: c5ae28e37102 -Create Date: 2024-09-04 14:28:06.934841 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - -from oss.databases.postgres.migrations.core.data_migrations.projects import ( - create_default_project, - remove_default_project, -) - - -# revision identifiers, used by Alembic. -revision: str = "911e6034d05e" -down_revision: Union[str, None] = "c5ae28e37102" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### custom command ### - create_default_project() - # ### end custom command ### - - -def downgrade() -> None: - # ### custom command ### - remove_default_project() - # ### end custom command ### diff --git a/api/oss/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py b/api/oss/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py index 147cd042f8..50efe3b02e 100644 --- a/api/oss/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py +++ b/api/oss/databases/postgres/migrations/core/versions/91d3b4a8c27f_fix_ag_config.py @@ -1,5 +1,4 @@ """Fix ag_config - Revision ID: 91d3b4a8c27f Revises: 7cc66fc40298 Create Date: 2025-04-24 11:00:00 diff --git a/api/oss/databases/postgres/migrations/core/versions/aa1b2c3d4e5f_migrate_config_parameters_jsonb_to_json.py b/api/oss/databases/postgres/migrations/core/versions/aa1b2c3d4e5f_migrate_config_parameters_jsonb_to_json.py deleted file mode 100644 index b8a00e90c0..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/aa1b2c3d4e5f_migrate_config_parameters_jsonb_to_json.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Migrate config_parameters from JSONB to JSON - -Revision ID: aa1b2c3d4e5f -Revises: d5d4d6bf738f -Create Date: 2025-01-08 12:00:00 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - - -# revision identifiers, used by Alembic. -revision: str = "aa1b2c3d4e5f" -down_revision: Union[str, None] = "d5d4d6bf738f" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade(): - """ - Migrate config_parameters from JSONB to JSON type to preserve key ordering. - This involves: - 1. Creating new JSON columns - 2. Copying data from JSONB to JSON - 3. Dropping old JSONB columns - 4. Renaming new columns to original names - """ - - # Step 1: Add new JSON columns with temporary names - op.add_column( - "app_variants", - sa.Column("config_parameters_json_temp", sa.JSON(), nullable=True), - ) - - op.add_column( - "app_variant_revisions", - sa.Column("config_parameters_json_temp", sa.JSON(), nullable=True), - ) - - # Step 2: Copy data from JSONB to JSON columns - # For app_variants table - op.execute( - """ - UPDATE app_variants - SET config_parameters_json_temp = config_parameters::json - """ - ) - - # For app_variant_revisions table - op.execute( - """ - UPDATE app_variant_revisions - SET config_parameters_json_temp = config_parameters::json - """ - ) - - # Step 3: Drop the old JSONB columns - op.drop_column("app_variants", "config_parameters") - op.drop_column("app_variant_revisions", "config_parameters") - - # Step 4: Rename the new JSON columns to the original names - op.alter_column( - "app_variants", - "config_parameters_json_temp", - new_column_name="config_parameters", - nullable=False, - server_default="{}", - ) - - op.alter_column( - "app_variant_revisions", - "config_parameters_json_temp", - new_column_name="config_parameters", - nullable=False, - ) - - -def downgrade(): - """ - Migrate config_parameters from JSON back to JSONB type. - """ - - # Step 1: Add new JSONB columns with temporary names - op.add_column( - "app_variants", - sa.Column("config_parameters_jsonb_temp", postgresql.JSONB(), nullable=True), - ) - - op.add_column( - "app_variant_revisions", - sa.Column("config_parameters_jsonb_temp", postgresql.JSONB(), nullable=True), - ) - - # Step 2: Copy data from JSON to JSONB columns - # For app_variants table - op.execute( - """ - UPDATE app_variants - SET config_parameters_jsonb_temp = config_parameters::jsonb - """ - ) - - # For app_variant_revisions table - op.execute( - """ - UPDATE app_variant_revisions - SET config_parameters_jsonb_temp = config_parameters::jsonb - """ - ) - - # Step 3: Drop the old JSON columns - op.drop_column("app_variants", "config_parameters") - op.drop_column("app_variant_revisions", "config_parameters") - - # Step 4: Rename the new JSONB columns to the original names - op.alter_column( - "app_variants", - "config_parameters_jsonb_temp", - new_column_name="config_parameters", - nullable=False, - ) - - op.alter_column( - "app_variant_revisions", - "config_parameters_jsonb_temp", - new_column_name="config_parameters", - nullable=False, - ) diff --git a/api/oss/databases/postgres/migrations/core/versions/b3f15a7140ab_add_version_to_eval_entities.py b/api/oss/databases/postgres/migrations/core/versions/b3f15a7140ab_add_version_to_eval_entities.py deleted file mode 100644 index f6a9d6a9af..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/b3f15a7140ab_add_version_to_eval_entities.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Add version to evaluation entities - -Revision ID: b3f15a7140ab -Revises: 5a71b3f140ab -Create Date: 2025-10-03 14:30:00.000000 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -revision: str = "b3f15a7140ab" -down_revision: Union[str, None] = "5a71b3f140ab" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # BASED ON - # version = Column( - # String, - # nullable=True, - # ) - - # EVALUATION RUNS ---------------------------------------------------------- - - op.add_column( - "evaluation_runs", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.add_column( - "evaluation_scenarios", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION RESULTS ------------------------------------------------------- - - op.add_column( - "evaluation_results", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION METRICS ------------------------------------------------------- - - op.add_column( - "evaluation_metrics", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # EVALUATION QUEUES -------------------------------------------------------- - - op.add_column( - "evaluation_queues", - sa.Column( - "version", - sa.String(), - nullable=True, - ), - ) - - # -------------------------------------------------------------------------- - - -def downgrade() -> None: - # EVALUATION QUEUES -------------------------------------------------------- - - op.drop_column("evaluation_queues", "version") - - # EVALUATION METRICS ------------------------------------------------------- - - op.drop_column("evaluation_metrics", "version") - - # EVALUATION RESULTS ------------------------------------------------------- - - op.drop_column("evaluation_results", "version") - - # EVALUATION SCENARIOS ----------------------------------------------------- - - op.drop_column("evaluation_scenarios", "version") - - # EVALUATION RUNS ---------------------------------------------------------- - - op.drop_column("evaluation_runs", "version") - - # -------------------------------------------------------------------------- diff --git a/api/oss/databases/postgres/migrations/core/versions/baa02d66a365_migrate_code_evaluators.py b/api/oss/databases/postgres/migrations/core/versions/baa02d66a365_migrate_code_evaluators.py deleted file mode 100644 index 7363127679..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/baa02d66a365_migrate_code_evaluators.py +++ /dev/null @@ -1,63 +0,0 @@ -"""migrate data.script from string to object - -Revision ID: baa02d66a365 -Revises: 863f8ebc200f -Create Date: 2025-11-06 15:49:00 -""" - -from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = "baa02d66a365" -down_revision: Union[str, None] = "863f8ebc200f" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # Convert data.script from a JSON string to: - # {"content": , "runtime": "python"} - op.execute( - sa.text( - """ - UPDATE public.workflow_revisions - SET data = jsonb_set( - data::jsonb, - '{script}', - jsonb_build_object( - 'content', data->>'script', - 'runtime', 'python' - ) - )::json - WHERE data->>'script' IS NOT NULL - AND json_typeof(data->'script') = 'string'; - """ - ) - ) - - -def downgrade() -> None: - # Revert only objects shaped like: - # {"content": , "runtime": "python"} -> "" - op.execute( - sa.text( - """ - UPDATE public.workflow_revisions - SET data = jsonb_set( - data::jsonb, - '{script}', - to_jsonb( (data->'script'->>'content') ) - )::json - WHERE json_typeof(data->'script') = 'object' - AND (data->'script') ? 'content' - AND json_typeof(data->'script'->'content') = 'string' - AND ( - (data->'script' ? 'runtime') IS FALSE - OR (data->'script'->>'runtime') = 'python' - ); - """ - ) - ) diff --git a/api/oss/databases/postgres/migrations/core/versions/d5d4d6bf738f_add_evaluation_queues.py b/api/oss/databases/postgres/migrations/core/versions/d5d4d6bf738f_add_evaluation_queues.py deleted file mode 100644 index 6d39d973aa..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/d5d4d6bf738f_add_evaluation_queues.py +++ /dev/null @@ -1,116 +0,0 @@ -"""add evaluation queues - -Revision ID: d5d4d6bf738f -Revises: fd77265d65dc -Create Date: 2025-07-10 17:04:00.000000 -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision: str = "d5d4d6bf738f" -down_revision: Union[str, None] = "fd77265d65dc" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - op.create_table( - "evaluation_queues", - sa.Column( - "project_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "created_at", - sa.TIMESTAMP(timezone=True), - server_default=sa.text("CURRENT_TIMESTAMP"), - nullable=False, - ), - sa.Column( - "updated_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "deleted_at", - sa.TIMESTAMP(timezone=True), - nullable=True, - ), - sa.Column( - "created_by_id", - sa.UUID(), - nullable=False, - ), - sa.Column( - "updated_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "deleted_by_id", - sa.UUID(), - nullable=True, - ), - sa.Column( - "flags", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "tags", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "meta", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "data", - postgresql.JSONB(none_as_null=True), - nullable=True, - ), - sa.Column( - "run_id", - sa.UUID(), - nullable=False, - ), - sa.PrimaryKeyConstraint( - "project_id", - "id", - ), - sa.ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["project_id", "run_id"], - ["evaluation_runs.project_id", "evaluation_runs.id"], - ondelete="CASCADE", - ), - sa.Index( - "ix_evaluation_queues_project_id", - "project_id", - ), - sa.Index( - "ix_evaluation_queues_run_id", - "run_id", - ), - ) - - -def downgrade() -> None: - op.drop_table("evaluation_queues") diff --git a/api/oss/databases/postgres/migrations/core/versions/fa07e07350bf_add_timestamp_to_metrics.py b/api/oss/databases/postgres/migrations/core/versions/fa07e07350bf_add_timestamp_to_metrics.py deleted file mode 100644 index c6d85c7467..0000000000 --- a/api/oss/databases/postgres/migrations/core/versions/fa07e07350bf_add_timestamp_to_metrics.py +++ /dev/null @@ -1,34 +0,0 @@ -"""add timestamp to metrics - -Revision ID: fa07e07350bf -Revises: 30dcf07de96a -Create Date: 2025-07-30 14:55:00.000000 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - -# revision identifiers, used by Alembic. -revision: str = "fa07e07350bf" -down_revision: Union[str, None] = "30dcf07de96a" -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - op.add_column( - "evaluation_metrics", - sa.Column("timestamp", sa.TIMESTAMP(timezone=True), nullable=True), - ) - op.add_column( - "evaluation_metrics", - sa.Column("interval", sa.INTEGER(), nullable=True), - ) - - -def downgrade() -> None: - op.drop_column("evaluation_metrics", "interval") - op.drop_column("evaluation_metrics", "timestamp") diff --git a/api/oss/databases/postgres/migrations/find_head.py b/api/oss/databases/postgres/migrations/find_head.py index c435c485a9..9f024bc62f 100644 --- a/api/oss/databases/postgres/migrations/find_head.py +++ b/api/oss/databases/postgres/migrations/find_head.py @@ -43,6 +43,4 @@ # head(s) = revisions that are not anyone's down_revision heads = [rev for rev in revisions if rev not in all_down_revisions] -print("---------") -print() print("Heads:", heads) diff --git a/api/oss/databases/postgres/migrations/runner.py b/api/oss/databases/postgres/migrations/runner.py deleted file mode 100644 index f2b5fbbfb9..0000000000 --- a/api/oss/databases/postgres/migrations/runner.py +++ /dev/null @@ -1,21 +0,0 @@ -import asyncio - -from oss.databases.postgres.migrations.utils import ( - split_core_and_tracing, - copy_nodes_from_core_to_tracing, -) -from oss.databases.postgres.migrations.core.utils import ( - run_alembic_migration as migrate_core, -) -from oss.databases.postgres.migrations.tracing.utils import ( - run_alembic_migration as migrate_tracing, -) - - -if __name__ == "__main__": - loop = asyncio.get_event_loop() - - loop.run_until_complete(split_core_and_tracing()) - migrate_core() - migrate_tracing() - loop.run_until_complete(copy_nodes_from_core_to_tracing()) diff --git a/api/oss/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py b/api/oss/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py index 4b6903973b..30be9c9a30 100644 --- a/api/oss/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py +++ b/api/oss/databases/postgres/migrations/tracing/versions/847972cfa14a_add_nodes.py @@ -1,7 +1,7 @@ """add_nodes_dbe Revision ID: 847972cfa14a -Revises: 58b1b61e5d6c +Revises: 320a4a7ee0c7 Create Date: 2024-11-07 12:21:19.080345 """ diff --git a/api/oss/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py b/api/oss/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py index 6cb4e3f963..ea97f876d6 100644 --- a/api/oss/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py +++ b/api/oss/databases/postgres/migrations/tracing/versions/fd77265d65dc_fix_spans.py @@ -66,25 +66,11 @@ def upgrade() -> None: "ix_spans_project_id_trace_type", "spans", ["project_id", "trace_type"], - if_not_exists=True, ) op.create_index( "ix_spans_project_id_span_type", "spans", ["project_id", "span_type"], - if_not_exists=True, - ) - op.create_index( - "ix_spans_project_id_trace_id_created_at", - "spans", - ["project_id", "trace_id", sa.text("created_at DESC")], - if_not_exists=True, - ) - op.create_index( - "ix_spans_project_id_trace_id_start_time", - "spans", - ["project_id", "trace_id", sa.text("start_time DESC")], - if_not_exists=True, ) op.create_index( "ix_hashes_gin", @@ -92,110 +78,29 @@ def upgrade() -> None: ["hashes"], postgresql_using="gin", postgresql_ops={"hashes": "jsonb_path_ops"}, - if_not_exists=True, - ) - op.drop_index( - "ix_events_gin", - table_name="spans", - if_exists=True, - ) - op.create_index( - "ix_events_gin", - "spans", # replace with your table name - ["events"], - postgresql_using="gin", - postgresql_ops={"events": "jsonb_path_ops"}, - if_not_exists=True, ) op.create_index( - "ix_spans_fts_attributes_gin", + "ix_spans_fts_gin", "spans", [sa.text("to_tsvector('simple', attributes)")], postgresql_using="gin", - if_not_exists=True, - ) - op.create_index( - "ix_spans_fts_events_gin", - "spans", - [sa.text("to_tsvector('simple', events)")], - postgresql_using="gin", - if_not_exists=True, ) # -------------------------------------------------------------------------- def downgrade() -> None: # - SPANS ------------------------------------------------------------------ - op.drop_index( - "ix_spans_fts_events_gin", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_fts_attributes_gin", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_events_gin", - table_name="spans", - if_exists=True, - ) - op.create_index( - "ix_events_gin", - "spans", - ["events"], - postgresql_using="gin", - if_not_exists=True, - ) - op.drop_index( - "ix_hashes_gin", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_trace_id_start_time", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_trace_id_created_at", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_span_type", - table_name="spans", - if_exists=True, - ) - op.drop_index( - "ix_spans_project_id_trace_type", - table_name="spans", - if_exists=True, - ) - op.drop_column( - "spans", - "exception", - if_exists=True, - ) - op.drop_column( - "spans", - "hashes", - if_exists=True, - ) - op.drop_column( - "spans", - "span_type", - if_exists=True, - ) - op.drop_column( - "spans", - "trace_type", - if_exists=True, - ) + # op.drop_index("ix_spans_fts", table_name="spans") + op.drop_index("ix_hashes_gin", table_name="spans") + op.drop_index("ix_spans_project_id_span_type", table_name="spans") + op.drop_index("ix_spans_project_id_trace_type", table_name="spans") + op.drop_column("spans", "exception") + op.drop_column("spans", "hashes") + op.drop_column("spans", "span_type") + op.drop_column("spans", "trace_type") - span_type_enum = sa.Enum(SpanType, name="spantype") - trace_type_enum = sa.Enum(TraceType, name="tracetype") + span_type_enum = sa.Enum(SpanType, name="tracetype") + trace_type_enum = sa.Enum(TraceType, name="spantype") span_type_enum.drop(op.get_bind(), checkfirst=True) trace_type_enum.drop(op.get_bind(), checkfirst=True) diff --git a/api/oss/databases/postgres/migrations/utils.py b/api/oss/databases/postgres/migrations/utils.py index 12450b767d..1147d9e5c7 100644 --- a/api/oss/databases/postgres/migrations/utils.py +++ b/api/oss/databases/postgres/migrations/utils.py @@ -1,10 +1,8 @@ import os -import subprocess import tempfile +import subprocess from sqlalchemy import create_engine, text -from sqlalchemy.ext.asyncio import create_async_engine - from sqlalchemy.exc import ProgrammingError from oss.src.utils.env import env @@ -15,9 +13,9 @@ os.getenv("POSTGRES_URI") or env.POSTGRES_URI_CORE or env.POSTGRES_URI_TRACING - or "postgresql+asyncpg://username:password@localhost:5432/agenta_oss" + or "postgresql://username:password@localhost:5432/agenta_oss" ) -DB_PROTOCOL = POSTGRES_URI.split("://")[0] # .replace("+asyncpg", "") +DB_PROTOCOL = POSTGRES_URI.split("://")[0].replace("+asyncpg", "") DB_USER = POSTGRES_URI.split("://")[1].split(":")[0] DB_PASS = POSTGRES_URI.split("://")[1].split(":")[1].split("@")[0] DB_HOST = POSTGRES_URI.split("@")[1].split(":")[0] @@ -35,43 +33,36 @@ "agenta_oss_tracing": "agenta_oss_tracing", } - NODES_TF = { "agenta_oss_core": "agenta_oss_tracing", } -async def copy_nodes_from_core_to_tracing(): - engine = create_async_engine( +def copy_nodes_from_core_to_tracing(): + engine = create_engine( POSTGRES_URI_POSTGRES, isolation_level="AUTOCOMMIT", ) - async with engine.begin() as conn: + with engine.connect() as conn: for old_name, new_name in NODES_TF.items(): - old_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": old_name}, - ) + old_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": old_name}, ).scalar() - new_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": new_name}, - ) + new_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": new_name}, ).scalar() if old_exists and new_exists: # Check if the nodes table exists in old_name database check_url = f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{old_name}" - check_engine = create_async_engine(check_url) - async with check_engine.begin() as conn: - result = ( - await conn.execute( - text("SELECT to_regclass('public.nodes')"), - ) + check_engine = create_engine(check_url) + with check_engine.connect() as conn: + result = conn.execute( + text("SELECT to_regclass('public.nodes')") ).scalar() if result is None: print( @@ -79,10 +70,8 @@ async def copy_nodes_from_core_to_tracing(): ) return - count = ( - await conn.execute( - text("SELECT COUNT(*) FROM public.nodes"), - ) + count = conn.execute( + text("SELECT COUNT(*) FROM public.nodes") ).scalar() if count == 0: @@ -92,18 +81,14 @@ async def copy_nodes_from_core_to_tracing(): return check_url = f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" - check_engine = create_async_engine(check_url) + check_engine = create_engine(check_url) - async with check_engine.begin() as conn: - count = ( - await conn.execute( - text( - "SELECT COUNT(*) FROM public.nodes", - ) - ) + with check_engine.connect() as conn: + count = conn.execute( + text("SELECT COUNT(*) FROM public.nodes") ).scalar() - if (count or 0) > 0: + if count > 0: print( f"⚠️ Table 'nodes' already exists in '{new_name}' with {count} rows. Skipping copy." ) @@ -163,26 +148,21 @@ async def copy_nodes_from_core_to_tracing(): print(f"✔ Restored 'nodes' table into '{new_name}'") # Step 3: Verify 'nodes' exists in both DBs, then drop from old - source_engine = create_async_engine( + source_engine = create_engine( f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{old_name}" ) - dest_engine = create_async_engine( + dest_engine = create_engine( f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" ) - async with source_engine.begin() as src, dest_engine.begin() as dst: - src = await src.execution_options(isolation_level="AUTOCOMMIT") - dst = await dst.execution_options(isolation_level="AUTOCOMMIT") - - src_exists = ( - await src.execute( - text("SELECT to_regclass('public.nodes')") - ) + with source_engine.connect().execution_options( + autocommit=True + ) as src, dest_engine.connect() as dst: + src_exists = src.execute( + text("SELECT to_regclass('public.nodes')") ).scalar() - dst_exists = ( - await dst.execute( - text("SELECT to_regclass('public.nodes')"), - ) + dst_exists = dst.execute( + text("SELECT to_regclass('public.nodes')") ).scalar() if src_exists and dst_exists: @@ -204,10 +184,8 @@ async def copy_nodes_from_core_to_tracing(): env={**os.environ, "PGPASSWORD": DB_PASS}, ) - count = ( - await src.execute( - text("SELECT COUNT(*) FROM public.nodes"), - ) + count = src.execute( + text("SELECT COUNT(*) FROM public.nodes") ).scalar() print(f"✅ Remaining rows: {count}") @@ -219,32 +197,28 @@ async def copy_nodes_from_core_to_tracing(): os.remove(dump_file) -async def split_core_and_tracing(): - engine = create_async_engine( +def split_core_and_tracing(): + engine = create_engine( POSTGRES_URI_POSTGRES, isolation_level="AUTOCOMMIT", ) - async with engine.begin() as conn: + with engine.connect() as conn: for old_name, new_name in RENAME_MAP.items(): - old_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": old_name}, - ) + old_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": old_name}, ).scalar() - new_exists = ( - await conn.execute( - text("SELECT 1 FROM pg_database WHERE datname = :name"), - {"name": new_name}, - ) + new_exists = conn.execute( + text("SELECT 1 FROM pg_database WHERE datname = :name"), + {"name": new_name}, ).scalar() if old_exists and not new_exists: print(f"Renaming database '{old_name}' → '{new_name}'...") try: - await conn.execute( + conn.execute( text(f"ALTER DATABASE {old_name} RENAME TO {new_name}") ) print(f"✔ Renamed '{old_name}' to '{new_name}'") @@ -262,7 +236,7 @@ async def split_core_and_tracing(): ) try: # Ensure the role exists - await conn.execute( + conn.execute( text( f""" DO $$ @@ -278,11 +252,11 @@ async def split_core_and_tracing(): print(f"✔ Ensured role '{DB_USER}' exists") # Create the new database - await conn.execute(text(f"CREATE DATABASE {new_name}")) + conn.execute(text(f"CREATE DATABASE {new_name}")) print(f"✔ Created database '{new_name}'") # Grant privileges on the database to the role - await conn.execute( + conn.execute( text( f"GRANT ALL PRIVILEGES ON DATABASE {new_name} TO {DB_USER}" ) @@ -292,12 +266,12 @@ async def split_core_and_tracing(): ) # Connect to the new database to grant schema permissions - new_db_url = f"{DB_PROTOCOL}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" + new_db_url = f"postgresql://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{new_name}" - async with create_async_engine( + with create_engine( new_db_url, isolation_level="AUTOCOMMIT" - ).begin() as new_db_conn: - await new_db_conn.execute( + ).connect() as new_db_conn: + new_db_conn.execute( text(f"GRANT ALL ON SCHEMA public TO {DB_USER}") ) print( diff --git a/api/oss/docker/Dockerfile.dev b/api/oss/docker/Dockerfile.dev index 8b500fd96e..1f25f8f92d 100644 --- a/api/oss/docker/Dockerfile.dev +++ b/api/oss/docker/Dockerfile.dev @@ -15,31 +15,10 @@ RUN apt-get update && \ RUN pip install --upgrade pip \ && pip install poetry -# COPY ./oss /app/oss/ COPY ./entrypoint.py ./pyproject.toml /app/ -# RUN poetry config virtualenvs.create false \ && poetry install --no-interaction --no-ansi -# - -ENV PYTHONPATH=/sdk:$PYTHONPATH - -# -# -# -# - -# -# - -COPY ./oss/src/crons/queries.sh /queries.sh -COPY ./oss/src/crons/queries.txt /etc/cron.d/queries-cron -RUN sed -i -e '$a\' /etc/cron.d/queries-cron -RUN cat -A /etc/cron.d/queries-cron - -RUN chmod +x /queries.sh \ - && chmod 0644 /etc/cron.d/queries-cron -EXPOSE 8000 +EXPOSE 8000 \ No newline at end of file diff --git a/api/oss/docker/Dockerfile.gh b/api/oss/docker/Dockerfile.gh index a9bd7c8365..d8c2477835 100644 --- a/api/oss/docker/Dockerfile.gh +++ b/api/oss/docker/Dockerfile.gh @@ -15,31 +15,10 @@ RUN apt-get update && \ RUN pip install --upgrade pip \ && pip install poetry -# COPY ./oss /app/oss/ COPY ./entrypoint.py ./pyproject.toml /app/ -COPY ./sdk /sdk/ RUN poetry config virtualenvs.create false \ - && poetry install --no-interaction --no-ansi \ - && pip install --force-reinstall --upgrade /sdk/ + && poetry install --no-interaction --no-ansi -# - -# -# -# -# - -# -# - -COPY ./oss/src/crons/queries.sh /queries.sh -COPY ./oss/src/crons/queries.txt /etc/cron.d/queries-cron -RUN sed -i -e '$a\' /etc/cron.d/queries-cron -RUN cat -A /etc/cron.d/queries-cron - -RUN chmod +x /queries.sh \ - && chmod 0644 /etc/cron.d/queries-cron - -EXPOSE 8000 +EXPOSE 8000 \ No newline at end of file diff --git a/api/oss/src/__init__.py b/api/oss/src/__init__.py index 65fef7aadf..d195868e9b 100644 --- a/api/oss/src/__init__.py +++ b/api/oss/src/__init__.py @@ -1,5 +1,5 @@ from urllib.parse import urlparse -from typing import Optional, Any, Dict, Union, List, Set +from typing import Optional, Any, Dict, Union, List from supertokens_python.types import AccountInfo from supertokens_python.asyncio import list_users_by_account_info @@ -42,9 +42,6 @@ SignUpPostOkResult as EmailPasswordSignUpPostOkResult, ) -import posthog - -from oss.src.utils.caching import get_cache, set_cache from oss.src.utils.env import env from oss.src.utils.common import is_ee from oss.src.services.exceptions import UnauthorizedException @@ -60,117 +57,12 @@ ) -async def _get_blocked_domains() -> Set[str]: - # 1. If env var is defined and is not empty, always use it - if env.AGENTA_BLOCKED_DOMAINS: - return env.AGENTA_BLOCKED_DOMAINS - - # 2. Else, try PostHog feature flags if API key is present - if env.POSTHOG_API_KEY: - feature_flag = "blocked-domains" - cache_key = { - "ff": feature_flag, - } - - # Try cache first - flag_blocked_domains: Optional[Set[str]] = await get_cache( - namespace="posthog:flags", - key=cache_key, - retry=False, - ) - - if flag_blocked_domains is not None: - return set(flag_blocked_domains) - - # Fetch from PostHog if not cached - flag_blocked_domains = posthog.get_feature_flag( - feature_flag, - "user distinct id", - ) - - # Normalize to set - blocked_set = list( - {e.strip().lower() for e in flag_blocked_domains} - if isinstance(flag_blocked_domains, (list, set, tuple)) - else set() - ) - - # Cache the result - await set_cache( - namespace="posthog:flags", - key=cache_key, - value=blocked_set, - ) - - return set(blocked_set) - - # 3. Else, return empty set - return set() - - -async def _get_blocked_emails() -> Set[str]: - # 1. If env var is defined and is not empty, always use it - if env.AGENTA_BLOCKED_EMAILS: - return env.AGENTA_BLOCKED_EMAILS - - # 2. Else, try PostHog feature flags if API key is present - if env.POSTHOG_API_KEY: - feature_flag = "blocked-emails" - cache_key = { - "ff": feature_flag, - } - - # Try cache first - flag_blocked_emails: Optional[Set[str]] = await get_cache( - namespace="posthog:flags", - key=cache_key, - retry=False, - ) - - if flag_blocked_emails is not None: - return set(flag_blocked_emails) - - # Fetch from PostHog if not cached - flag_blocked_emails = posthog.get_feature_flag( - feature_flag, - "user distinct id", - ) - - # Normalize to set - blocked_set = list( - {e.strip().lower() for e in flag_blocked_emails} - if isinstance(flag_blocked_emails, (list, set, tuple)) - else set() - ) - - # Cache the result - await set_cache( - namespace="posthog:flags", - key=cache_key, - value=blocked_set, - ) - - return set(blocked_set) - - # 3. Else, return empty set - return set() - - -async def _is_blocked(email: str) -> bool: +def _is_blocked(email: str) -> bool: email = email.lower() - domain = email.split("@")[-1] if "@" in email else "" - allowed_domains = env.AGENTA_ALLOWED_DOMAINS - is_domain_allowed = allowed_domains and domain in allowed_domains - - if allowed_domains and not is_domain_allowed: + if email in env.AGENTA_BLOCKED_EMAILS: return True - - if email and email in await _get_blocked_emails(): - return True - - if domain and domain in await _get_blocked_domains() and not is_domain_allowed: + if "@" in email and email.split("@")[-1] in env.AGENTA_BLOCKED_DOMAINS: return True - return False @@ -209,7 +101,7 @@ async def consume_code_post( # Post sign up response, we check if it was successful if isinstance(response, ConsumeCodeOkResult): - if is_ee() and await _is_blocked(response.user.emails[0]): + if is_ee() and _is_blocked(response.user.emails[0]): raise UnauthorizedException(detail="This email is not allowed.") payload = { "uid": response.user.id, @@ -254,7 +146,7 @@ async def thirdparty_sign_in_up_post( ) if isinstance(response, SignInUpPostOkResult): - if is_ee() and await _is_blocked(response.user.emails[0]): + if is_ee() and _is_blocked(response.user.emails[0]): raise UnauthorizedException(detail="This email is not allowed.") payload = { "uid": response.user.id, @@ -287,7 +179,7 @@ async def sign_in_post( user_context: Dict[str, Any], ): if form_fields[0].id == "email" and is_input_email(form_fields[0].value): - if is_ee() and await _is_blocked(form_fields[0].value): + if is_ee() and _is_blocked(form_fields[0].value): raise UnauthorizedException(detail="This email is not allowed.") user_id = await get_user_with_email(form_fields[0].value) if user_id is not None: @@ -324,7 +216,7 @@ async def sign_up_post( ): # FLOW 1: Sign in email = form_fields[0].value - if is_ee() and await _is_blocked(email): + if is_ee() and _is_blocked(email): raise UnauthorizedException(detail="This email is not allowed.") user_info_from_st = await list_users_by_account_info( tenant_id="public", account_info=AccountInfo(email=email) diff --git a/api/oss/src/apis/fastapi/annotations/models.py b/api/oss/src/apis/fastapi/annotations/models.py index 0d7444e203..ab6eb4c82c 100644 --- a/api/oss/src/apis/fastapi/annotations/models.py +++ b/api/oss/src/apis/fastapi/annotations/models.py @@ -1,20 +1,90 @@ -from typing import Optional, List +from typing import Optional, List, Dict +from enum import Enum from pydantic import BaseModel from oss.src.core.shared.dtos import ( + Lifecycle, + Data, + Tags, + Meta, + Reference, Link, Windowing, ) -from oss.src.core.annotations.types import ( - Annotation, - AnnotationCreate, - AnnotationEdit, - AnnotationQuery, -) -# ANNOTATIONS ------------------------------------------------------------------ +class AnnotationOrigin(str, Enum): + CUSTOM = "custom" + HUMAN = "human" + AUTO = "auto" + + +class AnnotationKind(str, Enum): + ADHOC = "adhoc" # adhoc annotation + EVAL = "eval" # evaluation annotation + + +class AnnotationChannel(str, Enum): + WEB = "web" + SDK = "sdk" # python vs typescript ? + API = "api" # http vs otlp ? + + +class AnnotationReferences(BaseModel): + evaluator: Reference + testset: Optional[Reference] = None + testcase: Optional[Reference] = None + + +AnnotationLinks = Dict[str, Link] + + +class Annotation(Link, Lifecycle): + origin: AnnotationOrigin = AnnotationOrigin.CUSTOM + kind: AnnotationKind = AnnotationKind.ADHOC + channel: AnnotationChannel = AnnotationChannel.API + + tags: Optional[Tags] = None + meta: Optional[Meta] = None + + data: Data + + references: AnnotationReferences + links: AnnotationLinks + + +class AnnotationCreate(BaseModel): + origin: AnnotationOrigin = AnnotationOrigin.CUSTOM + kind: AnnotationKind = AnnotationKind.ADHOC + channel: AnnotationChannel = AnnotationChannel.API + + tags: Optional[Tags] = None + meta: Optional[Meta] = None + + data: Data + + references: AnnotationReferences + links: AnnotationLinks + + +class AnnotationEdit(BaseModel): + tags: Optional[Tags] = None + meta: Optional[Meta] = None + + data: Data + + +class AnnotationQuery(BaseModel): + origin: Optional[AnnotationOrigin] = None + kind: Optional[AnnotationKind] = None + channel: Optional[AnnotationChannel] = None + + tags: Optional[Tags] = None + meta: Optional[Meta] = None + + references: Optional[AnnotationReferences] = None + links: Optional[AnnotationLinks | List[Link]] = None class AnnotationCreateRequest(BaseModel): @@ -27,9 +97,7 @@ class AnnotationEditRequest(BaseModel): class AnnotationQueryRequest(BaseModel): annotation: Optional[AnnotationQuery] = None - # annotation_links: Optional[List[Link]] = None - # windowing: Optional[Windowing] = None @@ -46,8 +114,3 @@ class AnnotationsResponse(BaseModel): class AnnotationLinkResponse(BaseModel): count: int = 0 annotation_link: Optional[Link] = None - - -class AnnotationLinksResponse(BaseModel): - count: int = 0 - annotation_links: List[Link] = [] diff --git a/api/oss/src/apis/fastapi/annotations/router.py b/api/oss/src/apis/fastapi/annotations/router.py index 85e67ec633..9cdee9db3b 100644 --- a/api/oss/src/apis/fastapi/annotations/router.py +++ b/api/oss/src/apis/fastapi/annotations/router.py @@ -1,27 +1,60 @@ -from typing import Optional, Union -from uuid import UUID +from typing import Optional, List +from uuid import uuid4 -from fastapi import APIRouter, Request, Response, status +from genson import SchemaBuilder + +from fastapi import APIRouter, Request, status, HTTPException, Response from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions from oss.src.utils.caching import get_cache, set_cache, invalidate_cache -from oss.src.core.shared.dtos import ( - Link, +from oss.src.core.shared.dtos import Flags, Tags, Meta, Data, Reference, Link, Windowing +from oss.src.core.tracing.dtos import OTelLink, OTelReference +from oss.src.core.tracing.dtos import Focus, Format, Query, Formatting, Filtering +from oss.src.core.workflows.service import WorkflowsService +from oss.src.core.tracing.service import TracingService +from oss.src.apis.fastapi.tracing.router import TracingRouter +from oss.src.apis.fastapi.evaluators.router import SimpleEvaluatorsRouter + +from oss.src.apis.fastapi.tracing.models import ( + OTelFlatSpan, + OTelTracingRequest, + OTelTracingResponse, +) + +from oss.src.apis.fastapi.evaluators.models import ( + SimpleEvaluatorFlags, + SimpleEvaluatorCreate, + SimpleEvaluatorCreateRequest, + SimpleEvaluatorQueryRequest, ) -from oss.src.core.annotations.service import ( - AnnotationsService, +from oss.src.apis.fastapi.annotations.models import Annotation + +from oss.src.apis.fastapi.annotations.utils import ( + validate_data_against_schema, + parse_into_attributes, + parse_from_attributes, ) from oss.src.apis.fastapi.annotations.models import ( AnnotationCreateRequest, AnnotationEditRequest, - AnnotationQueryRequest, AnnotationResponse, AnnotationsResponse, + AnnotationQueryRequest, AnnotationLinkResponse, + Annotation, + AnnotationOrigin, + AnnotationKind, + AnnotationChannel, + AnnotationReferences, + AnnotationLinks, +) + +from oss.src.apis.fastapi.annotations.utils import ( + AnnotationFlags, ) if is_ee(): @@ -33,18 +66,29 @@ class AnnotationsRouter: + VERSION = "v1" + def __init__( self, *, - annotations_service: AnnotationsService, + tracing_service: TracingService, + workflows_service: WorkflowsService, ): - self.annotations_service = annotations_service + self.tracing_service = tracing_service + self.workflows_service = workflows_service - self.router = APIRouter() + # Needed until we clean up the router/service # FIX ME / REMOVE ME # + self.tracing_router = TracingRouter( + tracing_service=self.tracing_service, + ) + + self.evaluators_router = SimpleEvaluatorsRouter( + workflows_service=self.workflows_service + ) - # ANNOTATIONS ---------------------------------------------------------- + self.router = APIRouter() - # POST /api/annotations/ + # POST /api/v1/annotations/ self.router.add_api_route( "/", self.create_annotation, @@ -55,18 +99,7 @@ def __init__( response_model_exclude_none=True, ) - # GET /api/annotations/{trace_id} - self.router.add_api_route( - "/{trace_id}", - self.fetch_annotation, - methods=["GET"], - operation_id="fetch_annotation_by_trace_id", - status_code=status.HTTP_200_OK, - response_model=AnnotationResponse, - response_model_exclude_none=True, - ) - - # GET /api/annotations/{trace_id}/{span_id} + # GET /api/v1/annotations/{trace_id}/{span_id} self.router.add_api_route( "/{trace_id}/{span_id}", self.fetch_annotation, @@ -76,19 +109,7 @@ def __init__( response_model=AnnotationResponse, response_model_exclude_none=True, ) - - # PUT /api/annotations/{trace_id} - self.router.add_api_route( - "/{trace_id}", - self.edit_annotation, - methods=["PATCH"], - operation_id="edit_annotation_by_trace_id", - status_code=status.HTTP_200_OK, - response_model=AnnotationResponse, - response_model_exclude_none=True, - ) - - # PUT /api/annotations/{trace_id}/{span_id} + # PUT /api/v1/annotations/{trace_id}/{span_id} self.router.add_api_route( "/{trace_id}/{span_id}", self.edit_annotation, @@ -99,29 +120,29 @@ def __init__( response_model_exclude_none=True, ) - # DELETE /api/annotations/{trace_id} + # DELETE /api/v1/annotations/{trace_id}/{span_id} self.router.add_api_route( - "/{trace_id}", + "/{trace_id}/{span_id}", self.delete_annotation, methods=["DELETE"], - operation_id="delete_annotation_by_trace_id", + operation_id="delete_annotation", status_code=status.HTTP_200_OK, response_model=AnnotationLinkResponse, response_model_exclude_none=True, ) - # DELETE /api/annotations/{trace_id}/{span_id} + # GET /api/v1/annotations/?... self.router.add_api_route( - "/{trace_id}/{span_id}", - self.delete_annotation, - methods=["DELETE"], - operation_id="delete_annotation", + "/", + self.query_annotations, + methods=["GET"], + operation_id="list_annotations", status_code=status.HTTP_200_OK, - response_model=AnnotationLinkResponse, + response_model=AnnotationResponse, response_model_exclude_none=True, ) - # POST /api/annotations/query # FIX ME / REMOVE ME # + # POST /api/v1/annotations/query # FIX ME / REMOVE ME # self.router.add_api_route( "/query", self.query_annotations, @@ -132,32 +153,152 @@ def __init__( response_model_exclude_none=True, ) - # ANNOTATIONS -------------------------------------------------------------- - @intercept_exceptions() async def create_annotation( self, - request: Request, *, + request: Request, annotation_create_request: AnnotationCreateRequest, ) -> AnnotationResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_ANNOTATIONS, # type: ignore + permission=Permission.EDIT_ANNOTATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - annotation = await self.annotations_service.create( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), + annotation_origin = annotation_create_request.annotation.origin + + evaluator_flags = SimpleEvaluatorFlags( + is_evaluator=True, + is_custom=annotation_origin == AnnotationOrigin.CUSTOM, + is_human=annotation_origin == AnnotationOrigin.HUMAN, + ) + + evaluator = None + + if annotation_create_request.annotation.references.evaluator.slug: + simple_evaluator_query_request = SimpleEvaluatorQueryRequest( + evaluator_refs=[ + Reference( + slug=annotation_create_request.annotation.references.evaluator.slug + ) + ] + ) + + simple_evaluator_response = ( + await self.evaluators_router.query_simple_evaluators( + request=request, + simple_evaluator_query_request=simple_evaluator_query_request, + ) + ) + + if simple_evaluator_response.count > 0: + evaluator = simple_evaluator_response.evaluators[0] + + if evaluator is None: + builder = SchemaBuilder() + builder.add_object(annotation_create_request.annotation.data) + evaluator_format = builder.to_schema() # pylint: disable=redefined-builtin + + evaluator_slug = ( + annotation_create_request.annotation.references.evaluator.slug + or uuid4().hex + ) + + evaluator_data = dict( + service=dict( + agenta="v0.1.0", + format=evaluator_format, + ) + ) + + simple_evaluator_create_request = SimpleEvaluatorCreateRequest( + evaluator=SimpleEvaluatorCreate( + slug=evaluator_slug, + # + name=evaluator_slug, # yes + # description = + # + flags=evaluator_flags, + tags=annotation_create_request.annotation.tags, + meta=annotation_create_request.annotation.meta, + # + data=evaluator_data, + ) + ) + + simple_evaluator_create_response = ( + await self.evaluators_router.create_simple_evaluator( + request=request, + simple_evaluator_create_request=simple_evaluator_create_request, + ) + ) + + if simple_evaluator_create_response.count > 0: + evaluator = simple_evaluator_create_response.evaluator + + if evaluator is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create evaluator. Please try again or contact support.", + ) + + validate_data_against_schema( + annotation_create_request.annotation.data, + evaluator.data.service.get("format", {}), + ) + + annotation_create_request.annotation.references.evaluator = Reference( + id=evaluator.id, + slug=evaluator.slug, + ) + + kind = annotation_create_request.annotation.kind + channel = annotation_create_request.annotation.channel + + annotation_flags = AnnotationFlags( + is_evaluator=True, + is_custom=evaluator_flags.is_custom, + is_human=evaluator_flags.is_human, + is_sdk=channel == AnnotationChannel.SDK, + is_web=channel == AnnotationChannel.WEB, + is_evaluation=kind == AnnotationKind.EVAL, + ) + + annotation_link: Optional[Link] = await self._create_annotation( + request=request, + # + flags=annotation_flags, + tags=annotation_create_request.annotation.tags, + meta=annotation_create_request.annotation.meta, # - annotation_create=annotation_create_request.annotation, + data=annotation_create_request.annotation.data, + # + references=annotation_create_request.annotation.references, + links=annotation_create_request.annotation.links, ) + if annotation_link is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create annotation. Please try again or contact support.", + ) + + annotation: Optional[Annotation] = await self._fetch_annotation( + request=request, + annotation_link=annotation_link, + ) + + if annotation is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to fetch annotation. Please try again or contact support.", + ) + annotation_response = AnnotationResponse( - count=1 if annotation else 0, + count=1, annotation=annotation, ) @@ -167,28 +308,34 @@ async def create_annotation( @suppress_exceptions(default=AnnotationResponse()) async def fetch_annotation( self, - request: Request, *, + request: Request, trace_id: str, - span_id: Optional[str] = None, - ) -> Union[Response, AnnotationResponse]: + span_id: str, + ) -> AnnotationResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_ANNOTATIONS, # type: ignore + permission=Permission.VIEW_ANNOTATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - annotation = await self.annotations_service.fetch( - project_id=UUID(request.state.project_id), - # + annotation_link = Link( trace_id=trace_id, span_id=span_id, ) + annotation: Optional[Annotation] = await self._fetch_annotation( + request=request, + annotation_link=annotation_link, + ) + + if annotation is None: + return Response(status_code=status.HTTP_404_NOT_FOUND) + annotation_response = AnnotationResponse( - count=1 if annotation else 0, + count=1, annotation=annotation, ) @@ -197,33 +344,79 @@ async def fetch_annotation( @intercept_exceptions() async def edit_annotation( self, - request: Request, *, + request: Request, trace_id: str, - span_id: Optional[str] = None, - # - annotation_edit_request: AnnotationEditRequest, + span_id: str, + annotation_request: AnnotationEditRequest, ) -> AnnotationResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_ANNOTATIONS, # type: ignore + permission=Permission.EDIT_ANNOTATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - annotation = await self.annotations_service.edit( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + annotation_link = Link( trace_id=trace_id, span_id=span_id, + ) + + annotation: Optional[Annotation] = await self._fetch_annotation( + request=request, + annotation_link=annotation_link, + ) + + if annotation is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Failed to fetch annotation. Please try again or contact support.", + ) + + annotation_flags = AnnotationFlags( + is_evaluator=True, + is_custom=annotation.origin == AnnotationOrigin.CUSTOM, + is_human=annotation.origin == AnnotationOrigin.HUMAN, + is_sdk=annotation.channel == AnnotationChannel.SDK, + is_web=annotation.channel == AnnotationChannel.WEB, + is_evaluation=annotation.kind == AnnotationKind.EVAL, + ) + + annotation_link: Optional[Link] = await self._edit_annotation( + request=request, # - annotation_edit=annotation_edit_request.annotation, + annotation=annotation, + # + flags=annotation_flags, + tags=annotation_request.annotation.tags, + meta=annotation_request.annotation.meta, + # + data=annotation_request.annotation.data, + # + references=annotation.references, + links=annotation.links, ) + if annotation_link is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create annotation. Please try again or contact support.", + ) + + annotation: Optional[Annotation] = await self._fetch_annotation( + request=request, + annotation_link=annotation_link, + ) + + if annotation is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to fetch annotation. Please try again or contact support.", + ) + annotation_response = AnnotationResponse( - count=1 if annotation else 0, + count=1, annotation=annotation, ) @@ -232,27 +425,29 @@ async def edit_annotation( @intercept_exceptions() async def delete_annotation( self, - request: Request, *, + request: Request, trace_id: str, - span_id: Optional[str] = None, + span_id: str, ) -> AnnotationLinkResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_ANNOTATIONS, # type: ignore + permission=Permission.EDIT_ANNOTATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - annotation_link: Optional[Link] = await self.annotations_service.delete( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + annotation_link = Link( trace_id=trace_id, span_id=span_id, ) + annotation_link: Optional[Link] = await self._delete_annotation( + request=request, + annotation_link=annotation_link, + ) + annotation_link_response = AnnotationLinkResponse( count=1 if annotation_link else 0, annotation_link=annotation_link, @@ -264,26 +459,48 @@ async def delete_annotation( @suppress_exceptions(default=AnnotationsResponse()) async def query_annotations( self, - request: Request, *, - annotation_query_request: AnnotationQueryRequest, - ) -> AnnotationsResponse: + request: Request, + query_request: Optional[AnnotationQueryRequest] = None, + ) -> AnnotationResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_ANNOTATIONS, # type: ignore + permission=Permission.VIEW_ANNOTATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - annotations = await self.annotations_service.query( - project_id=UUID(request.state.project_id), + annotation = query_request.annotation if query_request else None + annotation_flags = AnnotationFlags(is_evaluator=True) + + if annotation: + if annotation.origin: + annotation_flags.is_custom = ( + annotation.origin == AnnotationOrigin.CUSTOM + ) + annotation_flags.is_human = annotation.origin == AnnotationOrigin.HUMAN + + if annotation.channel: + annotation_flags.is_sdk = annotation.channel == AnnotationChannel.SDK + annotation_flags.is_web = annotation.channel == AnnotationChannel.WEB + + if annotation.kind: + annotation_flags.is_evaluation = annotation.kind == AnnotationKind.EVAL + + annotations = await self._query_annotation( + request=request, + # + flags=annotation_flags, + tags=annotation.tags if annotation else None, + meta=annotation.meta if annotation else None, # - annotation_query=annotation_query_request.annotation, + references=annotation.references if annotation else None, + links=annotation.links if annotation else None, # - annotation_links=annotation_query_request.annotation_links, + annotation_links=query_request.annotation_links if query_request else None, # - windowing=annotation_query_request.windowing, + windowing=query_request.windowing if query_request else None, ) annotations_response = AnnotationsResponse( @@ -292,3 +509,501 @@ async def query_annotations( ) return annotations_response + + # - ANNOTATIONS ------------------------------------------------------------ + + @intercept_exceptions() + async def _create_annotation( + self, + *, + request: Request, + # + flags: AnnotationFlags, + tags: Optional[Tags] = None, + meta: Optional[Meta] = None, + # + data: Data, + # + references: AnnotationReferences, + links: AnnotationLinks, + ) -> Optional[Link]: + trace_id = uuid4().hex + span_id = uuid4().hex[16:] + + _references = references.model_dump(mode="json", exclude_none=True) + + _links = [ + OTelLink( + trace_id=link.trace_id, + span_id=link.span_id, + attributes={"key": key}, + ).model_dump(mode="json") + for key, link in links.items() + ] + + _flags = flags.model_dump(mode="json", exclude_none=True) + + _type = { + "trace": "annotation", + "span": "task", + } + + _attributes = parse_into_attributes( + type=_type, + flags=_flags, + tags=tags, + meta=meta, + data=data, + references=_references, + ) + + trace_request = OTelTracingRequest( + spans=[ + OTelFlatSpan( + trace_id=trace_id, + span_id=span_id, + attributes=_attributes, + links=_links, + ) + ] + ) + + _links_response = await self.tracing_router.create_trace( + request=request, + trace_request=trace_request, + ) + + return _links_response.links[0] if _links_response.links else None + + @intercept_exceptions() + async def _fetch_annotation( + self, + *, + request: Request, + annotation_link: Link, + ) -> Optional[Annotation]: + trace_response: OTelTracingResponse = await self.tracing_router.fetch_trace( + request=request, + trace_id=annotation_link.trace_id, + ) + + if trace_response.count == 0: + return None + + traces = list(trace_response.traces.values()) + trace = traces[0] if traces else None + + spans = list(trace.spans.values()) + root_span = spans[0] if spans else None + + ( + type, + flags, + tags, + meta, + data, + references, + ) = parse_from_attributes(root_span.attributes) + + _references = AnnotationReferences(**references) + + _links = ( + { + link.attributes.get("key"): Link( + trace_id=link.trace_id, + span_id=link.span_id, + ) + for link in root_span.links + if link.attributes.get("key") + } + if root_span.links and isinstance(root_span.links, list) + else None + ) + + _origin = ( + flags.get("is_custom") + and AnnotationOrigin.CUSTOM + or flags.get("is_human") + and AnnotationOrigin.HUMAN + or AnnotationOrigin.AUTO + ) + + _kind = ( + flags.get("is_evaluation") and AnnotationKind.EVAL or AnnotationKind.ADHOC + ) + + _channel = ( + flags.get("is_sdk") + and AnnotationChannel.SDK + or flags.get("is_web") + and AnnotationChannel.WEB + or AnnotationChannel.API + ) + + annotation = Annotation( + trace_id=root_span.trace_id, + span_id=root_span.span_id, + # + created_at=root_span.created_at, + updated_at=root_span.updated_at, + deleted_at=root_span.deleted_at, + created_by_id=root_span.created_by_id, + updated_by_id=root_span.updated_by_id, + deleted_by_id=root_span.deleted_by_id, + # + origin=_origin, + kind=_kind, + channel=_channel, + # + flags=flags, + tags=tags, + meta=meta, + # + data=data, + # + references=_references, + links=_links, + ) + + return annotation + + @intercept_exceptions() + async def _edit_annotation( + self, + *, + request: Request, + # + annotation: Annotation, + # + flags: AnnotationFlags, + tags: Optional[Tags] = None, + meta: Optional[Meta] = None, + # + data: Data, + # + references: AnnotationReferences, + links: AnnotationLinks, + ) -> Optional[Annotation]: + _references = references.model_dump(mode="json", exclude_none=True) + + _links = [ + OTelLink( + trace_id=link.trace_id, + span_id=link.span_id, + attributes={"key": key}, + ).model_dump(mode="json") + for key, link in links.items() + ] + + _flags = flags.model_dump(mode="json", exclude_none=True) + + _type = { + "trace": "annotation", + "span": "task", + } + + _attributes = parse_into_attributes( + type=_type, + flags=_flags, + tags=tags, + meta=meta, + data=data, + references=_references, + ) + + trace_request = OTelTracingRequest( + spans=[ + OTelFlatSpan( + trace_id=annotation.trace_id, + span_id=annotation.span_id, + attributes=_attributes, + links=_links, + ) + ] + ) + + _links_response = await self.tracing_router.edit_trace( + request=request, + trace_id=annotation.trace_id, + trace_request=trace_request, + ) + + return _links_response.links[0] if _links_response.links else None + + @intercept_exceptions() + async def _delete_annotation( + self, + *, + request: Request, + annotation_link: Link, + ) -> Optional[Link]: + link_response = await self.tracing_router.delete_trace( + request=request, + trace_id=annotation_link.trace_id, + ) + + if link_response.count == 0: + return None + + link = link_response.links[0] if link_response.links else None + + annotation_link = Link( + trace_id=link.trace_id, + span_id=link.span_id, + ) + + return annotation_link + + @intercept_exceptions() + async def _query_annotation( + self, + *, + request: Request, + # + flags: Optional[AnnotationFlags] = None, + tags: Optional[Tags] = None, + meta: Optional[Meta] = None, + # + references: Optional[AnnotationReferences] = None, + links: Optional[AnnotationLinks] = None, + # + annotation_links: Optional[List[Link]] = None, + # + windowing: Optional[Windowing] = None, + ) -> List[Annotation]: + formatting = Formatting( + focus=Focus.TRACE, + format=Format.AGENTA, + ) + + filtering = Filtering() + + conditions = [ + { + "field": "attributes", + "key": "ag.type.trace", + "value": "annotation", + "operator": "is", + } + ] + + trace_ids = ( + [annotation_link.trace_id for annotation_link in annotation_links] + if annotation_links + else None + ) + + span_ids = ( + [annotation_link.span_id for annotation_link in annotation_links] + if annotation_links + else None + ) + + if trace_ids: + conditions.append( + { + "field": "trace_id", + "value": trace_ids, + "operator": "in", + } + ) + + if span_ids: + conditions.append( + { + "field": "span_id", + "value": span_ids, + "operator": "in", + } + ) + + if flags: + for key, value in flags.model_dump(mode="json", exclude_none=True).items(): + conditions.append( + { + "field": "attributes", + "key": f"ag.flags.{key}", + "value": value, + "operator": "is", + } + ) + + if tags: + for key, value in tags.items(): + conditions.append( + { + "field": "attributes", + "key": f"ag.tags.{key}", + "value": value, + "operator": "is", + } + ) + + if meta: + for key, value in meta.items(): + conditions.append( + { + "field": "attributes", + "key": f"ag.meta.{key}", + "value": value, + "operator": "is", + } + ) + + if references: + for _, reference in references.model_dump(mode="json").items(): + if reference: + ref_id = str(reference.get("id")) if reference.get("id") else None + ref_slug = ( + str(reference.get("slug")) if reference.get("slug") else None + ) + conditions.append( + { + "field": "references", + "value": [ + {"id": ref_id, "slug": ref_slug}, + ], + "operator": "in", + } + ) + + if links: + if isinstance(links, dict): + for _, link in links.items(): + if link: + conditions.append( + { + "field": "links", + "value": [ + { + "trace_id": link.trace_id, + "span_id": link.span_id, + }, + ], + "operator": "in", + } + ) + elif isinstance(links, list): + _conditions = [] + for link in links: + link: Link + if link: + _conditions.append( + { + "field": "links", + "value": [ + { + "trace_id": link.trace_id, + "span_id": link.span_id, + }, + ], + "operator": "in", + } + ) + if _conditions: + conditions.append( + { + "operator": "or", + "conditions": _conditions, + } + ) + + if conditions: + filtering = Filtering( + operator="and", + conditions=conditions, + ) + + query = Query( + formatting=formatting, + filtering=filtering, + windowing=windowing, + ) + + spans_response: OTelTracingResponse = await self.tracing_router.query_spans( + request=request, + query=query, + ) + + traces = list(spans_response.traces.values()) + + annotations = [] + + for trace in traces: + spans = list(trace.spans.values()) + + root_span = spans[0] if spans else None + + ( + type, + flags, + tags, + meta, + data, + references, + ) = parse_from_attributes(root_span.attributes) + + _references = AnnotationReferences(**references) + + _links = ( + { + link.attributes.get("key"): Link( + trace_id=link.trace_id, + span_id=link.span_id, + ) + for link in root_span.links + if link.attributes.get("key") + } + if root_span.links and isinstance(root_span.links, list) + else None + ) + + _origin = ( + flags.get("is_custom") + and AnnotationOrigin.CUSTOM + or flags.get("is_human") + and AnnotationOrigin.HUMAN + or AnnotationOrigin.AUTO + ) + + _kind = ( + flags.get("is_evaluation") + and AnnotationKind.EVAL + or AnnotationKind.ADHOC + ) + + _channel = ( + flags.get("is_sdk") + and AnnotationChannel.SDK + or flags.get("is_web") + and AnnotationChannel.WEB + or AnnotationChannel.API + ) + + annotation = Annotation( + trace_id=root_span.trace_id, + span_id=root_span.span_id, + # + created_at=root_span.created_at, + updated_at=root_span.updated_at, + deleted_at=root_span.deleted_at, + created_by_id=root_span.created_by_id, + updated_by_id=root_span.updated_by_id, + deleted_by_id=root_span.deleted_by_id, + # + origin=_origin, + kind=_kind, + channel=_channel, + # + flags=flags, + tags=tags, + meta=meta, + data=data, + # + references=_references, + links=_links, + ) + + annotations.append(annotation) + + return annotations diff --git a/api/oss/src/apis/fastapi/annotations/utils.py b/api/oss/src/apis/fastapi/annotations/utils.py new file mode 100644 index 0000000000..246914275a --- /dev/null +++ b/api/oss/src/apis/fastapi/annotations/utils.py @@ -0,0 +1,131 @@ +from typing import Optional, Tuple, List, Dict + +from jsonschema import ( + Draft202012Validator, + Draft7Validator, + Draft4Validator, + Draft6Validator, + Draft201909Validator, +) + +from fastapi import status, HTTPException + + +from oss.src.utils.logging import get_module_logger + +from oss.src.core.shared.dtos import Flags, Tags, Meta, Data, Reference +from oss.src.core.tracing.dtos import Attributes +from oss.src.core.workflows.dtos import WorkflowFlags + + +log = get_module_logger(__name__) + + +def _get_jsonschema_validator( + format: dict, # pylint: disable=redefined-builtin +): + schema_uri = format.get( + "$schema", + "https://json-schema.org/draft/2020-12/schema", + ) + + if "2020-12" in schema_uri: + return Draft202012Validator + elif "2019-09" in schema_uri: + return Draft201909Validator + elif "draft-07" in schema_uri: + return Draft7Validator + elif "draft-06" in schema_uri: + return Draft6Validator + elif "draft-04" in schema_uri: + return Draft4Validator + return Draft202012Validator # fallback + + +def validate_data_against_schema( + data: dict, + schema: dict, # pylint: disable=redefined-builtin +): + validator_class = _get_jsonschema_validator(schema) + validator = validator_class(schema) + + errors = list(validator.iter_errors(data)) + + if errors: + details = [] + for e in errors: + loc = list(e.absolute_path) + msg = e.message + details.append( + { + "loc": ["body", "annotation", "data"] + loc, + "msg": msg, + "type": "value_error.json_schema", + } + ) + + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=details + ) + + +def parse_into_attributes( + *, + type: Optional[Dict[str, str]] = None, + flags: Optional[Flags] = None, + tags: Optional[Tags] = None, + data: Optional[Data] = None, + meta: Optional[Meta] = None, + references: Optional[List[Reference]] = None, +) -> Attributes: + attributes: Attributes = dict( + ag=( + dict( + type=type, + flags=flags, + tags=tags, + meta=meta, + data=data, + references=references, + ) + if type or flags or tags or meta or data or references + else None + ) + ) + + return attributes + + +def parse_from_attributes( + attributes: Attributes, +) -> Tuple[ + Optional[Dict[str, str]], # type + Optional[Flags], # flags + Optional[Tags], # tags + Optional[Data], # data + Optional[Meta], # meta + Optional[List[Reference]], # references +]: + # TODO - add error handling + ag: dict = attributes.get("ag", {}) + type: dict = ag.get("type", {}) + flags: dict = ag.get("flags") + tags: dict = ag.get("tags") + meta: dict = ag.get("meta") + data: dict = ag.get("data") + references = ag.get("references") + + return ( + type, + flags, + tags, + meta, + data, + references, + ) + + +class AnnotationFlags(WorkflowFlags): + is_sdk: Optional[bool] = None + is_web: Optional[bool] = None + is_evaluation: Optional[bool] = None diff --git a/api/oss/src/apis/fastapi/applications/models.py b/api/oss/src/apis/fastapi/applications/models.py deleted file mode 100644 index 09e67ffdfc..0000000000 --- a/api/oss/src/apis/fastapi/applications/models.py +++ /dev/null @@ -1,155 +0,0 @@ -from typing import Optional, List - -from pydantic import BaseModel - -from oss.src.core.shared.dtos import ( - Reference, - Windowing, -) -from oss.src.core.applications.dtos import ( - Application, - ApplicationCreate, - ApplicationEdit, - ApplicationQuery, - # - ApplicationVariant, - ApplicationVariantCreate, - ApplicationVariantEdit, - ApplicationVariantQuery, - # - ApplicationRevision, - ApplicationRevisionCreate, - ApplicationRevisionEdit, - ApplicationRevisionQuery, - ApplicationRevisionCommit, - # - LegacyApplication, - LegacyApplicationCreate, - LegacyApplicationEdit, -) - -# APPLICATIONS ----------------------------------------------------------------- - - -class ApplicationCreateRequest(BaseModel): - application: ApplicationCreate - - -class ApplicationEditRequest(BaseModel): - application: ApplicationEdit - - -class ApplicationQueryRequest(BaseModel): - application: Optional[ApplicationQuery] = None - # - application_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class ApplicationResponse(BaseModel): - count: int = 0 - application: Optional[Application] = None - - -class ApplicationsResponse(BaseModel): - count: int = 0 - applications: List[Application] = [] - - -# APPLICATION VARIANTS --------------------------------------------------------- - - -class ApplicationVariantCreateRequest(BaseModel): - application_variant: ApplicationVariantCreate - - -class ApplicationVariantEditRequest(BaseModel): - application_variant: ApplicationVariantEdit - - -class ApplicationVariantQueryRequest(BaseModel): - application_variant: Optional[ApplicationVariantQuery] = None - # - application_refs: Optional[List[Reference]] = None - application_variant_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class ApplicationVariantResponse(BaseModel): - count: int = 0 - application_variant: Optional[ApplicationVariant] = None - - -class ApplicationVariantsResponse(BaseModel): - count: int = 0 - application_variants: List[ApplicationVariant] = [] - - -# APPLICATION REVISIONS -------------------------------------------------------- - - -class ApplicationRevisionCreateRequest(BaseModel): - application_revision: ApplicationRevisionCreate - - -class ApplicationRevisionEditRequest(BaseModel): - application_revision: ApplicationRevisionEdit - - -class ApplicationRevisionQueryRequest(BaseModel): - application_revision: Optional[ApplicationRevisionQuery] = None - # - application_refs: Optional[List[Reference]] = None - application_variant_refs: Optional[List[Reference]] = None - application_revision_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class ApplicationRevisionCommitRequest(BaseModel): - application_revision_commit: ApplicationRevisionCommit - - -class ApplicationRevisionRetrieveRequest(BaseModel): - application_ref: Optional[Reference] = None - application_variant_ref: Optional[Reference] = None - application_revision_ref: Optional[Reference] = None - - -class ApplicationRevisionResponse(BaseModel): - count: int = 0 - application_revision: Optional[ApplicationRevision] = None - - -class ApplicationRevisionsResponse(BaseModel): - count: int = 0 - application_revisions: List[ApplicationRevision] = [] - - -# LEGACY APPLICATIONS ---------------------------------------------------------- - - -class LegacyApplicationCreateRequest(BaseModel): - application: LegacyApplicationCreate - - -class LegacyApplicationEditRequest(BaseModel): - application: LegacyApplicationEdit - - -class LegacyApplicationResponse(BaseModel): - count: int = 0 - application: Optional[LegacyApplication] = None - - -class LegacyApplicationsResponse(BaseModel): - count: int = 0 - applications: List[LegacyApplication] = [] diff --git a/api/oss/src/apis/fastapi/applications/router.py b/api/oss/src/apis/fastapi/applications/router.py deleted file mode 100644 index e179e0f04c..0000000000 --- a/api/oss/src/apis/fastapi/applications/router.py +++ /dev/null @@ -1,250 +0,0 @@ -from uuid import UUID -from typing import Optional - -from fastapi import APIRouter, status, Request, Depends - -from oss.src.utils.common import is_ee -from oss.src.utils.logging import get_module_logger -from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions -from oss.src.utils.caching import get_cache, set_cache, invalidate_cache - - -from oss.src.core.applications.dtos import ( - ApplicationRevision, -) -from oss.src.core.applications.service import ( - LegacyApplicationsService, -) - -from oss.src.apis.fastapi.applications.models import ( - ApplicationRevisionRetrieveRequest, - ApplicationRevisionResponse, - # - LegacyApplicationCreateRequest, - LegacyApplicationEditRequest, - LegacyApplicationResponse, -) -from oss.src.apis.fastapi.applications.utils import ( - parse_application_revision_retrieve_request_from_params, - parse_application_revision_retrieve_request_from_body, -) - -if is_ee(): - from ee.src.models.shared_models import Permission - from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION - - -log = get_module_logger(__name__) - - -class LegacyApplicationsRouter: - def __init__( - self, - *, - legacy_applications_service: LegacyApplicationsService, - ): - self.legacy_applications_service = legacy_applications_service - - self.router = APIRouter() - - # APPLICATION REVISIONS ------------------------------------------------ - - self.router.add_api_route( - "/revisions/retrieve", - self.retrieve_application_revision, - methods=["POST"], - operation_id="retrieve_application_revision", - status_code=status.HTTP_200_OK, - response_model=ApplicationRevisionResponse, - response_model_exclude_none=True, - ) - - # LEGACY APPLICATIONS -------------------------------------------------- - - self.router.add_api_route( - "/", - self.create_legacy_application, - methods=["POST"], - response_model=LegacyApplicationResponse, - status_code=status.HTTP_200_OK, - summary="Create Application", - description="Create a new application using workflow data stored in legacy format", - operation_id="create_legacy_application", - ) - - self.router.add_api_route( - "/{application_id}", - self.fetch_legacy_application, - methods=["GET"], - response_model=LegacyApplicationResponse, - status_code=status.HTTP_200_OK, - summary="Fetch Application", - description="Get an application using workflow data stored in legacy format", - operation_id="fetch_legacy_application", - ) - - self.router.add_api_route( - "/{application_id}", - self.edit_legacy_application, - methods=["PUT"], - response_model=LegacyApplicationResponse, - status_code=status.HTTP_200_OK, - summary="Update Application", - description="Update an application using workflow data stored in legacy format", - operation_id="edit_legacy_application", - ) - - # APPLICATION REVISIONS ---------------------------------------------------- - - @intercept_exceptions() - @suppress_exceptions(default=ApplicationRevisionResponse()) - async def retrieve_application_revision( - self, - request: Request, - *, - application_revision_retrieve_request: ApplicationRevisionRetrieveRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - project_id=request.state.project_id, - user_uid=request.state.user_id, - # - permission=Permission.VIEW_APPLICATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - cache_key = { - "artifact_ref": application_revision_retrieve_request.application_ref, # type: ignore - "variant_ref": application_revision_retrieve_request.application_variant_ref, # type: ignore - "revision_ref": application_revision_retrieve_request.application_revision_ref, # type: ignore - } - - application_revision = None - # application_revision = await get_cache( - # namespace="applications:retrieve", - # project_id=request.state.project_id, - # user_id=request.state.user_id, - # key=cache_key, - # model=ApplicationRevision, - # ) - - if not application_revision: - application_revision = await self.legacy_applications_service.retrieve( - project_id=UUID(request.state.project_id), - # - application_ref=application_revision_retrieve_request.application_ref, # type: ignore - application_variant_ref=application_revision_retrieve_request.application_variant_ref, # type: ignore - application_revision_ref=application_revision_retrieve_request.application_revision_ref, # type: ignore - ) - - await set_cache( - namespace="applications:retrieve", - project_id=request.state.project_id, - user_id=request.state.user_id, - key=cache_key, - value=application_revision, - ) - - application_revision_response = ApplicationRevisionResponse( - count=1 if application_revision else 0, - application_revision=application_revision, - ) - - return application_revision_response - - # LEGACY APPLICATIONS ------------------------------------------------------ - - @intercept_exceptions() - async def create_legacy_application( - self, - request: Request, - *, - legacy_application_create_request: LegacyApplicationCreateRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - project_id=request.state.project_id, - user_uid=request.state.user_id, - # - permission=Permission.EDIT_APPLICATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - legacy_application = await self.legacy_applications_service.create( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - legacy_application_create=legacy_application_create_request.application, - ) - - legacy_application_response = LegacyApplicationResponse( - count=1 if legacy_application else 0, - application=legacy_application, - ) - - return legacy_application_response - - @intercept_exceptions() - @suppress_exceptions(default=LegacyApplicationResponse()) - async def fetch_legacy_application( - self, - request: Request, - *, - application_id: UUID, - ): - if is_ee(): - if not await check_action_access( # type: ignore - project_id=request.state.project_id, - user_uid=request.state.user_id, - # - permission=Permission.VIEW_APPLICATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - legacy_application = await self.legacy_applications_service.fetch( - project_id=UUID(request.state.project_id), - # - application_id=application_id, - ) - - legacy_application_response = LegacyApplicationResponse( - count=1 if legacy_application else 0, - application=legacy_application, - ) - - return legacy_application_response - - @intercept_exceptions() - async def edit_legacy_application( - self, - request: Request, - *, - application_id: UUID, - # - legacy_application_edit_request: LegacyApplicationEditRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - project_id=request.state.project_id, - user_uid=request.state.user_id, - # - permission=Permission.EDIT_APPLICATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(application_id) != str(legacy_application_edit_request.application.id): - return LegacyApplicationResponse() - - legacy_application = await self.legacy_applications_service.edit( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - legacy_application_edit=legacy_application_edit_request.application, - ) - - legacy_application_response = LegacyApplicationResponse( - count=1 if legacy_application else 0, - application=legacy_application, - ) - - return legacy_application_response diff --git a/api/oss/src/apis/fastapi/applications/utils.py b/api/oss/src/apis/fastapi/applications/utils.py deleted file mode 100644 index 12a613b5bb..0000000000 --- a/api/oss/src/apis/fastapi/applications/utils.py +++ /dev/null @@ -1,90 +0,0 @@ -from uuid import UUID -from typing import Optional - -from oss.src.core.shared.dtos import ( - Reference, -) - -from oss.src.apis.fastapi.applications.models import ( - ApplicationRevisionRetrieveRequest, -) - - -def parse_application_revision_retrieve_request_from_params( - application_id: Optional[UUID] = None, - application_slug: Optional[str] = None, - # - application_variant_id: Optional[UUID] = None, - application_variant_slug: Optional[str] = None, - # - application_revision_id: Optional[UUID] = None, - application_revision_slug: Optional[str] = None, - application_revision_version: Optional[str] = None, -): - return parse_application_revision_retrieve_request_from_body( - application_id=application_id, - application_slug=application_slug, - # - application_variant_id=application_variant_id, - application_variant_slug=application_variant_slug, - # - application_revision_id=application_revision_id, - application_revision_slug=application_revision_slug, - application_revision_version=application_revision_version, - ) - - -def parse_application_revision_retrieve_request_from_body( - application_id: Optional[UUID] = None, - application_slug: Optional[str] = None, - # - application_variant_id: Optional[UUID] = None, - application_variant_slug: Optional[str] = None, - # - application_revision_id: Optional[UUID] = None, - application_revision_slug: Optional[str] = None, - application_revision_version: Optional[str] = None, -) -> Optional[ApplicationRevisionRetrieveRequest]: - return ( - ApplicationRevisionRetrieveRequest( - application_ref=( - Reference( - id=application_id, - slug=application_slug, - ) - if application_id or application_slug - else None - ), - # - application_variant_ref=( - Reference( - id=application_variant_id, - slug=application_variant_slug, - ) - if application_variant_id or application_variant_slug - else None - ), - # - application_revision_ref=( - Reference( - id=application_revision_id, - slug=application_revision_slug, - version=application_revision_version, - ) - if application_revision_id - or application_revision_slug - or application_revision_version - else None - ), - ) - if ( - application_id - or application_slug - or application_variant_id - or application_variant_slug - or application_revision_id - or application_revision_slug - or application_revision_version - ) - else None - ) diff --git a/api/oss/src/apis/fastapi/evaluations/models.py b/api/oss/src/apis/fastapi/evaluations/models.py index c4e740740b..f8dd53f19c 100644 --- a/api/oss/src/apis/fastapi/evaluations/models.py +++ b/api/oss/src/apis/fastapi/evaluations/models.py @@ -2,41 +2,28 @@ from uuid import UUID from pydantic import BaseModel + from fastapi import HTTPException -from oss.src.core.shared.dtos import ( - Windowing, -) +from oss.src.core.shared.dtos import Windowing + from oss.src.core.evaluations.types import ( EvaluationRun, EvaluationRunCreate, EvaluationRunEdit, EvaluationRunQuery, - # EvaluationScenario, EvaluationScenarioCreate, EvaluationScenarioEdit, EvaluationScenarioQuery, - # - EvaluationResult, - EvaluationResultCreate, - EvaluationResultEdit, - EvaluationResultQuery, - # - EvaluationMetrics, - EvaluationMetricsCreate, - EvaluationMetricsEdit, - EvaluationMetricsQuery, - # - EvaluationQueue, - EvaluationQueueCreate, - EvaluationQueueEdit, - EvaluationQueueQuery, - # - SimpleEvaluation, - SimpleEvaluationCreate, - SimpleEvaluationEdit, - SimpleEvaluationQuery, + EvaluationStep, + EvaluationStepCreate, + EvaluationStepEdit, + EvaluationStepQuery, + EvaluationMetric, + EvaluationMetricCreate, + EvaluationMetricEdit, + EvaluationMetricQuery, ) @@ -48,9 +35,8 @@ def __init__( message: str = "Cannot modify a closed evaluation.", run_id: Optional[UUID] = None, scenario_id: Optional[UUID] = None, - result_id: Optional[UUID] = None, - metrics_id: Optional[UUID] = None, - queue_id: Optional[UUID] = None, + step_id: Optional[UUID] = None, + metric_id: Optional[UUID] = None, ): details = dict(message=message) @@ -58,23 +44,20 @@ def __init__( details["run_id"] = str(run_id) if scenario_id: details["scenario_id"] = str(scenario_id) - if result_id: - details["result_id"] = str(result_id) - if metrics_id: - details["metrics_id"] = str(metrics_id) - if queue_id: - details["queue_id"] = str(queue_id) + if step_id: + details["step_id"] = str(step_id) + if metric_id: + details["metric_id"] = str(metric_id) super().__init__(status_code=409, detail=details) self.run_id = run_id self.scenario_id = scenario_id - self.result_id = result_id - self.metrics_id = metrics_id - self.queue_id = queue_id + self.step_id = step_id + self.metric_id = metric_id -# EVALUATION RUNS -------------------------------------------------------------- +# - EVALUATION RUN ------------------------------------------------------------- class EvaluationRunsCreateRequest(BaseModel): @@ -90,8 +73,8 @@ class EvaluationRunsEditRequest(BaseModel): class EvaluationRunQueryRequest(BaseModel): - run: Optional[EvaluationRunQuery] = None - # + run: EvaluationRunQuery + include_archived: Optional[bool] = False windowing: Optional[Windowing] = None @@ -119,7 +102,7 @@ class EvaluationRunIdsResponse(BaseModel): run_ids: List[UUID] = [] -# - EVALUATION SCENARIOS ------------------------------------------------------- +# - EVALUATION SCENARIO -------------------------------------------------------- class EvaluationScenariosCreateRequest(BaseModel): @@ -135,8 +118,7 @@ class EvaluationScenariosEditRequest(BaseModel): class EvaluationScenarioQueryRequest(BaseModel): - scenario: Optional[EvaluationScenarioQuery] = None - # + scenario: EvaluationScenarioQuery windowing: Optional[Windowing] = None @@ -164,159 +146,92 @@ class EvaluationScenarioIdsResponse(BaseModel): scenario_ids: List[UUID] = [] -# - EVALUATION RESULTS --------------------------------------------------------- +# - EVALUATION STEP ------------------------------------------------------------ -class EvaluationResultsCreateRequest(BaseModel): - results: List[EvaluationResultCreate] +class EvaluationStepsCreateRequest(BaseModel): + steps: List[EvaluationStepCreate] -class EvaluationResultEditRequest(BaseModel): - result: EvaluationResultEdit +class EvaluationStepEditRequest(BaseModel): + step: EvaluationStepEdit -class EvaluationResultsEditRequest(BaseModel): - results: List[EvaluationResultEdit] +class EvaluationStepsEditRequest(BaseModel): + steps: List[EvaluationStepEdit] -class EvaluationResultQueryRequest(BaseModel): - result: Optional[EvaluationResultQuery] = None - # +class EvaluationStepQueryRequest(BaseModel): + step: EvaluationStepQuery windowing: Optional[Windowing] = None -class EvaluationResultIdsRequest(BaseModel): - result_ids: List[UUID] +class EvaluationStepIdsRequest(BaseModel): + step_ids: List[UUID] -class EvaluationResultResponse(BaseModel): +class EvaluationStepResponse(BaseModel): count: int = 0 - result: Optional[EvaluationResult] = None + step: Optional[EvaluationStep] = None -class EvaluationResultsResponse(BaseModel): +class EvaluationStepsResponse(BaseModel): count: int = 0 - results: List[EvaluationResult] = [] + steps: List[EvaluationStep] = [] -class EvaluationResultIdResponse(BaseModel): +class EvaluationStepIdResponse(BaseModel): count: int = 0 - result_id: Optional[UUID] = None + step_id: Optional[UUID] = None -class EvaluationResultIdsResponse(BaseModel): +class EvaluationStepIdsResponse(BaseModel): count: int = 0 - result_ids: List[UUID] = [] + step_ids: List[UUID] = [] -# - EVALUATION METRICS --------------------------------------------------------- +# - EVALUATION METRIC ---------------------------------------------------------- class EvaluationMetricsCreateRequest(BaseModel): - metrics: List[EvaluationMetricsCreate] - - -class EvaluationMetricsEditRequest(BaseModel): - metrics: List[EvaluationMetricsEdit] - - -class EvaluationMetricsQueryRequest(BaseModel): - metrics: Optional[EvaluationMetricsQuery] = None - # - windowing: Optional[Windowing] = None - - -class EvaluationMetricsIdsRequest(BaseModel): - metrics_ids: List[UUID] - - -class EvaluationMetricsResponse(BaseModel): - count: int = 0 - metrics: List[EvaluationMetrics] = [] - - -class EvaluationMetricsIdsResponse(BaseModel): - count: int = 0 - metrics_ids: List[UUID] = [] - - -# - EVALUATION QUEUES ---------------------------------------------------------- - - -class EvaluationQueuesCreateRequest(BaseModel): - queues: List[EvaluationQueueCreate] + metrics: List[EvaluationMetricCreate] -class EvaluationQueueEditRequest(BaseModel): - queue: EvaluationQueueEdit +class EvaluationMetricEditRequest(BaseModel): + metric: EvaluationMetricEdit -class EvaluationQueuesEditRequest(BaseModel): - queues: List[EvaluationQueueEdit] +class EvaluationMetricsEditRequest(BaseModel): + metrics: List[EvaluationMetricEdit] -class EvaluationQueueQueryRequest(BaseModel): - queue: Optional[EvaluationQueueQuery] = None - # +class EvaluationMetricQueryRequest(BaseModel): + metric: EvaluationMetricQuery windowing: Optional[Windowing] = None -class EvaluationQueueIdsRequest(BaseModel): - queue_ids: List[UUID] - - -class EvaluationQueueResponse(BaseModel): - count: int = 0 - queue: Optional[EvaluationQueue] = None +class EvaluationMetricIdsRequest(BaseModel): + metric_ids: List[UUID] -class EvaluationQueuesResponse(BaseModel): +class EvaluationMetricResponse(BaseModel): count: int = 0 - queues: List[EvaluationQueue] = [] + metric: Optional[EvaluationMetric] = None -class EvaluationQueueIdResponse(BaseModel): +class EvaluationMetricsResponse(BaseModel): count: int = 0 - queue_id: Optional[UUID] = None + metrics: List[EvaluationMetric] = [] -class EvaluationQueueIdsResponse(BaseModel): +class EvaluationMetricIdResponse(BaseModel): count: int = 0 - queue_ids: List[UUID] = [] + metric_id: Optional[UUID] = None -class EvaluationQueueScenarioIdsResponse(BaseModel): +class EvaluationMetricIdsResponse(BaseModel): count: int = 0 - scenario_ids: List[List[UUID]] = [] - - -# - SIMPLE EVALUATIONS --------------------------------------------------------- - - -class SimpleEvaluationCreateRequest(BaseModel): - evaluation: SimpleEvaluationCreate - - -class SimpleEvaluationEditRequest(BaseModel): - evaluation: SimpleEvaluationEdit + metric_ids: List[UUID] = [] -class SimpleEvaluationQueryRequest(BaseModel): - evaluation: Optional[SimpleEvaluationQuery] = None - # - windowing: Optional[Windowing] = None - - -class SimpleEvaluationResponse(BaseModel): - count: int = 0 - evaluation: Optional[SimpleEvaluation] = None - - -class SimpleEvaluationsResponse(BaseModel): - count: int = 0 - evaluations: List[SimpleEvaluation] = [] - - -class SimpleEvaluationIdResponse(BaseModel): - count: int = 0 - evaluation_id: Optional[UUID] = None +# ------------------------------------------------------------------------------ diff --git a/api/oss/src/apis/fastapi/evaluations/router.py b/api/oss/src/apis/fastapi/evaluations/router.py index 0c31333196..d1ba103e72 100644 --- a/api/oss/src/apis/fastapi/evaluations/router.py +++ b/api/oss/src/apis/fastapi/evaluations/router.py @@ -1,25 +1,20 @@ from typing import Optional from uuid import UUID -from datetime import datetime, timedelta +from functools import wraps -from fastapi import APIRouter, Request, Query +from fastapi import APIRouter, Request, HTTPException, Depends from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions from oss.src.utils.caching import get_cache, set_cache, invalidate_cache -from oss.src.core.queries.service import ( - QueriesService, -) -from oss.src.core.evaluations.service import ( - EvaluationStatus, - EvaluationsService, - SimpleEvaluationsService, -) +from oss.src.core.evaluations.service import EvaluationsService +from oss.src.core.evaluations.types import EvaluationClosedConflict +from oss.src.apis.fastapi.evaluations.models import EvaluationClosedException from oss.src.apis.fastapi.evaluations.models import ( - # EVALUATION RUNS + # EVALUATION RUN EvaluationRunsCreateRequest, EvaluationRunEditRequest, EvaluationRunsEditRequest, @@ -29,7 +24,7 @@ EvaluationRunsResponse, EvaluationRunIdResponse, EvaluationRunIdsResponse, - # EVALUATION SCENARIOS + # EVALUATION SCENARIO EvaluationScenariosCreateRequest, EvaluationScenarioEditRequest, EvaluationScenariosEditRequest, @@ -39,47 +34,35 @@ EvaluationScenariosResponse, EvaluationScenarioIdResponse, EvaluationScenarioIdsResponse, - # EVALUATION RESULTS - EvaluationResultsCreateRequest, - EvaluationResultEditRequest, - EvaluationResultsEditRequest, - EvaluationResultQueryRequest, - EvaluationResultIdsRequest, - EvaluationResultResponse, - EvaluationResultsResponse, - EvaluationResultIdResponse, - EvaluationResultIdsResponse, - # EVALUATION METRICS + # EVALUATION STEP + EvaluationStepsCreateRequest, + EvaluationStepEditRequest, + EvaluationStepsEditRequest, + EvaluationStepQueryRequest, + EvaluationStepIdsRequest, + EvaluationStepResponse, + EvaluationStepsResponse, + EvaluationStepIdResponse, + EvaluationStepIdsResponse, + # EVALUATION METRIC EvaluationMetricsCreateRequest, + EvaluationMetricEditRequest, EvaluationMetricsEditRequest, - EvaluationMetricsQueryRequest, - EvaluationMetricsIdsRequest, + EvaluationMetricQueryRequest, + EvaluationMetricIdsRequest, + EvaluationMetricResponse, EvaluationMetricsResponse, - EvaluationMetricsIdsResponse, - # EVALUATION QUEUES - EvaluationQueuesCreateRequest, - EvaluationQueueEditRequest, - EvaluationQueuesEditRequest, - EvaluationQueueQueryRequest, - EvaluationQueueIdsRequest, - EvaluationQueueResponse, - EvaluationQueuesResponse, - EvaluationQueueIdResponse, - EvaluationQueueIdsResponse, - # - EvaluationQueueScenarioIdsResponse, - # - SimpleEvaluationCreateRequest, - SimpleEvaluationEditRequest, - SimpleEvaluationQueryRequest, - SimpleEvaluationResponse, - SimpleEvaluationsResponse, - SimpleEvaluationIdResponse, + EvaluationMetricIdResponse, + EvaluationMetricIdsResponse, ) from oss.src.apis.fastapi.evaluations.utils import ( - handle_evaluation_closed_exception, + parse_run_query_request, + parse_scenario_query_request, + parse_step_query_request, + parse_metric_query_request, ) + if is_ee(): from ee.src.models.shared_models import Permission from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION @@ -88,40 +71,61 @@ log = get_module_logger(__name__) -class EvaluationsRouter: +def handle_evaluation_closed_exception(): + def decorator(func): + @wraps(func) + async def wrapper(*args, **kwargs): + try: + return await func(*args, **kwargs) + except EvaluationClosedConflict as e: + raise EvaluationClosedException( + message=e.message, + run_id=e.run_id, + scenario_id=e.scenario_id, + step_id=e.step_id, + metric_id=e.metric_id, + ) from e + except Exception as e: + raise e + + return wrapper + + return decorator + + +class EvaluationsRouter(APIRouter): + VERSION = "preview" + def __init__( self, *, evaluations_service: EvaluationsService, - queries_service: QueriesService, ): self.evaluations_service = evaluations_service - self.queries_service = queries_service self.router = APIRouter() - self.admin_router = APIRouter() + # - EVALUATION RUN ----------------------------------------------------- - # EVALUATION RUNS ------------------------------------------------------ - - # POST /api/evaluations/runs/refresh - self.admin_router.add_api_route( - path="/runs/refresh", + # POST /api/preview/evaluations/runs/ + self.router.add_api_route( + path="/runs/", methods=["POST"], - endpoint=self.refresh_runs, + endpoint=self.create_runs, + response_model=EvaluationRunsResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/runs/ + # GET /api/preview/evaluations/runs/ self.router.add_api_route( path="/runs/", - methods=["POST"], - endpoint=self.create_runs, + methods=["GET"], + endpoint=self.fetch_runs, response_model=EvaluationRunsResponse, response_model_exclude_none=True, ) - # PATCH /api/evaluations/runs/ + # PATCH /api/preview/evaluations/runs/ self.router.add_api_route( path="/runs/", methods=["PATCH"], @@ -130,7 +134,7 @@ def __init__( response_model_exclude_none=True, ) - # DELETE /api/evaluations/runs/ + # DELETE /api/preview/evaluations/runs/ self.router.add_api_route( path="/runs/", methods=["DELETE"], @@ -139,7 +143,7 @@ def __init__( response_model_exclude_none=True, ) - # POST /api/evaluations/runs/query + # POST /api/preview/evaluations/runs/query self.router.add_api_route( path="/runs/query", methods=["POST"], @@ -148,25 +152,34 @@ def __init__( response_model_exclude_none=True, ) - # POST /api/evaluations/runs/close + # POST /api/preview/evaluations/runs/archive self.router.add_api_route( - path="/runs/close", + path="/runs/archive", methods=["POST"], - endpoint=self.close_runs, + endpoint=self.archive_runs, + response_model=EvaluationRunsResponse, + response_model_exclude_none=True, + ) + + # POST /api/preview/evaluations/runs/unarchive + self.router.add_api_route( + path="/runs/unarchive", + methods=["POST"], + endpoint=self.unarchive_runs, response_model=EvaluationRunsResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/runs/open + # POST /api/preview/evaluations/runs/close self.router.add_api_route( - path="/runs/open", + path="/runs/close", methods=["POST"], - endpoint=self.open_runs, + endpoint=self.close_runs, response_model=EvaluationRunsResponse, response_model_exclude_none=True, ) - # GET /api/evaluations/runs/{run_id} + # GET /api/preview/evaluations/runs/{run_id} self.router.add_api_route( path="/runs/{run_id}", methods=["GET"], @@ -175,7 +188,7 @@ def __init__( response_model_exclude_none=True, ) - # PATCH /api/evaluations/runs/{run_id} + # PATCH /api/preview/evaluations/runs/{run_id} self.router.add_api_route( path="/runs/{run_id}", methods=["PATCH"], @@ -184,7 +197,7 @@ def __init__( response_model_exclude_none=True, ) - # DELETE /api/evaluations/runs/{run_id} + # DELETE /api/preview/evaluations/runs/{run_id} self.router.add_api_route( path="/runs/{run_id}", methods=["DELETE"], @@ -193,36 +206,36 @@ def __init__( response_model_exclude_none=True, ) - # POST /api/evaluations/runs/{run_id}/close + # POST /api/preview/evaluations/runs/{run_id}/archive self.router.add_api_route( - path="/runs/{run_id}/close", + path="/runs/{run_id}/archive", methods=["POST"], - endpoint=self.close_run, + endpoint=self.archive_run, response_model=EvaluationRunResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/runs/{run_id}/close/{status} + # POST /api/preview/evaluations/runs/{run_id}/unarchive self.router.add_api_route( - path="/runs/{run_id}/close/{status}", + path="/runs/{run_id}/unarchive", methods=["POST"], - endpoint=self.close_run, + endpoint=self.unarchive_run, response_model=EvaluationRunResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/runs/{run_id}/open + # POST /api/preview/evaluations/runs/{run_id}/close self.router.add_api_route( - path="/runs/{run_id}/open", + path="/runs/{run_id}/close", methods=["POST"], - endpoint=self.open_run, + endpoint=self.close_run, response_model=EvaluationRunResponse, response_model_exclude_none=True, ) - # EVALUATION SCENARIOS ------------------------------------------------- + # - EVALUATION SCENARIO ------------------------------------------------ - # POST /api/evaluations/scenarios/ + # POST /api/preview/evaluations/scenarios/ self.router.add_api_route( path="/scenarios/", methods=["POST"], @@ -231,7 +244,16 @@ def __init__( response_model_exclude_none=True, ) - # PATCH /api/evaluations/scenarios/ + # GET /api/preview/evaluations/scenarios/ + self.router.add_api_route( + path="/scenarios/", + methods=["GET"], + endpoint=self.fetch_scenarios, + response_model=EvaluationScenariosResponse, + response_model_exclude_none=True, + ) + + # PATCH /api/preview/evaluations/scenarios/ self.router.add_api_route( path="/scenarios/", methods=["PATCH"], @@ -240,7 +262,7 @@ def __init__( response_model_exclude_none=True, ) - # DELETE /api/evaluations/scenarios/ + # DELETE /api/preview/evaluations/scenarios/ self.router.add_api_route( path="/scenarios/", methods=["DELETE"], @@ -249,7 +271,7 @@ def __init__( response_model_exclude_none=True, ) - # POST /api/evaluations/scenarios/query + # POST /api/preview/evaluations/scenarios/query self.router.add_api_route( path="/scenarios/query", methods=["POST"], @@ -258,7 +280,7 @@ def __init__( response_model_exclude_none=True, ) - # GET /api/evaluations/scenarios/{scenario_id} + # GET /api/preview/evaluations/scenarios/{scenario_id} self.router.add_api_route( path="/scenarios/{scenario_id}", methods=["GET"], @@ -267,7 +289,7 @@ def __init__( response_model_exclude_none=True, ) - # PATCH /api/evaluations/scenarios/{scenario_id} + # PATCH /api/preview/evaluations/scenarios/{scenario_id} self.router.add_api_route( path="/scenarios/{scenario_id}", methods=["PATCH"], @@ -276,7 +298,7 @@ def __init__( response_model_exclude_none=True, ) - # DELETE /api/evaluations/scenarios/{scenario_id} + # DELETE /api/preview/evaluations/scenarios/{scenario_id} self.router.add_api_route( path="/scenarios/{scenario_id}", methods=["DELETE"], @@ -285,92 +307,101 @@ def __init__( response_model_exclude_none=True, ) - # EVALUATION RESULTS --------------------------------------------------- + # - EVALUATION STEP ---------------------------------------------------- - # POST /api/evaluations/results/ + # POST /api/preview/evaluations/steps/ self.router.add_api_route( - path="/results/", + path="/steps/", methods=["POST"], - endpoint=self.create_results, - response_model=EvaluationResultsResponse, + endpoint=self.create_steps, + response_model=EvaluationStepsResponse, + response_model_exclude_none=True, + ) + + # GET /api/preview/evaluations/steps/ + self.router.add_api_route( + path="/steps/", + methods=["GET"], + endpoint=self.fetch_steps, + response_model=EvaluationStepsResponse, response_model_exclude_none=True, ) - # PATCH /api/evaluations/results/ + # PATCH /api/preview/evaluations/steps/ self.router.add_api_route( - path="/results/", + path="/steps/", methods=["PATCH"], - endpoint=self.edit_results, - response_model=EvaluationResultsResponse, + endpoint=self.edit_steps, + response_model=EvaluationStepsResponse, response_model_exclude_none=True, ) - # DELETE /api/evaluations/results/ + # DELETE /api/preview/evaluations/steps/ self.router.add_api_route( - path="/results/", + path="/steps/", methods=["DELETE"], - endpoint=self.delete_results, - response_model=EvaluationResultIdsResponse, + endpoint=self.delete_steps, + response_model=EvaluationStepIdsResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/results/query + # POST /api/preview/evaluations/steps/query self.router.add_api_route( - path="/results/query", + path="/steps/query", methods=["POST"], - endpoint=self.query_results, - response_model=EvaluationResultsResponse, + endpoint=self.query_steps, + response_model=EvaluationStepsResponse, response_model_exclude_none=True, ) - # GET /api/evaluations/results/{result_id} + # GET /api/preview/evaluations/steps/{step_id} self.router.add_api_route( - path="/results/{result_id}", + path="/steps/{step_id}", methods=["GET"], - endpoint=self.fetch_result, - response_model=EvaluationResultResponse, + endpoint=self.fetch_step, + response_model=EvaluationStepResponse, response_model_exclude_none=True, ) - # PATCH /api/evaluations/results/{result_id} + # PATCH /api/preview/evaluations/steps/{step_id} self.router.add_api_route( - path="/results/{result_id}", + path="/steps/{step_id}", methods=["PATCH"], - endpoint=self.edit_result, - response_model=EvaluationResultResponse, + endpoint=self.edit_step, + response_model=EvaluationStepResponse, response_model_exclude_none=True, ) - # DELETE /api/evaluations/results/{result_id} + # DELETE /api/preview/evaluations/steps/{step_id} self.router.add_api_route( - path="/results/{result_id}", + path="/steps/{step_id}", methods=["DELETE"], - endpoint=self.delete_result, - response_model=EvaluationResultIdResponse, + endpoint=self.delete_step, + response_model=EvaluationStepIdResponse, response_model_exclude_none=True, ) - # EVALUATION METRICS --------------------------------------------------- + # - EVALUATION METRIC -------------------------------------------------- - # POST /api/evaluations/metrics/refresh + # POST /api/preview/evaluations/metrics/ self.router.add_api_route( - path="/metrics/refresh", + path="/metrics/", methods=["POST"], - endpoint=self.refresh_metrics, + endpoint=self.create_metrics, response_model=EvaluationMetricsResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/metrics/ + # GET /api/preview/evaluations/metrics/ self.router.add_api_route( path="/metrics/", - methods=["POST"], - endpoint=self.create_metrics, + methods=["GET"], + endpoint=self.fetch_metrics, response_model=EvaluationMetricsResponse, response_model_exclude_none=True, ) - # PATCH /api/evaluations/metrics/ + # PATCH /api/preview/evaluations/metrics/ self.router.add_api_route( path="/metrics/", methods=["PATCH"], @@ -379,16 +410,16 @@ def __init__( response_model_exclude_none=True, ) - # DELETE /api/evaluations/metrics/ + # DELETE /api/preview/evaluations/metrics/ self.router.add_api_route( path="/metrics/", methods=["DELETE"], endpoint=self.delete_metrics, - response_model=EvaluationMetricsIdsResponse, + response_model=EvaluationMetricIdsResponse, response_model_exclude_none=True, ) - # POST /api/evaluations/metrics/query + # POST /api/preview/evaluations/metrics/query self.router.add_api_route( path="/metrics/query", methods=["POST"], @@ -397,131 +428,56 @@ def __init__( response_model_exclude_none=True, ) - # EVALUATION QUEUES ---------------------------------------------------- - - # POST /api/evaluations/queues/ - self.router.add_api_route( - path="/queues/", - methods=["POST"], - endpoint=self.create_queues, - response_model=EvaluationQueuesResponse, - response_model_exclude_none=True, - ) - - # PATCH /api/evaluations/queues/ - self.router.add_api_route( - path="/queues/", - methods=["PATCH"], - endpoint=self.edit_queues, - response_model=EvaluationQueuesResponse, - response_model_exclude_none=True, - ) - - # DELETE /api/evaluations/queues/ - self.router.add_api_route( - path="/queues/", - methods=["DELETE"], - endpoint=self.delete_queues, - response_model=EvaluationQueueIdsResponse, - response_model_exclude_none=True, - ) - - # POST /api/evaluations/queues/query + # GET /api/preview/evaluations/metrics/{metric_id} self.router.add_api_route( - path="/queues/query", - methods=["POST"], - endpoint=self.query_queues, - response_model=EvaluationQueuesResponse, - response_model_exclude_none=True, - ) - - # GET /api/evaluations/queues/{queue_id} - self.router.add_api_route( - path="/queues/{queue_id}", + path="/metrics/{metric_id}", methods=["GET"], - endpoint=self.fetch_queue, - response_model=EvaluationQueueResponse, + endpoint=self.fetch_metric, + response_model=EvaluationMetricResponse, response_model_exclude_none=True, ) - # PATCH /api/evaluations/queues/{queue_id} + # PATCH /api/preview/evaluations/metrics/{metric_id} self.router.add_api_route( - path="/queues/{queue_id}", + path="/metrics/{metric_id}", methods=["PATCH"], - endpoint=self.edit_queue, - response_model=EvaluationQueueResponse, + endpoint=self.edit_metric, + response_model=EvaluationMetricResponse, response_model_exclude_none=True, ) - # DELETE /api/evaluations/queues/{queue_id} + # DELETE /api/preview/evaluations/metrics/{metric_id} self.router.add_api_route( - path="/queues/{queue_id}", + path="/metrics/{metric_id}", methods=["DELETE"], - endpoint=self.delete_queue, - response_model=EvaluationQueueIdResponse, - response_model_exclude_none=True, - ) - - # GET /api/evaluations/queues/{queue_id}/scenarios/ - self.router.add_api_route( - path="/queues/{queue_id}/scenarios", - methods=["GET"], - endpoint=self.fetch_queue_scenarios, - response_model=EvaluationQueueScenarioIdsResponse, + endpoint=self.delete_metric, + response_model=EvaluationMetricIdResponse, response_model_exclude_none=True, ) - # EVALUATION RUNS ---------------------------------------------------------- - - # POST /evaluations/runs/refresh - @intercept_exceptions() - async def refresh_runs( - self, - *, - trigger_interval: Optional[int] = Query(1, ge=1, le=60), - trigger_datetime: Optional[datetime] = Query(None), - ): - # ---------------------------------------------------------------------- - # THIS IS AN ADMIN ENDPOINT - # NO CHECK FOR PERMISSIONS / ENTITLEMENTS # ---------------------------------------------------------------------- - if not trigger_datetime or not trigger_interval: - return {"status": "error"} - - timestamp = trigger_datetime - timedelta(minutes=trigger_interval) - interval = trigger_interval - - check = await self.evaluations_service.refresh_runs( - timestamp=timestamp, - interval=interval, - ) - - if not check: - return {"status": "failure"} - - return {"status": "success"} + # - EVALUATION RUN --------------------------------------------------------- # POST /evaluations/runs/ @intercept_exceptions() async def create_runs( self, - request: Request, *, + request: Request, runs_create_request: EvaluationRunsCreateRequest, ) -> EvaluationRunsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION runs = await self.evaluations_service.create_runs( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, runs=runs_create_request.runs, ) @@ -532,26 +488,42 @@ async def create_runs( return runs_response + # GET /evaluations/runs/ + + @intercept_exceptions() + @suppress_exceptions(default=EvaluationRunsResponse()) + async def fetch_runs( + self, + *, + request: Request, + run_query_request: Optional[EvaluationRunQueryRequest] = Depends( + parse_run_query_request + ), + ) -> EvaluationRunsResponse: + return await self.query_runs( + request=request, + run_query_request=run_query_request, + ) + # PATCH /evaluations/runs/ @intercept_exceptions() async def edit_runs( self, - request: Request, *, + request: Request, runs_edit_request: EvaluationRunsEditRequest, ) -> EvaluationRunsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION runs = await self.evaluations_service.edit_runs( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, runs=runs_edit_request.runs, ) @@ -566,21 +538,20 @@ async def edit_runs( @intercept_exceptions() async def delete_runs( self, - request: Request, *, + request: Request, run_ids_request: EvaluationRunIdsRequest, ) -> EvaluationRunIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION run_ids = await self.evaluations_service.delete_runs( - project_id=UUID(request.state.project_id), - # + project_id=request.state.project_id, run_ids=run_ids_request.run_ids, ) @@ -596,23 +567,22 @@ async def delete_runs( @suppress_exceptions(default=EvaluationRunsResponse()) async def query_runs( self, - request: Request, *, + request: Request, run_query_request: EvaluationRunQueryRequest, ) -> EvaluationRunsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_RUNS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION runs = await self.evaluations_service.query_runs( - project_id=UUID(request.state.project_id), - # + project_id=request.state.project_id, run=run_query_request.run, - # + include_archived=run_query_request.include_archived, windowing=run_query_request.windowing, ) @@ -623,26 +593,25 @@ async def query_runs( return runs_response - # POST /evaluations/runs/close + # POST /evaluations/runs/archive @intercept_exceptions() - async def close_runs( + async def archive_runs( self, - request: Request, *, + request: Request, run_ids_request: EvaluationRunIdsRequest, ) -> EvaluationRunsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - runs = await self.evaluations_service.close_runs( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + runs = await self.evaluations_service.archive_runs( + project_id=request.state.project_id, + user_id=request.state.user_id, run_ids=run_ids_request.run_ids, ) @@ -653,26 +622,54 @@ async def close_runs( return runs_response - # POST /evaluations/runs/open + # POST /evaluations/runs/unarchive @intercept_exceptions() - async def open_runs( + async def unarchive_runs( self, + *, request: Request, + run_ids_request: EvaluationRunIdsRequest, + ) -> EvaluationRunsResponse: + if is_ee(): + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.EDIT_EVALUATIONS, + ): + raise FORBIDDEN_EXCEPTION + + runs = await self.evaluations_service.unarchive_runs( + project_id=request.state.project_id, + user_id=request.state.user_id, + run_ids=run_ids_request.run_ids, + ) + + runs_response = EvaluationRunsResponse( + count=len(runs), + runs=runs, + ) + + return runs_response + + # POST /evaluations/runs/close + @intercept_exceptions() + async def close_runs( + self, *, + request: Request, run_ids_request: EvaluationRunIdsRequest, ) -> EvaluationRunsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - runs = await self.evaluations_service.open_runs( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + runs = await self.evaluations_service.close_runs( + project_id=request.state.project_id, + user_id=request.state.user_id, run_ids=run_ids_request.run_ids, ) @@ -688,21 +685,20 @@ async def open_runs( @suppress_exceptions(default=EvaluationRunResponse()) async def fetch_run( self, - request: Request, *, + request: Request, run_id: UUID, ) -> EvaluationRunResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_RUNS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION run = await self.evaluations_service.fetch_run( - project_id=UUID(request.state.project_id), - # + project_id=request.state.project_id, run_id=run_id, ) @@ -717,27 +713,25 @@ async def fetch_run( @intercept_exceptions() async def edit_run( self, - request: Request, *, + request: Request, run_id: UUID, - # run_edit_request: EvaluationRunEditRequest, ) -> EvaluationRunResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - if str(run_id) != str(run_edit_request.run.id): - return EvaluationRunResponse() + if run_id != run_edit_request.run.id: + raise HTTPException(status_code=400, detail="Run ID mismatch") run = await self.evaluations_service.edit_run( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, run=run_edit_request.run, ) @@ -752,57 +746,50 @@ async def edit_run( @intercept_exceptions() async def delete_run( self, - request: Request, *, + request: Request, run_id: UUID, ) -> EvaluationRunIdResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - _run_id = await self.evaluations_service.delete_run( - project_id=UUID(request.state.project_id), - # + run_id = await self.evaluations_service.delete_run( + project_id=request.state.project_id, run_id=run_id, ) run_id_response = EvaluationRunIdResponse( - count=1 if _run_id else 0, - run_id=_run_id, + count=1 if run_id else 0, + run_id=run_id, ) return run_id_response - # POST /evaluations/runs/{run_id}/close - # POST /evaluations/runs/{run_id}/close/{status} + # POST /evaluations/runs/{run_id}/archive @intercept_exceptions() - async def close_run( + async def archive_run( self, - request: Request, *, + request: Request, run_id: UUID, - # - status: Optional[EvaluationStatus] = None, ) -> EvaluationRunResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - run = await self.evaluations_service.close_run( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + run = await self.evaluations_service.archive_run( + project_id=request.state.project_id, + user_id=request.state.user_id, run_id=run_id, - # - status=status, ) run_response = EvaluationRunResponse( @@ -812,26 +799,54 @@ async def close_run( return run_response - # POST /evaluations/runs/{run_id}/open + # POST /evaluations/runs/{run_id}/unarchive @intercept_exceptions() - async def open_run( + async def unarchive_run( self, + *, request: Request, + run_id: UUID, + ) -> EvaluationRunResponse: + if is_ee(): + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.EDIT_EVALUATIONS, + ): + raise FORBIDDEN_EXCEPTION + + run = await self.evaluations_service.unarchive_run( + project_id=request.state.project_id, + user_id=request.state.user_id, + run_id=run_id, + ) + + run_response = EvaluationRunResponse( + count=1 if run else 0, + run=run, + ) + + return run_response + + # POST /evaluations/runs/{run_id}/close + @intercept_exceptions() + async def close_run( + self, *, + request: Request, run_id: UUID, ) -> EvaluationRunResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - run = await self.evaluations_service.open_run( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + run = await self.evaluations_service.close_run( + project_id=request.state.project_id, + user_id=request.state.user_id, run_id=run_id, ) @@ -842,29 +857,28 @@ async def open_run( return run_response - # EVALUATION SCENARIOS ----------------------------------------------------- + # - EVALUATION SCENARIO ---------------------------------------------------- # POST /evaluations/scenarios/ @intercept_exceptions() @handle_evaluation_closed_exception() async def create_scenarios( self, - request: Request, *, + request: Request, scenarios_create_request: EvaluationScenariosCreateRequest, ) -> EvaluationScenariosResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION scenarios = await self.evaluations_service.create_scenarios( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, scenarios=scenarios_create_request.scenarios, ) @@ -875,27 +889,42 @@ async def create_scenarios( return scenarios_response + # GET /evaluations/scenarios/ + @intercept_exceptions() + @suppress_exceptions(default=EvaluationScenariosResponse()) + async def fetch_scenarios( + self, + *, + request: Request, + scenario_query_request: Optional[EvaluationScenarioQueryRequest] = Depends( + parse_scenario_query_request + ), + ) -> EvaluationScenariosResponse: + return await self.query_scenarios( + request=request, + scenario_query_request=scenario_query_request, + ) + # PATCH /evaluations/scenarios/ @intercept_exceptions() @handle_evaluation_closed_exception() async def edit_scenarios( self, - request: Request, *, + request: Request, scenarios_edit_request: EvaluationScenariosEditRequest, ) -> EvaluationScenariosResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION scenarios = await self.evaluations_service.edit_scenarios( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, scenarios=scenarios_edit_request.scenarios, ) @@ -911,21 +940,20 @@ async def edit_scenarios( @handle_evaluation_closed_exception() async def delete_scenarios( self, - request: Request, *, + request: Request, scenario_ids_request: EvaluationScenarioIdsRequest, ) -> EvaluationScenarioIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION scenario_ids = await self.evaluations_service.delete_scenarios( - project_id=UUID(request.state.project_id), - # + project_id=request.state.project_id, scenario_ids=scenario_ids_request.scenario_ids, ) @@ -941,23 +969,21 @@ async def delete_scenarios( @suppress_exceptions(default=EvaluationScenariosResponse()) async def query_scenarios( self, - request: Request, *, + request: Request, scenario_query_request: EvaluationScenarioQueryRequest, ) -> EvaluationScenariosResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION scenarios = await self.evaluations_service.query_scenarios( - project_id=UUID(request.state.project_id), - # + project_id=request.state.project_id, scenario=scenario_query_request.scenario, - # windowing=scenario_query_request.windowing, ) @@ -973,21 +999,20 @@ async def query_scenarios( @suppress_exceptions(default=EvaluationScenarioResponse()) async def fetch_scenario( self, - request: Request, *, + request: Request, scenario_id: UUID, ) -> EvaluationScenarioResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION scenario = await self.evaluations_service.fetch_scenario( - project_id=UUID(request.state.project_id), - # + project_id=request.state.project_id, scenario_id=scenario_id, ) @@ -1003,26 +1028,25 @@ async def fetch_scenario( @handle_evaluation_closed_exception() async def edit_scenario( self, - request: Request, *, + request: Request, scenario_id: UUID, - # scenario_edit_request: EvaluationScenarioEditRequest, ) -> EvaluationScenarioResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - if str(scenario_id) != scenario_edit_request.scenario.id: - return EvaluationScenarioResponse() + if scenario_id != scenario_edit_request.scenario.id: + raise HTTPException(status_code=400, detail="Scenario ID mismatch") scenario = await self.evaluations_service.edit_scenario( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), + project_id=request.state.project_id, + user_id=request.state.user_id, scenario=scenario_edit_request.scenario, ) @@ -1038,313 +1062,281 @@ async def edit_scenario( @handle_evaluation_closed_exception() async def delete_scenario( self, - request: Request, *, + request: Request, scenario_id: UUID, - ) -> EvaluationScenarioIdResponse: + ) -> EvaluationScenarioIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_SCENARIOS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - _scenario_id = await self.evaluations_service.delete_scenario( - project_id=UUID(request.state.project_id), - # + scenario_id = await self.evaluations_service.delete_scenario( + project_id=request.state.project_id, scenario_id=scenario_id, ) scenario_id_response = EvaluationScenarioIdResponse( - count=1 if _scenario_id else 0, - scenario_id=_scenario_id, + count=1 if scenario_id else 0, + scenario_id=scenario_id, ) return scenario_id_response - # EVALAUTION RESULTS ------------------------------------------------------- + # - EVALAUTION STEP -------------------------------------------------------- - # POST /evaluations/results/ + # POST /evaluations/steps/ @intercept_exceptions() @handle_evaluation_closed_exception() - async def create_results( + async def create_steps( self, - request: Request, *, - results_create_request: EvaluationResultsCreateRequest, - ) -> EvaluationResultsResponse: + request: Request, + steps_create_request: EvaluationStepsCreateRequest, + ) -> EvaluationStepsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RESULTS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - results = await self.evaluations_service.create_results( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - results=results_create_request.results, + steps = await self.evaluations_service.create_steps( + project_id=request.state.project_id, + user_id=request.state.user_id, + steps=steps_create_request.steps, ) - results_response = EvaluationResultsResponse( - count=len(results), - results=results, + steps_response = EvaluationStepsResponse( + count=len(steps), + steps=steps, ) - return results_response + return steps_response - # PATCH /evaluations/results/ + # GET /evaluations/steps/ @intercept_exceptions() - @handle_evaluation_closed_exception() - async def edit_results( + @suppress_exceptions(default=EvaluationStepsResponse()) + async def fetch_steps( self, - request: Request, *, - results_edit_request: EvaluationResultsEditRequest, - ) -> EvaluationResultsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RESULTS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - results = await self.evaluations_service.edit_results( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - results=results_edit_request.results, - ) - - results_response = EvaluationResultsResponse( - count=len(results), - results=results, + request: Request, + step_query_request: Optional[EvaluationStepQueryRequest] = Depends( + parse_step_query_request + ), + ) -> EvaluationStepsResponse: + return await self.query_steps( + request=request, + step_query_request=step_query_request, ) - return results_response - - # DELETE /evaluations/results/ + # PATCH /evaluations/steps/ @intercept_exceptions() @handle_evaluation_closed_exception() - async def delete_results( + async def edit_steps( self, - request: Request, *, - result_ids_request: EvaluationResultIdsRequest, - ) -> EvaluationResultIdsResponse: + request: Request, + steps_edit_request: EvaluationStepsEditRequest, + ) -> EvaluationStepsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RESULTS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - result_ids = await self.evaluations_service.delete_results( - project_id=UUID(request.state.project_id), - # - result_ids=result_ids_request.result_ids, + steps = await self.evaluations_service.edit_steps( + project_id=request.state.project_id, + user_id=request.state.user_id, + steps=steps_edit_request.steps, ) - result_ids_response = EvaluationResultIdsResponse( - count=len(result_ids), - result_ids=result_ids, + steps_response = EvaluationStepsResponse( + count=len(steps), + steps=steps, ) - return result_ids_response + return steps_response - # POST /evaluations/results/query + # DELETE /evaluations/steps/ @intercept_exceptions() - @suppress_exceptions(default=EvaluationResultsResponse()) - async def query_results( + @handle_evaluation_closed_exception() + async def delete_steps( self, - request: Request, *, - result_query_request: EvaluationResultQueryRequest, - ) -> EvaluationResultsResponse: + request: Request, + step_ids_request: EvaluationStepIdsRequest, + ) -> EvaluationStepIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_RESULTS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - results = await self.evaluations_service.query_results( - project_id=UUID(request.state.project_id), - # - result=result_query_request.result, - # - windowing=result_query_request.windowing, + step_ids = await self.evaluations_service.delete_steps( + project_id=request.state.project_id, + step_ids=step_ids_request.step_ids, ) - results_response = EvaluationResultsResponse( - count=len(results), - results=results, + step_ids_response = EvaluationStepIdsResponse( + count=len(step_ids), + step_ids=step_ids, ) - return results_response + return step_ids_response - # GET /evaluations/results/{result_id} + # POST /evaluations/steps/query @intercept_exceptions() - @suppress_exceptions(default=EvaluationResultResponse()) - async def fetch_result( + @suppress_exceptions(default=EvaluationStepsResponse()) + async def query_steps( self, - request: Request, *, - result_id: UUID, - ) -> EvaluationResultResponse: + request: Request, + step_query_request: EvaluationStepQueryRequest, + ) -> EvaluationStepsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_RESULTS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - result = await self.evaluations_service.fetch_result( - project_id=UUID(request.state.project_id), - # - result_id=result_id, + steps = await self.evaluations_service.query_steps( + project_id=request.state.project_id, + step=step_query_request.step, + windowing=step_query_request.windowing, ) - result_response = EvaluationResultResponse( - count=1 if result else 0, - result=result, + steps_response = EvaluationStepsResponse( + count=len(steps), + steps=steps, ) - return result_response + return steps_response - # PATCH /evaluations/results/{result_id} + # GET /evaluations/steps/{step_id} @intercept_exceptions() - @handle_evaluation_closed_exception() - async def edit_result( + @suppress_exceptions(default=EvaluationStepResponse()) + async def fetch_step( self, - request: Request, *, - result_id: UUID, - # - result_edit_request: EvaluationResultEditRequest, - ) -> EvaluationResultResponse: + request: Request, + step_id: UUID, + ) -> EvaluationStepResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RESULTS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - if str(result_id) != result_edit_request.result.id: - return EvaluationResultResponse() - - result = await self.evaluations_service.edit_result( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - result=result_edit_request.result, + step = await self.evaluations_service.fetch_step( + project_id=request.state.project_id, + step_id=step_id, ) - result_response = EvaluationResultResponse( - count=1 if result else 0, - result=result, + step_response = EvaluationStepResponse( + count=1 if step else 0, + step=step, ) - return result_response + return step_response - # DELETE /evaluations/results/{result_id} + # PATCH /evaluations/steps/{step_id} @intercept_exceptions() @handle_evaluation_closed_exception() - async def delete_result( + async def edit_step( self, - request: Request, *, - result_id: UUID, - ) -> EvaluationResultIdResponse: + request: Request, + step_id: UUID, + step_edit_request: EvaluationStepEditRequest, + ) -> EvaluationStepResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RESULTS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - _result_id = await self.evaluations_service.delete_result( - project_id=UUID(request.state.project_id), - # - result_id=result_id, - ) + if step_id != step_edit_request.step.id: + raise HTTPException(status_code=400, detail="Step ID mismatch") - result_id_response = EvaluationResultIdResponse( - count=1 if _result_id else 0, - result_id=_result_id, + step = await self.evaluations_service.edit_step( + project_id=request.state.project_id, + user_id=request.state.user_id, + step=step_edit_request.step, ) - return result_id_response + step_response = EvaluationStepResponse( + count=1 if step else 0, + step=step, + ) - # EVALUATION METRICS ------------------------------------------------------- + return step_response - # POST /evaluations/metrics/refresh + # DELETE /evaluations/steps/{step_id} @intercept_exceptions() - @suppress_exceptions(default=EvaluationMetricsResponse()) - async def refresh_metrics( + @handle_evaluation_closed_exception() + async def delete_step( self, - request: Request, *, - run_id: UUID, - scenario_id: Optional[UUID] = None, - timestamp: Optional[datetime] = None, - interval: Optional[int] = None, - ) -> EvaluationMetricsResponse: + request: Request, + step_id: UUID, + ) -> EvaluationStepIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_METRICS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - metrics = await self.evaluations_service.refresh_metrics( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - run_id=run_id, - scenario_id=scenario_id, - timestamp=timestamp, - interval=interval, + step_id_val = await self.evaluations_service.delete_step( + project_id=request.state.project_id, + step_id=step_id, ) - metrics_response = EvaluationMetricsResponse( - count=len(metrics), - metrics=metrics, + step_id_response = EvaluationStepIdResponse( + count=1 if step_id_val else 0, + step_id=step_id_val, ) - return metrics_response + return step_id_response + + # - EVALUATION METRIC ------------------------------------------------------ # POST /evaluations/metrics/ @intercept_exceptions() @handle_evaluation_closed_exception() async def create_metrics( self, - request: Request, *, + request: Request, metrics_create_request: EvaluationMetricsCreateRequest, ) -> EvaluationMetricsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_METRICS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION metrics = await self.evaluations_service.create_metrics( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, metrics=metrics_create_request.metrics, ) @@ -1355,27 +1347,42 @@ async def create_metrics( return metrics_response + # GET /evaluations/metrics/ + @intercept_exceptions() + @suppress_exceptions(default=EvaluationMetricsResponse()) + async def fetch_metrics( + self, + *, + request: Request, + metric_query_request: Optional[EvaluationMetricQueryRequest] = Depends( + parse_metric_query_request + ), + ) -> EvaluationMetricsResponse: + return await self.query_metrics( + request=request, + metric_query_request=metric_query_request, + ) + # PATCH /evaluations/metrics/ @intercept_exceptions() @handle_evaluation_closed_exception() async def edit_metrics( self, - request: Request, *, + request: Request, metrics_edit_request: EvaluationMetricsEditRequest, ) -> EvaluationMetricsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_METRICS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION metrics = await self.evaluations_service.edit_metrics( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # + project_id=request.state.project_id, + user_id=request.state.user_id, metrics=metrics_edit_request.metrics, ) @@ -1391,53 +1398,50 @@ async def edit_metrics( @handle_evaluation_closed_exception() async def delete_metrics( self, - request: Request, *, - metrics_ids_request: EvaluationMetricsIdsRequest, - ) -> EvaluationMetricsIdsResponse: + request: Request, + metric_ids_request: EvaluationMetricIdsRequest, + ) -> EvaluationMetricIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_METRICS, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - metrics_ids = await self.evaluations_service.delete_metrics( - project_id=UUID(request.state.project_id), - # - metrics_ids=metrics_ids_request.metrics_ids, + metric_ids = await self.evaluations_service.delete_metrics( + project_id=request.state.project_id, + metric_ids=metric_ids_request.metric_ids, ) - metrics_ids_response = EvaluationMetricsIdsResponse( - count=len(metrics_ids), - metrics_ids=metrics_ids, + metric_ids_response = EvaluationMetricIdsResponse( + count=len(metric_ids), + metric_ids=metric_ids, ) - return metrics_ids_response + return metric_ids_response # POST /evaluations/metrics/query @intercept_exceptions() @suppress_exceptions(default=EvaluationMetricsResponse()) async def query_metrics( self, - request: Request, *, - metric_query_request: EvaluationMetricsQueryRequest, + request: Request, + metric_query_request: EvaluationMetricQueryRequest, ) -> EvaluationMetricsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_METRICS, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION metrics = await self.evaluations_service.query_metrics( - project_id=UUID(request.state.project_id), - # - metric=metric_query_request.metrics, - # + project_id=request.state.project_id, + metric=metric_query_request.metric, windowing=metric_query_request.windowing, ) @@ -1448,627 +1452,96 @@ async def query_metrics( return metrics_response - # EVALUATION QUEUES -------------------------------------------------------- - - # POST /evaluations/queues/ + # GET /evaluations/metrics/{metric_id} @intercept_exceptions() - @handle_evaluation_closed_exception() - async def create_queues( + @suppress_exceptions(default=EvaluationMetricResponse()) + async def fetch_metric( self, - request: Request, *, - queues_create_request: EvaluationQueuesCreateRequest, - ) -> EvaluationQueuesResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_QUEUES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - queues = await self.evaluations_service.create_queues( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - queues=queues_create_request.queues, - ) - - queues_response = EvaluationQueuesResponse( - count=len(queues), - queues=queues, - ) - - return queues_response - - # PATCH /evaluations/queues/ - @intercept_exceptions() - @handle_evaluation_closed_exception() - async def edit_queues( - self, request: Request, - *, - queues_edit_request: EvaluationQueuesEditRequest, - ) -> EvaluationQueuesResponse: + metric_id: UUID, + ) -> EvaluationMetricResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_QUEUES, # type: ignore + permission=Permission.VIEW_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - queues = await self.evaluations_service.edit_queues( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # s - queues=queues_edit_request.queues, + metric = await self.evaluations_service.fetch_metric( + project_id=request.state.project_id, + metric_id=metric_id, ) - queues_response = EvaluationQueuesResponse( - count=len(queues), - queues=queues, + metric_response = EvaluationMetricResponse( + count=1 if metric else 0, + metric=metric, ) - return queues_response + return metric_response - # DELETE /evaluations/queues/ + # PATCH /evaluations/metrics/{metric_id} @intercept_exceptions() @handle_evaluation_closed_exception() - async def delete_queues( + async def edit_metric( self, - request: Request, *, - queue_ids_request: EvaluationQueueIdsRequest, - ) -> EvaluationQueueIdsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_QUEUES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - queue_ids = await self.evaluations_service.delete_queues( - project_id=UUID(request.state.project_id), - # - queue_ids=queue_ids_request.queue_ids, - ) - - queue_ids_response = EvaluationQueueIdsResponse( - count=len(queue_ids), - queue_ids=queue_ids, - ) - - return queue_ids_response - - # POST /evaluations/queues/query - @intercept_exceptions() - @suppress_exceptions(default=EvaluationQueuesResponse()) - async def query_queues( - self, request: Request, - *, - queue_query_request: EvaluationQueueQueryRequest, - ) -> EvaluationQueuesResponse: + metric_id: UUID, + metric_edit_request: EvaluationMetricEditRequest, + ) -> EvaluationMetricResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_QUEUES, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore - - queues = await self.evaluations_service.query_queues( - project_id=UUID(request.state.project_id), - # - queue=queue_query_request.queue, - # - windowing=queue_query_request.windowing, - ) + raise FORBIDDEN_EXCEPTION - queues_response = EvaluationQueuesResponse( - count=len(queues), - queues=queues, - ) - - return queues_response - - # GET /evaluations/queues/{queue_id} - @intercept_exceptions() - @suppress_exceptions(default=EvaluationQueueResponse()) - async def fetch_queue( - self, - request: Request, - *, - queue_id: UUID, - ) -> EvaluationQueueResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_QUEUES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + if metric_id != metric_edit_request.metric.id: + raise HTTPException(status_code=400, detail="Metric ID mismatch") - queue = await self.evaluations_service.fetch_queue( - project_id=UUID(request.state.project_id), - # - queue_id=queue_id, + metric = await self.evaluations_service.edit_metric( + project_id=request.state.project_id, + user_id=request.state.user_id, + metric=metric_edit_request.metric, ) - queue_response = EvaluationQueueResponse( - count=1 if queue else 0, - queue=queue, + metric_response = EvaluationMetricResponse( + count=1 if metric else 0, + metric=metric, ) - return queue_response + return metric_response - # PATCH /evaluations/queues/{queue_id} + # DELETE /evaluations/metrics/{metric_id} @intercept_exceptions() @handle_evaluation_closed_exception() - async def edit_queue( + async def delete_metric( self, - request: Request, *, - queue_id: UUID, - # - queue_edit_request: EvaluationQueueEditRequest, - ) -> EvaluationQueueResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_QUEUES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(queue_id) != queue_edit_request.queue.id: - return EvaluationQueueResponse() - - queue = await self.evaluations_service.edit_queue( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - queue=queue_edit_request.queue, - ) - - queue_response = EvaluationQueueResponse( - count=1 if queue else 0, - queue=queue, - ) - - return queue_response - - # DELETE /evaluations/queues/{queue_id} - @intercept_exceptions() - @handle_evaluation_closed_exception() - async def delete_queue( - self, request: Request, - *, - queue_id: UUID, - ) -> EvaluationQueueIdResponse: + metric_id: UUID, + ) -> EvaluationMetricIdsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_QUEUES, # type: ignore + permission=Permission.EDIT_EVALUATIONS, ): - raise FORBIDDEN_EXCEPTION # type: ignore - - _queue_id = await self.evaluations_service.delete_queue( - project_id=UUID(request.state.project_id), - # - queue_id=queue_id, - ) + raise FORBIDDEN_EXCEPTION - queue_id_response = EvaluationQueueIdResponse( - count=1 if _queue_id else 0, - queue_id=_queue_id, + metric_id_val = await self.evaluations_service.delete_metric( + project_id=request.state.project_id, + metric_id=metric_id, ) - return queue_id_response - - # GET /evaluations/queues/{queue_id}/scenarios - @intercept_exceptions() - @suppress_exceptions(default=EvaluationQueueScenarioIdsResponse()) - async def fetch_queue_scenarios( - self, - request: Request, - *, - queue_id: UUID, - # - user_id: Optional[UUID] = Query(None), - ) -> EvaluationQueueScenarioIdsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_QUEUES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - scenario_ids = await self.evaluations_service.fetch_queue_scenarios( - project_id=UUID(request.state.project_id), - user_id=user_id, - # - queue_id=queue_id, - ) - - scenario_ids_response = EvaluationQueueScenarioIdsResponse( - count=len(scenario_ids), - scenario_ids=scenario_ids, - ) - - return scenario_ids_response - - -class SimpleEvaluationsRouter: - def __init__( - self, - *, - simple_evaluations_service: SimpleEvaluationsService, - ): - self.simple_evaluations_service = simple_evaluations_service - - self.router = APIRouter() - - # SIMPLE EVALUATIONS --------------------------------------------------- - - # POST /api/simple/evaluations/ - self.router.add_api_route( - path="/", - methods=["POST"], - endpoint=self.create_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, - ) - - # GET /api/simple/evaluations/{evaluation_id} - self.router.add_api_route( - path="/{evaluation_id}", - methods=["GET"], - endpoint=self.fetch_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, - ) - - # PATCH /api/simple/evaluations/{evaluation_id} - self.router.add_api_route( - path="/{evaluation_id}", - methods=["PATCH"], - endpoint=self.edit_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, - ) - - # DELETE /api/simple/evaluations/{evaluation_id} - self.router.add_api_route( - path="/{evaluation_id}", - methods=["DELETE"], - endpoint=self.delete_evaluation, - response_model=SimpleEvaluationIdResponse, - response_model_exclude_none=True, - ) - - # POST /api/simple/evaluations/query - self.router.add_api_route( - path="/query", - methods=["POST"], - endpoint=self.query_evaluations, - response_model=SimpleEvaluationsResponse, - response_model_exclude_none=True, - ) - - # POST /api/simple/evaluations/{evaluation_id}/start - self.router.add_api_route( - path="/{evaluation_id}/start", - methods=["POST"], - endpoint=self.start_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, - ) - - # POST /api/simple/evaluations/{evaluation_id}/stop - self.router.add_api_route( - path="/{evaluation_id}/stop", - methods=["POST"], - endpoint=self.stop_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, - ) - - # POST /api/simpleEvaluations/{evaluation_id}/close - self.router.add_api_route( - path="/{evaluation_id}/close", - methods=["POST"], - endpoint=self.close_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, - ) - - # POST /api/simple/evaluations/{evaluation_id}/open - self.router.add_api_route( - path="/{evaluation_id}/open", - methods=["POST"], - endpoint=self.open_evaluation, - response_model=SimpleEvaluationResponse, - response_model_exclude_none=True, + metric_id_response = EvaluationMetricIdResponse( + count=1 if metric_id_val else 0, + metric_id=metric_id_val, ) - # SIMPLE EVALUATIONS ------------------------------------------------------- - - # POST /api/simple/evaluations/ - @intercept_exceptions() - async def create_evaluation( - self, - request: Request, - *, - evaluation_create_request: SimpleEvaluationCreateRequest, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluation = await self.simple_evaluations_service.create( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluation=evaluation_create_request.evaluation, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) - - return response - - # GET /api/simple/evaluations/{evaluation_id} - @intercept_exceptions() - @suppress_exceptions(default=SimpleEvaluationResponse()) - async def fetch_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluation = await self.simple_evaluations_service.fetch( - project_id=UUID(request.state.project_id), - # - evaluation_id=evaluation_id, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) - - return response - - # PATCH /api/simple/evaluations/{evaluation_id} - @intercept_exceptions() - async def edit_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - # - evaluation_edit_request: SimpleEvaluationEditRequest, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(evaluation_id) != evaluation_edit_request.evaluation.id: - return SimpleEvaluationResponse() - - evaluation = await self.simple_evaluations_service.edit( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluation=evaluation_edit_request.evaluation, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) - - return response - - # DELETE /api/simple/evaluations/{evaluation_id} - @intercept_exceptions() - async def delete_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - ) -> SimpleEvaluationIdResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - deleted_evaluation_id = await self.simple_evaluations_service.delete( - project_id=UUID(request.state.project_id), - # - evaluation_id=evaluation_id, - ) - - response = SimpleEvaluationIdResponse( - count=1 if deleted_evaluation_id else 0, - evaluation_id=deleted_evaluation_id, - ) - - return response - - # POST /api/simple/evaluations/query - @intercept_exceptions() - @suppress_exceptions(default=SimpleEvaluationsResponse()) - async def query_evaluations( - self, - request: Request, - *, - evaluation_query_request: SimpleEvaluationQueryRequest, - ) -> SimpleEvaluationsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluations = await self.simple_evaluations_service.query( - project_id=UUID(request.state.project_id), - # - query=evaluation_query_request.evaluation, - ) - - response = SimpleEvaluationsResponse( - count=len(evaluations), - evaluations=evaluations, - ) - - return response - - # POST /api/simple/evaluations/{evaluation_id}/start - @intercept_exceptions() - async def start_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluation = await self.simple_evaluations_service.start( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluation_id=evaluation_id, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) - - return response - - # POST /api/simple/evaluations/{evaluation_id}/stop - @intercept_exceptions() - async def stop_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluation = await self.simple_evaluations_service.stop( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluation_id=evaluation_id, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) - - return response - - # POST /api/simple/evaluations/{evaluation_id}/close - @intercept_exceptions() - async def close_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluation = await self.simple_evaluations_service.close( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluation_id=evaluation_id, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) - - return response - - # POST /api/simple/evaluations/{evaluation_id}/open - @intercept_exceptions() - async def open_evaluation( - self, - request: Request, - *, - evaluation_id: UUID, - ) -> SimpleEvaluationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATION_RUNS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluation = await self.simple_evaluations_service.open( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluation_id=evaluation_id, - ) - - response = SimpleEvaluationResponse( - count=1 if evaluation else 0, - evaluation=evaluation, - ) + return metric_id_response - return response + # -------------------------------------------------------------------------- diff --git a/api/oss/src/apis/fastapi/evaluations/utils.py b/api/oss/src/apis/fastapi/evaluations/utils.py index c625678a8f..75139fa775 100644 --- a/api/oss/src/apis/fastapi/evaluations/utils.py +++ b/api/oss/src/apis/fastapi/evaluations/utils.py @@ -1,110 +1,73 @@ -from typing import Optional, List, Literal +from typing import Optional, List from uuid import UUID from datetime import datetime -from functools import wraps +from json import loads from fastapi import Query from oss.src.utils.logging import get_module_logger -from oss.src.core.shared.dtos import ( - Windowing, -) -from oss.src.core.evaluations.types import ( - EvaluationStatus, - EvaluationRunFlags, - EvaluationQueueFlags, - # - EvaluationClosedConflict, -) +from oss.src.core.shared.dtos import Windowing -from oss.src.apis.fastapi.shared.utils import ( - parse_metadata, -) from oss.src.apis.fastapi.evaluations.models import ( EvaluationRunQuery, EvaluationRunQueryRequest, - # EvaluationScenarioQuery, EvaluationScenarioQueryRequest, - # - EvaluationResultQuery, - EvaluationResultQueryRequest, - # - EvaluationMetricsQuery, - EvaluationMetricsQueryRequest, - # - EvaluationQueueQuery, - EvaluationQueueQueryRequest, - # - EvaluationClosedException, + EvaluationStepQuery, + EvaluationStepQueryRequest, + EvaluationMetricQuery, + EvaluationMetricQueryRequest, ) log = get_module_logger(__name__) -def handle_evaluation_closed_exception(): - def decorator(func): - @wraps(func) - async def wrapper(*args, **kwargs): - try: - return await func(*args, **kwargs) - except EvaluationClosedConflict as e: - raise EvaluationClosedException( - message=e.message, - run_id=e.run_id, - scenario_id=e.scenario_id, - result_id=e.result_id, - metrics_id=e.metrics_id, - ) from e - except Exception as e: - raise e - - return wrapper - - return decorator - - async def parse_run_query_request( - ids: Optional[List[UUID]] = Query(None), - # + # FILTERING flags: Optional[str] = Query(None), tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), - # - status: Optional[EvaluationStatus] = Query(None), - statuses: Optional[List[EvaluationStatus]] = Query(None), + status: Optional[str] = Query(None), + statuses: Optional[List[str]] = Query(None), + # ARCHIVING + include_archived: bool = Query(False), # WINDOWING - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), next: Optional[UUID] = Query(None), # pylint: disable=redefined-builtin + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), + order: Optional[str] = Query(None), ) -> EvaluationRunQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + try: + flags = loads(flags) if flags else None + except Exception: # pylint: disable=broad-exception-caught + pass - __flags = None try: - __flags = EvaluationRunFlags(**_flags) if _flags else None # type: ignore - except: + tags = loads(tags) if tags else None + except Exception: # pylint: disable=broad-exception-caught + pass + + try: + meta = loads(meta) if meta else None + except Exception: # pylint: disable=broad-exception-caught pass run_query_request = EvaluationRunQueryRequest( run=EvaluationRunQuery( - flags=__flags, - tags=_tags, - meta=_meta, + flags=flags, + tags=tags, + meta=meta, # status=status, statuses=statuses, - # - ids=ids, ), - # + include_archived=include_archived, windowing=Windowing( - newest=newest, - oldest=oldest, next=next, + start=start, + stop=stop, limit=limit, order=order, ), @@ -114,52 +77,46 @@ async def parse_run_query_request( async def parse_scenario_query_request( - ids: Optional[List[UUID]] = Query(None), - # + # SCOPING run_id: Optional[UUID] = Query(None), run_ids: Optional[List[UUID]] = Query(None), - timestamp: Optional[datetime] = Query(None), - timestamps: Optional[List[datetime]] = Query(None), - interval: Optional[int] = Query(None), - intervals: Optional[List[int]] = Query(None), - # - flags: Optional[str] = Query(None), + # FILTERING tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), - # - status: Optional[EvaluationStatus] = Query(None), - statuses: Optional[List[EvaluationStatus]] = Query(None), + status: Optional[str] = Query(None), + statuses: Optional[List[str]] = Query(None), # WINDOWING - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), next: Optional[UUID] = Query(None), # pylint: disable=redefined-builtin + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), + order: Optional[str] = Query(None), ) -> EvaluationScenarioQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + try: + tags = loads(tags) if tags else None + except Exception: # pylint: disable=broad-exception-caught + pass + + try: + meta = loads(meta) if meta else None + except Exception: # pylint: disable=broad-exception-caught + pass scenario_query_request = EvaluationScenarioQueryRequest( scenario=EvaluationScenarioQuery( - flags=_flags, - tags=_tags, - meta=_meta, + tags=tags, + meta=meta, # status=status, statuses=statuses, # - interval=interval, - intervals=intervals, - timestamp=timestamp, - timestamps=timestamps, run_id=run_id, run_ids=run_ids, - # - ids=ids, ), windowing=Windowing( - newest=newest, - oldest=oldest, next=next, + start=start, + stop=stop, limit=limit, order=order, ), @@ -168,177 +125,117 @@ async def parse_scenario_query_request( return scenario_query_request -async def parse_result_query_request( - ids: Optional[List[UUID]] = Query(None), - # +async def parse_step_query_request( + # SCOPING run_id: Optional[UUID] = Query(None), run_ids: Optional[List[UUID]] = Query(None), scenario_id: Optional[UUID] = Query(None), scenario_ids: Optional[List[UUID]] = Query(None), - step_key: Optional[str] = Query(None), - step_keys: Optional[List[str]] = Query(None), - repeat_idx: Optional[int] = Query(None), - repeat_idxs: Optional[List[int]] = Query(None), - timestamp: Optional[datetime] = Query(None), - timestamps: Optional[List[datetime]] = Query(None), - interval: Optional[int] = Query(None), - intervals: Optional[List[int]] = Query(None), - # - status: Optional[EvaluationStatus] = Query(None), - statuses: Optional[List[EvaluationStatus]] = Query(None), - # - flags: Optional[str] = Query(None), + # FILTERING tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), + timestamp: Optional[datetime] = Query(None), + status: Optional[str] = Query(None), + statuses: Optional[List[str]] = Query(None), + key: Optional[str] = Query(None), + keys: Optional[List[str]] = Query(None), + repeat_id: Optional[UUID] = Query(None), + repeat_ids: Optional[List[UUID]] = Query(None), + retry_id: Optional[UUID] = Query(None), + retry_ids: Optional[List[UUID]] = Query(None), # WINDOWING - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), next: Optional[UUID] = Query(None), # pylint: disable=redefined-builtin + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> EvaluationResultQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + order: Optional[str] = Query(None), +) -> EvaluationStepQueryRequest: + try: + tags = loads(tags) if tags else None + except Exception: # pylint: disable=broad-exception-caught + pass + + try: + meta = loads(meta) if meta else None + except Exception: # pylint: disable=broad-exception-caught + pass - result_query_request = EvaluationResultQueryRequest( - result=EvaluationResultQuery( - flags=_flags, - tags=_tags, - meta=_meta, + step_query_request = EvaluationStepQueryRequest( + step=EvaluationStepQuery( + tags=tags, + meta=meta, # + timestamp=timestamp, status=status, statuses=statuses, # - interval=interval, - intervals=intervals, - timestamp=timestamp, - timestamps=timestamps, - repeat_idx=repeat_idx, - repeat_idxs=repeat_idxs, - step_key=step_key, - step_keys=step_keys, + key=key, + keys=keys, + repeat_id=repeat_id, + repeat_ids=repeat_ids, + retry_id=retry_id, + retry_ids=retry_ids, + # scenario_id=scenario_id, scenario_ids=scenario_ids, run_id=run_id, run_ids=run_ids, - # - ids=ids, ), windowing=Windowing( - newest=newest, - oldest=oldest, next=next, + start=start, + stop=stop, limit=limit, order=order, ), ) - return result_query_request + return step_query_request -async def parse_metrics_query_request( - ids: Optional[List[UUID]] = Query(None), - # +async def parse_metric_query_request( + # SCOPING run_id: Optional[UUID] = Query(None), run_ids: Optional[List[UUID]] = Query(None), scenario_id: Optional[UUID] = Query(None), scenario_ids: Optional[List[UUID]] = Query(None), - timestamp: Optional[datetime] = Query(None), - timestamps: Optional[List[datetime]] = Query(None), - interval: Optional[int] = Query(None), - intervals: Optional[List[int]] = Query(None), - # - flags: Optional[str] = Query(None), + # FILTERING tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), - # - status: Optional[EvaluationStatus] = Query(None), - statuses: Optional[List[EvaluationStatus]] = Query(None), + status: Optional[str] = Query(None), + statuses: Optional[List[str]] = Query(None), # WINDOWING - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), next: Optional[UUID] = Query(None), # pylint: disable=redefined-builtin + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> EvaluationMetricsQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + order: Optional[str] = Query(None), +) -> EvaluationMetricQueryRequest: + try: + meta = loads(meta) if meta else None + except Exception: # pylint: disable=broad-exception-caught + pass - metrics_query_request = EvaluationMetricsQueryRequest( - metrics=EvaluationMetricsQuery( - flags=_flags, - tags=_tags, - meta=_meta, + metric_query_request = EvaluationMetricQueryRequest( + metric=EvaluationMetricQuery( + tags=tags, + meta=meta, # status=status, statuses=statuses, # - interval=interval, - intervals=intervals, - timestamp=timestamp, - timestamps=timestamps, scenario_id=scenario_id, scenario_ids=scenario_ids, run_id=run_id, run_ids=run_ids, - # - ids=ids, - ), - windowing=Windowing( - newest=newest, - oldest=oldest, - next=next, - limit=limit, - order=order, - ), - ) - - return metrics_query_request - - -async def parse_queue_query_request( - ids: Optional[List[UUID]] = Query(None), - # - run_id: Optional[UUID] = Query(None), - run_ids: Optional[List[UUID]] = Query(None), - user_id: Optional[UUID] = Query(None), - user_ids: Optional[List[UUID]] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # WINDOWING - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - next: Optional[UUID] = Query(None), # pylint: disable=redefined-builtin - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> EvaluationQueueQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = None - try: - __flags = EvaluationQueueFlags(**_flags) if _flags else None # type: ignore - except: - pass - - queue_query_request = EvaluationQueueQueryRequest( - queue=EvaluationQueueQuery( - flags=__flags, - tags=_tags, - meta=_meta, - # - run_id=run_id, - run_ids=run_ids, - user_id=user_id, - user_ids=user_ids, - ids=ids, ), windowing=Windowing( - newest=newest, - oldest=oldest, next=next, + start=start, + stop=stop, limit=limit, order=order, ), ) - return queue_query_request + return metric_query_request diff --git a/api/oss/src/apis/fastapi/evaluators/models.py b/api/oss/src/apis/fastapi/evaluators/models.py index dd31edf1f3..21e2f42bbe 100644 --- a/api/oss/src/apis/fastapi/evaluators/models.py +++ b/api/oss/src/apis/fastapi/evaluators/models.py @@ -1,160 +1,71 @@ -from typing import Optional, List +from itertools import chain +from typing import Optional, List, Any, Dict from pydantic import BaseModel from oss.src.core.shared.dtos import ( + Identifier, + Slug, + Lifecycle, + Header, + Tags, + Meta, Windowing, Reference, ) -from oss.src.core.evaluators.dtos import ( - Evaluator, - EvaluatorCreate, - EvaluatorEdit, - EvaluatorQuery, - EvaluatorFork, - EvaluatorRevisionsLog, - # - EvaluatorVariant, - EvaluatorVariantCreate, - EvaluatorVariantEdit, - EvaluatorVariantQuery, - # - EvaluatorRevision, - EvaluatorRevisionCreate, - EvaluatorRevisionEdit, - EvaluatorRevisionQuery, - EvaluatorRevisionCommit, - # - SimpleEvaluator, - SimpleEvaluatorCreate, - SimpleEvaluatorEdit, - SimpleEvaluatorQuery, -) - - -# EVALUATORS ------------------------------------------------------------------- - - -class EvaluatorCreateRequest(BaseModel): - evaluator: EvaluatorCreate - - -class EvaluatorEditRequest(BaseModel): - evaluator: EvaluatorEdit - - -class EvaluatorQueryRequest(BaseModel): - evaluator: Optional[EvaluatorQuery] = None - # - evaluator_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class EvaluatorForkRequest(BaseModel): - evaluator: EvaluatorFork - - -class EvaluatorResponse(BaseModel): - count: int = 0 - evaluator: Optional[Evaluator] = None - - -class EvaluatorsResponse(BaseModel): - count: int = 0 - evaluators: List[Evaluator] = [] - - -# EVALUATOR VARIANTS ----------------------------------------------------------- - - -class EvaluatorVariantCreateRequest(BaseModel): - evaluator_variant: EvaluatorVariantCreate - -class EvaluatorVariantEditRequest(BaseModel): - evaluator_variant: EvaluatorVariantEdit - - -class EvaluatorVariantQueryRequest(BaseModel): - evaluator_variant: Optional[EvaluatorVariantQuery] = None - # - evaluator_refs: Optional[List[Reference]] = None - evaluator_variant_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class EvaluatorVariantForkRequest(BaseModel): # TODO: FIX ME - source_evaluator_variant_ref: Reference - target_evaluator_ref: Reference - slug: Optional[str] = None - name: Optional[str] = None - description: Optional[str] = None - - -class EvaluatorRevisionsLogRequest(BaseModel): - evaluator: EvaluatorRevisionsLog - - -class EvaluatorVariantResponse(BaseModel): - count: int = 0 - evaluator_variant: Optional[EvaluatorVariant] = None - - -class EvaluatorVariantsResponse(BaseModel): - count: int = 0 - evaluator_variants: List[EvaluatorVariant] = [] - - -# EVALUATOR REVISIONS ---------------------------------------------------------- - - -class EvaluatorRevisionCreateRequest(BaseModel): - evaluator_revision: EvaluatorRevisionCreate +from oss.src.core.workflows.dtos import ( + WorkflowRevisionData, + WorkflowFlags, +) -class EvaluatorRevisionEditRequest(BaseModel): - evaluator_revision: EvaluatorRevisionEdit +class SimpleEvaluatorFlags(WorkflowFlags): + def __init__(self, **data): + data["is_evaluator"] = True + super().__init__(**data) -class EvaluatorRevisionQueryRequest(BaseModel): - evaluator_revision: Optional[EvaluatorRevisionQuery] = None - # - evaluator_refs: Optional[List[Reference]] = None - evaluator_variant_refs: Optional[List[Reference]] = None - evaluator_revision_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None +class SimpleEvaluator( + Identifier, + Slug, + Lifecycle, + Header, +): + flags: Optional[SimpleEvaluatorFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -class EvaluatorRevisionCommitRequest(BaseModel): - evaluator_revision_commit: EvaluatorRevisionCommit + data: Optional[WorkflowRevisionData] = None -class EvaluatorRevisionRetrieveRequest(BaseModel): - evaluator_ref: Optional[Reference] = None - evaluator_variant_ref: Optional[Reference] = None - evaluator_revision_ref: Optional[Reference] = None +class SimpleEvaluatorCreate( + Slug, + Header, +): + flags: Optional[SimpleEvaluatorFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None + data: Optional[WorkflowRevisionData] = None -class EvaluatorRevisionResponse(BaseModel): - count: int = 0 - evaluator_revision: Optional[EvaluatorRevision] = None +class SimpleEvaluatorEdit( + Identifier, + Header, +): + flags: Optional[SimpleEvaluatorFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -class EvaluatorRevisionsResponse(BaseModel): - count: int = 0 - evaluator_revisions: List[EvaluatorRevision] = [] + data: Optional[WorkflowRevisionData] = None -# SIMPLE EVALUATORS ------------------------------------------------------------ +class SimpleEvaluatorQuery(BaseModel): + flags: Optional[SimpleEvaluatorFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None class SimpleEvaluatorCreateRequest(BaseModel): diff --git a/api/oss/src/apis/fastapi/evaluators/router.py b/api/oss/src/apis/fastapi/evaluators/router.py index 4ee7f5cbd8..a83346c63a 100644 --- a/api/oss/src/apis/fastapi/evaluators/router.py +++ b/api/oss/src/apis/fastapi/evaluators/router.py @@ -1,1047 +1,70 @@ from typing import Optional, List -from uuid import UUID +from uuid import uuid4, UUID -from fastapi import APIRouter, Request, status, Depends +from fastapi import APIRouter, Request, status, HTTPException from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions from oss.src.utils.caching import get_cache, set_cache, invalidate_cache -from oss.src.core.shared.dtos import ( - Reference, -) -from oss.src.core.evaluators.dtos import ( - EvaluatorFlags, - EvaluatorQueryFlags, - # - EvaluatorQuery, - # - EvaluatorRevision, - # - SimpleEvaluatorData, - SimpleEvaluatorQuery, - SimpleEvaluator, - # - SimpleEvaluatorFlags, - SimpleEvaluatorQueryFlags, -) -from oss.src.core.evaluators.service import ( - SimpleEvaluatorsService, - EvaluatorsService, -) - -from oss.src.apis.fastapi.evaluators.models import ( - EvaluatorCreateRequest, - EvaluatorEditRequest, - EvaluatorQueryRequest, - EvaluatorForkRequest, - EvaluatorRevisionsLogRequest, - EvaluatorResponse, - EvaluatorsResponse, - # - EvaluatorVariantCreateRequest, - EvaluatorVariantEditRequest, - EvaluatorVariantQueryRequest, - EvaluatorVariantResponse, - EvaluatorVariantsResponse, - # - EvaluatorRevisionCreateRequest, - EvaluatorRevisionEditRequest, - EvaluatorRevisionQueryRequest, - EvaluatorRevisionCommitRequest, - EvaluatorRevisionRetrieveRequest, - EvaluatorRevisionResponse, - EvaluatorRevisionsResponse, - # - SimpleEvaluatorCreateRequest, - SimpleEvaluatorEditRequest, - SimpleEvaluatorQueryRequest, - SimpleEvaluatorResponse, - SimpleEvaluatorsResponse, -) -from oss.src.apis.fastapi.evaluators.utils import ( - parse_evaluator_query_request_from_params, - parse_evaluator_query_request_from_body, - merge_evaluator_query_requests, - parse_evaluator_variant_query_request_from_params, - parse_evaluator_variant_query_request_from_body, - merge_evaluator_variant_query_requests, - parse_evaluator_revision_query_request_from_params, - parse_evaluator_revision_query_request_from_body, - merge_evaluator_revision_query_requests, - parse_evaluator_revision_retrieve_request_from_params, - parse_evaluator_revision_retrieve_request_from_body, -) - -if is_ee(): - from ee.src.models.shared_models import Permission - from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION - - -log = get_module_logger(__name__) - - -class EvaluatorsRouter: - def __init__( - self, - *, - evaluators_service: EvaluatorsService, - ): - self.evaluators_service = evaluators_service - - self.router = APIRouter() - - # EVALUATORS ----------------------------------------------------------- - - self.router.add_api_route( - "/", - self.create_evaluator, - methods=["POST"], - operation_id="create_evaluator", - status_code=status.HTTP_200_OK, - response_model=EvaluatorResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{evaluator_id}", - self.fetch_evaluator, - methods=["GET"], - operation_id="fetch_evaluator", - status_code=status.HTTP_200_OK, - response_model=EvaluatorResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{evaluator_id}", - self.edit_evaluator, - methods=["PUT"], - operation_id="edit_evaluator", - status_code=status.HTTP_200_OK, - response_model=EvaluatorResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{evaluator_id}/archive", - self.archive_evaluator, - methods=["POST"], - operation_id="archive_evaluator", - status_code=status.HTTP_200_OK, - response_model=EvaluatorResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{evaluator_id}/unarchive", - self.unarchive_evaluator, - methods=["POST"], - operation_id="unarchive_evaluator", - status_code=status.HTTP_200_OK, - response_model=EvaluatorResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/query", - self.query_evaluators, - methods=["POST"], - operation_id="query_evaluators", - status_code=status.HTTP_200_OK, - response_model=EvaluatorsResponse, - response_model_exclude_none=True, - ) - - # EVALUATOR VARIANTS --------------------------------------------------- - - self.router.add_api_route( - "/variants/", - self.create_evaluator_variant, - methods=["POST"], - operation_id="create_evaluator_variant", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{evaluator_variant_id}", - self.fetch_evaluator_variant, - methods=["GET"], - operation_id="fetch_evaluator_variant", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{evaluator_variant_id}", - self.edit_evaluator_variant, - methods=["PUT"], - operation_id="edit_evaluator_variant", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{evaluator_variant_id}/archive", - self.archive_evaluator_variant, - methods=["POST"], - operation_id="archive_evaluator_variant", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{evaluator_variant_id}/unarchive", - self.unarchive_evaluator_variant, - methods=["POST"], - operation_id="unarchive_evaluator_variant", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/query", - self.query_evaluator_variants, - methods=["POST"], - operation_id="query_evaluator_variants", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantsResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/fork", - self.fork_evaluator_variant, - methods=["POST"], - operation_id="fork_evaluator_variant", - status_code=status.HTTP_200_OK, - response_model=EvaluatorVariantResponse, - response_model_exclude_none=True, - ) - - # EVALUATOR REVISIONS -------------------------------------------------- - - self.router.add_api_route( - "/revisions/retrieve", - self.retrieve_evaluator_revision, - methods=["POST"], - operation_id="retrieve_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/", - self.create_evaluator_revision, - methods=["POST"], - operation_id="create_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{evaluator_revision_id}", - self.fetch_evaluator_revision, - methods=["GET"], - operation_id="fetch_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{evaluator_revision_id}", - self.edit_evaluator_revision, - methods=["PUT"], - operation_id="edit_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{evaluator_revision_id}/archive", - self.archive_evaluator_revision, - methods=["POST"], - operation_id="archive_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{evaluator_revision_id}/unarchive", - self.unarchive_evaluator_revision, - methods=["POST"], - operation_id="unarchive_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/query", - self.query_evaluator_revisions, - methods=["POST"], - operation_id="query_evaluator_revisions", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionsResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/commit", - self.commit_evaluator_revision, - methods=["POST"], - operation_id="commit_evaluator_revision", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/log", - self.log_evaluator_revisions, - methods=["POST"], - operation_id="log_evaluator_revisions", - status_code=status.HTTP_200_OK, - response_model=EvaluatorRevisionsResponse, - response_model_exclude_none=True, - ) - - # EVALUATORS --------------------------------------------------------------- - - @intercept_exceptions() - async def create_evaluator( - self, - request: Request, - *, - evaluator_id: Optional[UUID] = None, - # - evaluator_create_request: EvaluatorCreateRequest, - ) -> EvaluatorResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator = await self.evaluators_service.create_evaluator( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_id=evaluator_id, - # - evaluator_create=evaluator_create_request.evaluator, - ) - - return EvaluatorResponse( - count=1 if evaluator else 0, - evaluator=evaluator, - ) - - @intercept_exceptions() - @suppress_exceptions(default=EvaluatorResponse()) - async def fetch_evaluator( - self, - request: Request, - *, - evaluator_id: UUID, - ) -> EvaluatorResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator = await self.evaluators_service.fetch_evaluator( - project_id=UUID(request.state.project_id), - # - evaluator_ref=Reference(id=evaluator_id), - ) - - return EvaluatorResponse( - count=1 if evaluator else 0, - evaluator=evaluator, - ) - - @intercept_exceptions() - async def edit_evaluator( - self, - request: Request, - *, - evaluator_id: UUID, - # - evaluator_edit_request: EvaluatorEditRequest, - ) -> EvaluatorResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(evaluator_id) != str(evaluator_edit_request.evaluator.id): - return EvaluatorResponse() - - evaluator = await self.evaluators_service.edit_evaluator( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_edit=evaluator_edit_request.evaluator, - ) - - return EvaluatorResponse( - count=1 if evaluator else 0, - evaluator=evaluator, - ) - - @intercept_exceptions() - async def archive_evaluator( - self, - request: Request, - *, - evaluator_id: UUID, - ) -> EvaluatorResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator = await self.evaluators_service.archive_evaluator( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_id=evaluator_id, - ) - - return EvaluatorResponse( - count=1 if evaluator else 0, - evaluator=evaluator, - ) - - @intercept_exceptions() - async def unarchive_evaluator( - self, - request: Request, - *, - evaluator_id: UUID, - ) -> EvaluatorResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator = await self.evaluators_service.unarchive_evaluator( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_id=evaluator_id, - ) - - return EvaluatorResponse( - count=1 if evaluator else 0, - evaluator=evaluator, - ) - - @intercept_exceptions() - @suppress_exceptions(default=EvaluatorsResponse()) - async def query_evaluators( - self, - request: Request, - *, - evaluator_query_request: EvaluatorQueryRequest, - ) -> EvaluatorsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluators = await self.evaluators_service.query_evaluators( - project_id=UUID(request.state.project_id), - # - evaluator_query=evaluator_query_request.evaluator, - # - evaluator_refs=evaluator_query_request.evaluator_refs, - # - include_archived=evaluator_query_request.include_archived, - # - windowing=evaluator_query_request.windowing, - ) - - evaluators_response = EvaluatorsResponse( - count=len(evaluators), - evaluators=evaluators, - ) - - return evaluators_response - - # EVALUATOR VARIANTS ------------------------------------------------------- - - @intercept_exceptions() - async def create_evaluator_variant( - self, - request: Request, - *, - evaluator_variant_create_request: EvaluatorVariantCreateRequest, - ) -> EvaluatorVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_variant = await self.evaluators_service.create_evaluator_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_variant_create=evaluator_variant_create_request.evaluator_variant, - ) - - evaluator_variant_response = EvaluatorVariantResponse( - count=1 if evaluator_variant else 0, - evaluator_variant=evaluator_variant, - ) - - return evaluator_variant_response - - @intercept_exceptions() - async def fetch_evaluator_variant( - self, - request: Request, - *, - evaluator_variant_id: UUID, - ) -> EvaluatorVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_variant = await self.evaluators_service.fetch_evaluator_variant( - project_id=UUID(request.state.project_id), - # - evaluator_variant_ref=Reference(id=evaluator_variant_id), - ) - - evaluator_variant_response = EvaluatorVariantResponse( - count=1 if evaluator_variant else 0, - evaluator_variant=evaluator_variant, - ) - - return evaluator_variant_response - - @intercept_exceptions() - async def edit_evaluator_variant( - self, - request: Request, - *, - evaluator_variant_id: UUID, - # - evaluator_variant_edit_request: EvaluatorVariantEditRequest, - ) -> EvaluatorVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(evaluator_variant_id) != str( - evaluator_variant_edit_request.evaluator_variant.id - ): - return EvaluatorVariantResponse() - - evaluator_variant = await self.evaluators_service.edit_evaluator_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_variant_edit=evaluator_variant_edit_request.evaluator_variant, - ) - - evaluator_variant_response = EvaluatorVariantResponse( - count=1 if evaluator_variant else 0, - evaluator_variant=evaluator_variant, - ) - - return evaluator_variant_response - - @intercept_exceptions() - async def archive_evaluator_variant( - self, - request: Request, - *, - evaluator_variant_id: UUID, - ) -> EvaluatorVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_variant = await self.evaluators_service.archive_evaluator_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_variant_id=evaluator_variant_id, - ) - - evaluator_variant_response = EvaluatorVariantResponse( - count=1 if evaluator_variant else 0, - evaluator_variant=evaluator_variant, - ) - - return evaluator_variant_response - - @intercept_exceptions() - async def unarchive_evaluator_variant( - self, - request: Request, - *, - evaluator_variant_id: UUID, - ) -> EvaluatorVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_variant = await self.evaluators_service.unarchive_evaluator_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_variant_id=evaluator_variant_id, - ) - - evaluator_variant_response = EvaluatorVariantResponse( - count=1 if evaluator_variant else 0, - evaluator_variant=evaluator_variant, - ) - - return evaluator_variant_response - - @intercept_exceptions() - async def query_evaluator_variants( - self, - request: Request, - *, - query_request_params: Optional[EvaluatorVariantQueryRequest] = Depends( - parse_evaluator_variant_query_request_from_params - ), - ) -> EvaluatorVariantsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - body_json = None - query_request_body = None - - try: - body_json = await request.json() - - if body_json: - query_request_body = parse_evaluator_variant_query_request_from_body( - **body_json - ) - - except: - pass - - workflow_variant_query_request = merge_evaluator_variant_query_requests( - query_request_params, - query_request_body, - ) - - evaluator_variants = await self.evaluators_service.query_evaluator_variants( - project_id=UUID(request.state.project_id), - # - evaluator_variant_query=workflow_variant_query_request.evaluator_variant, - # - evaluator_refs=workflow_variant_query_request.evaluator_refs, - evaluator_variant_refs=workflow_variant_query_request.evaluator_variant_refs, - # - include_archived=workflow_variant_query_request.include_archived, - # - windowing=workflow_variant_query_request.windowing, - ) - - evaluator_variants_response = EvaluatorVariantsResponse( - count=len(evaluator_variants), - evaluator_variants=evaluator_variants, - ) - - return evaluator_variants_response - - @intercept_exceptions() # TODO: FIX ME - async def fork_evaluator_variant( - self, - request: Request, - *, - evaluator_variant_id: UUID, - # - evaluator_variant_fork_request: EvaluatorForkRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_variant = await self.evaluators_service.fork_evaluator_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_fork=evaluator_variant_fork_request.evaluator, - ) - - evaluator_variant_response = EvaluatorVariantResponse( - count=1 if evaluator_variant else 0, - evaluator_variant=evaluator_variant, - ) - - return evaluator_variant_response - - # EVALUATOR REVISIONS ------------------------------------------------------ - - @intercept_exceptions() - async def retrieve_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_retrieve_request: EvaluatorRevisionRetrieveRequest, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - project_id=request.state.project_id, - user_uid=request.state.user_id, - # - permission=Permission.VIEW_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - cache_key = { - "artifact_ref": evaluator_revision_retrieve_request.evaluator_ref, # type: ignore - "variant_ref": evaluator_revision_retrieve_request.evaluator_variant_ref, # type: ignore - "revision_ref": evaluator_revision_retrieve_request.evaluator_revision_ref, # type: ignore - } - - evaluator_revision = None - # evaluator_revision = await get_cache( - # namespace="evaluators:retrieve", - # project_id=request.state.project_id, - # user_id=request.state.user_id, - # key=cache_key, - # model=EvaluatorRevision, - # ) - - if not evaluator_revision: - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=UUID(request.state.project_id), - # - evaluator_ref=evaluator_revision_retrieve_request.evaluator_ref, # type: ignore - evaluator_variant_ref=evaluator_revision_retrieve_request.evaluator_variant_ref, # type: ignore - evaluator_revision_ref=evaluator_revision_retrieve_request.evaluator_revision_ref, # type: ignore - ) - - await set_cache( - namespace="evaluators:retrieve", - project_id=request.state.project_id, - user_id=request.state.user_id, - key=cache_key, - value=evaluator_revision, - ) - - evaluator_revision_response = EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - return evaluator_revision_response - - @intercept_exceptions() - async def create_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_create_request: EvaluatorRevisionCreateRequest, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_revision = await self.evaluators_service.create_evaluator_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_revision_create=evaluator_revision_create_request.evaluator_revision, - ) - - return EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - @intercept_exceptions() - @suppress_exceptions(default=EvaluatorRevisionResponse()) - async def fetch_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_id: UUID, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=UUID(request.state.project_id), - # - evaluator_revision_ref=Reference(id=evaluator_revision_id), - ) - - return EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - @intercept_exceptions() - async def edit_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_id: UUID, - # - evaluator_revision_edit_request: EvaluatorRevisionEditRequest, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(evaluator_revision_id) != str( - evaluator_revision_edit_request.evaluator_revision.id - ): - return EvaluatorRevisionResponse() - - evaluator_revision = await self.evaluators_service.edit_evaluator_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_revision_edit=evaluator_revision_edit_request.evaluator_revision, - ) - - return EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - @intercept_exceptions() - async def archive_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_id: UUID, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_revision = await self.evaluators_service.archive_evaluator_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_revision_id=evaluator_revision_id, - ) - - return EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - @intercept_exceptions() - async def unarchive_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_id: UUID, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_revision = await self.evaluators_service.unarchive_evaluator_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_revision_id=evaluator_revision_id, - ) - - return EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - @intercept_exceptions() - @suppress_exceptions(default=EvaluatorRevisionsResponse()) - async def query_evaluator_revisions( - self, - request: Request, - *, - evaluator_revision_query_request: EvaluatorRevisionQueryRequest, - ) -> EvaluatorRevisionsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - evaluator_revisions = await self.evaluators_service.query_evaluator_revisions( - project_id=UUID(request.state.project_id), - # - evaluator_revision_query=evaluator_revision_query_request.evaluator_revision, - # - evaluator_refs=evaluator_revision_query_request.evaluator_refs, - evaluator_variant_refs=evaluator_revision_query_request.evaluator_variant_refs, - evaluator_revision_refs=evaluator_revision_query_request.evaluator_revision_refs, - # - include_archived=evaluator_revision_query_request.include_archived, - # - windowing=evaluator_revision_query_request.windowing, - ) - - return EvaluatorRevisionsResponse( - count=len(evaluator_revisions), - evaluator_revisions=evaluator_revisions, - ) - - @intercept_exceptions() - async def commit_evaluator_revision( - self, - request: Request, - *, - evaluator_revision_commit_request: EvaluatorRevisionCommitRequest, - ) -> EvaluatorRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore +from oss.src.core.shared.dtos import Reference +from oss.src.core.workflows.dtos import WorkflowFlags +from oss.src.core.workflows.service import WorkflowsService - evaluator_revision = await self.evaluators_service.commit_evaluator_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - evaluator_revision_commit=evaluator_revision_commit_request.evaluator_revision_commit, - ) - - return EvaluatorRevisionResponse( - count=1 if evaluator_revision else 0, - evaluator_revision=evaluator_revision, - ) - - @intercept_exceptions() - async def log_evaluator_revisions( - self, - request: Request, - *, - evaluator_revisions_log_request: EvaluatorRevisionsLogRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore +from oss.src.core.workflows.dtos import ( + Workflow, + WorkflowCreate, + WorkflowEdit, + WorkflowQuery, + # + WorkflowVariant, + WorkflowVariantCreate, + WorkflowVariantEdit, + WorkflowVariantQuery, + # + WorkflowRevision, + WorkflowRevisionCreate, + WorkflowRevisionQuery, + WorkflowRevisionCommit, + # + WorkflowFlags, +) - evaluator_revisions = await self.evaluators_service.log_evaluator_revisions( - project_id=UUID(request.state.project_id), - # - evaluator_revisions_log=evaluator_revisions_log_request.evaluator, - ) +from oss.src.apis.fastapi.evaluators.models import ( + SimpleEvaluator, + SimpleEvaluatorQuery, + # + SimpleEvaluatorCreateRequest, + SimpleEvaluatorEditRequest, + SimpleEvaluatorQueryRequest, + # + SimpleEvaluatorResponse, + SimpleEvaluatorsResponse, + # + SimpleEvaluatorFlags, +) - revisions_response = EvaluatorRevisionsResponse( - count=len(evaluator_revisions), - evaluator_revisions=evaluator_revisions, - ) +if is_ee(): + from ee.src.models.shared_models import Permission + from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION - return revisions_response + +log = get_module_logger(__name__) class SimpleEvaluatorsRouter: + VERSION = "1.0.0" + def __init__( self, *, - simple_evaluators_service: SimpleEvaluatorsService, + workflows_service: WorkflowsService, ): - self.simple_evaluators_service = simple_evaluators_service - self.evaluators_service = self.simple_evaluators_service.evaluators_service + self.workflows_service = workflows_service self.router = APIRouter() - # SIMPLE EVALUATORS ---------------------------------------------------- - self.router.add_api_route( "/", self.create_simple_evaluator, @@ -1093,55 +116,204 @@ def __init__( ) self.router.add_api_route( - "/query", - self.query_simple_evaluators, - methods=["POST"], - operation_id="query_simple_evaluators", + "/", + self.list_simple_evaluators, + methods=["GET"], + operation_id="list_simple_evaluators", status_code=status.HTTP_200_OK, response_model=SimpleEvaluatorsResponse, response_model_exclude_none=True, ) self.router.add_api_route( - "/{evaluator_id}/transfer", - self.transfer_simple_evaluator, + "/query", + self.query_simple_evaluators, methods=["POST"], - operation_id="transfer_simple_evaluator", + operation_id="query_simple_evaluators", status_code=status.HTTP_200_OK, - response_model=SimpleEvaluatorResponse, + response_model=SimpleEvaluatorsResponse, response_model_exclude_none=True, ) - # SIMPLE EVALUATORS -------------------------------------------------------- - @intercept_exceptions() async def create_simple_evaluator( self, - request: Request, *, - evaluator_id: Optional[UUID] = None, - # + request: Request, simple_evaluator_create_request: SimpleEvaluatorCreateRequest, ) -> SimpleEvaluatorResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.EDIT_EVALUATORS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION + + simple_evaluator_flags = ( + SimpleEvaluatorFlags( + **( + simple_evaluator_create_request.evaluator.flags.model_dump( + mode="json" + ) + ) + ) + if simple_evaluator_create_request.evaluator.flags + else SimpleEvaluatorFlags( + is_custom=False, + is_human=False, + is_evaluator=True, + ) + ) + + workflow_flags = WorkflowFlags( + **simple_evaluator_flags.model_dump(mode="json"), + ) + + _workflow_create = WorkflowCreate( + slug=simple_evaluator_create_request.evaluator.slug, + # + name=simple_evaluator_create_request.evaluator.name, + description=simple_evaluator_create_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_create_request.evaluator.tags, + meta=simple_evaluator_create_request.evaluator.meta, + ) + + workflow: Optional[Workflow] = await self.workflows_service.create_workflow( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + workflow_create=_workflow_create, + ) + + if workflow is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple evaluator. Please try again or contact support.", + ) + + workflow_variant_slug = uuid4().hex + + _workflow_variant_create = WorkflowVariantCreate( + slug=workflow_variant_slug, + # + name=simple_evaluator_create_request.evaluator.name, + description=simple_evaluator_create_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_create_request.evaluator.tags, + meta=simple_evaluator_create_request.evaluator.meta, + # + workflow_id=workflow.id, # type: ignore + ) + + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.create_workflow_variant( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + workflow_variant_create=_workflow_variant_create, + ) + + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple evaluator. Please try again or contact support.", + ) + + workflow_revision_slug = uuid4().hex + + _workflow_revision_create = WorkflowRevisionCreate( + slug=workflow_revision_slug, + # + name=simple_evaluator_create_request.evaluator.name, + description=simple_evaluator_create_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_create_request.evaluator.tags, + meta=simple_evaluator_create_request.evaluator.meta, + # + workflow_id=workflow.id, + workflow_variant_id=workflow_variant.id, + ) + + workflow_revision: Optional[ + WorkflowRevision + ] = await self.workflows_service.create_workflow_revision( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + workflow_revision_create=_workflow_revision_create, + ) + + if workflow_revision is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple evaluator. Please try again or contact support.", + ) + + workflow_revision_slug = uuid4().hex + + _workflow_revision_commit = WorkflowRevisionCommit( + slug=workflow_revision_slug, + # + name=simple_evaluator_create_request.evaluator.name, + description=simple_evaluator_create_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_create_request.evaluator.tags, + meta=simple_evaluator_create_request.evaluator.meta, + # + # message= + # + data=simple_evaluator_create_request.evaluator.data, + # + workflow_id=workflow.id, + workflow_variant_id=workflow_variant.id, + ) - simple_evaluator = await self.simple_evaluators_service.create( + workflow_revision: Optional[ + WorkflowRevision + ] = await self.workflows_service.commit_workflow_revision( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - evaluator_id=evaluator_id, + workflow_revision_commit=_workflow_revision_commit, + ) + + if workflow_revision is None: + # do something + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple evaluator. Please try again or contact support.", + ) + + simple_evaluator = SimpleEvaluator( + id=workflow.id, + slug=workflow.slug, + # + created_at=workflow.created_at, + updated_at=workflow.updated_at, + deleted_at=workflow.deleted_at, + created_by_id=workflow.created_by_id, + updated_by_id=workflow.updated_by_id, + deleted_by_id=workflow.deleted_by_id, + # + name=workflow.name, + description=workflow.description, + # + flags=simple_evaluator_flags, + tags=workflow.tags, + meta=workflow.meta, # - simple_evaluator_create=simple_evaluator_create_request.evaluator, + data=workflow_revision.data, ) simple_evaluator_response = SimpleEvaluatorResponse( - count=1 if simple_evaluator else 0, + count=1, evaluator=simple_evaluator, ) @@ -1151,26 +323,97 @@ async def create_simple_evaluator( @suppress_exceptions(default=SimpleEvaluatorResponse()) async def fetch_simple_evaluator( self, - request: Request, *, + request: Request, evaluator_id: UUID, ) -> SimpleEvaluatorResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATORS, # type: ignore + permission=Permission.VIEW_EVALUATORS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION + + workflow_ref = Reference( + id=evaluator_id, + ) + + workflow: Optional[Workflow] = await self.workflows_service.fetch_workflow( + project_id=UUID(request.state.project_id), + # + workflow_ref=workflow_ref, + ) + + if workflow is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator not found. Please check the ID and try again.", + ) + + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.fetch_workflow_variant( + project_id=UUID(request.state.project_id), + # + workflow_ref=workflow_ref, + ) + + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator variant not found. Please check the ID and try again.", + ) + + workflow_variant_ref = Reference( + id=workflow_variant.id, + ) - simple_evaluator = await self.simple_evaluators_service.fetch( + workflow_revision: Optional[ + WorkflowRevision + ] = await self.workflows_service.fetch_workflow_revision( project_id=UUID(request.state.project_id), # - evaluator_id=evaluator_id, + workflow_variant_ref=workflow_variant_ref, + ) + + if workflow_revision is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator revision not found. Please check the ID and try again.", + ) + + simple_evaluator_flags = SimpleEvaluatorFlags( + **( + workflow.flags.model_dump(mode="json") + if workflow.flags + else SimpleEvaluatorFlags() + ) + ) + + simple_evaluator = SimpleEvaluator( + id=workflow.id, + slug=workflow.slug, + # + created_at=workflow.created_at, + updated_at=workflow.updated_at, + deleted_at=workflow.deleted_at, + created_by_id=workflow.created_by_id, + updated_by_id=workflow.updated_by_id, + deleted_by_id=workflow.deleted_by_id, + # + name=workflow.name, + description=workflow.description, + # + flags=simple_evaluator_flags, + tags=workflow.tags, + meta=workflow.meta, + # + data=workflow_revision.data, ) simple_evaluator_response = SimpleEvaluatorResponse( - count=1 if simple_evaluator else 0, + count=1, evaluator=simple_evaluator, ) @@ -1179,119 +422,296 @@ async def fetch_simple_evaluator( @intercept_exceptions() async def edit_simple_evaluator( self, - request: Request, *, + request: Request, evaluator_id: UUID, - # simple_evaluator_edit_request: SimpleEvaluatorEditRequest, ) -> SimpleEvaluatorResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.EDIT_EVALUATORS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION + + simple_evaluator_flags = ( + SimpleEvaluatorFlags( + **( + simple_evaluator_edit_request.evaluator.flags.model_dump( + mode="json" + ) + ) + ) + if simple_evaluator_edit_request.evaluator.flags + else SimpleEvaluatorFlags() + ) + + workflow_flags = WorkflowFlags(**simple_evaluator_flags.model_dump()) if str(evaluator_id) != str(simple_evaluator_edit_request.evaluator.id): - return SimpleEvaluatorResponse() + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"ID mismatch between path params and body params: {evaluator_id} != {simple_evaluator_edit_request.evaluator.id}", + ) + + workflow_ref = Reference( + id=simple_evaluator_edit_request.evaluator.id, + ) + + workflow: Optional[Workflow] = await self.workflows_service.fetch_workflow( + project_id=UUID(request.state.project_id), + # + workflow_ref=workflow_ref, + ) + + if workflow is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator not found. Please check the ID and try again.", + ) + + _workflow_edit = WorkflowEdit( + id=workflow.id, + # + name=simple_evaluator_edit_request.evaluator.name, + description=simple_evaluator_edit_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_edit_request.evaluator.tags, + meta=simple_evaluator_edit_request.evaluator.meta, + ) + + workflow: Optional[Workflow] = await self.workflows_service.edit_workflow( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + workflow_edit=_workflow_edit, + ) + + if workflow is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to edit simple evaluator. Please try again or contact support.", + ) + + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.fetch_workflow_variant( + project_id=UUID(request.state.project_id), + # + workflow_ref=workflow_ref, + ) + + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator variant not found. Please check the ID and try again.", + ) + + _workflow_variant_edit = WorkflowVariantEdit( + id=workflow_variant.id, + # + name=simple_evaluator_edit_request.evaluator.name, + description=simple_evaluator_edit_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_edit_request.evaluator.tags, + meta=simple_evaluator_edit_request.evaluator.meta, + ) + + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.edit_workflow_variant( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + workflow_variant_edit=_workflow_variant_edit, + ) + + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to edit simple evaluator variant. Please try again or contact support.", + ) + + workflow_variant_ref = Reference( + id=workflow_variant.id, + ) + + workflow_revision: Optional[ + WorkflowRevision + ] = await self.workflows_service.fetch_workflow_revision( + project_id=UUID(request.state.project_id), + # + workflow_variant_ref=workflow_variant_ref, + ) + + if workflow_revision is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator revision not found. Please check the ID and try again.", + ) + + workflow_revision_slug = uuid4().hex + + _workflow_revision_commit = WorkflowRevisionCommit( + slug=workflow_revision_slug, + # + name=simple_evaluator_edit_request.evaluator.name, + description=simple_evaluator_edit_request.evaluator.description, + # + flags=workflow_flags, + tags=simple_evaluator_edit_request.evaluator.tags, + meta=simple_evaluator_edit_request.evaluator.meta, + # + data=simple_evaluator_edit_request.evaluator.data, + # + workflow_id=workflow.id, + workflow_variant_id=workflow_variant.id, + ) - simple_evaluator = await self.simple_evaluators_service.edit( + workflow_revision: Optional[ + WorkflowRevision + ] = await self.workflows_service.commit_workflow_revision( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - simple_evaluator_edit=simple_evaluator_edit_request.evaluator, + workflow_revision_commit=_workflow_revision_commit, + ) + + if workflow_revision is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to edit simple evaluator revision. Please try again or contact support.", + ) + + simple_evaluator = SimpleEvaluator( + id=workflow.id, + slug=workflow.slug, + # + created_at=workflow.created_at, + updated_at=workflow.updated_at, + deleted_at=workflow.deleted_at, + created_by_id=workflow.created_by_id, + updated_by_id=workflow.updated_by_id, + deleted_by_id=workflow.deleted_by_id, + # + name=workflow.name, + description=workflow.description, + # + flags=simple_evaluator_flags, + tags=workflow.tags, + meta=workflow.meta, + # + data=workflow_revision.data, ) simple_evaluator_response = SimpleEvaluatorResponse( - count=1 if simple_evaluator else 0, + count=1, evaluator=simple_evaluator, ) return simple_evaluator_response @intercept_exceptions() - async def archive_simple_evaluator( # TODO: FIX ME + async def archive_simple_evaluator( self, - request: Request, *, + request: Request, evaluator_id: UUID, ) -> SimpleEvaluatorResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.EDIT_EVALUATORS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION + + workflow_ref = Reference( + id=evaluator_id, + ) - evaluator = await self.evaluators_service.fetch_evaluator( + workflow: Optional[Workflow] = await self.workflows_service.fetch_workflow( project_id=UUID(request.state.project_id), # - evaluator_ref=Reference(id=evaluator_id), + workflow_ref=workflow_ref, ) - if not evaluator or not evaluator.id: - return SimpleEvaluatorResponse() + if workflow is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator not found. Please check the ID and try again.", + ) - evaluator = await self.evaluators_service.archive_evaluator( # type: ignore + workflow: Optional[Workflow] = await self.workflows_service.archive_workflow( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - evaluator_id=evaluator.id, + workflow_id=evaluator_id, ) - if not evaluator or not evaluator.id: - return SimpleEvaluatorResponse() + if workflow is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to archive simple evaluator. Please try again or contact support.", + ) - evaluator_variant = await self.evaluators_service.fetch_evaluator_variant( + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.fetch_workflow_variant( project_id=UUID(request.state.project_id), # - evaluator_ref=Reference(id=evaluator.id), + workflow_ref=workflow_ref, ) - if evaluator_variant is None: - return SimpleEvaluatorResponse() + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to fetch simple evaluator variant. Please try again or contact support.", + ) - evaluator_variant = await self.evaluators_service.archive_evaluator_variant( + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.archive_workflow_variant( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - evaluator_variant_id=evaluator_variant.id, # type: ignore + workflow_variant_id=workflow_variant.id, ) - if evaluator_variant is None: - return SimpleEvaluatorResponse() + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to archive simple evaluator. Please try again or contact support.", + ) simple_evaluator_flags = ( SimpleEvaluatorFlags( - **evaluator.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ), + **workflow.flags.model_dump(mode="json"), ) - if evaluator.flags + if workflow.flags else SimpleEvaluatorFlags() ) simple_evaluator = SimpleEvaluator( - id=evaluator.id, - slug=evaluator.slug, + id=workflow.id, + slug=workflow.slug, # - created_at=evaluator.created_at, - updated_at=evaluator.updated_at, - deleted_at=evaluator.deleted_at, - created_by_id=evaluator.created_by_id, - updated_by_id=evaluator.updated_by_id, - deleted_by_id=evaluator.deleted_by_id, + created_at=workflow.created_at, + updated_at=workflow.updated_at, + deleted_at=workflow.deleted_at, + created_by_id=workflow.created_by_id, + updated_by_id=workflow.updated_by_id, + deleted_by_id=workflow.deleted_by_id, # - name=evaluator.name, - description=evaluator.description, + name=workflow.name, + description=workflow.description, # flags=simple_evaluator_flags, - tags=evaluator.tags, - meta=evaluator.meta, + tags=workflow.tags, + meta=workflow.meta, ) simple_evaluator_response = SimpleEvaluatorResponse( @@ -1302,95 +722,107 @@ async def archive_simple_evaluator( # TODO: FIX ME return simple_evaluator_response @intercept_exceptions() - async def unarchive_simple_evaluator( # TODO: FIX ME + async def unarchive_simple_evaluator( self, *, request: Request, evaluator_id: UUID, ) -> SimpleEvaluatorResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.EDIT_EVALUATORS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - evaluator_ref = Reference( + workflow_ref = Reference( id=evaluator_id, ) - evaluator = await self.evaluators_service.fetch_evaluator( + workflow: Optional[Workflow] = await self.workflows_service.fetch_workflow( project_id=UUID(request.state.project_id), # - evaluator_ref=evaluator_ref, + workflow_ref=workflow_ref, ) - if evaluator is None or not evaluator.id: - return SimpleEvaluatorResponse() + if workflow is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple evaluator not found. Please check the ID and try again.", + ) - evaluator = await self.evaluators_service.unarchive_evaluator( # type: ignore + workflow: Optional[Workflow] = await self.workflows_service.unarchive_workflow( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - evaluator_id=evaluator.id, + workflow_id=evaluator_id, ) - if evaluator is None: - return SimpleEvaluatorResponse() + if workflow is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to unarchive simple evaluator. Please try again or contact support.", + ) - evaluator_variant = await self.evaluators_service.fetch_evaluator_variant( + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.fetch_workflow_variant( project_id=UUID(request.state.project_id), # - evaluator_ref=evaluator_ref, + workflow_ref=workflow_ref, ) - if evaluator_variant is None: - return SimpleEvaluatorResponse() + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to fetch simple evaluator. Please try again or contact support.", + ) - evaluator_variant = await self.evaluators_service.unarchive_evaluator_variant( + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.unarchive_workflow_variant( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - evaluator_variant_id=evaluator_variant.id, # type: ignore + workflow_variant_id=workflow_variant.id, ) - if evaluator_variant is None: - return SimpleEvaluatorResponse() + if workflow_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to unarchive simple evaluator. Please try again or contact support.", + ) simple_evaluator_flags = ( SimpleEvaluatorFlags( - **evaluator.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ), + **workflow.flags.model_dump(mode="json"), ) - if evaluator.flags + if workflow.flags else SimpleEvaluatorFlags() ) simple_evaluator = SimpleEvaluator( - id=evaluator.id, - slug=evaluator.slug, + id=workflow.id, + slug=workflow.slug, # - created_at=evaluator.created_at, - updated_at=evaluator.updated_at, - deleted_at=evaluator.deleted_at, - created_by_id=evaluator.created_by_id, - updated_by_id=evaluator.updated_by_id, - deleted_by_id=evaluator.deleted_by_id, + created_at=workflow.created_at, + updated_at=workflow.updated_at, + deleted_at=workflow.deleted_at, + created_by_id=workflow.created_by_id, + updated_by_id=workflow.updated_by_id, + deleted_by_id=workflow.deleted_by_id, # - name=evaluator.name, - description=evaluator.description, + name=workflow.name, + description=workflow.description, # flags=simple_evaluator_flags, - tags=evaluator.tags, - meta=evaluator.meta, + tags=workflow.tags, + meta=workflow.meta, ) simple_evaluator_response = SimpleEvaluatorResponse( - count=1 if simple_evaluator else 0, + count=1, evaluator=simple_evaluator, ) @@ -1400,11 +832,12 @@ async def unarchive_simple_evaluator( # TODO: FIX ME @suppress_exceptions(default=SimpleEvaluatorsResponse()) async def list_simple_evaluators( self, + *, request: Request, ) -> SimpleEvaluatorsResponse: simple_evaluator_query_request = SimpleEvaluatorQueryRequest( evaluator=SimpleEvaluatorQuery( - flags=SimpleEvaluatorQueryFlags( + flags=SimpleEvaluatorFlags( is_evaluator=True, ) ) @@ -1412,25 +845,24 @@ async def list_simple_evaluators( return await self.query_simple_evaluators( request=request, - # simple_evaluator_query_request=simple_evaluator_query_request, ) @intercept_exceptions() @suppress_exceptions(default=SimpleEvaluatorsResponse()) - async def query_simple_evaluators( # TODO: FIX ME + async def query_simple_evaluators( self, - request: Request, *, + request: Request, simple_evaluator_query_request: SimpleEvaluatorQueryRequest, ) -> SimpleEvaluatorsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATORS, # type: ignore + permission=Permission.VIEW_EVALUATORS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION simple_evaluator_flags = ( simple_evaluator_query_request.evaluator.flags @@ -1438,17 +870,17 @@ async def query_simple_evaluators( # TODO: FIX ME else None ) - flags = EvaluatorQueryFlags( + flags = WorkflowFlags( + is_evaluator=True, is_custom=( simple_evaluator_flags.is_custom if simple_evaluator_flags else None ), - is_evaluator=True, is_human=( simple_evaluator_flags.is_human if simple_evaluator_flags else None ), ) - evaluator_query = EvaluatorQuery( + _workflow_query = WorkflowQuery( flags=flags, tags=( simple_evaluator_query_request.evaluator.tags @@ -1463,85 +895,84 @@ async def query_simple_evaluators( # TODO: FIX ME # ) - evaluators = await self.evaluators_service.query_evaluators( + workflows: List[Workflow] = await self.workflows_service.query_workflows( project_id=UUID(request.state.project_id), # - evaluator_query=evaluator_query, + workflow_query=_workflow_query, # - evaluator_refs=simple_evaluator_query_request.evaluator_refs, + workflow_refs=simple_evaluator_query_request.evaluator_refs, # include_archived=simple_evaluator_query_request.include_archived, # windowing=simple_evaluator_query_request.windowing, ) + if workflows is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to query simple evaluators. Please try again or contact support.", + ) + simple_evaluators: List[SimpleEvaluator] = [] - for evaluator in evaluators: - evaluator_ref = Reference( - id=evaluator.id, + for workflow in workflows: + workflow_ref = Reference( + id=workflow.id, ) - evaluator_variant = await self.evaluators_service.fetch_evaluator_variant( + workflow_variant: Optional[ + WorkflowVariant + ] = await self.workflows_service.fetch_workflow_variant( project_id=UUID(request.state.project_id), # - evaluator_ref=evaluator_ref, + workflow_ref=workflow_ref, ) - if evaluator_variant is None: + if workflow_variant is None: continue - evaluator_variant_ref = Reference( - id=evaluator_variant.id, + workflow_variant_ref = Reference( + id=workflow_variant.id, ) - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( + workflow_revision: Optional[ + WorkflowRevision + ] = await self.workflows_service.fetch_workflow_revision( project_id=UUID(request.state.project_id), # - evaluator_ref=evaluator_ref, - evaluator_variant_ref=evaluator_variant_ref, + workflow_variant_ref=workflow_variant_ref, ) - if evaluator_revision is None: + if workflow_revision is None: continue simple_evaluator_flags = ( SimpleEvaluatorFlags( - **evaluator.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ), + **workflow.flags.model_dump(mode="json"), ) - if evaluator.flags + if workflow.flags else SimpleEvaluatorFlags() ) simple_evaluator = SimpleEvaluator( - id=evaluator.id, - slug=evaluator.slug, + id=workflow.id, + slug=workflow.slug, # - created_at=evaluator.created_at, - updated_at=evaluator.updated_at, - deleted_at=evaluator.deleted_at, - created_by_id=evaluator.created_by_id, - updated_by_id=evaluator.updated_by_id, - deleted_by_id=evaluator.deleted_by_id, + created_at=workflow.created_at, + updated_at=workflow.updated_at, + deleted_at=workflow.deleted_at, + created_by_id=workflow.created_by_id, + updated_by_id=workflow.updated_by_id, + deleted_by_id=workflow.deleted_by_id, # - name=evaluator.name, - description=evaluator.description, + name=workflow.name, + description=workflow.description, # flags=simple_evaluator_flags, - tags=evaluator.tags, - meta=evaluator.meta, + tags=workflow.tags, + meta=workflow.meta, # - data=SimpleEvaluatorData( - **( - evaluator_revision.data.model_dump(mode="json") - if evaluator_revision.data - else {} - ), - ), + data=workflow_revision.data, ) simple_evaluators.append(simple_evaluator) @@ -1552,31 +983,3 @@ async def query_simple_evaluators( # TODO: FIX ME ) return simple_evaluators_response - - @intercept_exceptions() - async def transfer_simple_evaluator( - self, - *, - request: Request, - evaluator_id: UUID, - ) -> SimpleEvaluatorResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_evaluator = await self.simple_evaluators_service.transfer( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - evaluator_id=evaluator_id, - ) - - simple_evaluator_response = SimpleEvaluatorResponse( - count=1 if simple_evaluator else 0, - evaluator=simple_evaluator, - ) - - return simple_evaluator_response diff --git a/api/oss/src/apis/fastapi/evaluators/utils.py b/api/oss/src/apis/fastapi/evaluators/utils.py index 04b46dc7e8..e69de29bb2 100644 --- a/api/oss/src/apis/fastapi/evaluators/utils.py +++ b/api/oss/src/apis/fastapi/evaluators/utils.py @@ -1,632 +0,0 @@ -from typing import Optional, Literal, List -from uuid import UUID -from datetime import datetime - -from fastapi import Query - -from oss.src.utils.logging import get_module_logger - -from oss.src.core.shared.dtos import ( - Windowing, - Reference, -) -from oss.src.core.evaluators.dtos import ( - EvaluatorFlags, - EvaluatorQueryFlags, - # - EvaluatorQuery, - EvaluatorVariantQuery, - EvaluatorRevisionQuery, -) - -from oss.src.apis.fastapi.shared.utils import ( - parse_metadata, -) -from oss.src.apis.fastapi.evaluators.models import ( - EvaluatorQueryRequest, - EvaluatorVariantQueryRequest, - EvaluatorRevisionQueryRequest, - EvaluatorRevisionRetrieveRequest, -) - - -log = get_module_logger(__name__) - - -def parse_evaluator_query_request_from_params( - evaluator_id: Optional[UUID] = Query(None), - evaluator_ids: Optional[List[UUID]] = Query(None), - evaluator_slug: Optional[str] = Query(None), - evaluator_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> EvaluatorQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = EvaluatorQueryFlags(**_flags) if _flags else None - - evaluator = ( - EvaluatorQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) - - evaluator_refs = ( - ( - [ - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - ] - if evaluator_id or evaluator_slug - else [] - ) - + ( - [ - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - for evaluator_id, evaluator_slug in zip( - evaluator_ids, - evaluator_slugs, - ) - ] - if evaluator_ids and evaluator_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_evaluator_query_request_from_body( - evaluator=evaluator, - # - evaluator_refs=evaluator_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - -def parse_evaluator_query_request_from_body( - evaluator: Optional[EvaluatorQuery] = None, - # - evaluator_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> EvaluatorQueryRequest: - evaluator_query_request = None - - try: - evaluator_query_request = EvaluatorQueryRequest( - evaluator=evaluator, - # - evaluator_refs=evaluator_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - except Exception as e: # pylint: disable=broad-except - evaluator_query_request = EvaluatorQueryRequest() - - return evaluator_query_request - - -def merge_evaluator_query_requests( - query_request_params: Optional[EvaluatorQueryRequest] = None, - query_request_body: Optional[EvaluatorQueryRequest] = None, -) -> EvaluatorQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body - - if query_request_params and query_request_body: - return EvaluatorQueryRequest( - evaluator=query_request_body.evaluator or query_request_params.evaluator, - # - evaluator_refs=query_request_body.evaluator_refs - or query_request_params.evaluator_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return EvaluatorQueryRequest() - - -def parse_evaluator_variant_query_request_from_params( - evaluator_id: Optional[UUID] = Query(None), - evaluator_ids: Optional[List[UUID]] = Query(None), - evaluator_slug: Optional[str] = Query(None), - evaluator_slugs: Optional[List[str]] = Query(None), - # - evaluator_variant_id: Optional[UUID] = Query(None), - evaluator_variant_ids: Optional[List[UUID]] = Query(None), - evaluator_variant_slug: Optional[str] = Query(None), - evaluator_variant_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> EvaluatorVariantQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = EvaluatorQueryFlags(**_flags) if _flags else None - - evaluator_variant = ( - EvaluatorVariantQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) - - evaluator_refs = ( - ( - [ - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - ] - if evaluator_id or evaluator_slug - else [] - ) - + ( - [ - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - for evaluator_id, evaluator_slug in zip( - evaluator_ids, - evaluator_slugs, - ) - ] - if evaluator_ids and evaluator_slugs - else [] - ) - ) or None - - evaluator_variant_refs = ( - ( - [ - Reference( - id=evaluator_variant_id, - slug=evaluator_variant_slug, - ) - ] - if evaluator_variant_id or evaluator_variant_slug - else [] - ) - + ( - [ - Reference( - id=evaluator_variant_id, - slug=evaluator_variant_slug, - ) - for evaluator_variant_id, evaluator_variant_slug in zip( - evaluator_variant_ids, - evaluator_variant_slugs, - ) - ] - if evaluator_variant_ids and evaluator_variant_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_evaluator_variant_query_request_from_body( - evaluator_variant=evaluator_variant, - # - evaluator_refs=evaluator_refs or None, - evaluator_variant_refs=evaluator_variant_refs or None, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - -def parse_evaluator_variant_query_request_from_body( - evaluator_variant: Optional[EvaluatorVariantQuery] = None, - # - evaluator_refs: Optional[List[Reference]] = None, - evaluator_variant_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> EvaluatorVariantQueryRequest: - evaluator_variant_query_request = None - - try: - evaluator_variant_query_request = EvaluatorVariantQueryRequest( - evaluator_variant=evaluator_variant, - # - evaluator_refs=evaluator_refs, - evaluator_variant_refs=evaluator_variant_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - except Exception as e: # pylint: disable=broad-except - evaluator_variant_query_request = EvaluatorVariantQueryRequest() - - return evaluator_variant_query_request - - -def merge_evaluator_variant_query_requests( - query_request_params: Optional[EvaluatorVariantQueryRequest] = None, - query_request_body: Optional[EvaluatorVariantQueryRequest] = None, -) -> EvaluatorVariantQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body - - if query_request_params and query_request_body: - return EvaluatorVariantQueryRequest( - evaluator_variant=query_request_body.evaluator_variant - or query_request_params.evaluator_variant, - # - evaluator_refs=query_request_body.evaluator_refs - or query_request_params.evaluator_refs, - evaluator_variant_refs=query_request_body.evaluator_variant_refs - or query_request_params.evaluator_variant_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return EvaluatorVariantQueryRequest() - - -def parse_evaluator_revision_query_request_from_params( - evaluator_id: Optional[UUID] = Query(None), - evaluator_ids: Optional[List[UUID]] = Query(None), - evaluator_slug: Optional[str] = Query(None), - evaluator_slugs: Optional[List[str]] = Query(None), - # - evaluator_variant_id: Optional[UUID] = Query(None), - evaluator_variant_ids: Optional[List[UUID]] = Query(None), - evaluator_variant_slug: Optional[str] = Query(None), - evaluator_variant_slugs: Optional[List[str]] = Query(None), - # - evaluator_revision_id: Optional[UUID] = Query(None), - evaluator_revision_ids: Optional[List[UUID]] = Query(None), - evaluator_revision_slug: Optional[str] = Query(None), - evaluator_revision_slugs: Optional[List[str]] = Query(None), - evaluator_revision_version: Optional[str] = Query(None), - evaluator_revision_versions: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> EvaluatorRevisionQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = EvaluatorQueryFlags(**_flags) if _flags else None - - evaluator_revision = ( - EvaluatorRevisionQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) - - evaluator_refs = ( - [ - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - ] - if evaluator_id or evaluator_slug - else [] - ) + ( - [ - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - for evaluator_id, evaluator_slug in zip( - evaluator_ids, - evaluator_slugs, - ) - ] - if evaluator_ids and evaluator_slugs - else [] - ) - - evaluator_variant_refs = ( - [ - Reference( - id=evaluator_variant_id, - slug=evaluator_variant_slug, - ) - ] - if evaluator_variant_id or evaluator_variant_slug - else [] - ) + ( - [ - Reference( - id=evaluator_variant_id, - slug=evaluator_variant_slug, - ) - for evaluator_variant_id, evaluator_variant_slug in zip( - evaluator_variant_ids, - evaluator_variant_slugs, - ) - ] - if evaluator_variant_ids and evaluator_variant_slugs - else [] - ) - - evaluator_revision_refs = ( - [ - Reference( - id=evaluator_revision_id, - slug=evaluator_revision_slug, - version=evaluator_revision_version, - ) - ] - if evaluator_revision_id - or evaluator_revision_slug - or evaluator_revision_version - else [] - ) + ( - [ - Reference( - id=evaluator_revision_id, - slug=evaluator_revision_slug, - version=evaluator_revision_version, - ) - for evaluator_revision_id, evaluator_revision_slug, evaluator_revision_version in zip( - evaluator_revision_ids, - evaluator_revision_slugs, - evaluator_revision_versions, - ) - ] - if evaluator_revision_ids - and evaluator_revision_slugs - and evaluator_revision_versions - else [] - ) - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_evaluator_revision_query_request_from_body( - evaluator_revision=evaluator_revision, - # - evaluator_refs=evaluator_refs, - evaluator_variant_refs=evaluator_variant_refs, - evaluator_revision_refs=evaluator_revision_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - -def parse_evaluator_revision_query_request_from_body( - evaluator_revision: Optional[EvaluatorRevisionQuery] = None, - # - evaluator_refs: Optional[List[Reference]] = None, - evaluator_variant_refs: Optional[List[Reference]] = None, - evaluator_revision_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> EvaluatorRevisionQueryRequest: - evaluator_revision_query_request = None - - try: - evaluator_revision_query_request = EvaluatorRevisionQueryRequest( - evaluator_revision=evaluator_revision, - # - evaluator_refs=evaluator_refs, - evaluator_variant_refs=evaluator_variant_refs, - evaluator_revision_refs=evaluator_revision_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - except Exception as e: # pylint: disable=broad-except - log.warn(e) - - evaluator_revision_query_request = EvaluatorRevisionQueryRequest() - - return evaluator_revision_query_request - - -def merge_evaluator_revision_query_requests( - query_request_params: Optional[EvaluatorRevisionQueryRequest] = None, - query_request_body: Optional[EvaluatorRevisionQueryRequest] = None, -) -> EvaluatorRevisionQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body - - if query_request_params and query_request_body: - return EvaluatorRevisionQueryRequest( - evaluator_revision=query_request_body.evaluator_revision - or query_request_params.evaluator_revision, - # - evaluator_refs=query_request_body.evaluator_refs - or query_request_params.evaluator_refs, - evaluator_variant_refs=query_request_body.evaluator_variant_refs - or query_request_params.evaluator_variant_refs, - evaluator_revision_refs=query_request_body.evaluator_revision_refs - or query_request_params.evaluator_revision_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return EvaluatorRevisionQueryRequest() - - -def parse_evaluator_revision_retrieve_request_from_params( - evaluator_id: Optional[UUID] = Query(None), - evaluator_slug: Optional[str] = Query(None), - # - evaluator_variant_id: Optional[UUID] = Query(None), - evaluator_variant_slug: Optional[str] = Query(None), - # - evaluator_revision_id: Optional[UUID] = Query(None), - evaluator_revision_slug: Optional[str] = Query(None), - evaluator_revision_version: Optional[str] = Query(None), -): - evaluator_ref = ( - Reference( - id=evaluator_id, - slug=evaluator_slug, - ) - if evaluator_id or evaluator_slug - else None - ) - - evaluator_variant_ref = ( - Reference( - id=evaluator_variant_id, - slug=evaluator_variant_slug, - ) - if evaluator_variant_id or evaluator_variant_slug - else None - ) - - evaluator_revision_ref = ( - Reference( - id=evaluator_revision_id, - slug=evaluator_revision_slug, - version=evaluator_revision_version, - ) - if evaluator_revision_id - or evaluator_revision_slug - or evaluator_revision_version - else None - ) - - return parse_evaluator_revision_retrieve_request_from_body( - evaluator_ref=evaluator_ref, - evaluator_variant_ref=evaluator_variant_ref, - evaluator_revision_ref=evaluator_revision_ref, - ) - - -def parse_evaluator_revision_retrieve_request_from_body( - evaluator_ref: Optional[Reference] = None, - evaluator_variant_ref: Optional[Reference] = None, - evaluator_revision_ref: Optional[Reference] = None, -) -> EvaluatorRevisionRetrieveRequest: - return EvaluatorRevisionRetrieveRequest( - evaluator_ref=evaluator_ref, - evaluator_variant_ref=evaluator_variant_ref, - evaluator_revision_ref=evaluator_revision_ref, - ) diff --git a/api/oss/src/apis/fastapi/invocations/__init__.py b/api/oss/src/apis/fastapi/invocations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/apis/fastapi/invocations/models.py b/api/oss/src/apis/fastapi/invocations/models.py deleted file mode 100644 index 8554ba88ee..0000000000 --- a/api/oss/src/apis/fastapi/invocations/models.py +++ /dev/null @@ -1,52 +0,0 @@ -from typing import Optional, List - -from pydantic import BaseModel - -from oss.src.core.shared.dtos import ( - Link, - Windowing, -) -from oss.src.core.invocations.types import ( - Invocation, - InvocationCreate, - InvocationEdit, - InvocationQuery, -) - -# INVOCATIONS ------------------------------------------------------------------ - - -class InvocationCreateRequest(BaseModel): - invocation: InvocationCreate - - -class InvocationEditRequest(BaseModel): - invocation: InvocationEdit - - -class InvocationQueryRequest(BaseModel): - invocation: Optional[InvocationQuery] = None - # - invocation_links: Optional[List[Link]] = None - # - windowing: Optional[Windowing] = None - - -class InvocationResponse(BaseModel): - count: int = 0 - invocation: Optional[Invocation] = None - - -class InvocationsResponse(BaseModel): - count: int = 0 - invocations: List[Invocation] = [] - - -class InvocationLinkResponse(BaseModel): - count: int = 0 - invocation_link: Optional[Link] = None - - -class InvocationLinksResponse(BaseModel): - count: int = 0 - invocation_links: List[Link] = [] diff --git a/api/oss/src/apis/fastapi/invocations/router.py b/api/oss/src/apis/fastapi/invocations/router.py deleted file mode 100644 index b4ff285f40..0000000000 --- a/api/oss/src/apis/fastapi/invocations/router.py +++ /dev/null @@ -1,294 +0,0 @@ -from typing import Optional, Union -from uuid import UUID - -from fastapi import APIRouter, Request, status, Response - -from oss.src.utils.common import is_ee -from oss.src.utils.logging import get_module_logger -from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions -from oss.src.utils.caching import get_cache, set_cache, invalidate_cache - -from oss.src.core.invocations.service import ( - InvocationsService, -) -from oss.src.core.shared.dtos import ( - Link, -) - -from oss.src.apis.fastapi.invocations.models import ( - InvocationCreateRequest, - InvocationEditRequest, - InvocationResponse, - InvocationsResponse, - InvocationQueryRequest, - InvocationLinkResponse, -) - -if is_ee(): - from ee.src.models.shared_models import Permission - from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION - - -log = get_module_logger(__name__) - - -class InvocationsRouter: - def __init__( - self, - *, - invocations_service: InvocationsService, - ): - self.invocations_service = invocations_service - - self.router = APIRouter() - - # INVOCATIONS ---------------------------------------------------------- - - # POST /api/invocations/ - self.router.add_api_route( - "/", - self.create_invocation, - methods=["POST"], - operation_id="create_invocation", - status_code=status.HTTP_200_OK, - response_model=InvocationResponse, - response_model_exclude_none=True, - ) - - # GET /api/invocations/{trace_id} - self.router.add_api_route( - "/{trace_id}", - self.fetch_invocation, - methods=["GET"], - operation_id="fetch_invocation_by_trace_id", - status_code=status.HTTP_200_OK, - response_model=InvocationResponse, - response_model_exclude_none=True, - ) - - # GET /api/invocations/{trace_id}/{span_id} - self.router.add_api_route( - "/{trace_id}/{span_id}", - self.fetch_invocation, - methods=["GET"], - operation_id="fetch_invocation", - status_code=status.HTTP_200_OK, - response_model=InvocationResponse, - response_model_exclude_none=True, - ) - - # PUT /api/invocations/{trace_id} - self.router.add_api_route( - "/{trace_id}", - self.edit_invocation, - methods=["PATCH"], - operation_id="edit_invocation_by_trace_id", - status_code=status.HTTP_200_OK, - response_model=InvocationResponse, - response_model_exclude_none=True, - ) - - # PUT /api/invocations/{trace_id}/{span_id} - self.router.add_api_route( - "/{trace_id}/{span_id}", - self.edit_invocation, - methods=["PATCH"], - operation_id="edit_invocation", - status_code=status.HTTP_200_OK, - response_model=InvocationResponse, - response_model_exclude_none=True, - ) - - # DELETE /api/invocations/{trace_id} - self.router.add_api_route( - "/{trace_id}", - self.delete_invocation, - methods=["DELETE"], - operation_id="delete_invocation_by_trace_id", - status_code=status.HTTP_200_OK, - response_model=InvocationLinkResponse, - response_model_exclude_none=True, - ) - - # DELETE /api/invocations/{trace_id}/{span_id} - self.router.add_api_route( - "/{trace_id}/{span_id}", - self.delete_invocation, - methods=["DELETE"], - operation_id="delete_invocation", - status_code=status.HTTP_200_OK, - response_model=InvocationLinkResponse, - response_model_exclude_none=True, - ) - - # POST /api/invocations/query - self.router.add_api_route( - "/query", - self.query_invocations, - methods=["POST"], - operation_id="query_invocations", - status_code=status.HTTP_200_OK, - response_model=InvocationsResponse, - response_model_exclude_none=True, - ) - - # INVOCATIONS -------------------------------------------------------------- - - @intercept_exceptions() - async def create_invocation( - self, - request: Request, - *, - invocation_create_request: InvocationCreateRequest, - ) -> InvocationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_INVOCATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - invocation = await self.invocations_service.create( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - invocation_create=invocation_create_request.invocation, - ) - - invocation_response = InvocationResponse( - count=1 if invocation else 0, - invocation=invocation, - ) - - return invocation_response - - @intercept_exceptions() - @suppress_exceptions(default=InvocationResponse()) - async def fetch_invocation( - self, - request: Request, - *, - trace_id: str, - span_id: Optional[str] = None, - ) -> Union[Response, InvocationResponse]: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_INVOCATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - invocation = await self.invocations_service.fetch( - project_id=UUID(request.state.project_id), - # - trace_id=trace_id, - span_id=span_id, - ) - - invocation_response = InvocationResponse( - count=1 if invocation else 0, - invocation=invocation, - ) - - return invocation_response - - @intercept_exceptions() - async def edit_invocation( - self, - request: Request, - *, - trace_id: str, - span_id: Optional[str] = None, - # - invocation_edit_request: InvocationEditRequest, - ) -> InvocationResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_INVOCATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - invocation = await self.invocations_service.edit( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - trace_id=trace_id, - span_id=span_id, - # - invocation_edit=invocation_edit_request.invocation, - ) - - invocation_response = InvocationResponse( - count=1 if invocation else 0, - invocation=invocation, - ) - - return invocation_response - - @intercept_exceptions() - async def delete_invocation( - self, - request: Request, - *, - trace_id: str, - span_id: Optional[str] = None, - ) -> InvocationLinkResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_INVOCATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - invocation_link: Optional[Link] = await self.invocations_service.delete( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - trace_id=trace_id, - span_id=span_id, - ) - - invocation_link_response = InvocationLinkResponse( - count=1 if invocation_link else 0, - invocation_link=invocation_link, - ) - - return invocation_link_response - - @intercept_exceptions() - @suppress_exceptions(default=InvocationsResponse()) - async def query_invocations( - self, - request: Request, - *, - invocation_query_request: InvocationQueryRequest, - ) -> InvocationsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_INVOCATIONS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - invocations = await self.invocations_service.query( - project_id=UUID(request.state.project_id), - # - invocation_query=invocation_query_request.invocation, - # - invocation_links=invocation_query_request.invocation_links, - # - windowing=invocation_query_request.windowing, - ) - - invocations_response = InvocationsResponse( - count=len(invocations), - invocations=invocations, - ) - - return invocations_response diff --git a/api/oss/src/apis/fastapi/applications/__init__.py b/api/oss/src/apis/fastapi/middleware/__init__.py similarity index 100% rename from api/oss/src/apis/fastapi/applications/__init__.py rename to api/oss/src/apis/fastapi/middleware/__init__.py diff --git a/api/oss/src/apis/fastapi/middleware/request.py b/api/oss/src/apis/fastapi/middleware/request.py new file mode 100644 index 0000000000..ace4ac3030 --- /dev/null +++ b/api/oss/src/apis/fastapi/middleware/request.py @@ -0,0 +1,17 @@ +import uuid + +from fastapi import Request + +from oss.src.utils.context import request_id_ctx + + +async def request_id_middleware(request: Request, call_next): + request_id = request.headers.get("X-Request-ID") or str(uuid.uuid4()) + + request_id_ctx.set(request_id) + + response = await call_next(request) + + response.headers["X-Request-ID"] = request_id + + return response diff --git a/api/oss/src/apis/fastapi/observability/extractors/adapters/default_agenta_adapter.py b/api/oss/src/apis/fastapi/observability/extractors/adapters/default_agenta_adapter.py index f9664d80ba..bb3c5e3e7a 100644 --- a/api/oss/src/apis/fastapi/observability/extractors/adapters/default_agenta_adapter.py +++ b/api/oss/src/apis/fastapi/observability/extractors/adapters/default_agenta_adapter.py @@ -68,14 +68,3 @@ def process(self, attributes: CanonicalAttributes, features: SpanFeatures) -> No if "attributes" not in features.exception: features.exception["attributes"] = {} features.exception["attributes"][attr_key] = decoded_attr_val - - try: - features.links = attributes.links - except Exception as e: - log.error( - "Failed to set links on features. Links from attributes: %s. Error: %s", - attributes.links, - str(e), - exc_info=True, - ) - pass diff --git a/api/oss/src/apis/fastapi/observability/extractors/adapters/openinference_adapter.py b/api/oss/src/apis/fastapi/observability/extractors/adapters/openinference_adapter.py index 71fc43f644..5afdcd61f2 100644 --- a/api/oss/src/apis/fastapi/observability/extractors/adapters/openinference_adapter.py +++ b/api/oss/src/apis/fastapi/observability/extractors/adapters/openinference_adapter.py @@ -136,11 +136,11 @@ def process(self, bag: CanonicalAttributes, features: SpanFeatures) -> None: transformed_attributes["ag.type.node"] = mapped_kind has_data = True else: - log.warn( + log.warning( f"OpenInferenceAdapter: Unknown or unmapped openinference.span.kind '{value}'" ) else: - log.warn( + log.warning( f"OpenInferenceAdapter: Expected string for openinference.span.kind, got {type(value)}" ) continue # Move to next attribute diff --git a/api/oss/src/apis/fastapi/observability/extractors/normalizer.py b/api/oss/src/apis/fastapi/observability/extractors/normalizer.py index 02348d2948..5201592c3d 100644 --- a/api/oss/src/apis/fastapi/observability/extractors/normalizer.py +++ b/api/oss/src/apis/fastapi/observability/extractors/normalizer.py @@ -48,7 +48,7 @@ def normalize(self, otel_span_dto: OTelSpanDTO) -> CanonicalAttributes: except ValueError: # Fallback or error handling for non-ISO timestamps if necessary # For now, let's assume UTC now as a fallback, or log an error - # log.warn(f"Could not parse event timestamp: {event_dto.timestamp}") + # log.warning(f"Could not parse event timestamp: {event_dto.timestamp}") dt_timestamp = datetime.now(timezone.utc) events_data.append( @@ -94,8 +94,8 @@ def normalize(self, otel_span_dto: OTelSpanDTO) -> CanonicalAttributes: ), # Ensure default status_message=otel_span_dto.status_message, span_attributes=copy(otel_span_dto.attributes), - events=copy(events_data), - links=copy(links_data), + events=events_data, + links=links_data, ) return attributes diff --git a/api/oss/src/apis/fastapi/observability/extractors/span_data_builders.py b/api/oss/src/apis/fastapi/observability/extractors/span_data_builders.py index 86e5d6c1aa..95f55dcc6a 100644 --- a/api/oss/src/apis/fastapi/observability/extractors/span_data_builders.py +++ b/api/oss/src/apis/fastapi/observability/extractors/span_data_builders.py @@ -163,8 +163,7 @@ def build(self, otel_span_dto: OTelSpanDTO, features: SpanFeatures) -> SpanDTO: refs = features.refs - # links = features.links - links = [] + links = features.links otel = OTelExtraDTO( kind=(otel_span_dto.kind.value if otel_span_dto.kind else None), @@ -269,7 +268,7 @@ def build( # ---------------------------------------------------------------------- # ATTRIBUTES ----------------------------------------------------------- - attributes = dict(otel_span_dto.attributes or {}) + attributes = dict() attributes.update(**{f"ag.data.{k}": v for k, v in features.data.items()}) @@ -318,8 +317,8 @@ def build( try: links.append( OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, + trace_id=link.context.trace_id, + span_id=link.context.span_id, attributes=link.attributes, ) ) diff --git a/api/oss/src/apis/fastapi/observability/extractors/span_processor.py b/api/oss/src/apis/fastapi/observability/extractors/span_processor.py index a17fd7baa6..7d1e578c21 100644 --- a/api/oss/src/apis/fastapi/observability/extractors/span_processor.py +++ b/api/oss/src/apis/fastapi/observability/extractors/span_processor.py @@ -33,7 +33,7 @@ def __init__(self, builders: List[SpanDataBuilder]): self.normalizer = Normalizer() self.adapter_registry = AdapterRegistry() if not builders: - log.warn( + log.warning( "SpanProcessor initialized with no builders. Process method will return an empty dict." ) self.builders = builders @@ -86,7 +86,7 @@ def process( ) if not results and self.builders: - log.warn( + log.warning( "All builders failed or returned no data for span_id %s (trace_id %s). OTelSpan: %s", otel_span_dto.context.span_id[2:] if otel_span_dto.context else "N/A", otel_span_dto.context.trace_id[2:] if otel_span_dto.context else "N/A", diff --git a/api/oss/src/apis/fastapi/observability/models.py b/api/oss/src/apis/fastapi/observability/models.py index 1620585aed..c50204d19a 100644 --- a/api/oss/src/apis/fastapi/observability/models.py +++ b/api/oss/src/apis/fastapi/observability/models.py @@ -3,6 +3,8 @@ from pydantic import BaseModel, ConfigDict +from oss.src.apis.fastapi.shared.models import VersionedModel + from oss.src.core.observability.dtos import ( OTelSpanDTO, SpanDTO, @@ -12,11 +14,11 @@ ) -class CollectStatusResponse(BaseModel): +class CollectStatusResponse(VersionedModel): status: str -class OTelTracingResponse(BaseModel): +class OTelTracingResponse(VersionedModel): count: Optional[int] = None spans: List[OTelSpanDTO] @@ -37,11 +39,6 @@ class AgentaTreeDTO(BaseModel): nodes: List[AgentaNodeDTO] -class AgentaVersionedTreeDTO(BaseModel): - version: str - nodes: List[AgentaNodeDTO] - - class AgentaTreesDTO(BaseModel): trees: Optional[List[AgentaTreeDTO]] = [] @@ -56,15 +53,15 @@ class AgentaRootsDTO(BaseModel): roots: Optional[List[AgentaRootDTO]] = [] -class AgentaNodesResponse(AgentaNodesDTO): +class AgentaNodesResponse(VersionedModel, AgentaNodesDTO): count: Optional[int] = None -class AgentaTreesResponse(AgentaTreesDTO): +class AgentaTreesResponse(VersionedModel, AgentaTreesDTO): count: Optional[int] = None -class AgentaRootsResponse(AgentaRootsDTO): +class AgentaRootsResponse(VersionedModel, AgentaRootsDTO): count: Optional[int] = None @@ -91,6 +88,6 @@ class LegacyAnalyticsResponse(LegacySummary): data: List[LegacyDataPoint] -class OldAnalyticsResponse(BaseModel): +class AnalyticsResponse(VersionedModel): count: Optional[int] = None buckets: List[BucketDTO] diff --git a/api/oss/src/apis/fastapi/observability/opentelemetry/otlp.py b/api/oss/src/apis/fastapi/observability/opentelemetry/otlp.py index f7ef6cd6a4..80fa5a4343 100644 --- a/api/oss/src/apis/fastapi/observability/opentelemetry/otlp.py +++ b/api/oss/src/apis/fastapi/observability/opentelemetry/otlp.py @@ -85,7 +85,7 @@ def _decode_value(any_value): elif which is None: return None else: - log.warn(f"Unknown value type at _decode_value: {which}") + log.warning(f"Unknown value type at _decode_value: {which}") return str(any_value) @@ -135,12 +135,6 @@ def parse_otlp_stream(otlp_stream: bytes) -> List[OTelSpanDTO]: s_span_id = "0x" + span.span_id.hex() s_context = OTelContextDTO(trace_id=s_trace_id, span_id=s_span_id) - # log.debug( - # "[SPAN] [PARSE] ", - # trace_id=s_trace_id[2:], - # span_id=s_span_id[2:], - # ) - # SPAN PARENT CONTEXT s_parent_id = span.parent_span_id.hex() s_parent_id = "0x" + s_parent_id if s_parent_id else None diff --git a/api/oss/src/apis/fastapi/observability/router.py b/api/oss/src/apis/fastapi/observability/router.py index 2c96b9a000..efcbe7312d 100644 --- a/api/oss/src/apis/fastapi/observability/router.py +++ b/api/oss/src/apis/fastapi/observability/router.py @@ -32,7 +32,7 @@ parse_otlp_stream, ) from oss.src.apis.fastapi.observability.utils.processing import ( - parse_query_from_params_request, + parse_query_request, parse_analytics_dto, parse_from_otel_span_dto, parse_to_otel_span_dto, @@ -50,7 +50,7 @@ AgentaTreeDTO, AgentaRootDTO, LegacyAnalyticsResponse, - OldAnalyticsResponse, + AnalyticsResponse, ) if is_ee(): @@ -86,6 +86,8 @@ class ObservabilityRouter: + VERSION = "1.0.0" + def __init__( self, observability_service: ObservabilityService, @@ -159,7 +161,7 @@ def __init__( status_code=status.HTTP_200_OK, response_model=Union[ LegacyAnalyticsResponse, - OldAnalyticsResponse, + AnalyticsResponse, ], response_model_exclude_none=True, ) @@ -200,7 +202,7 @@ async def otlp_status(self): Status of OTLP endpoint. """ - return CollectStatusResponse(status="ready") + return CollectStatusResponse(version=self.VERSION, status="ready") @intercept_exceptions() async def otlp_receiver( @@ -218,9 +220,9 @@ async def otlp_receiver( # ---------------------------------------------------------------- # except Exception as e: log.error( - "Failed to process OTLP stream from project %s with error:", + "Failed to process OTLP stream from project %s with error %s", request.state.project_id, - exc_info=True, + str(e), ) err_status = ProtoStatus( message="Invalid request body: not a valid OTLP stream." @@ -254,9 +256,9 @@ async def otlp_receiver( # ---------------------------------------------------------------- # except Exception as e: log.error( - "Failed to parse OTLP stream from project %s with error:", + "Failed to parse OTLP stream from project %s with error %s", request.state.project_id, - exc_info=True, + str(e), ) log.error( "OTLP stream: %s", @@ -294,14 +296,9 @@ async def otlp_receiver( key=cache_key, value=flag_create_spans_from_nodes, ) - # -------------------------------------------------------------------- # - # for otel_span in otel_spans: - # log.debug( - # "Receiving trace... ", - # project_id=request.state.project_id, - # trace_id=str(UUID(otel_span.context.trace_id[2:])), - # ) + # log.debug("Creating new spans from nodes: %s", flag_create_spans_from_nodes) + # -------------------------------------------------------------------- # span_dtos = None try: @@ -314,23 +311,15 @@ async def otlp_receiver( for otel_span in otel_spans ] - span_dtos = [ - parsed_span.get("nodes") - for parsed_span in parsed_spans - if parsed_span.get("nodes") - ] - tracing_spans = [ - parsed_span.get("spans") - for parsed_span in parsed_spans - if parsed_span.get("spans") - ] + span_dtos = [parsed_span.get("nodes") for parsed_span in parsed_spans] + tracing_spans = [parsed_span.get("spans") for parsed_span in parsed_spans] # ---------------------------------------------------------------- # except Exception as e: log.error( - "Failed to parse spans from project %s with error:", + "Failed to parse spans from project %s with error %s", request.state.project_id, - exc_info=True, + str(e), ) for otel_span in otel_spans: log.error( @@ -375,9 +364,9 @@ async def otlp_receiver( # ---------------------------------------------------------------- # except Exception as e: log.error( - "Failed to ingest spans from project %s with error:", + "Failed to ingest spans from project %s with error %s", request.state.project_id, - exc_info=True, + str(e), ) for span_dto in span_dtos: log.error( @@ -403,9 +392,9 @@ async def otlp_receiver( # ---------------------------------------------------------------- # except Exception as e: log.warn( - "Failed to create spans from project %s with error:", + "Failed to create spans from project %s with error %s", request.state.project_id, - exc_info=True, + str(e), ) for span in tracing_spans: span: OTelFlatSpan @@ -437,7 +426,7 @@ async def otlp_receiver( async def query_traces( self, request: Request, - query_dto: QueryDTO = Depends(parse_query_from_params_request), + query_dto: QueryDTO = Depends(parse_query_request), format: Literal[ # pylint: disable=W0622 "opentelemetry", "agenta", @@ -468,6 +457,7 @@ async def query_traces( spans = [parse_to_otel_span_dto(span_dto) for span_dto in span_dtos] return OTelTracingResponse( + version=self.VERSION, count=count, spans=spans, ) @@ -494,6 +484,7 @@ async def query_traces( # focus = tree if query_dto.grouping.focus.value == "tree": return AgentaTreesResponse( + version=self.VERSION, count=count, trees=[ AgentaTreeDTO( @@ -521,6 +512,7 @@ async def query_traces( _nodes_by_root[nodes[0].root.id].append( AgentaTreeDTO( + version=self.VERSION, tree=TreeDTO( id=tree_id, type=_types_by_tree[tree_id], @@ -532,6 +524,7 @@ async def query_traces( ) return AgentaRootsResponse( + version=self.VERSION, count=count, roots=[ AgentaRootDTO( @@ -544,6 +537,7 @@ async def query_traces( # focus = node return AgentaNodesResponse( + version=self.VERSION, count=count, nodes=[AgentaNodeDTO(**span.model_dump()) for span in spans], ) @@ -576,7 +570,8 @@ async def query_analytics( **summary.model_dump(), ) - return OldAnalyticsResponse( + return AnalyticsResponse( + version=self.VERSION, count=count, buckets=bucket_dtos, ) @@ -663,4 +658,4 @@ async def delete_traces( node_ids=node_ids, ) - return CollectStatusResponse(status="deleted") + return CollectStatusResponse(version=self.VERSION, status="deleted") diff --git a/api/oss/src/apis/fastapi/observability/utils/marshalling.py b/api/oss/src/apis/fastapi/observability/utils/marshalling.py index 0e0bd7cc96..f29876d311 100644 --- a/api/oss/src/apis/fastapi/observability/utils/marshalling.py +++ b/api/oss/src/apis/fastapi/observability/utils/marshalling.py @@ -76,7 +76,7 @@ def unmarshall_attributes( marshalled: Dict[str, Any], ) -> Dict[str, Any]: """ - Unmarshalls a dictionary of marshalled attributes into a nested dictionary + Unmarshals a dictionary of marshalled attributes into a nested dictionary Example: marshalled = { diff --git a/api/oss/src/apis/fastapi/observability/utils/processing.py b/api/oss/src/apis/fastapi/observability/utils/processing.py index 54c019702e..75afc0d53c 100644 --- a/api/oss/src/apis/fastapi/observability/utils/processing.py +++ b/api/oss/src/apis/fastapi/observability/utils/processing.py @@ -77,12 +77,12 @@ def _parse_windowing( oldest: Optional[str] = None, newest: Optional[str] = None, - interval: Optional[int] = None, + window: Optional[int] = None, ) -> Optional[WindowingDTO]: _windowing = None if oldest or newest: - _windowing = WindowingDTO(oldest=oldest, newest=newest, interval=interval) + _windowing = WindowingDTO(oldest=oldest, newest=newest, window=window) return _windowing @@ -153,7 +153,7 @@ def _parse_pagination( return _pagination -def parse_query_from_params_request( +def parse_query_request( # GROUPING # - Option 2: Flat query parameters focus: Optional[str] = Query(None), @@ -187,14 +187,14 @@ def parse_analytics_dto( # - Option 2: Flat query parameters oldest: Optional[str] = Query(None), newest: Optional[str] = Query(None), - interval: Optional[int] = Query(None), + window: Optional[int] = Query(None), # FILTERING # - Option 1: Single query parameter as JSON filtering: Optional[str] = Query(None), ) -> AnalyticsDTO: return AnalyticsDTO( grouping=_parse_grouping(focus=focus), - windowing=_parse_windowing(oldest=oldest, newest=newest, interval=interval), + windowing=_parse_windowing(oldest=oldest, newest=newest, window=window), filtering=_parse_filtering(filtering=filtering), ) @@ -466,9 +466,9 @@ def parse_to_agenta_span_dto( def _parse_time_range( - interval_text: str, + window_text: str, ) -> Tuple[datetime, datetime, int]: - quantity, unit = interval_text.split("_") + quantity, unit = window_text.split("_") quantity = int(quantity) today = datetime.now() @@ -476,13 +476,13 @@ def _parse_time_range( if unit == "hours": oldest = newest - timedelta(hours=quantity) - interval = 60 # 1 hour - return newest, oldest, interval + window = 60 # 1 hour + return newest, oldest, window elif unit == "days": oldest = newest - timedelta(days=quantity) - interval = 1440 # 1 day - return newest, oldest, interval + window = 1440 # 1 day + return newest, oldest, window else: raise ValueError(f"Unknown time unit: {unit}") @@ -539,8 +539,8 @@ def parse_legacy_analytics_dto( windowing = None if timeRange: - newest, oldest, interval = _parse_time_range(timeRange) - windowing = WindowingDTO(newest=newest, oldest=oldest, interval=interval) + newest, oldest, window = _parse_time_range(timeRange) + windowing = WindowingDTO(newest=newest, oldest=oldest, window=window) grouping = GroupingDTO(focus="tree") diff --git a/api/oss/src/apis/fastapi/observability/utils/serialization.py b/api/oss/src/apis/fastapi/observability/utils/serialization.py index 5d697953da..b2f6cd4ce9 100644 --- a/api/oss/src/apis/fastapi/observability/utils/serialization.py +++ b/api/oss/src/apis/fastapi/observability/utils/serialization.py @@ -58,7 +58,7 @@ def decode_value( value = loads(encoded) return value try: - value = value + value = loads(value) except JSONDecodeError: pass return value diff --git a/api/oss/src/apis/fastapi/queries/__init__.py b/api/oss/src/apis/fastapi/queries/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/apis/fastapi/queries/models.py b/api/oss/src/apis/fastapi/queries/models.py deleted file mode 100644 index 710b3282d4..0000000000 --- a/api/oss/src/apis/fastapi/queries/models.py +++ /dev/null @@ -1,182 +0,0 @@ -from typing import Optional, List - -from pydantic import BaseModel - -from oss.src.core.shared.dtos import ( - Reference, - Windowing, -) -from oss.src.core.queries.dtos import ( - Query, - QueryCreate, - QueryEdit, - QueryQuery, - # - QueryVariant, - QueryVariantCreate, - QueryVariantEdit, - QueryVariantQuery, - # - QueryRevision, - QueryRevisionCreate, - QueryRevisionEdit, - QueryRevisionQuery, - QueryRevisionCommit, - QueryRevisionsLog, - # - SimpleQuery, - SimpleQueryCreate, - SimpleQueryEdit, - SimpleQueryQuery, -) - - -# QUERIES ---------------------------------------------------------------------- - - -class QueryCreateRequest(BaseModel): - query: QueryCreate - - -class QueryEditRequest(BaseModel): - query: QueryEdit - - -class QueryQueryRequest(BaseModel): - query: Optional[QueryQuery] = None - # - query_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class QueryResponse(BaseModel): - count: int = 0 - query: Optional[Query] = None - - -class QueriesResponse(BaseModel): - count: int = 0 - queries: List[Query] = [] - - -# QUERY VARIANTS --------------------------------------------------------------- - - -class QueryVariantCreateRequest(BaseModel): - query_variant: QueryVariantCreate - - -class QueryVariantEditRequest(BaseModel): - query_variant: QueryVariantEdit - - -class QueryVariantQueryRequest(BaseModel): - query_variant: Optional[QueryVariantQuery] = None - # - query_refs: Optional[List[Reference]] = None - query_variant_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class QueryVariantForkRequest(BaseModel): - source_query_variant_ref: Reference - target_query_ref: Reference - # - slug: Optional[str] = None - # - name: Optional[str] = None - description: Optional[str] = None - - -class QueryVariantResponse(BaseModel): - count: int = 0 - query_variant: Optional[QueryVariant] = None - - -class QueryVariantsResponse(BaseModel): - count: int = 0 - query_variants: List[QueryVariant] = [] - - -# QUERY REVISIONS -------------------------------------------------------------- - - -class QueryRevisionCreateRequest(BaseModel): - query_revision: QueryRevisionCreate - - -class QueryRevisionEditRequest(BaseModel): - query_revision: QueryRevisionEdit - - -class QueryRevisionQueryRequest(BaseModel): - query_revision: Optional[QueryRevisionQuery] = None - # - query_refs: Optional[List[Reference]] = None - query_variant_refs: Optional[List[Reference]] = None - query_revision_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class QueryRevisionCommitRequest(BaseModel): - query_revision_commit: QueryRevisionCommit - - -class QueryRevisionsLogRequest(BaseModel): - query_revisions: QueryRevisionsLog - - -class QueryRevisionRetrieveRequest(BaseModel): - query_ref: Optional[Reference] = None - query_variant_ref: Optional[Reference] = None - query_revision_ref: Optional[Reference] = None - - -class QueryRevisionResponse(BaseModel): - count: int = 0 - query_revision: Optional[QueryRevision] = None - - -class QueryRevisionsResponse(BaseModel): - count: int = 0 - query_revisions: List[QueryRevision] = [] - - -# SIMPLE QUERIES --------------------------------------------------------------- - - -class SimpleQueryCreateRequest(BaseModel): - query: SimpleQueryCreate - - -class SimpleQueryEditRequest(BaseModel): - query: SimpleQueryEdit - - -class SimpleQueryQueryRequest(BaseModel): - query: Optional[SimpleQueryQuery] = None - # - query_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = False - # - windowing: Optional[Windowing] = None - - -class SimpleQueryResponse(BaseModel): - count: int = 0 - query: Optional[SimpleQuery] = None - - -class SimpleQueriesResponse(BaseModel): - count: int = 0 - queries: List[SimpleQuery] = [] diff --git a/api/oss/src/apis/fastapi/queries/router.py b/api/oss/src/apis/fastapi/queries/router.py deleted file mode 100644 index 3d684f5081..0000000000 --- a/api/oss/src/apis/fastapi/queries/router.py +++ /dev/null @@ -1,989 +0,0 @@ -from typing import Optional -from uuid import UUID - -from fastapi import APIRouter, Request, status, Depends - -from oss.src.utils.common import is_ee -from oss.src.utils.logging import get_module_logger -from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions -from oss.src.utils.caching import get_cache, set_cache, invalidate_cache - -from oss.src.core.shared.dtos import ( - Reference, -) -from oss.src.core.queries.service import ( - QueriesService, - SimpleQueriesService, -) - -from oss.src.apis.fastapi.queries.models import ( - QueryCreateRequest, - QueryEditRequest, - QueryQueryRequest, - QueryResponse, - QueriesResponse, - # - QueryRevisionCreateRequest, - QueryRevisionEditRequest, - QueryRevisionQueryRequest, - QueryRevisionCommitRequest, - QueryRevisionRetrieveRequest, - QueryRevisionsLogRequest, - QueryRevisionResponse, - QueryRevisionsResponse, - # - SimpleQueryCreateRequest, - SimpleQueryEditRequest, - SimpleQueryQueryRequest, - SimpleQueryResponse, - SimpleQueriesResponse, -) - -from oss.src.apis.fastapi.queries.utils import ( - parse_query_query_request_from_params, - parse_query_query_request_from_body, - merge_query_query_requests, - parse_query_variant_query_request_from_params, - parse_query_variant_query_request_from_body, - merge_query_variant_query_requests, - parse_query_revision_query_request_from_params, - parse_query_revision_query_request_from_body, - merge_query_revision_query_requests, - parse_query_revision_retrieve_request_from_params, - parse_query_revision_retrieve_request_from_body, -) - -if is_ee(): - from ee.src.models.shared_models import Permission - from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION - - -log = get_module_logger(__name__) - - -class QueriesRouter: - def __init__(self, *, queries_service: QueriesService): - self.queries_service = queries_service - self.router = APIRouter() - - # QUERIES -------------------------------------------------------------- - - self.router.add_api_route( - "/", - self.create_query, - methods=["POST"], - operation_id="create_query", - status_code=status.HTTP_200_OK, - response_model=QueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}", - self.fetch_query, - methods=["GET"], - operation_id="fetch_query", - status_code=status.HTTP_200_OK, - response_model=QueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}", - self.edit_query, - methods=["PUT"], - operation_id="edit_query", - status_code=status.HTTP_200_OK, - response_model=QueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}/archive", - self.archive_query, - methods=["POST"], - operation_id="archive_query", - status_code=status.HTTP_200_OK, - response_model=QueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}/unarchive", - self.unarchive_query, - methods=["POST"], - operation_id="unarchive_query", - status_code=status.HTTP_200_OK, - response_model=QueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/query", - self.query_queries, - methods=["POST"], - operation_id="query_queries", - status_code=status.HTTP_200_OK, - response_model=QueriesResponse, - response_model_exclude_none=True, - ) - - # QUERY VARIANTS ------------------------------------------------------- - - # TODO: IMPLEMENT ME - - # QUERY REVISIONS ------------------------------------------------------ - - self.router.add_api_route( - "/revisions/retrieve", - self.retrieve_query_revision, - methods=["POST"], - operation_id="retrieve_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/", - self.create_query_revision, - methods=["POST"], - operation_id="create_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{query_revision_id}", - self.fetch_query_revision, - methods=["GET"], - operation_id="fetch_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{query_revision_id}", - self.edit_query_revision, - methods=["PUT"], - operation_id="edit_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{query_revision_id}/archive", - self.archive_query_revision, - methods=["POST"], - operation_id="archive_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{query_revision_id}/unarchive", - self.unarchive_query_revision, - methods=["POST"], - operation_id="unarchive_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/query", - self.query_query_revisions, - methods=["POST"], - operation_id="query_query_revisions", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionsResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/commit", - self.commit_query_revision, - methods=["POST"], - operation_id="commit_query_revision", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/log", - self.log_query_revisions, - methods=["POST"], - operation_id="log_query_revisions", - status_code=status.HTTP_200_OK, - response_model=QueryRevisionsResponse, - response_model_exclude_none=True, - ) - - # QUERIES ------------------------------------------------------------------ - - @intercept_exceptions() - async def create_query( - self, - request: Request, - *, - query_id: Optional[UUID] = None, - # - query_create_request: QueryCreateRequest, - ) -> QueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query = await self.queries_service.create_query( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - # - query_create=query_create_request.query, - ) - - query_response = QueryResponse( - count=1 if query else 0, - query=query, - ) - - return query_response - - @intercept_exceptions() - @suppress_exceptions(default=QueryResponse()) - async def fetch_query( - self, - request: Request, - *, - query_id: UUID, - ) -> QueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query = await self.queries_service.fetch_query( - project_id=UUID(request.state.project_id), - # - query_ref=Reference(id=query_id), - ) - - query_response = QueryResponse( - count=1 if query else 0, - query=query, - ) - - return query_response - - @intercept_exceptions() - async def edit_query( - self, - request: Request, - *, - query_edit_request: QueryEditRequest, - # - query_id: UUID, - ) -> QueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(query_id) != str(query_edit_request.query.id): - return QueryResponse() - - query = await self.queries_service.edit_query( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_edit=query_edit_request.query, - ) - - query_response = QueryResponse( - count=1 if query else 0, - query=query, - ) - - return query_response - - @intercept_exceptions() - async def archive_query( - self, - request: Request, - *, - query_id: UUID, - ) -> QueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query = await self.queries_service.archive_query( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - ) - - return QueryResponse( - count=1 if query else 0, - query=query, - ) - - @intercept_exceptions() - async def unarchive_query( - self, - request: Request, - *, - query_id: UUID, - ) -> QueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query = await self.queries_service.unarchive_query( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - ) - - query_response = QueryResponse( - count=1 if query else 0, - query=query, - ) - - return query_response - - @intercept_exceptions() - @suppress_exceptions(default=QueriesResponse()) - async def query_queries( - self, - request: Request, - *, - query_request_params: QueryQueryRequest = Depends( - parse_query_query_request_from_params - ), - ) -> QueriesResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - body_json = None - query_request_body = None - - try: - body_json = await request.json() - - if body_json: - query_request_body = parse_query_query_request_from_body(**body_json) - - except: # pylint: disable=bare-except - pass - - query_query_request = query_request_params or query_request_body - - queries = await self.queries_service.query_queries( - project_id=UUID(request.state.project_id), - # - query=query_query_request.query if query_query_request else None, - # - query_refs=query_query_request.query_refs if query_query_request else None, - # - include_archived=( - query_query_request.include_archived if query_query_request else None - ), - # - windowing=query_query_request.windowing if query_query_request else None, - ) - - queries_response = QueriesResponse( - count=len(queries), - queries=queries, - ) - - return queries_response - - # QUERY REVISIONS ---------------------------------------------------------- - - @intercept_exceptions() - async def create_query_revision( - self, - request: Request, - *, - query_revision_create_request: QueryRevisionCreateRequest, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revision = await self.queries_service.create_query_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_revision_create=query_revision_create_request.query_revision, - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - @intercept_exceptions() - @suppress_exceptions(default=QueryRevisionResponse()) - async def fetch_query_revision( - self, - request: Request, - *, - query_revision_id: UUID, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revision = await self.queries_service.fetch_query_revision( - project_id=UUID(request.state.project_id), - # - query_revision_ref=Reference(id=query_revision_id), - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - @intercept_exceptions() - async def edit_query_revision( - self, - request: Request, - *, - query_revision_edit_request: QueryRevisionEditRequest, - # - query_revision_id: UUID, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(query_revision_id) != str(query_revision_edit_request.query_revision.id): - return QueryRevisionResponse() - - query_revision = await self.queries_service.edit_query_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_revision_edit=query_revision_edit_request.query_revision, - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - @intercept_exceptions() - async def archive_query_revision( - self, - request: Request, - *, - query_revision_id: UUID, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revision = await self.queries_service.archive_query_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_revision_id=query_revision_id, - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - @intercept_exceptions() - async def unarchive_query_revision( - self, - request: Request, - *, - query_revision_id: UUID, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revision = await self.queries_service.unarchive_query_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_revision_id=query_revision_id, - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - @intercept_exceptions() - @suppress_exceptions(default=QueryRevisionsResponse()) - async def query_query_revisions( - self, - request: Request, - *, - query_revision_query_request: QueryRevisionQueryRequest, - ) -> QueryRevisionsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revisions = await self.queries_service.query_query_revisions( - project_id=UUID(request.state.project_id), - # - query_revision=query_revision_query_request.query_revision, - # - query_refs=query_revision_query_request.query_refs, - query_variant_refs=query_revision_query_request.query_variant_refs, - query_revision_refs=query_revision_query_request.query_revision_refs, - # - include_archived=query_revision_query_request.include_archived, - # - windowing=query_revision_query_request.windowing, - ) - - query_revisions_response = QueryRevisionsResponse( - count=len(query_revisions), - query_revisions=query_revisions, - ) - - return query_revisions_response - - @intercept_exceptions() - async def commit_query_revision( - self, - request: Request, - *, - query_revision_commit_request: QueryRevisionCommitRequest, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revision = await self.queries_service.commit_query_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_revision_commit=query_revision_commit_request.query_revision_commit, - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - @intercept_exceptions() - @suppress_exceptions(default=QueryRevisionsResponse()) - async def log_query_revisions( - self, - request: Request, - *, - query_revisions_log_request: QueryRevisionsLogRequest, - ) -> QueryRevisionsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revisions = await self.queries_service.log_query_revisions( - project_id=UUID(request.state.project_id), - # - query_revisions_log=query_revisions_log_request.query_revisions, - ) - - revisions_response = QueryRevisionsResponse( - count=len(query_revisions), - query_revisions=query_revisions, - ) - - return revisions_response - - @intercept_exceptions() - @suppress_exceptions(default=QueryRevisionResponse()) - async def retrieve_query_revision( - self, - request: Request, - *, - query_revision_retrieve_request: QueryRevisionRetrieveRequest, - ) -> QueryRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - query_revision = await self.queries_service.fetch_query_revision( - project_id=UUID(request.state.project_id), - # - query_ref=query_revision_retrieve_request.query_ref, - query_variant_ref=query_revision_retrieve_request.query_variant_ref, - query_revision_ref=query_revision_retrieve_request.query_revision_ref, - ) - - query_revision_response = QueryRevisionResponse( - count=1 if query_revision else 0, - query_revision=query_revision, - ) - - return query_revision_response - - -class SimpleQueriesRouter: - def __init__( - self, - *, - simple_queries_service: SimpleQueriesService, - ): - self.simple_queries_service = simple_queries_service - - self.router = APIRouter() - - # SIMPLE QUERIES ------------------------------------------------------- - - self.router.add_api_route( - "/", - self.create_simple_query, - methods=["POST"], - operation_id="create_simple_query", - status_code=status.HTTP_200_OK, - response_model=SimpleQueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}", - self.fetch_simple_query, - methods=["GET"], - operation_id="fetch_simple_query", - status_code=status.HTTP_200_OK, - response_model=SimpleQueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}", - self.edit_simple_query, - methods=["PUT"], - operation_id="edit_simple_query", - status_code=status.HTTP_200_OK, - response_model=SimpleQueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}/archive", - self.archive_simple_query, - methods=["POST"], - operation_id="archive_simple_query", - status_code=status.HTTP_200_OK, - response_model=SimpleQueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/{query_id}/unarchive", - self.unarchive_simple_query, - methods=["POST"], - operation_id="unarchive_simple_query", - status_code=status.HTTP_200_OK, - response_model=SimpleQueryResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/query", - self.query_simple_queries, - methods=["POST"], - operation_id="query_simple_queries", - status_code=status.HTTP_200_OK, - response_model=SimpleQueriesResponse, - response_model_exclude_none=True, - ) - - # SIMPLE QUERIES ----------------------------------------------------------- - - @intercept_exceptions() - async def create_simple_query( - self, - request: Request, - *, - query_id: Optional[UUID] = None, - # - simple_query_create_request: SimpleQueryCreateRequest, - ) -> SimpleQueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_query = await self.simple_queries_service.create( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - # - simple_query_create=simple_query_create_request.query, - ) - - simple_query_response = SimpleQueryResponse( - count=1 if simple_query else 0, - query=simple_query, - ) - - return simple_query_response - - @intercept_exceptions() - @suppress_exceptions(default=SimpleQueryResponse()) - async def fetch_simple_query( - self, - request: Request, - *, - query_id: UUID, - ) -> SimpleQueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_query = await self.simple_queries_service.fetch( - project_id=UUID(request.state.project_id), - # - query_id=query_id, - ) - - simple_query_response = SimpleQueryResponse( - count=1 if simple_query else 0, - query=simple_query, - ) - - return simple_query_response - - @intercept_exceptions() - async def edit_simple_query( - self, - request: Request, - *, - query_id: UUID, - # - simple_query_edit_request: SimpleQueryEditRequest, - ) -> SimpleQueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_query = await self.simple_queries_service.edit( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - # - simple_query_edit=simple_query_edit_request.query, - ) - - simple_query_response = SimpleQueryResponse( - count=1 if simple_query else 0, - query=simple_query, - ) - - return simple_query_response - - @intercept_exceptions() - async def archive_simple_query( - self, - request: Request, - *, - query_id: UUID, - ) -> SimpleQueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_query = await self.simple_queries_service.archive( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - ) - - simple_query_response = SimpleQueryResponse( - count=1 if simple_query else 0, - query=simple_query, - ) - - return simple_query_response - - @intercept_exceptions() - async def unarchive_simple_query( - self, - request: Request, - *, - query_id: UUID, - ) -> SimpleQueryResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_query = await self.simple_queries_service.unarchive( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - query_id=query_id, - ) - - simple_query_response = SimpleQueryResponse( - count=1 if simple_query else 0, - query=simple_query, - ) - - return simple_query_response - - @intercept_exceptions() - @suppress_exceptions(default=SimpleQueriesResponse()) - async def query_simple_queries( - self, - *, - request: Request, - # - simple_query_query_request: SimpleQueryQueryRequest, - ) -> SimpleQueriesResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - # - permission=Permission.VIEW_QUERIES, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - simple_queries = await self.simple_queries_service.query( - project_id=UUID(request.state.project_id), - # - query=simple_query_query_request.query, - # - query_refs=simple_query_query_request.query_refs, - # - include_archived=simple_query_query_request.include_archived, - # - windowing=simple_query_query_request.windowing, - ) - - simple_queries_response = SimpleQueriesResponse( - count=len(simple_queries), - queries=simple_queries, - ) - - return simple_queries_response diff --git a/api/oss/src/apis/fastapi/queries/utils.py b/api/oss/src/apis/fastapi/queries/utils.py deleted file mode 100644 index 99ecc5a0bb..0000000000 --- a/api/oss/src/apis/fastapi/queries/utils.py +++ /dev/null @@ -1,622 +0,0 @@ -from typing import Optional, Literal, List -from uuid import UUID -from datetime import datetime - -from fastapi import Query - -from oss.src.utils.logging import get_module_logger - -from oss.src.core.shared.dtos import ( - Windowing, - Reference, -) -from oss.src.core.queries.dtos import ( - # QueryFlags, - # - QueryQuery, - QueryVariantQuery, - QueryRevisionQuery, -) - -from oss.src.apis.fastapi.shared.utils import ( - parse_metadata, -) -from oss.src.apis.fastapi.queries.models import ( - QueryQueryRequest, - QueryVariantQueryRequest, - QueryRevisionQueryRequest, - QueryRevisionRetrieveRequest, -) - - -log = get_module_logger(__name__) - - -def parse_query_query_request_from_params( - query_id: Optional[UUID] = Query(None), - query_ids: Optional[List[UUID]] = Query(None), - query_slug: Optional[str] = Query(None), - query_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> QueryQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = _flags # QueryFlags(**_flags) if _flags else None - - query = ( - QueryQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) - - query_refs = ( - ( - [ - Reference( - id=query_id, - slug=query_slug, - ) - ] - if query_id or query_slug - else [] - ) - + ( - [ - Reference( - id=query_id, - slug=query_slug, - ) - for query_id, query_slug in zip( - query_ids, - query_slugs, - ) - ] - if query_ids and query_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_query_query_request_from_body( - query=query, - # - query_refs=query_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - -def parse_query_query_request_from_body( - query: Optional[QueryQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> QueryQueryRequest: - query_query_request = None - - try: - query_query_request = QueryQueryRequest( - query=query, - # - query_refs=query_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - except Exception as e: # pylint: disable=broad-except - query_query_request = QueryQueryRequest() - - return query_query_request - - -def merge_query_query_requests( - query_request_params: Optional[QueryQueryRequest] = None, - query_request_body: Optional[QueryQueryRequest] = None, -) -> QueryQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body - - if query_request_params and query_request_body: - return QueryQueryRequest( - query=query_request_body.query or query_request_params.query, - # - query_refs=query_request_body.query_refs or query_request_params.query_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return QueryQueryRequest() - - -def parse_query_variant_query_request_from_params( - query_id: Optional[UUID] = Query(None), - query_ids: Optional[List[UUID]] = Query(None), - query_slug: Optional[str] = Query(None), - query_slugs: Optional[List[str]] = Query(None), - # - query_variant_id: Optional[UUID] = Query(None), - query_variant_ids: Optional[List[UUID]] = Query(None), - query_variant_slug: Optional[str] = Query(None), - query_variant_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> QueryVariantQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = _flags # QueryFlags(**_flags) if _flags else None - - query_variant = ( - QueryVariantQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) - - query_refs = ( - ( - [ - Reference( - id=query_id, - slug=query_slug, - ) - ] - if query_id or query_slug - else [] - ) - + ( - [ - Reference( - id=query_id, - slug=query_slug, - ) - for query_id, query_slug in zip( - query_ids, - query_slugs, - ) - ] - if query_ids and query_slugs - else [] - ) - ) or None - - query_variant_refs = ( - ( - [ - Reference( - id=query_variant_id, - slug=query_variant_slug, - ) - ] - if query_variant_id or query_variant_slug - else [] - ) - + ( - [ - Reference( - id=query_variant_id, - slug=query_variant_slug, - ) - for query_variant_id, query_variant_slug in zip( - query_variant_ids, - query_variant_slugs, - ) - ] - if query_variant_ids and query_variant_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_query_variant_query_request_from_body( - query_variant=query_variant, - # - query_refs=query_refs or None, - query_variant_refs=query_variant_refs or None, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - -def parse_query_variant_query_request_from_body( - query_variant: Optional[QueryVariantQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - query_variant_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> QueryVariantQueryRequest: - query_variant_query_request = None - - try: - query_variant_query_request = QueryVariantQueryRequest( - query_variant=query_variant, - # - query_refs=query_refs, - query_variant_refs=query_variant_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - except Exception as e: # pylint: disable=broad-except - query_variant_query_request = QueryVariantQueryRequest() - - return query_variant_query_request - - -def merge_query_variant_query_requests( - query_request_params: Optional[QueryVariantQueryRequest] = None, - query_request_body: Optional[QueryVariantQueryRequest] = None, -) -> QueryVariantQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body - - if query_request_params and query_request_body: - return QueryVariantQueryRequest( - query_variant=query_request_body.query_variant - or query_request_params.query_variant, - # - query_refs=query_request_body.query_refs or query_request_params.query_refs, - query_variant_refs=query_request_body.query_variant_refs - or query_request_params.query_variant_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return QueryVariantQueryRequest() - - -def parse_query_revision_query_request_from_params( - query_id: Optional[UUID] = Query(None), - query_ids: Optional[List[UUID]] = Query(None), - query_slug: Optional[str] = Query(None), - query_slugs: Optional[List[str]] = Query(None), - # - query_variant_id: Optional[UUID] = Query(None), - query_variant_ids: Optional[List[UUID]] = Query(None), - query_variant_slug: Optional[str] = Query(None), - query_variant_slugs: Optional[List[str]] = Query(None), - # - query_revision_id: Optional[UUID] = Query(None), - query_revision_ids: Optional[List[UUID]] = Query(None), - query_revision_slug: Optional[str] = Query(None), - query_revision_slugs: Optional[List[str]] = Query(None), - query_revision_version: Optional[str] = Query(None), - query_revision_versions: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> QueryRevisionQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = _flags # QueryFlags(**_flags) if _flags else None - - query_revision = ( - QueryRevisionQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) - - query_refs = ( - [ - Reference( - id=query_id, - slug=query_slug, - ) - ] - if query_id or query_slug - else [] - ) + ( - [ - Reference( - id=query_id, - slug=query_slug, - ) - for query_id, query_slug in zip( - query_ids, - query_slugs, - ) - ] - if query_ids and query_slugs - else [] - ) - - query_variant_refs = ( - [ - Reference( - id=query_variant_id, - slug=query_variant_slug, - ) - ] - if query_variant_id or query_variant_slug - else [] - ) + ( - [ - Reference( - id=query_variant_id, - slug=query_variant_slug, - ) - for query_variant_id, query_variant_slug in zip( - query_variant_ids, - query_variant_slugs, - ) - ] - if query_variant_ids and query_variant_slugs - else [] - ) - - query_revision_refs = ( - [ - Reference( - id=query_revision_id, - slug=query_revision_slug, - version=query_revision_version, - ) - ] - if query_revision_id or query_revision_slug or query_revision_version - else [] - ) + ( - [ - Reference( - id=query_revision_id, - slug=query_revision_slug, - version=query_revision_version, - ) - for query_revision_id, query_revision_slug, query_revision_version in zip( - query_revision_ids, - query_revision_slugs, - query_revision_versions, - ) - ] - if query_revision_ids and query_revision_slugs and query_revision_versions - else [] - ) - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_query_revision_query_request_from_body( - query_revision=query_revision, - # - query_refs=query_refs, - query_variant_refs=query_variant_refs, - query_revision_refs=query_revision_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - -def parse_query_revision_query_request_from_body( - query_revision: Optional[QueryRevisionQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - query_variant_refs: Optional[List[Reference]] = None, - query_revision_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> QueryRevisionQueryRequest: - query_revision_query_request = None - - try: - query_revision_query_request = QueryRevisionQueryRequest( - query_revision=query_revision, - # - query_refs=query_refs, - query_variant_refs=query_variant_refs, - query_revision_refs=query_revision_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - except Exception as e: # pylint: disable=broad-except - log.warn(e) - - query_revision_query_request = QueryRevisionQueryRequest() - - return query_revision_query_request - - -def merge_query_revision_query_requests( - query_request_params: Optional[QueryRevisionQueryRequest] = None, - query_request_body: Optional[QueryRevisionQueryRequest] = None, -) -> QueryRevisionQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body - - if query_request_params and query_request_body: - return QueryRevisionQueryRequest( - query_revision=query_request_body.query_revision - or query_request_params.query_revision, - # - query_refs=query_request_body.query_refs or query_request_params.query_refs, - query_variant_refs=query_request_body.query_variant_refs - or query_request_params.query_variant_refs, - query_revision_refs=query_request_body.query_revision_refs - or query_request_params.query_revision_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return QueryRevisionQueryRequest() - - -def parse_query_revision_retrieve_request_from_params( - query_id: Optional[UUID] = Query(None), - query_slug: Optional[str] = Query(None), - # - query_variant_id: Optional[UUID] = Query(None), - query_variant_slug: Optional[str] = Query(None), - # - query_revision_id: Optional[UUID] = Query(None), - query_revision_slug: Optional[str] = Query(None), - query_revision_version: Optional[str] = Query(None), -): - query_ref = ( - Reference( - id=query_id, - slug=query_slug, - ) - if query_id or query_slug - else None - ) - - query_variant_ref = ( - Reference( - id=query_variant_id, - slug=query_variant_slug, - ) - if query_variant_id or query_variant_slug - else None - ) - - query_revision_ref = ( - Reference( - id=query_revision_id, - slug=query_revision_slug, - version=query_revision_version, - ) - if query_revision_id or query_revision_slug or query_revision_version - else None - ) - - return parse_query_revision_retrieve_request_from_body( - query_ref=query_ref, - query_variant_ref=query_variant_ref, - query_revision_ref=query_revision_ref, - ) - - -def parse_query_revision_retrieve_request_from_body( - query_ref: Optional[Reference] = None, - query_variant_ref: Optional[Reference] = None, - query_revision_ref: Optional[Reference] = None, -) -> QueryRevisionRetrieveRequest: - return QueryRevisionRetrieveRequest( - query_ref=query_ref, - query_variant_ref=query_variant_ref, - query_revision_ref=query_revision_ref, - ) diff --git a/api/oss/src/apis/fastapi/shared/models.py b/api/oss/src/apis/fastapi/shared/models.py new file mode 100644 index 0000000000..eee02072de --- /dev/null +++ b/api/oss/src/apis/fastapi/shared/models.py @@ -0,0 +1,7 @@ +from typing import Optional + +from pydantic import BaseModel + + +class VersionedModel(BaseModel): + version: Optional[str] = None diff --git a/api/oss/src/apis/fastapi/shared/utils.py b/api/oss/src/apis/fastapi/shared/utils.py deleted file mode 100644 index b9accb73b9..0000000000 --- a/api/oss/src/apis/fastapi/shared/utils.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import Optional, Tuple -from json import loads - -from oss.src.core.shared.dtos import ( - Flags, - Tags, - Meta, -) - - -def parse_metadata( - flags: Optional[str] = None, - tags: Optional[str] = None, - meta: Optional[str] = None, -) -> Tuple[Optional[Flags], Optional[Tags], Optional[Meta],]: - _flags = None - try: - _flags = loads(flags) if flags else None - except Exception: # pylint: disable=broad-exception-caught - pass - - _tags = None - try: - _tags = loads(tags) if tags else None - except Exception: # pylint: disable=broad-exception-caught - pass - - _meta = None - try: - _meta = loads(meta) if meta else None - except Exception: # pylint: disable=broad-exception-caught - pass - - return _flags, _tags, _meta diff --git a/api/oss/src/apis/fastapi/testcases/__init__.py b/api/oss/src/apis/fastapi/testcases/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/apis/fastapi/testcases/models.py b/api/oss/src/apis/fastapi/testcases/models.py deleted file mode 100644 index a6a1c76e27..0000000000 --- a/api/oss/src/apis/fastapi/testcases/models.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Optional, List -from uuid import UUID - -from pydantic import BaseModel - -from oss.src.core.shared.dtos import ( - Windowing, -) -from oss.src.core.testcases.dtos import ( - Testcase, -) - - -# TESTCASES -------------------------------------------------------------------- - - -class TestcasesQueryRequest(BaseModel): - testcase_ids: Optional[List[UUID]] = None - # - testset_id: Optional[UUID] = None - # - windowing: Optional[Windowing] = None - - -class TestcaseResponse(BaseModel): - count: int = 0 - testcase: Optional[Testcase] = None - - -class TestcasesResponse(BaseModel): - count: int = 0 - testcases: List[Testcase] = [] diff --git a/api/oss/src/apis/fastapi/testcases/router.py b/api/oss/src/apis/fastapi/testcases/router.py deleted file mode 100644 index e7fc999aa5..0000000000 --- a/api/oss/src/apis/fastapi/testcases/router.py +++ /dev/null @@ -1,137 +0,0 @@ -from uuid import UUID - -from fastapi import APIRouter, Request, status - -from oss.src.utils.common import is_ee -from oss.src.utils.logging import get_module_logger -from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions -from oss.src.utils.caching import get_cache, set_cache, invalidate_cache - -from oss.src.core.testcases.service import ( - TestcasesService, -) - -from oss.src.apis.fastapi.testcases.models import ( - TestcasesQueryRequest, - TestcaseResponse, - TestcasesResponse, -) - -if is_ee(): - from ee.src.models.shared_models import Permission - from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION - - -log = get_module_logger(__name__) - - -class TestcasesRouter: - """ - FastAPI router for testcase endpoints. - """ - - def __init__( - self, - *, - testcases_service: TestcasesService, - ): - self.testcases_service = testcases_service - self.router = APIRouter() - - # TESTCASES ------------------------------------------------------------ - - self.router.add_api_route( - "/{testcase_id}", - self.fetch_testcase, - methods=["GET"], - status_code=status.HTTP_200_OK, - response_model=TestcaseResponse, - ) - - self.router.add_api_route( - "/query", - self.query_testcases, - methods=["POST"], - status_code=status.HTTP_200_OK, - response_model=TestcasesResponse, - ) - - # TESTCASES ---------------------------------------------------------------- - - @intercept_exceptions() - @suppress_exceptions(default=TestcaseResponse()) - async def fetch_testcase( - self, - request: Request, - *, - testcase_id: UUID, - ) -> TestcaseResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_TESTSETS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testcases = await self.testcases_service.fetch_testcases( - project_id=UUID(request.state.project_id), - # - testcase_ids=[testcase_id], - ) - - testcase = testcases[0] if len(testcases) > 0 else None - - testcase_response = TestcaseResponse( - count=1 if testcase else 0, - testcase=testcase, - ) - - return testcase_response - - @intercept_exceptions() - @suppress_exceptions(default=TestcasesResponse()) - async def list_testcases( - self, - request: Request, - ) -> TestcasesResponse: - testcase_query_request = TestcasesQueryRequest() - - return await self.query_testcases( - request=request, - # - testcases_query_request=testcase_query_request, - ) - - @intercept_exceptions() - @suppress_exceptions(default=TestcasesResponse()) - async def query_testcases( - self, - request: Request, - *, - testcases_query_request: TestcasesQueryRequest, - ) -> TestcasesResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_TESTSETS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testcases = await self.testcases_service.fetch_testcases( - project_id=UUID(request.state.project_id), - # - testcase_ids=testcases_query_request.testcase_ids, - # - testset_id=testcases_query_request.testset_id, - # - windowing=testcases_query_request.windowing, - ) - - testcase_response = TestcasesResponse( - count=len(testcases), - testcases=testcases if testcases else [], - ) - - return testcase_response diff --git a/api/oss/src/apis/fastapi/testsets/models.py b/api/oss/src/apis/fastapi/testsets/models.py index df293019b4..8afeb4df7d 100644 --- a/api/oss/src/apis/fastapi/testsets/models.py +++ b/api/oss/src/apis/fastapi/testsets/models.py @@ -1,172 +1,109 @@ from typing import Optional, List +from uuid import UUID from pydantic import BaseModel from oss.src.core.shared.dtos import ( + Identifier, + Slug, + Lifecycle, + Header, + Tags, + Meta, Windowing, Reference, ) + from oss.src.core.testsets.dtos import ( - Testset, - TestsetCreate, - TestsetEdit, - TestsetQuery, - TestsetLog, - # - TestsetVariant, - TestsetVariantCreate, - TestsetVariantEdit, - TestsetVariantQuery, - # - TestsetRevision, - TestsetRevisionQuery, - TestsetRevisionCreate, - TestsetRevisionEdit, - TestsetRevisionCommit, - # - SimpleTestset, - SimpleTestsetCreate, - SimpleTestsetEdit, - SimpleTestsetQuery, + TestsetRevisionData, + TestsetFlags, ) - -# TESTSETS --------------------------------------------------------------------- - - -class TestsetCreateRequest(BaseModel): - testset: TestsetCreate - - -class TestsetEditRequest(BaseModel): - testset: TestsetEdit +from oss.src.core.testcases.dtos import Testcase -class TestsetQueryRequest(BaseModel): - testset: Optional[TestsetQuery] = None - # - testset_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - +class SimpleTestset( + Identifier, + Slug, + Lifecycle, + Header, +): + flags: Optional[TestsetFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -class TestsetLogRequest(BaseModel): - testset: TestsetLog + data: Optional[TestsetRevisionData] = None -class TestsetResponse(BaseModel): - count: int = 0 - testset: Optional[Testset] = None +class SimpleTestsetCreate( + Slug, + Header, +): + # flags: Optional[TestsetFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None + data: Optional[TestsetRevisionData] = None -class TestsetsResponse(BaseModel): - count: int = 0 - testsets: List[Testset] = [] +class SimpleTestsetEdit( + Identifier, + Header, +): + # flags: Optional[TestsetFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -# TESTSET VARIANTS ------------------------------------------------------------- + data: Optional[TestsetRevisionData] = None -class TestsetVariantCreateRequest(BaseModel): - testset_variant: TestsetVariantCreate - - -class TestsetVariantEditRequest(BaseModel): - testset_variant: TestsetVariantEdit - - -class TestsetVariantQueryRequest(BaseModel): - testset_variant: Optional[TestsetVariantQuery] = None - # - testset_refs: Optional[List[Reference]] = None - testset_variant_refs: Optional[List[Reference]] = None - # - include_archived: Optional[bool] = None - # - windowing: Optional[Windowing] = None - - -class TestsetVariantResponse(BaseModel): - count: int = 0 - testset_variant: Optional[TestsetVariant] = None - - -class TestsetVariantsResponse(BaseModel): - count: int = 0 - testset_variants: List[TestsetVariant] = [] - +class SimpleTestsetQuery(BaseModel): + # flags: Optional[TestsetFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -# TESTSET REVISIONS ------------------------------------------------------------ - -class TestsetRevisionCreateRequest(BaseModel): - testset_revision: TestsetRevisionCreate +class SimpleTestsetCreateRequest(BaseModel): + testset: SimpleTestsetCreate -class TestsetRevisionEditRequest(BaseModel): - testset_revision: TestsetRevisionEdit +class SimpleTestsetEditRequest(BaseModel): + testset: SimpleTestsetEdit -class TestsetRevisionQueryRequest(BaseModel): - testset_revision: Optional[TestsetRevisionQuery] = None +class SimpleTestsetQueryRequest(BaseModel): + testset: Optional[SimpleTestsetQuery] = None # testset_refs: Optional[List[Reference]] = None - testset_variant_refs: Optional[List[Reference]] = None - testset_revision_refs: Optional[List[Reference]] = None # include_archived: Optional[bool] = None # windowing: Optional[Windowing] = None -class TestsetRevisionCommitRequest(BaseModel): - testset_revision_commit: TestsetRevisionCommit - - -class TestsetRevisionRetrieveRequest(BaseModel): - testset_ref: Optional[Reference] = None - testset_variant_ref: Optional[Reference] = None - testset_revision_ref: Optional[Reference] = None - - -class TestsetRevisionResponse(BaseModel): +class SimpleTestsetResponse(BaseModel): count: int = 0 - testset_revision: Optional[TestsetRevision] = None + testset: Optional[SimpleTestset] = None -class TestsetRevisionsResponse(BaseModel): +class SimpleTestsetsResponse(BaseModel): count: int = 0 - testset_revisions: List[TestsetRevision] = [] - - -# SIMPLE TESTSETS -------------------------------------------------------------- - - -class SimpleTestsetCreateRequest(BaseModel): - testset: SimpleTestsetCreate - - -class SimpleTestsetEditRequest(BaseModel): - testset: SimpleTestsetEdit + testsets: List[SimpleTestset] = [] -class SimpleTestsetQueryRequest(BaseModel): - testset: Optional[SimpleTestsetQuery] = None - # - testset_refs: Optional[List[Reference]] = None +class TestcasesQueryRequest(BaseModel): + testcase_ids: Optional[List[UUID]] = None # - include_archived: Optional[bool] = None + testset_id: Optional[UUID] = None # windowing: Optional[Windowing] = None -class SimpleTestsetResponse(BaseModel): +class TestcaseResponse(BaseModel): count: int = 0 - testset: Optional[SimpleTestset] = None + testcase: Optional[Testcase] = None -class SimpleTestsetsResponse(BaseModel): +class TestcasesResponse(BaseModel): count: int = 0 - testsets: List[SimpleTestset] = [] + testcases: List[Testcase] = [] diff --git a/api/oss/src/apis/fastapi/testsets/router.py b/api/oss/src/apis/fastapi/testsets/router.py index 9fcd8bcab6..18438a6e72 100644 --- a/api/oss/src/apis/fastapi/testsets/router.py +++ b/api/oss/src/apis/fastapi/testsets/router.py @@ -1,37 +1,32 @@ -from typing import Optional, List, Literal, Dict, Any +from typing import Optional, List, Literal, Dict from uuid import uuid4, UUID from json import loads, JSONDecodeError from io import BytesIO +### import orjson import pandas as pd -from pydantic import ValidationError +### + +from pydantic import ValidationError from fastapi.responses import StreamingResponse -from fastapi import ( - APIRouter, - Request, - status, - UploadFile, - File, - Form, - Depends, - HTTPException, -) +from fastapi import APIRouter, Request, status, HTTPException, UploadFile, File, Form + +from oss.src.services.db_manager import fetch_testset_by_id +from fastapi import APIRouter, Request, status, HTTPException, UploadFile, File, Form from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions from oss.src.utils.caching import get_cache, set_cache, invalidate_cache -from oss.src.core.shared.dtos import ( - Reference, -) -from oss.src.core.testcases.dtos import ( - Testcase, -) +from oss.src.core.shared.dtos import Reference +from oss.src.core.testsets.dtos import TestsetFlags, TestsetRevisionData +from oss.src.core.testsets.service import TestsetsService +from oss.src.core.testcases.dtos import Testcase + from oss.src.core.testsets.dtos import ( - TestsetFlags, Testset, TestsetCreate, TestsetEdit, @@ -42,58 +37,38 @@ TestsetVariantEdit, TestsetVariantQuery, # - TestsetRevisionData, TestsetRevision, TestsetRevisionCreate, TestsetRevisionEdit, TestsetRevisionQuery, TestsetRevisionCommit, - # +) +from oss.src.apis.fastapi.testsets.models import ( SimpleTestset, SimpleTestsetCreate, SimpleTestsetEdit, SimpleTestsetQuery, -) -from oss.src.core.testsets.service import ( - TestsetsService, - SimpleTestsetsService, -) - -from oss.src.apis.fastapi.testsets.models import ( - TestsetCreateRequest, - TestsetEditRequest, - TestsetQueryRequest, - TestsetLogRequest, - TestsetResponse, - TestsetsResponse, - # - TestsetVariantCreateRequest, - TestsetVariantEditRequest, - TestsetVariantQueryRequest, - TestsetVariantResponse, - TestsetVariantsResponse, - # - TestsetRevisionCreateRequest, - TestsetRevisionEditRequest, - TestsetRevisionQueryRequest, - TestsetRevisionRetrieveRequest, - TestsetRevisionCommitRequest, - TestsetRevisionResponse, - TestsetRevisionsResponse, # SimpleTestsetCreateRequest, SimpleTestsetEditRequest, SimpleTestsetQueryRequest, + # SimpleTestsetResponse, SimpleTestsetsResponse, + # + TestcasesQueryRequest, + # + TestcaseResponse, + TestcasesResponse, ) + from oss.src.apis.fastapi.testsets.utils import ( - parse_testset_revision_retrieve_request_from_params, - parse_testset_revision_retrieve_request_from_body, - # csv_file_to_json_array, json_file_to_json_array, json_array_to_json_object, + json_array_to_csv_file, + json_array_to_json_file, + format_validation_error, validate_testset_limits, TESTSETS_SIZE_EXCEPTION, TESTSETS_SIZE_LIMIT, @@ -106,1079 +81,694 @@ log = get_module_logger(__name__) +# --- LATER +# TODO: ADD DEDUPLICATION AS OPTIONAL +# TODO: CLEAN UP ! + + +class SimpleTestsetsRouter: + VERSION = "1.0.0" -class TestsetsRouter: TESTCASES_FLAGS = TestsetFlags( has_testcases=True, - has_traces=False, + has_links=False, ) - def __init__(self, *, testsets_service: TestsetsService): + def __init__( + self, + *, + testsets_service: TestsetsService, + ): self.testsets_service = testsets_service self.router = APIRouter() - # TESTSETS ------------------------------------------------------------- - + # POST /api/preview/simple/testsets/ self.router.add_api_route( "/", - self.create_testset, + self.create_simple_testset, methods=["POST"], - operation_id="create_testset", + operation_id="create_simple_testset", status_code=status.HTTP_200_OK, - response_model=TestsetResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # GET /api/preview/simple/testsets/{testset_id} self.router.add_api_route( "/{testset_id}", - self.fetch_testset, + self.fetch_simple_testset, methods=["GET"], - operation_id="fetch_testset", + operation_id="fetch_simple_testset", status_code=status.HTTP_200_OK, - response_model=TestsetResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # PUT /api/preview/simple/testsets/{testset_id} self.router.add_api_route( "/{testset_id}", - self.edit_testset, + self.edit_simple_testset, methods=["PUT"], - operation_id="edit_testset", + operation_id="edit_simple_testset", status_code=status.HTTP_200_OK, - response_model=TestsetResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testsets/{testset_id}/archive self.router.add_api_route( "/{testset_id}/archive", - self.archive_testset, + self.archive_simple_testset, methods=["POST"], - operation_id="archive_testset", + operation_id="archive_simple_testset", status_code=status.HTTP_200_OK, - response_model=TestsetResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testsets/{testset_id}/unarchive self.router.add_api_route( "/{testset_id}/unarchive", - self.unarchive_testset, - methods=["POST"], - operation_id="unarchive_testset", - status_code=status.HTTP_200_OK, - response_model=TestsetResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/query", - self.query_testsets, + self.unarchive_simple_testset, methods=["POST"], - operation_id="query_testsets", + operation_id="unarchive_simple_testset", status_code=status.HTTP_200_OK, - response_model=TestsetsResponse, - response_model_exclude_none=True, - ) - - # TESTSET VARIANTS ----------------------------------------------------- - - self.router.add_api_route( - "/variants/", - self.create_testset_variant, - methods=["POST"], - operation_id="create_testset_variant", - status_code=status.HTTP_201_CREATED, - response_model=TestsetVariantResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # GET /api/preview/simple/testsets/ self.router.add_api_route( - "/variants/{testset_variant_id}", - self.fetch_testset_variant, + "/", + self.list_simple_testsets, methods=["GET"], - operation_id="fetch_testset_variant", + operation_id="list_simple_testsets", status_code=status.HTTP_200_OK, - response_model=TestsetVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{testset_variant_id}", - self.edit_testset_variant, - methods=["PUT"], - operation_id="edit_testset_variant", - status_code=status.HTTP_200_OK, - response_model=TestsetVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{testset_variant_id}/archive", - self.archive_testset_variant, - methods=["PUT"], - operation_id="archive_testset_variant", - status_code=status.HTTP_200_OK, - response_model=TestsetVariantResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/variants/{testset_variant_id}/unarchive", - self.unarchive_testset_variant, - methods=["PUT"], - operation_id="unarchive_testset_variant", - status_code=status.HTTP_200_OK, - response_model=TestsetVariantResponse, + response_model=SimpleTestsetsResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testsets/query self.router.add_api_route( - "/variants/query", - self.query_testset_variants, + "/query", + self.query_simple_testsets, methods=["POST"], - operation_id="query_testset_variants", + operation_id="query_simple_testsets", status_code=status.HTTP_200_OK, - response_model=TestsetVariantsResponse, + response_model=SimpleTestsetsResponse, response_model_exclude_none=True, ) - # TESTSET REVISIONS ---------------------------------------------------- - + # POST /api/preview/simple/testsets/upload self.router.add_api_route( - "/revisions/retrieve", - self.retrieve_testset_revision, + "/upload", + self.create_simple_testset_from_file, methods=["POST"], - operation_id="retrieve_testset_revision", + operation_id="create_simple_testset_from_file", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testsets/{testset_id}/upload self.router.add_api_route( - "/revisions/", - self.create_testset_revision, + "/{testset_id}/upload", + self.edit_simple_testset_from_file, methods=["POST"], - operation_id="create_testset_revision", - status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{testset_revision_id}", - self.fetch_testset_revision, - methods=["GET"], - operation_id="fetch_testset_revision", - status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/revisions/{testset_revision_id}", - self.edit_testset_revision, - methods=["PUT"], - operation_id="edit_testset_revision", + operation_id="edit_simple_testset_from_file", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testsets/{testset_id}/download self.router.add_api_route( - "/revisions/{testset_revision_id}/archive", - self.archive_testset_revision, + "/{testset_id}/download", + self.fetch_simple_testset_to_file, methods=["POST"], - operation_id="archive_testset_revision", + operation_id="fetch_simple_testset_to_file", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) + # GET /api/preview/simple/testcases/{testcase_id} self.router.add_api_route( - "/revisions/{testset_revision_id}/unarchive", - self.unarchive_testset_revision, - methods=["POST"], - operation_id="unarchive_testset_revision", + "/testcases/{testcase_id}", + self.fetch_testcase, + methods=["GET"], + operation_id="fetch_testcase", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, + response_model=TestcaseResponse, response_model_exclude_none=True, ) + # GET /api/preview/simple/testcases/ self.router.add_api_route( - "/revisions/query", - self.query_testset_revisions, - methods=["POST"], - operation_id="query_testset_revisions", + "/testcases/", + self.list_testcases, + methods=["GET"], + operation_id="list_testcases", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionsResponse, + response_model=TestcasesResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testcases/query self.router.add_api_route( - "/revisions/commit", - self.commit_testset_revision, + "/testcases/query", + self.query_testcases, methods=["POST"], - operation_id="commit_testset_revision", + operation_id="query_testcases", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionResponse, + response_model=TestcasesResponse, response_model_exclude_none=True, ) + # POST /api/preview/simple/testsets/{testset_id}/transfer self.router.add_api_route( - "/revisions/log", - self.log_testset_revisions, + "/{testset_id}/transfer", + self.transfer_testset, methods=["POST"], - operation_id="log_testset_revisions", + operation_id="transfer_testset", status_code=status.HTTP_200_OK, - response_model=TestsetRevisionsResponse, + response_model=SimpleTestsetResponse, response_model_exclude_none=True, ) - # TESTSETS ----------------------------------------------------------------- - - async def create_testset( + @intercept_exceptions() + async def create_simple_testset( self, - request: Request, *, + request: Request, + simple_testset_create_request: SimpleTestsetCreateRequest, testset_id: Optional[UUID] = None, - # - testset_create_request: TestsetCreateRequest, - ) -> TestsetResponse: + ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.EDIT_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset = await self.testsets_service.create_testset( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - testset_id=testset_id, - # - testset_create=testset_create_request.testset, - ) + raise FORBIDDEN_EXCEPTION - testset_response = TestsetResponse( - count=1 if testset else 0, - testset=testset, - ) + try: + testcases = simple_testset_create_request.testset.data.testcases - return testset_response + testcases_data = [testcase.data for testcase in testcases] - async def fetch_testset( - self, - request: Request, - *, - testset_id: UUID, - ) -> TestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + testcases_data = json_array_to_json_object(data=testcases_data) - testset = await self.testsets_service.fetch_testset( - project_id=UUID(request.state.project_id), - # - testset_ref=Reference(id=testset_id), - ) + validate_testset_limits(testcases_data) - testset_response = TestsetResponse( - count=1 if testset else 0, - testset=testset, - ) + for i, testcase_data in enumerate(testcases_data.values()): + simple_testset_create_request.testset.data.testcases[ + i + ].data = testcase_data - return testset_response + except Exception as e: + raise HTTPException( + status_code=400, + detail=f"Failed to parse testcases as JSON array: {e}", + ) from e - async def edit_testset( - self, - request: Request, - *, - testset_id: UUID, - # - testset_edit_request: TestsetEditRequest, - ) -> TestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + try: + testset_revision_data = TestsetRevisionData( + testcases=simple_testset_create_request.testset.data.testcases, + ) - if str(testset_id) != str(testset_edit_request.testset.id): - return TestsetResponse() + except ValidationError as e: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=format_validation_error( + e, simple_testset_create_request.model_dump() + ), + ) from e - testset = await self.testsets_service.edit_testset( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), + _testset_create = TestsetCreate( + slug=simple_testset_create_request.testset.slug, # - testset_edit=testset_edit_request.testset, - ) - - testset_response = TestsetResponse( - count=1 if testset else 0, - testset=testset, + name=simple_testset_create_request.testset.name, + description=simple_testset_create_request.testset.description, + # + # flags = + tags=simple_testset_create_request.testset.tags, + meta=simple_testset_create_request.testset.meta, ) - return testset_response - - async def archive_testset( - self, - request: Request, - *, - testset_id: UUID, - ) -> TestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset = await self.testsets_service.archive_testset( + testset: Optional[Testset] = await self.testsets_service.create_testset( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # + testset_create=_testset_create, + # testset_id=testset_id, ) - testset_response = TestsetResponse( - count=1 if testset else 0, - testset=testset, - ) + if testset is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple testset. Please try again or contact support.", + ) - return testset_response + testset_variant_slug = uuid4().hex - async def unarchive_testset( - self, - request: Request, - *, - testset_id: UUID, - ) -> TestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + _testset_variant_create = TestsetVariantCreate( + slug=testset_variant_slug, + # + name=simple_testset_create_request.testset.name, + description=simple_testset_create_request.testset.description, + # + # flags = + tags=simple_testset_create_request.testset.tags, + meta=simple_testset_create_request.testset.meta, + # + testset_id=testset.id, + ) - testset = await self.testsets_service.unarchive_testset( + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.create_testset_variant( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - testset_id=testset_id, + testset_variant_create=_testset_variant_create, ) - testset_response = TestsetResponse( - count=1 if testset else 0, - testset=testset, - ) - - return testset_response + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple testset. Please try again or contact support.", + ) - async def query_testsets( - self, - request: Request, - *, - testset_query_request: TestsetQueryRequest, - ) -> TestsetsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + testset_revision_slug = uuid4().hex - testsets = await self.testsets_service.query_testsets( - project_id=UUID(request.state.project_id), - # - testset_query=testset_query_request.testset, + _testset_revision_create = TestsetRevisionCreate( + slug=testset_revision_slug, # - testset_refs=testset_query_request.testset_refs, + name=simple_testset_create_request.testset.name, + description=simple_testset_create_request.testset.description, # - include_archived=testset_query_request.include_archived, + # flags = + tags=simple_testset_create_request.testset.tags, + meta=simple_testset_create_request.testset.meta, # - windowing=testset_query_request.windowing, - ) - - testsets_response = TestsetsResponse( - count=len(testsets), - testsets=testsets, + testset_id=testset.id, + testset_variant_id=testset_variant.id, ) - return testsets_response - - # TESTSET VARIANTS --------------------------------------------------------- - - async def create_testset_variant( - self, - request: Request, - *, - testset_variant_create_request: TestsetVariantCreateRequest, - ) -> TestsetVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_variant = await self.testsets_service.create_testset_variant( + testset_revision: Optional[ + TestsetRevision + ] = await self.testsets_service.create_testset_revision( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - testset_variant_create=testset_variant_create_request.testset_variant, - ) - - testset_variant_response = TestsetVariantResponse( - count=1 if testset_variant else 0, - testset_variant=testset_variant, + testset_revision_create=_testset_revision_create, ) - return testset_variant_response + if testset_revision is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple testset. Please try again or contact support.", + ) - async def fetch_testset_variant( - self, request: Request, *, testset_variant_id: UUID - ) -> TestsetVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + testset_revision_slug = uuid4().hex - testset_variant = await self.testsets_service.fetch_testset_variant( - project_id=UUID(request.state.project_id), + _testset_revision_commit = TestsetRevisionCommit( + slug=testset_revision_slug, + # + name=simple_testset_create_request.testset.name, + description=simple_testset_create_request.testset.description, + # + # flags = + tags=simple_testset_create_request.testset.tags, + meta=simple_testset_create_request.testset.meta, # - testset_variant_ref=Reference(id=testset_variant_id), + # message = + # + data=testset_revision_data, + # + testset_id=testset.id, + testset_variant_id=testset_variant.id, ) - testset_variant_response = TestsetVariantResponse( - count=1 if testset_variant else 0, - testset_variant=testset_variant, + testset_revision: Optional[ + TestsetRevision + ] = await self.testsets_service.commit_testset_revision( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + testset_revision_commit=_testset_revision_commit, ) - return testset_variant_response + if testset_revision is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to create simple testset. Please try again or contact support.", + ) - async def edit_testset_variant( - self, - request: Request, - *, - testset_variant_id: UUID, - # - testset_variant_edit_request: TestsetVariantEditRequest, - ) -> TestsetVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(testset_variant_id) not in request.state.user_id: - return TestsetVariantResponse() - - testset_variant = await self.testsets_service.edit_testset_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - testset_variant_edit=testset_variant_edit_request.testset_variant, - ) - - testset_variant_response = TestsetVariantResponse( - count=1 if testset_variant else 0, - testset_variant=testset_variant, - ) - - return testset_variant_response - - async def archive_testset_variant( - self, - request: Request, - *, - testset_variant_id: UUID, - ) -> TestsetVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_variant = await self.testsets_service.archive_testset_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - testset_variant_id=testset_variant_id, - ) - - testset_variant_response = TestsetVariantResponse( - count=1 if testset_variant else 0, - testset_variant=testset_variant, - ) - - return testset_variant_response - - async def unarchive_testset_variant( - self, - request: Request, - *, - testset_variant_id: UUID, - ) -> TestsetVariantResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_variant = await self.testsets_service.unarchive_testset_variant( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), + simple_testset = SimpleTestset( + id=testset.id, + slug=testset.slug, # - testset_variant_id=testset_variant_id, - ) - - testset_variant_response = TestsetVariantResponse( - count=1 if testset_variant else 0, - testset_variant=testset_variant, - ) - - return testset_variant_response - - async def query_testset_variants( - self, - request: Request, - *, - testset_variant_query_request: TestsetVariantQueryRequest, - ) -> TestsetVariantsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_variants = await self.testsets_service.query_variants( - project_id=UUID(request.state.project_id), + created_at=testset.created_at, + updated_at=testset.updated_at, + deleted_at=testset.deleted_at, + created_by_id=testset.created_by_id, + updated_by_id=testset.updated_by_id, + deleted_by_id=testset.deleted_by_id, # - testset_variant_query=testset_variant_query_request.testset_variant, + name=testset.name, + description=testset.description, # - include_archived=testset_variant_query_request.include_archived, + # flags = + tags=testset.tags, + meta=testset.meta, # - windowing=testset_variant_query_request.windowing, + data=testset_revision.data, ) - testset_variant_response = TestsetVariantsResponse( - count=len(testset_variants), - testset_variants=testset_variants, + simple_testset_response = SimpleTestsetResponse( + count=1, + testset=simple_testset, ) - return testset_variant_response - - # TESTSET REVISIONS -------------------------------------------------------- + return simple_testset_response - async def retrieve_testset_revision( + @intercept_exceptions() + @suppress_exceptions(default=SimpleTestsetResponse()) + async def fetch_simple_testset( self, - request: Request, *, - testset_revision_retrieve_request: TestsetRevisionRetrieveRequest, - ) -> TestsetRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - cache_key = { - "artifact_ref": testset_revision_retrieve_request.testset_ref, # type: ignore - "variant_ref": testset_revision_retrieve_request.testset_variant_ref, # type: ignore - "revision_ref": testset_revision_retrieve_request.testset_revision_ref, # type: ignore - } - - testset_revision = None - # testset_revision = await get_cache( - # namespace="testsets:retrieve", - # project_id=request.state.project_id, - # user_id=request.state.user_id, - # key=cache_key, - # model=TestsetRevision, - # ) - - if not testset_revision: - testset_revision = await self.testsets_service.fetch_testset_revision( - project_id=UUID(request.state.project_id), - # - testset_ref=testset_revision_retrieve_request.testset_ref, # type: ignore - testset_variant_ref=testset_revision_retrieve_request.testset_variant_ref, # type: ignore - testset_revision_ref=testset_revision_retrieve_request.testset_revision_ref, # type: ignore - ) - - await set_cache( - namespace="testsets:retrieve", - project_id=request.state.project_id, - user_id=request.state.user_id, - key=cache_key, - value=testset_revision, - ) - - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, - ) - - return testset_revision_response - - async def create_testset_revision( - self, request: Request, - *, - testset_revision_create_request: TestsetRevisionCreateRequest, - ) -> TestsetRevisionResponse: + testset_id: UUID, + ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.VIEW_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - testset_revision = await self.testsets_service.create_testset_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - testset_revision_create=testset_revision_create_request.testset_revision, + testset_ref = Reference( + id=testset_id, ) - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, - ) - - return testset_revision_response - - async def fetch_testset_revision( - self, - request: Request, - *, - testset_revision_id: UUID, - ) -> TestsetRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_revision = await self.testsets_service.fetch_testset_revision( + testset: Optional[Testset] = await self.testsets_service.fetch_testset( project_id=UUID(request.state.project_id), # - testset_revision_ref=Reference(id=testset_revision_id), + testset_ref=testset_ref, ) - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, - ) - - return testset_revision_response - - async def edit_testset_revision( - self, - request: Request, - *, - testset_revision_id: UUID, - # - testset_revision_edit_request: TestsetRevisionEditRequest, - ) -> TestsetRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - if str(testset_revision_id) != str( - testset_revision_edit_request.testset_revision.id - ): - return TestsetRevisionResponse() + if testset is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset not found. Please check the ID and try again.", + ) - testset_revision = await self.testsets_service.edit_testset_revision( + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.fetch_testset_variant( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), # - testset_revision_edit=testset_revision_edit_request.testset_revision, - ) - - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, + testset_ref=testset_ref, ) - return testset_revision_response - - async def archive_testset_revision( - self, - request: Request, - *, - testset_revision_id: UUID, - ) -> TestsetRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_revision = await self.testsets_service.archive_testset_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - testset_revision_id=testset_revision_id, - ) + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset variant not found. Please check the ID and try again.", + ) - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, + testset_variant_ref = Reference( + id=testset_variant.id, ) - return testset_revision_response - - async def unarchive_testset_revision( - self, - request: Request, - *, - testset_revision_id: UUID, - ) -> TestsetRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_revision = await self.testsets_service.unarchive_testset_revision( + testset_revision: Optional[ + TestsetRevision + ] = await self.testsets_service.fetch_testset_revision( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), # - testset_revision_id=testset_revision_id, - ) - - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, + testset_variant_ref=testset_variant_ref, ) - return testset_revision_response - - async def query_testset_revisions( - self, - request: Request, - *, - testset_revision_query_request: TestsetRevisionQueryRequest, - ) -> TestsetRevisionsResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + if testset_revision is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset revision not found. Please check the ID and try again.", + ) - testset_revisions = await self.testsets_service.query_testset_revisions( - project_id=UUID(request.state.project_id), + simple_testset = SimpleTestset( + id=testset.id, + slug=testset.slug, # - testset_revision_query=testset_revision_query_request.testset_revision, - ) - - testset_revisions_response = TestsetRevisionsResponse( - count=len(testset_revisions), - testset_revisions=testset_revisions, - ) - - return testset_revisions_response - - async def commit_testset_revision( - self, - request: Request, - *, - testset_revision_commit_request: TestsetRevisionCommitRequest, - ) -> TestsetRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_revision = await self.testsets_service.commit_testset_revision( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), + created_at=testset.created_at, + updated_at=testset.updated_at, + deleted_at=testset.deleted_at, + created_by_id=testset.created_by_id, + updated_by_id=testset.updated_by_id, + deleted_by_id=testset.deleted_by_id, # - testset_revision_commit=testset_revision_commit_request.testset_revision_commit, + name=testset.name, + description=testset.description, + # + # flags = + tags=testset.tags, + meta=testset.meta, + # + data=testset_revision.data, ) - testset_revision_response = TestsetRevisionResponse( - count=1 if testset_revision else 0, - testset_revision=testset_revision, + simple_testset_response = SimpleTestsetResponse( + count=1, + testset=simple_testset, ) - return testset_revision_response + return simple_testset_response - async def log_testset_revisions( + @intercept_exceptions() + async def edit_simple_testset( self, - request: Request, *, - testset_log_request: TestsetLogRequest, - ) -> TestsetRevisionsResponse: + request: Request, + testset_id: UUID, + simple_testset_edit_request: SimpleTestsetEditRequest, + ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_EVALUATORS, # type: ignore + permission=Permission.EDIT_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore - - testset_revisions = await self.testsets_service.log_testset_revisions( - project_id=UUID(request.state.project_id), - # - testset_log=testset_log_request.testset, - ) - - testset_revisions_response = TestsetRevisionsResponse( - count=len(testset_revisions), - testset_revisions=testset_revisions, - ) - - return testset_revisions_response - - -class SimpleTestsetsRouter: - TESTCASES_FLAGS = TestsetFlags( - has_testcases=True, - has_traces=False, - ) - - def __init__( - self, - *, - simple_testsets_service: SimpleTestsetsService, - ): - self.simple_testsets_service = simple_testsets_service - - self.router = APIRouter() - - # SIMPLE TESTSETS ------------------------------------------------------ - - # POST /api/preview/simple/testsets/ - self.router.add_api_route( - "/", - self.create_simple_testset, - methods=["POST"], - operation_id="create_simple_testset", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) - - # GET /api/preview/simple/testsets/{testset_id} - self.router.add_api_route( - "/{testset_id}", - self.fetch_simple_testset, - methods=["GET"], - operation_id="fetch_simple_testset", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + raise FORBIDDEN_EXCEPTION - # PUT /api/preview/simple/testsets/{testset_id} - self.router.add_api_route( - "/{testset_id}", - self.edit_simple_testset, - methods=["PUT"], - operation_id="edit_simple_testset", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) - - # POST /api/preview/simple/testsets/{testset_id}/archive - self.router.add_api_route( - "/{testset_id}/archive", - self.archive_simple_testset, - methods=["POST"], - operation_id="archive_simple_testset", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + try: + testcases = simple_testset_edit_request.testset.data.testcases - # POST /api/preview/simple/testsets/{testset_id}/unarchive - self.router.add_api_route( - "/{testset_id}/unarchive", - self.unarchive_simple_testset, - methods=["POST"], - operation_id="unarchive_simple_testset", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + testcases_data = [testcase.data for testcase in testcases] - # POST /api/preview/simple/testsets/query - self.router.add_api_route( - "/query", - self.query_simple_testsets, - methods=["POST"], - operation_id="query_simple_testsets", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetsResponse, - response_model_exclude_none=True, - ) + testcases_data = json_array_to_json_object(data=testcases_data) - # POST /api/preview/simple/testsets/upload - self.router.add_api_route( - "/upload", - self.create_simple_testset_from_file, - methods=["POST"], - operation_id="create_simple_testset_from_file", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + validate_testset_limits(testcases_data) - # POST /api/preview/simple/testsets/{testset_id}/upload - self.router.add_api_route( - "/{testset_id}/upload", - self.edit_simple_testset_from_file, - methods=["POST"], - operation_id="edit_simple_testset_from_file", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + for i, testcase_data in enumerate(testcases_data.values()): + simple_testset_edit_request.testset.data.testcases[ + i + ].data = testcase_data - # POST /api/preview/simple/testsets/{testset_id}/download - self.router.add_api_route( - "/{testset_id}/download", - self.fetch_simple_testset_to_file, - methods=["POST"], - operation_id="fetch_simple_testset_to_file", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + except Exception as e: + raise HTTPException( + status_code=400, + detail=f"Failed to parse testcases as JSON array: {e}", + ) from e - # POST /api/preview/simple/testsets/{testset_id}/transfer - self.router.add_api_route( - "/{testset_id}/transfer", - self.transfer_simple_testset, - methods=["POST"], - operation_id="transfer_simple_testset", - status_code=status.HTTP_200_OK, - response_model=SimpleTestsetResponse, - response_model_exclude_none=True, - ) + try: + testset_revision_data = TestsetRevisionData( + testcases=testcases, + ) - # SIMPLE TESTSETS ---------------------------------------------------------- + except ValidationError as e: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=format_validation_error( + e, simple_testset_edit_request.model_dump() + ), + ) from e - @intercept_exceptions() - async def create_simple_testset( - self, - request: Request, - *, - testset_id: Optional[UUID] = None, - # - simple_testset_create_request: SimpleTestsetCreateRequest, - ) -> SimpleTestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + if str(testset_id) != str(simple_testset_edit_request.testset.id): + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"ID mismatch between path params and body params: {testset_id} != {simple_testset_edit_request.testset.id}", + ) - simple_testset = await self.simple_testsets_service.create( + testset_ref = Reference( + id=simple_testset_edit_request.testset.id, + ) + + testset: Optional[Testset] = await self.testsets_service.fetch_testset( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - testset_id=testset_id, # - simple_testset_create_request=simple_testset_create_request, + testset_ref=testset_ref, ) - simple_testset_response = SimpleTestsetResponse( - count=1 if simple_testset else 0, - testset=simple_testset, + if testset is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset not found. Please check the ID and try again.", + ) + + has_changes = ( + testset.name != simple_testset_edit_request.testset.name + or testset.description != simple_testset_edit_request.testset.description + or testset.tags != simple_testset_edit_request.testset.tags + or testset.meta != simple_testset_edit_request.testset.meta ) - return simple_testset_response + if has_changes: + _testset_edit = TestsetEdit( + id=testset.id, + # + name=simple_testset_edit_request.testset.name, + description=simple_testset_edit_request.testset.description, + # + # flags = + tags=simple_testset_edit_request.testset.tags, + meta=simple_testset_edit_request.testset.meta, + ) - @intercept_exceptions() - @suppress_exceptions(default=SimpleTestsetResponse()) - async def fetch_simple_testset( - self, - request: Request, - *, - testset_id: UUID, - ) -> SimpleTestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_TESTSETS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + testset: Optional[Testset] = await self.testsets_service.edit_testset( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + testset_edit=_testset_edit, + ) + + if testset is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to edit simple testset. Please try again or contact support.", + ) - testset = await self.simple_testsets_service.testsets_service.fetch_testset( + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.fetch_testset_variant( project_id=UUID(request.state.project_id), # - testset_ref=Reference(id=testset_id), + testset_ref=testset_ref, ) - if testset is None: - return SimpleTestsetResponse() + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset variant not found. Please check the ID and try again.", + ) - testset_variant = await self.simple_testsets_service.testsets_service.fetch_testset_variant( - project_id=UUID(request.state.project_id), - # - testset_ref=Reference(id=testset.id), + has_changes = ( + testset_variant.name != simple_testset_edit_request.testset.name + or testset_variant.description + != simple_testset_edit_request.testset.description + or testset_variant.tags != simple_testset_edit_request.testset.tags + or testset_variant.meta != simple_testset_edit_request.testset.meta ) - if testset_variant is None: - return SimpleTestsetResponse() + if has_changes: + _testset_variant_edit = TestsetVariant( + id=testset_variant.id, + # + name=simple_testset_edit_request.testset.name, + description=simple_testset_edit_request.testset.description, + # + # flags = + tags=simple_testset_edit_request.testset.tags, + meta=simple_testset_edit_request.testset.meta, + ) + + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.edit_testset_variant( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + testset_variant_edit=_testset_variant_edit, + ) + + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to edit simple testset variant. Please try again or contact support.", + ) + + testset_variant_ref = Reference( + id=testset_variant.id, + ) - testset_revision = await self.simple_testsets_service.testsets_service.fetch_testset_revision( + testset_revision: Optional[ + TestsetRevision + ] = await self.testsets_service.fetch_testset_revision( project_id=UUID(request.state.project_id), # - testset_variant_ref=Reference(id=testset_variant.id), + testset_variant_ref=testset_variant_ref, ) if testset_revision is None: - return SimpleTestsetResponse() + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset revisions not found. Please check the ID and try again.", + ) + + old_testcase_ids = [ + testcase.data for testcase in testset_revision.data.testcases + ] + + new_testcase_ids = [ + testcase.data + for testcase in simple_testset_edit_request.testset.data.testcases + ] + + has_changes = ( + testset_revision.name != simple_testset_edit_request.testset.name + or testset_revision.description + != simple_testset_edit_request.testset.description + or testset_revision.tags != simple_testset_edit_request.testset.tags + or testset_revision.meta != simple_testset_edit_request.testset.meta + or old_testcase_ids != new_testcase_ids + ) + + if has_changes: + testset_revision_slug = uuid4().hex + + _testset_revision_commit = TestsetRevisionCommit( + slug=testset_revision_slug, + # + name=simple_testset_edit_request.testset.name, + description=simple_testset_edit_request.testset.description, + # + # flags = + tags=simple_testset_edit_request.testset.tags, + meta=simple_testset_edit_request.testset.meta, + # + data=testset_revision_data, + # + testset_id=testset.id, + testset_variant_id=testset_variant.id, + ) + + testset_revision: Optional[ + TestsetRevision + ] = await self.testsets_service.commit_testset_revision( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + testset_revision_commit=_testset_revision_commit, + ) + + if testset_revision is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to edit simple testset revision. Please try again or contact support.", + ) simple_testset = SimpleTestset( id=testset.id, @@ -1202,72 +792,84 @@ async def fetch_simple_testset( ) simple_testset_response = SimpleTestsetResponse( - count=1 if simple_testset else 0, + count=1, testset=simple_testset, ) return simple_testset_response @intercept_exceptions() - async def edit_simple_testset( + async def archive_simple_testset( self, - request: Request, *, + request: Request, testset_id: UUID, - # - simple_testset_edit_request: SimpleTestsetEditRequest, ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore + permission=Permission.EDIT_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - if str(testset_id) != str(simple_testset_edit_request.testset.id): - return SimpleTestsetResponse() + testset_ref = Reference( + id=testset_id, + ) - simple_testset: Optional[ - SimpleTestset - ] = await self.simple_testsets_service.edit( + testset: Optional[Testset] = await self.testsets_service.fetch_testset( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), # - simple_testset_edit_request=simple_testset_edit_request, + testset_ref=testset_ref, ) - simple_testset_response = SimpleTestsetResponse( - count=1 if simple_testset else 0, - testset=simple_testset, + if testset is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset not found. Please check the ID and try again.", + ) + + testset: Optional[Testset] = await self.testsets_service.archive_testset( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + testset_id=testset_id, ) - return simple_testset_response + if testset is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to archive simple testset. Please try again or contact support.", + ) - @intercept_exceptions() - async def archive_simple_testset( - self, - request: Request, - *, - testset_id: UUID, - ) -> SimpleTestsetResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.fetch_testset_variant( + project_id=UUID(request.state.project_id), + # + testset_ref=testset_ref, + ) + + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Failed to fetch simple testset variant. Please try again or contact support.", + ) - testset = await self.simple_testsets_service.testsets_service.archive_testset( + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.archive_testset_variant( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # - testset_id=testset_id, + testset_variant_id=testset_variant.id, ) - if not testset: - return SimpleTestsetResponse() + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to archive simple testset variant. Please try again or contact support.", + ) simple_testset = SimpleTestset( id=testset.id, @@ -1289,7 +891,7 @@ async def archive_simple_testset( ) simple_testset_response = SimpleTestsetResponse( - count=1 if simple_testset else 0, + count=1, testset=simple_testset, ) @@ -1298,27 +900,75 @@ async def archive_simple_testset( @intercept_exceptions() async def unarchive_simple_testset( self, - request: Request, *, + request: Request, testset_id: UUID, ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore + permission=Permission.EDIT_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION + + testset_ref = Reference( + id=testset_id, + ) + + testset: Optional[Testset] = await self.testsets_service.fetch_testset( + project_id=UUID(request.state.project_id), + # + testset_ref=testset_ref, + ) + + if testset is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Simple testset not found. Please check the ID and try again.", + ) - testset = await self.simple_testsets_service.testsets_service.unarchive_testset( + testset: Optional[Testset] = await self.testsets_service.unarchive_testset( project_id=UUID(request.state.project_id), user_id=UUID(request.state.user_id), # testset_id=testset_id, ) - if not testset: - return SimpleTestsetResponse() + if testset is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to unarchive simple testset. Please try again or contact support.", + ) + + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.fetch_testset_variant( + project_id=UUID(request.state.project_id), + # + testset_ref=testset_ref, + ) + + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Failed to fetch simple testset variant. Please try again or contact support.", + ) + + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.unarchive_testset_variant( + project_id=UUID(request.state.project_id), + user_id=UUID(request.state.user_id), + # + testset_variant_id=testset_variant.id, + ) + + if testset_variant is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to unarchive simple testset variant. Please try again or contact support.", + ) simple_testset = SimpleTestset( id=testset.id, @@ -1340,7 +990,7 @@ async def unarchive_simple_testset( ) simple_testset_response = SimpleTestsetResponse( - count=1 if simple_testset else 0, + count=1, testset=simple_testset, ) @@ -1350,13 +1000,13 @@ async def unarchive_simple_testset( @suppress_exceptions(default=SimpleTestsetsResponse()) async def list_simple_testsets( self, + *, request: Request, ) -> SimpleTestsetsResponse: simple_testset_query_request = SimpleTestsetQueryRequest() return await self.query_simple_testsets( request=request, - # simple_testset_query_request=simple_testset_query_request, ) @@ -1364,19 +1014,19 @@ async def list_simple_testsets( @suppress_exceptions(default=SimpleTestsetsResponse()) async def query_simple_testsets( self, - request: Request, *, + request: Request, simple_testset_query_request: SimpleTestsetQueryRequest, ) -> SimpleTestsetsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_TESTSETS, # type: ignore + permission=Permission.VIEW_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - testsets = await self.simple_testsets_service.testsets_service.query_testsets( + testsets: List[Testset] = await self.testsets_service.query_testsets( project_id=UUID(request.state.project_id), # testset_query=simple_testset_query_request.testset, @@ -1388,22 +1038,40 @@ async def query_simple_testsets( windowing=simple_testset_query_request.windowing, ) + if testsets is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Failed to query simple testsets. Please try again or contact support.", + ) + simple_testsets: List[SimpleTestset] = [] for testset in testsets: - testset_variant = await self.simple_testsets_service.testsets_service.fetch_testset_variant( + testset_ref = Reference( + id=testset.id, + ) + + testset_variant: Optional[ + TestsetVariant + ] = await self.testsets_service.fetch_testset_variant( project_id=UUID(request.state.project_id), # - testset_ref=Reference(id=testset.id), + testset_ref=testset_ref, ) - if not testset_variant: + if testset_variant is None: continue - testset_revision = await self.simple_testsets_service.testsets_service.fetch_testset_revision( + testset_variant_ref = Reference( + id=testset_variant.id, + ) + + testset_revision: Optional[ + TestsetRevision + ] = await self.testsets_service.fetch_testset_revision( project_id=UUID(request.state.project_id), # - testset_variant_ref=Reference(id=testset_variant.id), + testset_variant_ref=testset_variant_ref, ) if testset_revision is None: @@ -1442,8 +1110,8 @@ async def query_simple_testsets( @intercept_exceptions() async def create_simple_testset_from_file( self, - request: Request, *, + request: Request, file: UploadFile = File(...), file_type: Literal["csv", "json"] = Form("csv"), testset_slug: Optional[str] = Form(None), @@ -1453,26 +1121,27 @@ async def create_simple_testset_from_file( testset_meta: Optional[str] = Form(None), ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore + permission=Permission.EDIT_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION if file_type is None or file_type not in ["csv", "json"]: + log.error(e) raise HTTPException( status_code=400, detail="Invalid file type. Supported types are 'csv' and 'json'.", ) - if (file.size or 0) > TESTSETS_SIZE_LIMIT: # Preemptively check file size + if file.size > TESTSETS_SIZE_LIMIT: # Preemptively check file size raise TESTSETS_SIZE_EXCEPTION # deserialize tags and meta if provided try: - _testset_tags = loads(testset_tags) if testset_tags else None - _testset_meta = loads(testset_meta) if testset_meta else None + testset_tags = loads(testset_tags) if testset_tags else None + testset_meta = loads(testset_meta) if testset_meta else None except JSONDecodeError as e: log.error(e) raise HTTPException( @@ -1481,7 +1150,7 @@ async def create_simple_testset_from_file( ) from e testcases = [] - testcases_data = {} + testcases_data: Dict[str, list] = {} if file_type.lower() == "json": try: @@ -1516,7 +1185,6 @@ async def create_simple_testset_from_file( testcase_id_key="__id__", testcase_dedup_id_key="__dedup_id__", ) - validate_testset_limits(testcases_data) for testcase_data in testcases_data.values(): @@ -1554,14 +1222,14 @@ async def create_simple_testset_from_file( simple_testset_create_request = SimpleTestsetCreateRequest( testset=SimpleTestsetCreate( - slug=testset_slug or uuid4().hex[-12:], + slug=testset_slug or uuid4().hex, # name=testset_name or testset_slug or None, description=testset_description, # # flags = - tags=_testset_tags, - meta=_testset_meta, + tags=testset_tags, + meta=testset_meta, # data=testset_revision_data, ) @@ -1575,10 +1243,9 @@ async def create_simple_testset_from_file( @intercept_exceptions() async def edit_simple_testset_from_file( self, - request: Request, *, + request: Request, testset_id: UUID, - # file: UploadFile = File(...), file_type: Literal["csv", "json"] = Form("csv"), testset_name: Optional[str] = File(None), @@ -1587,12 +1254,12 @@ async def edit_simple_testset_from_file( testset_meta: Optional[str] = Form(None), ) -> SimpleTestsetResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore + permission=Permission.EDIT_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION if file_type is None or file_type not in ["csv", "json"]: raise HTTPException( @@ -1600,13 +1267,13 @@ async def edit_simple_testset_from_file( detail="Invalid file type. Supported types are 'CSV' and 'JSON'.", ) - if (file.size or 0) > TESTSETS_SIZE_LIMIT: # Preemptively check file size + if file.size > TESTSETS_SIZE_LIMIT: # Preemptively check file size raise TESTSETS_SIZE_EXCEPTION # deserialize tags and meta if provided try: - _testset_tags = loads(testset_tags) if testset_tags else None - _testset_meta = loads(testset_meta) if testset_meta else None + testset_tags = loads(testset_tags) if testset_tags else None + testset_meta = loads(testset_meta) if testset_meta else None except JSONDecodeError as e: raise HTTPException( status_code=400, @@ -1614,11 +1281,11 @@ async def edit_simple_testset_from_file( ) from e testcases = [] - testcases_data = {} + testcases_data: Dict[str, list] = {} if file_type.lower() == "json": try: - testcases_data = await json_file_to_json_array(json_file=file) + testcases_data = await json_file_to_json_array(file) except Exception as e: raise HTTPException( @@ -1628,7 +1295,7 @@ async def edit_simple_testset_from_file( elif file_type.lower() == "csv": try: - testcases_data = await csv_file_to_json_array(csv_file=file) + testcases_data = await csv_file_to_json_array(file) except Exception as e: raise HTTPException( @@ -1702,8 +1369,8 @@ async def edit_simple_testset_from_file( or simple_testset_response.testset.description, # # flags = - tags=_testset_tags or simple_testset_response.testset.tags, - meta=_testset_meta or simple_testset_response.testset.meta, + tags=testset_tags or simple_testset_response.testset.tags, + meta=testset_meta or simple_testset_response.testset.meta, # data=testset_revision_data, ) @@ -1711,29 +1378,26 @@ async def edit_simple_testset_from_file( return await self.edit_simple_testset( request=request, - # testset_id=testset_id, - # simple_testset_edit_request=simple_testset_edit_request, ) @intercept_exceptions() async def fetch_simple_testset_to_file( self, - request: Request, *, + request: Request, testset_id: UUID, - # file_type: Optional[Literal["csv", "json"]] = None, file_name: Optional[str] = None, - ) -> StreamingResponse: # type: ignore + ) -> StreamingResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_TESTSETS, # type: ignore + permission=Permission.VIEW_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION if file_type is None or file_type not in ["csv", "json"]: raise HTTPException( @@ -1743,11 +1407,10 @@ async def fetch_simple_testset_to_file( simple_testset_response = await self.fetch_simple_testset( request=request, - # testset_id=testset_id, ) - if not simple_testset_response.count and not simple_testset_response.testset: + if simple_testset_response.count == 0: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Simple testset not found. Please check the testset_id and try again.", @@ -1766,7 +1429,7 @@ async def fetch_simple_testset_to_file( "__tags__": testcase.tags, "__meta__": testcase.meta, } - for testcase in testcases or [] + for testcase in testcases ] if file_type.lower() == "json": @@ -1789,38 +1452,137 @@ async def fetch_simple_testset_to_file( headers={"Content-Disposition": f"attachment; filename={filename}"}, ) - else: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Invalid file type. Supported types are 'csv' and 'json'.", - ) + @intercept_exceptions() + @suppress_exceptions(default=TestcaseResponse()) + async def fetch_testcase( + self, + *, + request: Request, + testcase_id: UUID, + ) -> TestcaseResponse: + if is_ee(): + if not await check_action_access( + user_uid=request.state.user_id, + project_id=request.state.project_id, + permission=Permission.VIEW_TESTSETS, + ): + raise FORBIDDEN_EXCEPTION + + testcases = await self.testsets_service.testcases_service.fetch_testcases( + project_id=UUID(request.state.project_id), + # + testcase_ids=[testcase_id], + ) + + testcase_response = TestcaseResponse( + count=1 if len(testcases) > 0 else 0, + testcase=testcases[0] if len(testcases) > 0 else None, + ) + + return testcase_response @intercept_exceptions() - @suppress_exceptions(default=SimpleTestsetResponse()) - async def transfer_simple_testset( + @suppress_exceptions(default=TestcasesResponse()) + async def list_testcases( self, + *, request: Request, + ) -> TestcasesResponse: + testcase_query_request = TestcasesQueryRequest() + + return await self.query_testcases( + request=request, + testcases_query_request=testcase_query_request, + ) + + @intercept_exceptions() + @suppress_exceptions(default=TestcasesResponse()) + async def query_testcases( + self, *, - testset_id: UUID, - ) -> SimpleTestsetResponse: + request: Request, + testcases_query_request: TestcasesQueryRequest, + ) -> TestcasesResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_TESTSETS, # type: ignore + permission=Permission.VIEW_TESTSETS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - simple_testset = await self.simple_testsets_service.transfer( + testcases = await self.testsets_service.testcases_service.fetch_testcases( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), # - testset_id=testset_id, + testcase_ids=testcases_query_request.testcase_ids, + # + testset_id=testcases_query_request.testset_id, + # + windowing=testcases_query_request.windowing, ) - simple_testset_response = SimpleTestsetResponse( - count=1 if simple_testset else 0, - testset=simple_testset, + testcase_response = TestcasesResponse( + count=len(testcases), + testcases=testcases if testcases else [], ) - return simple_testset_response + return testcase_response + + @intercept_exceptions() + async def transfer_testset( + self, + *, + request: Request, + testset_id: UUID, + ) -> SimpleTestsetResponse: + old_testset = await fetch_testset_by_id( + testset_id=str(testset_id), + ) + + if old_testset is None: + return None + + testcases_data = old_testset.csvdata + + testcases = [Testcase(data=testcase_data) for testcase_data in testcases_data] + + new_testset = await self.testsets_service.fetch_testset( + project_id=UUID(request.state.project_id), + testset_ref=Reference(id=testset_id), + ) + + if not new_testset: + slug = uuid4().hex + + simple_testset_create_request = SimpleTestsetCreateRequest( + testset=SimpleTestsetCreate( + slug=slug, + name=old_testset.name, + data=TestsetRevisionData( + testcases=testcases, + ), + ) + ) + + return await self.create_simple_testset( + request=request, + simple_testset_create_request=simple_testset_create_request, + testset_id=testset_id, + ) + + else: + simple_testset_edit_request = SimpleTestsetEditRequest( + testset=SimpleTestsetEdit( + id=testset_id, + name=old_testset.name, + data=TestsetRevisionData( + testcases=testcases, + ), + ) + ) + + return await self.edit_simple_testset( + request=request, + testset_id=testset_id, + simple_testset_edit_request=simple_testset_edit_request, + ) diff --git a/api/oss/src/apis/fastapi/testsets/utils.py b/api/oss/src/apis/fastapi/testsets/utils.py index 46c77b0d80..a5ec5ec517 100644 --- a/api/oss/src/apis/fastapi/testsets/utils.py +++ b/api/oss/src/apis/fastapi/testsets/utils.py @@ -1,686 +1,363 @@ -from typing import Optional, Literal, List -from uuid import UUID -from datetime import datetime +from typing import Optional, List, Dict, Any +from json import loads, dumps +from uuid import UUID, uuid4 +from io import BytesIO -from fastapi import Query + +import orjson +import pandas + +from fastapi import Query, HTTPException from oss.src.utils.logging import get_module_logger +from oss.src.core.shared.dtos import Reference, Meta +from oss.src.core.testsets.dtos import TestsetFlags -from oss.src.core.shared.dtos import ( - Windowing, - Reference, -) -from oss.src.core.testsets.dtos import ( - TestsetFlags, - # - TestsetQuery, - TestsetVariantQuery, - TestsetRevisionQuery, -) +from oss.src.apis.fastapi.testsets.models import SimpleTestsetQuery as TestsetQuery + + +log = get_module_logger(__name__) + + +TESTSETS_COUNT_LIMIT = 10 * 1_000 # 10,000 testcases per testset +TESTSETS_SIZE_LIMIT = 10 * 1024 * 1024 # 10 MB per testset -from oss.src.apis.fastapi.shared.utils import ( - parse_metadata, +TESTSETS_COUNT_WARNING = f"Test set exceeds the maximum count of {TESTSETS_COUNT_LIMIT} test cases per test set." +TESTSETS_SIZE_WARNING = f"Test set exceeds the maximum size of {TESTSETS_SIZE_LIMIT // (1024 * 1024)} MB per test set." + +TESTSETS_SIZE_EXCEPTION = HTTPException( + status_code=400, + detail=TESTSETS_SIZE_WARNING, ) -from oss.src.apis.fastapi.testsets.models import ( - TestsetQueryRequest, - TestsetVariantQueryRequest, - TestsetRevisionQueryRequest, - TestsetRevisionRetrieveRequest, + +TESTSETS_COUNT_EXCEPTION = HTTPException( + status_code=400, + detail=TESTSETS_COUNT_WARNING, ) -log = get_module_logger(__name__) +def validate_testset_limits(rows: List[dict]) -> tuple[int, int]: + i = -1 + total_size = 2 + for i, row in enumerate(rows): + row_str = dumps(row) + total_size += len(row_str.encode("utf-8")) + if i > 0: + total_size += 1 + if i + 1 > TESTSETS_COUNT_LIMIT: + log.error(TESTSETS_COUNT_WARNING) + raise TESTSETS_COUNT_EXCEPTION + if total_size > TESTSETS_SIZE_LIMIT: + log.error(TESTSETS_SIZE_WARNING) + raise TESTSETS_SIZE_EXCEPTION + return i + 1, total_size -def parse_testset_query_request_from_params( - testset_id: Optional[UUID] = Query(None), - testset_ids: Optional[List[UUID]] = Query(None), - testset_slug: Optional[str] = Query(None), - testset_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # +def format_validation_error(e, request_body=None): + formatted_errors = [] + + for error in e.errors(): + loc = error.get("loc", []) + + if not loc or loc[0] != "body": + loc = ["body"] + list(loc) + + error_detail = { + "type": error.get("type", "value_error"), + "loc": loc, + "msg": error.get("msg", "Validation error"), + } + + if "input" in error: + error_detail["input"] = error.get("input") + elif request_body is not None: + error_detail["input"] = request_body + + formatted_errors.append(error_detail) + + return formatted_errors + + +def parse_testset_query_request( + testset_ref: Optional[str] = Query( + None, + description='JSON string of ref, e.g. {"key": value}', + ), + testset_flags: Optional[str] = Query( + None, description='JSON string of flags, e.g. {"key": value}' + ), + testset_meta: Optional[str] = Query( + None, description='JSON string of meta, e.g. {"key": value}' + ), include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> TestsetQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = TestsetFlags(**_flags) if _flags else None # type: ignore - - testset = ( - TestsetQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) +) -> TestsetQuery: + if testset_ref: + try: + testset_ref = Reference(**loads(testset_ref)) + except Exception: # pylint: disable=broad-except + testset_ref = None - testset_refs = ( - ( - [ - Reference( - id=testset_id, - slug=testset_slug, - ) - ] - if testset_id or testset_slug - else [] - ) - + ( - [ - Reference( - id=testset_id, - slug=testset_slug, - ) - for testset_id, testset_slug in zip( - testset_ids, - testset_slugs, - ) - ] - if testset_ids and testset_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) + log.error("Failed to parse testset_ref (%s)", testset_ref) + + if testset_flags: + try: + testset_flags = TestsetFlags(**loads(testset_flags)) + except Exception: # pylint: disable=broad-except + testset_flags = None + + log.error("Failed to parse testset_flags (%s)", testset_flags) + + if testset_meta: + try: + testset_meta = loads(testset_meta) + except Exception: # pylint: disable=broad-except + testset_meta = None + + log.error(f"Failed to parse testset_meta ({testset_meta})") - return parse_testset_query_request_from_body( - testset=testset, + return parse_testset_body_request( + testset_ref=testset_ref, # - testset_refs=testset_refs, + testset_flags=testset_flags, + testset_meta=testset_meta, # include_archived=include_archived, - # - windowing=windowing, ) -def parse_testset_query_request_from_body( - testset: Optional[TestsetQuery] = None, +def parse_testset_body_request( + testset_ref: Optional[Reference] = None, # - testset_refs: Optional[List[Reference]] = None, + testset_flags: Optional[TestsetFlags] = None, + testset_meta: Optional[Meta] = None, # include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> TestsetQueryRequest: - testset_query_request = None +) -> TestsetQuery: + _query = None try: - testset_query_request = TestsetQueryRequest( - testset=testset, + _query = TestsetQuery( + testset_ref=testset_ref, # - testset_refs=testset_refs, + flags=testset_flags, + meta=testset_meta, # include_archived=include_archived, - # - windowing=windowing, ) except Exception as e: # pylint: disable=broad-except - testset_query_request = TestsetQueryRequest() - - return testset_query_request - + log.warn("Error parsing testset body request: %s", e) + + _query = None + + return _query + + +def parse_variant_query_request( + testset_ref: Optional[str] = Query( + None, + description='JSON string of reference, e.g. {"key": value}', + ), + variant_ref: Optional[str] = Query( + None, + description='JSON string of reference, e.g. {"key": value}', + ), + variant_meta: Optional[str] = Query( + None, description='JSON string of meta, e.g. {"key": value}' + ), + variant_flags: Optional[str] = Query( + None, description='JSON string of flags, e.g. {"key": value}' + ), + include_archived: Optional[bool] = Query(None), +) -> TestsetQuery: + if testset_ref: + try: + testset_ref = Reference(**loads(testset_ref)) + except Exception: # pylint: disable=broad-except + testset_ref = None -def merge_testset_query_requests( - query_request_params: Optional[TestsetQueryRequest] = None, - query_request_body: Optional[TestsetQueryRequest] = None, -) -> TestsetQueryRequest: - if query_request_params and not query_request_body: - return query_request_params + log.error("Failed to parse testset_ref (%s)", testset_ref) - if not query_request_params and query_request_body: - return query_request_body + if variant_ref: + try: + variant_ref = Reference(**loads(variant_ref)) + except Exception: # pylint: disable=broad-except + variant_ref = None - if query_request_params and query_request_body: - return TestsetQueryRequest( - testset=query_request_body.testset or query_request_params.testset, - # - testset_refs=query_request_body.testset_refs - or query_request_params.testset_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) + log.error("Failed to parse variant_ref (%s)", variant_ref) - return TestsetQueryRequest() + if variant_flags: + try: + variant_flags = TestsetFlags(**loads(variant_flags)) + except Exception: # pylint: disable=broad-except + variant_flags = None + log.error("Failed to parse variant_flags (%s)", variant_flags) -def parse_testset_variant_query_request_from_params( - testset_id: Optional[UUID] = Query(None), - testset_ids: Optional[List[UUID]] = Query(None), - testset_slug: Optional[str] = Query(None), - testset_slugs: Optional[List[str]] = Query(None), - # - testset_variant_id: Optional[UUID] = Query(None), - testset_variant_ids: Optional[List[UUID]] = Query(None), - testset_variant_slug: Optional[str] = Query(None), - testset_variant_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> TestsetVariantQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = TestsetFlags(**_flags) if _flags else None # type: ignore - - testset_variant = ( - TestsetVariantQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) + if variant_meta: + try: + variant_meta = loads(variant_meta) + except Exception: # pylint: disable=broad-except + variant_meta = None - testset_refs = ( - ( - [ - Reference( - id=testset_id, - slug=testset_slug, - ) - ] - if testset_id or testset_slug - else [] - ) - + ( - [ - Reference( - id=testset_id, - slug=testset_slug, - ) - for testset_id, testset_slug in zip( - testset_ids, - testset_slugs, - ) - ] - if testset_ids and testset_slugs - else [] - ) - ) or None - - testset_variant_refs = ( - ( - [ - Reference( - id=testset_variant_id, - slug=testset_variant_slug, - ) - ] - if testset_variant_id or testset_variant_slug - else [] - ) - + ( - [ - Reference( - id=testset_variant_id, - slug=testset_variant_slug, - ) - for testset_variant_id, testset_variant_slug in zip( - testset_variant_ids, - testset_variant_slugs, - ) - ] - if testset_variant_ids and testset_variant_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) + log.error(f"Failed to parse variant_meta ({variant_meta})") - return parse_testset_variant_query_request_from_body( - testset_variant=testset_variant, + return parse_variant_body_request( + testset_ref=testset_ref, + variant_ref=variant_ref, # - testset_refs=testset_refs or None, - testset_variant_refs=testset_variant_refs or None, + variant_flags=variant_flags, + variant_meta=variant_meta, # include_archived=include_archived, - # - windowing=windowing, ) -def parse_testset_variant_query_request_from_body( - testset_variant: Optional[TestsetVariantQuery] = None, +def parse_variant_body_request( + testset_ref: Optional[Reference] = None, + variant_ref: Optional[Reference] = None, # - testset_refs: Optional[List[Reference]] = None, - testset_variant_refs: Optional[List[Reference]] = None, + variant_flags: Optional[TestsetFlags] = None, + variant_meta: Optional[Meta] = None, # include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> TestsetVariantQueryRequest: - testset_variant_query_request = None +) -> TestsetQuery: + _query = None try: - testset_variant_query_request = TestsetVariantQueryRequest( - testset_variant=testset_variant, + _query = TestsetQuery( + artifact_ref=testset_ref, + variant_ref=variant_ref, # - testset_refs=testset_refs, - testset_variant_refs=testset_variant_refs, + flags=variant_flags, + meta=variant_meta, # include_archived=include_archived, - # - windowing=windowing, ) except Exception as e: # pylint: disable=broad-except - testset_variant_query_request = TestsetVariantQueryRequest() - - return testset_variant_query_request - - -def merge_testset_variant_query_requests( - query_request_params: Optional[TestsetVariantQueryRequest] = None, - query_request_body: Optional[TestsetVariantQueryRequest] = None, -) -> TestsetVariantQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - - if not query_request_params and query_request_body: - return query_request_body + log.warn("Error parsing variant body request: %s", e) + + _query = None + + return _query + + +def parse_revision_query_request( + variant_ref: Optional[str] = Query( + None, + description='JSON string of ref, e.g. {"key": value}', + ), + revision_ref: Optional[str] = Query( + None, + description='JSON string of ref, e.g. {"key": value}', + ), + revision_meta: Optional[str] = Query( + None, description='JSON string of meta, e.g. {"key": value}' + ), + revision_flags: Optional[str] = Query( + None, description='JSON string of flags, e.g. {"key": value}' + ), + include_archived: Optional[bool] = Query(None), +) -> TestsetQuery: + if variant_ref: + try: + variant_ref = Reference(**loads(variant_ref)) + except Exception: # pylint: disable=broad-except + variant_ref = None - if query_request_params and query_request_body: - return TestsetVariantQueryRequest( - testset_variant=query_request_body.testset_variant - or query_request_params.testset_variant, - # - testset_refs=query_request_body.testset_refs - or query_request_params.testset_refs, - testset_variant_refs=query_request_body.testset_variant_refs - or query_request_params.testset_variant_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) + log.error("Failed to parse variant_ref (%s)", variant_ref) - return TestsetVariantQueryRequest() + if revision_ref: + try: + revision_ref = Reference(**loads(revision_ref)) + except Exception: # pylint: disable=broad-except + revision_ref = None + log.error("Failed to parse revision_ref (%s)", revision_ref) -def parse_testset_revision_query_request_from_params( - testset_id: Optional[UUID] = Query(None), - testset_ids: Optional[List[UUID]] = Query(None), - testset_slug: Optional[str] = Query(None), - testset_slugs: Optional[List[str]] = Query(None), - # - testset_variant_id: Optional[UUID] = Query(None), - testset_variant_ids: Optional[List[UUID]] = Query(None), - testset_variant_slug: Optional[str] = Query(None), - testset_variant_slugs: Optional[List[str]] = Query(None), - # - testset_revision_id: Optional[UUID] = Query(None), - testset_revision_ids: Optional[List[UUID]] = Query(None), - testset_revision_slug: Optional[str] = Query(None), - testset_revision_slugs: Optional[List[str]] = Query(None), - testset_revision_version: Optional[str] = Query(None), - testset_revision_versions: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # - flags: Optional[str] = Query(None), - tags: Optional[str] = Query(None), - meta: Optional[str] = Query(None), - # - include_archived: Optional[bool] = Query(None), - # - next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), - limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), -) -> TestsetRevisionQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) - - __flags = TestsetFlags(**_flags) if _flags else None # type: ignore - - testset_revision = ( - TestsetRevisionQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) + if revision_flags: + try: + revision_flags = TestsetFlags(**loads(revision_flags)) + except Exception: # pylint: disable=broad-except + revision_flags = None - testset_refs = ( - [ - Reference( - id=testset_id, - slug=testset_slug, - ) - ] - if testset_id or testset_slug - else [] - ) + ( - [ - Reference( - id=testset_id, - slug=testset_slug, - ) - for testset_id, testset_slug in zip( - testset_ids, - testset_slugs, - ) - ] - if testset_ids and testset_slugs - else [] - ) + log.error("Failed to parse revision_flags (%s)", revision_flags) - testset_variant_refs = ( - [ - Reference( - id=testset_variant_id, - slug=testset_variant_slug, - ) - ] - if testset_variant_id or testset_variant_slug - else [] - ) + ( - [ - Reference( - id=testset_variant_id, - slug=testset_variant_slug, - ) - for testset_variant_id, testset_variant_slug in zip( - testset_variant_ids, - testset_variant_slugs, - ) - ] - if testset_variant_ids and testset_variant_slugs - else [] - ) + if revision_meta: + try: + revision_meta = loads(revision_meta) + except Exception: # pylint: disable=broad-except + revision_meta = None - testset_revision_refs = ( - [ - Reference( - id=testset_revision_id, - slug=testset_revision_slug, - version=testset_revision_version, - ) - ] - if testset_revision_id or testset_revision_slug or testset_revision_version - else [] - ) + ( - [ - Reference( - id=testset_revision_id, - slug=testset_revision_slug, - version=testset_revision_version, - ) - for testset_revision_id, testset_revision_slug, testset_revision_version in zip( - testset_revision_ids, - testset_revision_slugs, - testset_revision_versions, - ) - ] - if testset_revision_ids and testset_revision_slugs and testset_revision_versions - else [] - ) + log.error(f"Failed to parse revision_meta ({revision_meta})") - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) - - return parse_testset_revision_query_request_from_body( - testset_revision=testset_revision, + return parse_revision_body_request( + variant_ref=variant_ref, + revision_ref=revision_ref, # - testset_refs=testset_refs, - testset_variant_refs=testset_variant_refs, - testset_revision_refs=testset_revision_refs, + revision_flags=revision_flags, + revision_meta=revision_meta, # include_archived=include_archived, - # - windowing=windowing, ) -def parse_testset_revision_query_request_from_body( - testset_revision: Optional[TestsetRevisionQuery] = None, +def parse_revision_body_request( + variant_ref: Optional[Reference] = None, + revision_ref: Optional[Reference] = None, # - testset_refs: Optional[List[Reference]] = None, - testset_variant_refs: Optional[List[Reference]] = None, - testset_revision_refs: Optional[List[Reference]] = None, + revision_flags: Optional[TestsetFlags] = None, + revision_meta: Optional[Meta] = None, # include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, -) -> TestsetRevisionQueryRequest: - testset_revision_query_request = None +) -> TestsetQuery: + _query = None try: - testset_revision_query_request = TestsetRevisionQueryRequest( - testset_revision=testset_revision, + _query = TestsetQuery( + variant_ref=variant_ref, + revision_ref=revision_ref, # - testset_refs=testset_refs, - testset_variant_refs=testset_variant_refs, - testset_revision_refs=testset_revision_refs, + flags=revision_flags, + meta=revision_meta, # include_archived=include_archived, - # - windowing=windowing, ) - except Exception as e: # pylint: disable=broad-except log.warn(e) - testset_revision_query_request = TestsetRevisionQueryRequest() - - return testset_revision_query_request + _query = None + return _query -def merge_testset_revision_query_requests( - query_request_params: Optional[TestsetRevisionQueryRequest] = None, - query_request_body: Optional[TestsetRevisionQueryRequest] = None, -) -> TestsetRevisionQueryRequest: - if query_request_params and not query_request_body: - return query_request_params - if not query_request_params and query_request_body: - return query_request_body +def merge_requests( + query_param: Optional[TestsetQuery] = None, + query_body: Optional[TestsetQuery] = None, +) -> TestsetQuery: + if query_body is None: + return query_param - if query_request_params and query_request_body: - return TestsetRevisionQueryRequest( - testset_revision=query_request_body.testset_revision - or query_request_params.testset_revision, - # - testset_refs=query_request_body.testset_refs - or query_request_params.testset_refs, - testset_variant_refs=query_request_body.testset_variant_refs - or query_request_params.testset_variant_refs, - testset_revision_refs=query_request_body.testset_revision_refs - or query_request_params.testset_revision_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) + if query_param is None: + return query_body - return TestsetRevisionQueryRequest() - - -def parse_testset_revision_retrieve_request_from_params( - testset_id: Optional[UUID] = Query(None), - testset_slug: Optional[str] = Query(None), - # - testset_variant_id: Optional[UUID] = Query(None), - testset_variant_slug: Optional[str] = Query(None), - # - testset_revision_id: Optional[UUID] = Query(None), - testset_revision_slug: Optional[str] = Query(None), - testset_revision_version: Optional[str] = Query(None), -): - testset_ref = ( - Reference( - id=testset_id, - slug=testset_slug, - ) - if testset_id or testset_slug - else None - ) - - testset_variant_ref = ( - Reference( - id=testset_variant_id, - slug=testset_variant_slug, - ) - if testset_variant_id or testset_variant_slug - else None - ) - - testset_revision_ref = ( - Reference( - id=testset_revision_id, - slug=testset_revision_slug, - version=testset_revision_version, - ) - if testset_revision_id or testset_revision_slug or testset_revision_version - else None - ) - - return parse_testset_revision_retrieve_request_from_body( - testset_ref=testset_ref, - testset_variant_ref=testset_variant_ref, - testset_revision_ref=testset_revision_ref, - ) - - -def parse_testset_revision_retrieve_request_from_body( - testset_ref: Optional[Reference] = None, - testset_variant_ref: Optional[Reference] = None, - testset_revision_ref: Optional[Reference] = None, -) -> TestsetRevisionRetrieveRequest: - return TestsetRevisionRetrieveRequest( - testset_ref=testset_ref, - testset_variant_ref=testset_variant_ref, - testset_revision_ref=testset_revision_ref, + return TestsetQuery( + artifact_ref=query_body.artifact_ref or query_param.artifact_ref, + variant_ref=query_body.variant_ref or query_param.variant_ref, + revision_ref=query_body.revision_ref or query_param.revision_ref, + # + flags=query_body.flags or query_param.flags, + meta=query_body.meta or query_param.meta, + # + include_archived=query_body.include_archived or query_param.include_archived, ) -# ---------------------------------------------------------------------------- # - -from typing import Dict, Any -from uuid import uuid4 -from json import loads, dumps -from io import BytesIO -from hashlib import blake2b as digest - -import orjson -import pandas - -from fastapi import HTTPException - -from oss.src.core.blobs.utils import compute_blob_id - - -TESTSETS_COUNT_LIMIT = 10 * 1_000 # 10,000 testcases per testset -TESTSETS_SIZE_LIMIT = 10 * 1024 * 1024 # 10 MB per testset - -TESTSETS_COUNT_WARNING = f"Testset exceeds the maximum count of {TESTSETS_COUNT_LIMIT} testcases per testset." -TESTSETS_SIZE_WARNING = f"Testset exceeds the maximum size of {TESTSETS_SIZE_LIMIT // (1024 * 1024)} MB per testset." - -TESTSETS_SIZE_EXCEPTION = HTTPException( - status_code=400, - detail=TESTSETS_SIZE_WARNING, -) - -TESTSETS_COUNT_EXCEPTION = HTTPException( - status_code=400, - detail=TESTSETS_COUNT_WARNING, -) - - -def validate_testset_limits(rows: List[dict]) -> tuple[int, int]: - i = -1 - total_size = 2 - for i, row in enumerate(rows): - row_str = dumps(row) - total_size += len(row_str.encode("utf-8")) - if i > 0: - total_size += 1 - if i + 1 > TESTSETS_COUNT_LIMIT: - log.error(TESTSETS_COUNT_WARNING) - raise TESTSETS_COUNT_EXCEPTION - if total_size > TESTSETS_SIZE_LIMIT: - log.error(TESTSETS_SIZE_WARNING) - raise TESTSETS_SIZE_EXCEPTION - return i + 1, total_size - - -def to_uuid(id, data): +def to_uuid(value): """Ensure value is a valid UUID; generate a new one if missing/invalid.""" try: - return str(UUID(str(id))) # Convert valid UUID to string + return str(UUID(str(value))) # Convert valid UUID to string except ValueError: - return str(compute_blob_id(blob_data=data)) + return str(uuid4()) # Generate a new UUID async def json_file_to_json_array( @@ -742,30 +419,19 @@ def json_array_to_json_object( transformed_data = {} - for testcase_idx, testcase_data in enumerate(data): - if not isinstance(testcase_data, dict): + for obj in data: + if not isinstance(obj, dict): continue # Ignore non-dict entries - testcase_dedup_id = testcase_data.pop(testcase_dedup_id_key, None) - - testcase_id_str = testcase_data.pop(testcase_id_key, None) - - testcase_id = to_uuid(testcase_id_str, testcase_data) - - testcase_dedup_id = ( - testcase_dedup_id - or digest( - f"{testcase_id}:{testcase_idx}".encode(), - digest_size=6, - ).hexdigest() - ) + # Remove `testcase_id` after extracting it + testcase_id = to_uuid(obj.pop(testcase_id_key, None)) if testcase_dedup_id_key is not None: - testcase_data[testcase_dedup_id_key] = testcase_dedup_id - - testcase_id = to_uuid(testcase_id_str, testcase_data) + # Set `testcase_dedup_id` to a new UUID if not present + testcase_dedup_id = obj.pop(testcase_dedup_id_key, uuid4().hex[-12:]) + obj[testcase_dedup_id_key] = testcase_dedup_id - transformed_data[testcase_id] = testcase_data + transformed_data[testcase_id] = obj # Store object without `testcase_id` return transformed_data @@ -860,8 +526,7 @@ def json_array_to_csv_file( def csv_data_to_json_array( - csv_data: List[Dict[str, Any]], - column_types: Dict[str, type] = {}, + csv_data: List[Dict[str, Any]], column_types: Dict[str, type] = None ) -> List[Dict[str, Any]]: """ Converts CSV-like data (list of dictionaries) into a JSON array, preserving JSON types if specified. @@ -877,7 +542,7 @@ def csv_data_to_json_array( isinstance(row, dict) for row in csv_data ): print("Error: Expected a list of dictionaries (CSV-like structure).") - return [] + return None # Convert column types if specified if column_types: diff --git a/api/oss/src/apis/fastapi/tracing/models.py b/api/oss/src/apis/fastapi/tracing/models.py index a5b4f3f0b5..2caa8e23f0 100644 --- a/api/oss/src/apis/fastapi/tracing/models.py +++ b/api/oss/src/apis/fastapi/tracing/models.py @@ -2,6 +2,7 @@ from pydantic import BaseModel +from oss.src.apis.fastapi.shared.models import VersionedModel from oss.src.core.tracing.dtos import ( OTelLink, # needed for annotations at the moment OTelLinks, @@ -9,9 +10,6 @@ OTelFlatSpans, OTelTraceTree, Bucket, - MetricsBucket, - TracingQuery, - MetricSpec, ) @@ -20,25 +18,17 @@ class OTelTracingRequest(BaseModel): traces: Optional[OTelTraceTree] = None -class OTelLinksResponse(BaseModel): +class OTelLinksResponse(VersionedModel): count: int = 0 links: Optional[OTelLinks] = None -class OTelTracingResponse(BaseModel): +class OTelTracingResponse(VersionedModel): count: int = 0 spans: Optional[OTelFlatSpans] = None traces: Optional[OTelTraceTree] = None -class OldAnalyticsResponse(BaseModel): - count: int = 0 +class AnalyticsResponse(VersionedModel): + count: Optional[int] = None buckets: List[Bucket] = [] - - -class AnalyticsResponse(BaseModel): - count: int = 0 - buckets: List[MetricsBucket] = [] - # - query: TracingQuery = TracingQuery() - specs: List[MetricSpec] = [] diff --git a/api/oss/src/apis/fastapi/tracing/router.py b/api/oss/src/apis/fastapi/tracing/router.py index 72faaed9d6..3e986a9649 100644 --- a/api/oss/src/apis/fastapi/tracing/router.py +++ b/api/oss/src/apis/fastapi/tracing/router.py @@ -1,4 +1,4 @@ -from typing import Optional, List, Tuple, Dict, Union +from typing import Union, Optional from uuid import UUID from fastapi import APIRouter, Request, Depends, status, HTTPException @@ -10,20 +10,16 @@ from oss.src.apis.fastapi.tracing.utils import ( merge_queries, - parse_query_from_params_request, - parse_query_from_body_request, + parse_query_request, + parse_body_request, parse_trace_id_to_uuid, parse_spans_from_request, parse_spans_into_response, - parse_analytics_from_params_request, - parse_analytics_from_body_request, - merge_analytics, ) from oss.src.apis.fastapi.tracing.models import ( OTelLinksResponse, OTelTracingRequest, OTelTracingResponse, - OldAnalyticsResponse, AnalyticsResponse, ) from oss.src.core.tracing.service import TracingService @@ -32,19 +28,19 @@ OTelLinks, OTelSpan, OTelFlatSpans, - OTelFlatSpan, OTelTraceTree, - TracingQuery, + OTelSpansTree, + Query, Focus, Format, - MetricType, - MetricSpec, ) log = get_module_logger(__name__) class TracingRouter: + VERSION = "1.0.0" + def __init__( self, tracing_service: TracingService, @@ -118,30 +114,30 @@ def __init__( ) self.router.add_api_route( - "/spans/query", + "/spans/", self.query_spans, - methods=["POST"], - operation_id="query_spans_rpc", + methods=["GET"], + operation_id="query_spans", status_code=status.HTTP_200_OK, response_model=OTelTracingResponse, response_model_exclude_none=True, ) self.router.add_api_route( - "/spans/analytics", - self.fetch_legacy_analytics, + "/spans/query", + self.query_spans, methods=["POST"], - operation_id="fetch_analytics", + operation_id="query_spans_rpc", status_code=status.HTTP_200_OK, - response_model=OldAnalyticsResponse, + response_model=OTelTracingResponse, response_model_exclude_none=True, ) self.router.add_api_route( - "/analytics/query", + "/spans/analytics", self.fetch_analytics, methods=["POST"], - operation_id="fetch_new_analytics", + operation_id="fetch_analytics", status_code=status.HTTP_200_OK, response_model=AnalyticsResponse, response_model_exclude_none=True, @@ -152,39 +148,22 @@ def __init__( async def _upsert( self, project_id: UUID, - user_id: UUID, - # spans: Optional[OTelFlatSpans] = None, traces: Optional[OTelTraceTree] = None, strict: Optional[bool] = False, + user_id: Optional[UUID] = None, ) -> OTelLinks: - _spans: Dict[str, Union[OTelSpan, OTelFlatSpans]] = dict() + _spans = {} if spans: - _spans = { - "spans": [ - OTelFlatSpan( - **span.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - ) - for span in spans - ] - } + _spans = {"spans": [OTelSpan(**span.model_dump()) for span in spans]} + elif traces: - for spans_tree in traces.values(): - if spans_tree.spans: - for span in spans_tree.spans.values(): - if not isinstance(span, list): - _spans[span.span_id] = OTelSpan( - **span.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - ) + for spans in traces.values(): + spans: OTelSpansTree + + for span in spans.spans.values(): + _spans[span.span_id] = OTelSpan(**span.model_dump()) span_dtos = parse_spans_from_request(_spans) @@ -192,9 +171,8 @@ async def _upsert( links = ( await self.service.create( project_id=project_id, - user_id=user_id, - # span_dtos=span_dtos, + user_id=user_id, ) or [] ) @@ -202,9 +180,8 @@ async def _upsert( links = ( await self.service.update( project_id=project_id, - user_id=user_id, - # span_dtos=span_dtos, + user_id=user_id, ) or [] ) @@ -223,15 +200,15 @@ async def create_trace( # CREATE if trace_request.traces: if len(trace_request.traces) == 0: - raise HTTPException( + return HTTPException( status_code=400, - detail="Missing trace", + detail="Missing trace.", ) if len(trace_request.traces) > 1: - raise HTTPException( + return HTTPException( status_code=400, - detail="Too many traces", + detail="Too many traces.", ) spans = list(trace_request.traces.values())[0].spans @@ -240,47 +217,47 @@ async def create_trace( # CREATE spans = {span.span_id: span for span in trace_request.spans} else: - raise HTTPException( + return HTTPException( status_code=400, - detail="Missing spans", + detail="Missing spans.", ) - if not spans: - raise HTTPException( + if len(spans) == 0: + return HTTPException( status_code=400, - detail="Missing spans", + detail="Missing spans.", ) root_spans = 0 for span in spans.values(): - if not isinstance(span, list) and span.parent_id is None: + if span.parent_id is None: root_spans += 1 if root_spans == 0: - raise HTTPException( + return HTTPException( status_code=400, - detail="Missing root span", + detail="Missing root span.", ) if root_spans > 1: - raise HTTPException( + return HTTPException( status_code=400, - detail="Too many root spans", + detail="Too many root spans.", ) links = await self._upsert( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # spans=trace_request.spans, traces=trace_request.traces, strict=True, + user_id=UUID(request.state.user_id), ) link_response = OTelLinksResponse( - count=len(links), + version=self.VERSION, links=links, + count=len(links), ) return link_response @@ -290,7 +267,7 @@ async def create_trace( # CREATE async def fetch_trace( # READ self, request: Request, - trace_id: str, + trace_id: Union[str, int], ) -> OTelTracingResponse: try: trace_id = parse_trace_id_to_uuid(trace_id) @@ -300,11 +277,13 @@ async def fetch_trace( # READ spans = await self.service.read( project_id=UUID(request.state.project_id), - # - trace_id=UUID(trace_id), + trace_id=trace_id, ) - trace_response = OTelTracingResponse() + trace_response = OTelTracingResponse( + version=self.VERSION, + count=0, + ) if spans is not None: traces = parse_spans_into_response( @@ -313,12 +292,10 @@ async def fetch_trace( # READ format=Format.AGENTA, ) - if not traces or isinstance(traces, list): - return OTelTracingResponse() - trace_response = OTelTracingResponse( - count=len(traces.keys()), + version=self.VERSION, traces=traces, + count=len(traces.values()), ) return trace_response @@ -327,24 +304,22 @@ async def fetch_trace( # READ async def edit_trace( # UPDATE self, request: Request, - # + trace_id: Union[str, int], trace_request: OTelTracingRequest, - # - trace_id: str, ) -> OTelLinksResponse: spans = None if trace_request.traces: if len(trace_request.traces) == 0: - raise HTTPException( + return HTTPException( status_code=400, - detail="Missing trace", + detail="Missing trace.", ) if len(trace_request.traces) > 1: - raise HTTPException( + return HTTPException( status_code=400, - detail="Too many traces", + detail="Too many traces.", ) spans = list(trace_request.traces.values())[0].spans @@ -353,47 +328,47 @@ async def edit_trace( # UPDATE spans = {span.span_id: span for span in trace_request.spans} else: - raise HTTPException( + return HTTPException( status_code=400, - detail="Missing spans", + detail="Missing spans.", ) - if not spans: - raise HTTPException( + if len(spans) == 0: + return HTTPException( status_code=400, - detail="Missing spans", + detail="Missing spans.", ) root_spans = 0 for span in spans.values(): - if not isinstance(span, list) and span.parent_id is None: + if span.parent_id is None: root_spans += 1 if root_spans == 0: - raise HTTPException( + return HTTPException( status_code=400, - detail="Missing root span", + detail="Missing root span.", ) if root_spans > 1: - raise HTTPException( + return HTTPException( status_code=400, - detail="Too many root spans", + detail="Too many root spans.", ) links = await self._upsert( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # spans=trace_request.spans, traces=trace_request.traces, strict=False, + user_id=UUID(request.state.user_id), ) link_response = OTelLinksResponse( - count=len(links), + version=self.VERSION, links=links, + count=len(links), ) return link_response @@ -402,26 +377,23 @@ async def edit_trace( # UPDATE async def delete_trace( # DELETE self, request: Request, - trace_id: str, + trace_id: Union[str, int], ) -> OTelLinksResponse: try: trace_id = parse_trace_id_to_uuid(trace_id) except Exception as e: - raise HTTPException( - status_code=400, - detail="Invalid trace_id", - ) from e + raise HTTPException(status_code=400, detail="Invalid trace_id.") from e links = await self.service.delete( project_id=UUID(request.state.project_id), - # - trace_id=UUID(trace_id), + trace_id=trace_id, ) link_response = OTelLinksResponse( - count=len(links), + version=self.VERSION, links=links, + count=len(links) if links else 0, ) return link_response @@ -436,16 +408,16 @@ async def ingest_spans( # MUTATION ) -> OTelLinksResponse: links = await self._upsert( project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # spans=spans_request.spans, traces=spans_request.traces, strict=True, + user_id=UUID(request.state.user_id), ) link_response = OTelLinksResponse( - count=len(links), + version=self.VERSION, links=links, + count=len(links), ) return link_response @@ -455,7 +427,7 @@ async def ingest_spans( # MUTATION async def query_spans( # QUERY self, request: Request, - query: Optional[TracingQuery] = Depends(parse_query_from_params_request), + query: Optional[Query] = Depends(parse_query_request), ) -> OTelTracingResponse: body_json = None query_from_body = None @@ -464,9 +436,9 @@ async def query_spans( # QUERY body_json = await request.json() if body_json: - query_from_body = parse_query_from_body_request(**body_json) + query_from_body = parse_body_request(**body_json) - except: + except: # pylint: disable=bare-except pass merged_query = merge_queries(query, query_from_body) @@ -474,7 +446,6 @@ async def query_spans( # QUERY try: span_dtos = await self.service.query( project_id=UUID(request.state.project_id), - # query=merged_query, ) except FilteringException as e: @@ -483,150 +454,75 @@ async def query_spans( # QUERY detail=str(e), ) from e - spans_or_traces = parse_spans_into_response( + oldest = None + newest = None + + for span in span_dtos: + if oldest is None or span.start_time < oldest: + oldest = span.start_time + + if newest is None or span.start_time > newest: + newest = span.start_time + + _spans_or_traces = parse_spans_into_response( span_dtos, - focus=(merged_query.formatting.focus if merged_query.formatting else None) - or Focus.TRACE, - format=(merged_query.formatting.format if merged_query.formatting else None) - or Format.AGENTA, + focus=query.formatting.focus, + format=query.formatting.format, ) - spans: Optional[OTelFlatSpans] = None - traces: Optional[OTelTraceTree] = None + spans: OTelFlatSpans = None + traces: OTelTraceTree = None - if isinstance(spans_or_traces, list): - count = len(spans_or_traces) - spans = spans_or_traces + if isinstance(_spans_or_traces, list): + spans = _spans_or_traces traces = None - elif isinstance(spans_or_traces, dict): - count = len(spans_or_traces.values()) + count = len(_spans_or_traces) + elif isinstance(_spans_or_traces, dict): spans = None - traces = spans_or_traces + traces = _spans_or_traces + count = len(_spans_or_traces.values()) else: - count = 0 spans = None traces = None + count = 0 spans_response = OTelTracingResponse( - count=count, + version=self.VERSION, spans=spans, traces=traces, + count=count, ) return spans_response - @intercept_exceptions() - @suppress_exceptions(default=OldAnalyticsResponse()) - async def fetch_legacy_analytics( - self, - request: Request, - query: Optional[TracingQuery] = Depends(parse_query_from_params_request), - ) -> OldAnalyticsResponse: - body_json = None - query_from_body = None - - try: - body_json = await request.json() - - if body_json: - query_from_body = parse_query_from_body_request( - **body_json, - ) - - except: # pylint: disable=bare-except - pass - - merged_query = merge_queries( - query, - query_from_body, - ) - - # DEBUGGING - # log.trace(merged_query.model_dump(mode="json", exclude_none=True)) - # --------- - - buckets = await self.service.legacy_analytics( - project_id=UUID(request.state.project_id), - query=merged_query, - ) - - # DEBUGGING - # log.trace([b.model_dump(mode="json", exclude_none=True) for b in buckets]) - # --------- - - return OldAnalyticsResponse( - count=len(buckets), - buckets=buckets, - ) - @intercept_exceptions() @suppress_exceptions(default=AnalyticsResponse()) async def fetch_analytics( self, request: Request, - analytics: Tuple[Optional[TracingQuery], Optional[List[MetricSpec]]] = Depends( - parse_analytics_from_params_request - ), + query: Optional[Query] = Depends(parse_query_request), ) -> AnalyticsResponse: body_json = None - analytics_from_body = (None, None) + query_from_body = None try: body_json = await request.json() if body_json: - analytics_from_body = parse_analytics_from_body_request( - **body_json, - ) + query_from_body = parse_body_request(**body_json) except: # pylint: disable=bare-except pass - ( - query, - specs, - ) = merge_analytics( - analytics, - analytics_from_body, - ) - - if not specs: - specs = [ - MetricSpec( - type=MetricType.NUMERIC_CONTINUOUS, - path="attributes.ag.metrics.duration.cumulative", - ), - MetricSpec( - type=MetricType.NUMERIC_CONTINUOUS, - path="attributes.ag.metrics.errors.cumulative", - ), - MetricSpec( - type=MetricType.NUMERIC_CONTINUOUS, - path="attributes.ag.metrics.costs.cumulative.total", - ), - MetricSpec( - type=MetricType.NUMERIC_CONTINUOUS, - path="attributes.ag.metrics.tokens.cumulative.total", - ), - MetricSpec( - type=MetricType.CATEGORICAL_SINGLE, - path="attributes.ag.type.trace", - ), - MetricSpec( - type=MetricType.CATEGORICAL_SINGLE, - path="attributes.ag.type.span", - ), - ] + merged_query = merge_queries(query, query_from_body) buckets = await self.service.analytics( project_id=UUID(request.state.project_id), - query=query, - specs=specs, + query=merged_query, ) return AnalyticsResponse( + version=self.VERSION, count=len(buckets), buckets=buckets, - query=query, - specs=specs, ) diff --git a/api/oss/src/apis/fastapi/tracing/utils.py b/api/oss/src/apis/fastapi/tracing/utils.py index d67c3ca542..298759f6f8 100644 --- a/api/oss/src/apis/fastapi/tracing/utils.py +++ b/api/oss/src/apis/fastapi/tracing/utils.py @@ -1,11 +1,10 @@ -from typing import Optional, Union, Dict, Tuple, List +from typing import Optional, Union, Dict, Tuple from json import loads, dumps from copy import deepcopy from hashlib import blake2b from traceback import format_exc -from datetime import datetime -from fastapi import Query +from fastapi import Query as _Query from oss.src.utils.logging import get_module_logger @@ -31,10 +30,9 @@ Formatting, Windowing, Filtering, - TracingQuery, + Query, Focus, Format, - MetricSpec, ) from oss.src.core.tracing.utils import ( @@ -52,29 +50,15 @@ log = get_module_logger(__name__) -TRACE_DEFAULT_KEY = "__default__" - # --- PARSE QUERY DTO --- def _parse_windowing( - oldest: Optional[Union[str, int, datetime]] = None, - newest: Optional[Union[str, int, datetime]] = None, + oldest: Optional[Union[str, int]] = None, + newest: Optional[Union[str, int]] = None, limit: Optional[int] = None, - interval: Optional[int] = None, - rate: Optional[float] = None, + window: Optional[int] = None, ) -> Optional[Windowing]: - if all( - [ - oldest is None, - newest is None, - limit is None, - interval is None, - rate is None, - ] - ): - return None - oldest = parse_timestamp_to_datetime(oldest) newest = parse_timestamp_to_datetime(newest) @@ -82,8 +66,7 @@ def _parse_windowing( oldest=oldest, newest=newest, limit=limit, - interval=interval, - rate=rate, + window=window, ) return _windowing @@ -116,45 +99,43 @@ def _parse_filtering( def _parse_formatting( - focus: Focus = Focus.TRACE, - format: Format = Format.AGENTA, # pylint: disable=redefined-builtin + focus: Optional[Focus] = Focus.TRACE, + format: Optional[Format] = Format.AGENTA, # pylint: disable=redefined-builtin ) -> Optional[Formatting]: _formatting = Formatting( - focus=focus or Focus.TRACE, + focus=focus or Focus.SPAN, format=format or Format.AGENTA, ) return _formatting -def parse_query_from_params_request( +def parse_query_request( # GROUPING - focus: Optional[Focus] = Query(None), - format: Optional[Format] = Query(None), # pylint: disable=redefined-builtin + focus: Optional[Focus] = _Query(None), + format: Optional[Format] = _Query(None), # pylint: disable=redefined-builtin # WINDOWING - oldest: Optional[Union[str, int]] = Query(None), - newest: Optional[Union[str, int]] = Query(None), - limit: Optional[int] = Query(None), - interval: Optional[int] = Query(None), - rate: Optional[float] = Query(None), + oldest: Optional[Union[str, int]] = _Query(None), + newest: Optional[Union[str, int]] = _Query(None), + limit: Optional[int] = _Query(None), + window: Optional[int] = _Query(None), # FILTERING - filter=Query(None), # pylint: disable=redefined-builtin -) -> TracingQuery: - return parse_query_from_body_request( + filter=_Query(None), # pylint: disable=redefined-builtin +) -> Query: + return parse_body_request( focus=focus, format=format, # oldest=oldest, newest=newest, limit=limit, - interval=interval, - rate=rate, + window=window, # filter=filter, ) -def parse_query_from_body_request( +def parse_body_request( # GROUPING focus: Optional[Focus] = None, format: Optional[Format] = None, # pylint: disable=redefined-builtin @@ -162,13 +143,12 @@ def parse_query_from_body_request( oldest: Optional[Union[str, int]] = None, newest: Optional[Union[str, int]] = None, limit: Optional[int] = None, - interval: Optional[int] = None, - rate: Optional[float] = None, + window: Optional[int] = None, # FILTERING filter: Optional[Union[dict, str]] = None, # pylint: disable=redefined-builtin -) -> TracingQuery: +) -> Query: try: - _query = TracingQuery( + _query = Query( formatting=_parse_formatting( focus=focus, format=format, @@ -177,8 +157,7 @@ def parse_query_from_body_request( oldest=oldest, newest=newest, limit=limit, - interval=interval, - rate=rate, + window=window, ), filtering=_parse_filtering( filter=filter, @@ -187,43 +166,41 @@ def parse_query_from_body_request( except Exception as e: # pylint: disable=broad-except log.warn(e) - _query = TracingQuery() + _query = None return _query def merge_queries( - query_param: Optional[TracingQuery] = None, - query_body: Optional[TracingQuery] = None, -) -> TracingQuery: - if query_param is None and query_body is None: - return TracingQuery( - formatting=_parse_formatting(), - windowing=_parse_windowing(), - filtering=_parse_filtering(), - ) - - if query_body is None and query_param is not None: - query_param.filtering = query_param.filtering or Filtering() - + query_param: Optional[Query] = None, + query_body: Optional[Query] = None, +) -> Query: + if query_body is None: + if query_param.filtering is None: + query_param.filtering = Filtering() return query_param - if query_param is None and query_body is not None: - query_body.filtering = query_body.filtering or Filtering() - + if query_param is None: + if query_body.filtering is None: + query_body.filtering = Filtering() return query_body - if query_param is not None and query_body is not None: - return TracingQuery( - formatting=query_body.formatting or query_param.formatting or Formatting(), - windowing=query_body.windowing or query_param.windowing or Windowing(), - filtering=query_body.filtering or query_param.filtering or Filtering(), - ) - - return TracingQuery( - formatting=_parse_formatting(), - windowing=_parse_windowing(), - filtering=_parse_filtering(), + return Query( + formatting=Formatting( + focus=query_param.formatting.focus + or query_body.formatting.focus + or Focus.TRACE, + format=query_param.formatting.format + or query_body.formatting.format + or Format.AGENTA, + ), + windowing=Windowing( + oldest=query_param.windowing.oldest or query_body.windowing.oldest, + newest=query_param.windowing.newest or query_body.windowing.newest, + limit=query_param.windowing.limit or query_body.windowing.limit, + window=query_param.windowing.window or query_body.windowing.window, + ), + filtering=query_param.filtering or query_body.filtering or Filtering(), ) @@ -414,20 +391,9 @@ def initialize_ag_attributes(attributes: Optional[dict]) -> dict: for key in ["flags", "tags", "meta", "exception", "hashes"]: cleaned_ag[key] = ag.get(key, None) - # --- move ag.meta.configuration to ag.data.parameters --- - if "meta" in cleaned_ag and cleaned_ag["meta"] is not None: - if "configuration" in cleaned_ag["meta"]: - if cleaned_ag["data"]["parameters"] is None: - cleaned_ag["data"]["parameters"] = cleaned_ag["meta"]["configuration"] - del cleaned_ag["meta"]["configuration"] - if not cleaned_ag["meta"]: - cleaned_ag["meta"] = None - # --- unsupported top-level --- for key in ag: if key not in AgAttributes.model_fields: - if key == "refs": - continue unsupported[key] = ag[key] cleaned_ag["unsupported"] = unsupported or None @@ -440,28 +406,20 @@ def initialize_ag_attributes(attributes: Optional[dict]) -> dict: REFERENCE_KEYS = [ - "testcase", "testset", - "testset_variant", - "testset_revision", - "query", - "query_variant", - "query_revision", + "testcase", "workflow", - "workflow_variant", - "workflow_revision", + "workflow_variants", + "workflow_revisions", "application", - "application_variant", - "application_revision", + "application_variants", + "application_revisions", "evaluator", - "evaluator_variant", - "evaluator_revision", + "evaluator_variants", + "evaluator_revisions", "environment", - "environment_variant", - "environment_revision", - "snippet", - "snippet_variant", - "snippet_revision", + "environment_variants", + "environment_revisions", ] @@ -599,6 +557,7 @@ def _parse_span_from_request(raw_span: OTelSpan) -> Optional[OTelFlatSpans]: if references or links: hash_id = make_hash_id(references=references, links=links) + # log.debug("parsing span with hash_id", hash_id=hash_id) if hash_id: hashes = OTelHash( @@ -611,7 +570,7 @@ def _parse_span_from_request(raw_span: OTelSpan) -> Optional[OTelFlatSpans]: raw_span.hashes = [hashes] # --- Children --- - if isinstance(raw_span, OTelSpan) and raw_span.spans is not None: + if raw_span.spans: raw_span_dtos.extend(parse_spans_from_request(raw_span.spans)) raw_span.spans = None @@ -669,20 +628,13 @@ def _parse_span_into_response( if marshall: pass # TODO: MARSHALL ATTRIBUTES - ag = span_dto.attributes.get("ag") - if ag: - data = ag.get("data") if isinstance(ag, dict) else None - outputs = data.get("outputs") if isinstance(data, dict) else None - if isinstance(outputs, dict) and TRACE_DEFAULT_KEY in outputs: - data["outputs"] = outputs[TRACE_DEFAULT_KEY] - return span_dto def parse_spans_into_response( span_dtos: OTelFlatSpans, - focus: Focus = Focus.TRACE, - format: Format = Format.AGENTA, + focus: Focus, + format: Format, ) -> Optional[Union[OTelFlatSpans, OTelTraceTree]]: clean_span_dtos: OTelFlatSpans = [] @@ -725,112 +677,3 @@ def parse_spans_into_response( spans: OTelFlatSpans = [] return spans if spans else traces - - -# -- ANALYTICS - - -def parse_specs_from_body_request( - specs: Optional[Union[list, str]] = None, -) -> Optional[List[MetricSpec]]: - if not specs: - return None - - if isinstance(specs, str): - try: - specs = loads(specs) - except Exception as e: # pylint: disable=broad-except - log.warn(f"Error parsing specs string to JSON: {e}") - return None - - if isinstance(specs, list): - return [MetricSpec(**spec) for spec in specs if isinstance(spec, dict)] - - log.warn("Specs should be a list or a JSON string") - - return None - - -def merge_specs( - specs_params: Optional[List[MetricSpec]], - specs_body: Optional[List[MetricSpec]], -) -> List[MetricSpec]: - if not specs_params and not specs_body: - return [] - if not specs_params: - return specs_body or [] - if not specs_body: - return specs_params or [] - - return [] - - -def parse_analytics_from_params_request( - # GROUPING - focus: Optional[Focus] = Query(None), - format: Optional[Format] = Query(None), # pylint: disable=redefined-builtin - # WINDOWING - oldest: Optional[Union[str, int]] = Query(None), - newest: Optional[Union[str, int]] = Query(None), - interval: Optional[int] = Query(None), - rate: Optional[float] = Query(None), - # FILTERING - filter=Query(None), # pylint: disable=redefined-builtin - # METRICS SPECS - specs=Query(None), -) -> Tuple[Optional[TracingQuery], Optional[List[MetricSpec]]]: - return parse_analytics_from_body_request( - focus=focus, - format=format, - # - oldest=oldest, - newest=newest, - interval=interval, - rate=rate, - # - filter=filter, - # - specs=specs, - ) - - -def parse_analytics_from_body_request( - # GROUPING - focus: Optional[Focus] = None, - format: Optional[Format] = None, # pylint: disable=redefined-builtin - # WINDOWING - oldest: Optional[Union[str, int]] = None, - newest: Optional[Union[str, int]] = None, - interval: Optional[int] = None, - rate: Optional[float] = None, - # FILTERING - filter: Optional[Union[dict, str]] = None, # pylint: disable=redefined-builtin - # METRICS SPECS - specs: Optional[Union[list, str]] = None, -) -> Tuple[Optional[TracingQuery], Optional[List[MetricSpec]]]: - return ( - parse_query_from_body_request( - focus=focus, - format=format, - # - oldest=oldest, - newest=newest, - interval=interval, - rate=rate, - # - filter=filter, - ), - parse_specs_from_body_request( - specs=specs, - ), - ) - - -def merge_analytics( - analytics_params: Tuple[Optional[TracingQuery], Optional[List[MetricSpec]]], - analytics_body: Tuple[Optional[TracingQuery], Optional[List[MetricSpec]]], -) -> Tuple[TracingQuery, List[MetricSpec]]: - return ( - merge_queries(analytics_params[0], analytics_body[0]), - merge_specs(analytics_params[1], analytics_body[1]), - ) diff --git a/api/oss/src/apis/fastapi/vault/router.py b/api/oss/src/apis/fastapi/vault/router.py index 38ff0d9ec6..c7b21f8f06 100644 --- a/api/oss/src/apis/fastapi/vault/router.py +++ b/api/oss/src/apis/fastapi/vault/router.py @@ -6,7 +6,7 @@ from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger -from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions +from oss.src.utils.exceptions import intercept_exceptions from oss.src.utils.caching import get_cache, set_cache, invalidate_cache from oss.src.core.secrets.services import VaultService @@ -31,7 +31,7 @@ def __init__(self, vault_service: VaultService): self.router = APIRouter() self.router.add_api_route( - "/secrets/", + "/secrets", self.create_secret, methods=["POST"], operation_id="create_secret", @@ -39,7 +39,7 @@ def __init__(self, vault_service: VaultService): response_model=SecretResponseDTO, ) self.router.add_api_route( - "/secrets/", + "/secrets", self.list_secrets, methods=["GET"], operation_id="list_secrets", diff --git a/api/oss/src/apis/fastapi/workflows/models.py b/api/oss/src/apis/fastapi/workflows/models.py index 6f00e38005..7d9ebdb3a4 100644 --- a/api/oss/src/apis/fastapi/workflows/models.py +++ b/api/oss/src/apis/fastapi/workflows/models.py @@ -2,10 +2,7 @@ from pydantic import BaseModel -from oss.src.core.shared.dtos import ( - Windowing, - Reference, -) +from oss.src.core.shared.dtos import Windowing, Reference from oss.src.core.workflows.dtos import ( # Workflow, @@ -13,7 +10,7 @@ WorkflowEdit, WorkflowQuery, WorkflowFork, - WorkflowRevisionsLog, + WorkflowLog, # WorkflowVariant, WorkflowVariantCreate, @@ -28,9 +25,6 @@ ) -# WORKFLOWS -------------------------------------------------------------------- - - class WorkflowCreateRequest(BaseModel): workflow: WorkflowCreate @@ -41,16 +35,13 @@ class WorkflowEditRequest(BaseModel): class WorkflowQueryRequest(BaseModel): workflow: Optional[WorkflowQuery] = None - # workflow_refs: Optional[List[Reference]] = None - # include_archived: Optional[bool] = None - # windowing: Optional[Windowing] = None -class WorkflowForkRequest(BaseModel): - workflow: WorkflowFork +class WorkflowRequest(BaseModel): + workflow: Workflow class WorkflowResponse(BaseModel): @@ -63,9 +54,6 @@ class WorkflowsResponse(BaseModel): workflows: List[Workflow] = [] -# WORKFLOW VARIANTS ------------------------------------------------------------ - - class WorkflowVariantCreateRequest(BaseModel): workflow_variant: WorkflowVariantCreate @@ -76,12 +64,9 @@ class WorkflowVariantEditRequest(BaseModel): class WorkflowVariantQueryRequest(BaseModel): workflow_variant: Optional[WorkflowVariantQuery] = None - # workflow_refs: Optional[List[Reference]] = None workflow_variant_refs: Optional[List[Reference]] = None - # include_archived: Optional[bool] = None - # windowing: Optional[Windowing] = None @@ -95,9 +80,6 @@ class WorkflowVariantsResponse(BaseModel): workflow_variants: List[WorkflowVariant] = [] -# WORKFLOW REVISIONS ----------------------------------------------------------- - - class WorkflowRevisionCreateRequest(BaseModel): workflow_revision: WorkflowRevisionCreate @@ -108,13 +90,10 @@ class WorkflowRevisionEditRequest(BaseModel): class WorkflowRevisionQueryRequest(BaseModel): workflow_revision: Optional[WorkflowRevisionQuery] = None - # workflow_refs: Optional[List[Reference]] = None workflow_variant_refs: Optional[List[Reference]] = None workflow_revision_refs: Optional[List[Reference]] = None - # include_archived: Optional[bool] = None - # windowing: Optional[Windowing] = None @@ -122,16 +101,6 @@ class WorkflowRevisionCommitRequest(BaseModel): workflow_revision: WorkflowRevisionCommit -class WorkflowRevisionRetrieveRequest(BaseModel): - workflow_ref: Optional[Reference] = None - workflow_variant_ref: Optional[Reference] = None - workflow_revision_ref: Optional[Reference] = None - - -class WorkflowRevisionsLogRequest(BaseModel): - workflow: WorkflowRevisionsLog - - class WorkflowRevisionResponse(BaseModel): count: int = 0 workflow_revision: Optional[WorkflowRevision] = None @@ -140,3 +109,16 @@ class WorkflowRevisionResponse(BaseModel): class WorkflowRevisionsResponse(BaseModel): count: int = 0 workflow_revisions: List[WorkflowRevision] = [] + + +class WorkflowForkRequest(BaseModel): + workflow: WorkflowFork + + +class WorkflowLogRequest(BaseModel): + workflow: WorkflowLog + + +class WorkflowRevisionRetrieveRequest(BaseModel): + workflow_variant_ref: Optional[Reference] = None + workflow_revision_ref: Optional[Reference] = None diff --git a/api/oss/src/apis/fastapi/workflows/router.py b/api/oss/src/apis/fastapi/workflows/router.py index 0481e6a2fb..d0f59e9230 100644 --- a/api/oss/src/apis/fastapi/workflows/router.py +++ b/api/oss/src/apis/fastapi/workflows/router.py @@ -1,30 +1,22 @@ -from typing import Optional, Union +from typing import Optional from uuid import UUID from fastapi import APIRouter, Request, status, HTTPException, Depends -from fastapi.responses import Response, JSONResponse, StreamingResponse from oss.src.utils.common import is_ee from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import intercept_exceptions, suppress_exceptions from oss.src.utils.caching import get_cache, set_cache, invalidate_cache -from oss.src.core.shared.dtos import ( - Reference, -) -from oss.src.core.workflows.dtos import ( - WorkflowRevisionData, - WorkflowRevision, -) -from oss.src.core.workflows.service import ( - WorkflowsService, -) - +from oss.src.core.shared.dtos import Reference +from oss.src.core.workflows.dtos import WorkflowQuery +from oss.src.core.workflows.service import WorkflowsService from oss.src.apis.fastapi.workflows.models import ( WorkflowCreateRequest, WorkflowEditRequest, WorkflowQueryRequest, WorkflowForkRequest, + WorkflowLogRequest, WorkflowResponse, WorkflowsResponse, # @@ -38,10 +30,10 @@ WorkflowRevisionEditRequest, WorkflowRevisionQueryRequest, WorkflowRevisionCommitRequest, - WorkflowRevisionRetrieveRequest, - WorkflowRevisionsLogRequest, WorkflowRevisionResponse, WorkflowRevisionsResponse, + # + WorkflowRevisionRetrieveRequest, ) from oss.src.apis.fastapi.workflows.utils import ( parse_workflow_query_request_from_params, @@ -57,18 +49,6 @@ parse_workflow_revision_retrieve_request_from_body, ) -from agenta.sdk.models.workflows import ( - WorkflowServiceRequest, - WorkflowServiceBatchResponse, - WorkflowServiceStreamResponse, -) -from agenta.sdk.decorators.routing import ( - handle_invoke_success, - handle_invoke_failure, - handle_inspect_success, - handle_inspect_failure, -) - if is_ee(): from ee.src.models.shared_models import Permission from ee.src.utils.permissions import check_action_access, FORBIDDEN_EXCEPTION @@ -78,6 +58,8 @@ class WorkflowsRouter: + VERSION = "1.0.0" + def __init__( self, workflows_service: WorkflowsService, @@ -86,7 +68,7 @@ def __init__( self.router = APIRouter() - # WORKFLOWS ------------------------------------------------------------ + # — artifacts —————————————————————————————————————————————————————————— self.router.add_api_route( "/", @@ -138,6 +120,16 @@ def __init__( response_model_exclude_none=True, ) + self.router.add_api_route( + "/", + self.query_workflows, + methods=["GET"], + operation_id="list_workflows", + status_code=status.HTTP_200_OK, + response_model=WorkflowsResponse, + response_model_exclude_none=True, + ) + self.router.add_api_route( "/query", self.query_workflows, @@ -148,7 +140,9 @@ def __init__( response_model_exclude_none=True, ) - # WORKFLOW VARIANTS ---------------------------------------------------- + # —————————————————————————————————————————————————————————————————————— + + # — variants ——————————————————————————————————————————————————————————— self.router.add_api_route( "/variants/", @@ -200,6 +194,16 @@ def __init__( response_model_exclude_none=True, ) + self.router.add_api_route( + "/variants/", + self.query_workflow_variants, + methods=["GET"], + operation_id="list_workflow_variants", + status_code=status.HTTP_200_OK, + response_model=WorkflowVariantsResponse, + response_model_exclude_none=True, + ) + self.router.add_api_route( "/variants/query", self.query_workflow_variants, @@ -210,6 +214,8 @@ def __init__( response_model_exclude_none=True, ) + # ---------------------------------------------------------------------- + self.router.add_api_route( "/variants/fork", self.fork_workflow_variant, @@ -220,7 +226,9 @@ def __init__( response_model_exclude_none=True, ) - # WORKFLOW REVISIONS --------------------------------------------------- + # —————————————————————————————————————————————————————————————————————— + + # — revisions —————————————————————————————————————————————————————————— self.router.add_api_route( "/revisions/retrieve", @@ -282,6 +290,16 @@ def __init__( response_model_exclude_none=True, ) + self.router.add_api_route( + "/revisions/", + self.query_workflow_revisions, + methods=["GET"], + operation_id="list_workflow_revisions", + status_code=status.HTTP_200_OK, + response_model=WorkflowRevisionsResponse, + response_model_exclude_none=True, + ) + self.router.add_api_route( "/revisions/query", self.query_workflow_revisions, @@ -292,6 +310,8 @@ def __init__( response_model_exclude_none=True, ) + # ---------------------------------------------------------------------- + self.router.add_api_route( "/revisions/commit", self.commit_workflow_revision, @@ -312,31 +332,9 @@ def __init__( response_model_exclude_none=True, ) - # WORKFLOW SERVICES ---------------------------------------------------- + # —————————————————————————————————————————————————————————————————————— - self.router.add_api_route( - "/invoke", - self.invoke_workflow, - methods=["POST"], - operation_id="invoke_workflow", - status_code=status.HTTP_200_OK, - response_model=Union[ - WorkflowServiceBatchResponse, WorkflowServiceStreamResponse - ], - response_model_exclude_none=True, - ) - - self.router.add_api_route( - "/inspect", - self.inspect_workflow, - methods=["POST"], - operation_id="inspect_workflow", - status_code=status.HTTP_200_OK, - response_model=WorkflowServiceRequest, - response_model_exclude_none=True, - ) - - # WORKFLOWS ---------------------------------------------------------------- + # — artifacts —————————————————————————————————————————————————————————————— @intercept_exceptions() async def create_workflow( @@ -346,12 +344,12 @@ async def create_workflow( workflow_create_request: WorkflowCreateRequest, ) -> WorkflowResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow = await self.workflows_service.create_workflow( project_id=UUID(request.state.project_id), @@ -361,7 +359,7 @@ async def create_workflow( ) workflow_response = WorkflowResponse( - count=1 if workflow else 0, + count=1 if workflow is not None else 0, workflow=workflow, ) @@ -376,12 +374,12 @@ async def fetch_workflow( workflow_id: UUID, ) -> WorkflowResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow = await self.workflows_service.fetch_workflow( project_id=UUID(request.state.project_id), @@ -390,7 +388,7 @@ async def fetch_workflow( ) workflow_response = WorkflowResponse( - count=1 if workflow else 0, + count=1 if workflow is not None else 0, workflow=workflow, ) @@ -402,19 +400,21 @@ async def edit_workflow( request: Request, *, workflow_id: UUID, - # workflow_edit_request: WorkflowEditRequest, ) -> WorkflowResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION if str(workflow_id) != str(workflow_edit_request.workflow.id): - return WorkflowResponse() + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"ID mismatch between path params and body params: {workflow_id} != {workflow_edit_request.workflow.id}", + ) workflow = await self.workflows_service.edit_workflow( project_id=UUID(request.state.project_id), @@ -424,7 +424,7 @@ async def edit_workflow( ) workflow_response = WorkflowResponse( - count=1 if workflow else 0, + count=1 if workflow is not None else 0, workflow=workflow, ) @@ -438,12 +438,12 @@ async def archive_workflow( workflow_id: UUID, ) -> WorkflowResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow = await self.workflows_service.archive_workflow( project_id=UUID(request.state.project_id), @@ -453,7 +453,7 @@ async def archive_workflow( ) workflow_response = WorkflowResponse( - count=1 if workflow else 0, + count=1 if workflow is not None else 0, workflow=workflow, ) @@ -467,12 +467,12 @@ async def unarchive_workflow( workflow_id: UUID, ) -> WorkflowResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow = await self.workflows_service.unarchive_workflow( project_id=UUID(request.state.project_id), @@ -482,7 +482,7 @@ async def unarchive_workflow( ) workflow_response = WorkflowResponse( - count=1 if workflow else 0, + count=1 if workflow is not None else 0, workflow=workflow, ) @@ -516,12 +516,12 @@ async def query_workflows( ) if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflows = await self.workflows_service.query_workflows( project_id=UUID(request.state.project_id), @@ -542,7 +542,9 @@ async def query_workflows( return workflows_response - # WORKFLOW VARIANTS -------------------------------------------------------- + # —————————————————————————————————————————————————————————————————————————— + + # — variants ——————————————————————————————————————————————————————————————— @intercept_exceptions() async def create_workflow_variant( @@ -552,12 +554,12 @@ async def create_workflow_variant( workflow_variant_create_request: WorkflowVariantCreateRequest, ) -> WorkflowVariantResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_variant = await self.workflows_service.create_workflow_variant( project_id=UUID(request.state.project_id), @@ -567,7 +569,7 @@ async def create_workflow_variant( ) workflow_variant_response = WorkflowVariantResponse( - count=1 if workflow_variant else 0, + count=1 if workflow_variant is not None else 0, workflow_variant=workflow_variant, ) @@ -582,12 +584,12 @@ async def fetch_workflow_variant( workflow_variant_id: UUID, ) -> WorkflowVariantResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_variant = await self.workflows_service.fetch_workflow_variant( project_id=UUID(request.state.project_id), @@ -596,7 +598,7 @@ async def fetch_workflow_variant( ) workflow_variant_response = WorkflowVariantResponse( - count=1 if workflow_variant else 0, + count=1 if workflow_variant is not None else 0, workflow_variant=workflow_variant, ) @@ -608,21 +610,23 @@ async def edit_workflow_variant( request: Request, *, workflow_variant_id: UUID, - # workflow_variant_edit_request: WorkflowVariantEditRequest, ) -> WorkflowVariantResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION if str(workflow_variant_id) != str( workflow_variant_edit_request.workflow_variant.id ): - return WorkflowVariantResponse() + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"ID mismatch between path params and body params: {workflow_variant_id} != {workflow_variant_edit_request.variant.id}", + ) workflow_variant = await self.workflows_service.edit_workflow_variant( project_id=UUID(request.state.project_id), @@ -632,8 +636,8 @@ async def edit_workflow_variant( ) workflow_variant_response = WorkflowVariantResponse( - count=1 if workflow_variant else 0, - workflow_variant=workflow_variant, + count=1 if workflow_variant is not None else 0, + variant=workflow_variant, ) return workflow_variant_response @@ -646,12 +650,12 @@ async def archive_workflow_variant( workflow_variant_id: UUID, ) -> WorkflowVariantResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_variant = await self.workflows_service.archive_workflow_variant( project_id=UUID(request.state.project_id), @@ -661,7 +665,7 @@ async def archive_workflow_variant( ) workflow_variant_response = WorkflowVariantResponse( - count=1 if workflow_variant else 0, + count=1 if workflow_variant is not None else 0, workflow_variant=workflow_variant, ) @@ -675,12 +679,12 @@ async def unarchive_workflow_variant( workflow_variant_id: UUID, ) -> WorkflowVariantResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_variant = await self.workflows_service.unarchive_workflow_variant( project_id=UUID(request.state.project_id), @@ -690,7 +694,7 @@ async def unarchive_workflow_variant( ) workflow_variant_response = WorkflowVariantResponse( - count=1 if workflow_variant else 0, + count=1 if workflow_variant is not None else 0, workflow_variant=workflow_variant, ) @@ -726,12 +730,12 @@ async def query_workflow_variants( ) if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_variants = await self.workflows_service.query_workflow_variants( project_id=UUID(request.state.project_id), @@ -753,6 +757,8 @@ async def query_workflow_variants( return workflow_variants_response + # -------------------------------------------------------------------------- + @intercept_exceptions() async def fork_workflow_variant( self, @@ -761,12 +767,12 @@ async def fork_workflow_variant( workflow_fork_request: WorkflowForkRequest, ) -> WorkflowVariantResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_variant = await self.workflows_service.fork_workflow_variant( project_id=UUID(request.state.project_id), @@ -776,13 +782,15 @@ async def fork_workflow_variant( ) workflow_variant_response = WorkflowVariantResponse( - count=1 if workflow_variant else 0, + count=1 if workflow_variant is not None else 0, workflow_variant=workflow_variant, ) return workflow_variant_response - # WORKFLOW REVISIONS ------------------------------------------------------- + # —————————————————————————————————————————————————————————————————————————— + + # — revisions —————————————————————————————————————————————————————————————— @intercept_exceptions() async def create_workflow_revision( @@ -792,12 +800,12 @@ async def create_workflow_revision( workflow_revision_create_request: WorkflowRevisionCreateRequest, ) -> WorkflowRevisionResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_revision = await self.workflows_service.create_workflow_revision( project_id=UUID(request.state.project_id), @@ -807,7 +815,7 @@ async def create_workflow_revision( ) workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, + count=1 if workflow_revision is not None else 0, workflow_revision=workflow_revision, ) @@ -822,12 +830,12 @@ async def fetch_workflow_revision( workflow_revision_id: UUID, ) -> WorkflowRevisionResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_revision = await self.workflows_service.fetch_workflow_revision( project_id=UUID(request.state.project_id), @@ -836,7 +844,7 @@ async def fetch_workflow_revision( ) workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, + count=1 if workflow_revision is not None else 0, workflow_revision=workflow_revision, ) @@ -848,21 +856,23 @@ async def edit_workflow_revision( request: Request, *, workflow_revision_id: UUID, - # workflow_revision_request: WorkflowRevisionEditRequest, ) -> WorkflowRevisionResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION if str(workflow_revision_id) != str( workflow_revision_request.workflow_revision.id ): - return WorkflowRevisionResponse() + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"ID mismatch between path params and body params: {workflow_revision_id} != {workflow_revision_request.workflow_revision.id}", + ) workflow_revision = await self.workflows_service.edit_workflow_revision( project_id=UUID(request.state.project_id), @@ -872,7 +882,7 @@ async def edit_workflow_revision( ) workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, + count=1 if workflow_revision is not None else 0, workflow_revision=workflow_revision, ) @@ -886,12 +896,12 @@ async def archive_workflow_revision( workflow_revision_id: UUID, ) -> WorkflowRevisionResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_revision = await self.workflows_service.archive_workflow_revision( project_id=UUID(request.state.project_id), @@ -901,7 +911,7 @@ async def archive_workflow_revision( ) workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, + count=1 if workflow_revision is not None else 0, workflow_revision=workflow_revision, ) @@ -915,12 +925,12 @@ async def unarchive_workflow_revision( workflow_revision_id: UUID, ) -> WorkflowRevisionResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_revision = await self.workflows_service.unarchive_workflow_revision( project_id=UUID(request.state.project_id), @@ -930,7 +940,7 @@ async def unarchive_workflow_revision( ) workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, + count=1 if workflow_revision is not None else 0, workflow_revision=workflow_revision, ) @@ -964,12 +974,12 @@ async def query_workflow_revisions( ) if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION workflow_revisions = await self.workflows_service.query_workflow_revisions( project_id=UUID(request.state.project_id), @@ -992,27 +1002,32 @@ async def query_workflow_revisions( return workflow_revisions_response + # -------------------------------------------------------------------------- + @intercept_exceptions() async def commit_workflow_revision( self, request: Request, *, - workflow_variant_id: Optional[UUID] = None, - # workflow_revision_commit_request: WorkflowRevisionCommitRequest, + workflow_variant_id: Optional[UUID] = None, ) -> WorkflowRevisionResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.EDIT_WORKFLOWS, # type: ignore + permission=Permission.EDIT_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - if str(workflow_variant_id) != str( - workflow_revision_commit_request.workflow_revision.workflow_variant_id - ): - return WorkflowRevisionResponse() + if workflow_variant_id: + if str(workflow_variant_id) != str( + workflow_revision_commit_request.workflow_revision.workflow_variant_id + ): + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"ID mismatch between path params and body params: {workflow_variant_id} != {workflow_revision_commit_request.workflow_revision.workflow_variant_id}", + ) workflow_revision = await self.workflows_service.commit_workflow_revision( project_id=UUID(request.state.project_id), @@ -1022,7 +1037,7 @@ async def commit_workflow_revision( ) workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, + count=1 if workflow_revision is not None else 0, workflow_revision=workflow_revision, ) @@ -1034,28 +1049,30 @@ async def log_workflow_revisions( self, request: Request, *, - workflow_revisions_log_request: WorkflowRevisionsLogRequest, + workflow_log_request: WorkflowLogRequest, ) -> WorkflowRevisionsResponse: if is_ee(): - if not await check_action_access( # type: ignore + if not await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore + permission=Permission.VIEW_WORKFLOWS, ): - raise FORBIDDEN_EXCEPTION # type: ignore + raise FORBIDDEN_EXCEPTION - workflow_revisions = await self.workflows_service.log_workflow_revisions( + revisions = await self.workflows_service.log_workflow_revisions( project_id=UUID(request.state.project_id), # - workflow_revisions_log=workflow_revisions_log_request.workflow, + workflow_log=workflow_log_request.workflow, ) - workflow_revisions_response = WorkflowRevisionsResponse( - count=len(workflow_revisions), - workflow_revisions=workflow_revisions, + revisions_response = WorkflowRevisionsResponse( + count=len(revisions), + revisions=revisions, ) - return workflow_revisions_response + return revisions_response + + # —————————————————————————————————————————————————————————————————————————— @intercept_exceptions() @suppress_exceptions(default=WorkflowRevisionResponse()) @@ -1063,111 +1080,44 @@ async def retrieve_workflow_revision( self, request: Request, *, - workflow_revision_retrieve_request: WorkflowRevisionRetrieveRequest, + retrieve_request_params: Optional[WorkflowRevisionRetrieveRequest] = Depends( + parse_workflow_revision_retrieve_request_from_params + ), ) -> WorkflowRevisionResponse: - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore - - cache_key = { - "artifact_ref": workflow_revision_retrieve_request.workflow_ref, - "variant_ref": workflow_revision_retrieve_request.workflow_variant_ref, - "revision_ref": workflow_revision_retrieve_request.workflow_revision_ref, - } - - workflow_revision = None - # workflow_revision = await get_cache( - # namespace="workflows:retrieve", - # project_id=request.state.project_id, - # user_id=request.state.user_id, - # key=cache_key, - # model=WorkflowRevision, - # ) - - if not workflow_revision: - workflow_revision = await self.workflows_service.fetch_workflow_revision( - project_id=UUID(request.state.project_id), - # - workflow_ref=workflow_revision_retrieve_request.workflow_ref, - workflow_variant_ref=workflow_revision_retrieve_request.workflow_variant_ref, - workflow_revision_ref=workflow_revision_retrieve_request.workflow_revision_ref, - ) - - await set_cache( - namespace="workflows:retrieve", - project_id=request.state.project_id, - user_id=request.state.user_id, - key=cache_key, - value=workflow_revision, - ) - - workflow_revision_response = WorkflowRevisionResponse( - count=1 if workflow_revision else 0, - workflow_revision=workflow_revision, - ) - - return workflow_revision_response - - # WORKFLOW SERVICES -------------------------------------------------------- - - @intercept_exceptions() - @suppress_exceptions(default=WorkflowServiceBatchResponse()) - async def invoke_workflow( - self, - request: Request, - *, - workflow_service_request: WorkflowServiceRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.RUN_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + body_json = None + retrieve_request_body = None try: - response = await self.workflows_service.invoke_workflow( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - request=workflow_service_request, - ) + body_json = await request.json() - return await handle_invoke_success(request, response) + if body_json: + retrieve_request_body = ( + parse_workflow_revision_retrieve_request_from_body(**body_json) + ) - except Exception as exception: - return await handle_invoke_failure(exception) + except: # pylint: disable=bare-except + pass - @intercept_exceptions() - @suppress_exceptions(default=WorkflowServiceRequest()) - async def inspect_workflow( - self, - request: Request, - *, - workflow_service_request: WorkflowServiceRequest, - ): - if is_ee(): - if not await check_action_access( # type: ignore - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_WORKFLOWS, # type: ignore - ): - raise FORBIDDEN_EXCEPTION # type: ignore + workflow_revision_retrieve_request = ( + retrieve_request_params or retrieve_request_body + ) - try: - workflow_service_request = await self.workflows_service.inspect_workflow( - project_id=UUID(request.state.project_id), - user_id=UUID(request.state.user_id), - # - request=workflow_service_request, + if not workflow_revision_retrieve_request: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Could not retrieve workflow revision. Please provide a valid request.", ) - return await handle_inspect_success(workflow_service_request) + workflow_revision = await self.workflows_service.fetch_workflow_revision( + project_id=UUID(request.state.project_id), + # + workflow_variant_ref=workflow_revision_retrieve_request.workflow_variant_ref, + workflow_revision_ref=workflow_revision_retrieve_request.workflow_revision_ref, + ) - except Exception as exception: - return await handle_inspect_failure(exception) + workflow_revision_response = WorkflowRevisionResponse( + count=1 if workflow_revision is not None else 0, + workflow_revision=workflow_revision, + ) + + return workflow_revision_response diff --git a/api/oss/src/apis/fastapi/workflows/utils.py b/api/oss/src/apis/fastapi/workflows/utils.py index adcc3b2163..3c37661ac2 100644 --- a/api/oss/src/apis/fastapi/workflows/utils.py +++ b/api/oss/src/apis/fastapi/workflows/utils.py @@ -1,27 +1,20 @@ -from typing import Optional, Literal, List +from typing import Optional +from json import loads from uuid import UUID from datetime import datetime from fastapi import Query from oss.src.utils.logging import get_module_logger - -from oss.src.core.shared.dtos import ( - Windowing, - Reference, -) +from oss.src.core.shared.dtos import Reference, Meta, Flags, Windowing from oss.src.core.workflows.dtos import ( WorkflowFlags, - WorkflowQueryFlags, # WorkflowQuery, WorkflowVariantQuery, WorkflowRevisionQuery, ) -from oss.src.apis.fastapi.shared.utils import ( - parse_metadata, -) from oss.src.apis.fastapi.workflows.models import ( WorkflowQueryRequest, WorkflowVariantQueryRequest, @@ -35,13 +28,6 @@ def parse_workflow_query_request_from_params( workflow_id: Optional[UUID] = Query(None), - workflow_ids: Optional[List[UUID]] = Query(None), - workflow_slug: Optional[str] = Query(None), - workflow_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # flags: Optional[str] = Query(None), tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), @@ -49,101 +35,98 @@ def parse_workflow_query_request_from_params( include_archived: Optional[bool] = Query(None), # next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), ) -> WorkflowQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + if flags: + try: + flags = WorkflowFlags(**loads(flags)) if flags else WorkflowFlags() - __flags = WorkflowQueryFlags(**_flags) if _flags else None # type: ignore + except Exception: # pylint: disable=broad-except + flags = None - workflow = ( - WorkflowQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) + log.warn("Failed to parse flags (%s)", flags) - workflow_refs = ( - ( - [ - Reference( - id=workflow_id, - slug=workflow_slug, - ) - ] - if workflow_id or workflow_slug - else [] - ) - + ( - [ - Reference( - id=workflow_id, - slug=workflow_slug, - ) - for workflow_id, workflow_slug in zip( - workflow_ids, - workflow_slugs, - ) - ] - if workflow_ids and workflow_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) + if tags: + try: + tags = loads(tags) + except Exception: # pylint: disable=broad-except + tags = None + + log.warn("Failed to parse tags (%s)", tags) + + if meta: + try: + meta = loads(meta) + except Exception: # pylint: disable=broad-except + meta = None + + log.warn(f"Failed to parse meta ({meta})") return parse_workflow_query_request_from_body( - workflow=workflow, - # - workflow_refs=workflow_refs, + workflow_id=workflow_id, + flags=flags, + tags=tags, + meta=meta, # include_archived=include_archived, # - windowing=windowing, + next=next, + start=start, + stop=stop, + limit=limit, ) def parse_workflow_query_request_from_body( - workflow: Optional[WorkflowQuery] = None, - # - workflow_refs: Optional[List[Reference]] = None, + workflow_id: Optional[UUID] = None, + flags: Optional[WorkflowFlags] = None, + tags: Optional[dict] = None, + meta: Optional[Meta] = None, # include_archived: Optional[bool] = None, # - windowing: Optional[Windowing] = None, + next: Optional[UUID] = None, # pylint disable=redefined-builtin + start: Optional[datetime] = None, + stop: Optional[datetime] = None, + limit: Optional[int] = None, + order: Optional[str] = None, ) -> WorkflowQueryRequest: workflow_query_request = None try: workflow_query_request = WorkflowQueryRequest( - workflow=workflow, - # - workflow_refs=workflow_refs, + workflow=( + WorkflowQuery( + workflow_id=workflow_id, + # + flags=flags, + meta=meta, + tags=tags, + ) + if workflow_id or flags or meta or tags + else None + ), # include_archived=include_archived, # - windowing=windowing, + windowing=( + Windowing( + next=next, + start=start, + stop=stop, + limit=limit, + order=order, + ) + if next or start or stop or limit + else None + ), ) except Exception as e: # pylint: disable=broad-except - workflow_query_request = WorkflowQueryRequest() + log.warn("Error parsing workflow query request: %s", e) + + workflow_query_request = None return workflow_query_request @@ -152,42 +135,25 @@ def merge_workflow_query_requests( query_request_params: Optional[WorkflowQueryRequest] = None, query_request_body: Optional[WorkflowQueryRequest] = None, ) -> WorkflowQueryRequest: - if query_request_params and not query_request_body: + if query_request_body is None: return query_request_params - if not query_request_params and query_request_body: + if query_request_params is None: return query_request_body - if query_request_params and query_request_body: - return WorkflowQueryRequest( - workflow=query_request_body.workflow or query_request_params.workflow, - # - workflow_refs=query_request_body.workflow_refs - or query_request_params.workflow_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return WorkflowQueryRequest() + return WorkflowQueryRequest( + workflow=query_request_body.workflow or query_request_params.workflow, + # + include_archived=query_request_body.include_archived + or query_request_params.include_archived, + # + windowing=query_request_body.windowing or query_request_params.windowing, + ) def parse_workflow_variant_query_request_from_params( workflow_id: Optional[UUID] = Query(None), - workflow_ids: Optional[List[UUID]] = Query(None), - workflow_slug: Optional[str] = Query(None), - workflow_slugs: Optional[List[str]] = Query(None), - # workflow_variant_id: Optional[UUID] = Query(None), - workflow_variant_ids: Optional[List[UUID]] = Query(None), - workflow_variant_slug: Optional[str] = Query(None), - workflow_variant_slugs: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # flags: Optional[str] = Query(None), tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), @@ -195,131 +161,100 @@ def parse_workflow_variant_query_request_from_params( include_archived: Optional[bool] = Query(None), # next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), ) -> WorkflowVariantQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + if flags: + try: + flags = WorkflowFlags(**loads(flags)) if flags else WorkflowFlags() - __flags = WorkflowQueryFlags(**_flags) if _flags else None # type: ignore + except Exception: # pylint: disable=broad-except + flags = None - workflow_variant = ( - WorkflowVariantQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) + log.warn("Failed to parse flags (%s)", flags) - workflow_refs = ( - ( - [ - Reference( - id=workflow_id, - slug=workflow_slug, - ) - ] - if workflow_id or workflow_slug - else [] - ) - + ( - [ - Reference( - id=workflow_id, - slug=workflow_slug, - ) - for workflow_id, workflow_slug in zip( - workflow_ids, - workflow_slugs, - ) - ] - if workflow_ids and workflow_slugs - else [] - ) - ) or None + if tags: + try: + tags = loads(tags) + except Exception: # pylint: disable=broad-except + tags = None - workflow_variant_refs = ( - ( - [ - Reference( - id=workflow_variant_id, - slug=workflow_variant_slug, - ) - ] - if workflow_variant_id or workflow_variant_slug - else [] - ) - + ( - [ - Reference( - id=workflow_variant_id, - slug=workflow_variant_slug, - ) - for workflow_variant_id, workflow_variant_slug in zip( - workflow_variant_ids, - workflow_variant_slugs, - ) - ] - if workflow_variant_ids and workflow_variant_slugs - else [] - ) - ) or None - - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) + log.warn("Failed to parse tags (%s)", tags) + + if meta: + try: + meta = loads(meta) + except Exception: # pylint: disable=broad-except + meta = None + + log.warn(f"Failed to parse meta ({meta})") return parse_workflow_variant_query_request_from_body( - workflow_variant=workflow_variant, - # - workflow_refs=workflow_refs or None, - workflow_variant_refs=workflow_variant_refs or None, + workflow_id=workflow_id, + workflow_variant_id=workflow_variant_id, + flags=flags, + tags=tags, + meta=meta, # include_archived=include_archived, # - windowing=windowing, + next=next, + start=start, + stop=stop, + limit=limit, ) def parse_workflow_variant_query_request_from_body( - workflow_variant: Optional[WorkflowVariantQuery] = None, - # - workflow_refs: Optional[List[Reference]] = None, - workflow_variant_refs: Optional[List[Reference]] = None, + workflow_id: Optional[UUID] = None, + workflow_variant_id: Optional[UUID] = None, + flags: Optional[WorkflowFlags] = None, + tags: Optional[dict] = None, + meta: Optional[Meta] = None, # include_archived: Optional[bool] = None, # - windowing: Optional[Windowing] = None, + next: Optional[UUID] = None, # pylint disable=redefined-builtin + start: Optional[datetime] = None, + stop: Optional[datetime] = None, + limit: Optional[int] = None, + order: Optional[str] = None, ) -> WorkflowVariantQueryRequest: workflow_variant_query_request = None try: workflow_variant_query_request = WorkflowVariantQueryRequest( - workflow_variant=workflow_variant, - # - workflow_refs=workflow_refs, - workflow_variant_refs=workflow_variant_refs, + workflow_variant=( + WorkflowVariantQuery( + workflow_id=workflow_id, + workflow_variant_id=workflow_variant_id, + flags=flags, + meta=meta, + tags=tags, + ) + if workflow_id or workflow_variant_id or flags or meta or tags + else None + ), # include_archived=include_archived, # - windowing=windowing, + windowing=( + Windowing( + next=next, + start=start, + stop=stop, + limit=limit, + order=order, + ) + if next or start or stop or limit + else None + ), ) except Exception as e: # pylint: disable=broad-except - workflow_variant_query_request = WorkflowVariantQueryRequest() + log.warn("Error parsing workflow variant body request: %s", e) + + workflow_variant_query_request = None return workflow_variant_query_request @@ -328,52 +263,27 @@ def merge_workflow_variant_query_requests( query_request_params: Optional[WorkflowVariantQueryRequest] = None, query_request_body: Optional[WorkflowVariantQueryRequest] = None, ) -> WorkflowVariantQueryRequest: - if query_request_params and not query_request_body: + if query_request_body is None: return query_request_params - if not query_request_params and query_request_body: + if query_request_params is None: return query_request_body - if query_request_params and query_request_body: - return WorkflowVariantQueryRequest( - workflow_variant=query_request_body.workflow_variant - or query_request_params.workflow_variant, - # - workflow_refs=query_request_body.workflow_refs - or query_request_params.workflow_refs, - workflow_variant_refs=query_request_body.workflow_variant_refs - or query_request_params.workflow_variant_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return WorkflowVariantQueryRequest() + return WorkflowVariantQueryRequest( + workflow_variant=query_request_body.workflow_variant + or query_request_params.workflow_variant, + # + include_archived=query_request_body.include_archived + or query_request_params.include_archived, + # + windowing=query_request_body.windowing or query_request_params.windowing, + ) def parse_workflow_revision_query_request_from_params( workflow_id: Optional[UUID] = Query(None), - workflow_ids: Optional[List[UUID]] = Query(None), - workflow_slug: Optional[str] = Query(None), - workflow_slugs: Optional[List[str]] = Query(None), - # workflow_variant_id: Optional[UUID] = Query(None), - workflow_variant_ids: Optional[List[UUID]] = Query(None), - workflow_variant_slug: Optional[str] = Query(None), - workflow_variant_slugs: Optional[List[str]] = Query(None), - # workflow_revision_id: Optional[UUID] = Query(None), - workflow_revision_ids: Optional[List[UUID]] = Query(None), - workflow_revision_slug: Optional[str] = Query(None), - workflow_revision_slugs: Optional[List[str]] = Query(None), - workflow_revision_version: Optional[str] = Query(None), - workflow_revision_versions: Optional[List[str]] = Query(None), - # - name: Optional[str] = Query(None), - description: Optional[str] = Query(None), - # flags: Optional[str] = Query(None), tags: Optional[str] = Query(None), meta: Optional[str] = Query(None), @@ -381,199 +291,135 @@ def parse_workflow_revision_query_request_from_params( include_archived: Optional[bool] = Query(None), # next: Optional[UUID] = Query(None), # pylint disable=redefined-builtin - newest: Optional[datetime] = Query(None), - oldest: Optional[datetime] = Query(None), + start: Optional[datetime] = Query(None), + stop: Optional[datetime] = Query(None), limit: Optional[int] = Query(None), - order: Optional[Literal["ascending", "descending"]] = Query(None), ) -> WorkflowRevisionQueryRequest: - _flags, _tags, _meta = parse_metadata(flags, tags, meta) + if flags: + try: + flags = WorkflowFlags(**loads(flags)) if flags else WorkflowFlags() - __flags = WorkflowQueryFlags(**_flags) if _flags else None # type: ignore + except Exception: # pylint: disable=broad-except + flags = None - workflow_revision = ( - WorkflowRevisionQuery( - name=name, - description=description, - # - flags=__flags, - meta=_meta, - tags=_tags, - ) - if __flags or _meta or _tags - else None - ) + log.warn("Failed to parse flags (%s)", flags) - workflow_refs = ( - [ - Reference( - id=workflow_id, - slug=workflow_slug, - ) - ] - if workflow_id or workflow_slug - else [] - ) + ( - [ - Reference( - id=workflow_id, - slug=workflow_slug, - ) - for workflow_id, workflow_slug in zip( - workflow_ids, - workflow_slugs, - ) - ] - if workflow_ids and workflow_slugs - else [] - ) + if tags: + try: + tags = loads(tags) + except Exception: + tags = None - workflow_variant_refs = ( - [ - Reference( - id=workflow_variant_id, - slug=workflow_variant_slug, - ) - ] - if workflow_variant_id or workflow_variant_slug - else [] - ) + ( - [ - Reference( - id=workflow_variant_id, - slug=workflow_variant_slug, - ) - for workflow_variant_id, workflow_variant_slug in zip( - workflow_variant_ids, - workflow_variant_slugs, - ) - ] - if workflow_variant_ids and workflow_variant_slugs - else [] - ) + log.warn("Failed to parse tags (%s)", tags) - workflow_revision_refs = ( - [ - Reference( - id=workflow_revision_id, - slug=workflow_revision_slug, - version=workflow_revision_version, - ) - ] - if workflow_revision_id or workflow_revision_slug or workflow_revision_version - else [] - ) + ( - [ - Reference( - id=workflow_revision_id, - slug=workflow_revision_slug, - version=workflow_revision_version, - ) - for workflow_revision_id, workflow_revision_slug, workflow_revision_version in zip( - workflow_revision_ids, - workflow_revision_slugs, - workflow_revision_versions, - ) - ] - if workflow_revision_ids - and workflow_revision_slugs - and workflow_revision_versions - else [] - ) + if meta: + try: + meta = loads(meta) + except Exception: + meta = None - windowing = ( - Windowing( - next=next, - newest=newest, - oldest=oldest, - limit=limit, - order=order, - ) - if next or newest or oldest or limit or order - else None - ) + log.warn(f"Failed to parse meta ({meta})") return parse_workflow_revision_query_request_from_body( - workflow_revision=workflow_revision, - # - workflow_refs=workflow_refs, - workflow_variant_refs=workflow_variant_refs, - workflow_revision_refs=workflow_revision_refs, + workflow_id=workflow_id, + workflow_variant_id=workflow_variant_id, + workflow_revision_id=workflow_revision_id, + flags=flags, + tags=tags, + meta=meta, # include_archived=include_archived, # - windowing=windowing, + next=next, + start=start, + stop=stop, + limit=limit, ) def parse_workflow_revision_query_request_from_body( - workflow_revision: Optional[WorkflowRevisionQuery] = None, - # - workflow_refs: Optional[List[Reference]] = None, - workflow_variant_refs: Optional[List[Reference]] = None, - workflow_revision_refs: Optional[List[Reference]] = None, + workflow_id: Optional[UUID] = None, + workflow_variant_id: Optional[UUID] = None, + workflow_revision_id: Optional[UUID] = None, + flags: Optional[WorkflowFlags] = None, + tags: Optional[dict] = None, + meta: Optional[Meta] = None, # include_archived: Optional[bool] = None, # - windowing: Optional[Windowing] = None, + next: Optional[UUID] = None, # pylint disable=redefined-builtin + start: Optional[datetime] = None, + stop: Optional[datetime] = None, + limit: Optional[int] = None, + order: Optional[str] = None, ) -> WorkflowRevisionQueryRequest: workflow_revision_query_request = None try: workflow_revision_query_request = WorkflowRevisionQueryRequest( - workflow_revision=workflow_revision, - # - workflow_refs=workflow_refs, - workflow_variant_refs=workflow_variant_refs, - workflow_revision_refs=workflow_revision_refs, + workflow_revision=( + WorkflowRevisionQuery( + workflow_id=workflow_id, + workflow_variant_id=workflow_variant_id, + workflow_revision_id=workflow_revision_id, + flags=flags, + meta=meta, + tags=tags, + ) + if workflow_id + or workflow_variant_id + or workflow_revision_id + or flags + or meta + or tags + else None + ), # include_archived=include_archived, # - windowing=windowing, + windowing=( + Windowing( + next=next, + start=start, + stop=stop, + limit=limit, + order=order, + ) + if next or start or stop or limit + else None + ), ) except Exception as e: # pylint: disable=broad-except log.warn(e) - workflow_revision_query_request = WorkflowRevisionQueryRequest() + workflow_revision_query_request = None return workflow_revision_query_request def merge_workflow_revision_query_requests( - query_request_params: Optional[WorkflowRevisionQueryRequest] = None, + query_request_param: Optional[WorkflowRevisionQueryRequest] = None, query_request_body: Optional[WorkflowRevisionQueryRequest] = None, ) -> WorkflowRevisionQueryRequest: - if query_request_params and not query_request_body: - return query_request_params + if query_request_body is None: + return query_request_param - if not query_request_params and query_request_body: + if query_request_param is None: return query_request_body - if query_request_params and query_request_body: - return WorkflowRevisionQueryRequest( - workflow_revision=query_request_body.workflow_revision - or query_request_params.workflow_revision, - # - workflow_refs=query_request_body.workflow_refs - or query_request_params.workflow_refs, - workflow_variant_refs=query_request_body.workflow_variant_refs - or query_request_params.workflow_variant_refs, - workflow_revision_refs=query_request_body.workflow_revision_refs - or query_request_params.workflow_revision_refs, - # - include_archived=query_request_body.include_archived - or query_request_params.include_archived, - # - windowing=query_request_body.windowing or query_request_params.windowing, - ) - - return WorkflowRevisionQueryRequest() + return WorkflowRevisionQueryRequest( + workflow_revision=query_request_body.workflow_revision + or query_request_param.workflow_revision, + # + include_archived=query_request_body.include_archived + or query_request_param.include_archived, + # + windowing=query_request_body.windowing or query_request_param.windowing, + ) def parse_workflow_revision_retrieve_request_from_params( - workflow_id: Optional[UUID] = Query(None), - workflow_slug: Optional[str] = Query(None), - # workflow_variant_id: Optional[UUID] = Query(None), workflow_variant_slug: Optional[str] = Query(None), # @@ -581,48 +427,53 @@ def parse_workflow_revision_retrieve_request_from_params( workflow_revision_slug: Optional[str] = Query(None), workflow_revision_version: Optional[str] = Query(None), ): - workflow_ref = ( - Reference( - id=workflow_id, - slug=workflow_slug, - ) - if workflow_id or workflow_slug - else None - ) - - workflow_variant_ref = ( - Reference( - id=workflow_variant_id, - slug=workflow_variant_slug, - ) - if workflow_variant_id or workflow_variant_slug - else None - ) - - workflow_revision_ref = ( - Reference( - id=workflow_revision_id, - slug=workflow_revision_slug, - version=workflow_revision_version, - ) - if workflow_revision_id or workflow_revision_slug or workflow_revision_version - else None - ) - return parse_workflow_revision_retrieve_request_from_body( - workflow_ref=workflow_ref, - workflow_variant_ref=workflow_variant_ref, - workflow_revision_ref=workflow_revision_ref, + workflow_variant_id=workflow_variant_id, + workflow_variant_slug=workflow_variant_slug, + # + workflow_revision_id=workflow_revision_id, + workflow_revision_slug=workflow_revision_slug, + workflow_revision_version=workflow_revision_version, ) def parse_workflow_revision_retrieve_request_from_body( - workflow_ref: Optional[Reference] = None, - workflow_variant_ref: Optional[Reference] = None, - workflow_revision_ref: Optional[Reference] = None, -) -> WorkflowRevisionRetrieveRequest: - return WorkflowRevisionRetrieveRequest( - workflow_ref=workflow_ref, - workflow_variant_ref=workflow_variant_ref, - workflow_revision_ref=workflow_revision_ref, + workflow_variant_id: Optional[UUID] = None, + workflow_variant_slug: Optional[str] = None, + # + workflow_revision_id: Optional[UUID] = None, + workflow_revision_slug: Optional[str] = None, + workflow_revision_version: Optional[str] = None, +) -> Optional[WorkflowRevisionRetrieveRequest]: + return ( + WorkflowRevisionRetrieveRequest( + workflow_variant_ref=( + Reference( + id=workflow_variant_id, + slug=workflow_variant_slug, + ) + if workflow_variant_id or workflow_variant_slug + else None + ), + # + workflow_revision_ref=( + Reference( + id=workflow_revision_id, + slug=workflow_revision_slug, + version=workflow_revision_version, + ) + if workflow_revision_id + or workflow_revision_slug + or workflow_revision_version + else None + ), + ) + if ( + workflow_variant_id + or workflow_variant_slug + or workflow_revision_id + or workflow_revision_slug + or workflow_revision_version + ) + else None ) diff --git a/api/oss/src/celery_config.py b/api/oss/src/celery_config.py index 5e60096278..2ddbbb5457 100644 --- a/api/oss/src/celery_config.py +++ b/api/oss/src/celery_config.py @@ -12,13 +12,15 @@ worker_hijack_root_logger = False # CELERY_TASK_TRACK_STARTED = True -TASK_NAMES = [ - "src.tasks.evaluations.legacy.annotate", - "src.tasks.evaluations.live.evaluate", - "src.tasks.evaluations.batch.evaluate_queries", - "src.tasks.evaluations.batch.evaluate_testsets", -] - -task_routes = {name: {"queue": name, "routing_key": name} for name in TASK_NAMES} - -task_queues = [Queue(name, Exchange(name), routing_key=name) for name in TASK_NAMES] +task_queues = ( + Queue( + "src.tasks.evaluations.evaluate", + Exchange("src.tasks.evaluations.evaluate"), + routing_key="src.tasks.evaluations.evaluate", + ), + Queue( + "src.tasks.evaluations.annotate", + Exchange("src.tasks.evaluations.annotate"), + routing_key="src.tasks.evaluations.annotate", + ), +) diff --git a/api/oss/src/core/annotations/__init__.py b/api/oss/src/core/annotations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/core/annotations/service.py b/api/oss/src/core/annotations/service.py deleted file mode 100644 index c7229ffbdc..0000000000 --- a/api/oss/src/core/annotations/service.py +++ /dev/null @@ -1,1165 +0,0 @@ -from typing import Optional, List, Dict, Any, Union -from uuid import UUID, uuid4 - -from fastapi import Request -from genson import SchemaBuilder - -from oss.src.utils.logging import get_module_logger - -from oss.src.core.evaluators.service import EvaluatorsService -from oss.src.core.evaluators.service import SimpleEvaluatorsService - -from oss.src.core.shared.dtos import ( - Tags, - Meta, - Data, - Reference, - Link, - Windowing, -) -from oss.src.core.tracing.dtos import ( - Focus, - Format, - TracingQuery, - Formatting, - Condition, - Filtering, - OTelReference, - OTelLink, - LogicalOperator, - ComparisonOperator, - ListOperator, - TraceType, - SpanType, -) -from oss.src.core.evaluators.dtos import ( - SimpleEvaluatorFlags, - SimpleEvaluatorQueryFlags, - # - SimpleEvaluatorData, -) - - -from oss.src.core.tracing.utils import ( - parse_into_attributes, - parse_from_attributes, -) -from oss.src.core.annotations.types import ( - AnnotationOrigin, - AnnotationKind, - AnnotationChannel, - AnnotationReferences, - AnnotationLinks, - AnnotationFlags, - AnnotationQueryFlags, - # - Annotation, - AnnotationCreate, - AnnotationEdit, - AnnotationQuery, -) - -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.apis.fastapi.tracing.models import ( - OTelFlatSpan, - OTelTracingRequest, - OTelTracingResponse, -) -from oss.src.apis.fastapi.evaluators.models import SimpleEvaluatorCreate - -from oss.src.core.annotations.utils import validate_data_against_schema - - -log = get_module_logger(__name__) - - -class AnnotationsService: - def __init__( - self, - *, - evaluators_service: EvaluatorsService, - simple_evaluators_service: SimpleEvaluatorsService, - tracing_router: TracingRouter, - ): - self.evaluators_service = evaluators_service - self.simple_evaluators_service = simple_evaluators_service - self.tracing_router = tracing_router - - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - annotation_create: AnnotationCreate, - ) -> Optional[Annotation]: - simple_evaluator_slug = ( - annotation_create.references.evaluator.slug - if annotation_create.references.evaluator - else None - ) or uuid4().hex[-12:] - - simple_evaluator_flags = SimpleEvaluatorFlags( - is_evaluator=True, - is_custom=annotation_create.origin == AnnotationOrigin.CUSTOM, - is_human=annotation_create.origin == AnnotationOrigin.HUMAN, - ) - - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_ref=annotation_create.references.evaluator, - evaluator_variant_ref=annotation_create.references.evaluator_variant, - evaluator_revision_ref=annotation_create.references.evaluator_revision, - ) - - if evaluator_revision is None: - builder = SchemaBuilder() - builder.add_object(annotation_create.data) - evaluator_outputs_schema: Dict[str, Any] = builder.to_schema() - - simple_evaluator_data = SimpleEvaluatorData( - schemas=dict( - outputs=evaluator_outputs_schema, - ), - service=dict( - agenta="v0.1.0", - format=evaluator_outputs_schema, - ), - ) - - simple_evaluator_create = SimpleEvaluatorCreate( - slug=simple_evaluator_slug, - # - name=simple_evaluator_slug, - # - flags=simple_evaluator_flags, - # - data=simple_evaluator_data, - ) - - simple_evaluator = await self.simple_evaluators_service.create( - project_id=project_id, - user_id=user_id, - # - simple_evaluator_create=simple_evaluator_create, - ) - - if simple_evaluator: - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_ref=Reference(id=simple_evaluator.id), - ) - elif evaluator_revision.evaluator_id: - simple_evaluator = await self.simple_evaluators_service.fetch( - project_id=project_id, - evaluator_id=evaluator_revision.evaluator_id, - ) - else: - simple_evaluator = None - - if not evaluator_revision or not evaluator_revision.data: - return None - - validate_data_against_schema( - annotation_create.data, - ( - evaluator_revision.data.service.get("format", {}) - if evaluator_revision.data.service - else {} - ), - ) - - annotation_create.references.evaluator = Reference( - id=evaluator_revision.evaluator_id, - slug=( - annotation_create.references.evaluator.slug - if annotation_create.references.evaluator - else None - ), - ) - - annotation_create.references.evaluator_variant = Reference( - id=evaluator_revision.evaluator_variant_id, - slug=( - annotation_create.references.evaluator_variant.slug - if annotation_create.references.evaluator_variant - else None - ), - ) - - annotation_create.references.evaluator_revision = Reference( - id=evaluator_revision.id, - slug=evaluator_revision.slug, - version=evaluator_revision.version, - ) - - annotation_flags = AnnotationFlags( - is_evaluator=True, - is_custom=annotation_create.origin == AnnotationOrigin.CUSTOM, - is_human=annotation_create.origin == AnnotationOrigin.HUMAN, - is_sdk=annotation_create.channel == AnnotationChannel.SDK, - is_web=annotation_create.channel == AnnotationChannel.WEB, - is_evaluation=annotation_create.kind == AnnotationKind.EVAL, - ) - - annotation_references = AnnotationReferences( - **annotation_create.references.model_dump(), - ) - - annotation_link = await self._create_annotation( - project_id=project_id, - user_id=user_id, - # - name=simple_evaluator.name if simple_evaluator else None, - # - flags=annotation_flags, - tags=annotation_create.tags, - meta=annotation_create.meta, - # - data=annotation_create.data, - # - references=annotation_references, - links=annotation_create.links, - ) - - if annotation_link is None: - return None - - annotation = await self._fetch_annotation( - project_id=project_id, - # - annotation_link=annotation_link, - ) - - return annotation - - async def fetch( - self, - *, - project_id: UUID, - # - trace_id: str, - span_id: Optional[str] = None, - ): - annotation_link = Link( - trace_id=trace_id, - span_id=span_id, - ) - - annotation: Optional[Annotation] = await self._fetch_annotation( - project_id=project_id, - # - annotation_link=annotation_link, - ) - return annotation - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - trace_id: str, - span_id: Optional[str] = None, - # - annotation_edit: AnnotationEdit, - ): - annotation_link = Link( - trace_id=trace_id, - span_id=span_id, - ) - - annotation: Optional[Annotation] = await self._fetch_annotation( - project_id=project_id, - # - annotation_link=annotation_link, - ) - - if annotation is None: - return None - - simple_evaluator_slug = ( - annotation.references.evaluator.slug - if annotation.references.evaluator - else None - ) or uuid4().hex[-12:] - - simple_evaluator_flags = SimpleEvaluatorFlags( - is_evaluator=True, - is_custom=annotation.origin == AnnotationOrigin.CUSTOM, - is_human=annotation.origin == AnnotationOrigin.HUMAN, - ) - - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_ref=annotation.references.evaluator, - evaluator_variant_ref=annotation.references.evaluator_variant, - evaluator_revision_ref=annotation.references.evaluator_revision, - ) - - if not evaluator_revision: - builder = SchemaBuilder() - builder.add_object(annotation_edit.data) - evaluator_outputs_schema: Dict[str, Any] = builder.to_schema() - - simple_evaluator_data = SimpleEvaluatorData( - schemas=dict( - outputs=evaluator_outputs_schema, - ), - service=dict( - agenta="v0.1.0", - format=evaluator_outputs_schema, - ), - ) - - simple_evaluator_create = SimpleEvaluatorCreate( - slug=simple_evaluator_slug, - # - name=simple_evaluator_slug, - # - flags=simple_evaluator_flags, - # - data=simple_evaluator_data, - ) - - simple_evaluator = await self.simple_evaluators_service.create( - project_id=project_id, - user_id=user_id, - # - simple_evaluator_create=simple_evaluator_create, - ) - - if simple_evaluator: - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_ref=Reference(id=simple_evaluator.id), - ) - - if not evaluator_revision or not evaluator_revision.data: - return None - - validate_data_against_schema( - annotation_edit.data, - ( - evaluator_revision.data.service.get("format", {}) - if evaluator_revision.data.service - else {} - ), - ) - - if evaluator_revision: - annotation.references.evaluator = Reference( - id=evaluator_revision.evaluator_id, - slug=( - annotation.references.evaluator.slug - if annotation.references.evaluator - else None - ), - ) - - annotation.references.evaluator_variant = Reference( - id=evaluator_revision.evaluator_variant_id, - slug=( - annotation.references.evaluator_variant.slug - if annotation.references.evaluator_variant - else None - ), - ) - - annotation.references.evaluator_revision = Reference( - id=evaluator_revision.id, - slug=evaluator_revision.slug, - version=evaluator_revision.version, - ) - - annotation_flags = AnnotationFlags( - is_evaluator=True, - is_custom=annotation.origin == AnnotationOrigin.CUSTOM, - is_human=annotation.origin == AnnotationOrigin.HUMAN, - is_sdk=annotation.channel == AnnotationChannel.SDK, - is_web=annotation.channel == AnnotationChannel.WEB, - is_evaluation=annotation.kind == AnnotationKind.EVAL, - ) - - annotation_references = AnnotationReferences( - **annotation.references.model_dump(), - ) - - annotation_link = await self._edit_annotation( - project_id=project_id, - user_id=user_id, - # - annotation=annotation, - # - flags=annotation_flags, - tags=annotation_edit.tags, - meta=annotation_edit.meta, - # - data=annotation_edit.data, - # - references=annotation_references, - links=annotation.links, - ) - - if annotation_link is None: - return None - - annotation = await self._fetch_annotation( - project_id=project_id, - # - annotation_link=annotation_link, - ) - - return annotation - - async def delete( - self, - *, - project_id: UUID, - user_id: UUID, - # - trace_id: str, - span_id: Optional[str] = None, - ): - annotation_link = Link( - trace_id=trace_id, - span_id=span_id, - ) - - annotation_link = await self._delete_annotation( - project_id=project_id, - user_id=user_id, - # - annotation_link=annotation_link, - ) - - return annotation_link - - async def query( - self, - *, - project_id: UUID, - # - annotation_query: Optional[AnnotationQuery] = None, - # - annotation_links: Optional[AnnotationLinks] = None, - # - windowing: Optional[Windowing] = None, - ): - annotation = annotation_query if annotation_query else None - annotation_flags = AnnotationQueryFlags(is_evaluator=True) - - if annotation: - if annotation.origin: - annotation_flags.is_custom = ( - annotation.origin == AnnotationOrigin.CUSTOM - ) - annotation_flags.is_human = annotation.origin == AnnotationOrigin.HUMAN - - if annotation.channel: - annotation_flags.is_sdk = annotation.channel == AnnotationChannel.SDK - annotation_flags.is_web = annotation.channel == AnnotationChannel.WEB - - if annotation.kind: - annotation_flags.is_evaluation = annotation.kind == AnnotationKind.EVAL - - annotation_tags = annotation.tags if annotation else None - annotation_meta = annotation.meta if annotation else None - - annotation_references = ( - AnnotationReferences( - **annotation.references.model_dump(), - ) - if annotation and annotation.references - else None - ) - - _annotation_links = annotation.links if annotation else None - - annotations = await self._query_annotation( - project_id=project_id, - # - flags=annotation_flags, - tags=annotation_tags, - meta=annotation_meta, - # - references=annotation_references, - links=_annotation_links, - # - annotation_links=annotation_links, - # - windowing=windowing, - ) - return annotations - - # -------- Internal Functions ------------------------------------------------------------------- - - async def _create_annotation( - self, - *, - project_id: UUID, - user_id: UUID, - # - name: Optional[str], - # - flags: AnnotationFlags, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - # - data: Data, - # - references: AnnotationReferences, - links: AnnotationLinks, - ) -> Optional[Link]: - trace_id = uuid4().hex - trace_type = TraceType.ANNOTATION - - span_id = uuid4().hex[16:] - span_type = SpanType.TASK - span_name = name or references.evaluator.slug or "annotation" - - _references = references.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - - if isinstance(links, dict): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": key}, # type: ignore - ) - for key, link in links.items() - if link.trace_id and link.span_id - ] - elif isinstance(links, list): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": "key"}, # type: ignore - ) - for link in links - if link.trace_id and link.span_id - ] - - else: - _links = None - - _flags = flags.model_dump(mode="json", exclude_none=True) - - _type = { - "trace": "annotation", - "span": "task", - } - - _attributes = parse_into_attributes( - type=_type, - flags=_flags, - tags=tags, - meta=meta, - data=data, - references=_references, - ) - - trace_request = OTelTracingRequest( - spans=[ - OTelFlatSpan( - trace_id=trace_id, - trace_type=trace_type, - span_id=span_id, - span_type=span_type, - span_name=span_name, - attributes=_attributes, - links=_links, - ) - ] - ) - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - _links_response = await self.tracing_router.create_trace( - request=request, - # - trace_request=trace_request, - ) - - _link = ( - Link( - trace_id=_links_response.links[0].trace_id, - span_id=_links_response.links[0].span_id, - ) - if _links_response.links and len(_links_response.links) > 0 - else None - ) - - return _link - - async def _fetch_annotation( - self, - *, - project_id: UUID, - user_id: Optional[UUID] = None, - # - annotation_link: Link, - ) -> Optional[Annotation]: - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) if user_id else None - - if not annotation_link.trace_id: - return None - - trace_response: OTelTracingResponse = await self.tracing_router.fetch_trace( - request=request, - # - trace_id=annotation_link.trace_id, - ) - - if not trace_response or not trace_response.traces: - return None - - traces = list(trace_response.traces.values()) - trace = traces[0] if traces else None - - if not trace or not trace.spans: - return None - - spans = list(trace.spans.values()) - root_span = spans[0] if spans else None - - if not root_span or isinstance(root_span, list): - return None - - ( - type, - flags, - tags, - meta, - data, - references, - ) = parse_from_attributes(root_span.attributes or {}) - - if not data: - return None - - _references = AnnotationReferences( - **{ - key: Reference( - id=ref.get("id"), - slug=ref.get("slug"), - version=ref.get("version"), - ) - for key, ref in (references or {}).items() - } - ) - - _links = dict( - **{ - str(link.attributes["key"]): Link( - trace_id=link.trace_id, - span_id=link.span_id, - ) - for link in root_span.links or [] - if link.attributes and "key" in link.attributes - } - ) - - _origin = ( - ( - flags.get("is_custom") - and AnnotationOrigin.CUSTOM - or flags.get("is_human") - and AnnotationOrigin.HUMAN - or AnnotationOrigin.AUTO - ) - if flags - else AnnotationOrigin.CUSTOM - ) - - _kind = ( - (flags.get("is_evaluation") and AnnotationKind.EVAL or AnnotationKind.ADHOC) - if flags - else AnnotationKind.ADHOC - ) - - _channel = ( - ( - flags.get("is_sdk") - and AnnotationChannel.SDK - or flags.get("is_web") - and AnnotationChannel.WEB - or AnnotationChannel.API - ) - if flags - else AnnotationChannel.API - ) - - annotation = Annotation( - trace_id=root_span.trace_id, - span_id=root_span.span_id, - # - created_at=root_span.created_at, - updated_at=root_span.updated_at, - deleted_at=root_span.deleted_at, - created_by_id=root_span.created_by_id, - updated_by_id=root_span.updated_by_id, - deleted_by_id=root_span.deleted_by_id, - # - origin=_origin, - kind=_kind, - channel=_channel, - # - tags=tags, - meta=meta, - # - data=data, - # - references=_references, - links=_links, - ) - - return annotation - - async def _edit_annotation( - self, - *, - project_id: UUID, - user_id: UUID, - # - annotation: Annotation, - # - flags: AnnotationFlags, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - # - data: Data, - # - references: AnnotationReferences, - links: AnnotationLinks, - ) -> Optional[Link]: - if not annotation.trace_id or not annotation.span_id: - return None - - _references = references.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - - if isinstance(links, dict): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": key}, # type: ignore - ) - for key, link in links.items() - if link.trace_id and link.span_id - ] - elif isinstance(links, list): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": "key"}, # type: ignore - ) - for link in links - if link.trace_id and link.span_id - ] - else: - _links = None - - _flags = flags.model_dump(mode="json", exclude_none=True) - - _type = { - "trace": "annotation", - "span": "task", - } - - _attributes = parse_into_attributes( - type=_type, - flags=_flags, - tags=tags, - meta=meta, - data=data, - references=_references, - ) - - trace_request = OTelTracingRequest( - spans=[ - OTelFlatSpan( - trace_id=annotation.trace_id, - span_id=annotation.span_id, - attributes=_attributes, - links=_links, - ) - ] - ) - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - _links_response = await self.tracing_router.edit_trace( - request=request, - # - trace_id=annotation.trace_id, - # - trace_request=trace_request, - ) - - _link = ( - Link( - trace_id=_links_response.links[0].trace_id, - span_id=_links_response.links[0].span_id, - ) - if _links_response.links and len(_links_response.links) > 0 - else None - ) - - return _link - - async def _delete_annotation( - self, - *, - project_id: UUID, - user_id: UUID, - # - annotation_link: Link, - ) -> Optional[Link]: - if not annotation_link.trace_id: - return None - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - link_response = await self.tracing_router.delete_trace( - request=request, - # - trace_id=annotation_link.trace_id, - ) - - link = link_response.links[0] if link_response.links else None - - if not link or not link.trace_id or not link.span_id: - return None - - annotation_link = Link( - trace_id=link.trace_id, - span_id=link.span_id, - ) - - return annotation_link - - async def _query_annotation( - self, - *, - project_id: UUID, - user_id: Optional[UUID] = None, - # - flags: Optional[AnnotationFlags] = None, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - # - references: Optional[AnnotationReferences] = None, - links: Optional[AnnotationLinks] = None, - # - annotation_links: Optional[List[Link]] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[Annotation]: - formatting = Formatting( - focus=Focus.TRACE, - format=Format.AGENTA, - ) - - filtering = Filtering() - - conditions: List[Union[Condition, Filtering]] = [ - Condition( - field="attributes", - key="ag.type.trace", - value="annotation", - operator=ComparisonOperator.IS, - ) - ] - - trace_ids = ( - [annotation_link.trace_id for annotation_link in annotation_links] - if annotation_links - else None - ) - - # span_ids = ( - # [annotation_link.span_id for annotation_link in annotation_links] - # if annotation_links - # else None - # ) - - if trace_ids: - conditions.append( - Condition( - field="trace_id", - value=trace_ids, - operator=ListOperator.IN, - ) - ) - - # if span_ids: - # conditions.append( - # Condition( - # field="span_id", - # value=span_ids, - # operator=ListOperator.IN, - # ) - # ) - - if flags: - for key, value in flags.model_dump(mode="json", exclude_none=True).items(): - conditions.append( - Condition( - field="attributes", - key=f"ag.flags.{key}", - value=value, - operator=ComparisonOperator.IS, - ) - ) - - if tags: - for key, value in tags.items(): - conditions.append( - Condition( - field="attributes", - key=f"ag.tags.{key}", - value=value, # type:ignore - operator=ComparisonOperator.IS, - ) - ) - - if meta: - for key, value in meta.items(): - conditions.append( - Condition( - field="attributes", - key=f"ag.meta.{key}", - value=value, # type:ignore - operator=ComparisonOperator.IS, - ) - ) - - if references: - for _, reference in references.model_dump(mode="json").items(): - if reference: - ref_id = str(reference.get("id")) if reference.get("id") else None - ref_slug = ( - str(reference.get("slug")) if reference.get("slug") else None - ) - conditions.append( - Condition( - field="references", - value=[ - {"id": ref_id, "slug": ref_slug}, - ], - operator=ListOperator.IN, - ) - ) - - if links: - if isinstance(links, dict): - for _, link in links.items(): - if link: - conditions.append( - Condition( - field="links", - value=[ - { - "trace_id": link.trace_id, - "span_id": link.span_id, - }, - ], - operator=ListOperator.IN, - ) - ) - elif isinstance(links, list): - _conditions = [] - for link in links: - if link: - _conditions.append( - Condition( - field="links", - value=[ - { - "trace_id": link.trace_id, - "span_id": link.span_id, - }, - ], - operator=ListOperator.IN, - ) - ) - if _conditions: - conditions.append( - Filtering( - operator=LogicalOperator.OR, - conditions=_conditions, - ) - ) - - if conditions: - filtering = Filtering( - operator=LogicalOperator.AND, - conditions=conditions, - ) - - query = TracingQuery( - formatting=formatting, - filtering=filtering, - windowing=windowing, - ) - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) if user_id else None - - spans_response: OTelTracingResponse = await self.tracing_router.query_spans( - request=request, - # - query=query, - ) - - if not spans_response or not spans_response.traces: - return [] - - traces = list(spans_response.traces.values()) - - annotations = [] - - for trace in traces: - if not trace or not trace.spans: - continue - - spans = list(trace.spans.values()) - root_span = spans[0] if spans else None - - if not root_span or isinstance(root_span, list): - continue - - ( - __type, - __flags, - __tags, - __meta, - __data, - __references, - ) = parse_from_attributes(root_span.attributes or {}) - - if not __data: - continue - - _references = AnnotationReferences( - **{ - key: Reference( - id=ref.get("id"), - slug=ref.get("slug"), - version=ref.get("version"), - ) - for key, ref in (__references or {}).items() - } - ) - - _links = dict( - **{ - str(link.attributes["key"]): Link( - trace_id=link.trace_id, - span_id=link.span_id, - ) - for link in root_span.links or [] - if link.attributes and "key" in link.attributes - } - ) - - _origin = ( - ( - __flags.get("is_custom") - and AnnotationOrigin.CUSTOM - or __flags.get("is_human") - and AnnotationOrigin.HUMAN - or AnnotationOrigin.AUTO - ) - if __flags - else AnnotationOrigin.CUSTOM - ) - - _kind = ( - ( - __flags.get("is_evaluation") - and AnnotationKind.EVAL - or AnnotationKind.ADHOC - ) - if __flags - else AnnotationKind.ADHOC - ) - - _channel = ( - ( - __flags.get("is_sdk") - and AnnotationChannel.SDK - or __flags.get("is_web") - and AnnotationChannel.WEB - or AnnotationChannel.API - ) - if __flags - else AnnotationChannel.API - ) - - annotation = Annotation( - trace_id=root_span.trace_id, - span_id=root_span.span_id, - # - created_at=root_span.created_at, - updated_at=root_span.updated_at, - deleted_at=root_span.deleted_at, - created_by_id=root_span.created_by_id, - updated_by_id=root_span.updated_by_id, - deleted_by_id=root_span.deleted_by_id, - # - origin=_origin, - kind=_kind, - channel=_channel, - # - tags=__tags, - meta=__meta, - # - data=__data, - # - references=_references, - links=_links, - ) - - annotations.append(annotation) - - return annotations diff --git a/api/oss/src/core/annotations/types.py b/api/oss/src/core/annotations/types.py deleted file mode 100644 index c40a9355ff..0000000000 --- a/api/oss/src/core/annotations/types.py +++ /dev/null @@ -1,57 +0,0 @@ -from typing import Optional - -from oss.src.core.shared.dtos import Reference -from oss.src.core.workflows.dtos import ( - WorkflowFlags, - WorkflowQueryFlags, -) -from oss.src.core.tracing.dtos import ( - SimpleTraceOrigin, - SimpleTraceKind, - SimpleTraceChannel, - SimpleTraceReferences, - SimpleTraceLinks, - # - SimpleTrace, - SimpleTraceCreate, - SimpleTraceEdit, - SimpleTraceQuery, -) - - -AnnotationOrigin = SimpleTraceOrigin -AnnotationKind = SimpleTraceKind -AnnotationChannel = SimpleTraceChannel -AnnotationLinks = SimpleTraceLinks - - -class AnnotationFlags(WorkflowFlags): - is_sdk: bool = False - is_web: bool = False - is_evaluation: bool = False - - -class AnnotationQueryFlags(WorkflowQueryFlags): - is_sdk: Optional[bool] = None - is_web: Optional[bool] = None - is_evaluation: Optional[bool] = None - - -class AnnotationReferences(SimpleTraceReferences): - evaluator: Reference # type: ignore - - -class Annotation(SimpleTrace): - pass - - -class AnnotationCreate(SimpleTraceCreate): - pass - - -class AnnotationEdit(SimpleTraceEdit): - pass - - -class AnnotationQuery(SimpleTraceQuery): - pass diff --git a/api/oss/src/core/annotations/utils.py b/api/oss/src/core/annotations/utils.py deleted file mode 100644 index ba9f178897..0000000000 --- a/api/oss/src/core/annotations/utils.py +++ /dev/null @@ -1,57 +0,0 @@ -from jsonschema import ( - Draft202012Validator, - Draft7Validator, - Draft4Validator, - Draft6Validator, - Draft201909Validator, -) - -from fastapi import status, HTTPException - - -def _get_jsonschema_validator( - format: dict, # pylint: disable=redefined-builtin -): - schema_uri = format.get( - "$schema", - "https://json-schema.org/draft/2020-12/schema", - ) - - if "2020-12" in schema_uri: - return Draft202012Validator - elif "2019-09" in schema_uri: - return Draft201909Validator - elif "draft-07" in schema_uri: - return Draft7Validator - elif "draft-06" in schema_uri: - return Draft6Validator - elif "draft-04" in schema_uri: - return Draft4Validator - return Draft202012Validator # fallback - - -def validate_data_against_schema( - data: dict, - schema: dict, # pylint: disable=redefined-builtin -): - validator_class = _get_jsonschema_validator(schema) - validator = validator_class(schema) - - errors = list(validator.iter_errors(data)) - - if errors: - details = [] - for e in errors: - loc = list(e.absolute_path) - msg = e.message - details.append( - { - "loc": ["body", "annotation", "data"] + loc, - "msg": msg, - "type": "value_error.json_schema", - } - ) - - raise HTTPException( - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=details - ) diff --git a/api/oss/src/core/applications/__init__.py b/api/oss/src/core/applications/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/core/applications/dtos.py b/api/oss/src/core/applications/dtos.py deleted file mode 100644 index 1e38c8462f..0000000000 --- a/api/oss/src/core/applications/dtos.py +++ /dev/null @@ -1,234 +0,0 @@ -from typing import Optional -from uuid import UUID - -from pydantic import Field - -from oss.src.core.shared.dtos import sync_alias, AliasConfig -from oss.src.core.shared.dtos import ( - Identifier, - Slug, - Lifecycle, - Header, - Metadata, -) -from oss.src.core.workflows.dtos import ( - WorkflowFlags, - WorkflowQueryFlags, - # - Workflow, - WorkflowCreate, - WorkflowEdit, - WorkflowQuery, - # - WorkflowVariant, - WorkflowVariantCreate, - WorkflowVariantEdit, - WorkflowVariantQuery, - # - WorkflowRevisionData, - # - WorkflowRevision, - WorkflowRevisionCreate, - WorkflowRevisionEdit, - WorkflowRevisionQuery, - WorkflowRevisionCommit, - WorkflowRevisionsLog, -) - - -# aliases ---------------------------------------------------------------------- - - -class ApplicationIdAlias(AliasConfig): - application_id: Optional[UUID] = None - workflow_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="application_id", - ) - - -class ApplicationVariantIdAlias(AliasConfig): - application_variant_id: Optional[UUID] = None - workflow_variant_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="application_variant_id", - ) - - -class ApplicationRevisionIdAlias(AliasConfig): - application_revision_id: Optional[UUID] = None - workflow_revision_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="application_revision_id", - ) - - -# globals ---------------------------------------------------------------------- - - -class ApplicationFlags(WorkflowFlags): - def __init__(self, **data): - data["is_evaluator"] = True - - super().__init__(**data) - - -# applications ------------------------------------------------------------------- - - -class Application(Workflow): - flags: Optional[ApplicationFlags] = None - - -class ApplicationCreate(WorkflowCreate): - flags: Optional[ApplicationFlags] = None - - -class ApplicationEdit(WorkflowEdit): - flags: Optional[ApplicationFlags] = None - - -class ApplicationQuery(WorkflowQuery): - flags: Optional[ApplicationFlags] = None - - -# application variants ----------------------------------------------------------- - - -class ApplicationVariant( - WorkflowVariant, - ApplicationIdAlias, -): - flags: Optional[ApplicationFlags] = None - - def model_post_init(self, __context) -> None: - sync_alias("application_id", "workflow_id", self) - - -class ApplicationVariantCreate( - WorkflowVariantCreate, - ApplicationIdAlias, -): - flags: Optional[ApplicationFlags] = None - - def model_post_init(self, __context) -> None: - sync_alias("application_id", "workflow_id", self) - - -class ApplicationVariantEdit(WorkflowVariantEdit): - flags: Optional[ApplicationFlags] = None - - -class ApplicationVariantQuery(WorkflowVariantQuery): - flags: Optional[ApplicationFlags] = None - - -# application revisions ----------------------------------------------------- - - -class ApplicationRevisionData(WorkflowRevisionData): - pass - - -class ApplicationRevision( - WorkflowRevision, - ApplicationIdAlias, - ApplicationVariantIdAlias, -): - flags: Optional[ApplicationFlags] = None - - data: Optional[ApplicationRevisionData] = None - - def model_post_init(self, __context) -> None: - sync_alias("application_id", "workflow_id", self) - sync_alias("application_variant_id", "workflow_variant_id", self) - - -class ApplicationRevisionCreate( - WorkflowRevisionCreate, - ApplicationIdAlias, - ApplicationVariantIdAlias, -): - flags: Optional[ApplicationFlags] = None - - def model_post_init(self, __context) -> None: - sync_alias("application_id", "workflow_id", self) - sync_alias("application_variant_id", "workflow_variant_id", self) - - -class ApplicationRevisionEdit(WorkflowRevisionEdit): - flags: Optional[ApplicationFlags] = None - - -class ApplicationRevisionQuery(WorkflowRevisionQuery): - flags: Optional[ApplicationFlags] = None - - -class ApplicationRevisionCommit( - WorkflowRevisionCommit, - ApplicationIdAlias, - ApplicationVariantIdAlias, -): - flags: Optional[ApplicationFlags] = None - - data: Optional[ApplicationRevisionData] = None - - def model_post_init(self, __context) -> None: - sync_alias("application_id", "workflow_id", self) - sync_alias("application_variant_id", "workflow_variant_id", self) - - -class ApplicationRevisionsLog( - WorkflowRevisionsLog, - ApplicationIdAlias, - ApplicationVariantIdAlias, - ApplicationRevisionIdAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("application_id", "workflow_id", self) - sync_alias("application_variant_id", "workflow_variant_id", self) - sync_alias("application_revision_id", "workflow_revision_id", self) - - -# simple applications ------------------------------------------------------------ - - -class LegacyApplicationFlags(WorkflowFlags): - pass - - -class LegacyApplicationData(WorkflowRevisionData): - pass - - -class LegacyApplication(Identifier, Slug, Lifecycle, Header, Metadata): - flags: Optional[LegacyApplicationFlags] = None - - data: Optional[LegacyApplicationData] = None - - -class LegacyApplicationCreate(Slug, Header, Metadata): - flags: Optional[LegacyApplicationFlags] = None - - data: Optional[LegacyApplicationData] = None - - -class LegacyApplicationEdit(Identifier, Header, Metadata): - flags: Optional[LegacyApplicationFlags] = None - - data: Optional[LegacyApplicationData] = None - - -class LegacyApplicationQuery( - Identifier, - Slug, - Lifecycle, - ApplicationQuery, -): - data: Optional[LegacyApplicationData] = None - - -# ------------------------------------------------------------------------------ diff --git a/api/oss/src/core/applications/service.py b/api/oss/src/core/applications/service.py deleted file mode 100644 index 0b7eb03a34..0000000000 --- a/api/oss/src/core/applications/service.py +++ /dev/null @@ -1,744 +0,0 @@ -from uuid import UUID, uuid4 -from typing import Optional, Dict, Any - -from pydantic import ValidationError - -from oss.src.services import db_manager -from oss.src.utils.logging import get_module_logger -from oss.src.core.shared.dtos import Reference -from oss.src.core.workflows.dtos import WorkflowRevisionData -from oss.src.core.applications.dtos import ( - LegacyApplicationFlags, - # - LegacyApplication, - LegacyApplicationCreate, - LegacyApplicationEdit, - LegacyApplicationData, - # - ApplicationFlags, - # - Application, - ApplicationCreate, - ApplicationEdit, - # - ApplicationVariant, - ApplicationVariantCreate, - # - ApplicationRevision, - ApplicationRevisionData, - ApplicationRevisionCommit, -) -from oss.src.services import db_manager - -from oss.src.models.shared_models import AppType -from oss.src.utils.helpers import get_slug_from_name_and_id - - -log = get_module_logger(__name__) - -# Constants -WORKFLOW_MARKER_KEY = "__workflow__" - - -class LegacyApplicationsService: - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - legacy_application_create: LegacyApplicationCreate, - ) -> Optional[LegacyApplication]: - # ------------------------------------------------------------------ - # Application - # ------------------------------------------------------------------ - application_create = ApplicationCreate( - slug=legacy_application_create.slug, - # - name=legacy_application_create.name, - # - flags=( - ApplicationFlags( - **legacy_application_create.flags.model_dump( - mode="json", exclude_none=True - ) - ) - if legacy_application_create.flags - else ApplicationFlags() - ), - ) - - user = await db_manager.get_user_with_id( - user_id=str(user_id), - ) - - if not user: - return None - - # Create app and initialize environments - app_db = await db_manager.create_app_and_envs( - project_id=str(project_id), - # - app_name=application_create.slug - or application_create.name - or uuid4().hex[-12:], - # - template_key=AppType.SDK_CUSTOM, - # - user_id=str(user_id), - ) - - # Create variant config - config_db = await db_manager.create_new_config( - config_name="default", - # - parameters={}, - ) - - # Create variant base - db_base = await db_manager.create_new_variant_base( - project_id=str(project_id), - # - base_name="app", - # - app=app_db, - ) - - # ------------------------------------------------------------------ - # Application variant - # ------------------------------------------------------------------ - application_variant_slug = uuid4().hex[-12:] - - application_variant_create = ApplicationVariantCreate( - slug=application_variant_slug, - # - name=application_create.name or uuid4().hex[-12:], - # - flags=application_create.flags, - # - application_id=app_db.id, # type: ignore[arg-type] - ) - - # Create default app variant - app_variant_db = await db_manager.create_new_app_variant( - project_id=str(project_id), - # - variant_name="default", # type: ignore - # - base_name=db_base.base_name, # type: ignore - commit_message="initial commit", - # - user=user, - base=db_base, - config=config_db, - app=app_db, - ) - - # ----------------------------------------------------------------- - # Second revision commit - # ------------------------------------------------------------------ - application_revision_slug = uuid4().hex[-12:] - - application_revision_commit = ApplicationRevisionCommit( - slug=application_revision_slug, - # - # name=application_create.name or uuid4().hex[-12:], - # - flags=application_create.flags, - # - data=ApplicationRevisionData( - **( - legacy_application_create.data.model_dump(mode="json") - if legacy_application_create.data - else {} - ), - ), - # - application_id=app_db.id, # type: ignore - application_variant_id=app_variant_db.id, # type: ignore - ) - - # Serialize application revision data with marker - serialized_data = {} - - if application_revision_commit.data: - serialized_data = self._serialize_workflow_data( - workflow_data=application_revision_commit.data, - ) - - # Create deployment - url = application_revision_commit.data.url - - deployment = await db_manager.create_deployment( - project_id=str(project_id), - # - app_id=str(app_variant_db.app.id), - uri="" if app_db.app_type == AppType.SDK_CUSTOM else url, # type: ignore - ) - - # Update variant base - await db_manager.update_base( - str(app_variant_db.base_id), - # - deployment_id=deployment.id, # type: ignore - ) - - # Update variant parameters (creates a new revision) - app_variant_db = await db_manager.update_variant_parameters( - project_id=str(project_id), - user_uid=str(user.id), - # - app_variant_id=str(app_variant_db.id), - # - parameters=serialized_data, - # commit_message="...", - ) - - # Deserialize the data back to return application revision - application_revision_data = None - - if serialized_data and WORKFLOW_MARKER_KEY in serialized_data: - data_copy = serialized_data.copy() - del data_copy[WORKFLOW_MARKER_KEY] - - try: - application_revision_data = LegacyApplicationData(**data_copy) - application_revision_data.version = str(app_variant_db.revision) # type: ignore - - except ValidationError as e: - log.warning(f"Failed to deserialize application data: {e}") - - legacy_application = LegacyApplication( - id=app_db.id, # type: ignore - slug=app_db.app_name, # type: ignore - # - name=app_db.app_name, # type: ignore - # - created_at=app_db.created_at, # type: ignore - updated_at=app_db.updated_at, # type: ignore - created_by_id=app_db.modified_by_id, # type: ignore - # - flags={"is_custom": True}, # type: ignore - # - data=application_revision_data, - ) - - return legacy_application - - async def fetch( - self, - *, - project_id: UUID, - # - application_id: UUID, - ) -> Optional[LegacyApplication]: - # Fetch application details ---------------------------------------------------------- - app_db = await db_manager.fetch_app_by_id( - app_id=str(application_id), - ) - - application = Application( - id=app_db.id, # type: ignore - slug=app_db.app_name, # type: ignore - # - name=app_db.app_name, # type: ignore - # - created_at=app_db.created_at, # type: ignore - updated_at=app_db.updated_at, # type: ignore - created_by_id=app_db.modified_by_id, # type: ignore - ) - - # Fetch application variant details -------------------------------------------------- - app_variant_db = await db_manager.fetch_latest_app_variant( - app_id=str(app_db.id) - ) - if not app_variant_db: - return None - - application_variant_slug = get_slug_from_name_and_id( - str(app_variant_db.variant_name), - UUID(str(app_variant_db.id)), - ) - - application_variant = ApplicationVariant( - id=app_variant_db.id, # type: ignore - slug=application_variant_slug, # type: ignore - # - name=app_variant_db.variant_name, # type:ignore - # - created_at=app_variant_db.created_at, # type: ignore - updated_at=app_variant_db.updated_at, # type: ignore - deleted_at=app_variant_db.updated_at if app_variant_db.hidden else None, # type: ignore - created_by_id=app_variant_db.modified_by_id, # type: ignore - updated_by_id=( - app_variant_db.modified_by_id # type: ignore - if app_variant_db.updated_at # type: ignore - else None - ), - deleted_by_id=( - app_variant_db.modified_by_id # type: ignore - if app_variant_db.hidden # type: ignore - else None - ), - # - flags=application.flags, - # - application_id=application.id, - ) - - # Fetch application variant revision details ------------------------------------------ - variant_revision_db = await db_manager.fetch_app_variant_revision( - app_variant=str(app_variant_db.id), - revision_number=app_variant_db.revision, # type: ignore - ) - - if not variant_revision_db: - return None - - # Deserialize data if marked as workflow ---------------------------------------------- - application_revision_data: Optional[LegacyApplicationData] = None - - if isinstance(variant_revision_db.config_parameters, dict): - wf_data = self._deserialize_workflow_data( - variant_revision_db.config_parameters - ) - if wf_data is not None: - try: - application_revision_data = LegacyApplicationData( - **wf_data.model_dump(mode="json") - ) - application_revision_data.version = str(app_variant_db.revision) # type: ignore - except ValidationError as e: - log.warning( - f"Failed to cast workflow data to LegacyApplicationData: {e}" - ) - - application_revision_slug = get_slug_from_name_and_id( - str(variant_revision_db.config_name), - UUID(str(variant_revision_db.id)), - ) - - application_revision = ApplicationRevision( - id=variant_revision_db.id, # type: ignore - slug=application_revision_slug, # type: ignore - # - name=variant_revision_db.config_name, # type: ignore - # - created_at=variant_revision_db.created_at, # type: ignore - updated_at=variant_revision_db.updated_at, # type: ignore - deleted_at=( - variant_revision_db.updated_at # type: ignore - if variant_revision_db.hidden # type: ignore - else None - ), - created_by_id=variant_revision_db.modified_by_id, # type: ignore - updated_by_id=( - variant_revision_db.modified_by_id # type: ignore - if variant_revision_db.updated_at # type: ignore - else None - ), - deleted_by_id=( - variant_revision_db.modified_by_id # type: ignore - if variant_revision_db.hidden # type: ignore - else None - ), - # - flags=application_variant.flags, - # - data=ApplicationRevisionData( - **( - application_revision_data.model_dump(mode="json") - if application_revision_data - else {} - ), - ), - # - application_id=application.id, - application_variant_id=application_variant.id, - ) - - legacy_application = LegacyApplication( - id=application.id, - slug=application.slug, - # - name=application.name, - # - created_at=application.created_at, - updated_at=application.updated_at, - created_by_id=application.created_by_id, - # - flags={"is_custom": True}, # type: ignore - # - data=LegacyApplicationData( - **( - application_revision_data.model_dump(mode="json") - if application_revision_data - else {} - ), - ), - ) - - return legacy_application - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - legacy_application_edit: LegacyApplicationEdit, - ) -> Optional[LegacyApplication]: - # Ensure user (for commit) -------------------------------------------- - user = await db_manager.get_user_with_id(user_id=str(user_id)) - - if not user: - return None - - # Edit application (name, etc.) --------------------------------------- - application_edit = ApplicationEdit( - id=legacy_application_edit.id, - # - name=legacy_application_edit.name, - ) - - app_db = await db_manager.update_app( - app_id=str(application_edit.id), - values_to_update=application_edit.model_dump( - mode="json", - exclude_none=True, - exclude={ - "flags", - "meta", - "tags", - "id", - }, - ), - ) - if app_db is None: - return None - - app_variant_db = await db_manager.fetch_latest_app_variant( - app_id=str(app_db.id) - ) - if not app_variant_db: - return None - - # ----------------------------------------------------------------- - # Second revision commit - # ------------------------------------------------------------------ - application_revision_slug = uuid4().hex[-12:] - - application_revision_commit = ApplicationRevisionCommit( - slug=application_revision_slug, - # - name=application_edit.name, - # - data=ApplicationRevisionData( - **( - legacy_application_edit.data.model_dump() - if legacy_application_edit.data - else {} - ) - ), - # - application_id=app_db.id, # type: ignore - application_variant_id=app_variant_db.id, # type: ignore - ) - - # Serialize application revision data with marker - serialized_data = {} - - if application_revision_commit.data: - serialized_data = application_revision_commit.data.model_dump(mode="json") - serialized_data[WORKFLOW_MARKER_KEY] = True - - # Update variant parameters (creates a new revision) - app_variant_db = await db_manager.update_variant_parameters( - project_id=str(project_id), - user_uid=str(user.id), - # - app_variant_id=str(app_variant_db.id), - # - parameters=serialized_data, - # commit_message="...", - ) - - # Deserialize the data back to return application revision - application_revision_data = None - - if serialized_data and WORKFLOW_MARKER_KEY in serialized_data: - data_copy = serialized_data.copy() - del data_copy[WORKFLOW_MARKER_KEY] - try: - application_revision_data = LegacyApplicationData(**data_copy) - application_revision_data.version = str(app_variant_db.revision) # type: ignore - except ValidationError as e: - log.warning(f"Failed to deserialize application data: {e}") - - legacy_application = LegacyApplication( - id=app_db.id, # type: ignore - slug=app_db.app_name, # type: ignore - # - name=app_db.app_name, # type: ignore - # - created_at=app_db.created_at, # type: ignore - updated_at=app_db.updated_at, # type: ignore - created_by_id=app_db.modified_by_id, # type: ignore - # - flags={"is_custom": True}, # type: ignore - # - data=application_revision_data, - ) - - return legacy_application - - async def retrieve( - self, - *, - project_id: UUID, - # - application_ref: Optional[Reference] = None, - application_variant_ref: Optional[Reference] = None, - application_revision_ref: Optional[Reference] = None, - ) -> Optional[ApplicationRevision]: - if ( - application_variant_ref - and not application_variant_ref.id - or application_revision_ref - and not application_revision_ref.id - ): - return None - - if application_revision_ref: - if application_revision_ref.id: - # Fetch application revision details -------------------------------------------------- - variant_revision_db = await db_manager.fetch_app_variant_revision_by_id( - variant_revision_id=str(application_revision_ref.id) - ) - if not variant_revision_db: - return None - - # Fetch application variant details --------------------------------------------------- - app_variant_db = await db_manager.fetch_app_variant_by_id( - app_variant_id=str(variant_revision_db.variant_id) - ) - if not app_variant_db: - return None - - # Fetch application details ---------------------------------------------------------- - app_db = await db_manager.fetch_app_by_id( - app_id=str(app_variant_db.app_id) - ) - if not app_db: - return None - - elif application_ref: - if application_ref.id: - # Fetch application details ---------------------------------------------------------- - app_db = await db_manager.fetch_app_by_id( - app_id=str(application_ref.id) - ) - if not app_db: - return None - - # Fetch application variant details --------------------------------------------------- - app_variant_db = await db_manager.fetch_latest_app_variant( - app_id=str(app_db.id) - ) - if not app_variant_db: - return None - - # Fetch application revision details -------------------------------------------------- - variant_revision_db = await db_manager.fetch_app_variant_revision( - app_variant=str(app_variant_db.id), - revision_number=app_variant_db.revision, # type: ignore - ) - if not variant_revision_db: - return None - elif application_ref.slug: - # Fetch application details ---------------------------------------------------------- - app_db = await db_manager.fetch_app_by_name( - project_id=str(project_id), - app_name=application_ref.slug, - ) - if not app_db: - return None - - # Fetch application variant details --------------------------------------------------- - app_variant_db = await db_manager.fetch_latest_app_variant( - app_id=str(app_db.id) - ) - if not app_variant_db: - return None - - # Fetch application revision details -------------------------------------------------- - variant_revision_db = await db_manager.fetch_app_variant_revision( - app_variant=str(app_variant_db.id), - revision_number=app_variant_db.revision, # type: ignore - ) - if not variant_revision_db: - return None - - elif application_variant_ref and application_variant_ref.id: - # Fetch application variant details --------------------------------------------------- - app_variant_db = await db_manager.fetch_app_variant_by_id( - app_variant_id=str(application_variant_ref.id) - ) - if not app_variant_db: - return None - - # Fetch application details ---------------------------------------------------------- - app_db = await db_manager.fetch_app_by_id(app_id=str(app_variant_db.app_id)) - if not app_db: - return None - - # Fetch application revision details ------------------------------------------------- - variant_revision_db = await db_manager.fetch_app_variant_revision( - app_variant=str(app_variant_db.id), - revision_number=app_variant_db.revision, # type: ignore - ) - if not variant_revision_db: - return None - - application = Application( - id=app_db.id, # type: ignore - slug=app_db.app_name, # type: ignore - name=app_db.app_name, # type: ignore - created_at=app_db.created_at, # type: ignore - updated_at=app_db.updated_at, # type: ignore - created_by_id=app_db.modified_by_id, # type: ignore - flags={"is_custom": True}, # type: ignore - ) - - application_variant_slug = get_slug_from_name_and_id( - str(app_variant_db.variant_name), - UUID(str(app_variant_db.id)), - ) - - application_variant = ApplicationVariant( - id=app_variant_db.id, # type: ignore - slug=application_variant_slug, # type: ignore - name=app_variant_db.variant_name, - created_at=app_variant_db.created_at, # type: ignore - updated_at=app_variant_db.updated_at, # type: ignore - deleted_at=app_variant_db.updated_at if app_variant_db.hidden else None, # type: ignore - created_by_id=app_variant_db.modified_by_id, # type: ignore - updated_by_id=( - app_variant_db.modified_by_id # type: ignore - if app_variant_db.updated_at # type: ignore - else None - ), - deleted_by_id=( - app_variant_db.modified_by_id # type: ignore - if app_variant_db.hidden # type: ignore - else None - ), - flags=application.flags, - application_id=application.id, - ) - - application_revision_slug = get_slug_from_name_and_id( - str(variant_revision_db.config_name), - UUID(str(variant_revision_db.id)), - ) - - application_revision = ApplicationRevision( - id=variant_revision_db.id, # type: ignore - slug=application_revision_slug, # type: ignore - name=variant_revision_db.config_name, # type: ignore - created_at=variant_revision_db.created_at, # type: ignore - updated_at=variant_revision_db.updated_at, # type: ignore - deleted_at=( - variant_revision_db.updated_at # type: ignore - if variant_revision_db.hidden # type: ignore - else None - ), - created_by_id=variant_revision_db.modified_by_id, # type: ignore - updated_by_id=( - variant_revision_db.modified_by_id # type: ignore - if variant_revision_db.updated_at # type: ignore - else None - ), - deleted_by_id=( - variant_revision_db.modified_by_id # type: ignore - if variant_revision_db.hidden # type: ignore - else None - ), - flags=application_variant.flags, - application_id=application.id, - application_variant_id=application_variant.id, - ) - - # Deserialize data if marked as workflow - application_revision_data: Optional[ApplicationRevisionData] = None - - if isinstance(variant_revision_db.config_parameters, dict): - wf_data = self._deserialize_workflow_data( - variant_revision_db.config_parameters - ) - if wf_data is not None: - try: - application_revision_data = ApplicationRevisionData( - **wf_data.model_dump(mode="json") - ) - application_revision_data.version = str(app_variant_db.revision) # type: ignore - except ValidationError as e: - log.warning( - f"Failed to cast workflow data to ApplicationRevisionData: {e}" - ) - - # Set the data field if we have deserialized data - if application_revision_data: - application_revision.data = application_revision_data - else: - application_revision.data = ApplicationRevisionData() - - return application_revision - - def _is_workflow_data( - self, - config_parameters: Dict[str, Any], - ) -> bool: - """ - Check if the config_parameters contains workflow data (has marker key). - """ - - return ( - isinstance(config_parameters, dict) - and config_parameters.get(WORKFLOW_MARKER_KEY) is True - ) - - def _serialize_workflow_data( - self, - workflow_data: WorkflowRevisionData, - ) -> Dict[str, Any]: - """ - Serialize workflow revision data with marker for legacy storage. - """ - - serialized = workflow_data.model_dump(mode="json") - serialized[WORKFLOW_MARKER_KEY] = True - - return serialized - - def _deserialize_workflow_data( - self, - config_parameters: Dict[str, Any], - ) -> Optional[WorkflowRevisionData]: - """ - Deserialize workflow revision data from legacy storage. - Returns None if not workflow data or if deserialization fails. - """ - - if not self._is_workflow_data(config_parameters): - return None - - try: - data_copy = config_parameters.copy() - del data_copy[WORKFLOW_MARKER_KEY] - - return WorkflowRevisionData(**data_copy) - - except ValidationError as e: - log.warning(f"Failed to deserialize workflow data: {e}") - return None diff --git a/api/oss/src/core/blobs/utils.py b/api/oss/src/core/blobs/utils.py index 1ebeaf20c4..4fed857f1f 100644 --- a/api/oss/src/core/blobs/utils.py +++ b/api/oss/src/core/blobs/utils.py @@ -1,4 +1,3 @@ -from typing import Optional, Dict, Any from uuid import UUID from hashlib import blake2b from json import dumps @@ -6,19 +5,11 @@ def compute_blob_id( *, - blob_data: Optional[Dict[str, Any]] = None, - set_id: Optional[UUID] = None, + blob_data: dict, + set_id: UUID, ) -> UUID: # Deterministically serialize the blob data - json_blob_data = ( - dumps( - blob_data, - sort_keys=True, - separators=(",", ":"), - ) - if blob_data - else "" - ) + json_blob_data = dumps(blob_data, sort_keys=True, separators=(",", ":")) # Combine with set_id unhashed = f"{str(set_id)}{json_blob_data}".encode("utf-8") diff --git a/api/oss/src/core/evaluations/interfaces.py b/api/oss/src/core/evaluations/interfaces.py index 5f467b0829..d6ea2f86ec 100644 --- a/api/oss/src/core/evaluations/interfaces.py +++ b/api/oss/src/core/evaluations/interfaces.py @@ -1,10 +1,9 @@ -from typing import Optional, List, Tuple +from typing import Optional, List from uuid import UUID from abc import ABC, abstractmethod from oss.src.core.shared.dtos import Windowing from oss.src.core.evaluations.types import ( - EvaluationStatus, EvaluationRun, EvaluationRunCreate, EvaluationRunEdit, @@ -13,18 +12,14 @@ EvaluationScenarioCreate, EvaluationScenarioEdit, EvaluationScenarioQuery, - EvaluationResult, - EvaluationResultCreate, - EvaluationResultEdit, - EvaluationResultQuery, - EvaluationMetrics, - EvaluationMetricsCreate, - EvaluationMetricsEdit, - EvaluationMetricsQuery, - EvaluationQueue, - EvaluationQueueCreate, - EvaluationQueueEdit, - EvaluationQueueQuery, + EvaluationStep, + EvaluationStepCreate, + EvaluationStepEdit, + EvaluationStepQuery, + EvaluationMetric, + EvaluationMetricCreate, + EvaluationMetricEdit, + EvaluationMetricQuery, ) @@ -121,31 +116,29 @@ async def delete_runs( raise NotImplementedError @abstractmethod - async def close_run( + async def archive_run( self, *, project_id: UUID, user_id: UUID, # run_id: UUID, - # - status: Optional[EvaluationStatus] = None, ) -> Optional[EvaluationRun]: raise NotImplementedError @abstractmethod - async def close_runs( + async def archive_runs( self, *, project_id: UUID, user_id: UUID, # - run_ids: List[UUID], + run_ids: Optional[List[UUID]] = None, ) -> List[EvaluationRun]: raise NotImplementedError @abstractmethod - async def open_run( + async def unarchive_run( self, *, project_id: UUID, @@ -156,34 +149,50 @@ async def open_run( raise NotImplementedError @abstractmethod - async def open_runs( + async def unarchive_runs( self, *, project_id: UUID, user_id: UUID, # - run_ids: List[UUID], + run_ids: Optional[List[UUID]] = None, ) -> List[EvaluationRun]: raise NotImplementedError @abstractmethod - async def query_runs( + async def close_run( self, *, project_id: UUID, + user_id: UUID, # - run: Optional[EvaluationRunQuery] = None, + run_id: UUID, + ) -> Optional[EvaluationRun]: + raise NotImplementedError + + @abstractmethod + async def close_runs( + self, + *, + project_id: UUID, + user_id: UUID, # - windowing: Optional[Windowing] = None, - ) -> List[EvaluationRun]: + run_ids: List[UUID], + ) -> List[UUID]: raise NotImplementedError @abstractmethod - async def fetch_live_runs( + async def query_runs( self, *, + project_id: UUID, + # + run: EvaluationRunQuery, + # + include_archived: Optional[bool] = None, + # windowing: Optional[Windowing] = None, - ) -> List[Tuple[UUID, EvaluationRun]]: + ) -> List[EvaluationRun]: raise NotImplementedError # - EVALUATION SCENARIO ---------------------------------------------------- @@ -278,262 +287,208 @@ async def query_scenarios( *, project_id: UUID, # - scenario: Optional[EvaluationScenarioQuery] = None, + scenario: EvaluationScenarioQuery, + # + include_archived: Optional[bool] = None, # windowing: Optional[Windowing] = None, ) -> List[EvaluationScenario]: raise NotImplementedError - # - EVALUATION RESULT ------------------------------------------------------ + # - EVALUATION STEP -------------------------------------------------------- @abstractmethod - async def create_result( + async def create_step( self, *, project_id: UUID, user_id: UUID, # - result: EvaluationResultCreate, - ) -> Optional[EvaluationResult]: + step: EvaluationStepCreate, + ) -> Optional[EvaluationStep]: raise NotImplementedError @abstractmethod - async def create_results( + async def create_steps( self, *, project_id: UUID, user_id: UUID, # - results: List[EvaluationResultCreate], - ) -> List[EvaluationResult]: + steps: List[EvaluationStepCreate], + ) -> List[EvaluationStep]: raise NotImplementedError @abstractmethod - async def fetch_result( + async def fetch_step( self, *, project_id: UUID, # - result_id: UUID, - ) -> Optional[EvaluationResult]: + step_id: UUID, + ) -> Optional[EvaluationStep]: raise NotImplementedError @abstractmethod - async def fetch_results( + async def fetch_steps( self, *, project_id: UUID, # - result_ids: List[UUID], - ) -> List[EvaluationResult]: + step_ids: List[UUID], + ) -> List[EvaluationStep]: raise NotImplementedError @abstractmethod - async def edit_result( + async def edit_step( self, *, project_id: UUID, user_id: UUID, # - result: EvaluationResultEdit, - ) -> Optional[EvaluationResult]: + step: EvaluationStepEdit, + ) -> Optional[EvaluationStep]: raise NotImplementedError @abstractmethod - async def edit_results( + async def edit_steps( self, *, project_id: UUID, user_id: UUID, # - results: List[EvaluationResultEdit], - ) -> List[EvaluationResult]: + steps: List[EvaluationStepEdit], + ) -> List[EvaluationStep]: raise NotImplementedError @abstractmethod - async def delete_result( + async def delete_step( self, *, project_id: UUID, # - result_id: UUID, + step_id: UUID, ) -> Optional[UUID]: raise NotImplementedError @abstractmethod - async def delete_results( - self, - *, - project_id: UUID, - # - result_ids: List[UUID], - ) -> List[UUID]: - raise NotImplementedError - - @abstractmethod - async def query_results( - self, - *, - project_id: UUID, - # - result: Optional[EvaluationResultQuery] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[EvaluationResult]: - raise NotImplementedError - - # - EVALUATION METRICS ----------------------------------------------------- - - @abstractmethod - async def create_metrics( - self, - *, - project_id: UUID, - user_id: UUID, - # - metrics: List[EvaluationMetricsCreate], - ) -> List[EvaluationMetrics]: - raise NotImplementedError - - @abstractmethod - async def fetch_metrics( - self, - *, - project_id: UUID, - # - metrics_ids: List[UUID], - ) -> List[EvaluationMetrics]: - raise NotImplementedError - - @abstractmethod - async def edit_metrics( - self, - *, - project_id: UUID, - user_id: UUID, - # - metrics: List[EvaluationMetricsEdit], - ) -> List[EvaluationMetrics]: - raise NotImplementedError - - @abstractmethod - async def delete_metrics( + async def delete_steps( self, *, project_id: UUID, # - metrics_ids: Optional[List[UUID]] = None, + step_ids: List[UUID], ) -> List[UUID]: raise NotImplementedError @abstractmethod - async def query_metrics( + async def query_steps( self, *, project_id: UUID, # - metric: Optional[EvaluationMetricsQuery] = None, + step: EvaluationStepQuery, # windowing: Optional[Windowing] = None, - ) -> List[EvaluationMetrics]: + ) -> List[EvaluationStep]: raise NotImplementedError - # - EVALUATION QUEUE ------------------------------------------------------- + # - EVALUATION METRIC ----------------------------------------------------- @abstractmethod - async def create_queue( + async def create_metric( self, *, project_id: UUID, user_id: UUID, # - queue: EvaluationQueueCreate, - ) -> Optional[EvaluationQueue]: + metric: EvaluationMetricCreate, + ) -> Optional[EvaluationMetric]: raise NotImplementedError @abstractmethod - async def create_queues( + async def create_metrics( self, *, project_id: UUID, user_id: UUID, # - queues: List[EvaluationQueueCreate], - ) -> List[EvaluationQueue]: + metrics: List[EvaluationMetricCreate], + ) -> List[EvaluationMetric]: raise NotImplementedError @abstractmethod - async def fetch_queue( + async def fetch_metric( self, *, project_id: UUID, # - queue_id: UUID, - ) -> Optional[EvaluationQueue]: + metric_id: UUID, + ) -> Optional[EvaluationMetric]: raise NotImplementedError @abstractmethod - async def fetch_queues( + async def fetch_metrics( self, *, project_id: UUID, # - queue_ids: List[UUID], - ) -> List[EvaluationQueue]: + metric_ids: List[UUID], + ) -> List[EvaluationMetric]: raise NotImplementedError @abstractmethod - async def edit_queue( + async def edit_metric( self, *, project_id: UUID, user_id: UUID, # - queue: EvaluationQueueEdit, - ) -> Optional[EvaluationQueue]: + metric: EvaluationMetricEdit, + ) -> Optional[EvaluationMetric]: raise NotImplementedError @abstractmethod - async def edit_queues( + async def edit_metrics( self, *, project_id: UUID, user_id: UUID, # - queues: List[EvaluationQueueEdit], - ) -> List[EvaluationQueue]: + metrics: List[EvaluationMetricEdit], + ) -> List[EvaluationMetric]: raise NotImplementedError @abstractmethod - async def delete_queue( + async def delete_metric( self, *, project_id: UUID, # - queue_id: UUID, + metric_id: UUID, ) -> Optional[UUID]: raise NotImplementedError @abstractmethod - async def delete_queues( + async def delete_metrics( self, *, project_id: UUID, # - queue_ids: List[UUID], + metric_ids: Optional[List[UUID]] = None, ) -> List[UUID]: raise NotImplementedError @abstractmethod - async def query_queues( + async def query_metrics( self, *, project_id: UUID, # - queue: Optional[EvaluationQueueQuery] = None, + metric: EvaluationMetricQuery, # windowing: Optional[Windowing] = None, - ) -> List[EvaluationQueue]: + ) -> List[EvaluationMetric]: raise NotImplementedError # -------------------------------------------------------------------------- diff --git a/api/oss/src/core/evaluations/service.py b/api/oss/src/core/evaluations/service.py index b36a9d47ef..2469398554 100644 --- a/api/oss/src/core/evaluations/service.py +++ b/api/oss/src/core/evaluations/service.py @@ -1,226 +1,45 @@ -from typing import List, Optional, Tuple, Dict, Any +from typing import List, Optional from uuid import UUID -from asyncio import sleep -from copy import deepcopy -from datetime import datetime, timedelta, timezone - -from celery import current_app as celery_dispatch from oss.src.utils.logging import get_module_logger -from oss.src.core.shared.dtos import Reference, Windowing, Tags, Meta, Data +from oss.src.core.shared.dtos import Windowing from oss.src.core.evaluations.interfaces import EvaluationsDAOInterface +from oss.src.core.evaluations.types import EvaluationRunFlags from oss.src.core.evaluations.types import ( - EvaluationStatus, - # EVALUATION RUN - EvaluationRunFlags, - EvaluationRunDataMappingColumn, - EvaluationRunDataMappingStep, - EvaluationRunDataMapping, - EvaluationRunDataStepInput, - EvaluationRunDataStep, - EvaluationRunData, EvaluationRun, EvaluationRunCreate, EvaluationRunEdit, EvaluationRunQuery, - # EVALUATION SCENARIO EvaluationScenario, EvaluationScenarioCreate, EvaluationScenarioEdit, EvaluationScenarioQuery, - # EVALUATION RESULT - EvaluationResult, - EvaluationResultCreate, - EvaluationResultEdit, - EvaluationResultQuery, - # EVALUATION METRICS - EvaluationMetrics, - EvaluationMetricsCreate, - EvaluationMetricsEdit, - EvaluationMetricsQuery, - # EVALUATION QUEUE - EvaluationQueue, - EvaluationQueueCreate, - EvaluationQueueEdit, - EvaluationQueueQuery, -) -from oss.src.core.evaluations.types import ( - Target, - Origin, - # - SimpleEvaluationFlags, - SimpleEvaluationData, - SimpleEvaluationStatus, - # - SimpleEvaluation, - SimpleEvaluationCreate, - SimpleEvaluationEdit, - SimpleEvaluationQuery, -) -from oss.src.core.evaluations.types import CURRENT_VERSION -from oss.src.core.tracing.dtos import ( - TracingQuery, - Filtering, - Condition, - ListOperator, - MetricsBucket, - MetricSpec, - MetricType, -) -from oss.src.core.tracing.service import TracingService - -from oss.src.core.evaluators.service import EvaluatorsService - -from oss.src.core.queries.dtos import QueryRevision -from oss.src.core.testcases.dtos import Testcase -from oss.src.core.testsets.dtos import TestsetRevision -from oss.src.core.evaluators.dtos import EvaluatorRevision -from oss.src.core.queries.service import QueriesService -from oss.src.core.testsets.service import TestsetsService -from oss.src.core.testsets.service import SimpleTestsetsService -from oss.src.core.evaluators.service import EvaluatorsService -from oss.src.core.evaluators.service import SimpleEvaluatorsService - -from oss.src.core.evaluations.utils import filter_scenario_ids - -from oss.src.models.db_models import AppVariantRevisionsDB - -from oss.src.services.db_manager import ( - fetch_app_by_id, - fetch_app_variant_by_id, - fetch_app_variant_revision_by_id, + EvaluationStep, + EvaluationStepCreate, + EvaluationStepEdit, + EvaluationStepQuery, + EvaluationMetric, + EvaluationMetricCreate, + EvaluationMetricEdit, + EvaluationMetricQuery, ) -from oss.src.utils.helpers import get_slug_from_name_and_id -from oss.src.core.evaluations.utils import get_metrics_keys_from_schema log = get_module_logger(__name__) -SAFE_CLOSE_DELAY = 1 # seconds -DEFAULT_ORIGIN_QUERIES = "custom" -DEFAULT_ORIGIN_TESTSETS = "custom" -DEFAULT_ORIGIN_APPLICATIONS = "custom" -DEFAULT_ORIGIN_EVALUATORS = "custom" -DEFAULT_ORIGIN = dict( - queries=DEFAULT_ORIGIN_QUERIES, - testsets=DEFAULT_ORIGIN_TESTSETS, - applications=DEFAULT_ORIGIN_APPLICATIONS, - evaluators=DEFAULT_ORIGIN_EVALUATORS, -) - -DEFAULT_METRICS = [ - { - "path": "attributes.ag.metrics.duration.cumulative", - "type": "numeric/continuous", - }, - { - "path": "attributes.ag.metrics.errors.cumulative", - "type": "numeric/continuous", - }, - { - "path": "attributes.ag.metrics.costs.cumulative.total", - "type": "numeric/continuous", - }, - { - "path": "attributes.ag.metrics.tokens.cumulative.total", - "type": "numeric/continuous", - }, -] - -DEFAULT_REFRESH_INTERVAL = 1 # minute(s) - - class EvaluationsService: def __init__( self, evaluations_dao: EvaluationsDAOInterface, - tracing_service: TracingService, - queries_service: QueriesService, - testsets_service: TestsetsService, - evaluators_service: EvaluatorsService, ): self.evaluations_dao = evaluations_dao - self.tracing_service = tracing_service - self.queries_service = queries_service - self.testsets_service = testsets_service - self.evaluators_service = evaluators_service - ### CRUD # - EVALUATION RUN --------------------------------------------------------- - async def refresh_runs( - self, - *, - timestamp: datetime, - interval: int = DEFAULT_REFRESH_INTERVAL, - ) -> bool: - log.info(f"[LIVE] Refreshing runs at {timestamp} every {interval} minute(s)") - - if not timestamp: - return False - - newest = timestamp + timedelta(minutes=interval or 0) - oldest = timestamp - - try: - ext_runs = await self.fetch_live_runs() - except Exception as e: - log.error(f"[LIVE] Error fetching live runs: {e}", exc_info=True) - log.error(e, exc_info=True) - return False - - for project_id, run in ext_runs: - user_id = run.created_by_id - - try: - log.info( - "[LIVE] Dispatching...", - project_id=project_id, - run_id=run.id, - # - newest=newest, - oldest=oldest, - ) - - celery_dispatch.send_task( # type: ignore - "src.tasks.evaluations.live.evaluate", - kwargs=dict( - project_id=project_id, - user_id=user_id, - # - run_id=run.id, - # - newest=newest, - oldest=oldest, - ), - ) - - log.info( - "[LIVE] Dispatched. ", - project_id=project_id, - run_id=run.id, - ) - - except Exception as e: # pylint: disable=broad-exception-caught - log.error(f"[LIVE] Error refreshing run {run.id}: {e}", exc_info=True) - - return True - - async def fetch_live_runs( - self, - *, - windowing: Optional[Windowing] = None, - ) -> List[Tuple[UUID, EvaluationRun]]: - ext_runs = await self.evaluations_dao.fetch_live_runs( - windowing=windowing, - ) - - return ext_runs - async def create_run( self, *, @@ -229,8 +48,6 @@ async def create_run( # run: EvaluationRunCreate, ) -> Optional[EvaluationRun]: - run.version = CURRENT_VERSION - return await self.evaluations_dao.create_run( project_id=project_id, user_id=user_id, @@ -246,9 +63,6 @@ async def create_runs( # runs: List[EvaluationRunCreate], ) -> List[EvaluationRun]: - for run in runs: - run.version = CURRENT_VERSION - return await self.evaluations_dao.create_runs( project_id=project_id, user_id=user_id, @@ -290,8 +104,6 @@ async def edit_run( # run: EvaluationRunEdit, ) -> Optional[EvaluationRun]: - run.version = CURRENT_VERSION - return await self.evaluations_dao.edit_run( project_id=project_id, user_id=user_id, @@ -307,9 +119,6 @@ async def edit_runs( # runs: List[EvaluationRunEdit], ) -> List[EvaluationRun]: - for run in runs: - run.version = CURRENT_VERSION - return await self.evaluations_dao.edit_runs( project_id=project_id, user_id=user_id, @@ -343,26 +152,52 @@ async def delete_runs( run_ids=run_ids, ) - async def close_run( + async def archive_run( self, *, project_id: UUID, user_id: UUID, # run_id: UUID, - # - status: Optional[EvaluationStatus] = None, ) -> Optional[EvaluationRun]: - return await self.evaluations_dao.close_run( + return await self.evaluations_dao.archive_run( project_id=project_id, user_id=user_id, # run_id=run_id, + ) + + async def archive_runs( + self, + *, + project_id: UUID, + user_id: UUID, + # + run_ids: List[UUID], + ) -> List[EvaluationRun]: + return await self.evaluations_dao.archive_runs( + project_id=project_id, + user_id=user_id, # - status=status, + run_ids=run_ids, ) - async def close_runs( + async def unarchive_run( + self, + *, + project_id: UUID, + user_id: UUID, + # + run_id: UUID, + ) -> Optional[EvaluationRun]: + return await self.evaluations_dao.unarchive_run( + project_id=project_id, + user_id=user_id, + # + run_id=run_id, + ) + + async def unarchive_runs( self, *, project_id: UUID, @@ -370,14 +205,14 @@ async def close_runs( # run_ids: List[UUID], ) -> List[EvaluationRun]: - return await self.evaluations_dao.close_runs( + return await self.evaluations_dao.unarchive_runs( project_id=project_id, user_id=user_id, # run_ids=run_ids, ) - async def open_run( + async def close_run( self, *, project_id: UUID, @@ -385,14 +220,14 @@ async def open_run( # run_id: UUID, ) -> Optional[EvaluationRun]: - return await self.evaluations_dao.open_run( + return await self.evaluations_dao.close_run( project_id=project_id, user_id=user_id, # run_id=run_id, ) - async def open_runs( + async def close_runs( self, *, project_id: UUID, @@ -400,7 +235,7 @@ async def open_runs( # run_ids: List[UUID], ) -> List[EvaluationRun]: - return await self.evaluations_dao.open_runs( + return await self.evaluations_dao.close_runs( project_id=project_id, user_id=user_id, # @@ -412,7 +247,9 @@ async def query_runs( *, project_id: UUID, # - run: Optional[EvaluationRunQuery] = None, + run: EvaluationRunQuery, + # + include_archived: Optional[bool] = None, # windowing: Optional[Windowing] = None, ) -> List[EvaluationRun]: @@ -421,6 +258,8 @@ async def query_runs( # run=run, # + include_archived=include_archived, + # windowing=windowing, ) @@ -434,8 +273,6 @@ async def create_scenario( # scenario: EvaluationScenarioCreate, ) -> Optional[EvaluationScenario]: - scenario.version = CURRENT_VERSION - return await self.evaluations_dao.create_scenario( project_id=project_id, user_id=user_id, @@ -451,9 +288,6 @@ async def create_scenarios( # scenarios: List[EvaluationScenarioCreate], ) -> List[EvaluationScenario]: - for scenario in scenarios: - scenario.version = CURRENT_VERSION - return await self.evaluations_dao.create_scenarios( project_id=project_id, user_id=user_id, @@ -495,8 +329,6 @@ async def edit_scenario( # scenario: EvaluationScenarioEdit, ) -> Optional[EvaluationScenario]: - scenario.version = CURRENT_VERSION - return await self.evaluations_dao.edit_scenario( project_id=project_id, user_id=user_id, @@ -512,9 +344,6 @@ async def edit_scenarios( # scenarios: List[EvaluationScenarioEdit], ) -> List[EvaluationScenario]: - for scenario in scenarios: - scenario.version = CURRENT_VERSION - return await self.evaluations_dao.edit_scenarios( project_id=project_id, user_id=user_id, @@ -551,7 +380,7 @@ async def query_scenarios( *, project_id: UUID, # - scenario: Optional[EvaluationScenarioQuery] = None, + scenario: EvaluationScenarioQuery, # windowing: Optional[Windowing] = None, ) -> List[EvaluationScenario]: @@ -563,1964 +392,266 @@ async def query_scenarios( windowing=windowing, ) - # - EVALUATION RESULT ------------------------------------------------------ + # - EVALUATION STEP -------------------------------------------------------- - async def create_result( + async def create_step( self, *, project_id: UUID, user_id: UUID, # - result: EvaluationResultCreate, - ) -> Optional[EvaluationResult]: - result.version = CURRENT_VERSION - - return await self.evaluations_dao.create_result( + step: EvaluationStepCreate, + ) -> Optional[EvaluationStep]: + return await self.evaluations_dao.create_step( project_id=project_id, user_id=user_id, # - result=result, + step=step, ) - async def create_results( + async def create_steps( self, *, project_id: UUID, user_id: UUID, # - results: List[EvaluationResultCreate], - ) -> List[EvaluationResult]: - for result in results: - result.version = CURRENT_VERSION - - return await self.evaluations_dao.create_results( + steps: List[EvaluationStepCreate], + ) -> List[EvaluationStep]: + return await self.evaluations_dao.create_steps( project_id=project_id, user_id=user_id, # - results=results, + steps=steps, ) - async def fetch_result( + async def fetch_step( self, *, project_id: UUID, # - result_id: UUID, - ) -> Optional[EvaluationResult]: - return await self.evaluations_dao.fetch_result( + step_id: UUID, + ) -> Optional[EvaluationStep]: + return await self.evaluations_dao.fetch_step( project_id=project_id, # - result_id=result_id, + step_id=step_id, ) - async def fetch_results( + async def fetch_steps( self, *, project_id: UUID, # - result_ids: List[UUID], - ) -> List[EvaluationResult]: - return await self.evaluations_dao.fetch_results( + step_ids: List[UUID], + ) -> List[EvaluationStep]: + return await self.evaluations_dao.fetch_steps( project_id=project_id, # - result_ids=result_ids, + step_ids=step_ids, ) - async def edit_result( + async def edit_step( self, *, project_id: UUID, user_id: UUID, # - result: EvaluationResultEdit, - ) -> Optional[EvaluationResult]: - result.version = CURRENT_VERSION - - return await self.evaluations_dao.edit_result( + step: EvaluationStepEdit, + ) -> Optional[EvaluationStep]: + return await self.evaluations_dao.edit_step( project_id=project_id, user_id=user_id, # - result=result, + step=step, ) - async def edit_results( + async def edit_steps( self, *, project_id: UUID, user_id: UUID, # - results: List[EvaluationResultEdit], - ) -> List[EvaluationResult]: - for result in results: - result.version = CURRENT_VERSION - - return await self.evaluations_dao.edit_results( + steps: List[EvaluationStepEdit], + ) -> List[EvaluationStep]: + return await self.evaluations_dao.edit_steps( project_id=project_id, user_id=user_id, # - results=results, + steps=steps, ) - async def delete_result( + async def delete_step( self, *, project_id: UUID, # - result_id: UUID, + step_id: UUID, ) -> Optional[UUID]: - return await self.evaluations_dao.delete_result( + return await self.evaluations_dao.delete_step( project_id=project_id, # - result_id=result_id, + step_id=step_id, ) - async def delete_results( + async def delete_steps( self, *, project_id: UUID, # - result_ids: List[UUID], + step_ids: List[UUID], ) -> List[UUID]: - return await self.evaluations_dao.delete_results( + return await self.evaluations_dao.delete_steps( project_id=project_id, # - result_ids=result_ids, + step_ids=step_ids, ) - async def query_results( + async def query_steps( self, *, project_id: UUID, # - result: Optional[EvaluationResultQuery] = None, + step: EvaluationStepQuery, # windowing: Optional[Windowing] = None, - ) -> List[EvaluationResult]: - return await self.evaluations_dao.query_results( + ) -> List[EvaluationStep]: + return await self.evaluations_dao.query_steps( project_id=project_id, # - result=result, + step=step, # windowing=windowing, ) # - EVALUATION METRIC ------------------------------------------------------ - async def create_metrics( - self, - *, - project_id: UUID, - user_id: UUID, - # - metrics: List[EvaluationMetricsCreate], - ) -> List[EvaluationMetrics]: - for metric in metrics: - metric.version = CURRENT_VERSION - - return await self.evaluations_dao.create_metrics( - project_id=project_id, - user_id=user_id, - # - metrics=metrics, - ) - - async def fetch_metrics( - self, - *, - project_id: UUID, - # - metrics_ids: List[UUID], - ) -> List[EvaluationMetrics]: - return await self.evaluations_dao.fetch_metrics( - project_id=project_id, - # - metrics_ids=metrics_ids, - ) - - async def edit_metrics( + async def create_metric( self, *, project_id: UUID, user_id: UUID, # - metrics: List[EvaluationMetricsEdit], - ) -> List[EvaluationMetrics]: - for metric in metrics: - metric.version = CURRENT_VERSION - - return await self.evaluations_dao.edit_metrics( + metric: EvaluationMetricCreate, + ) -> Optional[EvaluationMetric]: + return await self.evaluations_dao.create_metric( project_id=project_id, user_id=user_id, # - metrics=metrics, - ) - - async def delete_metrics( - self, - *, - project_id: UUID, - # - metrics_ids: List[UUID], - ) -> List[UUID]: - return await self.evaluations_dao.delete_metrics( - project_id=project_id, - # - metrics_ids=metrics_ids, - ) - - async def query_metrics( - self, - *, - project_id: UUID, - # - metric: Optional[EvaluationMetricsQuery] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[EvaluationMetrics]: - return await self.evaluations_dao.query_metrics( - project_id=project_id, - # metric=metric, - # - windowing=windowing, - ) - - async def refresh_metrics( - self, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, - scenario_id: Optional[UUID] = None, - timestamp: Optional[datetime] = None, - interval: Optional[int] = None, - ) -> List[EvaluationMetrics]: - metrics_data: Dict[str, Any] = dict() - - run = await self.fetch_run( - project_id=project_id, - # - run_id=run_id, - ) - - if not run or not run.data or not run.data.steps: - log.warning("[WARN] run or run.data or run.data.steps not found") - return [] - - steps_metrics_keys: Dict[str, List[Dict[str, str]]] = dict() - - for step in run.data.steps: - steps_metrics_keys[step.key] = DEFAULT_METRICS - - if step.type == "annotation": - evaluator_revision_ref = step.references.get("evaluator_revision") - - if not evaluator_revision_ref: - log.warning("[WARN] Evaluator revision reference not found") - continue - - evaluator_revision = ( - await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - evaluator_revision_ref=evaluator_revision_ref, - ) - ) - - if not evaluator_revision: - log.warning("[WARN] Evaluator revision not found") - continue - - if evaluator_revision.data and evaluator_revision.data.schemas: - metrics_keys = get_metrics_keys_from_schema( - schema=(evaluator_revision.data.schemas.get("outputs")), - ) - - steps_metrics_keys[step.key] += [ - { - "path": "ag.data.outputs." + metric_key.get("path", ""), - "type": metric_key.get("type", ""), - } - for metric_key in metrics_keys - ] - - if not steps_metrics_keys: - log.warning("[WARN] No steps metrics keys found") - return [] - - step_keys = list(steps_metrics_keys.keys()) - - steps_trace_ids: Dict[str, List[str]] = dict() - - for step_key in step_keys: - results = await self.query_results( - project_id=project_id, - result=EvaluationResultQuery( - run_id=run_id, - scenario_id=scenario_id, - step_key=step_key, - timestamp=timestamp, - interval=interval, - ), - ) - - if not results: - # log.warning("[WARN] No results found") - continue - - trace_ids = [result.trace_id for result in results if result.trace_id] - - if trace_ids: - steps_trace_ids[step_key] = trace_ids - - for step_key in steps_metrics_keys.keys() & steps_trace_ids.keys(): - step_metrics_keys = steps_metrics_keys[step_key] - step_trace_ids = steps_trace_ids[step_key] - - try: - query = TracingQuery( - filtering=Filtering( - conditions=[ - Condition( - field="trace_id", - operator=ListOperator.IN, - value=step_trace_ids, - ) - ] - ) - ) - - specs = [ - MetricSpec( - type=MetricType(metric.get("type")), - path=metric.get("path") or "*", - ) - for metric in step_metrics_keys - ] + [ - MetricSpec( - type=MetricType.JSON, - path="atttributes.ag", - ) - ] - - buckets = await self.tracing_service.analytics( - project_id=project_id, - # - query=query, - specs=specs, - ) - - if len(buckets) != 1: - log.warning("[WARN] There should be one and only one bucket") - log.warning("[WARN] Buckets:", buckets) - continue - - bucket = buckets[0] - - if not bucket.metrics: - log.warning("[WARN] Bucket metrics should not be empty") - log.warning("[WARN] Bucket:", bucket) - continue - - metrics_data |= {step_key: bucket.metrics} - - except Exception as e: - log.error(e, exc_info=True) - - if not metrics_data: - # log.warning("[WARN] No metrics data: no metrics will be stored") - return [] - - metrics_create = [ - EvaluationMetricsCreate( - run_id=run_id, - scenario_id=scenario_id, - timestamp=timestamp, - interval=interval, - # - status=EvaluationStatus.SUCCESS, - # - data=metrics_data, - ) - ] - - metrics = await self.create_metrics( - project_id=project_id, - user_id=user_id, - # - metrics=metrics_create, - ) - - return metrics - - # - EVALUATION QUEUE ------------------------------------------------------- - - async def create_queue( - self, - *, - project_id: UUID, - user_id: UUID, - # - queue: EvaluationQueueCreate, - ) -> Optional[EvaluationQueue]: - queue.version = CURRENT_VERSION - - return await self.evaluations_dao.create_queue( - project_id=project_id, - user_id=user_id, - # - queue=queue, ) - async def create_queues( + async def create_metrics( self, *, project_id: UUID, user_id: UUID, # - queues: List[EvaluationQueueCreate], - ) -> List[EvaluationQueue]: - for queue in queues: - queue.version = CURRENT_VERSION - - return await self.evaluations_dao.create_queues( + metrics: List[EvaluationMetricCreate], + ) -> List[EvaluationMetric]: + return await self.evaluations_dao.create_metrics( project_id=project_id, user_id=user_id, # - queues=queues, + metrics=metrics, ) - async def fetch_queue( + async def fetch_metric( self, *, project_id: UUID, # - queue_id: UUID, - ) -> Optional[EvaluationQueue]: - return await self.evaluations_dao.fetch_queue( + metric_id: UUID, + ) -> Optional[EvaluationMetric]: + return await self.evaluations_dao.fetch_metric( project_id=project_id, # - queue_id=queue_id, + metric_id=metric_id, ) - async def fetch_queues( + async def fetch_metrics( self, *, project_id: UUID, # - queue_ids: List[UUID], - ) -> List[EvaluationQueue]: - return await self.evaluations_dao.fetch_queues( + metric_ids: List[UUID], + ) -> List[EvaluationMetric]: + return await self.evaluations_dao.fetch_metrics( project_id=project_id, # - queue_ids=queue_ids, + metric_ids=metric_ids, ) - async def edit_queue( + async def edit_metric( self, *, project_id: UUID, user_id: UUID, # - queue: EvaluationQueueEdit, - ) -> Optional[EvaluationQueue]: - queue.version = CURRENT_VERSION - - return await self.evaluations_dao.edit_queue( + metric: EvaluationMetricEdit, + ) -> Optional[EvaluationMetric]: + return await self.evaluations_dao.edit_metric( project_id=project_id, user_id=user_id, # - queue=queue, + metric=metric, ) - async def edit_queues( + async def edit_metrics( self, *, project_id: UUID, user_id: UUID, # - queues: List[EvaluationQueueEdit], - ) -> List[EvaluationQueue]: - for queue in queues: - queue.version = CURRENT_VERSION - - return await self.evaluations_dao.edit_queues( + metrics: List[EvaluationMetricEdit], + ) -> List[EvaluationMetric]: + return await self.evaluations_dao.edit_metrics( project_id=project_id, user_id=user_id, # - queues=queues, + metrics=metrics, ) - async def delete_queue( + async def delete_metric( self, *, project_id: UUID, # - queue_id: UUID, + metric_id: UUID, ) -> Optional[UUID]: - return await self.evaluations_dao.delete_queue( + return await self.evaluations_dao.delete_metric( project_id=project_id, # - queue_id=queue_id, + metric_id=metric_id, ) - async def delete_queues( + async def delete_metrics( self, *, project_id: UUID, # - queue_ids: List[UUID], + metric_ids: List[UUID], ) -> List[UUID]: - return await self.evaluations_dao.delete_queues( + return await self.evaluations_dao.delete_metrics( project_id=project_id, # - queue_ids=queue_ids, + metric_ids=metric_ids, ) - async def query_queues( + async def query_metrics( self, *, project_id: UUID, # - queue: Optional[EvaluationQueueQuery] = None, + metric: EvaluationMetricQuery, # windowing: Optional[Windowing] = None, - ) -> List[EvaluationQueue]: - return await self.evaluations_dao.query_queues( + ) -> List[EvaluationMetric]: + return await self.evaluations_dao.query_metrics( project_id=project_id, # - queue=queue, + metric=metric, # windowing=windowing, ) - async def fetch_queue_scenarios( - self, - *, - project_id: UUID, - user_id: Optional[UUID] = None, - # - queue_id: UUID, - # - ) -> List[List[UUID]]: - queue = await self.fetch_queue( - project_id=project_id, - queue_id=queue_id, - ) - - if not queue: - return [] - - queue_scenario_ids = queue.data.scenario_ids if queue.data else None - - scenarios = await self.query_scenarios( - project_id=project_id, - scenario=EvaluationScenarioQuery( - run_id=queue.run_id, - ids=queue_scenario_ids, - ), - ) - - run_scenario_ids = [scenario.id for scenario in scenarios] - run_scenario_ids = [id for id in run_scenario_ids if id is not None] - - queue_user_ids = queue.data.user_ids if queue.data else None - - if not queue_user_ids: - return [run_scenario_ids] - - is_sequential = queue.flags and queue.flags.is_sequential or False - - user_scenario_ids = filter_scenario_ids( - user_id, - queue_user_ids, - run_scenario_ids, - is_sequential, - ) - - return user_scenario_ids - - -class SimpleEvaluationsService: - def __init__( - self, - queries_service: QueriesService, - testsets_service: TestsetsService, - evaluators_service: EvaluatorsService, - evaluations_service: EvaluationsService, - simple_testsets_service: SimpleTestsetsService, - simple_evaluators_service: SimpleEvaluatorsService, - ): - self.queries_service = queries_service - self.testsets_service = testsets_service - self.evaluators_service = evaluators_service - self.evaluations_service = evaluations_service - self.simple_testsets_service = simple_testsets_service - self.simple_evaluators_service = simple_evaluators_service - - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluation: SimpleEvaluationCreate, - ) -> Optional[SimpleEvaluation]: - evaluation.flags = evaluation.flags or SimpleEvaluationFlags( - is_closed=False, - is_live=False, - is_active=True, - ) - - if not evaluation.data: - log.info("[EVAL] [failure] missing simple evaluation data") - return None - - # ---------------------------------------------------------------------- - log.info("[EVAL] [create]") - log.info("[EVAL] [scope] ", project_id=project_id, user_id=user_id) - log.info("[EVAL] [flags] ", ids=evaluation.flags.model_dump(mode="json")) - log.info("[EVAL] [status] ", ids=evaluation.data.status) - log.info("[EVAL] [queries] ", ids=evaluation.data.query_steps) - log.info("[EVAL] [testsets] ", ids=evaluation.data.testset_steps) - log.info("[EVAL] [applications]", ids=evaluation.data.application_steps) - log.info("[EVAL] [evaluators] ", ids=evaluation.data.evaluator_steps) - log.info("[EVAL] [repeats] ", repeats=evaluation.data.repeats) - # ---------------------------------------------------------------------- - - try: - run_flags = await self._make_evaluation_run_flags( - is_closed=False, - is_live=evaluation.flags.is_live, - is_active=False, - ) - - if not run_flags: - log.info("[EVAL] [failure] invalid simple evaluation flags") - return None - - evaluation_jit = evaluation.jit or {"testsets": True, "evaluators": True} - - run_data = await self._make_evaluation_run_data( - project_id=project_id, - user_id=user_id, - # - query_steps=evaluation.data.query_steps, - testset_steps=evaluation.data.testset_steps, - application_steps=evaluation.data.application_steps, - evaluator_steps=evaluation.data.evaluator_steps, - # - repeats=evaluation.data.repeats, - # - jit=evaluation_jit, - ) - - if not run_data: - log.error("[EVAL] [failure] missing or invalid simple evaluation data") - return None - - run_create = EvaluationRunCreate( - name=evaluation.name, - description=evaluation.description, - # - flags=run_flags, - tags=evaluation.tags, - meta=evaluation.meta, - # - status=evaluation.data.status or EvaluationStatus.PENDING, - # - data=run_data, - ) - - run = await self.evaluations_service.create_run( - project_id=project_id, - user_id=user_id, - # - run=run_create, - ) - - if not run or not run.id: - log.error("[EVAL] [failure] could not create evaluation run") - return None - - log.info("[EVAL] [run] ", id=run.id) - - log.info("[EVAL] [start] ", id=run.id) - - _evaluation = await self.start( - project_id=project_id, - user_id=user_id, - evaluation_id=run.id, - # - just_created=True, - ) - - if not _evaluation: - log.error("[EVAL] [failure] could not start evaluation run") - return None - - log.info("[EVAL] [success] ", id=run.id) - return _evaluation - - except: # pylint: disable=bare-except - log.error("[EVAL] [failure] ", exc_info=True) - return None - - async def fetch( - self, - *, - project_id: UUID, - # - evaluation_id: UUID, - ) -> Optional[SimpleEvaluation]: - run = await self.evaluations_service.fetch_run( - project_id=project_id, - # - run_id=evaluation_id, - ) - - if not run: - return None - - evaluation = await self._parse_evaluation_run(run=run) - - return evaluation - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluation: SimpleEvaluationEdit, - ) -> Optional[SimpleEvaluation]: - evaluation.flags = evaluation.flags or SimpleEvaluationFlags( - is_closed=False, - is_live=False, - is_active=True, - ) - - if not evaluation.id: - log.info("[EVAL] [failure] missing simple evaluation id") - return None - - if not evaluation.flags: - log.info("") - return None - - if not evaluation.data: - log.info("[EVAL] [failure] missing simple evaluation data") - return None - - # ---------------------------------------------------------------------- - log.info("[EVAL] [edit] ", run_id=evaluation.id) - log.info("[EVAL] [scope] ", project_id=project_id, user_id=user_id) - log.info("[EVAL] [flags] ", ids=evaluation.flags.model_dump(mode="json")) - log.info("[EVAL] [queries] ", ids=evaluation.data.query_steps) - log.info("[EVAL] [testsets] ", ids=evaluation.data.testset_steps) - log.info("[EVAL] [applications]", ids=evaluation.data.application_steps) - log.info("[EVAL] [evaluators] ", ids=evaluation.data.evaluator_steps) - log.info("[EVAL] [repeats] ", repeats=evaluation.data.repeats) - # ---------------------------------------------------------------------- - - try: - _evaluation = await self.fetch( - project_id=project_id, - # - evaluation_id=evaluation.id, - ) - - if not _evaluation or not _evaluation.id: - log.error("[EVAL] [failure] could not find evaluation run") - return None - - if not _evaluation.flags: - _evaluation.flags = SimpleEvaluationFlags() - - if not _evaluation.data: - _evaluation.data = SimpleEvaluationData() - - if _evaluation.flags.is_closed: - log.error("[EVAL] [failure] cannot edit closed evaluation run") - return None - - was_active = _evaluation.flags.is_active - - run_status = _evaluation.data.status - - if was_active: - log.info("[EVAL] [stop] ", run_id=_evaluation.id) - _evaluation = await self.stop( - project_id=project_id, - user_id=user_id, - # - evaluation_id=_evaluation.id, - ) - - if not _evaluation or not _evaluation.id: - log.error("[EVAL] [failure] could not stop evaluation run") - return None - - if not _evaluation.flags: - _evaluation.flags = SimpleEvaluationFlags() - - if not _evaluation.data: - _evaluation.data = SimpleEvaluationData() - - await sleep(SAFE_CLOSE_DELAY) - - run_flags = await self._make_evaluation_run_flags( - is_closed=_evaluation.flags.is_closed, - is_live=_evaluation.flags.is_live, - is_active=_evaluation.flags.is_active, - ) - - run_data = await self._make_evaluation_run_data( - project_id=project_id, - user_id=user_id, - # - query_steps=evaluation.data.query_steps, - testset_steps=evaluation.data.testset_steps, - application_steps=evaluation.data.application_steps, - evaluator_steps=evaluation.data.evaluator_steps, - # - repeats=_evaluation.data.repeats, - ) - - run_edit = EvaluationRunEdit( - id=_evaluation.id, - name=evaluation.name, - description=evaluation.description, - # - flags=run_flags, - tags=evaluation.tags, - meta=evaluation.meta, - # - status=run_status, - # - data=run_data, - ) - - run = await self.evaluations_service.edit_run( - project_id=project_id, - user_id=user_id, - # - run=run_edit, - ) - - if not run: - log.error("[EVAL] [failure] could not edit evaluation run") - return None - - if was_active: - log.info("[EVAL] [start] ", run_id=_evaluation.id) - - _evaluation = await self.start( - project_id=project_id, - user_id=user_id, - # - evaluation_id=_evaluation.id, - ) - - if not _evaluation or not _evaluation.id: - log.error("[EVAL] [failure] could not start evaluation run") - return None - - else: - _evaluation = await self.fetch( - project_id=project_id, - # - evaluation_id=_evaluation.id, - ) - - if not _evaluation or not _evaluation.id: - log.error("[EVAL] [failure] could not find evaluation run") - return None - - log.info("[EVAL] [success] ", run_id=_evaluation.id) - - return _evaluation - - except: # pylint: disable=bare-except - log.error("[EVAL] [failure] ", exc_info=True) - return None - - async def delete( - self, - *, - project_id: UUID, - # - evaluation_id: UUID, - ) -> Optional[UUID]: - await self.evaluations_service.delete_run( - project_id=project_id, - # - run_id=evaluation_id, - ) - - return evaluation_id - - async def query( - self, - *, - project_id: UUID, - # - query: Optional[SimpleEvaluationQuery] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[SimpleEvaluation]: - run_query = await self._make_evaluation_run_query( - is_closed=query.flags.is_closed if query and query.flags else None, - is_live=query.flags.is_live if query and query.flags else None, - is_active=query.flags.is_active if query and query.flags else None, - # - tags=query.tags if query else None, - meta=query.meta if query else None, - ) - - runs = await self.evaluations_service.query_runs( - project_id=project_id, - # - run=run_query, - # - windowing=windowing, - ) - - _evaluations = [ - _evaluation - for _evaluation in [ - await self._parse_evaluation_run(run=run) for run in runs if run - ] - if _evaluation - ] - - return _evaluations - - async def start( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluation_id: UUID, - # - just_created: Optional[bool] = None, - ) -> Optional[SimpleEvaluation]: - try: - _evaluation = await self.fetch( - project_id=project_id, - # - evaluation_id=evaluation_id, - ) - - if not _evaluation or not _evaluation.id: - return None - - if not _evaluation.flags: - _evaluation.flags = SimpleEvaluationFlags() - - if not _evaluation.data: - _evaluation.data = SimpleEvaluationData() - - if _evaluation.flags.is_live and _evaluation.data.query_steps: - run = await self._activate_evaluation_run( - project_id=project_id, - user_id=user_id, - # - run_id=_evaluation.id, - # - just_created=just_created, - ) - - if not run or not run.id: - log.error( - "[EVAL] [start] [failure] could not activate evaluation run" - ) - return None - - _evaluation = await self._parse_evaluation_run(run=run) - - elif ( - not _evaluation.flags.is_live - and _evaluation.data.evaluator_steps - and (_evaluation.data.query_steps or _evaluation.data.testset_steps) - ): - run = await self._activate_evaluation_run( - project_id=project_id, - user_id=user_id, - # - run_id=_evaluation.id, - # - just_created=just_created, - ) - - if not run or not run.id: - log.error( - "[EVAL] [start] [failure] could not activate evaluation run" - ) - return None - - if _evaluation.data.query_steps: - celery_dispatch.send_task( # type: ignore - "src.tasks.evaluations.batch.evaluate_queries", - kwargs=dict( - project_id=project_id, - user_id=user_id, - # - run_id=run.id, - ), - ) - - elif _evaluation.data.testset_steps: - celery_dispatch.send_task( # type: ignore - "src.tasks.evaluations.batch.evaluate_testsets", - kwargs=dict( - project_id=project_id, - user_id=user_id, - # - run_id=run.id, - ), - ) - - return _evaluation - - log.info("[EVAL] [start] [success]") - - return _evaluation - - except: # pylint: disable=bare-except - log.error("[EVAL] [start] [failure]", exc_info=True) - return None - - async def stop( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluation_id: UUID, - ) -> Optional[SimpleEvaluation]: - run = await self._deactivate_evaluation_run( - project_id=project_id, - user_id=user_id, - # - run_id=evaluation_id, - ) - - if not run or not run.id: - log.error("[EVAL] [stop] [failure] could not stop evaluation run") - return None - - _evaluation = await self._parse_evaluation_run(run=run) - - return _evaluation - - async def close( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluation_id: UUID, - ) -> Optional[SimpleEvaluation]: - run = await self.evaluations_service.close_run( - project_id=project_id, - user_id=user_id, - # - run_id=evaluation_id, - ) - - if not run or not run.id: - log.error("[EVAL] [close] [failure] could not close evaluation run") - return None - - evaluation = await self._parse_evaluation_run(run=run) - - return evaluation - - async def open( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluation_id: UUID, - ) -> Optional[SimpleEvaluation]: - run = await self.evaluations_service.open_run( - project_id=project_id, - user_id=user_id, - # - run_id=evaluation_id, - ) - - if not run or not run.id: - log.error("[EVAL] [open] [failure] could not open evaluation run") - return None - - evaluation = await self._parse_evaluation_run(run=run) - - return evaluation - - async def _make_evaluation_run_data( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_steps: Optional[Target] = None, - testset_steps: Optional[Target] = None, - application_steps: Optional[Target] = None, - evaluator_steps: Optional[Target] = None, - # - repeats: Optional[int] = None, - # - jit: Optional[Dict[str, bool]] = None, - ) -> Optional[EvaluationRunData]: - # IMPLICIT FLAG: is_multivariate=False - # IMPLICIT FLAG: all_inputs=True - # IMPLICIT FLAG: full_references=True - - try: - # fetch queries ---------------------------------------------------- - query_input_steps_keys: List[str] = list() - query_references: Dict[str, Dict[str, Reference]] = dict() - query_revisions: Dict[str, QueryRevision] = dict() - query_origins: Dict[str, Origin] = dict() - - if isinstance(query_steps, list): - query_steps = { - query_revision_id: DEFAULT_ORIGIN_QUERIES - for query_revision_id in query_steps - } - - for query_revision_id, origin in (query_steps or {}).items(): - query_revision_ref = Reference(id=query_revision_id) - - query_revision = await self.queries_service.fetch_query_revision( - project_id=project_id, - # - query_revision_ref=query_revision_ref, - ) - - if not query_revision or not query_revision.slug: - log.warn( - "[EVAL] [run] [make] [failure] could not find query revision", - id=query_revision_ref.id, - ) - return None - - query_variant_ref = Reference(id=query_revision.variant_id) - - query_variant = await self.queries_service.fetch_query_variant( - project_id=project_id, - # - query_variant_ref=query_variant_ref, - ) - - if not query_variant: - log.warn( - "[EVAL] [run] [make] [failure] could not find query variant", - id=query_variant_ref.id, - ) - return None - - query_ref = Reference(id=query_variant.query_id) - - query = await self.queries_service.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query: - log.warn( - "[EVAL] [run] [make] [failure] could not find query", - id=query_ref.id, - ) - return None - - step_key = "query-" + query_revision.slug - - query_input_steps_keys.append(step_key) - - query_references[step_key] = dict( - query=Reference( - id=query.id, - slug=query.slug, - ), - query_variant=Reference( - id=query_variant.id, - slug=query_variant.slug, - ), - query_revision=Reference( - id=query_revision.id, - slug=query_revision.slug, - version=query_revision.version, - ), - ) - - query_revisions[step_key] = query_revision - - query_origins[step_key] = origin - - # ------------------------------------------------------------------ - - # fetch testsets --------------------------------------------------- - testset_input_steps_keys: List[str] = list() - testset_references: Dict[str, Dict[str, Reference]] = dict() - testset_revisions: Dict[str, TestsetRevision] = dict() - testset_origins: Dict[str, Origin] = dict() - testcases: Dict[str, List[Testcase]] = dict() - - if isinstance(testset_steps, list): - testset_steps = { - testset_revision_id: DEFAULT_ORIGIN_TESTSETS - for testset_revision_id in testset_steps - } - - # JIT MIGRATION ================================================== # - if jit and jit.get("testsets"): - _testset_steps = deepcopy(testset_steps or {}) - testset_steps = dict() - - for testset_id, origin in _testset_steps.items(): - testset_ref = Reference(id=testset_id) - - simple_testset = await self.simple_testsets_service.transfer( - project_id=project_id, - user_id=user_id, - # - testset_id=testset_id, - ) - - if ( - not simple_testset - or not simple_testset.id - or not simple_testset.slug - ): - log.warn( - "[EVAL] [run] [make] [failure] could not transfer simple testset", - id=testset_ref.id, - ) - return None - - testset_revision = await self.testsets_service.fetch_testset_revision( - project_id=project_id, - # - testset_ref=testset_ref, - ) - - if ( - not testset_revision - or not testset_revision.id - or not testset_revision.slug - ): - log.warn( - "[EVAL] [run] [make] [failure] could not find testset revision", - id=testset_ref.id, - ) - return None - - testset_steps[testset_revision.id] = origin - # ================================================================ # - - for testset_revision_id, origin in (testset_steps or {}).items(): - testset_revision_ref = Reference(id=testset_revision_id) - - testset_revision = await self.testsets_service.fetch_testset_revision( - project_id=project_id, - # - testset_revision_ref=testset_revision_ref, - ) - - if not testset_revision or not testset_revision.slug: - log.warn( - "[EVAL] [run] [make] [failure] could not find testset revision", - id=testset_revision_ref.id, - ) - return None - - if not testset_revision.data or not testset_revision.data.testcases: - log.warn( - "[EVAL] [run] [make] [failure] invalid testset revision", - id=testset_revision_ref.id, - ) - return None - - testset_variant_ref = Reference(id=testset_revision.variant_id) - - testset_variant = await self.testsets_service.fetch_testset_variant( - project_id=project_id, - # - testset_variant_ref=testset_variant_ref, - ) - - if not testset_variant: - log.warn( - "[EVAL] [run] [make] [failure] could not find testset variant", - id=testset_variant_ref.id, - ) - return None - - testset_ref = Reference(id=testset_variant.testset_id) - - testset = await self.testsets_service.fetch_testset( - project_id=project_id, - # - testset_ref=testset_ref, - ) - - if not testset: - log.warn( - "[EVAL] [run] [make] [failure] could not find testset", - id=testset_ref.id, - ) - return None - - step_key = "testset-" + testset_revision.slug - - testset_input_steps_keys.append(step_key) - - testset_references[step_key] = dict( - testset=Reference( - id=testset.id, - slug=testset.slug, - ), - testset_variant=Reference( - id=testset_variant.id, - slug=testset_variant.slug, - ), - testset_revision=Reference( - id=testset_revision.id, - slug=testset_revision.slug, - version=testset_revision.version, - ), - ) - - testset_revisions[step_key] = testset_revision - - testset_origins[step_key] = origin - - testcases[step_key] = testset_revision.data.testcases - - if any(not testcase.data for testcase in testcases[step_key]): - log.warn( - "[EVAL] [run] [make] [failure] invalid testset revision", - id=testset_revision_ref.id, - ) - return None - # ------------------------------------------------------------------ - - # fetch applications ----------------------------------------------- - application_invocation_steps_keys: List[str] = list() - application_references: Dict[str, Dict[str, Reference]] = dict() - application_revisions: Dict[str, AppVariantRevisionsDB] = dict() - application_origins: Dict[str, Origin] = dict() - - if isinstance(application_steps, list): - application_steps = { - application_revision_id: DEFAULT_ORIGIN_APPLICATIONS - for application_revision_id in application_steps - } - - for application_revision_id, origin in (application_steps or {}).items(): - application_revision_ref = Reference(id=application_revision_id) - - application_revision = await fetch_app_variant_revision_by_id( - variant_revision_id=str(application_revision_ref.id), - ) - - if not application_revision: - log.warn( - "[EVAL] [run] [make] [failure] could not find application revision", - id=application_revision_ref.id, - ) - return None - - application_variant_ref = Reference( - id=UUID(str(application_revision.variant_id)) - ) - - application_variant = await fetch_app_variant_by_id( - app_variant_id=str(application_variant_ref.id), - ) - - if not application_variant: - log.warn( - "[EVAL] [run] [make] [failure] could not find application variant", - id=application_variant_ref.id, - ) - return None - - application_ref = Reference(id=UUID(str(application_variant.app_id))) - - application = await fetch_app_by_id( - app_id=str(application_ref.id), - ) - - if not application: - log.warn( - "[EVAL] [run] [make] [failure] could not find application", - id=application_ref.id, - ) - return None - - application_revision_slug = get_slug_from_name_and_id( - str(application_revision.config_name), - UUID(str(application_revision.id)), - ) - - step_key = "application-" + application_revision_slug - - application_invocation_steps_keys.append(step_key) - - application_references[step_key] = dict( - application=Reference( - id=application_ref.id, - slug=str(application.app_name), - ), - application_variant=Reference( - id=application_variant_ref.id, - slug=str(application_variant.variant_name), - ), - application_revision=Reference( - id=application_revision_ref.id, - slug=str(application_revision.config_name), - version=str(application_revision.revision), - ), - ) - - application_revisions[step_key] = application_revision - - application_origins[step_key] = origin - - # ------------------------------------------------------------------ - - # fetch evaluators ------------------------------------------------- - evaluator_annotation_steps_keys: List[str] = list() - evaluator_references: Dict[str, Dict[str, Reference]] = dict() - evaluator_revisions: Dict[str, EvaluatorRevision] = dict() - evaluator_origins: Dict[str, Origin] = dict() - evaluator_metrics_keys: Dict[str, List[Dict[str, str]]] = dict() - - if isinstance(evaluator_steps, list): - evaluator_steps = { - evaluator_revision_id: DEFAULT_ORIGIN_EVALUATORS - for evaluator_revision_id in evaluator_steps - } - - # JIT MIGRATION ================================================== # - if jit and jit.get("evaluators"): - _evaluator_steps = deepcopy(evaluator_steps or {}) - evaluator_steps = dict() - - for evaluator_id, origin in _evaluator_steps.items(): - evaluator_ref = Reference(id=evaluator_id) - - simple_evaluator = await self.simple_evaluators_service.transfer( - project_id=project_id, - user_id=user_id, - # - evaluator_id=evaluator_id, - ) - - if ( - not simple_evaluator - or not simple_evaluator.id - or not simple_evaluator.slug - ): - log.warn( - "[EVAL] [run] [make] [failure] could not transfer simple evaluator", - id=evaluator_ref.id, - ) - return None - - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if ( - not evaluator_revision - or not evaluator_revision.id - or not evaluator_revision.slug - ): - log.warn( - "[EVAL] [run] [make] [failure] could not find evaluator revision", - id=evaluator_ref.id, - ) - return None - - evaluator_steps[evaluator_revision.id] = origin - # ================================================================ # - - for evaluator_revision_id, origin in (evaluator_steps or {}).items(): - evaluator_revision_ref = Reference(id=evaluator_revision_id) - - evaluator_revision = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_revision_ref=evaluator_revision_ref, - ) - - if not evaluator_revision or not evaluator_revision.slug: - log.warn( - "[EVAL] [run] [make] [failure] could not find evaluator revision", - id=evaluator_revision_ref.id, - ) - return None - - if not evaluator_revision.data: - log.warn( - "[EVAL] [run] [make] [failure] invalid evaluator revision", - id=evaluator_revision_ref.id, - ) - return None - - evaluator_variant_ref = Reference(id=evaluator_revision.variant_id) - - evaluator_variant = await self.evaluators_service.fetch_evaluator_variant( - project_id=project_id, - # - evaluator_variant_ref=evaluator_variant_ref, - ) - - if not evaluator_variant: - log.warn( - "[EVAL] [run] [make] [failure] could not find evaluator variant", - id=evaluator_variant_ref.id, - ) - return None - - evaluator_ref = Reference(id=evaluator_variant.evaluator_id) - - evaluator = await self.evaluators_service.fetch_evaluator( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if not evaluator: - log.warn( - "[EVAL] [run] [make] [failure] could not find evaluator", - id=evaluator_ref.id, - ) - return None - - step_key = "evaluator-" + evaluator_revision.slug - - evaluator_annotation_steps_keys.append(step_key) - - evaluator_references[step_key] = dict( - evaluator=Reference( - id=evaluator.id, - slug=evaluator.slug, - ), - evaluator_variant=Reference( - id=evaluator_variant.id, - slug=evaluator_variant.slug, - ), - evaluator_revision=Reference( - id=evaluator_revision.id, - slug=evaluator_revision.slug, - version=evaluator_revision.version, - ), - ) - - evaluator_revisions[step_key] = evaluator_revision - - evaluator_origins[step_key] = origin - - if evaluator_revision.data.schemas: - metrics_keys = get_metrics_keys_from_schema( - schema=(evaluator_revision.data.schemas.get("outputs")), - ) - - evaluator_metrics_keys[step_key] = [ - { - "path": metric_key.get("path", ""), - "type": metric_key.get("type", ""), - } - for metric_key in metrics_keys - ] - else: - evaluator_metrics_keys[step_key] = [ - { - "path": "outputs", - "type": "json", - } - ] - # ------------------------------------------------------------------ - - # make run steps --------------------------------------------------- - query_inputs_steps: List[EvaluationRunDataStep] = [ - EvaluationRunDataStep( - key=step_key, - type="input", - origin=query_origins[step_key], - # IMPLICIT FLAG: full_references=True - references=query_references[step_key], - ) - for step_key in query_input_steps_keys - ] - - testset_inputs_steps: List[EvaluationRunDataStep] = [ - EvaluationRunDataStep( - key=step_key, - type="input", - origin=testset_origins[step_key], - # IMPLICIT FLAG: full_references=True - references=testset_references[step_key], - ) - for step_key in testset_input_steps_keys - ] - - application_invocation_steps: List[EvaluationRunDataStep] = [ - EvaluationRunDataStep( - key=step_key, - type="invocation", - origin=application_origins[step_key], - references=application_references[step_key], - inputs=[ - # IMPLICIT FLAG: all_inputs=True - EvaluationRunDataStepInput(key="__all_inputs__"), - ], - ) - for step_key in application_invocation_steps_keys - ] - - evaluator_annotation_steps: List[EvaluationRunDataStep] = [ - EvaluationRunDataStep( - key=step_key, - type="annotation", - origin=evaluator_origins[step_key], - references=evaluator_references[step_key], - inputs=( - [ - # IMPLICIT FLAG: is_multivariate=False - EvaluationRunDataStepInput(key="__all_invocations__"), - # IMPLICIT FLAG: all_inputs=True - EvaluationRunDataStepInput(key="__all_inputs__"), - ] - if not query_steps - else [ - # IMPLICIT FLAG: all_inputs=True - EvaluationRunDataStepInput(key="__all_inputs__"), - ] - ), - ) - for step_key in evaluator_annotation_steps_keys - ] - - steps: List[EvaluationRunDataStep] = ( - query_inputs_steps - + testset_inputs_steps - + application_invocation_steps - + evaluator_annotation_steps - ) - # ------------------------------------------------------------------ - - # make run mappings ------------------------------------------------ - query_input_mappings: List[EvaluationRunDataMapping] = list( # type: ignore - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="query", - name="data", - ), - step=EvaluationRunDataMappingStep( - key=step_key, - path="attributes.ag.data", - ), - ) - for step_key in query_input_steps_keys - ) - - testset_input_mappings: List[EvaluationRunDataMapping] = list( # type: ignore - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="testset", - name=key, - ), - step=EvaluationRunDataMappingStep( - key=step_key, - path=f"data.{key}", - ), - ) - for step_key in testset_input_steps_keys - for key in testcases[step_key][0].data.keys() # type: ignore - ) - - application_invocation_mappings: List[EvaluationRunDataMapping] = list( # type: ignore - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="invocation", - name="outputs", - ), - step=EvaluationRunDataMappingStep( - key=step_key, - path="attributes.ag.data.outputs", - ), - ) - for step_key in application_invocation_steps_keys - ) - - evaluator_annotation_mappings: List[EvaluationRunDataMapping] = list( # type: ignore - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="annotation", - name=metric_key.get("path", ""), - ), - step=EvaluationRunDataMappingStep( - key=step_key, - path=f"attributes.ag.data.outputs{('.' + metric_key.get('path', '')) if metric_key.get('path') else ''}", - ), - ) - for step_key in evaluator_annotation_steps_keys - for metric_key in evaluator_metrics_keys[step_key] - ) - - mappings: List[EvaluationRunDataMapping] = ( - query_input_mappings - + testset_input_mappings - + application_invocation_mappings - + evaluator_annotation_mappings - ) - # ------------------------------------------------------------------ - - return EvaluationRunData( - steps=steps, - mappings=mappings, - repeats=repeats or 1, - ) - - except: # pylint: disable=bare-except - log.error("[EVAL] [run] [make] [failure]", exc_info=True) - - return None - - async def _make_evaluation_run_flags( - self, - *, - is_closed: Optional[bool] = None, - is_live: Optional[bool] = None, - is_active: Optional[bool] = None, - ) -> EvaluationRunFlags: - return EvaluationRunFlags( - is_closed=is_closed, - is_live=is_live, - is_active=is_active, - ) - - async def _make_evaluation_run_query( - self, - *, - is_closed: Optional[bool] = None, - is_live: Optional[bool] = None, - is_active: Optional[bool] = None, - # - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - ): - run_flags = await self._make_evaluation_run_flags( - is_closed=is_closed, - is_live=is_live, - is_active=is_active, - ) - - run_query = EvaluationRunQuery( - flags=run_flags, - tags=tags, - meta=meta, - ) - - return run_query - - async def _activate_evaluation_run( - self, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, - # - just_created: Optional[bool] = None, - ) -> Optional[EvaluationRun]: - run = await self.evaluations_service.fetch_run( - project_id=project_id, - # - run_id=run_id, - ) - - if not run or not run.id: - log.error("[EVAL] [activate] [failure] could not find evaluation run") - return None - - if not run.flags: - run.flags = EvaluationRunFlags() - - run.flags.is_active = True - - run = await self.evaluations_service.edit_run( - project_id=project_id, - user_id=user_id, - # - run=EvaluationRunEdit( - id=run.id, - # - name=run.name, - description=run.description, - # - flags=run.flags, - tags=run.tags, - meta=run.meta, - # - status=EvaluationStatus.RUNNING if just_created else run.status, - # - data=run.data, - ), - ) - - return run - - async def _deactivate_evaluation_run( - self, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, - ) -> Optional[EvaluationRun]: - run = await self.evaluations_service.fetch_run( - project_id=project_id, - # - run_id=run_id, - ) - - if not run or not run.id: - log.error("[EVAL] [deactivate] [failure] could not find evaluation run") - return None - - if not run.flags: - run.flags = EvaluationRunFlags() - - run.flags.is_active = False - - run = await self.evaluations_service.edit_run( - project_id=project_id, - user_id=user_id, - # - run=EvaluationRunEdit( - id=run.id, - # - name=run.name, - description=run.description, - # - flags=run.flags, - tags=run.tags, - meta=run.meta, - # - status=run.status, - # - data=run.data, - ), - ) - - return run - - async def _parse_evaluation_run( - self, - *, - run: EvaluationRun, - ) -> Optional[SimpleEvaluation]: - try: - if not run: - return None - - if not run.flags: - run.flags = EvaluationRunFlags() - - if not run.data: - run.data = EvaluationRunData() - - steps = run.data.steps if run.data.steps else [] - - query_steps: Target = dict() - testset_steps: Target = dict() - application_steps: Target = dict() - evaluator_steps: Target = dict() - - repeats = run.data.repeats if run.data and run.data.repeats else None - - for step in steps: - step_type = step.type - step_origin = step.origin - step_references = step.references - step_id = None - - if step_type == "input": - if "query_revision" in step_references: - step_ref = step_references["query_revision"] - if not isinstance(step_ref, Reference): - continue - step_id = step_ref.id - query_steps[step_id] = step_origin # type: ignore - elif "testset_revision" in step_references: - step_ref = step_references["testset_revision"] - if not isinstance(step_ref, Reference): - continue - step_id = step_ref.id - testset_steps[step_id] = step_origin # type: ignore - elif step_type == "invocation": - if "application_revision" in step_references: - step_ref = step_references["application_revision"] - if not isinstance(step_ref, Reference): - continue - step_id = step_ref.id - application_steps[step_id] = step_origin # type: ignore - elif step_type == "annotation": - if "evaluator_revision" in step_references: - step_ref = step_references["evaluator_revision"] - if not isinstance(step_ref, Reference): - continue - step_id = step_ref.id - evaluator_steps[step_id] = step_origin # type: ignore - - evaluation_flags = SimpleEvaluationFlags(**run.flags.model_dump()) - - evaluation_status = SimpleEvaluationStatus(run.status) - - evaluation_data = SimpleEvaluationData( - status=evaluation_status, - # - query_steps=query_steps, - testset_steps=testset_steps, - application_steps=application_steps, - evaluator_steps=evaluator_steps, - # - repeats=repeats, - ) - - return SimpleEvaluation( - id=run.id, - # - name=run.name, - description=run.description, - # - created_at=run.created_at, - updated_at=run.updated_at, - deleted_at=run.deleted_at, - created_by_id=run.created_by_id, - updated_by_id=run.updated_by_id, - deleted_by_id=run.deleted_by_id, - # - flags=evaluation_flags, - tags=run.tags, - meta=run.meta, - # - data=evaluation_data, - ) - - except: # pylint: disable=bare-except - log.error("[EVAL] [run] [parse] [failure]", exc_info=True) - return None + # -------------------------------------------------------------------------- diff --git a/api/oss/src/core/evaluations/types.py b/api/oss/src/core/evaluations/types.py index 5ab35ea610..51387939d2 100644 --- a/api/oss/src/core/evaluations/types.py +++ b/api/oss/src/core/evaluations/types.py @@ -1,21 +1,17 @@ -from typing import Optional, Dict, List, Union, Literal +from typing import Optional, Dict, List from enum import Enum from uuid import UUID from datetime import datetime -from pydantic import BaseModel, field_validator - -from oss.src.core.tracing.dtos import ( - MetricSpec, - TracingQuery, -) +from pydantic import BaseModel from oss.src.core.shared.dtos import ( - Version, Identifier, Lifecycle, + Flags, + Tags, + Meta, Header, - Metadata, Data, Reference, Link, @@ -24,12 +20,6 @@ References = Dict[str, Reference] Links = Dict[str, Link] -Type = Literal["input", "invocation", "annotation"] -Origin = Literal["custom", "human", "auto"] -Target = Union[List[UUID], Dict[UUID, Origin]] - -CURRENT_VERSION = "2025-07-14" - class EvaluationStatus(str, Enum): PENDING = "pending" @@ -49,16 +39,16 @@ def __init__( message: str = "Cannot modify a closed evaluation.", run_id: Optional[UUID] = None, scenario_id: Optional[UUID] = None, - result_id: Optional[UUID] = None, - metrics_id: Optional[UUID] = None, + step_id: Optional[UUID] = None, + metric_id: Optional[UUID] = None, ): super().__init__(message) self.message = message self.run_id = run_id self.scenario_id = scenario_id - self.result_id = result_id - self.metrics_id = metrics_id + self.step_id = step_id + self.metric_id = metric_id def __str__(self): _message = self.message @@ -67,379 +57,246 @@ def __str__(self): _message += f" run_id={self.run_id}" if self.scenario_id: _message += f" scenario_id={self.scenario_id}" - if self.result_id: - _message += f" result_id={self.result_id}" - if self.metrics_id: - _message += f" metrics_id={self.metrics_id}" + if self.step_id: + _message += f" step_id={self.step_id}" + if self.metric_id: + _message += f" metric_id={self.metric_id}" return _message -# - EVALUATION RUN ------------------------------------------------------------- - - class EvaluationRunFlags(BaseModel): - is_closed: Optional[bool] = None # Indicates if the run is modifiable - is_live: Optional[bool] = None # Indicates if the run has live queries - is_active: Optional[bool] = None # Indicates if the run is currently active - + is_closed: Optional[bool] = None -class EvaluationRunDataStepInput(BaseModel): - key: str - - -class EvaluationRunDataStep(BaseModel): - key: str - type: Type - origin: Origin - references: Dict[str, Reference] - inputs: Optional[List[EvaluationRunDataStepInput]] = None - - -class EvaluationRunDataMappingColumn(BaseModel): - kind: str - name: str - - -class EvaluationRunDataMappingStep(BaseModel): - key: str - path: str +class EvaluationRunData(BaseModel): + steps: Optional[List[Data]] = None # ? + mappings: Optional[List[Data]] = None # ? + data: Optional[Data] = None -class EvaluationRunDataMapping(BaseModel): - column: EvaluationRunDataMappingColumn - step: EvaluationRunDataMappingStep +class EvaluationRun(Identifier, Header, Lifecycle): + flags: Optional[EvaluationRunFlags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -class EvaluationRunData(BaseModel): - steps: Optional[List[EvaluationRunDataStep]] = None - repeats: Optional[int] = 1 - mappings: Optional[List[EvaluationRunDataMapping]] = None + status: Optional[EvaluationStatus] = None - @field_validator("repeats") - def set_repeats(cls, v): - if v is None: - return 1 - return v + data: Optional[EvaluationRunData] = None -class EvaluationRun(Version, Identifier, Lifecycle, Header, Metadata): - flags: Optional[EvaluationRunFlags] = None # type: ignore +class EvaluationRunCreate(Header): + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = EvaluationStatus.PENDING data: Optional[EvaluationRunData] = None -class EvaluationRunCreate(Header, Metadata): - version: str = CURRENT_VERSION - - flags: Optional[EvaluationRunFlags] = None # type: ignore +class EvaluationRunEdit(Identifier, Header): + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = None data: Optional[EvaluationRunData] = None -class EvaluationRunEdit(Identifier, Header, Metadata): - version: str = CURRENT_VERSION +from typing import Any, Dict, List, Optional, Union - flags: Optional[EvaluationRunFlags] = None # type: ignore - status: Optional[EvaluationStatus] = None +class EvaluationRunQuery(BaseModel): + flags: Optional[EvaluationRunFlags] = None + tags: Optional[Tags] = None + # meta can be a dict (AND filter) or a list of dicts (OR filter) + meta: Optional[Union[Dict[str, Any], List[Dict[str, Any]]]] = None data: Optional[EvaluationRunData] = None - -class EvaluationRunQuery(Header, Metadata): - flags: Optional[EvaluationRunFlags] = None # type: ignore - status: Optional[EvaluationStatus] = None statuses: Optional[List[EvaluationStatus]] = None - references: Optional[List[References]] = None - ids: Optional[List[UUID]] = None # - EVALUATION SCENARIO -------------------------------------------------------- -class EvaluationScenario(Version, Identifier, Lifecycle, Metadata): - status: Optional[EvaluationStatus] = EvaluationStatus.PENDING +class EvaluationScenario(Identifier, Lifecycle): + # flags: Optional[Flags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None - interval: Optional[int] = None - timestamp: Optional[datetime] = None - run_id: UUID + status: Optional[EvaluationStatus] = None + run_id: Optional[UUID] = None + run: Optional[EvaluationRun] = None -class EvaluationScenarioCreate(Metadata): - version: str = CURRENT_VERSION - status: Optional[EvaluationStatus] = None +class EvaluationScenarioCreate(BaseModel): + tags: Optional[Tags] = None + meta: Optional[Meta] = None - interval: Optional[int] = None - timestamp: Optional[datetime] = None - run_id: UUID + status: Optional[EvaluationStatus] = EvaluationStatus.PENDING + + run_id: Optional[UUID] = None -class EvaluationScenarioEdit(Identifier, Metadata): - version: str = CURRENT_VERSION +class EvaluationScenarioEdit(Identifier): + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = None -class EvaluationScenarioQuery(Metadata): +class EvaluationScenarioQuery(BaseModel): + # flags: Optional[Flags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None + status: Optional[EvaluationStatus] = None statuses: Optional[List[EvaluationStatus]] = None - interval: Optional[int] = None - intervals: Optional[List[int]] = None - - timestamp: Optional[datetime] = None - timestamps: Optional[List[datetime]] = None - run_id: Optional[UUID] = None run_ids: Optional[List[UUID]] = None ids: Optional[List[UUID]] = None -# - EVALUATION RESULT ---------------------------------------------------------- - - -class EvaluationResult(Version, Identifier, Lifecycle, Metadata): - hash_id: Optional[UUID] = None - trace_id: Optional[str] = None - testcase_id: Optional[UUID] = None - error: Optional[Data] = None +# - EVALUATION STEP ------------------------------------------------------------ - status: Optional[EvaluationStatus] = EvaluationStatus.PENDING - interval: Optional[int] = None - timestamp: Optional[datetime] = None - repeat_idx: Optional[int] = 0 - step_key: str - scenario_id: UUID - run_id: UUID - - -class EvaluationResultCreate(Metadata): - version: str = CURRENT_VERSION - - hash_id: Optional[UUID] = None - trace_id: Optional[str] = None - testcase_id: Optional[UUID] = None - error: Optional[Data] = None +class EvaluationStep(Identifier, Lifecycle): + # flags: Optional[Flags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = None - - interval: Optional[int] = None timestamp: Optional[datetime] = None - repeat_idx: Optional[int] = 0 - step_key: str - scenario_id: UUID - run_id: UUID - -class EvaluationResultEdit(Identifier, Metadata): - version: str = CURRENT_VERSION + key: str + repeat_id: Optional[UUID] = None + retry_id: Optional[UUID] = None hash_id: Optional[UUID] = None trace_id: Optional[str] = None testcase_id: Optional[UUID] = None error: Optional[Data] = None - status: Optional[EvaluationStatus] = None - - -class EvaluationResultQuery(Metadata): - status: Optional[EvaluationStatus] = None - statuses: Optional[List[EvaluationStatus]] = None - - interval: Optional[int] = None - intervals: Optional[List[int]] = None - - timestamp: Optional[datetime] = None - timestamps: Optional[List[datetime]] = None - - repeat_idx: Optional[int] = None - repeat_idxs: Optional[List[int]] = None - - step_key: Optional[str] = None - step_keys: Optional[List[str]] = None - scenario_id: Optional[UUID] = None - scenario_ids: Optional[List[UUID]] = None + scenario: Optional[EvaluationScenario] = None run_id: Optional[UUID] = None - run_ids: Optional[List[UUID]] = None - - ids: Optional[List[UUID]] = None + run: Optional[EvaluationRun] = None -# - EVALUATION METRICS --------------------------------------------------------- +class EvaluationStepCreate(BaseModel): + tags: Optional[Tags] = None + meta: Optional[Meta] = None - -class EvaluationMetrics(Version, Identifier, Lifecycle, Metadata): status: Optional[EvaluationStatus] = EvaluationStatus.PENDING - data: Optional[Data] = None + key: str + repeat_id: Optional[UUID] = None + retry_id: Optional[UUID] = None + + hash_id: Optional[UUID] = None + trace_id: Optional[str] = None + testcase_id: Optional[UUID] = None + error: Optional[Data] = None - interval: Optional[int] = None - timestamp: Optional[datetime] = None scenario_id: Optional[UUID] = None - run_id: UUID + run_id: Optional[UUID] = None -class EvaluationMetricsCreate(Metadata): - version: str = CURRENT_VERSION +class EvaluationStepEdit(Identifier): + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = None - data: Optional[Data] = None + hash_id: Optional[UUID] = None + trace_id: Optional[str] = None + testcase_id: Optional[UUID] = None + error: Optional[Data] = None - interval: Optional[int] = None - timestamp: Optional[datetime] = None - scenario_id: Optional[UUID] = None - run_id: UUID +class EvaluationStepQuery(BaseModel): + # flags: Optional[Flags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None -class EvaluationMetricsEdit(Identifier, Metadata): - version: str = CURRENT_VERSION + key: Optional[str] = None + keys: Optional[List[str]] = None + repeat_id: Optional[UUID] = None + repeat_ids: Optional[List[UUID]] = None + retry_id: Optional[UUID] = None + retry_ids: Optional[List[UUID]] = None - status: Optional[EvaluationStatus] = None - - data: Optional[Data] = None - - -class EvaluationMetricsQuery(Metadata): status: Optional[EvaluationStatus] = None statuses: Optional[List[EvaluationStatus]] = None - - interval: Optional[int] = None - intervals: Optional[List[int]] = None - timestamp: Optional[datetime] = None - timestamps: Optional[List[datetime]] = None - - scenario_id: Optional[UUID] = None - scenario_ids: Optional[List[UUID]] = None run_id: Optional[UUID] = None run_ids: Optional[List[UUID]] = None + scenario_id: Optional[UUID] = None + scenario_ids: Optional[List[UUID]] = None ids: Optional[List[UUID]] = None -class EvaluationMetricsRefresh(BaseModel): - query: Optional[TracingQuery] = None - specs: Optional[List[MetricSpec]] = None - - ids: Optional[List[UUID]] = None +# - EVALUATION METRIC ---------------------------------------------------------- -# - EVALUATION QUEUE ----------------------------------------------------------- +class EvaluationMetric(Identifier, Lifecycle): + # flags: Optional[Flags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None + status: Optional[EvaluationStatus] = None -class EvaluationQueueFlags(BaseModel): - is_sequential: bool = False + data: Optional[Data] = None + scenario_id: Optional[UUID] = None + scenario: Optional[EvaluationScenario] = None -class EvaluationQueueData(BaseModel): - user_ids: Optional[List[List[UUID]]] = None - scenario_ids: Optional[List[UUID]] = None - step_keys: Optional[List[str]] = None + run_id: Optional[UUID] = None + run: Optional[EvaluationRun] = None -class EvaluationQueue(Version, Identifier, Lifecycle, Header, Metadata): - flags: Optional[EvaluationQueueFlags] = None # type: ignore +class EvaluationMetricCreate(BaseModel): + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = EvaluationStatus.PENDING - data: Optional[EvaluationQueueData] = None - - run_id: UUID + data: Optional[Data] = None + scenario_id: Optional[UUID] = None + run_id: Optional[UUID] = None -class EvaluationQueueCreate(Header, Metadata): - version: str = CURRENT_VERSION - flags: Optional[EvaluationQueueFlags] = None # type: ignore +class EvaluationMetricEdit(Identifier): + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = None - data: Optional[EvaluationQueueData] = None - - run_id: UUID - + data: Optional[Data] = None -class EvaluationQueueEdit(Identifier, Header, Metadata): - version: str = CURRENT_VERSION - flags: Optional[EvaluationQueueFlags] = None # type: ignore +class EvaluationMetricQuery(BaseModel): + # flags: Optional[Flags] = None + tags: Optional[Tags] = None + meta: Optional[Meta] = None status: Optional[EvaluationStatus] = None + statuses: Optional[List[EvaluationStatus]] = None - data: Optional[EvaluationQueueData] = None - - -class EvaluationQueueQuery(Header, Metadata): - flags: Optional[EvaluationQueueFlags] = None # type: ignore - - user_id: Optional[UUID] = None - user_ids: Optional[List[UUID]] = None - + scenario_id: Optional[UUID] = None + scenario_ids: Optional[List[UUID]] = None run_id: Optional[UUID] = None run_ids: Optional[List[UUID]] = None ids: Optional[List[UUID]] = None - - -# - SIMPLE EVALUATION ---------------------------------------------------------- - - -SimpleEvaluationFlags = EvaluationRunFlags - -SimpleEvaluationStatus = EvaluationStatus - - -class SimpleEvaluationData(BaseModel): - status: Optional[SimpleEvaluationStatus] = None - - query_steps: Optional[Target] = None - testset_steps: Optional[Target] = None - application_steps: Optional[Target] = None - evaluator_steps: Optional[Target] = None - - repeats: Optional[int] = None - - -class SimpleEvaluation(Version, Identifier, Lifecycle, Header, Metadata): - flags: Optional[SimpleEvaluationFlags] = None # type: ignore - - data: Optional[SimpleEvaluationData] = None - - -class SimpleEvaluationCreate(Header, Metadata): - version: str = CURRENT_VERSION - - flags: Optional[SimpleEvaluationFlags] = None # type: ignore - - data: Optional[SimpleEvaluationData] = None - - jit: Optional[Dict[str, bool]] = None - - -class SimpleEvaluationEdit(Identifier, Header, Metadata): - version: str = CURRENT_VERSION - - flags: Optional[SimpleEvaluationFlags] = None # type: ignore - - data: Optional[SimpleEvaluationData] = None - - -class SimpleEvaluationQuery(Header, Metadata): - flags: Optional[SimpleEvaluationFlags] = None # type: ignore - - ids: Optional[List[UUID]] = None diff --git a/api/oss/src/core/evaluations/utils.py b/api/oss/src/core/evaluations/utils.py deleted file mode 100644 index eb4f899ff7..0000000000 --- a/api/oss/src/core/evaluations/utils.py +++ /dev/null @@ -1,153 +0,0 @@ -from typing import List, Tuple, Dict, Optional -from uuid import UUID -from asyncio import sleep - -from oss.src.core.tracing.dtos import OTelSpansTree - -# Divides cleanly into 1, 2, 3, 4, 5, 6, 8, 10, ... -BLOCKS = 1 * 2 * 3 * 4 * 5 - - -def filter_scenario_ids( - user_id: UUID, - user_ids: List[List[UUID]], - scenario_ids: List[UUID], - is_sequential: bool, - offset: int = 0, -) -> List[List[UUID]]: - user_scenario_ids: List[List[UUID]] = [] - - MOD = min(len(scenario_ids), BLOCKS) - - for repeat_user_ids in user_ids: - if not repeat_user_ids: - user_scenario_ids.append([]) - - else: - repeat_user_bounds = _get_bounds( - repeat_user_ids, - user_id, - MOD, - ) - - if not repeat_user_bounds: - user_scenario_ids.append([]) - - else: - repeat_scenario_ids = [] - for scenario_idx, scenario_id in enumerate(scenario_ids): - mod = ( - (offset + scenario_idx) if is_sequential else int(scenario_id) - ) % MOD - - if any( - lower <= mod < upper for (lower, upper) in repeat_user_bounds - ): - repeat_scenario_ids.append(scenario_id) - - if not repeat_scenario_ids: - user_scenario_ids.append([]) - - else: - user_scenario_ids.append(repeat_scenario_ids) - - return user_scenario_ids - - -def _get_bounds( - assignments: List[UUID], - target: UUID, - blocks: int, -) -> List[Tuple[int, int]]: - bounds: List[Tuple[int, int]] = [] - - n = len(assignments) - - if n == 0 or blocks <= 0: - return bounds - - q, r = divmod(blocks, n) # base size and remainder - - block_sizes = [q + 1 if i < r else q for i in range(n)] - - start = 0 - - for i, size in enumerate(block_sizes): - end = start + size - 1 - - if str(assignments[i]) == str(target): - bounds.append((start, end + 1)) # half-open bounds [start, end) - - start = end + 1 # next block starts here - - return bounds - # -------------------------------------------------------------------------- - - -def get_metrics_keys_from_schema( - schema=None, - path=(), -) -> List[Dict[str, str]]: - metrics: List[Dict[str, str]] = list() - - if not isinstance(schema, dict) or "type" not in schema: - return metrics - - metric_type = None - - t = schema["type"] - - if t == "object": - if "properties" in schema: - for key, prop in schema["properties"].items(): - metrics.extend(get_metrics_keys_from_schema(prop, path + (key,))) - else: - metric_type = "json" - - elif t == "array" and "items" in schema: - if schema["items"].get("type") == "string" and "enum" in schema["items"]: - metric_type = "categorical/multiple" - - elif t == "boolean": - metric_type = "binary" - - elif t == "string": - metric_type = "categorical/single" if "enum" in schema else "string" - - elif t == "number": - metric_type = "numeric/continuous" - - elif t == "integer": - metric_type = "numeric/discrete" - - if metric_type: - metrics.append({"path": ".".join(path), "type": metric_type}) - - return metrics - - -async def fetch_trace( - tracing_router, - request, - # - trace_id: str, - max_retries: int = 15, - delay: float = 1.0, -) -> Optional[OTelSpansTree]: - for attempt in range(max_retries): - try: - response = await tracing_router.fetch_trace( - request=request, - trace_id=trace_id, - ) - - if response and response.traces: - return next(iter(response.traces.values()), None) - - except Exception: - pass - - if attempt < max_retries - 1: - await sleep(delay) - - return None diff --git a/api/oss/src/core/evaluators/dtos.py b/api/oss/src/core/evaluators/dtos.py deleted file mode 100644 index 169b5d298f..0000000000 --- a/api/oss/src/core/evaluators/dtos.py +++ /dev/null @@ -1,300 +0,0 @@ -from typing import Optional -from uuid import UUID - -from pydantic import Field - -from oss.src.core.shared.dtos import sync_alias, AliasConfig -from oss.src.core.shared.dtos import ( - Identifier, - Slug, - Lifecycle, - Header, - Metadata, -) -from oss.src.core.workflows.dtos import ( - ArtifactFork, - VariantFork, - RevisionFork, - # - WorkflowFlags, - WorkflowQueryFlags, - # - Workflow, - WorkflowCreate, - WorkflowEdit, - WorkflowQuery, - WorkflowFork, - # - WorkflowVariant, - WorkflowVariantCreate, - WorkflowVariantEdit, - WorkflowVariantQuery, - WorkflowVariantFork, - # - WorkflowRevisionData, - # - WorkflowRevision, - WorkflowRevisionCreate, - WorkflowRevisionEdit, - WorkflowRevisionQuery, - WorkflowRevisionFork, - WorkflowRevisionCommit, - WorkflowRevisionsLog, -) - - -# aliases ---------------------------------------------------------------------- - - -class EvaluatorIdAlias(AliasConfig): - evaluator_id: Optional[UUID] = None - workflow_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="evaluator_id", - ) - - -class EvaluatorVariantIdAlias(AliasConfig): - evaluator_variant_id: Optional[UUID] = None - workflow_variant_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="evaluator_variant_id", - ) - - -class EvaluatorRevisionIdAlias(AliasConfig): - evaluator_revision_id: Optional[UUID] = None - workflow_revision_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="evaluator_revision_id", - ) - - -# globals ---------------------------------------------------------------------- - - -class EvaluatorFlags(WorkflowFlags): - def __init__(self, **data): - data["is_evaluator"] = True - - super().__init__(**data) - - -class EvaluatorQueryFlags(WorkflowQueryFlags): - def __init__(self, **data): - data["is_evaluator"] = True - - super().__init__(**data) - - -# evaluators ------------------------------------------------------------------- - - -class Evaluator(Workflow): - flags: Optional[EvaluatorFlags] = None - - -class EvaluatorCreate(WorkflowCreate): - flags: Optional[EvaluatorFlags] = None - - -class EvaluatorEdit(WorkflowEdit): - flags: Optional[EvaluatorFlags] = None - - -class EvaluatorQuery(WorkflowQuery): - flags: Optional[EvaluatorQueryFlags] = None - - -# evaluator variants ----------------------------------------------------------- - - -class EvaluatorVariant( - WorkflowVariant, - EvaluatorIdAlias, -): - flags: Optional[EvaluatorFlags] = None - - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "workflow_id", self) - - -class EvaluatorVariantCreate( - WorkflowVariantCreate, - EvaluatorIdAlias, -): - flags: Optional[EvaluatorFlags] = None - - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "workflow_id", self) - - -class EvaluatorVariantEdit(WorkflowVariantEdit): - flags: Optional[EvaluatorFlags] = None - - -class EvaluatorVariantQuery(WorkflowVariantQuery): - flags: Optional[EvaluatorQueryFlags] = None - - -# evaluator revisions ---------------------------------------------------------- - - -class EvaluatorRevisionData(WorkflowRevisionData): - pass - - -class EvaluatorRevision( - WorkflowRevision, - EvaluatorIdAlias, - EvaluatorVariantIdAlias, -): - flags: Optional[EvaluatorFlags] = None - - data: Optional[EvaluatorRevisionData] = None - - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "workflow_id", self) - sync_alias("evaluator_variant_id", "workflow_variant_id", self) - - -class EvaluatorRevisionCreate( - WorkflowRevisionCreate, - EvaluatorIdAlias, - EvaluatorVariantIdAlias, -): - flags: Optional[EvaluatorFlags] = None - - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "workflow_id", self) - sync_alias("evaluator_variant_id", "workflow_variant_id", self) - - -class EvaluatorRevisionEdit(WorkflowRevisionEdit): - flags: Optional[EvaluatorFlags] = None - - -class EvaluatorRevisionQuery(WorkflowRevisionQuery): - flags: Optional[EvaluatorQueryFlags] = None - - -class EvaluatorRevisionCommit( - WorkflowRevisionCommit, - EvaluatorIdAlias, - EvaluatorVariantIdAlias, -): - flags: Optional[EvaluatorFlags] = None - - data: Optional[EvaluatorRevisionData] = None - - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "workflow_id", self) - sync_alias("evaluator_variant_id", "workflow_variant_id", self) - - -class EvaluatorRevisionsLog( - WorkflowRevisionsLog, - EvaluatorIdAlias, - EvaluatorVariantIdAlias, - EvaluatorRevisionIdAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "workflow_id", self) - sync_alias("evaluator_variant_id", "workflow_variant_id", self) - sync_alias("evaluator_revision_id", "workflow_revision_id", self) - - -# forks ------------------------------------------------------------------------ - - -class EvaluatorRevisionFork(WorkflowRevisionFork): - flags: Optional[EvaluatorFlags] = None - - data: Optional[EvaluatorRevisionData] = None - - -class EvaluatorVariantFork(WorkflowVariantFork): - flags: Optional[EvaluatorFlags] = None - - -class EvaluatorRevisionForkAlias(AliasConfig): - evaluator_revision: Optional[EvaluatorRevisionFork] = None - - revision: Optional[RevisionFork] = Field( - default=None, - exclude=True, - alias="evaluator_revision", - ) - - -class EvaluatorVariantForkAlias(AliasConfig): - evaluator_variant: Optional[EvaluatorVariantFork] = None - - variant: Optional[VariantFork] = Field( - default=None, - exclude=True, - alias="evaluator_variant", - ) - - -class EvaluatorFork( - WorkflowFork, - EvaluatorIdAlias, - EvaluatorVariantIdAlias, - EvaluatorVariantForkAlias, - EvaluatorRevisionIdAlias, - EvaluatorRevisionForkAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("evaluator_id", "artifact_id", self) - sync_alias("evaluator_variant_id", "variant_id", self) - sync_alias("evaluator_variant", "variant", self) - sync_alias("evaluator_revision_id", "revision_id", self) - sync_alias("evaluator_revision", "revision", self) - - -# evaluator services ----------------------------------------------------------- - -# TODO: Implement ? - -# simple evaluators ------------------------------------------------------------ - - -class SimpleEvaluatorFlags(EvaluatorFlags): - pass - - -class SimpleEvaluatorQueryFlags(EvaluatorQueryFlags): - pass - - -class SimpleEvaluatorData(EvaluatorRevisionData): - pass - - -class SimpleEvaluator(Identifier, Slug, Lifecycle, Header, Metadata): - flags: Optional[SimpleEvaluatorFlags] = None - - data: Optional[SimpleEvaluatorData] = None - - -class SimpleEvaluatorCreate(Slug, Header, Metadata): - flags: Optional[SimpleEvaluatorFlags] = None - - data: Optional[SimpleEvaluatorData] = None - - -class SimpleEvaluatorEdit(Identifier, Header, Metadata): - flags: Optional[SimpleEvaluatorFlags] = None - - data: Optional[SimpleEvaluatorData] = None - - -class SimpleEvaluatorQuery(Metadata): - flags: Optional[SimpleEvaluatorQueryFlags] = None - - -# ------------------------------------------------------------------------------ diff --git a/api/oss/src/core/evaluators/service.py b/api/oss/src/core/evaluators/service.py deleted file mode 100644 index 6e547addfe..0000000000 --- a/api/oss/src/core/evaluators/service.py +++ /dev/null @@ -1,1519 +0,0 @@ -from typing import Optional, List -from uuid import UUID, uuid4 -from json import loads - -from oss.src.utils.helpers import get_slug_from_name_and_id -from oss.src.services.db_manager import fetch_evaluator_config -from oss.src.core.workflows.dtos import ( - WorkflowFlags, - WorkflowQueryFlags, - # - WorkflowCreate, - WorkflowEdit, - WorkflowQuery, - WorkflowFork, - # - WorkflowVariantCreate, - WorkflowVariantEdit, - WorkflowVariantQuery, - # - WorkflowRevisionData, - # - WorkflowRevisionCreate, - WorkflowRevisionEdit, - WorkflowRevisionCommit, - WorkflowRevisionQuery, - WorkflowRevisionsLog, - # -) -from oss.src.core.shared.dtos import Windowing -from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.evaluators.dtos import ( - SimpleEvaluatorData, - SimpleEvaluator, - SimpleEvaluatorCreate, - SimpleEvaluatorEdit, - SimpleEvaluatorQuery, - SimpleEvaluatorFlags, - SimpleEvaluatorQueryFlags, - # - EvaluatorFlags, - EvaluatorQueryFlags, - # - Evaluator, - EvaluatorQuery, - EvaluatorRevisionsLog, - EvaluatorCreate, - EvaluatorEdit, - EvaluatorFork, - # - EvaluatorVariant, - EvaluatorVariantCreate, - EvaluatorVariantEdit, - EvaluatorVariantQuery, - # - EvaluatorRevision, - EvaluatorRevisionCreate, - EvaluatorRevisionData, - EvaluatorRevisionEdit, - EvaluatorRevisionCommit, - EvaluatorRevisionQuery, -) -from oss.src.core.shared.dtos import Reference -from oss.src.utils.logging import get_module_logger -from oss.src.models.db_models import EvaluatorConfigDB - - -log = get_module_logger(__name__) - - -class EvaluatorsService: - def __init__( - self, - workflows_service: WorkflowsService, - ): - self.workflows_service = workflows_service - - # evaluators --------------------------------------------------------------- - - async def create_evaluator( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_create: EvaluatorCreate, - # - evaluator_id: Optional[UUID] = None, - ) -> Optional[Evaluator]: - workflow_create = WorkflowCreate( - **evaluator_create.model_dump( - mode="json", - ), - ) - - workflow = await self.workflows_service.create_workflow( - project_id=project_id, - user_id=user_id, - # - workflow_create=workflow_create, - # - workflow_id=evaluator_id, - ) - - if not workflow: - return None - - evaluator = Evaluator( - **workflow.model_dump( - mode="json", - ) - ) - - return evaluator - - async def fetch_evaluator( - self, - *, - project_id: UUID, - # - evaluator_ref: Reference, - ) -> Optional[Evaluator]: - workflow = await self.workflows_service.fetch_workflow( - project_id=project_id, - # - workflow_ref=evaluator_ref, - ) - - if not workflow: - return None - - evaluator = Evaluator( - **workflow.model_dump( - mode="json", - ) - ) - - return evaluator - - async def edit_evaluator( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_edit: EvaluatorEdit, - ) -> Optional[Evaluator]: - workflow_edit = WorkflowEdit( - **evaluator_edit.model_dump( - mode="json", - ), - ) - - workflow = await self.workflows_service.edit_workflow( - project_id=project_id, - user_id=user_id, - # - workflow_edit=workflow_edit, - ) - - if not workflow: - return None - - evaluator = Evaluator( - **workflow.model_dump( - mode="json", - ) - ) - - return evaluator - - async def archive_evaluator( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_id: UUID, - ) -> Optional[Evaluator]: - workflow = await self.workflows_service.archive_workflow( - project_id=project_id, - user_id=user_id, - # - workflow_id=evaluator_id, - ) - - if not workflow: - return None - - evaluator = Evaluator( - **workflow.model_dump( - mode="json", - ) - ) - - return evaluator - - async def unarchive_evaluator( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_id: UUID, - ) -> Optional[Evaluator]: - workflow = await self.workflows_service.unarchive_workflow( - project_id=project_id, - user_id=user_id, - # - workflow_id=evaluator_id, - ) - - if not workflow: - return None - - evaluator = Evaluator( - **workflow.model_dump( - mode="json", - ) - ) - - return evaluator - - async def query_evaluators( - self, - *, - project_id: UUID, - # - evaluator_query: Optional[EvaluatorQuery] = None, - # - evaluator_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[Evaluator]: - workflow_query = ( - WorkflowQuery( - **evaluator_query.model_dump( - mode="json", - ), - ) - if evaluator_query - else WorkflowQuery() - ) - - workflows = await self.workflows_service.query_workflows( - project_id=project_id, - # - workflow_query=workflow_query, - # - workflow_refs=evaluator_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - evaluators = [ - Evaluator( - **workflow.model_dump( - mode="json", - ), - ) - for workflow in workflows - ] - - return evaluators - - # evaluator variants ------------------------------------------------------- - - async def create_evaluator_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_variant_create: EvaluatorVariantCreate, - ) -> Optional[EvaluatorVariant]: - workflow_variant_create = WorkflowVariantCreate( - **evaluator_variant_create.model_dump( - mode="json", - ), - ) - - workflow_variant = await self.workflows_service.create_workflow_variant( - project_id=project_id, - user_id=user_id, - # - workflow_variant_create=workflow_variant_create, - ) - - if not workflow_variant: - return None - - evaluator_variant = EvaluatorVariant( - **workflow_variant.model_dump( - mode="json", - ) - ) - - return evaluator_variant - - async def fetch_evaluator_variant( - self, - *, - project_id: UUID, - # - evaluator_ref: Optional[Reference] = None, - evaluator_variant_ref: Optional[Reference] = None, - ) -> Optional[EvaluatorVariant]: - workflow_variant = await self.workflows_service.fetch_workflow_variant( - project_id=project_id, - # - workflow_ref=evaluator_ref, - workflow_variant_ref=evaluator_variant_ref, - ) - - if not workflow_variant: - return None - - evaluator_variant = EvaluatorVariant( - **workflow_variant.model_dump( - mode="json", - ) - ) - - return evaluator_variant - - async def edit_evaluator_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_variant_edit: EvaluatorVariantEdit, - ) -> Optional[EvaluatorVariant]: - workflow_variant_edit = WorkflowVariantEdit( - **evaluator_variant_edit.model_dump( - mode="json", - ) - ) - - evaluator_variant = await self.workflows_service.edit_workflow_variant( - project_id=project_id, - user_id=user_id, - # - workflow_variant_edit=workflow_variant_edit, - ) - - if not evaluator_variant: - return None - - evaluator_variant = EvaluatorVariant( - **evaluator_variant.model_dump( - mode="json", - ) - ) - - return evaluator_variant - - async def archive_evaluator_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_variant_id: UUID, - ) -> Optional[EvaluatorVariant]: - workflow_variant = await self.workflows_service.archive_workflow_variant( - project_id=project_id, - user_id=user_id, - # - workflow_variant_id=evaluator_variant_id, - ) - - if not workflow_variant: - return None - - evaluator_variant = EvaluatorVariant( - **workflow_variant.model_dump( - mode="json", - ) - ) - - return evaluator_variant - - async def unarchive_evaluator_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_variant_id: UUID, - ) -> Optional[EvaluatorVariant]: - workflow_variant = await self.workflows_service.unarchive_workflow_variant( - project_id=project_id, - user_id=user_id, - # - workflow_variant_id=evaluator_variant_id, - ) - - if not workflow_variant: - return None - - evaluator_variant = EvaluatorVariant( - **workflow_variant.model_dump( - mode="json", - ) - ) - - return evaluator_variant - - async def query_evaluator_variants( - self, - *, - project_id: UUID, - # - evaluator_variant_query: Optional[EvaluatorVariantQuery] = None, - # - evaluator_refs: Optional[List[Reference]] = None, - evaluator_variant_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[EvaluatorVariant]: - workflow_variant_query = ( - WorkflowVariantQuery( - **evaluator_variant_query.model_dump( - mode="json", - ) - ) - if evaluator_variant_query - else WorkflowVariantQuery() - ) - - workflow_variants = await self.workflows_service.query_workflow_variants( - project_id=project_id, - # - workflow_variant_query=workflow_variant_query, - # - workflow_refs=evaluator_refs, - workflow_variant_refs=evaluator_variant_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - if not workflow_variants: - return [] - - evaluator_variants = [ - EvaluatorVariant( - **workflow_variant.model_dump( - mode="json", - ) - ) - for workflow_variant in workflow_variants - ] - - return evaluator_variants - - async def fork_evaluator_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_fork: EvaluatorFork, - ) -> Optional[EvaluatorVariant]: - workflow_fork = WorkflowFork( - **evaluator_fork.model_dump( - mode="json", - ) - ) - - workflow_variant = await self.workflows_service.fork_workflow_variant( - project_id=project_id, - user_id=user_id, - # - workflow_fork=workflow_fork, - ) - - if not workflow_variant: - return None - - evaluator_variant = EvaluatorVariant( - **workflow_variant.model_dump( - mode="json", - ) - ) - - return evaluator_variant - - # evaluator revisions ------------------------------------------------------ - - async def create_evaluator_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_revision_create: EvaluatorRevisionCreate, - ) -> Optional[EvaluatorRevision]: - workflow_revision_create = WorkflowRevisionCreate( - **evaluator_revision_create.model_dump( - mode="json", - ) - ) - - workflow_revision = await self.workflows_service.create_workflow_revision( - project_id=project_id, - user_id=user_id, - # - workflow_revision_create=workflow_revision_create, - ) - - if not workflow_revision: - return None - - evaluator_revision = EvaluatorRevision( - **workflow_revision.model_dump( - mode="json", - ) - ) - - return evaluator_revision - - async def fetch_evaluator_revision( - self, - *, - project_id: UUID, - # - evaluator_ref: Optional[Reference] = None, - evaluator_variant_ref: Optional[Reference] = None, - evaluator_revision_ref: Optional[Reference] = None, - ) -> Optional[EvaluatorRevision]: - workflow_revision = await self.workflows_service.fetch_workflow_revision( - project_id=project_id, - # - workflow_ref=evaluator_ref, - workflow_variant_ref=evaluator_variant_ref, - workflow_revision_ref=evaluator_revision_ref, - ) - - if not workflow_revision: - return None - - evaluator_revision = EvaluatorRevision( - **workflow_revision.model_dump( - mode="json", - ) - ) - - return evaluator_revision - - async def edit_evaluator_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_revision_edit: EvaluatorRevisionEdit, - ) -> Optional[EvaluatorRevision]: - workflow_revision_edit = WorkflowRevisionEdit( - **evaluator_revision_edit.model_dump( - mode="json", - ) - ) - - workflow_revision = await self.workflows_service.edit_workflow_revision( - project_id=project_id, - user_id=user_id, - # - workflow_revision_edit=workflow_revision_edit, - ) - - if not workflow_revision: - return None - - evaluator_revision = EvaluatorRevision( - **workflow_revision.model_dump( - mode="json", - ) - ) - - return evaluator_revision - - async def archive_evaluator_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_revision_id: UUID, - ) -> Optional[EvaluatorRevision]: - workflow_revision = await self.workflows_service.archive_workflow_revision( - project_id=project_id, - user_id=user_id, - # - workflow_revision_id=evaluator_revision_id, - ) - - if not workflow_revision: - return None - - evaluator_revision = EvaluatorRevision( - **workflow_revision.model_dump( - mode="json", - ) - ) - - return evaluator_revision - - async def unarchive_evaluator_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_revision_id: UUID, - ) -> Optional[EvaluatorRevision]: - workflow_revision = await self.workflows_service.unarchive_workflow_revision( - project_id=project_id, - user_id=user_id, - # - workflow_revision_id=evaluator_revision_id, - ) - - if not workflow_revision: - return None - - evaluator_revision = EvaluatorRevision( - **workflow_revision.model_dump( - mode="json", - ) - ) - - return evaluator_revision - - async def query_evaluator_revisions( - self, - *, - project_id: UUID, - # - evaluator_revision_query: Optional[EvaluatorRevisionQuery] = None, - # - evaluator_refs: Optional[List[Reference]] = None, - evaluator_variant_refs: Optional[List[Reference]] = None, - evaluator_revision_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[EvaluatorRevision]: - workflow_revision_query = ( - WorkflowRevisionQuery( - **evaluator_revision_query.model_dump( - mode="json", - ) - ) - if evaluator_revision_query - else WorkflowRevisionQuery() - ) - - workflow_revisions = await self.workflows_service.query_workflow_revisions( - project_id=project_id, - # - workflow_revision_query=workflow_revision_query, - # - workflow_refs=evaluator_refs, - workflow_variant_refs=evaluator_variant_refs, - workflow_revision_refs=evaluator_revision_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - if not workflow_revisions: - return [] - - evaluator_revisions = [ - EvaluatorRevision( - **revision.model_dump( - mode="json", - ) - ) - for revision in workflow_revisions - ] - - return evaluator_revisions - - async def commit_evaluator_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_revision_commit: EvaluatorRevisionCommit, - ) -> Optional[EvaluatorRevision]: - workflow_revision_commit = WorkflowRevisionCommit( - **evaluator_revision_commit.model_dump( - mode="json", - ) - ) - - workflow_revision = await self.workflows_service.commit_workflow_revision( - project_id=project_id, - user_id=user_id, - # - workflow_revision_commit=workflow_revision_commit, - ) - - if not workflow_revision: - return None - - evaluator_revision = EvaluatorRevision( - **workflow_revision.model_dump( - mode="json", - ) - ) - - return evaluator_revision - - async def log_evaluator_revisions( - self, - *, - project_id: UUID, - # - evaluator_revisions_log: EvaluatorRevisionsLog, - ) -> List[EvaluatorRevision]: - workflow_revisions_log = WorkflowRevisionsLog( - **evaluator_revisions_log.model_dump( - mode="json", - ) - ) - - workflow_revisions = await self.workflows_service.log_workflow_revisions( - project_id=project_id, - # - workflow_revisions_log=workflow_revisions_log, - ) - - if not workflow_revisions: - return [] - - evaluator_revisions = [ - EvaluatorRevision( - **revision.model_dump( - mode="json", - ) - ) - for revision in workflow_revisions - ] - - return evaluator_revisions - - # evaluator services ------------------------------------------------------- - - # TODO: Implement ? - - # -------------------------------------------------------------------------- - - -class SimpleEvaluatorsService: - def __init__( - self, - *, - evaluators_service: EvaluatorsService, - ): - self.evaluators_service = evaluators_service - - # public ------------------------------------------------------------------- - - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - simple_evaluator_create: SimpleEvaluatorCreate, - # - evaluator_id: Optional[UUID] = None, - ) -> Optional[SimpleEvaluator]: - simple_evaluator_flags = ( - SimpleEvaluatorFlags( - **( - simple_evaluator_create.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - exclude={"is_evaluator"}, - ) - ), - is_evaluator=True, - ) - if simple_evaluator_create.flags - else SimpleEvaluatorFlags( - is_evaluator=True, - ) - ) - - evaluator_flags = EvaluatorFlags( - **simple_evaluator_flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ), - ) - - evaluator_create = EvaluatorCreate( - slug=simple_evaluator_create.slug, - # - name=simple_evaluator_create.name, - description=simple_evaluator_create.description, - # - flags=evaluator_flags, - meta=simple_evaluator_create.meta, - tags=simple_evaluator_create.tags, - ) - - evaluator: Optional[Evaluator] = await self.evaluators_service.create_evaluator( - project_id=project_id, - user_id=user_id, - # - evaluator_create=evaluator_create, - # - evaluator_id=evaluator_id, - ) - - if evaluator is None: - return None - - evaluator_variant_slug = uuid4().hex[-12:] - - evaluator_variant_create = EvaluatorVariantCreate( - slug=evaluator_variant_slug, - # - name=evaluator_create.name, - description=evaluator_create.description, - # - flags=evaluator_flags, - tags=evaluator_create.tags, - meta=evaluator_create.meta, - # - evaluator_id=evaluator.id, - ) - - evaluator_variant: Optional[ - EvaluatorVariant - ] = await self.evaluators_service.create_evaluator_variant( - project_id=project_id, - user_id=user_id, - # - evaluator_variant_create=evaluator_variant_create, - ) - - if evaluator_variant is None: - return None - - evaluator_revision_slug = uuid4().hex[-12:] - - evaluator_revision_commit = EvaluatorRevisionCommit( - slug=evaluator_revision_slug, - # - name=evaluator_create.name, - description=evaluator_create.description, - # - flags=evaluator_flags, - tags=evaluator_create.tags, - meta=evaluator_create.meta, - # - data=None, - # - message="Initial commit", - # - evaluator_id=evaluator.id, - evaluator_variant_id=evaluator_variant.id, - ) - - evaluator_revision: Optional[ - EvaluatorRevision - ] = await self.evaluators_service.commit_evaluator_revision( - project_id=project_id, - user_id=user_id, - evaluator_revision_commit=evaluator_revision_commit, - ) - - if evaluator_revision is None: - return None - - evaluator_revision_slug = uuid4().hex[-12:] - - evaluator_revision_commit = EvaluatorRevisionCommit( - slug=evaluator_revision_slug, - # - name=evaluator_create.name, - description=evaluator_create.description, - # - flags=evaluator_flags, - tags=evaluator_create.tags, - meta=evaluator_create.meta, - # - data=simple_evaluator_create.data, - # - evaluator_id=evaluator.id, - evaluator_variant_id=evaluator_variant.id, - ) - - evaluator_revision: Optional[ - EvaluatorRevision - ] = await self.evaluators_service.commit_evaluator_revision( - project_id=project_id, - user_id=user_id, - evaluator_revision_commit=evaluator_revision_commit, - ) - - if evaluator_revision is None: - return None - - simple_evaluator_data = SimpleEvaluatorData( - **( - evaluator_revision.data.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - if evaluator_revision.data - else {} - ), - ) - - simple_evaluator = SimpleEvaluator( - id=evaluator.id, - slug=evaluator.slug, - # - created_at=evaluator.created_at, - updated_at=evaluator.updated_at, - deleted_at=evaluator.deleted_at, - created_by_id=evaluator.created_by_id, - updated_by_id=evaluator.updated_by_id, - deleted_by_id=evaluator.deleted_by_id, - # - name=evaluator.name, - description=evaluator.description, - # - flags=simple_evaluator_flags, - tags=evaluator.tags, - meta=evaluator.meta, - # - data=simple_evaluator_data, - ) - - return simple_evaluator - - async def fetch( - self, - *, - project_id: UUID, - # - evaluator_id: UUID, - ) -> Optional[SimpleEvaluator]: - evaluator_ref = Reference( - id=evaluator_id, - ) - - evaluator: Optional[Evaluator] = await self.evaluators_service.fetch_evaluator( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if evaluator is None: - return None - - evaluator_variant: Optional[ - EvaluatorVariant - ] = await self.evaluators_service.fetch_evaluator_variant( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if evaluator_variant is None: - return None - - evaluator_variant_ref = Reference( - id=evaluator_variant.id, - ) - - evaluator_revision: Optional[ - EvaluatorRevision - ] = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_variant_ref=evaluator_variant_ref, - ) - - if evaluator_revision is None: - return None - - simple_evaluator_flags = SimpleEvaluatorFlags( - **( - evaluator.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - if evaluator.flags - else {} - ) - ) - - simple_evaluator_data = SimpleEvaluatorData( - **( - evaluator_revision.data.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - if evaluator_revision.data - else {} - ), - ) - - simple_evaluator = SimpleEvaluator( - id=evaluator.id, - slug=evaluator.slug, - # - created_at=evaluator.created_at, - updated_at=evaluator.updated_at, - deleted_at=evaluator.deleted_at, - created_by_id=evaluator.created_by_id, - updated_by_id=evaluator.updated_by_id, - deleted_by_id=evaluator.deleted_by_id, - # - name=evaluator.name, - description=evaluator.description, - # - flags=simple_evaluator_flags, - tags=evaluator.tags, - meta=evaluator.meta, - # - data=simple_evaluator_data, - ) - return simple_evaluator - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - simple_evaluator_edit: SimpleEvaluatorEdit, - ) -> Optional[SimpleEvaluator]: - simple_evaluator_flags = ( - SimpleEvaluatorFlags( - **( - simple_evaluator_edit.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - exclude={"is_evaluator"}, - ) - ), - is_evaluator=True, - ) - if simple_evaluator_edit.flags - else SimpleEvaluatorFlags() - ) - - evaluator_flags = EvaluatorFlags( - **simple_evaluator_flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - ) - - evaluator_ref = Reference( - id=simple_evaluator_edit.id, - ) - - evaluator: Optional[Evaluator] = await self.evaluators_service.fetch_evaluator( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if evaluator is None: - return None - - evaluator_edit = EvaluatorEdit( - id=evaluator.id, - # - name=simple_evaluator_edit.name, - description=simple_evaluator_edit.description, - # - flags=evaluator_flags, - tags=simple_evaluator_edit.tags, - meta=simple_evaluator_edit.meta, - ) - - evaluator = await self.evaluators_service.edit_evaluator( - project_id=project_id, - user_id=user_id, - # - evaluator_edit=evaluator_edit, - ) - - if evaluator is None: - return None - - evaluator_variant: Optional[ - EvaluatorVariant - ] = await self.evaluators_service.fetch_evaluator_variant( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if evaluator_variant is None: - return None - - evaluator_variant_edit = EvaluatorVariantEdit( - id=evaluator_variant.id, - # - name=evaluator_edit.name, - description=evaluator_edit.description, - # - flags=evaluator_flags, - tags=evaluator_edit.tags, - meta=evaluator_edit.meta, - # - ) - - evaluator_variant = await self.evaluators_service.edit_evaluator_variant( - project_id=project_id, - user_id=user_id, - # - evaluator_variant_edit=evaluator_variant_edit, - ) - - if evaluator_variant is None: - return None - - evaluator_revision_slug = uuid4().hex[-12:] - - evaluator_revision_commit = EvaluatorRevisionCommit( - slug=evaluator_revision_slug, - # - name=evaluator_edit.name, - description=evaluator_edit.description, - # - flags=evaluator_flags, - tags=evaluator_edit.tags, - meta=evaluator_edit.meta, - # - data=simple_evaluator_edit.data, - # - evaluator_id=evaluator.id, - evaluator_variant_id=evaluator_variant.id, - ) - - evaluator_revision: Optional[ - EvaluatorRevision - ] = await self.evaluators_service.commit_evaluator_revision( - project_id=project_id, - user_id=user_id, - # - evaluator_revision_commit=evaluator_revision_commit, - ) - - if evaluator_revision is None: - return None - - simple_evaluator_data = SimpleEvaluatorData( - **( - evaluator_revision.data.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - if evaluator_revision.data - else {} - ), - ) - - simple_evaluator = SimpleEvaluator( - id=evaluator.id, - slug=evaluator.slug, - # - created_at=evaluator.created_at, - updated_at=evaluator.updated_at, - deleted_at=evaluator.deleted_at, - created_by_id=evaluator.created_by_id, - updated_by_id=evaluator.updated_by_id, - deleted_by_id=evaluator.deleted_by_id, - # - name=evaluator.name, - description=evaluator.description, - # - flags=simple_evaluator_flags, - tags=evaluator.tags, - meta=evaluator.meta, - # - data=simple_evaluator_data, - ) - - return simple_evaluator - - async def transfer( - self, - *, - project_id: UUID, - user_id: UUID, - # - evaluator_id: UUID, - ) -> Optional[SimpleEvaluator]: - old_evaluator = await fetch_evaluator_config( - evaluator_config_id=str(evaluator_id), - ) - - if old_evaluator is None: - return None - - evaluator_revision_data = self._transfer_evaluator_revision_data( - old_evaluator=old_evaluator, - ) - - evaluator_ref = Reference(id=evaluator_id) - - new_evaluator = await self.evaluators_service.fetch_evaluator( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if new_evaluator is None: - name = str(old_evaluator.name) - slug = get_slug_from_name_and_id( - name=name, - id=evaluator_id, - ) - - evaluator_create = SimpleEvaluatorCreate( - slug=slug, - name=name, - description=None, - flags=SimpleEvaluatorFlags( - is_evaluator=True, - ), - tags=None, - meta=None, - data=SimpleEvaluatorData( - **evaluator_revision_data.model_dump( - mode="json", - ) - ), - ) - simple_evaluator = await self.create( - project_id=project_id, - user_id=user_id, - simple_evaluator_create=evaluator_create, - evaluator_id=evaluator_id, - ) - - return simple_evaluator - - evaluator_edit = SimpleEvaluatorEdit( - id=evaluator_id, - name=new_evaluator.name, - description=new_evaluator.description, - flags=( - SimpleEvaluatorFlags( - **new_evaluator.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - ) - if new_evaluator.flags - else None - ), - tags=new_evaluator.tags, - meta=new_evaluator.meta, - data=SimpleEvaluatorData( - **evaluator_revision_data.model_dump( - mode="json", - ) - ), - ) - - simple_evaluator = await self.edit( - project_id=project_id, - user_id=user_id, - simple_evaluator_edit=evaluator_edit, - ) - - return simple_evaluator - - async def query( - self, - *, - project_id: UUID, - # - simple_evaluator_query: Optional[SimpleEvaluatorQuery] = None, - # - simple_evaluator_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[SimpleEvaluator]: - evaluator_query = EvaluatorQuery( - **( - simple_evaluator_query.model_dump( - mode="json", - ) - if simple_evaluator_query - else {} - ), - ) - - evaluator_queries = await self.evaluators_service.query_evaluators( - project_id=project_id, - # - evaluator_query=evaluator_query, - # - evaluator_refs=simple_evaluator_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - if not evaluator_queries: - return [] - - simple_evaluators: List[SimpleEvaluator] = [] - - for evaluator_query in evaluator_queries: - evaluator_ref = Reference( - id=evaluator_query.id, - ) - - evaluator_variant: Optional[ - EvaluatorVariant - ] = await self.evaluators_service.fetch_evaluator_variant( - project_id=project_id, - # - evaluator_ref=evaluator_ref, - ) - - if not evaluator_variant: - continue - - evaluator_variant_ref = Reference( - id=evaluator_variant.id, - ) - - evaluator_revision: Optional[ - EvaluatorRevision - ] = await self.evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_variant_ref=evaluator_variant_ref, - ) - - if not evaluator_revision: - continue - - simple_evaluator_flags = SimpleEvaluatorFlags( - **( - evaluator_query.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - exclude={"is_evaluator"}, - ) - if evaluator_query.flags - else {} - ), - is_evaluator=True, - ) - - simple_evaluator_data = SimpleEvaluatorData( - **( - evaluator_revision.data.model_dump( - mode="json", - ) - if evaluator_revision.data - else {} - ), - ) - - evaluator_query = SimpleEvaluator( - id=evaluator_query.id, - slug=evaluator_query.slug, - # - created_at=evaluator_query.created_at, - updated_at=evaluator_query.updated_at, - deleted_at=evaluator_query.deleted_at, - created_by_id=evaluator_query.created_by_id, - updated_by_id=evaluator_query.updated_by_id, - deleted_by_id=evaluator_query.deleted_by_id, - # - name=evaluator_query.name, - description=evaluator_query.description, - # - flags=simple_evaluator_flags, - tags=evaluator_query.tags, - meta=evaluator_query.meta, - # - data=simple_evaluator_data, - ) - - simple_evaluators.append(evaluator_query) - - return simple_evaluators - - # internals ---------------------------------------------------------------- - - def _transfer_evaluator_revision_data( - self, - old_evaluator: EvaluatorConfigDB, - ) -> EvaluatorRevisionData: - version = "2025.07.14" - uri = f"agenta:built-in:{old_evaluator.evaluator_key}:v0" - url = ( - old_evaluator.settings_values.get("webhook_url", None) - if old_evaluator.evaluator_key == "auto_webhook_test" # type: ignore - else None - ) - headers = None - outputs_schema = None - if str(old_evaluator.evaluator_key) == "auto_ai_critique": - json_schema = old_evaluator.settings_values.get("json_schema", None) - if json_schema and isinstance(json_schema, dict): - outputs_schema = json_schema.get("schema", None) - if not outputs_schema: - properties = ( - {"score": {"type": "number"}, "success": {"type": "boolean"}} - if old_evaluator.evaluator_key - in ( - "auto_levenshtein_distance", - "auto_semantic_similarity", - "auto_similarity_match", - "auto_json_diff", - "auto_webhook_test", - "auto_custom_code_run", - "auto_ai_critique", - "rag_faithfulness", - "rag_context_relevancy", - ) - else {"success": {"type": "boolean"}} - ) - required = ( - list(properties.keys()) - if old_evaluator.evaluator_key - not in ( - "auto_levenshtein_distance", - "auto_semantic_similarity", - "auto_similarity_match", - "auto_json_diff", - "auto_webhook_test", - "auto_custom_code_run", - "auto_ai_critique", - "rag_faithfulness", - "rag_context_relevancy", - ) - else [] - ) - outputs_schema = { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "type": "object", - "properties": properties, - "required": required, - "additionalProperties": False, - } - schemas = {"outputs": outputs_schema} - script = ( - { - "content": old_evaluator.settings_values.get("code", None), - "runtime": "python", - } - if old_evaluator.evaluator_key == "auto_custom_code_run" # type: ignore - else None - ) - parameters = old_evaluator.settings_values - service = { - "agenta": "0.1.0", - "format": { - "type": "object", - "$schema": "http://json-schema.org/schema#", - "required": ["outputs"], - "properties": { - "outputs": schemas["outputs"], - }, - }, - } - configuration = parameters - - return EvaluatorRevisionData( - version=version, - uri=uri, - url=url, - headers=headers, - schemas=schemas, - script=script, - parameters=parameters, # type: ignore - # LEGACY - service=service, - configuration=configuration, # type: ignore - ) - - # -------------------------------------------------------------------------- diff --git a/api/oss/src/core/git/dtos.py b/api/oss/src/core/git/dtos.py index ff49f5ba89..125fc1e823 100644 --- a/api/oss/src/core/git/dtos.py +++ b/api/oss/src/core/git/dtos.py @@ -12,11 +12,22 @@ Header, Metadata, Data, - Commit, + Reference, ) -# artifacts -------------------------------------------------------------------- +class Commit(BaseModel): + author: Optional[UUID] = None + date: Optional[datetime] = None + message: Optional[str] = None + + +class CommitCreate(BaseModel): + message: Optional[str] = None + + +class CommitFetch(BaseModel): + authors: Optional[List[UUID]] = None class Artifact(Identifier, Slug, Lifecycle, Header, Metadata): @@ -31,13 +42,10 @@ class ArtifactEdit(Identifier, Header, Metadata): pass -class ArtifactQuery(Header, Metadata): +class ArtifactQuery(Metadata): pass -# variants --------------------------------------------------------------------- - - class Variant(Identifier, Slug, Lifecycle, Header, Metadata): artifact_id: Optional[UUID] = None @@ -50,13 +58,10 @@ class VariantEdit(Identifier, Header, Metadata): pass -class VariantQuery(Header, Metadata): +class VariantQuery(Metadata): pass -# revisions -------------------------------------------------------------------- - - class Revision(Identifier, Slug, Version, Lifecycle, Header, Metadata, Commit): data: Optional[Data] = None @@ -73,49 +78,32 @@ class RevisionEdit(Identifier, Header, Metadata): pass -class RevisionQuery(Header, Metadata): - author: Optional[UUID] = None - authors: Optional[List[UUID]] = None - - date: Optional[datetime] = None - dates: Optional[List[datetime]] = None - - message: Optional[str] = None +class RevisionQuery(Metadata, CommitFetch): + pass -class RevisionCommit(Slug, Header, Metadata): +class RevisionCommit(Slug, Header, Metadata, CommitCreate): data: Optional[Data] = None - message: Optional[str] = None - - artifact_id: Optional[UUID] = None - variant_id: Optional[UUID] = None - - -class RevisionsLog(BaseModel): artifact_id: Optional[UUID] = None variant_id: Optional[UUID] = None - revision_id: Optional[UUID] = None - - depth: Optional[int] = None - - -# forks ------------------------------------------------------------------------ -class RevisionFork(Slug, Header, Metadata): +class RevisionFork(Slug, Header, Metadata, CommitCreate): data: Optional[Data] = None - message: Optional[str] = None - class VariantFork(Slug, Header, Metadata): pass -class ArtifactFork(RevisionsLog): - variant: Optional[VariantFork] = None - revision: Optional[RevisionFork] = None +class ArtifactLog(BaseModel): + variant_id: Optional[UUID] = None + revision_id: Optional[UUID] = None + + depth: Optional[int] = None -# ------------------------------------------------------------------------------ +class ArtifactFork(ArtifactLog): + variant: Optional[VariantFork] = None + revision: Optional[RevisionFork] = None diff --git a/api/oss/src/core/git/interfaces.py b/api/oss/src/core/git/interfaces.py index e2bb39957d..cf7a088cff 100644 --- a/api/oss/src/core/git/interfaces.py +++ b/api/oss/src/core/git/interfaces.py @@ -9,7 +9,7 @@ ArtifactCreate, ArtifactEdit, ArtifactQuery, - RevisionsLog, + ArtifactLog, ArtifactFork, Variant, VariantCreate, @@ -297,7 +297,7 @@ async def log_revisions( *, project_id: UUID, # - revisions_log: RevisionsLog, + artifact_log: ArtifactLog, ) -> List[Revision]: raise NotImplementedError diff --git a/api/oss/src/core/invocations/__init__.py b/api/oss/src/core/invocations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/core/invocations/service.py b/api/oss/src/core/invocations/service.py deleted file mode 100644 index c6b73ed18d..0000000000 --- a/api/oss/src/core/invocations/service.py +++ /dev/null @@ -1,1059 +0,0 @@ -from typing import Optional, List, Union -from uuid import UUID, uuid4 - -from fastapi import Request - -from oss.src.utils.logging import get_module_logger - -from oss.src.core.applications.service import LegacyApplicationsService - -from oss.src.core.shared.dtos import ( - Tags, - Meta, - Data, - Reference, - Link, - Windowing, -) -from oss.src.core.tracing.dtos import ( - Focus, - Format, - TracingQuery, - Formatting, - Condition, - Filtering, - OTelReference, - OTelLink, - LogicalOperator, - ComparisonOperator, - ListOperator, - TraceType, - SpanType, -) -from oss.src.core.applications.dtos import ( - LegacyApplicationFlags, - LegacyApplicationData, -) - - -from oss.src.core.tracing.utils import ( - parse_into_attributes, - parse_from_attributes, -) -from oss.src.core.invocations.types import ( - InvocationOrigin, - InvocationKind, - InvocationChannel, - InvocationReferences, - InvocationLinks, - InvocationFlags, - # - Invocation, - InvocationCreate, - InvocationEdit, - InvocationQuery, -) - -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.apis.fastapi.tracing.models import ( - OTelFlatSpan, - OTelTracingRequest, - OTelTracingResponse, -) -from oss.src.apis.fastapi.applications.models import LegacyApplicationCreate - - -log = get_module_logger(__name__) - - -class InvocationsService: - def __init__( - self, - *, - legacy_applications_service: LegacyApplicationsService, - tracing_router: TracingRouter, - ): - self.legacy_applications_service = legacy_applications_service - self.tracing_router = tracing_router - - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - invocation_create: InvocationCreate, - ) -> Optional[Invocation]: - legacy_application_slug = ( - invocation_create.references.application.slug - if invocation_create.references.application - else None - ) or uuid4().hex[-12:] - - legacy_application_flags = LegacyApplicationFlags() - - application_revision = await self.legacy_applications_service.retrieve( - project_id=project_id, - # - application_ref=invocation_create.references.application, - application_variant_ref=invocation_create.references.application_variant, - application_revision_ref=invocation_create.references.application_revision, - ) - - if not application_revision: - legacy_application_create = LegacyApplicationCreate( - slug=legacy_application_slug, - # - name=legacy_application_slug, - # - flags=legacy_application_flags, - ) - - legacy_application = await self.legacy_applications_service.create( - project_id=project_id, - user_id=user_id, - # - legacy_application_create=legacy_application_create, - ) - - if legacy_application: - application_revision = await self.legacy_applications_service.retrieve( - project_id=project_id, - # - application_ref=Reference(id=legacy_application.id), - ) - - if not application_revision or not application_revision.data: - return None - - if application_revision: - invocation_create.references.application = Reference( - id=application_revision.application_id, - slug=( - invocation_create.references.application.slug - if invocation_create.references.application - else None - ), - ) - - invocation_create.references.application_variant = Reference( - id=application_revision.application_variant_id, - slug=( - invocation_create.references.application_variant.slug - if invocation_create.references.application_variant - else None - ), - ) - - invocation_create.references.application_revision = Reference( - id=application_revision.id, - slug=application_revision.slug, - version=application_revision.version, - ) - - invocation_flags = InvocationFlags( - is_sdk=invocation_create.channel == InvocationChannel.SDK, - is_web=invocation_create.channel == InvocationChannel.WEB, - is_evaluation=invocation_create.kind == InvocationKind.EVAL, - ) - - invocation_references = InvocationReferences( - **invocation_create.references.model_dump(), - ) - - invocation_link = await self._create_invocation( - project_id=project_id, - user_id=user_id, - # - name=legacy_application.name, - # - flags=invocation_flags, - tags=invocation_create.tags, - meta=invocation_create.meta, - # - data=invocation_create.data, - # - references=invocation_references, - links=invocation_create.links, - ) - - if invocation_link is None: - return None - - invocation = await self._fetch_invocation( - project_id=project_id, - # - invocation_link=invocation_link, - ) - - return invocation - - async def fetch( - self, - *, - project_id: UUID, - # - trace_id: str, - span_id: Optional[str] = None, - ): - invocation_link = Link( - trace_id=trace_id, - span_id=span_id, - ) - - invocation: Optional[Invocation] = await self._fetch_invocation( - project_id=project_id, - # - invocation_link=invocation_link, - ) - return invocation - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - trace_id: str, - span_id: Optional[str] = None, - # - invocation_edit: InvocationEdit, - ): - invocation_link = Link( - trace_id=trace_id, - span_id=span_id, - ) - - invocation: Optional[Invocation] = await self._fetch_invocation( - project_id=project_id, - # - invocation_link=invocation_link, - ) - - if invocation is None: - return None - - legacy_application_slug = ( - invocation.references.application.slug - if invocation.references.application - else None - ) or uuid4().hex - - legacy_application_flags = LegacyApplicationFlags() - - application_revision = await self.legacy_applications_service.retrieve( - project_id=project_id, - # - application_ref=invocation.references.application, - application_variant_ref=invocation.references.application_variant, - application_revision_ref=invocation.references.application_revision, - ) - - if not application_revision: - legacy_application_create = LegacyApplicationCreate( - slug=legacy_application_slug, - # - name=legacy_application_slug, - # - flags=legacy_application_flags, - ) - - legacy_application = await self.legacy_applications_service.create( - project_id=project_id, - user_id=user_id, - # - legacy_application_create=legacy_application_create, - ) - - if legacy_application: - application_revision = await self.legacy_applications_service.retrieve( - project_id=project_id, - # - application_ref=Reference(id=legacy_application.id), - ) - - if not application_revision or not application_revision.data: - return None - - if application_revision: - invocation.references.application = Reference( - id=application_revision.application_id, - slug=( - invocation.references.application.slug - if invocation.references.application - else None - ), - ) - - invocation.references.application_variant = Reference( - id=application_revision.application_variant_id, - slug=( - invocation.references.application_variant.slug - if invocation.references.application_variant - else None - ), - ) - - invocation.references.application_revision = Reference( - id=application_revision.id, - slug=application_revision.slug, - version=application_revision.version, - ) - - invocation_flags = InvocationFlags( - is_sdk=invocation.channel == InvocationChannel.SDK, - is_web=invocation.channel == InvocationChannel.WEB, - is_evaluation=invocation.kind == InvocationKind.EVAL, - ) - - invocation_references = InvocationReferences( - **invocation.references.model_dump(), - ) - - invocation_link = await self._edit_invocation( - project_id=project_id, - user_id=user_id, - # - invocation=invocation, - # - flags=invocation_flags, - tags=invocation_edit.tags, - meta=invocation_edit.meta, - # - data=invocation_edit.data, - # - references=invocation_references, - links=invocation.links, - ) - - if invocation_link is None: - return None - - invocation = await self._fetch_invocation( - project_id=project_id, - # - invocation_link=invocation_link, - ) - - return invocation - - async def delete( - self, - *, - project_id: UUID, - user_id: UUID, - # - trace_id: str, - span_id: Optional[str] = None, - ): - invocation_link = Link( - trace_id=trace_id, - span_id=span_id, - ) - - invocation_link = await self._delete_invocation( - project_id=project_id, - user_id=user_id, - # - invocation_link=invocation_link, - ) - - return invocation_link - - async def query( - self, - *, - project_id: UUID, - # - invocation_query: Optional[InvocationQuery] = None, - # - invocation_links: Optional[List[Link]] = None, - # - windowing: Optional[Windowing] = None, - ): - invocation = invocation_query if invocation_query else None - invocation_flags = InvocationFlags(is_evaluator=True) - - if invocation: - if invocation.channel: - invocation_flags.is_sdk = invocation.channel == InvocationChannel.SDK - invocation_flags.is_web = invocation.channel == InvocationChannel.WEB - - if invocation.kind: - invocation_flags.is_evaluation = invocation.kind == InvocationKind.EVAL - - invocation_tags = invocation.tags if invocation else None - invocation_meta = invocation.meta if invocation else None - - invocation_references = ( - InvocationReferences( - **invocation.references.model_dump(), - ) - if invocation and invocation.references - else None - ) - - _invocation_links = invocation.links if invocation else None - - invocations = await self._query_invocation( - project_id=project_id, - # - flags=invocation_flags, - tags=invocation_tags, - meta=invocation_meta, - # - references=invocation_references, - links=_invocation_links, - # - invocation_links=invocation_links, - # - windowing=windowing, - ) - return invocations - - # -------- Internal Functions ------------------------------------------------------------------- - - async def _create_invocation( - self, - *, - project_id: UUID, - user_id: UUID, - # - name: Optional[str], - # - flags: InvocationFlags, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - # - data: Data, - # - references: InvocationReferences, - links: Optional[InvocationLinks], - ) -> Optional[Link]: - trace_id = uuid4().hex - trace_type = TraceType.INVOCATION - - span_id = uuid4().hex[16:] - span_type = SpanType.TASK - span_name = name or references.application.slug or "invocation" - - _references = references.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - - if isinstance(links, dict): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": key}, # type: ignore - ) - for key, link in links.items() - if link.trace_id and link.span_id - ] - elif isinstance(links, list): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": "key"}, # type: ignore - ) - for link in links - if link.trace_id and link.span_id - ] - else: - _links = None - - _flags = flags.model_dump(mode="json", exclude_none=True) - - _type = { - "trace": "invocation", - "span": "task", - } - - _attributes = parse_into_attributes( - type=_type, - flags=_flags, - tags=tags, - meta=meta, - data=data, - references=_references, - ) - - trace_request = OTelTracingRequest( - spans=[ - OTelFlatSpan( - trace_id=trace_id, - trace_type=trace_type, - span_id=span_id, - span_type=span_type, - span_name=span_name, - attributes=_attributes, - links=_links, - ) - ] - ) - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - _links_response = await self.tracing_router.create_trace( - request=request, - # - trace_request=trace_request, - ) - - _link = ( - Link( - trace_id=_links_response.links[0].trace_id, - span_id=_links_response.links[0].span_id, - ) - if _links_response.links and len(_links_response.links) > 0 - else None - ) - - return _link - - async def _fetch_invocation( - self, - *, - project_id: UUID, - user_id: Optional[UUID] = None, - # - invocation_link: Link, - ) -> Optional[Invocation]: - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) if user_id else None - - if not invocation_link.trace_id: - return None - - trace_response: OTelTracingResponse = await self.tracing_router.fetch_trace( - request=request, - # - trace_id=invocation_link.trace_id, - ) - - if not trace_response or not trace_response.traces: - return None - - traces = list(trace_response.traces.values()) - trace = traces[0] if traces else None - - if not trace or not trace.spans: - return None - - spans = list(trace.spans.values()) - root_span = spans[0] if spans else None - - if not root_span or isinstance(root_span, list): - return None - - ( - type, - flags, - tags, - meta, - data, - references, - ) = parse_from_attributes(root_span.attributes or {}) - - if not data: - return None - - _references = InvocationReferences( - **{ - key: Reference( - id=ref.get("id"), - slug=ref.get("slug"), - version=ref.get("version"), - ) - for key, ref in (references or {}).items() - } - ) - - _links = dict( - **{ - str(link.attributes["key"]): Link( - trace_id=link.trace_id, - span_id=link.span_id, - ) - for link in root_span.links or [] - if link.attributes and "key" in link.attributes - } - ) - - _origin = InvocationOrigin.CUSTOM - - _kind = ( - (flags.get("is_evaluation") and InvocationKind.EVAL or InvocationKind.ADHOC) - if flags - else InvocationKind.ADHOC - ) - - _channel = ( - ( - flags.get("is_sdk") - and InvocationChannel.SDK - or flags.get("is_web") - and InvocationChannel.WEB - or InvocationChannel.API - ) - if flags - else InvocationChannel.API - ) - - invocation = Invocation( - trace_id=root_span.trace_id, - span_id=root_span.span_id, - # - created_at=root_span.created_at, - updated_at=root_span.updated_at, - deleted_at=root_span.deleted_at, - created_by_id=root_span.created_by_id, - updated_by_id=root_span.updated_by_id, - deleted_by_id=root_span.deleted_by_id, - # - origin=_origin, - kind=_kind, - channel=_channel, - # - tags=tags, - meta=meta, - # - data=data, - # - references=_references, - links=_links, - ) - - return invocation - - async def _edit_invocation( - self, - *, - project_id: UUID, - user_id: UUID, - # - invocation: Invocation, - # - flags: InvocationFlags, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - # - data: Data, - # - references: InvocationReferences, - links: InvocationLinks, - ) -> Optional[Link]: - if not invocation.trace_id or not invocation.span_id: - return None - - _references = references.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - - if isinstance(links, dict): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": key}, # type: ignore - ) - for key, link in links.items() - if link.trace_id and link.span_id - ] - elif isinstance(links, list): - _links = [ - OTelLink( - trace_id=link.trace_id, - span_id=link.span_id, - attributes={"key": "key"}, # type: ignore - ) - for link in links - if link.trace_id and link.span_id - ] - else: - _links = None - - _flags = flags.model_dump(mode="json", exclude_none=True) - - _type = { - "trace": "invocation", - "span": "task", - } - - _attributes = parse_into_attributes( - type=_type, - flags=_flags, - tags=tags, - meta=meta, - data=data, - references=_references, - ) - - trace_request = OTelTracingRequest( - spans=[ - OTelFlatSpan( - trace_id=invocation.trace_id, - span_id=invocation.span_id, - attributes=_attributes, - links=_links, - ) - ] - ) - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - _links_response = await self.tracing_router.edit_trace( - request=request, - # - trace_id=invocation.trace_id, - # - trace_request=trace_request, - ) - - _link = ( - Link( - trace_id=_links_response.links[0].trace_id, - span_id=_links_response.links[0].span_id, - ) - if _links_response.links and len(_links_response.links) > 0 - else None - ) - - return _link - - async def _delete_invocation( - self, - *, - project_id: UUID, - user_id: UUID, - # - invocation_link: Link, - ) -> Optional[Link]: - if not invocation_link.trace_id: - return None - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - link_response = await self.tracing_router.delete_trace( - request=request, - # - trace_id=invocation_link.trace_id, - ) - - link = link_response.links[0] if link_response.links else None - - if not link or not link.trace_id or not link.span_id: - return None - - invocation_link = Link( - trace_id=link.trace_id, - span_id=link.span_id, - ) - - return invocation_link - - async def _query_invocation( - self, - *, - project_id: UUID, - user_id: Optional[UUID] = None, - # - flags: Optional[InvocationFlags] = None, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - # - references: Optional[InvocationReferences] = None, - links: Optional[InvocationLinks] = None, - # - invocation_links: Optional[List[Link]] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[Invocation]: - formatting = Formatting( - focus=Focus.TRACE, - format=Format.AGENTA, - ) - - filtering = Filtering() - - conditions: List[Union[Condition, Filtering]] = [ - Condition( - field="attributes", - key="ag.type.trace", - value="invocation", - operator=ComparisonOperator.IS, - ) - ] - - trace_ids = ( - [invocation_link.trace_id for invocation_link in invocation_links] - if invocation_links - else None - ) - - # span_ids = ( - # [invocation_link.span_id for invocation_link in invocation_links] - # if invocation_links - # else None - # ) - - if trace_ids: - conditions.append( - Condition( - field="trace_id", - value=trace_ids, - operator=ListOperator.IN, - ) - ) - - # if span_ids: - # conditions.append( - # Condition( - # field="span_id", - # value=span_ids, - # operator=ListOperator.IN, - # ) - # ) - - if flags: - for key, value in flags.model_dump(mode="json", exclude_none=True).items(): - conditions.append( - Condition( - field="attributes", - key=f"ag.flags.{key}", - value=value, - operator=ComparisonOperator.IS, - ) - ) - - if tags: - for key, value in tags.items(): - conditions.append( - Condition( - field="attributes", - key=f"ag.tags.{key}", - value=value, # type:ignore - operator=ComparisonOperator.IS, - ) - ) - - if meta: - for key, value in meta.items(): - conditions.append( - Condition( - field="attributes", - key=f"ag.meta.{key}", - value=value, # type:ignore - operator=ComparisonOperator.IS, - ) - ) - - if references: - for _, reference in references.model_dump(mode="json").items(): - if reference: - ref_id = str(reference.get("id")) if reference.get("id") else None - ref_slug = ( - str(reference.get("slug")) if reference.get("slug") else None - ) - conditions.append( - Condition( - field="references", - value=[ - {"id": ref_id, "slug": ref_slug}, - ], - operator=ListOperator.IN, - ) - ) - - if links: - if isinstance(links, dict): - for _, link in links.items(): - if link: - conditions.append( - Condition( - field="links", - value=[ - { - "trace_id": link.trace_id, - "span_id": link.span_id, - }, - ], - operator=ListOperator.IN, - ) - ) - elif isinstance(links, list): - _conditions = [] - for link in links: - if link: - _conditions.append( - Condition( - field="links", - value=[ - { - "trace_id": link.trace_id, - "span_id": link.span_id, - }, - ], - operator=ListOperator.IN, - ) - ) - if _conditions: - conditions.append( - Filtering( - operator=LogicalOperator.OR, - conditions=_conditions, - ) - ) - - if conditions: - filtering = Filtering( - operator=LogicalOperator.AND, - conditions=conditions, - ) - - query = TracingQuery( - formatting=formatting, - filtering=filtering, - windowing=windowing, - ) - - request = Request( - scope={"type": "http", "http_version": "1.1", "scheme": "http"} - ) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) if user_id else None - - spans_response: OTelTracingResponse = await self.tracing_router.query_spans( - request=request, - # - query=query, - ) - - if not spans_response or not spans_response.traces: - return [] - - traces = list(spans_response.traces.values()) - - invocations = [] - - for trace in traces: - if not trace or not trace.spans: - continue - - spans = list(trace.spans.values()) - root_span = spans[0] if spans else None - - if not root_span or isinstance(root_span, list): - continue - - ( - __type, - __flags, - __tags, - __meta, - __data, - __references, - ) = parse_from_attributes(root_span.attributes or {}) - - if not __data: - continue - - _references = InvocationReferences( - **{ - key: Reference( - id=ref.get("id"), - slug=ref.get("slug"), - version=ref.get("version"), - ) - for key, ref in (__references or {}).items() - } - ) - - _links = dict( - **{ - str(link.attributes["key"]): Link( - trace_id=link.trace_id, - span_id=link.span_id, - ) - for link in root_span.links or [] - if link.attributes and "key" in link.attributes - } - ) - - _origin = InvocationOrigin.CUSTOM - - _kind = ( - ( - __flags.get("is_evaluation") - and InvocationKind.EVAL - or InvocationKind.ADHOC - ) - if __flags - else InvocationKind.ADHOC - ) - - _channel = ( - ( - __flags.get("is_sdk") - and InvocationChannel.SDK - or __flags.get("is_web") - and InvocationChannel.WEB - or InvocationChannel.API - ) - if __flags - else InvocationChannel.API - ) - - invocation = Invocation( - trace_id=root_span.trace_id, - span_id=root_span.span_id, - # - created_at=root_span.created_at, - updated_at=root_span.updated_at, - deleted_at=root_span.deleted_at, - created_by_id=root_span.created_by_id, - updated_by_id=root_span.updated_by_id, - deleted_by_id=root_span.deleted_by_id, - # - origin=_origin, - kind=_kind, - channel=_channel, - # - tags=__tags, - meta=__meta, - # - data=__data, - # - references=_references, - links=_links, - ) - - invocations.append(invocation) - - return invocations diff --git a/api/oss/src/core/invocations/types.py b/api/oss/src/core/invocations/types.py deleted file mode 100644 index 575855fca1..0000000000 --- a/api/oss/src/core/invocations/types.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import Optional - -from oss.src.core.shared.dtos import Reference -from oss.src.core.workflows.dtos import WorkflowFlags -from oss.src.core.tracing.dtos import ( - SimpleTraceOrigin, - SimpleTraceKind, - SimpleTraceChannel, - SimpleTraceReferences, - SimpleTraceLinks, - # - SimpleTrace, - SimpleTraceCreate, - SimpleTraceEdit, - SimpleTraceQuery, -) - - -InvocationOrigin = SimpleTraceOrigin -InvocationKind = SimpleTraceKind -InvocationChannel = SimpleTraceChannel -InvocationLinks = SimpleTraceLinks - - -class InvocationFlags(WorkflowFlags): - is_sdk: Optional[bool] = None - is_web: Optional[bool] = None - is_evaluation: Optional[bool] = None - - -class InvocationReferences(SimpleTraceReferences): - application: Reference # type: ignore - - -class Invocation(SimpleTrace): - links: Optional[InvocationLinks] - - -class InvocationCreate(SimpleTraceCreate): - links: Optional[InvocationLinks] - - -class InvocationEdit(SimpleTraceEdit): - pass - - -class InvocationQuery(SimpleTraceQuery): - pass diff --git a/api/oss/src/core/invocations/utils.py b/api/oss/src/core/invocations/utils.py deleted file mode 100644 index 0ad3df24d2..0000000000 --- a/api/oss/src/core/invocations/utils.py +++ /dev/null @@ -1,57 +0,0 @@ -from jsonschema import ( - Draft202012Validator, - Draft7Validator, - Draft4Validator, - Draft6Validator, - Draft201909Validator, -) - -from fastapi import status, HTTPException - - -def _get_jsonschema_validator( - format: dict, # pylint: disable=redefined-builtin -): - schema_uri = format.get( - "$schema", - "https://json-schema.org/draft/2020-12/schema", - ) - - if "2020-12" in schema_uri: - return Draft202012Validator - elif "2019-09" in schema_uri: - return Draft201909Validator - elif "draft-07" in schema_uri: - return Draft7Validator - elif "draft-06" in schema_uri: - return Draft6Validator - elif "draft-04" in schema_uri: - return Draft4Validator - return Draft202012Validator # fallback - - -def validate_data_against_schema( - data: dict, - schema: dict, # pylint: disable=redefined-builtin -): - validator_class = _get_jsonschema_validator(schema) - validator = validator_class(schema) - - errors = list(validator.iter_errors(data)) - - if errors: - details = [] - for e in errors: - loc = list(e.absolute_path) - msg = e.message - details.append( - { - "loc": ["body", "invocation", "data"] + loc, - "msg": msg, - "type": "value_error.json_schema", - } - ) - - raise HTTPException( - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=details - ) diff --git a/api/oss/src/core/observability/dtos.py b/api/oss/src/core/observability/dtos.py index bce3b2cdcf..438ef5e10b 100644 --- a/api/oss/src/core/observability/dtos.py +++ b/api/oss/src/core/observability/dtos.py @@ -5,7 +5,7 @@ from pydantic import BaseModel -from oss.src.core.shared.dtos import LegacyLifecycleDTO, Windowing +from oss.src.core.shared.dtos import LegacyLifecycleDTO ## --- SUB-ENTITIES --- ## @@ -16,10 +16,9 @@ class RootDTO(BaseModel): class TreeType(Enum): + # --- VARIANTS --- # INVOCATION = "invocation" - ANNOTATION = "annotation" - # - UNKNOWN = "unknown" + # --- VARIANTS --- # class TreeDTO(BaseModel): @@ -233,8 +232,10 @@ class OTelSpanDTO(BaseModel): ## --- QUERY --- ## -class WindowingDTO(Windowing): - pass +class WindowingDTO(BaseModel): + oldest: Optional[datetime] = None + newest: Optional[datetime] = None + window: Optional[int] = None class LogicalOperator(Enum): @@ -359,6 +360,6 @@ def plus(self, other: "MetricsDTO") -> "MetricsDTO": class BucketDTO(BaseModel): timestamp: datetime - interval: int + window: int total: MetricsDTO error: MetricsDTO diff --git a/api/oss/src/core/observability/utils.py b/api/oss/src/core/observability/utils.py index 01e72c7825..cb78cd3192 100644 --- a/api/oss/src/core/observability/utils.py +++ b/api/oss/src/core/observability/utils.py @@ -158,7 +158,7 @@ def parse_ingest_value( ) -> None: try: attributes[key] = to_type(attributes[key]) - except (ValueError, TypeError): + except ValueError: print_exc() log.warn( "Failed to parse attributes:", diff --git a/api/oss/src/core/queries/__init__.py b/api/oss/src/core/queries/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/core/queries/dtos.py b/api/oss/src/core/queries/dtos.py deleted file mode 100644 index a6c2c113d4..0000000000 --- a/api/oss/src/core/queries/dtos.py +++ /dev/null @@ -1,246 +0,0 @@ -from typing import Optional -from uuid import UUID - -from pydantic import BaseModel, Field - - -from oss.src.core.tracing.dtos import Filtering -from oss.src.core.shared.dtos import ( - Identifier, - Slug, - Lifecycle, - Header, - Flags, - Tags, - Meta, - Windowing, -) -from oss.src.core.shared.dtos import sync_alias, AliasConfig -from oss.src.core.git.dtos import ( - Artifact, - ArtifactCreate, - ArtifactEdit, - ArtifactQuery, - ArtifactFork, - RevisionsLog, - Variant, - VariantCreate, - VariantEdit, - VariantQuery, - VariantFork, - Revision, - RevisionCreate, - RevisionEdit, - RevisionQuery, - RevisionCommit, - RevisionFork, -) - - -class QueryIdAlias(AliasConfig): - query_id: Optional[UUID] = None - artifact_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="query_id", - ) - - -class QueryVariantIdAlias(AliasConfig): - query_variant_id: Optional[UUID] = None - variant_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="query_variant_id", - ) - - -class QueryRevisionIdAlias(AliasConfig): - query_revision_id: Optional[UUID] = None - revision_id: Optional[UUID] = Field( - default=None, - exclude=True, - alias="query_revision_id", - ) - - -class Query(Artifact): - pass - - -class QueryCreate(ArtifactCreate): - pass - - -class QueryEdit(ArtifactEdit): - pass - - -class QueryQuery(ArtifactQuery): - pass - - -class QueryVariant( - Variant, - QueryIdAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("query_id", "artifact_id", self) - - -class QueryVariantCreate( - VariantCreate, - QueryIdAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("query_id", "artifact_id", self) - - -class QueryVariantEdit(VariantEdit): - pass - - -class QueryVariantQuery(VariantQuery): - pass - - -class QueryRevisionData(BaseModel): - windowing: Optional[Windowing] = None - filtering: Optional[Filtering] = None - - -class QueryRevision( - Revision, - QueryIdAlias, - QueryVariantIdAlias, -): - data: Optional[QueryRevisionData] = None - - def model_post_init(self, __context) -> None: - sync_alias("query_id", "artifact_id", self) - sync_alias("query_variant_id", "variant_id", self) - - -class QueryRevisionCreate( - RevisionCreate, - QueryIdAlias, - QueryVariantIdAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("query_id", "artifact_id", self) - sync_alias("query_variant_id", "variant_id", self) - - -class QueryRevisionEdit(RevisionEdit): - pass - - -class QueryRevisionQuery(RevisionQuery): - pass - - -class QueryRevisionCommit( - RevisionCommit, - QueryIdAlias, - QueryVariantIdAlias, -): - data: Optional[QueryRevisionData] = None - - def model_post_init(self, __context) -> None: - sync_alias("query_id", "artifact_id", self) - sync_alias("query_variant_id", "variant_id", self) - - -class QueryRevisionsLog( - RevisionsLog, - QueryIdAlias, - QueryVariantIdAlias, - QueryRevisionIdAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("query_id", "artifact_id", self) - sync_alias("query_variant_id", "variant_id", self) - sync_alias("query_revision_id", "revision_id", self) - - -class QueryRevisionFork(RevisionFork): - data: Optional[QueryRevisionData] = None - - -class QueryVariantFork(VariantFork): - pass - - -class QueryVariantForkAlias(AliasConfig): - query_variant: Optional[QueryVariantFork] = None - - variant: Optional[VariantFork] = Field( - default=None, - exclude=True, - alias="query_variant", - ) - - -class QueryRevisionForkAlias(AliasConfig): - query_revision: Optional[QueryRevisionFork] = None - - revision: Optional[RevisionFork] = Field( - default=None, - exclude=True, - alias="query_revision", - ) - - -class QueryFork( - ArtifactFork, - QueryVariantIdAlias, - QueryRevisionIdAlias, - QueryVariantForkAlias, - QueryRevisionForkAlias, -): - def model_post_init(self, __context) -> None: - sync_alias("query_variant", "variant", self) - sync_alias("query_revision", "revision", self) - sync_alias("query_variant_id", "variant_id", self) - sync_alias("query_revision_id", "revision_id", self) - - -class SimpleQuery( - Identifier, - Slug, - Lifecycle, - Header, -): - flags: Optional[Flags] = None - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - data: Optional[QueryRevisionData] = None - - -class SimpleQueryCreate( - Slug, - Header, -): - flags: Optional[Flags] = None - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - data: Optional[QueryRevisionData] = None - - -class SimpleQueryEdit( - Identifier, - Header, -): - flags: Optional[Flags] = None - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - data: Optional[QueryRevisionData] = None - - -class SimpleQueryQuery(BaseModel): - flags: Optional[Flags] = None - tags: Optional[Tags] = None - meta: Optional[Meta] = None diff --git a/api/oss/src/core/queries/service.py b/api/oss/src/core/queries/service.py deleted file mode 100644 index 61c7caef6e..0000000000 --- a/api/oss/src/core/queries/service.py +++ /dev/null @@ -1,1336 +0,0 @@ -from typing import Optional, List -from uuid import UUID, uuid4 - -from oss.src.utils.logging import get_module_logger - -from oss.src.core.git.interfaces import GitDAOInterface -from oss.src.core.shared.dtos import Reference, Windowing -from oss.src.core.git.dtos import ( - ArtifactCreate, - ArtifactEdit, - ArtifactQuery, - ArtifactFork, - RevisionsLog, - # - VariantCreate, - VariantEdit, - VariantQuery, - # - RevisionCreate, - RevisionEdit, - RevisionQuery, - RevisionCommit, -) -from oss.src.core.queries.dtos import ( - Query, - QueryCreate, - QueryEdit, - QueryQuery, - QueryFork, - # - QueryVariant, - QueryVariantCreate, - QueryVariantEdit, - QueryVariantQuery, - # - QueryRevision, - QueryRevisionCreate, - QueryRevisionEdit, - QueryRevisionQuery, - QueryRevisionCommit, - QueryRevisionsLog, - # - SimpleQuery, - SimpleQueryCreate, - SimpleQueryEdit, - SimpleQueryQuery, -) - - -log = get_module_logger(__name__) - - -class QueriesService: - def __init__( - self, - *, - queries_dao: GitDAOInterface, - ): - self.queries_dao = queries_dao - - ## -- artifacts ------------------------------------------------------------ - - async def create_query( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_create: QueryCreate, - # - query_id: Optional[UUID] = None, - ) -> Optional[Query]: - _artifact_create = ArtifactCreate( - **query_create.model_dump(mode="json"), - ) - - artifact = await self.queries_dao.create_artifact( - project_id=project_id, - user_id=user_id, - # - artifact_create=_artifact_create, - # - artifact_id=query_id, - ) - - if not artifact: - return None - - _query = Query(**artifact.model_dump(mode="json")) - - return _query - - async def fetch_query( - self, - *, - project_id: UUID, - # - query_ref: Reference, - ) -> Optional[Query]: - artifact = await self.queries_dao.fetch_artifact( - project_id=project_id, - # - artifact_ref=query_ref, - ) - - if not artifact: - return None - - _query = Query(**artifact.model_dump(mode="json")) - - return _query - - async def edit_query( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_edit: QueryEdit, - ) -> Optional[Query]: - _artifact_edit = ArtifactEdit( - **query_edit.model_dump(mode="json"), - ) - - artifact = await self.queries_dao.edit_artifact( - project_id=project_id, - user_id=user_id, - # - artifact_edit=_artifact_edit, - ) - - if not artifact: - return None - - _query = Query(**artifact.model_dump(mode="json")) - - return _query - - async def archive_query( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_id: UUID, - ) -> Optional[Query]: - artifact = await self.queries_dao.archive_artifact( - project_id=project_id, - user_id=user_id, - # - artifact_id=query_id, - ) - - if not artifact: - return None - - _query = Query(**artifact.model_dump(mode="json")) - - return _query - - async def unarchive_query( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_id: UUID, - ) -> Optional[Query]: - artifact = await self.queries_dao.unarchive_artifact( - project_id=project_id, - user_id=user_id, - # - artifact_id=query_id, - ) - - if not artifact: - return None - - _query = Query(**artifact.model_dump(mode="json")) - - return _query - - async def query_queries( - self, - *, - project_id: UUID, - # - query: Optional[QueryQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[Query]: - _artifact_query = ( - ArtifactQuery( - **query.model_dump(mode="json", exclude_none=True), - ) - if query - else ArtifactQuery() - ) - - artifacts = await self.queries_dao.query_artifacts( - project_id=project_id, - # - artifact_query=_artifact_query, - # - artifact_refs=query_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - _queries = [ - Query( - **artifact.model_dump(mode="json"), - ) - for artifact in artifacts - ] - - return _queries - - ## ------------------------------------------------------------------------- - - ## -- variants ------------------------------------------------------------- - - async def create_query_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_variant_create: QueryVariantCreate, - ) -> Optional[QueryVariant]: - _variant_create = VariantCreate( - **query_variant_create.model_dump(mode="json"), - ) - - variant = await self.queries_dao.create_variant( - project_id=project_id, - user_id=user_id, - # - variant_create=_variant_create, - ) - - if not variant: - return None - - _query_variant = QueryVariant( - **variant.model_dump(mode="json"), - ) - - return _query_variant - - async def fetch_query_variant( - self, - *, - project_id: UUID, - # - query_ref: Optional[Reference] = None, - query_variant_ref: Optional[Reference] = None, - ) -> Optional[QueryVariant]: - variant = await self.queries_dao.fetch_variant( - project_id=project_id, - # - artifact_ref=query_ref, - variant_ref=query_variant_ref, - ) - - if not variant: - return None - - _query_variant = QueryVariant( - **variant.model_dump(mode="json"), - ) - - return _query_variant - - async def edit_query_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_variant_edit: QueryVariantEdit, - ) -> Optional[QueryVariant]: - _variant_edit = VariantEdit( - **query_variant_edit.model_dump(mode="json"), - ) - - variant = await self.queries_dao.edit_variant( - project_id=project_id, - user_id=user_id, - # - variant_edit=_variant_edit, - ) - - if not variant: - return None - - _query_variant = QueryVariant( - **variant.model_dump(mode="json"), - ) - - return _query_variant - - async def archive_query_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_variant_id: UUID, - ) -> Optional[QueryVariant]: - variant = await self.queries_dao.archive_variant( - project_id=project_id, - user_id=user_id, - # - variant_id=query_variant_id, - ) - - if not variant: - return None - - _query_variant = QueryVariant( - **variant.model_dump(mode="json"), - ) - - return _query_variant - - async def unarchive_query_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_variant_id: UUID, - ) -> Optional[QueryVariant]: - variant = await self.queries_dao.unarchive_variant( - project_id=project_id, - user_id=user_id, - # - variant_id=query_variant_id, - ) - - if not variant: - return None - - _workdlow_variant = QueryVariant( - **variant.model_dump(mode="json"), - ) - - return _workdlow_variant - - async def query_query_variants( - self, - *, - project_id: UUID, - # - query_variant_query: Optional[QueryVariantQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - query_variant_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[QueryVariant]: - _variant_query = ( - VariantQuery( - **query_variant_query.model_dump(mode="json", exclude_none=True), - ) - if query_variant_query - else VariantQuery() - ) - - variants = await self.queries_dao.query_variants( - project_id=project_id, - # - variant_query=_variant_query, - # - artifact_refs=query_refs, - variant_refs=query_variant_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - _query_variants = [ - QueryVariant( - **variant.model_dump(mode="json"), - ) - for variant in variants - ] - - return _query_variants - - ## ......................................................................... - - async def fork_query_variant( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_fork: QueryFork, - ) -> Optional[QueryVariant]: - _artifact_fork = ArtifactFork( - **query_fork.model_dump(mode="json"), - ) - - variant = await self.queries_dao.fork_variant( - project_id=project_id, - user_id=user_id, - # - artifact_fork=_artifact_fork, - ) - - if not variant: - return None - - _query_variant = QueryVariant( - **variant.model_dump(mode="json"), - ) - - return _query_variant - - ## ------------------------------------------------------------------------- - - ## -- revisions ------------------------------------------------------------ - - async def create_query_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_revision_create: QueryRevisionCreate, - ) -> Optional[QueryRevision]: - _revision_create = RevisionCreate( - **query_revision_create.model_dump(mode="json"), - ) - - revision = await self.queries_dao.create_revision( - project_id=project_id, - user_id=user_id, - # - revision_create=_revision_create, - ) - - if not revision: - return None - - _query_revision = QueryRevision( - **revision.model_dump(mode="json"), - ) - - return _query_revision - - async def fetch_query_revision( - self, - *, - project_id: UUID, - # - query_ref: Optional[Reference] = None, - query_variant_ref: Optional[Reference] = None, - query_revision_ref: Optional[Reference] = None, - ) -> Optional[QueryRevision]: - if not query_ref and not query_variant_ref and not query_revision_ref: - return None - - if query_ref and not query_variant_ref and not query_revision_ref: - query = await self.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query: - return None - - query_ref = Reference( - id=query.id, - slug=query.slug, - ) - - query_variant = await self.fetch_query_variant( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query_variant: - return None - - query_variant_ref = Reference( - id=query_variant.id, - slug=query_variant.slug, - ) - - revision = await self.queries_dao.fetch_revision( - project_id=project_id, - # - variant_ref=query_variant_ref, - revision_ref=query_revision_ref, - ) - - if not revision: - return None - - _query_revision = QueryRevision( - **revision.model_dump(mode="json"), - ) - - return _query_revision - - async def edit_query_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_revision_edit: QueryRevisionEdit, - ) -> Optional[QueryRevision]: - _query_revision_edit = RevisionEdit( - **query_revision_edit.model_dump(mode="json"), - ) - - revision = await self.queries_dao.edit_revision( - project_id=project_id, - user_id=user_id, - # - revision_edit=_query_revision_edit, - ) - - if not revision: - return None - - _query_revision = QueryRevision( - **revision.model_dump(mode="json"), - ) - - return _query_revision - - async def archive_query_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_revision_id: UUID, - ) -> Optional[QueryRevision]: - revision = await self.queries_dao.archive_revision( - project_id=project_id, - user_id=user_id, - # - revision_id=query_revision_id, - ) - - if not revision: - return None - - _query_revision = QueryRevision( - **revision.model_dump(mode="json"), - ) - - return _query_revision - - async def unarchive_query_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_revision_id: UUID, - ) -> Optional[QueryRevision]: - revision = await self.queries_dao.unarchive_revision( - project_id=project_id, - user_id=user_id, - # - revision_id=query_revision_id, - ) - - if not revision: - return None - - _query_revision = QueryRevision( - **revision.model_dump(mode="json"), - ) - - return _query_revision - - async def query_query_revisions( - self, - *, - project_id: UUID, - # - query_revision: Optional[QueryRevisionQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - query_variant_refs: Optional[List[Reference]] = None, - query_revision_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[QueryRevision]: - _revision_query = ( - RevisionQuery( - **query_revision.model_dump(mode="json", exclude_none=True), - ) - if query_revision - else RevisionQuery() - ) - - revisions = await self.queries_dao.query_revisions( - project_id=project_id, - # - revision_query=_revision_query, - # - artifact_refs=query_refs, - variant_refs=query_variant_refs, - revision_refs=query_revision_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - _query_revisions = [ - QueryRevision( - **revision.model_dump(mode="json"), - ) - for revision in revisions - ] - - return _query_revisions - - ## ......................................................................... - - async def commit_query_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_revision_commit: QueryRevisionCommit, - ) -> Optional[QueryRevision]: - _revision_commit = RevisionCommit( - **query_revision_commit.model_dump(mode="json"), - ) - - if not _revision_commit.artifact_id: - if not _revision_commit.variant_id: - return None - - variant = await self.queries_dao.fetch_variant( - project_id=project_id, - # - variant_ref=Reference(id=_revision_commit.variant_id), - ) - - if not variant: - return None - - _revision_commit.artifact_id = variant.artifact_id - - revision = await self.queries_dao.commit_revision( - project_id=project_id, - user_id=user_id, - # - revision_commit=_revision_commit, - ) - - if not revision: - return None - - _query_revision = QueryRevision( - **revision.model_dump(mode="json"), - ) - - return _query_revision - - async def log_query_revisions( - self, - *, - project_id: UUID, - # - query_revisions_log: QueryRevisionsLog, - # - ) -> List[QueryRevision]: - _revisions_log = RevisionsLog( - **query_revisions_log.model_dump(mode="json"), - ) - - revisions = await self.queries_dao.log_revisions( - project_id=project_id, - # - revisions_log=_revisions_log, - ) - - _query_revisions = [ - QueryRevision( - **revision.model_dump(mode="json"), - ) - for revision in revisions - ] - - return _query_revisions - - ## ------------------------------------------------------------------------- - - -class SimpleQueriesService: - def __init__( - self, - queries_service: QueriesService, - ): - self.queries_service = queries_service - - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - simple_query_create: SimpleQueryCreate, - # - query_id: Optional[UUID] = None, - ) -> Optional[SimpleQuery]: - # ---------------------------------------------------------------------- - # Query - # ---------------------------------------------------------------------- - _query_create = QueryCreate( - slug=simple_query_create.slug, - # - name=simple_query_create.name, - description=simple_query_create.description, - # - flags=simple_query_create.flags, - tags=simple_query_create.tags, - meta=simple_query_create.meta, - ) - - query: Optional[Query] = await self.queries_service.create_query( - project_id=project_id, - user_id=user_id, - # - query_create=_query_create, - # - query_id=query_id, - ) - - if not query: - return None - - # ---------------------------------------------------------------------- - # Query variant - # ---------------------------------------------------------------------- - query_variant_slug = uuid4().hex[-12:] - - _query_variant_create = QueryVariantCreate( - slug=query_variant_slug, - # - name=simple_query_create.name, - description=simple_query_create.description, - # - flags=simple_query_create.flags, - tags=simple_query_create.tags, - meta=simple_query_create.meta, - # - query_id=query.id, # type: ignore[arg-type] - ) - - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.create_query_variant( - project_id=project_id, - user_id=user_id, - # - query_variant_create=_query_variant_create, - ) - - if not query_variant: - return None - - # ---------------------------------------------------------------------- - # Query revision - # ---------------------------------------------------------------------- - query_revision_slug = uuid4().hex[-12:] - - _query_revision_commit = QueryRevisionCommit( - slug=query_revision_slug, - # - name=simple_query_create.name, - description=simple_query_create.description, - # - flags=simple_query_create.flags, - tags=simple_query_create.tags, - meta=simple_query_create.meta, - # - data=simple_query_create.data, - # - query_id=query.id, - query_variant_id=query_variant.id, - ) - - query_revision: Optional[ - QueryRevision - ] = await self.queries_service.commit_query_revision( - project_id=project_id, - user_id=user_id, - query_revision_commit=_query_revision_commit, - ) - - if not query_revision: - return None - - # ---------------------------------------------------------------------- - # Simple Query - # ---------------------------------------------------------------------- - simple_query = SimpleQuery( - id=query.id, - slug=query.slug, - # - created_at=query.created_at, - updated_at=query.updated_at, - deleted_at=query.deleted_at, - created_by_id=query.created_by_id, - updated_by_id=query.updated_by_id, - deleted_by_id=query.deleted_by_id, - # - name=query.name, - description=query.description, - # - flags=query.flags, - tags=query.tags, - meta=query.meta, - # - data=query_revision.data, - ) - - return simple_query - - async def fetch( - self, - *, - project_id: UUID, - # - query_id: Optional[UUID] = None, - ) -> Optional[SimpleQuery]: - # ---------------------------------------------------------------------- - # Query - # ---------------------------------------------------------------------- - query_ref = Reference( - id=query_id, - ) - - query: Optional[Query] = await self.queries_service.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query: - return None - - # ---------------------------------------------------------------------- - # Query variant - # ---------------------------------------------------------------------- - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.fetch_query_variant( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query_variant: - return None - - # ---------------------------------------------------------------------- - # Query - # ---------------------------------------------------------------------- - - query_variant_ref = Reference( - id=query_variant.id, - ) - query_revision: Optional[ - QueryRevision - ] = await self.queries_service.fetch_query_revision( - project_id=project_id, - # - query_variant_ref=query_variant_ref, - ) - - if not query_revision: - return None - - # ---------------------------------------------------------------------- - # Simple Query - # ---------------------------------------------------------------------- - - simple_query = SimpleQuery( - id=query.id, - slug=query.slug, - # - created_at=query.created_at, - updated_at=query.updated_at, - deleted_at=query.deleted_at, - created_by_id=query.created_by_id, - updated_by_id=query.updated_by_id, - deleted_by_id=query.deleted_by_id, - # - name=query.name, - description=query.description, - # - flags=query.flags, - tags=query.tags, - meta=query.meta, - # - data=query_revision.data, - ) - - return simple_query - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - simple_query_edit: SimpleQueryEdit, - # - query_id: UUID, - ) -> Optional[SimpleQuery]: - if str(query_id) != str(simple_query_edit.id): - return None - - # ---------------------------------------------------------------------- - # Query - # ---------------------------------------------------------------------- - query_ref = Reference(id=simple_query_edit.id) - - query: Optional[Query] = await self.queries_service.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query: - return None - - _query_edit = QueryEdit( - id=query.id, - # - name=simple_query_edit.name, - description=simple_query_edit.description, - # - flags=simple_query_edit.flags, - tags=simple_query_edit.tags, - meta=simple_query_edit.meta, - ) - - query = await self.queries_service.edit_query( - project_id=project_id, - user_id=user_id, - # - query_edit=_query_edit, - ) - - if not query: - return None - - # ---------------------------------------------------------------------- - # Query variant - # ---------------------------------------------------------------------- - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.fetch_query_variant( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query_variant: - return None - - _query_variant_edit = QueryVariantEdit( - id=query_variant.id, - # - name=simple_query_edit.name, - description=simple_query_edit.description, - # - flags=simple_query_edit.flags, - tags=simple_query_edit.tags, - meta=simple_query_edit.meta, - ) - - query_variant = await self.queries_service.edit_query_variant( - project_id=project_id, - user_id=user_id, - # - query_variant_edit=_query_variant_edit, - ) - - if not query_variant: - return None - - # ---------------------------------------------------------------------- - # Query revision - # ---------------------------------------------------------------------- - query_revision_slug = uuid4().hex[-12:] - - _query_revision_commit = QueryRevisionCommit( - slug=query_revision_slug, - # - name=simple_query_edit.name, - description=simple_query_edit.description, - # - flags=simple_query_edit.flags, - tags=simple_query_edit.tags, - meta=simple_query_edit.meta, - # - data=simple_query_edit.data, - # - query_id=query.id, - query_variant_id=query_variant.id, - ) - - query_revision: Optional[ - QueryRevision - ] = await self.queries_service.commit_query_revision( - project_id=project_id, - user_id=user_id, - # - query_revision_commit=_query_revision_commit, - ) - - if not query_revision: - return None - - # ---------------------------------------------------------------------- - # Simple Query - # ---------------------------------------------------------------------- - simple_query = SimpleQuery( - id=query.id, - slug=query.slug, - # - created_at=query.created_at, - updated_at=query.updated_at, - deleted_at=query.deleted_at, - created_by_id=query.created_by_id, - updated_by_id=query.updated_by_id, - deleted_by_id=query.deleted_by_id, - # - name=query.name, - description=query.description, - # - flags=query.flags, - tags=query.tags, - meta=query.meta, - # - data=query_revision.data, - ) - - return simple_query - - async def query( - self, - *, - project_id: UUID, - # - query: Optional[SimpleQueryQuery] = None, - # - query_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[SimpleQuery]: - # ---------------------------------------------------------------------- - # Queries - # ---------------------------------------------------------------------- - queries: List[Query] = await self.queries_service.query_queries( - project_id=project_id, - # - query=query, - # - query_refs=query_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - if not queries: - return [] - - simple_queries: List[SimpleQuery] = [] - - for query in queries: - # ------------------------------------------------------------------ - # Query variants - # ------------------------------------------------------------------ - query_ref = Reference( - id=query.id, - ) - - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.fetch_query_variant( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query_variant: - continue - - # ------------------------------------------------------------------ - # Query revisions - # ------------------------------------------------------------------ - query_variant_ref = Reference( - id=query_variant.id, - ) - - query_revision: Optional[ - QueryRevision - ] = await self.queries_service.fetch_query_revision( - project_id=project_id, - # - query_variant_ref=query_variant_ref, - ) - - if not query_revision: - continue - - # ------------------------------------------------------------------ - # Simple Queries - # ------------------------------------------------------------------ - simple_query = SimpleQuery( - id=query.id, - slug=query.slug, - # - created_at=query.created_at, - updated_at=query.updated_at, - deleted_at=query.deleted_at, - created_by_id=query.created_by_id, - updated_by_id=query.updated_by_id, - deleted_by_id=query.deleted_by_id, - # - name=query.name, - description=query.description, - # - flags=query.flags, - tags=query.tags, - meta=query.meta, - # - data=query_revision.data, - ) - - simple_queries.append(simple_query) - - return simple_queries - - async def archive( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_id: Optional[UUID] = None, - ) -> Optional[SimpleQuery]: - # ---------------------------------------------------------------------- - # Query - # ---------------------------------------------------------------------- - query_ref = Reference( - id=query_id, - ) - - query: Optional[Query] = await self.queries_service.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query: - return None - - query: Optional[Query] = await self.queries_service.archive_query( - project_id=project_id, - user_id=user_id, - # - query_id=query_id, - ) - - if not query: - return None - - # ---------------------------------------------------------------------- - # Query variant - # ---------------------------------------------------------------------- - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.fetch_query_variant( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query_variant: - return None - - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.archive_query_variant( - project_id=project_id, - user_id=user_id, - # - query_variant_id=query_variant.id, - ) - - if not query_variant: - return None - - # ---------------------------------------------------------------------- - # Simple Query - # ---------------------------------------------------------------------- - simple_query = SimpleQuery( - id=query.id, - slug=query.slug, - # - created_at=query.created_at, - updated_at=query.updated_at, - deleted_at=query.deleted_at, - created_by_id=query.created_by_id, - updated_by_id=query.updated_by_id, - deleted_by_id=query.deleted_by_id, - # - name=query.name, - description=query.description, - # - flags=query.flags, - tags=query.tags, - meta=query.meta, - ) - - return simple_query - - async def unarchive( - self, - *, - project_id: UUID, - user_id: UUID, - # - query_id: Optional[UUID] = None, - ) -> Optional[SimpleQuery]: - # ---------------------------------------------------------------------- - # Query - # ---------------------------------------------------------------------- - query_ref = Reference( - id=query_id, - ) - - query: Optional[Query] = await self.queries_service.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query: - return None - - query: Optional[Query] = await self.queries_service.unarchive_query( - project_id=project_id, - user_id=user_id, - # - query_id=query_id, - ) - - if not query: - return None - - # ---------------------------------------------------------------------- - # Query variant - # ---------------------------------------------------------------------- - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.fetch_query_variant( - project_id=project_id, - # - query_ref=query_ref, - ) - - if not query_variant: - return None - - query_variant: Optional[ - QueryVariant - ] = await self.queries_service.unarchive_query_variant( - project_id=project_id, - user_id=user_id, - # - query_variant_id=query_variant.id, - ) - - if not query_variant: - return None - - # ---------------------------------------------------------------------- - # Simple Query - # ---------------------------------------------------------------------- - simple_query = SimpleQuery( - id=query.id, - slug=query.slug, - # - created_at=query.created_at, - updated_at=query.updated_at, - deleted_at=query.deleted_at, - created_by_id=query.created_by_id, - updated_by_id=query.updated_by_id, - deleted_by_id=query.deleted_by_id, - # - name=query.name, - description=query.description, - # - flags=query.flags, - tags=query.tags, - meta=query.meta, - ) - - return simple_query diff --git a/api/oss/src/core/secrets/enums.py b/api/oss/src/core/secrets/enums.py index ef16b43e79..7a70ff0fb6 100644 --- a/api/oss/src/core/secrets/enums.py +++ b/api/oss/src/core/secrets/enums.py @@ -26,7 +26,7 @@ class CustomProviderKind(str, Enum): AZURE = "azure" BEDROCK = "bedrock" SAGEMAKER = "sagemaker" - VERTEX = "vertex_ai" + VERTEX = "vertex" OPENAI = "openai" COHERE = "cohere" ANYSCALE = "anyscale" diff --git a/api/oss/src/core/secrets/utils.py b/api/oss/src/core/secrets/utils.py index 9edc02035f..9b3af1d72e 100644 --- a/api/oss/src/core/secrets/utils.py +++ b/api/oss/src/core/secrets/utils.py @@ -44,20 +44,18 @@ async def get_user_llm_providers_secrets(project_id: str) -> Dict[str, Any]: # 3: convert secrets to readable format readable_secrets = {} for secret in secrets: - kind = secret["data"].get("kind") - provider_slug = kind.value if kind else "" + provider_slug = str(secret["data"].get("kind", "")) secret_name = f"{provider_slug.upper()}_API_KEY" if provider_slug: - provider = secret["data"].get("provider") - readable_secrets[secret_name] = provider.get("key") if provider else None + readable_secrets[secret_name] = secret["data"].get("key") return readable_secrets -async def get_llm_providers_secrets(project_id: str) -> Dict[str, Any]: +async def get_llm_providers_secrets(provider_id: str) -> Dict[str, Any]: """ Fetches LLM providers secrets from system and vault. """ system_llm_secrets = await get_system_llm_providers_secrets() - user_llm_secrets = await get_user_llm_providers_secrets(project_id) + user_llm_secrets = await get_user_llm_providers_secrets(provider_id) return {**system_llm_secrets, **user_llm_secrets} diff --git a/api/oss/src/core/shared/dtos.py b/api/oss/src/core/shared/dtos.py index f56c6b093c..20ad0dbc31 100644 --- a/api/oss/src/core/shared/dtos.py +++ b/api/oss/src/core/shared/dtos.py @@ -1,45 +1,136 @@ -from typing import Optional -from pydantic import BaseModel - - -from agenta.sdk.models.shared import ( - BoolJson, - StringJson, - FullJson, - NumericJson, - NoListJson, - LabelJson, - # - Json, - Data, - Metadata, - Flags, - Tags, - Meta, - Hashes, - Metrics, - Schema, - # - Lifecycle, - Header, - # - TraceID, - SpanID, - Link, - # - Identifier, - Slug, - Version, - Reference, - # - AliasConfig, - sync_alias, - # - Commit, - # - Windowing, +from typing import Optional, Dict, List, Union, Literal +from uuid import UUID +from datetime import datetime +from re import match + +from pydantic import BaseModel, field_validator + +from typing_extensions import TypeAliasType + + +BoolJson: TypeAliasType = TypeAliasType( + "BoolJson", + Union[bool, Dict[str, "BoolJson"]], ) +StringJson: TypeAliasType = TypeAliasType( + "StringJson", + Union[str, Dict[str, "StringJson"]], +) + +FullJson: TypeAliasType = TypeAliasType( + "FullJson", + Union[str, int, float, bool, None, Dict[str, "FullJson"], List["FullJson"]], +) + +NumericJson: TypeAliasType = TypeAliasType( + "NumericJson", + Union[int, float, Dict[str, "NumericJson"]], +) + +NoListJson: TypeAliasType = TypeAliasType( + "NoListJson", + Union[str, int, float, bool, None, Dict[str, "NoListJson"]], +) + +Json = Dict[str, FullJson] + +Data = Dict[str, FullJson] + +Meta = Dict[str, FullJson] + +Tags = Dict[str, NoListJson] + +Flags = Dict[str, bool] + +Hashes = Dict[str, StringJson] + + +class Metadata(BaseModel): + flags: Optional[Flags] = None + meta: Optional[Meta] = None + tags: Optional[Tags] = None + + +class Windowing(BaseModel): + next: Optional[UUID] = None + start: Optional[datetime] = None + stop: Optional[datetime] = None + limit: Optional[int] = None + order: Optional[Literal["ascending", "descending"]] = None + + +class Lifecycle(BaseModel): + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + deleted_at: Optional[datetime] = None + + created_by_id: Optional[UUID] = None + updated_by_id: Optional[UUID] = None + deleted_by_id: Optional[UUID] = None + + +class TraceID(BaseModel): + trace_id: Optional[str] = None + + +class SpanID(BaseModel): + span_id: Optional[str] = None + + +class Identifier(BaseModel): + id: Optional[UUID] = None + + +class Slug(BaseModel): + slug: Optional[str] = None + + @field_validator("slug") + def check_url_safety(cls, v): # pylint: disable=no-self-argument + if v is not None: + if not match(r"^[a-zA-Z0-9_-]+$", v): + raise ValueError("slug must be URL-safe.") + return v + + +class Version(BaseModel): + version: Optional[str] = None + + +class Header(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + + +class Reference(Identifier, Slug, Version): + pass + + +class Link(TraceID, SpanID): + pass + + +def sync_alias(primary: str, alias: str, instance: BaseModel) -> None: + primary_val = getattr(instance, primary) + alias_val = getattr(instance, alias) + if primary_val and alias_val is None: + object.__setattr__(instance, alias, primary_val) + elif alias_val and primary_val is None: + object.__setattr__(instance, primary, alias_val) + + +class AliasConfig(BaseModel): + model_config = { + "populate_by_name": True, + "from_attributes": True, + } + + +# LEGACY ----------------------------------------------------------------------- + + +Metrics = Dict[str, NumericJson] + class LegacyLifecycleDTO(BaseModel): created_at: Optional[str] = None diff --git a/api/oss/src/core/testcases/service.py b/api/oss/src/core/testcases/service.py index 3afd298dd4..3d7b24d982 100644 --- a/api/oss/src/core/testcases/service.py +++ b/api/oss/src/core/testcases/service.py @@ -4,7 +4,7 @@ from oss.src.utils.logging import get_module_logger from oss.src.core.blobs.interfaces import BlobsDAOInterface -from oss.src.core.blobs.dtos import BlobCreate, BlobQuery, Windowing +from oss.src.core.blobs.dtos import BlobCreate, BlobQuery from oss.src.core.testcases.dtos import Testcase log = get_module_logger(__name__) @@ -14,11 +14,11 @@ class TestcasesService: def __init__( self, *, - testcases_dao: BlobsDAOInterface, + blobs_dao: BlobsDAOInterface, ): - self.testcases_dao = testcases_dao + self.blobs_dao = blobs_dao - async def create_testcases( + async def add_testcases( self, *, project_id: UUID, @@ -33,7 +33,7 @@ async def create_testcases( for testcase in testcases ] - blobs = await self.testcases_dao.add_blobs( + blobs = await self.blobs_dao.add_blobs( project_id=project_id, user_id=user_id, # @@ -61,7 +61,7 @@ async def fetch_testcases( # testset_id: Optional[UUID] = None, # - windowing: Optional[Windowing] = None, + windowing: Optional[bool] = False, ) -> List[Testcase]: _blob_query = ( BlobQuery( @@ -72,7 +72,7 @@ async def fetch_testcases( else BlobQuery() ) - blobs = await self.testcases_dao.query_blobs( + blobs = await self.blobs_dao.query_blobs( project_id=project_id, # blob_query=_blob_query, diff --git a/api/oss/src/core/testsets/dtos.py b/api/oss/src/core/testsets/dtos.py index df0915f2b2..3e44ca7ad2 100644 --- a/api/oss/src/core/testsets/dtos.py +++ b/api/oss/src/core/testsets/dtos.py @@ -3,17 +3,8 @@ from pydantic import BaseModel, Field -from oss.src.core.shared.dtos import ( - sync_alias, - AliasConfig, -) -from oss.src.core.shared.dtos import ( - Identifier, - Slug, - Lifecycle, - Header, - Metadata, -) +# from oss.src.core.shared.dtos import Link +from oss.src.core.shared.dtos import sync_alias, AliasConfig from oss.src.core.git.dtos import ( Artifact, ArtifactCreate, @@ -26,15 +17,13 @@ VariantQuery, # Revision, - RevisionsLog, RevisionCreate, RevisionEdit, RevisionQuery, RevisionCommit, ) -from oss.src.core.testcases.dtos import ( - Testcase, -) + +from oss.src.core.testcases.dtos import Testcase class TestsetIdAlias(AliasConfig): @@ -64,18 +53,6 @@ class TestsetRevisionIdAlias(AliasConfig): ) -class TestsetLog( - RevisionsLog, - TestsetVariantIdAlias, - TestsetRevisionIdAlias, -): - testset_variant_id: Optional[UUID] = None - - def model_post_init(self, _context) -> None: - sync_alias("testset_variant_id", "variant_id", self) - sync_alias("testset_revision_id", "revision_id", self) - - class TestsetFlags(BaseModel): has_testcases: Optional[bool] = None has_traces: Optional[bool] = None @@ -180,25 +157,3 @@ class TestsetRevisionCommit( def model_post_init(self, __context) -> None: sync_alias("testset_id", "artifact_id", self) sync_alias("testset_variant_id", "variant_id", self) - - -class SimpleTestset(Identifier, Slug, Lifecycle, Header, Metadata): - flags: Optional[TestsetFlags] = None # type: ignore - - data: Optional[TestsetRevisionData] = None - - -class SimpleTestsetCreate(Slug, Header, Metadata): - flags: Optional[TestsetFlags] = None # type: ignore - - data: Optional[TestsetRevisionData] = None - - -class SimpleTestsetEdit(Identifier, Header, Metadata): - flags: Optional[TestsetFlags] = None # type: ignore - - data: Optional[TestsetRevisionData] = None - - -class SimpleTestsetQuery(Metadata): - flags: Optional[TestsetFlags] = None # type: ignore diff --git a/api/oss/src/core/testsets/service.py b/api/oss/src/core/testsets/service.py index 0d34def73d..01abb6c7d0 100644 --- a/api/oss/src/core/testsets/service.py +++ b/api/oss/src/core/testsets/service.py @@ -1,5 +1,5 @@ from typing import Optional, List -from uuid import UUID, uuid4 +from uuid import UUID from oss.src.utils.logging import get_module_logger from oss.src.core.git.interfaces import GitDAOInterface @@ -20,24 +20,11 @@ RevisionQuery, RevisionCommit, ) -from oss.src.models.db_models import TestsetDB -from oss.src.core.testcases.dtos import Testcase -from oss.src.services.db_manager import fetch_testset_by_id -from oss.src.utils.helpers import get_slug_from_name_and_id -from oss.src.apis.fastapi.testsets.models import ( - SimpleTestset, - SimpleTestsetCreate, - SimpleTestsetEdit, - # - SimpleTestsetCreateRequest, - SimpleTestsetEditRequest, -) from oss.src.core.testsets.dtos import ( Testset, TestsetCreate, TestsetEdit, TestsetQuery, - TestsetLog, # TestsetVariant, TestsetVariantCreate, @@ -45,22 +32,11 @@ TestsetVariantQuery, # TestsetRevision, - TestsetRevisionData, TestsetRevisionCreate, TestsetRevisionEdit, TestsetRevisionQuery, TestsetRevisionCommit, ) -from oss.src.apis.fastapi.testsets.utils import ( - csv_file_to_json_array, - json_file_to_json_array, - json_array_to_json_object, - json_array_to_csv_file, - json_array_to_json_file, - validate_testset_limits, - TESTSETS_SIZE_EXCEPTION, - TESTSETS_SIZE_LIMIT, -) log = get_module_logger(__name__) @@ -87,17 +63,15 @@ async def create_testset( # testset_id: Optional[UUID] = None, ) -> Optional[Testset]: - artifact_create = ArtifactCreate( - **testset_create.model_dump( - mode="json", - ), + _artifact_create = ArtifactCreate( + **testset_create.model_dump(mode="json"), ) artifact = await self.testsets_dao.create_artifact( project_id=project_id, user_id=user_id, # - artifact_create=artifact_create, + artifact_create=_artifact_create, # artifact_id=testset_id, ) @@ -105,13 +79,11 @@ async def create_testset( if not artifact: return None - testset = Testset( - **artifact.model_dump( - mode="json", - ), + _testset = Testset( + **artifact.model_dump(mode="json"), ) - return testset + return _testset async def fetch_testset( self, @@ -129,13 +101,11 @@ async def fetch_testset( if not artifact: return None - testset = Testset( - **artifact.model_dump( - mode="json", - ), + _testset = Testset( + **artifact.model_dump(mode="json"), ) - return testset + return _testset async def edit_testset( self, @@ -145,29 +115,25 @@ async def edit_testset( # testset_edit: TestsetEdit, ) -> Optional[Testset]: - artifact_edit = ArtifactEdit( - **testset_edit.model_dump( - mode="json", - ), + _artifact_edit = ArtifactEdit( + **testset_edit.model_dump(mode="json"), ) artifact = await self.testsets_dao.edit_artifact( project_id=project_id, user_id=user_id, # - artifact_edit=artifact_edit, + artifact_edit=_artifact_edit, ) if not artifact: return None - testset = Testset( - **artifact.model_dump( - mode="json", - ), + _testset = Testset( + **artifact.model_dump(mode="json"), ) - return testset + return _testset async def archive_testset( self, @@ -187,13 +153,11 @@ async def archive_testset( if not artifact: return None - testset = Testset( - **artifact.model_dump( - mode="json", - ), + _testset = Testset( + **artifact.model_dump(mode="json"), ) - return testset + return _testset async def unarchive_testset( self, @@ -213,20 +177,18 @@ async def unarchive_testset( if not artifact: return None - testset = Testset( - **artifact.model_dump( - mode="json", - ), + _testset = Testset( + **artifact.model_dump(mode="json"), ) - return testset + return _testset async def query_testsets( self, *, project_id: UUID, # - testset_query: Optional[TestsetQuery] = None, + testset_query: TestsetQuery, # testset_refs: Optional[List[Reference]] = None, # @@ -234,11 +196,9 @@ async def query_testsets( # windowing: Optional[Windowing] = None, ) -> List[Testset]: - artifact_query = ( + _artifact_query = ( ArtifactQuery( - **testset_query.model_dump( - mode="json", - ), + **testset_query.model_dump(mode="json"), ) if testset_query else ArtifactQuery() @@ -247,7 +207,7 @@ async def query_testsets( artifacts = await self.testsets_dao.query_artifacts( project_id=project_id, # - artifact_query=artifact_query, + artifact_query=_artifact_query, # artifact_refs=testset_refs, # @@ -256,16 +216,14 @@ async def query_testsets( windowing=windowing, ) - testsets = [ + _testsets = [ Testset( - **artifact.model_dump( - mode="json", - ), + **artifact.model_dump(mode="json"), ) for artifact in artifacts ] - return testsets + return _testsets ## ------------------------------------------------------------------------- @@ -279,29 +237,25 @@ async def create_testset_variant( # testset_variant_create: TestsetVariantCreate, ) -> Optional[TestsetVariant]: - variant_create = VariantCreate( - **testset_variant_create.model_dump( - mode="json", - ), + _variant_create = VariantCreate( + **testset_variant_create.model_dump(mode="json"), ) variant = await self.testsets_dao.create_variant( project_id=project_id, user_id=user_id, # - variant_create=variant_create, + variant_create=_variant_create, ) if not variant: return None - testset_variant = TestsetVariant( - **variant.model_dump( - mode="json", - ), + _testset_variant = TestsetVariant( + **variant.model_dump(mode="json"), ) - return testset_variant + return _testset_variant async def fetch_testset_variant( self, @@ -321,13 +275,11 @@ async def fetch_testset_variant( if not variant: return None - testset_variant = TestsetVariant( - **variant.model_dump( - mode="json", - ), + _testset_variant = TestsetVariant( + **variant.model_dump(mode="json"), ) - return testset_variant + return _testset_variant async def edit_testset_variant( self, @@ -337,29 +289,25 @@ async def edit_testset_variant( # testset_variant_edit: TestsetVariantEdit, ) -> Optional[TestsetVariant]: - variant_edit = VariantEdit( - **testset_variant_edit.model_dump( - mode="json", - ), + _variant_edit = VariantEdit( + **testset_variant_edit.model_dump(mode="json"), ) variant = await self.testsets_dao.edit_variant( project_id=project_id, user_id=user_id, # - variant_edit=variant_edit, + variant_edit=_variant_edit, ) if not variant: return None - testset_variant = TestsetVariant( - **variant.model_dump( - mode="json", - ), + _testset_variant = TestsetVariant( + **variant.model_dump(mode="json"), ) - return testset_variant + return _testset_variant async def archive_testset_variant( self, @@ -379,13 +327,11 @@ async def archive_testset_variant( if not variant: return None - testset_variant = TestsetVariant( - **variant.model_dump( - mode="json", - ), + _testset_variant = TestsetVariant( + **variant.model_dump(mode="json"), ) - return testset_variant + return _testset_variant async def unarchive_testset_variant( self, @@ -405,55 +351,45 @@ async def unarchive_testset_variant( if not variant: return None - testset_variant = TestsetVariant( - **variant.model_dump( - mode="json", - ), + _testset_variant = TestsetVariant( + **variant.model_dump(mode="json"), ) - return testset_variant + return _testset_variant async def query_variants( self, *, project_id: UUID, # - testset_variant_query: Optional[TestsetVariantQuery] = None, + testset_variant_query: TestsetVariantQuery, # include_archived: Optional[bool] = None, # windowing: Optional[Windowing] = None, ) -> List[TestsetVariant]: - variant_query = ( - VariantQuery( - **testset_variant_query.model_dump( - mode="json", - ), - ) - if testset_variant_query - else VariantQuery() + _testset_variant_query = VariantQuery( + **testset_variant_query.model_dump(mode="json"), ) variants = await self.testsets_dao.query_variants( project_id=project_id, # - variant_query=variant_query, + variant_query=_testset_variant_query, # include_archived=include_archived, # windowing=windowing, ) - testset_variants = [ + _testset_variants = [ TestsetVariant( - **variant.model_dump( - mode="json", - ), + **variant.model_dump(mode="json"), ) for variant in variants ] - return testset_variants + return _testset_variants ## ------------------------------------------------------------------------- @@ -467,78 +403,41 @@ async def create_testset_revision( # testset_revision_create: TestsetRevisionCreate, ) -> Optional[TestsetRevision]: - revision_create = RevisionCreate( - **testset_revision_create.model_dump( - mode="json", - ), + _revision_create = RevisionCreate( + **testset_revision_create.model_dump(mode="json"), ) revision = await self.testsets_dao.create_revision( project_id=project_id, user_id=user_id, # - revision_create=revision_create, + revision_create=_revision_create, ) if not revision: return None - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - if testset_revision.data and testset_revision.data.testcase_ids: - testset_revision.data.testcases = await self.testcases_service.fetch_testcases( + if _testset_revision.data and _testset_revision.data.testcase_ids: + _testset_revision.data.testcases = await self.testcases_service.fetch_testcases( project_id=project_id, # - testcase_ids=testset_revision.data.testcase_ids, + testcase_ids=_testset_revision.data.testcase_ids, ) - return testset_revision + return _testset_revision async def fetch_testset_revision( self, *, project_id: UUID, # - testset_ref: Optional[Reference] = None, testset_variant_ref: Optional[Reference] = None, testset_revision_ref: Optional[Reference] = None, ) -> Optional[TestsetRevision]: - if not testset_ref and not testset_variant_ref and not testset_revision_ref: - return None - - if testset_ref and not testset_variant_ref and not testset_revision_ref: - testset = await self.fetch_testset( - project_id=project_id, - # - testset_ref=testset_ref, - ) - - if not testset: - return None - - testset_ref = Reference( - id=testset.id, - slug=testset.slug, - ) - - testset_variant = await self.fetch_testset_variant( - project_id=project_id, - # - testset_ref=testset_ref, - ) - - if not testset_variant: - return None - - testset_variant_ref = Reference( - id=testset_variant.id, - slug=testset_variant.slug, - ) - revision = await self.testsets_dao.fetch_revision( project_id=project_id, # @@ -549,20 +448,18 @@ async def fetch_testset_revision( if not revision: return None - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - if testset_revision.data and testset_revision.data.testcase_ids: - testset_revision.data.testcases = await self.testcases_service.fetch_testcases( + if _testset_revision.data and _testset_revision.data.testcase_ids: + _testset_revision.data.testcases = await self.testcases_service.fetch_testcases( project_id=project_id, # - testcase_ids=testset_revision.data.testcase_ids, + testcase_ids=_testset_revision.data.testcase_ids, ) - return testset_revision + return _testset_revision async def edit_testset_revision( self, @@ -572,36 +469,32 @@ async def edit_testset_revision( # testset_revision_edit: TestsetRevisionEdit, ) -> Optional[TestsetRevision]: - revision_edit = TestsetRevisionEdit( - **testset_revision_edit.model_dump( - mode="json", - ), + _revision_edit = TestsetRevisionEdit( + **testset_revision_edit.model_dump(mode="json"), ) revision = await self.testsets_dao.edit_revision( project_id=project_id, user_id=user_id, # - revision_edit=revision_edit, + revision_edit=_revision_edit, ) if not revision: return None - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - if testset_revision.data and testset_revision.data.testcase_ids: - testset_revision.data.testcases = await self.testcases_service.fetch_testcases( + if _testset_revision.data and _testset_revision.data.testcase_ids: + _testset_revision.data.testcases = await self.testcases_service.fetch_testcases( project_id=project_id, # - testcase_ids=testset_revision.data.testcase_ids, + testcase_ids=_testset_revision.data.testcase_ids, ) - return testset_revision + return _testset_revision async def archive_testset_revision( self, @@ -621,13 +514,11 @@ async def archive_testset_revision( if not revision: return None - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - return testset_revision + return _testset_revision async def unarchive_testset_revision( self, @@ -647,59 +538,49 @@ async def unarchive_testset_revision( if not revision: return None - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - return testset_revision + return _testset_revision async def query_testset_revisions( self, *, project_id: UUID, # - testset_revision_query: Optional[TestsetRevisionQuery], + testset_revision_query: TestsetRevisionQuery, ) -> List[TestsetRevision]: - revision_query = ( - RevisionQuery( - **testset_revision_query.model_dump( - mode="json", - ), - ) - if testset_revision_query - else RevisionQuery() + _revision_query = RevisionQuery( + **testset_revision_query.model_dump(mode="json"), ) revisions = await self.testsets_dao.query_revisions( project_id=project_id, # - revision_query=revision_query, + revision_query=_revision_query, ) if not revisions: return [] - testset_revisions = [] + _testset_revisions = [] for revision in revisions: - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - if testset_revision.data and testset_revision.data.testcase_ids: - testset_revision.data.testcases = await self.testcases_service.fetch_testcases( + if _testset_revision.data and _testset_revision.data.testcase_ids: + _testset_revision.data.testcases = await self.testcases_service.fetch_testcases( project_id=project_id, # - testcase_ids=testset_revision.data.testcase_ids, + testcase_ids=_testset_revision.data.testcase_ids, ) - testset_revisions.append(testset_revision) + _testset_revisions.append(_testset_revision) - return testset_revisions + return _testset_revisions ## ......................................................................... @@ -716,7 +597,7 @@ async def commit_testset_revision( for testcase in testset_revision_commit.data.testcases: testcase.set_id = testset_revision_commit.testset_id - testcases = await self.testcases_service.create_testcases( + testcases = await self.testcases_service.add_testcases( project_id=project_id, user_id=user_id, # @@ -729,7 +610,7 @@ async def commit_testset_revision( testset_revision_commit.data.testcases = None - revision_commit = RevisionCommit( + _revision_commit = RevisionCommit( **testset_revision_commit.model_dump(mode="json", exclude_none=True), ) @@ -737,535 +618,61 @@ async def commit_testset_revision( project_id=project_id, user_id=user_id, # - revision_commit=revision_commit, + revision_commit=_revision_commit, ) if not revision: return None - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - if testset_revision.data and testset_revision.data.testcase_ids: - testset_revision.data.testcases = await self.testcases_service.fetch_testcases( + if _testset_revision.data and _testset_revision.data.testcase_ids: + _testset_revision.data.testcases = await self.testcases_service.fetch_testcases( project_id=project_id, # - testcase_ids=testset_revision.data.testcase_ids, + testcase_ids=_testset_revision.data.testcase_ids, ) - return testset_revision + return _testset_revision async def log_testset_revisions( self, *, project_id: UUID, # - testset_log: TestsetLog, + testset_variant_ref: Optional[Reference] = None, + testset_revision_ref: Optional[Reference] = None, depth: Optional[int] = None, ) -> List[TestsetRevision]: revisions = await self.testsets_dao.log_revisions( project_id=project_id, # - revisions_log=testset_log, + variant_ref=testset_variant_ref, + revision_ref=testset_revision_ref, + depth=depth, ) if not revisions: return [] - testset_revisions = [] + _testset_revisions = [] for revision in revisions: - testset_revision = TestsetRevision( - **revision.model_dump( - mode="json", - ), + _testset_revision = TestsetRevision( + **revision.model_dump(mode="json"), ) - if testset_revision.data and testset_revision.data.testcase_ids: - testset_revision.data.testcases = await self.testcases_service.fetch_testcases( + if _testset_revision.data and _testset_revision.data.testcase_ids: + _testset_revision.data.testcases = await self.testcases_service.fetch_testcases( project_id=project_id, # - testcase_ids=testset_revision.data.testcase_ids, + testcase_ids=_testset_revision.data.testcase_ids, ) - testset_revisions.append(testset_revision) + _testset_revisions.append(_testset_revision) - return testset_revisions + return _testset_revisions ## ------------------------------------------------------------------------- - - -class SimpleTestsetsService: - def __init__( - self, - *, - testsets_service: TestsetsService, - ): - self.testsets_service = testsets_service - - async def create( - self, - *, - project_id: UUID, - user_id: UUID, - # - simple_testset_create_request: SimpleTestsetCreateRequest, - # - testset_id: Optional[UUID] = None, - ): - try: - testcases = simple_testset_create_request.testset.data.testcases - - testcases_data = [testcase.data for testcase in testcases] - - testcases_data = json_array_to_json_object( - data=testcases_data, - ) - - validate_testset_limits(testcases_data) - - for i, testcase_data in enumerate(testcases_data.values()): - simple_testset_create_request.testset.data.testcases[ - i - ].data = testcase_data - - except Exception as e: - return None - - try: - testset_revision_data = TestsetRevisionData( - testcases=simple_testset_create_request.testset.data.testcases, - ) - - except Exception as e: - return None - - testset_create = TestsetCreate( - slug=simple_testset_create_request.testset.slug, - # - name=simple_testset_create_request.testset.name, - description=simple_testset_create_request.testset.description, - # - # flags = - tags=simple_testset_create_request.testset.tags, - meta=simple_testset_create_request.testset.meta, - ) - - testset: Optional[Testset] = await self.testsets_service.create_testset( - project_id=project_id, - user_id=user_id, - # - testset_create=testset_create, - # - testset_id=testset_id, - ) - - if testset is None: - return None - - testset_variant_slug = uuid4().hex[-12:] - - testset_variant_create = TestsetVariantCreate( - slug=testset_variant_slug, - # - name=simple_testset_create_request.testset.name, - description=simple_testset_create_request.testset.description, - # - # flags = - tags=simple_testset_create_request.testset.tags, - meta=simple_testset_create_request.testset.meta, - # - testset_id=testset.id, - ) - - testset_variant: Optional[ - TestsetVariant - ] = await self.testsets_service.create_testset_variant( - project_id=project_id, - user_id=user_id, - # - testset_variant_create=testset_variant_create, - ) - - if testset_variant is None: - return None - - testset_revision_slug = uuid4().hex[-12:] - - testset_revision_create = TestsetRevisionCreate( - slug=testset_revision_slug, - # - name=simple_testset_create_request.testset.name, - description=simple_testset_create_request.testset.description, - # - # flags = - tags=simple_testset_create_request.testset.tags, - meta=simple_testset_create_request.testset.meta, - # - testset_id=testset.id, - testset_variant_id=testset_variant.id, - ) - - testset_revision: Optional[ - TestsetRevision - ] = await self.testsets_service.create_testset_revision( - project_id=project_id, - user_id=user_id, - # - testset_revision_create=testset_revision_create, - ) - - if testset_revision is None: - return None - - testset_revision_slug = uuid4().hex[-12:] - - testset_revision_commit = TestsetRevisionCommit( - slug=testset_revision_slug, - # - name=simple_testset_create_request.testset.name, - description=simple_testset_create_request.testset.description, - # - # flags = - tags=simple_testset_create_request.testset.tags, - meta=simple_testset_create_request.testset.meta, - # - data=testset_revision_data, - # - testset_id=testset.id, - testset_variant_id=testset_variant.id, - ) - - testset_revision = await self.testsets_service.commit_testset_revision( - project_id=project_id, - user_id=user_id, - # - testset_revision_commit=testset_revision_commit, - ) - - if testset_revision is None: - return None - - simple_testset = SimpleTestset( - id=testset.id, - slug=testset.slug, - # - created_at=testset.created_at, - updated_at=testset.updated_at, - deleted_at=testset.deleted_at, - created_by_id=testset.created_by_id, - updated_by_id=testset.updated_by_id, - deleted_by_id=testset.deleted_by_id, - # - name=testset.name, - description=testset.description, - # - # flags = - tags=testset.tags, - meta=testset.meta, - # - data=testset_revision.data, - ) - - return simple_testset - - async def edit( - self, - *, - project_id: UUID, - user_id: UUID, - # - simple_testset_edit_request: SimpleTestsetEditRequest, - ) -> Optional[SimpleTestset]: - try: - testcases = simple_testset_edit_request.testset.data.testcases - - testcases_data = [testcase.data for testcase in testcases] - - testcases_data = json_array_to_json_object( - data=testcases_data, - ) - - validate_testset_limits(testcases_data) - - for i, testcase_data in enumerate(testcases_data.values()): - simple_testset_edit_request.testset.data.testcases[ - i - ].data = testcase_data - - except Exception as e: - return None - - try: - testset_revision_data = TestsetRevisionData( - testcases=testcases, - ) - - except Exception as e: - return None - - testset_ref = Reference( - id=simple_testset_edit_request.testset.id, - ) - - testset: Optional[Testset] = await self.testsets_service.fetch_testset( - project_id=project_id, - # - testset_ref=testset_ref, - ) - - if testset is None: - return None - - has_changes = ( - testset.name != simple_testset_edit_request.testset.name - or testset.description != simple_testset_edit_request.testset.description - or testset.tags != simple_testset_edit_request.testset.tags - or testset.meta != simple_testset_edit_request.testset.meta - ) - - if has_changes: - testset_edit = TestsetEdit( - id=testset.id, - # - name=simple_testset_edit_request.testset.name, - description=simple_testset_edit_request.testset.description, - # - # flags = - tags=simple_testset_edit_request.testset.tags, - meta=simple_testset_edit_request.testset.meta, - ) - - testset: Optional[Testset] = await self.testsets_service.edit_testset( # type: ignore - project_id=project_id, - user_id=user_id, - # - testset_edit=testset_edit, - ) - - if testset is None: - return None - - testset_variant: Optional[ - TestsetVariant - ] = await self.testsets_service.fetch_testset_variant( - project_id=project_id, - # - testset_ref=testset_ref, - ) - - if testset_variant is None: - return None - - has_changes = ( - testset_variant.name != simple_testset_edit_request.testset.name - or testset_variant.description - != simple_testset_edit_request.testset.description - or testset_variant.tags != simple_testset_edit_request.testset.tags - or testset_variant.meta != simple_testset_edit_request.testset.meta - ) - - if has_changes: - testset_variant_edit = TestsetVariant( - id=testset_variant.id, - # - name=simple_testset_edit_request.testset.name, - description=simple_testset_edit_request.testset.description, - # - # flags = - tags=simple_testset_edit_request.testset.tags, - meta=simple_testset_edit_request.testset.meta, - ) - - testset_variant: Optional[TestsetVariant] = ( # type: ignore - await self.testsets_service.edit_testset_variant( - project_id=project_id, - user_id=user_id, - # - testset_variant_edit=testset_variant_edit, - ) - ) - - if testset_variant is None: - return None - - testset_variant_ref = Reference( - id=testset_variant.id, - ) - - testset_revision: Optional[ - TestsetRevision - ] = await self.testsets_service.fetch_testset_revision( - project_id=project_id, - # - testset_variant_ref=testset_variant_ref, - ) - - if testset_revision is None: - return None - - old_testcase_ids = [ - testcase.data for testcase in testset_revision.data.testcases - ] - - new_testcase_ids = [ - testcase.data - for testcase in simple_testset_edit_request.testset.data.testcases - ] - - has_changes = ( - testset_revision.name != simple_testset_edit_request.testset.name - or testset_revision.description - != simple_testset_edit_request.testset.description - or testset_revision.tags != simple_testset_edit_request.testset.tags - or testset_revision.meta != simple_testset_edit_request.testset.meta - or old_testcase_ids != new_testcase_ids - ) - - if has_changes: - testset_revision_slug = uuid4().hex[-12:] - - testset_revision_commit = TestsetRevisionCommit( - slug=testset_revision_slug, - # - name=simple_testset_edit_request.testset.name, - description=simple_testset_edit_request.testset.description, - # - # flags = - tags=simple_testset_edit_request.testset.tags, - meta=simple_testset_edit_request.testset.meta, - # - data=testset_revision_data, - # - testset_id=testset.id, - testset_variant_id=testset_variant.id, - ) - - testset_revision: Optional[TestsetRevision] = ( # type: ignore - await self.testsets_service.commit_testset_revision( - project_id=project_id, - user_id=user_id, - # - testset_revision_commit=testset_revision_commit, - ) - ) - - if testset_revision is None: - return None - - simple_testset = SimpleTestset( - id=testset.id, - slug=testset.slug, - # - created_at=testset.created_at, - updated_at=testset.updated_at, - deleted_at=testset.deleted_at, - created_by_id=testset.created_by_id, - updated_by_id=testset.updated_by_id, - deleted_by_id=testset.deleted_by_id, - # - name=testset.name, - description=testset.description, - # - # flags = - tags=testset.tags, - meta=testset.meta, - # - data=testset_revision.data, - ) - - return simple_testset - - async def transfer( - self, - *, - project_id: UUID, - user_id: UUID, - # - testset_id: UUID, - ): - old_testset = await fetch_testset_by_id( - project_id=str(project_id), - # - testset_id=str(testset_id), - ) - - if old_testset is None: - return None - - testset_revision_data = self._transfer_simple_testset_revision_data( - old_testset=old_testset, - ) - - new_testset = await self.testsets_service.fetch_testset( - project_id=project_id, - # - testset_ref=Reference(id=testset_id), - ) - - if not new_testset: - name = str(old_testset.name) - slug = get_slug_from_name_and_id( - name=name, - id=testset_id, - ) - - simple_testset_create_request = SimpleTestsetCreateRequest( - testset=SimpleTestsetCreate( - slug=slug, - name=name, - description=None, - # flags=None, - tags=None, - meta=None, - data=testset_revision_data, - ) - ) - - testset = await self.create( - project_id=project_id, - user_id=user_id, - # - simple_testset_create_request=simple_testset_create_request, - # - testset_id=testset_id, - ) - - else: - simple_testset_edit_request = SimpleTestsetEditRequest( - testset=SimpleTestsetEdit( - id=testset_id, - # - name=new_testset.name, - description=new_testset.description, - # - # flags=new_testset.flags, - tags=new_testset.tags, - meta=new_testset.meta, - # - data=testset_revision_data, - ) - ) - - testset = await self.edit( - project_id=project_id, - user_id=user_id, - # - simple_testset_edit_request=simple_testset_edit_request, - ) - - return testset - - def _transfer_simple_testset_revision_data( - self, - *, - old_testset: TestsetDB, - ) -> TestsetRevisionData: - return TestsetRevisionData( - testcases=[ - Testcase(data=testcase_data) for testcase_data in old_testset.csvdata - ], - ) diff --git a/api/oss/src/core/tracing/dtos.py b/api/oss/src/core/tracing/dtos.py index fa838cfa8d..57c517ec78 100644 --- a/api/oss/src/core/tracing/dtos.py +++ b/api/oss/src/core/tracing/dtos.py @@ -1,7 +1,9 @@ -from typing import List, Dict, Any, Union, Optional -from datetime import datetime, timezone -from uuid import uuid4 +import random +import string from enum import Enum +from uuid import UUID +from datetime import datetime, timezone +from typing import List, Dict, Any, Union, Optional from pydantic import BaseModel, model_validator, Field @@ -16,9 +18,6 @@ Data, Reference, Hashes, - Windowing, - FullJson, - Link, ) @@ -28,8 +27,7 @@ class TraceType(Enum): INVOCATION = "invocation" ANNOTATION = "annotation" - # - UNKNOWN = "unknown" + UNDEFINED = "undefined" class SpanType(Enum): @@ -44,8 +42,7 @@ class SpanType(Enum): COMPLETION = "completion" CHAT = "chat" RERANK = "rerank" - # - UNKNOWN = "unknown" + UNDEFINED = "undefined" class AgMetricEntryAttributes(BaseModel): @@ -72,8 +69,7 @@ class AgTypeAttributes(BaseModel): class AgDataAttributes(BaseModel): - parameters: Optional[Dict[str, Any]] = None - inputs: Optional[Any] = None + inputs: Optional[Dict[str, Any]] = None outputs: Optional[Any] = None internals: Optional[Dict[str, Any]] = None @@ -214,7 +210,9 @@ def set_defaults(self): self.start_time = now self.end_time = now if self.span_name is None: - self.span_name = uuid4().hex[-12:] + self.span_name = "".join( + random.choices(string.ascii_letters + string.digits, k=8) + ) return self @@ -233,9 +231,7 @@ class OTelSpan(OTelFlatSpan, OTelSpansTree): class Fields(str, Enum): TRACE_ID = "trace_id" - TRACE_TYPE = "trace_type" SPAN_ID = "span_id" - SPAN_TYPE = "span_type" PARENT_ID = "parent_id" SPAN_NAME = "span_name" SPAN_KIND = "span_kind" @@ -329,7 +325,7 @@ class Condition(BaseModel): class Filtering(BaseModel): - operator: LogicalOperator = LogicalOperator.AND + operator: Optional[LogicalOperator] = LogicalOperator.AND conditions: List[Union[Condition, "Filtering"]] = list() @@ -343,12 +339,19 @@ class Format(str, Enum): OPENTELEMETRY = "opentelemetry" +class Windowing(BaseModel): + oldest: Optional[datetime] = None + newest: Optional[datetime] = None + limit: Optional[int] = None + window: Optional[int] = None + + class Formatting(BaseModel): - focus: Optional[Focus] = None - format: Optional[Format] = None + focus: Optional[Focus] = Focus.SPAN + format: Optional[Format] = Format.AGENTA -class TracingQuery(BaseModel): +class Query(BaseModel): formatting: Optional[Formatting] = None windowing: Optional[Windowing] = None filtering: Optional[Filtering] = None @@ -383,128 +386,6 @@ def plus(self, other: "Analytics") -> "Analytics": class Bucket(BaseModel): timestamp: datetime - interval: int + window: int total: Analytics errors: Analytics - - -class MetricType(str, Enum): - NUMERIC_CONTINUOUS = "numeric/continuous" - NUMERIC_DISCRETE = "numeric/discrete" - BINARY = "binary" - CATEGORICAL_SINGLE = "categorical/single" - CATEGORICAL_MULTIPLE = "categorical/multiple" - STRING = "string" - JSON = "json" - NONE = "none" - WILDCARD = "*" - - -class MetricSpec(BaseModel): - type: MetricType = MetricType.NONE - path: str = "*" - # OPTS - bins: Optional[int] = None - vmin: Optional[float] = None - vmax: Optional[float] = None - edge: Optional[bool] = None - - -class MetricsBucket(BaseModel): - timestamp: datetime - interval: int - metrics: Optional[Dict[str, FullJson]] = None - - -# WORKFLOWS -------------------------------------------------------------------- - - -Trace = OTelSpansTree - - -# SIMPLE TRACE: INVOCATIONS & ANNOTATIONS -------------------------------------- - - -class SimpleTraceOrigin(str, Enum): - CUSTOM = "custom" # custom - HUMAN = "human" # human - AUTO = "auto" # automatic - - -class SimpleTraceKind(str, Enum): - ADHOC = "adhoc" # adhoc - EVAL = "eval" # evaluation - PLAY = "play" # playground - - -class SimpleTraceChannel(str, Enum): - OTLP = "otlp" # otlp - WEB = "web" # react - SDK = "sdk" # python vs typescript ? - API = "api" # http - - -class SimpleTraceReferences(BaseModel): - query: Optional[Reference] = None - query_variant: Optional[Reference] = None - query_revision: Optional[Reference] = None - testset: Optional[Reference] = None - testset_variant: Optional[Reference] = None - testset_revision: Optional[Reference] = None - application: Optional[Reference] = None - application_variant: Optional[Reference] = None - application_revision: Optional[Reference] = None - evaluator: Optional[Reference] = None - evaluator_variant: Optional[Reference] = None - evaluator_revision: Optional[Reference] = None - testcase: Optional[Reference] = None - - -SimpleTraceLinks = Union[Dict[str, Link], List[Link]] - - -class SimpleTrace(Link, Lifecycle): - origin: SimpleTraceOrigin = SimpleTraceOrigin.CUSTOM - kind: SimpleTraceKind = SimpleTraceKind.ADHOC - channel: SimpleTraceChannel = SimpleTraceChannel.API - - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - data: Data - - references: SimpleTraceReferences - links: SimpleTraceLinks - - -class SimpleTraceCreate(BaseModel): - origin: SimpleTraceOrigin = SimpleTraceOrigin.CUSTOM - kind: SimpleTraceKind = SimpleTraceKind.ADHOC - channel: SimpleTraceChannel = SimpleTraceChannel.API - - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - data: Data - - references: SimpleTraceReferences - links: SimpleTraceLinks - - -class SimpleTraceEdit(BaseModel): - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - data: Data - - -class SimpleTraceQuery(BaseModel): - origin: Optional[SimpleTraceOrigin] = None - kind: Optional[SimpleTraceKind] = None - channel: Optional[SimpleTraceChannel] = None - - tags: Optional[Tags] = None - meta: Optional[Meta] = None - - references: Optional[SimpleTraceReferences] = None - links: Optional[SimpleTraceLinks] = None diff --git a/api/oss/src/core/tracing/interfaces.py b/api/oss/src/core/tracing/interfaces.py index 05aeda2c63..0e22d05b5a 100644 --- a/api/oss/src/core/tracing/interfaces.py +++ b/api/oss/src/core/tracing/interfaces.py @@ -1,15 +1,8 @@ -from typing import List, Optional, Dict, Any from uuid import UUID +from typing import List, Optional from abc import ABC, abstractmethod -from oss.src.core.tracing.dtos import ( - OTelLink, - OTelFlatSpan, - TracingQuery, - Bucket, - MetricSpec, - MetricsBucket, -) +from oss.src.core.tracing.dtos import OTelLink, OTelFlatSpan, Query, Bucket class TracingDAOInterface(ABC): @@ -152,29 +145,18 @@ async def query( *, project_id: UUID, # - query: TracingQuery, + query: Query, ) -> List[OTelFlatSpan]: raise NotImplementedError ### ANALYTICS - @abstractmethod - async def legacy_analytics( - self, - *, - project_id: UUID, - # - query: TracingQuery, - ) -> List[Bucket]: - raise NotImplementedError - @abstractmethod async def analytics( self, *, project_id: UUID, # - query: TracingQuery, - specs: List[MetricSpec], - ) -> List[MetricsBucket]: + query: Query, + ) -> List[Bucket]: raise NotImplementedError diff --git a/api/oss/src/core/tracing/service.py b/api/oss/src/core/tracing/service.py index 193dda6a62..d9c1df0107 100644 --- a/api/oss/src/core/tracing/service.py +++ b/api/oss/src/core/tracing/service.py @@ -1,27 +1,12 @@ -from typing import List, Optional, Dict, Any +from typing import List, Optional from uuid import UUID from oss.src.utils.logging import get_module_logger from oss.src.core.tracing.interfaces import TracingDAOInterface +from oss.src.core.tracing.dtos import OTelLink, OTelFlatSpan, Query, Bucket from oss.src.core.tracing.utils import parse_query, parse_ingest -from oss.src.core.tracing.dtos import ( - OTelLink, - OTelFlatSpan, - TracingQuery, - Bucket, - MetricSpec, - MetricsBucket, -) - -from oss.src.core.tracing.utils import ( - parse_span_dtos_to_span_idx, - parse_span_idx_to_span_id_tree, - calculate_costs, - cumulate_costs, - cumulate_tokens, -) log = get_module_logger(__name__) @@ -43,18 +28,6 @@ async def create( span_dto: Optional[OTelFlatSpan] = None, span_dtos: Optional[List[OTelFlatSpan]] = None, ) -> List[OTelLink]: - span_idx = parse_span_dtos_to_span_idx( - [span_dto] if span_dto else span_dtos or [] - ) - - span_id_tree = parse_span_idx_to_span_id_tree(span_idx) - - calculate_costs(span_idx) - - cumulate_costs(span_id_tree, span_idx) - - cumulate_tokens(span_id_tree, span_idx) - if span_dto: link = await self.tracing_dao.create_span( project_id=project_id, @@ -209,7 +182,7 @@ async def query( *, project_id: UUID, # - query: TracingQuery, + query: Query, ) -> List[OTelFlatSpan]: parse_query(query) @@ -221,38 +194,19 @@ async def query( return span_dtos - async def legacy_analytics( - self, - *, - project_id: UUID, - # - query: TracingQuery, - ) -> List[Bucket]: - parse_query(query) - - bucket_dtos = await self.tracing_dao.legacy_analytics( - project_id=project_id, - # - query=query, - ) - - return bucket_dtos - async def analytics( self, *, project_id: UUID, # - query: TracingQuery, - specs: List[MetricSpec], - ) -> List[MetricsBucket]: + query: Query, + ) -> List[Bucket]: parse_query(query) bucket_dtos = await self.tracing_dao.analytics( project_id=project_id, # query=query, - specs=specs, ) return bucket_dtos diff --git a/api/oss/src/core/tracing/utils.py b/api/oss/src/core/tracing/utils.py index d62edb6ba9..15a6d91d87 100644 --- a/api/oss/src/core/tracing/utils.py +++ b/api/oss/src/core/tracing/utils.py @@ -1,32 +1,19 @@ -from typing import Dict, Union, Any, Optional, Tuple, List +from typing import Dict, Union, Any from uuid import UUID from datetime import datetime from collections import OrderedDict -from litellm import cost_calculator - - from oss.src.utils.logging import get_module_logger -from oss.src.core.shared.dtos import ( - Flags, - Tags, - Meta, - Data, - Reference, - Link, -) +from oss.src.core.shared.dtos import Reference, Link from oss.src.core.tracing.dtos import ( - Attributes, OTelSpanKind, OTelStatusCode, OTelSpan, - OTelReference, - OTelFlatSpan, OTelLink, OTelFlatSpans, - TracingQuery, + Query, FilteringException, Filtering, Condition, @@ -37,8 +24,6 @@ DictOperator, ExistenceOperator, Fields, - TraceType, - SpanType, _C_OPS, _N_OPS, _S_OPS, @@ -59,7 +44,7 @@ def unmarshall_attributes( marshalled: OTelAttributes, ) -> OTelAttributes: """ - Unmarshalls a dictionary of marshalled attributes into a nested dictionary + Unmarshals a dictionary of marshalled attributes into a nested dictionary Example: marshalled = { @@ -89,34 +74,42 @@ def unmarshall_attributes( for key, value in marshalled.items(): keys = key.split(".") - current = unmarshalled - for i, key in enumerate(keys): - is_last = i == len(keys) - 1 - next_key = keys[i + 1] if not is_last else None - is_index = key.isdigit() - key = int(key) if is_index else key + level = unmarshalled + + for i, part in enumerate(keys[:-1]): + if part.isdigit(): + part = int(part) + + if not isinstance(level, list): + level = [] + + while len(level) <= part: + level.append({}) + + level = level[part] - if is_last: - if isinstance(current, list) and isinstance(key, int): - while len(current) <= key: - current.append(None) - current[key] = value - elif isinstance(current, dict): - current[key] = value else: - next_is_index = next_key.isdigit() if next_key else False + if part not in level: + level[part] = {} if not keys[i + 1].isdigit() else [] - if isinstance(current, list) and isinstance(key, int): - while len(current) <= key: - current.append([] if next_is_index else {}) - if current[key] is None: - current[key] = [] if next_is_index else {} - current = current[key] - elif isinstance(current, dict): - if key not in current: - current[key] = [] if next_is_index else {} - current = current[key] + level = level[part] + + last_key = keys[-1] + + if last_key.isdigit(): + last_key = int(last_key) + + if not isinstance(level, list): + level = [] + + while len(level) <= last_key: + level.append(None) + + level[last_key] = value + + else: + level[last_key] = value return unmarshalled @@ -191,21 +184,13 @@ def unmarshall( # TREE -def parse_span_dtos_to_span_idx( - span_dtos: List[OTelFlatSpan], -) -> Dict[str, OTelFlatSpan]: - span_idx = {span.span_id: span for span in span_dtos} - - return span_idx - - def parse_span_idx_to_span_id_tree( - span_idx: Dict[str, OTelFlatSpan], + span_idx: Dict[str, OTelSpan], ) -> OrderedDict: span_id_tree = OrderedDict() index = {} - def push(span_dto: OTelFlatSpan) -> None: + def push(span_dto: OTelSpan) -> None: if span_dto.parent_id is None: span_id_tree[span_dto.span_id] = OrderedDict() index[span_dto.span_id] = span_id_tree[span_dto.span_id] @@ -255,361 +240,6 @@ def _connect_tree_dfs( parent_span.spans = None -def cumulate_costs( - spans_id_tree: OrderedDict, - spans_idx: Dict[str, OTelFlatSpan], -) -> None: - def _get_incremental(span: OTelFlatSpan): - _costs = { - "prompt": 0.0, - "completion": 0.0, - "total": 0.0, - } - - if span.attributes is None: - return _costs - - attr: dict = span.attributes - - return { - "prompt": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("costs", {}) - .get("incremental", {}) - .get("prompt", 0.0) - ), - "completion": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("costs", {}) - .get("incremental", {}) - .get("completion", 0.0) - ), - "total": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("costs", {}) - .get("incremental", {}) - .get("total", 0.0) - ), - } - - def _get_cumulative(span: OTelFlatSpan): - _costs = { - "prompt": 0.0, - "completion": 0.0, - "total": 0.0, - } - - if span.attributes is None: - return _costs - - attr: dict = span.attributes - - return { - "prompt": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("costs", {}) - .get("cumulative", {}) - .get("prompt", 0.0) - ), - "completion": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("costs", {}) - .get("cumulative", {}) - .get("completion", 0.0) - ), - "total": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("costs", {}) - .get("cumulative", {}) - .get("total", 0.0) - ), - } - - def _accumulate(a: dict, b: dict): - return { - "prompt": a.get("prompt", 0.0) + b.get("prompt", 0.0), - "completion": a.get("completion", 0.0) + b.get("completion", 0.0), - "total": a.get("total", 0.0) + b.get("total", 0.0), - } - - def _set_cumulative(span: OTelFlatSpan, costs: dict): - if span.attributes is None: - span.attributes = {} - - if ( - costs.get("prompt", 0.0) != 0.0 - or costs.get("completion", 0.0) != 0.0 - or costs.get("total", 0.0) != 0.0 - ): - if "ag" not in span.attributes or not isinstance( - span.attributes["ag"], - dict, - ): - span.attributes["ag"] = {} - - if "metrics" not in span.attributes["ag"] or not isinstance( - span.attributes["ag"]["metrics"], - dict, - ): - span.attributes["ag"]["metrics"] = {} - - if "costs" not in span.attributes["ag"]["metrics"] or not isinstance( - span.attributes["ag"]["metrics"]["costs"], - dict, - ): - span.attributes["ag"]["metrics"]["costs"] = {} - - span.attributes["ag"]["metrics"]["costs"]["cumulative"] = costs - - _cumulate_tree_dfs( - spans_id_tree, - spans_idx, - _get_incremental, - _get_cumulative, - _accumulate, - _set_cumulative, - ) - - -def cumulate_tokens( - spans_id_tree: OrderedDict, - spans_idx: Dict[str, OTelFlatSpan], -) -> None: - def _get_incremental(span: OTelFlatSpan): - _tokens = { - "prompt": 0.0, - "completion": 0.0, - "total": 0.0, - } - - if span.attributes is None: - return _tokens - - attr: dict = span.attributes - - return { - "prompt": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("incremental", {}) - .get("prompt", 0.0) - ), - "completion": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("incremental", {}) - .get("completion", 0.0) - ), - "total": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("incremental", {}) - .get("total", 0.0) - ), - } - - def _get_cumulative(span: OTelFlatSpan): - _tokens = { - "prompt": 0.0, - "completion": 0.0, - "total": 0.0, - } - - if span.attributes is None: - return _tokens - - attr: dict = span.attributes - - return { - "prompt": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("cumulative", {}) - .get("prompt", 0.0) - ), - "completion": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("cumulative", {}) - .get("completion", 0.0) - ), - "total": ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("cumulative", {}) - .get("total", 0.0) - ), - } - - def _accumulate(a: dict, b: dict): - return { - "prompt": a.get("prompt", 0.0) + b.get("prompt", 0.0), - "completion": a.get("completion", 0.0) + b.get("completion", 0.0), - "total": a.get("total", 0.0) + b.get("total", 0.0), - } - - def _set_cumulative(span: OTelFlatSpan, tokens: dict): - if span.attributes is None: - span.attributes = {} - - if ( - tokens.get("prompt", 0.0) != 0.0 - or tokens.get("completion", 0.0) != 0.0 - or tokens.get("total", 0.0) != 0.0 - ): - if "ag" not in span.attributes or not isinstance( - span.attributes["ag"], - dict, - ): - span.attributes["ag"] = {} - - if "metrics" not in span.attributes["ag"] or not isinstance( - span.attributes["ag"]["metrics"], - dict, - ): - span.attributes["ag"]["metrics"] = {} - - if "tokens" not in span.attributes["ag"]["metrics"] or not isinstance( - span.attributes["ag"]["metrics"]["tokens"], - dict, - ): - span.attributes["ag"]["metrics"]["tokens"] = {} - - span.attributes["ag"]["metrics"]["tokens"]["cumulative"] = tokens - - _cumulate_tree_dfs( - spans_id_tree, - spans_idx, - _get_incremental, - _get_cumulative, - _accumulate, - _set_cumulative, - ) - - -def _cumulate_tree_dfs( - spans_id_tree: OrderedDict, - spans_idx: Dict[str, OTelFlatSpan], - get_incremental, - get_cumulative, - accumulate, - set_cumulative, -): - for span_id, children_spans_id_tree in spans_id_tree.items(): - children_spans_id_tree: OrderedDict - - cumulated_metric = get_incremental(spans_idx[span_id]) - - _cumulate_tree_dfs( - children_spans_id_tree, - spans_idx, - get_incremental, - get_cumulative, - accumulate, - set_cumulative, - ) - - for child_span_id in children_spans_id_tree.keys(): - marginal_metric = get_cumulative(spans_idx[child_span_id]) - cumulated_metric = accumulate(cumulated_metric, marginal_metric) - - set_cumulative(spans_idx[span_id], cumulated_metric) - - -TYPES_WITH_COSTS = [ - "embedding", - "query", - "completion", - "chat", - "rerank", -] - - -def calculate_costs(span_idx: Dict[str, OTelFlatSpan]): - for span in span_idx.values(): - if ( - span.span_type - and span.span_type.name.lower() in TYPES_WITH_COSTS - and span.attributes - ): - attr: dict = span.attributes - model = attr.get("ag", {}).get("meta", {}).get("response", {}).get( - "model" - ) or attr.get("ag", {}).get("data", {}).get("parameters", {}).get("model") - - prompt_tokens = ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("incremental", {}) - .get("prompt", 0.0) - ) - - completion_tokens = ( - attr.get("ag", {}) - .get("metrics", {}) - .get("tokens", {}) - .get("incremental", {}) - .get("completion", 0.0) - ) - - try: - costs = cost_calculator.cost_per_token( - model=model, - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - ) - - if not costs: - continue - - prompt_cost, completion_cost = costs - total_cost = prompt_cost + completion_cost - - if "ag" not in span.attributes or not isinstance( - span.attributes["ag"], - dict, - ): - span.attributes["ag"] = {} - if "metrics" not in span.attributes["ag"] or not isinstance( - span.attributes["ag"]["metrics"], - dict, - ): - span.attributes["ag"]["metrics"] = {} - - if "costs" not in span.attributes["ag"]["metrics"] or not isinstance( - span.attributes["ag"]["metrics"]["costs"], - dict, - ): - span.attributes["ag"]["metrics"]["costs"] = {} - - span.attributes["ag"]["metrics"]["costs"]["incremental"] = { - "prompt": prompt_cost, - "completion": completion_cost, - "total": total_cost, - } - - except: # pylint: disable=bare-except - log.warn( - "Failed to calculate costs", - model=model, - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - ) - - # VALUES @@ -655,42 +285,6 @@ def parse_ref_slug_to_str( return clean_ref_slug -def parse_ref_version_to_str( - ref_version: str, -): - clean_ref_version = None - - try: - clean_ref_version = str(ref_version) - except Exception as e: - log.error( - "ref_version must be a string, got %s [%s]", - type(ref_version), - ref_version, - ) - raise TypeError() from e - - return clean_ref_version - - -def parse_evt_name_to_str( - evt_name: str, -): - clean_evt_name = None - - try: - clean_evt_name = str(evt_name) - except Exception as e: - log.error( - "evt_name must be a string, got %s [%s]", - type(evt_name), - evt_name, - ) - raise TypeError() from e - - return clean_evt_name - - def parse_trace_id_to_uuid( trace_id: str, ): @@ -800,9 +394,7 @@ def parse_value_to_enum(value: str, enum: type) -> type: ) from e -def parse_timestamp_to_datetime( - ts: Optional[Union[str, int, datetime]], -) -> Optional[datetime]: +def parse_timestamp_to_datetime(ts): if isinstance(ts, datetime): return ts @@ -810,7 +402,7 @@ def parse_timestamp_to_datetime( try: ts = int(ts) except ValueError: - return datetime.fromisoformat(str(ts)) + return datetime.fromisoformat(ts) if isinstance(ts, int): digits = len(str(ts)) @@ -937,7 +529,7 @@ def _parse_links_condition(condition: Condition) -> None: condition.value[i] = Link( trace_id=parse_trace_id_to_uuid(trace_id) if trace_id else None, span_id=parse_span_id_to_uuid(span_id) if span_id else None, - ).model_dump(mode="json") + ).model_dump() except Exception as e: # pylint: disable=broad-exception-caught raise FilteringException( "'links' value must be one or more (possibly partial) links.", @@ -997,27 +589,19 @@ def _parse_references_condition(condition: Condition) -> None: ref_id = v.get("id") ref_slug = v.get("slug") - ref_version = v.get("version") if ref_id: _values.append( Reference( id=parse_ref_id_to_uuid(ref_id), - ).model_dump(mode="json", exclude_none=True) + ).model_dump(exclude_none=True) ) if ref_slug: _values.append( Reference( slug=parse_ref_slug_to_str(ref_slug), - ).model_dump(mode="json", exclude_none=True) - ) - - if ref_version: - _values.append( - Reference( - version=parse_ref_version_to_str(ref_version), - ).model_dump(mode="json", exclude_none=True) + ).model_dump(exclude_none=True) ) condition.value = _values @@ -1035,68 +619,7 @@ def _parse_references_condition(condition: Condition) -> None: ) from e -def _parse_events_condition(condition: Condition) -> None: - if condition.operator not in _L_OPS + _D_OPS + _E_OPS: - raise FilteringException( - "'events' only supports list, dict, and existence operators.", - ) - - if condition.operator in _L_OPS + _E_OPS and condition.key is not None: - raise FilteringException( - "'events' key is only supported for dict operators.", - ) - - if condition.operator in _E_OPS and condition.value is not None: - raise FilteringException( - "'events' value is not supported for existence operators.", - ) - - if condition.operator in _L_OPS: - if not isinstance(condition.value, list): - raise FilteringException( - "'events' value must be one or more (possibly partial) events.", - ) - - if not all(isinstance(v, dict) for v in condition.value): - raise FilteringException( - "'events' value must be one or more (possibly partial) events.", - ) - - if condition.operator in _D_OPS: - if not isinstance(condition.key, str) or not condition.key.startswith( - "attributes." - ): - raise FilteringException( - "'events' key must be a string in dot notation starting with 'attributes'.", - ) - - if condition.operator in _E_OPS: - pass - elif condition.operator in _L_OPS: - try: - _values = [] - - for v in condition.value: - v: dict - - name = v.get("name") - - if name: - _values.append(dict(name=parse_evt_name_to_str(name))) - - condition.value = _values - except Exception as e: # pylint: disable=broad-exception-caught - log.error(e) - raise FilteringException( - "'events' value must be one or more (possibly partial) events.", - ) from e - elif condition.operator in _D_OPS: - try: - unmarshall({condition.key: condition.value}) - except Exception as e: # pylint: disable=broad-exception-caught - raise FilteringException( - "'events' key must be a string in dot notation.", - ) from e +# def _parse_events_condition(condition: Condition) -> None: ... def _parse_enum_field_condition(condition: Condition, enum: type) -> None: @@ -1199,12 +722,7 @@ def _parse_fts_field_condition(condition: Condition) -> None: # FILTERING / CONDITION -def parse_filtering( - filtering: Optional[Filtering] = None, -) -> None: - if filtering is None: - return - +def parse_filtering(filtering: Filtering) -> None: for condition in filtering.conditions: if isinstance(condition, Filtering): parse_filtering(condition) @@ -1216,20 +734,11 @@ def parse_filtering( ) -def parse_condition( - condition: Optional[Condition] = None, -) -> None: - if condition is None: - return - +def parse_condition(condition: Condition) -> None: if condition.field == Fields.TRACE_ID: _parse_trace_id_condition(condition) - elif condition.field == Fields.TRACE_TYPE: - _parse_enum_field_condition(condition, TraceType) elif condition.field == Fields.SPAN_ID: _parse_span_id_condition(condition) - elif condition.field == Fields.SPAN_TYPE: - _parse_enum_field_condition(condition, SpanType) elif condition.field == Fields.PARENT_ID: _parse_parent_id_condition(condition) elif condition.field == Fields.SPAN_KIND: @@ -1250,8 +759,8 @@ def parse_condition( _parse_links_condition(condition) elif condition.field == Fields.REFERENCES: _parse_references_condition(condition) - elif condition.field == Fields.EVENTS: - _parse_events_condition(condition) + # elif condition.field == Fields.EVENTS: + # _parse_events_condition(condition) elif condition.field == Fields.CREATED_AT: _parse_timestamp_field_condition(condition) elif condition.field == Fields.UPDATED_AT: @@ -1267,10 +776,9 @@ def parse_condition( elif condition.field == Fields.CONTENT: _parse_fts_field_condition(condition) else: - # raise FilteringException( - # f"Unsupported condition field '{condition.field}'.", - # ) - log.warning(f"Unsupported condition field: {condition.field}") + raise FilteringException( + f"Unsupported condition field '{condition.field}'.", + ) # INGEST / QUERY @@ -1280,64 +788,5 @@ def parse_ingest(span_dtos: OTelFlatSpans) -> None: pass -def parse_query(query: TracingQuery) -> None: +def parse_query(query: Query) -> None: parse_filtering(query.filtering) - - -# INVOCATIONS / ANNOTATIONS - - -def parse_into_attributes( - *, - type: Optional[Dict[str, str]] = None, - flags: Optional[Flags] = None, - tags: Optional[Tags] = None, - meta: Optional[Meta] = None, - data: Optional[Data] = None, - references: Optional[Dict[str, Dict[str, Any]]] = None, -) -> Attributes: - attributes = dict( - ag=( - dict( - type=type, - flags=flags, - tags=tags, - meta=meta, - data=data, - references=references, - ) - if type or flags or tags or meta or data or references - else None - ) - ) - - return attributes # type: ignore - - -def parse_from_attributes( - attributes: Attributes, -) -> Tuple[ - Optional[Dict[str, str]], # type - Optional[Flags], # flags - Optional[Tags], # tags - Optional[Meta], # meta - Optional[Data], # data - Optional[Dict[str, Dict[str, Any]]], # references -]: - # TODO - add error handling - ag: dict = attributes.get("ag", {}) # type: ignore - type: dict = ag.get("type", {}) # type: ignore - flags: dict = ag.get("flags") # type: ignore - tags: dict = ag.get("tags") # type: ignore - meta: dict = ag.get("meta") # type: ignore - data: dict = ag.get("data") # type: ignore - references = ag.get("references") # type: ignore - - return ( - type, - flags, - tags, - meta, - data, - references, - ) diff --git a/api/oss/src/core/workflows/dtos.py b/api/oss/src/core/workflows/dtos.py index c6b71caccf..ad59c8adc7 100644 --- a/api/oss/src/core/workflows/dtos.py +++ b/api/oss/src/core/workflows/dtos.py @@ -1,5 +1,5 @@ -from typing import Optional, Dict, Any, Union -from uuid import UUID, uuid4 +from typing import Optional +from uuid import UUID from urllib.parse import urlparse from pydantic import ( @@ -18,57 +18,27 @@ ) from jsonschema.exceptions import SchemaError +from oss.src.core.shared.dtos import sync_alias, AliasConfig from oss.src.core.git.dtos import ( Artifact, ArtifactCreate, ArtifactEdit, ArtifactQuery, ArtifactFork, - # + ArtifactLog, Variant, VariantCreate, VariantEdit, VariantQuery, VariantFork, - # Revision, RevisionCreate, RevisionEdit, RevisionQuery, - RevisionFork, RevisionCommit, - RevisionsLog, -) - -from oss.src.core.shared.dtos import sync_alias, AliasConfig -from oss.src.core.shared.dtos import ( - Identifier, - Slug, - Version, - Header, - Data, - Metadata, - Reference, - Link, - Schema, - # Credentials, - # Secret, -) - -from oss.src.core.tracing.dtos import Trace -from oss.src.apis.fastapi.observability.models import AgentaVersionedTreeDTO as Tree - -from agenta.sdk.models.workflows import ( - WorkflowServiceRequestData, # export - WorkflowServiceResponseData, # export - WorkflowServiceRequest, # export - WorkflowServiceResponse, # export - WorkflowServiceBatchResponse, # export - WorkflowServiceStreamResponse, # export + RevisionFork, ) -# aliases ---------------------------------------------------------------------- - class WorkflowIdAlias(AliasConfig): workflow_id: Optional[UUID] = None @@ -97,24 +67,12 @@ class WorkflowRevisionIdAlias(AliasConfig): ) -# globals ---------------------------------------------------------------------- - - class WorkflowFlags(BaseModel): - is_custom: bool = False - is_evaluator: bool = False - is_human: bool = False - - -class WorkflowQueryFlags(BaseModel): is_custom: Optional[bool] = None is_evaluator: Optional[bool] = None is_human: Optional[bool] = None -# workflows -------------------------------------------------------------------- - - class Workflow(Artifact): flags: Optional[WorkflowFlags] = None @@ -128,10 +86,7 @@ class WorkflowEdit(ArtifactEdit): class WorkflowQuery(ArtifactQuery): - flags: Optional[WorkflowQueryFlags] = None - - -# workflow variants ------------------------------------------------------------ + flags: Optional[WorkflowFlags] = None class WorkflowVariant( @@ -159,34 +114,10 @@ class WorkflowVariantEdit(VariantEdit): class WorkflowVariantQuery(VariantQuery): - flags: Optional[WorkflowQueryFlags] = None - - -# workflow revisions ----------------------------------------------------------- - - -class WorkflowServiceVersion(BaseModel): - version: Optional[str] = None - - -class WorkflowServiceInterface(WorkflowServiceVersion): - uri: Optional[str] = None # str (Enum) w/ validation - url: Optional[str] = None # str w/ validation - headers: Optional[ - Dict[str, Union[Reference, str]] - ] = None # either hardcoded or a secret - # handler: Optional[Callable] = None - - schemas: Optional[Dict[str, Schema]] = None # json-schema instead of pydantic - - -class WorkflowServiceConfiguration(WorkflowServiceInterface): - script: Optional[Data] = None # str w/ validation - parameters: Optional[Data] = None # configuration values + flags: Optional[WorkflowFlags] = None -class WorkflowRevisionData(WorkflowServiceConfiguration): - # LEGACY FIELDS +class WorkflowRevisionData(BaseModel): service: Optional[dict] = None # url, schema, kind, etc configuration: Optional[dict] = None # parameters, variables, etc @@ -291,7 +222,7 @@ class WorkflowRevisionEdit(RevisionEdit): class WorkflowRevisionQuery(RevisionQuery): - flags: Optional[WorkflowQueryFlags] = None + flags: Optional[WorkflowFlags] = None class WorkflowRevisionCommit( @@ -308,37 +239,24 @@ def model_post_init(self, __context) -> None: sync_alias("workflow_variant_id", "variant_id", self) -class WorkflowRevisionsLog( - RevisionsLog, - WorkflowIdAlias, +class WorkflowLog( + ArtifactLog, WorkflowVariantIdAlias, WorkflowRevisionIdAlias, ): + workflow_variant_id: Optional[UUID] = None + def model_post_init(self, __context) -> None: - sync_alias("workflow_id", "artifact_id", self) sync_alias("workflow_variant_id", "variant_id", self) sync_alias("workflow_revision_id", "revision_id", self) -# forks ------------------------------------------------------------------------ - - class WorkflowRevisionFork(RevisionFork): flags: Optional[WorkflowFlags] = None data: Optional[WorkflowRevisionData] = None -class WorkflowRevisionForkAlias(AliasConfig): - workflow_revision: Optional[WorkflowRevisionFork] = None - - revision: Optional[RevisionFork] = Field( - default=None, - exclude=True, - alias="workflow_revision", - ) - - class WorkflowVariantFork(VariantFork): flags: Optional[WorkflowFlags] = None @@ -353,17 +271,25 @@ class WorkflowVariantForkAlias(AliasConfig): ) +class WorkflowRevisionForkAlias(AliasConfig): + workflow_revision: Optional[WorkflowRevisionFork] = None + + revision: Optional[RevisionFork] = Field( + default=None, + exclude=True, + alias="workflow_revision", + ) + + class WorkflowFork( ArtifactFork, - WorkflowIdAlias, WorkflowVariantIdAlias, - WorkflowVariantForkAlias, WorkflowRevisionIdAlias, + WorkflowVariantForkAlias, WorkflowRevisionForkAlias, ): def model_post_init(self, __context) -> None: - sync_alias("workflow_id", "artifact_id", self) - sync_alias("workflow_variant_id", "variant_id", self) sync_alias("workflow_variant", "variant", self) - sync_alias("workflow_revision_id", "revision_id", self) sync_alias("workflow_revision", "revision", self) + sync_alias("workflow_variant_id", "variant_id", self) + sync_alias("workflow_revision_id", "revision_id", self) diff --git a/api/oss/src/core/workflows/service.py b/api/oss/src/core/workflows/service.py index 18e4835b97..86d32e3512 100644 --- a/api/oss/src/core/workflows/service.py +++ b/api/oss/src/core/workflows/service.py @@ -1,4 +1,4 @@ -from typing import Optional, List, Tuple, Union +from typing import Optional, List from uuid import UUID from oss.src.utils.logging import get_module_logger @@ -10,6 +10,7 @@ ArtifactEdit, ArtifactQuery, ArtifactFork, + ArtifactLog, # VariantCreate, VariantEdit, @@ -19,7 +20,6 @@ RevisionEdit, RevisionQuery, RevisionCommit, - RevisionsLog, ) from oss.src.core.workflows.dtos import ( Workflow, @@ -27,7 +27,7 @@ WorkflowEdit, WorkflowQuery, WorkflowFork, - WorkflowRevisionsLog, + WorkflowLog, # WorkflowVariant, WorkflowVariantCreate, @@ -39,36 +39,12 @@ WorkflowRevisionEdit, WorkflowRevisionQuery, WorkflowRevisionCommit, - # - WorkflowServiceInterface, - WorkflowServiceRequest, - WorkflowServiceBatchResponse, - WorkflowServiceStreamResponse, - # - WorkflowRevisionData, - WorkflowServiceRequestData, - WorkflowServiceResponseData, ) -from oss.src.services.auth_helper import sign_secret_token -from oss.src.services.db_manager import get_project_by_id - -from agenta.sdk.decorators.running import ( - invoke_workflow as _invoke_workflow, - inspect_workflow as _inspect_workflow, -) -from agenta.sdk.models.workflows import ( - WorkflowServiceRequest, - WorkflowServiceBatchResponse, - WorkflowServiceStreamResponse, -) log = get_module_logger(__name__) -# ------------------------------------------------------------------------------ - - class WorkflowsService: def __init__( self, @@ -77,7 +53,7 @@ def __init__( ): self.workflows_dao = workflows_dao - # workflows ---------------------------------------------------------------- + ## -- artifacts ------------------------------------------------------------ async def create_workflow( self, @@ -86,28 +62,24 @@ async def create_workflow( user_id: UUID, # workflow_create: WorkflowCreate, - # - workflow_id: Optional[UUID] = None, ) -> Optional[Workflow]: - artifact_create = ArtifactCreate( - **workflow_create.model_dump(mode="json", exclude_none=True), + _artifact_create = ArtifactCreate( + **workflow_create.model_dump(mode="json"), ) artifact = await self.workflows_dao.create_artifact( project_id=project_id, user_id=user_id, # - artifact_create=artifact_create, - # - artifact_id=workflow_id, + artifact_create=_artifact_create, ) if not artifact: return None - workflow = Workflow(**artifact.model_dump(mode="json")) + _workflow = Workflow(**artifact.model_dump(mode="json")) - return workflow + return _workflow async def fetch_workflow( self, @@ -125,9 +97,9 @@ async def fetch_workflow( if not artifact: return None - workflow = Workflow(**artifact.model_dump(mode="json")) + _workflow = Workflow(**artifact.model_dump(mode="json")) - return workflow + return _workflow async def edit_workflow( self, @@ -137,65 +109,23 @@ async def edit_workflow( # workflow_edit: WorkflowEdit, ) -> Optional[Workflow]: - artifact_edit = ArtifactEdit( - **workflow_edit.model_dump(mode="json", exclude_none=True), + _artifact_edit = ArtifactEdit( + **workflow_edit.model_dump(mode="json"), ) artifact = await self.workflows_dao.edit_artifact( project_id=project_id, user_id=user_id, # - artifact_edit=artifact_edit, + artifact_edit=_artifact_edit, ) if not artifact: return None - workflow = Workflow(**artifact.model_dump(mode="json")) - - return workflow - - async def query_workflows( - self, - *, - project_id: UUID, - # - workflow_query: Optional[WorkflowQuery] = None, - # - workflow_refs: Optional[List[Reference]] = None, - # - include_archived: Optional[bool] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[Workflow]: - artifact_query = ( - ArtifactQuery( - **workflow_query.model_dump(mode="json", exclude_none=True), - ) - if workflow_query - else ArtifactQuery() - ) - - artifacts = await self.workflows_dao.query_artifacts( - project_id=project_id, - # - artifact_query=artifact_query, - # - artifact_refs=workflow_refs, - # - include_archived=include_archived, - # - windowing=windowing, - ) - - workflows = [ - Workflow( - **artifact.model_dump(mode="json"), - ) - for artifact in artifacts - ] + _workflow = Workflow(**artifact.model_dump(mode="json")) - return workflows + return _workflow async def archive_workflow( self, @@ -241,7 +171,51 @@ async def unarchive_workflow( return _workflow - # workflow variants -------------------------------------------------------- + async def query_workflows( + self, + *, + project_id: UUID, + # + workflow_query: Optional[WorkflowQuery] = None, + # + workflow_refs: Optional[List[Reference]] = None, + # + include_archived: Optional[bool] = None, + # + windowing: Optional[Windowing] = None, + ) -> List[Workflow]: + _artifact_query = ( + ArtifactQuery( + **workflow_query.model_dump(mode="json", exclude_none=True), + ) + if workflow_query + else ArtifactQuery() + ) + + artifacts = await self.workflows_dao.query_artifacts( + project_id=project_id, + # + artifact_query=_artifact_query, + # + artifact_refs=workflow_refs, + # + include_archived=include_archived, + # + windowing=windowing, + ) + + _workflows = [ + Workflow( + **artifact.model_dump(mode="json"), + ) + for artifact in artifacts + ] + + return _workflows + + ## ------------------------------------------------------------------------- + + ## -- variants ------------------------------------------------------------- async def create_workflow_variant( self, @@ -252,7 +226,7 @@ async def create_workflow_variant( workflow_variant_create: WorkflowVariantCreate, ) -> Optional[WorkflowVariant]: _variant_create = VariantCreate( - **workflow_variant_create.model_dump(mode="json", exclude_none=True), + **workflow_variant_create.model_dump(mode="json"), ) variant = await self.workflows_dao.create_variant( @@ -304,7 +278,7 @@ async def edit_workflow_variant( workflow_variant_edit: WorkflowVariantEdit, ) -> Optional[WorkflowVariant]: _variant_edit = VariantEdit( - **workflow_variant_edit.model_dump(mode="json", exclude_none=True), + **workflow_variant_edit.model_dump(mode="json"), ) variant = await self.workflows_dao.edit_variant( @@ -323,6 +297,54 @@ async def edit_workflow_variant( return _workflow_variant + async def archive_workflow_variant( + self, + *, + project_id: UUID, + user_id: UUID, + # + workflow_variant_id: UUID, + ) -> Optional[WorkflowVariant]: + variant = await self.workflows_dao.archive_variant( + project_id=project_id, + user_id=user_id, + # + variant_id=workflow_variant_id, + ) + + if not variant: + return None + + _workflow_variant = WorkflowVariant( + **variant.model_dump(mode="json"), + ) + + return _workflow_variant + + async def unarchive_workflow_variant( + self, + *, + project_id: UUID, + user_id: UUID, + # + workflow_variant_id: UUID, + ) -> Optional[WorkflowVariant]: + variant = await self.workflows_dao.unarchive_variant( + project_id=project_id, + user_id=user_id, + # + variant_id=workflow_variant_id, + ) + + if not variant: + return None + + _workdlow_variant = WorkflowVariant( + **variant.model_dump(mode="json"), + ) + + return _workdlow_variant + async def query_workflow_variants( self, *, @@ -367,6 +389,8 @@ async def query_workflow_variants( return _workflow_variants + ## ......................................................................... + async def fork_workflow_variant( self, *, @@ -395,73 +419,79 @@ async def fork_workflow_variant( return _workflow_variant - async def archive_workflow_variant( + ## ------------------------------------------------------------------------- + + ## -- revisions ------------------------------------------------------------ + + async def create_workflow_revision( self, *, project_id: UUID, user_id: UUID, # - workflow_variant_id: UUID, - ) -> Optional[WorkflowVariant]: - variant = await self.workflows_dao.archive_variant( + workflow_revision_create: WorkflowRevisionCreate, + ) -> Optional[WorkflowRevision]: + _revision_create = RevisionCreate( + **workflow_revision_create.model_dump(mode="json"), + ) + + revision = await self.workflows_dao.create_revision( project_id=project_id, user_id=user_id, # - variant_id=workflow_variant_id, + revision_create=_revision_create, ) - if not variant: + if not revision: return None - _workflow_variant = WorkflowVariant( - **variant.model_dump(mode="json"), + _workflow_revision = WorkflowRevision( + **revision.model_dump(mode="json"), ) - return _workflow_variant + return _workflow_revision - async def unarchive_workflow_variant( + async def fetch_workflow_revision( self, *, project_id: UUID, - user_id: UUID, # - workflow_variant_id: UUID, - ) -> Optional[WorkflowVariant]: - variant = await self.workflows_dao.unarchive_variant( + workflow_variant_ref: Optional[Reference] = None, + workflow_revision_ref: Optional[Reference] = None, + ) -> Optional[WorkflowRevision]: + revision = await self.workflows_dao.fetch_revision( project_id=project_id, - user_id=user_id, # - variant_id=workflow_variant_id, + variant_ref=workflow_variant_ref, + revision_ref=workflow_revision_ref, ) - if not variant: + if not revision: return None - _workdlow_variant = WorkflowVariant( - **variant.model_dump(mode="json"), + _workflow_revision = WorkflowRevision( + **revision.model_dump(mode="json"), ) - return _workdlow_variant - - # workflow revisions ------------------------------------------------------- + return _workflow_revision - async def create_workflow_revision( + async def edit_workflow_revision( self, *, project_id: UUID, user_id: UUID, # - workflow_revision_create: WorkflowRevisionCreate, + workflow_revision_edit: WorkflowRevisionEdit, ) -> Optional[WorkflowRevision]: - _revision_create = RevisionCreate( - **workflow_revision_create.model_dump(mode="json", exclude_none=True), + _workflow_revision_edit = RevisionEdit( + **workflow_revision_edit.model_dump(mode="json"), ) - revision = await self.workflows_dao.create_revision( + revision = await self.workflows_dao.edit_revision( project_id=project_id, user_id=user_id, # - revision_create=_revision_create, + revision_edit=_workflow_revision_edit, ) if not revision: @@ -473,52 +503,19 @@ async def create_workflow_revision( return _workflow_revision - async def fetch_workflow_revision( + async def archive_workflow_revision( self, *, project_id: UUID, + user_id: UUID, # - workflow_ref: Optional[Reference] = None, - workflow_variant_ref: Optional[Reference] = None, - workflow_revision_ref: Optional[Reference] = None, + workflow_revision_id: UUID, ) -> Optional[WorkflowRevision]: - if not workflow_ref and not workflow_variant_ref and not workflow_revision_ref: - return None - - if workflow_ref and not workflow_variant_ref and not workflow_revision_ref: - workflow = await self.fetch_workflow( - project_id=project_id, - # - workflow_ref=workflow_ref, - ) - - if not workflow: - return None - - workflow_ref = Reference( - id=workflow.id, - slug=workflow.slug, - ) - - workflow_variant = await self.fetch_workflow_variant( - project_id=project_id, - # - workflow_ref=workflow_ref, - ) - - if not workflow_variant: - return None - - workflow_variant_ref = Reference( - id=workflow_variant.id, - slug=workflow_variant.slug, - ) - - revision = await self.workflows_dao.fetch_revision( + revision = await self.workflows_dao.archive_revision( project_id=project_id, + user_id=user_id, # - variant_ref=workflow_variant_ref, - revision_ref=workflow_revision_ref, + revision_id=workflow_revision_id, ) if not revision: @@ -530,23 +527,19 @@ async def fetch_workflow_revision( return _workflow_revision - async def edit_workflow_revision( + async def unarchive_workflow_revision( self, *, project_id: UUID, user_id: UUID, # - workflow_revision_edit: WorkflowRevisionEdit, + workflow_revision_id: UUID, ) -> Optional[WorkflowRevision]: - _workflow_revision_edit = RevisionEdit( - **workflow_revision_edit.model_dump(mode="json", exclude_none=True), - ) - - revision = await self.workflows_dao.edit_revision( + revision = await self.workflows_dao.unarchive_revision( project_id=project_id, user_id=user_id, # - revision_edit=_workflow_revision_edit, + revision_id=workflow_revision_id, ) if not revision: @@ -604,6 +597,8 @@ async def query_workflow_revisions( return _workflow_revisions + ## ......................................................................... + async def commit_workflow_revision( self, *, @@ -613,7 +608,7 @@ async def commit_workflow_revision( workflow_revision_commit: WorkflowRevisionCommit, ) -> Optional[WorkflowRevision]: _revision_commit = RevisionCommit( - **workflow_revision_commit.model_dump(mode="json", exclude_none=True), + **workflow_revision_commit.model_dump(mode="json"), ) if not _revision_commit.artifact_id: @@ -652,16 +647,16 @@ async def log_workflow_revisions( *, project_id: UUID, # - workflow_revisions_log: WorkflowRevisionsLog, + workflow_log: WorkflowLog, ) -> List[WorkflowRevision]: - _revisions_log = RevisionsLog( - **workflow_revisions_log.model_dump(mode="json"), + _artifact_log = ArtifactLog( + **workflow_log.model_dump(mode="json"), ) revisions = await self.workflows_dao.log_revisions( project_id=project_id, # - revisions_log=_revisions_log, + artifact_log=_artifact_log, ) _workflow_revisions = [ @@ -673,97 +668,4 @@ async def log_workflow_revisions( return _workflow_revisions - async def archive_workflow_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - workflow_revision_id: UUID, - ) -> Optional[WorkflowRevision]: - revision = await self.workflows_dao.archive_revision( - project_id=project_id, - user_id=user_id, - # - revision_id=workflow_revision_id, - ) - - if not revision: - return None - - _workflow_revision = WorkflowRevision( - **revision.model_dump(mode="json"), - ) - - return _workflow_revision - - async def unarchive_workflow_revision( - self, - *, - project_id: UUID, - user_id: UUID, - # - workflow_revision_id: UUID, - ) -> Optional[WorkflowRevision]: - revision = await self.workflows_dao.unarchive_revision( - project_id=project_id, - user_id=user_id, - # - revision_id=workflow_revision_id, - ) - - if not revision: - return None - - _workflow_revision = WorkflowRevision( - **revision.model_dump(mode="json"), - ) - - return _workflow_revision - - # workflow services -------------------------------------------------------- - - async def invoke_workflow( - self, - *, - project_id: UUID, - user_id: UUID, - # - request: WorkflowServiceRequest, - # - **kwargs, - ) -> Union[WorkflowServiceBatchResponse, WorkflowServiceStreamResponse,]: - project = await get_project_by_id( - project_id=str(project_id), - ) - - secret_token = await sign_secret_token( - user_id=str(user_id), - project_id=str(project_id), - workspace_id=str(project.workspace_id), - organization_id=str(project.organization_id), - ) - - credentials = f"Secret {secret_token}" - - return await _invoke_workflow( - request=request, - # - credentials=credentials, - # - **kwargs, - ) - - async def inspect_workflow( - self, - *, - project_id: UUID, - user_id: UUID, - # - request: WorkflowServiceRequest, - ) -> WorkflowServiceRequest: - return await _inspect_workflow( - request=request, - ) - - # -------------------------------------------------------------------------- + ## ------------------------------------------------------------------------- diff --git a/api/oss/src/crons/queries.sh b/api/oss/src/crons/queries.sh deleted file mode 100644 index b9e8c7a6e1..0000000000 --- a/api/oss/src/crons/queries.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -set -eu - -AGENTA_AUTH_KEY=$(tr '\0' '\n' < /proc/1/environ | grep ^AGENTA_AUTH_KEY= | cut -d= -f2-) -TRIGGER_INTERVAL=$(awk 'NR==2 {split($1, a, "/"); print (a[2] ? a[2] : 1)}' /etc/cron.d/queries-cron) -NOW_UTC=$(date -u "+%Y-%m-%dT%H:%M:00Z") -MINUTE=$(date -u "+%M" | sed 's/^0*//') -ROUNDED_MINUTE=$(( (MINUTE / TRIGGER_INTERVAL) * TRIGGER_INTERVAL )) -TRIGGER_DATETIME=$(date -u "+%Y-%m-%dT%H") -TRIGGER_DATETIME="${TRIGGER_DATETIME}:$(printf "%02d" $ROUNDED_MINUTE):00Z" - - -echo "--------------------------------------------------------" -echo "[$(date)] queries.sh running from cron" >> /proc/1/fd/1 - -# Make POST request, show status and response -curl \ - -s \ - -w "\nHTTP_STATUS:%{http_code}\n" \ - -X POST \ - -H "Authorization: Access ${AGENTA_AUTH_KEY}" \ - "http://api:8000/admin/evaluations/runs/refresh?trigger_interval=${TRIGGER_INTERVAL}&trigger_datetime=${TRIGGER_DATETIME}" || echo "❌ CURL failed" - -echo "[$(date)] queries.sh done" >> /proc/1/fd/1 \ No newline at end of file diff --git a/api/oss/src/crons/queries.txt b/api/oss/src/crons/queries.txt deleted file mode 100644 index 586a61af8e..0000000000 --- a/api/oss/src/crons/queries.txt +++ /dev/null @@ -1,2 +0,0 @@ -* * * * * root echo "cron test $(date)" >> /proc/1/fd/1 2>&1 -*/1 * * * * root sh /queries.sh >> /proc/1/fd/1 2>&1 diff --git a/api/oss/src/dbs/postgres/blobs/dao.py b/api/oss/src/dbs/postgres/blobs/dao.py index 6ca13bb348..bcdee440cf 100644 --- a/api/oss/src/dbs/postgres/blobs/dao.py +++ b/api/oss/src/dbs/postgres/blobs/dao.py @@ -1,11 +1,12 @@ from typing import Optional, List, TypeVar, Type from uuid import UUID +from json import dumps from datetime import datetime, timezone +from hashlib import blake2b from sqlalchemy import select from oss.src.utils.logging import get_module_logger -from oss.src.utils.exceptions import suppress_exceptions from oss.src.core.shared.exceptions import EntityCreationConflict from oss.src.core.shared.dtos import Windowing @@ -13,8 +14,8 @@ from oss.src.core.blobs.interfaces import BlobsDAOInterface from oss.src.core.blobs.utils import compute_blob_id -from oss.src.dbs.postgres.shared.utils import apply_windowing from oss.src.dbs.postgres.shared.exceptions import check_entity_creation_conflict +from oss.src.utils.exceptions import suppress_exceptions from oss.src.dbs.postgres.shared.engine import engine from oss.src.dbs.postgres.blobs.mappings import map_dbe_to_dto, map_dto_to_dbe @@ -66,9 +67,6 @@ async def add_blob( async with engine.core_session() as session: stmt = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore - ) - - stmt = select(self.BlobDBE).filter( self.BlobDBE.id == blob.id, # type: ignore ) @@ -89,7 +87,7 @@ async def add_blob( return await self.fetch_blob( project_id=project_id, # - blob_id=blob.id, # type: ignore + blob_id=blob.id, ) except Exception as e: @@ -107,15 +105,15 @@ async def fetch_blob( blob_id: UUID, ) -> Optional[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.BlobDBE.id == blob_id) # type: ignore + query = query.filter(self.BlobDBE.id == blob_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) blob_dbe = result.scalar_one_or_none() @@ -139,15 +137,15 @@ async def edit_blob( blob_edit: BlobEdit, ) -> Optional[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.BlobDBE.id == blob_edit.id) # type: ignore + query = query.filter(self.BlobDBE.id == blob_edit.id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) blob_dbe = result.scalar_one_or_none() @@ -157,8 +155,8 @@ async def edit_blob( for key, value in blob_edit.model_dump(exclude_unset=True).items(): setattr(blob_dbe, key, value) - blob_dbe.updated_at = datetime.now(timezone.utc) # type: ignore - blob_dbe.updated_by_id = user_id # type: ignore + blob_dbe.updated_at = datetime.now(timezone.utc) + blob_dbe.updated_by_id = user_id await session.commit() @@ -180,15 +178,15 @@ async def remove_blob( blob_id: UUID, ) -> Optional[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.BlobDBE.id == blob_id) # type: ignore + query = query.filter(self.BlobDBE.id == blob_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) blob_dbe = result.scalar_one_or_none() @@ -241,24 +239,17 @@ async def add_blobs( try: async with engine.core_session() as session: stmt = select(self.BlobDBE).filter( - self.BlobDBE.project_id == project_id, # type: ignore - ) - - stmt = select(self.BlobDBE).filter( - self.BlobDBE.id.in_(blob_ids), # type: ignore + self.BlobDBE.project_id == project_id, + self.BlobDBE.id.in_(blob_ids), ) existing = await session.execute(stmt) existing_dbes = existing.scalars().all() - existing_ids = {b.id for b in existing_dbes} # type: ignore + existing_ids = {b.id for b in existing_dbes} - new_blobs = list( - { - blob.id: blob for blob in blobs if blob.id not in existing_ids - }.values() - ) + new_blobs = [blob for blob in blobs if blob.id not in existing_ids] blob_dbes = [ map_dto_to_dbe( @@ -276,7 +267,7 @@ async def add_blobs( all_blobs = await self.fetch_blobs( project_id=project_id, # - blob_ids=blob_ids, # type: ignore + blob_ids=blob_ids, ) return all_blobs @@ -296,13 +287,13 @@ async def fetch_blobs( blob_ids: List[UUID], ) -> List[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.BlobDBE.id.in_(blob_ids)) # type: ignore + query = query.filter(self.BlobDBE.id.in_(blob_ids)) # type: ignore - result = await session.execute(stmt) + result = await session.execute(query) blob_dbes = result.scalars().all() @@ -310,15 +301,14 @@ async def fetch_blobs( return [] _blobs = { - blob_dbe.id: map_dbe_to_dto( # type: ignore + blob_dbe.id: map_dbe_to_dto( DTO=Blob, dbe=blob_dbe, # type: ignore ) for blob_dbe in blob_dbes } - blobs = [_blobs.get(blob_id) for blob_id in blob_ids if blob_id in _blobs] - blobs = [blob for blob in blobs if blob is not None] + blobs = [_blobs.get(blob_id) for blob_id in blob_ids] return blobs @@ -332,17 +322,17 @@ async def edit_blobs( blob_edits: List[BlobEdit], ) -> List[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) blob_ids = [blob_edit.id for blob_edit in blob_edits] - stmt = stmt.filter(self.BlobDBE.id.in_(blob_ids)) # type: ignore + query = query.filter(self.BlobDBE.id.in_(blob_ids)) - stmt = stmt.limit(len(blob_edits)) + query = query.limit(len(blob_edits)) - result = await session.execute(stmt) + result = await session.execute(query) blob_dbes = result.scalars().all() @@ -351,12 +341,12 @@ async def edit_blobs( for blob_dbe in blob_dbes: for blob_edit in blob_edits: - if blob_dbe.id == blob_edit.id: # type: ignore + if blob_dbe.id == blob_edit.id: for key, value in blob_edit.model_dump().items(): setattr(blob_dbe, key, value) - blob_dbe.updated_at = datetime.now(timezone.utc) # type: ignore - blob_dbe.updated_by_id = user_id # type: ignore + blob_dbe.updated_at = datetime.now(timezone.utc) + blob_dbe.updated_by_id = user_id await session.commit() @@ -382,15 +372,15 @@ async def remove_blobs( blob_ids: List[UUID], ) -> List[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.BlobDBE.id.in_(blob_ids)) # type: ignore + query = query.filter(self.BlobDBE.id.in_(blob_ids)) # type: ignore - stmt = stmt.limit(len(blob_ids)) + query = query.limit(len(blob_ids)) - result = await session.execute(stmt) + result = await session.execute(query) blob_dbes = result.scalars().all() @@ -423,41 +413,64 @@ async def query_blobs( windowing: Optional[Windowing] = None, ) -> List[Blob]: async with engine.core_session() as session: - stmt = select(self.BlobDBE).filter( + query = select(self.BlobDBE).filter( self.BlobDBE.project_id == project_id, # type: ignore ) if blob_query.set_ids: - stmt = stmt.filter(self.BlobDBE.set_id.in_(blob_query.set_ids)) # type: ignore + query = query.filter(self.BlobDBE.set_id.in_(blob_query.set_ids)) # type: ignore if blob_query.blob_ids: - stmt = stmt.filter(self.BlobDBE.id.in_(blob_query.blob_ids)) # type: ignore + query = query.filter(self.BlobDBE.id.in_(blob_query.blob_ids)) # type: ignore if blob_query.flags: - stmt = stmt.filter( + query = query.filter( self.BlobDBE.flags.contains(blob_query.flags), # type: ignore ) if blob_query.tags: - stmt = stmt.filter( + query = query.filter( self.BlobDBE.tags.contains(blob_query.tags), # type: ignore ) if blob_query.meta: - stmt = stmt.filter( + query = query.filter( self.BlobDBE.meta.contains(blob_query.meta), # type: ignore ) if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=self.BlobDBE, - attribute="created_at", # UUID4 - order="ascending", # data-style - windowing=windowing, - ) + if windowing.next is not None: + query = query.filter( + self.BlobDBE.id > windowing.next, # type: ignore + ) + if windowing.start: + query = query.filter( + self.BlobDBE.created_at > windowing.start, # type: ignore + ) + + if windowing.stop: + query = query.filter( + self.BlobDBE.created_at <= windowing.stop, # type: ignore + ) + + if windowing: + if windowing.order: + if windowing.order.lower() == "descending": + query = query.order_by(self.BlobDBE.created_at.desc()) + elif windowing.order.lower() == "ascending": + query = query.order_by(self.BlobDBE.created_at.asc()) + else: + query = query.order_by(self.BlobDBE.created_at.asc()) + else: + query = query.order_by(self.BlobDBE.created_at.asc()) + else: + query = query.order_by(self.BlobDBE.created_at.asc()) + + if windowing: + if windowing.limit: + query = query.limit(windowing.limit) - result = await session.execute(stmt) + result = await session.execute(query) blob_dbes = result.scalars().all() diff --git a/api/oss/src/dbs/postgres/evaluations/dao.py b/api/oss/src/dbs/postgres/evaluations/dao.py index 9f6535dbf5..93f3b476c1 100644 --- a/api/oss/src/dbs/postgres/evaluations/dao.py +++ b/api/oss/src/dbs/postgres/evaluations/dao.py @@ -1,51 +1,39 @@ -from typing import Optional, List, Tuple, Dict -from uuid import UUID +from typing import Optional, List +from uuid import UUID, uuid4 from datetime import datetime, timezone from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select -from sqlalchemy import not_ +from sqlalchemy import func import sqlalchemy -from sqlalchemy.orm.attributes import flag_modified - from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import suppress_exceptions from oss.src.core.shared.exceptions import EntityCreationConflict -from oss.src.core.shared.dtos import Windowing, Reference +from oss.src.core.shared.dtos import Windowing from oss.src.core.evaluations.interfaces import EvaluationsDAOInterface from oss.src.core.evaluations.types import EvaluationClosedConflict from oss.src.core.evaluations.types import ( - EvaluationStatus, EvaluationRunFlags, EvaluationRun, EvaluationRunCreate, EvaluationRunEdit, EvaluationRunQuery, - # EvaluationScenario, EvaluationScenarioCreate, EvaluationScenarioEdit, EvaluationScenarioQuery, - # - EvaluationResult, - EvaluationResultCreate, - EvaluationResultEdit, - EvaluationResultQuery, - # - EvaluationMetrics, - EvaluationMetricsCreate, - EvaluationMetricsEdit, - EvaluationMetricsQuery, - # - EvaluationQueue, - EvaluationQueueCreate, - EvaluationQueueEdit, - EvaluationQueueQuery, + EvaluationStep, + EvaluationStepCreate, + EvaluationStepEdit, + EvaluationStepQuery, + EvaluationMetric, + EvaluationMetricCreate, + EvaluationMetricEdit, + EvaluationMetricQuery, ) -from oss.src.dbs.postgres.shared.utils import apply_windowing from oss.src.dbs.postgres.shared.exceptions import check_entity_creation_conflict from oss.src.dbs.postgres.shared.engine import engine from oss.src.dbs.postgres.evaluations.mappings import ( @@ -56,9 +44,8 @@ from oss.src.dbs.postgres.evaluations.dbes import ( EvaluationRunDBE, EvaluationScenarioDBE, - EvaluationResultDBE, - EvaluationMetricsDBE, - EvaluationQueueDBE, + EvaluationStepDBE, + EvaluationMetricDBE, ) @@ -80,56 +67,31 @@ async def create_run( # run: EvaluationRunCreate, ) -> Optional[EvaluationRun]: - _run = EvaluationRun( - **run.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + now = datetime.now(timezone.utc) + run = EvaluationRun( + **run.model_dump(), + created_at=now, created_by_id=user_id, ) - run_references: List[dict] = [] - - if _run and _run.data and _run.data.steps: - _references: Dict[str, dict] = {} - - for step in _run.data.steps: - if not step.references: - continue - - for key, ref in step.references.items(): - _key = getattr(ref, "id", None) or key - _references[_key] = ref.model_dump( - mode="json", - exclude_none=True, - ) | {"key": str(key)} - - run_references = list(_references.values()) - run_dbe = create_dbe_from_dto( DBE=EvaluationRunDBE, project_id=project_id, - dto=_run, - # - references=run_references, + dto=run, ) - if _run.data: - run_dbe.data = _run.data.model_dump(mode="json") # type: ignore - try: async with engine.core_session() as session: session.add(run_dbe) await session.commit() - _run = create_dto_from_dbe( + run = create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, ) - return _run + return run except Exception as e: check_entity_creation_conflict(e) @@ -145,56 +107,24 @@ async def create_runs( # runs: List[EvaluationRunCreate], ) -> List[EvaluationRun]: - _runs = [ + now = datetime.now(timezone.utc) + runs = [ EvaluationRun( - **run.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + **run.model_dump(), + created_at=now, created_by_id=user_id, ) for run in runs ] - runs_references: List[List[dict]] = [] - - for _run in _runs: - run_references: List[dict] = [] - - if _run and _run.data and _run.data.steps: - _references: Dict[str, dict] = {} - - for step in _run.data.steps: - if not step.references: - continue - - for key, ref in step.references.items(): - _key = getattr(ref, "id", None) or key - _references[_key] = ref.model_dump( - mode="json", - exclude_none=True, - ) | {"key": str(key)} - - run_references = list(_references.values()) - - runs_references.append(run_references) - - run_dbes = [] - - for i, _run in enumerate(_runs): - run_dbe = create_dbe_from_dto( + run_dbes = [ + create_dbe_from_dto( DBE=EvaluationRunDBE, project_id=project_id, - dto=_run, - # - references=runs_references[i], + dto=run, ) - - if _run.data: - run_dbe.data = _run.data.model_dump(mode="json") # type: ignore - - run_dbes.append(run_dbe) + for run in runs + ] try: async with engine.core_session() as session: @@ -202,7 +132,7 @@ async def create_runs( await session.commit() - _runs = [ + runs = [ create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, @@ -210,7 +140,7 @@ async def create_runs( for run_dbe in run_dbes ] - return _runs + return runs except Exception as e: check_entity_creation_conflict(e) @@ -228,27 +158,24 @@ async def fetch_run( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id == run_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbe = res.scalars().first() + run_dbe = result.scalars().first() if run_dbe is None: return None - _run = create_dto_from_dbe( + run = create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, ) - return _run + return run @suppress_exceptions(default=[]) async def fetch_runs( @@ -261,19 +188,16 @@ async def fetch_runs( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id.in_(run_ids), ) stmt = stmt.limit(len(run_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbes = res.scalars().all() + run_dbes = result.scalars().all() - _runs = [ + runs = [ create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, @@ -281,7 +205,7 @@ async def fetch_runs( for run_dbe in run_dbes ] - return _runs + return runs @suppress_exceptions() async def edit_run( @@ -295,17 +219,14 @@ async def edit_run( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id == run.id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbe = res.scalars().first() + run_dbe = result.scalars().first() if run_dbe is None: return None @@ -317,43 +238,21 @@ async def edit_run( run_id=run.id, ) - run_references: List[dict] = [] - - if run and run.data and run.data.steps: - _references: Dict[str, dict] = {} - - for step in run.data.steps: - if not step.references: - continue - - for key, ref in step.references.items(): - _key = getattr(ref, "id", None) or key - _references[_key] = ref.model_dump( - mode="json", - exclude_none=True, - ) | {"key": str(key)} - - run_references = list(_references.values()) - run_dbe = edit_dbe_from_dto( dbe=run_dbe, dto=run, updated_at=datetime.now(timezone.utc), updated_by_id=user_id, - references=run_references, ) - if run.data: - run_dbe.data = run.data.model_dump(mode="json") # type: ignore - await session.commit() - _run = create_dto_from_dbe( + run = create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, ) - return _run + return run @suppress_exceptions(default=[]) async def edit_runs( @@ -369,17 +268,14 @@ async def edit_runs( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id.in_(run_ids), ) stmt = stmt.limit(len(run_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbes = res.scalars().all() + run_dbes = result.scalars().all() if not run_dbes: return [] @@ -389,7 +285,7 @@ async def edit_runs( if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=run_dbe.id, # type: ignore + run_id=run_dbe.id, ) run = next( @@ -397,41 +293,17 @@ async def edit_runs( None, ) - if run is None: - continue - - run_references: List[dict] = [] - - if run and run.data and run.data.steps: - _references: Dict[str, dict] = {} - - for step in run.data.steps: - if not step.references: - continue - - for key, ref in step.references.items(): - _key = getattr(ref, "id", None) or key - _references[_key] = ref.model_dump( - mode="json", - exclude_none=True, - ) | {"key": str(key)} - - run_references = list(_references.values()) - - run_dbe = edit_dbe_from_dto( - dbe=run_dbe, - dto=run, - updated_at=datetime.now(timezone.utc), - updated_by_id=user_id, - references=run_references, - ) - - if run.data: - run_dbe.data = run.data.model_dump(mode="json") # type: ignore + if run is not None: + run_dbe = edit_dbe_from_dto( + dbe=run_dbe, + dto=run, + updated_at=datetime.now(timezone.utc), + updated_by_id=user_id, + ) await session.commit() - _runs = [ + runs = [ create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, @@ -439,7 +311,7 @@ async def edit_runs( for run_dbe in run_dbes ] - return _runs + return runs @suppress_exceptions() async def delete_run( @@ -452,17 +324,14 @@ async def delete_run( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id == run_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbe = res.scalars().first() + run_dbe = result.scalars().first() if run_dbe is None: return None @@ -484,17 +353,14 @@ async def delete_runs( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id.in_(run_ids), ) stmt = stmt.limit(len(run_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbes = res.scalars().all() + run_dbes = result.scalars().all() if not run_dbes: return [] @@ -504,66 +370,56 @@ async def delete_runs( await session.commit() - run_ids = [run_dbe.id for run_dbe in run_dbes] # type: ignore + run_ids = [run_dbe.id for run_dbe in run_dbes] return run_ids @suppress_exceptions() - async def close_run( + async def archive_run( self, *, project_id: UUID, user_id: UUID, # run_id: UUID, - # - status: Optional[EvaluationStatus] = None, ) -> Optional[EvaluationRun]: async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id == run_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbe = res.scalars().first() + run_dbe = result.scalars().first() if run_dbe is None: return None - if status: - run_dbe.status = status.value - flag_modified(run_dbe, "status") - - if run_dbe.flags is None: - run_dbe.flags = EvaluationRunFlags().model_dump( # type: ignore - mode="json", - exclude_none=True, - ) + if not run_dbe.flags: + run_dbe.flags = EvaluationRunFlags().model_dump(mode="json") - # run_dbe.flags["is_closed"] = True # type: ignore - flag_modified(run_dbe, "flags") + run_dbe.flags["is_closed"] = True - run_dbe.updated_at = datetime.now(timezone.utc) # type: ignore - run_dbe.updated_by_id = user_id # type: ignore + now = datetime.now(timezone.utc) + run_dbe.updated_at = now + run_dbe.updated_by_id = user_id + run_dbe.deleted_at = now + run_dbe.deleted_by_id = user_id await session.commit() - _run = create_dto_from_dbe( + run = create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, ) - return _run + return run @suppress_exceptions(default=[]) - async def close_runs( + async def archive_runs( self, *, project_id: UUID, @@ -574,37 +430,34 @@ async def close_runs( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id.in_(run_ids), ) stmt = stmt.limit(len(run_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbes = res.scalars().all() + run_dbes = result.scalars().all() if not run_dbes: return [] for run_dbe in run_dbes: - if run_dbe.flags is None: - run_dbe.flags = EvaluationRunFlags().model_dump( # type: ignore - mode="json", - exclude_none=True, - ) + if not run_dbe.flags: + run_dbe.flags = EvaluationRunFlags().model_dump(mode="json") - # run_dbe.flags["is_closed"] = True # type: ignore - flag_modified(run_dbe, "flags") + run_dbe.flags["is_closed"] = True - run_dbe.updated_at = datetime.now(timezone.utc) # type: ignore - run_dbe.updated_by_id = user_id # type: ignore + now = datetime.now(timezone.utc) + for run_dbe in run_dbes: + run_dbe.updated_at = now + run_dbe.updated_by_id = user_id + run_dbe.deleted_at = now + run_dbe.deleted_by_id = user_id await session.commit() - _runs = [ + runs = [ create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, @@ -612,10 +465,10 @@ async def close_runs( for run_dbe in run_dbes ] - return _runs + return runs @suppress_exceptions() - async def open_run( + async def unarchive_run( self, *, project_id: UUID, @@ -626,44 +479,35 @@ async def open_run( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id == run_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbe = res.scalars().first() + run_dbe = result.scalars().first() if run_dbe is None: return None - if run_dbe.flags is None: - run_dbe.flags = EvaluationRunFlags().model_dump( # type: ignore - mode="json", - exclude_none=True, - ) - - run_dbe.flags["is_closed"] = False # type: ignore - flag_modified(run_dbe, "flags") - - run_dbe.updated_at = datetime.now(timezone.utc) # type: ignore - run_dbe.updated_by_id = user_id # type: ignore + now = datetime.now(timezone.utc) + run_dbe.updated_at = now + run_dbe.updated_by_id = user_id + run_dbe.deleted_at = None + run_dbe.deleted_by_id = None await session.commit() - _run = create_dto_from_dbe( + run = create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, ) - return _run + return run @suppress_exceptions(default=[]) - async def open_runs( + async def unarchive_runs( self, *, project_id: UUID, @@ -674,37 +518,28 @@ async def open_runs( async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, - ) - - stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.id.in_(run_ids), ) stmt = stmt.limit(len(run_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - run_dbes = res.scalars().all() + run_dbes = result.scalars().all() if not run_dbes: return [] + now = datetime.now(timezone.utc) for run_dbe in run_dbes: - if run_dbe.flags is None: - run_dbe.flags = EvaluationRunFlags().model_dump( # type: ignore - mode="json", - exclude_none=True, - ) - - run_dbe.flags["is_closed"] = False # type: ignore - flag_modified(run_dbe, "flags") - - run_dbe.updated_at = datetime.now(timezone.utc) # type: ignore - run_dbe.updated_by_id = user_id # type: ignore + run_dbe.updated_at = now + run_dbe.updated_by_id = user_id + run_dbe.deleted_at = None + run_dbe.deleted_by_id = None await session.commit() - _runs = [ + runs = [ create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, @@ -712,101 +547,87 @@ async def open_runs( for run_dbe in run_dbes ] - return _runs + return runs - @suppress_exceptions(default=[]) - async def query_runs( + @suppress_exceptions() + async def close_run( self, *, project_id: UUID, + user_id: UUID, # - run: Optional[EvaluationRunQuery] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[EvaluationRun]: + run_id: UUID, + ) -> Optional[EvaluationRun]: async with engine.core_session() as session: stmt = select(EvaluationRunDBE).filter( EvaluationRunDBE.project_id == project_id, + EvaluationRunDBE.id == run_id, ) - if run is not None: - if run.ids is not None: - stmt = stmt.filter( - EvaluationRunDBE.id.in_(run.ids), - ) + stmt = stmt.limit(1) - if run.references is not None: - run_references: List[dict] = list() + result = await session.execute(stmt) - for _references in run.references: - for key, ref in _references.items(): - # _key = getattr(ref, "id", None) or key - run_references.append( - ref.model_dump( - mode="json", - exclude_none=True, - ) - # | {"key": str(key)} - ) + run_dbe = result.scalars().first() - stmt = stmt.filter( - EvaluationRunDBE.references.contains(run_references), - ) + if run_dbe is None: + return None - if run.flags is not None: - run_flags = run.flags.model_dump( - mode="json", - exclude_none=True, - ) + if not run_dbe.flags: + run_dbe.flags = EvaluationRunFlags().model_dump(mode="json") - stmt = stmt.filter( - EvaluationRunDBE.flags.contains(run_flags), - ) + run_dbe.flags["is_closed"] = True - if run.tags is not None: - stmt = stmt.filter( - EvaluationRunDBE.tags.contains(run.tags), - ) + now = datetime.now(timezone.utc) + run_dbe.updated_at = now + run_dbe.updated_by_id = user_id - if run.meta is not None: - stmt = stmt.filter( - EvaluationRunDBE.meta.contains(run.meta), - ) + await session.commit() - if run.status is not None: - stmt = stmt.filter( - EvaluationRunDBE.status == run.status, - ) + run = create_dto_from_dbe( + DTO=EvaluationRun, + dbe=run_dbe, + ) - if run.statuses is not None: - stmt = stmt.filter( - EvaluationRunDBE.status.in_(run.statuses), - ) + return run - if run.name is not None: - stmt = stmt.filter( - EvaluationRunDBE.name.ilike(f"%{run.name}%"), - ) + @suppress_exceptions(default=[]) + async def close_runs( + self, + *, + project_id: UUID, + user_id: UUID, + # + run_ids: List[UUID], + ) -> List[UUID]: + async with engine.core_session() as session: + stmt = select(EvaluationRunDBE).filter( + EvaluationRunDBE.project_id == project_id, + EvaluationRunDBE.id.in_(run_ids), + ) - if run.description is not None: - stmt = stmt.filter( - EvaluationRunDBE.description.ilike(f"%{run.description}%"), - ) + stmt = stmt.limit(len(run_ids)) - if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=EvaluationRunDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, - ) + result = await session.execute(stmt) - res = await session.execute(stmt) + run_dbes = result.scalars().all() - run_dbes = res.scalars().all() + if not run_dbes: + return [] + + now = datetime.now(timezone.utc) + for run_dbe in run_dbes: + if not run_dbe.flags: + run_dbe.flags = EvaluationRunFlags().model_dump(mode="json") + + run_dbe.flags["is_closed"] = True + + run_dbe.updated_at = now + run_dbe.updated_by_id = user_id + + await session.commit() - _runs = [ + runs = [ create_dto_from_dbe( DTO=EvaluationRun, dbe=run_dbe, @@ -814,58 +635,119 @@ async def query_runs( for run_dbe in run_dbes ] - return _runs + return runs @suppress_exceptions(default=[]) - async def fetch_live_runs( + async def query_runs( self, *, + project_id: UUID, + # + run: EvaluationRunQuery, + # + include_archived: Optional[bool] = None, + # windowing: Optional[Windowing] = None, - ) -> List[Tuple[UUID, EvaluationRun]]: + ) -> List[EvaluationRun]: async with engine.core_session() as session: - stmt = select(EvaluationRunDBE) - - stmt = stmt.filter( - not_(EvaluationRunDBE.flags.contains({"is_closed": True})), + stmt = select(EvaluationRunDBE).filter( + EvaluationRunDBE.project_id == project_id, ) - stmt = stmt.filter( - EvaluationRunDBE.flags.contains({"is_live": True}), - ) + # data-based filtering: generic JSONB containment for any nested data filters + if run.data is not None: + data_dict = run.data.dict(exclude_none=True) + if data_dict: + stmt = stmt.filter(EvaluationRunDBE.data.contains(data_dict)) - stmt = stmt.filter( - EvaluationRunDBE.flags.contains({"is_active": True}), - ) + if run.flags is not None: + stmt = stmt.filter( + EvaluationRunDBE.flags.contains( + run.flags.model_dump(mode="json"), + ), + ) - stmt = stmt.filter( - EvaluationRunDBE.status == "running", - ) + if run.tags is not None: + stmt = stmt.filter( + EvaluationRunDBE.tags.contains(run.tags), + ) + + if run.meta is not None: + # If meta is a list, OR across .contains() for each dict + if isinstance(run.meta, list): + or_filters = [ + EvaluationRunDBE.meta.contains(m) + for m in run.meta + if isinstance(m, dict) and m + ] + if or_filters: + stmt = stmt.filter(sqlalchemy.or_(*or_filters)) + # If meta is a dict, filter as before + elif isinstance(run.meta, dict): + stmt = stmt.filter(EvaluationRunDBE.meta.contains(run.meta)) + # Otherwise, ignore (invalid type) + + if run.status is not None: + stmt = stmt.filter( + EvaluationRunDBE.status == run.status, + ) - if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=EvaluationRunDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, + if run.statuses is not None: + stmt = stmt.filter( + EvaluationRunDBE.status.in_(run.statuses), ) - res = await session.execute(stmt) + if include_archived is not True: + stmt = stmt.filter( + EvaluationRunDBE.deleted_at.is_(None), + ) - run_dbes = res.scalars().all() + if windowing is not None: + if windowing.next is not None: + stmt = stmt.filter( + EvaluationRunDBE.id > windowing.next, + ) - _runs = [ - ( - UUID(str(run_dbe.project_id)), - create_dto_from_dbe( - DTO=EvaluationRun, - dbe=run_dbe, - ), + if windowing.start is not None: + stmt = stmt.filter( + EvaluationRunDBE.created_at > windowing.start, + ) + + if windowing.stop is not None: + stmt = stmt.filter( + EvaluationRunDBE.created_at <= windowing.stop, + ) + + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + stmt = stmt.order_by(EvaluationRunDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + stmt = stmt.order_by(EvaluationRunDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationRunDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationRunDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationRunDBE.created_at.desc()) + + if windowing is not None: + if windowing.limit is not None: + stmt = stmt.limit(windowing.limit) + + result = await session.execute(stmt) + + run_dbes = result.scalars().all() + + runs = [ + create_dto_from_dbe( + DTO=EvaluationRun, + dbe=run_dbe, ) for run_dbe in run_dbes ] - return _runs + return runs # - EVALUATION SCENARIO ---------------------------------------------------- @@ -888,19 +770,17 @@ async def create_scenario( run_id=scenario.run_id, ) - _scenario = EvaluationScenario( - **scenario.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + now = datetime.now(timezone.utc) + scenario = EvaluationScenario( + **scenario.model_dump(), + created_at=now, created_by_id=user_id, ) scenario_dbe = create_dbe_from_dto( DBE=EvaluationScenarioDBE, project_id=project_id, - dto=_scenario, + dto=scenario, ) try: @@ -909,12 +789,12 @@ async def create_scenario( await session.commit() - _scenario = create_dto_from_dbe( + scenario = create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, ) - return _scenario + return scenario except Exception as e: check_entity_creation_conflict(e) @@ -941,13 +821,11 @@ async def create_scenarios( run_id=scenario.run_id, ) - _scenarios = [ + now = datetime.now(timezone.utc) + scenarios = [ EvaluationScenario( - **scenario.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + **scenario.model_dump(), + created_at=now, created_by_id=user_id, ) for scenario in scenarios @@ -957,9 +835,9 @@ async def create_scenarios( create_dbe_from_dto( DBE=EvaluationScenarioDBE, project_id=project_id, - dto=_scenario, + dto=scenario, ) - for _scenario in _scenarios + for scenario in scenarios ] try: @@ -968,7 +846,7 @@ async def create_scenarios( await session.commit() - _scenarios = [ + scenarios = [ create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, @@ -976,7 +854,7 @@ async def create_scenarios( for scenario_dbe in scenario_dbes ] - return _scenarios + return scenarios except Exception as e: check_entity_creation_conflict(e) @@ -994,27 +872,24 @@ async def fetch_scenario( async with engine.core_session() as session: stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.project_id == project_id, - ) - - stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.id == scenario_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbe = res.scalars().first() + scenario_dbe = result.scalars().first() if scenario_dbe is None: return None - _scenario = create_dto_from_dbe( + scenario = create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, ) - return _scenario + return scenario @suppress_exceptions(default=[]) async def fetch_scenarios( @@ -1027,19 +902,16 @@ async def fetch_scenarios( async with engine.core_session() as session: stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.project_id == project_id, - ) - - stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.id.in_(scenario_ids), ) stmt = stmt.limit(len(scenario_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbes = res.scalars().all() + scenario_dbes = result.scalars().all() - _scenarios = [ + scenarios = [ create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, @@ -1047,7 +919,7 @@ async def fetch_scenarios( for scenario_dbe in scenario_dbes ] - return _scenarios + return scenarios @suppress_exceptions() async def edit_scenario( @@ -1061,17 +933,14 @@ async def edit_scenario( async with engine.core_session() as session: stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.project_id == project_id, - ) - - stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.id == scenario.id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbe = res.scalars().first() + scenario_dbe = result.scalars().first() if scenario_dbe is None: return None @@ -1079,13 +948,13 @@ async def edit_scenario( run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=scenario_dbe.run_id, # type: ignore + run_id=scenario_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=scenario_dbe.run_id, # type: ignore - scenario_id=scenario_dbe.id, # type: ignore + run_id=scenario_dbe.run_id, + scenario_id=scenario_dbe.id, ) scenario_dbe = edit_dbe_from_dto( @@ -1097,12 +966,12 @@ async def edit_scenario( await session.commit() - _scenario = create_dto_from_dbe( + scenario = create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, ) - return _scenario + return scenario @suppress_exceptions(default=[]) async def edit_scenarios( @@ -1118,17 +987,14 @@ async def edit_scenarios( async with engine.core_session() as session: stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.project_id == project_id, - ) - - stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.id.in_(scenario_ids), ) stmt = stmt.limit(len(scenario_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbes = res.scalars().all() + scenario_dbes = result.scalars().all() if not scenario_dbes: return [] @@ -1137,13 +1003,13 @@ async def edit_scenarios( run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=scenario_dbe.run_id, # type: ignore + run_id=scenario_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=scenario_dbe.run_id, # type: ignore - scenario_id=scenario_dbe.id, # type: ignore + run_id=scenario_dbe.run_id, + scenario_id=scenario_dbe.id, ) scenario = next( @@ -1161,7 +1027,7 @@ async def edit_scenarios( await session.commit() - _scenarios = [ + scenarios = [ create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, @@ -1169,7 +1035,7 @@ async def edit_scenarios( for scenario_dbe in scenario_dbes ] - return _scenarios + return scenarios @suppress_exceptions() async def delete_scenario( @@ -1182,31 +1048,28 @@ async def delete_scenario( async with engine.core_session() as session: stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.project_id == project_id, - ) - - stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.id == scenario_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbe = res.scalars().first() + scenario_dbe = result.scalars().first() - if not scenario_dbe: + if scenario_dbe is None: return None run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=scenario_dbe.run_id, # type: ignore + run_id=scenario_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=scenario_dbe.run_id, # type: ignore - scenario_id=scenario_dbe.id, # type: ignore + run_id=scenario_dbe.run_id, + scenario_id=scenario_dbe.id, ) await session.delete(scenario_dbe) @@ -1226,17 +1089,14 @@ async def delete_scenarios( async with engine.core_session() as session: stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.project_id == project_id, - ) - - stmt = select(EvaluationScenarioDBE).filter( EvaluationScenarioDBE.id.in_(scenario_ids), ) stmt = stmt.limit(len(scenario_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbes = res.scalars().all() + scenario_dbes = result.scalars().all() if not scenario_dbes: return [] @@ -1245,20 +1105,20 @@ async def delete_scenarios( run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=scenario_dbe.run_id, # type: ignore + run_id=scenario_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=scenario_dbe.run_id, # type: ignore - scenario_id=scenario_dbe.id, # type: ignore + run_id=scenario_dbe.run_id, + scenario_id=scenario_dbe.id, ) await session.delete(scenario_dbe) await session.commit() - scenario_ids = [scenario_dbe.id for scenario_dbe in scenario_dbes] # type: ignore + scenario_ids = [scenario_dbe.id for scenario_dbe in scenario_dbes] return scenario_ids @@ -1268,7 +1128,7 @@ async def query_scenarios( *, project_id: UUID, # - scenario: Optional[EvaluationScenarioQuery] = None, + scenario: EvaluationScenarioQuery, # windowing: Optional[Windowing] = None, ) -> List[EvaluationScenario]: @@ -1277,81 +1137,81 @@ async def query_scenarios( EvaluationScenarioDBE.project_id == project_id, ) - if scenario is not None: - if scenario.ids is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.id.in_(scenario.ids), - ) - - if scenario.run_id is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.run_id == scenario.run_id, - ) + if scenario.run_id is not None: + stmt = stmt.filter( + EvaluationScenarioDBE.run_id == scenario.run_id, + ) - if scenario.run_ids is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.run_id.in_(scenario.run_ids), - ) + if scenario.run_ids is not None: + stmt = stmt.filter( + EvaluationScenarioDBE.run_id.in_(scenario.run_ids), + ) - if scenario.timestamp is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.timestamp == scenario.timestamp, - ) + # if scenario.flags is not None: + # stmt = stmt.filter( + # EvaluationScenarioDBE.flags.contains( + # scenario.flags.model_dump(mode="json"), + # ), + # ) - if scenario.timestamps is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.timestamp.in_(scenario.timestamps), - ) + if scenario.tags is not None: + stmt = stmt.filter( + EvaluationScenarioDBE.tags.contains(scenario.tags), + ) - if scenario.interval is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.interval == scenario.interval, - ) + if scenario.meta is not None: + stmt = stmt.filter( + EvaluationScenarioDBE.meta.contains(scenario.meta), + ) - if scenario.intervals is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.interval.in_(scenario.intervals), - ) + if scenario.status is not None: + stmt = stmt.filter( + EvaluationScenarioDBE.status == scenario.status, + ) - if scenario.flags is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.flags.contains(scenario.flags), - ) + if scenario.statuses is not None: + stmt = stmt.filter( + EvaluationScenarioDBE.status.in_(scenario.statuses), + ) - if scenario.tags is not None: + if windowing is not None: + if windowing.next is not None: stmt = stmt.filter( - EvaluationScenarioDBE.tags.contains(scenario.tags), + EvaluationScenarioDBE.id > windowing.next, ) - if scenario.meta is not None: + if windowing.start is not None: stmt = stmt.filter( - EvaluationScenarioDBE.meta.contains(scenario.meta), + EvaluationScenarioDBE.created_at > windowing.start, ) - if scenario.status is not None: + if windowing.stop is not None: stmt = stmt.filter( - EvaluationScenarioDBE.status == scenario.status, + EvaluationScenarioDBE.created_at <= windowing.stop, ) - if scenario.statuses is not None: - stmt = stmt.filter( - EvaluationScenarioDBE.status.in_(scenario.statuses), - ) + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + stmt = stmt.order_by(EvaluationScenarioDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + stmt = stmt.order_by(EvaluationScenarioDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationScenarioDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationScenarioDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationScenarioDBE.created_at.desc()) - if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=EvaluationScenarioDBE, - attribute="id", # UUID7 - order="ascending", # data-style - windowing=windowing, - ) + if windowing is not None: + if windowing.limit is not None: + stmt = stmt.limit(windowing.limit) - res = await session.execute(stmt) + result = await session.execute(stmt) - scenario_dbes = res.scalars().all() + scenario_dbes = result.scalars().all() - _scenarios = [ + scenarios = [ create_dto_from_dbe( DTO=EvaluationScenario, dbe=scenario_dbe, @@ -1359,56 +1219,58 @@ async def query_scenarios( for scenario_dbe in scenario_dbes ] - return _scenarios + return scenarios - # - EVALUATION RESULT ------------------------------------------------------ + # - EVALUATION STEP -------------------------------------------------------- @suppress_exceptions(exclude=[EntityCreationConflict]) - async def create_result( + async def create_step( self, *, project_id: UUID, user_id: UUID, # - result: EvaluationResultCreate, - ) -> Optional[EvaluationResult]: + step: EvaluationStepCreate, + ) -> Optional[EvaluationStep]: run_flags = await _get_run_flags( project_id=project_id, - run_id=result.run_id, + run_id=step.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=result.run_id, + run_id=step.run_id, ) - _result = EvaluationResult( - **result.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + step.repeat_id = step.repeat_id or uuid4() + step.scenario_id = step.scenario_id or uuid4() + + now = datetime.now(timezone.utc) + step = EvaluationStep( + **step.model_dump(), + created_at=now, created_by_id=user_id, + timestamp=now, ) - result_dbe = create_dbe_from_dto( - DBE=EvaluationResultDBE, + step_dbe = create_dbe_from_dto( + DBE=EvaluationStepDBE, project_id=project_id, - dto=_result, + dto=step, ) try: async with engine.core_session() as session: - session.add(result_dbe) + session.add(step_dbe) await session.commit() - _result = create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + step = create_dto_from_dbe( + DTO=EvaluationStep, + dbe=step_dbe, ) - return _result + return step except Exception as e: check_entity_creation_conflict(e) @@ -1416,848 +1278,523 @@ async def create_result( raise @suppress_exceptions(default=[], exclude=[EntityCreationConflict]) - async def create_results( + async def create_steps( self, *, project_id: UUID, user_id: UUID, # - results: List[EvaluationResultCreate], - ) -> List[EvaluationResult]: - for result in results: + steps: List[EvaluationStepCreate], + ) -> List[EvaluationStep]: + for step in steps: run_flags = await _get_run_flags( project_id=project_id, - run_id=result.run_id, + run_id=step.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=result.run_id, + run_id=step.run_id, ) + step.repeat_id = step.repeat_id or uuid4() + step.retry_id = step.retry_id or uuid4() + async with engine.core_session() as session: - _results = [ - EvaluationResult( - **result.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + now = datetime.now(timezone.utc) + steps = [ + EvaluationStep( + **step.model_dump(), + created_at=now, created_by_id=user_id, + timestamp=now, ) - for result in results + for step in steps ] - result_dbes = [ + step_dbes = [ create_dbe_from_dto( - DBE=EvaluationResultDBE, + DBE=EvaluationStepDBE, project_id=project_id, - dto=_result, + dto=step, ) - for _result in _results + for step in steps ] - session.add_all(result_dbes) + session.add_all(step_dbes) await session.commit() - _results = [ + steps = [ create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + DTO=EvaluationStep, + dbe=step_dbe, ) - for result_dbe in result_dbes + for step_dbe in step_dbes ] - return _results + return steps @suppress_exceptions() - async def fetch_result( + async def fetch_step( self, *, project_id: UUID, # - result_id: UUID, - ) -> Optional[EvaluationResult]: + step_id: UUID, + ) -> Optional[EvaluationStep]: async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, - ) - - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.id == result_id, + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, + EvaluationStepDBE.id == step_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - result_dbe = res.scalars().first() + step_dbe = result.scalars().first() - if result_dbe is None: + if step_dbe is None: return None - _result = create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + step = create_dto_from_dbe( + DTO=EvaluationStep, + dbe=step_dbe, ) - return _result + return step @suppress_exceptions(default=[]) - async def fetch_results( + async def fetch_steps( self, *, project_id: UUID, # - result_ids: List[UUID], - ) -> List[EvaluationResult]: + step_ids: List[UUID], + ) -> List[EvaluationStep]: async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, - ) - - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.id.in_(result_ids), + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, + EvaluationStepDBE.id.in_(step_ids), ) - stmt = stmt.limit(len(result_ids)) + stmt = stmt.limit(len(step_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - result_dbes = res.scalars().all() + step_dbes = result.scalars().all() - _results = [ + steps = [ create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + DTO=EvaluationStep, + dbe=step_dbe, ) - for result_dbe in result_dbes + for step_dbe in step_dbes ] - return _results + return steps @suppress_exceptions() - async def edit_result( + async def edit_step( self, *, project_id: UUID, user_id: UUID, # - result: EvaluationResultEdit, - ) -> Optional[EvaluationResult]: + step: EvaluationStepEdit, + ) -> Optional[EvaluationStep]: async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, - ) - - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.id == result.id, + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, + EvaluationStepDBE.id == step.id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - result_dbe = res.scalars().first() + step_dbe = result.scalars().first() - if result_dbe is None: + if step_dbe is None: return None run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=result_dbe.run_id, # type: ignore + run_id=step_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=result_dbe.run_id, # type: ignore - scenario_id=result_dbe.scenario_id, # type: ignore - result_id=result_dbe.id, # type: ignore + run_id=step_dbe.run_id, + scenario_id=step_dbe.scenario_id, + step_id=step_dbe.id, ) - result_dbe = edit_dbe_from_dto( - dbe=result_dbe, - dto=result, + step_dbe = edit_dbe_from_dto( + dbe=step_dbe, + dto=step, + timestamp=datetime.now(timezone.utc), updated_at=datetime.now(timezone.utc), updated_by_id=user_id, ) await session.commit() - _result = create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + step = create_dto_from_dbe( + DTO=EvaluationStep, + dbe=step_dbe, ) - return _result + return step @suppress_exceptions(default=[]) - async def edit_results( + async def edit_steps( self, *, project_id: UUID, user_id: UUID, # - results: List[EvaluationResultEdit], - ) -> List[EvaluationResult]: - result_ids = [result.id for result in results] + steps: List[EvaluationStepEdit], + ) -> List[EvaluationStep]: + step_ids = [step.id for step in steps] async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, - ) - - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.id.in_(result_ids), + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, + EvaluationStepDBE.id.in_(step_ids), ) - stmt = stmt.limit(len(result_ids)) + stmt = stmt.limit(len(step_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - result_dbes = res.scalars().all() + step_dbes = result.scalars().all() - if not result_dbes: + if not step_dbes: return [] - for result_dbe in result_dbes: + for step_dbe in step_dbes: run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=result_dbe.run_id, # type: ignore + run_id=step_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=result_dbe.run_id, # type: ignore - scenario_id=result_dbe.scenario_id, # type: ignore - result_id=result_dbe.id, # type: ignore + run_id=step_dbe.run_id, + scenario_id=step_dbe.scenario_id, + step_id=step_dbe.id, ) - result = next( - (s for s in results if s.id == result_dbe.id), + step = next( + (s for s in steps if s.id == step_dbe.id), None, ) - if result is not None: - result_dbe = edit_dbe_from_dto( - dbe=result_dbe, - dto=result, + if step is not None: + step_dbe = edit_dbe_from_dto( + dbe=step_dbe, + dto=step, + timestamp=datetime.now(timezone.utc), updated_at=datetime.now(timezone.utc), updated_by_id=user_id, ) await session.commit() - _results = [ + steps = [ create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + DTO=EvaluationStep, + dbe=step_dbe, ) - for result_dbe in result_dbes + for step_dbe in step_dbes ] - return _results + return steps @suppress_exceptions() - async def delete_result( + async def delete_step( self, *, project_id: UUID, # - result_id: UUID, + step_id: UUID, ) -> Optional[UUID]: async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, - ) - - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.id == result_id, + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, + EvaluationStepDBE.id == step_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - result_dbe = res.scalars().first() + step_dbe = result.scalars().first() - if result_dbe is None: + if step_dbe is None: return None run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=result_dbe.run_id, # type: ignore + run_id=step_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=result_dbe.run_id, # type: ignore - scenario_id=result_dbe.scenario_id, # type: ignore - result_id=result_dbe.id, # type: ignore + run_id=step_dbe.run_id, + scenario_id=step_dbe.scenario_id, + step_id=step_dbe.id, ) - await session.delete(result_dbe) + await session.delete(step_dbe) await session.commit() - return result_id + return step_id @suppress_exceptions(default=[]) - async def delete_results( + async def delete_steps( self, *, project_id: UUID, # - result_ids: List[UUID], + step_ids: List[UUID], ) -> List[UUID]: async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, - ) - - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.id.in_(result_ids), + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, + EvaluationStepDBE.id.in_(step_ids), ) - stmt = stmt.limit(len(result_ids)) + stmt = stmt.limit(len(step_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - result_dbes = res.scalars().all() + step_dbes = result.scalars().all() - if not result_dbes: + if not step_dbes: return [] - for result_dbe in result_dbes: + for step_dbe in step_dbes: run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=result_dbe.run_id, # type: ignore + run_id=step_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=result_dbe.run_id, # type: ignore - scenario_id=result_dbe.scenario_id, # type: ignore - result_id=result_dbe.id, # type: ignore + run_id=step_dbe.run_id, + scenario_id=step_dbe.scenario_id, + step_id=step_dbe.id, ) - await session.delete(result_dbe) + await session.delete(step_dbe) await session.commit() - return result_ids + return step_ids @suppress_exceptions(default=[]) - async def query_results( + async def query_steps( self, *, project_id: UUID, # - result: Optional[EvaluationResultQuery] = None, + step: EvaluationStepQuery, # windowing: Optional[Windowing] = None, - ) -> List[EvaluationResult]: + ) -> List[EvaluationStep]: async with engine.core_session() as session: - stmt = select(EvaluationResultDBE).filter( - EvaluationResultDBE.project_id == project_id, + stmt = select(EvaluationStepDBE).filter( + EvaluationStepDBE.project_id == project_id, ) - if result is not None: - if result.ids is not None: - stmt = stmt.filter( - EvaluationResultDBE.id.in_(result.ids), - ) + if step.ids is not None: + stmt = stmt.filter( + EvaluationStepDBE.id.in_(step.ids), + ) - if result.run_id is not None: - stmt = stmt.filter( - EvaluationResultDBE.run_id == result.run_id, - ) + if step.run_id is not None: + stmt = stmt.filter( + EvaluationStepDBE.run_id == step.run_id, + ) - if result.run_ids is not None: - stmt = stmt.filter( - EvaluationResultDBE.run_id.in_(result.run_ids), - ) + if step.run_ids is not None: + stmt = stmt.filter( + EvaluationStepDBE.run_id.in_(step.run_ids), + ) - if result.scenario_id is not None: - stmt = stmt.filter( - EvaluationResultDBE.scenario_id == result.scenario_id, - ) + if step.scenario_id is not None: + stmt = stmt.filter( + EvaluationStepDBE.scenario_id == step.scenario_id, + ) - if result.scenario_ids is not None: - stmt = stmt.filter( - EvaluationResultDBE.scenario_id.in_(result.scenario_ids), - ) - - if result.step_key is not None: - stmt = stmt.filter( - EvaluationResultDBE.step_key == result.step_key, - ) - - if result.step_keys is not None: - stmt = stmt.filter( - EvaluationResultDBE.step_key.in_(result.step_keys), - ) - - if result.repeat_idx is not None: - stmt = stmt.filter( - EvaluationResultDBE.repeat_idx == result.repeat_idx, - ) - - if result.repeat_idxs is not None: - stmt = stmt.filter( - EvaluationResultDBE.repeat_idx.in_(result.repeat_idxs), - ) - - if result.timestamp is not None: - stmt = stmt.filter( - EvaluationResultDBE.timestamp == result.timestamp, - ) - - if result.timestamps is not None: - stmt = stmt.filter( - EvaluationResultDBE.timestamp.in_(result.timestamps), - ) - - if result.interval is not None: - stmt = stmt.filter( - EvaluationResultDBE.interval == result.interval, - ) - - if result.intervals is not None: - stmt = stmt.filter( - EvaluationResultDBE.interval.in_(result.intervals), - ) - - if result.flags is not None: - stmt = stmt.filter( - EvaluationResultDBE.flags.contains(result.flags), - ) - - if result.tags is not None: - stmt = stmt.filter( - EvaluationResultDBE.tags.contains(result.tags), - ) - - if result.meta is not None: - stmt = stmt.filter( - EvaluationResultDBE.meta.contains(result.meta), - ) - - if result.status is not None: - stmt = stmt.filter( - EvaluationResultDBE.status == result.status, - ) - - if result.statuses is not None: - stmt = stmt.filter( - EvaluationResultDBE.status.in_(result.statuses), - ) - - if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=EvaluationResultDBE, - attribute="id", # UUID7 - order="ascending", # data-style - windowing=windowing, + if step.scenario_ids is not None: + stmt = stmt.filter( + EvaluationStepDBE.scenario_id.in_(step.scenario_ids), ) - res = await session.execute(stmt) + # if step.flags is not None: + # stmt = stmt.filter( + # EvaluationStepDBE.flags.contains( + # step.flags.model_dump(mode="json"), + # ), + # ) - result_dbes = res.scalars().all() - - results = [ - create_dto_from_dbe( - DTO=EvaluationResult, - dbe=result_dbe, + if step.tags is not None: + stmt = stmt.filter( + EvaluationStepDBE.tags.contains(step.tags), ) - for result_dbe in result_dbes - ] - - return results - - # - EVALUATION METRICS ----------------------------------------------------- - @suppress_exceptions(default=[], exclude=[EntityCreationConflict]) - async def create_metrics( - self, - *, - project_id: UUID, - user_id: UUID, - # - metrics: List[EvaluationMetricsCreate], - ) -> List[EvaluationMetrics]: - for metric in metrics: - run_flags = await _get_run_flags( - project_id=project_id, - run_id=metric.run_id, - ) - - if run_flags.get("is_closed", False): - raise EvaluationClosedConflict( - run_id=metric.run_id, + if step.meta is not None: + stmt = stmt.filter( + EvaluationStepDBE.meta.contains(step.meta), ) - _metrics = [ - EvaluationMetrics( - **metric.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), - created_by_id=user_id, - ) - for metric in metrics - ] - - metric_dbes = [ - create_dbe_from_dto( - DBE=EvaluationMetricsDBE, - project_id=project_id, - dto=_metric, - ) - for _metric in _metrics - ] - - try: - async with engine.core_session() as session: - session.add_all(metric_dbes) - - await session.commit() - - _metrics = [ - create_dto_from_dbe( - DTO=EvaluationMetrics, - dbe=metric_dbe, - ) - for metric_dbe in metric_dbes - ] - - return _metrics - - except Exception as e: - check_entity_creation_conflict(e) - - raise - - @suppress_exceptions(default=[]) - async def fetch_metrics( - self, - *, - project_id: UUID, - # - metrics_ids: List[UUID], - ) -> List[EvaluationMetrics]: - async with engine.core_session() as session: - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.project_id == project_id, - ) - - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.id.in_(metrics_ids), - ) - - stmt = stmt.limit(len(metrics_ids)) - - res = await session.execute(stmt) - - metric_dbes = res.scalars().all() - - _metrics = [ - create_dto_from_dbe( - DTO=EvaluationMetrics, - dbe=metric_dbe, + if step.key is not None: + stmt = stmt.filter( + EvaluationStepDBE.key == step.key, ) - for metric_dbe in metric_dbes - ] - - return _metrics - - @suppress_exceptions(default=[]) - async def edit_metrics( - self, - *, - project_id: UUID, - user_id: UUID, - # - metrics: List[EvaluationMetricsEdit], - ) -> List[EvaluationMetrics]: - metrics_ids = [metric.id for metric in metrics] - async with engine.core_session() as session: - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.project_id == project_id, - ) - - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.id.in_(metrics_ids), - ) - - stmt = stmt.limit(len(metrics_ids)) - - res = await session.execute(stmt) - - metric_dbes = res.scalars().all() - - if not metric_dbes: - return [] - - for metric_dbe in metric_dbes: - run_flags = await _get_run_flags( - session=session, - project_id=project_id, - run_id=metric_dbe.run_id, # type: ignore + if step.keys is not None: + stmt = stmt.filter( + EvaluationStepDBE.key.in_(step.keys), ) - if run_flags.get("is_closed", False): - raise EvaluationClosedConflict( - run_id=metric_dbe.run_id, # type: ignore - scenario_id=metric_dbe.scenario_id, # type: ignore - metrics_id=metric_dbe.id, # type: ignore - ) - - metric = next( - (m for m in metrics if m.id == metric_dbe.id), - None, + if step.repeat_id is not None: + stmt = stmt.filter( + EvaluationStepDBE.repeat_id == step.repeat_id, ) - if metric is not None: - metric_dbe = edit_dbe_from_dto( - dbe=metric_dbe, - dto=metric, - updated_at=datetime.now(timezone.utc), - updated_by_id=user_id, - ) - - await session.commit() - - _metrics = [ - create_dto_from_dbe( - DTO=EvaluationMetrics, - dbe=metric_dbe, + if step.repeat_ids is not None: + stmt = stmt.filter( + EvaluationStepDBE.repeat_id.in_(step.repeat_ids), ) - for metric_dbe in metric_dbes - ] - - return _metrics - - @suppress_exceptions(default=[]) - async def delete_metrics( - self, - *, - project_id: UUID, - # - metrics_ids: Optional[List[UUID]] = None, - ) -> List[UUID]: - async with engine.core_session() as session: - if metrics_ids is None: - return [] - - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.project_id == project_id, - ) - - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.id.in_(metrics_ids), - ) - - stmt = stmt.limit(len(metrics_ids)) - res = await session.execute(stmt) - - metric_dbes = res.scalars().all() - - if not metric_dbes: - return [] - - for metric_dbe in metric_dbes: - run_flags = await _get_run_flags( - session=session, - project_id=project_id, - run_id=metric_dbe.run_id, # type: ignore + if step.retry_id is not None: + stmt = stmt.filter( + EvaluationStepDBE.retry_id == step.retry_id, ) - if run_flags.get("is_closed", False): - raise EvaluationClosedConflict( - run_id=metric_dbe.run_id, # type: ignore - scenario_id=metric_dbe.scenario_id, # type: ignore - metrics_id=metric_dbe.id, # type: ignore - ) - - await session.delete(metric_dbe) - - await session.commit() - - return metrics_ids - - @suppress_exceptions(default=[]) - async def query_metrics( - self, - *, - project_id: UUID, - # - metric: Optional[EvaluationMetricsQuery] = None, - # - windowing: Optional[Windowing] = None, - ) -> List[EvaluationMetrics]: - async with engine.core_session() as session: - stmt = select(EvaluationMetricsDBE).filter( - EvaluationMetricsDBE.project_id == project_id, - ) - - if metric is not None: - if metric.ids is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.id.in_(metric.ids), - ) - - if metric.run_id is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.run_id == metric.run_id, - ) - - if metric.run_ids is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.run_id.in_(metric.run_ids), - ) - - if metric.scenario_id is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.scenario_id == metric.scenario_id, - ) - - if metric.scenario_ids is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.scenario_id.in_(metric.scenario_ids), - ) - - if metric.timestamp is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.timestamp == metric.timestamp, - ) - - if metric.timestamps is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.timestamp.in_(metric.timestamps), - ) + if step.retry_ids is not None: + stmt = stmt.filter( + EvaluationStepDBE.retry_id.in_(step.retry_ids), + ) - if metric.interval is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.interval == metric.interval, - ) + if step.status is not None: + stmt = stmt.filter( + EvaluationStepDBE.status == step.status, + ) - if metric.intervals is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.interval.in_(metric.intervals), - ) + if step.statuses is not None: + stmt = stmt.filter( + EvaluationStepDBE.status.in_(step.statuses), + ) - if metric.flags is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.flags.contains(metric.flags), - ) + if step.timestamp is not None: + stmt = stmt.filter( + EvaluationStepDBE.timestamp > step.timestamp, + ) - if metric.tags is not None: + if windowing is not None: + if windowing.next is not None: stmt = stmt.filter( - EvaluationMetricsDBE.tags.contains(metric.tags), + EvaluationStepDBE.id > windowing.next, ) - if metric.meta is not None: + if windowing.start is not None: stmt = stmt.filter( - EvaluationMetricsDBE.meta.contains(metric.meta), + EvaluationStepDBE.created_at > windowing.start, ) - if metric.status is not None: + if windowing.stop is not None: stmt = stmt.filter( - EvaluationMetricsDBE.status == metric.status, + EvaluationStepDBE.created_at <= windowing.stop, ) - if metric.statuses is not None: - stmt = stmt.filter( - EvaluationMetricsDBE.status.in_(metric.statuses), - ) + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + stmt = stmt.order_by(EvaluationStepDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + stmt = stmt.order_by(EvaluationStepDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationStepDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationStepDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationStepDBE.created_at.desc()) - if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=EvaluationMetricsDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, - ) + if windowing is not None: + if windowing.limit is not None: + stmt = stmt.limit(windowing.limit) - res = await session.execute(stmt) + result = await session.execute(stmt) - metric_dbes = res.scalars().all() + step_dbes = result.scalars().all() - metrics = [ + steps = [ create_dto_from_dbe( - DTO=EvaluationMetrics, - dbe=metric_dbe, + DTO=EvaluationStep, + dbe=step_dbe, ) - for metric_dbe in metric_dbes + for step_dbe in step_dbes ] - return metrics + return steps - # - EVALUATION QUEUE ------------------------------------------------------- + # - EVALUATION METRIC ----------------------------------------------------- @suppress_exceptions(exclude=[EntityCreationConflict]) - async def create_queue( + async def create_metric( self, *, project_id: UUID, user_id: UUID, # - queue: EvaluationQueueCreate, - ) -> Optional[EvaluationQueue]: + metric: EvaluationMetricCreate, + ) -> Optional[EvaluationMetric]: run_flags = await _get_run_flags( project_id=project_id, - run_id=queue.run_id, + run_id=metric.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=queue.run_id, + run_id=metric.run_id, ) - _queue = EvaluationQueue( - **queue.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + now = datetime.now(timezone.utc) + metric = EvaluationMetric( + **metric.model_dump(), + created_at=now, created_by_id=user_id, ) - if _queue.data and _queue.data.user_ids: - _queue.data.user_ids = [ # type: ignore - [str(repeat_user_id) for repeat_user_id in repeat_user_ids] - for repeat_user_ids in _queue.data.user_ids - ] - - queue_dbe = create_dbe_from_dto( - DBE=EvaluationQueueDBE, + metric_dbe = create_dbe_from_dto( + DBE=EvaluationMetricDBE, project_id=project_id, - dto=queue, + dto=metric, ) try: async with engine.core_session() as session: - session.add(queue_dbe) + session.add(metric_dbe) await session.commit() - _queue = create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + metric = create_dto_from_dbe( + DTO=EvaluationMetric, + dbe=metric_dbe, ) - return _queue + return metric except Exception as e: check_entity_creation_conflict(e) @@ -2265,67 +1802,59 @@ async def create_queue( raise @suppress_exceptions(default=[], exclude=[EntityCreationConflict]) - async def create_queues( + async def create_metrics( self, *, project_id: UUID, user_id: UUID, - queues: List[EvaluationQueueCreate], - ) -> List[EvaluationQueue]: - for queue in queues: + # + metrics: List[EvaluationMetricCreate], + ) -> List[EvaluationMetric]: + for metric in metrics: run_flags = await _get_run_flags( project_id=project_id, - run_id=queue.run_id, + run_id=metric.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=queue.run_id, + run_id=metric.run_id, ) - _queues = [ - EvaluationQueue( - **queue.model_dump( - mode="json", - exclude_none=True, - ), - created_at=datetime.now(timezone.utc), + now = datetime.now(timezone.utc) + metrics = [ + EvaluationMetric( + **metric.model_dump(), + created_at=now, created_by_id=user_id, ) - for queue in queues + for metric in metrics ] - for _queue in _queues: - if _queue.data and _queue.data.user_ids: - _queue.data.user_ids = [ # type: ignore - [str(repeat_user_id) for repeat_user_id in repeat_user_ids] - for repeat_user_ids in _queue.data.user_ids - ] - - queue_dbes = [ + metric_dbes = [ create_dbe_from_dto( - DBE=EvaluationQueueDBE, + DBE=EvaluationMetricDBE, project_id=project_id, - dto=queue, + dto=metric, ) - for queue in queues + for metric in metrics ] try: async with engine.core_session() as session: - session.add_all(queue_dbes) + session.add_all(metric_dbes) await session.commit() - _queues = [ + metrics = [ create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + DTO=EvaluationMetric, + dbe=metric_dbe, ) - for queue_dbe in queue_dbes + for metric_dbe in metric_dbes ] - return _queues + return metrics except Exception as e: check_entity_creation_conflict(e) @@ -2333,335 +1862,379 @@ async def create_queues( raise @suppress_exceptions() - async def fetch_queue( + async def fetch_metric( self, *, project_id: UUID, # - queue_id: UUID, - ) -> Optional[EvaluationQueue]: + metric_id: UUID, + ) -> Optional[EvaluationMetric]: async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, - ) - - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.id == queue_id, + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, + EvaluationMetricDBE.id == metric_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbe = res.scalars().first() + metric_dbe = result.scalars().first() - if queue_dbe is None: + if metric_dbe is None: return None - _queue = create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + metric = create_dto_from_dbe( + DTO=EvaluationMetric, + dbe=metric_dbe, ) - return _queue + return metric @suppress_exceptions(default=[]) - async def fetch_queues( + async def fetch_metrics( self, *, project_id: UUID, # - queue_ids: List[UUID], - ) -> List[EvaluationQueue]: + metric_ids: List[UUID], + ) -> List[EvaluationMetric]: async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, - ) - - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.id.in_(queue_ids), + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, + EvaluationMetricDBE.id.in_(metric_ids), ) - stmt = stmt.limit(len(queue_ids)) + stmt = stmt.limit(len(metric_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbes = res.scalars().all() + metric_dbes = result.scalars().all() - _queues = [ + metrics = [ create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + DTO=EvaluationMetric, + dbe=metric_dbe, ) - for queue_dbe in queue_dbes + for metric_dbe in metric_dbes ] - return _queues + return metrics @suppress_exceptions() - async def edit_queue( + async def edit_metric( self, *, project_id: UUID, user_id: UUID, # - queue: EvaluationQueueEdit, - ) -> Optional[EvaluationQueue]: + metric: EvaluationMetricEdit, + ) -> Optional[EvaluationMetric]: async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, - ) - - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.id == queue.id, + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, + EvaluationMetricDBE.id == metric.id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbe = res.scalars().first() + metric_dbe = result.scalars().first() - if queue_dbe is None: + if metric_dbe is None: return None run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=queue_dbe.run_id, # type: ignore + run_id=metric_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=queue_dbe.run_id, - queue_id=queue_dbe.id, # type: ignore + run_id=metric_dbe.run_id, + scenario_id=metric_dbe.scenario_id, + metric_id=metric_dbe.id, ) - queue_dbe = edit_dbe_from_dto( - dbe=queue_dbe, - dto=queue, + metric_dbe = edit_dbe_from_dto( + dbe=metric_dbe, + dto=metric, updated_at=datetime.now(timezone.utc), updated_by_id=user_id, ) await session.commit() - _queue = create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + metric = create_dto_from_dbe( + DTO=EvaluationMetric, + dbe=metric_dbe, ) - return _queue + return metric @suppress_exceptions(default=[]) - async def edit_queues( + async def edit_metrics( self, *, project_id: UUID, user_id: UUID, - queues: List[EvaluationQueueEdit], - ) -> List[EvaluationQueue]: - queue_ids = [queue.id for queue in queues] + # + metrics: List[EvaluationMetricEdit], + ) -> List[EvaluationMetric]: + metric_ids = [metric.id for metric in metrics] async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, + EvaluationMetricDBE.id.in_(metric_ids), ) - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.id.in_(queue_ids), - ) - - stmt = stmt.limit(len(queue_ids)) + stmt = stmt.limit(len(metric_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbes = res.scalars().all() + metric_dbes = result.scalars().all() - if not queue_dbes: + if not metric_dbes: return [] - for queue_dbe in queue_dbes: + for metric_dbe in metric_dbes: run_flags = await _get_run_flags( session=session, project_id=project_id, - run_id=queue_dbe.run_id, # type: ignore + run_id=metric_dbe.run_id, ) if run_flags.get("is_closed", False): raise EvaluationClosedConflict( - run_id=queue_dbe.run_id, - queue_id=queue_dbe.id, # type: ignore + run_id=metric_dbe.run_id, + scenario_id=metric_dbe.scenario_id, + metric_id=metric_dbe.id, ) - queue = next( - (q for q in queues if q.id == queue_dbe.id), + metric = next( + (m for m in metrics if m.id == metric_dbe.id), None, ) - if queue is not None: - queue_dbe = edit_dbe_from_dto( - dbe=queue_dbe, - dto=queue, + if metric is not None: + metric_dbe = edit_dbe_from_dto( + dbe=metric_dbe, + dto=metric, updated_at=datetime.now(timezone.utc), updated_by_id=user_id, ) await session.commit() - _queues = [ + metrics = [ create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + DTO=EvaluationMetric, + dbe=metric_dbe, ) - for queue_dbe in queue_dbes + for metric_dbe in metric_dbes ] - return _queues + return metrics @suppress_exceptions() - async def delete_queue( + async def delete_metric( self, *, project_id: UUID, # - queue_id: UUID, + metric_id: UUID, ) -> Optional[UUID]: async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, - ) - - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.id == queue_id, + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, + EvaluationMetricDBE.id == metric_id, ) stmt = stmt.limit(1) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbe = res.scalars().first() + metric_dbe = result.scalars().first() - if queue_dbe is None: + if metric_dbe is None: return None - await session.delete(queue_dbe) + run_flags = await _get_run_flags( + session=session, + project_id=project_id, + run_id=metric_dbe.run_id, + ) + + if run_flags.get("is_closed", False): + raise EvaluationClosedConflict( + run_id=metric_dbe.run_id, + scenario_id=metric_dbe.scenario_id, + metric_id=metric_dbe.id, + ) + + await session.delete(metric_dbe) await session.commit() - return queue_id + return metric_id @suppress_exceptions(default=[]) - async def delete_queues( + async def delete_metrics( self, *, project_id: UUID, # - queue_ids: List[UUID], + metric_ids: Optional[List[UUID]] = None, ) -> List[UUID]: async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, - ) + if metric_ids is None: + return [] - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.id.in_(queue_ids), + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, + EvaluationMetricDBE.id.in_(metric_ids), ) - stmt = stmt.limit(len(queue_ids)) + stmt = stmt.limit(len(metric_ids)) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbes = res.scalars().all() + metric_dbes = result.scalars().all() - if not queue_dbes: + if not metric_dbes: return [] - for queue_dbe in queue_dbes: - await session.delete(queue_dbe) + for metric_dbe in metric_dbes: + run_flags = await _get_run_flags( + session=session, + project_id=project_id, + run_id=metric_dbe.run_id, + ) + + if run_flags.get("is_closed", False): + raise EvaluationClosedConflict( + run_id=metric_dbe.run_id, + scenario_id=metric_dbe.scenario_id, + metric_id=metric_dbe.id, + ) + + await session.delete(metric_dbe) await session.commit() - return queue_ids + return metric_ids @suppress_exceptions(default=[]) - async def query_queues( + async def query_metrics( self, *, project_id: UUID, # - queue: Optional[EvaluationQueueQuery] = None, + metric: EvaluationMetricQuery, # windowing: Optional[Windowing] = None, - ) -> List[EvaluationQueue]: + ) -> List[EvaluationMetric]: async with engine.core_session() as session: - stmt = select(EvaluationQueueDBE).filter( - EvaluationQueueDBE.project_id == project_id, + stmt = select(EvaluationMetricDBE).filter( + EvaluationMetricDBE.project_id == project_id, ) - if queue is not None: - if queue.ids is not None: - stmt = stmt.filter( - EvaluationQueueDBE.id.in_(queue.ids), - ) + if metric.run_id is not None: + stmt = stmt.filter( + EvaluationMetricDBE.run_id == metric.run_id, + ) - if queue.run_id is not None: - stmt = stmt.filter( - EvaluationQueueDBE.run_id == queue.run_id, - ) + if metric.run_ids is not None: + stmt = stmt.filter( + EvaluationMetricDBE.run_id.in_(metric.run_ids), + ) - if queue.run_ids is not None: - stmt = stmt.filter( - EvaluationQueueDBE.run_id.in_(queue.run_ids), - ) + if metric.scenario_id is not None: + stmt = stmt.filter( + EvaluationMetricDBE.scenario_id == metric.scenario_id, + ) - if queue.flags is not None: - stmt = stmt.filter( - EvaluationQueueDBE.flags.contains(queue.flags), - ) + if metric.scenario_ids is not None: + stmt = stmt.filter( + EvaluationMetricDBE.scenario_id.in_(metric.scenario_ids), + ) - if queue.tags is not None: - stmt = stmt.filter( - EvaluationQueueDBE.tags.contains(queue.tags), - ) + # if metric.flags is not None: + # stmt = stmt.filter( + # EvaluationMetricDBE.flags.contains( + # metric.flags.model_dump(mode="json"), + # ), + # ) + + if metric.tags is not None: + stmt = stmt.filter( + EvaluationMetricDBE.tags.contains(metric.tags), + ) + + if metric.meta is not None: + stmt = stmt.filter( + EvaluationMetricDBE.meta.contains(metric.meta), + ) + + if metric.status is not None: + stmt = stmt.filter( + EvaluationMetricDBE.status == metric.status, + ) + + if metric.statuses is not None: + stmt = stmt.filter( + EvaluationMetricDBE.status.in_(metric.statuses), + ) - if queue.meta is not None: + if windowing is not None: + if windowing.next is not None: stmt = stmt.filter( - EvaluationQueueDBE.meta.contains(queue.meta), + EvaluationMetricDBE.id > windowing.next, ) - if queue.name is not None: + if windowing.start is not None: stmt = stmt.filter( - EvaluationQueueDBE.name.contains(queue.name), + EvaluationMetricDBE.created_at > windowing.start, ) - if queue.description is not None: + if windowing.stop is not None: stmt = stmt.filter( - EvaluationQueueDBE.description.contains(queue.description), + EvaluationMetricDBE.created_at <= windowing.stop, ) - if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=EvaluationQueueDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, - ) + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + stmt = stmt.order_by(EvaluationMetricDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + stmt = stmt.order_by(EvaluationMetricDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationMetricDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationMetricDBE.created_at.desc()) + else: + stmt = stmt.order_by(EvaluationMetricDBE.created_at.desc()) + + if windowing is not None: + if windowing.limit is not None: + stmt = stmt.limit(windowing.limit) - res = await session.execute(stmt) + result = await session.execute(stmt) - queue_dbes = res.scalars().all() + metric_dbes = result.scalars().all() - queues = [ + metrics = [ create_dto_from_dbe( - DTO=EvaluationQueue, - dbe=queue_dbe, + DTO=EvaluationMetric, + dbe=metric_dbe, ) - for queue_dbe in queue_dbes + for metric_dbe in metric_dbes ] - return queues + return metrics # -------------------------------------------------------------------------- @@ -2682,13 +2255,9 @@ async def _get_run_flags( stmt = select(EvaluationRunDBE.flags).filter( EvaluationRunDBE.project_id == project_id, - ) - stmt = select(EvaluationRunDBE.flags).filter( EvaluationRunDBE.id == run_id, ) - - res = await session.execute(stmt) - - run_flags = res.scalars().first() + result = await session.execute(stmt) + run_flags = result.scalars().first() return run_flags or {} diff --git a/api/oss/src/dbs/postgres/evaluations/dbas.py b/api/oss/src/dbs/postgres/evaluations/dbas.py index 85bd700721..131f88e20c 100644 --- a/api/oss/src/dbs/postgres/evaluations/dbas.py +++ b/api/oss/src/dbs/postgres/evaluations/dbas.py @@ -1,8 +1,7 @@ from sqlalchemy.dialects.postgresql import JSONB -from sqlalchemy import Column, UUID, VARCHAR, TIMESTAMP, INTEGER +from sqlalchemy import Column, UUID, VARCHAR, TIMESTAMP from oss.src.dbs.postgres.shared.dbas import ( - VersionDBA, IdentifierDBA, LifecycleDBA, FlagsDBA, @@ -14,13 +13,12 @@ class EvaluationRunDBA( - VersionDBA, IdentifierDBA, LifecycleDBA, - HeaderDBA, FlagsDBA, TagsDBA, MetaDBA, + HeaderDBA, DataDBA, # steps, mappings ): __abstract__ = True @@ -30,14 +28,8 @@ class EvaluationRunDBA( nullable=False, ) - references = Column( - JSONB(none_as_null=True), - nullable=True, - ) - class EvaluationScenarioDBA( - VersionDBA, IdentifierDBA, LifecycleDBA, FlagsDBA, @@ -51,22 +43,13 @@ class EvaluationScenarioDBA( nullable=False, ) - interval = Column( - INTEGER, - nullable=True, - ) - timestamp = Column( - TIMESTAMP(timezone=True), - nullable=True, - ) run_id = Column( UUID(as_uuid=True), nullable=False, ) -class EvaluationResultDBA( - VersionDBA, +class EvaluationStepDBA( IdentifierDBA, LifecycleDBA, FlagsDBA, @@ -75,6 +58,28 @@ class EvaluationResultDBA( ): __abstract__ = True + status = Column( + VARCHAR, + nullable=False, + ) + timestamp = Column( + TIMESTAMP(timezone=True), + nullable=False, + ) + + key = Column( + VARCHAR, + nullable=False, + ) + repeat_id = Column( + UUID(as_uuid=True), + nullable=False, + ) + retry_id = Column( + UUID(as_uuid=True), + nullable=False, + ) + hash_id = Column( UUID(as_uuid=True), nullable=True, @@ -92,27 +97,6 @@ class EvaluationResultDBA( nullable=True, ) - status = Column( - VARCHAR, - nullable=False, - ) - - interval = Column( - INTEGER, - nullable=True, - ) - timestamp = Column( - TIMESTAMP(timezone=True), - nullable=True, - ) - repeat_idx = Column( - INTEGER, - nullable=True, - ) - step_key = Column( - VARCHAR, - nullable=False, - ) scenario_id = Column( UUID(as_uuid=True), nullable=False, @@ -123,8 +107,7 @@ class EvaluationResultDBA( ) -class EvaluationMetricsDBA( - VersionDBA, +class EvaluationMetricDBA( IdentifierDBA, LifecycleDBA, FlagsDBA, @@ -139,40 +122,10 @@ class EvaluationMetricsDBA( nullable=False, ) - interval = Column( - INTEGER, - nullable=True, - ) - timestamp = Column( - TIMESTAMP(timezone=True), - nullable=True, - ) scenario_id = Column( UUID(as_uuid=True), nullable=True, ) - run_id = Column( - UUID(as_uuid=True), - nullable=False, - ) - - -class EvaluationQueueDBA( - VersionDBA, - IdentifierDBA, - LifecycleDBA, - HeaderDBA, - FlagsDBA, - TagsDBA, - MetaDBA, - DataDBA, -): - __abstract__ = True - - status = Column( - VARCHAR, - nullable=False, - ) run_id = Column( UUID(as_uuid=True), diff --git a/api/oss/src/dbs/postgres/evaluations/dbes.py b/api/oss/src/dbs/postgres/evaluations/dbes.py index 2476d77ab4..7f5f53101f 100644 --- a/api/oss/src/dbs/postgres/evaluations/dbes.py +++ b/api/oss/src/dbs/postgres/evaluations/dbes.py @@ -10,9 +10,8 @@ from oss.src.dbs.postgres.evaluations.dbas import ( EvaluationRunDBA, EvaluationScenarioDBA, - EvaluationResultDBA, - EvaluationMetricsDBA, - EvaluationQueueDBA, + EvaluationStepDBA, + EvaluationMetricDBA, ) @@ -37,22 +36,6 @@ class EvaluationRunDBE( "ix_evaluation_runs_project_id", "project_id", ), # for filtering - Index( - "ix_evaluation_runs_flags", - "flags", - postgresql_using="gin", - ), # for filtering§ - Index( - "ix_evaluation_runs_tags", - "tags", - postgresql_using="gin", - ), # for filtering - Index( - "ix_evaluation_runs_references", - "references", - postgresql_using="gin", - postgresql_ops={"references": "jsonb_path_ops"}, - ), # for filtering ) @@ -86,30 +69,15 @@ class EvaluationScenarioDBE( "ix_evaluation_scenarios_run_id", "run_id", ), # for filtering - Index( - "ix_evaluation_scenarios_timestamp_interval", - "timestamp", - "interval", - ), # for filtering - Index( - "ix_evaluation_scenarios_flags", - "flags", - postgresql_using="gin", - ), # for filtering - Index( - "ix_evaluation_scenarios_tags", - "tags", - postgresql_using="gin", - ), # for filtering ) -class EvaluationResultDBE( +class EvaluationStepDBE( Base, ProjectScopeDBA, - EvaluationResultDBA, + EvaluationStepDBA, ): - __tablename__ = "evaluation_results" + __tablename__ = "evaluation_steps" __table_args__ = ( PrimaryKeyConstraint( @@ -135,51 +103,29 @@ class EvaluationResultDBE( "project_id", "run_id", "scenario_id", - "step_key", - "repeat_idx", + "key", + "retry_id", + "retry_id", ), # for uniqueness Index( - "ix_evaluation_results_project_id", + "ix_evaluation_steps_project_id", "project_id", ), # for filtering Index( - "ix_evaluation_results_run_id", + "ix_evaluation_steps_run_id", "run_id", ), # for filtering Index( - "ix_evaluation_results_scenario_id", + "ix_evaluation_steps_scenario_id", "scenario_id", ), # for filtering - Index( - "ix_evaluation_results_step_key", - "step_key", - ), # for filtering - Index( - "ix_evaluation_results_repeat_idx", - "repeat_idx", - ), # for filtering - Index( - "ix_evaluation_results_timestamp_interval", - "timestamp", - "interval", - ), # for filtering - Index( - "ix_evaluation_results_flags", - "flags", - postgresql_using="gin", - ), # for filtering - Index( - "ix_evaluation_results_tags", - "tags", - postgresql_using="gin", - ), # for filtering ) -class EvaluationMetricsDBE( +class EvaluationMetricDBE( Base, ProjectScopeDBA, - EvaluationMetricsDBA, + EvaluationMetricDBA, ): __tablename__ = "evaluation_metrics" @@ -207,7 +153,6 @@ class EvaluationMetricsDBE( "project_id", "run_id", "scenario_id", - "timestamp", ), # for uniqueness Index( "ix_evaluation_metrics_project_id", @@ -221,62 +166,4 @@ class EvaluationMetricsDBE( "ix_evaluation_metrics_scenario_id", "scenario_id", ), # for filtering - Index( - "ix_evaluation_metrics_timestamp_interval", - "timestamp", - "interval", - ), # for filtering - Index( - "ix_evaluation_metrics_flags", - "flags", - postgresql_using="gin", - ), # for filtering - Index( - "ix_evaluation_metrics_tags", - "tags", - postgresql_using="gin", - ), # for filtering - ) - - -class EvaluationQueueDBE( - Base, - ProjectScopeDBA, - EvaluationQueueDBA, -): - __tablename__ = "evaluation_queues" - - __table_args__ = ( - PrimaryKeyConstraint( - "project_id", - "id", - ), # for uniqueness - ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), # for project scope - ForeignKeyConstraint( - ["project_id", "run_id"], - ["evaluation_runs.project_id", "evaluation_runs.id"], - ondelete="CASCADE", - ), # for project scope - Index( - "ix_evaluation_queues_project_id", - "project_id", - ), # for filtering - Index( - "ix_evaluation_queues_run_id", - "run_id", - ), # for filtering - Index( - "ix_evaluation_queues_flags", - "flags", - postgresql_using="gin", - ), # for filtering - Index( - "ix_evaluation_queues_tags", - "tags", - postgresql_using="gin", - ), # for filtering ) diff --git a/api/oss/src/dbs/postgres/evaluations/mappings.py b/api/oss/src/dbs/postgres/evaluations/mappings.py index bad6183fcc..fd988bbb76 100644 --- a/api/oss/src/dbs/postgres/evaluations/mappings.py +++ b/api/oss/src/dbs/postgres/evaluations/mappings.py @@ -16,17 +16,13 @@ def create_dbe_from_dto( DBE: Type[DBE_T], project_id: UUID, dto: DTO_T, - **kwargs, ) -> DBE_T: """Map a Pydantic DTO instance to a SQLAlchemy DBE, with extra project_id.""" - attributes = dto.model_dump( - # mode="json", - exclude_none=True, - ) + attributes = dto.model_dump(exclude_none=True) attributes["project_id"] = project_id - dbe = DBE(**attributes, **kwargs) + dbe = DBE(**attributes) return dbe @@ -35,18 +31,23 @@ def edit_dbe_from_dto( *, dbe: DBE_T, dto: DTO_T, - **kwargs, + timestamp: Optional[datetime] = None, + updated_at: Optional[datetime] = None, + deleted_at: Optional[datetime] = None, + updated_by_id: Optional[UUID] = None, + deleted_by_id: Optional[UUID] = None, ) -> DBE_T: """Edit a SQLAlchemy DBE instance with a Pydantic DTO.""" - for field, value in dto.model_dump( - # mode="json", - ).items(): + for field, value in dto.model_dump().items(): setattr(dbe, field, value) - for field, value in kwargs.items(): - if hasattr(dbe, field): - setattr(dbe, field, value) + if timestamp is not None: + dbe.timestamp = timestamp + dbe.updated_at = updated_at + dbe.deleted_at = deleted_at + dbe.updated_by_id = updated_by_id + dbe.deleted_by_id = deleted_by_id return dbe diff --git a/api/oss/src/dbs/postgres/git/dao.py b/api/oss/src/dbs/postgres/git/dao.py index f1bb94f45f..3c73147b16 100644 --- a/api/oss/src/dbs/postgres/git/dao.py +++ b/api/oss/src/dbs/postgres/git/dao.py @@ -15,7 +15,7 @@ ArtifactEdit, ArtifactQuery, ArtifactFork, - RevisionsLog, + ArtifactLog, # Variant, VariantCreate, @@ -29,7 +29,6 @@ RevisionCommit, ) -from oss.src.dbs.postgres.shared.utils import apply_windowing from oss.src.dbs.postgres.shared.exceptions import check_entity_creation_conflict from oss.src.utils.exceptions import suppress_exceptions from oss.src.dbs.postgres.shared.engine import engine @@ -126,18 +125,18 @@ async def fetch_artifact( return None async with engine.core_session() as session: - stmt = select(self.ArtifactDBE).filter( + query = select(self.ArtifactDBE).filter( self.ArtifactDBE.project_id == project_id, # type: ignore ) if artifact_ref.id: - stmt = stmt.filter(self.ArtifactDBE.id == artifact_ref.id) # type: ignore + query = query.filter(self.ArtifactDBE.id == artifact_ref.id) # type: ignore elif artifact_ref.slug: - stmt = stmt.filter(self.ArtifactDBE.slug == artifact_ref.slug) # type: ignore + query = query.filter(self.ArtifactDBE.slug == artifact_ref.slug) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) artifact_dbe = result.scalars().first() @@ -161,15 +160,15 @@ async def edit_artifact( artifact_edit: ArtifactEdit, ) -> Optional[Artifact]: async with engine.core_session() as session: - stmt = select(self.ArtifactDBE).filter( + query = select(self.ArtifactDBE).filter( self.ArtifactDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.ArtifactDBE.id == artifact_edit.id) # type: ignore + query = query.filter(self.ArtifactDBE.id == artifact_edit.id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) artifact_dbe = result.scalars().first() @@ -208,15 +207,15 @@ async def archive_artifact( artifact_id: UUID, ) -> Optional[Artifact]: async with engine.core_session() as session: - stmt = select(self.ArtifactDBE).filter( + query = select(self.ArtifactDBE).filter( self.ArtifactDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.ArtifactDBE.id == artifact_id) # type: ignore + query = query.filter(self.ArtifactDBE.id == artifact_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) artifact_dbe = result.scalars().first() @@ -250,15 +249,15 @@ async def unarchive_artifact( artifact_id: UUID, ) -> Optional[Artifact]: async with engine.core_session() as session: - stmt = select(self.ArtifactDBE).filter( + query = select(self.ArtifactDBE).filter( self.ArtifactDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.ArtifactDBE.id == artifact_id) # type: ignore + query = query.filter(self.ArtifactDBE.id == artifact_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) artifact_dbe = result.scalars().first() @@ -297,7 +296,7 @@ async def query_artifacts( windowing: Optional[Windowing] = None, ) -> List[Artifact]: async with engine.core_session() as session: - stmt = select(self.ArtifactDBE).filter( + query = select(self.ArtifactDBE).filter( self.ArtifactDBE.project_id == project_id, # type: ignore ) @@ -307,7 +306,7 @@ async def query_artifacts( ] if artifact_ids: - stmt = stmt.filter( + query = query.filter( self.ArtifactDBE.id.in_(artifact_ids) # type: ignore ) @@ -316,50 +315,63 @@ async def query_artifacts( ] if artifact_slugs: - stmt = stmt.filter( + query = query.filter( self.ArtifactDBE.slug.in_(artifact_slugs) # type: ignore ) if artifact_query.flags: - stmt = stmt.filter( + query = query.filter( self.ArtifactDBE.flags.contains(artifact_query.flags) # type: ignore ) if artifact_query.tags: - stmt = stmt.filter( + query = query.filter( self.ArtifactDBE.tags.contains(artifact_query.tags) # type: ignore ) if artifact_query.meta: - stmt = stmt.filter( + query = query.filter( self.ArtifactDBE.meta.contains(artifact_query.meta) # type: ignore ) - if artifact_query.name: - stmt = stmt.filter( - self.ArtifactDBE.name.ilike(f"%{artifact_query.name}%"), # type: ignore - ) - - if artifact_query.description: - stmt = stmt.filter( - self.ArtifactDBE.description.ilike(f"%{artifact_query.description}%"), # type: ignore - ) - if include_archived is not True: - stmt = stmt.filter( + query = query.filter( self.ArtifactDBE.deleted_at.is_(None) # type: ignore ) if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=self.ArtifactDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, - ) + if windowing.next is not None: + query = query.filter( + self.ArtifactDBE.id > windowing.next, # type: ignore + ) + if windowing.start: + query = query.filter( + self.ArtifactDBE.created_at > windowing.start, # type: ignore + ) - result = await session.execute(stmt) + if windowing.stop: + query = query.filter( + self.ArtifactDBE.created_at <= windowing.stop, # type: ignore + ) + + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + query = query.order_by(self.ArtifactDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + query = query.order_by(self.ArtifactDBE.created_at.desc()) + else: + query = query.order_by(self.ArtifactDBE.created_at.desc()) + else: + query = query.order_by(self.ArtifactDBE.created_at.desc()) + else: + query = query.order_by(self.ArtifactDBE.created_at.desc()) + + if windowing is not None: + if windowing.limit is not None: + query = query.limit(windowing.limit) + + result = await session.execute(query) artifact_dbes = result.scalars().all() @@ -444,22 +456,22 @@ async def fetch_variant( return None async with engine.core_session() as session: - stmt = select(self.VariantDBE).filter( + query = select(self.VariantDBE).filter( self.VariantDBE.project_id == project_id, # type: ignore ) if variant_ref: if variant_ref.id: - stmt = stmt.filter(self.VariantDBE.id == variant_ref.id) # type: ignore + query = query.filter(self.VariantDBE.id == variant_ref.id) # type: ignore elif variant_ref.slug: - stmt = stmt.filter(self.VariantDBE.slug == variant_ref.slug) # type: ignore + query = query.filter(self.VariantDBE.slug == variant_ref.slug) # type: ignore elif artifact_ref: if artifact_ref.id: - stmt = stmt.filter(self.VariantDBE.artifact_id == artifact_ref.id) # type: ignore + query = query.filter(self.VariantDBE.artifact_id == artifact_ref.id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) variant_dbe = result.scalars().first() @@ -483,15 +495,15 @@ async def edit_variant( variant_edit: VariantEdit, ) -> Optional[Variant]: async with engine.core_session() as session: - stmt = select(self.VariantDBE).filter( + query = select(self.VariantDBE).filter( self.VariantDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.VariantDBE.id == variant_edit.id) # type: ignore + query = query.filter(self.VariantDBE.id == variant_edit.id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) variant_dbe = result.scalars().first() @@ -530,15 +542,15 @@ async def archive_variant( variant_id: UUID, ) -> Optional[Variant]: async with engine.core_session() as session: - stmt = select(self.VariantDBE).filter( + query = select(self.VariantDBE).filter( self.VariantDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.VariantDBE.id == variant_id) # type: ignore + query = query.filter(self.VariantDBE.id == variant_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) variant_dbe = result.scalars().first() @@ -572,15 +584,15 @@ async def unarchive_variant( variant_id: UUID, ) -> Optional[Variant]: async with engine.core_session() as session: - stmt = select(self.VariantDBE).filter( + query = select(self.VariantDBE).filter( self.VariantDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.VariantDBE.id == variant_id) # type: ignore + query = query.filter(self.VariantDBE.id == variant_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) variant_dbe = result.scalars().first() @@ -620,7 +632,7 @@ async def query_variants( windowing: Optional[Windowing] = None, ) -> List[Variant]: async with engine.core_session() as session: - stmt = select(self.VariantDBE).filter( + query = select(self.VariantDBE).filter( self.VariantDBE.project_id == project_id, # type: ignore ) @@ -630,15 +642,24 @@ async def query_variants( ] if artifact_ids: - stmt = stmt.filter( + query = query.filter( self.VariantDBE.artifact_id.in_(artifact_ids) # type: ignore ) + artifact_slugs = [ + artifact.slug for artifact in artifact_refs if artifact.slug + ] + + if artifact_slugs: + query = query.filter( + self.VariantDBE.artifact_id.in_(artifact_slugs) # type: ignore + ) + if variant_refs: variant_ids = [variant.id for variant in variant_refs if variant.id] if variant_ids: - stmt = stmt.filter( + query = query.filter( self.VariantDBE.id.in_(variant_ids) # type: ignore ) @@ -647,50 +668,61 @@ async def query_variants( ] if variant_slugs: - stmt = stmt.filter( + query = query.filter( self.VariantDBE.slug.in_(variant_slugs) # type: ignore ) if variant_query.flags: - stmt = stmt.filter( + query = query.filter( self.VariantDBE.flags.contains(variant_query.flags) # type: ignore ) if variant_query.tags: - stmt = stmt.filter( + query = query.filter( self.VariantDBE.tags.contains(variant_query.tags) # type: ignore ) if variant_query.meta: - stmt = stmt.filter( + query = query.filter( self.VariantDBE.meta.contains(variant_query.meta) # type: ignore ) - if variant_query.name: - stmt = stmt.filter( - self.VariantDBE.name.ilike(f"%{variant_query.name}%"), # type: ignore - ) - - if variant_query.description: - stmt = stmt.filter( - self.VariantDBE.description.ilike(f"%{variant_query.description}%"), # type: ignore - ) - if include_archived is not True: - stmt = stmt.filter( - self.VariantDBE.deleted_at.is_(None), # type: ignore - ) + query = query.filter(self.VariantDBE.deleted_at.is_(None)) # type: ignore if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=self.VariantDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, - ) + if windowing.next is not None: + query = query.filter( + self.VariantDBE.id > windowing.next, # type: ignore + ) + if windowing.start: + query = query.filter( + self.VariantDBE.created_at > windowing.start, # type: ignore + ) - result = await session.execute(stmt) + if windowing.stop: + query = query.filter( + self.VariantDBE.created_at <= windowing.stop, # type: ignore + ) + + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + query = query.order_by(self.VariantDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + query = query.order_by(self.VariantDBE.created_at.desc()) + else: + query = query.order_by(self.VariantDBE.created_at.desc()) + else: + query = query.order_by(self.VariantDBE.created_at.desc()) + else: + query = query.order_by(self.VariantDBE.created_at.desc()) + + if windowing is not None: + if windowing.limit is not None: + query = query.limit(windowing.limit) + + result = await session.execute(query) variant_dbes = result.scalars().all() @@ -718,7 +750,7 @@ async def fork_variant( source_revisions = await self.log_revisions( project_id=project_id, # - revisions_log=RevisionsLog( + artifact_log=ArtifactLog( variant_id=artifact_fork.variant_id, revision_id=artifact_fork.revision_id, depth=artifact_fork.depth, @@ -902,28 +934,28 @@ async def fetch_revision( return None async with engine.core_session() as session: - stmt = select(self.RevisionDBE).filter( + query = select(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) - if revision_ref and (revision_ref.id or revision_ref.slug): + if revision_ref and not revision_ref.version: if revision_ref.id: - stmt = stmt.filter(self.RevisionDBE.id == revision_ref.id) # type: ignore + query = query.filter(self.RevisionDBE.id == revision_ref.id) # type: ignore elif revision_ref.slug: - stmt = stmt.filter(self.RevisionDBE.slug == revision_ref.slug) # type: ignore + query = query.filter(self.RevisionDBE.slug == revision_ref.slug) # type: ignore elif variant_ref: if variant_ref.id: - stmt = stmt.filter(self.RevisionDBE.variant_id == variant_ref.id) # type: ignore + query = query.filter(self.RevisionDBE.variant_id == variant_ref.id) # type: ignore if revision_ref and revision_ref.version: - stmt = stmt.filter(self.RevisionDBE.version == revision_ref.version) # type: ignore + query = query.filter(self.RevisionDBE.version == revision_ref.version) # type: ignore else: - stmt = stmt.order_by(self.RevisionDBE.created_at.desc()) # type: ignore - stmt = stmt.offset(0) + query = query.order_by(self.RevisionDBE.created_at.desc()) # type: ignore + query = query.offset(0) - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) revision_dbe = result.scalars().first() @@ -947,15 +979,15 @@ async def edit_revision( revision_edit: RevisionEdit, ) -> Optional[Revision]: async with engine.core_session() as session: - stmt = select(self.RevisionDBE).filter( + query = select(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.RevisionDBE.id == revision_edit.id) # type: ignore + query = query.filter(self.RevisionDBE.id == revision_edit.id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) revision_dbe = result.scalars().first() @@ -994,15 +1026,15 @@ async def archive_revision( revision_id: UUID, ) -> Optional[Revision]: async with engine.core_session() as session: - stmt = select(self.RevisionDBE).filter( + query = select(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.RevisionDBE.id == revision_id) # type: ignore + query = query.filter(self.RevisionDBE.id == revision_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) revision_dbe = result.scalars().first() @@ -1036,15 +1068,15 @@ async def unarchive_revision( revision_id: UUID, ) -> Optional[Revision]: async with engine.core_session() as session: - stmt = select(self.RevisionDBE).filter( + query = select(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.RevisionDBE.id == revision_id) # type: ignore + query = query.filter(self.RevisionDBE.id == revision_id) # type: ignore - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) revision_dbe = result.scalars().first() @@ -1085,7 +1117,7 @@ async def query_revisions( windowing: Optional[Windowing] = None, ) -> List[Revision]: async with engine.core_session() as session: - stmt = select(self.RevisionDBE).filter( + query = select(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) @@ -1095,25 +1127,43 @@ async def query_revisions( ] if artifact_ids: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.artifact_id.in_(artifact_ids) # type: ignore ) + artifact_slugs = [ + artifact.slug for artifact in artifact_refs if artifact.slug + ] + + if artifact_slugs: + query = query.filter( + self.RevisionDBE.artifact_id.in_(artifact_slugs) # type: ignore + ) + if variant_refs: variant_ids = [variant.id for variant in variant_refs if variant.id] if variant_ids: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.variant_id.in_(variant_ids) # type: ignore ) + variant_slugs = [ + variant.slug for variant in variant_refs if variant.slug + ] + + if variant_slugs: + query = query.filter( + self.RevisionDBE.variant_id.in_(variant_slugs) # type: ignore + ) + if revision_refs: revision_ids = [ revision.id for revision in revision_refs if revision.id ] if revision_ids: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.id.in_(revision_ids) # type: ignore ) @@ -1122,75 +1172,68 @@ async def query_revisions( ] if revision_slugs: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.slug.in_(revision_slugs) # type: ignore ) + if revision_query.authors: + query = query.filter( + self.RevisionDBE.author.in_(revision_query.authors) # type: ignore + ) + if revision_query.flags: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.flags.contains(revision_query.flags) # type: ignore ) if revision_query.tags: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.tags.contains(revision_query.tags) # type: ignore ) if revision_query.meta: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.meta.contains(revision_query.meta) # type: ignore ) - if revision_query.author: - stmt = stmt.filter( - self.RevisionDBE.author == revision_query.author # type: ignore - ) - - if revision_query.authors: - stmt = stmt.filter( - self.RevisionDBE.author.in_(revision_query.authors) # type: ignore - ) - - if revision_query.date: - stmt = stmt.filter( - self.RevisionDBE.date == revision_query.date # type: ignore - ) - - if revision_query.dates: - stmt = stmt.filter( - self.RevisionDBE.date.in_(revision_query.dates) # type: ignore - ) - - if revision_query.message: - stmt = stmt.filter( - self.RevisionDBE.message.ilike(f"%{revision_query.message}%") # type: ignore - ) - - if revision_query.name: - stmt = stmt.filter( - self.RevisionDBE.name.ilike(f"%{revision_query.name}%") # type: ignore - ) - - if revision_query.description: - stmt = stmt.filter( - self.RevisionDBE.description.ilike(f"%{revision_query.description}%") # type: ignore - ) - if include_archived is not True: - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.deleted_at.is_(None), # type: ignore ) if windowing: - stmt = apply_windowing( - stmt=stmt, - DBE=self.RevisionDBE, - attribute="id", # UUID7 - order="descending", # jobs-style - windowing=windowing, - ) + if windowing.next is not None: + query = query.filter( + self.RevisionDBE.id > windowing.next, # type: ignore + ) + if windowing.start: + query = query.filter( + self.RevisionDBE.created_at > windowing.start, # type: ignore + ) - result = await session.execute(stmt) + if windowing.stop: + query = query.filter( + self.RevisionDBE.created_at <= windowing.stop, # type: ignore + ) + + if windowing is not None: + if windowing.order: + if windowing.order.lower() == "ascending": + query = query.order_by(self.RevisionDBE.created_at.asc()) + elif windowing.order.lower() == "descending": + query = query.order_by(self.RevisionDBE.created_at.desc()) + else: + query = query.order_by(self.RevisionDBE.created_at.desc()) + else: + query = query.order_by(self.RevisionDBE.created_at.desc()) + else: + query = query.order_by(self.RevisionDBE.created_at.desc()) + + if windowing is not None: + if windowing.limit is not None: + query = query.limit(windowing.limit) + + result = await session.execute(query) revision_dbes = result.scalars().all() @@ -1287,23 +1330,22 @@ async def log_revisions( *, project_id: UUID, # - revisions_log: RevisionsLog, + artifact_log: ArtifactLog, ) -> List[Revision]: revision = await self.fetch_revision( # type: ignore project_id=project_id, - # variant_ref=( Reference( - id=revisions_log.variant_id, + id=artifact_log.variant_id, ) - if revisions_log.variant_id + if artifact_log.variant_id else None ), revision_ref=( Reference( - id=revisions_log.revision_id, + id=artifact_log.revision_id, ) - if revisions_log.revision_id + if artifact_log.revision_id else None ), ) @@ -1311,7 +1353,7 @@ async def log_revisions( if not revision: return [] - depth = revisions_log.depth + depth = artifact_log.depth version = int(revision.version) if revision.version else 0 if depth is not None: @@ -1323,31 +1365,31 @@ async def log_revisions( offset = None limit = None - order_by = self.RevisionDBE.id.desc() # type: ignore + order_by = self.RevisionDBE.created_at.desc() # type: ignore if depth is None: offset = 0 limit = version + 1 - order_by = self.RevisionDBE.id.asc() # type: ignore + order_by = self.RevisionDBE.created_at.asc() # type: ignore elif depth is not None: offset = max(version - depth + 1, 0) limit = min(depth, version + 1) - order_by = self.RevisionDBE.id.asc() # type: ignore + order_by = self.RevisionDBE.created_at.asc() # type: ignore async with engine.core_session() as session: - stmt = select(self.RevisionDBE).filter( + query = select(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter( + query = query.filter( self.RevisionDBE.variant_id == revision.variant_id, # type: ignore ) - stmt = stmt.order_by(order_by) - stmt = stmt.offset(offset) - stmt = stmt.limit(limit) + query = query.order_by(order_by) + query = query.offset(offset) + query = query.limit(limit) - result = await session.execute(stmt) + result = await session.execute(query) revision_dbes = result.scalars().all() @@ -1362,7 +1404,7 @@ async def log_revisions( for revision_dbe in revision_dbes ] - if order_by == self.RevisionDBE.id.asc(): # type: ignore + if order_by == self.RevisionDBE.created_at.asc(): # type: ignore revisions.reverse() return revisions @@ -1403,15 +1445,15 @@ async def _set_version( version: str, ) -> None: async with engine.core_session() as session: - stmt = update(self.RevisionDBE).filter( + query = update(self.RevisionDBE).filter( self.RevisionDBE.project_id == project_id, # type: ignore ) - stmt = stmt.filter(self.RevisionDBE.id == revision_id) # type: ignore + query = query.filter(self.RevisionDBE.id == revision_id) # type: ignore - stmt = stmt.values(version=version) # type: ignore + query = query.values(version=version) # type: ignore - await session.execute(stmt) + await session.execute(query) await session.commit() diff --git a/api/oss/src/dbs/postgres/observability/dao.py b/api/oss/src/dbs/postgres/observability/dao.py index 100460fc93..c377b166de 100644 --- a/api/oss/src/dbs/postgres/observability/dao.py +++ b/api/oss/src/dbs/postgres/observability/dao.py @@ -4,7 +4,7 @@ from uuid import UUID from sqlalchemy.exc import DBAPIError -from sqlalchemy import and_, or_, not_, distinct, Column, func, cast, text, Select +from sqlalchemy import and_, or_, not_, distinct, Column, func, cast, text from sqlalchemy import TIMESTAMP, Enum, UUID as SQLUUID, Integer, Numeric from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.future import select @@ -21,7 +21,6 @@ ) from oss.src.core.observability.interfaces import ObservabilityDAOInterface -from oss.src.core.observability.dtos import TreeType from oss.src.core.observability.dtos import ( QueryDTO, SpanDTO, @@ -51,30 +50,24 @@ log = get_module_logger(__name__) _DEFAULT_TIME_DELTA = timedelta(days=30) -_DEFAULT_INTERVAL = 1440 # 1 day -_DEFAULT_INTERVAL_TEXT = "1 day" +_DEFAULT_WINDOW = 1440 # 1 day +_DEFAULT_WINDOW_TEXT = "1 day" _MAX_ALLOWED_BUCKETS = 1024 _SUGGESTED_BUCKETS_LIST = [ - (1 * 1, "1 minute"), - (1 * 5, "5 minutes"), - (1 * 15, "15 minutes"), - (1 * 30, "30 minutes"), - (1 * 60 * 1, "1 hour"), - (1 * 60 * 3, "3 hours"), - (1 * 60 * 6, "6 hours"), - (1 * 60 * 12, "12 hours"), - (1 * 60 * 24 * 1, "1 day"), - (1 * 60 * 24 * 3, "3 days"), - (1 * 60 * 24 * 7, "7 days"), - (1 * 60 * 24 * 14, "14 days"), - (1 * 60 * 24 * 30, "30 days"), + (1, "1 minute"), + (5, "5 minutes"), + (15, "15 minutes"), + (30, "30 minutes"), + (60, "1 hour"), + (720, "12 hours"), + (1440, "1 day"), ] DEBUG_ARGS = { "dialect": postgresql.dialect(), "compile_kwargs": {"literal_binds": True}, } -STATEMENT_TIMEOUT = 15_000 # milliseconds +STATEMENT_TIMEOUT = 60_000 # milliseconds COLUMNS_TO_EXCLUDE = ["content"] COLUMNS_TO_INCLUDE = [ column @@ -96,11 +89,11 @@ async def query( ) -> Tuple[List[SpanDTO], Optional[int]]: try: async with engine.tracing_session() as session: - _stmt = text(f"SET LOCAL statement_timeout = '{STATEMENT_TIMEOUT}'") - await session.execute(_stmt) + stmt = text(f"SET LOCAL statement_timeout = '{STATEMENT_TIMEOUT}'") + await session.execute(stmt) # BASE (SUB-)QUERY - stmt = select(*COLUMNS_TO_INCLUDE) + query = select(*COLUMNS_TO_INCLUDE) # ---------------- # GROUPING @@ -113,14 +106,14 @@ async def query( grouping.focus.value + "_id", ) - stmt = select( + query = select( distinct(grouping_column).label("grouping_key"), NodesDBE.created_at, ) # -------- # SCOPING - stmt = stmt.filter_by( + query = query.filter_by( project_id=project_id, ) # ------- @@ -130,10 +123,10 @@ async def query( # --------- if windowing: if windowing.oldest: - stmt = stmt.filter(NodesDBE.created_at >= windowing.oldest) + query = query.filter(NodesDBE.created_at >= windowing.oldest) if windowing.newest: - stmt = stmt.filter(NodesDBE.created_at < windowing.newest) + query = query.filter(NodesDBE.created_at < windowing.newest) # --------- # FILTERING @@ -143,7 +136,7 @@ async def query( operator = filtering.operator conditions = filtering.conditions - stmt = stmt.filter( + query = query.filter( _combine( operator, _filters(conditions), @@ -152,58 +145,58 @@ async def query( # --------- # SORTING - stmt = stmt.order_by( + query = query.order_by( NodesDBE.created_at.desc(), ) # ------- # COUNTING // dangerous with large datasets - count_stmt = select( + count_query = select( func.count() # pylint: disable=E1102:not-callable - ).select_from(stmt.subquery()) + ).select_from(query.subquery()) - count = (await session.execute(count_stmt)).scalar() + count = (await session.execute(count_query)).scalar() # -------- # PAGINATION pagination = query_dto.pagination # ---------- if pagination: - stmt = _chunk( - stmt, + query = _chunk( + query, **pagination.model_dump(), ) # ---------- # GROUPING if grouping and grouping_column: - substmt = stmt.subquery() + subquery = query.subquery() - stmt = select(*COLUMNS_TO_INCLUDE) - stmt = stmt.filter( - grouping_column.in_(select(substmt.c["grouping_key"])) + query = select(*COLUMNS_TO_INCLUDE) + query = query.filter( + grouping_column.in_(select(subquery.c["grouping_key"])) ) # SORTING - stmt = stmt.order_by( + query = query.order_by( NodesDBE.created_at.desc(), NodesDBE.time_start.asc(), ) # ------- else: # SORTING - stmt = stmt.order_by( + query = query.order_by( NodesDBE.time_start.desc(), ) # ------- # -------- # DEBUGGING - # log.trace(str(stmt.compile(**DEBUG_ARGS)).replace("\n", " ")) + # log.trace(str(query.compile(**DEBUG_ARGS)).replace("\n", " ")) # --------- # QUERY EXECUTION - spans = (await session.execute(stmt)).all() + spans = (await session.execute(query)).all() # --------------- return [map_span_dbe_to_span_dto(span) for span in spans], count @@ -213,8 +206,8 @@ async def query( if "QueryCanceledError" in str(e.orig): raise FilteringException( - "TracingQuery execution was cancelled due to timeout. " - "Please try again with a smaller time range." + "Query execution was cancelled due to timeout. " + "Please try again with a smaller time window." ) from e raise e @@ -250,7 +243,7 @@ async def analytics( oldest = None newest = None - interval_text = None + window_text = None # --------- if analytics_dto.windowing: if analytics_dto.windowing.newest: @@ -266,36 +259,36 @@ async def analytics( else: oldest = newest - _DEFAULT_TIME_DELTA - if analytics_dto.windowing.interval: - _desired_interval = analytics_dto.windowing.interval + if analytics_dto.windowing.window: + _desired_window = analytics_dto.windowing.window else: - _desired_interval = _DEFAULT_INTERVAL + _desired_window = _DEFAULT_WINDOW - _interval_minutes = (newest - oldest).total_seconds() // 60 + _window_minutes = (newest - oldest).total_seconds() // 60 - _desired_buckets = _interval_minutes // _desired_interval + _desired_buckets = _window_minutes // _desired_window if _desired_buckets > _MAX_ALLOWED_BUCKETS: for ( _suggested_minutes, - _suggest_interval_text, + _suggest_window_text, ) in _SUGGESTED_BUCKETS_LIST: - _suggested_buckets = _interval_minutes // _suggested_minutes + _suggested_buckets = _window_minutes // _suggested_minutes if _suggested_buckets <= _MAX_ALLOWED_BUCKETS: - interval_text = _suggest_interval_text + window_text = _suggest_window_text break - if not interval_text: - interval_text = _SUGGESTED_BUCKETS_LIST[-1][1] + if not window_text: + window_text = _SUGGESTED_BUCKETS_LIST[-1][1] else: - interval_text = f"{_desired_interval} minute{'s' if _desired_interval > 1 else ''}" + window_text = f"{_desired_window} minute{'s' if _desired_window > 1 else ''}" else: newest = start_of_next_day oldest = newest - _DEFAULT_TIME_DELTA - interval_text = _DEFAULT_INTERVAL_TEXT + window_text = _DEFAULT_WINDOW_TEXT # --------- @@ -305,7 +298,7 @@ async def analytics( _cost = None _tokens = None _timestamp = func.date_bin( - text(f"'{interval_text}'"), + text(f"'{window_text}'"), NodesDBE.created_at, oldest, ).label("timestamp") @@ -361,7 +354,7 @@ async def analytics( # -------- # BASE QUERY - total_stmt = select( + total_query = select( _count, _duration, _cost, @@ -369,7 +362,7 @@ async def analytics( _timestamp, ).select_from(NodesDBE) - error_stmt = select( + error_query = select( _count, _duration, _cost, @@ -379,29 +372,29 @@ async def analytics( # ---------- # WINDOWING - total_stmt = total_stmt.filter( + total_query = total_query.filter( NodesDBE.created_at >= oldest, NodesDBE.created_at < newest, ) - error_stmt = error_stmt.filter( + error_query = error_query.filter( NodesDBE.created_at >= oldest, NodesDBE.created_at < newest, ) # --------- # SCOPING - total_stmt = total_stmt.filter_by( + total_query = total_query.filter_by( project_id=project_id, ) - error_stmt = error_stmt.filter_by( + error_query = error_query.filter_by( project_id=project_id, ) # ------- # TOTAL vs ERROR - error_stmt = error_stmt.filter( + error_query = error_query.filter( NodesDBE.exception.isnot(None), ) # ---------------- @@ -413,14 +406,14 @@ async def analytics( operator = filtering.operator conditions = filtering.conditions - total_stmt = total_stmt.filter( + total_query = total_query.filter( _combine( operator, _filters(conditions), ) ) - error_stmt = error_stmt.filter( + error_query = error_query.filter( _combine( operator, _filters(conditions), @@ -433,26 +426,26 @@ async def analytics( analytics_dto.grouping and analytics_dto.grouping.focus.value != "node" ): - total_stmt = total_stmt.filter_by( + total_query = total_query.filter_by( parent_id=None, ) - error_stmt = error_stmt.filter_by( + error_query = error_query.filter_by( parent_id=None, ) # -------- # SORTING - total_stmt = total_stmt.group_by("timestamp") + total_query = total_query.group_by("timestamp") - error_stmt = error_stmt.group_by("timestamp") + error_query = error_query.group_by("timestamp") # ------- # DEBUGGING # TODO: HIDE THIS BEFORE RELEASING # print( # str( - # total_stmt.compile( + # total_query.compile( # dialect=postgresql.dialect(), # compile_kwargs={"literal_binds": True}, # ) @@ -461,7 +454,7 @@ async def analytics( # print("...") # print( # str( - # error_stmt.compile( + # error_query.compile( # dialect=postgresql.dialect(), # compile_kwargs={"literal_binds": True}, # ) @@ -470,18 +463,18 @@ async def analytics( # --------- # QUERY EXECUTION - total_bucket_dbes = (await session.execute(total_stmt)).all() - error_bucket_dbes = (await session.execute(error_stmt)).all() + total_bucket_dbes = (await session.execute(total_query)).all() + error_bucket_dbes = (await session.execute(error_query)).all() # --------------- - interval = _to_minutes(interval_text) + window = _to_minutes(window_text) - timestamps = _to_timestamps(oldest, newest, interval) + timestamps = _to_timestamps(oldest, newest, window) bucket_dtos, count = map_bucket_dbes_to_dtos( total_bucket_dbes=total_bucket_dbes, error_bucket_dbes=error_bucket_dbes, - interval=interval, + window=window, timestamps=timestamps, ) @@ -492,8 +485,8 @@ async def analytics( if "QueryCanceledError" in str(e.orig): raise FilteringException( - "TracingQuery execution was cancelled due to timeout. " - "Please try again with a smaller time range." + "Query execution was cancelled due to timeout. " + "Please try again with a smaller time window." ) from e raise e @@ -516,8 +509,6 @@ async def create_one( project_id: UUID, span_dto: SpanDTO, ) -> None: - span_dto.tree.type = TreeType.INVOCATION - span_dbe = map_span_dto_to_span_dbe( project_id=project_id, span_dto=span_dto, @@ -533,9 +524,6 @@ async def create_many( project_id: UUID, span_dtos: List[SpanDTO], ) -> None: - for span_dto in span_dtos: - span_dto.tree.type = TreeType.INVOCATION - span_dbes = [ map_span_dto_to_span_dbe( project_id=project_id, @@ -559,14 +547,14 @@ async def read_one( ) -> Union[Optional[SpanDTO], Optional[NodesDBE]]: span_dbe = None async with engine.tracing_session() as session: - stmt = select(NodesDBE) + query = select(NodesDBE) - stmt = stmt.filter_by( + query = query.filter_by( project_id=project_id, node_id=node_id, ) - span_dbe = (await session.execute(stmt)).scalars().one_or_none() + span_dbe = (await session.execute(query)).scalars().one_or_none() span_dto = None if span_dbe and to_dto: @@ -585,13 +573,13 @@ async def read_many( ) -> Union[List[SpanDTO], List[NodesDBE]]: span_dbes = [] async with engine.tracing_session() as session: - stmt = select(NodesDBE) + query = select(NodesDBE) - stmt = stmt.filter_by(project_id=project_id) + query = query.filter_by(project_id=project_id) - stmt = stmt.filter(NodesDBE.node_id.in_(node_ids)) + query = query.filter(NodesDBE.node_id.in_(node_ids)) - span_dbes = (await session.execute(stmt)).scalars().all() + span_dbes = (await session.execute(query)).scalars().all() span_dtos = [] if span_dbes and to_dto: @@ -610,13 +598,13 @@ async def read_children( ) -> Union[List[SpanDTO], List[NodesDBE]]: span_dbes = [] async with engine.tracing_session() as session: - stmt = select(NodesDBE) + query = select(NodesDBE) - stmt = stmt.filter_by(project_id=project_id) + query = query.filter_by(project_id=project_id) - stmt = stmt.filter_by(parent_id=parent_id) + query = query.filter_by(parent_id=parent_id) - span_dbes = (await session.execute(stmt)).scalars().all() + span_dbes = (await session.execute(query)).scalars().all() span_dtos = [] if span_dbes and to_dto: @@ -691,48 +679,48 @@ async def delete_many( def _chunk( - stmt: Select, + query: select, page: Optional[int] = None, size: Optional[int] = None, next: Optional[datetime] = None, # pylint: disable=W0621:redefined-builtin stop: Optional[datetime] = None, -) -> Select: +) -> select: # 1. LIMIT size OFFSET (page - 1) * size # -> unstable if windowing.newest is not set if page and size: limit = size offset = (page - 1) * size - stmt = stmt.limit(limit).offset(offset) + query = query.limit(limit).offset(offset) # 2. WHERE next > created_at LIMIT size # -> unstable if created_at is not unique elif next and size: - stmt = stmt.filter(NodesDBE.created_at < next) - stmt = stmt.limit(size) + query = query.filter(NodesDBE.created_at < next) + query = query.limit(size) # 3. WHERE next > created_at AND created_at >= stop # -> stable thanks to the = stop) + query = query.filter(NodesDBE.created_at < next) + query = query.filter(NodesDBE.created_at >= stop) # 4. WHERE LIMIT size - # -> useful as a starter + # -> useful as a starter query elif size: - stmt = stmt.limit(size) + query = query.limit(size) # 5. WHERE created_at >= stop - # -> useful as a starter + # -> useful as a starter query elif stop: - stmt = stmt.filter(NodesDBE.created_at >= stop) + query = query.filter(NodesDBE.created_at >= stop) # 6. WHERE next > created_at # -> rather useless elif next: - stmt = stmt.filter(NodesDBE.created_at < next) + query = query.filter(NodesDBE.created_at < next) - return stmt + return query def _combine( @@ -895,9 +883,9 @@ def _filters(filtering: FilteringDTO) -> list: def _to_minutes( - interval_text: str, + window_text: str, ) -> int: - quantity, unit = interval_text.split() + quantity, unit = window_text.split() quantity = int(quantity) if unit == "minute" or unit == "minutes": @@ -917,7 +905,7 @@ def _to_minutes( def _to_timestamps( oldest: datetime, newest: datetime, - interval: int, + window: int, ) -> List[datetime]: buckets = [] @@ -938,6 +926,6 @@ def _to_timestamps( while bucket_start < _newest: buckets.append(bucket_start) - bucket_start += timedelta(minutes=interval) + bucket_start += timedelta(minutes=window) return buckets diff --git a/api/oss/src/dbs/postgres/observability/mappings.py b/api/oss/src/dbs/postgres/observability/mappings.py index 6fcc8269c9..93dcbf854e 100644 --- a/api/oss/src/dbs/postgres/observability/mappings.py +++ b/api/oss/src/dbs/postgres/observability/mappings.py @@ -140,7 +140,7 @@ def map_span_dto_to_span_dbe( def map_bucket_dbes_to_dtos( total_bucket_dbes: List[NodesDBE], error_bucket_dbes: List[NodesDBE], - interval: int, + window: int, timestamps: Optional[List[datetime]] = None, ) -> Tuple[List[BucketDTO], int]: total_metrics = { @@ -178,7 +178,7 @@ def map_bucket_dbes_to_dtos( bucket_dtos = [ BucketDTO( timestamp=timestamp, - interval=interval, + window=window, total=total_metrics.get(timestamp, MetricsDTO()), error=error_metrics.get(timestamp, MetricsDTO()), ) diff --git a/api/oss/src/dbs/postgres/queries/__init__.py b/api/oss/src/dbs/postgres/queries/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/dbs/postgres/queries/dbes.py b/api/oss/src/dbs/postgres/queries/dbes.py deleted file mode 100644 index 9f7f64dd33..0000000000 --- a/api/oss/src/dbs/postgres/queries/dbes.py +++ /dev/null @@ -1,136 +0,0 @@ -from sqlalchemy.orm import relationship -from sqlalchemy import ( - ForeignKeyConstraint, - PrimaryKeyConstraint, - Index, - UniqueConstraint, -) - -from oss.src.dbs.postgres.shared.base import Base -from oss.src.dbs.postgres.shared.dbas import ProjectScopeDBA -from oss.src.dbs.postgres.git.dbas import VariantDBA, RevisionDBA, ArtifactDBA - - -CASCADE_ALL_DELETE = "all, delete-orphan" - - -class QueryArtifactDBE(Base, ProjectScopeDBA, ArtifactDBA): - __tablename__ = "query_artifacts" - - __table_args__ = ( - PrimaryKeyConstraint( - "project_id", - "id", - ), - UniqueConstraint( - "project_id", - "slug", - ), - ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - Index( - "ix_query_artifacts_project_id_slug", - "project_id", - "slug", - ), - ) - - -class QueryVariantDBE(Base, ProjectScopeDBA, VariantDBA): - __tablename__ = "query_variants" - - __table_args__ = ( - PrimaryKeyConstraint( - "project_id", - "id", - ), - UniqueConstraint( - "project_id", - "slug", - ), - ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - ForeignKeyConstraint( - ["project_id", "artifact_id"], - ["query_artifacts.project_id", "query_artifacts.id"], - ondelete="CASCADE", - ), - Index( - "ix_query_variants_project_id_slug", - "project_id", - "slug", - ), - Index( - "ix_query_variants_project_id_artifact_id", - "project_id", - "artifact_id", - ), - ) - - artifact = relationship( - "QueryArtifactDBE", - backref="query_variants", - cascade=CASCADE_ALL_DELETE, - passive_deletes=True, - single_parent=True, - ) - - -class QueryRevisionDBE(Base, ProjectScopeDBA, RevisionDBA): - __tablename__ = "query_revisions" - - __table_args__ = ( - PrimaryKeyConstraint( - "project_id", - "id", - ), - UniqueConstraint( - "project_id", - "slug", - ), - ForeignKeyConstraint( - ["project_id"], - ["projects.id"], - ondelete="CASCADE", - ), - ForeignKeyConstraint( - ["project_id", "artifact_id"], - ["query_artifacts.project_id", "query_artifacts.id"], - ondelete="CASCADE", - ), - ForeignKeyConstraint( - ["project_id", "variant_id"], - ["query_variants.project_id", "query_variants.id"], - ondelete="CASCADE", - ), - Index( - "ix_query_revisions_project_id_slug", - "project_id", - "slug", - ), - Index( - "ix_query_revisions_project_id_artifact_id", - "project_id", - "artifact_id", - ), - Index( - "ix_query_revisions_project_id_variant_id", - "project_id", - "variant_id", - ), - ) - - artifact = relationship( - "QueryArtifactDBE", - viewonly=True, - ) - variant = relationship( - "QueryVariantDBE", - viewonly=True, - ) diff --git a/api/oss/src/dbs/postgres/secrets/dao.py b/api/oss/src/dbs/postgres/secrets/dao.py index 51811500eb..c04ffc753b 100644 --- a/api/oss/src/dbs/postgres/secrets/dao.py +++ b/api/oss/src/dbs/postgres/secrets/dao.py @@ -43,11 +43,11 @@ async def get( secret_id: UUID, ): async with engine.core_session() as session: - stmt = select(SecretsDBE).filter_by( + query = select(SecretsDBE).filter_by( id=secret_id, project_id=project_id, ) - result = await session.execute(stmt) # type: ignore + result = await session.execute(query) # type: ignore secrets_dbe = result.scalar() if secrets_dbe is None: @@ -58,9 +58,9 @@ async def get( async def list(self, project_id: UUID): async with engine.core_session() as session: - stmt = select(SecretsDBE).filter_by(project_id=project_id) + query = select(SecretsDBE).filter_by(project_id=project_id) - results = await session.execute(stmt) # type: ignore + results = await session.execute(query) # type: ignore secrets_dbes = results.scalars().all() vault_secret_dtos = [ map_secrets_dbe_to_dto(secrets_dbe=secret_dbe) @@ -75,11 +75,11 @@ async def update( update_secret_dto: UpdateSecretDTO, ): async with engine.core_session() as session: - stmt = select(SecretsDBE).filter_by( + query = select(SecretsDBE).filter_by( id=secret_id, project_id=project_id, ) - result = await session.execute(stmt) + result = await session.execute(query) secrets_dbe = result.scalar() if secrets_dbe is None: @@ -101,11 +101,11 @@ async def delete( secret_id: UUID, ): async with engine.core_session() as session: - stmt = select(SecretsDBE).filter_by( + query = select(SecretsDBE).filter_by( id=secret_id, project_id=project_id, ) - result = await session.execute(stmt) # type: ignore + result = await session.execute(query) # type: ignore vault_secret_dbe = result.scalar() if vault_secret_dbe is None: return diff --git a/api/oss/src/dbs/postgres/shared/dbas.py b/api/oss/src/dbs/postgres/shared/dbas.py index c6ada32dff..31d149dea3 100644 --- a/api/oss/src/dbs/postgres/shared/dbas.py +++ b/api/oss/src/dbs/postgres/shared/dbas.py @@ -1,6 +1,6 @@ import uuid_utils.compat as uuid -from sqlalchemy.dialects.postgresql import JSONB, JSON +from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy import Column, String, UUID, TIMESTAMP, func, Integer @@ -161,7 +161,7 @@ class MetaDBA: __abstract__ = True meta = Column( - JSON(none_as_null=True), + JSONB(none_as_null=True), nullable=True, ) @@ -170,7 +170,7 @@ class DataDBA: __abstract__ = True data = Column( - JSON(none_as_null=True), + JSONB(none_as_null=True), nullable=True, ) diff --git a/api/oss/src/dbs/postgres/shared/engine.py b/api/oss/src/dbs/postgres/shared/engine.py index 67253fbed1..6603a59b32 100644 --- a/api/oss/src/dbs/postgres/shared/engine.py +++ b/api/oss/src/dbs/postgres/shared/engine.py @@ -17,7 +17,7 @@ ) -DATABASE_MEMORY = 32 * 1024 * 1024 * 1024 # 32 GB +DATABASE_MEMORY = 16 * 1024 * 1024 * 1024 # 8 GB DATABASE_FACTOR = 8 * 1024 * 1024 * 1.15 # 8 MB + 15% overhead DATABASE_MAX_CONNECTIONS = 5000 # 5000 connections MAX_CONNECTIONS = min(DATABASE_MEMORY / DATABASE_FACTOR, DATABASE_MAX_CONNECTIONS) diff --git a/api/oss/src/dbs/postgres/shared/utils.py b/api/oss/src/dbs/postgres/shared/utils.py deleted file mode 100644 index 7674bf114a..0000000000 --- a/api/oss/src/dbs/postgres/shared/utils.py +++ /dev/null @@ -1,103 +0,0 @@ -from typing import Optional - -from sqlalchemy import Select, and_, or_ - -from oss.src.core.shared.dtos import Windowing - - -def apply_windowing( - *, - stmt: Select, - DBE, - attribute: str, - order: str, - windowing: Windowing, -) -> Select: - # ---------------------------------------------------------------- # - entitty_id_attribute = DBE.id if getattr(DBE, "id", None) else None # type: ignore - span_id_attribute = DBE.span_id if getattr(DBE, "span_id", None) else None # type: ignore - id_attribute = span_id_attribute or entitty_id_attribute or None - created_at_attribute = DBE.created_at if getattr(DBE, "created_at", None) else None # type: ignore - start_time_attribute = DBE.start_time if getattr(DBE, "start_time", None) else None # type: ignore - time_attribute = start_time_attribute or created_at_attribute or None - # UUID7 -> id ---------------------------------------------------- # - order_attribute = { - "id": id_attribute, - "span_id": span_id_attribute, - "created_at": created_at_attribute, - "start_time": start_time_attribute, - }.get(attribute.lower(), created_at_attribute) - - if not order_attribute or not time_attribute or not id_attribute: - return stmt - # ---------------------------------------------------------------- # - ascending_order = order_attribute.asc() # type: ignore - descending_order = order_attribute.desc() # type: ignore - # time-style -> descending --------------------------------------- # - if order.lower() == "descending": - windowing_order = descending_order - elif order.lower() == "ascending": - windowing_order = ascending_order - else: - windowing_order = ascending_order - - # ---------------------------------------------------------------- # - - if windowing.order: - if windowing.order.lower() == "descending": - windowing_order = descending_order - elif windowing.order.lower() == "ascending": - windowing_order = ascending_order - - if windowing_order == ascending_order: - if windowing.newest: - stmt = stmt.filter(time_attribute <= windowing.newest) - if windowing.oldest: - if windowing.next: - stmt = stmt.filter(time_attribute >= windowing.oldest) - else: - stmt = stmt.filter(time_attribute > windowing.oldest) - if windowing.next: - if order_attribute is id_attribute: # UUID7 case - stmt = stmt.filter(id_attribute > windowing.next) - elif windowing.oldest: # time-based order: use .oldest + .next - stmt = stmt.filter( - or_( - time_attribute > windowing.oldest, - and_( - time_attribute == windowing.oldest, - id_attribute > windowing.next, - ), - ) - ) - else: - if windowing.newest: - if windowing.next: - stmt = stmt.filter(time_attribute <= windowing.newest) - else: - stmt = stmt.filter(time_attribute < windowing.newest) - if windowing.oldest: - stmt = stmt.filter(time_attribute >= windowing.oldest) - if windowing.next: - if order_attribute is id_attribute: # UUID7 case - stmt = stmt.filter(id_attribute < windowing.next) - elif windowing.newest: # time-based order: use .newest + .next - stmt = stmt.filter( - or_( - time_attribute < windowing.newest, - and_( - time_attribute == windowing.newest, - id_attribute < windowing.next, - ), - ) - ) - - if order_attribute is id_attribute: - stmt = stmt.order_by(windowing_order) - else: - stmt = stmt.order_by(windowing_order, id_attribute) - - if windowing.limit: - stmt = stmt.limit(windowing.limit) - - return stmt diff --git a/api/oss/src/dbs/postgres/tracing/dao.py b/api/oss/src/dbs/postgres/tracing/dao.py index 9c75bf9e8b..eb67a14349 100644 --- a/api/oss/src/dbs/postgres/tracing/dao.py +++ b/api/oss/src/dbs/postgres/tracing/dao.py @@ -1,39 +1,28 @@ -from typing import Any, Dict, Optional, List, cast as type_cast +from typing import Optional, List from uuid import UUID from traceback import format_exc -from datetime import datetime -from sqlalchemy import cast, func, select, text, distinct -from sqlalchemy.types import Numeric, BigInteger -from sqlalchemy.sql import Select, and_, or_ from sqlalchemy.exc import DBAPIError from sqlalchemy import distinct, text -from sqlalchemy import Select, column +from sqlalchemy import Select from sqlalchemy.dialects.postgresql import dialect from sqlalchemy.future import select -from sqlalchemy.sql.elements import ColumnElement, Label -from sqlalchemy.dialects.postgresql import BIT +from sqlalchemy import func, cast, Numeric +from sqlalchemy.dialects import postgresql from oss.src.utils.logging import get_module_logger from oss.src.utils.exceptions import suppress_exceptions -from oss.src.core.shared.dtos import Windowing from oss.src.core.shared.exceptions import EntityCreationConflict from oss.src.core.tracing.interfaces import TracingDAOInterface from oss.src.core.tracing.dtos import ( OTelLink, OTelFlatSpan, - TracingQuery, + Query, Focus, Bucket, - Filtering, - MetricSpec, - MetricsBucket, - Condition, - ListOperator, ) -from oss.src.dbs.postgres.shared.utils import apply_windowing from oss.src.dbs.postgres.shared.exceptions import check_entity_creation_conflict from oss.src.dbs.postgres.shared.engine import engine from oss.src.dbs.postgres.tracing.dbes import SpanDBE @@ -45,33 +34,17 @@ map_buckets, ) from oss.src.dbs.postgres.tracing.utils import ( - DEBUG_ARGS, - TIMEOUT_STMT, - # combine, filter, - # parse_windowing, - build_specs_values, - build_base_cte, - build_extract_cte, - build_type_flags, - build_statistics_stmt, - # - compute_range, - parse_pcts, - compute_iqrs, - compute_cqvs, - compute_pscs, - normalize_hist, - parse_bin_freq, - normalize_freq, - compute_uniq, ) log = get_module_logger(__name__) +DEBUG_ARGS = {"dialect": dialect(), "compile_kwargs": {"literal_binds": True}} +STATEMENT_TIMEOUT = 60_000 # milliseconds + class TracingDAO(TracingDAOInterface): def __init__(self): @@ -160,14 +133,14 @@ async def read_span( span_id: UUID, ) -> Optional[OTelFlatSpan]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.span_id == span_id, ) - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) span_dbe = result.scalars().first() @@ -189,14 +162,14 @@ async def read_spans( span_ids: List[UUID], ) -> List[OTelFlatSpan]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.span_id.in_(span_ids), ) - stmt = stmt.limit(len(span_ids)) + query = query.limit(len(span_ids)) - result = await session.execute(stmt) + result = await session.execute(query) span_dbes = result.scalars().all() @@ -226,14 +199,14 @@ async def update_span( ) async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.span_id == new_span_dbe.span_id, ) - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) existing_span_dbe = result.scalars().first() @@ -278,14 +251,14 @@ async def update_spans( async with engine.tracing_session() as session: link_dtos: List[OTelLink] = [] - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.span_id.in_(span_ids), ) - stmt = stmt.limit(len(span_ids)) + query = query.limit(len(span_ids)) - result = await session.execute(stmt) + result = await session.execute(query) existing_span_dbes = result.scalars().all() @@ -334,14 +307,14 @@ async def delete_span( span_id: UUID, ) -> Optional[OTelLink]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.span_id == span_id, ) - stmt = stmt.limit(1) + query = query.limit(1) - result = await session.execute(stmt) + result = await session.execute(query) span_dbe = result.scalars().first() @@ -368,14 +341,14 @@ async def delete_spans( span_ids: List[UUID], ) -> List[OTelLink]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.span_id.in_(span_ids), ) - stmt = stmt.limit(len(span_ids)) + query = query.limit(len(span_ids)) - result = await session.execute(stmt) + result = await session.execute(query) span_dbes = result.scalars().all() @@ -407,19 +380,19 @@ async def read_trace( trace_id: UUID, ) -> List[OTelFlatSpan]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.trace_id == trace_id, ) - stmt = stmt.order_by(SpanDBE.start_time.asc()) + query = query.order_by(SpanDBE.start_time.asc()) - result = await session.execute(stmt) + result = await session.execute(query) span_dbes = result.scalars().all() if not span_dbes: - return [] + return None span_dtos = [ map_span_dbe_to_span_dto( @@ -439,19 +412,19 @@ async def read_traces( trace_ids: List[UUID], ) -> List[OTelFlatSpan]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.trace_id.in_(trace_ids), ) - stmt = stmt.order_by(SpanDBE.start_time.asc()) + query = query.order_by(SpanDBE.start_time.asc()) - result = await session.execute(stmt) + result = await session.execute(query) span_dbes = result.scalars().all() if not span_dbes: - return [] + return None span_dtos = [ map_span_dbe_to_span_dto( @@ -472,17 +445,17 @@ async def delete_trace( trace_id: UUID, ) -> List[OTelLink]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.trace_id == trace_id, ) - result = await session.execute(stmt) + result = await session.execute(query) span_dbes = result.scalars().all() if not span_dbes: - return [] + return None link_dtos = [ map_span_dbe_to_link_dto( @@ -508,17 +481,17 @@ async def delete_traces( trace_ids: List[UUID], ) -> List[OTelLink]: async with engine.tracing_session() as session: - stmt = select(SpanDBE).filter( + query = select(SpanDBE).filter( SpanDBE.project_id == project_id, SpanDBE.trace_id.in_(trace_ids), ) - result = await session.execute(stmt) + result = await session.execute(query) span_dbes = result.scalars().all() if not span_dbes: - return [] + return None link_dtos = [ map_span_dbe_to_link_dto( @@ -542,142 +515,91 @@ async def query( *, project_id: UUID, # - query: TracingQuery, # type: ignore + query: Query, ) -> List[OTelFlatSpan]: - # DE-STRUCTURING - focus = query.formatting.focus if query.formatting else None + _query = query - oldest = query.windowing.oldest if query.windowing else None - newest = query.windowing.newest if query.windowing else None - next = query.windowing.next if query.windowing else None - limit = query.windowing.limit if query.windowing else None - rate = query.windowing.rate if query.windowing else None + # DE-STRUCTURING ARGS + formatting = _query.formatting + windowing = _query.windowing + filtering = _query.filtering - operator = query.filtering.operator if query.filtering else None - conditions = query.filtering.conditions if query.filtering else None - # -------------- + focus = formatting.focus if formatting else None - # DEBUGGING - # log.trace(query.model_dump(mode="json", exclude_none=True)) - # --------- + oldest = windowing.oldest if windowing else None + newest = windowing.newest if windowing else None + limit = windowing.limit if windowing else None + + operator = filtering.operator if filtering else None + conditions = filtering.conditions if filtering else None + # ------------------- try: async with engine.tracing_session() as session: - # TIMEOUT - await session.execute(TIMEOUT_STMT) - # ------- + stmt = text(f"SET LOCAL statement_timeout = '{STATEMENT_TIMEOUT}'") + await session.execute(stmt) - # BASE (SUB-)STMT - base: Select = select(SpanDBE) - # --------------- + # BASE (SUB-)QUERY + query: Select = select(SpanDBE) + # ---------------- # GROUPING if focus == Focus.TRACE: - base = select( - SpanDBE.trace_id, - SpanDBE.start_time, - ).distinct(SpanDBE.trace_id) + distinct_ids = distinct(SpanDBE.trace_id).label("grouping_key") + + query = select(distinct_ids, SpanDBE.start_time) # -------- # SCOPING - base = base.filter(SpanDBE.project_id == project_id) + query = query.filter(SpanDBE.project_id == project_id) # ------- + # WINDOWING + if oldest: + query = query.filter(SpanDBE.start_time >= oldest) + + if newest: + query = query.filter(SpanDBE.start_time < newest) + # --------- + + # DEBUGGING + # log.trace(_query) + # --------- + # FILTERING - if operator and conditions: - base = base.filter( - type_cast( - ColumnElement[bool], - combine( - operator=operator, - clauses=filter(conditions), - ), - ) - ) + if filtering: + query = query.filter(combine(operator, filter(conditions))) # --------- + # SORTING + query = query.order_by(SpanDBE.start_time.desc()) + # ------- + # WINDOWING - if rate is not None: - percent = max(0, min(int(rate * 100.0), 100)) - - if percent == 0: - return [] - - if percent < 100: - base = base.where( - cast( - text("concat('x', left(cast(trace_id as varchar), 8))"), - BIT(32), - ).cast(BigInteger) - % 100 - < percent - ) - # --------- + if limit: + query = query.limit(limit) + # -------- # GROUPING if focus == Focus.TRACE: - # WINDOWING - if newest: - if next: - base = base.filter(SpanDBE.start_time <= newest) - else: - base = base.filter(SpanDBE.start_time < newest) - if oldest: - base = base.filter(SpanDBE.start_time >= oldest) - # --------- - - base = base.order_by(SpanDBE.trace_id, SpanDBE.start_time.desc()) - - inner = base.subquery("latest_per_trace") - - uniq = select(inner.c.trace_id) - - uniq = uniq.order_by(inner.c.start_time.desc()) - - if next and newest: - uniq = uniq.filter( - or_( - inner.c.start_time < newest, - and_( - inner.c.start_time == newest, - inner.c.trace_id < next, - ), - ) - ) + subquery = select(query.subquery().c["grouping_key"]) - if limit: - uniq = uniq.limit(limit) - - stmt = ( - select(SpanDBE) - .filter(SpanDBE.trace_id.in_(uniq)) - .order_by( - func.max(SpanDBE.start_time) - .over(partition_by=SpanDBE.trace_id) - .desc(), - SpanDBE.start_time.asc(), - ) - ) - else: - if query.windowing: - stmt = apply_windowing( - stmt=base, - DBE=SpanDBE, - attribute="start_time", - order="descending", - windowing=query.windowing, - ) - else: - stmt = base + query = select(SpanDBE) + + query = query.filter(SpanDBE.trace_id.in_(subquery)) + + # SORTING + query = query.order_by(SpanDBE.start_time.asc()) + # ------- # -------- # DEBUGGING - # log.trace(str(stmt.compile(**DEBUG_ARGS)).replace("\n", " ")) + # log.trace(str(query.compile(**DEBUG_ARGS)).replace("\n", " ")) # --------- - # EXECUTION - dbes = (await session.execute(stmt)).scalars().all() - # --------- + # QUERY EXECUTION + dbes = (await session.execute(query)).scalars().all() + # --------------- if not dbes: return [] @@ -692,8 +614,8 @@ async def query( if "QueryCanceledError" in str(e.orig): raise Exception( # pylint: disable=broad-exception-raised - "TracingQuery execution was cancelled due to timeout. " - "Please try again with a smaller time interval." + "Query execution was cancelled due to timeout. " + "Please try again with a smaller time window." ) from e raise e @@ -705,29 +627,25 @@ async def query( ### ANALYTICS - @suppress_exceptions(default=[]) - async def legacy_analytics( + async def analytics( self, *, project_id: UUID, # - query: TracingQuery, + query: Query, ) -> List[Bucket]: - # DEBUGGING - # log.trace(query.model_dump(mode="json", exclude_none=True)) - # --------- - ( oldest, newest, stride, - interval, + window, timestamps, ) = parse_windowing(query.windowing) try: async with engine.tracing_session() as session: - await session.execute(TIMEOUT_STMT) + stmt = text(f"SET LOCAL statement_timeout = '{STATEMENT_TIMEOUT}'") + await session.execute(stmt) # BASE QUERY HELPERS _count = func.count().label("count") # pylint: disable=not-callable @@ -777,7 +695,7 @@ async def legacy_analytics( # -------- # BASE QUERY - total_stmt = select( + total_query = select( _count, _duration, _costs, @@ -785,7 +703,7 @@ async def legacy_analytics( _timestamp, ).select_from(SpanDBE) - errors_stmt = select( + errors_query = select( _count, _duration, _costs, @@ -795,28 +713,31 @@ async def legacy_analytics( # ---------- # WINDOWING - total_stmt = total_stmt.filter( + total_query = total_query.filter( SpanDBE.created_at >= oldest, SpanDBE.created_at < newest, ) - errors_stmt = errors_stmt.filter( + errors_query = errors_query.filter( SpanDBE.created_at >= oldest, SpanDBE.created_at < newest, ) # --------- # SCOPING - total_stmt = total_stmt.filter_by( + total_query = total_query.filter_by( project_id=project_id, ) - errors_stmt = errors_stmt.filter_by( + errors_query = errors_query.filter_by( project_id=project_id, ) # ------- # TOTAL vs ERRORS + errors_query = errors_query.filter( + SpanDBE.attributes["ag.exception"].isnot(None), + ) # ---------------- # FILTERING @@ -825,76 +746,55 @@ async def legacy_analytics( operator = query.filtering.operator conditions = query.filtering.conditions - total_stmt = total_stmt.filter( - type_cast( - ColumnElement[bool], - combine( - operator=operator, - clauses=filter(conditions), - ), + total_query = total_query.filter( + combine( + operator, + filter(conditions), ) ) - errors_stmt = errors_stmt.filter( - type_cast( - ColumnElement[bool], - combine( - operator=operator, - clauses=filter( - conditions - + [ - Condition( - field="events", - operator=ListOperator.IN, - value=[{"name": "exception"}], - ) - ] - ), - ), + errors_query = errors_query.filter( + combine( + operator, + filter(conditions), ) ) # --------- # GROUPING if query.formatting and query.formatting.focus == Focus.TRACE: - total_stmt = total_stmt.filter_by( + total_query = total_query.filter_by( parent_id=None, ) - errors_stmt = errors_stmt.filter_by( + errors_query = errors_query.filter_by( parent_id=None, ) # -------- # SORTING - total_stmt = total_stmt.group_by("timestamp") + total_query = total_query.group_by("timestamp") - errors_stmt = errors_stmt.group_by("timestamp") + errors_query = errors_query.group_by("timestamp") # ------- # DEBUGGING - # log.trace(str(total_stmt.compile(**DEBUG_ARGS)).replace("\n", " ")) - # log.trace(str(errors_stmt.compile(**DEBUG_ARGS)).replace("\n", " ")) + # log.trace(str(total_query.compile(**DEBUG_ARGS)).replace("\n", " ")) + # log.trace(str(errors_query.compile(**DEBUG_ARGS)).replace("\n", " ")) # --------- # QUERY EXECUTION - total_buckets = list((await session.execute(total_stmt)).all()) - errors_buckets = list((await session.execute(errors_stmt)).all()) + total_buckets = (await session.execute(total_query)).all() + errors_buckets = (await session.execute(errors_query)).all() # --------------- buckets = map_buckets( total_buckets=total_buckets, errors_buckets=errors_buckets, - interval=interval, + window=window, timestamps=timestamps, ) - # DEBUGGING - # log.trace( - # [b.model_dump(mode="json", exclude_none=True) for b in buckets] - # ) - # --------- - return buckets except DBAPIError as e: @@ -904,7 +804,7 @@ async def legacy_analytics( if "AnalyticsCanceledError" in str(e.orig): raise Exception( # pylint: disable=broad-exception-raised "Analytics execution was cancelled due to timeout. " - "Please try again with a smaller time interval." + "Please try again with a smaller time window." ) from e raise e @@ -913,209 +813,3 @@ async def legacy_analytics( log.error(f"{type(e).__name__}: {e}") log.error(format_exc()) raise e - - @suppress_exceptions(default=[]) - async def analytics( - self, - *, - project_id: UUID, - # - query: TracingQuery, - specs: List[MetricSpec], - ) -> List[MetricsBucket]: - # DEBUGGING - # log.trace(query.model_dump(mode="json", exclude_none=True)) - # log.trace([s.model_dump(mode="json", exclude_none=True) for s in specs]) - # --------- - - if not query.windowing: - query.windowing = Windowing() - - if not query.filtering: - query.filtering = Filtering() - - ( - oldest, - newest, - stride, - interval, - timestamps, - ) = parse_windowing( - windowing=query.windowing, - ) - - if query.windowing.rate is not None: - percent = max(0, min(int(query.windowing.rate * 100.0), 100)) - if percent == 0: - return [] - - metric_specs: Dict[int, MetricSpec] = { - idx: MetricSpec( - **s.model_dump(exclude={"path"}), - path=s.path.removeprefix("attributes."), # path prefix removal - ) - for idx, s in enumerate(specs) - } - - type_flags = build_type_flags( - metric_specs=list(metric_specs.values()), - ) - - if type_flags is None: - log.warning("[TRACING] [analytics] no type flags found") - return [] - - specs_values = build_specs_values( - metric_specs=list(metric_specs.values()), - ) - - if specs_values is None: - log.warning("[TRACING] [analytics] no specs values found") - return [] - - base_cte = build_base_cte( - project_id=project_id, - # - oldest=oldest, - newest=newest, - stride=stride, - rate=query.windowing.rate, - # - filtering=query.filtering, - ) - - if base_cte is None: - log.warning("[TRACING] [analytics] no base CTE found") - return [] - - extract_cte = build_extract_cte( - base_cte=base_cte, - specs_values=specs_values, - ) - - if extract_cte is None: - log.warning("[TRACING] [analytics] no extract CTE found") - return [] - - statistics_stmt = build_statistics_stmt( - extract_cte=extract_cte, - type_flags=type_flags, - ) - - if statistics_stmt is None: - log.warning("[TRACING] [analytics] no statistics CTE found") - return [] - - # DEBUGGING - # log.trace(str(statistics_stmt.compile(**DEBUG_ARGS)).replace("\n", " ")) - # --------- - - async with engine.tracing_session() as session: - await session.execute(TIMEOUT_STMT) - - rows = (await session.execute(select(statistics_stmt))).mappings().all() - - rows = [{**row} for row in rows] - - for r in rows: - kind: str = r["kind"] - value: Dict[str, Any] = dict() - - if kind == "cont_count": - value = r["value"] or {} - elif kind == "cont_basics": - value = r["value"] or {} - value = compute_range(value) - elif kind == "cont_pcts": - value = {} - value = parse_pcts(r["value"] or []) - value = compute_iqrs(value) - value = compute_cqvs(value) - value = compute_pscs(value) - elif kind == "cont_hist": - value = normalize_hist(r["value"] or []) - - elif kind == "disc_count": - value = r["value"] or {} - elif kind == "disc_basics": - value = r["value"] or {} - value = compute_range(value) - elif kind == "disc_pcts": - value = {} - value = parse_pcts(r["value"] or []) - value = compute_iqrs(value) - value = compute_cqvs(value) - value = compute_pscs(value) - elif kind == "disc_freq": - value = normalize_freq(r["value"] or []) - value = compute_uniq(value) - - elif kind == "cls_count": - value = r["value"] or {} - elif kind == "cls_freq": - value = normalize_freq(r["value"] or []) - value = compute_uniq(value) - - elif kind == "lbl_count": - value = r["value"] or {} - elif kind == "lbl_freq": - value = normalize_freq(r["value"] or []) - value = compute_uniq(value) - - elif kind == "bin_count": - value = r["value"] or {} - elif kind == "bin_freq": - value = r["value"] or {} - value = normalize_freq(parse_bin_freq(value)) - value = compute_uniq(value) - - elif kind == "str_count": - value = r["value"] or {} - - elif kind == "json_count": - value = r["value"] or {} - - r["value"] = value - - per_timestamp: Dict[datetime, Dict[str, Dict[str, Any]]] = dict() - - for r in rows: - _timestamp: datetime = r["timestamp"] - _idx: int = r["idx"] - - if _idx > len(metric_specs): - continue - - _spec = metric_specs.get(_idx) - - if not _spec: - continue - - _path = "attributes." + _spec.path # revert path prefix removal - _type = _spec.type - - if _timestamp not in per_timestamp: - per_timestamp[_timestamp] = dict() - - if _path not in per_timestamp[_timestamp]: - per_timestamp[_timestamp][_path] = dict(type=_type.value) - - per_timestamp[_timestamp][_path] = ( - per_timestamp[_timestamp][_path] | r["value"] - ) - - buckets: List[MetricsBucket] = [] - - for timestamp, metrics in per_timestamp.items(): - bucket = MetricsBucket( - timestamp=timestamp, - interval=interval, - metrics=metrics, - ) - buckets.append(bucket) - - # DEBUGGING - # log.trace([b.model_dump(mode="json", exclude_none=True) for b in buckets]) - # --------- - - return buckets diff --git a/api/oss/src/dbs/postgres/tracing/dbes.py b/api/oss/src/dbs/postgres/tracing/dbes.py index 6bf291d5dc..0fec8ff1e9 100644 --- a/api/oss/src/dbs/postgres/tracing/dbes.py +++ b/api/oss/src/dbs/postgres/tracing/dbes.py @@ -1,8 +1,6 @@ from sqlalchemy import ( PrimaryKeyConstraint, Index, - desc, - text, ) from oss.src.dbs.postgres.shared.base import Base @@ -54,12 +52,6 @@ class SpanDBE( "project_id", "span_type", ), # for filtering - Index( - "ix_spans_project_id_trace_id_created_at", - "project_id", - "trace_id", - desc("created_at"), - ), # for sorting and scrolling within a trace Index( "ix_attributes_gin", "attributes", @@ -87,16 +79,5 @@ class SpanDBE( "ix_events_gin", "events", postgresql_using="gin", - postgresql_ops={"events": "jsonb_path_ops"}, ), # for filtering - Index( - "ix_spans_fts_attributes_gin", - text("to_tsvector('simple', attributes)"), - postgresql_using="gin", - ), # for full-text search on attributes - Index( - "ix_spans_fts_events_gin", - text("to_tsvector('simple', events)"), - postgresql_using="gin", - ), # for full-text search on events ) diff --git a/api/oss/src/dbs/postgres/tracing/mappings.py b/api/oss/src/dbs/postgres/tracing/mappings.py index f8ce24ad3a..a7c9862bca 100644 --- a/api/oss/src/dbs/postgres/tracing/mappings.py +++ b/api/oss/src/dbs/postgres/tracing/mappings.py @@ -9,7 +9,6 @@ OTelLink, OTelHash, OTelReference, - OTelFlatSpan, OTelSpan, OTelSpanKind, OTelStatusCode, @@ -130,8 +129,8 @@ def map_span_dbe_to_span_dto( def map_span_dto_to_span_dbe( - project_id: UUID, - span_dto: OTelFlatSpan, + project_id: str, + span_dto: OTelSpan, user_id: Optional[UUID] = None, ) -> SpanDBE: span_dbe = SpanDBE( @@ -196,7 +195,7 @@ def map_span_dto_to_span_dbe( def map_buckets( total_buckets: list, errors_buckets: list, - interval: int, + window: int, timestamps: Optional[List[datetime]] = None, ) -> List[Bucket]: total_metrics = { @@ -239,7 +238,7 @@ def map_buckets( buckets = [ Bucket( timestamp=timestamp, - interval=interval, + window=window, total=total_metrics.get(timestamp, Analytics()), errors=errors_metrics.get(timestamp, Analytics()), ) diff --git a/api/oss/src/dbs/postgres/tracing/utils.py b/api/oss/src/dbs/postgres/tracing/utils.py index 2ffccd976d..af9c3fe81f 100644 --- a/api/oss/src/dbs/postgres/tracing/utils.py +++ b/api/oss/src/dbs/postgres/tracing/utils.py @@ -1,20 +1,12 @@ -from typing import Any, Dict, Tuple, Optional, Union, List, cast as type_cast +from typing import Any, Optional, List, Dict, Union from json import dumps from datetime import datetime, timedelta, time, timezone -from uuid import UUID -from math import ceil, floor -from sqlalchemy import case, cast, func, literal, literal_column, select, text -from sqlalchemy import and_, or_, not_, Column, bindparam, Text -from sqlalchemy import values, column, true +from sqlalchemy import and_, or_, not_, cast, Column, bindparam, Text, text from sqlalchemy import Integer, String, Float -from sqlalchemy.sql import func, Select, ClauseElement, ColumnElement -from sqlalchemy.types import Numeric, Boolean, Integer, String, BigInteger -from sqlalchemy.future import select -from sqlalchemy.sql.elements import ColumnElement -from sqlalchemy.sql.selectable import FromClause -from sqlalchemy.dialects.postgresql import dialect, ARRAY, TEXT, JSONB, BIT -from sqlalchemy.dialects.postgresql import aggregate_order_by +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.sql import func, ClauseElement, ColumnElement + from oss.src.utils.logging import get_module_logger @@ -44,17 +36,10 @@ ListOperator, ExistenceOperator, Windowing, - # - MetricType, - MetricSpec, ) log = get_module_logger(__name__) -DEBUG_ARGS = {"dialect": dialect(), "compile_kwargs": {"literal_binds": True}} -TIMEOUT_STMT = text(f"SET LOCAL statement_timeout = '{15_000}'") # milliseconds - - # UTILS @@ -76,24 +61,6 @@ def _to_nested_value( return value -def _to_jsonb_path( - attribute: ColumnElement, - key: str, - leaf_as_text: bool = True, -) -> Tuple[ColumnElement, str]: - parts = key.split(".") - - if leaf_as_text: - for p in parts[:-1]: - attribute = attribute.op("->")(p) - attribute = attribute.op("->>")(parts[-1]) - return attribute, "" - else: - for p in parts[:-1]: - attribute = attribute.op("->")(p) - return attribute, parts[-1] - - # OPERATORS @@ -142,18 +109,17 @@ def _handle_numeric_operator( clauses = [] if key is not None: - container, leaf = _to_jsonb_path(attribute, key, leaf_as_text=False) - clauses.append(container.op("?")(leaf)) + clauses.append(attribute.has_key(key)) - attribute, _ = _to_jsonb_path(attribute, key) + attribute = attribute[key].astext # defaults to string if isinstance(value, int): - attribute = cast(attribute, Float) + attribute = cast(attribute, Integer) elif isinstance(value, float): attribute = cast(attribute, Float) elif isinstance(value, list): if all(isinstance(v, int) for v in value): - attribute = cast(attribute, Float) + attribute = cast(attribute, Integer) elif all(isinstance(v, float) for v in value): attribute = cast(attribute, Float) elif all(isinstance(v, str) for v in value): @@ -195,10 +161,9 @@ def _handle_string_operator( options = TextOptions() if key is not None: - container, leaf = _to_jsonb_path(attribute, key, leaf_as_text=False) - clauses.append(container.op("?")(leaf)) + clauses.append(attribute.has_key(key)) - attribute, _ = _to_jsonb_path(attribute, key) + attribute = attribute[key].astext attribute = cast(attribute, String) @@ -262,11 +227,11 @@ def _handle_list_operator( subclauses: List[ClauseElement] = [] if key is not None and not marshalled: - container, leaf = _to_jsonb_path(attribute, key, leaf_as_text=False) + attribute = attribute[key] for v in value: - bound = bindparam(None, dumps([v]), type_=Text) # ensure array JSON + bound = bindparam(None, f"[{v}]", type_=Text) casted = cast(bound, JSONB) - subclauses.append(container[leaf].contains(casted)) + subclauses.append(attribute.contains(casted)) elif marshalled: for v in value: @@ -297,9 +262,9 @@ def _handle_list_operator( clauses.append(or_(*subclauses)) elif operator == ListOperator.NOT_IN: if options.all: - clauses.extend([or_(not_(sc), attribute.is_(None)) for sc in subclauses]) + clauses.extend([not_(sc) for sc in subclauses]) else: - clauses.append(or_(not_(or_(*subclauses)), attribute.is_(None))) + clauses.append(not_(or_(*subclauses))) return clauses @@ -314,11 +279,12 @@ def _handle_dict_operator( clauses: List[ClauseElement] = [] if not marshalled: - container, leaf = _to_jsonb_path(attribute, key, leaf_as_text=False) + attribute = attribute[key] + if operator == DictOperator.HAS: - clauses.append(container[leaf] == value) + clauses.append(attribute == value) elif operator == DictOperator.HAS_NOT: - clauses.append(container[leaf] != value) + clauses.append(attribute != value) else: value = [{key: value}] @@ -342,15 +308,13 @@ def _handle_existence_operator( if operator == ExistenceOperator.EXISTS: if key: - container, leaf = _to_jsonb_path(attribute, key, leaf_as_text=False) - clauses.append(container.op("?")(leaf)) + clauses.append(attribute.op("?")(key)) else: clauses.append(attribute.isnot(None)) elif operator == ExistenceOperator.NOT_EXISTS: if key: - container, leaf = _to_jsonb_path(attribute, key, leaf_as_text=False) - clauses.append(not_(container.op("?")(leaf))) + clauses.append(not_(attribute.op("?")(key))) else: clauses.append(attribute.is_(None)) @@ -472,6 +436,11 @@ def _handle_list_field( return clauses +# def _handle_events_field( +# condition: Condition, +# ) -> List[ClauseElement]: ... + + def _handle_enum_field( condition: Condition, ) -> List[ClauseElement]: @@ -659,8 +628,6 @@ def _handle_uuid_field( def _handle_fts_field( condition: Condition, ) -> List[ClauseElement]: - conditions = [] - # ------------------------- # # field = condition.field # key = condition.key @@ -673,23 +640,7 @@ def _handle_fts_field( ts_vector = func.to_tsvector(text("'simple'"), attribute) ts_query = func.websearch_to_tsquery(text("'simple'"), text(f"'{value}'")) - conditions.append(ts_vector.op("@@")(ts_query)) - - # ------------------------- # - # field = condition.field - # key = condition.key - value = condition.value - # options = condition.options - # operator = condition.operator - attribute: Column = getattr(SpanDBE, "events") - # ------------------------- # - - ts_vector = func.to_tsvector(text("'simple'"), attribute) - ts_query = func.websearch_to_tsquery(text("'simple'"), text(f"'{value}'")) - - conditions.append(ts_vector.op("@@")(ts_query)) - - return [or_(*conditions)] + return [ts_vector.op("@@")(ts_query)] # COMBINE / FILTER @@ -721,7 +672,7 @@ def combine( def filter( # pylint:disable=redefined-builtin - filtering: List[Union[Condition, Filtering]], + filtering: Filtering, ) -> List[ClauseElement]: clauses = [] @@ -737,12 +688,8 @@ def filter( # pylint:disable=redefined-builtin if field == Fields.TRACE_ID: clauses.extend(_handle_uuid_field(condition)) - elif field == Fields.TRACE_TYPE: - clauses.extend(_handle_enum_field(condition)) elif field == Fields.SPAN_ID: clauses.extend(_handle_uuid_field(condition)) - elif field == Fields.SPAN_TYPE: - clauses.extend(_handle_enum_field(condition)) elif field == Fields.PARENT_ID: clauses.extend(_handle_uuid_field(condition)) elif field == Fields.SPAN_KIND: @@ -763,8 +710,8 @@ def filter( # pylint:disable=redefined-builtin clauses.extend(_handle_list_field(condition)) elif field == Fields.REFERENCES: clauses.extend(_handle_list_field(condition)) - elif field == Fields.EVENTS: - clauses.extend(_handle_list_field(condition)) + # elif field == Fields.EVENTS: + # clauses.extend(_handle_events_field(condition)) elif field == Fields.CREATED_AT: clauses.extend(_handle_timestamp_field(condition)) elif field == Fields.UPDATED_AT: @@ -780,10 +727,9 @@ def filter( # pylint:disable=redefined-builtin elif field == Fields.CONTENT: clauses.extend(_handle_fts_field(condition)) else: - # raise FilteringException( - # f"Unsupported condition field: {field}", - # ) - log.warning(f"Unsupported condition field: {field}") + raise FilteringException( + f"Unsupported condition field: {field}", + ) return clauses @@ -791,65 +737,25 @@ def filter( # pylint:disable=redefined-builtin # ANALYTICS _DEFAULT_TIME_DELTA = timedelta(days=30) +_DEFAULT_WINDOW_MINUTES = 1440 # 1 day +_DEFAULT_WINDOW_TEXT = "1 day" _MAX_ALLOWED_BUCKETS = 1024 _SUGGESTED_BUCKETS_LIST = [ - (1 * 1, "1 minute"), - (1 * 5, "5 minutes"), - (1 * 15, "15 minutes"), - (1 * 30, "30 minutes"), - (1 * 60 * 1, "1 hour"), - (1 * 60 * 3, "3 hours"), - (1 * 60 * 6, "6 hours"), - (1 * 60 * 12, "12 hours"), - (1 * 60 * 24 * 1, "1 day"), - (1 * 60 * 24 * 3, "3 days"), - (1 * 60 * 24 * 7, "7 days"), - (1 * 60 * 24 * 14, "14 days"), - (1 * 60 * 24 * 30, "30 days"), + (1, "1 minute"), + (5, "5 minutes"), + (15, "15 minutes"), + (30, "30 minutes"), + (60, "1 hour"), + (720, "12 hours"), + (1440, "1 day"), ] -def _pluralize_minutes(m: int) -> str: - return f"{m} minute{'s' if m != 1 else ''}" - - -def _get_stride( - oldest: datetime, - newest: datetime, - interval: Optional[int] = None, -) -> str: - # total range in minutes (never negative) - range_minutes_float = max(0.0, (newest - oldest).total_seconds() / 60.0) - - # If no interval is provided, make the stride the whole range -> single bucket - if interval is None: - minutes = max(1, int(ceil(range_minutes_float))) - return _pluralize_minutes(minutes) - - # Interval given: enforce bucket limits - desired_interval = max(1, int(interval)) - # number of buckets with requested interval - desired_buckets = floor(range_minutes_float / desired_interval) - - if desired_buckets <= _MAX_ALLOWED_BUCKETS: - return _pluralize_minutes(desired_interval) - - # Too many buckets -> pick the first suggested interval that satisfies the cap - for suggested_minutes, suggested_text in _SUGGESTED_BUCKETS_LIST: - suggested_minutes = max(1, int(suggested_minutes)) - suggested_buckets = floor(range_minutes_float / suggested_minutes) - if suggested_buckets <= _MAX_ALLOWED_BUCKETS: - return suggested_text - - # If nothing fits, use the last (largest) suggestion - return _SUGGESTED_BUCKETS_LIST[-1][1] - - -def _get_interval( - stride: str, +def _stride_to_window( + window_text: str, ) -> int: - qty_text, unit = stride.split() - qty = int(qty_text) + qty, unit = window_text.split() + qty = int(qty) return { "minute": qty, "minutes": qty, @@ -862,25 +768,22 @@ def _get_interval( }[unit] -def _get_timestamps( +def _window_to_timestamps( oldest: datetime, newest: datetime, - interval: int, + window: int, ) -> List[datetime]: current = oldest buckets = [] while current < newest: buckets.append(current) - current += timedelta(minutes=interval) + current += timedelta(minutes=window) return buckets def parse_windowing( - windowing: Optional[Windowing] = None, -) -> tuple: - if not windowing: - windowing = Windowing() - + windowing: Windowing, +) -> int: now = datetime.now(timezone.utc) start_of_next_day = datetime.combine( now + timedelta(days=1), time.min, tzinfo=timezone.utc @@ -900,1161 +803,28 @@ def parse_windowing( else newest - _DEFAULT_TIME_DELTA ) - stride = _get_stride(oldest, newest, windowing.interval) - interval = _get_interval(stride) - timestamps = _get_timestamps(oldest, newest, interval) - - return oldest, newest, stride, interval, timestamps - - -PERCENTILE_LEVELS = { - k: v / 100 - for k, v in { - "p00.05": 0.05, - "p00.1": 0.1, - "p00.5": 0.5, - "p01": 1, - "p02.5": 2.5, - "p05": 5, - "p10": 10, - "p12.5": 12.5, - "p20": 20, - "p25": 25, - "p30": 30, - "p37.5": 37.5, - "p40": 40, - "p50": 50, - "p60": 60, - "p62.5": 62.5, - "p70": 70, - "p75": 75, - "p80": 80, - "p87.5": 87.5, - "p90": 90, - "p95": 95, - "p97.5": 97.5, - "p99": 99, - "p99.5": 99.5, - "p99.9": 99.9, - "p99.95": 99.95, - }.items() -} -PERCENTILES_KEYS: List[str] = list(PERCENTILE_LEVELS.keys()) -PERCENTILES_VALUES: List[float] = list(PERCENTILE_LEVELS.values()) -IQR_ITEMS: List[Tuple[str, Tuple[str, str]]] = [ - ("iqr25", ("p37.5", "p62.5")), - ("iqr50", ("p25", "p75")), - ("iqr75", ("p12.5", "p87.5")), - ("iqr80", ("p10", "p90")), - ("iqr90", ("p05", "p95")), - ("iqr95", ("p02.5", "p97.5")), - ("iqr99", ("p00.5", "p99.5")), - ("iqr99.9", ("p00.05", "p99.95")), -] -CQV_ITEMS: List[Tuple[str, Tuple[str, str]]] = [ - ("cqv25", ("p37.5", "p62.5")), - ("cqv50", ("p25", "p75")), - ("cqv75", ("p12.5", "p87.5")), - ("cqv80", ("p10", "p90")), - ("cqv90", ("p05", "p95")), - ("cqv99", ("p00.5", "p99.5")), - ("cqv95", ("p02.5", "p97.5")), - ("cqv99.9", ("p00.05", "p99.95")), -] -PSC_ITEMS: List[Tuple[str, Tuple[str, str]]] = [ - ("psc25", ("p37.5", "p62.5")), - ("psc50", ("p25", "p75")), - ("psc75", ("p12.5", "p87.5")), - ("psc80", ("p10", "p90")), - ("psc90", ("p05", "p95")), - ("psc99", ("p00.5", "p99.5")), - ("psc95", ("p02.5", "p97.5")), - ("psc99.9", ("p00.05", "p99.95")), -] -TOP_K = 3 - - -def build_type_flags( - *, - metric_specs: List[MetricSpec], -) -> Optional[Dict[str, bool]]: - present = {s.type for s in metric_specs} - - return { - "need_numeric_continuous": (MetricType.NUMERIC_CONTINUOUS in present), - "need_numeric_discrete": (MetricType.NUMERIC_DISCRETE in present), - "need_categorical_single": (MetricType.CATEGORICAL_SINGLE in present), - "need_categorical_multiple": (MetricType.CATEGORICAL_MULTIPLE in present), - "need_binary": (MetricType.BINARY in present), - "need_string": (MetricType.STRING in present), - "need_json": (MetricType.JSON in present), - } - - -def build_specs_values( - *, - metric_specs: List[MetricSpec], -) -> Optional[FromClause]: - if not len(metric_specs): - return None - - data = [ - ( - idx, - s.path.split("."), # -> text[] - s.type.value, - s.bins, - s.vmin, - s.vmax, - (s.edge if s.edge is not None else True), - ) - for idx, s in enumerate(metric_specs) - ] - - vals = values( - column("idx", Integer), - column("path", ARRAY(TEXT())), - column("type", String), - column("bins", Integer), - column("vmin", Numeric), - column("vmax", Numeric), - column("edge", Boolean), - name="specs_values", - ).data(data) - - return vals.alias("specs_values") - - -def build_base_cte( - *, - project_id: UUID, - oldest: datetime, - newest: datetime, - stride: str, - rate: Optional[float] = None, - filtering: Optional[Filtering] = None, -) -> Optional[FromClause]: - timestamp = func.date_bin( - text(f"'{stride}'"), - SpanDBE.created_at, - oldest, - ).label("timestamp") - - base_stmt: Select = ( - select( - timestamp, - SpanDBE.project_id, - SpanDBE.trace_id, - SpanDBE.span_id, - SpanDBE.parent_id, - SpanDBE.created_at, - SpanDBE.attributes.label("attributes"), - ) - .select_from(SpanDBE) - .where( - SpanDBE.project_id == project_id, - SpanDBE.created_at >= oldest, - SpanDBE.created_at < newest, - ) - .where(SpanDBE.parent_id.is_(None)) - ) - - # External filters - if filtering is not None: - base_stmt = base_stmt.filter( - type_cast( - ColumnElement[bool], - combine( - operator=filtering.operator, - clauses=filter(filtering.conditions), - ), - ) - ) - - if rate is not None: - percent = max(0, min(int(rate * 100.0), 100)) - - if percent == 0: - return None - - if percent < 100: - base_stmt = base_stmt.where( - cast( - text("concat('x', left(cast(trace_id as varchar), 8))"), BIT(32) - ).cast(BigInteger) - % 100 - < percent - ) - - return base_stmt.cte("base_cte") - - -def build_extract_cte( - *, - base_cte: FromClause, - specs_values: FromClause, -) -> Optional[FromClause]: - extract_stmt = ( - select( - base_cte.c.timestamp, - specs_values.c.idx, - specs_values.c.type, - specs_values.c.bins, - specs_values.c.vmin, - specs_values.c.vmax, - specs_values.c.edge, - base_cte.c.attributes.op("#>")(specs_values.c.path).label("jv"), - ) - .select_from(base_cte) - .join(specs_values, true()) + desired_window = ( + windowing.window if windowing and windowing.window else _DEFAULT_WINDOW_MINUTES ) - return extract_stmt.cte("extract_cte") - - -def build_statistics_stmt( - extract_cte: FromClause, - type_flags: Dict[str, bool], -) -> Optional[FromClause]: - blocks: List[Select] = [] - - # Use independent IFs so multiple families can be included together - if type_flags.get("need_numeric_continuous"): - blocks += build_numeric_continuous_blocks(extract_cte=extract_cte) - - if type_flags.get("need_numeric_discrete"): - blocks += build_numeric_discrete_blocks(extract_cte=extract_cte) - - if type_flags.get("need_categorical_single"): - blocks += build_categorical_single_blocks(extract_cte=extract_cte) - - if type_flags.get("need_categorical_multiple"): - blocks += build_categorical_multiple_blocks(extract_cte=extract_cte) - - if type_flags.get("need_binary"): - blocks += build_binary_blocks(extract_cte=extract_cte) - - if type_flags.get("need_string"): - blocks += build_string_blocks(extract_cte=extract_cte) - - if type_flags.get("need_json"): - blocks += build_json_blocks(extract_cte=extract_cte) - - if not blocks: - return None - - # If only one block family, skip union_all for clarity/perf - if len(blocks) == 1: - return blocks[0].cte("statistics_stmt") - - return blocks[0].union_all(*blocks[1:]).cte("statistics_stmt") - - -def build_numeric_continuous_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - # ------------------------------------------------- - # 1. Only valid numeric/continuous rows - # ------------------------------------------------- - cont_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - extract_cte.c.bins.label("bins_opt"), - extract_cte.c.vmin.label("vmin_opt"), - extract_cte.c.vmax.label("vmax_opt"), - extract_cte.c.edge.label("edge_opt"), - cast(extract_cte.c.jv.op("#>>")(text("'{}'")), Numeric).label("value"), - ).where( - extract_cte.c.type == literal(MetricType.NUMERIC_CONTINUOUS.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("number"), - ) - ).cte("cont_raw") - - # ------------------------------------------------- - # 2. Per-group stats - # ------------------------------------------------- - cont_minmax = ( - select( - cont_raw.c.timestamp, - cont_raw.c.idx, - func.count(cont_raw.c.value).label("n"), - func.min(cont_raw.c.value).label("vmin"), - func.max(cont_raw.c.value).label("vmax"), - func.max(cont_raw.c.bins_opt).label("bins_opt"), - func.max(cont_raw.c.vmin_opt).label("vmin_opt"), - func.max(cont_raw.c.vmax_opt).label("vmax_opt"), - func.bool_or(cont_raw.c.edge_opt).label("edge_opt"), - ).group_by(cont_raw.c.timestamp, cont_raw.c.idx) - ).cte("cont_minmax") - - # ------------------------------------------------- - # 3. Count metric - # ------------------------------------------------- - cont_count = ( - select( - cont_raw.c.timestamp, - cont_raw.c.idx, - literal("cont_count").label("kind"), - func.jsonb_build_object("count", func.count(cont_raw.c.value)).label( - "value" - ), - ) - .select_from( - cont_raw.join( - cont_minmax, - (cont_raw.c.timestamp == cont_minmax.c.timestamp) - & (cont_raw.c.idx == cont_minmax.c.idx), - ) - ) - .where(cont_minmax.c.n > 0) - .group_by(cont_raw.c.timestamp, cont_raw.c.idx) - ) - results.append(cont_count) - - # ------------------------------------------------- - # 4. Basic stats - # ------------------------------------------------- - cont_basics = ( - select( - cont_raw.c.timestamp, - cont_raw.c.idx, - literal("cont_basics").label("kind"), - func.jsonb_build_object( - "sum", - func.sum(cont_raw.c.value), - "mean", - func.avg(cont_raw.c.value), - "min", - func.min(cont_raw.c.value), - "max", - func.max(cont_raw.c.value), - ).label("value"), - ) - .select_from( - cont_raw.join( - cont_minmax, - (cont_raw.c.timestamp == cont_minmax.c.timestamp) - & (cont_raw.c.idx == cont_minmax.c.idx), - ) - ) - .where(cont_minmax.c.n > 0) - .group_by(cont_raw.c.timestamp, cont_raw.c.idx) - ) - results.append(cont_basics) - - # ------------------------------------------------- - # 5. Percentiles - # ------------------------------------------------- - cont_pcts = ( - select( - cont_raw.c.timestamp, - cont_raw.c.idx, - literal("cont_pcts").label("kind"), - func.to_jsonb( - func.percentile_cont( - literal(PERCENTILES_VALUES, ARRAY(Numeric())) - ).within_group(cont_raw.c.value) - ).label("value"), - ) - .select_from( - cont_raw.join( - cont_minmax, - (cont_raw.c.timestamp == cont_minmax.c.timestamp) - & (cont_raw.c.idx == cont_minmax.c.idx), - ) - ) - .where(cont_minmax.c.n > 0) - .group_by(cont_raw.c.timestamp, cont_raw.c.idx) - ) - results.append(cont_pcts) - - # ------------------------------------------------- - # 6. Chosen min/max/bins - # ------------------------------------------------- - chosen_min = case( - (cont_minmax.c.vmin_opt.isnot(None), cast(cont_minmax.c.vmin_opt, Numeric)), - else_=cont_minmax.c.vmin, - ) - chosen_max = case( - (cont_minmax.c.vmax_opt.isnot(None), cast(cont_minmax.c.vmax_opt, Numeric)), - else_=cont_minmax.c.vmax, - ) - chosen_bins = case( - (cont_minmax.c.bins_opt.isnot(None), cast(cont_minmax.c.bins_opt, Integer)), - else_=cast(func.ceil(func.sqrt(cast(cont_minmax.c.n, Numeric))), Integer), - ) - - cont_bins = ( - select( - cont_minmax.c.timestamp, - cont_minmax.c.idx, - case( - ( - (cont_minmax.c.n <= 1) | (chosen_min == chosen_max), - literal(1, type_=Integer), - ), - else_=chosen_bins, - ).label("bins"), - chosen_min.label("vmin"), - chosen_max.label("vmax"), - cont_minmax.c.n.label("n"), - cont_minmax.c.edge_opt.label("edge"), - ).where(cont_minmax.c.n > 0) - ).cte("cont_bins") - - # ------------------------------------------------- - # 7. Bin series & intervals (precompute is_last_bin) - # ------------------------------------------------- - cont_bin_series = ( - func.generate_series(1, cont_bins.c.bins) - .table_valued("bin") - .render_derived(name="cont_bin_series") - ) - - is_edge_aligned = cont_bins.c.edge.is_(None) | cont_bins.c.edge.is_(True) - - bin_width = case( - (is_edge_aligned, (cont_bins.c.vmax - cont_bins.c.vmin) / cont_bins.c.bins), - else_=(cont_bins.c.vmax - cont_bins.c.vmin) / (cont_bins.c.bins - 1), - ) - - bin_intervals = ( - select( - cont_bins.c.timestamp, - cont_bins.c.idx, - cont_bin_series.c.bin, - (cont_bin_series.c.bin == cont_bins.c.bins).label("is_last_bin"), - case( - (cont_bin_series.c.bin == literal(1, Integer), cont_bins.c.vmin), - else_=case( - ( - is_edge_aligned, - cont_bins.c.vmin + (cont_bin_series.c.bin - 1) * bin_width, - ), - else_=(cont_bins.c.vmin + (cont_bin_series.c.bin - 1) * bin_width) - - (bin_width / 2), - ), - ).label("interval_start"), - case( - (cont_bin_series.c.bin == cont_bins.c.bins, cont_bins.c.vmax), - else_=case( - ( - is_edge_aligned, - cont_bins.c.vmin + cont_bin_series.c.bin * bin_width, - ), - else_=(cont_bins.c.vmin + (cont_bin_series.c.bin - 1) * bin_width) - + (bin_width / 2), - ), - ).label("interval_end"), - ).select_from(cont_bins.join(cont_bin_series, literal(True))) - ).cte("bin_intervals") - - # ------------------------------------------------- - # 8. Bin counts (use is_last_bin for <= on last bin) - # ------------------------------------------------- - cont_bin_counts = ( - select( - cont_raw.c.timestamp, - cont_raw.c.idx, - bin_intervals.c.bin, - func.count().label("count"), - ) - .select_from( - cont_raw.join( - bin_intervals, - (cont_raw.c.timestamp == bin_intervals.c.timestamp) - & (cont_raw.c.idx == bin_intervals.c.idx) - & (cont_raw.c.value >= bin_intervals.c.interval_start) - & case( - ( - bin_intervals.c.is_last_bin, - cont_raw.c.value <= bin_intervals.c.interval_end, - ), - else_=(cont_raw.c.value < bin_intervals.c.interval_end), - ), - ) - ) - .group_by(cont_raw.c.timestamp, cont_raw.c.idx, bin_intervals.c.bin) - ).cte("cont_bin_counts") - - # ------------------------------------------------- - # 9. Full histogram (includes empty bins) - # ------------------------------------------------- - full_hist = ( - select( - bin_intervals.c.timestamp, - bin_intervals.c.idx, - literal("cont_hist").label("kind"), - func.coalesce( - func.jsonb_agg( - aggregate_order_by( - func.jsonb_build_object( - "bin", - bin_intervals.c.bin, - "count", - func.coalesce(cont_bin_counts.c.count, literal(0)), - "interval", - func.jsonb_build_array( - bin_intervals.c.interval_start, - bin_intervals.c.interval_end, - ), - ), - bin_intervals.c.bin.asc(), - ) - ), - func.jsonb_build_array(), - ).label("value"), - ) - .select_from( - bin_intervals.outerjoin( - cont_bin_counts, - (bin_intervals.c.timestamp == cont_bin_counts.c.timestamp) - & (bin_intervals.c.idx == cont_bin_counts.c.idx) - & (bin_intervals.c.bin == cont_bin_counts.c.bin), - ) - ) - .group_by(bin_intervals.c.timestamp, bin_intervals.c.idx) - ) - results.append(full_hist) - - return results - - -def build_numeric_discrete_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - # Only valid numeric/discrete rows - disc_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - cast(extract_cte.c.jv.op("#>>")(text("'{}'")), Numeric).label("value"), - ).where( - extract_cte.c.type == literal(MetricType.NUMERIC_DISCRETE.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("number"), - ) - ).cte("disc_raw") - - disc_counts = ( - select( - disc_raw.c.timestamp, - disc_raw.c.idx, - func.count(disc_raw.c.value).label("n"), - ).group_by(disc_raw.c.timestamp, disc_raw.c.idx) - ).cte("disc_counts") - - # Count (emit only when n>0) - disc_count = ( - select( - disc_raw.c.timestamp, - disc_raw.c.idx, - literal("disc_count").label("kind"), - func.jsonb_build_object("count", func.count(disc_raw.c.value)).label( - "value" - ), - ) - .select_from( - disc_raw.join( - disc_counts, - (disc_raw.c.timestamp == disc_counts.c.timestamp) - & (disc_raw.c.idx == disc_counts.c.idx), - ) - ) - .where(disc_counts.c.n > 0) - .group_by(disc_raw.c.timestamp, disc_raw.c.idx) - ) - results.append(disc_count) - - # Basics (emit only when n>0) - disc_basics = ( - select( - disc_raw.c.timestamp, - disc_raw.c.idx, - literal("disc_basics").label("kind"), - func.jsonb_build_object( - "sum", - func.sum(disc_raw.c.value), - "mean", - func.avg(disc_raw.c.value), - "min", - func.min(disc_raw.c.value), - "max", - func.max(disc_raw.c.value), - ).label("value"), - ) - .select_from( - disc_raw.join( - disc_counts, - (disc_raw.c.timestamp == disc_counts.c.timestamp) - & (disc_raw.c.idx == disc_counts.c.idx), - ) - ) - .where(disc_counts.c.n > 0) - .group_by(disc_raw.c.timestamp, disc_raw.c.idx) - ) - results.append(disc_basics) - - # Percentiles (emit only when n>0) - disc_pcts = ( - select( - disc_raw.c.timestamp, - disc_raw.c.idx, - literal("disc_pcts").label("kind"), - func.to_jsonb( - func.percentile_cont( - literal(PERCENTILES_VALUES, ARRAY(Numeric())) - ).within_group(disc_raw.c.value) - ).label("value"), - ) - .select_from( - disc_raw.join( - disc_counts, - (disc_raw.c.timestamp == disc_counts.c.timestamp) - & (disc_raw.c.idx == disc_counts.c.idx), - ) - ) - .where(disc_counts.c.n > 0) - .group_by(disc_raw.c.timestamp, disc_raw.c.idx) - ) - results.append(disc_pcts) - - # Exact-value frequency (naturally empty when no rows) - disc_rows = ( - select( - disc_raw.c.timestamp, - disc_raw.c.idx, - disc_raw.c.value.label("value"), - func.count().label("count"), - ).group_by(disc_raw.c.timestamp, disc_raw.c.idx, disc_raw.c.value) - ).cte("disc_rows") - - disc_freq = select( - disc_rows.c.timestamp, - disc_rows.c.idx, - literal("disc_freq").label("kind"), - func.coalesce( - func.jsonb_agg( - aggregate_order_by( - func.jsonb_build_object( - "value", disc_rows.c.value, "count", disc_rows.c.count - ), - disc_rows.c.count.desc(), - disc_rows.c.value.asc(), - ) - ), - func.jsonb_build_array(), - ).label("value"), - ).group_by(disc_rows.c.timestamp, disc_rows.c.idx) - results.append(disc_freq) - - return results - - -def build_categorical_single_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - # Only valid string rows for categorical/single - cls_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - cast(extract_cte.c.jv.op("#>>")(text("'{}'")), String).label("value"), - ).where( - extract_cte.c.type == literal(MetricType.CATEGORICAL_SINGLE.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("string"), - ) - ).cte("cls_raw") - - # Per-group counts for gating - cls_counts = ( - select( - cls_raw.c.timestamp, - cls_raw.c.idx, - func.count().label("n"), - ).group_by(cls_raw.c.timestamp, cls_raw.c.idx) - ).cte("cls_counts") - - # Total count (emit only when n>0) - cls_count = ( - select( - cls_raw.c.timestamp, - cls_raw.c.idx, - literal("cls_count").label("kind"), - func.jsonb_build_object("count", func.count()).label("value"), - ) - .select_from( - cls_raw.join( - cls_counts, - (cls_raw.c.timestamp == cls_counts.c.timestamp) - & (cls_raw.c.idx == cls_counts.c.idx), - ) - ) - .where(cls_counts.c.n > 0) - .group_by(cls_raw.c.timestamp, cls_raw.c.idx) - ) - results.append(cls_count) - - # Frequency table (only groups with rows appear) - cls_rows = ( - select( - cls_raw.c.timestamp, - cls_raw.c.idx, - cls_raw.c.value.label("value"), - func.count().label("count"), - ).group_by(cls_raw.c.timestamp, cls_raw.c.idx, cls_raw.c.value) - ).cte("cls_rows") - - cls_freq = select( - cls_rows.c.timestamp, - cls_rows.c.idx, - literal("cls_freq").label("kind"), - func.coalesce( - func.jsonb_agg( - aggregate_order_by( - func.jsonb_build_object( - "value", - cls_rows.c.value, - "count", - cls_rows.c.count, - ), - cls_rows.c.count.desc(), - cls_rows.c.value.asc(), - ) - ), - func.jsonb_build_array(), - ).label("value"), - ).group_by(cls_rows.c.timestamp, cls_rows.c.idx) - results.append(cls_freq) - - return results - - -def build_categorical_multiple_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - # Unnest array -> "value" (strings only) - elem = func.jsonb_array_elements(extract_cte.c.jv).table_valued("value") - - lbl_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - elem.c.value.op("#>>")(text("'{}'")).label("value"), - ) - .select_from(extract_cte.join(elem, literal(True))) - .where( - extract_cte.c.type == literal(MetricType.CATEGORICAL_MULTIPLE.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("array"), - func.jsonb_typeof(elem.c.value) == literal("string"), - ) - ).cte("lbl_raw") - - # Per-group counts for gating - lbl_counts = ( - select( - lbl_raw.c.timestamp, - lbl_raw.c.idx, - func.count().label("n"), - ).group_by(lbl_raw.c.timestamp, lbl_raw.c.idx) - ).cte("lbl_counts") - - # Total count (emit only when n>0) - lbl_count = ( - select( - lbl_raw.c.timestamp, - lbl_raw.c.idx, - literal("lbl_count").label("kind"), - func.jsonb_build_object("count", func.count()).label("value"), - ) - .select_from( - lbl_raw.join( - lbl_counts, - (lbl_raw.c.timestamp == lbl_counts.c.timestamp) - & (lbl_raw.c.idx == lbl_counts.c.idx), - ) - ) - .where(lbl_counts.c.n > 0) - .group_by(lbl_raw.c.timestamp, lbl_raw.c.idx) - ) - results.append(lbl_count) - - # Frequency table (only groups with rows appear) - lbl_rows = ( - select( - lbl_raw.c.timestamp, - lbl_raw.c.idx, - lbl_raw.c.value.label("value"), - func.count().label("count"), - ).group_by(lbl_raw.c.timestamp, lbl_raw.c.idx, lbl_raw.c.value) - ).cte("lbl_rows") - - lbl_freq = select( - lbl_rows.c.timestamp, - lbl_rows.c.idx, - literal("lbl_freq").label("kind"), - func.coalesce( - func.jsonb_agg( - aggregate_order_by( - func.jsonb_build_object( - "value", - lbl_rows.c.value, - "count", - lbl_rows.c.count, - ), - lbl_rows.c.count.desc(), - lbl_rows.c.value.asc(), - ) - ), - func.jsonb_build_array(), - ).label("value"), - ).group_by(lbl_rows.c.timestamp, lbl_rows.c.idx) - results.append(lbl_freq) - - return results - - -def build_binary_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - bin_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - extract_cte.c.jv.label("value"), - ).where( - extract_cte.c.type == literal(MetricType.BINARY.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("boolean"), - ) - ).cte("bin_raw") - - # Count (gate empty groups) - bin_counts = ( - select( - bin_raw.c.timestamp, - bin_raw.c.idx, - func.count().label("n"), - ).group_by(bin_raw.c.timestamp, bin_raw.c.idx) - ).cte("bin_counts") - - bin_count = ( - select( - bin_raw.c.timestamp, - bin_raw.c.idx, - literal("bin_count").label("kind"), - func.jsonb_build_object("count", func.count()).label("value"), - ) - .select_from( - bin_raw.join( - bin_counts, - (bin_raw.c.timestamp == bin_counts.c.timestamp) - & (bin_raw.c.idx == bin_counts.c.idx), - ) - ) - .where(bin_counts.c.n > 0) - .group_by(bin_raw.c.timestamp, bin_raw.c.idx) - ) - results.append(bin_count) - - # Frequency via FILTER (fewer CASEs, no NULLs) - t_cond = cast(bin_raw.c.value, Boolean).is_(True) - f_cond = cast(bin_raw.c.value, Boolean).is_(False) - - bin_freq = select( - bin_raw.c.timestamp, - bin_raw.c.idx, - literal("bin_freq").label("kind"), - func.jsonb_build_object( - True, - func.count().filter(t_cond), - False, - func.count().filter(f_cond), - ).label("value"), - ).group_by(bin_raw.c.timestamp, bin_raw.c.idx) - results.append(bin_freq) - - return results - - -def build_string_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - # Only valid strings - str_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - extract_cte.c.jv.label("value"), - ).where( - extract_cte.c.type == literal(MetricType.STRING.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("string"), - ) - ).cte("str_raw") - - str_counts = ( - select( - str_raw.c.timestamp, - str_raw.c.idx, - func.count().label("n"), - ).group_by(str_raw.c.timestamp, str_raw.c.idx) - ).cte("str_counts") - - # Count (emit only when n>0) - str_count = ( - select( - str_raw.c.timestamp, - str_raw.c.idx, - literal("str_count").label("kind"), - func.jsonb_build_object("count", func.count()).label("value"), - ) - .select_from( - str_raw.join( - str_counts, - (str_raw.c.timestamp == str_counts.c.timestamp) - & (str_raw.c.idx == str_counts.c.idx), - ) - ) - .where(str_counts.c.n > 0) - .group_by(str_raw.c.timestamp, str_raw.c.idx) - ) - results.append(str_count) - - return results - - -def build_json_blocks( - extract_cte: FromClause, -) -> List[Select]: - results: List[Select] = [] - - # Only valid JSON objects - json_raw = ( - select( - extract_cte.c.timestamp, - extract_cte.c.idx, - extract_cte.c.jv.label("value"), - ).where( - extract_cte.c.type == literal(MetricType.JSON.value), - extract_cte.c.jv.isnot(None), - func.jsonb_typeof(extract_cte.c.jv) == literal("object"), - ) - ).cte("json_raw") - - json_counts = ( - select( - json_raw.c.timestamp, - json_raw.c.idx, - func.count().label("n"), - ).group_by(json_raw.c.timestamp, json_raw.c.idx) - ).cte("json_counts") - - # Count (emit only when n>0) - json_count = ( - select( - json_raw.c.timestamp, - json_raw.c.idx, - literal("json_count").label("kind"), - func.jsonb_build_object("count", func.count()).label("value"), - ) - .select_from( - json_raw.join( - json_counts, - (json_raw.c.timestamp == json_counts.c.timestamp) - & (json_raw.c.idx == json_counts.c.idx), - ) - ) - .where(json_counts.c.n > 0) - .group_by(json_raw.c.timestamp, json_raw.c.idx) - ) - results.append(json_count) - - return results - - -def compute_range( - value: Dict[str, Any], -) -> Dict[str, Any]: - if "min" in value and "max" in value: - value["range"] = value["max"] - value["min"] - - return value - - -def parse_pcts( - value: List[Optional[float]], -) -> Dict[str, Any]: - if value is None or len(value) != len(PERCENTILES_KEYS): - return {} - - return {"pcts": dict(zip(PERCENTILES_KEYS, value))} - - -def compute_iqrs( - value: Dict[str, Any], -) -> Dict[str, Any]: - pcts = value.get("pcts") - - if not pcts: - return value - - iqrs: Dict[str, float] = {} - - for k, v in IQR_ITEMS: - if v[0] in pcts and v[1] in pcts: - iqrs[k] = pcts[v[1]] - pcts[v[0]] - - value["iqrs"] = iqrs - - return value - - -def compute_cqvs( - value: Dict[str, Any], -) -> Dict[str, Any]: - pcts = value.get("pcts") - - if not pcts: - return value - - if ( - pcts["p01"] * pcts["p99"] < 0 - or abs(pcts["p50"]) < abs(pcts["p99"]) / 100.0 - or abs(pcts["p50"]) < abs(pcts["p01"]) / 100.0 - ): - return value - - pscs = {} - - for k, v in PSC_ITEMS: - if v[0] in pcts and v[1] in pcts: - pscs[k] = ( - (pcts[v[1]] - pcts[v[0]]) / (pcts[v[1]] + pcts[v[0]]) - if (pcts[v[1]] + pcts[v[0]]) != 0 - else 0.0 - ) - - value["pscs"] = pscs - - return value - - -def compute_pscs( - value: Dict[str, Any], -) -> Dict[str, Any]: - pcts = value.get("pcts") - - if not pcts: - return value - - if ( - pcts["p01"] * pcts["p99"] < 0 - or abs(pcts["p50"]) < abs(pcts["p99"]) / 100.0 - or abs(pcts["p50"]) < abs(pcts["p01"]) / 100.0 - ): - return value - - pscs = {} - - for k, v in PSC_ITEMS: - if v[0] in pcts and v[1] in pcts: - pscs[k] = ( - (pcts[v[1]] - pcts[v[0]]) / pcts["p50"] if pcts["p50"] != 0 else 0.0 - ) - - value["pscs"] = pscs - - return value - - -def normalize_hist( - value: List[Dict[str, Any]], -) -> Dict[str, Any]: - hist = value - - if not hist: - return {} - - count = 0.0 - - for h in hist: - count += float(h.get("count", 0.0)) - - for h in hist: - h["density"] = round( - float(h.get("count", 0.0)) / count if count > 0.0 else 0.0, 5 - ) - - return {"hist": hist} - - -def parse_bin_freq( - value: Dict[str, Any], -) -> List[Dict[str, Any]]: - return [ - { - "value": True, - "count": value.get("true", 0), - }, - { - "value": False, - "count": value.get("false", 0), - }, - ] - - -def normalize_freq( - value: List[Dict[str, Any]], -) -> Dict[str, Any]: - freq = value - - if not freq: - return {} - - count = 0.0 - - for f in freq: - count += float(f.get("count", 0.0)) - - for f in freq: - f["density"] = round( - float(f.get("count", 0.0)) / count if count > 0.0 else 0.0, 5 - ) - - return {"freq": freq} - - -def compute_uniq( - value: Dict[str, Any], -) -> Dict[str, Any]: - freq = value.get("freq") - - if not freq: - return value - - uniq = [] - - for f in freq: - if f.get("value") is not None: - uniq.append(f.get("value")) + period_minutes = (newest - oldest).total_seconds() / 60 + desired_buckets = period_minutes // desired_window + if desired_buckets > _MAX_ALLOWED_BUCKETS: + stride = None + for suggested_minutes, suggested_text in _SUGGESTED_BUCKETS_LIST: + suggested_buckets = period_minutes // suggested_minutes + if suggested_buckets <= _MAX_ALLOWED_BUCKETS: + desired_window = suggested_minutes + stride = suggested_text + break + if not stride: + # fallback to last in list + desired_window = _SUGGESTED_BUCKETS_LIST[-1][0] + stride = _SUGGESTED_BUCKETS_LIST[-1][1] + else: + stride = f"{desired_window} minute{'s' if desired_window > 1 else ''}" - value["uniq"] = uniq + window = _stride_to_window(stride) + timestamps = _window_to_timestamps(oldest, newest, window) - return value + return oldest, newest, stride, window, timestamps diff --git a/api/oss/src/models/api/api_models.py b/api/oss/src/models/api/api_models.py index 9d81505a97..509c162fa3 100644 --- a/api/oss/src/models/api/api_models.py +++ b/api/oss/src/models/api/api_models.py @@ -64,9 +64,6 @@ class CreateApp(BaseModel): class CreateAppOutput(BaseModel): app_id: str app_name: str - app_type: Optional[str] = None - created_at: Optional[str] = None - updated_at: Optional[str] = None class UpdateApp(BaseModel): @@ -77,10 +74,6 @@ class UpdateAppOutput(CreateAppOutput): pass -class ReadAppOutput(CreateAppOutput): - pass - - class AppOutput(CreateAppOutput): pass @@ -230,7 +223,7 @@ class DeployToEnvironmentPayload(BaseModel): commit_message: Optional[str] = None -class TestsetOutput(BaseModel): +class TestSetOutput(BaseModel): id: str name: str csvdata: List[Dict[str, Any]] diff --git a/api/oss/src/models/api/evaluation_model.py b/api/oss/src/models/api/evaluation_model.py index d79d124921..7511923256 100644 --- a/api/oss/src/models/api/evaluation_model.py +++ b/api/oss/src/models/api/evaluation_model.py @@ -2,19 +2,16 @@ from datetime import datetime from typing import Optional, List, Dict, Any, Union -from pydantic import BaseModel, Field, model_validator, ConfigDict +from pydantic import BaseModel, Field, model_validator, field_validator from oss.src.utils import traces from oss.src.models.api.api_models import Result -from oss.src.core.shared.dtos import Tags, Meta - class LegacyEvaluator(BaseModel): name: str key: str direct_use: bool - settings_presets: Optional[list[dict]] = None settings_template: dict description: Optional[str] = None oss: Optional[bool] = False @@ -209,8 +206,6 @@ class EvaluationScenario(BaseModel): note: Optional[str] = None results: List[EvaluationScenarioResult] - model_config = ConfigDict(title="LegacyEvaluationScenario") - class EvaluationScenarioUpdate(BaseModel): vote: Optional[str] = None @@ -293,7 +288,7 @@ class LMProvidersEnum(str, Enum): class NewEvaluation(BaseModel): - name: Optional[str] = None + app_id: str revisions_ids: List[str] evaluators_configs: List[str] testset_id: str @@ -302,6 +297,7 @@ class NewEvaluation(BaseModel): class NewEvaluatorConfig(BaseModel): + app_id: str name: str evaluator_key: str settings_values: dict diff --git a/api/oss/src/models/api/testset_model.py b/api/oss/src/models/api/testset_model.py index 0300ccab85..60eae9560c 100644 --- a/api/oss/src/models/api/testset_model.py +++ b/api/oss/src/models/api/testset_model.py @@ -19,7 +19,7 @@ class Config: } -class TestsetSimpleResponse(BaseModel): +class TestSetSimpleResponse(BaseModel): id: str name: str created_at: str @@ -43,7 +43,7 @@ class NewTestset(BaseModel): csvdata: List[Dict[str, Any]] -class TestsetOutputResponse(BaseModel): +class TestSetOutputResponse(BaseModel): id: str = Field(..., alias="_id") name: str created_at: str diff --git a/api/oss/src/models/converters.py b/api/oss/src/models/converters.py index 768fded064..2186c9e079 100644 --- a/api/oss/src/models/converters.py +++ b/api/oss/src/models/converters.py @@ -34,7 +34,7 @@ from oss.src.models.db_models import ( AppDB, UserDB, - TestsetDB, + TestSetDB, AppVariantDB, VariantBaseDB, AppEnvironmentDB, @@ -45,7 +45,7 @@ from oss.src.models.api.api_models import ( App, BaseOutput, - TestsetOutput, + TestSetOutput, AppVariantRevision, PaginationParam, WithPagination, @@ -229,22 +229,22 @@ def app_db_to_pydantic(app_db: AppDB) -> App: ) -def testset_db_to_pydantic(testset_db: TestsetDB) -> TestsetOutput: +def testset_db_to_pydantic(test_set_db: TestSetDB) -> TestSetOutput: """ - Convert a TestsetDB object to a TestsetAPI object. + Convert a TestSetDB object to a TestSetAPI object. Args: - testset_db (Dict): The TestsetDB object to be converted. + test_set_db (Dict): The TestSetDB object to be converted. Returns: - TestsetAPI: The converted TestsetAPI object. + TestSetAPI: The converted TestSetAPI object. """ - return TestsetOutput( - name=testset_db.name, - csvdata=testset_db.csvdata, - created_at=str(testset_db.created_at), - updated_at=str(testset_db.updated_at), - id=str(testset_db.id), + return TestSetOutput( + name=test_set_db.name, + csvdata=test_set_db.csvdata, + created_at=str(test_set_db.created_at), + updated_at=str(test_set_db.updated_at), + id=str(test_set_db.id), ) diff --git a/api/oss/src/models/db/models.py b/api/oss/src/models/db/models.py index 4e78e945ac..c5a8828908 100644 --- a/api/oss/src/models/db/models.py +++ b/api/oss/src/models/db/models.py @@ -30,7 +30,7 @@ from oss.src.models.db_models import ( UserDB, - TestsetDB, + TestSetDB, AppVariantDB, VariantBaseDB, AppEnvironmentDB, @@ -43,7 +43,7 @@ AppDB, UserDB, ProjectDB, - TestsetDB, + TestSetDB, AppVariantDB, DeploymentDB, EvaluationDB, diff --git a/api/oss/src/models/db_models.py b/api/oss/src/models/db_models.py index 867cb30156..1240dea995 100644 --- a/api/oss/src/models/db_models.py +++ b/api/oss/src/models/db_models.py @@ -9,7 +9,6 @@ Boolean, ForeignKey, Enum, - JSON, ) from sqlalchemy.orm import relationship from sqlalchemy_json import mutable_json_type @@ -89,6 +88,7 @@ class WorkspaceDB(Base): ) +# KEEP in oss/ class UserDB(Base): __tablename__ = "users" @@ -110,6 +110,7 @@ class UserDB(Base): ) +# KEEP in oss/ class ProjectDB(Base): __tablename__ = "projects" @@ -150,9 +151,10 @@ class ProjectDB(Base): evaluator_config = relationship( "EvaluatorConfigDB", cascade=CASCADE_ALL_DELETE, backref="project" ) - testset = relationship("TestsetDB", cascade=CASCADE_ALL_DELETE, backref="project") + testset = relationship("TestSetDB", cascade=CASCADE_ALL_DELETE, backref="project") +# KEEP in oss/ class AppDB(Base): __tablename__ = "app_db" @@ -187,6 +189,7 @@ class AppDB(Base): ) +# KEEP in oss/ class DeploymentDB(Base): __tablename__ = "deployments" @@ -213,6 +216,7 @@ class DeploymentDB(Base): app = relationship("AppDB", back_populates="deployment") +# KEEP in oss/ class VariantBaseDB(Base): __tablename__ = "bases" @@ -243,6 +247,7 @@ class VariantBaseDB(Base): project = relationship("oss.src.models.db_models.ProjectDB") +# KEEP in oss/ class AppVariantDB(Base): __tablename__ = "app_variants" @@ -264,7 +269,7 @@ class AppVariantDB(Base): base_id = Column(UUID(as_uuid=True), ForeignKey("bases.id")) config_name = Column(String, nullable=False) config_parameters = Column( - mutable_json_type(dbtype=JSON, nested=True), # type: ignore + mutable_json_type(dbtype=JSONB, nested=True), # type: ignore nullable=False, default=dict, ) @@ -287,6 +292,7 @@ class AppVariantDB(Base): ) +# KEEP in oss/ class AppVariantRevisionsDB(Base): __tablename__ = "app_variant_revisions" @@ -310,7 +316,7 @@ class AppVariantRevisionsDB(Base): hidden = Column(Boolean, nullable=True) config_name = Column(String, nullable=False) config_parameters = Column( - mutable_json_type(dbtype=JSON, nested=True), # type: ignore + mutable_json_type(dbtype=JSONB, nested=True), # type: ignore nullable=False, default=dict, ) @@ -329,6 +335,7 @@ def get_config(self) -> dict: return {"config_name": self.config_name, "parameters": self.config_parameters} +# KEEP in oss/ class AppEnvironmentDB(Base): __tablename__ = "environments" @@ -366,6 +373,7 @@ class AppEnvironmentDB(Base): deployed_app_variant_revision = relationship("AppVariantRevisionsDB") +# KEEP in oss/ class AppEnvironmentRevisionDB(Base): __tablename__ = "environments_revisions" @@ -399,7 +407,8 @@ class AppEnvironmentRevisionDB(Base): modified_by = relationship("UserDB") -class TestsetDB(Base): +# KEEP in oss/ +class TestSetDB(Base): __tablename__ = "testsets" id = Column( @@ -422,6 +431,7 @@ class TestsetDB(Base): ) +# KEEP in oss/ class EvaluatorConfigDB(Base): __tablename__ = "auto_evaluator_configs" @@ -447,6 +457,7 @@ class EvaluatorConfigDB(Base): ) +# KEEP in oss/ or KILL class IDsMappingDB(Base): __tablename__ = "ids_mapping" @@ -519,267 +530,3 @@ class APIKeyDB(Base): project = relationship( "oss.src.models.db_models.ProjectDB", backref="api_key_project" ) - - -class HumanEvaluationVariantDB(Base): - __tablename__ = "human_evaluation_variants" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - human_evaluation_id = Column( - UUID(as_uuid=True), ForeignKey("human_evaluations.id", ondelete="CASCADE") - ) - variant_id = Column( - UUID(as_uuid=True), ForeignKey("app_variants.id", ondelete="SET NULL") - ) - variant_revision_id = Column( - UUID(as_uuid=True), ForeignKey("app_variant_revisions.id", ondelete="SET NULL") - ) - - variant = relationship("AppVariantDB", backref="evaluation_variant") - variant_revision = relationship( - "AppVariantRevisionsDB", backref="evaluation_variant_revision" - ) - - -class HumanEvaluationDB(Base): - __tablename__ = "human_evaluations" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - app_id = Column(UUID(as_uuid=True), ForeignKey("app_db.id", ondelete="CASCADE")) - project_id = Column( - UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") - ) - status = Column(String) - evaluation_type = Column(String) - testset_id = Column(UUID(as_uuid=True), ForeignKey("testsets.id")) - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - - testset = relationship("TestsetDB") - evaluation_variant = relationship( - "HumanEvaluationVariantDB", - cascade=CASCADE_ALL_DELETE, - backref="human_evaluation", - ) - evaluation_scenario = relationship( - "HumanEvaluationScenarioDB", - cascade=CASCADE_ALL_DELETE, - backref="evaluation_scenario", - ) - - -class HumanEvaluationScenarioDB(Base): - __tablename__ = "human_evaluations_scenarios" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - project_id = Column( - UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") - ) - evaluation_id = Column( - UUID(as_uuid=True), ForeignKey("human_evaluations.id", ondelete="CASCADE") - ) - inputs = Column( - mutable_json_type(dbtype=JSONB, nested=True) - ) # List of HumanEvaluationScenarioInput - outputs = Column( - mutable_json_type(dbtype=JSONB, nested=True) - ) # List of HumanEvaluationScenarioOutput - vote = Column(String) - score = Column(String) - correct_answer = Column(String) - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - is_pinned = Column(Boolean) - note = Column(String) - - -class EvaluationAggregatedResultDB(Base): - __tablename__ = "auto_evaluation_aggregated_results" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - evaluation_id = Column( - UUID(as_uuid=True), ForeignKey("auto_evaluations.id", ondelete="CASCADE") - ) - evaluator_config_id = Column( - UUID(as_uuid=True), - ForeignKey("auto_evaluator_configs.id", ondelete="SET NULL"), - ) - result = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result - - evaluator_config = relationship("EvaluatorConfigDB", backref="evaluator_config") - - -class EvaluationScenarioResultDB(Base): - __tablename__ = "auto_evaluation_scenario_results" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - evaluation_scenario_id = Column( - UUID(as_uuid=True), - ForeignKey("auto_evaluation_scenarios.id", ondelete="CASCADE"), - ) - evaluator_config_id = Column( - UUID(as_uuid=True), - ForeignKey("auto_evaluator_configs.id", ondelete="SET NULL"), - ) - result = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result - - -class EvaluationDB(Base): - __tablename__ = "auto_evaluations" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - app_id = Column(UUID(as_uuid=True), ForeignKey("app_db.id", ondelete="CASCADE")) - project_id = Column( - UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") - ) - status = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result - testset_id = Column( - UUID(as_uuid=True), ForeignKey("testsets.id", ondelete="SET NULL") - ) - variant_id = Column( - UUID(as_uuid=True), ForeignKey("app_variants.id", ondelete="SET NULL") - ) - variant_revision_id = Column( - UUID(as_uuid=True), ForeignKey("app_variant_revisions.id", ondelete="SET NULL") - ) - average_cost = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result - total_cost = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result - average_latency = Column(mutable_json_type(dbtype=JSONB, nested=True)) # Result - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - - project = relationship("oss.src.models.db_models.ProjectDB") - testset = relationship("TestsetDB") - variant = relationship("AppVariantDB") - variant_revision = relationship("AppVariantRevisionsDB") - aggregated_results = relationship( - "EvaluationAggregatedResultDB", - cascade=CASCADE_ALL_DELETE, - backref="evaluation", - ) - evaluation_scenarios = relationship( - "EvaluationScenarioDB", cascade=CASCADE_ALL_DELETE, backref="evaluation" - ) - evaluator_configs = relationship( - "EvaluationEvaluatorConfigDB", - cascade=CASCADE_ALL_DELETE, - backref="evaluation", - ) - - -class EvaluationEvaluatorConfigDB(Base): - __tablename__ = "auto_evaluation_evaluator_configs" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - evaluation_id = Column( - UUID(as_uuid=True), - ForeignKey("auto_evaluations.id", ondelete="CASCADE"), - primary_key=True, - ) - evaluator_config_id = Column( - UUID(as_uuid=True), - ForeignKey("auto_evaluator_configs.id", ondelete="SET NULL"), - primary_key=True, - ) - - -class EvaluationScenarioDB(Base): - __tablename__ = "auto_evaluation_scenarios" - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - project_id = Column( - UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") - ) - evaluation_id = Column( - UUID(as_uuid=True), ForeignKey("auto_evaluations.id", ondelete="CASCADE") - ) - variant_id = Column( - UUID(as_uuid=True), ForeignKey("app_variants.id", ondelete="SET NULL") - ) - inputs = Column( - mutable_json_type(dbtype=JSONB, nested=True) - ) # List of EvaluationScenarioInput - outputs = Column( - mutable_json_type(dbtype=JSONB, nested=True) - ) # List of EvaluationScenarioOutput - correct_answers = Column( - mutable_json_type(dbtype=JSONB, nested=True) - ) # List of CorrectAnswer - is_pinned = Column(Boolean) - note = Column(String) - latency = Column(Integer) - cost = Column(Integer) - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - - project = relationship("oss.src.models.db_models.ProjectDB") - variant = relationship("AppVariantDB") - results = relationship( - "EvaluationScenarioResultDB", - cascade=CASCADE_ALL_DELETE, - backref="evaluation_scenario", - ) diff --git a/api/oss/src/models/deprecated_models.py b/api/oss/src/models/deprecated_models.py index 070536fa13..8de1c3b1b5 100644 --- a/api/oss/src/models/deprecated_models.py +++ b/api/oss/src/models/deprecated_models.py @@ -28,32 +28,6 @@ class ProjectScopedAppDB(DeprecatedBase): ) -class DeprecatedOrganizationDB(DeprecatedBase): - __tablename__ = "organizations" - __table_args__ = {"extend_existing": True} - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - name = Column(String, default="agenta") - description = Column( - String, - default="The open-source LLM developer platform for cross-functional teams.", - ) - type = Column(String, nullable=True) - owner = Column(String, nullable=True) # TODO: deprecate and remove - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - - class DeprecatedAppDB(DeprecatedBase): __tablename__ = "app_db" __table_args__ = {"extend_existing": True} @@ -76,30 +50,6 @@ class DeprecatedAppDB(DeprecatedBase): ) -class DeprecatedTestsetDB(DeprecatedBase): - __tablename__ = "testsets" - __table_args__ = {"extend_existing": True} - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - name = Column(String) - project_id = Column( - UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") - ) - csvdata = Column(mutable_json_type(dbtype=JSONB, nested=True)) - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - - class DeprecatedAppVariantDB(DeprecatedBase): __tablename__ = "app_variants" __table_args__ = {"extend_existing": True} @@ -249,33 +199,6 @@ class DeprecatedEvaluatorConfigDBwProject(DeprecatedBase): ) -class DeprecatedAutoEvaluatorConfigDBwProject(DeprecatedBase): - __tablename__ = "auto_evaluator_configs" - __table_args__ = {"extend_existing": True} - - id = Column( - UUID(as_uuid=True), - primary_key=True, - default=uuid.uuid7, - unique=True, - nullable=False, - ) - - name = Column(String) - evaluator_key = Column(String) - settings_values = Column(mutable_json_type(dbtype=JSONB, nested=True), default=dict) # type: ignore - created_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - updated_at = Column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) - ) - - project_id = Column( - UUID(as_uuid=True), ForeignKey("projects.id", ondelete="CASCADE") - ) - - class DeprecatedProjectDB(DeprecatedBase): __tablename__ = "projects" __table_args__ = {"extend_existing": True} diff --git a/api/oss/src/models/shared_models.py b/api/oss/src/models/shared_models.py index c2849bc6f5..e7001a6967 100644 --- a/api/oss/src/models/shared_models.py +++ b/api/oss/src/models/shared_models.py @@ -22,7 +22,6 @@ class Result(BaseModel): class InvokationResult(BaseModel): result: Result cost: Optional[float] = None - tokens: Optional[float] = None latency: Optional[float] = None trace_id: Optional[str] = None span_id: Optional[str] = None @@ -71,7 +70,6 @@ class AppType(str, enum.Enum): CHAT_SERVICE = "SERVICE:chat" COMPLETION_SERVICE = "SERVICE:completion" CUSTOM = "CUSTOM" - SDK_CUSTOM = "SDK_CUSTOM" @classmethod def friendly_tag(cls, app_type: str): @@ -81,6 +79,5 @@ def friendly_tag(cls, app_type: str): cls.CHAT_SERVICE: "chat", cls.COMPLETION_SERVICE: "completion", cls.CUSTOM: "custom", - cls.SDK_CUSTOM: "custom (sdk)", } return mappings.get(app_type, None) # type: ignore diff --git a/api/oss/src/resources/evaluators/evaluators.py b/api/oss/src/resources/evaluators/evaluators.py index 53a2d48542..a835d6d7c7 100644 --- a/api/oss/src/resources/evaluators/evaluators.py +++ b/api/oss/src/resources/evaluators/evaluators.py @@ -35,13 +35,11 @@ "default": "correct_answer", "type": "string", "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, "description": "Exact Match evaluator determines if the output exactly matches the specified correct answer, ensuring precise alignment with expected results.", - "requires_testcase": "always", - "requires_trace": "always", "oss": True, "tags": ["functional"], }, @@ -51,8 +49,6 @@ "direct_use": True, "settings_template": {}, "description": "'Contains JSON' evaluator checks if the output contains the a valid JSON.", - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["functional", "classifiers"], }, @@ -75,13 +71,11 @@ "default": "correct_answer", "type": "string", "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, "description": "Similarity Match evaluator checks if the generated answer is similar to the expected answer. You need to provide the similarity threshold. It uses the Jaccard similarity to compare the answers.", - "requires_testcase": "always", - "requires_trace": "always", "oss": True, "tags": ["similarity", "functional"], }, @@ -96,14 +90,11 @@ "label": "Expected Answer Column", "default": "correct_answer", "type": "string", - "required": True, "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, - "requires_testcase": "always", - "requires_trace": "always", "oss": True, "tags": ["similarity", "ai_llm"], }, @@ -127,8 +118,6 @@ "description": "If the regex should match or mismatch", }, }, - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["classifiers", "functional"], }, @@ -149,13 +138,11 @@ "default": "correct_answer", "type": "string", "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, "description": "JSON Field Match evaluator compares specific fields within JSON (JavaScript Object Notation) data. This matching can involve finding similarities or correspondences between fields in different JSON objects.", - "requires_testcase": "always", - "requires_trace": "always", "oss": True, "tags": ["functional"], }, @@ -191,12 +178,10 @@ "default": "correct_answer", "type": "string", "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, - "requires_testcase": "always", - "requires_trace": "always", "oss": True, "tags": ["similarity", "functional"], }, @@ -205,78 +190,6 @@ "key": "auto_ai_critique", "direct_use": False, "requires_llm_api_keys": True, - "settings_presets": [ - { - "key": "default", - "name": "Default", - "values": { - "prompt_template": [ - { - "role": "system", - "content": "You are an expert evaluator grading model outputs. Your task is to grade the responses based on the criteria and requirements provided below. \n\nGiven the model output and inputs (and any other data you might get) assign a grade to the output. \n\n## Grading considerations\n- Evaluate the overall value provided in the model output\n- Verify all claims in the output meticulously\n- Differentiate between minor errors and major errors\n- Evaluate the outputs based on the inputs and whether they follow the instruction in the inputs if any\n- Give the highst and lowest score for cases where you have complete certainty about correctness and value\n\n## Scoring Criteria\n- The score should be a decimal value between 0.0 and 1.0\n- A score of 1.0 means that the answer is perfect. This is the highest (best) score \n- A score of 0.0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give.\n\n## output format\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER\n", - }, - { - "role": "user", - "content": "## Model inputs\n{{inputs}}\n## Model outputs\n{{outputs}}", - }, - ], - "model": "gpt-4o-mini", - "response_type": "json_schema", - "json_schema": { - "name": "schema", - "schema": { - "title": "extract", - "description": "Extract information from the user's response.", - "type": "object", - "properties": { - "correctness": { - "type": "boolean", - "description": "The grade results", - } - }, - "required": ["correctness"], - "strict": True, - }, - }, - "version": "4", - }, - }, - { - "key": "hallucination", - "name": "Hallucination Detection", - "values": { - "prompt_template": [ - { - "role": "system", - "content": "You are an expert evaluator grading model outputs for hallucinations. Your task is to identify if the responses contain any hallucinated information based on the criteria and requirements provided below. \n\nGiven the model output and inputs (and any other data you might get) determine if the output contains hallucinations. \n\n## Hallucination considerations\n- Verify all factual claims in the output meticulously against the input data\n- Identify any information that is fabricated or not supported by the input data\n- Differentiate between minor inaccuracies and major hallucinations\n\n## Output format\nANSWER ONLY 'true' IF THE OUTPUT CONTAINS HALLUCINATIONS, OTHERWISE ANSWER 'false'. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN 'true' OR 'false'\n", - }, - { - "role": "user", - "content": "## Model inputs\n{{inputs}}\n## Model outputs\n{{outputs}}", - }, - ], - "model": "gpt-4o-mini", - "response_type": "json_schema", - "json_schema": { - "name": "schema", - "schema": { - "title": "extract", - "description": "Extract information from the user's response.", - "type": "object", - "properties": { - "correctness": { - "type": "boolean", - "description": "The hallucination detection result", - } - }, - "required": ["correctness"], - "strict": True, - }, - }, - "version": "4", - }, - }, - ], "settings_template": { "prompt_template": { "label": "Prompt Template", @@ -286,11 +199,11 @@ "default": [ { "role": "system", - "content": "You are an expert evaluator grading model outputs. Your task is to grade the responses based on the criteria and requirements provided below. \n\nGiven the model output and inputs (and any other data you might get) assign a grade to the output. \n\n## Grading considerations\n- Evaluate the overall value provided in the model output\n- Verify all claims in the output meticulously\n- Differentiate between minor errors and major errors\n- Evaluate the outputs based on the inputs and whether they follow the instruction in the inputs if any\n- Give the highst and lowest score for cases where you have complete certainty about correctness and value\n\n## Scoring Criteria\n- The score should be a decimal value between 0.0 and 1.0\n- A score of 1.0 means that the answer is perfect. This is the highest (best) score \n- A score of 0.0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give.\n\n## output format\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER\n", + "content": "You are an evaluator grading an LLM App.\n You will be the LLM APP OUTPUT, the CORRECT ANSWER, the PROMPT used in the LLM APP.\n Here is the grade criteria to follow:\n:- Ensure that the LLM APP OUTPUT has the same meaning as the CORRECT ANSWER\n\nSCORE:\n-The score should be between 0 and 10\n-A score of 10 means that the answer is perfect. This is the highest (best) score. \nA score of 0 means that the answer does not any of of the criteria. This is the lowest possible score you can give.\n\nANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER", }, { "role": "user", - "content": "## Model inputs\n{{inputs}}\n## Model outputs\n{{outputs}}", + "content": "CORRECT ANSWER:{correct_answer}\nLLM APP OUTPUT: {prediction}.", }, ], }, @@ -298,69 +211,33 @@ "label": "Expected Answer Column", "default": "correct_answer", "type": "string", - "required": False, "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, "model": { "label": "Model", - "default": "gpt-4o-mini", + "default": "gpt-3.5-turbo", "type": "multiple_choice", "options": [ - "gpt-4-turbo", + "gpt-3.5-turbo", "gpt-4o", - "gpt-4o-mini", - "gpt-5", - "gpt-5-mini", - "gpt-5-nano", - "claude-3-7-sonnet-20250219", - "claude-opus-4-20250514", - "claude-sonnet-4-20250514", - "claude-opus-4-1-20250805", - "claude-sonnet-4-5-20250929", + "claude-3-5-sonnet-20240620", + "claude-3-haiku-20240307", + "claude-3-opus-20240229", ], "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default "description": "The LLM model to use for the evaluation", }, - "response_type": { - "label": "Response Type", - "default": "json_schema", - "type": "hidden", - "advanced": True, - "description": "The format of the response from the LLM", - }, - "json_schema": { - "label": "Feedback Configuration", - "default": { - "name": "schema", - "schema": { - "title": "extract", - "description": "Extract information from the user's response.", - "type": "object", - "properties": { - "correctness": { - "type": "boolean", - "description": "The grade results", - } - }, - "required": ["correctness"], - "strict": True, - }, - }, - "type": "llm_response_schema", - "advanced": False, - "description": "Select a response format to structure how your evaluation results are returned.", - }, "version": { "label": "Version", "type": "hidden", - "default": "4", + "default": "2", "description": "The version of the evaluator", # ignore by the FE "advanced": False, # ignore by the FE }, }, - "description": "LLM-as-a-judge uses a configurable prompt template that takes the output—and optionally inputs or data from the testcase such as correct answer—to evaluate the generated output.", + "description": "LLM-as-a-judge uses a configurable prompt template that takes the output—and optionally inputs or data from the test case such as correct answer—to evaluate the generated output.", "oss": True, "tags": ["ai_llm", "functional"], }, @@ -388,9 +265,8 @@ "label": "Expected Answer Column", "default": "correct_answer", "type": "string", - "required": False, "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer. This will be shown in the results page.", }, }, @@ -421,9 +297,8 @@ "label": "Expected Answer Column", "default": "correct_answer", "type": "string", - "required": False, "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, @@ -450,8 +325,6 @@ }, }, "description": "Starts With evaluator checks if the output starts with a specified prefix, considering case sensitivity based on the settings.", - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["classifiers", "functional"], }, @@ -474,8 +347,6 @@ }, }, "description": "Ends With evaluator checks if the output ends with a specified suffix, considering case sensitivity based on the settings.", - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["classifiers", "functional"], }, @@ -498,8 +369,6 @@ }, }, "description": "Contains evaluator checks if the output contains a specified substring, considering case sensitivity based on the settings.", - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["classifiers", "functional"], }, @@ -522,8 +391,6 @@ }, }, "description": "Contains Any evaluator checks if the output contains any of the specified substrings from a comma-separated list, considering case sensitivity based on the settings.", - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["classifiers", "functional"], }, @@ -546,8 +413,6 @@ }, }, "description": "Contains All evaluator checks if the output contains all of the specified substrings from a comma-separated list, considering case sensitivity based on the settings.", - "requires_testcase": "never", - "requires_trace": "always", "oss": True, "tags": ["classifiers", "functional"], }, @@ -567,13 +432,11 @@ "default": "correct_answer", "type": "string", "advanced": True, # Tells the frontend that this setting is advanced and should be hidden by default - "ground_truth_key": True, # Tells the frontend that is the name of the column in the testset that should be shown as a ground truth to the user + "ground_truth_key": True, # Tells the frontend that is the name of the column in the test set that should be shown as a ground truth to the user "description": "The name of the column in the test data that contains the correct answer", }, }, "description": "This evaluator calculates the Levenshtein distance between the output and the correct answer. If a threshold is provided in the settings, it returns a boolean indicating whether the distance is within the threshold. If no threshold is provided, it returns the actual Levenshtein distance as a numerical value.", - "requires_testcase": "always", - "requires_trace": "always", "oss": True, "tags": ["functional"], }, @@ -584,8 +447,6 @@ "requires_llm_api_keys": True, "settings_template": rag_evaluator_settings_template, "description": "RAG Faithfulness evaluator assesses the accuracy and reliability of responses generated by Retrieval-Augmented Generation (RAG) models. It evaluates how faithfully the responses adhere to the retrieved documents or sources, ensuring that the generated text accurately reflects the information from the original sources.", - "requires_testcase": "always", - "requires_trace": "always", "tags": ["rag"], }, { @@ -595,8 +456,6 @@ "requires_llm_api_keys": True, "settings_template": rag_evaluator_settings_template, "description": "RAG Context Relevancy evaluator measures how relevant the retrieved documents or contexts are to the given question or prompt. It ensures that the selected documents provide the necessary information for generating accurate and meaningful responses, improving the overall quality of the RAG model's output.", - "requires_testcase": "always", - "requires_trace": "always", "tags": ["rag"], }, ] diff --git a/api/oss/src/routers/app_router.py b/api/oss/src/routers/app_router.py index 52e724ee83..2b7ddbd4c6 100644 --- a/api/oss/src/routers/app_router.py +++ b/api/oss/src/routers/app_router.py @@ -13,9 +13,8 @@ from oss.src.models.api.api_models import ( App, UpdateApp, - CreateAppOutput, - ReadAppOutput, UpdateAppOutput, + CreateAppOutput, AddVariantFromURLPayload, AddVariantFromKeyPayload, ) @@ -27,7 +26,7 @@ from ee.src.utils.permissions import ( check_action_access, check_rbac_permission, - # check_apikey_action_access, + check_apikey_action_access, ) from ee.src.models.shared_models import Permission from ee.src.models.api.api_models import ( @@ -98,7 +97,7 @@ async def list_app_variants( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -156,7 +155,7 @@ async def get_variant_by_env( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app.project_id), - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -200,6 +199,15 @@ async def create_app( """ if is_ee(): + api_key_from_headers = request.headers.get("Authorization", None) + if api_key_from_headers is not None: + api_key = api_key_from_headers.split(" ")[-1] # ["ApiKey", "xxxxx.xxxxxx"] + await check_apikey_action_access( + api_key, + request.state.user_id, + Permission.CREATE_APPLICATION, + ) + try: user_org_workspace_data = await get_user_org_and_workspace_id( request.state.user_id @@ -213,7 +221,7 @@ async def create_app( has_permission = await check_rbac_permission( user_org_workspace_data=user_org_workspace_data, project_id=request.state.project_id, - permission=Permission.EDIT_APPLICATIONS, + permission=Permission.CREATE_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -258,60 +266,7 @@ async def create_app( project_id=request.state.project_id, ) - return CreateAppOutput( - app_id=str(app_db.id), - app_name=str(app_db.app_name), - app_type=AppType.friendly_tag(app_db.app_type), - created_at=str(app_db.created_at), - updated_at=str(app_db.updated_at), - ) - - -@router.get("/{app_id}/", response_model=ReadAppOutput, operation_id="read_app") -async def read_app( - request: Request, - app_id: str, -) -> ReadAppOutput: - """ - Retrieve an app by its ID. - - Args: - app_id (str): The ID of the app to retrieve. - - Returns: - ReadAppOutput: The output containing the app's ID and name. - - Raises: - HTTPException: If there is an error retrieving the app or the user does not have permission to access the app. - """ - - try: - app = await db_manager.fetch_app_by_id(app_id) - except db_manager.NoResultFound: - raise HTTPException( - status_code=404, detail=f"No application with ID '{app_id}' found" - ) - - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(app.project_id), - permission=Permission.VIEW_APPLICATIONS, - ) - if not has_permission: - error_msg = "You do not have access to perform this action. Please contact your organization admin." - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - return ReadAppOutput( - app_id=str(app.id), - app_name=str(app.app_name), - app_type=AppType.friendly_tag(app.app_type), - created_at=str(app.created_at), - updated_at=str(app.updated_at), - ) + return CreateAppOutput(app_id=str(app_db.id), app_name=str(app_db.app_name)) @router.patch("/{app_id}/", response_model=UpdateAppOutput, operation_id="update_app") @@ -345,7 +300,7 @@ async def update_app( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app.project_id), - permission=Permission.EDIT_APPLICATIONS, + permission=Permission.EDIT_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -355,19 +310,11 @@ async def update_app( ) await db_manager.update_app(app_id=app_id, values_to_update=payload.model_dump()) - app = await db_manager.fetch_app_by_id(app_id) - await invalidate_cache( project_id=request.state.project_id, ) - return UpdateAppOutput( - app_id=str(app.id), - app_name=str(app.app_name), - app_type=AppType.friendly_tag(app.app_type), - created_at=str(app.created_at), - updated_at=str(app.updated_at), - ) + return UpdateAppOutput(app_id=app_id, app_name=payload.app_name) @router.get("/", response_model=List[App], operation_id="list_apps") @@ -393,7 +340,7 @@ async def list_apps( has_permission = await check_rbac_permission( # type: ignore user_org_workspace_data=user_org_workspace_data, project_id=request.state.project_id, - permission=Permission.VIEW_APPLICATIONS, # type: ignore + permission=Permission.VIEW_APPLICATION, # type: ignore ) if not has_permission: raise HTTPException( @@ -439,7 +386,7 @@ async def add_variant_from_url( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app.project_id), - permission=Permission.EDIT_APPLICATIONS, + permission=Permission.CREATE_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -474,7 +421,7 @@ async def add_variant_from_url( return app_variant_dto except Exception as e: - log.error(f"An error occurred: {str(e)}") + log.exception(f"An error occurred: {str(e)}") raise HTTPException(status_code=500, detail=str(e)) @@ -506,11 +453,11 @@ async def add_variant_from_key_route( url = app_manager.get_service_url_from_template_key(payload.key) except NotImplementedError as e: - log.error(f"An error occurred: {str(e)}") + log.exception(f"An error occurred: {str(e)}") raise HTTPException(status_code=500, detail=str(e)) except Exception as e: - log.error(f"An error occurred: {str(e)}") + log.exception(f"An error occurred: {str(e)}") raise HTTPException(status_code=500, detail=str(e)) if not url: @@ -549,7 +496,7 @@ async def remove_app( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app.project_id), - permission=Permission.EDIT_APPLICATIONS, + permission=Permission.DELETE_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -609,7 +556,7 @@ async def list_environments( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." @@ -654,7 +601,7 @@ async def list_app_environment_revisions( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = "You do not have access to perform this action. Please contact your organization admin." diff --git a/api/oss/src/routers/bases_router.py b/api/oss/src/routers/bases_router.py index 078e66a637..2d6cbdeb9b 100644 --- a/api/oss/src/routers/bases_router.py +++ b/api/oss/src/routers/bases_router.py @@ -46,7 +46,7 @@ async def list_bases( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app.project_i), - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." diff --git a/api/oss/src/routers/evaluation_router.py b/api/oss/src/routers/evaluation_router.py deleted file mode 100644 index cac2b06523..0000000000 --- a/api/oss/src/routers/evaluation_router.py +++ /dev/null @@ -1,518 +0,0 @@ -from typing import Any, List -import random - -from fastapi.responses import JSONResponse -from fastapi import HTTPException, Request, status, Response, Query - -from oss.src.utils.logging import get_module_logger -from oss.src.utils.caching import get_cache, set_cache - -from oss.src.services import converters -from oss.src.services import evaluation_service - -from oss.src.tasks.evaluations.legacy import ( - setup_evaluation, - annotate, -) -from oss.src.utils.common import APIRouter, is_ee -from oss.src.models.api.evaluation_model import ( - Evaluation, - EvaluationScenario, - NewEvaluation, - DeleteEvaluation, -) -from oss.src.services import app_manager, db_manager - -if is_ee(): - from ee.src.models.shared_models import Permission - from ee.src.utils.permissions import check_action_access - from ee.src.utils.entitlements import ( - check_entitlements, - Tracker, - Counter, - NOT_ENTITLED_RESPONSE, - ) - -from oss.src.routers.testset_router import _validate_testset_limits - - -from oss.src.apis.fastapi.evaluations.models import EvaluationRunsResponse - - -router = APIRouter() - - -log = get_module_logger(__name__) - - -@router.get( - "/by_resource/", - response_model=List[str], -) -async def fetch_evaluation_ids( - resource_type: str, - request: Request, - resource_ids: List[str] = Query(None), -): - """Fetches evaluation ids for a given resource type and id. - - Arguments: - app_id (str): The ID of the app for which to fetch evaluations. - resource_type (str): The type of resource for which to fetch evaluations. - resource_ids List[ObjectId]: The IDs of resource for which to fetch evaluations. - - Raises: - HTTPException: If the resource_type is invalid or access is denied. - - Returns: - List[str]: A list of evaluation ids. - """ - - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - evaluations = await db_manager.fetch_evaluations_by_resource( - resource_type, - request.state.project_id, - resource_ids, - ) - return list(map(lambda x: str(x.id), evaluations)) - - -@router.get( - "/{evaluation_id}/status/", - operation_id="fetch_evaluation_status", -) -async def fetch_evaluation_status( - evaluation_id: str, - request: Request, -): - """Fetches the status of the evaluation. - - Args: - evaluation_id (str): the evaluation id - request (Request): the request object - - Returns: - (str): the evaluation status - """ - - cache_key = { - "evaluation_id": evaluation_id, - } - - evaluation_status = await get_cache( - project_id=request.state.project_id, - namespace="fetch_evaluation_status", - key=cache_key, - retry=False, - ) - - if evaluation_status is not None: - return {"status": evaluation_status} - - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=request.state.project_id, - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - evaluation_status = await db_manager.fetch_evaluation_status_by_id( - project_id=request.state.project_id, - evaluation_id=evaluation_id, - ) - - await set_cache( - project_id=request.state.project_id, - namespace="fetch_evaluation_status", - key=cache_key, - value=evaluation_status, - ttl=15, # 15 seconds - ) - - return {"status": evaluation_status} - - -@router.get( - "/{evaluation_id}/results/", - operation_id="fetch_legacy_evaluation_results", -) -async def fetch_evaluation_results( - evaluation_id: str, - request: Request, -): - """Fetches the results of the evaluation - - Args: - evaluation_id (str): the evaluation id - request (Request): the request object - - Returns: - _type_: _description_ - """ - - evaluation = await db_manager.fetch_evaluation_by_id( - project_id=request.state.project_id, - evaluation_id=evaluation_id, - ) - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(evaluation.project_id), - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - results = converters.aggregated_result_of_evaluation_to_pydantic( - evaluation.aggregated_results # type: ignore - ) - return {"results": results, "evaluation_id": evaluation_id} - - -@router.get( - "/{evaluation_id}/evaluation_scenarios/", - response_model=List[EvaluationScenario], - operation_id="fetch_legacy_evaluation_scenarios", -) -async def fetch_evaluation_scenarios( - evaluation_id: str, - request: Request, -): - """Fetches evaluation scenarios for a given evaluation ID. - - Arguments: - evaluation_id (str): The ID of the evaluation for which to fetch scenarios. - - Raises: - HTTPException: If the evaluation is not found or access is denied. - - Returns: - List[EvaluationScenario]: A list of evaluation scenarios. - """ - - evaluation = await db_manager.fetch_evaluation_by_id( - project_id=request.state.project_id, - evaluation_id=evaluation_id, - ) - if not evaluation: - raise HTTPException( - status_code=404, detail=f"Evaluation with id {evaluation_id} not found" - ) - - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(evaluation.project_id), - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - eval_scenarios = await evaluation_service.fetch_evaluation_scenarios_for_evaluation( - evaluation_id=str(evaluation.id), project_id=str(evaluation.project_id) - ) - return eval_scenarios - - -@router.get( - "/", - response_model=List[Evaluation], - operation_id="fetch_legacy_evaluations", -) -async def fetch_list_evaluations( - app_id: str, - request: Request, -): - """Fetches a list of evaluations, optionally filtered by an app ID. - - Args: - app_id (Optional[str]): An optional app ID to filter the evaluations. - - Returns: - List[Evaluation]: A list of evaluations. - """ - - app = await db_manager.fetch_app_by_id(app_id) - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(app.project_id), - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - return await evaluation_service.fetch_list_evaluations(app, str(app.project_id)) - - -@router.get( - "/{evaluation_id}/", - response_model=Evaluation, - operation_id="fetch_legacy_evaluation", -) -async def fetch_evaluation( - evaluation_id: str, - request: Request, -): - """Fetches a single evaluation based on its ID. - - Args: - evaluation_id (str): The ID of the evaluation to fetch. - - Returns: - Evaluation: The fetched evaluation. - """ - - evaluation = await db_manager.fetch_evaluation_by_id( - project_id=request.state.project_id, - evaluation_id=evaluation_id, - ) - if not evaluation: - raise HTTPException( - status_code=404, detail=f"Evaluation with id {evaluation_id} not found" - ) - - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(evaluation.project_id), - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - return await converters.evaluation_db_to_pydantic(evaluation) - - -@router.delete( - "/", - response_model=List[str], - operation_id="delete_legacy_evaluations", -) -async def delete_evaluations( - payload: DeleteEvaluation, - request: Request, -): - """ - Delete specific comparison tables based on their unique IDs. - - Args: - delete_evaluations (List[str]): The unique identifiers of the comparison tables to delete. - - Returns: - A list of the deleted comparison tables' IDs. - """ - - evaluation = await db_manager.fetch_evaluation_by_id( - project_id=request.state.project_id, - evaluation_id=payload.evaluations_ids[0], - ) - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(evaluation.project_id), - permission=Permission.DELETE_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - # Update last_modified_by app information - await app_manager.update_last_modified_by( - user_uid=request.state.user_id, - object_id=random.choice(payload.evaluations_ids), - object_type="evaluation", - project_id=str(evaluation.project_id), - ) - - await evaluation_service.delete_evaluations(payload.evaluations_ids) - return Response(status_code=status.HTTP_204_NO_CONTENT) - - -@router.get( - "/evaluation_scenarios/comparison-results/", - response_model=Any, - operation_id="fetch_legacy_evaluation_scenarios_comparison_results", -) -async def fetch_evaluation_scenarios_comparison_results( - evaluations_ids: str, - request: Request, -): - """Fetches evaluation scenarios for a given evaluation ID. - - Arguments: - evaluation_id (str): The ID of the evaluation for which to fetch scenarios. - - Raises: - HTTPException: If the evaluation is not found or access is denied. - - Returns: - List[EvaluationScenario]: A list of evaluation scenarios. - """ - - evaluations_ids_list = evaluations_ids.split(",") - evaluation = await db_manager.fetch_evaluation_by_id( - project_id=request.state.project_id, - evaluation_id=evaluations_ids_list[0], - ) - if is_ee(): - has_permission = await check_action_access( - user_uid=request.state.user_id, - project_id=str(evaluation.project_id), - permission=Permission.VIEW_EVALUATION, - ) - if not has_permission: - error_msg = f"You do not have permission to perform this action. Please contact your organization admin." - log.error(error_msg) - return JSONResponse( - {"detail": error_msg}, - status_code=403, - ) - - eval_scenarios = await evaluation_service.compare_evaluations_scenarios( - evaluations_ids_list, str(evaluation.project_id) - ) - - return eval_scenarios - - -@router.post( - "/preview/start", - response_model=EvaluationRunsResponse, - operation_id="start_evaluation", -) -async def start_evaluation( - request: Request, - payload: NewEvaluation, -) -> EvaluationRunsResponse: - try: - if is_ee(): - # Permissions Check ------------------------------------------------ - check = await check_action_access( - project_id=request.state.project_id, - user_uid=request.state.user_id, - permission=Permission.CREATE_EVALUATION, - ) - if not check: - raise HTTPException( - status_code=403, - detail="You do not have permission to perform this action. Please contact your organization admin.", - ) - # ------------------------------------------------------------------ - - # Entitlements Check ----------------------------------------------- - check, _, _ = await check_entitlements( - organization_id=request.state.organization_id, - key=Counter.EVALUATIONS, - delta=1, - ) - - if not check: - return NOT_ENTITLED_RESPONSE(Tracker.COUNTERS) - # ------------------------------------------------------------------ - - # Input Validation ----------------------------------------------------- - nof_runs = len(payload.revisions_ids) - - if nof_runs == 0: - raise HTTPException( - status_code=400, - detail="No revisions provided for evaluation. Please provide at least one revision.", - ) - # ---------------------------------------------------------------------- - - # Evaluation Run Execution --------------------------------------------- - runs = [] - - for i in range(nof_runs): - run = await setup_evaluation( - project_id=request.state.project_id, - user_id=request.state.user_id, - # - name=payload.name, - # - testset_id=payload.testset_id, - # - revision_id=payload.revisions_ids[i], - # - autoeval_ids=payload.evaluators_configs, - ) - - if not run: - continue - - runs.append(run) - - annotate.delay( - project_id=request.state.project_id, - user_id=request.state.user_id, - # - run_id=run.id, - # - testset_id=payload.testset_id, - # - revision_id=payload.revisions_ids[i], - # - autoeval_ids=payload.evaluators_configs, - # - run_config=payload.rate_limit.model_dump(mode="json"), - ) - # ---------------------------------------------------------------------- - - runs_response = EvaluationRunsResponse( - count=len(runs), - runs=runs, - ) - - return runs_response - - except KeyError as e: - log.error(e, exc_info=True) - - raise HTTPException( - status_code=400, - detail="Columns in the testset should match the names of the inputs in the variant", - ) from e diff --git a/api/oss/src/routers/evaluators_router.py b/api/oss/src/routers/evaluators_router.py index 0095a37e4d..a0c18aceda 100644 --- a/api/oss/src/routers/evaluators_router.py +++ b/api/oss/src/routers/evaluators_router.py @@ -1,4 +1,4 @@ -from typing import List, Optional +from typing import List from fastapi import HTTPException, Request from fastapi.responses import JSONResponse @@ -83,27 +83,21 @@ async def evaluator_run( """ providers_keys_from_vault = await get_llm_providers_secrets( - project_id=request.state.project_id + provider_id=request.state.project_id ) payload.credentials = providers_keys_from_vault - try: - result = await evaluators_service.run( - evaluator_key=evaluator_key, - evaluator_input=payload, - ) - except Exception as e: - log.warning(f"Error with evaluator /run", exc_info=True) - raise HTTPException(status_code=424 if "401" in str(e) else 500, detail=str(e)) - + result = await evaluators_service.run( + evaluator_key=evaluator_key, evaluator_input=payload + ) return result @router.get("/configs/", response_model=List[EvaluatorConfig]) async def get_evaluator_configs( + app_id: str, request: Request, - app_id: Optional[str] = None, ): """Endpoint to fetch evaluator configurations for a specific app. @@ -113,33 +107,25 @@ async def get_evaluator_configs( Returns: List[EvaluatorConfigDB]: A list of evaluator configuration objects. """ - project_id: Optional[str] = None - if app_id: - app_db = await db_manager.fetch_app_by_id(app_id=app_id) - project_id = str(app_db.project_id) - else: - project_id = getattr(request.state, "project_id", None) - if project_id is None: - raise HTTPException(status_code=400, detail="project_id is required") + app_db = await db_manager.fetch_app_by_id(app_id=app_id) if is_ee(): has_permission = await check_action_access( user_uid=request.state.user_id, - project_id=project_id, + project_id=str(app_db.project_id), permission=Permission.VIEW_EVALUATION, ) if not has_permission: - error_msg = ( - "You do not have permission to perform this action. " - "Please contact your organization admin." - ) + error_msg = f"You do not have permission to perform this action. Please contact your organization admin." log.error(error_msg) return JSONResponse( {"detail": error_msg}, status_code=403, ) - evaluators_configs = await evaluator_manager.get_evaluators_configs(project_id) + evaluators_configs = await evaluator_manager.get_evaluators_configs( + str(app_db.project_id) + ) return evaluators_configs @@ -189,10 +175,14 @@ async def create_new_evaluator_config( EvaluatorConfigDB: Evaluator configuration api model. """ + app_db = await db_manager.get_app_instance_by_id( + project_id=request.state.project_id, + app_id=payload.app_id, + ) if is_ee(): has_permission = await check_action_access( user_uid=request.state.user_id, - project_id=request.state.project_id, + project_id=str(app_db.project_id), permission=Permission.CREATE_EVALUATION, ) if not has_permission: @@ -204,7 +194,8 @@ async def create_new_evaluator_config( ) evaluator_config = await evaluator_manager.create_evaluator_config( - project_id=request.state.project_id, + project_id=str(app_db.project_id), + app_name=app_db.app_name, name=payload.name, evaluator_key=payload.evaluator_key, settings_values=payload.settings_values, diff --git a/api/oss/src/routers/organization_router.py b/api/oss/src/routers/organization_router.py index 16e9593fcc..7a50c3bd7d 100644 --- a/api/oss/src/routers/organization_router.py +++ b/api/oss/src/routers/organization_router.py @@ -85,12 +85,12 @@ async def list_organizations( @router.get( - "/{organization_id}/", + "/{org_id}/", operation_id="fetch_organization_details", response_model=OrganizationDetails, ) async def fetch_organization_details( - organization_id: str, + org_id: str, request: Request, ): """Return the details of the organization.""" @@ -100,15 +100,11 @@ async def fetch_organization_details( if not active_workspace: return {} - organization_owner = await db_manager.get_organization_owner( - organization_id=organization_id - ) + organization_owner = await db_manager.get_organization_owner(organization_id=org_id) project_invitations = await db_manager.get_project_invitations( project_id=request.state.project_id ) - organization_db = await db_manager.get_organization_by_id( - organization_id=organization_id - ) + organization_db = await db_manager.get_organization_by_id(organization_id=org_id) invited_members = [ { @@ -168,11 +164,11 @@ async def fetch_organization_details( @router.post( - "/{organization_id}/workspaces/{workspace_id}/invite/", + "/{org_id}/workspaces/{workspace_id}/invite/", operation_id="invite_user_to_workspace", ) async def invite_user_to_organization( - organization_id: str, + org_id: str, payload: List[InviteRequest], workspace_id: str, request: Request, @@ -181,7 +177,7 @@ async def invite_user_to_organization( Assigns a role to a user in an organization. Args: - organization_id (str): The ID of the organization. + org_id (str): The ID of the organization. payload (InviteRequest): The payload containing the organization id, user email, and role to assign. workspace_id (str): The ID of the workspace. @@ -217,7 +213,7 @@ async def invite_user_to_organization( }, ) - owner = await db_manager.get_organization_owner(organization_id) + owner = await db_manager.get_organization_owner(org_id) owner_domain = owner.email.split("@")[-1].lower() if owner else "" user_domain = payload[0].email.split("@")[-1].lower() skip_meter = owner_domain != "agenta.ai" and user_domain == "agenta.ai" @@ -234,7 +230,7 @@ async def invite_user_to_organization( invite_user = await workspace_manager.invite_user_to_workspace( payload=payload, - organization_id=organization_id, + org_id=org_id, project_id=str(project.id), workspace_id=workspace_id, user_uid=request.state.user_id, @@ -250,11 +246,11 @@ async def invite_user_to_organization( @router.post( - "/{organization_id}/workspaces/{workspace_id}/invite/resend/", + "/{org_id}/workspaces/{workspace_id}/invite/resend/", operation_id="resend_invitation", ) async def resend_user_invitation_to_organization( - organization_id: str, + org_id: str, workspace_id: str, payload: ResendInviteRequest, request: Request, @@ -291,7 +287,7 @@ async def resend_user_invitation_to_organization( invite_user = await workspace_manager.resend_user_workspace_invite( payload=payload, project_id=request.state.project_id, - organization_id=organization_id, + org_id=org_id, workspace_id=workspace_id, user_uid=request.state.user_id, ) @@ -306,11 +302,11 @@ async def resend_user_invitation_to_organization( @router.post( - "/{organization_id}/workspaces/{workspace_id}/invite/accept/", + "/{org_id}/workspaces/{workspace_id}/invite/accept/", operation_id="accept_invitation", ) async def accept_organization_invitation( - organization_id: str, + org_id: str, workspace_id: str, project_id: str, payload: InviteToken, @@ -330,7 +326,7 @@ async def accept_organization_invitation( if is_ee(): workspace = await workspace_manager.get_workspace(workspace_id) - organization = await db_manager_ee.get_organization(organization_id) + organization = await db_manager_ee.get_organization(org_id) user = await db_manager.get_user(request.state.user_id) accept_invitation = await workspace_manager.accept_workspace_invitation( @@ -347,7 +343,7 @@ async def accept_organization_invitation( else: await organization_service.accept_organization_invitation( token=payload.token, - organization_id=organization_id, + organization_id=org_id, email=payload.email, ) return JSONResponse({"message": "Added user to workspace"}, status_code=200) diff --git a/api/oss/src/routers/projects_router.py b/api/oss/src/routers/projects_router.py index 20a8d9fe57..ae88d3562d 100644 --- a/api/oss/src/routers/projects_router.py +++ b/api/oss/src/routers/projects_router.py @@ -42,7 +42,6 @@ class ProjectsResponse(BaseModel): ) async def get_projects( request: Request, - scope: Optional[str] = Query(None), ): try: if is_oss(): @@ -50,39 +49,10 @@ async def get_projects( project_id=request.state.project_id ) - if not _project: - raise HTTPException(status_code=404, detail="Project not found") - - _workspace = await db_manager.fetch_workspace_by_id( - workspace_id=str(_project.workspace_id) - ) - - if not _workspace: - raise HTTPException(status_code=404, detail="Workspace not found") - - _organization = await db_manager.fetch_organization_by_id( - organization_id=str(_workspace.organization_id) - ) - - if not _organization: - raise HTTPException(status_code=404, detail="Organization not found") - - user_role = ( - "owner" - if str(_organization.owner) == str(request.state.user_id) - else "editor" - ) - projects = [ ProjectsResponse( - organization_id=UUID(str(_organization.id)), - organization_name=str(_organization.name), - workspace_id=UUID(str(_workspace.id)), - workspace_name=str(_workspace.name), - project_id=UUID(str(_project.id)), - project_name=str(_project.project_name), - user_role=user_role, - is_demo=False, + project_id=_project.id, + project_name=_project.project_name, ) ] @@ -113,10 +83,6 @@ async def get_projects( is_demo=project_membership.is_demo, ) for project_membership in _project_memberships - if ( - scope is None - or str(project_membership.project.id) == request.state.project_id - ) ] return projects diff --git a/api/oss/src/routers/testset_router.py b/api/oss/src/routers/testset_router.py index 9a7d79e1dd..a3785adf68 100644 --- a/api/oss/src/routers/testset_router.py +++ b/api/oss/src/routers/testset_router.py @@ -1,7 +1,6 @@ import io import os import csv -import sys import json import requests from pathlib import Path @@ -10,19 +9,18 @@ from pydantic import ValidationError from fastapi.responses import JSONResponse -from fastapi import HTTPException, UploadFile, File, Form, Request, Query +from fastapi import HTTPException, UploadFile, File, Form, Request from oss.src.utils.logging import get_module_logger from oss.src.services import db_manager from oss.src.utils.common import APIRouter, is_ee from oss.src.models.converters import testset_db_to_pydantic -from oss.src.utils.common import is_uuid7 from oss.src.models.api.testset_model import ( NewTestset, DeleteTestsets, - TestsetSimpleResponse, - TestsetOutputResponse, + TestSetSimpleResponse, + TestSetOutputResponse, ) PARENT_DIRECTORY = Path(__file__).parent @@ -45,12 +43,9 @@ TESTSETS_COUNT_LIMIT = 10 * 1_000 # 10,000 testcases per testset TESTSETS_SIZE_LIMIT = 10 * 1024 * 1024 # 10 MB per testset -TESTSETS_FIELD_SIZE_LIMIT = 10 * 1024 * 1024 # 10 MB per CSV field -csv.field_size_limit(TESTSETS_FIELD_SIZE_LIMIT) - -TESTSETS_COUNT_WARNING = f"Testset exceeds the maximum count of {TESTSETS_COUNT_LIMIT} testcases per testset." -TESTSETS_SIZE_WARNING = f"Testset exceeds the maximum size of {TESTSETS_SIZE_LIMIT // (1024 * 1024)} MB per testset." +TESTSETS_COUNT_WARNING = f"Test set exceeds the maximum count of {TESTSETS_COUNT_LIMIT} test cases per test set." +TESTSETS_SIZE_WARNING = f"Test set exceeds the maximum size of {TESTSETS_SIZE_LIMIT // (1024 * 1024)} MB per test set." TESTSETS_SIZE_EXCEPTION = HTTPException( status_code=400, @@ -81,7 +76,7 @@ def _validate_testset_limits(rows: List[dict]) -> tuple[int, int]: @router.post( - "/upload", response_model=TestsetSimpleResponse, operation_id="upload_file" + "/upload/", response_model=TestSetSimpleResponse, operation_id="upload_file" ) async def upload_file( request: Request, @@ -156,10 +151,9 @@ async def upload_file( try: testset = await db_manager.create_testset( project_id=request.state.project_id, - # testset_data=document, ) - return TestsetSimpleResponse( + return TestSetSimpleResponse( id=str(testset.id), name=document["name"], created_at=str(testset.created_at), @@ -169,7 +163,7 @@ async def upload_file( @router.post( - "/endpoint", response_model=TestsetSimpleResponse, operation_id="import_testset" + "/endpoint/", response_model=TestSetSimpleResponse, operation_id="import_testset" ) async def import_testset( request: Request, @@ -231,7 +225,7 @@ async def import_testset( project_id=request.state.project_id, testset_data=document, ) - return TestsetSimpleResponse( + return TestSetSimpleResponse( id=str(testset.id), name=document["name"], created_at=str(testset.created_at), @@ -252,24 +246,20 @@ async def import_testset( ) from error -@router.post( - "/", response_model=TestsetSimpleResponse, operation_id="create_legacy_testset" -) +@router.post("/", response_model=TestSetSimpleResponse, operation_id="create_testset") async def create_testset( csvdata: NewTestset, request: Request, - # - testset_id: Optional[str] = None, ): """ Create a testset with given name, save the testset to Postgres. Args: - name (str): name of the testset. - testset (Dict[str, str]): testset data. + name (str): name of the test set. + testset (Dict[str, str]): test set data. Returns: - str: The id of the testset created. + str: The id of the test set created. """ if is_ee(): @@ -286,11 +276,6 @@ async def create_testset( status_code=403, ) - if testset_id is not None and not is_uuid7(testset_id): - raise HTTPException( - status_code=400, detail="Invalid testset_id format. Must be UUIDv7." - ) - _validate_testset_limits(csvdata.csvdata) testset_data = { @@ -299,20 +284,17 @@ async def create_testset( } testset_instance = await db_manager.create_testset( project_id=request.state.project_id, - # testset_data=testset_data, - # - testset_id=testset_id, ) if testset_instance is not None: - return TestsetSimpleResponse( + return TestSetSimpleResponse( id=str(testset_instance.id), name=testset_instance.name, # type: ignore created_at=str(testset_instance.created_at), ) -@router.put("/{testset_id}", operation_id="update_testset") +@router.put("/{testset_id}/", operation_id="update_testset") async def update_testset( testset_id: str, csvdata: NewTestset, @@ -322,18 +304,14 @@ async def update_testset( Update a testset with given id, update the testset in Postgres. Args: - testset_id (str): id of the testset to be updated. + testset_id (str): id of the test set to be updated. csvdata (NewTestset): New data to replace the old testset. Returns: - str: The id of the testset updated. + str: The id of the test set updated. """ - testset = await db_manager.fetch_testset_by_id( - project_id=request.state.project_id, - # - testset_id=testset_id, - ) + testset = await db_manager.fetch_testset_by_id(testset_id=testset_id) if testset is None: raise HTTPException(status_code=404, detail="testset not found") @@ -359,11 +337,7 @@ async def update_testset( "updated_at": datetime.now(timezone.utc), } await db_manager.update_testset( - project_id=request.state.project_id, - # - testset_id=str(testset.id), - # - values_to_update=testset_update, + testset_id=str(testset.id), values_to_update=testset_update ) return { "status": "success", @@ -375,9 +349,7 @@ async def update_testset( @router.get("/", operation_id="get_testsets") async def get_testsets( request: Request, - # - name: Optional[str] = Query(None), -) -> List[TestsetOutputResponse]: +) -> List[TestSetOutputResponse]: """ Get all testsets. @@ -387,6 +359,7 @@ async def get_testsets( Raises: - `HTTPException` with status code 404 if no testsets are found. """ + try: if is_ee(): has_permission = await check_action_access( @@ -408,11 +381,10 @@ async def get_testsets( testsets = await db_manager.fetch_testsets_by_project_id( project_id=request.state.project_id, - name=name, ) return [ - TestsetOutputResponse( + TestSetOutputResponse( _id=str(testset.id), # type: ignore name=testset.name, created_at=str(testset.created_at), @@ -422,7 +394,7 @@ async def get_testsets( ] except Exception as e: - log.error(f"An error occurred: {str(e)}") + log.exception(f"An error occurred: {str(e)}") raise HTTPException( status_code=500, @@ -430,7 +402,7 @@ async def get_testsets( ) -@router.get("/{testset_id}", operation_id="get_single_testset") +@router.get("/{testset_id}/", operation_id="get_single_testset") async def get_single_testset( testset_id: str, request: Request, @@ -446,21 +418,11 @@ async def get_single_testset( """ try: - testset = await db_manager.fetch_testset_by_id( - project_id=request.state.project_id, - # - testset_id=testset_id, - ) - except Exception as exc: - log.error(f"An error occurred: {str(exc)}", exc_info=True) - status_code = exc.status_code if hasattr(exc, "status_code") else 500 # type: ignore - raise HTTPException(status_code=status_code, detail=str(exc)) - - if testset is not None: + test_set = await db_manager.fetch_testset_by_id(testset_id=testset_id) if is_ee(): has_permission = await check_action_access( user_uid=request.state.user_id, - project_id=str(testset.project_id), + project_id=str(test_set.project_id), permission=Permission.VIEW_TESTSET, ) if not has_permission: @@ -470,10 +432,13 @@ async def get_single_testset( {"detail": error_msg}, status_code=403, ) - else: - raise HTTPException(status_code=404, detail="testset not found") - return testset_db_to_pydantic(testset) + if test_set is None: + raise HTTPException(status_code=404, detail="testset not found") + return testset_db_to_pydantic(test_set) + except Exception as exc: + status_code = exc.status_code if hasattr(exc, "status_code") else 500 # type: ignore + raise HTTPException(status_code=status_code, detail=str(exc)) @router.delete("/", response_model=List[str], operation_id="delete_testsets") @@ -493,11 +458,7 @@ async def delete_testsets( if is_ee(): for testset_id in payload.testset_ids: - testset = await db_manager.fetch_testset_by_id( - project_id=request.state.project_id, - # - testset_id=testset_id, - ) + testset = await db_manager.fetch_testset_by_id(testset_id=testset_id) has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(testset.project_id), @@ -511,9 +472,5 @@ async def delete_testsets( status_code=403, ) - await db_manager.remove_testsets( - project_id=request.state.project_id, - # - testset_ids=payload.testset_ids, - ) + await db_manager.remove_testsets(testset_ids=payload.testset_ids) return payload.testset_ids diff --git a/api/oss/src/routers/variants_router.py b/api/oss/src/routers/variants_router.py index 8edeef5d3c..2eb06ccbeb 100644 --- a/api/oss/src/routers/variants_router.py +++ b/api/oss/src/routers/variants_router.py @@ -64,7 +64,7 @@ async def add_variant_from_base_and_config( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(base_db.project_id), - permission=Permission.EDIT_APPLICATIONS, + permission=Permission.CREATE_APPLICATION, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." @@ -129,7 +129,7 @@ async def remove_variant( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(variant.project_id), - permission=Permission.EDIT_APPLICATIONS_VARIANT, + permission=Permission.DELETE_APPLICATION_VARIANT, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." @@ -156,11 +156,7 @@ async def remove_variant( raise HTTPException(status_code=500, detail=detail) -@router.put( - "/{variant_id}/parameters/", - operation_id="update_variant_parameters", - response_model=AppVariantRevision, -) +@router.put("/{variant_id}/parameters/", operation_id="update_variant_parameters") async def update_variant_parameters( request: Request, variant_id: str, @@ -214,18 +210,6 @@ async def update_variant_parameters( await invalidate_cache( project_id=request.state.project_id, ) - - variant = await get_variant( - variant_id=variant_id, - request=request, - ) - - return await get_variant_revision( - variant_id=variant_id, - revision_number=variant.revision, # type: ignore - request=request, - ) - except ValueError as e: detail = f"Error while trying to update the app variant: {str(e)}" raise HTTPException(status_code=500, detail=detail) @@ -256,7 +240,7 @@ async def update_variant_url(request: Request, payload: UpdateVariantURLPayload) has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(db_app_variant.project_id), - permission=Permission.EDIT_APPLICATIONS, + permission=Permission.CREATE_APPLICATION, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." @@ -314,7 +298,7 @@ async def get_variant( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app_variant.project_id), - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." @@ -355,7 +339,7 @@ async def get_variant_revisions( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=request.state.project_id, - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." @@ -402,7 +386,7 @@ async def get_variant_revision( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(app_variant.project_id), - permission=Permission.VIEW_APPLICATIONS, + permission=Permission.VIEW_APPLICATION, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." @@ -449,7 +433,7 @@ async def remove_variant_revision( has_permission = await check_action_access( user_uid=request.state.user_id, project_id=str(variant.project_id), - permission=Permission.EDIT_APPLICATIONS_VARIANT, + permission=Permission.DELETE_APPLICATION_VARIANT, ) if not has_permission: error_msg = f"You do not have permission to perform this action. Please contact your organization admin." diff --git a/api/oss/src/services/admin_manager.py b/api/oss/src/services/admin_manager.py index 88a042b710..b8117ee23d 100644 --- a/api/oss/src/services/admin_manager.py +++ b/api/oss/src/services/admin_manager.py @@ -182,7 +182,7 @@ async def legacy_create_organization( name=payload.name, type=payload.type if payload.type else "", description=( - "Default Workspace" + "My Default Workspace" if payload.type == "default" else payload.description if payload.description diff --git a/api/oss/src/services/aggregation_service.py b/api/oss/src/services/aggregation_service.py new file mode 100644 index 0000000000..453d8b5262 --- /dev/null +++ b/api/oss/src/services/aggregation_service.py @@ -0,0 +1,135 @@ +import re +import traceback +from typing import List, Optional + +from oss.src.models.shared_models import InvokationResult, Result, Error + + +def aggregate_ai_critique(results: List[Result]) -> Result: + """Aggregates the results for the ai critique evaluation. + + Args: + results (List[Result]): list of result objects + + Returns: + Result: aggregated result + """ + + try: + numeric_scores = [] + for result in results: + # Extract the first number found in the result value + match = re.search(r"\d+", result.value) + if match: + try: + score = int(match.group()) + numeric_scores.append(score) + except ValueError: + # Ignore if the extracted value is not an integer + continue + + # Calculate the average of numeric scores if any are present + average_value = ( + sum(numeric_scores) / len(numeric_scores) if numeric_scores else None + ) + return Result( + type="number", + value=average_value, + ) + except Exception as exc: + return Result( + type="error", + value=None, + error=Error(message=str(exc), stacktrace=str(traceback.format_exc())), + ) + + +def aggregate_binary(results: List[Result]) -> Result: + """Aggregates the results for the binary (auto regex) evaluation. + + Args: + results (List[Result]): list of result objects + + Returns: + Result: aggregated result + """ + + if all(isinstance(result.value, bool) for result in results): + average_value = sum(int(result.value) for result in results) / len(results) + else: + average_value = None + return Result(type="number", value=average_value) + + +def aggregate_float(results: List[Result]) -> Result: + """Aggregates the results for evaluations aside from auto regex and ai critique. + + Args: + results (List[Result]): list of result objects + + Returns: + Result: aggregated result + """ + + try: + average_value = sum(result.value for result in results) / len(results) + return Result(type="number", value=average_value) + except Exception as exc: + return Result( + type="error", + value=None, + error=Error(message=str(exc), stacktrace=str(traceback.format_exc())), + ) + + +def aggregate_float_from_llm_app_response( + invocation_results: List[InvokationResult], key: Optional[str] +) -> Result: + try: + if not key: + raise ValueError("Key is required to aggregate InvokationResult objects.") + + values = [ + getattr(inv_result, key) + for inv_result in invocation_results + if hasattr(inv_result, key) and getattr(inv_result, key) is not None + ] + + if not values: + raise ValueError(f"No valid values found for {key} aggregation.") + + average_value = sum(values) / len(values) + return Result(type=key, value=average_value) + except Exception as exc: + return Result( + type="error", + value=None, + error=Error(message=str(exc), stacktrace=str(traceback.format_exc())), + ) + + +def sum_float_from_llm_app_response( + invocation_results: List[InvokationResult], key: Optional[str] +) -> Result: + try: + if not key: + raise ValueError("Key is required to aggregate InvokationResult objects.") + + values = [ + getattr(inv_result, key) + for inv_result in invocation_results + if hasattr(inv_result, key) and getattr(inv_result, key) is not None + ] + + if not values: + raise ValueError(f"No valid values found for {key} sum aggregation.") + + total_value = sum(values) + + return Result(type=key, value=total_value) + except Exception as exc: + return Result( + type="error", + value=None, + error=Error(message=str(exc), stacktrace=str(traceback.format_exc())), + ) diff --git a/api/oss/src/services/analytics_service.py b/api/oss/src/services/analytics_service.py index 1903eed0ce..741a31ca0c 100644 --- a/api/oss/src/services/analytics_service.py +++ b/api/oss/src/services/analytics_service.py @@ -39,7 +39,7 @@ if POSTHOG_API_KEY: posthog.api_key = POSTHOG_API_KEY posthog.host = POSTHOG_HOST - log.info("PostHog initialized with host %s", POSTHOG_HOST) + log.info("PostHog initialized with host %s:", POSTHOG_HOST) else: log.warn("PostHog API key not found in environment variables") @@ -139,20 +139,18 @@ async def analytics_middleware(request: Request, call_next: Callable): ) # -------------------------------------------------------------- - distinct_id = None + # log.debug( + # distinct_id=request.state.user_email, + # event=event_name, + # properties=properties, + # ) - try: - distinct_id = request.state.user_email - except: # pylint: disable=bare-except - pass - - if distinct_id and env.POSTHOG_API_KEY: + if env.POSTHOG_API_KEY: posthog.capture( - distinct_id=distinct_id, + distinct_id=request.state.user_email, event=event_name, properties=properties or {}, ) - except Exception as e: log.error(f"❌ Error capturing event in PostHog: {e}") @@ -197,7 +195,7 @@ def _get_event_name_from_path( return "app_revision_fetched" # <----------- End of Configuration Events -------------> - # <----------- Testsets Events -------------> + # <----------- Test sets Events -------------> if method == "POST" and "/testsets" in path: return "testset_created" @@ -206,7 +204,7 @@ def _get_event_name_from_path( elif method == "PUT" and "/testsets" in path: return "testset_updated" - # <----------- End of Testsets Events -------------> + # <----------- End of Test sets Events -------------> # <----------- Evaluation Events -------------> if method == "POST" and "/evaluators/configs" in path: @@ -215,7 +213,11 @@ def _get_event_name_from_path( elif method == "PUT" and "/evaluators/configs/" in path: return "evaluator_updated" - elif method == "POST" and path == "/preview/evaluations/runs/": + elif ( + method == "POST" + and ("/evaluations" in path) + or ("evaluators" in path_parts and "run" in path_parts) + ): return "evaluation_created" elif method == "POST" and "/human-evaluations" in path: diff --git a/api/oss/src/services/app_manager.py b/api/oss/src/services/app_manager.py index f644399ebd..7e11084485 100644 --- a/api/oss/src/services/app_manager.py +++ b/api/oss/src/services/app_manager.py @@ -42,7 +42,7 @@ async def get_appdb_str_by_id(object_id: str, object_type: str) -> str: raise db_manager.NoResultFound(f"Variant with id {object_id} not found") return str(app_variant_db.app_id) elif object_type == "evaluation": - evaluation_db = await db_manager.fetch_evaluation_by_id( + evaluation_db = await db_manager_ee.fetch_evaluation_by_id( project_id=project_id, evaluation_id=object_id, ) diff --git a/api/oss/src/services/auth_helper.py b/api/oss/src/services/auth_helper.py index 9f49188cb3..a0a8bad5ad 100644 --- a/api/oss/src/services/auth_helper.py +++ b/api/oss/src/services/auth_helper.py @@ -5,7 +5,6 @@ from pydantic import ValidationError from fastapi import Request, HTTPException, Response -from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from supertokens_python.recipe.session.asyncio import get_session from jwt import encode, decode, DecodeError, ExpiredSignatureError @@ -55,13 +54,11 @@ "/api/openapi.json", # SUPERTOKENS "/auth", - "/api/auth", # STRIPE "/billing/stripe/events/", - "/api/billing/stripe/events/", ) -_ADMIN_ENDPOINT_IDENTIFIER = "/admin/" +_ADMIN_ENDPOINT_PREFIX = "/admin/" _SECRET_KEY = env.AGENTA_AUTH_KEY _SECRET_EXP = 15 * 60 # 15 minutes @@ -102,33 +99,28 @@ async def authentication_middleware(request: Request, call_next): except TryRefreshTokenError: log.warn("Unauthorized: Refresh Token") - return JSONResponse(status_code=401, content={"detail": "Unauthorized"}) + return Response(status_code=401, content="Unauthorized") except RequestValidationError as exc: log.error("Unprocessable Content: %s", exc) - return JSONResponse(status_code=422, content={"detail": exc.errors()}) + return Response(status_code=422, content=exc.errors()) except ValidationError as exc: log.error("Bad Request: %s", exc) - return JSONResponse(status_code=400, content={"detail": exc.errors()}) + return Response(status_code=400, content=exc.errors()) except HTTPException as exc: log.error("%s: %s", exc.status_code, exc.detail) - return JSONResponse(status_code=exc.status_code, content={"detail": exc.detail}) - - except ValueError as exc: - log.error("Bad Request: %s", exc) - - return JSONResponse(status_code=400, content={"detail": str(exc)}) + return Response(status_code=exc.status_code, content=exc.detail) except Exception as e: # pylint: disable=bare-except log.error("Internal Server Error: %s", traceback.format_exc()) status_code = e.status_code if hasattr(e, "status_code") else 500 - return JSONResponse( + return Response( status_code=status_code, content={"detail": "An internal error has occurred."}, ) @@ -139,7 +131,7 @@ async def _authenticate(request: Request): if request.url.path.startswith(_PUBLIC_ENDPOINTS): return - if _ADMIN_ENDPOINT_IDENTIFIER in request.url.path: + if request.url.path.startswith(_ADMIN_ENDPOINT_PREFIX): auth_header = ( request.headers.get("Authorization") or request.headers.get("authorization") @@ -450,8 +442,6 @@ async def verify_bearer_token( organization_id = project.organization_id elif not query_project_id and query_workspace_id: - log.warning("[AUTH] Missing project_id in query params!") - workspace = await db_manager.get_workspace( workspace_id=query_workspace_id, ) @@ -474,8 +464,6 @@ async def verify_bearer_token( organization_id = workspace.organization_id else: - log.warning("[AUTH] Missing project_id in query params!") - if is_ee(): workspace_id = await db_manager_ee.get_default_workspace_id( user_id=user_id, diff --git a/api/oss/src/services/converters.py b/api/oss/src/services/converters.py deleted file mode 100644 index 8ead9b7df4..0000000000 --- a/api/oss/src/services/converters.py +++ /dev/null @@ -1,192 +0,0 @@ -import uuid -from typing import List, Dict, Any -from datetime import datetime, timezone - -from oss.src.services import db_manager -from oss.src.models.api.evaluation_model import ( - CorrectAnswer, - Evaluation, - HumanEvaluation, - EvaluationScenario, - SimpleEvaluationOutput, - EvaluationScenarioInput, - HumanEvaluationScenario, - EvaluationScenarioOutput, -) -from oss.src.services import db_manager -from oss.src.models.db_models import ( - EvaluationDB, - HumanEvaluationDB, - EvaluationScenarioDB, - HumanEvaluationScenarioDB, -) - - -async def human_evaluation_db_to_simple_evaluation_output( - human_evaluation_db: HumanEvaluationDB, -) -> SimpleEvaluationOutput: - evaluation_variants = await db_manager.fetch_human_evaluation_variants( - human_evaluation_id=str(human_evaluation_db.id) - ) - return SimpleEvaluationOutput( - id=str(human_evaluation_db.id), - app_id=str(human_evaluation_db.app_id), - project_id=str(human_evaluation_db.project_id), - status=human_evaluation_db.status, # type: ignore - evaluation_type=human_evaluation_db.evaluation_type, # type: ignore - variant_ids=[ - str(evaluation_variant.variant_id) - for evaluation_variant in evaluation_variants - ], - ) - - -async def evaluation_db_to_pydantic( - evaluation_db: EvaluationDB, -) -> Evaluation: - variant_name = ( - evaluation_db.variant.variant_name - if evaluation_db.variant.variant_name - else str(evaluation_db.variant_id) - ) - aggregated_results = aggregated_result_of_evaluation_to_pydantic( - evaluation_db.aggregated_results - ) - - return Evaluation( - id=str(evaluation_db.id), - app_id=str(evaluation_db.app_id), - project_id=str(evaluation_db.project_id), - status=evaluation_db.status, - variant_ids=[str(evaluation_db.variant_id)], - variant_revision_ids=[str(evaluation_db.variant_revision_id)], - revisions=[str(evaluation_db.variant_revision.revision)], - variant_names=[variant_name], - testset_id=str(evaluation_db.testset_id), - testset_name=evaluation_db.testset.name, - aggregated_results=aggregated_results, - created_at=str(evaluation_db.created_at), - updated_at=str(evaluation_db.updated_at), - average_cost=evaluation_db.average_cost, - total_cost=evaluation_db.total_cost, - average_latency=evaluation_db.average_latency, - ) - - -async def human_evaluation_db_to_pydantic( - evaluation_db: HumanEvaluationDB, -) -> HumanEvaluation: - evaluation_variants = await db_manager.fetch_human_evaluation_variants( - human_evaluation_id=str(evaluation_db.id) # type: ignore - ) - - revisions = [] - variants_ids = [] - variants_names = [] - variants_revision_ids = [] - for evaluation_variant in evaluation_variants: - variant_name = ( - evaluation_variant.variant.variant_name - if isinstance(evaluation_variant.variant_id, uuid.UUID) - else str(evaluation_variant.variant_id) - ) - variants_names.append(str(variant_name)) - variants_ids.append(str(evaluation_variant.variant_id)) - variant_revision = ( - str(evaluation_variant.variant_revision.revision) - if isinstance(evaluation_variant.variant_revision_id, uuid.UUID) - else " None" - ) - revisions.append(variant_revision) - variants_revision_ids.append(str(evaluation_variant.variant_revision_id)) - - return HumanEvaluation( - id=str(evaluation_db.id), - app_id=str(evaluation_db.app_id), - project_id=str(evaluation_db.project_id), - status=evaluation_db.status, # type: ignore - evaluation_type=evaluation_db.evaluation_type, # type: ignore - variant_ids=variants_ids, - variant_names=variants_names, - testset_id=str(evaluation_db.testset_id), - testset_name=evaluation_db.testset.name, - variants_revision_ids=variants_revision_ids, - revisions=revisions, - created_at=str(evaluation_db.created_at), # type: ignore - updated_at=str(evaluation_db.updated_at), # type: ignore - ) - - -def human_evaluation_scenario_db_to_pydantic( - evaluation_scenario_db: HumanEvaluationScenarioDB, evaluation_id: str -) -> HumanEvaluationScenario: - return HumanEvaluationScenario( - id=str(evaluation_scenario_db.id), - evaluation_id=evaluation_id, - inputs=evaluation_scenario_db.inputs, # type: ignore - outputs=evaluation_scenario_db.outputs, # type: ignore - vote=evaluation_scenario_db.vote, # type: ignore - score=evaluation_scenario_db.score, # type: ignore - correct_answer=evaluation_scenario_db.correct_answer, # type: ignore - is_pinned=evaluation_scenario_db.is_pinned or False, # type: ignore - note=evaluation_scenario_db.note or "", # type: ignore - ) - - -def aggregated_result_of_evaluation_to_pydantic( - evaluation_aggregated_results: List, -) -> List[dict]: - transformed_results = [] - for aggregated_result in evaluation_aggregated_results: - evaluator_config_dict = ( - { - "id": str(aggregated_result.evaluator_config.id), - "name": aggregated_result.evaluator_config.name, - "evaluator_key": aggregated_result.evaluator_config.evaluator_key, - "settings_values": aggregated_result.evaluator_config.settings_values, - "created_at": str(aggregated_result.evaluator_config.created_at), - "updated_at": str(aggregated_result.evaluator_config.updated_at), - } - if isinstance(aggregated_result.evaluator_config_id, uuid.UUID) - else None - ) - transformed_results.append( - { - "evaluator_config": ( - {} if evaluator_config_dict is None else evaluator_config_dict - ), - "result": aggregated_result.result, - } - ) - return transformed_results - - -async def evaluation_scenario_db_to_pydantic( - evaluation_scenario_db: EvaluationScenarioDB, evaluation_id: str -) -> EvaluationScenario: - scenario_results = [ - { - "evaluator_config": str(scenario_result.evaluator_config_id), - "result": scenario_result.result, - } - for scenario_result in evaluation_scenario_db.results - ] - return EvaluationScenario( - id=str(evaluation_scenario_db.id), - evaluation_id=evaluation_id, - inputs=[ - EvaluationScenarioInput(**scenario_input) # type: ignore - for scenario_input in evaluation_scenario_db.inputs - ], - outputs=[ - EvaluationScenarioOutput(**scenario_output) # type: ignore - for scenario_output in evaluation_scenario_db.outputs - ], - correct_answers=[ - CorrectAnswer(**correct_answer) # type: ignore - for correct_answer in evaluation_scenario_db.correct_answers - ], - is_pinned=evaluation_scenario_db.is_pinned or False, # type: ignore - note=evaluation_scenario_db.note or "", # type: ignore - results=scenario_results, # type: ignore - ) diff --git a/api/oss/src/services/db_manager.py b/api/oss/src/services/db_manager.py index 9833c104dc..9decf753af 100644 --- a/api/oss/src/services/db_manager.py +++ b/api/oss/src/services/db_manager.py @@ -10,7 +10,7 @@ from sqlalchemy import func, or_, asc from sqlalchemy.ext.asyncio import AsyncSession from supertokens_python.types import AccountInfo -from sqlalchemy.orm import joinedload, load_only, aliased +from sqlalchemy.orm import joinedload, load_only, selectinload from sqlalchemy.exc import NoResultFound, MultipleResultsFound, SQLAlchemyError from supertokens_python.asyncio import list_users_by_account_info from supertokens_python.asyncio import delete_user as delete_user_from_supertokens @@ -22,6 +22,7 @@ from oss.src.dbs.postgres.shared.engine import engine from oss.src.services.json_importer_helper import get_json + if is_ee(): from ee.src.models.db_models import ProjectDB, WorkspaceDB else: @@ -31,7 +32,7 @@ AppDB, UserDB, APIKeyDB, - TestsetDB, + TestSetDB, IDsMappingDB, DeploymentDB, InvitationDB, @@ -47,25 +48,6 @@ AppType, ConfigDB, ) -from oss.src.models.shared_models import ( - Result, - CorrectAnswer, - AggregatedResult, - EvaluationScenarioResult, - EvaluationScenarioInput, - EvaluationScenarioOutput, - HumanEvaluationScenarioInput, -) -from oss.src.models.db_models import ( - EvaluationDB, - HumanEvaluationDB, - EvaluationScenarioDB, - HumanEvaluationScenarioDB, - HumanEvaluationVariantDB, - EvaluationScenarioResultDB, - EvaluationEvaluatorConfigDB, - EvaluationAggregatedResultDB, -) log = get_module_logger(__name__) @@ -76,7 +58,7 @@ async def fetch_project_by_id( project_id: str, -) -> Optional[ProjectDB]: +) -> ProjectDB: async with engine.core_session() as session: project = ( ( @@ -93,44 +75,6 @@ async def fetch_project_by_id( return project -async def fetch_workspace_by_id( - workspace_id: str, -) -> Optional[WorkspaceDB]: - async with engine.core_session() as session: - workspace = ( - ( - await session.execute( - select(WorkspaceDB).filter_by( - id=uuid.UUID(workspace_id), - ) - ) - ) - .scalars() - .first() - ) - - return workspace - - -async def fetch_organization_by_id( - organization_id: str, -) -> Optional[OrganizationDB]: - async with engine.core_session() as session: - organization = ( - ( - await session.execute( - select(OrganizationDB).filter_by( - id=uuid.UUID(organization_id), - ) - ) - ) - .scalars() - .first() - ) - - return organization - - async def add_testset_to_app_variant( template_name: str, app_name: str, project_id: str ): @@ -157,7 +101,7 @@ async def add_testset_to_app_variant( "name": f"{app_name}_testset", "csvdata": csvdata, } - testset_db = TestsetDB( + testset_db = TestSetDB( **testset, project_id=uuid.UUID(project_id), ) @@ -188,27 +132,6 @@ async def fetch_app_by_id(app_id: str) -> AppDB: return app -async def fetch_latest_app_variant(app_id: str) -> Optional[AppVariantDB]: - """Fetches the latest app variant for a given app ID. - - Args: - app_id (str): The ID of the app to fetch the latest variant for. - - Returns: - AppVariantDB: The latest app variant, or None if no app variant was found. - """ - - async with engine.core_session() as session: - base_query = ( - select(AppVariantDB) - .filter_by(app_id=uuid.UUID(app_id)) - .order_by(AppVariantDB.created_at.desc()) - ) - result = await session.execute(base_query) - app_variant = result.scalars().first() - return app_variant - - async def fetch_app_variant_by_id(app_variant_id: str) -> Optional[AppVariantDB]: """ Fetches an app variant by its ID. @@ -658,7 +581,6 @@ async def get_app_type_from_template_key(template_key: Optional[str]) -> Optiona AppType.CHAT_SERVICE, AppType.COMPLETION_SERVICE, AppType.CUSTOM, - AppType.SDK_CUSTOM, ]: return template_key @@ -678,7 +600,6 @@ async def create_app_and_envs( app_name: str, template_key: Optional[str] = None, project_id: Optional[str] = None, - user_id: Optional[str] = None, ) -> AppDB: """ Create a new app with the given name and organization ID. @@ -694,9 +615,8 @@ async def create_app_and_envs( ValueError: If an app with the same name already exists. """ - app = await fetch_app_by_name( - app_name=app_name, - project_id=project_id, + app = await fetch_app_by_name_and_parameters( + app_name=app_name, project_id=project_id ) if app is not None: raise ValueError("App with the same name already exists") @@ -707,10 +627,7 @@ async def create_app_and_envs( async with engine.core_session() as session: app = AppDB( - project_id=uuid.UUID(project_id), - app_name=app_name, - app_type=app_type, - modified_by_id=uuid.UUID(user_id) if user_id else None, + app_name=app_name, project_id=uuid.UUID(project_id), app_type=app_type ) session.add(app) @@ -721,7 +638,7 @@ async def create_app_and_envs( return app -async def update_app(app_id: str, values_to_update: dict): +async def update_app(app_id: str, values_to_update: dict) -> None: """Update the app in the database. Arguments: @@ -759,7 +676,6 @@ async def update_app(app_id: str, values_to_update: dict): setattr(app, key, value) await session.commit() - return app async def get_deployment_by_id(deployment_id: str) -> DeploymentDB: @@ -851,7 +767,9 @@ async def list_app_variants_by_app_slug( """ assert app_slug is not None, "app_slug cannot be None" - app_db = await fetch_app_by_name(app_name=app_slug, project_id=project_id) + app_db = await fetch_app_by_name_and_parameters( + app_name=app_slug, project_id=project_id + ) if app_db is None: raise NoResultFound(f"App with name {app_slug} not found.") @@ -1231,7 +1149,7 @@ async def create_workspace(name: str, organization_id: str): workspace_db = WorkspaceDB( name=name, organization_id=uuid.UUID(organization_id), - description="Default Workspace", + description="My Default Workspace", type="default", ) @@ -1925,7 +1843,9 @@ async def list_apps( """ if app_name is not None: - app_db = await fetch_app_by_name(app_name=app_name, project_id=project_id) + app_db = await fetch_app_by_name_and_parameters( + app_name=app_name, project_id=project_id + ) return [converters.app_db_to_pydantic(app_db)] else: @@ -2555,17 +2475,14 @@ async def list_app_variant_revisions_by_variant( return app_variant_revisions -async def fetch_app_variant_revision( - app_variant: str, revision_number: int -) -> Optional[AppVariantRevisionsDB]: - """Returns a specific app variant revision for the given app variant and revision number. +async def fetch_app_variant_revision(app_variant: str, revision_number: int): + """Returns list of app variant revision for the given app variant Args: - app_variant (str): The ID of the app variant to retrieve the revision for. - revision_number (int): The revision number to retrieve. + app_variant (AppVariantDB): The app variant to retrieve environments for. Returns: - AppVariantRevisionsDB: The app variant revision object, or None if not found. + List[AppVariantRevisionsDB]: A list of AppVariantRevisionsDB objects. """ async with engine.core_session() as session: @@ -2587,8 +2504,8 @@ async def fetch_app_variant_revision( ) # type: ignore ) result = await session.execute(query) - app_variant_revision = result.scalars().first() - return app_variant_revision + app_variant_revisions = result.scalars().first() + return app_variant_revisions async def remove_environment(environment_db: AppEnvironmentDB): @@ -2611,38 +2528,20 @@ async def remove_environment(environment_db: AppEnvironmentDB): await session.commit() -async def remove_testsets( - project_id: str, - # - testset_ids: List[str], -): +async def remove_testsets(testset_ids: List[str]): """ Removes testsets. Args: - project_id (str): The ID of the project. testset_ids (List[str]): The testset identifiers """ async with engine.core_session() as session: - query = select(TestsetDB).where( - TestsetDB.project_id == uuid.UUID(project_id), - TestsetDB.id.in_(testset_ids), - ) + query = select(TestSetDB).where(TestSetDB.id.in_(testset_ids)) result = await session.execute(query) testsets = result.scalars().all() - - for i, testset in enumerate(testsets): - log.info( - f"[TESTSET] DELETE ({i}):", - project_id=testset.project_id, - testset_id=testset.id, - count=len(testset.csvdata), - size=len(dumps(testset.csvdata).encode("utf-8")), - ) - + for testset in testsets: await session.delete(testset) - await session.commit() @@ -2786,116 +2685,82 @@ async def get_app_variant_instance_by_id( return app_variant_db -async def fetch_testset_by_id( - project_id: str, - # - testset_id: str, -) -> Optional[TestsetDB]: +async def fetch_testset_by_id(testset_id: str) -> Optional[TestSetDB]: """Fetches a testset by its ID. Args: - project_id (str): The ID of the project. testset_id (str): The ID of the testset to fetch. Returns: - TestsetDB: The fetched testset, or None if no testset was found. + TestSetDB: The fetched testset, or None if no testset was found. """ + if not isinstance(testset_id, str) or not testset_id: + raise ValueError(f"testset_id {testset_id} must be a non-empty string") + + try: + testset_uuid = uuid.UUID(testset_id) + except ValueError as e: + raise ValueError(f"testset_id {testset_id} is not a valid UUID") from e + async with engine.core_session() as session: - result = await session.execute( - select(TestsetDB).filter_by( - project_id=uuid.UUID(project_id), - id=uuid.UUID(testset_id), - ) - ) + result = await session.execute(select(TestSetDB).filter_by(id=testset_uuid)) testset = result.scalars().first() - if not testset: raise NoResultFound(f"Testset with id {testset_id} not found") - - log.info( - "[TESTSET] READ:", - project_id=testset.project_id, - testset_id=testset.id, - count=len(testset.csvdata), - size=len(dumps(testset.csvdata).encode("utf-8")), - ) - return testset -async def create_testset( - project_id: str, - # - testset_data: Dict[str, Any], - # - testset_id: Optional[str] = None, -) -> TestsetDB: +async def create_testset(project_id: str, testset_data: Dict[str, Any]): """ Creates a testset. Args: + app (AppDB): The app object project_id (str): The ID of the project testset_data (dict): The data of the testset to create with - testset_id (Optional[str]): The ID of the testset to create Returns: returns the newly created TestsetDB """ async with engine.core_session() as session: - testset = TestsetDB( - **testset_data, - project_id=uuid.UUID(project_id), - id=uuid.UUID(testset_id) if testset_id else None, - ) + testset_db = TestSetDB(**testset_data, project_id=uuid.UUID(project_id)) log.info( - "[TESTSET] CREATE:", - project_id=testset.project_id, - testset_id=testset.id, - count=len(testset.csvdata), - size=len(dumps(testset.csvdata).encode("utf-8")), + "Saving testset:", + project_id=testset_db.project_id, + testset_id=testset_db.id, + count=len(testset_db.csvdata), + size=len(dumps(testset_db.csvdata).encode("utf-8")), ) - session.add(testset) + session.add(testset_db) await session.commit() - await session.refresh(testset) + await session.refresh(testset_db) - return testset + return testset_db -async def update_testset( - project_id: str, - # - testset_id: str, - # - values_to_update: dict, -) -> None: +async def update_testset(testset_id: str, values_to_update: dict) -> None: """Update a testset. Args: - project_id (str): The ID of the project - testset_id (str): The ID of the testset to update testset (TestsetDB): the testset object to update values_to_update (dict): The values to update """ async with engine.core_session() as session: result = await session.execute( - select(TestsetDB).filter_by( - project_id=uuid.UUID(project_id), - id=uuid.UUID(testset_id), - ) + select(TestSetDB).filter_by(id=uuid.UUID(testset_id)) ) testset = result.scalars().first() # Validate keys in values_to_update and update attributes valid_keys = [key for key in values_to_update.keys() if hasattr(testset, key)] - for key in valid_keys: setattr(testset, key, values_to_update[key]) log.info( - "[TESTSET] UPDATE:", + "Saving testset:", project_id=testset.project_id, testset_id=testset.id, count=len(testset.csvdata), @@ -2906,44 +2771,21 @@ async def update_testset( await session.refresh(testset) -async def fetch_testsets_by_project_id( - project_id: str, - name: Optional[str] = None, -) -> List[TestsetDB]: +async def fetch_testsets_by_project_id(project_id: str): """Fetches all testsets for a given project. Args: project_id (str): The ID of the project. Returns: - List[TestsetDB]: The fetched testsets. + List[TestSetDB]: The fetched testsets. """ async with engine.core_session() as session: - if not name: - result = await session.execute( - select(TestsetDB).filter_by( - project_id=uuid.UUID(project_id), - ) - ) - else: - result = await session.execute( - select(TestsetDB).filter_by( - project_id=uuid.UUID(project_id), - name=name if name else None, - ) - ) + result = await session.execute( + select(TestSetDB).filter_by(project_id=uuid.UUID(project_id)) + ) testsets = result.scalars().all() - - for i, testset in enumerate(testsets): - log.info( - f"[TESTSET] READ ({i}):", - project_id=testset.project_id, - testset_id=testset.id, - count=len(testset.csvdata), - size=len(dumps(testset.csvdata).encode("utf-8")), - ) - return testsets @@ -2976,7 +2818,7 @@ async def find_previous_variant_from_base_id( async def update_base( base_id: str, **kwargs: dict, -) -> Optional[VariantBaseDB]: +) -> VariantBaseDB: """Update the base object in the database with the provided id. Arguments: @@ -3044,7 +2886,7 @@ async def update_app_variant( return app_variant -async def fetch_app_by_name( +async def fetch_app_by_name_and_parameters( app_name: str, project_id: Optional[str] = None, ): @@ -3084,9 +2926,7 @@ async def fetch_evaluators_configs(project_id: str): return evaluators_configs -async def fetch_evaluator_config( - evaluator_config_id: str, -) -> Optional[EvaluatorConfigDB]: +async def fetch_evaluator_config(evaluator_config_id: str): """Fetch evaluator configurations from the database. Args: @@ -3139,7 +2979,7 @@ async def check_if_evaluators_exist_in_list_of_evaluators_configs( async def fetch_evaluator_config_by_appId( app_id: str, evaluator_name: str -) -> Optional[EvaluatorConfigDB]: +) -> EvaluatorConfigDB: """Fetch the evaluator config from the database using the app Id and evaluator name. Args: @@ -3164,14 +3004,16 @@ async def create_evaluator_config( project_id: str, name: str, evaluator_key: str, + app_name: Optional[str] = None, settings_values: Optional[Dict[str, Any]] = None, ) -> EvaluatorConfigDB: """Create a new evaluator configuration in the database.""" async with engine.core_session() as session: + name_suffix = f" ({app_name})" if app_name else "" new_evaluator_config = EvaluatorConfigDB( project_id=uuid.UUID(project_id), - name=name, + name=f"{name}{name_suffix}", evaluator_key=evaluator_key, settings_values=settings_values, ) @@ -3253,8 +3095,7 @@ async def get_object_uuid(object_id: str, table_name: str) -> str: """ from bson import ObjectId - - # from bson.errors import InvalidId + from bson.errors import InvalidId try: # Ensure the object_id is a valid MongoDB ObjectId @@ -3262,7 +3103,7 @@ async def get_object_uuid(object_id: str, table_name: str) -> str: object_uuid_as_str = await fetch_corresponding_object_uuid( table_name=table_name, object_id=object_id ) - except: + except InvalidId: # Use the object_id directly if it is not a valid MongoDB ObjectId object_uuid_as_str = object_id @@ -3290,7 +3131,7 @@ async def fetch_corresponding_object_uuid(table_name: str, object_id: str) -> st return str(object_mapping.uuid) -async def fetch_default_project() -> Optional[ProjectDB]: +async def fetch_default_project() -> ProjectDB: """ Fetch the default project from the database. Returns: @@ -3303,9 +3144,7 @@ async def fetch_default_project() -> Optional[ProjectDB]: return default_project -async def get_user_api_key_by_prefix( - api_key_prefix: str, user_id: str -) -> Optional[APIKeyDB]: +async def get_user_api_key_by_prefix(api_key_prefix: str, user_id: str) -> APIKeyDB: """ Gets the user api key by prefix. @@ -3351,755 +3190,3 @@ async def update_api_key_timestamp(api_key_id: str) -> None: await session.commit() await session.refresh(api_key) - - -async def fetch_evaluation_status_by_id( - project_id: str, - evaluation_id: str, -) -> Optional[str]: - """Fetch only the status of an evaluation by its ID.""" - assert evaluation_id is not None, "evaluation_id cannot be None" - - async with engine.core_session() as session: - query = ( - select(EvaluationDB) - .filter_by(project_id=project_id, id=uuid.UUID(evaluation_id)) - .options(load_only(EvaluationDB.status)) - ) - - result = await session.execute(query) - evaluation = result.scalars().first() - return evaluation.status if evaluation else None - - -async def fetch_evaluation_by_id( - project_id: str, - evaluation_id: str, -) -> Optional[EvaluationDB]: - """Fetches a evaluation by its ID. - - Args: - evaluation_id (str): The ID of the evaluation to fetch. - - Returns: - EvaluationDB: The fetched evaluation, or None if no evaluation was found. - """ - - assert evaluation_id is not None, "evaluation_id cannot be None" - async with engine.core_session() as session: - base_query = select(EvaluationDB).filter_by( - project_id=project_id, - id=uuid.UUID(evaluation_id), - ) - query = base_query.options( - joinedload(EvaluationDB.testset.of_type(TestsetDB)).load_only(TestsetDB.id, TestsetDB.name), # type: ignore - ) - - result = await session.execute( - query.options( - joinedload(EvaluationDB.variant.of_type(AppVariantDB)).load_only(AppVariantDB.id, AppVariantDB.variant_name), # type: ignore - joinedload(EvaluationDB.variant_revision.of_type(AppVariantRevisionsDB)).load_only(AppVariantRevisionsDB.revision), # type: ignore - joinedload( - EvaluationDB.aggregated_results.of_type( - EvaluationAggregatedResultDB - ) - ).joinedload(EvaluationAggregatedResultDB.evaluator_config), - ) - ) - evaluation = result.unique().scalars().first() - return evaluation - - -async def list_human_evaluations(app_id: str, project_id: str): - """ - Fetches human evaluations belonging to an App. - - Args: - app_id (str): The application identifier - """ - - async with engine.core_session() as session: - base_query = ( - select(HumanEvaluationDB) - .filter_by(app_id=uuid.UUID(app_id), project_id=uuid.UUID(project_id)) - .filter(HumanEvaluationDB.testset_id.isnot(None)) - ) - query = base_query.options( - joinedload(HumanEvaluationDB.testset.of_type(TestsetDB)).load_only(TestsetDB.id, TestsetDB.name), # type: ignore - ) - - result = await session.execute(query) - human_evaluations = result.scalars().all() - return human_evaluations - - -async def create_human_evaluation( - app: AppDB, - status: str, - evaluation_type: str, - testset_id: str, - variants_ids: List[str], -): - """ - Creates a human evaluation. - - Args: - app (AppDB: The app object - status (str): The status of the evaluation - evaluation_type (str): The evaluation type - testset_id (str): The ID of the evaluation testset - variants_ids (List[str]): The IDs of the variants for the evaluation - """ - - async with engine.core_session() as session: - human_evaluation = HumanEvaluationDB( - app_id=app.id, - project_id=app.project_id, - status=status, - evaluation_type=evaluation_type, - testset_id=testset_id, - ) - - session.add(human_evaluation) - await session.commit() - await session.refresh(human_evaluation, attribute_names=["testset"]) - - # create variants for human evaluation - await create_human_evaluation_variants( - human_evaluation_id=str(human_evaluation.id), - variants_ids=variants_ids, - ) - return human_evaluation - - -async def fetch_human_evaluation_variants(human_evaluation_id: str): - """ - Fetches human evaluation variants. - - Args: - human_evaluation_id (str): The human evaluation ID - - Returns: - The human evaluation variants. - """ - - async with engine.core_session() as session: - base_query = select(HumanEvaluationVariantDB).filter_by( - human_evaluation_id=uuid.UUID(human_evaluation_id) - ) - query = base_query.options( - joinedload(HumanEvaluationVariantDB.variant.of_type(AppVariantDB)).load_only(AppVariantDB.id, AppVariantDB.variant_name), # type: ignore - joinedload(HumanEvaluationVariantDB.variant_revision.of_type(AppVariantRevisionsDB)).load_only(AppVariantRevisionsDB.id, AppVariantRevisionsDB.revision), # type: ignore - ) - - result = await session.execute(query) - evaluation_variants = result.scalars().all() - return evaluation_variants - - -async def create_human_evaluation_variants( - human_evaluation_id: str, variants_ids: List[str] -): - """ - Creates human evaluation variants. - - Args: - human_evaluation_id (str): The human evaluation identifier - variants_ids (List[str]): The variants identifiers - project_id (str): The project ID - """ - - variants_dict = {} - for variant_id in variants_ids: - variant = await fetch_app_variant_by_id(app_variant_id=variant_id) - if variant: - variants_dict[variant_id] = variant - - variants_revisions_dict = {} - for variant_id, variant in variants_dict.items(): - variant_revision = await fetch_app_variant_revision_by_variant( - app_variant_id=str(variant.id), project_id=str(variant.project_id), revision=variant.revision # type: ignore - ) - if variant_revision: - variants_revisions_dict[variant_id] = variant_revision - - if set(variants_dict.keys()) != set(variants_revisions_dict.keys()): - raise ValueError("Mismatch between variants and their revisions") - - async with engine.core_session() as session: - for variant_id in variants_ids: - variant = variants_dict[variant_id] - variant_revision = variants_revisions_dict[variant_id] - human_evaluation_variant = HumanEvaluationVariantDB( - human_evaluation_id=uuid.UUID(human_evaluation_id), - variant_id=variant.id, # type: ignore - variant_revision_id=variant_revision.id, # type: ignore - ) - session.add(human_evaluation_variant) - - await session.commit() - - -async def fetch_human_evaluation_by_id( - evaluation_id: str, -) -> Optional[HumanEvaluationDB]: - """ - Fetches a evaluation by its ID. - - Args: - evaluation_id (str): The ID of the evaluation to fetch. - - Returns: - EvaluationDB: The fetched evaluation, or None if no evaluation was found. - """ - - assert evaluation_id is not None, "evaluation_id cannot be None" - async with engine.core_session() as session: - base_query = select(HumanEvaluationDB).filter_by(id=uuid.UUID(evaluation_id)) - query = base_query.options( - joinedload(HumanEvaluationDB.testset.of_type(TestsetDB)).load_only(TestsetDB.id, TestsetDB.name), # type: ignore - ) - result = await session.execute(query) - evaluation = result.scalars().first() - return evaluation - - -async def update_human_evaluation(evaluation_id: str, values_to_update: dict): - """Updates human evaluation with the specified values. - - Args: - evaluation_id (str): The evaluation ID - values_to_update (dict): The values to update - - Exceptions: - NoResultFound: if human evaluation is not found - """ - - async with engine.core_session() as session: - result = await session.execute( - select(HumanEvaluationDB).filter_by(id=uuid.UUID(evaluation_id)) - ) - human_evaluation = result.scalars().first() - if not human_evaluation: - raise NoResultFound(f"Human evaluation with id {evaluation_id} not found") - - for key, value in values_to_update.items(): - if hasattr(human_evaluation, key): - setattr(human_evaluation, key, value) - - await session.commit() - await session.refresh(human_evaluation) - - -async def delete_human_evaluation(evaluation_id: str): - """Delete the evaluation by its ID. - - Args: - evaluation_id (str): The ID of the evaluation to delete. - """ - - assert evaluation_id is not None, "evaluation_id cannot be None" - async with engine.core_session() as session: - result = await session.execute( - select(HumanEvaluationDB).filter_by(id=uuid.UUID(evaluation_id)) - ) - evaluation = result.scalars().first() - if not evaluation: - raise NoResultFound(f"Human evaluation with id {evaluation_id} not found") - - await session.delete(evaluation) - await session.commit() - - -async def create_human_evaluation_scenario( - inputs: List[HumanEvaluationScenarioInput], - project_id: str, - evaluation_id: str, - evaluation_extend: Dict[str, Any], -): - """ - Creates a human evaluation scenario. - - Args: - inputs (List[HumanEvaluationScenarioInput]): The inputs. - evaluation_id (str): The evaluation identifier. - evaluation_extend (Dict[str, any]): An extended required payload for the evaluation scenario. Contains score, vote, and correct_answer. - """ - - async with engine.core_session() as session: - evaluation_scenario = HumanEvaluationScenarioDB( - **evaluation_extend, - project_id=uuid.UUID(project_id), - evaluation_id=uuid.UUID(evaluation_id), - inputs=[input.model_dump() for input in inputs], - outputs=[], - ) - - session.add(evaluation_scenario) - await session.commit() - - -async def update_human_evaluation_scenario( - evaluation_scenario_id: str, values_to_update: dict -): - """Updates human evaluation scenario with the specified values. - - Args: - evaluation_scenario_id (str): The evaluation scenario ID - values_to_update (dict): The values to update - - Exceptions: - NoResultFound: if human evaluation scenario is not found - """ - - async with engine.core_session() as session: - result = await session.execute( - select(HumanEvaluationScenarioDB).filter_by( - id=uuid.UUID(evaluation_scenario_id) - ) - ) - human_evaluation_scenario = result.scalars().first() - if not human_evaluation_scenario: - raise NoResultFound( - f"Human evaluation scenario with id {evaluation_scenario_id} not found" - ) - - for key, value in values_to_update.items(): - if hasattr(human_evaluation_scenario, key): - setattr(human_evaluation_scenario, key, value) - - await session.commit() - await session.refresh(human_evaluation_scenario) - - -async def fetch_human_evaluation_scenarios(evaluation_id: str): - """ - Fetches human evaluation scenarios. - - Args: - evaluation_id (str): The evaluation identifier - - Returns: - The evaluation scenarios. - """ - - async with engine.core_session() as session: - result = await session.execute( - select(HumanEvaluationScenarioDB) - .filter_by(evaluation_id=uuid.UUID(evaluation_id)) - .order_by(asc(HumanEvaluationScenarioDB.created_at)) - ) - evaluation_scenarios = result.scalars().all() - return evaluation_scenarios - - -async def fetch_evaluation_scenarios(evaluation_id: str, project_id: str): - """ - Fetches evaluation scenarios. - - Args: - evaluation_id (str): The evaluation identifier - project_id (str): The ID of the project - - Returns: - The evaluation scenarios. - """ - - async with engine.core_session() as session: - result = await session.execute( - select(EvaluationScenarioDB) - .filter_by( - evaluation_id=uuid.UUID(evaluation_id), project_id=uuid.UUID(project_id) - ) - .options(joinedload(EvaluationScenarioDB.results)) - ) - evaluation_scenarios = result.unique().scalars().all() - return evaluation_scenarios - - -async def fetch_evaluation_scenario_by_id( - evaluation_scenario_id: str, -) -> Optional[EvaluationScenarioDB]: - """Fetches and evaluation scenario by its ID. - - Args: - evaluation_scenario_id (str): The ID of the evaluation scenario to fetch. - - Returns: - EvaluationScenarioDB: The fetched evaluation scenario, or None if no evaluation scenario was found. - """ - - assert evaluation_scenario_id is not None, "evaluation_scenario_id cannot be None" - async with engine.core_session() as session: - result = await session.execute( - select(EvaluationScenarioDB).filter_by(id=uuid.UUID(evaluation_scenario_id)) - ) - evaluation_scenario = result.scalars().first() - return evaluation_scenario - - -async def fetch_human_evaluation_scenario_by_id( - evaluation_scenario_id: str, -) -> Optional[HumanEvaluationScenarioDB]: - """Fetches and evaluation scenario by its ID. - - Args: - evaluation_scenario_id (str): The ID of the evaluation scenario to fetch. - - Returns: - EvaluationScenarioDB: The fetched evaluation scenario, or None if no evaluation scenario was found. - """ - - assert evaluation_scenario_id is not None, "evaluation_scenario_id cannot be None" - async with engine.core_session() as session: - result = await session.execute( - select(HumanEvaluationScenarioDB).filter_by( - id=uuid.UUID(evaluation_scenario_id) - ) - ) - evaluation_scenario = result.scalars().first() - return evaluation_scenario - - -async def fetch_human_evaluation_scenario_by_evaluation_id( - evaluation_id: str, -) -> Optional[HumanEvaluationScenarioDB]: - """Fetches and evaluation scenario by its ID. - Args: - evaluation_id (str): The ID of the evaluation object to use in fetching the human evaluation. - Returns: - EvaluationScenarioDB: The fetched evaluation scenario, or None if no evaluation scenario was found. - """ - - evaluation = await fetch_human_evaluation_by_id(evaluation_id) - async with engine.core_session() as session: - result = await session.execute( - select(HumanEvaluationScenarioDB).filter_by( - evaluation_id=evaluation.id # type: ignore - ) - ) - human_eval_scenario = result.scalars().first() - return human_eval_scenario - - -async def create_new_evaluation( - app: AppDB, - project_id: str, - testset: TestsetDB, - status: Result, - variant: str, - variant_revision: str, -) -> EvaluationDB: - """Create a new evaluation scenario. - Returns: - EvaluationScenarioDB: The created evaluation scenario. - """ - - async with engine.core_session() as session: - evaluation = EvaluationDB( - app_id=app.id, - project_id=uuid.UUID(project_id), - testset_id=testset.id, - status=status.model_dump(), - variant_id=uuid.UUID(variant), - variant_revision_id=uuid.UUID(variant_revision), - ) - - session.add(evaluation) - await session.commit() - await session.refresh( - evaluation, - attribute_names=[ - "testset", - "variant", - "variant_revision", - "aggregated_results", - ], - ) - - return evaluation - - -async def list_evaluations(app_id: str, project_id: str): - """Retrieves evaluations of the specified app from the db. - - Args: - app_id (str): The ID of the app - project_id (str): The ID of the project - """ - - async with engine.core_session() as session: - base_query = select(EvaluationDB).filter_by( - app_id=uuid.UUID(app_id), project_id=uuid.UUID(project_id) - ) - query = base_query.options( - joinedload(EvaluationDB.testset.of_type(TestsetDB)).load_only(TestsetDB.id, TestsetDB.name), # type: ignore - ) - - result = await session.execute( - query.options( - joinedload(EvaluationDB.variant.of_type(AppVariantDB)).load_only(AppVariantDB.id, AppVariantDB.variant_name), # type: ignore - joinedload(EvaluationDB.variant_revision.of_type(AppVariantRevisionsDB)).load_only(AppVariantRevisionsDB.revision), # type: ignore - joinedload( - EvaluationDB.aggregated_results.of_type( - EvaluationAggregatedResultDB - ) - ).joinedload(EvaluationAggregatedResultDB.evaluator_config), - ) - ) - evaluations = result.unique().scalars().all() - return evaluations - - -async def fetch_evaluations_by_resource( - resource_type: str, project_id: str, resource_ids: List[str] -): - """ - Fetches an evaluations by resource. - - Args: - resource_type (str): The resource type - project_id (str): The ID of the project - resource_ids (List[str]): The resource identifiers - - Returns: - The evaluations by resource. - - Raises: - HTTPException:400 resource_type {type} is not supported - """ - - ids = list(map(uuid.UUID, resource_ids)) - - async with engine.core_session() as session: - if resource_type == "variant": - result_evaluations = await session.execute( - select(EvaluationDB) - .filter( - EvaluationDB.variant_id.in_(ids), - EvaluationDB.project_id == uuid.UUID(project_id), - ) - .options(load_only(EvaluationDB.id)) # type: ignore - ) - result_human_evaluations = await session.execute( - select(HumanEvaluationDB) - .join(HumanEvaluationVariantDB) - .filter( - HumanEvaluationVariantDB.variant_id.in_(ids), - HumanEvaluationDB.project_id == uuid.UUID(project_id), - ) - .options(load_only(HumanEvaluationDB.id)) # type: ignore - ) - res_evaluations = list(result_evaluations.scalars().all()) - res_human_evaluations = list(result_human_evaluations.scalars().all()) - return res_evaluations + res_human_evaluations - - elif resource_type == "testset": - result_evaluations = await session.execute( - select(EvaluationDB) - .filter( - EvaluationDB.testset_id.in_(ids), - EvaluationDB.project_id == uuid.UUID(project_id), - ) - .options(load_only(EvaluationDB.id)) # type: ignore - ) - result_human_evaluations = await session.execute( - select(HumanEvaluationDB) - .filter( - HumanEvaluationDB.testset_id.in_(ids), - HumanEvaluationDB.project_id - == uuid.UUID(project_id), # Fixed to match HumanEvaluationDB - ) - .options(load_only(HumanEvaluationDB.id)) # type: ignore - ) - res_evaluations = list(result_evaluations.scalars().all()) - res_human_evaluations = list(result_human_evaluations.scalars().all()) - return res_evaluations + res_human_evaluations - - elif resource_type == "evaluator_config": - query = ( - select(EvaluationDB) - .join(EvaluationDB.evaluator_configs) - .filter( - EvaluationEvaluatorConfigDB.evaluator_config_id.in_(ids), - EvaluationDB.project_id == uuid.UUID(project_id), - ) - ) - result = await session.execute(query) - res = result.scalars().all() - return res - - raise HTTPException( - status_code=400, - detail=f"resource_type {resource_type} is not supported", - ) - - -async def delete_evaluations(evaluation_ids: List[str]) -> None: - """Delete evaluations based on the ids provided from the db. - - Args: - evaluations_ids (list[str]): The IDs of the evaluation - """ - - async with engine.core_session() as session: - query = select(EvaluationDB).where(EvaluationDB.id.in_(evaluation_ids)) - result = await session.execute(query) - evaluations = result.scalars().all() - for evaluation in evaluations: - await session.delete(evaluation) - await session.commit() - - -async def create_new_evaluation_scenario( - project_id: str, - evaluation_id: str, - variant_id: str, - inputs: List[EvaluationScenarioInput], - outputs: List[EvaluationScenarioOutput], - correct_answers: Optional[List[CorrectAnswer]], - is_pinned: Optional[bool], - note: Optional[str], - results: List[EvaluationScenarioResult], -) -> EvaluationScenarioDB: - """Create a new evaluation scenario. - - Returns: - EvaluationScenarioDB: The created evaluation scenario. - """ - - async with engine.core_session() as session: - evaluation_scenario = EvaluationScenarioDB( - project_id=uuid.UUID(project_id), - evaluation_id=uuid.UUID(evaluation_id), - variant_id=uuid.UUID(variant_id), - inputs=[input.model_dump() for input in inputs], - outputs=[output.model_dump() for output in outputs], - correct_answers=( - [correct_answer.model_dump() for correct_answer in correct_answers] - if correct_answers is not None - else [] - ), - is_pinned=is_pinned, - note=note, - ) - - session.add(evaluation_scenario) - await session.commit() - await session.refresh(evaluation_scenario) - - # create evaluation scenario result - for result in results: - evaluation_scenario_result = EvaluationScenarioResultDB( - evaluation_scenario_id=evaluation_scenario.id, - evaluator_config_id=uuid.UUID(result.evaluator_config), - result=result.result.model_dump(), - ) - - session.add(evaluation_scenario_result) - - await session.commit() # ensures that scenario results insertion is committed - await session.refresh(evaluation_scenario) - - return evaluation_scenario - - -async def update_evaluation_with_aggregated_results( - evaluation_id: str, aggregated_results: List[AggregatedResult] -): - async with engine.core_session() as session: - for result in aggregated_results: - aggregated_result = EvaluationAggregatedResultDB( - evaluation_id=uuid.UUID(evaluation_id), - evaluator_config_id=uuid.UUID(result.evaluator_config), - result=result.result.model_dump(), - ) - session.add(aggregated_result) - - await session.commit() - - -async def fetch_eval_aggregated_results(evaluation_id: str): - """ - Fetches an evaluation aggregated results by evaluation identifier. - - Args: - evaluation_id (str): The evaluation identifier - - Returns: - The evaluation aggregated results by evaluation identifier. - """ - - async with engine.core_session() as session: - base_query = select(EvaluationAggregatedResultDB).filter_by( - evaluation_id=uuid.UUID(evaluation_id) - ) - query = base_query.options( - joinedload( - EvaluationAggregatedResultDB.evaluator_config.of_type(EvaluatorConfigDB) - ).load_only( - EvaluatorConfigDB.id, # type: ignore - EvaluatorConfigDB.name, # type: ignore - EvaluatorConfigDB.evaluator_key, # type: ignore - EvaluatorConfigDB.settings_values, # type: ignore - EvaluatorConfigDB.created_at, # type: ignore - EvaluatorConfigDB.updated_at, # type: ignore - ) - ) - - result = await session.execute(query) - aggregated_results = result.scalars().all() - return aggregated_results - - -async def update_evaluation( - evaluation_id: str, project_id: str, updates: Dict[str, Any] -) -> Optional[EvaluationDB]: - """ - Update an evaluator configuration in the database with the provided id. - - Arguments: - evaluation_id (str): The ID of the evaluator configuration to be updated. - project_id (str): The ID of the project. - updates (Dict[str, Any]): The updates to apply to the evaluator configuration. - - Returns: - EvaluatorConfigDB: The updated evaluator configuration object. - """ - - async with engine.core_session() as session: - result = await session.execute( - select(EvaluationDB).filter_by( - id=uuid.UUID(evaluation_id), project_id=uuid.UUID(project_id) - ) - ) - evaluation = result.scalars().first() - for key, value in updates.items(): - if hasattr(evaluation, key): - setattr(evaluation, key, value) - - await session.commit() - await session.refresh(evaluation) - - return evaluation - - -async def check_if_evaluation_contains_failed_evaluation_scenarios( - evaluation_id: str, -) -> bool: - async with engine.core_session() as session: - EvaluationResultAlias = aliased(EvaluationScenarioResultDB) - query = ( - select(func.count(EvaluationScenarioDB.id)) - .join(EvaluationResultAlias, EvaluationScenarioDB.results) - .where( - EvaluationScenarioDB.evaluation_id == uuid.UUID(evaluation_id), - EvaluationResultAlias.result["type"].astext == "error", - ) - ) - - result = await session.execute(query) - count = result.scalar() - if not count: - return False - return count > 0 diff --git a/api/oss/src/services/evaluator_manager.py b/api/oss/src/services/evaluator_manager.py index 68f44ee3d4..173a3198e5 100644 --- a/api/oss/src/services/evaluator_manager.py +++ b/api/oss/src/services/evaluator_manager.py @@ -54,6 +54,7 @@ async def get_evaluator_config(evaluator_config: EvaluatorConfig) -> EvaluatorCo async def create_evaluator_config( project_id: str, + app_name: str, name: str, evaluator_key: str, settings_values: Optional[Dict[str, Any]] = None, @@ -74,6 +75,7 @@ async def create_evaluator_config( evaluator_config = await db_manager.create_evaluator_config( project_id=project_id, + app_name=app_name, name=name, evaluator_key=evaluator_key, settings_values=settings_values, @@ -147,6 +149,7 @@ async def create_ready_to_use_evaluators(project_id: str): ), f"'name' and 'key' does not exist in the evaluator: {evaluator}" await db_manager.create_evaluator_config( project_id=project_id, + app_name=None, name=evaluator.name, evaluator_key=evaluator.key, settings_values=settings_values, diff --git a/api/oss/src/services/evaluators_service.py b/api/oss/src/services/evaluators_service.py index 13e1538bc4..6ac2f8b29a 100644 --- a/api/oss/src/services/evaluators_service.py +++ b/api/oss/src/services/evaluators_service.py @@ -1,7 +1,7 @@ import re import json import traceback -from typing import Any, Dict, Union, List, Optional +from typing import Any, Dict, Union import litellm import httpx @@ -26,9 +26,6 @@ get_field_value_from_trace_tree, ) -from agenta.sdk.managers.secrets import SecretsManager - - log = get_module_logger(__name__) @@ -83,66 +80,6 @@ def validate_string_output( return final_output -def detect_prompt_variables( - prompt: Union[str, List[Dict[str, str]]], -) -> List[str]: - """ - Detects variable placeholders in a prompt string or message-based prompt. - Looks for patterns like {variable_name} or {{variable_name}} - - Args: - prompt: Either a string or a list of message dictionaries with 'content' field - - Returns: - List[str]: List of variable names found in the prompt - """ - import re - - # Match both single and double curly brace variables - pattern = r"\{+([a-zA-Z_][a-zA-Z0-9_.]*)\}+" - # log.info(f"Variable detection using pattern: {pattern}") - - if isinstance(prompt, list): - # For message-based prompts, search in all message contents - variables = set() - for i, message in enumerate(prompt): - if isinstance(message, dict) and "content" in message: - content = message["content"] - matches = re.findall(pattern, content) - variables.update(matches) - result = list(variables) - return result - else: - matches = re.findall(pattern, prompt) - result = list(set(matches)) - return result - - -def validate_prompt_variables( - prompt: Union[str, List[Dict[str, str]]], - inputs: Dict[str, Any], -) -> None: - """ - Validates that all variables in the prompt have corresponding values in inputs. - - Args: - prompt (str): The prompt string containing potential variables - inputs (Dict[str, Any]): The inputs dictionary that should contain variable values - - Raises: - ValueError: If any variable in the prompt is missing from inputs - """ - - variables = detect_prompt_variables(prompt) - missing_vars = [var for var in variables if var not in inputs] - - if missing_vars: - raise ValueError( - f"Prompt includes variables that are missing from inputs: {', '.join(missing_vars)}. " - "Please provide values for these variables in your inputs." - ) - - async def map( mapping_input: EvaluatorMappingInputInterface, ) -> EvaluatorMappingOutputInterface: @@ -207,7 +144,7 @@ def get_correct_answer( if correct_answer_key not in data_point: if required: raise ValueError( - f"Correct answer column '{correct_answer_key}' not found in the testset." + f"Correct answer column '{correct_answer_key}' not found in the test set." ) return None return data_point[correct_answer_key] @@ -503,8 +440,8 @@ async def auto_ai_critique( } ) ) - return Result(type="number", value=response["outputs"]["score"]) - except Exception as e: # pylint: disable=broad-except + return Result(type="text", value=str(response["outputs"]["score"])) + except Exception as e: # pylint: disable=broad-except∆`§ return Result( type="error", value=None, @@ -515,581 +452,17 @@ async def auto_ai_critique( ) -import json -import re -from typing import Any, Dict, Iterable, Tuple, Optional - -try: - import jsonpath # ✅ use module API - from jsonpath import JSONPointer # pointer class is fine to use -except Exception: - jsonpath = None - JSONPointer = None - -# ========= Scheme detection ========= - - -def detect_scheme(expr: str) -> str: - """Return 'json-path', 'json-pointer', or 'dot-notation' based on the placeholder prefix.""" - if expr.startswith("$"): - return "json-path" - if expr.startswith("/"): - return "json-pointer" - return "dot-notation" - - -# ========= Resolvers ========= - - -def resolve_dot_notation(expr: str, data: dict) -> object: - if "[" in expr or "]" in expr: - raise KeyError(f"Bracket syntax is not supported in dot-notation: {expr!r}") - - # First, check if the expression exists as a literal key (e.g., "topic.story" as a single key) - # This allows users to use dots in their variable names without nested access - if expr in data: - return data[expr] - - # If not found as a literal key, try to parse as dot-notation path - cur = data - for token in (p for p in expr.split(".") if p): - if isinstance(cur, list) and token.isdigit(): - cur = cur[int(token)] - else: - if not isinstance(cur, dict): - raise KeyError( - f"Cannot access key {token!r} on non-dict while resolving {expr!r}" - ) - if token not in cur: - raise KeyError(f"Missing key {token!r} while resolving {expr!r}") - cur = cur[token] - return cur - - -def resolve_json_path(expr: str, data: dict) -> object: - if jsonpath is None: - raise ImportError("python-jsonpath is required for json-path ($...)") - - if not (expr == "$" or expr.startswith("$.") or expr.startswith("$[")): - raise ValueError( - f"Invalid json-path expression {expr!r}. " - "Must start with '$', '$.' or '$[' (no implicit normalization)." - ) - - # Use package-level APIf - results = jsonpath.findall(expr, data) # always returns a list - return results[0] if len(results) == 1 else results - - -def resolve_json_pointer(expr: str, data: Dict[str, Any]) -> Any: - """Resolve a JSON Pointer; returns a single value.""" - if JSONPointer is None: - raise ImportError("python-jsonpath is required for json-pointer (/...)") - return JSONPointer(expr).resolve(data) - - -def resolve_any(expr: str, data: Dict[str, Any]) -> Any: - """Dispatch to the right resolver based on detected scheme.""" - scheme = detect_scheme(expr) - if scheme == "json-path": - return resolve_json_path(expr, data) - if scheme == "json-pointer": - return resolve_json_pointer(expr, data) - return resolve_dot_notation(expr, data) - - -# ========= Placeholder & coercion helpers ========= - -_PLACEHOLDER_RE = re.compile(r"\{\{\s*(.*?)\s*\}\}") - - -def extract_placeholders(template: str) -> Iterable[str]: - """Yield the inner text of all {{ ... }} occurrences (trimmed).""" - for m in _PLACEHOLDER_RE.finditer(template): - yield m.group(1).strip() - - -def coerce_to_str(value: Any) -> str: - """Pretty stringify values for embedding into templates.""" - if isinstance(value, (dict, list)): - return json.dumps(value, ensure_ascii=False) - return str(value) - - -def build_replacements( - placeholders: Iterable[str], data: Dict[str, Any] -) -> Tuple[Dict[str, str], set]: - """ - Resolve all placeholders against data. - Returns (replacements, unresolved_placeholders). - """ - replacements: Dict[str, str] = {} - unresolved: set = set() - for expr in set(placeholders): - try: - val = resolve_any(expr, data) - # Escape backslashes to avoid regex replacement surprises - replacements[expr] = coerce_to_str(val).replace("\\", "\\\\") - except Exception: - unresolved.add(expr) - return replacements, unresolved - - -def apply_replacements(template: str, replacements: Dict[str, str]) -> str: - """Replace {{ expr }} using a callback to avoid regex-injection issues.""" - - def _repl(m: re.Match) -> str: - expr = m.group(1).strip() - return replacements.get(expr, m.group(0)) - - return _PLACEHOLDER_RE.sub(_repl, template) - - -def compute_truly_unreplaced(original: set, rendered: str) -> set: - """Only count placeholders that were in the original template and remain.""" - now = set(extract_placeholders(rendered)) - return original & now - - -def missing_lib_hints(unreplaced: set) -> Optional[str]: - """Suggest installing python-jsonpath if placeholders indicate json-path or json-pointer usage.""" - if any(expr.startswith("$") or expr.startswith("/") for expr in unreplaced) and ( - jsonpath is None or JSONPointer is None - ): - return ( - "Install python-jsonpath to enable json-path ($...) and json-pointer (/...)" - ) - return None - - -def _format_with_template( - content: str, - format: str, - kwargs: Dict[str, Any], -) -> str: - """Internal method to format content based on template_format""" - try: - if format == "fstring": - return content.format(**kwargs) - - elif format == "jinja2": - from jinja2 import Template, TemplateError - - try: - return Template(content).render(**kwargs) - except TemplateError: - return content - - elif format == "curly": - original_placeholders = set(extract_placeholders(content)) - - replacements, _unresolved = build_replacements( - original_placeholders, - kwargs, - ) - - result = apply_replacements(content, replacements) - - truly_unreplaced = compute_truly_unreplaced(original_placeholders, result) - - if truly_unreplaced: - hint = missing_lib_hints(truly_unreplaced) - suffix = f" Hint: {hint}" if hint else "" - raise ValueError( - f"Template variables not found or unresolved: " - f"{', '.join(sorted(truly_unreplaced))}.{suffix}" - ) - - return result - - return content - except Exception as e: - log.error(f"Error during template formatting: {str(e)}") - return content - - async def ai_critique(input: EvaluatorInputInterface) -> EvaluatorOutputInterface: openai_api_key = input.credentials.get("OPENAI_API_KEY", None) anthropic_api_key = input.credentials.get("ANTHROPIC_API_KEY", None) litellm.openai_key = openai_api_key - litellm.anthropic_key = anthropic_api_key - litellm.drop_params = True - + litellm.anthropic_api_key = anthropic_api_key if not openai_api_key: raise Exception( "No OpenAI key was found. AI Critique evaluator requires a valid OpenAI API key to function. Please configure your OpenAI API and try again." ) - - # Validate prompt variables if there's a prompt in the inputs - if input.settings.get("prompt_template") and input.settings.get("version") not in [ - "3", - "4", - ]: - try: - validate_prompt_variables( - prompt=input.settings.get("prompt_template", []), - inputs=input.inputs, - ) - except ValueError as e: - raise e - if ( - input.settings.get("version") == "4" - ) and ( # this check is used when running in the background (celery) - type(input.settings.get("prompt_template", "")) is not str - ): # this check is used when running in the frontend (since in that case we'll alway have version 2) - try: - parameters = input.settings or dict() - - if not isinstance(parameters, dict): - parameters = dict() - - inputs = input.inputs or None - - if not isinstance(inputs, dict): - inputs = dict() - - outputs = input.inputs.get("prediction") or None - - if "ground_truth" in inputs: - del inputs["ground_truth"] - if "prediction" in inputs: - del inputs["prediction"] - - # ---------------------------------------------------------------- # - - correct_answer_key = parameters.get("correct_answer_key") - - prompt_template: List = parameters.get("prompt_template") or list() - - template_version = parameters.get("version") or "3" - - default_format = "fstring" if template_version == "2" else "curly" - - template_format = parameters.get("template_format") or default_format - - response_type = input.settings.get("response_type") or ( - "json_schema" if template_version == "4" else "text" - ) - - json_schema = input.settings.get("json_schema") or None - - json_schema = json_schema if response_type == "json_schema" else None - - response_format = dict(type=response_type) - - if response_type == "json_schema": - response_format["json_schema"] = json_schema - - model = parameters.get("model") or "gpt-4o-mini" - - correct_answer = None - - if inputs and isinstance(inputs, dict) and correct_answer_key: - correct_answer = inputs[correct_answer_key] - - secrets = await SecretsManager.retrieve_secrets() - - openai_api_key = None # secrets.get("OPENAI_API_KEY") - anthropic_api_key = None # secrets.get("ANTHROPIC_API_KEY") - openrouter_api_key = None # secrets.get("OPENROUTER_API_KEY") - cohere_api_key = None # secrets.get("COHERE_API_KEY") - azure_api_key = None # secrets.get("AZURE_API_KEY") - groq_api_key = None # secrets.get("GROQ_API_KEY") - - for secret in secrets: - if secret.get("kind") == "provider_key": - secret_data = secret.get("data", {}) - if secret_data.get("kind") == "openai": - provider_data = secret_data.get("provider", {}) - openai_api_key = provider_data.get("key") or openai_api_key - if secret_data.get("kind") == "anthropic": - provider_data = secret_data.get("provider", {}) - anthropic_api_key = ( - provider_data.get("key") or anthropic_api_key - ) - if secret_data.get("kind") == "openrouter": - provider_data = secret_data.get("provider", {}) - openrouter_api_key = ( - provider_data.get("key") or openrouter_api_key - ) - if secret_data.get("kind") == "cohere": - provider_data = secret_data.get("provider", {}) - cohere_api_key = provider_data.get("key") or cohere_api_key - if secret_data.get("kind") == "azure": - provider_data = secret_data.get("provider", {}) - azure_api_key = provider_data.get("key") or azure_api_key - if secret_data.get("kind") == "groq": - provider_data = secret_data.get("provider", {}) - groq_api_key = provider_data.get("key") or groq_api_key - - threshold = parameters.get("threshold") or 0.5 - - score = None - success = None - - litellm.openai_key = openai_api_key - litellm.anthropic_key = anthropic_api_key - litellm.openrouter_key = openrouter_api_key - litellm.cohere_key = cohere_api_key - litellm.azure_key = azure_api_key - litellm.groq_key = groq_api_key - - context: Dict[str, Any] = dict() - - if parameters: - context.update( - **{ - "parameters": parameters, - } - ) - - if correct_answer: - context.update( - **{ - "ground_truth": correct_answer, - "correct_answer": correct_answer, - "reference": correct_answer, - } - ) - - if outputs: - context.update( - **{ - "prediction": outputs, - "outputs": outputs, - } - ) - - if inputs: - context.update(**inputs) - context.update( - **{ - "inputs": inputs, - } - ) - - formatted_prompt_template = [ - { - "role": message["role"], - "content": _format_with_template( - content=message["content"], - format=template_format, - kwargs=context, - ), - } - for message in prompt_template - ] - - try: - response = await litellm.acompletion( - model=model, - messages=formatted_prompt_template, - temperature=0.01, - response_format=response_format, - ) - - _outputs = response.choices[0].message.content.strip() # type: ignore - - except litellm.AuthenticationError as e: # type: ignore - e.message = e.message.replace( - "litellm.AuthenticationError: AuthenticationError: ", "" - ) - raise e - - except Exception as e: - raise ValueError(f"AI Critique evaluation failed: {str(e)}") from e - # -------------------------------------------------------------------------- - - try: - _outputs = json.loads(_outputs) - except: - pass - - if isinstance(_outputs, (int, float)): - return EvaluatorOutputInterface( - outputs={ - "score": _outputs, - "success": _outputs >= threshold, - }, - ) - - if isinstance(_outputs, bool): - return EvaluatorOutputInterface( - outputs={ - "success": _outputs, - }, - ) - - if isinstance(_outputs, dict): - return EvaluatorOutputInterface( - outputs=_outputs, - ) - - raise ValueError(f"Could not parse output: {_outputs}") - except Exception as e: - raise RuntimeError(f"Evaluation failed: {str(e)}") - elif ( - input.settings.get("version") == "3" - ) and ( # this check is used when running in the background (celery) - type(input.settings.get("prompt_template", "")) is not str - ): # this check is used when running in the frontend (since in that case we'll alway have version 2) - try: - parameters = input.settings or dict() - - if not isinstance(parameters, dict): - parameters = dict() - - inputs = input.inputs or None - - if not isinstance(inputs, dict): - inputs = dict() - - outputs = input.inputs.get("prediction") or None - - if "ground_truth" in inputs: - del inputs["ground_truth"] - if "prediction" in inputs: - del inputs["prediction"] - - # ---------------------------------------------------------------- # - - correct_answer_key = parameters.get("correct_answer_key") - - prompt_template: List = parameters.get("prompt_template") or list() - - template_version = parameters.get("version") or "3" - - default_format = "fstring" if template_version == "2" else "curly" - - template_format = parameters.get("template_format") or default_format - - model = parameters.get("model") or "gpt-3.5-turbo" - - correct_answer = None - - if inputs and isinstance(inputs, dict) and correct_answer_key: - correct_answer = inputs[correct_answer_key] - - secrets = await SecretsManager.retrieve_secrets() - - openai_api_key = None # secrets.get("OPENAI_API_KEY") - anthropic_api_key = None # secrets.get("ANTHROPIC_API_KEY") - openrouter_api_key = None # secrets.get("OPENROUTER_API_KEY") - cohere_api_key = None # secrets.get("COHERE_API_KEY") - azure_api_key = None # secrets.get("AZURE_API_KEY") - groq_api_key = None # secrets.get("GROQ_API_KEY") - - for secret in secrets: - if secret.get("kind") == "provider_key": - secret_data = secret.get("data", {}) - if secret_data.get("kind") == "openai": - provider_data = secret_data.get("provider", {}) - openai_api_key = provider_data.get("key") or openai_api_key - if secret_data.get("kind") == "anthropic": - provider_data = secret_data.get("provider", {}) - anthropic_api_key = ( - provider_data.get("key") or anthropic_api_key - ) - if secret_data.get("kind") == "openrouter": - provider_data = secret_data.get("provider", {}) - openrouter_api_key = ( - provider_data.get("key") or openrouter_api_key - ) - if secret_data.get("kind") == "cohere": - provider_data = secret_data.get("provider", {}) - cohere_api_key = provider_data.get("key") or cohere_api_key - if secret_data.get("kind") == "azure": - provider_data = secret_data.get("provider", {}) - azure_api_key = provider_data.get("key") or azure_api_key - if secret_data.get("kind") == "groq": - provider_data = secret_data.get("provider", {}) - groq_api_key = provider_data.get("key") or groq_api_key - - threshold = parameters.get("threshold") or 0.5 - - score = None - success = None - - litellm.openai_key = openai_api_key - litellm.anthropic_key = anthropic_api_key - litellm.openrouter_key = openrouter_api_key - litellm.cohere_key = cohere_api_key - litellm.azure_key = azure_api_key - litellm.groq_key = groq_api_key - - context: Dict[str, Any] = dict() - - if parameters: - context.update( - **{ - "parameters": parameters, - } - ) - - if correct_answer: - context.update( - **{ - "ground_truth": correct_answer, - "correct_answer": correct_answer, - "reference": correct_answer, - } - ) - - if outputs: - context.update( - **{ - "prediction": outputs, - "outputs": outputs, - } - ) - - if inputs: - context.update(**inputs) - context.update( - **{ - "inputs": inputs, - } - ) - - formatted_prompt_template = [ - { - "role": message["role"], - "content": _format_with_template( - content=message["content"], - format=template_format, - kwargs=context, - ), - } - for message in prompt_template - ] - - response = await litellm.acompletion( - model=model, - messages=formatted_prompt_template, - temperature=0.01, - ) - outputs = response.choices[0].message.content.strip() - try: - score = float(outputs) - - success = score >= threshold - - return EvaluatorOutputInterface( - outputs={"score": score, "success": success}, - ) - except ValueError: - # if the output is not a float, we try to extract a float from the text - match = re.search(r"[-+]?\d*\.\d+|\d+", outputs) - if match: - score = float(match.group()) - return EvaluatorOutputInterface(outputs={"score": score}) - else: - raise ValueError(f"Could not parse output as float: {outputs}") - except Exception as e: - raise RuntimeError(f"Evaluation failed: {str(e)}") - elif ( - input.settings.get("version") == "2" + input.settings.get("version", "1") == "2" ) and ( # this check is used when running in the background (celery) type(input.settings.get("prompt_template", "")) is not str ): # this check is used when running in the frontend (since in that case we'll alway have version 2) @@ -1134,8 +507,7 @@ async def ai_critique(input: EvaluatorInputInterface) -> EvaluatorOutputInterfac model="gpt-3.5-turbo", messages=messages, temperature=0.8 ) evaluation_output = response.choices[0].message.content.strip() - - return {"outputs": {"score": float(evaluation_output)}} + return {"outputs": {"score": evaluation_output}} async def auto_starts_with( @@ -1154,7 +526,7 @@ async def auto_starts_with( **{"inputs": inputs, "settings": settings_values} ) ) - return Result(type="bool", value=response["outputs"]["success"]) + return Result(type="text", value=response["outputs"]["success"]) except Exception as e: # pylint: disable=broad-except return Result( type="error", @@ -1637,7 +1009,7 @@ async def rag_faithfulness( ) if None in [question_val, answer_val, contexts_val]: - log.warn( + log.error( f"Missing trace field ? {['question', question_val is None, 'answer', answer_val is None, 'context', contexts_val is None]}" ) @@ -1750,7 +1122,7 @@ async def rag_context_relevancy( ) if None in [question_val, answer_val, contexts_val]: - log.warn( + log.error( f"Missing trace field ? {['question', question_val is None, 'answer', answer_val is None, 'context', contexts_val is None]}" ) @@ -1843,7 +1215,7 @@ async def auto_levenshtein_distance( ) ) if "success" in response["outputs"]: - return Result(type="bool", value=response["outputs"]["success"]) + return Result(type="number", value=response["outputs"]["success"]) return Result(type="number", value=response["outputs"]["score"]) except ValueError as e: @@ -1928,8 +1300,6 @@ async def semantic_similarity( float: the semantic similarity score """ - correct_answer_key = input.settings.get("correct_answer_key", "correct_answer") - openai_api_key = input.credentials.get("OPENAI_API_KEY", None) if not openai_api_key: raise HTTPException( @@ -1948,8 +1318,8 @@ async def encode(text: str): def cosine_similarity(output_vector: array, correct_answer_vector: array) -> float: return np.dot(output_vector, correct_answer_vector) - output_vector = await encode(input.inputs.get("prediction", "")) - correct_answer_vector = await encode(input.inputs.get(correct_answer_key, "")) + output_vector = await encode(input.inputs["prediction"]) + correct_answer_vector = await encode(input.inputs["ground_truth"]) similarity_score = cosine_similarity(output_vector, correct_answer_vector) return {"outputs": {"score": similarity_score}} @@ -2061,7 +1431,7 @@ async def evaluate( type="error", value=None, error=Error( - message=f"Error occurred while running {evaluator_key} evaluation. ", + message="Error occurred while running {evaluator_key} evaluation. ", stacktrace=str(exc), ), ) diff --git a/api/oss/src/services/llm_apps_service.py b/api/oss/src/services/llm_apps_service.py index b1d8ab5995..fd6538b314 100644 --- a/api/oss/src/services/llm_apps_service.py +++ b/api/oss/src/services/llm_apps_service.py @@ -1,17 +1,19 @@ +from typing import Any, Dict, List, Optional +from datetime import datetime import json import asyncio import traceback + import aiohttp -from datetime import datetime -from typing import Any, Dict, List, Optional from oss.src.utils.logging import get_module_logger from oss.src.utils import common from oss.src.services import helpers from oss.src.services.auth_helper import sign_secret_token +from oss.src.models.shared_models import InvokationResult, Result, Error from oss.src.services.db_manager import get_project_by_id + from oss.src.apis.fastapi.tracing.utils import make_hash_id -from oss.src.models.shared_models import InvokationResult, Result, Error log = get_module_logger(__name__) @@ -37,7 +39,6 @@ def extract_result_from_response(response: dict): value = None latency = None cost = None - tokens = None try: # Validate input @@ -75,9 +76,6 @@ def extract_result_from_response(response: dict): cost = get_nested_value( trace_tree, ["metrics", "acc", "costs", "total"] ) - tokens = get_nested_value( - trace_tree, ["metrics", "acc", "tokens", "total"] - ) # Handle version 2.0 response elif response.get("version") == "2.0": @@ -86,16 +84,14 @@ def extract_result_from_response(response: dict): value["data"] = str(value.get("data")) if "trace" in response: - latency = response["trace"].get("latency", None) - cost = response["trace"].get("cost", None) - tokens = response["trace"].get("tokens", None) + latency = response["trace"].get("latency") + cost = response["trace"].get("cost") # Handle generic response (neither 2.0 nor 3.0) else: value = {"data": str(response.get("message", ""))} - latency = response.get("latency", None) - cost = response.get("cost", None) - tokens = response.get("tokens", None) + latency = response.get("latency") + cost = response.get("cost") # Determine the type of 'value' (either 'text' or 'object') kind = "text" if isinstance(value, str) else "object" @@ -120,7 +116,7 @@ def extract_result_from_response(response: dict): value = {"error": f"Unexpected error: {e}"} kind = "error" - return value, kind, cost, tokens, latency + return value, kind, cost, latency async def make_payload( @@ -189,6 +185,7 @@ async def make_payload( payload["messages"] = messages except Exception as e: # pylint: disable=broad-exception-caught log.warn(f"Error making payload: {e}") + # log.debug(f"Exception details: {traceback.format_exc()}") payload["inputs"] = inputs @@ -202,7 +199,6 @@ async def invoke_app( openapi_parameters: List[Dict], user_id: str, project_id: str, - scenario_id: Optional[str] = None, **kwargs, ) -> InvokationResult: """ @@ -248,14 +244,7 @@ async def invoke_app( app_response = {} try: - log.info( - "Invoking application...", - scenario_id=scenario_id, - testcase_id=( - datapoint["testcase_id"] if "testcase_id" in datapoint else None - ), - url=url, - ) + # log.info("Invoking workflow...", url=url) response = await client.post( url, json=payload, @@ -265,23 +254,11 @@ async def invoke_app( app_response = await response.json() response.raise_for_status() - ( - value, - kind, - cost, - tokens, - latency, - ) = extract_result_from_response(app_response) + value, kind, cost, latency = extract_result_from_response(app_response) trace_id = app_response.get("trace_id", None) span_id = app_response.get("span_id", None) - log.info( - "Invoked application. ", - scenario_id=scenario_id, - trace_id=trace_id, - ) - return InvokationResult( result=Result( type=kind, @@ -290,7 +267,6 @@ async def invoke_app( ), latency=latency, cost=cost, - tokens=tokens, trace_id=trace_id, span_id=span_id, ) @@ -342,7 +318,6 @@ async def run_with_retry( openapi_parameters: List[Dict], user_id: str, project_id: str, - scenario_id: Optional[str] = None, **kwargs, ) -> InvokationResult: """ @@ -366,7 +341,9 @@ async def run_with_retry( references = kwargs.get("references", None) links = kwargs.get("links", None) - # hash_id = make_hash_id(references=references, links=links) + + hash_id = make_hash_id(references=references, links=links) + # log.debug("generating invocation with hash_id", hash_id=hash_id) retries = 0 last_exception = None @@ -379,7 +356,6 @@ async def run_with_retry( openapi_parameters, user_id, project_id, - scenario_id, **kwargs, ) return result @@ -419,7 +395,6 @@ async def batch_invoke( rate_limit_config: Dict, user_id: str, project_id: str, - scenarios: Optional[List[Dict]] = None, **kwargs, ) -> List[InvokationResult]: """ @@ -514,7 +489,6 @@ async def batch_invoke( openapi_parameters, user_id, project_id, - scenarios[index].get("id") if scenarios else None, **kwargs, ) ) diff --git a/api/oss/src/services/organization_service.py b/api/oss/src/services/organization_service.py index 030ce6bd3f..427279fd85 100644 --- a/api/oss/src/services/organization_service.py +++ b/api/oss/src/services/organization_service.py @@ -1,6 +1,5 @@ import secrets from datetime import datetime, timedelta, timezone -from urllib.parse import quote from fastapi import HTTPException @@ -95,29 +94,16 @@ async def send_invitation_email( bool: True if the email was sent successfully, False otherwise. """ - token_param = quote(token, safe="") - email_param = quote(email, safe="") - org_param = quote(str(organization_id), safe="") - workspace_param = quote(str(workspace_id), safe="") - project_param = quote(project_id, safe="") - - invite_link = ( - f"{env.AGENTA_WEB_URL}/auth" - f"?token={token_param}" - f"&email={email_param}" - f"&organization_id={org_param}" - f"&workspace_id={workspace_param}" - f"&project_id={project_param}" - ) + invitation_link = f"""{env.AGENTA_WEB_URL}/auth?token={token}&org_id={organization_id}&project_id={project_id}&workspace_id={workspace_id}&email={email}""" if not env.SENDGRID_API_KEY: - return invite_link + return invitation_link html_template = email_service.read_email_template("./templates/send_email.html") html_content = html_template.format( username_placeholder=user.username, action_placeholder="invited you to join", workspace_placeholder="their organization", - call_to_action=f"""Click the link below to accept the invitation:


Accept Invitation""", + call_to_action=f"""Click the link below to accept the invitation:


Accept Invitation""", ) if not env.AGENTA_SEND_EMAIL_FROM_ADDRESS: @@ -233,7 +219,7 @@ async def resend_user_organization_invite( Args: user_uid (str): The user uid. - organization_id (str): The ID of the organization to invite the user to. + org_id (str): The ID of the organization to invite the user to. project_id (str): The ID of the project that belongs to the workspace/organization. payload (ResendInviteRequest): The payload containing the email address of the user to invite. """ @@ -297,8 +283,10 @@ async def accept_organization_invitation( try: user_exists = await db_manager.get_user_with_email(email=email) - if user_exists is None: - raise HTTPException(status_code=400, detail="User does not exist") + if user_exists is not None: + raise HTTPException( + status_code=400, detail="User is already a member of the organization" + ) project_db = await db_manager.get_project_by_organization_id( organization_id=organization_id diff --git a/api/oss/src/services/variants_manager.py b/api/oss/src/services/variants_manager.py index f9d8c0d5bb..b9f7d3337b 100644 --- a/api/oss/src/services/variants_manager.py +++ b/api/oss/src/services/variants_manager.py @@ -6,9 +6,7 @@ from oss.src.utils.logging import get_module_logger from oss.src.services import db_manager -from oss.src.services import app_manager from oss.src.utils.exceptions import suppress -from oss.src.models.shared_models import AppType from oss.src.services.db_manager import ( AppDB, DeploymentDB, @@ -22,7 +20,7 @@ get_user_with_id, fetch_base_by_id, fetch_app_by_id, - fetch_app_by_name, + fetch_app_by_name_and_parameters, fetch_app_variant_by_id, fetch_app_variant_revision_by_id, fetch_app_variant_by_config_name_and_appid, @@ -35,11 +33,6 @@ add_variant_from_base_and_config, update_variant_parameters, deploy_to_environment, - create_new_variant_base, - create_deployment, - update_base, - create_new_app_variant, - create_new_config, ) @@ -117,7 +110,7 @@ async def _fetch_app( app_id=app_id.hex, ) elif app_name: - app = await fetch_app_by_name( + app = await fetch_app_by_name_and_parameters( project_id=project_id, app_name=app_name, ) @@ -180,7 +173,7 @@ async def _fetch_variant( and variant_ref.slug ): if not application_ref.id and application_ref.slug: - app = await fetch_app_by_name( + app = await fetch_app_by_name_and_parameters( project_id=project_id, app_name=application_ref.slug, ) @@ -326,7 +319,7 @@ async def _fetch_environment( and environment_ref.slug ): if not application_ref.id and application_ref.slug: - app = await fetch_app_by_name( + app = await fetch_app_by_name_and_parameters( project_id=project_id, app_name=application_ref.slug, ) @@ -375,69 +368,6 @@ async def _fetch_environment( return app_environment, app_environment_revision -async def add_variant_from_base_and_config_v2( - base_db, - new_config_name: str, - parameters: Dict[str, Any], - user_uid: str, - project_id: str, - commit_message: Optional[str] = None, -): - """ - Create a new variant from base and config without requiring previous variants. - - This is a replacement for add_variant_from_base_and_config that doesn't depend - on existing variants, making it suitable for creating the first variant for a base. - - Args: - base_db: The base to create the variant from - new_config_name (str): Name for the new variant/config - parameters (Dict[str, Any]): Parameters for the variant - user_uid (str): User ID creating the variant - project_id (str): Project ID - commit_message (Optional[str]): Commit message - - Returns: - AppVariantDB: The created variant - """ - try: - # Create config (always empty initially for v0, per create_new_app_variant requirement) - config = await create_new_config( - config_name=new_config_name, - parameters={}, # Always empty for create_new_app_variant for v0 - ) - - user = await get_user_with_id(user_id=user_uid) - app = await fetch_app_by_id(app_id=str(base_db.app_id)) - - app_variant = await create_new_app_variant( - app=app, - user=user, - variant_name=new_config_name, - project_id=project_id, - base=base_db, - config=config, - base_name=base_db.base_name, - commit_message=commit_message, - ) - - # If we have parameters, we create a new revision (v1) with the parameters - if parameters: - app_variant = await update_variant_parameters( - app_variant_id=str(app_variant.id), - parameters=parameters, - user_uid=user_uid, - project_id=project_id, - commit_message=commit_message, - ) - - return app_variant - - except Exception as e: - log.error(f"Failed to create variant from base {base_db.id}: {str(e)}") - raise - - async def _create_variant( project_id: str, user_id: str, @@ -460,7 +390,7 @@ async def _create_variant( app_variant = None with suppress(): - app_variant = await add_variant_from_base_and_config_v2( + app_variant = await add_variant_from_base_and_config( base_db=variant_base, new_config_name=slug, parameters=params, @@ -520,76 +450,6 @@ async def _update_environment( ) -async def _get_app_service_url(app: AppDB) -> Optional[str]: - """Get service URL for an app. - - Args: - app (AppDB): The app to get service URL for - - Returns: - Optional[str]: Service URL for SERVICE apps, None for CUSTOM apps - """ - if not app.app_type: - # Default to CUSTOM if no app_type is set - return None - - if app.app_type in [AppType.CHAT_SERVICE, AppType.COMPLETION_SERVICE]: - # SERVICE apps have service URLs - return app_manager.get_service_url_from_template_key(app.app_type) - else: - # CUSTOM apps and legacy types don't have service URLs - return None - - -async def _create_first_base_for_app( - app: AppDB, - project_id: str, - user_id: str, - base_name: str = "default", -) -> Optional[UUID]: - """Create the first base for an app that has no bases. - - Args: - app (AppDB): The app to create a base for - project_id (str): Project ID - user_id (str): User ID creating the base - base_name (str): Name for the base (default: "default") - - Returns: - Optional[UUID]: The ID of the created base, or None if creation failed - """ - try: - service_url = await _get_app_service_url(app) - - db_base = await create_new_variant_base( - app=app, - project_id=project_id, - base_name=base_name, - ) - - # Always create deployment (SERVICE apps get service URL, CUSTOM apps get empty URI) - deployment_uri = service_url if service_url else "" - - deployment = await create_deployment( - app_id=str(app.id), - project_id=project_id, - uri=deployment_uri, - ) - - await update_base( - str(db_base.id), - deployment_id=deployment.id, - ) - - return db_base.id - - except Exception as e: - log.error(f"Failed to create first base for app {app.app_name}: {str(e)}") - return None - - return None - - # - CREATE @@ -599,14 +459,6 @@ async def add_config( application_ref: ReferenceDTO, user_id: str, ) -> Optional[ConfigDTO]: - if not variant_ref.slug: - log.error("Variant slug is required for creating a config") - return None - - if not project_id or not user_id: - log.error("Project ID and user ID are required for creating a config") - return None - app = await _fetch_app( project_id=project_id, app_id=application_ref.id, @@ -614,7 +466,6 @@ async def add_config( ) if not app: - log.error(f"App not found for application_ref: {application_ref}") return None # --> FETCHING: bases @@ -627,19 +478,12 @@ async def add_config( ) if not bases or not isinstance(bases, list) or len(bases) < 1: - # No bases exist for this app - create the first base based on app type - base_id = await _create_first_base_for_app( - app=app, - project_id=project_id, - user_id=user_id, - base_name="default", - ) + return None - if not base_id: - log.error(f"Failed to create first base for app {app.app_name}") - return None - else: - base_id = bases[0].id # use the first available base + base_id = bases[0].id # needs to be changed to use the 'default base' + + if not variant_ref.slug: + return None variant_slug, variant_version = await _create_variant( project_id=project_id, @@ -650,8 +494,7 @@ async def add_config( commit_message=variant_ref.commit_message, ) - if variant_slug is None or variant_version is None: - log.error("Failed to create variant - variant_slug or variant_version is None") + if not (variant_slug and variant_version): return None variant_ref = ReferenceDTO( @@ -934,7 +777,7 @@ async def fork_config_by_variant_ref( slug=( variant_ref.slug if variant_ref.slug - else app_variant.config_name + "_" + uuid4().hex[-12:] + else app_variant.config_name + "_" + uuid4().hex[20:] ), params=app_variant_revision.config_parameters, base_id=app_variant.base_id, diff --git a/api/oss/src/tasks/__init__.py b/api/oss/src/tasks/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/tasks/evaluations/__init__.py b/api/oss/src/tasks/evaluations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/src/tasks/evaluations/batch.py b/api/oss/src/tasks/evaluations/batch.py deleted file mode 100644 index 324ed74e49..0000000000 --- a/api/oss/src/tasks/evaluations/batch.py +++ /dev/null @@ -1,258 +0,0 @@ -from typing import Dict, List, Optional -from uuid import UUID -import asyncio -import traceback -from json import dumps - -from celery import shared_task, states, Task - -from fastapi import Request - -from oss.src.utils.helpers import parse_url, get_slug_from_name_and_id -from oss.src.utils.logging import get_module_logger -from oss.src.utils.common import is_ee -from oss.src.services.auth_helper import sign_secret_token -from oss.src.services import llm_apps_service -from oss.src.models.shared_models import InvokationResult -from oss.src.services.db_manager import ( - fetch_app_by_id, - fetch_app_variant_by_id, - fetch_app_variant_revision_by_id, - get_deployment_by_id, - get_project_by_id, -) -from oss.src.core.secrets.utils import get_llm_providers_secrets - -if is_ee(): - from ee.src.utils.entitlements import check_entitlements, Counter - -from oss.src.dbs.postgres.queries.dbes import ( - QueryArtifactDBE, - QueryVariantDBE, - QueryRevisionDBE, -) -from oss.src.dbs.postgres.testcases.dbes import ( - TestcaseBlobDBE, -) -from oss.src.dbs.postgres.testsets.dbes import ( - TestsetArtifactDBE, - TestsetVariantDBE, - TestsetRevisionDBE, -) -from oss.src.dbs.postgres.workflows.dbes import ( - WorkflowArtifactDBE, - WorkflowVariantDBE, - WorkflowRevisionDBE, -) - -from oss.src.dbs.postgres.tracing.dao import TracingDAO -from oss.src.dbs.postgres.blobs.dao import BlobsDAO -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO - -from oss.src.core.tracing.service import TracingService -from oss.src.core.queries.service import QueriesService -from oss.src.core.testcases.service import TestcasesService -from oss.src.core.testsets.service import TestsetsService -from oss.src.core.testsets.service import SimpleTestsetsService -from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.evaluators.service import EvaluatorsService -from oss.src.core.evaluators.service import SimpleEvaluatorsService -from oss.src.core.evaluations.service import EvaluationsService -from oss.src.core.annotations.service import AnnotationsService - -# from oss.src.apis.fastapi.tracing.utils import make_hash_id -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.apis.fastapi.testsets.router import SimpleTestsetsRouter -from oss.src.apis.fastapi.evaluators.router import SimpleEvaluatorsRouter -from oss.src.apis.fastapi.annotations.router import AnnotationsRouter - -from oss.src.core.annotations.types import ( - AnnotationOrigin, - AnnotationKind, - AnnotationChannel, -) -from oss.src.apis.fastapi.annotations.models import ( - AnnotationCreate, - AnnotationCreateRequest, -) - -from oss.src.core.evaluations.types import ( - EvaluationStatus, - EvaluationRun, - EvaluationRunCreate, - EvaluationRunEdit, - EvaluationScenarioCreate, - EvaluationScenarioEdit, - EvaluationResultCreate, - EvaluationMetricsCreate, -) - -from oss.src.core.shared.dtos import Reference -from oss.src.core.tracing.dtos import ( - Filtering, - Windowing, - Formatting, - Format, - Focus, - TracingQuery, -) -from oss.src.core.workflows.dtos import ( - WorkflowServiceRequestData, - WorkflowServiceResponseData, - WorkflowServiceRequest, - WorkflowServiceResponse, - WorkflowServiceInterface, - WorkflowRevisionData, - WorkflowRevision, - WorkflowVariant, - Workflow, -) - -from oss.src.core.queries.dtos import ( - QueryRevision, - QueryVariant, - Query, -) - -from oss.src.core.workflows.dtos import Tree - -from oss.src.core.evaluations.utils import get_metrics_keys_from_schema - - -log = get_module_logger(__name__) - - -# DBS -------------------------------------------------------------------------- - -tracing_dao = TracingDAO() - -testcases_dao = BlobsDAO( - BlobDBE=TestcaseBlobDBE, -) - -queries_dao = GitDAO( - ArtifactDBE=QueryArtifactDBE, - VariantDBE=QueryVariantDBE, - RevisionDBE=QueryRevisionDBE, -) - -testsets_dao = GitDAO( - ArtifactDBE=TestsetArtifactDBE, - VariantDBE=TestsetVariantDBE, - RevisionDBE=TestsetRevisionDBE, -) - -workflows_dao = GitDAO( - ArtifactDBE=WorkflowArtifactDBE, - VariantDBE=WorkflowVariantDBE, - RevisionDBE=WorkflowRevisionDBE, -) - -evaluations_dao = EvaluationsDAO() - -# CORE ------------------------------------------------------------------------- - -tracing_service = TracingService( - tracing_dao=tracing_dao, -) - -queries_service = QueriesService( - queries_dao=queries_dao, -) - -testcases_service = TestcasesService( - testcases_dao=testcases_dao, -) - -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) - -simple_testsets_service = SimpleTestsetsService( - testsets_service=testsets_service, -) - -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) - -workflows_service = WorkflowsService( - workflows_dao=workflows_dao, -) - -evaluators_service = EvaluatorsService( - workflows_service=workflows_service, -) - -simple_evaluators_service = SimpleEvaluatorsService( - evaluators_service=evaluators_service, -) - -evaluations_service = EvaluationsService( - evaluations_dao=evaluations_dao, - tracing_service=tracing_service, - queries_service=queries_service, - testsets_service=testsets_service, - evaluators_service=evaluators_service, -) - -# APIS ------------------------------------------------------------------------- - -tracing_router = TracingRouter( - tracing_service=tracing_service, -) - -simple_testsets_router = SimpleTestsetsRouter( - simple_testsets_service=simple_testsets_service, -) # TODO: REMOVE/REPLACE ONCE TRANSFER IS MOVED TO 'core' - -simple_evaluators_router = SimpleEvaluatorsRouter( - simple_evaluators_service=simple_evaluators_service, -) # TODO: REMOVE/REPLACE ONCE TRANSFER IS MOVED TO 'core' - -annotations_service = AnnotationsService( - tracing_router=tracing_router, - evaluators_service=evaluators_service, - simple_evaluators_service=simple_evaluators_service, -) - -annotations_router = AnnotationsRouter( - annotations_service=annotations_service, -) # TODO: REMOVE/REPLACE ONCE ANNOTATE IS MOVED TO 'core' - -# ------------------------------------------------------------------------------ - - -@shared_task( - name="src.tasks.evaluations.batch.evaluate_testsets", - queue="src.tasks.evaluations.batch.evaluate_testsets", - bind=True, -) -def evaluate_testsets( - self, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, -): - pass - - -@shared_task( - name="src.tasks.evaluations.batch.evaluate_queries", - queue="src.tasks.evaluations.batch.evaluate_queries", - bind=True, -) -def evaluate_queries( - self: Task, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, -): - pass diff --git a/api/oss/src/tasks/evaluations/legacy.py b/api/oss/src/tasks/evaluations/legacy.py deleted file mode 100644 index d3bc69f9cc..0000000000 --- a/api/oss/src/tasks/evaluations/legacy.py +++ /dev/null @@ -1,1558 +0,0 @@ -from typing import Dict, List, Optional, Any -from uuid import UUID -from json import dumps -from asyncio import get_event_loop - -from celery import shared_task, states - -from fastapi import Request - -from oss.src.utils.helpers import parse_url, get_slug_from_name_and_id -from oss.src.utils.logging import get_module_logger -from oss.src.utils.common import is_ee -from oss.src.services.auth_helper import sign_secret_token -from oss.src.services import llm_apps_service -from oss.src.models.shared_models import InvokationResult -from oss.src.services.db_manager import ( - fetch_app_by_id, - fetch_app_variant_by_id, - fetch_app_variant_revision_by_id, - fetch_evaluator_config, - get_deployment_by_id, - get_project_by_id, -) -from oss.src.core.secrets.utils import get_llm_providers_secrets - -if is_ee(): - from ee.src.utils.entitlements import check_entitlements, Counter - -from oss.src.dbs.postgres.queries.dbes import ( - QueryArtifactDBE, - QueryVariantDBE, - QueryRevisionDBE, -) -from oss.src.dbs.postgres.testcases.dbes import ( - TestcaseBlobDBE, -) -from oss.src.dbs.postgres.testsets.dbes import ( - TestsetArtifactDBE, - TestsetVariantDBE, - TestsetRevisionDBE, -) -from oss.src.dbs.postgres.workflows.dbes import ( - WorkflowArtifactDBE, - WorkflowVariantDBE, - WorkflowRevisionDBE, -) - -from oss.src.dbs.postgres.tracing.dao import TracingDAO -from oss.src.dbs.postgres.blobs.dao import BlobsDAO -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO - -from oss.src.core.tracing.service import TracingService -from oss.src.core.queries.service import QueriesService -from oss.src.core.testcases.service import TestcasesService -from oss.src.core.testsets.service import TestsetsService, SimpleTestsetsService -from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.evaluators.service import EvaluatorsService -from oss.src.core.evaluators.service import SimpleEvaluatorsService -from oss.src.core.evaluations.service import EvaluationsService -from oss.src.core.annotations.service import AnnotationsService - -from oss.src.apis.fastapi.tracing.utils import make_hash_id -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.apis.fastapi.testsets.router import SimpleTestsetsRouter -from oss.src.apis.fastapi.evaluators.router import SimpleEvaluatorsRouter -from oss.src.apis.fastapi.annotations.router import AnnotationsRouter - -from oss.src.core.annotations.types import ( - AnnotationOrigin, - AnnotationKind, - AnnotationChannel, -) -from oss.src.apis.fastapi.annotations.models import ( - AnnotationCreate, - AnnotationCreateRequest, -) - -from oss.src.core.evaluations.types import ( - EvaluationStatus, - EvaluationRunDataMappingStep, - EvaluationRunDataMappingColumn, - EvaluationRunDataMapping, - EvaluationRunDataStepInput, - EvaluationRunDataStep, - EvaluationRunData, - EvaluationRunFlags, - EvaluationRun, - EvaluationRunCreate, - EvaluationRunEdit, - EvaluationScenarioCreate, - EvaluationScenarioEdit, - EvaluationResultCreate, - EvaluationMetricsCreate, -) - -from oss.src.core.shared.dtos import Reference -from oss.src.core.workflows.dtos import ( - WorkflowServiceRequestData, - WorkflowServiceResponseData, - WorkflowServiceRequest, - WorkflowServiceResponse, - WorkflowServiceInterface, - WorkflowRevisionData, - WorkflowRevision, - WorkflowVariant, - Workflow, -) - -from oss.src.core.queries.dtos import ( - QueryRevision, - QueryVariant, - Query, -) - -from oss.src.core.evaluations.utils import ( - get_metrics_keys_from_schema, - fetch_trace, -) - - -log = get_module_logger(__name__) - - -# DBS -------------------------------------------------------------------------- - -tracing_dao = TracingDAO() - -testcases_dao = BlobsDAO( - BlobDBE=TestcaseBlobDBE, -) - -queries_dao = GitDAO( - ArtifactDBE=QueryArtifactDBE, - VariantDBE=QueryVariantDBE, - RevisionDBE=QueryRevisionDBE, -) - -testsets_dao = GitDAO( - ArtifactDBE=TestsetArtifactDBE, - VariantDBE=TestsetVariantDBE, - RevisionDBE=TestsetRevisionDBE, -) - -workflows_dao = GitDAO( - ArtifactDBE=WorkflowArtifactDBE, - VariantDBE=WorkflowVariantDBE, - RevisionDBE=WorkflowRevisionDBE, -) - -evaluations_dao = EvaluationsDAO() - -# CORE ------------------------------------------------------------------------- - -tracing_service = TracingService( - tracing_dao=tracing_dao, -) - -queries_service = QueriesService( - queries_dao=queries_dao, -) - -testcases_service = TestcasesService( - testcases_dao=testcases_dao, -) - -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) - -simple_testsets_service = SimpleTestsetsService( - testsets_service=testsets_service, -) - -workflows_service = WorkflowsService( - workflows_dao=workflows_dao, -) - -evaluators_service = EvaluatorsService( - workflows_service=workflows_service, -) - -simple_evaluators_service = SimpleEvaluatorsService( - evaluators_service=evaluators_service, -) - -evaluations_service = EvaluationsService( - evaluations_dao=evaluations_dao, - tracing_service=tracing_service, - queries_service=queries_service, - testsets_service=testsets_service, - evaluators_service=evaluators_service, -) - -# APIS ------------------------------------------------------------------------- - -tracing_router = TracingRouter( - tracing_service=tracing_service, -) - -simple_testsets_router = SimpleTestsetsRouter( - simple_testsets_service=simple_testsets_service, -) # TODO: REMOVE/REPLACE ONCE TRANSFER IS MOVED TO 'core' - -simple_evaluators_router = SimpleEvaluatorsRouter( - simple_evaluators_service=simple_evaluators_service, -) # TODO: REMOVE/REPLACE ONCE TRANSFER IS MOVED TO 'core' - -annotations_service = AnnotationsService( - tracing_router=tracing_router, - evaluators_service=evaluators_service, - simple_evaluators_service=simple_evaluators_service, -) - -annotations_router = AnnotationsRouter( - annotations_service=annotations_service, -) # TODO: REMOVE/REPLACE ONCE ANNOTATE IS MOVED TO 'core' - -# ------------------------------------------------------------------------------ - - -async def setup_evaluation( - *, - project_id: UUID, - user_id: UUID, - # - name: Optional[str] = None, - description: Optional[str] = None, - # - testset_id: Optional[str] = None, - query_id: Optional[str] = None, - # - revision_id: Optional[str] = None, - # - autoeval_ids: Optional[List[str]] = None, -) -> Optional[EvaluationRun]: - request = Request(scope={"type": "http", "http_version": "1.1", "scheme": "http"}) - request.state.project_id = project_id - request.state.user_id = user_id - - run = None - - # -------------------------------------------------------------------------- - log.info("[SETUP] ", project_id=project_id, user_id=user_id) - log.info("[TESTSET] ", ids=[testset_id]) - log.info("[QUERY] ", ids=[query_id]) - log.info("[INVOCATON] ", ids=[revision_id]) - log.info("[ANNOTATION]", ids=autoeval_ids) - # -------------------------------------------------------------------------- - - try: - # create evaluation run ------------------------------------------------ - run_create = EvaluationRunCreate( - name=name, - description=description, - # - flags=( - EvaluationRunFlags( - is_closed=None, - is_live=True, - is_active=True, - ) - if query_id - else None - ), - # - status=EvaluationStatus.PENDING, - ) - - run = await evaluations_service.create_run( - project_id=project_id, - user_id=user_id, - # - run=run_create, - ) - - assert run is not None, "Failed to create evaluation run." - # ---------------------------------------------------------------------- - - # just-in-time transfer of testset ------------------------------------- - testset_input_steps_keys = list() - - testset_references = dict() - testset = None - - if testset_id: - testset_ref = Reference(id=UUID(testset_id)) - - testset_response = await simple_testsets_router.transfer_simple_testset( - request=request, - testset_id=UUID(testset_id), - ) - - assert ( - testset_response.count != 0 - ), f"Testset with id {testset_id} not found!" - - testset = testset_response.testset - testcases = testset.data.testcases - - testset_references["artifact"] = testset_ref - - testset_input_steps_keys.append( - get_slug_from_name_and_id(testset.name, testset.id) - ) - # ---------------------------------------------------------------------- - - # fetch query ---------------------------------------------------------- - query_input_steps_keys = list() - - query_references = dict() - query_revision = None - - if query_id: - query_ref = Reference(id=UUID(query_id)) - - query = await queries_service.fetch_query( - project_id=project_id, - # - query_ref=query_ref, - ) - - assert query is not None, f"Query with id {query_id} not found!" - - query_references["artifact"] = Reference( - id=query.id, - slug=query.slug, - ) - - query_revision = await queries_service.fetch_query_revision( - project_id=project_id, - # - query_ref=query_ref, - ) - - assert ( - query_revision is not None - ), f"Query revision with id {query_id} not found!" - - query_revision_ref = Reference( - id=query_revision.id, - slug=query_revision.slug, - ) - - query_references["revision"] = query_revision_ref - - query_variant = await queries_service.fetch_query_variant( - project_id=project_id, - query_variant_ref=Reference( - id=query_revision.variant_id, - ), - ) - - assert ( - query_variant is not None - ), f"Query variant with id {query_revision.variant_id} not found!" - - query_variant_ref = Reference( - id=query_variant.id, - slug=query_variant.slug, - ) - - query_references["variant"] = query_variant_ref - - query_input_steps_keys.append(query_revision.slug) - # ---------------------------------------------------------------------- - - # fetch application ---------------------------------------------------- - invocation_steps_keys = list() - - application_references = dict() - - if revision_id: - revision = await fetch_app_variant_revision_by_id(revision_id) - - assert ( - revision is not None - ), f"App revision with id {revision_id} not found!" - - application_references["revision"] = Reference( - id=UUID(str(revision.id)), - ) - - variant = await fetch_app_variant_by_id(str(revision.variant_id)) - - assert ( - variant is not None - ), f"App variant with id {revision.variant_id} not found!" - - application_references["variant"] = Reference( - id=UUID(str(variant.id)), - ) - - app = await fetch_app_by_id(str(variant.app_id)) - - assert app is not None, f"App with id {variant.app_id} not found!" - - application_references["artifact"] = Reference( - id=UUID(str(app.id)), - ) - - deployment = await get_deployment_by_id(str(revision.base.deployment_id)) - - assert ( - deployment is not None - ), f"Deployment with id {revision.base.deployment_id} not found!" - - uri = parse_url(url=deployment.uri) - - assert uri is not None, f"Invalid URI for deployment {deployment.id}!" - - revision_parameters = revision.config_parameters - - assert ( - revision_parameters is not None - ), f"Revision parameters for variant {variant.id} not found!" - - invocation_steps_keys.append( - get_slug_from_name_and_id(app.app_name, revision.id) - ) - # ---------------------------------------------------------------------- - - # fetch evaluators ----------------------------------------------------- - annotation_steps_keys = [] - - if autoeval_ids: - autoeval_configs = [] - - for autoeval_id in autoeval_ids: - autoeval_config = await fetch_evaluator_config(autoeval_id) - - autoeval_configs.append(autoeval_config) - - for autoeval_config in autoeval_configs: - annotation_steps_keys.append( - get_slug_from_name_and_id(autoeval_config.name, autoeval_config.id) - ) - # ---------------------------------------------------------------------- - - # just-in-time transfer of evaluators ---------------------------------- - annotation_metrics_keys = {key: {} for key in annotation_steps_keys} - evaluator_references = dict() - - for jdx, autoeval_id in enumerate(autoeval_ids): - annotation_step_key = annotation_steps_keys[jdx] - - evaluator_response = ( - await simple_evaluators_router.transfer_simple_evaluator( - request=request, - evaluator_id=UUID(autoeval_id), - ) - ) - - evaluator = evaluator_response.evaluator - - assert evaluator is not None, f"Evaluator with id {autoeval_id} not found!" - - evaluator_references[annotation_step_key] = {} - - evaluator_references[annotation_step_key]["artifact"] = Reference( - id=evaluator.id, - slug=evaluator.slug, - ) - - metrics_keys = get_metrics_keys_from_schema( - schema=(evaluator.data.schemas.get("outputs")), - ) - - annotation_metrics_keys[annotation_step_key] = [ - { - "path": metric_key.get("path", "").replace("outputs.", "", 1), - "type": metric_key.get("type", ""), - } - for metric_key in metrics_keys - ] - # ---------------------------------------------------------------------- - - # fetch evaluator workflows -------------------------------------------- - evaluators = dict() - - for annotation_step_key, references in evaluator_references.items(): - evaluators[annotation_step_key] = {} - - workflow_ref = references["artifact"] - - workflow = await workflows_service.fetch_workflow( - project_id=project_id, - # - workflow_ref=workflow_ref, - ) - - evaluators[annotation_step_key]["workflow"] = workflow - - workflow_revision = await workflows_service.fetch_workflow_revision( - project_id=project_id, - # - workflow_ref=workflow_ref, - ) - - assert ( - workflow_revision is not None - ), f"Workflow revision with id {workflow_ref.id} not found!" - - workflow_revision_ref = Reference( - id=workflow_revision.id, - slug=workflow_revision.slug, - ) - - evaluator_references[annotation_step_key][ - "revision" - ] = workflow_revision_ref - - evaluators[annotation_step_key]["revision"] = workflow_revision - - workflow_variant = await workflows_service.fetch_workflow_variant( - project_id=project_id, - workflow_variant_ref=Reference( - id=workflow_revision.variant_id, - ), - ) - - assert ( - workflow_variant is not None - ), f"Workflow variant with id {workflow_revision.variant_id} not found!" - - workflow_variant_ref = Reference( - id=workflow_variant.id, - slug=workflow_variant.slug, - ) - - evaluator_references[annotation_step_key]["variant"] = workflow_variant_ref - - evaluators[annotation_step_key]["variant"] = workflow_variant - - # ---------------------------------------------------------------------- - - # initialize steps/mappings in run ------------------------------------- - testset_input_step = ( - EvaluationRunDataStep( - key=testset_input_steps_keys[0], - type="input", - origin="auto", - references={ - "testset": testset_references["artifact"], - # "testset_variant": - # "testset_revision": - }, - ) - if testset and testset.id - else None - ) - - query_input_step = ( - EvaluationRunDataStep( - key=query_input_steps_keys[0], - type="input", - origin="auto", - references={ - "query": query_references["artifact"], - "query_variant": query_references["variant"], - "query_revision": query_references["revision"], - }, - ) - if query_id - else None - ) - - invocation_step = ( - EvaluationRunDataStep( - key=invocation_steps_keys[0], - type="invocation", - origin="auto", - references={ - "application": application_references["artifact"], - "application_variant": application_references["variant"], - "application_revision": application_references["revision"], - }, - inputs=[ - EvaluationRunDataStepInput( - key=testset_input_steps_keys[0], - ), - ], - ) - if revision_id - else None - ) - - annotation_steps = [ - EvaluationRunDataStep( - key=step_key, - type="annotation", - origin="auto", - references={ - "evaluator": evaluator_references[step_key]["artifact"], - "evaluator_variant": evaluator_references[step_key]["variant"], - "evaluator_revision": evaluator_references[step_key]["revision"], - }, - inputs=( - [ - EvaluationRunDataStepInput( - key=testset_input_steps_keys[0], - ), - EvaluationRunDataStepInput( - key=invocation_steps_keys[0], - ), - ] - if testset_id and revision_id - else [ - EvaluationRunDataStepInput( - key=query_input_steps_keys[0], - ), - ] - ), - ) - for step_key in annotation_steps_keys - ] - - steps: List[EvaluationRunDataStep] = list() - - if testset_id and testset_input_step: - steps.append(testset_input_step) - if query_id and query_input_step: - steps.append(query_input_step) - if revision_id and invocation_step: - steps.append(invocation_step) - - steps.extend(annotation_steps) - - testset_input_mappings = ( - [ - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="testset", - name=key, - ), - step=EvaluationRunDataMappingStep( - key=testset_input_steps_keys[0], - path=f"data.{key}", - ), - ) - for key in testcases[0].data.keys() - ] - if testset_id - else [] - ) - - query_input_mappings = ( - [ - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="query", - name="data", - ), - step=EvaluationRunDataMappingStep( - key=query_input_steps_keys[0], - path="attributes.ag.data", - ), - ) - ] - if query_id - else [] - ) - - invocation_mappings = ( - [ - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="invocation", - name="outputs", - ), - step=EvaluationRunDataMappingStep( - key=step_key, - path="attributes.ag.data.outputs", - ), - ) - for step_key in invocation_steps_keys - ] - if invocation_steps_keys - else [] - ) - - annotation_mappings = [ - EvaluationRunDataMapping( - column=EvaluationRunDataMappingColumn( - kind="annotation", - name=metric_key["path"], - ), - step=EvaluationRunDataMappingStep( - key=step_key, - path=f"attributes.ag.data.outputs{'.' + metric_key['path'] if metric_key['path'] else ''}", - ), - ) - for step_key in annotation_steps_keys - for metric_key in annotation_metrics_keys[step_key] - ] - - mappings: List[EvaluationRunDataMapping] = ( - testset_input_mappings - + query_input_mappings - + invocation_mappings - + annotation_mappings - ) - - run_edit = EvaluationRunEdit( - id=run.id, - # - name=run.name, - description=run.description, - # - flags=run.flags, - tags=run.tags, - meta=run.meta, - # - status=EvaluationStatus.RUNNING, - # - data=EvaluationRunData( - steps=steps, - mappings=mappings, - ), - ) - - run = await evaluations_service.edit_run( - project_id=project_id, - user_id=user_id, - # - run=run_edit, - ) - - assert run, f"Failed to edit evaluation run {run_edit.id}!" - # ---------------------------------------------------------------------- - - log.info("[DONE] ", run_id=run.id) - - except: # pylint: disable=bare-except - if run and run.id: - log.error("[FAIL] ", run_id=run.id, exc_info=True) - - await evaluations_service.delete_run( - project_id=project_id, - # - run_id=run.id, - ) - else: - log.error("[FAIL]", exc_info=True) - - run = None - - return run - - -@shared_task( - name="src.tasks.evaluations.legacy.annotate", - queue="src.tasks.evaluations.legacy.annotate", - bind=True, -) -def annotate( - self, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, - # - testset_id: str, - revision_id: str, - autoeval_ids: Optional[List[str]], - # - run_config: Dict[str, int], -): - """ - Annotates an application revision applied to a testset using auto evaluator(s). - - Args: - self: The task instance. - project_id (str): The ID of the project. - user_id (str): The ID of the user. - run_id (str): The ID of the evaluation run. - testset_id (str): The ID of the testset. - revision_id (str): The ID of the application revision. - autoeval_ids (List[str]): The IDs of the evaluators configurations. - run_config (Dict[str, int]): Configuration for evaluation run. - - Returns: - None - """ - request = Request( - scope={ - "type": "http", - "http_version": "1.1", - "scheme": "http", - } - ) - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - loop = get_event_loop() - - run = None - - try: - # ---------------------------------------------------------------------- - log.info("[SCOPE] ", run_id=run_id, project_id=project_id, user_id=user_id) - log.info("[TESTSET] ", run_id=run_id, ids=[testset_id]) - log.info("[INVOCATON] ", run_id=run_id, ids=[revision_id]) - log.info("[ANNOTATION]", run_id=run_id, ids=autoeval_ids) - # ---------------------------------------------------------------------- - - # fetch project -------------------------------------------------------- - project = loop.run_until_complete( - get_project_by_id( - project_id=str(project_id), - ), - ) - # ---------------------------------------------------------------------- - - # fetch secrets -------------------------------------------------------- - secrets = loop.run_until_complete( - get_llm_providers_secrets( - project_id=str(project_id), - ), - ) - # ---------------------------------------------------------------------- - - # prepare credentials -------------------------------------------------- - secret_token = loop.run_until_complete( - sign_secret_token( - user_id=str(user_id), - project_id=str(project_id), - workspace_id=str(project.workspace_id), - organization_id=str(project.organization_id), - ) - ) - - credentials = f"Secret {secret_token}" - # ---------------------------------------------------------------------- - - # fetch run ------------------------------------------------------------ - run = loop.run_until_complete( - evaluations_service.fetch_run( - project_id=project_id, - # - run_id=run_id, - ) - ) - - assert run, f"Evaluation run with id {run_id} not found!" - - assert run.data, f"Evaluation run with id {run_id} has no data!" - - assert run.data.steps, f"Evaluation run with id {run_id} has no steps!" - - steps = run.data.steps - - invocation_steps = [step for step in steps if step.type == "invocation"] - annotation_steps = [step for step in steps if step.type == "annotation"] - - invocation_steps_keys = [step.key for step in invocation_steps] - annotation_steps_keys = [step.key for step in annotation_steps] - - nof_annotations = len(annotation_steps) - # ---------------------------------------------------------------------- - - # fetch testset -------------------------------------------------------- - testset_response = loop.run_until_complete( - simple_testsets_router.fetch_simple_testset( - request=request, - testset_id=testset_id, - ) - ) - - assert testset_response.count != 0, f"Testset with id {testset_id} not found!" - - testset = testset_response.testset - - testcases = testset.data.testcases - testcases_data = [ - {**testcase.data, "id": str(testcase.id)} for testcase in testcases - ] # INEFFICIENT: might want to have testcase_id in testset data (caution with hashing) - nof_testcases = len(testcases) - - testset_step_key = get_slug_from_name_and_id(testset.name, testset.id) - # ---------------------------------------------------------------------- - - # fetch application ---------------------------------------------------- - revision = loop.run_until_complete( - fetch_app_variant_revision_by_id(revision_id), - ) - - assert revision is not None, f"App revision with id {revision_id} not found!" - - variant = loop.run_until_complete( - fetch_app_variant_by_id(str(revision.variant_id)), - ) - - assert ( - variant is not None - ), f"App variant with id {revision.variant_id} not found!" - - app = loop.run_until_complete( - fetch_app_by_id(str(variant.app_id)), - ) - - assert app is not None, f"App with id {variant.app_id} not found!" - - deployment = loop.run_until_complete( - get_deployment_by_id(str(revision.base.deployment_id)), - ) - - assert ( - deployment is not None - ), f"Deployment with id {revision.base.deployment_id} not found!" - - uri = parse_url(url=deployment.uri) - - assert uri is not None, f"Invalid URI for deployment {deployment.id}!" - - revision_parameters = revision.config_parameters - - assert ( - revision_parameters is not None - ), f"Revision parameters for variant {variant.id} not found!" - # ---------------------------------------------------------------------- - - # fetch evaluators ----------------------------------------------------- - evaluator_references = {step.key: step.references for step in annotation_steps} - - evaluators = { - evaluator_key: loop.run_until_complete( - workflows_service.fetch_workflow_revision( - project_id=project_id, - # - workflow_revision_ref=evaluator_refs.get("evaluator_revision"), - ) - ) - for evaluator_key, evaluator_refs in evaluator_references.items() - } - # ---------------------------------------------------------------------- - - # prepare headers ------------------------------------------------------ - headers = {} - if credentials: - headers = {"Authorization": credentials} - headers["ngrok-skip-browser-warning"] = "1" - - openapi_parameters = None - max_recursive_depth = 5 - runtime_prefix = uri - route_path = "" - - while max_recursive_depth > 0 and not openapi_parameters: - try: - openapi_parameters = loop.run_until_complete( - llm_apps_service.get_parameters_from_openapi( - runtime_prefix + "/openapi.json", - route_path, - headers, - ), - ) - except Exception: # pylint: disable=broad-exception-caught - openapi_parameters = None - - if not openapi_parameters: - max_recursive_depth -= 1 - if not runtime_prefix.endswith("/"): - route_path = "/" + runtime_prefix.split("/")[-1] + route_path - runtime_prefix = "/".join(runtime_prefix.split("/")[:-1]) - else: - route_path = "" - runtime_prefix = runtime_prefix[:-1] - - openapi_parameters = loop.run_until_complete( - llm_apps_service.get_parameters_from_openapi( - runtime_prefix + "/openapi.json", - route_path, - headers, - ), - ) - # ---------------------------------------------------------------------- - - # create scenarios ----------------------------------------------------- - scenarios_create = [ - EvaluationScenarioCreate( - run_id=run_id, - # - status=EvaluationStatus.RUNNING, - ) - for _ in range(nof_testcases) - ] - - scenarios = loop.run_until_complete( - evaluations_service.create_scenarios( - project_id=project_id, - user_id=user_id, - # - scenarios=scenarios_create, - ) - ) - - assert ( - len(scenarios) == nof_testcases - ), f"Failed to create evaluation scenarios for run {run_id}!" - # ---------------------------------------------------------------------- - - # create input steps --------------------------------------------------- - results_create = [ - EvaluationResultCreate( - run_id=run_id, - scenario_id=scenario.id, - step_key=testset_step_key, - # - status=EvaluationStatus.SUCCESS, - # - testcase_id=testcases[idx].id, - ) - for idx, scenario in enumerate(scenarios) - ] - - steps = loop.run_until_complete( - evaluations_service.create_results( - project_id=project_id, - user_id=user_id, - # - results=results_create, - ) - ) - - assert ( - len(steps) == nof_testcases - ), f"Failed to create evaluation steps for run {run_id}!" - # ---------------------------------------------------------------------- - - # flatten testcases ---------------------------------------------------- - _testcases = [testcase.model_dump(mode="json") for testcase in testcases] - - log.info( - "[BATCH] ", - run_id=run_id, - ids=[testset_id], - count=len(_testcases), - size=len(dumps(_testcases).encode("utf-8")), - ) - # ---------------------------------------------------------------------- - - # invoke application --------------------------------------------------- - invocations: List[InvokationResult] = loop.run_until_complete( - llm_apps_service.batch_invoke( - project_id=str(project_id), - user_id=str(user_id), - testset_data=testcases_data, # type: ignore - parameters=revision_parameters, # type: ignore - uri=uri, - rate_limit_config=run_config, - application_id=str(app.id), # DO NOT REMOVE - references={ - "testset": {"id": testset_id}, - "application": {"id": str(app.id)}, - "application_variant": {"id": str(variant.id)}, - "application_revision": {"id": str(revision.id)}, - }, - scenarios=[ - s.model_dump( - mode="json", - exclude_none=True, - ) - for s in scenarios - ], - ) - ) - # ---------------------------------------------------------------------- - - # create invocation results -------------------------------------------- - results_create = [ - EvaluationResultCreate( - run_id=run_id, - scenario_id=scenario.id, - step_key=invocation_steps_keys[0], - # - status=( - EvaluationStatus.SUCCESS - if not invocations[idx].result.error - else EvaluationStatus.FAILURE - ), - # - trace_id=invocations[idx].trace_id, - error=( - invocations[idx].result.error.model_dump(mode="json") - if invocations[idx].result.error - else None - ), - ) - for idx, scenario in enumerate(scenarios) - ] - - steps = loop.run_until_complete( - evaluations_service.create_results( - project_id=project_id, - user_id=user_id, - # - results=results_create, - ) - ) - - assert ( - len(steps) == nof_testcases - ), f"Failed to create evaluation steps for run {run_id}!" - # ---------------------------------------------------------------------- - - run_has_errors = 0 - run_status = EvaluationStatus.SUCCESS - - # run evaluators ------------------------------------------------------- - for idx in range(nof_testcases): - scenario = scenarios[idx] - testcase = testcases[idx] - invocation = invocations[idx] - invocation_step_key = invocation_steps_keys[0] - - scenario_has_errors = 0 - scenario_status = EvaluationStatus.SUCCESS - - # skip the iteration if error in the invocation -------------------- - if invocation.result.error: - log.error( - f"There is an error in invocation {invocation.trace_id} so we skip its evaluation" - ) - - scenario_has_errors += 1 - run_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - run_status = EvaluationStatus.ERRORS - - error = invocation.result.error.model_dump(mode="json") is not None - # ------------------------------------------------------------------ - - # proceed with the evaluation otherwise ---------------------------- - else: - if not invocation.trace_id: - log.warn(f"invocation trace_id is missing.") - scenario_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - continue - - trace = None - if invocation.trace_id: - trace = loop.run_until_complete( - fetch_trace( - tracing_router=tracing_router, - request=request, - trace_id=invocation.trace_id, - ) - ) - - if trace: - log.info( - f"Trace found ", - scenario_id=scenario.id, - step_key=invocation_step_key, - trace_id=invocation.trace_id, - ) - else: - log.warn( - f"Trace missing", - scenario_id=scenario.id, - step_key=invocation_step_key, - trace_id=invocation.trace_id, - ) - scenario_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - continue - - if not isinstance(trace.spans, dict): - log.warn( - f"Trace with id {invocation.trace_id} has no root spans", - ) - scenario_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - continue - - root_span = list(trace.spans.values())[0] - - if isinstance(root_span, list): - log.warn( - f"More than one root span for trace with id {invocation.trace_id}.", - ) - scenario_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - continue - - # run the evaluators if no error in the invocation ------------- - for jdx in range(nof_annotations): - annotation_step_key = annotation_steps_keys[jdx] - - step_has_errors = 0 - step_status = EvaluationStatus.SUCCESS - - references: Dict[str, Any] = { - **evaluator_references[annotation_step_key], - "testset": {"id": testset_id}, - "testcase": {"id": str(testcase.id)}, - } - links: Dict[str, Any] = { - invocation_steps_keys[0]: { - "trace_id": invocation.trace_id, - "span_id": invocation.span_id, - } - } - - # invoke annotation workflow ------------------------------- - evaluator_revision = evaluators[annotation_step_key] - - if not evaluator_revision: - log.error( - f"Evaluator revision for {annotation_step_key} not found!" - ) - step_has_errors += 1 - scenario_has_errors += 1 - run_has_errors += 1 - step_status = EvaluationStatus.FAILURE - scenario_status = EvaluationStatus.ERRORS - run_status = EvaluationStatus.ERRORS - continue - - _revision = evaluator_revision.model_dump( - mode="json", - exclude_none=True, - ) - interface = ( - dict( - uri=evaluator_revision.data.uri, - url=evaluator_revision.data.url, - headers=evaluator_revision.data.headers, - schemas=evaluator_revision.data.schemas, - ) - if evaluator_revision.data - else dict() - ) - configuration = ( - dict( - script=evaluator_revision.data.script, - parameters=evaluator_revision.data.parameters, - ) - if evaluator_revision.data - else dict() - ) - parameters = configuration.get("parameters") - - _testcase = testcase.model_dump(mode="json") - inputs = testcase.data - if isinstance(inputs, dict): - if "testcase_dedup_id" in inputs: - del inputs["testcase_dedup_id"] - - _trace: Optional[dict] = ( - trace.model_dump( - mode="json", - exclude_none=True, - ) - if trace - else None - ) - - _root_span = root_span.model_dump(mode="json", exclude_none=True) - testcase_data = testcase.data - - root_span_attributes: dict = _root_span.get("attributes") or {} - root_span_attributes_ag: dict = root_span_attributes.get("ag") or {} - root_span_attributes_ag_data: dict = ( - root_span_attributes_ag.get("data") or {} - ) - root_span_attributes_ag_data_outputs = ( - root_span_attributes_ag_data.get("outputs") - ) - root_span_attributes_ag_data_inputs = ( - root_span_attributes_ag_data.get("inputs") - ) - - outputs = root_span_attributes_ag_data_outputs - inputs = testcase_data or root_span_attributes_ag_data_inputs - - workflow_service_request_data = WorkflowServiceRequestData( - revision=_revision, - parameters=parameters, - # - testcase=_testcase, - inputs=inputs, - # - trace=_trace, - outputs=outputs, - ) - - flags = ( - evaluator_revision.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - if evaluator_revision.flags - else None - ) - - workflow_service_request = WorkflowServiceRequest( - version="2025.07.14", - # - flags=flags, - # - interface=interface, - configuration=configuration, - # - data=workflow_service_request_data, - # - references=references, - links=links, - ) - - log.info( - "Invoking evaluator... ", - scenario_id=scenario.id, - testcase_id=testcase.id, - trace_id=invocation.trace_id, - uri=interface.get("uri"), - ) - workflows_service_response = loop.run_until_complete( - workflows_service.invoke_workflow( - project_id=project_id, - user_id=user_id, - # - request=workflow_service_request, - # - annotate=True, - ) - ) - log.info( - "Invoked evaluator ", - scenario_id=scenario.id, - trace_id=workflows_service_response.trace_id, - ) - # ---------------------------------------------------------- - - # run evaluator -------------------------------------------- - trace_id = workflows_service_response.trace_id - - error = None - has_error = workflows_service_response.status.code != 200 - - # if error in evaluator, no annotation, only step ---------- - if has_error: - log.warn( - f"There is an error in annotation {annotation_step_key} for invocation {invocation.trace_id}." - ) - - step_has_errors += 1 - scenario_has_errors += 1 - run_has_errors += 1 - step_status = EvaluationStatus.FAILURE - scenario_status = EvaluationStatus.ERRORS - run_status = EvaluationStatus.ERRORS - - error = workflows_service_response.status.model_dump( - mode="json" - ) - - # ---------------------------------------------------------- - - # else, first annotation, then step ------------------------ - else: - outputs = ( - workflows_service_response.data.outputs - if workflows_service_response.data - else None - ) - - annotation = workflows_service_response - - trace_id = annotation.trace_id - - if not annotation.trace_id: - log.warn(f"annotation trace_id is missing.") - scenario_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - continue - - trace = None - if annotation.trace_id: - trace = loop.run_until_complete( - fetch_trace( - tracing_router=tracing_router, - request=request, - trace_id=annotation.trace_id, - ) - ) - - if trace: - log.info( - f"Trace found ", - scenario_id=scenario.id, - step_key=annotation_step_key, - trace_id=annotation.trace_id, - ) - else: - log.warn( - f"Trace missing", - scenario_id=scenario.id, - step_key=annotation_step_key, - trace_id=annotation.trace_id, - ) - scenario_has_errors += 1 - scenario_status = EvaluationStatus.ERRORS - continue - # ---------------------------------------------------------- - - results_create = [ - EvaluationResultCreate( - run_id=run_id, - scenario_id=scenario.id, - step_key=annotation_step_key, - # - status=step_status, - # - trace_id=trace_id, - error=error, - ) - ] - - steps = loop.run_until_complete( - evaluations_service.create_results( - project_id=project_id, - user_id=user_id, - # - results=results_create, - ) - ) - - assert ( - len(steps) == 1 - ), f"Failed to create evaluation step for scenario with id {scenario.id}!" - # ------------------------------------------------------------------ - - scenario_edit = EvaluationScenarioEdit( - id=scenario.id, - tags=scenario.tags, - meta=scenario.meta, - status=scenario_status, - ) - - scenario = loop.run_until_complete( - evaluations_service.edit_scenario( - project_id=project_id, - user_id=user_id, - # - scenario=scenario_edit, - ) - ) - - assert ( - scenario - ), f"Failed to edit evaluation scenario with id {scenario.id}!" - - if scenario_status != EvaluationStatus.FAILURE: - try: - metrics = loop.run_until_complete( - evaluations_service.refresh_metrics( - project_id=project_id, - user_id=user_id, - # - run_id=run_id, - scenario_id=scenario.id, - ) - ) - - if not metrics: - log.warning( - f"Refreshing metrics failed for {run_id} | {scenario.id}" - ) - - except Exception as e: - log.warning( - f"Refreshing metrics failed for {run_id} | {scenario.id}", - exc_info=True, - ) - # ---------------------------------------------------------------------- - - except Exception as e: # pylint: disable=broad-exception-caught - log.error( - f"An error occurred during evaluation: {e}", - exc_info=True, - ) - - self.update_state(state=states.FAILURE) - - run_status = EvaluationStatus.FAILURE - - if not run: - log.info("[FAIL] ", run_id=run_id, project_id=project_id, user_id=user_id) - - if run_status != EvaluationStatus.FAILURE: - try: - metrics = loop.run_until_complete( - evaluations_service.refresh_metrics( - project_id=project_id, - user_id=user_id, - # - run_id=run_id, - ) - ) - - if not metrics: - log.warning(f"Refreshing metrics failed for {run_id}") - - self.update_state(state=states.FAILURE) - - run_status = EvaluationStatus.FAILURE - - except Exception as e: # pylint: disable=broad-exception-caught - log.warning(f"Refreshing metrics failed for {run_id}", exc_info=True) - - self.update_state(state=states.FAILURE) - - run_status = EvaluationStatus.FAILURE - - # edit evaluation run status ----------------------------------------------- - run_edit = EvaluationRunEdit( - id=run_id, - # - name=run.name, - description=run.description, - # - tags=run.tags, - meta=run.meta, - # - status=run_status, - # - data=run.data, - ) - - loop.run_until_complete( - evaluations_service.edit_run( - project_id=project_id, - user_id=user_id, - # - run=run_edit, - ) - ) - - # edit meters to avoid conting failed evaluations -------------------------- - if run_status == EvaluationStatus.FAILURE: - if is_ee(): - loop.run_until_complete( - check_entitlements( - organization_id=project.organization_id, - key=Counter.EVALUATIONS, - delta=-1, - ) - ) - - log.info("[DONE] ", run_id=run_id, project_id=project_id, user_id=user_id) - - return diff --git a/api/oss/src/tasks/evaluations/live.py b/api/oss/src/tasks/evaluations/live.py deleted file mode 100644 index 43208bd42d..0000000000 --- a/api/oss/src/tasks/evaluations/live.py +++ /dev/null @@ -1,831 +0,0 @@ -from typing import List, Dict, Any, Optional -from uuid import UUID -import asyncio -from datetime import datetime - -from celery import shared_task -from fastapi import Request - -from oss.src.utils.logging import get_module_logger -from oss.src.services.auth_helper import sign_secret_token -from oss.src.services.db_manager import get_project_by_id -from oss.src.core.secrets.utils import get_llm_providers_secrets - -from oss.src.dbs.postgres.queries.dbes import ( - QueryArtifactDBE, - QueryVariantDBE, - QueryRevisionDBE, -) -from oss.src.dbs.postgres.testcases.dbes import ( - TestcaseBlobDBE, -) -from oss.src.dbs.postgres.testsets.dbes import ( - TestsetArtifactDBE, - TestsetVariantDBE, - TestsetRevisionDBE, -) -from oss.src.dbs.postgres.workflows.dbes import ( - WorkflowArtifactDBE, - WorkflowVariantDBE, - WorkflowRevisionDBE, -) - -from oss.src.dbs.postgres.tracing.dao import TracingDAO -from oss.src.dbs.postgres.blobs.dao import BlobsDAO -from oss.src.dbs.postgres.git.dao import GitDAO -from oss.src.dbs.postgres.evaluations.dao import EvaluationsDAO - -from oss.src.core.tracing.service import TracingService -from oss.src.core.queries.service import QueriesService -from oss.src.core.testcases.service import TestcasesService -from oss.src.core.testsets.service import TestsetsService -from oss.src.core.testsets.service import SimpleTestsetsService -from oss.src.core.workflows.service import WorkflowsService -from oss.src.core.evaluators.service import EvaluatorsService -from oss.src.core.evaluators.service import SimpleEvaluatorsService -from oss.src.core.evaluations.service import EvaluationsService -from oss.src.core.annotations.service import AnnotationsService - -# from oss.src.apis.fastapi.tracing.utils import make_hash_id -from oss.src.apis.fastapi.tracing.router import TracingRouter -from oss.src.apis.fastapi.annotations.router import AnnotationsRouter - -from oss.src.core.annotations.types import ( - AnnotationOrigin, - AnnotationKind, - AnnotationChannel, -) -from oss.src.apis.fastapi.annotations.models import ( - AnnotationCreate, - AnnotationCreateRequest, -) - -from oss.src.core.evaluations.types import ( - EvaluationStatus, - EvaluationScenarioCreate, - EvaluationScenarioEdit, - EvaluationResultCreate, -) -from oss.src.core.shared.dtos import ( - Reference, - Link, -) -from oss.src.core.tracing.dtos import ( - Filtering, - Windowing, - Formatting, - Format, - Focus, - TracingQuery, - OTelSpansTree as Trace, - LogicalOperator, - SimpleTraceReferences, -) -from oss.src.core.workflows.dtos import ( - WorkflowServiceRequestData, - WorkflowServiceResponseData, - WorkflowServiceRequest, - WorkflowServiceResponse, -) -from oss.src.core.queries.dtos import ( - QueryRevisionData, - QueryRevision, -) -from oss.src.core.evaluators.dtos import ( - EvaluatorRevisionData, - EvaluatorRevision, -) - -from oss.src.core.evaluations.utils import fetch_trace - - -log = get_module_logger(__name__) - - -# DBS -------------------------------------------------------------------------- - -tracing_dao = TracingDAO() - -testcases_dao = BlobsDAO( - BlobDBE=TestcaseBlobDBE, -) - -queries_dao = GitDAO( - ArtifactDBE=QueryArtifactDBE, - VariantDBE=QueryVariantDBE, - RevisionDBE=QueryRevisionDBE, -) - -testsets_dao = GitDAO( - ArtifactDBE=TestsetArtifactDBE, - VariantDBE=TestsetVariantDBE, - RevisionDBE=TestsetRevisionDBE, -) - -workflows_dao = GitDAO( - ArtifactDBE=WorkflowArtifactDBE, - VariantDBE=WorkflowVariantDBE, - RevisionDBE=WorkflowRevisionDBE, -) - -evaluations_dao = EvaluationsDAO() - -# CORE ------------------------------------------------------------------------- - -tracing_service = TracingService( - tracing_dao=tracing_dao, -) - -queries_service = QueriesService( - queries_dao=queries_dao, -) - -testcases_service = TestcasesService( - testcases_dao=testcases_dao, -) - -testsets_service = TestsetsService( - testsets_dao=testsets_dao, - testcases_service=testcases_service, -) - -simple_testsets_service = SimpleTestsetsService( - testsets_service=testsets_service, -) - -workflows_service = WorkflowsService( - workflows_dao=workflows_dao, -) - -evaluators_service = EvaluatorsService( - workflows_service=workflows_service, -) - -simple_evaluators_service = SimpleEvaluatorsService( - evaluators_service=evaluators_service, -) - -evaluations_service = EvaluationsService( - evaluations_dao=evaluations_dao, - tracing_service=tracing_service, - queries_service=queries_service, - testsets_service=testsets_service, - evaluators_service=evaluators_service, -) - -# APIS ------------------------------------------------------------------------- - -tracing_router = TracingRouter( - tracing_service=tracing_service, -) - -annotations_service = AnnotationsService( - tracing_router=tracing_router, - evaluators_service=evaluators_service, - simple_evaluators_service=simple_evaluators_service, -) - -annotations_router = AnnotationsRouter( - annotations_service=annotations_service, -) # TODO: REMOVE/REPLACE ONCE ANNOTATE IS MOVED TO 'core' - -# ------------------------------------------------------------------------------ - - -@shared_task( - name="src.tasks.evaluations.live.evaluate", - queue="src.tasks.evaluations.live.evaluate", - bind=True, -) -def evaluate( - self, - *, - project_id: UUID, - user_id: UUID, - # - run_id: UUID, - # - newest: datetime, - oldest: datetime, -): - request = Request(scope={"type": "http", "http_version": "1.1", "scheme": "http"}) - - request.state.project_id = str(project_id) - request.state.user_id = str(user_id) - - loop = asyncio.get_event_loop() - - # count in minutes - timestamp = oldest - interval = int((newest - oldest).total_seconds() / 60) - - try: - # ---------------------------------------------------------------------- - log.info( - "[SCOPE] ", - run_id=run_id, - project_id=project_id, - user_id=user_id, - ) - - log.info( - "[RANGE] ", - run_id=run_id, - timestamp=timestamp, - interval=interval, - ) - # ---------------------------------------------------------------------- - - # fetch evaluation run ------------------------------------------------- - run = loop.run_until_complete( - evaluations_service.fetch_run( - project_id=project_id, - run_id=run_id, - ) - ) - - assert run, f"Evaluation run with id {run_id} not found!" - - assert run.data, f"Evaluation run with id {run_id} has no data!" - - assert run.data.steps, f"Evaluation run with id {run_id} has no steps!" - - steps = run.data.steps - - input_steps = { - step.key: step for step in steps if step.type == "input" # -------- - } - invocation_steps = { - step.key: step for step in steps if step.type == "invocation" - } - annotation_steps = { - step.key: step for step in steps if step.type == "annotation" - } - - input_steps_keys = list(input_steps.keys()) - invocation_steps_keys = list(invocation_steps.keys()) - annotation_steps_keys = list(annotation_steps.keys()) - - nof_inputs = len(input_steps_keys) - nof_invocations = len(invocation_steps_keys) - nof_annotations = len(annotation_steps_keys) - # ---------------------------------------------------------------------- - - # initialize query variables ------------------------------------------- - query_revision_refs: Dict[str, Reference] = dict() - # - query_revisions: Dict[str, QueryRevision] = dict() - query_references: Dict[str, Dict[str, Reference]] = dict() - # - query_traces: Dict[str, Dict[str, Trace]] = dict() - # ---------------------------------------------------------------------- - - # initialize evaluator variables --------------------------------------- - evaluator_revision_refs: Dict[str, Reference] = dict() - # - evaluator_revisions: Dict[str, EvaluatorRevision] = dict() - evaluator_references: Dict[str, Dict[str, Reference]] = dict() - # ---------------------------------------------------------------------- - - # get query steps references ------------------------------------------- - for input_step_key in input_steps_keys: - query_refs = input_steps[input_step_key].references - query_revision_ref = query_refs.get("query_revision") - - if query_revision_ref: - query_revision_refs[input_step_key] = query_revision_ref - - # ---------------------------------------------------------------------- - - # get evaluator steps references --------------------------------------- - for annotation_step_key in annotation_steps_keys: - evaluator_refs = annotation_steps[annotation_step_key].references - evaluator_revision_ref = evaluator_refs.get("evaluator_revision") - - if evaluator_revision_ref: - evaluator_revision_refs[annotation_step_key] = evaluator_revision_ref - # ---------------------------------------------------------------------- - - # fetch query revisions ------------------------------------------------ - for ( - query_step_key, - query_revision_ref, - ) in query_revision_refs.items(): - query_revision = loop.run_until_complete( - queries_service.fetch_query_revision( - project_id=project_id, - # - query_revision_ref=query_revision_ref, - ) - ) - - if query_revision and not query_revision.data: - query_revision.data = QueryRevisionData() - - if ( - not query_revision - or not query_revision.id - or not query_revision.slug - or not query_revision.data - ): - log.warn( - f"Query revision with ref {query_revision_ref.model_dump(mode='json')} not found!" - ) - continue - - query_step = input_steps[query_step_key] - - query_revisions[query_step_key] = query_revision - query_references[query_step_key] = query_step.references - # ---------------------------------------------------------------------- - - # fetch evaluator revisions -------------------------------------------- - for ( - evaluator_step_key, - evaluator_revision_ref, - ) in evaluator_revision_refs.items(): - evaluator_revision = loop.run_until_complete( - evaluators_service.fetch_evaluator_revision( - project_id=project_id, - # - evaluator_revision_ref=evaluator_revision_ref, - ) - ) - - if evaluator_revision and not evaluator_revision.data: - evaluator_revision.data = EvaluatorRevisionData() - - if ( - not evaluator_revision - or not evaluator_revision.id - or not evaluator_revision.slug - or not evaluator_revision.data - ): - log.warn( - f"Evaluator revision with ref {evaluator_revision_ref.model_dump(mode='json')} not found!" - ) - continue - - evaluator_step = annotation_steps[evaluator_step_key] - - evaluator_revisions[evaluator_step_key] = evaluator_revision - evaluator_references[evaluator_step_key] = evaluator_step.references - # ---------------------------------------------------------------------- - - # run query revisions -------------------------------------------------- - for query_step_key, query_revision in query_revisions.items(): - formatting = Formatting( - focus=Focus.TRACE, - format=Format.AGENTA, - ) - filtering = Filtering( - operator=LogicalOperator.AND, - conditions=list(), - ) - windowing = Windowing( - oldest=oldest, - newest=newest, - next=None, - limit=None, - order="ascending", - interval=None, - rate=None, - ) - - if query_revision.data: - if query_revision.data.filtering: - filtering = query_revision.data.filtering - - if query_revision.data.windowing: - windowing.rate = query_revision.data.windowing.rate - - query = TracingQuery( - formatting=formatting, - filtering=filtering, - windowing=windowing, - ) - - tracing_response = loop.run_until_complete( - tracing_router.query_spans( - request=request, - # - query=query, - ) - ) - - nof_traces = tracing_response.count - - log.info( - "[TRACES] ", - run_id=run_id, - count=nof_traces, - ) - - query_traces[query_step_key] = tracing_response.traces or dict() - # ---------------------------------------------------------------------- - - # run online evaluation ------------------------------------------------ - for query_step_key in query_traces.keys(): - if not query_traces[query_step_key].keys(): - continue - - # create scenarios ------------------------------------------------- - - nof_traces = len(query_traces[query_step_key].keys()) - - scenarios_create = [ - EvaluationScenarioCreate( - run_id=run_id, - timestamp=timestamp, - interval=interval, - # - status=EvaluationStatus.RUNNING, - ) - for _ in range(nof_traces) - ] - - scenarios = loop.run_until_complete( - evaluations_service.create_scenarios( - project_id=project_id, - user_id=user_id, - # - scenarios=scenarios_create, - ) - ) - - if len(scenarios) != nof_traces: - log.error( - "[LIVE] Could not create evaluation scenarios", - run_id=run_id, - ) - continue - # ------------------------------------------------------------------ - - # create query steps ----------------------------------------------- - query_trace_ids = list(query_traces[query_step_key].keys()) - scenario_ids = [scenario.id for scenario in scenarios if scenario.id] - - results_create = [ - EvaluationResultCreate( - run_id=run_id, - scenario_id=scenario_id, - step_key=query_step_key, - repeat_idx=0, - timestamp=timestamp, - interval=interval, - # - status=EvaluationStatus.SUCCESS, - # - trace_id=query_trace_id, - ) - for scenario_id, query_trace_id in zip(scenario_ids, query_trace_ids) - ] - - results = loop.run_until_complete( - evaluations_service.create_results( - project_id=project_id, - user_id=user_id, - # - results=results_create, - ) - ) - - assert ( - len(results) == nof_traces - ), f"Failed to create evaluation results for run {run_id}!" - # ------------------------------------------------------------------ - - scenario_has_errors: Dict[int, int] = dict() - scenario_status: Dict[int, EvaluationStatus] = dict() - - # iterate over query traces ---------------------------------------- - for idx, trace in enumerate(query_traces[query_step_key].values()): - scenario_has_errors[idx] = 0 - scenario_status[idx] = EvaluationStatus.SUCCESS - - scenario = scenarios[idx] - scenario_id = scenario_ids[idx] - query_trace_id = query_trace_ids[idx] - - if not isinstance(trace.spans, dict): - log.warn( - f"Trace with id {query_trace_id} has no root spans", - run_id=run_id, - ) - scenario_has_errors[idx] += 1 - scenario_status[idx] = EvaluationStatus.ERRORS - continue - - root_span = list(trace.spans.values())[0] - - if isinstance(root_span, list): - log.warn( - f"More than one root span for trace with id {query_trace_id}", - run_id=run_id, - ) - scenario_has_errors[idx] += 1 - scenario_status[idx] = EvaluationStatus.ERRORS - continue - - query_span_id = root_span.span_id - - log.info( - "[TRACE] ", - run_id=run_id, - trace_id=query_trace_id, - ) - - # run evaluator revisions -------------------------------------- - for jdx in range(nof_annotations): - annotation_step_key = annotation_steps_keys[jdx] - - step_has_errors = 0 - step_status = EvaluationStatus.SUCCESS - - references: Dict[str, Any] = { - **evaluator_references[annotation_step_key], - } - links: Dict[str, Any] = { - query_step_key: dict( - trace_id=query_trace_id, - span_id=query_span_id, - ) - } - - # invoke annotation workflow ------------------------------- - evaluator_revision = evaluator_revisions[annotation_step_key] - - if not evaluator_revision: - log.error( - f"Evaluator revision for {annotation_step_key} not found!" - ) - step_has_errors += 1 - scenario_has_errors[idx] += 1 - # run_has_errors += 1 - step_status = EvaluationStatus.FAILURE - scenario_status[idx] = EvaluationStatus.ERRORS - # run_status = EvaluationStatus.ERRORS - continue - - _revision = evaluator_revision.model_dump( - mode="json", - exclude_none=True, - ) - interface = ( - dict( - uri=evaluator_revision.data.uri, - url=evaluator_revision.data.url, - headers=evaluator_revision.data.headers, - schemas=evaluator_revision.data.schemas, - ) - if evaluator_revision.data - else dict() - ) - configuration = ( - dict( - script=evaluator_revision.data.script, - parameters=evaluator_revision.data.parameters, - ) - if evaluator_revision.data - else dict() - ) - parameters = configuration.get("parameters") - - _testcase = None - inputs = None - - _trace: Optional[dict] = ( - trace.model_dump( - mode="json", - exclude_none=True, - ) - if trace - else None - ) - - _root_span = root_span.model_dump(mode="json", exclude_none=True) - testcase_data = None - - root_span_attributes: dict = _root_span.get("attributes") or {} - root_span_attributes_ag: dict = root_span_attributes.get("ag") or {} - root_span_attributes_ag_data: dict = ( - root_span_attributes_ag.get("data") or {} - ) - root_span_attributes_ag_data_outputs = ( - root_span_attributes_ag_data.get("outputs") - ) - root_span_attributes_ag_data_inputs = ( - root_span_attributes_ag_data.get("inputs") - ) - - outputs = root_span_attributes_ag_data_outputs - inputs = testcase_data or root_span_attributes_ag_data_inputs - - workflow_service_request_data = WorkflowServiceRequestData( - revision=_revision, - parameters=parameters, - # - testcase=_testcase, - inputs=inputs, - # - trace=_trace, - outputs=outputs, - ) - - flags = ( - evaluator_revision.flags.model_dump( - mode="json", - exclude_none=True, - exclude_unset=True, - ) - if evaluator_revision.flags - else None - ) - - workflow_service_request = WorkflowServiceRequest( - version="2025.07.14", - # - flags=flags, - # - interface=interface, - configuration=configuration, - # - data=workflow_service_request_data, - # - references=references, - links=links, - ) - - log.info( - "Invoking evaluator... ", - scenario_id=scenario.id, - trace_id=query_trace_id, - uri=interface.get("uri"), - ) - workflows_service_response = loop.run_until_complete( - workflows_service.invoke_workflow( - project_id=project_id, - user_id=user_id, - # - request=workflow_service_request, - # - annotate=True, - ) - ) - log.info( - "Invoked evaluator ", - scenario_id=scenario.id, - trace_id=workflows_service_response.trace_id, - ) - - trace_id = workflows_service_response.trace_id - - error = None - has_error = workflows_service_response.status.code != 200 - - # if error in evaluator, no annotation, only step ---------- - if has_error: - log.warn( - f"There is an error in evaluator {evaluator_step_key} for query {query_trace_id}." - ) - - step_has_errors += 1 - step_status = EvaluationStatus.FAILURE - scenario_has_errors[idx] += 1 - scenario_status[idx] = EvaluationStatus.ERRORS - - error = workflows_service_response.status.model_dump( - mode="json", - exclude_none=True, - ) - # ---------------------------------------------------------- - - # else, first annotation, then step ------------------------ - else: - outputs = ( - workflows_service_response.data.outputs - if workflows_service_response.data - else None - ) - - annotation = workflows_service_response - - trace_id = annotation.trace_id - - if not annotation.trace_id: - log.warn(f"annotation trace_id is missing.") - scenario_has_errors[idx] += 1 - scenario_status[idx] = EvaluationStatus.ERRORS - continue - - trace = None - if annotation.trace_id: - trace = loop.run_until_complete( - fetch_trace( - tracing_router=tracing_router, - request=request, - trace_id=annotation.trace_id, - ) - ) - - if trace: - log.info( - f"Trace found ", - scenario_id=scenario.id, - step_key=annotation_step_key, - trace_id=annotation.trace_id, - ) - else: - log.warn( - f"Trace missing", - scenario_id=scenario.id, - step_key=annotation_step_key, - trace_id=annotation.trace_id, - ) - scenario_has_errors[idx] += 1 - scenario_status[idx] = EvaluationStatus.ERRORS - continue - # ---------------------------------------------------------- - - results_create = [ - EvaluationResultCreate( - run_id=run_id, - scenario_id=scenario_id, - step_key=annotation_step_key, - # - timestamp=timestamp, - interval=interval, - # - status=step_status, - # - trace_id=trace_id, - error=error, - ) - ] - - results = loop.run_until_complete( - evaluations_service.create_results( - project_id=project_id, - user_id=user_id, - # - results=results_create, - ) - ) - - assert ( - len(results) == 1 - ), f"Failed to create evaluation result for scenario with id {scenario.id}!" - # -------------------------------------------------------------- - - scenario_edit = EvaluationScenarioEdit( - id=scenario.id, - tags=scenario.tags, - meta=scenario.meta, - status=scenario_status[idx], - ) - - scenario = loop.run_until_complete( - evaluations_service.edit_scenario( - project_id=project_id, - user_id=user_id, - # - scenario=scenario_edit, - ) - ) - - if not scenario or not scenario.id: - log.error( - f"Failed to update evaluation scenario with id {scenario_id}!", - run_id=run_id, - ) - - loop.run_until_complete( - evaluations_service.refresh_metrics( - project_id=project_id, - user_id=user_id, - # - run_id=run_id, - scenario_id=scenario_id, - ) - ) - # ------------------------------------------------------------------ - - loop.run_until_complete( - evaluations_service.refresh_metrics( - project_id=project_id, - user_id=user_id, - # - run_id=run_id, - timestamp=timestamp, - interval=interval, - ) - ) - except Exception as e: # pylint: disable=broad-exception-caught - log.error(e, exc_info=True) - - log.info( - "[DONE] ", - run_id=run_id, - ) - - return diff --git a/api/oss/src/utils/caching.py b/api/oss/src/utils/caching.py index f577e2334c..c77c2e2967 100644 --- a/api/oss/src/utils/caching.py +++ b/api/oss/src/utils/caching.py @@ -7,10 +7,13 @@ from pydantic import BaseModel from oss.src.utils.logging import get_module_logger -from oss.src.utils.env import env log = get_module_logger(__name__) +# TODO: ADD ENV VARS +REDIS_HOST = "cache" +REDIS_PORT = 6378 + AGENTA_CACHE_DB = 1 AGENTA_CACHE_TTL = 5 * 60 # 5 minutes @@ -27,8 +30,8 @@ CACHE_DEBUG_VALUE = False r = Redis( - host=env.REDIS_CACHE_HOST, - port=env.REDIS_CACHE_PORT, + host=REDIS_HOST, + port=REDIS_PORT, db=AGENTA_CACHE_DB, decode_responses=True, socket_timeout=0.5, # read/write timeout @@ -287,10 +290,10 @@ async def _maybe_retry_get( async def set_cache( namespace: str, - project_id: Optional[str] = None, - user_id: Optional[str] = None, key: Optional[Union[str, dict]] = None, value: Optional[Any] = None, + project_id: Optional[str] = None, + user_id: Optional[str] = None, ttl: Optional[int] = AGENTA_CACHE_TTL, ) -> Optional[bool]: try: diff --git a/api/oss/src/utils/common.py b/api/oss/src/utils/common.py index 1acbdd706d..b471d10e75 100644 --- a/api/oss/src/utils/common.py +++ b/api/oss/src/utils/common.py @@ -1,5 +1,4 @@ from typing import Any, Callable -from uuid import UUID, RFC_4122 from fastapi.types import DecoratedCallable from fastapi import APIRouter as FastAPIRouter @@ -54,18 +53,3 @@ def is_ee(): def is_oss(): return env.AGENTA_LICENSE == "oss" - - -def is_uuid7(s: str, *, require_canonical: bool = False) -> bool: - try: - u = UUID(s) # parses hyphenated, braced, or 32-hex forms - except (ValueError, TypeError, AttributeError): - return False - - if u.version != 7 or u.variant != RFC_4122: - return False - - if require_canonical and str(u) != s.lower(): - return False - - return True diff --git a/api/oss/src/utils/env.py b/api/oss/src/utils/env.py index b2db70490f..9156a7350a 100644 --- a/api/oss/src/utils/env.py +++ b/api/oss/src/utils/env.py @@ -9,117 +9,106 @@ class EnvironSettings(BaseModel): # AGENTA-SPECIFIC (REQUIRED) AGENTA_LICENSE: str = "ee" if os.getenv("AGENTA_LICENSE") == "ee" else "oss" - AGENTA_API_URL: str = os.getenv("AGENTA_API_URL") or "http://localhost/api" - AGENTA_WEB_URL: str = os.getenv("AGENTA_WEB_URL") or "" - AGENTA_SERVICES_URL: str = os.getenv("AGENTA_SERVICES_URL") or "" - AGENTA_AUTH_KEY: str = os.getenv("AGENTA_AUTH_KEY") or "" - AGENTA_CRYPT_KEY: str = os.getenv("AGENTA_CRYPT_KEY") or "" + AGENTA_API_URL: str = os.getenv("AGENTA_API_URL", "http://localhost/api") + AGENTA_WEB_URL: str = os.getenv("AGENTA_WEB_URL", "") + AGENTA_SERVICES_URL: str = os.getenv("AGENTA_SERVICES_URL", "") + AGENTA_AUTH_KEY: str = os.getenv("AGENTA_AUTH_KEY", "") + AGENTA_CRYPT_KEY: str = os.getenv("AGENTA_CRYPT_KEY", "") # AGENTA-SPECIFIC (OPTIONAL) AGENTA_AUTO_MIGRATIONS: bool = ( - os.getenv("AGENTA_AUTO_MIGRATIONS") or "true" - ).lower() in _TRUTHY - AGENTA_PRICING: str = os.getenv("AGENTA_PRICING") or "{}" - AGENTA_DEMOS: str = os.getenv("AGENTA_DEMOS") or "" - AGENTA_RUNTIME_PREFIX: str = os.getenv("AGENTA_RUNTIME_PREFIX") or "" + os.getenv("AGENTA_AUTO_MIGRATIONS", "true").lower() in _TRUTHY + ) + AGENTA_PRICING: str = os.getenv("AGENTA_PRICING", "{}") + AGENTA_DEMOS: str = os.getenv("AGENTA_DEMOS", "") + AGENTA_RUNTIME_PREFIX: str = os.getenv("AGENTA_RUNTIME_PREFIX", "") # SUPERTOKENS (REQUIRED) - SUPERTOKENS_CONNECTION_URI: str = os.getenv("SUPERTOKENS_CONNECTION_URI") or "" - SUPERTOKENS_API_KEY: str = os.getenv("SUPERTOKENS_API_KEY") or "" + SUPERTOKENS_CONNECTION_URI: str = os.getenv("SUPERTOKENS_CONNECTION_URI", "") + SUPERTOKENS_API_KEY: str = os.getenv("SUPERTOKENS_API_KEY", "") # DATABASE (REQUIRED) - POSTGRES_URI_CORE: str = os.getenv("POSTGRES_URI_CORE") or "" - POSTGRES_URI_TRACING: str = os.getenv("POSTGRES_URI_TRACING") or "" - POSTGRES_URI_SUPERTOKENS: str = os.getenv("POSTGRES_URI_SUPERTOKENS") or "" - ALEMBIC_CFG_PATH_CORE: str = os.getenv("ALEMBIC_CFG_PATH_CORE") or "" - ALEMBIC_CFG_PATH_TRACING: str = os.getenv("ALEMBIC_CFG_PATH_TRACING") or "" + POSTGRES_URI_CORE: str = os.getenv("POSTGRES_URI_CORE", "") + POSTGRES_URI_TRACING: str = os.getenv("POSTGRES_URI_TRACING", "") + POSTGRES_URI_SUPERTOKENS: str = os.getenv("POSTGRES_URI_SUPERTOKENS", "") + ALEMBIC_CFG_PATH_CORE: str = os.getenv("ALEMBIC_CFG_PATH_CORE", "") + ALEMBIC_CFG_PATH_TRACING: str = os.getenv("ALEMBIC_CFG_PATH_TRACING", "") # TASK QUEUE / BROKER (REQUIRED) - REDIS_URL: str = os.getenv("REDIS_URL") or "" - RABBITMQ_DEFAULT_USER: str = os.getenv("RABBITMQ_DEFAULT_USER") or "guest" - RABBITMQ_DEFAULT_PASS: str = os.getenv("RABBITMQ_DEFAULT_PASS") or "guest" - CELERY_BROKER_URL: str = os.getenv("CELERY_BROKER_URL") or "" - CELERY_RESULT_BACKEND: str = os.getenv("CELERY_RESULT_BACKEND") or "" - - # CACHE (REQUIRED) - REDIS_CACHE_HOST: str = os.getenv("REDIS_CACHE_HOST") or "cache" - REDIS_CACHE_PORT: int = int(os.getenv("REDIS_CACHE_PORT") or "6378") + REDIS_URL: str = os.getenv("REDIS_URL", "") + RABBITMQ_DEFAULT_USER: str = os.getenv("RABBITMQ_DEFAULT_USER", "guest") + RABBITMQ_DEFAULT_PASS: str = os.getenv("RABBITMQ_DEFAULT_PASS", "guest") + CELERY_BROKER_URL: str = os.getenv("CELERY_BROKER_URL", "") + CELERY_RESULT_BACKEND: str = os.getenv("CELERY_RESULT_BACKEND", "") # Mail - SENDGRID_API_KEY: str = os.getenv("SENDGRID_API_KEY") or "" - AGENTA_SEND_EMAIL_FROM_ADDRESS: str = ( - os.getenv("AGENTA_SEND_EMAIL_FROM_ADDRESS") or "" + SENDGRID_API_KEY: str = os.getenv("SENDGRID_API_KEY", "") + AGENTA_SEND_EMAIL_FROM_ADDRESS: str = os.getenv( + "AGENTA_SEND_EMAIL_FROM_ADDRESS", "" ) # Optional integrations - POSTHOG_API_KEY: str = os.getenv("POSTHOG_API_KEY") or "" - POSTHOG_HOST: str = os.getenv("POSTHOG_HOST", "https://app.posthog.com") or "" - GOOGLE_OAUTH_CLIENT_ID: str = os.getenv("GOOGLE_OAUTH_CLIENT_ID", "") or "" - GOOGLE_OAUTH_CLIENT_SECRET: str = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET", "") or "" - GITHUB_OAUTH_CLIENT_ID: str = os.getenv("GITHUB_OAUTH_CLIENT_ID", "") or "" - GITHUB_OAUTH_CLIENT_SECRET: str = os.getenv("GITHUB_OAUTH_CLIENT_SECRET", "") or "" - NEW_RELIC_LICENSE_KEY: str = os.getenv("NEW_RELIC_LICENSE_KEY", "") or "" - NRIA_LICENSE_KEY: str = os.getenv("NRIA_LICENSE_KEY", "") or "" - LOOPS_API_KEY: str = os.getenv("LOOPS_API_KEY", "") or "" - CRISP_WEBSITE_ID: str = os.getenv("CRISP_WEBSITE_ID", "") or "" - STRIPE_API_KEY: str = os.getenv("STRIPE_API_KEY", "") or "" - STRIPE_WEBHOOK_SECRET: str = os.getenv("STRIPE_WEBHOOK_SECRET", "") or "" + POSTHOG_API_KEY: str = os.getenv("POSTHOG_API_KEY") + POSTHOG_HOST: str = os.getenv("POSTHOG_HOST", "https://app.posthog.com") + GOOGLE_OAUTH_CLIENT_ID: str = os.getenv("GOOGLE_OAUTH_CLIENT_ID", "") + GOOGLE_OAUTH_CLIENT_SECRET: str = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET", "") + GITHUB_OAUTH_CLIENT_ID: str = os.getenv("GITHUB_OAUTH_CLIENT_ID", "") + GITHUB_OAUTH_CLIENT_SECRET: str = os.getenv("GITHUB_OAUTH_CLIENT_SECRET", "") + NEW_RELIC_LICENSE_KEY: str = os.getenv("NEW_RELIC_LICENSE_KEY", "") + NRIA_LICENSE_KEY: str = os.getenv("NRIA_LICENSE_KEY", "") + LOOPS_API_KEY: str = os.getenv("LOOPS_API_KEY", "") + CRISP_WEBSITE_ID: str = os.getenv("CRISP_WEBSITE_ID", "") + STRIPE_API_KEY: str = os.getenv("STRIPE_API_KEY", "") + STRIPE_WEBHOOK_SECRET: str = os.getenv("STRIPE_WEBHOOK_SECRET", "") # LLM Providers (optional) - ALEPHALPHA_API_KEY: str = os.getenv("ALEPHALPHA_API_KEY", "") or "" - ANTHROPIC_API_KEY: str = os.getenv("ANTHROPIC_API_KEY", "") or "" - ANYSCALE_API_KEY: str = os.getenv("ANYSCALE_API_KEY", "") or "" - COHERE_API_KEY: str = os.getenv("COHERE_API_KEY", "") or "" - DEEPINFRA_API_KEY: str = os.getenv("DEEPINFRA_API_KEY", "") or "" - GEMINI_API_KEY: str = os.getenv("GEMINI_API_KEY", "") or "" - GROQ_API_KEY: str = os.getenv("GROQ_API_KEY", "") or "" - MISTRAL_API_KEY: str = os.getenv("MISTRAL_API_KEY", "") or "" - OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "") or "" - OPENROUTER_API_KEY: str = os.getenv("OPENROUTER_API_KEY", "") or "" - PERPLEXITYAI_API_KEY: str = os.getenv("PERPLEXITYAI_API_KEY", "") or "" - TOGETHERAI_API_KEY: str = os.getenv("TOGETHERAI_API_KEY", "") or "" + ALEPHALPHA_API_KEY: str = os.getenv("ALEPHALPHA_API_KEY", "") + ANTHROPIC_API_KEY: str = os.getenv("ANTHROPIC_API_KEY", "") + ANYSCALE_API_KEY: str = os.getenv("ANYSCALE_API_KEY", "") + COHERE_API_KEY: str = os.getenv("COHERE_API_KEY", "") + DEEPINFRA_API_KEY: str = os.getenv("DEEPINFRA_API_KEY", "") + GEMINI_API_KEY: str = os.getenv("GEMINI_API_KEY", "") + GROQ_API_KEY: str = os.getenv("GROQ_API_KEY", "") + MISTRAL_API_KEY: str = os.getenv("MISTRAL_API_KEY", "") + OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "") + OPENROUTER_API_KEY: str = os.getenv("OPENROUTER_API_KEY", "") + PERPLEXITYAI_API_KEY: str = os.getenv("PERPLEXITYAI_API_KEY", "") + TOGETHERAI_API_KEY: str = os.getenv("TOGETHERAI_API_KEY", "") AGENTA_BLOCKED_EMAILS: set = { e.strip().lower() - for e in (os.getenv("AGENTA_BLOCKED_EMAILS") or "").split(",") + for e in os.getenv("AGENTA_BLOCKED_EMAILS", "").split(",") if e.strip() } AGENTA_BLOCKED_DOMAINS: set = { e.strip().lower() - for e in (os.getenv("AGENTA_BLOCKED_DOMAINS") or "").split(",") - if e.strip() - } - AGENTA_ALLOWED_DOMAINS: set = { - e.strip().lower() - for e in (os.getenv("AGENTA_ALLOWED_DOMAINS") or "").split(",") + for e in os.getenv("AGENTA_BLOCKED_DOMAINS", "").split(",") if e.strip() } # AGENTA-SPECIFIC (INTERNAL INFRA) - DOCKER_NETWORK_MODE: str = os.getenv("DOCKER_NETWORK_MODE") or "bridge" + DOCKER_NETWORK_MODE: str = os.getenv("DOCKER_NETWORK_MODE", "bridge") # AGENTA-SPECIFIC (INTERNAL LOGGING) AGENTA_LOG_CONSOLE_ENABLED: bool = ( - os.getenv("AGENTA_LOG_CONSOLE_ENABLED") or "true" - ) in _TRUTHY - AGENTA_LOG_CONSOLE_LEVEL: str = ( - os.getenv("AGENTA_LOG_CONSOLE_LEVEL") or "TRACE" + os.getenv("AGENTA_LOG_CONSOLE_ENABLED", "true") in _TRUTHY + ) + AGENTA_LOG_CONSOLE_LEVEL: str = os.getenv( + "AGENTA_LOG_CONSOLE_LEVEL", "TRACE" ).upper() AGENTA_LOG_OTLP_ENABLED: bool = ( - os.getenv("AGENTA_LOG_OTLP_ENABLED") or "false" - ) in _TRUTHY - AGENTA_LOG_OTLP_LEVEL: str = (os.getenv("AGENTA_LOG_OTLP_LEVEL") or "INFO").upper() + os.getenv("AGENTA_LOG_OTLP_ENABLED", "false") in _TRUTHY + ) + AGENTA_LOG_OTLP_LEVEL: str = os.getenv("AGENTA_LOG_OTLP_LEVEL", "INFO").upper() AGENTA_LOG_FILE_ENABLED: bool = ( - os.getenv("AGENTA_LOG_FILE_ENABLED") or "true" - ) in _TRUTHY - AGENTA_LOG_FILE_LEVEL: str = ( - os.getenv("AGENTA_LOG_FILE_LEVEL") or "WARNING" - ).upper() - AGENTA_LOG_FILE_BASE: str = os.getenv("AGENTA_LOG_FILE_PATH") or "error" + os.getenv("AGENTA_LOG_FILE_ENABLED", "true") in _TRUTHY + ) + AGENTA_LOG_FILE_LEVEL: str = os.getenv("AGENTA_LOG_FILE_LEVEL", "WARNING").upper() + AGENTA_LOG_FILE_BASE: str = os.getenv("AGENTA_LOG_FILE_PATH", "error") # AGENTA-SPECIFIC (OTLP) AGENTA_OTLP_MAX_BATCH_BYTES: int = int( - os.getenv("AGENTA_OTLP_MAX_BATCH_BYTES") or str(10 * 1024 * 1024) + os.getenv("AGENTA_OTLP_MAX_BATCH_BYTES", str(10 * 1024 * 1024)) ) diff --git a/api/oss/src/utils/exceptions.py b/api/oss/src/utils/exceptions.py index 27318d98f6..528f4ba879 100644 --- a/api/oss/src/utils/exceptions.py +++ b/api/oss/src/utils/exceptions.py @@ -100,27 +100,17 @@ async def wrapper(*args, **kwargs): support_id = str(uuid4()) operation_id = func.__name__ if hasattr(func, "__name__") else None - user_id = None - organization_id = None - workspace_id = None - project_id = None - request_path = None - # request_query = None - # request_headers = None - # request_body = None - - with suppress(verbose=False): - request = kwargs.pop("request", None) - request = request if isinstance(request, Request) else None - state = request.state if request else None - user_id = state.user_id if state else None - organization_id = state.organization_id if state else None - workspace_id = state.workspace_id if state else None - project_id = state.project_id if state else None - request_path = request.url.path if request else None - # request_query = request.url.query if request else None - # request_headers = request.headers if request else None - # request_body = kwargs if "secrets" not in request_path else None + request = kwargs.pop("request", None) + request = request if isinstance(request, Request) else None + state = request.state if request else None + user_id = state.user_id if state else None + organization_id = state.organization_id if state else None + workspace_id = state.workspace_id if state else None + project_id = state.project_id if state else None + request_path = request.url.path if request else None + # request_query = request.url.query if request else None + # request_headers = request.headers if request else None + # request_body = kwargs if "secrets" not in request_path else None message = ( "An unexpected error occurred. " diff --git a/api/oss/src/utils/helpers.py b/api/oss/src/utils/helpers.py index d02ceff9fe..ccce60e420 100644 --- a/api/oss/src/utils/helpers.py +++ b/api/oss/src/utils/helpers.py @@ -1,74 +1,10 @@ -from typing import List, Dict -from uuid import UUID import os import sys -import unicodedata -import re - import click from oss.src.utils.env import env -def get_metrics_keys_from_schema(schema=None, path=()) -> List[Dict[str, str]]: - metrics = [] - - if not isinstance(schema, dict) or "type" not in schema: - return metrics - - metric_type = None - - t = schema["type"] - - if t == "object": - if "properties" in schema: - for key, prop in schema["properties"].items(): - metrics.extend(get_metrics_keys_from_schema(prop, path + (key,))) - else: - metric_type = "json" - - elif t == "array" and "items" in schema: - if schema["items"].get("type") == "string" and "enum" in schema["items"]: - metric_type = "categorical/multiple" - - elif t == "boolean": - metric_type = "binary" - - elif t == "string": - metric_type = "categorical/single" if "enum" in schema else "string" - - elif t == "number": - metric_type = "numeric/continuous" - - elif t == "integer": - metric_type = "numeric/discrete" - - if metric_type: - metrics.append({"path": ".".join(path), "type": metric_type}) - - return metrics - - -def get_slug_from_name_and_id( - name: str, - id: UUID, # pylint: disable=redefined-builtin -) -> str: - # Normalize Unicode (e.g., é → e) - name = unicodedata.normalize("NFKD", name) - # Remove non-ASCII characters - name = name.encode("ascii", "ignore").decode("ascii") - # Lowercase and remove non-word characters except hyphens and spaces - name = re.sub(r"[^\w\s-]", "", name.lower()) - # Replace any sequence of hyphens or whitespace with a single hyphen - name = re.sub(r"[-\s]+", "-", name) - # Trim leading/trailing hyphens - name = name.strip("-") - # Last 12 characters of the ID - slug = f"{name}-{id.hex[-12:]}" - - return slug.lower() - - def parse_url(url: str) -> str: """ Parses and potentially rewrites a URL based on the environment and Docker network mode. @@ -80,7 +16,7 @@ def parse_url(url: str) -> str: str: The parsed or rewritten URL suitable for the current environment and Docker network mode. """ - if "localhost" not in url and "0.0.0.0" not in url: + if "localhost" not in url: return url internal_url = os.getenv("AGENTA_API_INTERNAL_URL") @@ -90,24 +26,12 @@ def parse_url(url: str) -> str: docker_network_mode = env.DOCKER_NETWORK_MODE if not docker_network_mode or docker_network_mode == "bridge": - return url.replace( - "localhost", - "host.docker.internal", - ).replace( - "0.0.0.0", - "host.docker.internal", - ) + return url.replace("localhost", "host.docker.internal") if docker_network_mode == "host": return url - return url.replace( - "localhost", - "host.docker.internal", - ).replace( - "0.0.0.0", - "host.docker.internal", - ) + return url.replace("localhost", "host.docker.internal") def warn_deprecated_env_vars(): diff --git a/api/oss/src/utils/logging.py b/api/oss/src/utils/logging.py index 67c53d4369..fa424ce74c 100644 --- a/api/oss/src/utils/logging.py +++ b/api/oss/src/utils/logging.py @@ -4,9 +4,18 @@ import logging from typing import Any, Optional +# from datetime import datetime +# from logging.handlers import RotatingFileHandler + import structlog from structlog.typing import EventDict, WrappedLogger, Processor +# from opentelemetry.trace import get_current_span +# from opentelemetry._logs import set_logger_provider +# from opentelemetry.sdk._logs import LoggingHandler, LoggerProvider +# from opentelemetry.sdk._logs.export import BatchLogRecordProcessor +# from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter + from oss.src.utils.env import env @@ -33,6 +42,15 @@ def bound_logger_trace(self, *args, **kwargs): AGENTA_LOG_CONSOLE_ENABLED = env.AGENTA_LOG_CONSOLE_ENABLED AGENTA_LOG_CONSOLE_LEVEL = env.AGENTA_LOG_CONSOLE_LEVEL +# AGENTA_LOG_OTLP_ENABLED = env.AGENTA_LOG_OTLP_ENABLED +# AGENTA_LOG_OTLP_LEVEL = env.AGENTA_LOG_OTLP_LEVEL + +# AGENTA_LOG_FILE_ENABLED = env.AGENTA_LOG_FILE_ENABLED +# AGENTA_LOG_FILE_LEVEL = env.AGENTA_LOG_FILE_LEVEL +# AGENTA_LOG_FILE_BASE = env.AGENTA_LOG_FILE_PATH +# LOG_FILE_DATE = datetime.utcnow().strftime("%Y-%m-%d") +# AGENTA_LOG_FILE_PATH = f"{AGENTA_LOG_FILE_BASE}-{LOG_FILE_DATE}.log" + # COLORS LEVEL_COLORS = { "TRACE": "\033[97m", @@ -72,6 +90,15 @@ def process_positional_args(_, __, event_dict: EventDict) -> EventDict: return event_dict +# def add_trace_context(_, __, event_dict: EventDict) -> EventDict: +# span = get_current_span() +# if span and span.get_span_context().is_valid: +# ctx = span.get_span_context() +# event_dict["TraceId"] = format(ctx.trace_id, "032x") +# event_dict["SpanId"] = format(ctx.span_id, "016x") +# return event_dict + + def add_logger_info( logger: WrappedLogger, method_name: str, event_dict: EventDict ) -> EventDict: @@ -88,7 +115,6 @@ def add_logger_info( event_dict["SeverityNumber"] = SEVERITY_NUMBERS.get(level, 9) event_dict["LoggerName"] = logger.name event_dict["MethodName"] = method_name - event_dict["pid"] = os.getpid() return event_dict @@ -103,7 +129,6 @@ def colored_console_renderer() -> Processor: } def render(_, __, event_dict: EventDict) -> str: - pid = event_dict.pop("pid", None) ts = event_dict.pop("Timestamp", "")[:23] + "Z" level = event_dict.pop("level", "INFO") msg = event_dict.pop("event", "") @@ -120,69 +145,102 @@ def render(_, __, event_dict: EventDict) -> str: return render +# def plain_renderer() -> Processor: +# hidden = { +# "SeverityText", +# "SeverityNumber", +# "MethodName", +# "logger_factory", +# "LoggerName", +# "level", +# } + +# def render(_, __, event_dict: EventDict) -> str: +# ts = event_dict.pop("Timestamp", "")[:23] + "Z" +# level = event_dict.get("level", "") +# msg = event_dict.pop("event", "") +# padded = f"[{level:<5}]" +# logger = f"[{event_dict.pop('logger', '')}]" +# extras = " ".join(f"{k}={v}" for k, v in event_dict.items() if k not in hidden) +# return f"{ts} {padded} {msg} {logger} {extras}" + +# return render + + +# def json_renderer() -> Processor: +# return structlog.processors.JSONRenderer() + + SHARED_PROCESSORS: list[Processor] = [ structlog.processors.TimeStamper(fmt="iso", utc=True, key="Timestamp"), process_positional_args, + # add_trace_context, add_logger_info, structlog.processors.format_exc_info, structlog.processors.dict_tracebacks, ] -# Guard against double initialization -_LOGGING_CONFIGURED = False +def create_struct_logger( + processors: list[Processor], name: str +) -> structlog.stdlib.BoundLogger: + logger = logging.getLogger(name) + logger.setLevel(TRACE_LEVEL) + return structlog.wrap_logger( + logger, + processors=SHARED_PROCESSORS + processors, + wrapper_class=structlog.stdlib.BoundLogger, + logger_factory=structlog.stdlib.LoggerFactory(), + cache_logger_on_first_use=True, + ) -# ensure no duplicate sinks via root -_root = logging.getLogger() -_root.handlers.clear() -_root.propagate = False # CONFIGURE HANDLERS AND STRUCTLOG LOGGERS +handlers = [] loggers = [] -if AGENTA_LOG_CONSOLE_ENABLED and not _LOGGING_CONFIGURED: - _LOGGING_CONFIGURED = True - - # Create a single handler for console output - console_handler = logging.StreamHandler(sys.stdout) - console_handler.setLevel(getattr(logging, AGENTA_LOG_CONSOLE_LEVEL, TRACE_LEVEL)) - console_handler.setFormatter(logging.Formatter("%(message)s")) - - # Configure the structlog console logger - console_logger = logging.getLogger("agenta_console") - console_logger.handlers.clear() - console_logger.addHandler(console_handler) - console_logger.setLevel(TRACE_LEVEL) - console_logger.propagate = False - - loggers.append( - structlog.wrap_logger( - console_logger, - processors=SHARED_PROCESSORS + [colored_console_renderer()], - wrapper_class=structlog.stdlib.BoundLogger, - logger_factory=structlog.stdlib.LoggerFactory(), - cache_logger_on_first_use=False, # Don't cache to avoid stale state - ) - ) +if AGENTA_LOG_CONSOLE_ENABLED: + h = logging.StreamHandler(sys.stdout) + h.setLevel(getattr(logging, AGENTA_LOG_CONSOLE_LEVEL, TRACE_LEVEL)) + h.setFormatter(logging.Formatter("%(message)s")) + + # Console logger (your app logs) + logger = logging.getLogger("console") + logger.handlers.clear() + logger.addHandler(h) + logger.propagate = False + loggers.append(create_struct_logger([colored_console_renderer()], "console")) - # Configure uvicorn/gunicorn loggers with separate handlers + # Gunicorn/Uvicorn loggers for name in ("uvicorn.access", "uvicorn.error", "gunicorn.error"): - uh = logging.StreamHandler(sys.stdout) - uh.setLevel(getattr(logging, AGENTA_LOG_CONSOLE_LEVEL, TRACE_LEVEL)) - uh.setFormatter(logging.Formatter("%(message)s")) - server_logger = logging.getLogger(name) - server_logger.handlers.clear() - server_logger.setLevel(logging.INFO) - server_logger.addHandler(uh) - server_logger.propagate = False - - # Intercept agenta SDK loggers to prevent duplicate output - for sdk_name in ("agenta", "agenta.sdk"): - sdk_logger = logging.getLogger(sdk_name) - sdk_logger.handlers.clear() - sdk_logger.addHandler(console_handler) # Use our handler - sdk_logger.setLevel(logging.INFO) - sdk_logger.propagate = False + gunicorn_logger = logging.getLogger(name) + gunicorn_logger.handlers.clear() # ✅ fix here + gunicorn_logger.setLevel(logging.INFO) + gunicorn_logger.addHandler(h) + gunicorn_logger.propagate = False + +# if AGENTA_LOG_FILE_ENABLED: +# h = RotatingFileHandler(AGENTA_LOG_FILE_PATH, maxBytes=10 * 1024 * 1024, backupCount=5) +# h.setLevel(getattr(logging, AGENTA_LOG_FILE_LEVEL, logging.WARNING)) +# h.setFormatter(logging.Formatter("%(message)s")) +# logger = logging.getLogger("file") +# logger.addHandler(h) +# logger.propagate = False # 👈 PREVENT propagation to root (avoids Celery duplicate) +# loggers.append(create_struct_logger([plain_renderer()], "file")) + +# if AGENTA_LOG_OTLP_ENABLED: +# provider = LoggerProvider() +# exporter = OTLPLogExporter() +# provider.add_log_record_processor(BatchLogRecordProcessor(exporter)) +# set_logger_provider(provider) +# h = LoggingHandler( +# level=getattr(logging, AGENTA_LOG_OTLP_LEVEL, logging.INFO), logger_provider=provider +# ) +# h.setFormatter(logging.Formatter("%(message)s")) +# logger = logging.getLogger("otel") +# logger.addHandler(h) +# logger.propagate = False # 👈 PREVENT propagation to root (avo +# loggers.append(create_struct_logger([json_renderer()], "otel")) class MultiLogger: @@ -221,8 +279,11 @@ def bind(self, **kwargs): return MultiLogger(*(l.bind(**kwargs) for l in self._loggers)) +multi_logger = MultiLogger(*loggers) + + def get_logger(name: Optional[str] = None) -> MultiLogger: - return MultiLogger(*loggers).bind(logger=name) + return multi_logger.bind(logger=name) def get_module_logger(path: str) -> MultiLogger: diff --git a/api/oss/tests/legacy/conftest.py b/api/oss/tests/legacy/conftest.py index 03debc8ce5..0fe7063fbc 100644 --- a/api/oss/tests/legacy/conftest.py +++ b/api/oss/tests/legacy/conftest.py @@ -925,20 +925,7 @@ def get_all_supported_models(): "gpt-4o-mini", "gpt-4-1106-preview", ], - "Gemini": [ - "gemini/gemini-2.5-flash-preview-05-20", - "gemini/gemini-2.5-flash-preview-04-17", - "gemini/gemini-2.0-flash-001", - "gemini/gemini-2.5-pro-preview-05-06", - "gemini/gemini-2.0-flash-lite-preview-02-05", - "gemini/gemini-2.5-pro", - "gemini/gemini-2.5-flash", - "gemini/gemini-2.5-flash-preview-09-2025", - "gemini/gemini-2.5-flash-lite", - "gemini/gemini-2.5-flash-lite-preview-09-2025", - "gemini/gemini-2.0-flash", - "gemini/gemini-2.0-flash-lite", - ], + "Gemini": ["gemini/gemini-1.5-pro-latest", "gemini/gemini-1.5-flash"], "Cohere": [ "cohere/command-light", "cohere/command-r-plus", diff --git a/api/oss/tests/legacy/old_tests/conftest.py b/api/oss/tests/legacy/old_tests/conftest.py index 18f0e1cbf5..b9de4f8792 100644 --- a/api/oss/tests/legacy/old_tests/conftest.py +++ b/api/oss/tests/legacy/old_tests/conftest.py @@ -10,7 +10,7 @@ @pytest.fixture(scope="session", autouse=True) def event_loop(): """ - Create an instance of the default event loop for each testcase. + Create an instance of the default event loop for each test case. """ policy = asyncio.get_event_loop_policy() diff --git a/api/oss/tests/legacy/old_tests/models.py b/api/oss/tests/legacy/old_tests/models.py index 5c1d0ad49b..fcc6da9528 100644 --- a/api/oss/tests/legacy/old_tests/models.py +++ b/api/oss/tests/legacy/old_tests/models.py @@ -34,7 +34,7 @@ from oss.src.models.db_models import ( UserDB, - TestsetDB, + TestSetDB, AppVariantDB, VariantBaseDB, AppEnvironmentDB, @@ -47,7 +47,7 @@ AppDB, UserDB, ProjectDB, - TestsetDB, + TestSetDB, AppVariantDB, DeploymentDB, EvaluationDB, diff --git a/api/oss/tests/legacy/old_tests/unit/test_llm_apps_service.py b/api/oss/tests/legacy/old_tests/unit/test_llm_apps_service.py index af2757cf09..6e5a0905b3 100644 --- a/api/oss/tests/legacy/old_tests/unit/test_llm_apps_service.py +++ b/api/oss/tests/legacy/old_tests/unit/test_llm_apps_service.py @@ -46,7 +46,6 @@ def invoke_app_side_effect( result=Result(type="text", value="Success", error=None), latency=0.1, cost=0.01, - tokens=1, ) mock_invoke_app.side_effect = invoke_app_side_effect diff --git a/api/oss/tests/legacy/old_tests/variants_main_router/conftest.py b/api/oss/tests/legacy/old_tests/variants_main_router/conftest.py index be33f4fb2e..e363aec1a7 100644 --- a/api/oss/tests/legacy/old_tests/variants_main_router/conftest.py +++ b/api/oss/tests/legacy/old_tests/variants_main_router/conftest.py @@ -65,11 +65,11 @@ async def get_second_user_object(): async def get_or_create_project_from_db(): async with engine.core_session() as session: result = await session.execute( - select(ProjectDB).filter_by(project_name="Default Project", is_default=True) + select(ProjectDB).filter_by(project_name="default", is_default=True) ) project = result.scalars().first() if project is None: - create_project = ProjectDB(project_name="Default Project", is_default=True) + create_project = ProjectDB(project_name="default", is_default=True) session.add(create_project) await session.commit() await session.refresh(create_project) diff --git a/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_evaluators_router.py b/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_evaluators_router.py index 90e18ea27f..d533831f81 100644 --- a/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_evaluators_router.py +++ b/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_evaluators_router.py @@ -9,7 +9,7 @@ from oss.src.models.api.evaluation_model import EvaluationStatusEnum from oss.src.models.db_models import ( AppDB, - TestsetDB, + TestSetDB, AppVariantDB, EvaluationDB, DeploymentDB, @@ -200,7 +200,7 @@ async def create_evaluation_with_evaluator(evaluator_config_name): app_variant = app_variant_result.scalars().first() testset_result = await session.execute( - select(TestsetDB).filter_by(project_id=app.project_id) + select(TestSetDB).filter_by(project_id=app.project_id) ) testset = testset_result.scalars().first() @@ -267,7 +267,7 @@ async def create_evaluation_with_evaluator(evaluator_config_name): # app_variant = app_variant_result.scalars().first() # testset_result = await session.execute( -# select(TestsetDB).filter_by(project_id=app.project_id) +# select(TestSetDB).filter_by(project_id=app.project_id) # ) # testset = testset_result.scalars().first() diff --git a/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_testset_router.py b/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_testset_router.py index ab129bcac2..bd6994d65e 100644 --- a/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_testset_router.py +++ b/api/oss/tests/legacy/old_tests/variants_main_router/test_variant_testset_router.py @@ -6,7 +6,7 @@ from oss.src.models.db_models import ( AppDB, - TestsetDB, + TestSetDB, ) from oss.src.dbs.postgres.shared.engine import engine @@ -63,7 +63,7 @@ async def test_update_testset(): app = result.scalars().first() testset_result = await session.execute( - select(TestsetDB).filter_by(project_id=app.project_id) + select(TestSetDB).filter_by(project_id=app.project_id) ) testset = testset_result.scalars().first() @@ -111,7 +111,7 @@ async def test_get_testset(): app = result.scalars().first() testset_result = await session.execute( - select(TestsetDB).filter_by(project_id=app.project_id) + select(TestSetDB).filter_by(project_id=app.project_id) ) testset = testset_result.scalars().first() @@ -133,7 +133,7 @@ async def test_delete_testsets(): app = result.scalars().first() testset_result = await session.execute( - select(TestsetDB).filter_by(project_id=app.project_id) + select(TestSetDB).filter_by(project_id=app.project_id) ) testsets = testset_result.scalars().all() diff --git a/api/oss/tests/manual/__init__.py b/api/oss/tests/manual/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/tests/manual/evaluations/crud.http b/api/oss/tests/manual/evaluations/crud.http index aa0ef43d36..790c251b21 100644 --- a/api/oss/tests/manual/evaluations/crud.http +++ b/api/oss/tests/manual/evaluations/crud.http @@ -30,11 +30,10 @@ Authorization: {{authorization}} "my-meta": "aloha" }, "data": { - "results": [ + "steps": [ { - "key": "some-testset", - "type": "input", - "origin": "custom", + "key": "input", + "is_testcase": true, "references": { "testset": { "id": "4448964e-dc0d-41ec-a855-46773decad01" @@ -48,9 +47,7 @@ Authorization: {{authorization}} } }, { - "key": "some-application", - "type": "invocation", - "origin": "custom", + "key": "invocation", "references": { "application": { "id": "c9d5e07c-2324-4b63-85a5-b83fa1a1f2ba" @@ -63,13 +60,11 @@ Authorization: {{authorization}} } }, "inputs": [ - { "key": "some-testset" } + { "key": "input" } ] }, { - "key": "some-evaluator", - "type": "annotation", - "origin": "custom", + "key": "annotation", "references": { "evaluator": { "id": "2037d384-f201-455f-b890-b6be8fdb017c" @@ -82,69 +77,57 @@ Authorization: {{authorization}} } }, "inputs": [ - { "key": "some-testset" }, - { "key": "some-application" } + { "key": "input" }, + { "key": "invocation" } ] } ], "mappings": [ { - "column":{ - "kind": "input", - "name": "Country" - }, + "kind": "input", + "name": "Country", "step": { - "key": "some-testset", + "key": "input", "path": "country" } }, { - "column": { - "kind": "input", - "name": "Capital (expected)" - }, + "kind": "ground_truth", + "name": "Capital (expected)", "step": { - "key": "some-testset", + "key": "input", "path": "correct_answer" } }, { - "column": { - "kind": "application", - "name": "Capital (actual)" - }, + "kind": "application", + "name": "Capital (actual)", "step": { - "key": "some-application", + "key": "invocation", "path": "data.outputs.answer" } }, { - "column": { - "kind": "evaluator", - "name": "Score" - }, + "kind": "evaluator", + "name": "Score", "step": { - "key": "some-application", + "key": "annotation", "path": "data.outputs.score" } }, { - "column": { - "kind": "evaluator", - "name": "Confidence" - }, + "kind": "evaluator", + "name": "Confidence", "step": { - "key": "some-application", + "key": "annotation", "path": "data.outputs.confidence" } }, { - "column": { - "kind": "evaluator", - "name": "Explanation" - }, + "kind": "evaluator", + "name": "Explanation", "step": { - "key": "some-application", + "key": "annotation", "path": "data.outputs.explanation" } } @@ -162,12 +145,7 @@ POST {{base_url}}/runs/{{run_id}}/close Content-Type: application/json Authorization: {{authorization}} -### 1.3. REQUEST: Open run -POST {{base_url}}/runs/{{run_id}}/open -Content-Type: application/json -Authorization: {{authorization}} - -### 1.4. REQUEST: Get run +### 1.3. REQUEST: Get run GET {{base_url}}/runs/{{run_id}} Content-Type: application/json Authorization: {{authorization}} @@ -197,70 +175,51 @@ Authorization: {{authorization}} ### 2.1.1. REQUEST: Get all scenarios by run_id # @name get_scenarios -POST {{base_url}}/scenarios/query +GET {{base_url}}/scenarios/?run_id={{run_id}} Content-Type: application/json Authorization: {{authorization}} -{ - "scenario": { - "run_id": "{{run_id}}" - } -} - ### 2.1.2. REQUEST: Get scenarios by run_id with windowing # @name get_scenarios -POST {{base_url}}/scenarios/query +GET {{base_url}}/scenarios/?run_id={{run_id}}&limit=2 Content-Type: application/json Authorization: {{authorization}} -{ - "scenario": { - "run_id": "{{run_id}}" - }, - "windowing": { - "limit": 2 - } -} - ### @next_scenario = {{get_scenarios.response.body.scenarios[1].id}} ### 2.1.3. REQUEST: Get scenarios by run_id with windowing # @name get_scenarios -POST {{base_url}}/scenarios/query +GET {{base_url}}/scenarios/?run_id={{run_id}}&limit=2&next={{next_scenario}} Content-Type: application/json Authorization: {{authorization}} -{ - "scenario": { - "run_id": "{{run_id}}" - }, - "windowing": { - "limit": 2, - "next": "{{next_scenario}}" - } -} - -### - RESULTS ------------------------------------------------------------------ +### - STEPS -------------------------------------------------------------------- ### 3.1.1 REQUEST: Create input steps for scenarios 1 and 2 -# @name create_results -POST {{base_url}}/results/ +# @name create_steps +POST {{base_url}}/steps/ Content-Type: application/json Authorization: {{authorization}} { - "results": [ + "steps": [ { "status": "success", - "step_key": "some-testset", + "key": "input", + "repeat_id": "e0f2b1a4-3c8d-4b5c-9f7d-6a0e1f3a2b5c", + "retry_id": "ed775bb9-a493-4465-8fe7-54d249d94009", + "hash_id": "f5d1c10f-e0b6-4f29-ac3c-33d86b4eb3d2", "testcase_id": "5619b65c-8639-40c8-be68-c8b661f22dbe", "scenario_id": "{{scenario_id_1}}", "run_id": "{{run_id}}" }, { "status": "success", - "step_key": "some-testest", + "key": "input", + "repeat_id": "482af080-388a-4340-99b5-aef3d2815f08", + "retry_id": "a04274cd-3624-4a0f-8c52-c430c2742da9", + "hash_id": "91034143-fb8e-424e-98cf-a808da7479ef", "testcase_id": "1b3c9a82-c97b-44ec-a77d-73c754069c70", "scenario_id": "{{scenario_id_2}}", "run_id": "{{run_id}}" @@ -269,16 +228,18 @@ Authorization: {{authorization}} } ### 3.1.2 REQUEST: Create invocation step for scenario 1 -POST {{base_url}}/results/ +POST {{base_url}}/steps/ Content-Type: application/json Authorization: {{authorization}} { - "results": [ + "steps": [ { "status": "success", - "step_key": "some-application", + "key": "invocation", "trace_id": "b84f3862c7b74e759e19eeee88b5a1ba", + "repeat_id": "e0f2b1a4-3c8d-4b5c-9f7d-6a0e1f3a2b5c", + "retry_id": "8ed80b5f-4a62-42cd-893b-df695224007c", "scenario_id": "{{scenario_id_1}}", "run_id": "{{run_id}}" } @@ -286,16 +247,18 @@ Authorization: {{authorization}} } ### 3.1.3 REQUEST: Create annotation step for scenario 1 -POST {{base_url}}/results/ +POST {{base_url}}/steps/ Content-Type: application/json Authorization: {{authorization}} { - "results": [ + "steps": [ { "status": "success", - "step_key": "some-evaluator", + "key": "annotation", "trace_id": "306eb5ccd299493bb651985dff3ad9a7", + "repeat_id": "e0f2b1a4-3c8d-4b5c-9f7d-6a0e1f3a2b5c", + "retry_id": "bd64c09a-3504-4e7d-8cd5-de3d20d75eac", "scenario_id": "{{scenario_id_1}}", "run_id": "{{run_id}}" } @@ -303,16 +266,18 @@ Authorization: {{authorization}} } ### 3.1.4 REQUEST: Create invocation step for scenario 2 -POST {{base_url}}/results/ +POST {{base_url}}/steps/ Content-Type: application/json Authorization: {{authorization}} { - "results": [ + "steps": [ { "status": "success", - "step_key": "some-application", - "trace_id": "0773c47f216349ed8e5617830ae436ce", + "key": "invocation", + "trace_id": "0773c47f216349ed8e5617830ae436ce", + "repeat_id": "482af080-388a-4340-99b5-aef3d2815f08", + "retry_id":"cfcd1fd1-1794-47bc-893a-b5d88183ca56", "scenario_id": "{{scenario_id_2}}", "run_id": "{{run_id}}" } @@ -320,16 +285,18 @@ Authorization: {{authorization}} } ### 3.1.5 REQUEST: Create annotation step for scenario 2 -POST {{base_url}}/results/ +POST {{base_url}}/steps/ Content-Type: application/json Authorization: {{authorization}} { - "results": [ + "steps": [ { "status": "success", - "step_key": "some-evaluator", + "key": "annotation", "trace_id": "09989c5181784174ad44dd19da5b4f67", + "repeat_id": "482af080-388a-4340-99b5-aef3d2815f08", + "retry_id": "1907c5f3-a3df-4b64-af5f-fedb6c933d7e", "scenario_id": "{{scenario_id_2}}", "run_id": "{{run_id}}" } @@ -338,89 +305,42 @@ Authorization: {{authorization}} ### 3.2.1 REQUEST: Get all steps by run_id # @name get_all_steps -POST {{base_url}}/results/query +GET {{base_url}}/steps/?run_id={{run_id}} Content-Type: application/json Authorization: {{authorization}} -{ - "result": { - "run_id": "{{run_id}}" - } -} +### ### +@next_step = {{get_steps.response.body.steps[1].id}} ### 3.2.2 REQUEST: Get all steps by run_id with windowing # @name get_steps -POST {{base_url}}/results/query +GET {{base_url}}/steps/?run_id={{run_id}}&limit=2 Content-Type: application/json Authorization: {{authorization}} -{ - "result": { - "run_id": "{{run_id}}" - }, - "windowing": { - "limit": 2 - } -} - -### -@next_result = {{get_steps.response.body.results[1].id}} - - ### 3.2.3 REQUEST: Get all steps by run_id with windowing # @name get_steps -POST {{base_url}}/results/query +GET {{base_url}}/steps/?run_id={{run_id}}&limit=2&next={{next_step}} Content-Type: application/json Authorization: {{authorization}} -{ - "result": { - "run_id": "{{run_id}}" - }, - "windowing": { - "limit": 2, - "next": "{{next_result}}" - } -} - ### 3.3.1 REQUEST: Get all steps by run_id and key -POST {{base_url}}/results/query +GET {{base_url}}/steps/?run_id={{run_id}}&key=invocation&key=annotation Content-Type: application/json Authorization: {{authorization}} -{ - "result": { - "run_id": "{{run_id}}", - "step_keys": ["some-application", "some-evaluator"] - } -} - ### 3.3.2 REQUEST: Get all steps by run_id and status -POST {{base_url}}/results/query +GET {{base_url}}/steps/?run_id={{run_id}}&status=pending&status=success Content-Type: application/json Authorization: {{authorization}} -{ - "result": { - "run_id": "{{run_id}}", - "statuses": ["pending", "success"] - } -} - ### 3.3.3 REQUEST: Get all steps by run_id and scenario_id -POST {{base_url}}/results/query +GET {{base_url}}/steps/?run_id={{run_id}}&scenario_id={{scenario_id_1}}&scenario_id={{scenario_id_2}} Content-Type: application/json Authorization: {{authorization}} -{ - "result": { - "run_id": "{{run_id}}", - "scenario_ids": ["{{scenario_id_1}}"] - } -} - ### - METRICS ------------------------------------------------------------------ ### 6.1 REQUEST: Create run metrics @@ -477,24 +397,11 @@ Authorization: {{authorization}} ### 9. REQUEST: Get all metrics by run_id -POST {{base_url}}/metrics/query +GET {{base_url}}/metrics/?run_id={{run_id}} Content-Type: application/json Authorization: {{authorization}} -{ - "metrics": { - "run_id": "{{run_id}}" - } -} - ### 9. REQUEST: Get all metrics by run_id and scenario_id -POST {{base_url}}/metrics/query +GET {{base_url}}/metrics/?run_id={{run_id}}&scenario_id={{scenario_id_1}} Content-Type: application/json -Authorization: {{authorization}} - -{ - "metrics": { - "run_id": "{{run_id}}", - "scenario_ids": ["{{scenario_id_1}}"] - } -} \ No newline at end of file +Authorization: {{authorization}} \ No newline at end of file diff --git a/api/oss/tests/manual/evaluations/live.http b/api/oss/tests/manual/evaluations/live.http deleted file mode 100644 index 6a43280046..0000000000 --- a/api/oss/tests/manual/evaluations/live.http +++ /dev/null @@ -1,131 +0,0 @@ -@auth_key = {{$dotenv.AGENTA_AUTH_KEY}} || change-me -@api_url = {{$dotenv AGENTA_API_URL}} -@api_key = {{$dotenv AGENTA_API_KEY}} - - -### -# @name create_account -POST {{api_url}}/admin/account -Content-Type: application/json -Authorization: Access {{auth_key}} - -### -@user_id = {{create_account.response.body.user.id}} -# @authorization = {{create_account.response.body.scopes[0].credentials}} -@authorization = ApiKey {{api_key}} - -### -# @name list_queries -POST {{api_url}}/preview/simple/queries/query -Content-Type: application/json -Authorization: {{authorization}} - -{} - -### -# @name create_query -POST {{api_url}}/preview/simple/queries/ -Content-Type: application/json -Authorization: {{authorization}} - -{ - "query": { - "slug": "{{$guid}}", - "name": "Test Query", - "description": "This is a test query", - "tags": { - "my_key": "my_value" - }, - "data": { - "filtering": { - "conditions": [ - { - "field": "attributes", - "key": "ag.type.trace", - "operator": "is", - "value": "invocation" - } - ] - } - } - } -} - -### -# @name fetch_query_revision -POST {{api_url}}/preview/queries/revisions/retrieve -Content-Type: application/json -Authorization: {{authorization}} - -{ - "query_ref": { - "id": "{{create_query.response.body.query.id}}" - } -} - -### -# @name list_evaluators -POST {{api_url}}/preview/simple/evaluators/query -Content-Type: application/json -Authorization: {{authorization}} - -{} - -### -# @name fetch_evaluator_revision -POST {{api_url}}/preview/evaluators/revisions/retrieve -Content-Type: application/json -Authorization: {{authorization}} - -{ - "evaluator_ref": { - "id": "{{list_evaluators.response.body.evaluators[2].id}}" - } -} - -### -# @name list_evaluations -POST {{api_url}}/preview/simple/evaluations/query -Content-Type: application/json -Authorization: {{authorization}} - -{} - -### -# @name create_evaluation -POST {{api_url}}/preview/simple/evaluations/ -Content-Type: application/json -Authorization: {{authorization}} - -{ - "evaluation": { - "name": "Test JIT Evaluation", - "description": "This is a test jit evaluation", - "tags": { - "my_key": "my_value" - }, - "flags": { - "is_live": true - }, - "data": { - "query_steps": [ - "{{fetch_query_revision.response.body.query_revision.id}}" - ], - "evaluator_steps": [ - "{{fetch_evaluator_revision.response.body.evaluator_revision.evaluator_id}}" - ] - } - } -} - -### -# @name stop_evaluation -POST {{api_url}}/preview/simple/evaluations/{{create_evaluation.response.body.evaluation.id}}/stop -Content-Type: application/json -Authorization: {{authorization}} - -### -# @name start_evaluation -POST {{api_url}}/preview/simple/evaluations/{{create_evaluation.response.body.evaluation.id}}/start -Content-Type: application/json -Authorization: {{authorization}} diff --git a/api/oss/tests/manual/tracing/ingestion/agenta_streaming_response.py b/api/oss/tests/manual/tracing/ingestion/agenta_streaming_response.py deleted file mode 100644 index 3106a372b8..0000000000 --- a/api/oss/tests/manual/tracing/ingestion/agenta_streaming_response.py +++ /dev/null @@ -1,89 +0,0 @@ -# /// script -# dependencies = ["agenta", "fastapi", "pydantic"] -# /// -""" -Simple Agenta Observability FastAPI Example - -This example demonstrates the main issues with Agenta observability: -1. @ag.instrument() decorator doesn't work with generator functions (streaming responses) -2. Batch size configuration issues with OpenTelemetry environment variables - -""" -from dotenv import load_dotenv - -import asyncio -import json -import logging -import os -import uuid -from typing import AsyncGenerator -from datetime import datetime - -import agenta as ag -from fastapi import FastAPI -from fastapi.responses import StreamingResponse -from pydantic import BaseModel, Field - -# Configure logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -# ISSUE: OpenTelemetry environment variables don't work because Agenta overrides them -# These standard OTEL env vars should work but don't: -os.environ["OTEL_EXPORTER_OTLP_COMPRESSION"] = "gzip" -os.environ["OTEL_BSP_MAX_EXPORT_BATCH_SIZE"] = "10" -os.environ["OTEL_BSP_MAX_QUEUE_SIZE"] = "500" -os.environ["OTEL_BSP_SCHEDULE_DELAY"] = "3000" - -# Initialize Agenta -load_dotenv(override=True) - -ag.init() - - -class StreamConfig(BaseModel): - """Configuration for streaming responses""" - - max_tokens: int = Field(default=20, description="Maximum tokens to generate") - - -@ag.instrument() -async def streaming_generator_with_broken_decorator( - text: str, -) -> AsyncGenerator[str, None]: - config = StreamConfig() - - # The decorator will close the span here, before any yields - logger.info(f"🚨 Starting generator (decorator will close span immediately)") - - words = text.split() - for i, word in enumerate(words[: config.max_tokens]): - token = f"{word} " - logger.info(f"📡 Yielding: {token.strip()}") - yield f"data: {json.dumps({'token': token, 'index': i})}\\n\\n" - - yield "data: [DONE]\\n\\n" - - -@ag.instrument() -async def stream_with_broken_decorator( - text: str = "Hello world from Agenta streaming test", -): - logger.info("🚨 Using BROKEN decorator approach") - return StreamingResponse( - streaming_generator_with_broken_decorator(text), media_type="text/event-stream" - ) - - -if __name__ == "__main__": - import asyncio - - async def main(): - # Get the StreamingResponse object - response = await stream_with_broken_decorator() - - # Access the streaming content from the response - async for chunk in response.body_iterator: - print(chunk, end="") - - asyncio.run(main()) diff --git a/api/oss/tests/manual/tracing/ingestion/openinference_agno.py b/api/oss/tests/manual/tracing/ingestion/openinference_agno.py deleted file mode 100644 index 519dccad49..0000000000 --- a/api/oss/tests/manual/tracing/ingestion/openinference_agno.py +++ /dev/null @@ -1,172 +0,0 @@ -# /// script -# dependencies = ["agenta", "openinference-instrumentation-agno", "agno"] -# /// - -import re -from itertools import permutations - -import agenta as ag -from agno.agent import Agent -from agno.models.openai import OpenAIChat -from openinference.instrumentation.agno import AgnoInstrumentor - - -ag.init() -AgnoInstrumentor().instrument() - -# ------------------------------- -# Simulated Data -# ------------------------------- -tracking_data = { - "TRK10001": "In transit at Berlin Friedrichshain Distribution Center", - "TRK10002": "Delivered on 2025-06-14 at 18:32 in Charlottenburg", - "TRK10003": "Out for delivery — last scanned near Tempelhofer Feld", - "TRK10004": "Held at customs near Berlin Brandenburg Airport (BER)", - "TRK10005": "Awaiting pickup at Berlin Hauptbahnhof Parcel Station", -} - -distance_matrix = { - "Warehouse": {"A": 10, "B": 15, "C": 20}, - "A": {"Warehouse": 10, "B": 12, "C": 5}, - "B": {"Warehouse": 15, "A": 12, "C": 8}, - "C": {"Warehouse": 20, "A": 5, "B": 8}, -} - -driver_load = {"Alice": 2, "Bob": 3, "Charlie": 1} - - -# ------------------------------- -# Tool: TrackingTool -# ------------------------------- -class TrackingTool: - def __init__(self): - self.name = "TrackingTool" - self.description = "Provides shipment status updates given a tracking ID." - - def run(self, query: str) -> str: - match = re.search(r"\bTRK\d+\b", query.upper()) - if not match: - return "Please provide a valid tracking ID." - tid = match.group(0) - status = tracking_data.get(tid) - return f"Status for {tid}: {status}" if status else f"No information for {tid}." - - -# ------------------------------- -# Tool: RouteTool -# ------------------------------- -class RouteTool: - def __init__(self): - self.name = "RouteTool" - self.description = ( - "Computes the best delivery route given a start and destinations." - ) - - def run(self, query: str) -> str: - m = re.search(r"from\s+([\w\s]+)\s+to\s+(.+)", query, re.IGNORECASE) - if not m: - return "Specify route as 'from to , , ...'." - origin = m.group(1).strip() - dests = [d.strip() for d in re.split(r",| and ", m.group(2)) if d.strip()] - if origin not in distance_matrix: - return f"Unknown origin: {origin}." - for loc in dests: - if loc not in distance_matrix: - return f"Unknown destination: {loc}." - - # NOTE: since route algorithm is factorial, we need to guard against too many waypoints - MAX_WAYPOINTS = 6 - if len(dests) > MAX_WAYPOINTS: - return "Too many destinations – please provide at most 6." - - best_order = None - best_distance = float("inf") - for perm in permutations(dests): - total = 0 - cur = origin - for nxt in perm: - total += distance_matrix[cur][nxt] - cur = nxt - if total < best_distance: - best_distance = total - best_order = perm - route_plan = " → ".join([origin] + list(best_order)) if best_order else origin - return f"Optimal route: {route_plan} (Total distance: {best_distance} km)" - - -# ------------------------------- -# Tool: WorkloadBalancerTool -# ------------------------------- -class WorkloadBalancerTool: - def __init__(self): - self.name = "WorkloadBalancerTool" - self.description = "Assigns delivery locations to the least busy driver." - self.drivers = driver_load.copy() - - def run(self, query: str) -> str: - m = re.search(r"deliver(?:y|ies)? to (.+)", query, re.IGNORECASE) - if not m: - return "Please specify delivery locations like 'deliver to A, B, C'." - locations = [ - loc.strip() for loc in re.split(r",| and ", m.group(1)) if loc.strip() - ] - assignments = [] - for loc in locations: - least_loaded = min(self.drivers, key=lambda d: self.drivers[d]) - assignments.append(f"{loc} → {least_loaded}") - self.drivers[least_loaded] += 1 - return "Delivery assignments:\n" + "\n".join(assignments) - - -# ------------------------------- -# Create Agent -# ------------------------------- -agent = Agent( - model=OpenAIChat(id="gpt-4o"), - description="You are a smart dispatch assistant for a logistics team.", - instructions=[ - "Use TrackingTool for shipment queries.", - "Use RouteTool for route optimization.", - "Use WorkloadBalancerTool to assign deliveries to drivers.", - "Always return concise, formatted answers with relevant detail.", - ], - tools=[TrackingTool(), RouteTool(), WorkloadBalancerTool()], - show_tool_calls=False, - # markdown=True, -) - - -@ag.instrument() -def handle_dispatch_request(query: str): - result = agent.run(query) - return result.content - - -# ------------------------------- -# Run Agent Examples -# ------------------------------- -# print("Shipment Tracking") -# print(agent.run("Where is shipment TRK12345?")) - -# print("\nRoute Optimization") -# print(agent.run("Find the best route from Warehouse to A, B and C")) - -# print("\nWorkload Assignment") -# print(agent.run("Please assign deliveries to A, B, and C")) - -# print("\nCombined Multi-Tool Request") -# print( -# agent.run( -# "Where is shipment TRK10001? Also, find the best route from Warehouse to A, B and C, " -# "and assign deliveries to the least busy drivers." -# ) -# ) - - -if __name__ == "__main__": - print( - "Response: ", - handle_dispatch_request( - query="Where is shipment TRK10001? Also, find the best route from Warehouse to A, B and C, and assign deliveries to the least busy drivers." - ), - ) diff --git a/api/oss/tests/manual/tracing/ingestion/openinference_langgraph.py b/api/oss/tests/manual/tracing/ingestion/openinference_langgraph.py index 86420dd770..40708d17a3 100644 --- a/api/oss/tests/manual/tracing/ingestion/openinference_langgraph.py +++ b/api/oss/tests/manual/tracing/ingestion/openinference_langgraph.py @@ -9,9 +9,7 @@ from langchain_core.runnables import RunnableLambda from openinference.instrumentation.langchain import LangChainInstrumentor -from dotenv import load_dotenv -load_dotenv(override=True) ag.init() LangChainInstrumentor().instrument() diff --git a/api/oss/tests/manual/tracing/ingestion/openinference_openai_streaming.py b/api/oss/tests/manual/tracing/ingestion/openinference_openai_streaming.py deleted file mode 100644 index fe25016bac..0000000000 --- a/api/oss/tests/manual/tracing/ingestion/openinference_openai_streaming.py +++ /dev/null @@ -1,47 +0,0 @@ -# /// script -# dependencies = ["agenta", "openinference-instrumentation-openai", "openai"] -# /// -import agenta as ag -from dotenv import load_dotenv -from openinference.instrumentation.openai import OpenAIInstrumentor -from openai import OpenAI - - -load_dotenv(override=True) - - -ag.init() - - -openai = OpenAI() - -OpenAIInstrumentor().instrument() - - -@ag.instrument(spankind="WORKFLOW") -async def rag(topic: str, genre: str): - response = openai.chat.completions.create( - model="gpt-3.5-turbo", - messages=[ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": f"Write a short {genre} joke about {topic}."}, - ], - stream=True, # Enable streaming - ) - - # Handle the streaming response properly - for chunk in response: - if chunk.choices[0].delta.content is not None: - yield chunk.choices[0].delta.content - - -if __name__ == "__main__": - import asyncio - - async def main(): - print("Generating joke...") - async for chunk in rag(topic="AI", genre="hilarious"): - print(chunk, end="", flush=True) - print() # New line after completion - - asyncio.run(main()) diff --git a/api/oss/tests/manual/tracing/windowing.http b/api/oss/tests/manual/tracing/windowing.http index cad4ae83ad..5956e7d6a2 100644 --- a/api/oss/tests/manual/tracing/windowing.http +++ b/api/oss/tests/manual/tracing/windowing.http @@ -1,6 +1,6 @@ @host = http://localhost @base_url = {{host}}/api/preview/tracing -@api_key = ... +@api_key = UGZaImq8.a94d2c99eab827b1cd27678358016a61f2e92c2cdea8f33b1cf3cc2afb7065e8 ### diff --git a/api/oss/tests/manual/workflows/__init__.py b/api/oss/tests/manual/workflows/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/oss/tests/pytest/evaluations/test_evaluation_metrics_basics.py b/api/oss/tests/pytest/evaluations/test_evaluation_metrics_basics.py index 900608f0fa..1edc23d1e5 100644 --- a/api/oss/tests/pytest/evaluations/test_evaluation_metrics_basics.py +++ b/api/oss/tests/pytest/evaluations/test_evaluation_metrics_basics.py @@ -148,7 +148,7 @@ def test_delete_evaluation_metrics(self, authed_api): response = authed_api( "DELETE", "/preview/evaluations/metrics/", - json={"metrics_ids": [metrics[0]["id"]]}, + json={"metric_ids": [metrics[0]["id"]]}, ) # ---------------------------------------------------------------------- @@ -156,14 +156,14 @@ def test_delete_evaluation_metrics(self, authed_api): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert response["metrics_ids"][0] == metrics[0]["id"] + assert response["metric_ids"][0] == metrics[0]["id"] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "DELETE", "/preview/evaluations/metrics/", - json={"metrics_ids": [metrics[0]["id"]]}, + json={"metric_ids": [metrics[0]["id"]]}, ) # ---------------------------------------------------------------------- @@ -339,7 +339,7 @@ def test_delete_evaluation_metric(self, authed_api): response = authed_api( "DELETE", "/preview/evaluations/metrics/", - json={"metrics_ids": [metric["id"]]}, + json={"metric_ids": [metric["id"]]}, ) # ---------------------------------------------------------------------- @@ -347,14 +347,14 @@ def test_delete_evaluation_metric(self, authed_api): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert response["metrics_ids"][0] == metric["id"] + assert response["metric_ids"][0] == metric["id"] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "DELETE", "/preview/evaluations/metrics/", - json={"metrics_ids": [metric["id"]]}, + json={"metric_ids": [metric["id"]]}, ) # ---------------------------------------------------------------------- diff --git a/api/oss/tests/pytest/evaluations/test_evaluation_metrics_queries.py b/api/oss/tests/pytest/evaluations/test_evaluation_metrics_queries.py index 8c604f564d..32bd1c391e 100644 --- a/api/oss/tests/pytest/evaluations/test_evaluation_metrics_queries.py +++ b/api/oss/tests/pytest/evaluations/test_evaluation_metrics_queries.py @@ -79,7 +79,7 @@ class TestEvaluationMetricsQueries: def test_query_metrics_by_ids(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] - metrics_ids = [metric["id"] for metric in metrics] + metric_ids = [metric["id"] for metric in metrics] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -88,7 +88,7 @@ def test_query_metrics_by_ids(self, authed_api, mock_data): "/preview/evaluations/metrics/query", json={ "metric": { - "ids": metrics_ids, + "ids": metric_ids, } }, ) @@ -98,13 +98,13 @@ def test_query_metrics_by_ids(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 2 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- def test_query_metrics_by_tags(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] - metrics_ids = [metric["id"] for metric in metrics] + metric_ids = [metric["id"] for metric in metrics] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -126,13 +126,13 @@ def test_query_metrics_by_tags(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- def test_query_metrics_by_meta(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] - metrics_ids = [metric["id"] for metric in metrics] + metric_ids = [metric["id"] for metric in metrics] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -154,13 +154,13 @@ def test_query_metrics_by_meta(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- def test_query_metrics_by_status(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] - metrics_ids = [ + metric_ids = [ metric["id"] for metric in metrics if metric["status"] == "success" ] # ---------------------------------------------------------------------- @@ -181,13 +181,13 @@ def test_query_metrics_by_status(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- def test_query_metrics_by_statuses(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] - metrics_ids = [ + metric_ids = [ metric["id"] for metric in metrics if metric["status"] in ["success", "failure"] @@ -210,14 +210,14 @@ def test_query_metrics_by_statuses(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 2 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- def test_query_metrics_by_run_id(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] run_id = metrics[0]["run_id"] - metrics_ids = [metric["id"] for metric in metrics if metric["run_id"] == run_id] + metric_ids = [metric["id"] for metric in metrics if metric["run_id"] == run_id] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -236,16 +236,14 @@ def test_query_metrics_by_run_id(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- def test_query_metrics_by_run_ids(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- metrics = mock_data["metrics"] run_ids = [metrics[0]["run_id"], metrics[1]["run_id"]] - metrics_ids = [ - metric["id"] for metric in metrics if metric["run_id"] in run_ids - ] + metric_ids = [metric["id"] for metric in metrics if metric["run_id"] in run_ids] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -264,5 +262,5 @@ def test_query_metrics_by_run_ids(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 2 - assert all(metric["id"] in metrics_ids for metric in response["metrics"]) + assert all(metric["id"] in metric_ids for metric in response["metrics"]) # ---------------------------------------------------------------------- diff --git a/api/oss/tests/pytest/evaluations/test_evaluation_steps_basics.py b/api/oss/tests/pytest/evaluations/test_evaluation_steps_basics.py index c571409dc8..5ad87c47a9 100644 --- a/api/oss/tests/pytest/evaluations/test_evaluation_steps_basics.py +++ b/api/oss/tests/pytest/evaluations/test_evaluation_steps_basics.py @@ -45,7 +45,7 @@ def mock_data(authed_api): return _mock_data -class TestEvaluationResultsBasics: +class TestEvaluationStepsBasics: def test_create_evaluation_steps(self, authed_api, mock_data): # ARRANGE -------------------------------------------------------------- run_id = mock_data["runs"][0]["id"] @@ -69,7 +69,7 @@ def test_create_evaluation_steps(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) # ---------------------------------------------------------------------- @@ -122,7 +122,7 @@ def test_fetch_evaluation_steps(self, authed_api, mock_data): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -134,7 +134,7 @@ def test_fetch_evaluation_steps(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "GET", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", params={"scenario_id": scenario_id}, ) # ---------------------------------------------------------------------- @@ -185,7 +185,7 @@ def test_edit_evaluation_steps(self, authed_api, mock_data): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -197,7 +197,7 @@ def test_edit_evaluation_steps(self, authed_api, mock_data): assert response["steps"][2]["key"] == key_3 steps = response["steps"] - result_ids = [step["id"] for step in steps] + step_ids = [step["id"] for step in steps] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -207,18 +207,18 @@ def test_edit_evaluation_steps(self, authed_api, mock_data): response = authed_api( "PATCH", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) assert response.status_code == 200 response = response.json() assert response["count"] == 3 - assert response["steps"][0]["id"] == result_ids[0] + assert response["steps"][0]["id"] == step_ids[0] assert response["steps"][0]["status"] == "success" - assert response["steps"][1]["id"] == result_ids[1] + assert response["steps"][1]["id"] == step_ids[1] assert response["steps"][1]["status"] == "failure" - assert response["steps"][2]["id"] == result_ids[2] + assert response["steps"][2]["id"] == step_ids[2] assert response["steps"][2]["status"] == "cancelled" # ---------------------------------------------------------------------- @@ -249,7 +249,7 @@ def test_delete_evaluation_steps(self, authed_api, mock_data): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -257,14 +257,14 @@ def test_delete_evaluation_steps(self, authed_api, mock_data): response = response.json() assert response["count"] == 2 - result_ids = [step["id"] for step in response["steps"]] + step_ids = [step["id"] for step in response["steps"]] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "DELETE", - "/preview/evaluations/results/", - json={"result_ids": result_ids}, + "/preview/evaluations/steps/", + json={"step_ids": step_ids}, ) # ---------------------------------------------------------------------- @@ -272,14 +272,14 @@ def test_delete_evaluation_steps(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 2 - assert response["result_ids"] == result_ids + assert response["step_ids"] == step_ids # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "DELETE", - "/preview/evaluations/results/", - json={"result_ids": result_ids}, + "/preview/evaluations/steps/", + json={"step_ids": step_ids}, ) # ---------------------------------------------------------------------- @@ -306,7 +306,7 @@ def test_fetch_evaluation_step(self, authed_api, mock_data): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -314,13 +314,13 @@ def test_fetch_evaluation_step(self, authed_api, mock_data): response = response.json() assert response["count"] == 1 - result_id = response["steps"][0]["id"] + step_id = response["steps"][0]["id"] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "GET", - f"/preview/evaluations/results/{result_id}", + f"/preview/evaluations/steps/{step_id}", ) # ---------------------------------------------------------------------- @@ -328,7 +328,7 @@ def test_fetch_evaluation_step(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert response["step"]["id"] == result_id + assert response["step"]["id"] == step_id # ---------------------------------------------------------------------- def test_edit_evaluation_step(self, authed_api, mock_data): @@ -348,7 +348,7 @@ def test_edit_evaluation_step(self, authed_api, mock_data): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -359,7 +359,7 @@ def test_edit_evaluation_step(self, authed_api, mock_data): assert response["steps"][0]["status"] == "pending" step = response["steps"][0] - result_id = step["id"] + step_id = step["id"] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ @@ -367,7 +367,7 @@ def test_edit_evaluation_step(self, authed_api, mock_data): response = authed_api( "PATCH", - f"/preview/evaluations/results/{result_id}", + f"/preview/evaluations/steps/{step_id}", json={"step": step}, ) # ---------------------------------------------------------------------- @@ -377,7 +377,7 @@ def test_edit_evaluation_step(self, authed_api, mock_data): response = response.json() print(response) assert response["count"] == 1 - assert response["step"]["id"] == result_id + assert response["step"]["id"] == step_id assert response["step"]["status"] == "success" # ---------------------------------------------------------------------- @@ -398,7 +398,7 @@ def test_delete_evaluation_step(self, authed_api, mock_data): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -406,13 +406,13 @@ def test_delete_evaluation_step(self, authed_api, mock_data): response = response.json() assert response["count"] == 1 - result_id = response["steps"][0]["id"] + step_id = response["steps"][0]["id"] # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "DELETE", - f"/preview/evaluations/results/{result_id}", + f"/preview/evaluations/steps/{step_id}", ) # ---------------------------------------------------------------------- @@ -420,13 +420,13 @@ def test_delete_evaluation_step(self, authed_api, mock_data): assert response.status_code == 200 response = response.json() assert response["count"] == 1 - assert response["result_id"] == result_id + assert response["step_id"] == step_id # ---------------------------------------------------------------------- # ACT ------------------------------------------------------------------ response = authed_api( "DELETE", - f"/preview/evaluations/results/{result_id}", + f"/preview/evaluations/steps/{step_id}", ) # ---------------------------------------------------------------------- diff --git a/api/oss/tests/pytest/evaluations/test_evaluation_steps_queries.py b/api/oss/tests/pytest/evaluations/test_evaluation_steps_queries.py index 6cc2ce4405..36a88f2209 100644 --- a/api/oss/tests/pytest/evaluations/test_evaluation_steps_queries.py +++ b/api/oss/tests/pytest/evaluations/test_evaluation_steps_queries.py @@ -133,7 +133,7 @@ def mock_data(authed_api): response = authed_api( "POST", - "/preview/evaluations/results/", + "/preview/evaluations/steps/", json={"steps": steps}, ) @@ -153,12 +153,12 @@ def mock_data(authed_api): return _mock_data -class TestEvaluationResultsQueries: - def test_query_results_all(self, authed_api, mock_data): +class TestEvaluationStepsQueries: + def test_query_steps_all(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": {}, }, @@ -171,11 +171,11 @@ def test_query_results_all(self, authed_api, mock_data): assert response["count"] == 9 # ---------------------------------------------------------------------- - def test_query_results_by_tags(self, authed_api, mock_data): + def test_query_steps_by_tags(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "tags": { @@ -193,11 +193,11 @@ def test_query_results_by_tags(self, authed_api, mock_data): assert response["count"] == 3 # ---------------------------------------------------------------------- - def test_query_results_by_meta(self, authed_api, mock_data): + def test_query_steps_by_meta(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "meta": { @@ -215,11 +215,11 @@ def test_query_results_by_meta(self, authed_api, mock_data): assert response["count"] == 3 # ---------------------------------------------------------------------- - def test_query_results_by_run_id(self, authed_api, mock_data): + def test_query_steps_by_run_id(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "run_id": mock_data["runs"][0]["id"], @@ -234,11 +234,11 @@ def test_query_results_by_run_id(self, authed_api, mock_data): assert response["count"] == 9 # ---------------------------------------------------------------------- - def test_query_results_by_run_ids(self, authed_api, mock_data): + def test_query_steps_by_run_ids(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "run_ids": [mock_data["runs"][0]["id"]], @@ -253,11 +253,11 @@ def test_query_results_by_run_ids(self, authed_api, mock_data): assert response["count"] == 9 # ---------------------------------------------------------------------- - def test_query_results_by_scenario_id(self, authed_api, mock_data): + def test_query_steps_by_scenario_id(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "scenario_id": mock_data["scenarios"][0]["id"], @@ -272,11 +272,11 @@ def test_query_results_by_scenario_id(self, authed_api, mock_data): assert response["count"] == 6 # ---------------------------------------------------------------------- - def test_query_results_by_scenario_ids(self, authed_api, mock_data): + def test_query_steps_by_scenario_ids(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "scenario_ids": [s["id"] for s in mock_data["scenarios"]], @@ -291,11 +291,11 @@ def test_query_results_by_scenario_ids(self, authed_api, mock_data): assert response["count"] == 9 # ---------------------------------------------------------------------- - def test_query_results_by_ids(self, authed_api, mock_data): + def test_query_steps_by_ids(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "ids": [s["id"] for s in mock_data["steps"][:-1]], @@ -310,11 +310,11 @@ def test_query_results_by_ids(self, authed_api, mock_data): assert response["count"] == 9 - 1 # ---------------------------------------------------------------------- - def test_query_results_by_key(self, authed_api, mock_data): + def test_query_steps_by_key(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "key": "input", @@ -329,11 +329,11 @@ def test_query_results_by_key(self, authed_api, mock_data): assert response["count"] == 3 # ---------------------------------------------------------------------- - def test_query_results_by_keys(self, authed_api, mock_data): + def test_query_steps_by_keys(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "keys": ["input", "invocation"], @@ -348,11 +348,11 @@ def test_query_results_by_keys(self, authed_api, mock_data): assert response["count"] == 6 # ---------------------------------------------------------------------- - def test_query_results_by_repeat_id(self, authed_api, mock_data): + def test_query_steps_by_repeat_id(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "repeat_id": mock_data["steps"][0]["repeat_id"], @@ -367,11 +367,11 @@ def test_query_results_by_repeat_id(self, authed_api, mock_data): assert response["count"] == 6 # ---------------------------------------------------------------------- - def test_query_results_by_repeat_ids(self, authed_api, mock_data): + def test_query_steps_by_repeat_ids(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "repeat_ids": [ @@ -389,11 +389,11 @@ def test_query_results_by_repeat_ids(self, authed_api, mock_data): assert response["count"] == 9 # ---------------------------------------------------------------------- - def test_query_results_by_retry_id(self, authed_api, mock_data): + def test_query_steps_by_retry_id(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "retry_id": mock_data["steps"][0]["retry_id"], @@ -408,11 +408,11 @@ def test_query_results_by_retry_id(self, authed_api, mock_data): assert response["count"] == 6 # ---------------------------------------------------------------------- - def test_query_results_by_retry_ids(self, authed_api, mock_data): + def test_query_steps_by_retry_ids(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "retry_ids": [ @@ -430,11 +430,11 @@ def test_query_results_by_retry_ids(self, authed_api, mock_data): assert response["count"] == 9 # ---------------------------------------------------------------------- - def test_query_results_by_status(self, authed_api, mock_data): + def test_query_steps_by_status(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "status": "success", @@ -449,11 +449,11 @@ def test_query_results_by_status(self, authed_api, mock_data): assert response["count"] == 3 # ---------------------------------------------------------------------- - def test_query_results_by_statuses(self, authed_api, mock_data): + def test_query_steps_by_statuses(self, authed_api, mock_data): # ACT ------------------------------------------------------------------ response = authed_api( "POST", - "/preview/evaluations/results/query", + "/preview/evaluations/steps/query", json={ "step": { "statuses": ["success", "failure"], diff --git a/api/oss/tests/pytest/testsets/legacy/test_testsets_basics.py b/api/oss/tests/pytest/testsets/legacy/test_testsets_basics.py index 17b3f10fcd..7e0b36d41c 100644 --- a/api/oss/tests/pytest/testsets/legacy/test_testsets_basics.py +++ b/api/oss/tests/pytest/testsets/legacy/test_testsets_basics.py @@ -232,7 +232,7 @@ def test_upload_legacy_testsets_from_csv(self, authed_api): response = authed_api( "POST", - "/testsets/upload", + "/testsets/upload/", files=files, data=data, ) @@ -270,7 +270,7 @@ def test_upload_legacy_testsets_from_json(self, authed_api): response = authed_api( "POST", - "/testsets/upload", + "/testsets/upload/", files=files, data=data, ) diff --git a/api/oss/tests/pytest/testsets/test_testcases_basics.py b/api/oss/tests/pytest/testsets/test_testcases_basics.py index d7702b37a2..17f13cd454 100644 --- a/api/oss/tests/pytest/testsets/test_testcases_basics.py +++ b/api/oss/tests/pytest/testsets/test_testcases_basics.py @@ -24,8 +24,8 @@ def mock_data(authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -52,8 +52,8 @@ def mock_data(authed_api): testset = { "slug": slug, - "name": "Another Testset Name", - "description": "This is another testset description.", + "name": "Another Test Set Name", + "description": "This is another test set description.", "tags": tags, "meta": meta, "data": { diff --git a/api/oss/tests/pytest/testsets/test_testsets_basics.py b/api/oss/tests/pytest/testsets/test_testsets_basics.py index 540d2a1a09..c923c4da00 100644 --- a/api/oss/tests/pytest/testsets/test_testsets_basics.py +++ b/api/oss/tests/pytest/testsets/test_testsets_basics.py @@ -21,8 +21,8 @@ def test_create_testsets(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -68,8 +68,8 @@ def test_create_testsets_with_dedup(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -115,8 +115,8 @@ def test_fetch_testset(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -178,8 +178,8 @@ def test_edit_testset_with_changes(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -264,8 +264,8 @@ def test_edit_testset(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -340,8 +340,8 @@ def test_archive_testset(self, authed_api): testset = { "slug": slug, - "name": "Testset Name - Archive", - "description": "This is a testset description.", + "name": "Test Set Name - Archive", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -391,8 +391,8 @@ def test_unarchive_testset(self, authed_api): testset = { "slug": slug, - "name": "Testset Name - Unarchive", - "description": "This is a testset description.", + "name": "Test Set Name - Unarchive", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { diff --git a/api/oss/tests/pytest/testsets/test_testsets_files.py b/api/oss/tests/pytest/testsets/test_testsets_files.py index a61a7021b0..b65cc86502 100644 --- a/api/oss/tests/pytest/testsets/test_testsets_files.py +++ b/api/oss/tests/pytest/testsets/test_testsets_files.py @@ -22,12 +22,12 @@ def test_create_testsets_from_csv_file(self, authed_api): files = { "file": ("testset.csv", csvfile, "text/csv"), - "testset_name": (None, "Testset Name"), + "testset_name": (None, "Test Set Name"), } data = { "file_type": "csv", - "testset_description": "This is a testset description.", + "testset_description": "This is a test set description.", "testset_tags": dumps({"tag1": "value1", "tag2": "value2"}), "testset_meta": dumps({"meta1": "value1", "meta2": "value2"}), } @@ -61,12 +61,12 @@ def test_create_testsets_from_json_file(self, authed_api): files = { "file": ("testset.json", jsonfile, "application/json"), - "testset_name": (None, "Testset Name"), + "testset_name": (None, "Test Set Name"), } data = { "file_type": "json", - "testset_description": "This is a testset description.", + "testset_description": "This is a test set description.", "testset_tags": dumps({"tag1": "value1", "tag2": "value2"}), "testset_meta": dumps({"meta1": "value1", "meta2": "value2"}), } @@ -104,8 +104,8 @@ def test_fetch_testset_to_csv_file(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -166,8 +166,8 @@ def test_fetch_testset_to_json_file(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -229,8 +229,8 @@ def test_edit_testset_from_file(self, authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -267,7 +267,7 @@ def test_edit_testset_from_file(self, authed_api): files = { "file": ("testset.csv", csvfile, "text/csv"), - "testset_name": (None, "Updated Testset Name"), + "testset_name": (None, "Updated Test Set Name"), } data = { diff --git a/api/oss/tests/pytest/testsets/test_testsets_queries.py b/api/oss/tests/pytest/testsets/test_testsets_queries.py index 444aa91f4c..eddf6389be 100644 --- a/api/oss/tests/pytest/testsets/test_testsets_queries.py +++ b/api/oss/tests/pytest/testsets/test_testsets_queries.py @@ -23,8 +23,8 @@ def mock_data(authed_api): testset = { "slug": slug, - "name": "Testset Name", - "description": "This is a testset description.", + "name": "Test Set Name", + "description": "This is a test set description.", "tags": tags, "meta": meta, "data": { @@ -51,8 +51,8 @@ def mock_data(authed_api): testset = { "slug": slug, - "name": "Another Testset Name", - "description": "This is another testset description.", + "name": "Another Test Set Name", + "description": "This is another test set description.", "tags": tags, "meta": meta, "data": { diff --git a/api/poetry.lock b/api/poetry.lock index db46b33049..9db8388beb 100644 --- a/api/poetry.lock +++ b/api/poetry.lock @@ -1,42 +1,48 @@ # This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] -name = "agenta" -version = "0.61.0" -description = "The SDK for agenta is an open-source LLMOps platform." +name = "aioboto3" +version = "12.4.0" +description = "Async boto3 wrapper" optional = false -python-versions = "<4.0,>=3.11" +python-versions = "<4.0,>=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "agenta-0.61.0-py3-none-any.whl", hash = "sha256:b530a174b01ea76b1a9773a6982c31a243f7927801c753c3a0ad78455b250522"}, - {file = "agenta-0.61.0.tar.gz", hash = "sha256:525699f4d34326cdff7baefbdd1439ff989e7ee15ba8faf5acad94e144b59d8a"}, + {file = "aioboto3-12.4.0-py3-none-any.whl", hash = "sha256:a8d5a60852482cc7a472f3544e5ad7d2f5a911054ffa066357140dc6690da94b"}, + {file = "aioboto3-12.4.0.tar.gz", hash = "sha256:0fa03ac7a8c2c187358dd27cdf84da05e91bc1a3bd85519cad13521343a3d767"}, ] [package.dependencies] -decorator = ">=5.2.1,<6.0.0" -fastapi = ">=0.116.0,<0.117.0" -google-auth = ">=2.23,<3" -h11 = ">=0.16.0,<0.17.0" -httpx = ">=0.28.0,<0.29.0" -huggingface-hub = "<0.31.0" -importlib-metadata = ">=8.0.0,<9.0" -jinja2 = ">=3.1.6,<4.0.0" -litellm = "1.78.7" -openai = ">=1.106.0" -opentelemetry-api = ">=1.27.0,<2.0.0" -opentelemetry-exporter-otlp-proto-http = ">=1.27.0,<2.0.0" -opentelemetry-instrumentation = ">=0.56b0" -opentelemetry-sdk = ">=1.27.0,<2.0.0" -pydantic = ">=2,<3" -python-dotenv = ">=1.0.0,<2.0.0" -python-jsonpath = ">=2.0.0,<3.0.0" -pyyaml = ">=6.0.2,<7.0.0" -restrictedpython = {version = ">=8.0,<9.0", markers = "python_version >= \"3.11\" and python_version < \"3.14\""} -starlette = ">=0.47.0,<0.48.0" -structlog = ">=25.2.0,<26.0.0" -tiktoken = "0.11.0" -toml = ">=0.10.2,<0.11.0" +aiobotocore = {version = "2.12.3", extras = ["boto3"]} + +[package.extras] +chalice = ["chalice (>=1.24.0)"] +s3cse = ["cryptography (>=2.3.1)"] + +[[package]] +name = "aiobotocore" +version = "2.12.3" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "aiobotocore-2.12.3-py3-none-any.whl", hash = "sha256:86737685f4625e8f05c4e7a608a07cc97607263279f66cf6b02b640c4eafd324"}, + {file = "aiobotocore-2.12.3.tar.gz", hash = "sha256:e2a2929207bc5d62eb556106c2224c1fd106d5c65be2eb69f15cc8c34c44c236"}, +] + +[package.dependencies] +aiohttp = ">=3.7.4.post0,<4.0.0" +aioitertools = ">=0.5.1,<1.0.0" +boto3 = {version = ">=1.34.41,<1.34.70", optional = true, markers = "extra == \"boto3\""} +botocore = ">=1.34.41,<1.34.70" +wrapt = ">=1.10.10,<2.0.0" + +[package.extras] +awscli = ["awscli (>=1.32.41,<1.32.70)"] +boto3 = ["boto3 (>=1.34.41,<1.34.70)"] [[package]] name = "aiohappyeyeballs" @@ -45,7 +51,7 @@ description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -53,133 +59,99 @@ files = [ [[package]] name = "aiohttp" -version = "3.13.2" +version = "3.12.14" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2372b15a5f62ed37789a6b383ff7344fc5b9f243999b0cd9b629d8bc5f5b4155"}, - {file = "aiohttp-3.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7f8659a48995edee7229522984bd1009c1213929c769c2daa80b40fe49a180c"}, - {file = "aiohttp-3.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:939ced4a7add92296b0ad38892ce62b98c619288a081170695c6babe4f50e636"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6315fb6977f1d0dd41a107c527fee2ed5ab0550b7d885bc15fee20ccb17891da"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6e7352512f763f760baaed2637055c49134fd1d35b37c2dedfac35bfe5cf8725"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e09a0a06348a2dd73e7213353c90d709502d9786219f69b731f6caa0efeb46f5"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a09a6d073fb5789456545bdee2474d14395792faa0527887f2f4ec1a486a59d3"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b59d13c443f8e049d9e94099c7e412e34610f1f49be0f230ec656a10692a5802"}, - {file = "aiohttp-3.13.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:20db2d67985d71ca033443a1ba2001c4b5693fe09b0e29f6d9358a99d4d62a8a"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:960c2fc686ba27b535f9fd2b52d87ecd7e4fd1cf877f6a5cba8afb5b4a8bd204"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6c00dbcf5f0d88796151e264a8eab23de2997c9303dd7c0bf622e23b24d3ce22"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fed38a5edb7945f4d1bcabe2fcd05db4f6ec7e0e82560088b754f7e08d93772d"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b395bbca716c38bef3c764f187860e88c724b342c26275bc03e906142fc5964f"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:204ffff2426c25dfda401ba08da85f9c59525cdc42bda26660463dd1cbcfec6f"}, - {file = "aiohttp-3.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:05c4dd3c48fb5f15db31f57eb35374cb0c09afdde532e7fb70a75aede0ed30f6"}, - {file = "aiohttp-3.13.2-cp310-cp310-win32.whl", hash = "sha256:e574a7d61cf10351d734bcddabbe15ede0eaa8a02070d85446875dc11189a251"}, - {file = "aiohttp-3.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:364f55663085d658b8462a1c3f17b2b84a5c2e1ba858e1b79bff7b2e24ad1514"}, - {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0"}, - {file = "aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb"}, - {file = "aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592"}, - {file = "aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782"}, - {file = "aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8"}, - {file = "aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec"}, - {file = "aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c"}, - {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b"}, - {file = "aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc"}, - {file = "aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e"}, - {file = "aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169"}, - {file = "aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248"}, - {file = "aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e"}, - {file = "aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45"}, - {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be"}, - {file = "aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742"}, - {file = "aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e"}, - {file = "aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476"}, - {file = "aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23"}, - {file = "aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254"}, - {file = "aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a"}, - {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b"}, - {file = "aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61"}, - {file = "aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011"}, - {file = "aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4"}, - {file = "aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a"}, - {file = "aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940"}, - {file = "aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4"}, - {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673"}, - {file = "aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd"}, - {file = "aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e"}, - {file = "aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be"}, - {file = "aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c"}, - {file = "aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734"}, - {file = "aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f"}, - {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fbdf5ad6084f1940ce88933de34b62358d0f4a0b6ec097362dcd3e5a65a4989"}, - {file = "aiohttp-3.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c3a50345635a02db61792c85bb86daffac05330f6473d524f1a4e3ef9d0046d"}, - {file = "aiohttp-3.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e87dff73f46e969af38ab3f7cb75316a7c944e2e574ff7c933bc01b10def7f5"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2adebd4577724dcae085665f294cc57c8701ddd4d26140504db622b8d566d7aa"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e036a3a645fe92309ec34b918394bb377950cbb43039a97edae6c08db64b23e2"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:23ad365e30108c422d0b4428cf271156dd56790f6dd50d770b8e360e6c5ab2e6"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1f9b2c2d4b9d958b1f9ae0c984ec1dd6b6689e15c75045be8ccb4011426268ca"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a92cf4b9bea33e15ecbaa5c59921be0f23222608143d025c989924f7e3e0c07"}, - {file = "aiohttp-3.13.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:070599407f4954021509193404c4ac53153525a19531051661440644728ba9a7"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:29562998ec66f988d49fb83c9b01694fa927186b781463f376c5845c121e4e0b"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4dd3db9d0f4ebca1d887d76f7cdbcd1116ac0d05a9221b9dad82c64a62578c4d"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d7bc4b7f9c4921eba72677cd9fedd2308f4a4ca3e12fab58935295ad9ea98700"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dacd50501cd017f8cccb328da0c90823511d70d24a323196826d923aad865901"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8b2f1414f6a1e0683f212ec80e813f4abef94c739fd090b66c9adf9d2a05feac"}, - {file = "aiohttp-3.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04c3971421576ed24c191f610052bcb2f059e395bc2489dd99e397f9bc466329"}, - {file = "aiohttp-3.13.2-cp39-cp39-win32.whl", hash = "sha256:9f377d0a924e5cc94dc620bc6366fc3e889586a7f18b748901cf016c916e2084"}, - {file = "aiohttp-3.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:9c705601e16c03466cb72011bd1af55d68fa65b045356d8f96c216e5f6db0fa5"}, - {file = "aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "aiohttp-3.12.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:906d5075b5ba0dd1c66fcaaf60eb09926a9fef3ca92d912d2a0bbdbecf8b1248"}, + {file = "aiohttp-3.12.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c875bf6fc2fd1a572aba0e02ef4e7a63694778c5646cdbda346ee24e630d30fb"}, + {file = "aiohttp-3.12.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbb284d15c6a45fab030740049d03c0ecd60edad9cd23b211d7e11d3be8d56fd"}, + {file = "aiohttp-3.12.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e360381e02e1a05d36b223ecab7bc4a6e7b5ab15760022dc92589ee1d4238c"}, + {file = "aiohttp-3.12.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aaf90137b5e5d84a53632ad95ebee5c9e3e7468f0aab92ba3f608adcb914fa95"}, + {file = "aiohttp-3.12.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e532a25e4a0a2685fa295a31acf65e027fbe2bea7a4b02cdfbbba8a064577663"}, + {file = "aiohttp-3.12.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eab9762c4d1b08ae04a6c77474e6136da722e34fdc0e6d6eab5ee93ac29f35d1"}, + {file = "aiohttp-3.12.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abe53c3812b2899889a7fca763cdfaeee725f5be68ea89905e4275476ffd7e61"}, + {file = "aiohttp-3.12.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5760909b7080aa2ec1d320baee90d03b21745573780a072b66ce633eb77a8656"}, + {file = "aiohttp-3.12.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:02fcd3f69051467bbaa7f84d7ec3267478c7df18d68b2e28279116e29d18d4f3"}, + {file = "aiohttp-3.12.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4dcd1172cd6794884c33e504d3da3c35648b8be9bfa946942d353b939d5f1288"}, + {file = "aiohttp-3.12.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:224d0da41355b942b43ad08101b1b41ce633a654128ee07e36d75133443adcda"}, + {file = "aiohttp-3.12.14-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e387668724f4d734e865c1776d841ed75b300ee61059aca0b05bce67061dcacc"}, + {file = "aiohttp-3.12.14-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:dec9cde5b5a24171e0b0a4ca064b1414950904053fb77c707efd876a2da525d8"}, + {file = "aiohttp-3.12.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bbad68a2af4877cc103cd94af9160e45676fc6f0c14abb88e6e092b945c2c8e3"}, + {file = "aiohttp-3.12.14-cp310-cp310-win32.whl", hash = "sha256:ee580cb7c00bd857b3039ebca03c4448e84700dc1322f860cf7a500a6f62630c"}, + {file = "aiohttp-3.12.14-cp310-cp310-win_amd64.whl", hash = "sha256:cf4f05b8cea571e2ccc3ca744e35ead24992d90a72ca2cf7ab7a2efbac6716db"}, + {file = "aiohttp-3.12.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f4552ff7b18bcec18b60a90c6982049cdb9dac1dba48cf00b97934a06ce2e597"}, + {file = "aiohttp-3.12.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8283f42181ff6ccbcf25acaae4e8ab2ff7e92b3ca4a4ced73b2c12d8cd971393"}, + {file = "aiohttp-3.12.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:040afa180ea514495aaff7ad34ec3d27826eaa5d19812730fe9e529b04bb2179"}, + {file = "aiohttp-3.12.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b413c12f14c1149f0ffd890f4141a7471ba4b41234fe4fd4a0ff82b1dc299dbb"}, + {file = "aiohttp-3.12.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d6f607ce2e1a93315414e3d448b831238f1874b9968e1195b06efaa5c87e245"}, + {file = "aiohttp-3.12.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:565e70d03e924333004ed101599902bba09ebb14843c8ea39d657f037115201b"}, + {file = "aiohttp-3.12.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4699979560728b168d5ab63c668a093c9570af2c7a78ea24ca5212c6cdc2b641"}, + {file = "aiohttp-3.12.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5fdf6af93ec6c99bf800eba3af9a43d8bfd66dce920ac905c817ef4a712afe"}, + {file = "aiohttp-3.12.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ac76627c0b7ee0e80e871bde0d376a057916cb008a8f3ffc889570a838f5cc7"}, + {file = "aiohttp-3.12.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:798204af1180885651b77bf03adc903743a86a39c7392c472891649610844635"}, + {file = "aiohttp-3.12.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4f1205f97de92c37dd71cf2d5bcfb65fdaed3c255d246172cce729a8d849b4da"}, + {file = "aiohttp-3.12.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:76ae6f1dd041f85065d9df77c6bc9c9703da9b5c018479d20262acc3df97d419"}, + {file = "aiohttp-3.12.14-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a194ace7bc43ce765338ca2dfb5661489317db216ea7ea700b0332878b392cab"}, + {file = "aiohttp-3.12.14-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:16260e8e03744a6fe3fcb05259eeab8e08342c4c33decf96a9dad9f1187275d0"}, + {file = "aiohttp-3.12.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c779e5ebbf0e2e15334ea404fcce54009dc069210164a244d2eac8352a44b28"}, + {file = "aiohttp-3.12.14-cp311-cp311-win32.whl", hash = "sha256:a289f50bf1bd5be227376c067927f78079a7bdeccf8daa6a9e65c38bae14324b"}, + {file = "aiohttp-3.12.14-cp311-cp311-win_amd64.whl", hash = "sha256:0b8a69acaf06b17e9c54151a6c956339cf46db4ff72b3ac28516d0f7068f4ced"}, + {file = "aiohttp-3.12.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a0ecbb32fc3e69bc25efcda7d28d38e987d007096cbbeed04f14a6662d0eee22"}, + {file = "aiohttp-3.12.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0400f0ca9bb3e0b02f6466421f253797f6384e9845820c8b05e976398ac1d81a"}, + {file = "aiohttp-3.12.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a56809fed4c8a830b5cae18454b7464e1529dbf66f71c4772e3cfa9cbec0a1ff"}, + {file = "aiohttp-3.12.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f2e373276e4755691a963e5d11756d093e346119f0627c2d6518208483fb6d"}, + {file = "aiohttp-3.12.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ca39e433630e9a16281125ef57ece6817afd1d54c9f1bf32e901f38f16035869"}, + {file = "aiohttp-3.12.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c748b3f8b14c77720132b2510a7d9907a03c20ba80f469e58d5dfd90c079a1c"}, + {file = "aiohttp-3.12.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a568abe1b15ce69d4cc37e23020720423f0728e3cb1f9bcd3f53420ec3bfe7"}, + {file = "aiohttp-3.12.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9888e60c2c54eaf56704b17feb558c7ed6b7439bca1e07d4818ab878f2083660"}, + {file = "aiohttp-3.12.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3006a1dc579b9156de01e7916d38c63dc1ea0679b14627a37edf6151bc530088"}, + {file = "aiohttp-3.12.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa8ec5c15ab80e5501a26719eb48a55f3c567da45c6ea5bb78c52c036b2655c7"}, + {file = "aiohttp-3.12.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:39b94e50959aa07844c7fe2206b9f75d63cc3ad1c648aaa755aa257f6f2498a9"}, + {file = "aiohttp-3.12.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04c11907492f416dad9885d503fbfc5dcb6768d90cad8639a771922d584609d3"}, + {file = "aiohttp-3.12.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:88167bd9ab69bb46cee91bd9761db6dfd45b6e76a0438c7e884c3f8160ff21eb"}, + {file = "aiohttp-3.12.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:791504763f25e8f9f251e4688195e8b455f8820274320204f7eafc467e609425"}, + {file = "aiohttp-3.12.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785b112346e435dd3a1a67f67713a3fe692d288542f1347ad255683f066d8e0"}, + {file = "aiohttp-3.12.14-cp312-cp312-win32.whl", hash = "sha256:15f5f4792c9c999a31d8decf444e79fcfd98497bf98e94284bf390a7bb8c1729"}, + {file = "aiohttp-3.12.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b66e1a182879f579b105a80d5c4bd448b91a57e8933564bf41665064796a338"}, + {file = "aiohttp-3.12.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3143a7893d94dc82bc409f7308bc10d60285a3cd831a68faf1aa0836c5c3c767"}, + {file = "aiohttp-3.12.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3d62ac3d506cef54b355bd34c2a7c230eb693880001dfcda0bf88b38f5d7af7e"}, + {file = "aiohttp-3.12.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48e43e075c6a438937c4de48ec30fa8ad8e6dfef122a038847456bfe7b947b63"}, + {file = "aiohttp-3.12.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:077b4488411a9724cecc436cbc8c133e0d61e694995b8de51aaf351c7578949d"}, + {file = "aiohttp-3.12.14-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d8c35632575653f297dcbc9546305b2c1133391089ab925a6a3706dfa775ccab"}, + {file = "aiohttp-3.12.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b8ce87963f0035c6834b28f061df90cf525ff7c9b6283a8ac23acee6502afd4"}, + {file = "aiohttp-3.12.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a2cf66e32a2563bb0766eb24eae7e9a269ac0dc48db0aae90b575dc9583026"}, + {file = "aiohttp-3.12.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdea089caf6d5cde975084a884c72d901e36ef9c2fd972c9f51efbbc64e96fbd"}, + {file = "aiohttp-3.12.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7865f27db67d49e81d463da64a59365ebd6b826e0e4847aa111056dcb9dc88"}, + {file = "aiohttp-3.12.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0ab5b38a6a39781d77713ad930cb5e7feea6f253de656a5f9f281a8f5931b086"}, + {file = "aiohttp-3.12.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b3b15acee5c17e8848d90a4ebc27853f37077ba6aec4d8cb4dbbea56d156933"}, + {file = "aiohttp-3.12.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e4c972b0bdaac167c1e53e16a16101b17c6d0ed7eac178e653a07b9f7fad7151"}, + {file = "aiohttp-3.12.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7442488b0039257a3bdbc55f7209587911f143fca11df9869578db6c26feeeb8"}, + {file = "aiohttp-3.12.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f68d3067eecb64c5e9bab4a26aa11bd676f4c70eea9ef6536b0a4e490639add3"}, + {file = "aiohttp-3.12.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f88d3704c8b3d598a08ad17d06006cb1ca52a1182291f04979e305c8be6c9758"}, + {file = "aiohttp-3.12.14-cp313-cp313-win32.whl", hash = "sha256:a3c99ab19c7bf375c4ae3debd91ca5d394b98b6089a03231d4c580ef3c2ae4c5"}, + {file = "aiohttp-3.12.14-cp313-cp313-win_amd64.whl", hash = "sha256:3f8aad695e12edc9d571f878c62bedc91adf30c760c8632f09663e5f564f4baa"}, + {file = "aiohttp-3.12.14-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b8cc6b05e94d837bcd71c6531e2344e1ff0fb87abe4ad78a9261d67ef5d83eae"}, + {file = "aiohttp-3.12.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1dcb015ac6a3b8facd3677597edd5ff39d11d937456702f0bb2b762e390a21b"}, + {file = "aiohttp-3.12.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3779ed96105cd70ee5e85ca4f457adbce3d9ff33ec3d0ebcdf6c5727f26b21b3"}, + {file = "aiohttp-3.12.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:717a0680729b4ebd7569c1dcd718c46b09b360745fd8eb12317abc74b14d14d0"}, + {file = "aiohttp-3.12.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b5dd3a2ef7c7e968dbbac8f5574ebeac4d2b813b247e8cec28174a2ba3627170"}, + {file = "aiohttp-3.12.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4710f77598c0092239bc12c1fcc278a444e16c7032d91babf5abbf7166463f7b"}, + {file = "aiohttp-3.12.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f3e9f75ae842a6c22a195d4a127263dbf87cbab729829e0bd7857fb1672400b2"}, + {file = "aiohttp-3.12.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9c8d55d6802086edd188e3a7d85a77787e50d56ce3eb4757a3205fa4657922"}, + {file = "aiohttp-3.12.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79b29053ff3ad307880d94562cca80693c62062a098a5776ea8ef5ef4b28d140"}, + {file = "aiohttp-3.12.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23e1332fff36bebd3183db0c7a547a1da9d3b4091509f6d818e098855f2f27d3"}, + {file = "aiohttp-3.12.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a564188ce831fd110ea76bcc97085dd6c625b427db3f1dbb14ca4baa1447dcbc"}, + {file = "aiohttp-3.12.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a7a1b4302f70bb3ec40ca86de82def532c97a80db49cac6a6700af0de41af5ee"}, + {file = "aiohttp-3.12.14-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1b07ccef62950a2519f9bfc1e5b294de5dd84329f444ca0b329605ea787a3de5"}, + {file = "aiohttp-3.12.14-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:938bd3ca6259e7e48b38d84f753d548bd863e0c222ed6ee6ace3fd6752768a84"}, + {file = "aiohttp-3.12.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8bc784302b6b9f163b54c4e93d7a6f09563bd01ff2b841b29ed3ac126e5040bf"}, + {file = "aiohttp-3.12.14-cp39-cp39-win32.whl", hash = "sha256:a3416f95961dd7d5393ecff99e3f41dc990fb72eda86c11f2a60308ac6dcd7a0"}, + {file = "aiohttp-3.12.14-cp39-cp39-win_amd64.whl", hash = "sha256:196858b8820d7f60578f8b47e5669b3195c21d8ab261e39b1d705346458f445f"}, + {file = "aiohttp-3.12.14.tar.gz", hash = "sha256:6e06e120e34d93100de448fd941522e11dafa78ef1a893c179901b7d66aa29f2"}, ] [package.dependencies] @@ -192,7 +164,7 @@ propcache = ">=0.2.0" yarl = ">=1.17.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns (>=3.3.0)", "backports.zstd", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.3.0)", "brotlicffi"] [[package]] name = "aiohttp-retry" @@ -201,7 +173,7 @@ description = "Simple retry client for aiohttp" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "aiohttp_retry-2.9.1-py3-none-any.whl", hash = "sha256:66d2759d1921838256a05a3f80ad7e724936f083e35be5abb5e16eed6be6dc54"}, {file = "aiohttp_retry-2.9.1.tar.gz", hash = "sha256:8eb75e904ed4ee5c2ec242fefe85bf04240f685391c4879d8f541d6028ff01f1"}, @@ -210,6 +182,23 @@ files = [ [package.dependencies] aiohttp = "*" +[[package]] +name = "aioitertools" +version = "0.12.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "aioitertools-0.12.0-py3-none-any.whl", hash = "sha256:fc1f5fac3d737354de8831cbba3eb04f79dd649d8f3afb4c5b114925e662a796"}, + {file = "aioitertools-0.12.0.tar.gz", hash = "sha256:c2a9055b4fbb7705f561b9d86053e8af5d10cc845d22c32008c43490b2d8dd6b"}, +] + +[package.extras] +dev = ["attribution (==1.8.0)", "black (==24.8.0)", "build (>=1.2)", "coverage (==7.6.1)", "flake8 (==7.1.1)", "flit (==3.9.0)", "mypy (==1.11.2)", "ufmt (==2.7.1)", "usort (==1.0.8.post1)"] +docs = ["sphinx (==8.0.2)", "sphinx-mdinclude (==0.6.2)"] + [[package]] name = "aiosignal" version = "1.4.0" @@ -217,7 +206,7 @@ description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, @@ -234,7 +223,7 @@ description = "asyncio SMTP client" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "aiosmtplib-3.0.2-py3-none-any.whl", hash = "sha256:8783059603a34834c7c90ca51103c3aa129d5922003b5ce98dbaa6d4440f10fc"}, {file = "aiosmtplib-3.0.2.tar.gz", hash = "sha256:08fd840f9dbc23258025dca229e8a8f04d2ccf3ecb1319585615bfc7933f7f47"}, @@ -246,15 +235,15 @@ uvloop = ["uvloop (>=0.18)"] [[package]] name = "alembic" -version = "1.17.1" +version = "1.16.4" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "alembic-1.17.1-py3-none-any.whl", hash = "sha256:cbc2386e60f89608bb63f30d2d6cc66c7aaed1fe105bd862828600e5ad167023"}, - {file = "alembic-1.17.1.tar.gz", hash = "sha256:8a289f6778262df31571d29cca4c7fbacd2f0f582ea0816f4c399b6da7528486"}, + {file = "alembic-1.16.4-py3-none-any.whl", hash = "sha256:b05e51e8e82efc1abd14ba2af6392897e145930c3e0a2faf2b0da2f7f7fd660d"}, + {file = "alembic-1.16.4.tar.gz", hash = "sha256:efab6ada0dd0fae2c92060800e0bf5c1dc26af15a10e02fb4babff164b4725e2"}, ] [package.dependencies] @@ -272,7 +261,7 @@ description = "Low-level AMQP client for Python (fork of amqplib)." optional = false python-versions = ">=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2"}, {file = "amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432"}, @@ -288,7 +277,7 @@ description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -296,36 +285,37 @@ files = [ [[package]] name = "anyio" -version = "4.11.0" -description = "High-level concurrency and networking framework on top of asyncio or Trio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, - {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, ] [package.dependencies] idna = ">=2.8" sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.31.0)"] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] [[package]] name = "asgiref" -version = "3.10.0" +version = "3.9.1" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "asgiref-3.10.0-py3-none-any.whl", hash = "sha256:aef8a81283a34d0ab31630c9b7dfe70c812c95eba78171367ca8745e88124734"}, - {file = "asgiref-3.10.0.tar.gz", hash = "sha256:d89f2d8cd8b56dada7d52fa7dc8075baa08fb836560710d38c292a7a3f78c04e"}, + {file = "asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c"}, + {file = "asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142"}, ] [package.extras] @@ -344,6 +334,22 @@ files = [ {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] +[[package]] +name = "asyncer" +version = "0.0.2" +description = "Asyncer, async and await, focused on developer experience." +optional = false +python-versions = ">=3.6.2,<4.0.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "asyncer-0.0.2-py3-none-any.whl", hash = "sha256:46e0e1423ce21588350ad425875e81795280b9e1f517e8a389de940b86c348bd"}, + {file = "asyncer-0.0.2.tar.gz", hash = "sha256:d546c85f3626ebbaf06bb4395db49761c902a61a6ac802b1a74133cab4f7f433"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<4.0.0" + [[package]] name = "asyncpg" version = "0.30.0" @@ -351,7 +357,7 @@ description = "An asyncio PostgreSQL driver" optional = false python-versions = ">=3.8.0" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "asyncpg-0.30.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfb4dd5ae0699bad2b233672c8fc5ccbd9ad24b89afded02341786887e37927e"}, {file = "asyncpg-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc1f62c792752a49f88b7e6f774c26077091b44caceb1983509edc18a2222ec0"}, @@ -411,17 +417,25 @@ test = ["distro (>=1.9.0,<1.10.0)", "flake8 (>=6.1,<7.0)", "flake8-pyi (>=24.1.0 [[package]] name = "attrs" -version = "25.4.0" +version = "25.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, - {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + [[package]] name = "autoevals" version = "0.0.83" @@ -429,7 +443,7 @@ description = "Universal library for evaluating AI models" optional = false python-versions = ">=3.8.0" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "autoevals-0.0.83-py3-none-any.whl", hash = "sha256:41cc0cec096ce8a1e194a58acda205a2bc5d6ec91c79ff5bee3f8ddc8e3ab525"}, {file = "autoevals-0.0.83.tar.gz", hash = "sha256:c184ba29ac9c5a3067a4dd83db87f49b05bc5bec88897d24f43b764c34421044"}, @@ -455,65 +469,123 @@ description = "Function decoration for backoff and retry" optional = false python-versions = ">=3.7,<4.0" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] +[[package]] +name = "beanie" +version = "1.30.0" +description = "Asynchronous Python ODM for MongoDB" +optional = false +python-versions = "<4.0,>=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "beanie-1.30.0-py3-none-any.whl", hash = "sha256:385f1b850b36a19dd221aeb83e838c83ec6b47bbf6aeac4e5bf8b8d40bfcfe51"}, + {file = "beanie-1.30.0.tar.gz", hash = "sha256:33ead17ff2742144c510b4b24e188f6b316dd1b614d86b57a3cfe20bc7b768c9"}, +] + +[package.dependencies] +click = ">=7" +lazy-model = "0.2.0" +motor = ">=2.5.0,<4.0.0" +pydantic = ">=1.10.18,<3.0" +typing-extensions = ">=4.7" + +[package.extras] +aws = ["motor[aws] (>=2.5.0,<4.0.0)"] +ci = ["requests", "tomli (>=2.2.1,<3.0.0)", "tomli-w (>=1.0.0,<2.0.0)", "types-requests"] +doc = ["Markdown (>=3.3)", "Pygments (>=2.8.0)", "jinja2 (>=3.0.3)", "mkdocs (>=1.4)", "mkdocs-material (>=9.0)", "pydoc-markdown (>=4.8)"] +encryption = ["motor[encryption] (>=2.5.0,<4.0.0)"] +gssapi = ["motor[gssapi] (>=2.5.0,<4.0.0)"] +ocsp = ["motor[ocsp] (>=2.5.0,<4.0.0)"] +queue = ["beanie-batteries-queue (>=0.2)"] +snappy = ["motor[snappy] (>=2.5.0,<4.0.0)"] +test = ["asgi-lifespan (>=1.0.1)", "dnspython (>=2.1.0)", "fastapi (>=0.100)", "httpx (>=0.23.0)", "pre-commit (>=3.5.0)", "pydantic-extra-types (>=2)", "pydantic-settings (>=2)", "pydantic[email]", "pyright (>=0)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24.0)", "pytest-cov (>=5.0.0)"] +zstd = ["motor[zstd] (>=2.5.0,<4.0.0)"] + [[package]] name = "billiard" -version = "4.2.2" +version = "4.2.1" description = "Python multiprocessing fork with improvements and bugfixes" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "billiard-4.2.2-py3-none-any.whl", hash = "sha256:4bc05dcf0d1cc6addef470723aac2a6232f3c7ed7475b0b580473a9145829457"}, - {file = "billiard-4.2.2.tar.gz", hash = "sha256:e815017a062b714958463e07ba15981d802dc53d41c5b69d28c5a7c238f8ecf3"}, + {file = "billiard-4.2.1-py3-none-any.whl", hash = "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb"}, + {file = "billiard-4.2.1.tar.gz", hash = "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f"}, ] [[package]] -name = "braintrust-core" -version = "0.0.49" -description = "Shared core dependencies for Braintrust packages" +name = "boto3" +version = "1.34.69" +description = "The AWS SDK for Python" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "braintrust_core-0.0.49-py3-none-any.whl", hash = "sha256:4be2a5e82b3b123ada4c54e5052da474cb80b29eed5468c8a9f0759c8b7ca0b9"}, - {file = "braintrust_core-0.0.49.tar.gz", hash = "sha256:13081970114ecf0d25e8a77047d93f394ea8fe82e43dc673597992679e0b9215"}, + {file = "boto3-1.34.69-py3-none-any.whl", hash = "sha256:2e25ef6bd325217c2da329829478be063155897d8d3b29f31f7f23ab548519b1"}, + {file = "boto3-1.34.69.tar.gz", hash = "sha256:898a5fed26b1351352703421d1a8b886ef2a74be6c97d5ecc92432ae01fda203"}, ] +[package.dependencies] +botocore = ">=1.34.69,<1.35.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.10.0,<0.11.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + [[package]] -name = "bson" -version = "0.5.10" -description = "BSON codec for Python" +name = "botocore" +version = "1.34.69" +description = "Low-level, data-driven core of boto 3." optional = false -python-versions = "*" +python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "bson-0.5.10.tar.gz", hash = "sha256:d6511b2ab051139a9123c184de1a04227262173ad593429d21e443d6462d6590"}, + {file = "botocore-1.34.69-py3-none-any.whl", hash = "sha256:d3802d076d4d507bf506f9845a6970ce43adc3d819dd57c2791f5c19ed6e5950"}, + {file = "botocore-1.34.69.tar.gz", hash = "sha256:d1ab2bff3c2fd51719c2021d9fa2f30fbb9ed0a308f69e9a774ac92c8091380a"}, ] [package.dependencies] -python-dateutil = ">=2.4.0" -six = ">=1.9.0" +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.19.19)"] + +[[package]] +name = "braintrust-core" +version = "0.0.49" +description = "Shared core dependencies for Braintrust packages" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "braintrust_core-0.0.49-py3-none-any.whl", hash = "sha256:4be2a5e82b3b123ada4c54e5052da474cb80b29eed5468c8a9f0759c8b7ca0b9"}, + {file = "braintrust_core-0.0.49.tar.gz", hash = "sha256:13081970114ecf0d25e8a77047d93f394ea8fe82e43dc673597992679e0b9215"}, +] [[package]] name = "cachetools" -version = "6.2.1" +version = "5.5.2" description = "Extensible memoizing collections and decorators" optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701"}, - {file = "cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201"}, + {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, + {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, ] [[package]] @@ -523,7 +595,7 @@ description = "Distributed Task Queue." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "celery-5.5.3-py3-none-any.whl", hash = "sha256:0b5761a07057acee94694464ca482416b959568904c9dfa41ce8413a7d65d525"}, {file = "celery-5.5.3.tar.gz", hash = "sha256:6c972ae7968c2b5281227f01c3a3f984037d21c5129d07bf3550cc2afc6b10a5"}, @@ -576,237 +648,199 @@ zstd = ["zstandard (==0.23.0)"] [[package]] name = "certifi" -version = "2025.10.5" +version = "2025.7.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, - {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, + {file = "certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2"}, + {file = "certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995"}, ] [[package]] name = "cffi" -version = "2.0.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main"] -markers = "(python_version == \"3.11\" or python_version >= \"3.12\") and platform_python_implementation != \"PyPy\"" -files = [ - {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, - {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, - {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, - {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, - {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, - {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, - {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, - {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, - {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, - {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, - {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, - {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, - {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, - {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, - {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, - {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, - {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, - {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, - {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, - {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, - {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, - {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, - {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, - {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, - {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, - {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, - {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, - {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, - {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, - {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, - {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, - {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, - {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, - {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, - {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, - {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, - {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, - {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, - {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, - {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, - {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, - {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, - {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, - {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, - {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, - {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, - {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, - {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, - {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, - {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, - {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, +markers = "(python_version >= \"3.12\" or python_version == \"3.11\") and platform_python_implementation != \"PyPy\"" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] -pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} +pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.4.4" +version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, ] [[package]] @@ -816,7 +850,7 @@ description = "Mustache templating language renderer" optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, @@ -824,15 +858,15 @@ files = [ [[package]] name = "click" -version = "8.3.0" +version = "8.2.1" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"}, - {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"}, + {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, + {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, ] [package.dependencies] @@ -845,7 +879,7 @@ description = "Enables git-like *did-you-mean* feature in click" optional = false python-versions = ">=3.6.2" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, @@ -861,7 +895,7 @@ description = "An extension module for click to enable registering CLI commands optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "click_plugins-1.1.1.2-py2.py3-none-any.whl", hash = "sha256:008d65743833ffc1f5417bf0e78e8d2c23aab04d9745ba817bd3e71b0feb6aa6"}, {file = "click_plugins-1.1.1.2.tar.gz", hash = "sha256:d7af3984a99d243c131aa1a828331e7630f4a88a9741fd05c927b204bcf92261"}, @@ -880,7 +914,7 @@ description = "REPL plugin for Click" optional = false python-versions = ">=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"}, {file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"}, @@ -904,99 +938,69 @@ files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "(python_version == \"3.11\" or python_version >= \"3.12\") and platform_system == \"Windows\"", dev = "(platform_system == \"Windows\" or sys_platform == \"win32\") and (python_version == \"3.11\" or python_version >= \"3.12\")"} +markers = {main = "(platform_system == \"Windows\" or sys_platform == \"win32\") and (python_version >= \"3.12\" or python_version == \"3.11\")", dev = "(python_version >= \"3.12\" or python_version == \"3.11\") and sys_platform == \"win32\""} [[package]] name = "cryptography" -version = "46.0.3" +version = "45.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e"}, - {file = "cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926"}, - {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71"}, - {file = "cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac"}, - {file = "cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018"}, - {file = "cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb"}, - {file = "cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c"}, - {file = "cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665"}, - {file = "cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3"}, - {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20"}, - {file = "cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de"}, - {file = "cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914"}, - {file = "cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db"}, - {file = "cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21"}, - {file = "cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04"}, - {file = "cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506"}, - {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963"}, - {file = "cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4"}, - {file = "cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df"}, - {file = "cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f"}, - {file = "cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372"}, - {file = "cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32"}, - {file = "cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9"}, - {file = "cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c"}, - {file = "cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1"}, +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27"}, + {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e"}, + {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174"}, + {file = "cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9"}, + {file = "cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63"}, + {file = "cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492"}, + {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0"}, + {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a"}, + {file = "cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f"}, + {file = "cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f"}, + {file = "cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a"}, ] [package.dependencies] -cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9\" and platform_python_implementation != \"PyPy\""} +cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs", "sphinx-rtd-theme (>=3.0.0)"] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox[uv] (>=2024.4.15)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==46.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==45.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "decorator" -version = "5.2.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, - {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, -] - [[package]] name = "deprecated" version = "1.2.18" @@ -1004,7 +1008,7 @@ description = "Python @deprecated decorator to deprecate old python classes, fun optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, @@ -1023,12 +1027,34 @@ description = "Distro - an OS platform information API" optional = false python-versions = ">=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "dnspython" +version = "2.7.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + [[package]] name = "ecdsa" version = "0.19.1" @@ -1036,7 +1062,7 @@ description = "ECDSA cryptographic signature library (pure python)" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "ecdsa-0.19.1-py2.py3-none-any.whl", hash = "sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3"}, {file = "ecdsa-0.19.1.tar.gz", hash = "sha256:478cba7b62555866fcb3bb3fe985e06decbdb68ef55713c4e5ab98c57d508e61"}, @@ -1056,7 +1082,7 @@ description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -1072,7 +1098,7 @@ description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "Faker-23.3.0-py3-none-any.whl", hash = "sha256:117ce1a2805c1bc5ca753b3dc6f9d567732893b2294b827d3164261ee8f20267"}, {file = "Faker-23.3.0.tar.gz", hash = "sha256:458d93580de34403a8dec1e8d5e6be2fee96c4deca63b95d71df7a6a80a690de"}, @@ -1083,281 +1109,170 @@ python-dateutil = ">=2.4" [[package]] name = "fastapi" -version = "0.116.2" +version = "0.115.14" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "fastapi-0.116.2-py3-none-any.whl", hash = "sha256:c3a7a8fb830b05f7e087d920e0d786ca1fc9892eb4e9a84b227be4c1bc7569db"}, - {file = "fastapi-0.116.2.tar.gz", hash = "sha256:231a6af2fe21cfa2c32730170ad8514985fc250bec16c9b242d3b94c835ef529"}, + {file = "fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca"}, + {file = "fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739"}, ] [package.dependencies] pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" -starlette = ">=0.40.0,<0.49.0" +starlette = ">=0.40.0,<0.47.0" typing-extensions = ">=4.8.0" [package.extras] -all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] -standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] - -[[package]] -name = "fastuuid" -version = "0.14.0" -description = "Python bindings to Rust's UUID library." -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6e6243d40f6c793c3e2ee14c13769e341b90be5ef0c23c82fa6515a96145181a"}, - {file = "fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:13ec4f2c3b04271f62be2e1ce7e95ad2dd1cf97e94503a3760db739afbd48f00"}, - {file = "fastuuid-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b2fdd48b5e4236df145a149d7125badb28e0a383372add3fbaac9a6b7a394470"}, - {file = "fastuuid-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f74631b8322d2780ebcf2d2d75d58045c3e9378625ec51865fe0b5620800c39d"}, - {file = "fastuuid-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cffc144dc93eb604b87b179837f2ce2af44871a7b323f2bfed40e8acb40ba8"}, - {file = "fastuuid-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a771f135ab4523eb786e95493803942a5d1fc1610915f131b363f55af53b219"}, - {file = "fastuuid-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4edc56b877d960b4eda2c4232f953a61490c3134da94f3c28af129fb9c62a4f6"}, - {file = "fastuuid-0.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bcc96ee819c282e7c09b2eed2b9bd13084e3b749fdb2faf58c318d498df2efbe"}, - {file = "fastuuid-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7a3c0bca61eacc1843ea97b288d6789fbad7400d16db24e36a66c28c268cfe3d"}, - {file = "fastuuid-0.14.0-cp310-cp310-win32.whl", hash = "sha256:7f2f3efade4937fae4e77efae1af571902263de7b78a0aee1a1653795a093b2a"}, - {file = "fastuuid-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae64ba730d179f439b0736208b4c279b8bc9c089b102aec23f86512ea458c8a4"}, - {file = "fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34"}, - {file = "fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7"}, - {file = "fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1"}, - {file = "fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc"}, - {file = "fastuuid-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbb0c4b15d66b435d2538f3827f05e44e2baafcc003dd7d8472dc67807ab8fd8"}, - {file = "fastuuid-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd5a7f648d4365b41dbf0e38fe8da4884e57bed4e77c83598e076ac0c93995e7"}, - {file = "fastuuid-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c0a94245afae4d7af8c43b3159d5e3934c53f47140be0be624b96acd672ceb73"}, - {file = "fastuuid-0.14.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b29e23c97e77c3a9514d70ce343571e469098ac7f5a269320a0f0b3e193ab36"}, - {file = "fastuuid-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1e690d48f923c253f28151b3a6b4e335f2b06bf669c68a02665bc150b7839e94"}, - {file = "fastuuid-0.14.0-cp311-cp311-win32.whl", hash = "sha256:a6f46790d59ab38c6aa0e35c681c0484b50dc0acf9e2679c005d61e019313c24"}, - {file = "fastuuid-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:e150eab56c95dc9e3fefc234a0eedb342fac433dacc273cd4d150a5b0871e1fa"}, - {file = "fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77e94728324b63660ebf8adb27055e92d2e4611645bf12ed9d88d30486471d0a"}, - {file = "fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:caa1f14d2102cb8d353096bc6ef6c13b2c81f347e6ab9d6fbd48b9dea41c153d"}, - {file = "fastuuid-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070"}, - {file = "fastuuid-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c9ec605ace243b6dbe3bd27ebdd5d33b00d8d1d3f580b39fdd15cd96fd71796"}, - {file = "fastuuid-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:808527f2407f58a76c916d6aa15d58692a4a019fdf8d4c32ac7ff303b7d7af09"}, - {file = "fastuuid-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fb3c0d7fef6674bbeacdd6dbd386924a7b60b26de849266d1ff6602937675c8"}, - {file = "fastuuid-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab3f5d36e4393e628a4df337c2c039069344db5f4b9d2a3c9cea48284f1dd741"}, - {file = "fastuuid-0.14.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b9a0ca4f03b7e0b01425281ffd44e99d360e15c895f1907ca105854ed85e2057"}, - {file = "fastuuid-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3acdf655684cc09e60fb7e4cf524e8f42ea760031945aa8086c7eae2eeeabeb8"}, - {file = "fastuuid-0.14.0-cp312-cp312-win32.whl", hash = "sha256:9579618be6280700ae36ac42c3efd157049fe4dd40ca49b021280481c78c3176"}, - {file = "fastuuid-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:d9e4332dc4ba054434a9594cbfaf7823b57993d7d8e7267831c3e059857cf397"}, - {file = "fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77a09cb7427e7af74c594e409f7731a0cf887221de2f698e1ca0ebf0f3139021"}, - {file = "fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9bd57289daf7b153bfa3e8013446aa144ce5e8c825e9e366d455155ede5ea2dc"}, - {file = "fastuuid-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac60fc860cdf3c3f327374db87ab8e064c86566ca8c49d2e30df15eda1b0c2d5"}, - {file = "fastuuid-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab32f74bd56565b186f036e33129da77db8be09178cd2f5206a5d4035fb2a23f"}, - {file = "fastuuid-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e678459cf4addaedd9936bbb038e35b3f6b2061330fd8f2f6a1d80414c0f87"}, - {file = "fastuuid-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e3cc56742f76cd25ecb98e4b82a25f978ccffba02e4bdce8aba857b6d85d87b"}, - {file = "fastuuid-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022"}, - {file = "fastuuid-0.14.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:09098762aad4f8da3a888eb9ae01c84430c907a297b97166b8abc07b640f2995"}, - {file = "fastuuid-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1383fff584fa249b16329a059c68ad45d030d5a4b70fb7c73a08d98fd53bcdab"}, - {file = "fastuuid-0.14.0-cp313-cp313-win32.whl", hash = "sha256:a0809f8cc5731c066c909047f9a314d5f536c871a7a22e815cc4967c110ac9ad"}, - {file = "fastuuid-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df14e92e7ad3276327631c9e7cec09e32572ce82089c55cb1bb8df71cf394ed"}, - {file = "fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b852a870a61cfc26c884af205d502881a2e59cc07076b60ab4a951cc0c94d1ad"}, - {file = "fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c7502d6f54cd08024c3ea9b3514e2d6f190feb2f46e6dbcd3747882264bb5f7b"}, - {file = "fastuuid-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ca61b592120cf314cfd66e662a5b54a578c5a15b26305e1b8b618a6f22df714"}, - {file = "fastuuid-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa75b6657ec129d0abded3bec745e6f7ab642e6dba3a5272a68247e85f5f316f"}, - {file = "fastuuid-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8a0dfea3972200f72d4c7df02c8ac70bad1bb4c58d7e0ec1e6f341679073a7f"}, - {file = "fastuuid-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bf539a7a95f35b419f9ad105d5a8a35036df35fdafae48fb2fd2e5f318f0d75"}, - {file = "fastuuid-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:9a133bf9cc78fdbd1179cb58a59ad0100aa32d8675508150f3658814aeefeaa4"}, - {file = "fastuuid-0.14.0-cp314-cp314-musllinux_1_1_i686.whl", hash = "sha256:f54d5b36c56a2d5e1a31e73b950b28a0d83eb0c37b91d10408875a5a29494bad"}, - {file = "fastuuid-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:ec27778c6ca3393ef662e2762dba8af13f4ec1aaa32d08d77f71f2a70ae9feb8"}, - {file = "fastuuid-0.14.0-cp314-cp314-win32.whl", hash = "sha256:e23fc6a83f112de4be0cc1990e5b127c27663ae43f866353166f87df58e73d06"}, - {file = "fastuuid-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:df61342889d0f5e7a32f7284e55ef95103f2110fee433c2ae7c2c0956d76ac8a"}, - {file = "fastuuid-0.14.0-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:47c821f2dfe95909ead0085d4cb18d5149bca704a2b03e03fb3f81a5202d8cea"}, - {file = "fastuuid-0.14.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3964bab460c528692c70ab6b2e469dd7a7b152fbe8c18616c58d34c93a6cf8d4"}, - {file = "fastuuid-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c501561e025b7aea3508719c5801c360c711d5218fc4ad5d77bf1c37c1a75779"}, - {file = "fastuuid-0.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dce5d0756f046fa792a40763f36accd7e466525c5710d2195a038f93ff96346"}, - {file = "fastuuid-0.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193ca10ff553cf3cc461572da83b5780fc0e3eea28659c16f89ae5202f3958d4"}, - {file = "fastuuid-0.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0737606764b29785566f968bd8005eace73d3666bd0862f33a760796e26d1ede"}, - {file = "fastuuid-0.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e0976c0dff7e222513d206e06341503f07423aceb1db0b83ff6851c008ceee06"}, - {file = "fastuuid-0.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6fbc49a86173e7f074b1a9ec8cf12ca0d54d8070a85a06ebf0e76c309b84f0d0"}, - {file = "fastuuid-0.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:de01280eabcd82f7542828ecd67ebf1551d37203ecdfd7ab1f2e534edb78d505"}, - {file = "fastuuid-0.14.0-cp38-cp38-win32.whl", hash = "sha256:af5967c666b7d6a377098849b07f83462c4fedbafcf8eb8bc8ff05dcbe8aa209"}, - {file = "fastuuid-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3091e63acf42f56a6f74dc65cfdb6f99bfc79b5913c8a9ac498eb7ca09770a8"}, - {file = "fastuuid-0.14.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2ec3d94e13712a133137b2805073b65ecef4a47217d5bac15d8ac62376cefdb4"}, - {file = "fastuuid-0.14.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:139d7ff12bb400b4a0c76be64c28cbe2e2edf60b09826cbfd85f33ed3d0bbe8b"}, - {file = "fastuuid-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d55b7e96531216fc4f071909e33e35e5bfa47962ae67d9e84b00a04d6e8b7173"}, - {file = "fastuuid-0.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0eb25f0fd935e376ac4334927a59e7c823b36062080e2e13acbaf2af15db836"}, - {file = "fastuuid-0.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:089c18018fdbdda88a6dafd7d139f8703a1e7c799618e33ea25eb52503d28a11"}, - {file = "fastuuid-0.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fc37479517d4d70c08696960fad85494a8a7a0af4e93e9a00af04d74c59f9e3"}, - {file = "fastuuid-0.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:73657c9f778aba530bc96a943d30e1a7c80edb8278df77894fe9457540df4f85"}, - {file = "fastuuid-0.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d31f8c257046b5617fc6af9c69be066d2412bdef1edaa4bdf6a214cf57806105"}, - {file = "fastuuid-0.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5816d41f81782b209843e52fdef757a361b448d782452d96abedc53d545da722"}, - {file = "fastuuid-0.14.0-cp39-cp39-win32.whl", hash = "sha256:448aa6833f7a84bfe37dd47e33df83250f404d591eb83527fa2cac8d1e57d7f3"}, - {file = "fastuuid-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:84b0779c5abbdec2a9511d5ffbfcd2e53079bf889824b32be170c0d8ef5fc74c"}, - {file = "fastuuid-0.14.0.tar.gz", hash = "sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26"}, -] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "filelock" -version = "3.20.0" +version = "3.18.0" description = "A platform independent file lock." optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2"}, - {file = "filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4"}, + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, ] +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2)"] + [[package]] name = "frozenlist" -version = "1.8.0" +version = "1.7.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011"}, - {file = "frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565"}, - {file = "frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450"}, - {file = "frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f"}, - {file = "frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7"}, - {file = "frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a"}, - {file = "frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6"}, - {file = "frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e"}, - {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84"}, - {file = "frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9"}, - {file = "frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581"}, - {file = "frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd"}, - {file = "frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967"}, - {file = "frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25"}, - {file = "frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b"}, - {file = "frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a"}, - {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1"}, - {file = "frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b"}, - {file = "frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b"}, - {file = "frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608"}, - {file = "frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa"}, - {file = "frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf"}, - {file = "frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746"}, - {file = "frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd"}, - {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a"}, - {file = "frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7"}, - {file = "frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5"}, - {file = "frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8"}, - {file = "frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed"}, - {file = "frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496"}, - {file = "frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231"}, - {file = "frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62"}, - {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94"}, - {file = "frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c"}, - {file = "frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714"}, - {file = "frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0"}, - {file = "frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41"}, - {file = "frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b"}, - {file = "frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888"}, - {file = "frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042"}, - {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0"}, - {file = "frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f"}, - {file = "frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e"}, - {file = "frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30"}, - {file = "frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7"}, - {file = "frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806"}, - {file = "frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0"}, - {file = "frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b"}, - {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d"}, - {file = "frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed"}, - {file = "frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a"}, - {file = "frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a"}, - {file = "frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e"}, - {file = "frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df"}, - {file = "frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd"}, - {file = "frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79"}, - {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8b7138e5cd0647e4523d6685b0eac5d4be9a184ae9634492f25c6eb38c12a47"}, - {file = "frozenlist-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a6483e309ca809f1efd154b4d37dc6d9f61037d6c6a81c2dc7a15cb22c8c5dca"}, - {file = "frozenlist-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b9290cf81e95e93fdf90548ce9d3c1211cf574b8e3f4b3b7cb0537cf2227068"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:59a6a5876ca59d1b63af8cd5e7ffffb024c3dc1e9cf9301b21a2e76286505c95"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6dc4126390929823e2d2d9dc79ab4046ed74680360fc5f38b585c12c66cdf459"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:332db6b2563333c5671fecacd085141b5800cb866be16d5e3eb15a2086476675"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ff15928d62a0b80bb875655c39bf517938c7d589554cbd2669be42d97c2cb61"}, - {file = "frozenlist-1.8.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7bf6cdf8e07c8151fba6fe85735441240ec7f619f935a5205953d58009aef8c6"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:48e6d3f4ec5c7273dfe83ff27c91083c6c9065af655dc2684d2c200c94308bb5"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1a7607e17ad33361677adcd1443edf6f5da0ce5e5377b798fba20fae194825f3"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3a935c3a4e89c733303a2d5a7c257ea44af3a56c8202df486b7f5de40f37e1"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:940d4a017dbfed9daf46a3b086e1d2167e7012ee297fef9e1c545c4d022f5178"}, - {file = "frozenlist-1.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b9be22a69a014bc47e78072d0ecae716f5eb56c15238acca0f43d6eb8e4a5bda"}, - {file = "frozenlist-1.8.0-cp39-cp39-win32.whl", hash = "sha256:1aa77cb5697069af47472e39612976ed05343ff2e84a3dcf15437b232cbfd087"}, - {file = "frozenlist-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:7398c222d1d405e796970320036b1b563892b65809d9e5261487bb2c7f7b5c6a"}, - {file = "frozenlist-1.8.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f3b365f31c6cd4af24545ca0a244a53688cad8834e32f56831c4923b50a103"}, - {file = "frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d"}, - {file = "frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a"}, + {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61"}, + {file = "frozenlist-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615"}, + {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd"}, + {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718"}, + {file = "frozenlist-1.7.0-cp310-cp310-win32.whl", hash = "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e"}, + {file = "frozenlist-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464"}, + {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a"}, + {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750"}, + {file = "frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86"}, + {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898"}, + {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56"}, + {file = "frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7"}, + {file = "frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d"}, + {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2"}, + {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb"}, + {file = "frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e"}, + {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08"}, + {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43"}, + {file = "frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3"}, + {file = "frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a"}, + {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee"}, + {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d"}, + {file = "frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60"}, + {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b"}, + {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e"}, + {file = "frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1"}, + {file = "frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba"}, + {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d"}, + {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d"}, + {file = "frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384"}, + {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104"}, + {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf"}, + {file = "frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81"}, + {file = "frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e"}, + {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630"}, + {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71"}, + {file = "frozenlist-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87"}, + {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd"}, + {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb"}, + {file = "frozenlist-1.7.0-cp39-cp39-win32.whl", hash = "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e"}, + {file = "frozenlist-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63"}, + {file = "frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e"}, + {file = "frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f"}, ] [[package]] name = "fsspec" -version = "2025.10.0" +version = "2025.5.1" description = "File-system specification" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d"}, - {file = "fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59"}, + {file = "fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462"}, + {file = "fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475"}, ] [package.extras] @@ -1365,7 +1280,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -dev = ["pre-commit", "ruff (>=0.5)"] +dev = ["pre-commit", "ruff"] doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] @@ -1395,7 +1310,7 @@ description = "GenSON is a powerful, user-friendly JSON Schema generator." optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, @@ -1403,19 +1318,19 @@ files = [ [[package]] name = "google-auth" -version = "2.43.0" +version = "2.40.3" description = "Google Authentication Library" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16"}, - {file = "google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483"}, + {file = "google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca"}, + {file = "google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"}, ] [package.dependencies] -cachetools = ">=2.0.0,<7.0" +cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" @@ -1426,20 +1341,20 @@ pyjwt = ["cryptography (<39.0.0)", "cryptography (>=38.0.3)", "pyjwt (>=2.0)"] pyopenssl = ["cryptography (<39.0.0)", "cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0)"] -testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0)", "cryptography (<39.0.0)", "cryptography (>=38.0.3)", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] +testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0)", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"] urllib3 = ["packaging", "urllib3"] [[package]] name = "googleapis-common-protos" -version = "1.72.0" +version = "1.70.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038"}, - {file = "googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5"}, + {file = "googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8"}, + {file = "googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257"}, ] [package.dependencies] @@ -1450,72 +1365,72 @@ grpc = ["grpcio (>=1.44.0,<2.0.0)"] [[package]] name = "greenlet" -version = "3.2.4" +version = "3.2.3" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(python_version == \"3.11\" or python_version >= \"3.12\") and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" -files = [ - {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, - {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, - {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, - {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, - {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, - {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, - {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, - {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, - {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, - {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, - {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, - {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, - {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, - {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, - {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, - {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, - {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, - {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, - {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, - {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, - {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, - {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, - {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, - {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, - {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, - {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, - {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, - {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, - {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, - {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, +markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") and (python_version >= \"3.12\" or python_version == \"3.11\")" +files = [ + {file = "greenlet-3.2.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:1afd685acd5597349ee6d7a88a8bec83ce13c106ac78c196ee9dde7c04fe87be"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:761917cac215c61e9dc7324b2606107b3b292a8349bdebb31503ab4de3f559ac"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a433dbc54e4a37e4fff90ef34f25a8c00aed99b06856f0119dcf09fbafa16392"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:72e77ed69312bab0434d7292316d5afd6896192ac4327d44f3d613ecb85b037c"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68671180e3849b963649254a882cd544a3c75bfcd2c527346ad8bb53494444db"}, + {file = "greenlet-3.2.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49c8cfb18fb419b3d08e011228ef8a25882397f3a859b9fe1436946140b6756b"}, + {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:efc6dc8a792243c31f2f5674b670b3a95d46fa1c6a912b8e310d6f542e7b0712"}, + {file = "greenlet-3.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:731e154aba8e757aedd0781d4b240f1225b075b4409f1bb83b05ff410582cf00"}, + {file = "greenlet-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:96c20252c2f792defe9a115d3287e14811036d51e78b3aaddbee23b69b216302"}, + {file = "greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147"}, + {file = "greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5"}, + {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc"}, + {file = "greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba"}, + {file = "greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34"}, + {file = "greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688"}, + {file = "greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb"}, + {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c"}, + {file = "greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163"}, + {file = "greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849"}, + {file = "greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb"}, + {file = "greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b"}, + {file = "greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0"}, + {file = "greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36"}, + {file = "greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3"}, + {file = "greenlet-3.2.3-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:3d04332dddb10b4a211b68111dabaee2e1a073663d117dc10247b5b1642bac86"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8186162dffde068a465deab08fc72c767196895c39db26ab1c17c0b77a6d8b97"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f4bfbaa6096b1b7a200024784217defedf46a07c2eee1a498e94a1b5f8ec5728"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ed6cfa9200484d234d8394c70f5492f144b20d4533f69262d530a1a082f6ee9a"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:02b0df6f63cd15012bed5401b47829cfd2e97052dc89da3cfaf2c779124eb892"}, + {file = "greenlet-3.2.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86c2d68e87107c1792e2e8d5399acec2487a4e993ab76c792408e59394d52141"}, + {file = "greenlet-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:8c47aae8fbbfcf82cc13327ae802ba13c9c36753b67e760023fd116bc124a62a"}, + {file = "greenlet-3.2.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:42efc522c0bd75ffa11a71e09cd8a399d83fafe36db250a87cf1dacfaa15dc64"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d760f9bdfe79bff803bad32b4d8ffb2c1d2ce906313fc10a83976ffb73d64ca7"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8324319cbd7b35b97990090808fdc99c27fe5338f87db50514959f8059999805"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:8c37ef5b3787567d322331d5250e44e42b58c8c713859b8a04c6065f27efbf72"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ce539fb52fb774d0802175d37fcff5c723e2c7d249c65916257f0a940cee8904"}, + {file = "greenlet-3.2.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:003c930e0e074db83559edc8705f3a2d066d4aa8c2f198aff1e454946efd0f26"}, + {file = "greenlet-3.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7e70ea4384b81ef9e84192e8a77fb87573138aa5d4feee541d8014e452b434da"}, + {file = "greenlet-3.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22eb5ba839c4b2156f18f76768233fe44b23a31decd9cc0d4cc8141c211fd1b4"}, + {file = "greenlet-3.2.3-cp39-cp39-win32.whl", hash = "sha256:4532f0d25df67f896d137431b13f4cdce89f7e3d4a96387a41290910df4d3a57"}, + {file = "greenlet-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:aaa7aae1e7f75eaa3ae400ad98f8644bb81e1dc6ba47ce8a93d3f17274e08322"}, + {file = "greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365"}, ] [package.extras] docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil", "setuptools"] +test = ["objgraph", "psutil"] [[package]] name = "gunicorn" @@ -1524,7 +1439,7 @@ description = "WSGI HTTP Server for UNIX" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -1547,12 +1462,34 @@ description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +[[package]] +name = "hf-xet" +version = "1.1.5" +description = "Fast transfer of large files with the Hugging Face Hub." +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version == \"3.11\") and (platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\")" +files = [ + {file = "hf_xet-1.1.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f52c2fa3635b8c37c7764d8796dfa72706cc4eded19d638331161e82b0792e23"}, + {file = "hf_xet-1.1.5-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:9fa6e3ee5d61912c4a113e0708eaaef987047616465ac7aa30f7121a48fc1af8"}, + {file = "hf_xet-1.1.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc874b5c843e642f45fd85cda1ce599e123308ad2901ead23d3510a47ff506d1"}, + {file = "hf_xet-1.1.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dbba1660e5d810bd0ea77c511a99e9242d920790d0e63c0e4673ed36c4022d18"}, + {file = "hf_xet-1.1.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ab34c4c3104133c495785d5d8bba3b1efc99de52c02e759cf711a91fd39d3a14"}, + {file = "hf_xet-1.1.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:83088ecea236d5113de478acb2339f92c95b4fb0462acaa30621fac02f5a534a"}, + {file = "hf_xet-1.1.5-cp37-abi3-win_amd64.whl", hash = "sha256:73e167d9807d166596b4b2f0b585c6d5bd84a26dea32843665a8b58f6edba245"}, + {file = "hf_xet-1.1.5.tar.gz", hash = "sha256:69ebbcfd9ec44fdc2af73441619eeb06b94ee34511bbcf57cd423820090f5694"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "httpcore" version = "1.0.9" @@ -1560,7 +1497,7 @@ description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1583,7 +1520,7 @@ description = "The next generation HTTP client." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1604,20 +1541,21 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.30.2" +version = "0.33.4" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28"}, - {file = "huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466"}, + {file = "huggingface_hub-0.33.4-py3-none-any.whl", hash = "sha256:09f9f4e7ca62547c70f8b82767eefadd2667f4e116acba2e3e62a5a81815a7bb"}, + {file = "huggingface_hub-0.33.4.tar.gz", hash = "sha256:6af13478deae120e765bfd92adad0ae1aec1ad8c439b46f23058ad5956cbca0a"}, ] [package.dependencies] filelock = "*" fsspec = ">=2023.5.0" +hf-xet = {version = ">=1.1.2,<2.0.0", markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\""} packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -1625,31 +1563,33 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (==1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (==1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] -hf-xet = ["hf-xet (>=0.1.4)"] +hf-xet = ["hf-xet (>=1.1.2,<2.0.0)"] inference = ["aiohttp"] -quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"] +mcp = ["aiohttp", "mcp (>=1.8.0)", "typer"] +oauth = ["authlib (>=1.3.2)", "fastapi", "httpx", "itsdangerous"] +quality = ["libcst (==1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "ruff (>=0.9.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "idna" -version = "3.11" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, - {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] [package.extras] @@ -1662,7 +1602,7 @@ description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, @@ -1682,15 +1622,15 @@ type = ["pytest-mypy"] [[package]] name = "iniconfig" -version = "2.3.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.10" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.8" +groups = ["main", "dev"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, - {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] [[package]] @@ -1700,7 +1640,7 @@ description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1714,128 +1654,116 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.12.0" +version = "0.10.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65"}, - {file = "jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74"}, - {file = "jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2"}, - {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025"}, - {file = "jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca"}, - {file = "jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4"}, - {file = "jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11"}, - {file = "jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9"}, - {file = "jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6"}, - {file = "jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725"}, - {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6"}, - {file = "jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e"}, - {file = "jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c"}, - {file = "jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f"}, - {file = "jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5"}, - {file = "jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37"}, - {file = "jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403"}, - {file = "jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126"}, - {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9"}, - {file = "jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86"}, - {file = "jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44"}, - {file = "jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb"}, - {file = "jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789"}, - {file = "jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e"}, - {file = "jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed"}, - {file = "jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9"}, - {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626"}, - {file = "jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c"}, - {file = "jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de"}, - {file = "jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a"}, - {file = "jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60"}, - {file = "jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6"}, - {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4"}, - {file = "jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb"}, - {file = "jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7"}, - {file = "jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3"}, - {file = "jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525"}, - {file = "jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a"}, - {file = "jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a"}, - {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67"}, - {file = "jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b"}, - {file = "jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42"}, - {file = "jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf"}, - {file = "jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451"}, - {file = "jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f"}, - {file = "jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783"}, - {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b"}, - {file = "jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6"}, - {file = "jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183"}, - {file = "jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873"}, - {file = "jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473"}, - {file = "jiter-0.12.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9d28b218d5f9e5f69a0787a196322a5056540cb378cac8ff542b4fa7219966c"}, - {file = "jiter-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0ee12028daf8cfcf880dd492349a122a64f42c059b6c62a2b0c96a83a8da820"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b135ebe757a82d67ed2821526e72d0acf87dd61f6013e20d3c45b8048af927b"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15d7fafb81af8a9e3039fc305529a61cd933eecee33b4251878a1c89859552a3"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92d1f41211d8a8fe412faad962d424d334764c01dac6691c44691c2e4d3eedaf"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a64a48d7c917b8f32f25c176df8749ecf08cec17c466114727efe7441e17f6d"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122046f3b3710b85de99d9aa2f3f0492a8233a2f54a64902b096efc27ea747b5"}, - {file = "jiter-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:27ec39225e03c32c6b863ba879deb427882f243ae46f0d82d68b695fa5b48b40"}, - {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26b9e155ddc132225a39b1995b3b9f0fe0f79a6d5cbbeacf103271e7d309b404"}, - {file = "jiter-0.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab05b7c58e29bb9e60b70c2e0094c98df79a1e42e397b9bb6eaa989b7a66dd0"}, - {file = "jiter-0.12.0-cp39-cp39-win32.whl", hash = "sha256:59f9f9df87ed499136db1c2b6c9efb902f964bed42a582ab7af413b6a293e7b0"}, - {file = "jiter-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3719596a1ebe7a48a498e8d5d0c4bf7553321d4c3eee1d620628d51351a3928"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e"}, - {file = "jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f"}, - {file = "jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c"}, - {file = "jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303"}, + {file = "jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf"}, + {file = "jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90"}, + {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0"}, + {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee"}, + {file = "jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4"}, + {file = "jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5"}, + {file = "jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978"}, + {file = "jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5"}, + {file = "jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606"}, + {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605"}, + {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5"}, + {file = "jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7"}, + {file = "jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812"}, + {file = "jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b"}, + {file = "jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a"}, + {file = "jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95"}, + {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea"}, + {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b"}, + {file = "jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01"}, + {file = "jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49"}, + {file = "jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644"}, + {file = "jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041"}, + {file = "jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca"}, + {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4"}, + {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e"}, + {file = "jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d"}, + {file = "jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4"}, + {file = "jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca"}, + {file = "jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070"}, + {file = "jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca"}, + {file = "jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522"}, + {file = "jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9"}, + {file = "jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a"}, + {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853"}, + {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86"}, + {file = "jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357"}, + {file = "jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00"}, + {file = "jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5"}, + {file = "jiter-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d"}, + {file = "jiter-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28"}, + {file = "jiter-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397"}, + {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1"}, + {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324"}, + {file = "jiter-0.10.0-cp39-cp39-win32.whl", hash = "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf"}, + {file = "jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9"}, + {file = "jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500"}, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] [[package]] name = "jsonschema" -version = "4.25.1" +version = "4.24.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, - {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, + {file = "jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d"}, + {file = "jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196"}, ] [package.dependencies] @@ -1846,19 +1774,19 @@ rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "rfc3987-syntax (>=1.1.0)", "uri-template", "webcolors (>=24.6.0)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" -version = "2025.9.1" +version = "2025.4.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, - {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, + {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, + {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, ] [package.dependencies] @@ -1871,7 +1799,7 @@ description = "Messaging library for Python." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "kombu-5.5.4-py3-none-any.whl", hash = "sha256:a12ed0557c238897d8e518f1d1fdf84bd1516c5e305af2dacd85c2015115feb8"}, {file = "kombu-5.5.4.tar.gz", hash = "sha256:886600168275ebeada93b888e831352fe578168342f0d1d5833d88ba0d847363"}, @@ -1901,98 +1829,153 @@ sqs = ["boto3 (>=1.26.143)", "urllib3 (>=1.26.16)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=2.8.0)"] +[[package]] +name = "kubernetes" +version = "28.1.0" +description = "Kubernetes python client" +optional = false +python-versions = ">=3.6" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "kubernetes-28.1.0-py2.py3-none-any.whl", hash = "sha256:10f56f8160dcb73647f15fafda268e7f60cf7dbc9f8e46d52fcd46d3beb0c18d"}, + {file = "kubernetes-28.1.0.tar.gz", hash = "sha256:1468069a573430fb1cb5ad22876868f57977930f80a6749405da31cd6086a7e9"}, +] + +[package.dependencies] +certifi = ">=14.05.14" +google-auth = ">=1.0.1" +oauthlib = ">=3.2.2" +python-dateutil = ">=2.5.3" +pyyaml = ">=5.4.1" +requests = "*" +requests-oauthlib = "*" +six = ">=1.9.0" +urllib3 = ">=1.24.2,<2.0" +websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" + +[package.extras] +adal = ["adal (>=1.0.2)"] + +[[package]] +name = "lazy-model" +version = "0.2.0" +description = "" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "lazy-model-0.2.0.tar.gz", hash = "sha256:57c0e91e171530c4fca7aebc3ac05a163a85cddd941bf7527cc46c0ddafca47c"}, + {file = "lazy_model-0.2.0-py3-none-any.whl", hash = "sha256:5a3241775c253e36d9069d236be8378288a93d4fc53805211fd152e04cc9c342"}, +] + +[package.dependencies] +pydantic = ">=1.9.0" + [[package]] name = "levenshtein" -version = "0.27.3" +version = "0.27.1" description = "Python extension for computing string edit distances and similarities." optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "levenshtein-0.27.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d61eff70799fd5e710625da8a13e5adabd62bfd9f70abb9c531af6cad458cd27"}, - {file = "levenshtein-0.27.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:477efed87edf72ad0d3870038479ed2f63020a42e69c6a38a32a550e51f8e70e"}, - {file = "levenshtein-0.27.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ef99b9827d7d1100fc4398ac5522bd56766b894561c0cbdea0a01b93f24e642"}, - {file = "levenshtein-0.27.3-cp310-cp310-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9091e8ca9fff6088836abf372f8871fb480e44603defa526e1c3ae2f1d70acc5"}, - {file = "levenshtein-0.27.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ffdb2329712c5595eda3532a4f701f87f6c73a0f7aaac240681bf0b54310d63"}, - {file = "levenshtein-0.27.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35856330eac1b968b45a5abbc4a3d14279bd9d1224be727cb1aac9ac4928a419"}, - {file = "levenshtein-0.27.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:5377e237f6a13f5b0618621cca7992848993470c011716c3ad09cdf19c3b13ab"}, - {file = "levenshtein-0.27.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e30614186eb5c43833b62ae7d893a116b88373eec8cf3f3d62ba51aa5962d8ea"}, - {file = "levenshtein-0.27.3-cp310-cp310-win32.whl", hash = "sha256:5499342fd6b003bd5abc28790c7b333884838f7fd8c50570a6520bbaf5e2a35b"}, - {file = "levenshtein-0.27.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e2792730388bec6a85d4d3e3a9b53b8a4b509722bea1a78a39a1a0a7d8f0e13"}, - {file = "levenshtein-0.27.3-cp310-cp310-win_arm64.whl", hash = "sha256:8a2a274b55562a49c6e9dadb16d05f6c27ffa98906b55d5c122893457ca6e464"}, - {file = "levenshtein-0.27.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:245b6ffb6e1b0828cafbce35c500cb3265d0962c121d090669f177968c5a2980"}, - {file = "levenshtein-0.27.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f44c98fa23f489eb7b2ad87d5dd24b6a784434bb5edb73f6b0513309c949690"}, - {file = "levenshtein-0.27.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f5f85a1fc96dfc147bba82b4c67d6346ea26c27ef77a6a9de689118e26dddbe"}, - {file = "levenshtein-0.27.3-cp311-cp311-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:18ceddd38d0e990d2c1c9b72f3e191dace87e2f8f0446207ce9e9cd2bfdfc8a1"}, - {file = "levenshtein-0.27.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:222b81adca29ee4128183328c6e1b25a48c817d14a008ab49e74be9df963b293"}, - {file = "levenshtein-0.27.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee3769ab6e89c24f901e6b7004100630e86721464d7d0384860a322d7953d3a5"}, - {file = "levenshtein-0.27.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:03eba8fda9f3f2b4b0760263fa20b20a90ab00cbeeab4d0d9d899b4f77912b0a"}, - {file = "levenshtein-0.27.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c870b19e2d5c7bc7f16213cc10312b82d873a4d46e1c6d51857a12ef39a76552"}, - {file = "levenshtein-0.27.3-cp311-cp311-win32.whl", hash = "sha256:1987622e9b8ba2ae47dc27469291da1f58462660fa34f4358e9d9c1830fb1355"}, - {file = "levenshtein-0.27.3-cp311-cp311-win_amd64.whl", hash = "sha256:a2b2aa81851e01bb09667b07e80c3fbf0f5a7c6ee9cd80caf43cce705e65832a"}, - {file = "levenshtein-0.27.3-cp311-cp311-win_arm64.whl", hash = "sha256:a084b335c54def1aef9a594b7163faa44dd00056323808bab783f43d8e4c1395"}, - {file = "levenshtein-0.27.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2de7f095b0ca8e44de9de986ccba661cd0dec3511c751b499e76b60da46805e9"}, - {file = "levenshtein-0.27.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9b8b29e5d5145a3c958664c85151b1bb4b26e4ca764380b947e6a96a321217c"}, - {file = "levenshtein-0.27.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc975465a51b1c5889eadee1a583b81fba46372b4b22df28973e49e8ddb8f54a"}, - {file = "levenshtein-0.27.3-cp312-cp312-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:57573ed885118554770979fdee584071b66103f6d50beddeabb54607a1213d81"}, - {file = "levenshtein-0.27.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23aff800a6dd5d91bb3754a6092085aa7ad46b28e497682c155c74f681cfaa2d"}, - {file = "levenshtein-0.27.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c08a952432b8ad9dccb145f812176db94c52cda732311ddc08d29fd3bf185b0a"}, - {file = "levenshtein-0.27.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3bfcb2d78ab9cc06a1e75da8fcfb7a430fe513d66cfe54c07e50f32805e5e6db"}, - {file = "levenshtein-0.27.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7235f6dcb31a217247468295e2dd4c6c1d3ac81629dc5d355d93e1a5f4c185"}, - {file = "levenshtein-0.27.3-cp312-cp312-win32.whl", hash = "sha256:ea80d70f1d18c161a209be556b9094968627cbaae620e102459ef9c320a98cbb"}, - {file = "levenshtein-0.27.3-cp312-cp312-win_amd64.whl", hash = "sha256:fbaa1219d9b2d955339a37e684256a861e9274a3fe3a6ee1b8ea8724c3231ed9"}, - {file = "levenshtein-0.27.3-cp312-cp312-win_arm64.whl", hash = "sha256:2edbaa84f887ea1d9d8e4440af3fdda44769a7855d581c6248d7ee51518402a8"}, - {file = "levenshtein-0.27.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e55aa9f9453fd89d4a9ff1f3c4a650b307d5f61a7eed0568a52fbd2ff2eba107"}, - {file = "levenshtein-0.27.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ae4d484453c48939ecd01c5c213530c68dd5cd6e5090f0091ef69799ec7a8a9f"}, - {file = "levenshtein-0.27.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d18659832567ee387b266be390da0de356a3aa6cf0e8bc009b6042d8188e131f"}, - {file = "levenshtein-0.27.3-cp313-cp313-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027b3d142cc8ea2ab4e60444d7175f65a94dde22a54382b2f7b47cc24936eb53"}, - {file = "levenshtein-0.27.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffdca6989368cc64f347f0423c528520f12775b812e170a0eb0c10e4c9b0f3ff"}, - {file = "levenshtein-0.27.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa00ab389386032b02a1c9050ec3c6aa824d2bbcc692548fdc44a46b71c058c6"}, - {file = "levenshtein-0.27.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:691c9003c6c481b899a5c2f72e8ce05a6d956a9668dc75f2a3ce9f4381a76dc6"}, - {file = "levenshtein-0.27.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12f7fc8bf0c24492fe97905348e020b55b9fc6dbaab7cd452566d1a466cb5e15"}, - {file = "levenshtein-0.27.3-cp313-cp313-win32.whl", hash = "sha256:9f4872e4e19ee48eed39f214eea4eca42e5ef303f8a4a488d8312370674dbf3a"}, - {file = "levenshtein-0.27.3-cp313-cp313-win_amd64.whl", hash = "sha256:83aa2422e9a9af2c9d3e56a53e3e8de6bae58d1793628cae48c4282577c5c2c6"}, - {file = "levenshtein-0.27.3-cp313-cp313-win_arm64.whl", hash = "sha256:d4adaf1edbcf38c3f2e290b52f4dcb5c6deff20308c26ef1127a106bc2d23e9f"}, - {file = "levenshtein-0.27.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:272e24764b8210337b65a1cfd69ce40df5d2de1a3baf1234e7f06d2826ba2e7a"}, - {file = "levenshtein-0.27.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:329a8e748a4e14d56daaa11f07bce3fde53385d05bad6b3f6dd9ee7802cdc915"}, - {file = "levenshtein-0.27.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5fea1a9c6b9cc8729e467e2174b4359ff6bac27356bb5f31898e596b4ce133a"}, - {file = "levenshtein-0.27.3-cp313-cp313t-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3a61aa825819b6356555091d8a575d1235bd9c3753a68316a261af4856c3b487"}, - {file = "levenshtein-0.27.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a51de7a514e8183f0a82f2947d01b014d2391426543b1c076bf5a26328cec4e4"}, - {file = "levenshtein-0.27.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53cbf726d6e92040c9be7e594d959d496bd62597ea48eba9d96105898acbeafe"}, - {file = "levenshtein-0.27.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:191b358afead8561c4fcfed22f83c13bb6c8da5f5789e277f0c5aa1c45ca612f"}, - {file = "levenshtein-0.27.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ba1318d0635b834b8f0397014a7c43f007e65fce396a47614780c881bdff828b"}, - {file = "levenshtein-0.27.3-cp313-cp313t-win32.whl", hash = "sha256:8dd9e1db6c3b35567043e155a686e4827c4aa28a594bd81e3eea84d3a1bd5875"}, - {file = "levenshtein-0.27.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7813ecdac7a6223264ebfea0c8d69959c43d21a99694ef28018d22c4265c2af6"}, - {file = "levenshtein-0.27.3-cp313-cp313t-win_arm64.whl", hash = "sha256:8f05a0d23d13a6f802c7af595d0e43f5b9b98b6ed390cec7a35cb5d6693b882b"}, - {file = "levenshtein-0.27.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a6728bfae9a86002f0223576675fc7e2a6e7735da47185a1d13d1eaaa73dd4be"}, - {file = "levenshtein-0.27.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8e5037c4a6f97a238e24aad6f98a1e984348b7931b1b04b6bd02bd4f8238150d"}, - {file = "levenshtein-0.27.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6cf5ecf9026bf24cf66ad019c6583f50058fae3e1b3c20e8812455b55d597f1"}, - {file = "levenshtein-0.27.3-cp314-cp314-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9285084bd2fc19adb47dab54ed4a71f57f78fe0d754e4a01e3c75409a25aed24"}, - {file = "levenshtein-0.27.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce3bbbe92172a08b599d79956182c6b7ab6ec8d4adbe7237417a363b968ad87b"}, - {file = "levenshtein-0.27.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9dac48fab9d166ca90e12fb6cf6c7c8eb9c41aacf7136584411e20f7f136f745"}, - {file = "levenshtein-0.27.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d37a83722dc5326c93d17078e926c4732dc4f3488dc017c6839e34cd16af92b7"}, - {file = "levenshtein-0.27.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3466cb8294ce586e49dd467560a153ab8d296015c538223f149f9aefd3d9f955"}, - {file = "levenshtein-0.27.3-cp314-cp314-win32.whl", hash = "sha256:c848bf2457b268672b7e9e73b44f18f49856420ac50b2564cf115a6e4ef82688"}, - {file = "levenshtein-0.27.3-cp314-cp314-win_amd64.whl", hash = "sha256:742633f024362a4ed6ef9d7e75d68f74b041ae738985fcf55a0e6d1d4cade438"}, - {file = "levenshtein-0.27.3-cp314-cp314-win_arm64.whl", hash = "sha256:9eed6851224b19e8d588ddb8eb8a4ae3c2dcabf3d1213985f0b94a67e517b1df"}, - {file = "levenshtein-0.27.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:77de69a345c76227b51a4521cd85442eb3da54c7eb6a06663a20c058fc49e683"}, - {file = "levenshtein-0.27.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:eba2756dc1f5b962b0ff80e49abb2153d5e809cc5e7fa5e85be9410ce474795d"}, - {file = "levenshtein-0.27.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c8fcb498287e971d84260f67808ff1a06b3f6212d80fea75cf5155db80606ff"}, - {file = "levenshtein-0.27.3-cp314-cp314t-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f067092c67464faab13e00a5c1a80da93baca8955d4d49579861400762e35591"}, - {file = "levenshtein-0.27.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92415f32c68491203f2855d05eef3277d376182d014cf0859c013c89f277fbbf"}, - {file = "levenshtein-0.27.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ef61eeaf1e0a42d7d947978d981fe4b9426b98b3dd8c1582c535f10dee044c3f"}, - {file = "levenshtein-0.27.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:103bb2e9049d1aa0d1216dd09c1c9106ecfe7541bbdc1a0490b9357d42eec8f2"}, - {file = "levenshtein-0.27.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6a64ddd1986b2a4c468b09544382287315c53585eb067f6e200c337741e057ee"}, - {file = "levenshtein-0.27.3-cp314-cp314t-win32.whl", hash = "sha256:957244f27dc284ccb030a8b77b8a00deb7eefdcd70052a4b1d96f375780ae9dc"}, - {file = "levenshtein-0.27.3-cp314-cp314t-win_amd64.whl", hash = "sha256:ccd7eaa6d8048c3ec07c93cfbcdefd4a3ae8c6aca3a370f2023ee69341e5f076"}, - {file = "levenshtein-0.27.3-cp314-cp314t-win_arm64.whl", hash = "sha256:1d8520b89b7a27bb5aadbcc156715619bcbf556a8ac46ad932470945dca6e1bd"}, - {file = "levenshtein-0.27.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d2d7d22b6117a143f0cf101fe18a3ca90bd949fc33716a42d6165b9768d4a78c"}, - {file = "levenshtein-0.27.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:a55e7a2f317abd28576636e1f840fd268261f447c496a8481a9997a5ce889c59"}, - {file = "levenshtein-0.27.3-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55fa5f11952c38186bd4719e936eb4595b3d519218634924928787c36840256c"}, - {file = "levenshtein-0.27.3-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:559d3588e6766134d95f84f830cf40166360e1769d253f5f83474bff10a24341"}, - {file = "levenshtein-0.27.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:82d40da143c1b9e27adcd34a33dfcc4a0761aa717c5f618b9c6f57dec5d7a958"}, - {file = "levenshtein-0.27.3.tar.gz", hash = "sha256:1ac326b2c84215795163d8a5af471188918b8797b4953ec87aaba22c9c1f9fc0"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "levenshtein-0.27.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13d6f617cb6fe63714c4794861cfaacd398db58a292f930edb7f12aad931dace"}, + {file = "levenshtein-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca9d54d41075e130c390e61360bec80f116b62d6ae973aec502e77e921e95334"}, + {file = "levenshtein-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de1f822b5c9a20d10411f779dfd7181ce3407261436f8470008a98276a9d07f"}, + {file = "levenshtein-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81270392c2e45d1a7e1b3047c3a272d5e28bb4f1eff0137637980064948929b7"}, + {file = "levenshtein-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d30c3ea23a94dddd56dbe323e1fa8a29ceb24da18e2daa8d0abf78b269a5ad1"}, + {file = "levenshtein-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3e0bea76695b9045bbf9ad5f67ad4cc01c11f783368f34760e068f19b6a6bc"}, + {file = "levenshtein-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdd190e468a68c31a5943368a5eaf4e130256a8707886d23ab5906a0cb98a43c"}, + {file = "levenshtein-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7c3121314bb4b676c011c33f6a0ebb462cfdcf378ff383e6f9e4cca5618d0ba7"}, + {file = "levenshtein-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f8ef378c873efcc5e978026b69b45342d841cd7a2f273447324f1c687cc4dc37"}, + {file = "levenshtein-0.27.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff18d78c5c16bea20876425e1bf5af56c25918fb01bc0f2532db1317d4c0e157"}, + {file = "levenshtein-0.27.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:13412ff805afbfe619d070280d1a76eb4198c60c5445cd5478bd4c7055bb3d51"}, + {file = "levenshtein-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a2adb9f263557f7fb13e19eb2f34595d86929a44c250b2fca6e9b65971e51e20"}, + {file = "levenshtein-0.27.1-cp310-cp310-win32.whl", hash = "sha256:6278a33d2e0e909d8829b5a72191419c86dd3bb45b82399c7efc53dabe870c35"}, + {file = "levenshtein-0.27.1-cp310-cp310-win_amd64.whl", hash = "sha256:5b602b8428ee5dc88432a55c5303a739ee2be7c15175bd67c29476a9d942f48e"}, + {file = "levenshtein-0.27.1-cp310-cp310-win_arm64.whl", hash = "sha256:48334081fddaa0c259ba01ee898640a2cf8ede62e5f7e25fefece1c64d34837f"}, + {file = "levenshtein-0.27.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e6f1760108319a108dceb2f02bc7cdb78807ad1f9c673c95eaa1d0fe5dfcaae"}, + {file = "levenshtein-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c4ed8400d94ab348099395e050b8ed9dd6a5d6b5b9e75e78b2b3d0b5f5b10f38"}, + {file = "levenshtein-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7826efe51be8ff58bc44a633e022fdd4b9fc07396375a6dbc4945a3bffc7bf8f"}, + {file = "levenshtein-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff5afb78719659d353055863c7cb31599fbea6865c0890b2d840ee40214b3ddb"}, + {file = "levenshtein-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:201dafd5c004cd52018560cf3213da799534d130cf0e4db839b51f3f06771de0"}, + {file = "levenshtein-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5ddd59f3cfaec216811ee67544779d9e2d6ed33f79337492a248245d6379e3d"}, + {file = "levenshtein-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6afc241d27ecf5b921063b796812c55b0115423ca6fa4827aa4b1581643d0a65"}, + {file = "levenshtein-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee2e766277cceb8ca9e584ea03b8dc064449ba588d3e24c1923e4b07576db574"}, + {file = "levenshtein-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:920b23d6109453913ce78ec451bc402ff19d020ee8be4722e9d11192ec2fac6f"}, + {file = "levenshtein-0.27.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:560d7edba126e2eea3ac3f2f12e7bd8bc9c6904089d12b5b23b6dfa98810b209"}, + {file = "levenshtein-0.27.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8d5362b6c7aa4896dc0cb1e7470a4ad3c06124e0af055dda30d81d3c5549346b"}, + {file = "levenshtein-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:65ba880815b0f80a80a293aeebac0fab8069d03ad2d6f967a886063458f9d7a1"}, + {file = "levenshtein-0.27.1-cp311-cp311-win32.whl", hash = "sha256:fcc08effe77fec0bc5b0f6f10ff20b9802b961c4a69047b5499f383119ddbe24"}, + {file = "levenshtein-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:0ed402d8902be7df212ac598fc189f9b2d520817fdbc6a05e2ce44f7f3ef6857"}, + {file = "levenshtein-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:7fdaab29af81a8eb981043737f42450efca64b9761ca29385487b29c506da5b5"}, + {file = "levenshtein-0.27.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25fb540d8c55d1dc7bdc59b7de518ea5ed9df92eb2077e74bcb9bb6de7b06f69"}, + {file = "levenshtein-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f09cfab6387e9c908c7b37961c045e8e10eb9b7ec4a700367f8e080ee803a562"}, + {file = "levenshtein-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dafa29c0e616f322b574e0b2aeb5b1ff2f8d9a1a6550f22321f3bd9bb81036e3"}, + {file = "levenshtein-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be7a7642ea64392fa1e6ef7968c2e50ef2152c60948f95d0793361ed97cf8a6f"}, + {file = "levenshtein-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:060b48c45ed54bcea9582ce79c6365b20a1a7473767e0b3d6be712fa3a22929c"}, + {file = "levenshtein-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:712f562c5e64dd0398d3570fe99f8fbb88acec7cc431f101cb66c9d22d74c542"}, + {file = "levenshtein-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6141ad65cab49aa4527a3342d76c30c48adb2393b6cdfeca65caae8d25cb4b8"}, + {file = "levenshtein-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:799b8d73cda3265331116f62932f553804eae16c706ceb35aaf16fc2a704791b"}, + {file = "levenshtein-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ec99871d98e517e1cc4a15659c62d6ea63ee5a2d72c5ddbebd7bae8b9e2670c8"}, + {file = "levenshtein-0.27.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8799164e1f83588dbdde07f728ea80796ea72196ea23484d78d891470241b222"}, + {file = "levenshtein-0.27.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:583943813898326516ab451a83f734c6f07488cda5c361676150d3e3e8b47927"}, + {file = "levenshtein-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5bb22956af44bb4eade93546bf95be610c8939b9a9d4d28b2dfa94abf454fed7"}, + {file = "levenshtein-0.27.1-cp312-cp312-win32.whl", hash = "sha256:d9099ed1bcfa7ccc5540e8ad27b5dc6f23d16addcbe21fdd82af6440f4ed2b6d"}, + {file = "levenshtein-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:7f071ecdb50aa6c15fd8ae5bcb67e9da46ba1df7bba7c6bf6803a54c7a41fd96"}, + {file = "levenshtein-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:83b9033a984ccace7703f35b688f3907d55490182fd39b33a8e434d7b2e249e6"}, + {file = "levenshtein-0.27.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ab00c2cae2889166afb7e1af64af2d4e8c1b126f3902d13ef3740df00e54032d"}, + {file = "levenshtein-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c27e00bc7527e282f7c437817081df8da4eb7054e7ef9055b851fa3947896560"}, + {file = "levenshtein-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5b07de42bfc051136cc8e7f1e7ba2cb73666aa0429930f4218efabfdc5837ad"}, + {file = "levenshtein-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb11ad3c9dae3063405aa50d9c96923722ab17bb606c776b6817d70b51fd7e07"}, + {file = "levenshtein-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c5986fb46cb0c063305fd45b0a79924abf2959a6d984bbac2b511d3ab259f3f"}, + {file = "levenshtein-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75191e469269ddef2859bc64c4a8cfd6c9e063302766b5cb7e1e67f38cc7051a"}, + {file = "levenshtein-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51b3a7b2266933babc04e4d9821a495142eebd6ef709f90e24bc532b52b81385"}, + {file = "levenshtein-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbac509794afc3e2a9e73284c9e3d0aab5b1d928643f42b172969c3eefa1f2a3"}, + {file = "levenshtein-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8d68714785178347ecb272b94e85cbf7e638165895c4dd17ab57e7742d8872ec"}, + {file = "levenshtein-0.27.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8ee74ee31a5ab8f61cd6c6c6e9ade4488dde1285f3c12207afc018393c9b8d14"}, + {file = "levenshtein-0.27.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f2441b6365453ec89640b85344afd3d602b0d9972840b693508074c613486ce7"}, + {file = "levenshtein-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a9be39640a46d8a0f9be729e641651d16a62b2c07d3f4468c36e1cc66b0183b9"}, + {file = "levenshtein-0.27.1-cp313-cp313-win32.whl", hash = "sha256:a520af67d976761eb6580e7c026a07eb8f74f910f17ce60e98d6e492a1f126c7"}, + {file = "levenshtein-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:7dd60aa49c2d8d23e0ef6452c8329029f5d092f386a177e3385d315cabb78f2a"}, + {file = "levenshtein-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:149cd4f0baf5884ac5df625b7b0d281721b15de00f447080e38f5188106e1167"}, + {file = "levenshtein-0.27.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c9231ac7c705a689f12f4fc70286fa698b9c9f06091fcb0daddb245e9259cbe"}, + {file = "levenshtein-0.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf9ba080b1a8659d35c11dcfffc7f8c001028c2a3a7b7e6832348cdd60c53329"}, + {file = "levenshtein-0.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:164e3184385caca94ef7da49d373edd7fb52d4253bcc5bd5b780213dae307dfb"}, + {file = "levenshtein-0.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6024d67de6efbd32aaaafd964864c7fee0569b960556de326c3619d1eeb2ba4"}, + {file = "levenshtein-0.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fbb234b3b04e04f7b3a2f678e24fd873c86c543d541e9df3ac9ec1cc809e732"}, + {file = "levenshtein-0.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffdd9056c7afb29aea00b85acdb93a3524e43852b934ebb9126c901506d7a1ed"}, + {file = "levenshtein-0.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1a0918243a313f481f4ba6a61f35767c1230395a187caeecf0be87a7c8f0624"}, + {file = "levenshtein-0.27.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c57655b20690ffa5168df7f4b7c6207c4ca917b700fb1b142a49749eb1cf37bb"}, + {file = "levenshtein-0.27.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:079cc78de05d3ded6cf1c5e2c3eadeb1232e12d49be7d5824d66c92b28c3555a"}, + {file = "levenshtein-0.27.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ac28c4ced134c0fe2941230ce4fd5c423aa66339e735321665fb9ae970f03a32"}, + {file = "levenshtein-0.27.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a2f7688355b22db27588f53c922b4583b8b627c83a8340191bbae1fbbc0f5f56"}, + {file = "levenshtein-0.27.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:654e8f016cb64ad27263d3364c6536e7644205f20d94748c8b94c586e3362a23"}, + {file = "levenshtein-0.27.1-cp39-cp39-win32.whl", hash = "sha256:145e6e8744643a3764fed9ab4ab9d3e2b8e5f05d2bcd0ad7df6f22f27a9fbcd4"}, + {file = "levenshtein-0.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:612f0c90201c318dd113e7e97bd677e6e3e27eb740f242b7ae1a83f13c892b7e"}, + {file = "levenshtein-0.27.1-cp39-cp39-win_arm64.whl", hash = "sha256:cde09ec5b3cc84a6737113b47e45392b331c136a9e8a8ead8626f3eacae936f8"}, + {file = "levenshtein-0.27.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c92a222ab95b8d903eae6d5e7d51fe6c999be021b647715c18d04d0b0880f463"}, + {file = "levenshtein-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:71afc36b4ee950fa1140aff22ffda9e5e23280285858e1303260dbb2eabf342d"}, + {file = "levenshtein-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b1daeebfc148a571f09cfe18c16911ea1eaaa9e51065c5f7e7acbc4b866afa"}, + {file = "levenshtein-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:105edcb14797d95c77f69bad23104314715a64cafbf4b0e79d354a33d7b54d8d"}, + {file = "levenshtein-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c58fb1ef8bdc8773d705fbacf628e12c3bb63ee4d065dda18a76e86042444a"}, + {file = "levenshtein-0.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e52270591854af67217103955a36bd7436b57c801e3354e73ba44d689ed93697"}, + {file = "levenshtein-0.27.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:909b7b6bce27a4ec90576c9a9bd9af5a41308dfecf364b410e80b58038277bbe"}, + {file = "levenshtein-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d193a7f97b8c6a350e36ec58e41a627c06fa4157c3ce4b2b11d90cfc3c2ebb8f"}, + {file = "levenshtein-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:614be316e3c06118705fae1f717f9072d35108e5fd4e66a7dd0e80356135340b"}, + {file = "levenshtein-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31fc0a5bb070722bdabb6f7e14955a294a4a968c68202d294699817f21545d22"}, + {file = "levenshtein-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9415aa5257227af543be65768a80c7a75e266c3c818468ce6914812f88f9c3df"}, + {file = "levenshtein-0.27.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7987ef006a3cf56a4532bd4c90c2d3b7b4ca9ad3bf8ae1ee5713c4a3bdfda913"}, + {file = "levenshtein-0.27.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e67750653459a8567b5bb10e56e7069b83428d42ff5f306be821ef033b92d1a8"}, + {file = "levenshtein-0.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93344c2c3812f21fdc46bd9e57171684fc53dd107dae2f648d65ea6225d5ceaf"}, + {file = "levenshtein-0.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4baef7e7460691006dd2ca6b9e371aecf135130f72fddfe1620ae740b68d94"}, + {file = "levenshtein-0.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8141c8e5bf2bd76ae214c348ba382045d7ed9d0e7ce060a36fc59c6af4b41d48"}, + {file = "levenshtein-0.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:773aa120be48c71e25c08d92a2108786e6537a24081049664463715926c76b86"}, + {file = "levenshtein-0.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f12a99138fb09eb5606ab9de61dd234dd82a7babba8f227b5dce0e3ae3a9eaf4"}, + {file = "levenshtein-0.27.1.tar.gz", hash = "sha256:3e18b73564cfc846eec94dd13fab6cb006b5d2e0cc56bad1fd7d5585881302e3"}, ] [package.dependencies] @@ -2000,26 +1983,25 @@ rapidfuzz = ">=3.9.0,<4.0.0" [[package]] name = "litellm" -version = "1.78.7" +version = "1.74.3" description = "Library to easily interface with LLM API providers" optional = false python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "litellm-1.78.7-py3-none-any.whl", hash = "sha256:aa93ae1fefe02fb00b2a78eba3c95002f9ef478bade3e22e63508830182e2dfe"}, - {file = "litellm-1.78.7.tar.gz", hash = "sha256:6b10f5c7dc217bde3481fa4f70b5c37edbfa617bec7149276833d311f76a6783"}, + {file = "litellm-1.74.3-py3-none-any.whl", hash = "sha256:638ec73633c6f2cf78a7343723d8f3bc13c192558fcbaa29f3ba6bc7802e8663"}, + {file = "litellm-1.74.3.tar.gz", hash = "sha256:a9e87ebe78947ceec67e75f830f1c956cc653b84563574241acea9c84e7e3ca1"}, ] [package.dependencies] aiohttp = ">=3.10" click = "*" -fastuuid = ">=0.13.0" httpx = ">=0.23.0" importlib-metadata = ">=6.8.0" jinja2 = ">=3.1.2,<4.0.0" jsonschema = ">=4.22.0,<5.0.0" -openai = ">=1.99.5" +openai = ">=1.68.2" pydantic = ">=2.5.0,<3.0.0" python-dotenv = ">=0.2.0" tiktoken = ">=0.7.0" @@ -2027,10 +2009,8 @@ tokenizers = "*" [package.extras] caching = ["diskcache (>=5.6.1,<6.0.0)"] -extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-iam (>=2.19.1,<3.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "redisvl (>=0.4.1,<0.5.0)", "resend (>=0.8.0,<0.9.0)"] -mlflow = ["mlflow (>3.1.4)"] -proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-storage-blob (>=12.25.1,<13.0.0)", "backoff", "boto3 (==1.36.0)", "cryptography", "fastapi (>=0.115.5,<0.116.0)", "fastapi-sso (>=0.16.0,<0.17.0)", "gunicorn (>=23.0.0,<24.0.0)", "litellm-enterprise (==0.1.20)", "litellm-proxy-extras (==0.2.27)", "mcp (>=1.10.0,<2.0.0)", "orjson (>=3.9.7,<4.0.0)", "polars (>=1.31.0,<2.0.0)", "pynacl (>=1.5.0,<2.0.0)", "python-multipart (>=0.0.18,<0.0.19)", "pyyaml (>=6.0.1,<7.0.0)", "rich (==13.7.1)", "rq", "uvicorn (>=0.29.0,<0.30.0)", "uvloop (>=0.21.0,<0.22.0)", "websockets (>=13.1.0,<14.0.0)"] -semantic-router = ["semantic-router"] +extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "redisvl (>=0.4.1,<0.5.0)", "resend (>=0.8.0,<0.9.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "boto3 (==1.34.34)", "cryptography (>=43.0.1,<44.0.0)", "fastapi (>=0.115.5,<0.116.0)", "fastapi-sso (>=0.16.0,<0.17.0)", "gunicorn (>=23.0.0,<24.0.0)", "litellm-enterprise (==0.1.12)", "litellm-proxy-extras (==0.2.10)", "mcp (==1.10.0)", "orjson (>=3.9.7,<4.0.0)", "pynacl (>=1.5.0,<2.0.0)", "python-multipart (>=0.0.18,<0.0.19)", "pyyaml (>=6.0.1,<7.0.0)", "rich (==13.7.1)", "rq", "uvicorn (>=0.29.0,<0.30.0)", "uvloop (>=0.21.0,<0.22.0)", "websockets (>=13.1.0,<14.0.0)"] utils = ["numpydoc"] [[package]] @@ -2040,7 +2020,7 @@ description = "A super-fast templating language that borrows the best ideas from optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59"}, {file = "mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28"}, @@ -2056,102 +2036,74 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "3.0.3" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, - {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, - {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, - {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, - {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, - {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, - {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, - {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, - {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, - {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, - {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, - {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, - {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, - {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, - {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, - {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, - {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, - {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, - {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, - {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, - {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, - {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, - {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, - {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, - {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, - {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, - {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, - {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, - {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, - {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, - {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, - {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, - {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, - {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, - {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -2161,207 +2113,197 @@ description = "An implementation of time.monotonic() for Python 2 & < 3.3" optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, ] +[[package]] +name = "motor" +version = "3.7.1" +description = "Non-blocking MongoDB driver for Tornado or asyncio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "motor-3.7.1-py3-none-any.whl", hash = "sha256:8a63b9049e38eeeb56b4fdd57c3312a6d1f25d01db717fe7d82222393c410298"}, + {file = "motor-3.7.1.tar.gz", hash = "sha256:27b4d46625c87928f331a6ca9d7c51c2f518ba0e270939d395bc1ddc89d64526"}, +] + +[package.dependencies] +pymongo = ">=4.9,<5.0" + +[package.extras] +aws = ["pymongo[aws] (>=4.5,<5)"] +docs = ["aiohttp", "furo (==2024.8.6)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "tornado"] +encryption = ["pymongo[encryption] (>=4.5,<5)"] +gssapi = ["pymongo[gssapi] (>=4.5,<5)"] +ocsp = ["pymongo[ocsp] (>=4.5,<5)"] +snappy = ["pymongo[snappy] (>=4.5,<5)"] +test = ["aiohttp (>=3.8.7)", "cffi (>=1.17.0rc1)", "mockupdb", "pymongo[encryption] (>=4.5,<5)", "pytest (>=7)", "pytest-asyncio", "tornado (>=5)"] +zstd = ["pymongo[zstd] (>=4.5,<5)"] + [[package]] name = "multidict" -version = "6.7.0" +version = "6.6.3" description = "multidict implementation" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, - {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, - {file = "multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62"}, - {file = "multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111"}, - {file = "multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36"}, - {file = "multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85"}, - {file = "multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7"}, - {file = "multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721"}, - {file = "multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8"}, - {file = "multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b"}, - {file = "multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34"}, - {file = "multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff"}, - {file = "multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81"}, - {file = "multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45"}, - {file = "multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1"}, - {file = "multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a"}, - {file = "multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8"}, - {file = "multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4"}, - {file = "multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b"}, - {file = "multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159"}, - {file = "multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf"}, - {file = "multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd"}, - {file = "multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288"}, - {file = "multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17"}, - {file = "multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390"}, - {file = "multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb"}, - {file = "multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad"}, - {file = "multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762"}, - {file = "multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6"}, - {file = "multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d"}, - {file = "multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6"}, - {file = "multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b"}, - {file = "multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1"}, - {file = "multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f"}, - {file = "multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f"}, - {file = "multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885"}, - {file = "multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c"}, - {file = "multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718"}, - {file = "multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a"}, - {file = "multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9"}, - {file = "multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0"}, - {file = "multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13"}, - {file = "multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd"}, - {file = "multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:363eb68a0a59bd2303216d2346e6c441ba10d36d1f9969fcb6f1ba700de7bb5c"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d874eb056410ca05fed180b6642e680373688efafc7f077b2a2f61811e873a40"}, - {file = "multidict-6.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b55d5497b51afdfde55925e04a022f1de14d4f4f25cdfd4f5d9b0aa96166851"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f8e5c0031b90ca9ce555e2e8fd5c3b02a25f14989cbc310701823832c99eb687"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cf41880c991716f3c7cec48e2f19ae4045fc9db5fc9cff27347ada24d710bb5"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cfc12a8630a29d601f48d47787bd7eb730e475e83edb5d6c5084317463373eb"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3996b50c3237c4aec17459217c1e7bbdead9a22a0fcd3c365564fbd16439dde6"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7f5170993a0dd3ab871c74f45c0a21a4e2c37a2f2b01b5f722a2ad9c6650469e"}, - {file = "multidict-6.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec81878ddf0e98817def1e77d4f50dae5ef5b0e4fe796fae3bd674304172416e"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9281bf5b34f59afbc6b1e477a372e9526b66ca446f4bf62592839c195a718b32"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:68af405971779d8b37198726f2b6fe3955db846fee42db7a4286fc542203934c"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3ba3ef510467abb0667421a286dc906e30eb08569365f5cdb131d7aff7c2dd84"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b61189b29081a20c7e4e0b49b44d5d44bb0dc92be3c6d06a11cc043f81bf9329"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fb287618b9c7aa3bf8d825f02d9201b2f13078a5ed3b293c8f4d953917d84d5e"}, - {file = "multidict-6.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:521f33e377ff64b96c4c556b81c55d0cfffb96a11c194fd0c3f1e56f3d8dd5a4"}, - {file = "multidict-6.7.0-cp39-cp39-win32.whl", hash = "sha256:ce8fdc2dca699f8dbf055a61d73eaa10482569ad20ee3c36ef9641f69afa8c91"}, - {file = "multidict-6.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e73299c99939f089dd9b2120a04a516b95cdf8c1cd2b18c53ebf0de80b1f18f"}, - {file = "multidict-6.7.0-cp39-cp39-win_arm64.whl", hash = "sha256:6bdce131e14b04fd34a809b6380dbfd826065c3e2fe8a50dbae659fa0c390546"}, - {file = "multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3"}, - {file = "multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "multidict-6.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2be5b7b35271f7fff1397204ba6708365e3d773579fe2a30625e16c4b4ce817"}, + {file = "multidict-6.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12f4581d2930840295c461764b9a65732ec01250b46c6b2c510d7ee68872b140"}, + {file = "multidict-6.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dd7793bab517e706c9ed9d7310b06c8672fd0aeee5781bfad612f56b8e0f7d14"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:72d8815f2cd3cf3df0f83cac3f3ef801d908b2d90409ae28102e0553af85545a"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:531e331a2ee53543ab32b16334e2deb26f4e6b9b28e41f8e0c87e99a6c8e2d69"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42ca5aa9329a63be8dc49040f63817d1ac980e02eeddba763a9ae5b4027b9c9c"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:208b9b9757060b9faa6f11ab4bc52846e4f3c2fb8b14d5680c8aac80af3dc751"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:acf6b97bd0884891af6a8b43d0f586ab2fcf8e717cbd47ab4bdddc09e20652d8"}, + {file = "multidict-6.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:68e9e12ed00e2089725669bdc88602b0b6f8d23c0c95e52b95f0bc69f7fe9b55"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05db2f66c9addb10cfa226e1acb363450fab2ff8a6df73c622fefe2f5af6d4e7"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0db58da8eafb514db832a1b44f8fa7906fdd102f7d982025f816a93ba45e3dcb"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14117a41c8fdb3ee19c743b1c027da0736fdb79584d61a766da53d399b71176c"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:877443eaaabcd0b74ff32ebeed6f6176c71850feb7d6a1d2db65945256ea535c"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:70b72e749a4f6e7ed8fb334fa8d8496384840319512746a5f42fa0aec79f4d61"}, + {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43571f785b86afd02b3855c5ac8e86ec921b760298d6f82ff2a61daf5a35330b"}, + {file = "multidict-6.6.3-cp310-cp310-win32.whl", hash = "sha256:20c5a0c3c13a15fd5ea86c42311859f970070e4e24de5a550e99d7c271d76318"}, + {file = "multidict-6.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab0a34a007704c625e25a9116c6770b4d3617a071c8a7c30cd338dfbadfe6485"}, + {file = "multidict-6.6.3-cp310-cp310-win_arm64.whl", hash = "sha256:769841d70ca8bdd140a715746199fc6473414bd02efd678d75681d2d6a8986c5"}, + {file = "multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c"}, + {file = "multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df"}, + {file = "multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9"}, + {file = "multidict-6.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56"}, + {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183"}, + {file = "multidict-6.6.3-cp311-cp311-win32.whl", hash = "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5"}, + {file = "multidict-6.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2"}, + {file = "multidict-6.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb"}, + {file = "multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6"}, + {file = "multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f"}, + {file = "multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a"}, + {file = "multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75"}, + {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10"}, + {file = "multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5"}, + {file = "multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17"}, + {file = "multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b"}, + {file = "multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55"}, + {file = "multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b"}, + {file = "multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca"}, + {file = "multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1"}, + {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6"}, + {file = "multidict-6.6.3-cp313-cp313-win32.whl", hash = "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e"}, + {file = "multidict-6.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9"}, + {file = "multidict-6.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600"}, + {file = "multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134"}, + {file = "multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37"}, + {file = "multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0"}, + {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d"}, + {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c"}, + {file = "multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e"}, + {file = "multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d"}, + {file = "multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb"}, + {file = "multidict-6.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c8161b5a7778d3137ea2ee7ae8a08cce0010de3b00ac671c5ebddeaa17cefd22"}, + {file = "multidict-6.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1328201ee930f069961ae707d59c6627ac92e351ed5b92397cf534d1336ce557"}, + {file = "multidict-6.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b1db4d2093d6b235de76932febf9d50766cf49a5692277b2c28a501c9637f616"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53becb01dd8ebd19d1724bebe369cfa87e4e7f29abbbe5c14c98ce4c383e16cd"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41bb9d1d4c303886e2d85bade86e59885112a7f4277af5ad47ab919a2251f306"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:775b464d31dac90f23192af9c291dc9f423101857e33e9ebf0020a10bfcf4144"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d04d01f0a913202205a598246cf77826fe3baa5a63e9f6ccf1ab0601cf56eca0"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d25594d3b38a2e6cabfdcafef339f754ca6e81fbbdb6650ad773ea9775af35ab"}, + {file = "multidict-6.6.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35712f1748d409e0707b165bf49f9f17f9e28ae85470c41615778f8d4f7d9609"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1c8082e5814b662de8589d6a06c17e77940d5539080cbab9fe6794b5241b76d9"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:61af8a4b771f1d4d000b3168c12c3120ccf7284502a94aa58c68a81f5afac090"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:448e4a9afccbf297577f2eaa586f07067441e7b63c8362a3540ba5a38dc0f14a"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:233ad16999afc2bbd3e534ad8dbe685ef8ee49a37dbc2cdc9514e57b6d589ced"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:bb933c891cd4da6bdcc9733d048e994e22e1883287ff7540c2a0f3b117605092"}, + {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:37b09ca60998e87734699e88c2363abfd457ed18cfbf88e4009a4e83788e63ed"}, + {file = "multidict-6.6.3-cp39-cp39-win32.whl", hash = "sha256:f54cb79d26d0cd420637d184af38f0668558f3c4bbe22ab7ad830e67249f2e0b"}, + {file = "multidict-6.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:295adc9c0551e5d5214b45cf29ca23dbc28c2d197a9c30d51aed9e037cb7c578"}, + {file = "multidict-6.6.3-cp39-cp39-win_arm64.whl", hash = "sha256:15332783596f227db50fb261c2c251a58ac3873c457f3a550a95d5c0aa3c770d"}, + {file = "multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a"}, + {file = "multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc"}, ] [[package]] name = "newrelic" -version = "10.17.0" +version = "10.14.0" description = "New Relic Python Agent" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "newrelic-10.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91ebeaae460beaaeb3113474873bc5fc9c6c13ab6b0fd8936f584c508fec373d"}, - {file = "newrelic-10.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30b8b6a9f447a7276fd19a41ccc6dba264f9ef569e4bed92200a58b76e7f7754"}, - {file = "newrelic-10.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:214bd42ef8fb1c2046727bfe15c8f374ebf4ff2d5091ca1ac870abd2a7574ffe"}, - {file = "newrelic-10.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36a14fd92b44324d9bb33e1c1698c2cd15ffa0e291d222365e929ee17cd9d6da"}, - {file = "newrelic-10.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f62f70f1c01aa527de7e6ce2eb4c0285a7c40a89b42107be92bcc5dfd0fa8bb4"}, - {file = "newrelic-10.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54898db2b9eb81db9f3421302d2d03451630c033f2001fbe9f21d0e068f0418f"}, - {file = "newrelic-10.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65f7d08f90caf6dd3708068a0eda8328c49ec18e51d514a43afaa5a68180e9c"}, - {file = "newrelic-10.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dd61153b82b1e265754820f3e91c96c16b1b75508b6c169e27b5c196f1b7b95"}, - {file = "newrelic-10.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ab9cbce3f8da5bfcd085b8a59591cfb653d75834b362e3eccb86bdf21eea917"}, - {file = "newrelic-10.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:889969407457a9344927b1a9e9d5afde77345857db4d2ea75b119d02c02d9174"}, - {file = "newrelic-10.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d74c06863356b19c1fcf19900f85057ab33ef779aa3e0de3cb7e3d3f37ca8e20"}, - {file = "newrelic-10.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:083777458f93d16ae9e605fd66a6298d856e32deea11cf3270ed237858dcbfe6"}, - {file = "newrelic-10.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165c7045da474342d4ceab67776e8aeb66e77674fab7484b4e2e4ea68d02ed4d"}, - {file = "newrelic-10.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3c3c82c95b57fe30fc1f684bf920bd8b0ecae70a16cc11f55d0867ffb7520d"}, - {file = "newrelic-10.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5789f739e6ca1c4a49649e406b538d67c063ec33ab4658d01049303dfad9398b"}, - {file = "newrelic-10.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4144dd96fa55772456326b3a6032a53d54aa9245ffc5041b002ce9eb5dbd0992"}, - {file = "newrelic-10.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c444e96918508decee6f532f04f0fa79027db0728770669ace4a7008c5dd52ca"}, - {file = "newrelic-10.17.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5171f1020bc834b01faae8466b5375e8c2162fa219c98430e42af1c6e5077b14"}, - {file = "newrelic-10.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0b43fb53f8a63c1e792a9ba4439680265b481c44efd64f7d92069e974c38b199"}, - {file = "newrelic-10.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78a673440037ad61e0073da69f2549fac92271dadd7a2087c22a20ddc7f91260"}, - {file = "newrelic-10.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e81b726f3fab5fed155407f157ed67931d2d83403cc0ae473327e0b7b42bc5"}, - {file = "newrelic-10.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed6f549b1ab42ad31d5ee34c8041f1484ab769e045ad3b9f321c9588339079f3"}, - {file = "newrelic-10.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3a34df04ff6315619a8d098c59751f766de57f14e5cd5c09427dde47bfbc5012"}, - {file = "newrelic-10.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d92b43c07cf137d8a6d8dc73c87fbef99ca449564c25385e66727f156c2c34d8"}, - {file = "newrelic-10.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7669597193d8f6a3512fd5e8728a7b2b244db9694b3a03b3b99930ba9efc9e3b"}, - {file = "newrelic-10.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1027039eae1b4d3ffee3077135900a41ffdc41bd2bee3162d6cf36bd990cf3b"}, - {file = "newrelic-10.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:af28eb5e7f368f6f4fcde9593e7dd189b68e39a2e7409874a0cdea3a4bb4e904"}, - {file = "newrelic-10.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:328162a61e30f7b3e76241830989110d8f86d8392805a78034f8109e4f5434b4"}, - {file = "newrelic-10.17.0.tar.gz", hash = "sha256:f092109ac024f9524fafdd06126924c0fbd2af54684571167c0ee1d1cc1bcb7d"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "newrelic-10.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:082b381c91acc0b2a11b816847a8d728b6483ca9e9ba834f234dee5e6b93fb7d"}, + {file = "newrelic-10.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71366ac12c0b156a55d3400d35064cb393b6af5f2bd3a0eb48ed0efb2ffce8e"}, + {file = "newrelic-10.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ad2509b5f21d5aa3708ab9b72572a8d66c22b06d575ae42b7c667dd95bb502ea"}, + {file = "newrelic-10.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c8a0e30a17e9ff4ddd1f3f684e0e4a497eeee0fe5cb3de564b934bdffb6ac43d"}, + {file = "newrelic-10.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e5003933089be0d2cd02bd08a62c6c0716f26fc875c0dff9551f206ff3c07bf"}, + {file = "newrelic-10.14.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34afdc76f21f9d66367ed7c2fba38872339bcfec3bfa91aad4bbd3f28b76d411"}, + {file = "newrelic-10.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:267a3d747d0dbebbc1aaa296bfb03b16a1724510fda529efc58eee356dbc7704"}, + {file = "newrelic-10.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e866d3fb2d4b6f5493dd0b31e8ff4ba67aafaa563d0b7c0951dbf47fa4f0af72"}, + {file = "newrelic-10.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:658f8c12d3974b1ca0ec16c373dfb9cbb663453372ca3964ad92539c94479b67"}, + {file = "newrelic-10.14.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:448214f3f47cd5f620a5d649e810cd467c7edbbf3160f8d0f637e8385ba5e77d"}, + {file = "newrelic-10.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:856c1487f5c5b1d0e4b7df288e43cf18cccd8e7edc63162aba13f7c203e6255b"}, + {file = "newrelic-10.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74c32b4c6767d0d39875ea40f937562729ab32167e2d5c9d12ce79798704b124"}, + {file = "newrelic-10.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c582422d40570484007f1b3c5027f5ed3e58cdad4ad074ba87ffeb7321e42637"}, + {file = "newrelic-10.14.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231a60ccffae90ed10e5a4c30f07380afe120d178c0e3237a35e8800207de8c4"}, + {file = "newrelic-10.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79c14d5d9d0811fdb974b0c1493328a6daa0ceeffe397fdd5b6a52254053e203"}, + {file = "newrelic-10.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:96f6f3e0b4474d3f941bd0246b50e5676e5ebd1b5d95a89c5aefb60568d14489"}, + {file = "newrelic-10.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55c3e9c62d10b670a155f466ce9202b3be2e2557dec7cf876bae014229160b5a"}, + {file = "newrelic-10.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e9074ada285e4ec3cb9c9a310c8d9820f7f33d44831195b999ea40d00466d99"}, + {file = "newrelic-10.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d35a5058599c491b8cc4cf0f102c5a0837acefe9d577a8fcb5cbdca1f05f1172"}, + {file = "newrelic-10.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d08187de95f8220df302553ebbeeaf446ea345e7206a65154a2286ed9e28d0c1"}, + {file = "newrelic-10.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9335c0c1a9d2b5fc80c701252276e11678414fa6ca3970bacecbd7e69a927bf9"}, + {file = "newrelic-10.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d17a1529716cf2b1cbca3669065246af4af3dc9c2e74b93f26000f631dcce312"}, + {file = "newrelic-10.14.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3b6625191a2c0ba9754f0a5d73d213c514e37e4a95dc4e57fc6e34be2de75a29"}, + {file = "newrelic-10.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:24e92c7e4343bd43bea5d0e94e2e8fec21d27c997501ebd3e5dd14056dba9a8a"}, + {file = "newrelic-10.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bf1c154ca85531c3d3a258c8dd7e213d8a741d10af36358304cc33493ff6e2"}, + {file = "newrelic-10.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a638f0371ba82498911e229c93b38960f36ee51968c4201a9ec8933e702036f8"}, + {file = "newrelic-10.14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:86188bb9973c74cff88de3494ad6e5c6e617300febf14215d257d4b5e6b4e005"}, + {file = "newrelic-10.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3e9582abf32dbbbe9b191337cd0f6ea040ec461bf4c723fc66da1c68e0737bc9"}, + {file = "newrelic-10.14.0.tar.gz", hash = "sha256:18e7e6fa1dd758ef3d1648e3b0f15c6b4d94271996dc129f630a4d7278309cf5"}, ] [package.extras] @@ -2369,339 +2311,195 @@ infinite-tracing = ["grpcio", "protobuf"] [[package]] name = "numpy" -version = "2.3.4" +version = "1.26.3" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.11" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb"}, - {file = "numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f"}, - {file = "numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36"}, - {file = "numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032"}, - {file = "numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7"}, - {file = "numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda"}, - {file = "numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0"}, - {file = "numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a"}, - {file = "numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1"}, - {file = "numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996"}, - {file = "numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c"}, - {file = "numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11"}, - {file = "numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9"}, - {file = "numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667"}, - {file = "numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef"}, - {file = "numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e"}, - {file = "numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a"}, - {file = "numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16"}, - {file = "numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786"}, - {file = "numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc"}, - {file = "numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32"}, - {file = "numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db"}, - {file = "numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966"}, - {file = "numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3"}, - {file = "numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197"}, - {file = "numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e"}, - {file = "numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7"}, - {file = "numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953"}, - {file = "numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37"}, - {file = "numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd"}, - {file = "numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646"}, - {file = "numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d"}, - {file = "numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc"}, - {file = "numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879"}, - {file = "numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562"}, - {file = "numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a"}, - {file = "numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6"}, - {file = "numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7"}, - {file = "numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0"}, - {file = "numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f"}, - {file = "numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64"}, - {file = "numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb"}, - {file = "numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c"}, - {file = "numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40"}, - {file = "numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e"}, - {file = "numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff"}, - {file = "numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f"}, - {file = "numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b"}, - {file = "numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7"}, - {file = "numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2"}, - {file = "numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52"}, - {file = "numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26"}, - {file = "numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc"}, - {file = "numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9"}, - {file = "numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868"}, - {file = "numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec"}, - {file = "numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3"}, - {file = "numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365"}, - {file = "numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252"}, - {file = "numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e"}, - {file = "numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0"}, - {file = "numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0"}, - {file = "numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f"}, - {file = "numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d"}, - {file = "numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6"}, - {file = "numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d"}, - {file = "numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f"}, - {file = "numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a"}, +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, +] + +[[package]] +name = "oauthlib" +version = "3.3.1" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1"}, + {file = "oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9"}, ] +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + [[package]] name = "openai" -version = "2.7.1" +version = "1.95.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "openai-2.7.1-py3-none-any.whl", hash = "sha256:2f2530354d94c59c614645a4662b9dab0a5b881c5cd767a8587398feac0c9021"}, - {file = "openai-2.7.1.tar.gz", hash = "sha256:df4d4a3622b2df3475ead8eb0fbb3c27fd1c070fa2e55d778ca4f40e0186c726"}, + {file = "openai-1.95.1-py3-none-any.whl", hash = "sha256:8bbdfeceef231b1ddfabbc232b179d79f8b849aab5a7da131178f8d10e0f162f"}, + {file = "openai-1.95.1.tar.gz", hash = "sha256:f089b605282e2a2b6776090b4b46563ac1da77f56402a222597d591e2dcc1086"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" -jiter = ">=0.10.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" typing-extensions = ">=4.11,<5" [package.extras] -aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.9)"] +aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.8)"] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] realtime = ["websockets (>=13,<16)"] voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"] -[[package]] -name = "opentelemetry-api" -version = "1.38.0" -description = "OpenTelemetry Python API" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "opentelemetry_api-1.38.0-py3-none-any.whl", hash = "sha256:2891b0197f47124454ab9f0cf58f3be33faca394457ac3e09daba13ff50aa582"}, - {file = "opentelemetry_api-1.38.0.tar.gz", hash = "sha256:f4c193b5e8acb0912b06ac5b16321908dd0843d75049c091487322284a3eea12"}, -] - -[package.dependencies] -importlib-metadata = ">=6.0,<8.8.0" -typing-extensions = ">=4.5.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.38.0" -description = "OpenTelemetry Protobuf encoding" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.38.0-py3-none-any.whl", hash = "sha256:03cb76ab213300fe4f4c62b7d8f17d97fcfd21b89f0b5ce38ea156327ddda74a"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.38.0.tar.gz", hash = "sha256:e333278afab4695aa8114eeb7bf4e44e65c6607d54968271a249c180b2cb605c"}, -] - -[package.dependencies] -opentelemetry-proto = "1.38.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-http" -version = "1.38.0" -description = "OpenTelemetry Collector Protobuf over HTTP Exporter" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.38.0-py3-none-any.whl", hash = "sha256:84b937305edfc563f08ec69b9cb2298be8188371217e867c1854d77198d0825b"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.38.0.tar.gz", hash = "sha256:f16bd44baf15cbe07633c5112ffc68229d0edbeac7b37610be0b2def4e21e90b"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.52,<2.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.38.0" -opentelemetry-proto = "1.38.0" -opentelemetry-sdk = ">=1.38.0,<1.39.0" -requests = ">=2.7,<3.0" -typing-extensions = ">=4.5.0" - -[[package]] -name = "opentelemetry-instrumentation" -version = "0.59b0" -description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "opentelemetry_instrumentation-0.59b0-py3-none-any.whl", hash = "sha256:44082cc8fe56b0186e87ee8f7c17c327c4c2ce93bdbe86496e600985d74368ee"}, - {file = "opentelemetry_instrumentation-0.59b0.tar.gz", hash = "sha256:6010f0faaacdaf7c4dff8aac84e226d23437b331dcda7e70367f6d73a7db1adc"}, -] - -[package.dependencies] -opentelemetry-api = ">=1.4,<2.0" -opentelemetry-semantic-conventions = "0.59b0" -packaging = ">=18.0" -wrapt = ">=1.0.0,<2.0.0" - [[package]] name = "opentelemetry-proto" -version = "1.38.0" +version = "1.35.0" description = "OpenTelemetry Python Proto" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "opentelemetry_proto-1.38.0-py3-none-any.whl", hash = "sha256:b6ebe54d3217c42e45462e2a1ae28c3e2bf2ec5a5645236a490f55f45f1a0a18"}, - {file = "opentelemetry_proto-1.38.0.tar.gz", hash = "sha256:88b161e89d9d372ce723da289b7da74c3a8354a8e5359992be813942969ed468"}, + {file = "opentelemetry_proto-1.35.0-py3-none-any.whl", hash = "sha256:98fffa803164499f562718384e703be8d7dfbe680192279a0429cb150a2f8809"}, + {file = "opentelemetry_proto-1.35.0.tar.gz", hash = "sha256:532497341bd3e1c074def7c5b00172601b28bb83b48afc41a4b779f26eb4ee05"}, ] [package.dependencies] protobuf = ">=5.0,<7.0" -[[package]] -name = "opentelemetry-sdk" -version = "1.38.0" -description = "OpenTelemetry Python SDK" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "opentelemetry_sdk-1.38.0-py3-none-any.whl", hash = "sha256:1c66af6564ecc1553d72d811a01df063ff097cdc82ce188da9951f93b8d10f6b"}, - {file = "opentelemetry_sdk-1.38.0.tar.gz", hash = "sha256:93df5d4d871ed09cb4272305be4d996236eedb232253e3ab864c8620f051cebe"}, -] - -[package.dependencies] -opentelemetry-api = "1.38.0" -opentelemetry-semantic-conventions = "0.59b0" -typing-extensions = ">=4.5.0" - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.59b0" -description = "OpenTelemetry Semantic Conventions" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "opentelemetry_semantic_conventions-0.59b0-py3-none-any.whl", hash = "sha256:35d3b8833ef97d614136e253c1da9342b4c3c083bbaf29ce31d572a1c3825eed"}, - {file = "opentelemetry_semantic_conventions-0.59b0.tar.gz", hash = "sha256:7a6db3f30d70202d5bf9fa4b69bc866ca6a30437287de6c510fb594878aed6b0"}, -] - -[package.dependencies] -opentelemetry-api = "1.38.0" -typing-extensions = ">=4.5.0" - [[package]] name = "orjson" -version = "3.11.4" +version = "3.10.18" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba"}, - {file = "orjson-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827"}, - {file = "orjson-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b"}, - {file = "orjson-3.11.4-cp310-cp310-win32.whl", hash = "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3"}, - {file = "orjson-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc"}, - {file = "orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39"}, - {file = "orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a"}, - {file = "orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905"}, - {file = "orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907"}, - {file = "orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c"}, - {file = "orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a"}, - {file = "orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045"}, - {file = "orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50"}, - {file = "orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708"}, - {file = "orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c"}, - {file = "orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9"}, - {file = "orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa"}, - {file = "orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140"}, - {file = "orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e"}, - {file = "orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534"}, - {file = "orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9"}, - {file = "orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a"}, - {file = "orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6"}, - {file = "orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839"}, - {file = "orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a"}, - {file = "orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de"}, - {file = "orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803"}, - {file = "orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f"}, - {file = "orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23"}, - {file = "orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155"}, - {file = "orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394"}, - {file = "orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1"}, - {file = "orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d"}, - {file = "orjson-3.11.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13"}, - {file = "orjson-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a"}, - {file = "orjson-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9"}, - {file = "orjson-3.11.4-cp39-cp39-win32.whl", hash = "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1"}, - {file = "orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6"}, - {file = "orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "orjson-3.10.18-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a45e5d68066b408e4bc383b6e4ef05e717c65219a9e1390abc6155a520cac402"}, + {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be3b9b143e8b9db05368b13b04c84d37544ec85bb97237b3a923f076265ec89c"}, + {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9b0aa09745e2c9b3bf779b096fa71d1cc2d801a604ef6dd79c8b1bfef52b2f92"}, + {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53a245c104d2792e65c8d225158f2b8262749ffe64bc7755b00024757d957a13"}, + {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9495ab2611b7f8a0a8a505bcb0f0cbdb5469caafe17b0e404c3c746f9900469"}, + {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73be1cbcebadeabdbc468f82b087df435843c809cd079a565fb16f0f3b23238f"}, + {file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8936ee2679e38903df158037a2f1c108129dee218975122e37847fb1d4ac68"}, + {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7115fcbc8525c74e4c2b608129bef740198e9a120ae46184dac7683191042056"}, + {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:771474ad34c66bc4d1c01f645f150048030694ea5b2709b87d3bda273ffe505d"}, + {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7c14047dbbea52886dd87169f21939af5d55143dad22d10db6a7514f058156a8"}, + {file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641481b73baec8db14fdf58f8967e52dc8bda1f2aba3aa5f5c1b07ed6df50b7f"}, + {file = "orjson-3.10.18-cp310-cp310-win32.whl", hash = "sha256:607eb3ae0909d47280c1fc657c4284c34b785bae371d007595633f4b1a2bbe06"}, + {file = "orjson-3.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:8770432524ce0eca50b7efc2a9a5f486ee0113a5fbb4231526d414e6254eba92"}, + {file = "orjson-3.10.18-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e0a183ac3b8e40471e8d843105da6fbe7c070faab023be3b08188ee3f85719b8"}, + {file = "orjson-3.10.18-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5ef7c164d9174362f85238d0cd4afdeeb89d9e523e4651add6a5d458d6f7d42d"}, + {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd14c5d99cdc7bf93f22b12ec3b294931518aa019e2a147e8aa2f31fd3240f7"}, + {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b672502323b6cd133c4af6b79e3bea36bad2d16bca6c1f645903fce83909a7a"}, + {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51f8c63be6e070ec894c629186b1c0fe798662b8687f3d9fdfa5e401c6bd7679"}, + {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9478ade5313d724e0495d167083c6f3be0dd2f1c9c8a38db9a9e912cdaf947"}, + {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187aefa562300a9d382b4b4eb9694806e5848b0cedf52037bb5c228c61bb66d4"}, + {file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da552683bc9da222379c7a01779bddd0ad39dd699dd6300abaf43eadee38334"}, + {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e450885f7b47a0231979d9c49b567ed1c4e9f69240804621be87c40bc9d3cf17"}, + {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5e3c9cc2ba324187cd06287ca24f65528f16dfc80add48dc99fa6c836bb3137e"}, + {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:50ce016233ac4bfd843ac5471e232b865271d7d9d44cf9d33773bcd883ce442b"}, + {file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3ceff74a8f7ffde0b2785ca749fc4e80e4315c0fd887561144059fb1c138aa7"}, + {file = "orjson-3.10.18-cp311-cp311-win32.whl", hash = "sha256:fdba703c722bd868c04702cac4cb8c6b8ff137af2623bc0ddb3b3e6a2c8996c1"}, + {file = "orjson-3.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:c28082933c71ff4bc6ccc82a454a2bffcef6e1d7379756ca567c772e4fb3278a"}, + {file = "orjson-3.10.18-cp311-cp311-win_arm64.whl", hash = "sha256:a6c7c391beaedd3fa63206e5c2b7b554196f14debf1ec9deb54b5d279b1b46f5"}, + {file = "orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753"}, + {file = "orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17"}, + {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d"}, + {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae"}, + {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f"}, + {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c"}, + {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad"}, + {file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c"}, + {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406"}, + {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6"}, + {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06"}, + {file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5"}, + {file = "orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e"}, + {file = "orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc"}, + {file = "orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a"}, + {file = "orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147"}, + {file = "orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c"}, + {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103"}, + {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595"}, + {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc"}, + {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc"}, + {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049"}, + {file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58"}, + {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034"}, + {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1"}, + {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012"}, + {file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f"}, + {file = "orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea"}, + {file = "orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52"}, + {file = "orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3"}, + {file = "orjson-3.10.18-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c95fae14225edfd699454e84f61c3dd938df6629a00c6ce15e704f57b58433bb"}, + {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5232d85f177f98e0cefabb48b5e7f60cff6f3f0365f9c60631fecd73849b2a82"}, + {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2783e121cafedf0d85c148c248a20470018b4ffd34494a68e125e7d5857655d1"}, + {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e54ee3722caf3db09c91f442441e78f916046aa58d16b93af8a91500b7bbf273"}, + {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2daf7e5379b61380808c24f6fc182b7719301739e4271c3ec88f2984a2d61f89"}, + {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f39b371af3add20b25338f4b29a8d6e79a8c7ed0e9dd49e008228a065d07781"}, + {file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b819ed34c01d88c6bec290e6842966f8e9ff84b7694632e88341363440d4cc0"}, + {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2f6c57debaef0b1aa13092822cbd3698a1fb0209a9ea013a969f4efa36bdea57"}, + {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:755b6d61ffdb1ffa1e768330190132e21343757c9aa2308c67257cc81a1a6f5a"}, + {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce8d0a875a85b4c8579eab5ac535fb4b2a50937267482be402627ca7e7570ee3"}, + {file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57b5d0673cbd26781bebc2bf86f99dd19bd5a9cb55f71cc4f66419f6b50f3d77"}, + {file = "orjson-3.10.18-cp39-cp39-win32.whl", hash = "sha256:951775d8b49d1d16ca8818b1f20c4965cae9157e7b562a2ae34d3967b8f21c8e"}, + {file = "orjson-3.10.18-cp39-cp39-win_amd64.whl", hash = "sha256:fdd9d68f83f0bc4406610b1ac68bdcded8c5ee58605cc69e643a06f4d075f429"}, + {file = "orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53"}, ] [[package]] @@ -2711,7 +2509,7 @@ description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -2719,74 +2517,61 @@ files = [ [[package]] name = "pandas" -version = "2.3.3" +version = "2.3.1" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, - {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, - {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, - {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, - {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, - {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, - {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, - {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, - {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, - {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, - {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, - {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, - {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, - {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, - {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, - {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, - {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, - {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, - {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, - {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, - {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, - {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, - {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, - {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, - {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, - {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, - {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, - {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, - {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, - {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, - {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, - {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, - {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, - {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, - {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, - {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, - {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, - {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, - {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, - {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, - {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, - {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, - {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, - {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, - {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, - {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, - {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, - {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, - {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, - {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, - {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, - {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, - {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, - {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, - {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9"}, + {file = "pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97"}, + {file = "pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299"}, + {file = "pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679"}, + {file = "pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb"}, + {file = "pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88"}, + {file = "pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d"}, + {file = "pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2"}, ] [package.dependencies] numpy = [ - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -2824,7 +2609,7 @@ description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -2840,7 +2625,7 @@ description = "Python version of Google's common library for parsing, formatting optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "phonenumbers-8.13.55-py2.py3-none-any.whl", hash = "sha256:25feaf46135f0fb1e61b69513dc97c477285ba98a69204bf5a8cf241a844a718"}, {file = "phonenumbers-8.13.55.tar.gz", hash = "sha256:57c989dda3eabab1b5a9e3d24438a39ebd032fa0172bf68bfd90ab70b3d5e08b"}, @@ -2853,7 +2638,7 @@ description = "PKCE Pyhton generator." optional = false python-versions = ">=3" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pkce-1.0.3-py3-none-any.whl", hash = "sha256:55927e24c7d403b2491ebe182b95d9dcb1807643243d47e3879fbda5aad4471d"}, {file = "pkce-1.0.3.tar.gz", hash = "sha256:9775fd76d8a743d39b87df38af1cd04a58c9b5a5242d5a6350ef343d06814ab6"}, @@ -2865,8 +2650,8 @@ version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +groups = ["main", "dev"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -2883,7 +2668,7 @@ description = "Integrate PostHog into any python application." optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "posthog-3.25.0-py2.py3-none-any.whl", hash = "sha256:85db78c13d1ecb11aed06fad53759c4e8fb3633442c2f3d0336bc0ce8a585d30"}, {file = "posthog-3.25.0.tar.gz", hash = "sha256:9168f3e7a0a5571b6b1065c41b3c171fbc68bfe72c3ac0bfd6e3d2fcdb7df2ca"}, @@ -2905,15 +2690,15 @@ test = ["anthropic", "coverage", "django", "flake8", "freezegun (==1.5.1)", "lan [[package]] name = "prompt-toolkit" -version = "3.0.52" +version = "3.0.51" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, - {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, + {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, + {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, ] [package.dependencies] @@ -2921,156 +2706,209 @@ wcwidth = "*" [[package]] name = "propcache" -version = "0.4.1" +version = "0.3.2" description = "Accelerated property cache" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, - {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, - {file = "propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db"}, - {file = "propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900"}, - {file = "propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c"}, - {file = "propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb"}, - {file = "propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37"}, - {file = "propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581"}, - {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf"}, - {file = "propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5"}, - {file = "propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc"}, - {file = "propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757"}, - {file = "propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f"}, - {file = "propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1"}, - {file = "propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6"}, - {file = "propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239"}, - {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2"}, - {file = "propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403"}, - {file = "propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4"}, - {file = "propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9"}, - {file = "propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75"}, - {file = "propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8"}, - {file = "propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db"}, - {file = "propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1"}, - {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf"}, - {file = "propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311"}, - {file = "propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c"}, - {file = "propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61"}, - {file = "propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66"}, - {file = "propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81"}, - {file = "propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e"}, - {file = "propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1"}, - {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b"}, - {file = "propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566"}, - {file = "propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b"}, - {file = "propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7"}, - {file = "propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1"}, - {file = "propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717"}, - {file = "propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37"}, - {file = "propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a"}, - {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12"}, - {file = "propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c"}, - {file = "propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44"}, - {file = "propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49"}, - {file = "propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144"}, - {file = "propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f"}, - {file = "propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153"}, - {file = "propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992"}, - {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f"}, - {file = "propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393"}, - {file = "propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc"}, - {file = "propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36"}, - {file = "propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455"}, - {file = "propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85"}, - {file = "propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1"}, - {file = "propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9"}, - {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d233076ccf9e450c8b3bc6720af226b898ef5d051a2d145f7d765e6e9f9bcff"}, - {file = "propcache-0.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:357f5bb5c377a82e105e44bd3d52ba22b616f7b9773714bff93573988ef0a5fb"}, - {file = "propcache-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbc3b6dfc728105b2a57c06791eb07a94229202ea75c59db644d7d496b698cac"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:182b51b421f0501952d938dc0b0eb45246a5b5153c50d42b495ad5fb7517c888"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b536b39c5199b96fc6245eb5fb796c497381d3942f169e44e8e392b29c9ebcc"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:db65d2af507bbfbdcedb254a11149f894169d90488dd3e7190f7cdcb2d6cd57a"}, - {file = "propcache-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2dbc472da1f772a4dae4fa24be938a6c544671a912e30529984dd80400cd88"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:daede9cd44e0f8bdd9e6cc9a607fc81feb80fae7a5fc6cecaff0e0bb32e42d00"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:71b749281b816793678ae7f3d0d84bd36e694953822eaad408d682efc5ca18e0"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0002004213ee1f36cfb3f9a42b5066100c44276b9b72b4e1504cddd3d692e86e"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fe49d0a85038f36ba9e3ffafa1103e61170b28e95b16622e11be0a0ea07c6781"}, - {file = "propcache-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99d43339c83aaf4d32bda60928231848eee470c6bda8d02599cc4cebe872d183"}, - {file = "propcache-0.4.1-cp39-cp39-win32.whl", hash = "sha256:a129e76735bc792794d5177069691c3217898b9f5cee2b2661471e52ffe13f19"}, - {file = "propcache-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:948dab269721ae9a87fd16c514a0a2c2a1bdb23a9a61b969b0f9d9ee2968546f"}, - {file = "propcache-0.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:5fd37c406dd6dc85aa743e214cef35dc54bbdd1419baac4f6ae5e5b1a2976938"}, - {file = "propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237"}, - {file = "propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770"}, + {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3"}, + {file = "propcache-0.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614"}, + {file = "propcache-0.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b"}, + {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c"}, + {file = "propcache-0.3.2-cp310-cp310-win32.whl", hash = "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70"}, + {file = "propcache-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9"}, + {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be"}, + {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f"}, + {file = "propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df"}, + {file = "propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf"}, + {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e"}, + {file = "propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897"}, + {file = "propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39"}, + {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10"}, + {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154"}, + {file = "propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67"}, + {file = "propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06"}, + {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1"}, + {file = "propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1"}, + {file = "propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c"}, + {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945"}, + {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252"}, + {file = "propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3"}, + {file = "propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206"}, + {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43"}, + {file = "propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02"}, + {file = "propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05"}, + {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b"}, + {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0"}, + {file = "propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725"}, + {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770"}, + {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330"}, + {file = "propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394"}, + {file = "propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198"}, + {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5"}, + {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4"}, + {file = "propcache-0.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef"}, + {file = "propcache-0.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb"}, + {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe"}, + {file = "propcache-0.3.2-cp39-cp39-win32.whl", hash = "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1"}, + {file = "propcache-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9"}, + {file = "propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f"}, + {file = "propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168"}, ] [[package]] name = "protobuf" -version = "6.33.0" +version = "6.31.1" description = "" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "protobuf-6.33.0-cp310-abi3-win32.whl", hash = "sha256:d6101ded078042a8f17959eccd9236fb7a9ca20d3b0098bbcb91533a5680d035"}, - {file = "protobuf-6.33.0-cp310-abi3-win_amd64.whl", hash = "sha256:9a031d10f703f03768f2743a1c403af050b6ae1f3480e9c140f39c45f81b13ee"}, - {file = "protobuf-6.33.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:905b07a65f1a4b72412314082c7dbfae91a9e8b68a0cc1577515f8df58ecf455"}, - {file = "protobuf-6.33.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e0697ece353e6239b90ee43a9231318302ad8353c70e6e45499fa52396debf90"}, - {file = "protobuf-6.33.0-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:e0a1715e4f27355afd9570f3ea369735afc853a6c3951a6afe1f80d8569ad298"}, - {file = "protobuf-6.33.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:35be49fd3f4fefa4e6e2aacc35e8b837d6703c37a2168a55ac21e9b1bc7559ef"}, - {file = "protobuf-6.33.0-cp39-cp39-win32.whl", hash = "sha256:cd33a8e38ea3e39df66e1bbc462b076d6e5ba3a4ebbde58219d777223a7873d3"}, - {file = "protobuf-6.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:c963e86c3655af3a917962c9619e1a6b9670540351d7af9439d06064e3317cc9"}, - {file = "protobuf-6.33.0-py3-none-any.whl", hash = "sha256:25c9e1963c6734448ea2d308cfa610e692b801304ba0908d7bfa564ac5132995"}, - {file = "protobuf-6.33.0.tar.gz", hash = "sha256:140303d5c8d2037730c548f8c7b93b20bb1dc301be280c378b82b8894589c954"}, + {file = "protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9"}, + {file = "protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447"}, + {file = "protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402"}, + {file = "protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39"}, + {file = "protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6"}, + {file = "protobuf-6.31.1-cp39-cp39-win32.whl", hash = "sha256:0414e3aa5a5f3ff423828e1e6a6e907d6c65c1d5b7e6e975793d5590bdeecc16"}, + {file = "protobuf-6.31.1-cp39-cp39-win_amd64.whl", hash = "sha256:8764cf4587791e7564051b35524b72844f845ad0bb011704c3736cce762d8fe9"}, + {file = "protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e"}, + {file = "protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a"}, +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.10" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] [[package]] @@ -3080,7 +2918,7 @@ description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -3093,7 +2931,7 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -3106,7 +2944,7 @@ description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, @@ -3117,15 +2955,15 @@ pyasn1 = ">=0.6.1,<0.7.0" [[package]] name = "pycparser" -version = "2.23" +version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "(python_version == \"3.11\" or python_version >= \"3.12\") and platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" +markers = "(python_version >= \"3.12\" or python_version == \"3.11\") and platform_python_implementation != \"PyPy\"" files = [ - {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, - {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -3135,7 +2973,7 @@ description = "Cryptographic library for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, @@ -3173,22 +3011,22 @@ files = [ [[package]] name = "pydantic" -version = "2.12.4" +version = "2.11.7" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e"}, - {file = "pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac"}, + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.41.5" -typing-extensions = ">=4.14.1" -typing-inspection = ">=0.4.2" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -3196,154 +3034,116 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.33.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146"}, - {file = "pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2"}, - {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97"}, - {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9"}, - {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52"}, - {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941"}, - {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a"}, - {file = "pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c"}, - {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2"}, - {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556"}, - {file = "pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49"}, - {file = "pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba"}, - {file = "pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9"}, - {file = "pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6"}, - {file = "pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b"}, - {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a"}, - {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8"}, - {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e"}, - {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1"}, - {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b"}, - {file = "pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b"}, - {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284"}, - {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594"}, - {file = "pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e"}, - {file = "pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b"}, - {file = "pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe"}, - {file = "pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f"}, - {file = "pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7"}, - {file = "pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0"}, - {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69"}, - {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75"}, - {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05"}, - {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc"}, - {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c"}, - {file = "pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5"}, - {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c"}, - {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294"}, - {file = "pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1"}, - {file = "pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d"}, - {file = "pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815"}, - {file = "pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3"}, - {file = "pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9"}, - {file = "pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34"}, - {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0"}, - {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33"}, - {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e"}, - {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2"}, - {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586"}, - {file = "pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d"}, - {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740"}, - {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e"}, - {file = "pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858"}, - {file = "pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36"}, - {file = "pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11"}, - {file = "pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd"}, - {file = "pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a"}, - {file = "pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14"}, - {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1"}, - {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66"}, - {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869"}, - {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2"}, - {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375"}, - {file = "pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553"}, - {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90"}, - {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07"}, - {file = "pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb"}, - {file = "pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23"}, - {file = "pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf"}, - {file = "pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c"}, - {file = "pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008"}, - {file = "pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf"}, - {file = "pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5"}, - {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d"}, - {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60"}, - {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82"}, - {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5"}, - {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3"}, - {file = "pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425"}, - {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504"}, - {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5"}, - {file = "pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3"}, - {file = "pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460"}, - {file = "pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b"}, - {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034"}, - {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c"}, - {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2"}, - {file = "pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad"}, - {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd"}, - {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc"}, - {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56"}, - {file = "pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963"}, - {file = "pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f"}, - {file = "pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51"}, - {file = "pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, ] [package.dependencies] -typing-extensions = ">=4.14.1" - -[[package]] -name = "pygments" -version = "2.19.2" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyjwt" @@ -3352,7 +3152,7 @@ description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, @@ -3367,6 +3167,87 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pymongo" +version = "4.13.2" +description = "PyMongo - the Official MongoDB Python driver" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "pymongo-4.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:01065eb1838e3621a30045ab14d1a60ee62e01f65b7cf154e69c5c722ef14d2f"}, + {file = "pymongo-4.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ab0325d436075f5f1901cde95afae811141d162bc42d9a5befb647fda585ae6"}, + {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdd8041902963c84dc4e27034fa045ac55fabcb2a4ba5b68b880678557573e70"}, + {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b00ab04630aa4af97294e9abdbe0506242396269619c26f5761fd7b2524ef501"}, + {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16440d0da30ba804c6c01ea730405fdbbb476eae760588ea09e6e7d28afc06de"}, + {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad9a2d1357aed5d6750deb315f62cb6f5b3c4c03ffb650da559cb09cb29e6fe8"}, + {file = "pymongo-4.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c793223aef21a8c415c840af1ca36c55a05d6fa3297378da35de3fb6661c0174"}, + {file = "pymongo-4.13.2-cp310-cp310-win32.whl", hash = "sha256:8ef6ae029a3390565a0510c872624514dde350007275ecd8126b09175aa02cca"}, + {file = "pymongo-4.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:66f168f8c5b1e2e3d518507cf9f200f0c86ac79e2b2be9e7b6c8fd1e2f7d7824"}, + {file = "pymongo-4.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7af8c56d0a7fcaf966d5292e951f308fb1f8bac080257349e14742725fd7990d"}, + {file = "pymongo-4.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad24f5864706f052b05069a6bc59ff875026e28709548131448fe1e40fc5d80f"}, + {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a10069454195d1d2dda98d681b1dbac9a425f4b0fe744aed5230c734021c1cb9"}, + {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e20862b81e3863bcd72334e3577a3107604553b614a8d25ee1bb2caaea4eb90"}, + {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b4d5794ca408317c985d7acfb346a60f96f85a7c221d512ff0ecb3cce9d6110"}, + {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8e0420fb4901006ae7893e76108c2a36a343b4f8922466d51c45e9e2ceb717"}, + {file = "pymongo-4.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:239b5f83b83008471d54095e145d4c010f534af99e87cc8877fc6827736451a0"}, + {file = "pymongo-4.13.2-cp311-cp311-win32.whl", hash = "sha256:6bceb524110c32319eb7119422e400dbcafc5b21bcc430d2049a894f69b604e5"}, + {file = "pymongo-4.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:ab87484c97ae837b0a7bbdaa978fa932fbb6acada3f42c3b2bee99121a594715"}, + {file = "pymongo-4.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ec89516622dfc8b0fdff499612c0bd235aa45eeb176c9e311bcc0af44bf952b6"}, + {file = "pymongo-4.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f30eab4d4326df54fee54f31f93e532dc2918962f733ee8e115b33e6fe151d92"}, + {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cce9428d12ba396ea245fc4c51f20228cead01119fcc959e1c80791ea45f820"}, + {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac9241b727a69c39117c12ac1e52d817ea472260dadc66262c3fdca0bab0709b"}, + {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3efc4c515b371a9fa1d198b6e03340985bfe1a55ae2d2b599a714934e7bc61ab"}, + {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f57a664aa74610eb7a52fa93f2cf794a1491f4f76098343485dd7da5b3bcff06"}, + {file = "pymongo-4.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dcb0b8cdd499636017a53f63ef64cf9b6bd3fd9355796c5a1d228e4be4a4c94"}, + {file = "pymongo-4.13.2-cp312-cp312-win32.whl", hash = "sha256:bf43ae07804d7762b509f68e5ec73450bb8824e960b03b861143ce588b41f467"}, + {file = "pymongo-4.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:812a473d584bcb02ab819d379cd5e752995026a2bb0d7713e78462b6650d3f3a"}, + {file = "pymongo-4.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6044ca0eb74d97f7d3415264de86a50a401b7b0b136d30705f022f9163c3124"}, + {file = "pymongo-4.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd326bcb92d28d28a3e7ef0121602bad78691b6d4d1f44b018a4616122f1ba8b"}, + {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfb0c21bdd58e58625c9cd8de13e859630c29c9537944ec0a14574fdf88c2ac4"}, + {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9c7d345d57f17b1361008aea78a37e8c139631a46aeb185dd2749850883c7ba"}, + {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8860445a8da1b1545406fab189dc20319aff5ce28e65442b2b4a8f4228a88478"}, + {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c184b612f67d5a4c8f864ae7c40b6cc33c0e9bb05e39d08666f8831d120504"}, + {file = "pymongo-4.13.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ea8c62d5f3c6529407c12471385d9a05f9fb890ce68d64976340c85cd661b"}, + {file = "pymongo-4.13.2-cp313-cp313-win32.whl", hash = "sha256:d13556e91c4a8cb07393b8c8be81e66a11ebc8335a40fa4af02f4d8d3b40c8a1"}, + {file = "pymongo-4.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:cfc69d7bc4d4d5872fd1e6de25e6a16e2372c7d5556b75c3b8e2204dce73e3fb"}, + {file = "pymongo-4.13.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a457d2ac34c05e9e8a6bb724115b093300bf270f0655fb897df8d8604b2e3700"}, + {file = "pymongo-4.13.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:02f131a6e61559613b1171b53fbe21fed64e71b0cb4858c47fc9bc7c8e0e501c"}, + {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c942d1c6334e894271489080404b1a2e3b8bd5de399f2a0c14a77d966be5bc9"}, + {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:850168d115680ab66a0931a6aa9dd98ed6aa5e9c3b9a6c12128049b9a5721bc5"}, + {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af7dfff90647ee77c53410f7fe8ca4fe343f8b768f40d2d0f71a5602f7b5a541"}, + {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8057f9bc9c94a8fd54ee4f5e5106e445a8f406aff2df74746f21c8791ee2403"}, + {file = "pymongo-4.13.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51040e1ba78d6671f8c65b29e2864483451e789ce93b1536de9cc4456ede87fa"}, + {file = "pymongo-4.13.2-cp313-cp313t-win32.whl", hash = "sha256:7ab86b98a18c8689514a9f8d0ec7d9ad23a949369b31c9a06ce4a45dcbffcc5e"}, + {file = "pymongo-4.13.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c38168263ed94a250fc5cf9c6d33adea8ab11c9178994da1c3481c2a49d235f8"}, + {file = "pymongo-4.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a89739a86da31adcef41f6c3ae62b38a8bad156bba71fe5898871746c5af83"}, + {file = "pymongo-4.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de529aebd1ddae2de778d926b3e8e2e42a9b37b5c668396aad8f28af75e606f9"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cc7d4cd7586c1c4f7af2b97447404046c2d8e7ed4c7214ed0e21dbeb17d57d"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:884cb88a9d4c4c9810056b9c71817bd9714bbe58c461f32b65be60c56759823b"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:389cb6415ec341c73f81fbf54970ccd0cd5d3fa7c238dcdb072db051d24e2cb4"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49f9968ea7e6a86d4c9bd31d2095f0419efc498ea5e6067e75ade1f9e64aea3d"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae07315bb106719c678477e61077cd28505bb7d3fd0a2341e75a9510118cb785"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4dc60b3f5e1448fd011c729ad5d8735f603b0a08a8773ec8e34a876ccc7de45f"}, + {file = "pymongo-4.13.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:75462d6ce34fb2dd98f8ac3732a7a1a1fbb2e293c4f6e615766731d044ad730e"}, + {file = "pymongo-4.13.2-cp39-cp39-win32.whl", hash = "sha256:b7e04c45f6a7d5a13fe064f42130d29b0730cb83dd387a623563ff3b9bd2f4d1"}, + {file = "pymongo-4.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:0603145c9be5e195ae61ba7a93eb283abafdbd87f6f30e6c2dfc242940fe280c"}, + {file = "pymongo-4.13.2.tar.gz", hash = "sha256:0f64c6469c2362962e6ce97258ae1391abba1566a953a492562d2924b44815c2"}, +] + +[package.dependencies] +dnspython = ">=1.16.0,<3.0.0" + +[package.extras] +aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +docs = ["furo (==2024.8.6)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<9)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<4)", "sphinxcontrib-shellcheck (>=1,<2)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.13.0,<2.0.0)"] +gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] +ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] +snappy = ["python-snappy"] +test = ["pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"] +zstd = ["zstandard"] + [[package]] name = "pyotp" version = "2.9.0" @@ -3374,7 +3255,7 @@ description = "Python One Time Password Library" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pyotp-2.9.0-py3-none-any.whl", hash = "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612"}, {file = "pyotp-2.9.0.tar.gz", hash = "sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63"}, @@ -3385,26 +3266,25 @@ test = ["coverage", "mypy", "ruff", "wheel"] [[package]] name = "pytest" -version = "8.4.2" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, - {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] -colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} -iniconfig = ">=1" -packaging = ">=20" -pluggy = ">=1.5,<2" -pygments = ">=2.7.2" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" [package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" @@ -3413,7 +3293,7 @@ description = "Pytest support for asyncio" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"}, {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"}, @@ -3428,15 +3308,15 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy [[package]] name = "pytest-mock" -version = "3.15.1" +version = "3.14.1" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d"}, - {file = "pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f"}, + {file = "pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0"}, + {file = "pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e"}, ] [package.dependencies] @@ -3452,7 +3332,7 @@ description = "pytest xdist plugin for distributed testing, most importantly acr optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"}, {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"}, @@ -3474,7 +3354,7 @@ description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -3485,15 +3365,15 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.2.1" +version = "1.1.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, - {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, + {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"}, + {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"}, ] [package.extras] @@ -3506,39 +3386,23 @@ description = "HTTP REST client, simplified for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "python_http_client-3.3.7-py3-none-any.whl", hash = "sha256:ad371d2bbedc6ea15c26179c6222a78bc9308d272435ddf1d5c84f068f249a36"}, {file = "python_http_client-3.3.7.tar.gz", hash = "sha256:bf841ee45262747e00dec7ee9971dfb8c7d83083f5713596488d67739170cea0"}, ] -[[package]] -name = "python-jsonpath" -version = "2.0.1" -description = "JSONPath, JSON Pointer and JSON Patch for Python." -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "python_jsonpath-2.0.1-py3-none-any.whl", hash = "sha256:ebd518b7c883acc5b976518d76b6c96288405edec7d9ef838641869c1e1a5eb7"}, - {file = "python_jsonpath-2.0.1.tar.gz", hash = "sha256:32a84ebb2dc0ec1b42a6e165b0f9174aef8310bad29154ad9aee31ac37cca18f"}, -] - -[package.extras] -strict = ["iregexp-check (>=0.1.4)", "regex"] - [[package]] name = "python-multipart" -version = "0.0.20" +version = "0.0.18" description = "A streaming multipart parser for Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, - {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, + {file = "python_multipart-0.0.18-py3-none-any.whl", hash = "sha256:efe91480f485f6a361427a541db4796f9e1591afc0fb8e7a4ba06bfbc6708996"}, + {file = "python_multipart-0.0.18.tar.gz", hash = "sha256:7a68db60c8bfb82e460637fa4750727b45af1d5e2ed215593f917f64694d34fe"}, ] [[package]] @@ -3548,7 +3412,7 @@ description = "World timezone definitions, modern and historical" optional = false python-versions = "*" groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -3556,173 +3420,171 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.3" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, - {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, - {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, - {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, - {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, - {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, - {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, - {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, - {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, - {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, - {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, - {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, - {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, - {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, - {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, - {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, - {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, - {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, - {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, - {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, - {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, - {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, - {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, - {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, - {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, - {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, - {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, - {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, - {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, - {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, - {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, - {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, - {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, - {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, - {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, - {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, - {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, - {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, - {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, - {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, - {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, - {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, - {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, - {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, - {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, - {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, - {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, - {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, - {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, - {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, - {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, - {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, - {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, - {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, - {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, - {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, - {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, - {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, - {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, - {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "rapidfuzz" -version = "3.14.3" +version = "3.13.0" description = "rapid fuzzy string matching" optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "rapidfuzz-3.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9fcd4d751a4fffa17aed1dde41647923c72c74af02459ad1222e3b0022da3a1"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ad73afb688b36864a8d9b7344a9cf6da186c471e5790cbf541a635ee0f457f2"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5fb2d978a601820d2cfd111e2c221a9a7bfdf84b41a3ccbb96ceef29f2f1ac7"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d83b8b712fa37e06d59f29a4b49e2e9e8635e908fbc21552fe4d1163db9d2a1"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:dc8c07801df5206b81ed6bd6c35cb520cf9b6c64b9b0d19d699f8633dc942897"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c71ce6d4231e5ef2e33caa952bfe671cb9fd42e2afb11952df9fad41d5c821f9"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0e38828d1381a0cceb8a4831212b2f673d46f5129a1897b0451c883eaf4a1747"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da2a007434323904719158e50f3076a4dadb176ce43df28ed14610c773cc9825"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-win32.whl", hash = "sha256:fce3152f94afcfd12f3dd8cf51e48fa606e3cb56719bccebe3b401f43d0714f9"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:37d3c653af15cd88592633e942f5407cb4c64184efab163c40fcebad05f25141"}, - {file = "rapidfuzz-3.14.3-cp310-cp310-win_arm64.whl", hash = "sha256:cc594bbcd3c62f647dfac66800f307beaee56b22aaba1c005e9c4c40ed733923"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dea2d113e260a5da0c4003e0a5e9fdf24a9dc2bb9eaa43abd030a1e46ce7837d"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e6c31a4aa68cfa75d7eede8b0ed24b9e458447db604c2db53f358be9843d81d3"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02821366d928e68ddcb567fed8723dad7ea3a979fada6283e6914d5858674850"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe8df315ab4e6db4e1be72c5170f8e66021acde22cd2f9d04d2058a9fd8162e"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:769f31c60cd79420188fcdb3c823227fc4a6deb35cafec9d14045c7f6743acae"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54fa03062124e73086dae66a3451c553c1e20a39c077fd704dc7154092c34c63"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:834d1e818005ed0d4ae38f6b87b86fad9b0a74085467ece0727d20e15077c094"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:948b00e8476a91f510dd1ec07272efc7d78c275d83b630455559671d4e33b678"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-win32.whl", hash = "sha256:43d0305c36f504232f18ea04e55f2059bb89f169d3119c4ea96a0e15b59e2a91"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:ef6bf930b947bd0735c550683939a032090f1d688dfd8861d6b45307b96fd5c5"}, - {file = "rapidfuzz-3.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:f3eb0ff3b75d6fdccd40b55e7414bb859a1cda77c52762c9c82b85569f5088e7"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:685c93ea961d135893b5984a5a9851637d23767feabe414ec974f43babbd8226"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fa7c8f26f009f8c673fbfb443792f0cf8cf50c4e18121ff1e285b5e08a94fbdb"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57f878330c8d361b2ce76cebb8e3e1dc827293b6abf404e67d53260d27b5d941"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c5f545f454871e6af05753a0172849c82feaf0f521c5ca62ba09e1b382d6382"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:07aa0b5d8863e3151e05026a28e0d924accf0a7a3b605da978f0359bb804df43"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73b07566bc7e010e7b5bd490fb04bb312e820970180df6b5655e9e6224c137db"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6de00eb84c71476af7d3110cf25d8fe7c792d7f5fa86764ef0b4ca97e78ca3ed"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7843a1abf0091773a530636fdd2a49a41bcae22f9910b86b4f903e76ddc82dc"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-win32.whl", hash = "sha256:dea97ac3ca18cd3ba8f3d04b5c1fe4aa60e58e8d9b7793d3bd595fdb04128d7a"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:b5100fd6bcee4d27f28f4e0a1c6b5127bc8ba7c2a9959cad9eab0bf4a7ab3329"}, - {file = "rapidfuzz-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:4e49c9e992bc5fc873bd0fff7ef16a4405130ec42f2ce3d2b735ba5d3d4eb70f"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbcb726064b12f356bf10fffdb6db4b6dce5390b23627c08652b3f6e49aa56ae"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1704fc70d214294e554a2421b473779bcdeef715881c5e927dc0f11e1692a0ff"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc65e72790ddfd310c2c8912b45106e3800fefe160b0c2ef4d6b6fec4e826457"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e38c1305cffae8472572a0584d4ffc2f130865586a81038ca3965301f7c97c"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:e195a77d06c03c98b3fc06b8a28576ba824392ce40de8c708f96ce04849a052e"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b7ef2f4b8583a744338a18f12c69693c194fb6777c0e9ada98cd4d9e8f09d10"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a2135b138bcdcb4c3742d417f215ac2d8c2b87bde15b0feede231ae95f09ec41"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33a325ed0e8e1aa20c3e75f8ab057a7b248fdea7843c2a19ade0008906c14af0"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-win32.whl", hash = "sha256:8383b6d0d92f6cd008f3c9216535be215a064b2cc890398a678b56e6d280cb63"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:e6b5e3036976f0fde888687d91be86d81f9ac5f7b02e218913c38285b756be6c"}, - {file = "rapidfuzz-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:7ba009977601d8b0828bfac9a110b195b3e4e79b350dcfa48c11269a9f1918a0"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0a28add871425c2fe94358c6300bbeb0bc2ed828ca003420ac6825408f5a424"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010e12e2411a4854b0434f920e72b717c43f8ec48d57e7affe5c42ecfa05dd0e"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cfc3d57abd83c734d1714ec39c88a34dd69c85474918ebc21296f1e61eb5ca8"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89acb8cbb52904f763e5ac238083b9fc193bed8d1f03c80568b20e4cef43a519"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_31_armv7l.whl", hash = "sha256:7d9af908c2f371bfb9c985bd134e295038e3031e666e4b2ade1e7cb7f5af2f1a"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1f1925619627f8798f8c3a391d81071336942e5fe8467bc3c567f982e7ce2897"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:152555187360978119e98ce3e8263d70dd0c40c7541193fc302e9b7125cf8f58"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52619d25a09546b8db078981ca88939d72caa6b8701edd8b22e16482a38e799f"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-win32.whl", hash = "sha256:489ce98a895c98cad284f0a47960c3e264c724cb4cfd47a1430fa091c0c25204"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-win_amd64.whl", hash = "sha256:656e52b054d5b5c2524169240e50cfa080b04b1c613c5f90a2465e84888d6f15"}, - {file = "rapidfuzz-3.14.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c7e40c0a0af02ad6e57e89f62bef8604f55a04ecae90b0ceeda591bbf5923317"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:442125473b247227d3f2de807a11da6c08ccf536572d1be943f8e262bae7e4ea"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ec0c8c0c3d4f97ced46b2e191e883f8c82dbbf6d5ebc1842366d7eff13cd5a6"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2dc37bc20272f388b8c3a4eba4febc6e77e50a8f450c472def4751e7678f55e4"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee362e7e79bae940a5e2b3f6d09c6554db6a4e301cc68343886c08be99844f1"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:4b39921df948388a863f0e267edf2c36302983459b021ab928d4b801cbe6a421"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:beda6aa9bc44d1d81242e7b291b446be352d3451f8217fcb068fc2933927d53b"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6a014ba09657abfcfeed64b7d09407acb29af436d7fc075b23a298a7e4a6b41c"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:32eeafa3abce138bb725550c0e228fc7eaeec7059aa8093d9cbbec2b58c2371a"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-win32.whl", hash = "sha256:adb44d996fc610c7da8c5048775b21db60dd63b1548f078e95858c05c86876a3"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:f3d15d8527e2b293e38ce6e437631af0708df29eafd7c9fc48210854c94472f9"}, - {file = "rapidfuzz-3.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:576e4b9012a67e0bf54fccb69a7b6c94d4e86a9540a62f1a5144977359133583"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:cec3c0da88562727dd5a5a364bd9efeb535400ff0bfb1443156dd139a1dd7b50"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d1fa009f8b1100e4880868137e7bf0501422898f7674f2adcd85d5a67f041296"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b86daa7419b5e8b180690efd1fdbac43ff19230803282521c5b5a9c83977655"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7bd1816db05d6c5ffb3a4df0a2b7b56fb8c81ef584d08e37058afa217da91b1"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:33da4bbaf44e9755b0ce192597f3bde7372fe2e381ab305f41b707a95ac57aa7"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3fecce764cf5a991ee2195a844196da840aba72029b2612f95ac68a8b74946bf"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ecd7453e02cf072258c3a6b8e930230d789d5d46cc849503729f9ce475d0e785"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea188aa00e9bcae8c8411f006a5f2f06c4607a02f24eab0d8dc58566aa911f35"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-win32.whl", hash = "sha256:7ccbf68100c170e9a0581accbe9291850936711548c6688ce3bfb897b8c589ad"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:9ec02e62ae765a318d6de38df609c57fc6dacc65c0ed1fd489036834fd8a620c"}, - {file = "rapidfuzz-3.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:e805e52322ae29aa945baf7168b6c898120fbc16d2b8f940b658a5e9e3999253"}, - {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7cf174b52cb3ef5d49e45d0a1133b7e7d0ecf770ed01f97ae9962c5c91d97d23"}, - {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:442cba39957a008dfc5bdef21a9c3f4379e30ffb4e41b8555dbaf4887eca9300"}, - {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1faa0f8f76ba75fd7b142c984947c280ef6558b5067af2ae9b8729b0a0f99ede"}, - {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e6eefec45625c634926a9fd46c9e4f31118ac8f3156fff9494422cee45207e6"}, - {file = "rapidfuzz-3.14.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56fefb4382bb12250f164250240b9dd7772e41c5c8ae976fd598a32292449cc5"}, - {file = "rapidfuzz-3.14.3.tar.gz", hash = "sha256:2491937177868bc4b1e469087601d53f925e8d270ccc21e07404b4b5814b7b5f"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win32.whl", hash = "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107"}, + {file = "rapidfuzz-3.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f"}, + {file = "rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e"}, + {file = "rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264"}, + {file = "rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win32.whl", hash = "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138"}, + {file = "rapidfuzz-3.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99"}, + {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4"}, + {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998"}, + {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9"}, + {file = "rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8"}, ] [package.extras] @@ -3730,15 +3592,15 @@ all = ["numpy"] [[package]] name = "redis" -version = "6.4.0" +version = "6.2.0" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "redis-6.4.0-py3-none-any.whl", hash = "sha256:f0544fa9604264e9464cdf4814e7d4830f74b165d52f2a330a760a88dd248b7f"}, - {file = "redis-6.4.0.tar.gz", hash = "sha256:b01bc7282b8444e28ec36b261df5375183bb47a07eb9c603f284e89cbc5ef010"}, + {file = "redis-6.2.0-py3-none-any.whl", hash = "sha256:c8ddf316ee0aab65f04a11229e94a64b2618451dab7a67cb2f77eb799d872d5e"}, + {file = "redis-6.2.0.tar.gz", hash = "sha256:e821f129b75dde6cb99dd35e5c76e8c49512a5a0d8dfdc560b2fbd44b85ca977"}, ] [package.dependencies] @@ -3751,15 +3613,15 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (>=20.0.1)", "requests (>=2.31.0)" [[package]] name = "referencing" -version = "0.37.0" +version = "0.36.2" description = "JSON Referencing + Python" optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, - {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, ] [package.dependencies] @@ -3769,141 +3631,120 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "regex" -version = "2025.11.3" +version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af"}, - {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313"}, - {file = "regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5"}, - {file = "regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec"}, - {file = "regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd"}, - {file = "regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e"}, - {file = "regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf"}, - {file = "regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a"}, - {file = "regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0"}, - {file = "regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204"}, - {file = "regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9"}, - {file = "regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7"}, - {file = "regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c"}, - {file = "regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5"}, - {file = "regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2"}, - {file = "regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a"}, - {file = "regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c"}, - {file = "regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed"}, - {file = "regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4"}, - {file = "regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad"}, - {file = "regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379"}, - {file = "regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38"}, - {file = "regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de"}, - {file = "regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81519e25707fc076978c6143b81ea3dc853f176895af05bf7ec51effe818aeec"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bf28b1873a8af8bbb58c26cc56ea6e534d80053b41fb511a35795b6de507e6a"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:856a25c73b697f2ce2a24e7968285579e62577a048526161a2c0f53090bea9f9"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a3d571bd95fade53c86c0517f859477ff3a93c3fde10c9e669086f038e0f207"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:732aea6de26051af97b94bc98ed86448821f839d058e5d259c72bf6d73ad0fc0"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:51c1c1847128238f54930edb8805b660305dca164645a9fd29243f5610beea34"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22dd622a402aad4558277305350699b2be14bc59f64d64ae1d928ce7d072dced"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3b5a391c7597ffa96b41bd5cbd2ed0305f515fcbb367dfa72735679d5502364"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cc4076a5b4f36d849fd709284b4a3b112326652f3b0466f04002a6c15a0c96c1"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a295ca2bba5c1c885826ce3125fa0b9f702a1be547d821c01d65f199e10c01e2"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b4774ff32f18e0504bfc4e59a3e71e18d83bc1e171a3c8ed75013958a03b2f14"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e7d1cdfa88ef33a2ae6aa0d707f9255eb286ffbd90045f1088246833223aee"}, - {file = "regex-2025.11.3-cp39-cp39-win32.whl", hash = "sha256:74d04244852ff73b32eeede4f76f51c5bcf44bc3c207bc3e6cf1c5c45b890708"}, - {file = "regex-2025.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:7a50cd39f73faa34ec18d6720ee25ef10c4c1839514186fcda658a06c06057a2"}, - {file = "regex-2025.11.3-cp39-cp39-win_arm64.whl", hash = "sha256:43b4fb020e779ca81c1b5255015fe2b82816c76ec982354534ad9ec09ad7c9e3"}, - {file = "regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] name = "requests" -version = "2.32.5" +version = "2.32.4" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, - {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] @@ -3918,31 +3759,51 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-file" -version = "3.0.1" +version = "2.1.0" description = "File transport adapter for Requests" optional = false python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "requests_file-3.0.1-py2.py3-none-any.whl", hash = "sha256:d0f5eb94353986d998f80ac63c7f146a307728be051d4d1cd390dbdb59c10fa2"}, - {file = "requests_file-3.0.1.tar.gz", hash = "sha256:f14243d7796c588f3521bd423c5dea2ee4cc730e54a3cac9574d78aca1272576"}, + {file = "requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c"}, + {file = "requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658"}, ] [package.dependencies] requests = ">=1.0.0" +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=3.4" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + [[package]] name = "restrictedpython" -version = "8.1" +version = "8.0" description = "RestrictedPython is a defined subset of the Python language which allows to provide a program input into a trusted environment." optional = false -python-versions = "<3.15,>=3.9" +python-versions = "<3.14,>=3.9" groups = ["main"] -markers = "python_version >= \"3.12\" and python_version < \"3.14\" or python_version == \"3.11\"" +markers = "python_version == \"3.11\"" files = [ - {file = "restrictedpython-8.1-py3-none-any.whl", hash = "sha256:4769449c6cdb10f2071649ba386902befff0eff2a8fd6217989fa7b16aeae926"}, - {file = "restrictedpython-8.1.tar.gz", hash = "sha256:4a69304aceacf6bee74bdf153c728221d4e3109b39acbfe00b3494927080d898"}, + {file = "RestrictedPython-8.0-py3-none-any.whl", hash = "sha256:ed3d894efd7d6cac0a5f13f75583b8458378d400d7dd4c083b59233eba85fe69"}, + {file = "restrictedpython-8.0.tar.gz", hash = "sha256:3af2312bc67e5fced887fb85b006c89861da72488128b155beea81eb6a0a9b24"}, ] [package.extras] @@ -3951,128 +3812,157 @@ test = ["pytest", "pytest-mock"] [[package]] name = "rpds-py" -version = "0.28.0" +version = "0.26.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "rpds_py-0.28.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7b6013db815417eeb56b2d9d7324e64fcd4fa289caeee6e7a78b2e11fc9b438a"}, - {file = "rpds_py-0.28.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a4c6b05c685c0c03f80dabaeb73e74218c49deea965ca63f76a752807397207"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4794c6c3fbe8f9ac87699b131a1f26e7b4abcf6d828da46a3a52648c7930eba"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e8456b6ee5527112ff2354dd9087b030e3429e43a74f480d4a5ca79d269fd85"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:beb880a9ca0a117415f241f66d56025c02037f7c4efc6fe59b5b8454f1eaa50d"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6897bebb118c44b38c9cb62a178e09f1593c949391b9a1a6fe777ccab5934ee7"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b553dd06e875249fd43efd727785efb57a53180e0fde321468222eabbeaafa"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:f0b2044fdddeea5b05df832e50d2a06fe61023acb44d76978e1b060206a8a476"}, - {file = "rpds_py-0.28.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05cf1e74900e8da73fa08cc76c74a03345e5a3e37691d07cfe2092d7d8e27b04"}, - {file = "rpds_py-0.28.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:efd489fec7c311dae25e94fe7eeda4b3d06be71c68f2cf2e8ef990ffcd2cd7e8"}, - {file = "rpds_py-0.28.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ada7754a10faacd4f26067e62de52d6af93b6d9542f0df73c57b9771eb3ba9c4"}, - {file = "rpds_py-0.28.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c2a34fd26588949e1e7977cfcbb17a9a42c948c100cab890c6d8d823f0586457"}, - {file = "rpds_py-0.28.0-cp310-cp310-win32.whl", hash = "sha256:f9174471d6920cbc5e82a7822de8dfd4dcea86eb828b04fc8c6519a77b0ee51e"}, - {file = "rpds_py-0.28.0-cp310-cp310-win_amd64.whl", hash = "sha256:6e32dd207e2c4f8475257a3540ab8a93eff997abfa0a3fdb287cae0d6cd874b8"}, - {file = "rpds_py-0.28.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:03065002fd2e287725d95fbc69688e0c6daf6c6314ba38bdbaa3895418e09296"}, - {file = "rpds_py-0.28.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28ea02215f262b6d078daec0b45344c89e161eab9526b0d898221d96fdda5f27"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25dbade8fbf30bcc551cb352376c0ad64b067e4fc56f90e22ba70c3ce205988c"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c03002f54cc855860bfdc3442928ffdca9081e73b5b382ed0b9e8efe6e5e205"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9699fa7990368b22032baf2b2dce1f634388e4ffc03dfefaaac79f4695edc95"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9b06fe1a75e05e0713f06ea0c89ecb6452210fd60e2f1b6ddc1067b990e08d9"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9f83e7b326a3f9ec3ef84cda98fb0a74c7159f33e692032233046e7fd15da2"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:0d3259ea9ad8743a75a43eb7819324cdab393263c91be86e2d1901ee65c314e0"}, - {file = "rpds_py-0.28.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a7548b345f66f6695943b4ef6afe33ccd3f1b638bd9afd0f730dd255c249c9e"}, - {file = "rpds_py-0.28.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9a40040aa388b037eb39416710fbcce9443498d2eaab0b9b45ae988b53f5c67"}, - {file = "rpds_py-0.28.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f60c7ea34e78c199acd0d3cda37a99be2c861dd2b8cf67399784f70c9f8e57d"}, - {file = "rpds_py-0.28.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1571ae4292649100d743b26d5f9c63503bb1fedf538a8f29a98dce2d5ba6b4e6"}, - {file = "rpds_py-0.28.0-cp311-cp311-win32.whl", hash = "sha256:5cfa9af45e7c1140af7321fa0bef25b386ee9faa8928c80dc3a5360971a29e8c"}, - {file = "rpds_py-0.28.0-cp311-cp311-win_amd64.whl", hash = "sha256:dd8d86b5d29d1b74100982424ba53e56033dc47720a6de9ba0259cf81d7cecaa"}, - {file = "rpds_py-0.28.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e27d3a5709cc2b3e013bf93679a849213c79ae0573f9b894b284b55e729e120"}, - {file = "rpds_py-0.28.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6b4f28583a4f247ff60cd7bdda83db8c3f5b05a7a82ff20dd4b078571747708f"}, - {file = "rpds_py-0.28.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d678e91b610c29c4b3d52a2c148b641df2b4676ffe47c59f6388d58b99cdc424"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e819e0e37a44a78e1383bf1970076e2ccc4dc8c2bbaa2f9bd1dc987e9afff628"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5ee514e0f0523db5d3fb171f397c54875dbbd69760a414dccf9d4d7ad628b5bd"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3fa06d27fdcee47f07a39e02862da0100cb4982508f5ead53ec533cd5fe55e"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46959ef2e64f9e4a41fc89aa20dbca2b85531f9a72c21099a3360f35d10b0d5a"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8455933b4bcd6e83fde3fefc987a023389c4b13f9a58c8d23e4b3f6d13f78c84"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ad50614a02c8c2962feebe6012b52f9802deec4263946cddea37aaf28dd25a66"}, - {file = "rpds_py-0.28.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5deca01b271492553fdb6c7fd974659dce736a15bae5dad7ab8b93555bceb28"}, - {file = "rpds_py-0.28.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:735f8495a13159ce6a0d533f01e8674cec0c57038c920495f87dcb20b3ddb48a"}, - {file = "rpds_py-0.28.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:961ca621ff10d198bbe6ba4957decca61aa2a0c56695384c1d6b79bf61436df5"}, - {file = "rpds_py-0.28.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2374e16cc9131022e7d9a8f8d65d261d9ba55048c78f3b6e017971a4f5e6353c"}, - {file = "rpds_py-0.28.0-cp312-cp312-win32.whl", hash = "sha256:d15431e334fba488b081d47f30f091e5d03c18527c325386091f31718952fe08"}, - {file = "rpds_py-0.28.0-cp312-cp312-win_amd64.whl", hash = "sha256:a410542d61fc54710f750d3764380b53bf09e8c4edbf2f9141a82aa774a04f7c"}, - {file = "rpds_py-0.28.0-cp312-cp312-win_arm64.whl", hash = "sha256:1f0cfd1c69e2d14f8c892b893997fa9a60d890a0c8a603e88dca4955f26d1edd"}, - {file = "rpds_py-0.28.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e9e184408a0297086f880556b6168fa927d677716f83d3472ea333b42171ee3b"}, - {file = "rpds_py-0.28.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:edd267266a9b0448f33dc465a97cfc5d467594b600fe28e7fa2f36450e03053a"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85beb8b3f45e4e32f6802fb6cd6b17f615ef6c6a52f265371fb916fae02814aa"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2412be8d00a1b895f8ad827cc2116455196e20ed994bb704bf138fe91a42724"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf128350d384b777da0e68796afdcebc2e9f63f0e9f242217754e647f6d32491"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2036d09b363aa36695d1cc1a97b36865597f4478470b0697b5ee9403f4fe399"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8e1e9be4fa6305a16be628959188e4fd5cd6f1b0e724d63c6d8b2a8adf74ea6"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0a403460c9dd91a7f23fc3188de6d8977f1d9603a351d5db6cf20aaea95b538d"}, - {file = "rpds_py-0.28.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7366b6553cdc805abcc512b849a519167db8f5e5c3472010cd1228b224265cb"}, - {file = "rpds_py-0.28.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b43c6a3726efd50f18d8120ec0551241c38785b68952d240c45ea553912ac41"}, - {file = "rpds_py-0.28.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0cb7203c7bc69d7c1585ebb33a2e6074492d2fc21ad28a7b9d40457ac2a51ab7"}, - {file = "rpds_py-0.28.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a52a5169c664dfb495882adc75c304ae1d50df552fbd68e100fdc719dee4ff9"}, - {file = "rpds_py-0.28.0-cp313-cp313-win32.whl", hash = "sha256:2e42456917b6687215b3e606ab46aa6bca040c77af7df9a08a6dcfe8a4d10ca5"}, - {file = "rpds_py-0.28.0-cp313-cp313-win_amd64.whl", hash = "sha256:e0a0311caedc8069d68fc2bf4c9019b58a2d5ce3cd7cb656c845f1615b577e1e"}, - {file = "rpds_py-0.28.0-cp313-cp313-win_arm64.whl", hash = "sha256:04c1b207ab8b581108801528d59ad80aa83bb170b35b0ddffb29c20e411acdc1"}, - {file = "rpds_py-0.28.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f296ea3054e11fc58ad42e850e8b75c62d9a93a9f981ad04b2e5ae7d2186ff9c"}, - {file = "rpds_py-0.28.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5a7306c19b19005ad98468fcefeb7100b19c79fc23a5f24a12e06d91181193fa"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5d9b86aa501fed9862a443c5c3116f6ead8bc9296185f369277c42542bd646b"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e5bbc701eff140ba0e872691d573b3d5d30059ea26e5785acba9132d10c8c31d"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5690671cd672a45aa8616d7374fdf334a1b9c04a0cac3c854b1136e92374fe"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f1d92ecea4fa12f978a367c32a5375a1982834649cdb96539dcdc12e609ab1a"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d252db6b1a78d0a3928b6190156042d54c93660ce4d98290d7b16b5296fb7cc"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d61b355c3275acb825f8777d6c4505f42b5007e357af500939d4a35b19177259"}, - {file = "rpds_py-0.28.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:acbe5e8b1026c0c580d0321c8aae4b0a1e1676861d48d6e8c6586625055b606a"}, - {file = "rpds_py-0.28.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8aa23b6f0fc59b85b4c7d89ba2965af274346f738e8d9fc2455763602e62fd5f"}, - {file = "rpds_py-0.28.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7b14b0c680286958817c22d76fcbca4800ddacef6f678f3a7c79a1fe7067fe37"}, - {file = "rpds_py-0.28.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bcf1d210dfee61a6c86551d67ee1031899c0fdbae88b2d44a569995d43797712"}, - {file = "rpds_py-0.28.0-cp313-cp313t-win32.whl", hash = "sha256:3aa4dc0fdab4a7029ac63959a3ccf4ed605fee048ba67ce89ca3168da34a1342"}, - {file = "rpds_py-0.28.0-cp313-cp313t-win_amd64.whl", hash = "sha256:7b7d9d83c942855e4fdcfa75d4f96f6b9e272d42fffcb72cd4bb2577db2e2907"}, - {file = "rpds_py-0.28.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:dcdcb890b3ada98a03f9f2bb108489cdc7580176cb73b4f2d789e9a1dac1d472"}, - {file = "rpds_py-0.28.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f274f56a926ba2dc02976ca5b11c32855cbd5925534e57cfe1fda64e04d1add2"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fe0438ac4a29a520ea94c8c7f1754cdd8feb1bc490dfda1bfd990072363d527"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a358a32dd3ae50e933347889b6af9a1bdf207ba5d1a3f34e1a38cd3540e6733"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e80848a71c78aa328fefaba9c244d588a342c8e03bda518447b624ea64d1ff56"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f586db2e209d54fe177e58e0bc4946bea5fb0102f150b1b2f13de03e1f0976f8"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ae8ee156d6b586e4292491e885d41483136ab994e719a13458055bec14cf370"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a805e9b3973f7e27f7cab63a6b4f61d90f2e5557cff73b6e97cd5b8540276d3d"}, - {file = "rpds_py-0.28.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d3fd16b6dc89c73a4da0b4ac8b12a7ecc75b2864b95c9e5afed8003cb50a728"}, - {file = "rpds_py-0.28.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6796079e5d24fdaba6d49bda28e2c47347e89834678f2bc2c1b4fc1489c0fb01"}, - {file = "rpds_py-0.28.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:76500820c2af232435cbe215e3324c75b950a027134e044423f59f5b9a1ba515"}, - {file = "rpds_py-0.28.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bbdc5640900a7dbf9dd707fe6388972f5bbd883633eb68b76591044cfe346f7e"}, - {file = "rpds_py-0.28.0-cp314-cp314-win32.whl", hash = "sha256:adc8aa88486857d2b35d75f0640b949759f79dc105f50aa2c27816b2e0dd749f"}, - {file = "rpds_py-0.28.0-cp314-cp314-win_amd64.whl", hash = "sha256:66e6fa8e075b58946e76a78e69e1a124a21d9a48a5b4766d15ba5b06869d1fa1"}, - {file = "rpds_py-0.28.0-cp314-cp314-win_arm64.whl", hash = "sha256:a6fe887c2c5c59413353b7c0caff25d0e566623501ccfff88957fa438a69377d"}, - {file = "rpds_py-0.28.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7a69df082db13c7070f7b8b1f155fa9e687f1d6aefb7b0e3f7231653b79a067b"}, - {file = "rpds_py-0.28.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b1cde22f2c30ebb049a9e74c5374994157b9b70a16147d332f89c99c5960737a"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5338742f6ba7a51012ea470bd4dc600a8c713c0c72adaa0977a1b1f4327d6592"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1460ebde1bcf6d496d80b191d854adedcc619f84ff17dc1c6d550f58c9efbba"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e3eb248f2feba84c692579257a043a7699e28a77d86c77b032c1d9fbb3f0219c"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3bbba5def70b16cd1c1d7255666aad3b290fbf8d0fe7f9f91abafb73611a91"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3114f4db69ac5a1f32e7e4d1cbbe7c8f9cf8217f78e6e002cedf2d54c2a548ed"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4b0cb8a906b1a0196b863d460c0222fb8ad0f34041568da5620f9799b83ccf0b"}, - {file = "rpds_py-0.28.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf681ac76a60b667106141e11a92a3330890257e6f559ca995fbb5265160b56e"}, - {file = "rpds_py-0.28.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1e8ee6413cfc677ce8898d9cde18cc3a60fc2ba756b0dec5b71eb6eb21c49fa1"}, - {file = "rpds_py-0.28.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b3072b16904d0b5572a15eb9d31c1954e0d3227a585fc1351aa9878729099d6c"}, - {file = "rpds_py-0.28.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b670c30fd87a6aec281c3c9896d3bae4b205fd75d79d06dc87c2503717e46092"}, - {file = "rpds_py-0.28.0-cp314-cp314t-win32.whl", hash = "sha256:8014045a15b4d2b3476f0a287fcc93d4f823472d7d1308d47884ecac9e612be3"}, - {file = "rpds_py-0.28.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7a4e59c90d9c27c561eb3160323634a9ff50b04e4f7820600a2beb0ac90db578"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f5e7101145427087e493b9c9b959da68d357c28c562792300dd21a095118ed16"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:31eb671150b9c62409a888850aaa8e6533635704fe2b78335f9aaf7ff81eec4d"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48b55c1f64482f7d8bd39942f376bfdf2f6aec637ee8c805b5041e14eeb771db"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24743a7b372e9a76171f6b69c01aedf927e8ac3e16c474d9fe20d552a8cb45c7"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:389c29045ee8bbb1627ea190b4976a310a295559eaf9f1464a1a6f2bf84dde78"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23690b5827e643150cf7b49569679ec13fe9a610a15949ed48b85eb7f98f34ec"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f0c9266c26580e7243ad0d72fc3e01d6b33866cfab5084a6da7576bcf1c4f72"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4c6c4db5d73d179746951486df97fd25e92396be07fc29ee8ff9a8f5afbdfb27"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3b695a8fa799dd2cfdb4804b37096c5f6dba1ac7f48a7fbf6d0485bcd060316"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:6aa1bfce3f83baf00d9c5fcdbba93a3ab79958b4c7d7d1f55e7fe68c20e63912"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:7b0f9dceb221792b3ee6acb5438eb1f02b0cb2c247796a72b016dcc92c6de829"}, - {file = "rpds_py-0.28.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5d0145edba8abd3db0ab22b5300c99dc152f5c9021fab861be0f0544dc3cbc5f"}, - {file = "rpds_py-0.28.0.tar.gz", hash = "sha256:abd4df20485a0983e2ca334a216249b6186d6e3c1627e106651943dbdb791aea"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37"}, + {file = "rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc"}, + {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f"}, + {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323"}, + {file = "rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45"}, + {file = "rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84"}, + {file = "rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed"}, + {file = "rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d"}, + {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a"}, + {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318"}, + {file = "rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a"}, + {file = "rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03"}, + {file = "rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41"}, + {file = "rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d"}, + {file = "rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a"}, + {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3"}, + {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2"}, + {file = "rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44"}, + {file = "rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c"}, + {file = "rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8"}, + {file = "rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d"}, + {file = "rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04"}, + {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9"}, + {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba"}, + {file = "rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b"}, + {file = "rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5"}, + {file = "rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256"}, + {file = "rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618"}, + {file = "rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f"}, + {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c"}, + {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0"}, + {file = "rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9"}, + {file = "rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9"}, + {file = "rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a"}, + {file = "rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246"}, + {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33"}, + {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953"}, + {file = "rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9"}, + {file = "rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37"}, + {file = "rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867"}, + {file = "rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da"}, + {file = "rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8"}, + {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170"}, + {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e"}, + {file = "rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f"}, + {file = "rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7"}, + {file = "rpds_py-0.26.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7a48af25d9b3c15684059d0d1fc0bc30e8eee5ca521030e2bffddcab5be40226"}, + {file = "rpds_py-0.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c71c2f6bf36e61ee5c47b2b9b5d47e4d1baad6426bfed9eea3e858fc6ee8806"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d815d48b1804ed7867b539236b6dd62997850ca1c91cad187f2ddb1b7bbef19"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84cfbd4d4d2cdeb2be61a057a258d26b22877266dd905809e94172dff01a42ae"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbaa70553ca116c77717f513e08815aec458e6b69a028d4028d403b3bc84ff37"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39bfea47c375f379d8e87ab4bb9eb2c836e4f2069f0f65731d85e55d74666387"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1533b7eb683fb5f38c1d68a3c78f5fdd8f1412fa6b9bf03b40f450785a0ab915"}, + {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5ab0ee51f560d179b057555b4f601b7df909ed31312d301b99f8b9fc6028284"}, + {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5162afc9e0d1f9cae3b577d9c29ddbab3505ab39012cb794d94a005825bde21"}, + {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:43f10b007033f359bc3fa9cd5e6c1e76723f056ffa9a6b5c117cc35720a80292"}, + {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3730a48e5622e598293eee0762b09cff34dd3f271530f47b0894891281f051d"}, + {file = "rpds_py-0.26.0-cp39-cp39-win32.whl", hash = "sha256:4b1f66eb81eab2e0ff5775a3a312e5e2e16bf758f7b06be82fb0d04078c7ac51"}, + {file = "rpds_py-0.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:519067e29f67b5c90e64fb1a6b6e9d2ec0ba28705c51956637bac23a2f4ddae1"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b"}, + {file = "rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0"}, + {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a90a13408a7a856b87be8a9f008fff53c5080eea4e4180f6c2e546e4a972fb5d"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ac51b65e8dc76cf4949419c54c5528adb24fc721df722fd452e5fbc236f5c40"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b2093224a18c6508d95cfdeba8db9cbfd6f3494e94793b58972933fcee4c6d"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f01a5d6444a3258b00dc07b6ea4733e26f8072b788bef750baa37b370266137"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6e2c12160c72aeda9d1283e612f68804621f448145a210f1bf1d79151c47090"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb28c1f569f8d33b2b5dcd05d0e6ef7005d8639c54c2f0be824f05aedf715255"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1766b5724c3f779317d5321664a343c07773c8c5fd1532e4039e6cc7d1a815be"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b6d9e5a2ed9c4988c8f9b28b3bc0e3e5b1aaa10c28d210a594ff3a8c02742daf"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b5f7a446ddaf6ca0fad9a5535b56fbfc29998bf0e0b450d174bbec0d600e1d72"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:eed5ac260dd545fbc20da5f4f15e7efe36a55e0e7cf706e4ec005b491a9546a0"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:582462833ba7cee52e968b0341b85e392ae53d44c0f9af6a5927c80e539a8b67"}, + {file = "rpds_py-0.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69a607203441e07e9a8a529cff1d5b73f6a160f22db1097211e6212a68567d11"}, + {file = "rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0"}, ] [[package]] @@ -4082,7 +3972,7 @@ description = "Pure-Python RSA implementation" optional = false python-versions = "<4,>=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, @@ -4091,25 +3981,44 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "s3transfer" +version = "0.10.4" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "s3transfer-0.10.4-py3-none-any.whl", hash = "sha256:244a76a24355363a68164241438de1b72f8781664920260c48465896b712a41e"}, + {file = "s3transfer-0.10.4.tar.gz", hash = "sha256:29edc09801743c21eb5ecbc617a152df41d3c287f67b615f73e5f750583666a7"}, +] + +[package.dependencies] +botocore = ">=1.33.2,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] + [[package]] name = "sendgrid" -version = "6.12.5" +version = "6.12.4" description = "Twilio SendGrid library for Python" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "sendgrid-6.12.5-py3-none-any.whl", hash = "sha256:96f92cc91634bf552fdb766b904bbb53968018da7ae41fdac4d1090dc0311ca8"}, - {file = "sendgrid-6.12.5.tar.gz", hash = "sha256:ea9aae30cd55c332e266bccd11185159482edfc07c149b6cd15cf08869fabdb7"}, + {file = "sendgrid-6.12.4-py3-none-any.whl", hash = "sha256:9a211b96241e63bd5b9ed9afcc8608f4bcac426e4a319b3920ab877c8426e92c"}, + {file = "sendgrid-6.12.4.tar.gz", hash = "sha256:9e88b849daf0fa4bdf256c3b5da9f5a3272402c0c2fd6b1928c9de440db0a03d"}, ] [package.dependencies] -cryptography = ">=45.0.6" +ecdsa = ">=0.19.1,<1" python-http-client = ">=3.2.1" werkzeug = [ - {version = ">=2.2.0", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=2.3.5", markers = "python_version >= \"3.12\""}, + {version = ">=2.2.0", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] [[package]] @@ -4119,7 +4028,7 @@ description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4132,7 +4041,7 @@ description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -4140,74 +4049,74 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.44" +version = "2.0.41" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "SQLAlchemy-2.0.44-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:471733aabb2e4848d609141a9e9d56a427c0a038f4abf65dd19d7a21fd563632"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48bf7d383a35e668b984c805470518b635d48b95a3c57cb03f37eaa3551b5f9f"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf4bb6b3d6228fcf3a71b50231199fb94d2dd2611b66d33be0578ea3e6c2726"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:e998cf7c29473bd077704cea3577d23123094311f59bdc4af551923b168332b1"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ebac3f0b5732014a126b43c2b7567f2f0e0afea7d9119a3378bde46d3dcad88e"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-win32.whl", hash = "sha256:3255d821ee91bdf824795e936642bbf43a4c7cedf5d1aed8d24524e66843aa74"}, - {file = "SQLAlchemy-2.0.44-cp37-cp37m-win_amd64.whl", hash = "sha256:78e6c137ba35476adb5432103ae1534f2f5295605201d946a4198a0dea4b38e7"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c77f3080674fc529b1bd99489378c7f63fcb4ba7f8322b79732e0258f0ea3ce"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26ef74ba842d61635b0152763d057c8d48215d5be9bb8b7604116a059e9985"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a172b31785e2f00780eccab00bc240ccdbfdb8345f1e6063175b3ff12ad1b0"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9480c0740aabd8cb29c329b422fb65358049840b34aba0adf63162371d2a96e"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17835885016b9e4d0135720160db3095dc78c583e7b902b6be799fb21035e749"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cbe4f85f50c656d753890f39468fcd8190c5f08282caf19219f684225bfd5fd2"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-win32.whl", hash = "sha256:2fcc4901a86ed81dc76703f3b93ff881e08761c63263c46991081fd7f034b165"}, - {file = "sqlalchemy-2.0.44-cp310-cp310-win_amd64.whl", hash = "sha256:9919e77403a483ab81e3423151e8ffc9dd992c20d2603bf17e4a8161111e55f5"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe3917059c7ab2ee3f35e77757062b1bea10a0b6ca633c58391e3f3c6c488dd"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de4387a354ff230bc979b46b2207af841dc8bf29847b6c7dbe60af186d97aefa"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3678a0fb72c8a6a29422b2732fe423db3ce119c34421b5f9955873eb9b62c1e"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf6872a23601672d61a68f390e44703442639a12ee9dd5a88bbce52a695e46e"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:329aa42d1be9929603f406186630135be1e7a42569540577ba2c69952b7cf399"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:70e03833faca7166e6a9927fbee7c27e6ecde436774cd0b24bbcc96353bce06b"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-win32.whl", hash = "sha256:253e2f29843fb303eca6b2fc645aca91fa7aa0aa70b38b6950da92d44ff267f3"}, - {file = "sqlalchemy-2.0.44-cp311-cp311-win_amd64.whl", hash = "sha256:7a8694107eb4308a13b425ca8c0e67112f8134c846b6e1f722698708741215d5"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72fea91746b5890f9e5e0997f16cbf3d53550580d76355ba2d998311b17b2250"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:585c0c852a891450edbb1eaca8648408a3cc125f18cf433941fa6babcc359e29"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b94843a102efa9ac68a7a30cd46df3ff1ed9c658100d30a725d10d9c60a2f44"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:119dc41e7a7defcefc57189cfa0e61b1bf9c228211aba432b53fb71ef367fda1"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0765e318ee9179b3718c4fd7ba35c434f4dd20332fbc6857a5e8df17719c24d7"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e7b5b079055e02d06a4308d0481658e4f06bc7ef211567edc8f7d5dce52018d"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-win32.whl", hash = "sha256:846541e58b9a81cce7dee8329f352c318de25aa2f2bbe1e31587eb1f057448b4"}, - {file = "sqlalchemy-2.0.44-cp312-cp312-win_amd64.whl", hash = "sha256:7cbcb47fd66ab294703e1644f78971f6f2f1126424d2b300678f419aa73c7b6e"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73"}, - {file = "sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fc44e5965ea46909a416fff0af48a219faefd5773ab79e5f8a5fcd5d62b2667"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc8b3850d2a601ca2320d081874033684e246d28e1c5e89db0864077cfc8f5a9"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d733dec0614bb8f4bcb7c8af88172b974f685a31dc3a65cca0527e3120de5606"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22be14009339b8bc16d6b9dc8780bacaba3402aa7581658e246114abbd2236e3"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:357bade0e46064f88f2c3a99808233e67b0051cdddf82992379559322dfeb183"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4848395d932e93c1595e59a8672aa7400e8922c39bb9b0668ed99ac6fa867822"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-win32.whl", hash = "sha256:2f19644f27c76f07e10603580a47278abb2a70311136a7f8fd27dc2e096b9013"}, - {file = "sqlalchemy-2.0.44-cp38-cp38-win_amd64.whl", hash = "sha256:1df4763760d1de0dfc8192cc96d8aa293eb1a44f8f7a5fbe74caf1b551905c5e"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7027414f2b88992877573ab780c19ecb54d3a536bef3397933573d6b5068be4"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fe166c7d00912e8c10d3a9a0ce105569a31a3d0db1a6e82c4e0f4bf16d5eca9"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3caef1ff89b1caefc28f0368b3bde21a7e3e630c2eddac16abd9e47bd27cc36a"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc2856d24afa44295735e72f3c75d6ee7fdd4336d8d3a8f3d44de7aa6b766df2"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11bac86b0deada30b6b5f93382712ff0e911fe8d31cb9bf46e6b149ae175eff0"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4d18cd0e9a0f37c9f4088e50e3839fcb69a380a0ec957408e0b57cff08ee0a26"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-win32.whl", hash = "sha256:9e9018544ab07614d591a26c1bd4293ddf40752cc435caf69196740516af7100"}, - {file = "sqlalchemy-2.0.44-cp39-cp39-win_amd64.whl", hash = "sha256:8e0e4e66fd80f277a8c3de016a81a554e76ccf6b8d881ee0b53200305a8433f6"}, - {file = "sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05"}, - {file = "sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "SQLAlchemy-2.0.41-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6854175807af57bdb6425e47adbce7d20a4d79bbfd6f6d6519cd10bb7109a7f8"}, + {file = "SQLAlchemy-2.0.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05132c906066142103b83d9c250b60508af556982a385d96c4eaa9fb9720ac2b"}, + {file = "SQLAlchemy-2.0.41-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4af17bda11e907c51d10686eda89049f9ce5669b08fbe71a29747f1e876036"}, + {file = "SQLAlchemy-2.0.41-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c0b0e5e1b5d9f3586601048dd68f392dc0cc99a59bb5faf18aab057ce00d00b2"}, + {file = "SQLAlchemy-2.0.41-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0b3dbf1e7e9bc95f4bac5e2fb6d3fb2f083254c3fdd20a1789af965caf2d2348"}, + {file = "SQLAlchemy-2.0.41-cp37-cp37m-win32.whl", hash = "sha256:1e3f196a0c59b0cae9a0cd332eb1a4bda4696e863f4f1cf84ab0347992c548c2"}, + {file = "SQLAlchemy-2.0.41-cp37-cp37m-win_amd64.whl", hash = "sha256:6ab60a5089a8f02009f127806f777fca82581c49e127f08413a66056bd9166dd"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-win32.whl", hash = "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda"}, + {file = "sqlalchemy-2.0.41-cp310-cp310-win_amd64.whl", hash = "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8"}, + {file = "sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6"}, + {file = "sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f"}, + {file = "sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90144d3b0c8b139408da50196c5cad2a6909b51b23df1f0538411cd23ffa45d3"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:023b3ee6169969beea3bb72312e44d8b7c27c75b347942d943cf49397b7edeb5"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725875a63abf7c399d4548e686debb65cdc2549e1825437096a0af1f7e374814"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81965cc20848ab06583506ef54e37cf15c83c7e619df2ad16807c03100745dea"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dd5ec3aa6ae6e4d5b5de9357d2133c07be1aff6405b136dad753a16afb6717dd"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ff8e80c4c4932c10493ff97028decfdb622de69cae87e0f127a7ebe32b4069c6"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-win32.whl", hash = "sha256:4d44522480e0bf34c3d63167b8cfa7289c1c54264c2950cc5fc26e7850967e45"}, + {file = "sqlalchemy-2.0.41-cp38-cp38-win_amd64.whl", hash = "sha256:81eedafa609917040d39aa9332e25881a8e7a0862495fcdf2023a9667209deda"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-win32.whl", hash = "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440"}, + {file = "sqlalchemy-2.0.41-cp39-cp39-win_amd64.whl", hash = "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71"}, + {file = "sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576"}, + {file = "sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9"}, ] [package.dependencies] -greenlet = {version = ">=1", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -4242,7 +4151,7 @@ description = "JSON type with nested change tracking for SQLAlchemy" optional = false python-versions = ">= 3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "sqlalchemy-json-0.7.0.tar.gz", hash = "sha256:620d0b26f648f21a8fa9127df66f55f83a5ab4ae010e5397a5c6989a08238561"}, {file = "sqlalchemy_json-0.7.0-py3-none-any.whl", hash = "sha256:27881d662ca18363a4ac28175cc47ea2a6f2bef997ae1159c151026b741818e6"}, @@ -4256,20 +4165,19 @@ dev = ["pytest"] [[package]] name = "starlette" -version = "0.47.3" +version = "0.46.2" description = "The little ASGI library that shines." optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51"}, - {file = "starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9"}, + {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, + {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, ] [package.dependencies] anyio = ">=3.6.2,<5" -typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} [package.extras] full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] @@ -4281,7 +4189,7 @@ description = "Python bindings for the Stripe API" optional = false python-versions = ">=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "stripe-11.6.0-py2.py3-none-any.whl", hash = "sha256:6e6cf09ebb6d5fc2d708401cb8868fd7bff987a6d09a0433caaa92c62f97dbc5"}, {file = "stripe-11.6.0.tar.gz", hash = "sha256:0ced7cce23a6cb1a393c86a1f7f9435c9d83ae7cbd556362868caf62cb44a92c"}, @@ -4293,15 +4201,15 @@ typing-extensions = {version = ">=4.5.0", markers = "python_version >= \"3.7\""} [[package]] name = "structlog" -version = "25.5.0" +version = "25.4.0" description = "Structured Logging for Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "structlog-25.5.0-py3-none-any.whl", hash = "sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f"}, - {file = "structlog-25.5.0.tar.gz", hash = "sha256:098522a3bebed9153d4570c6d0288abf80a031dfdb2048d59a49e9dc2190fc98"}, + {file = "structlog-25.4.0-py3-none-any.whl", hash = "sha256:fe809ff5c27e557d14e613f45ca441aabda051d119ee5a0102aaba6ce40eed2c"}, + {file = "structlog-25.4.0.tar.gz", hash = "sha256:186cd1b0a8ae762e29417095664adf1d6a31702160a46dacb7796ea82f7409e4"}, ] [[package]] @@ -4311,7 +4219,7 @@ description = "SuperTokens SDK for Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "supertokens_python-0.29.2-py3-none-any.whl", hash = "sha256:9886c1257432403dfb7a862a914b2308f84f15992b5616c7797a32feae163e80"}, {file = "supertokens_python-0.29.2.tar.gz", hash = "sha256:c37caaf81c159c686cca0a7990ebeac272309a87078edea0bc0fc48ba1cccac1"}, @@ -4341,44 +4249,44 @@ flask = ["flask", "flask-cors", "python-dotenv (==1.0.1)"] [[package]] name = "tiktoken" -version = "0.11.0" +version = "0.9.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "tiktoken-0.11.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:8a9b517d6331d7103f8bef29ef93b3cca95fa766e293147fe7bacddf310d5917"}, - {file = "tiktoken-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b4ddb1849e6bf0afa6cc1c5d809fb980ca240a5fffe585a04e119519758788c0"}, - {file = "tiktoken-0.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10331d08b5ecf7a780b4fe4d0281328b23ab22cdb4ff65e68d56caeda9940ecc"}, - {file = "tiktoken-0.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b062c82300341dc87e0258c69f79bed725f87e753c21887aea90d272816be882"}, - {file = "tiktoken-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:195d84bec46169af3b1349a1495c151d37a0ff4cba73fd08282736be7f92cc6c"}, - {file = "tiktoken-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe91581b0ecdd8783ce8cb6e3178f2260a3912e8724d2f2d49552b98714641a1"}, - {file = "tiktoken-0.11.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ae374c46afadad0f501046db3da1b36cd4dfbfa52af23c998773682446097cf"}, - {file = "tiktoken-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25a512ff25dc6c85b58f5dd4f3d8c674dc05f96b02d66cdacf628d26a4e4866b"}, - {file = "tiktoken-0.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2130127471e293d385179c1f3f9cd445070c0772be73cdafb7cec9a3684c0458"}, - {file = "tiktoken-0.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e43022bf2c33f733ea9b54f6a3f6b4354b909f5a73388fb1b9347ca54a069c"}, - {file = "tiktoken-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:adb4e308eb64380dc70fa30493e21c93475eaa11669dea313b6bbf8210bfd013"}, - {file = "tiktoken-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ece6b76bfeeb61a125c44bbefdfccc279b5288e6007fbedc0d32bfec602df2f2"}, - {file = "tiktoken-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fd9e6b23e860973cf9526544e220b223c60badf5b62e80a33509d6d40e6c8f5d"}, - {file = "tiktoken-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a76d53cee2da71ee2731c9caa747398762bda19d7f92665e882fef229cb0b5b"}, - {file = "tiktoken-0.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef72aab3ea240646e642413cb363b73869fed4e604dcfd69eec63dc54d603e8"}, - {file = "tiktoken-0.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f929255c705efec7a28bf515e29dc74220b2f07544a8c81b8d69e8efc4578bd"}, - {file = "tiktoken-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61f1d15822e4404953d499fd1dcc62817a12ae9fb1e4898033ec8fe3915fdf8e"}, - {file = "tiktoken-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:45927a71ab6643dfd3ef57d515a5db3d199137adf551f66453be098502838b0f"}, - {file = "tiktoken-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a5f3f25ffb152ee7fec78e90a5e5ea5b03b4ea240beed03305615847f7a6ace2"}, - {file = "tiktoken-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7dc6e9ad16a2a75b4c4be7208055a1f707c9510541d94d9cc31f7fbdc8db41d8"}, - {file = "tiktoken-0.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a0517634d67a8a48fd4a4ad73930c3022629a85a217d256a6e9b8b47439d1e4"}, - {file = "tiktoken-0.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fb4effe60574675118b73c6fbfd3b5868e5d7a1f570d6cc0d18724b09ecf318"}, - {file = "tiktoken-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94f984c9831fd32688aef4348803b0905d4ae9c432303087bae370dc1381a2b8"}, - {file = "tiktoken-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2177ffda31dec4023356a441793fed82f7af5291120751dee4d696414f54db0c"}, - {file = "tiktoken-0.11.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:13220f12c9e82e399377e768640ddfe28bea962739cc3a869cad98f42c419a89"}, - {file = "tiktoken-0.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f2db627f5c74477c0404b4089fd8a28ae22fa982a6f7d9c7d4c305c375218f3"}, - {file = "tiktoken-0.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2302772f035dceb2bcf8e55a735e4604a0b51a6dd50f38218ff664d46ec43807"}, - {file = "tiktoken-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b977989afe44c94bcc50db1f76971bb26dca44218bd203ba95925ef56f8e7a"}, - {file = "tiktoken-0.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:669a1aa1ad6ebf1b3c26b45deb346f345da7680f845b5ea700bba45c20dea24c"}, - {file = "tiktoken-0.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:e363f33c720a055586f730c00e330df4c7ea0024bf1c83a8a9a9dbc054c4f304"}, - {file = "tiktoken-0.11.0.tar.gz", hash = "sha256:3c518641aee1c52247c2b97e74d8d07d780092af79d5911a6ab5e79359d9b06a"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "tiktoken-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:586c16358138b96ea804c034b8acf3f5d3f0258bd2bc3b0227af4af5d622e382"}, + {file = "tiktoken-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9c59ccc528c6c5dd51820b3474402f69d9a9e1d656226848ad68a8d5b2e5108"}, + {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0968d5beeafbca2a72c595e8385a1a1f8af58feaebb02b227229b69ca5357fd"}, + {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a5fb085a6a3b7350b8fc838baf493317ca0e17bd95e8642f95fc69ecfed1de"}, + {file = "tiktoken-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15a2752dea63d93b0332fb0ddb05dd909371ededa145fe6a3242f46724fa7990"}, + {file = "tiktoken-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:26113fec3bd7a352e4b33dbaf1bd8948de2507e30bd95a44e2b1156647bc01b4"}, + {file = "tiktoken-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f32cc56168eac4851109e9b5d327637f15fd662aa30dd79f964b7c39fbadd26e"}, + {file = "tiktoken-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45556bc41241e5294063508caf901bf92ba52d8ef9222023f83d2483a3055348"}, + {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03935988a91d6d3216e2ec7c645afbb3d870b37bcb67ada1943ec48678e7ee33"}, + {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3d80aad8d2c6b9238fc1a5524542087c52b860b10cbf952429ffb714bc1136"}, + {file = "tiktoken-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b2a21133be05dc116b1d0372af051cd2c6aa1d2188250c9b553f9fa49301b336"}, + {file = "tiktoken-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:11a20e67fdf58b0e2dea7b8654a288e481bb4fc0289d3ad21291f8d0849915fb"}, + {file = "tiktoken-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e88f121c1c22b726649ce67c089b90ddda8b9662545a8aeb03cfef15967ddd03"}, + {file = "tiktoken-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6600660f2f72369acb13a57fb3e212434ed38b045fd8cc6cdd74947b4b5d210"}, + {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e811743b5dfa74f4b227927ed86cbc57cad4df859cb3b643be797914e41794"}, + {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99376e1370d59bcf6935c933cb9ba64adc29033b7e73f5f7569f3aad86552b22"}, + {file = "tiktoken-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:badb947c32739fb6ddde173e14885fb3de4d32ab9d8c591cbd013c22b4c31dd2"}, + {file = "tiktoken-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16"}, + {file = "tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb"}, + {file = "tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63"}, + {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01"}, + {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139"}, + {file = "tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a"}, + {file = "tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95"}, + {file = "tiktoken-0.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c6386ca815e7d96ef5b4ac61e0048cd32ca5a92d5781255e13b31381d28667dc"}, + {file = "tiktoken-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75f6d5db5bc2c6274b674ceab1615c1778e6416b14705827d19b40e6355f03e0"}, + {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e15b16f61e6f4625a57a36496d28dd182a8a60ec20a534c5343ba3cafa156ac7"}, + {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebcec91babf21297022882344c3f7d9eed855931466c3311b1ad6b64befb3df"}, + {file = "tiktoken-0.9.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5fd49e7799579240f03913447c0cdfa1129625ebd5ac440787afc4345990427"}, + {file = "tiktoken-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:26242ca9dc8b58e875ff4ca078b9a94d2f0813e6a535dcd2205df5d49d927cc7"}, + {file = "tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d"}, ] [package.dependencies] @@ -4395,7 +4303,7 @@ description = "Accurately separates a URL's subdomain, domain, and public suffix optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "tldextract-5.3.0-py3-none-any.whl", hash = "sha256:f70f31d10b55c83993f55e91ecb7c5d84532a8972f22ec578ecfbe5ea2292db2"}, {file = "tldextract-5.3.0.tar.gz", hash = "sha256:b3d2b70a1594a0ecfa6967d57251527d58e00bb5a91a74387baa0d87a0678609"}, @@ -4413,37 +4321,37 @@ testing = ["mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ru [[package]] name = "tokenizers" -version = "0.22.1" +version = "0.21.2" description = "" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "tokenizers-0.22.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:59fdb013df17455e5f950b4b834a7b3ee2e0271e6378ccb33aa74d178b513c73"}, - {file = "tokenizers-0.22.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8d4e484f7b0827021ac5f9f71d4794aaef62b979ab7608593da22b1d2e3c4edc"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d2962dd28bc67c1f205ab180578a78eef89ac60ca7ef7cbe9635a46a56422a"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38201f15cdb1f8a6843e6563e6e79f4abd053394992b9bbdf5213ea3469b4ae7"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1cbe5454c9a15df1b3443c726063d930c16f047a3cc724b9e6e1a91140e5a21"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7d094ae6312d69cc2a872b54b91b309f4f6fbce871ef28eb27b52a98e4d0214"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afd7594a56656ace95cdd6df4cca2e4059d294c5cfb1679c57824b605556cb2f"}, - {file = "tokenizers-0.22.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ef6063d7a84994129732b47e7915e8710f27f99f3a3260b8a38fc7ccd083f4"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ba0a64f450b9ef412c98f6bcd2a50c6df6e2443b560024a09fa6a03189726879"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:331d6d149fa9c7d632cde4490fb8bbb12337fa3a0232e77892be656464f4b446"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:607989f2ea68a46cb1dfbaf3e3aabdf3f21d8748312dbeb6263d1b3b66c5010a"}, - {file = "tokenizers-0.22.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a0f307d490295717726598ef6fa4f24af9d484809223bbc253b201c740a06390"}, - {file = "tokenizers-0.22.1-cp39-abi3-win32.whl", hash = "sha256:b5120eed1442765cd90b903bb6cfef781fd8fe64e34ccaecbae4c619b7b12a82"}, - {file = "tokenizers-0.22.1-cp39-abi3-win_amd64.whl", hash = "sha256:65fd6e3fb11ca1e78a6a93602490f134d1fdeb13bcef99389d5102ea318ed138"}, - {file = "tokenizers-0.22.1.tar.gz", hash = "sha256:61de6522785310a309b3407bac22d99c4db5dba349935e99e4d15ea2226af2d9"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "tokenizers-0.21.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:342b5dfb75009f2255ab8dec0041287260fed5ce00c323eb6bab639066fef8ec"}, + {file = "tokenizers-0.21.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:126df3205d6f3a93fea80c7a8a266a78c1bd8dd2fe043386bafdd7736a23e45f"}, + {file = "tokenizers-0.21.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a32cd81be21168bd0d6a0f0962d60177c447a1aa1b1e48fa6ec9fc728ee0b12"}, + {file = "tokenizers-0.21.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8bd8999538c405133c2ab999b83b17c08b7fc1b48c1ada2469964605a709ef91"}, + {file = "tokenizers-0.21.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e9944e61239b083a41cf8fc42802f855e1dca0f499196df37a8ce219abac6eb"}, + {file = "tokenizers-0.21.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:514cd43045c5d546f01142ff9c79a96ea69e4b5cda09e3027708cb2e6d5762ab"}, + {file = "tokenizers-0.21.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b9405822527ec1e0f7d8d2fdb287a5730c3a6518189c968254a8441b21faae"}, + {file = "tokenizers-0.21.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed9a4d51c395103ad24f8e7eb976811c57fbec2af9f133df471afcd922e5020"}, + {file = "tokenizers-0.21.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c41862df3d873665ec78b6be36fcc30a26e3d4902e9dd8608ed61d49a48bc19"}, + {file = "tokenizers-0.21.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed21dc7e624e4220e21758b2e62893be7101453525e3d23264081c9ef9a6d00d"}, + {file = "tokenizers-0.21.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:0e73770507e65a0e0e2a1affd6b03c36e3bc4377bd10c9ccf51a82c77c0fe365"}, + {file = "tokenizers-0.21.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:106746e8aa9014a12109e58d540ad5465b4c183768ea96c03cbc24c44d329958"}, + {file = "tokenizers-0.21.2-cp39-abi3-win32.whl", hash = "sha256:cabda5a6d15d620b6dfe711e1af52205266d05b379ea85a8a301b3593c60e962"}, + {file = "tokenizers-0.21.2-cp39-abi3-win_amd64.whl", hash = "sha256:58747bb898acdb1007f37a7bbe614346e98dc28708ffb66a3fd50ce169ac6c98"}, + {file = "tokenizers-0.21.2.tar.gz", hash = "sha256:fdc7cffde3e2113ba0e6cc7318c40e3438a4d74bbc62bf04bcc63bdfb082ac77"}, ] [package.dependencies] -huggingface-hub = ">=0.16.4,<2.0" +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "pytest-asyncio", "requests", "ruff"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "toml" @@ -4452,7 +4360,7 @@ description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -4465,7 +4373,7 @@ description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -4483,15 +4391,15 @@ telegram = ["requests"] [[package]] name = "twilio" -version = "9.8.5" +version = "9.6.5" description = "Twilio API client and TwiML generator" optional = false python-versions = ">=3.7.0" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "twilio-9.8.5-py2.py3-none-any.whl", hash = "sha256:7e1d04bb2cd480a97937f1fbea5fe35377925b6f70745baade08bde9cd4fb319"}, - {file = "twilio-9.8.5.tar.gz", hash = "sha256:b69dc2226294ef579fcdd92b502aef7982a60577110a0799f8c2b739428e1dcf"}, + {file = "twilio-9.6.5-py2.py3-none-any.whl", hash = "sha256:e9f547267b59fb474bfc715c042662d9d2b1a1bbcde34017954407aa95482277"}, + {file = "twilio-9.6.5.tar.gz", hash = "sha256:4f246b3d3474090b55dc13034b7cec2f9250877f5298f8419a3fe8a447f36f71"}, ] [package.dependencies] @@ -4502,28 +4410,28 @@ requests = ">=2.0.0" [[package]] name = "typing-extensions" -version = "4.15.0" +version = "4.14.1" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, - {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, + {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, + {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, ] [[package]] name = "typing-inspection" -version = "0.4.2" +version = "0.4.1" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, - {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, + {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, + {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, ] [package.dependencies] @@ -4536,7 +4444,7 @@ description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -4544,22 +4452,21 @@ files = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.9" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uuid-utils" @@ -4568,7 +4475,7 @@ description = "Drop-in replacement for Python UUID in Rust" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "uuid_utils-0.10.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d5a4508feefec62456cd6a41bcdde458d56827d908f226803b886d22a3d5e63"}, {file = "uuid_utils-0.10.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dbefc2b9113f9dfe56bdae58301a2b3c53792221410d422826f3d1e3e6555fe7"}, @@ -4601,15 +4508,15 @@ files = [ [[package]] name = "uvicorn" -version = "0.34.3" +version = "0.22.0" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885"}, - {file = "uvicorn-0.34.3.tar.gz", hash = "sha256:35919a9a979d7a59334b6b10e05d77c1d0d574c50e0fc98b8b1a0f165708b55a"}, + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, ] [package.dependencies] @@ -4617,7 +4524,7 @@ click = ">=7.0" h11 = ">=0.8" [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] name = "vine" @@ -4626,7 +4533,7 @@ description = "Python promises." optional = false python-versions = ">=3.6" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, @@ -4639,7 +4546,7 @@ description = "Filesystem events monitoring" optional = false python-versions = ">=3.7" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, @@ -4678,17 +4585,35 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false -python-versions = ">=3.6" +python-versions = "*" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ - {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, - {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + [[package]] name = "werkzeug" version = "3.1.3" @@ -4696,7 +4621,7 @@ description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, @@ -4710,235 +4635,207 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wrapt" -version = "1.17.3" +version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04"}, - {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2"}, - {file = "wrapt-1.17.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd341868a4b6714a5962c1af0bd44f7c404ef78720c7de4892901e540417111c"}, - {file = "wrapt-1.17.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f9b2601381be482f70e5d1051a5965c25fb3625455a2bf520b5a077b22afb775"}, - {file = "wrapt-1.17.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:343e44b2a8e60e06a7e0d29c1671a0d9951f59174f3709962b5143f60a2a98bd"}, - {file = "wrapt-1.17.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:33486899acd2d7d3066156b03465b949da3fd41a5da6e394ec49d271baefcf05"}, - {file = "wrapt-1.17.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e6f40a8aa5a92f150bdb3e1c44b7e98fb7113955b2e5394122fa5532fec4b418"}, - {file = "wrapt-1.17.3-cp310-cp310-win32.whl", hash = "sha256:a36692b8491d30a8c75f1dfee65bef119d6f39ea84ee04d9f9311f83c5ad9390"}, - {file = "wrapt-1.17.3-cp310-cp310-win_amd64.whl", hash = "sha256:afd964fd43b10c12213574db492cb8f73b2f0826c8df07a68288f8f19af2ebe6"}, - {file = "wrapt-1.17.3-cp310-cp310-win_arm64.whl", hash = "sha256:af338aa93554be859173c39c85243970dc6a289fa907402289eeae7543e1ae18"}, - {file = "wrapt-1.17.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:273a736c4645e63ac582c60a56b0acb529ef07f78e08dc6bfadf6a46b19c0da7"}, - {file = "wrapt-1.17.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5531d911795e3f935a9c23eb1c8c03c211661a5060aab167065896bbf62a5f85"}, - {file = "wrapt-1.17.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0610b46293c59a3adbae3dee552b648b984176f8562ee0dba099a56cfbe4df1f"}, - {file = "wrapt-1.17.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b32888aad8b6e68f83a8fdccbf3165f5469702a7544472bdf41f582970ed3311"}, - {file = "wrapt-1.17.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cccf4f81371f257440c88faed6b74f1053eef90807b77e31ca057b2db74edb1"}, - {file = "wrapt-1.17.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8a210b158a34164de8bb68b0e7780041a903d7b00c87e906fb69928bf7890d5"}, - {file = "wrapt-1.17.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:79573c24a46ce11aab457b472efd8d125e5a51da2d1d24387666cd85f54c05b2"}, - {file = "wrapt-1.17.3-cp311-cp311-win32.whl", hash = "sha256:c31eebe420a9a5d2887b13000b043ff6ca27c452a9a22fa71f35f118e8d4bf89"}, - {file = "wrapt-1.17.3-cp311-cp311-win_amd64.whl", hash = "sha256:0b1831115c97f0663cb77aa27d381237e73ad4f721391a9bfb2fe8bc25fa6e77"}, - {file = "wrapt-1.17.3-cp311-cp311-win_arm64.whl", hash = "sha256:5a7b3c1ee8265eb4c8f1b7d29943f195c00673f5ab60c192eba2d4a7eae5f46a"}, - {file = "wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0"}, - {file = "wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba"}, - {file = "wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd"}, - {file = "wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828"}, - {file = "wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9"}, - {file = "wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396"}, - {file = "wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc"}, - {file = "wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe"}, - {file = "wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c"}, - {file = "wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6"}, - {file = "wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0"}, - {file = "wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77"}, - {file = "wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7"}, - {file = "wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277"}, - {file = "wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d"}, - {file = "wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa"}, - {file = "wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050"}, - {file = "wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8"}, - {file = "wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb"}, - {file = "wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16"}, - {file = "wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39"}, - {file = "wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235"}, - {file = "wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c"}, - {file = "wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b"}, - {file = "wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa"}, - {file = "wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7"}, - {file = "wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4"}, - {file = "wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10"}, - {file = "wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6"}, - {file = "wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58"}, - {file = "wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a"}, - {file = "wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067"}, - {file = "wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454"}, - {file = "wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e"}, - {file = "wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f"}, - {file = "wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056"}, - {file = "wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804"}, - {file = "wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977"}, - {file = "wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116"}, - {file = "wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6"}, - {file = "wrapt-1.17.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:70d86fa5197b8947a2fa70260b48e400bf2ccacdcab97bb7de47e3d1e6312225"}, - {file = "wrapt-1.17.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df7d30371a2accfe4013e90445f6388c570f103d61019b6b7c57e0265250072a"}, - {file = "wrapt-1.17.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:caea3e9c79d5f0d2c6d9ab96111601797ea5da8e6d0723f77eabb0d4068d2b2f"}, - {file = "wrapt-1.17.3-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:758895b01d546812d1f42204bd443b8c433c44d090248bf22689df673ccafe00"}, - {file = "wrapt-1.17.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b551d101f31694fc785e58e0720ef7d9a10c4e62c1c9358ce6f63f23e30a56"}, - {file = "wrapt-1.17.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:656873859b3b50eeebe6db8b1455e99d90c26ab058db8e427046dbc35c3140a5"}, - {file = "wrapt-1.17.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a9a2203361a6e6404f80b99234fe7fb37d1fc73487b5a78dc1aa5b97201e0f22"}, - {file = "wrapt-1.17.3-cp38-cp38-win32.whl", hash = "sha256:55cbbc356c2842f39bcc553cf695932e8b30e30e797f961860afb308e6b1bb7c"}, - {file = "wrapt-1.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad85e269fe54d506b240d2d7b9f5f2057c2aa9a2ea5b32c66f8902f768117ed2"}, - {file = "wrapt-1.17.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ce38e66630599e1193798285706903110d4f057aab3168a34b7fdc85569afc"}, - {file = "wrapt-1.17.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65d1d00fbfb3ea5f20add88bbc0f815150dbbde3b026e6c24759466c8b5a9ef9"}, - {file = "wrapt-1.17.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7c06742645f914f26c7f1fa47b8bc4c91d222f76ee20116c43d5ef0912bba2d"}, - {file = "wrapt-1.17.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e18f01b0c3e4a07fe6dfdb00e29049ba17eadbc5e7609a2a3a4af83ab7d710a"}, - {file = "wrapt-1.17.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f5f51a6466667a5a356e6381d362d259125b57f059103dd9fdc8c0cf1d14139"}, - {file = "wrapt-1.17.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:59923aa12d0157f6b82d686c3fd8e1166fa8cdfb3e17b42ce3b6147ff81528df"}, - {file = "wrapt-1.17.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:46acc57b331e0b3bcb3e1ca3b421d65637915cfcd65eb783cb2f78a511193f9b"}, - {file = "wrapt-1.17.3-cp39-cp39-win32.whl", hash = "sha256:3e62d15d3cfa26e3d0788094de7b64efa75f3a53875cdbccdf78547aed547a81"}, - {file = "wrapt-1.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:1f23fa283f51c890eda8e34e4937079114c74b4c81d2b2f1f1d94948f5cc3d7f"}, - {file = "wrapt-1.17.3-cp39-cp39-win_arm64.whl", hash = "sha256:24c2ed34dc222ed754247a2702b1e1e89fdbaa4016f324b4b8f1a802d4ffe87f"}, - {file = "wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22"}, - {file = "wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] [[package]] name = "yarl" -version = "1.22.0" +version = "1.20.1" description = "Yet another URL library" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, - {file = "yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb"}, - {file = "yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737"}, - {file = "yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467"}, - {file = "yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea"}, - {file = "yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca"}, - {file = "yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6"}, - {file = "yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e"}, - {file = "yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6"}, - {file = "yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e"}, - {file = "yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca"}, - {file = "yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b"}, - {file = "yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2"}, - {file = "yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82"}, - {file = "yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d"}, - {file = "yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520"}, - {file = "yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8"}, - {file = "yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c"}, - {file = "yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a"}, - {file = "yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2"}, - {file = "yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02"}, - {file = "yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67"}, - {file = "yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95"}, - {file = "yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d"}, - {file = "yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3"}, - {file = "yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708"}, - {file = "yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f"}, - {file = "yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62"}, - {file = "yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03"}, - {file = "yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249"}, - {file = "yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683"}, - {file = "yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da"}, - {file = "yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd"}, - {file = "yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da"}, - {file = "yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2"}, - {file = "yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79"}, - {file = "yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca"}, - {file = "yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b"}, - {file = "yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093"}, - {file = "yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c"}, - {file = "yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e"}, - {file = "yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27"}, - {file = "yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3aa27acb6de7a23785d81557577491f6c38a5209a254d1191519d07d8fe51748"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:af74f05666a5e531289cb1cc9c883d1de2088b8e5b4de48004e5ca8a830ac859"}, - {file = "yarl-1.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62441e55958977b8167b2709c164c91a6363e25da322d87ae6dd9c6019ceecf9"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b580e71cac3f8113d3135888770903eaf2f507e9421e5697d6ee6d8cd1c7f054"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e81fda2fb4a07eda1a2252b216aa0df23ebcd4d584894e9612e80999a78fd95b"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:99b6fc1d55782461b78221e95fc357b47ad98b041e8e20f47c1411d0aacddc60"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:088e4e08f033db4be2ccd1f34cf29fe994772fb54cfe004bbf54db320af56890"}, - {file = "yarl-1.22.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4e1f6f0b4da23e61188676e3ed027ef0baa833a2e633c29ff8530800edccba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:84fc3ec96fce86ce5aa305eb4aa9358279d1aa644b71fab7b8ed33fe3ba1a7ca"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5dbeefd6ca588b33576a01b0ad58aa934bc1b41ef89dee505bf2932b22ddffba"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14291620375b1060613f4aab9ebf21850058b6b1b438f386cc814813d901c60b"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a4fcfc8eb2c34148c118dfa02e6427ca278bfd0f3df7c5f99e33d2c0e81eae3e"}, - {file = "yarl-1.22.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:029866bde8d7b0878b9c160e72305bbf0a7342bcd20b9999381704ae03308dc8"}, - {file = "yarl-1.22.0-cp39-cp39-win32.whl", hash = "sha256:4dcc74149ccc8bba31ce1944acee24813e93cfdee2acda3c172df844948ddf7b"}, - {file = "yarl-1.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:10619d9fdee46d20edc49d3479e2f8269d0779f1b031e6f7c2aa1c76be04b7ed"}, - {file = "yarl-1.22.0-cp39-cp39-win_arm64.whl", hash = "sha256:dd7afd3f8b0bfb4e0d9fc3c31bfe8a4ec7debe124cfd90619305def3c8ca8cd2"}, - {file = "yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff"}, - {file = "yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71"}, +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" +files = [ + {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4"}, + {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a"}, + {file = "yarl-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23"}, + {file = "yarl-1.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24"}, + {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13"}, + {file = "yarl-1.20.1-cp310-cp310-win32.whl", hash = "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8"}, + {file = "yarl-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16"}, + {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e"}, + {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b"}, + {file = "yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8"}, + {file = "yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1"}, + {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e"}, + {file = "yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773"}, + {file = "yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e"}, + {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9"}, + {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a"}, + {file = "yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd"}, + {file = "yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a"}, + {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004"}, + {file = "yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5"}, + {file = "yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698"}, + {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a"}, + {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3"}, + {file = "yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5"}, + {file = "yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b"}, + {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1"}, + {file = "yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7"}, + {file = "yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c"}, + {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d"}, + {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf"}, + {file = "yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3"}, + {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458"}, + {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e"}, + {file = "yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d"}, + {file = "yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f"}, + {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3"}, + {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b"}, + {file = "yarl-1.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000"}, + {file = "yarl-1.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8"}, + {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d"}, + {file = "yarl-1.20.1-cp39-cp39-win32.whl", hash = "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06"}, + {file = "yarl-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00"}, + {file = "yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77"}, + {file = "yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac"}, ] [package.dependencies] @@ -4953,7 +4850,7 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +markers = "python_version >= \"3.12\" or python_version == \"3.11\"" files = [ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, @@ -4969,5 +4866,5 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" -python-versions = "^3.11" -content-hash = "02b458d29498290917a02277daf00235fe7c5eeb349c80697aa740c0806f665d" +python-versions = ">=3.11,<4.0" +content-hash = "9b62f0cbd0b58cae1ffcbffc39cae2005ff8cc7048e7bb17ef4b08e37359f26d" diff --git a/api/pyproject.toml b/api/pyproject.toml index 0b922bbfb8..13c5772ce7 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -1,11 +1,8 @@ [project] name = "api" -version = "0.62.0" +version = "0.50.3" description = "Agenta API" -authors = [ - { name = "Mahmoud Mabrouk", email = "mahmoud@agenta.ai" }, - { name = "Juan Vega", email = "jp@agenta.ai" } -] +authors = [{ name = "Mahmoud Mabrouk", email = "mahmoud@agenta.ai" }] [tool.poetry] package-mode = false # use pyproject.toml as dependency management and not for packaging @@ -15,59 +12,66 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry.dependencies] -python = "^3.11" -fastapi = "^0.116.1" -pydantic = "^2.11.7" -uvicorn = "^0.34.3" -redis = "^6.4.0" -sendgrid = "^6.12.4" -restrictedpython = { version = "^8.0", python = ">=3.11,<3.14" } -celery = "^5.5.3" -newrelic = "^10.17.0" -openai = ">=1.106.0" -sqlalchemy = "^2.0.43" +python = ">=3.11,<4.0" +fastapi = "^0.115.4" +pydantic = "^2.7.4" +toml = "^0.10.2" +uvicorn = "^0.22.0" +motor = "^3.1.2" +python-multipart = "^0.0.18" +backoff = "^2.2.1" +redis = "^6.1.0" +sendgrid = "^6.10.0" +restrictedpython = { version = "^8.0", python = ">=3.11,<3.12" } +pytest-mock = "^3.11.1" +boto3 = "^1.28.63" +asyncer = "^0.0.2" +anyio = "==3.7.1" +kubernetes = "^28.1.0" +celery = "^5.3.6" +watchdog = { extras = ["watchmedo"], version = "^3.0.0" } +beanie = "^1.25.0" +newrelic = "^10.13.0" +aioboto3 = "^12.4.0" +openai = "^1.75.0" +sqlalchemy = "^2.0.30" asyncpg = "^0.30.0" +psycopg2-binary = "^2.9.9" uuid-utils = "^0.10.0" -alembic = "^1.16.5" -numpy = "^2.3.2" +sqlalchemy-json = "^0.7.0" +tqdm = "^4.66.6" +alembic = "^1.13.2" +numpy = "1.26.3" autoevals = "^0.0.83" -supertokens-python = "^0.29.2" -opentelemetry-proto = "^1.36.0" -posthog = "^3.25.0" +supertokens-python = "^0.29.0" +opentelemetry-proto = ">=1.27.0,<2.0.0" +litellm = "^1.67.5" +jinja2 = "^3.1.6" +click = "^8.1.8" +posthog = "^3.23.0" stripe = "^11.6.0" -structlog= "^25.4.0" -httpx = "^0.28.1" -genson = "^1.3.0" -jsonschema = "^4.23.0" -orjson = "^3.11.3" -pandas = "^2.3.2" -googleapis-common-protos = "^1.70.0" -watchdog = { extras = ["watchmedo"], version = "^3.0.0" } -sqlalchemy-json = "^0.7.0" -python-multipart = "^0.0.20" -gunicorn = "^23.0.0" -python-jsonpath = "^2.0.0" +structlog= "^25.2.0" +httpx = ">=0.28.0" +genson = ">=1.3.0" +jsonschema = ">=4.23.0" +orjson = ">=3.10.18" +pandas = ">=2.2.3" +googleapis-common-protos = ">=1.60.0" -# opentelemetry-api = "^1.36.0" -# opentelemetry-sdk = "^1.36.0" -# opentelemetry-exporter-otlp-proto-http = "^1.36.0" +# opentelemetry-api = ">=1.27.0,<2.0.0" +# opentelemetry-sdk = ">=1.27.0,<2.0.0" +# opentelemetry-exporter-otlp-proto-http =">=1.27.0,<2.0.0" # protobuf = "<5.0.0" # audit fixes -h11 = "^0.16.0" +h11 = ">=0.16.0" ecdsa = "^0.19.1" -bson = "^0.5.10" -agenta = ">=0.61.0" -tiktoken = "0.11.0" - -google-auth = ">=2.23,<3" +gunicorn = "^23.0.0" [tool.poetry.group.dev.dependencies] -pytest = "^8.4.2" +pytest = "^7.3.1" pytest-asyncio = "^0.21.1" faker = "^23.2.0" pexpect = "^4.9.0" pytest-xdist = "^3.6.1" pytz = "^2024.2" -pytest-mock = "^3.11.1" -click = "^8.1.8" diff --git a/docs/blog/entries/annotate-your-llm-response-preview.mdx b/docs/blog/entries/annotate-your-llm-response-preview.mdx index ac2443ce74..7c70f71e8d 100644 --- a/docs/blog/entries/annotate-your-llm-response-preview.mdx +++ b/docs/blog/entries/annotate-your-llm-response-preview.mdx @@ -20,7 +20,7 @@ This is useful to: - Run custom evaluation workflows - Measure application performance in real-time -Check out the how to [annotate traces from API](/observability/trace-with-python-sdk/annotate-traces) for more details. Or try our new tutorial (available as [jupyter notebook](https://github.com/Agenta-AI/agenta/blob/main/examples/jupyter/capture_user_feedback.ipynb)) [here](/tutorials/cookbooks/capture-user-feedback). +Check out the how to [annotate traces from API](/evaluation/annotate-api) for more details. Or try our new tutorial (available as [jupyter notebook](https://github.com/Agenta-AI/agenta/blob/main/examples/jupyter/capture_user_feedback.ipynb)) [here](/tutorials/cookbooks/capture-user-feedback). Ask AI feature in documentation - - ---- diff --git a/docs/blog/entries/filtering-traces-by-annotation.mdx b/docs/blog/entries/filtering-traces-by-annotation.mdx deleted file mode 100644 index e75f09081e..0000000000 --- a/docs/blog/entries/filtering-traces-by-annotation.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Filtering Traces by Annotation" -slug: filtering-traces-by-annotation -date: 2025-10-14 -tags: [v0.58.0] ---- - -import Image from "@theme/IdealImage"; - - -We rebuilt the filtering system in observability. We added a new dropdown with more options. Additionally, we added a new annotation filtering. You can now filter and search traces based on their annotations. This feature helps you find traces with low scores or bad feedback quickly. - -### New Filter Options - -The new dropdown is simpler and gives you more options. You can now filter by: -- **Span status**: Find successful or failed spans -- **Input keys**: Search for specific inputs in your spans -- **App or environment**: Filter traces from specific apps or environments -- **Any key within your span**: Search custom data in your trace structure - -Complete observability filters - -### Annotation Filtering - -Filter traces based on evaluations and feedback: -- **Evaluator results**: Find spans evaluated by a specific evaluator -- **User feedback**: Search for spans with feedback like `success=True` - -Annotation filtering interface - -This feature enables powerful workflows: - -1. **Capture user feedback** from your application using our API ([see tutorial](/tutorials/cookbooks/capture-user-feedback)) -2. **Filter traces** to find those with bad feedback or low scores -3. **Add them to test sets** to track problematic cases -4. **Improve your prompts** based on real user feedback - -The filtering system makes it easy to turn production issues into test cases. - ---- diff --git a/docs/blog/entries/major-playground-improvements-and-enhancements.mdx b/docs/blog/entries/major-playground-improvements-and-enhancements.mdx deleted file mode 100644 index 7571c9ac48..0000000000 --- a/docs/blog/entries/major-playground-improvements-and-enhancements.mdx +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Major Playground Improvements and Enhancements" -slug: major-playground-improvements-and-enhancements -date: 2025-08-07 -tags: [v0.50.5] ---- - -```mdx-code-block -import Image from "@theme/IdealImage"; -``` - -
- -
- -We've made lots of improvements to the playground. Here are some of the highlights: - -## JSON Editor Improvements - -**Enhanced Error Display and Editing** - -The JSON editor now provides clearer error messages and improved editing functionality. We've fixed issues with error display that previously made it difficult to debug JSON configuration problems. - -**Undo Support with Ctrl+Z** - -You can now use Ctrl+Z (or Cmd+Z on Mac) to undo changes in the JSON editor, making it much easier to iterate on complex JSON configurations without fear of losing your work. - -**Bug Fix: JSON Field Order Preservation** - -The structured output JSON field order is now preserved throughout the system. This is crucial when working with LLMs that are sensitive to the ordering of JSON fields in their responses. - -Previously, JSON objects might have their field order changed during processing, which could affect LLM behavior and evaluation consistency. Now, the exact order you define is maintained across all operations. - -## Playground Improvements - -**Dynamic variables** - -We've improved the editor behavior with dynamic variables in the prompt. - -**Markdown and Text View Toggle** - -You can now switch between markdown and text view for messages. - -**Collapsible Interface Elements** - -We've added the ability to collapse various sections of the playground interface, helping you focus on what matters most for your current task. - -**Collapsible Test Cases for Large Sets** - -When loading large test sets, you can now collapse individual test cases to better manage the interface. - -**Visual diff when committing changes** - -The playground now shows a visual diff when you're committing changes, making it easy to review exactly what modifications you're about to save. - - - - ---- diff --git a/docs/blog/entries/more-reliable-evaluations.mdx b/docs/blog/entries/more-reliable-evaluations.mdx index 7c1287fb95..c5bb504702 100644 --- a/docs/blog/entries/more-reliable-evaluations.mdx +++ b/docs/blog/entries/more-reliable-evaluations.mdx @@ -32,6 +32,8 @@ We have worked extensively on improving the **reliability of evaluations**. Spec - We fixed small UI issues with large output in human evaluations. - We have added a new export button in the evaluation view to export the results as a CSV file. +Additionally, we have added a new [Cookbook for run evaluation using the SDK](/tutorials/sdk/evaluate-with-SDK). + In **observability**: - We have added a **new integration with [Litellm](https://litellm.ai/)** to automatically trace all LLM calls done through it. diff --git a/docs/blog/entries/multiple-metrics-in-human-evaluation.mdx b/docs/blog/entries/multiple-metrics-in-human-evaluation.mdx deleted file mode 100644 index 203f3c8db9..0000000000 --- a/docs/blog/entries/multiple-metrics-in-human-evaluation.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Multiple Metrics in Human Evaluation" -slug: multiple-metrics-in-human-evaluation -date: 2025-09-09 -tags: [v0.51.0] ---- - -We spent the past months rethinking how evaluation should work. Today we're announcing one of the first big improvements. - -The fastest teams building LLM apps were using human evaluation to check their outputs before going live. Agenta was helping them do this in minutes. - -But we also saw that they were limited. You could only score the outputs with one metric. - -That's why we rebuilt the human evaluation workflow. - -Now you can set multiple evaluators and metrics and use them to score the outputs. This lets you evaluate the same output on different metrics like **relevance** or **completeness**. You can also create binary, numerical scores, or even use strings for **comments** or **expected answer**. - -This unlocks a whole new set of use cases: - -- Compare your prompts on multiple metrics and understand where you can improve. -- Turn your annotations into test sets and use them in prompt engineering. For instance, you can add comments that help you later in improve your prompts. -- Use human evaluation to bootstrap automatic evaluation. You can annotate your outputs with the expected answer or a rubic, then use it to set up an automatic evaluation. - - -Watch the video below and read the [post](/changelog/multiple-metrics-in-human-evaluation) for more details. Or check out the [docs](/evaluation/human-evaluation/quick-start) to learn how to use the new human evaluation workflow. - ---- \ No newline at end of file diff --git a/docs/blog/entries/new-evaluation-results-dashboard.mdx b/docs/blog/entries/new-evaluation-results-dashboard.mdx deleted file mode 100644 index 8eb0b740ec..0000000000 --- a/docs/blog/entries/new-evaluation-results-dashboard.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "New Evaluation Results Dashboard" -slug: new-evaluation-results-dashboard -date: 2025-09-26 -tags: [v0.54.0] ---- - -We rebuilt the evaluation results dashboard. Now you can check your results faster and see how well your AI performs. - -## What's New - -### **Charts and Graphs** -We added charts that show your AI's performance. You can quickly spot problems and see patterns in your data. - -### **Compare Results Side by Side** -Compare multiple tests at once. See which prompts or models work better. View charts and detailed results together. - -### **Better Results Table** -Results now show in a clean table format. It works great for small tests (10 cases) and big tests (10,000+ cases). The page loads fast no matter how much data you have. - -### **Detailed View** -Click on any result to see more details. Find out why a test passed or failed. Get the full picture of what happened. - -### **See Your Settings** -Check exactly which settings you used for each test. This helps you repeat successful tests and understand your results better. - -### **Name Your Tests** -Give your tests names and descriptions. Stay organized and help your team understand what each test does. - - -
- -
diff --git a/docs/blog/entries/new-onboarding-flow.mdx b/docs/blog/entries/new-onboarding-flow.mdx index 189ffb75e9..e2cdc0ac28 100644 --- a/docs/blog/entries/new-onboarding-flow.mdx +++ b/docs/blog/entries/new-onboarding-flow.mdx @@ -38,4 +38,6 @@ We've redesigned our platform's onboarding to make getting started simpler and m - Enhanced frontend performance - Fixed scroll behavior in trace view +You can check out the tutorial for the RAG demo project [here](/tutorials/cookbooks/RAG-QA-docs). + --- diff --git a/docs/blog/entries/observability-and-prompt-management.mdx b/docs/blog/entries/observability-and-prompt-management.mdx index e36a5960d2..d6cbb6d1a2 100644 --- a/docs/blog/entries/observability-and-prompt-management.mdx +++ b/docs/blog/entries/observability-and-prompt-management.mdx @@ -40,11 +40,11 @@ We’ll publish a full blog post soon, but here’s a quick look at what the new **Next: Prompt Management** -We’ve completely rewritten the [prompt management SDK](/prompt-engineering/managing-prompts-programatically/setup), giving you full CRUD capabilities for prompts and configurations. This includes creating, updating, reading history, deploying new versions, and deleting old ones. You can find a first tutorial for this [here](/tutorials/sdk/manage-prompts-with-SDK). +We’ve completely rewritten the [prompt management SDK](/prompt-engineering/overview), giving you full CRUD capabilities for prompts and configurations. This includes creating, updating, reading history, deploying new versions, and deleting old ones. You can find a first tutorial for this [here](/tutorials/sdk/manage-prompts-with-SDK). **And finally: LLM-as-a-Judge Overhaul** -We've made significant upgrades to the [LLM-as-a-Judge evaluator](/evaluation/configure-evaluators/llm-as-a-judge). It now supports prompts with multiple messages and has access to all variables in a test case. You can also switch models (currently supporting OpenAI and Anthropic). These changes make the evaluator much more flexible, and we're seeing better results with it. +We’ve made significant upgrades to the [LLM-as-a-Judge evaluator](/evaluation/evaluators/llm-as-a-judge). It now supports prompts with multiple messages and has access to all variables in a test case. You can also switch models (currently supporting OpenAI and Anthropic). These changes make the evaluator much more flexible, and we’re seeing better results with it. - -### [Documentation Overhaul](/changelog/documentation-architecture-overhaul) - -_3 November 2025_ - -**v0.59.10** - -Ask AI feature in documentation - -We've completely rewritten and restructured our documentation with a new architecture. This is one of the largest updates we've made, involving a near-complete rewrite of existing content. - -Key improvements include: -- **[Diataxis Framework](https://diataxis.fr/)**: Organized content into Tutorials, How-to Guides, Reference, and Explanation sections for better discoverability -- **[Expanded Observability Docs](/observability/overview)**: Added missing documentation for tracing, annotations, and observability features -- **[JavaScript/TypeScript Support](/observability/quick-start-opentelemetry)**: Added code examples and documentation for JavaScript developers alongside Python -- **Ask AI Feature**: Ask questions directly to the documentation for instant answers - ---- - -### [Vertex AI Provider Support](/changelog/vertex-ai-provider-support) - -_24 October 2025_ - -**v0.59.6** - -We've added support for Google Cloud's Vertex AI platform. You can now use Gemini models and other Vertex AI partner models in the playground, configure them in the Model Hub, and access them through the Gateway using InVoke endpoints. - -Check out the documentation for [configuring Vertex AI models](/prompt-engineering/playground/custom-providers#configuring-vertex-ai). - ---- - -### [Filtering Traces by Annotation](/changelog/filtering-traces-by-annotation) - -_14 October 2025_ - -**v0.58.0** -Annotation filtering interface - - -You can now filter and search traces based on their annotations. This helps you find traces with low scores or bad feedback quickly. - -We rebuilt the filtering system in observability with a simpler dropdown and more options. You can now filter by span status, input keys, app or environment references, and any key within your span. - -The new annotation filtering lets you find: -- Spans evaluated by a specific evaluator -- Spans with user feedback like `success=True` - - -This enables powerful workflows: [capture user feedback](/tutorials/cookbooks/capture-user-feedback) from your app, filter to find traces with bad feedback, add them to test sets, and improve your prompts based on real user data. - ---- - -### [New Evaluation Results Dashboard](/changelog/new-evaluation-results-dashboard) - -_26 September 2025_ - -**v0.54.0** - -We've completely redesigned the evaluation results dashboard. You can analyse your evaluation results more easily and understand performance across different metrics. - -Here's what's new: - -- **Metrics plots**: We've added plots for all the evaluator metrics. You can not see the distribution of the results and easily spot outliers. -- **Side-by-side comparison**: You can now compare multiple evaluations simultaneously. You can compare the plots but also the single outputs. -- **Improved test cases view**: The results are now displayed in a tabular format works both for small and large datasets. -- **Focused detail view**: A new focused drawer lets you examine individual data points in more details. It's very helpful if your data is large. -- **Configuration view**: See exactly which configurations were used in each evaluation -- **Evaluation Run naming and descriptions**: Add names and descriptions to your evaluation runs to organize things better. - -
- -
- ---- - -### [Deep URL Support for Sharable Links](/changelog/deep-url-support-for-sharable-links) - -_24 September 2025_ - -**v0.53.0** - -URLs across Agenta now include workspace context, making them fully shareable between team members. Previously, URLs would always point to the default workspace, causing issues when refreshing pages or sharing links. - -Now you can deep link to almost anything in the platform - prompts, evaluations, and more - in any workspace. Share links directly with team members and they'll see exactly what you intended, regardless of their default workspace settings. - ---- - -### [Major Speed Improvements and Bug Fixes](/changelog/speed-improvements-in-the-playground) - -_19 September 2025_ - -**v0.52.5** - -We rewrote most of Agenta's frontend. You'll see much faster speeds when you create prompts or use the playground. - -We also made many improvements and fixed bugs: - -**Improvements:** - -- [LLM-as-a-judge](/evaluation/configure-evaluators/llm-as-a-judge) now uses double curly braces `{{}}` instead of single curly braces `{` and `}`. This matches how normal prompts work. Old LLM-as-a-judge prompts with single curly braces still work. We updated the LLM-as-a-judge playground to make editing prompts easier. - -**Self-hosting:** - -- You can now use [an external Redis instance](/self-host/configuration#redis-caching) for caching by setting it as an environment variable - -**Bug fixes:** - -- Fixed the [custom workflow quick start tutorial](/custom-workflows/quick-start) and examples -- Fixed SDK compatibility issues with Python 3.9 -- Fixed default filtering in observability dashboard -- Fixed error handling in the evaluator playground -- Fixed the Tracing SDK to allow instrumenting streaming responses and overriding OTEL environment variables ---- - -### [Multiple Metrics in Human Evaluation](/changelog/multiple-metrics-in-human-evaluation) - -_9 September 2025_ - -**v0.51.0** - -We rebuilt the human evaluation workflow from scratch. Now you can set multiple evaluators and metrics and use them to score the outputs. - -This lets you evaluate the same output on different metrics like **relevance** or **completeness**. You can also create binary, numerical scores, or even use strings for **comments** or **expected answer**. - -Watch the video below and read the [post](/changelog/multiple-metrics-in-human-evaluation) for more details. Or check out the [docs](/evaluation/human-evaluation/quick-start) to learn how to use the new human evaluation workflow. - -
- -
- ---- - -### [DSPy Integration](/observability/integrations/dspy) - -_29 August 2025_ - -We've added DSPy integration to Agenta. You can now trace and debug your DSPy applications with Agenta. - -DSPy integration with Agenta - -[**View the full DSPy integration →**](/observability/integrations/dspy) - ---- - -### [Open-sourcing our Product Roadmap](/roadmap) - -_12 August 2025_ - -We've made our product roadmap completely transparent and community-driven. - -You can now see exactly what we're building, what's shipped, and what's coming next. Plus vote on features that matter most to you. - -**Why we're doing this:** We believe open-source startups succeed when they create the most value possible, and the best way to do that is by building with our community, not in isolation. Up until now, we've been secretive with our roadmap, but we're losing something important: your feedback and the ability to let you shape our direction. Today we're open-sourcing our roadmap because we want to build a community of owners, not just passive users. - -[**View the full roadmap →**](/roadmap) - ---- - -### [Major Playground Improvements and Enhancements](/changelog/major-playground-improvements-and-enhancements) -_7 August 2025_ -**v0.50.5** - -We've made significant improvements to the playground. Key features include: -- Improving the error handling in JSON editor for structured output -- Preventing the JSON field order from being changed -- Visual diff when committing changes -- Markdown and text view toggle -- Collapsible interface elements -- Collapsible test cases for large sets - -
- -
- - ---- - ### [Support for Images in the Playground](/changelog/support-for-images-in-playground) _29 July 2025_ **v0.50.0** @@ -270,7 +61,7 @@ This is useful to: - Run custom evaluation workflows - Measure application performance in real-time -Check out the how to [annotate traces from API](/observability/trace-with-python-sdk/annotate-traces) for more details. Or try our new tutorial (available as [jupyter notebook](https://github.com/Agenta-AI/agenta/blob/main/examples/jupyter/capture_user_feedback.ipynb)) [here](/tutorials/cookbooks/capture-user-feedback). +Check out the how to [annotate traces from API](/evaluation/annotate-api) for more details. Or try our new tutorial (available as [jupyter notebook](https://github.com/Agenta-AI/agenta/blob/main/examples/jupyter/capture_user_feedback.ipynb)) [here](/tutorials/cookbooks/capture-user-feedback). +
+ + +
+ +
+ +
+ + +### Run evaluations + +
+ +
+ +
+ +
+ +
+
+ +### Available evaluators + +| **Evaluator Name** | **Use Case** | **Type** | **Description** | +| ------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------ | -------------------------------------------------------------------------------- | +| [Exact Match](/evaluation/evaluators/classification-entiry-extraction#exact-match) | Classification/Entity Extraction | Pattern Matching | Checks if the output exactly matches the expected result. | +| [Contains JSON](/evaluation/evaluators/classification-entiry-extraction#contains-json) | Classification/Entity Extraction | Pattern Matching | Ensures the output contains valid JSON. | +| [Regex Test](/evaluation/evaluators/pattern-matching#regular-expression) | Classification/Entity Extraction | Pattern Matching | Checks if the output matches a given regex pattern. | +| [JSON Field Match](/evaluation/evaluators/classification-entiry-extraction#json-field-match) | Classification/Entity Extraction | Pattern Matching | Compares specific fields within JSON data. | +| [JSON Diff Match](/evaluation/evaluators/classification-entiry-extraction#json-diff-match) | Classification/Entity Extraction | Similarity Metrics | Compares generated JSON with a ground truth JSON based on schema or values. | +| [Similarity Match](/evaluation/evaluators/semantic-similarity#similarity-match) | Text Generation / Chatbot | Similarity Metrics | Compares generated output with expected using Jaccard similarity. | +| [Semantic Similarity Match](/evaluation/evaluators/semantic-similarity#semantic-similarity-match) | Text Generation / Chatbot | Semantic Analysis | Compares the meaning of the generated output with the expected result. | +| [Starts With](/evaluation/evaluators/pattern-matching#starts-with) | Text Generation / Chatbot | Pattern Matching | Checks if the output starts with a specified prefix. | +| [Ends With](/evaluation/evaluators/pattern-matching#ends-with) | Text Generation / Chatbot | Pattern Matching | Checks if the output ends with a specified suffix. | +| [Contains](/evaluation/evaluators/pattern-matching#contains) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains a specific substring. | +| [Contains Any](/evaluation/evaluators/pattern-matching#contains-any) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains any of a list of substrings. | +| [Contains All](/evaluation/evaluators/pattern-matching#contains-all) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains all of a list of substrings. | +| [Levenshtein Distance](/evaluation/evaluators/semantic-similarity#levenshtein-distance) | Text Generation / Chatbot | Similarity Metrics | Calculates the Levenshtein distance between output and expected result. | +| [LLM-as-a-judge](/evaluation/evaluators/llm-as-a-judge) | Text Generation / Chatbot | LLM-based | Sends outputs to an LLM model for critique and evaluation. | +| [RAG Faithfulness](/evaluation/evaluators/rag-evaluators) | RAG / Text Generation / Chatbot | LLM-based | Evaluates if the output is faithful to the retrieved documents in RAG workflows. | +| [RAG Context Relevancy](/evaluation/evaluators/rag-evaluators) | RAG / Text Generation / Chatbot | LLM-based | Measures the relevancy of retrieved documents to the given question in RAG. | +| [Custom Code Evaluation](/evaluation/evaluators/custom-evaluator) | Custom Logic | Custom | Allows users to define their own evaluator in Python. | +| [Webhook Evaluator](/evaluation/evaluators/webhook-evaluator) | Custom Logic | Custom | Sends output to a webhook for external evaluation. | diff --git a/docs/docs/evaluation/01-quick-start-ui.mdx b/docs/docs/evaluation/01-quick-start-ui.mdx deleted file mode 100644 index cbcdacc035..0000000000 --- a/docs/docs/evaluation/01-quick-start-ui.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Quick Start: Evaluation from UI" -sidebar_label: "Quick Start (UI)" -description: "Get started with evaluating your LLM applications using the Agenta web interface" -sidebar_position: 1 ---- - -import { Redirect } from '@docusaurus/router'; - - diff --git a/docs/docs/evaluation/02-create-test-sets.mdx b/docs/docs/evaluation/02-create-test-sets.mdx new file mode 100644 index 0000000000..dd5af47f99 --- /dev/null +++ b/docs/docs/evaluation/02-create-test-sets.mdx @@ -0,0 +1,183 @@ +--- +title: "Create Test Sets" +--- + +```mdx-code-block +import { Stream } from '@cloudflare/stream-react'; +import Image from "@theme/IdealImage"; +``` + +This guide outlines the various methods for creating test sets in Agenta and provides specifications for the test set schema. + +Test sets are one of the most critical components for building reliable LLM-powered applications. They allow you to evaluate your application, find edge cases, prevent regressions, and systematically improve performance over time. + +## What is a Test Set? + +A test set is a collection of test cases, each containing: + +- **Inputs**: The data your LLM application expects (required) +- **Ground Truth**: The expected answer from your application (optional, often stored as "correct_answer") +- **Annotations**: Additional metadata or rules about the test case (optional) + +You can create a test set in Agenta using the following methods: + +- [By uploading a CSV or JSON file](#creating-a-test-set-from-a-csv-or-json) +- [Using the API](#creating-a-test-set-using-the-api) +- [Using the UI](#creatingediting-a-test-set-from-the-ui) +- [From the playground](#creating-a-test-set-from-the-playground) +- [From traces in observability](#adding-data-from-traces) + +## Creating a Test Set from a CSV or JSON + +To create a test set from a CSV or JSON file: + +1. Go to `Test sets` +2. Click `Upload test sets` +3. Select either `CSV` or `JSON` + + + +### CSV Format + +We use CSV with commas (,) as separators and double quotes (") as quote characters. The first row should contain the header with column names. Each input should have its own column. The column containing the reference answer can have any name, but we use "correct_answer" by default. + +:::info +If you choose a different column name for the reference answer, you'll need to configure the evaluator later with that specific name. +::: + +Here's an example of a valid CSV: + +```csv +text,instruction,correct_answer +Hello,How are you?,I'm good. +"Tell me a joke.",Sure, here's one:... +``` + +### JSON Format + +The test set should be in JSON format with the following structure: + +1. A JSON file containing an array of objects. +2. Each object in the array represents a row, with keys as column headers and values as row data. Here's an example of a valid JSON file: + +```json +[ + { "recipe_name": "Chicken Parmesan", "correct_answer": "Chicken" }, + { "recipe_name": "a, special, recipe", "correct_answer": "Beef" } +] +``` + +### Schema for Chat Applications + +For chat applications created using the chat template in Agenta, the input should be saved in the column called `chat`, which would contain the input list of messages: + +```json +[ + { "content": "message.", "role": "user" }, + { "content": "message.", "role": "assistant" } + // Add more messages if necessary +] +``` + +The reference answer column (by default `correct_answer`) should follow the same format: + +```json +{ "content": "message.", "role": "assistant" } +``` + +## Creating a Test Set Using the API + +You can upload a test set using our API. Find the [API endpoint reference here](/reference/api/upload-file). + +Here's an example of such a call: + +**HTTP Request:** + +``` +POST /testsets + +``` + +**Request Body:** + +```json +{ + "name": "testsetname", + "csvdata": [ + { "column1": "row1col1", "column2": "row1col2" }, + { "column1": "row2col1", "column2": "row2col2" } + ] +} +``` + +## Creating/Editing a Test Set from the UI + +To create or edit a test set from the UI: + +1. Go to `Test sets` +2. Choose `Create a test set with UI` or select the test set +3. Name your test set and specify the columns for input types. +4. Add the dataset. + +Remember to click `Save test set` + + + +## Creating a Test Set from the Playground + + +
+ +The playground offers a convenient way to create and add data to a test set. This workflow is useful when you discover interesting cases or edge cases while experimenting with your LLM application. + +To add a data point to a test set from the playground: + +1. Work with your application in the playground +2. When you find an interesting case, click the `Add to test set` button located near the `Run` button +3. A drawer will display showing the inputs and outputs from the playground +4. You can modify inputs and correct answers if needed +5. Select an existing test set to add to, or choose `+Add new` to create a new one +6. Once you're satisfied, click `Add` to finalize + +## Adding Data From Traces + +One of the most valuable sources of test cases is your production data. Traces captured in the Observability view represent real user interactions with your LLM application. + + +
+ +### Adding a Single Trace + +To add a single trace to a test set: + +1. Navigate to the **Observability** view in Agenta +2. Find a trace you want to add to a test set +3. Click the **Add to test set** button at the top of the trace +4. Choose to create a new test set or select an existing one +5. Review the mapping between trace data and test set columns + - Agenta will automatically map the inputs and outputs to appropriate columns + - You can edit the expected answer if you don't agree with the output +6. Click **Save** to add the trace to your test set + +### Adding Multiple Traces at Once + +To efficiently add multiple traces: + +1. In the Observability view, use the search function to filter traces + - For example, search for specific response patterns like "I don't have enough information" +2. Select all relevant traces by checking the boxes next to them +3. Click **Add to test set** +4. Choose an existing test set or create a new one +5. Review the mapping for the traces +6. Click **Save** to add all selected traces to your test set + +## Using Your Test Sets + +Once you have created test sets, you can use them for: + +1. **Playground Iteration**: Load test sets in the playground to test and refine your prompts +2. **Automated Evaluation**: Run systematic evaluations comparing outputs against expected answers +3. **Human Evaluation**: Collect human feedback on your application's performance +4. **Regression Testing**: Ensure new changes don't break existing functionality + +To learn more about using your test sets for evaluation, see our [Evaluation documentation](/evaluation/overview). diff --git a/docs/docs/evaluation/03-concepts.mdx b/docs/docs/evaluation/03-concepts.mdx deleted file mode 100644 index e781a28de1..0000000000 --- a/docs/docs/evaluation/03-concepts.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Concepts" -description: "Understand the key concepts of LLM evaluation in Agenta" -sidebar_position: 3 ---- - -import Image from "@theme/IdealImage"; - -## What is evaluation? - -The key to building production-ready LLM applications is to have a tight feedback loop of prompt engineering and evaluation. Whether you are optimizing a chatbot, working on Retrieval-Augmented Generation (RAG), or fine-tuning a text generation task, evaluation is a critical step to ensure consistent performance across different inputs, models, and parameters. - -## Key concepts - -### Evaluators - -Evaluators are functions that assess the output of an LLM application. - -Evaluators typically take as input: - -- The output of the LLM application -- (Optional) The reference answer (i.e., expected output or ground truth) -- (Optional) The inputs to the LLM application -- Any other relevant data, such as context - -Evaluators return different types of results based on the evaluator type. Simple evaluators return single values like boolean (true/false) or numeric scores. Evaluators with schemas (such as LLM-as-a-Judge or custom evaluators) can return structured results with multiple fields, allowing you to capture various aspects of the evaluation in a single result. - - -### Test sets - -Test sets are collections of test cases used to evaluate your LLM application. Each test case contains: - -- **Inputs**: The data your LLM application expects (required) -- **Ground Truth**: The expected answer from your application (optional, often stored as "correct_answer") -- **Annotations**: Additional metadata or rules about the test case (optional) - -Test sets are critical for: -- Evaluating your application systematically -- Finding edge cases -- Preventing regressions -- Measuring improvements over time - -### Evaluation workflows - -Agenta supports multiple evaluation workflows: - -1. **Automated Evaluation (UI)**: Run evaluations from the web interface with configurable evaluators -2. **Automated Evaluation (SDK)**: Run evaluations programmatically for integration into CI/CD pipelines -3. **Online Evaluation**: Run evaluations on new traces as they are generated by your LLM application -4. **Human Evaluation**: Collect expert feedback and annotations for qualitative assessment - -## Next steps - -- [Configure evaluators](/evaluation/configure-evaluators/overview) for your use case -- [Create test sets](/evaluation/managing-test-sets/upload-csv) from various sources -- [Run your first evaluation](/evaluation/evaluation-from-ui/running-evaluations) from the UI diff --git a/docs/docs/evaluation/03-configure-evaluators.mdx b/docs/docs/evaluation/03-configure-evaluators.mdx new file mode 100644 index 0000000000..04973265ec --- /dev/null +++ b/docs/docs/evaluation/03-configure-evaluators.mdx @@ -0,0 +1,87 @@ +--- +title: "Configure Evaluators" +description: "Set up evaluators for your use case" +--- + +import Image from "@theme/IdealImage"; + +In this guide will show you how to configure evaluators for your LLM application. + +### What are evaluators? + +Evaluators are functions that assess the output of an LLM application. + +Evaluators typically take as input: + +- The output of the LLM application +- (Optional) The reference answer (i.e., expected output or ground truth) +- (Optional) The inputs to the LLM application +- Any other relevant data, such as context + +Evaluators return either a float or a boolean value. + +Figure showing the inputs and outputs of an evaluator. + +### Configuring evaluators + +To create a new evaluator, click on the `Configure Evaluators` button in the `Evaluations` view. + +![The configure evaluators button in agenta.](/images/evaluation/configure-evaluators-1.png) + +### Selecting evaluators + +Agenta offers a growing list of pre-built evaluators suitable for most use cases. We also provide options for [creating custom evaluators](/evaluation/evaluators/custom-evaluator) (by writing your own Python function) or [using webhooks](/evaluation/evaluators/webhook-evaluator) for evaluation. + +
+Available Evaluators + +| **Evaluator Name** | **Use Case** | **Type** | **Description** | +| ------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------ | -------------------------------------------------------------------------------- | +| [Exact Match](/evaluation/evaluators/classification-entiry-extraction#exact-match) | Classification/Entity Extraction | Pattern Matching | Checks if the output exactly matches the expected result. | +| [Contains JSON](/evaluation/evaluators/classification-entiry-extraction#contains-json) | Classification/Entity Extraction | Pattern Matching | Ensures the output contains valid JSON. | +| [Regex Test](/evaluation/evaluators/pattern-matching#regular-expression) | Classification/Entity Extraction | Pattern Matching | Checks if the output matches a given regex pattern. | +| [JSON Field Match](/evaluation/evaluators/classification-entiry-extraction#json-field-match) | Classification/Entity Extraction | Pattern Matching | Compares specific fields within JSON data. | +| [JSON Diff Match](/evaluation/evaluators/classification-entiry-extraction#json-diff-match) | Classification/Entity Extraction | Similarity Metrics | Compares generated JSON with a ground truth JSON based on schema or values. | +| [Similarity Match](/evaluation/evaluators/semantic-similarity#similarity-match) | Text Generation / Chatbot | Similarity Metrics | Compares generated output with expected using Jaccard similarity. | +| [Semantic Similarity Match](/evaluation/evaluators/semantic-similarity#semantic-similarity-match) | Text Generation / Chatbot | Semantic Analysis | Compares the meaning of the generated output with the expected result. | +| [Starts With](/evaluation/evaluators/pattern-matching#starts-with) | Text Generation / Chatbot | Pattern Matching | Checks if the output starts with a specified prefix. | +| [Ends With](/evaluation/evaluators/pattern-matching#ends-with) | Text Generation / Chatbot | Pattern Matching | Checks if the output ends with a specified suffix. | +| [Contains](/evaluation/evaluators/pattern-matching#contains) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains a specific substring. | +| [Contains Any](/evaluation/evaluators/pattern-matching#contains-any) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains any of a list of substrings. | +| [Contains All](/evaluation/evaluators/pattern-matching#contains-all) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains all of a list of substrings. | +| [Levenshtein Distance](/evaluation/evaluators/semantic-similarity#levenshtein-distance) | Text Generation / Chatbot | Similarity Metrics | Calculates the Levenshtein distance between output and expected result. | +| [LLM-as-a-judge](/evaluation/evaluators/llm-as-a-judge) | Text Generation / Chatbot | LLM-based | Sends outputs to an LLM model for critique and evaluation. | +| [RAG Faithfulness](/evaluation/evaluators/rag-evaluators) | RAG / Text Generation / Chatbot | LLM-based | Evaluates if the output is faithful to the retrieved documents in RAG workflows. | +| [RAG Context Relevancy](/evaluation/evaluators/rag-evaluators) | RAG / Text Generation / Chatbot | LLM-based | Measures the relevancy of retrieved documents to the given question in RAG. | +| [Custom Code Evaluation](/evaluation/evaluators/custom-evaluator) | Custom Logic | Custom | Allows users to define their own evaluator in Python. | +| [Webhook Evaluator](/evaluation/evaluators/webhook-evaluator) | Custom Logic | Custom | Sends output to a webhook for external evaluation. | + +
+ +![Screen for selecting an evaluator.](/images/evaluation/configure-evaluators-2.png) + +## Evaluators' settings + +Each evaluator comes with it's unique settings. For instance in the screen below, the JSON field match evaluator requires you to specify which field in the output JSON you need to consider for evaluation. You'll find detailed information about these parameters on each evaluator's documentation page. + +![Screen for configuring an evaluator.](/images/evaluation/configure-evaluators-3.png) + +## Mappings evaluator's inputs to the LLM data + +Evaluators need to know which parts of the data contain the output and the reference answer. Most evaluators allow you to configure this mapping, typically by specifying the name of the column in the test set that contains the `reference answer`. + +For more sophisticated evaluators, such as `RAG evaluators` (_available only in cloud and enterprise versions_), you need to define more complex mappings (see figure below). + +Figure showing how RAGAS faithfulness evaluator is configured in agenta. + +Configuring the evaluator is done by mapping the evaluator inputs to the generation data: + +![Figure showing how RAGAS faithfulness evaluator is configured in agenta.](/images/evaluation/configure_mapping.png) diff --git a/docs/docs/evaluation/04-no-code-evaluation.mdx b/docs/docs/evaluation/04-no-code-evaluation.mdx new file mode 100644 index 0000000000..0323af74bf --- /dev/null +++ b/docs/docs/evaluation/04-no-code-evaluation.mdx @@ -0,0 +1,68 @@ +--- +title: "No-code Evaluation" +description: Run evaluation from the UI. +--- + +import Image from "@theme/IdealImage"; + +This guide will show you how to run evaluations from the UI. + +Before you get started, make sure that you have [created a test set](/evaluation/create-test-sets) and [configured evaluators](/evaluation/configure-evaluators) appropriate for your task. + +## Running Evaluations + +To start an evaluation, navigate to the Evaluations page and click the `Start new evaluation` button. A modal will appear, allowing you to setup the evaluation. + +Start new evaluation + +### Setting Up Evaluation Parameters + +In the modal, specify the following: + +- Testset: Choose the testset(s) for your evaluation. +- Variants: Choose one or more variants to evaluate. +- Evaluators: Pick one or more evaluators for assessment. + +New evaluation modal + +#### Advanced Configuration + +Additional settings allow you to adjust batching and retry parameters for LLM calls. This help mitigating rate limit errors from your LLM provider. + +Advanced configuration options include: + +- **Batch Size:** Number of test cases to run concurrently in each batch (default: 10). +- **Retry Delay:** Time to wait before retrying a failed call (default: 3s). +- **Max Retries:** Maximum number of retry attempts for a failed call (default: 3). +- **Delay Between Batches:** Pause duration between batch runs (default: 5s). + +## Analyzing Evaluation Results + +The main view offers an aggregated summary of results. Each column displays the average score per evaluator for each variant/test set combination. You'll also see average latency, total cost, creation date, and evaluation status. + +For a detailed view of an evaluation, click on a completed evaluation row. + +Detailed evaluation results + +The evaluation table columns show inputs, reference answers used by evaluators, LLM application output, evaluator results, cost, and latency. + +## Comparing Evaluations + +Once evaluations are marked "completed," you can compare two or more evaluations from the same test set. Click the `Compare` button to access the Evaluation comparison view, where you can analyze outputs from multiple evaluations side by side. + +Animation showing how to compare evaluations in Agenta diff --git a/docs/docs/evaluation/05-sdk-evaluation.mdx b/docs/docs/evaluation/05-sdk-evaluation.mdx new file mode 100644 index 0000000000..5f50de5483 --- /dev/null +++ b/docs/docs/evaluation/05-sdk-evaluation.mdx @@ -0,0 +1,144 @@ +--- +title: "Evaluate from SDK" +description: "Run evaluation programmatically from the SDK." +--- + +import Image from "@theme/IdealImage"; + +This guide explains how to run evaluations programmaticaly from the SDK in agenta. We will do the following: + +- Create a test set +- Create and configure an evaluator +- Run an evaluation +- Retrieve the results of evaluations + +## How agenta evaluation works + +In **agenta**, evaluation is a **fully managed service** . It takes place entirely on our backend, and take care of: + +- **Queuing** and managing evaluation jobs +- **Batching** LLM app calls to optimize performance and avoid exceeding rate limits. +- **Handle retries and errors** automatically to ensure robust evaluation runs. + +Our evaluation service takes a set of test sets, evaluators, and app variants and runs asynchronous jobs for evaluation. + +Figure showing how LLM app evaluation infrastructure in Agenta. + +:::info +You can open this guide in a [jupyter notebook](https://github.com/Agenta-AI/agenta/blob/main/cookbook/evaluations_with_sdk.ipynb) +::: + +## 1. Setup + +1. Create an LLM app and a couple of variants in agenta and install our sdk using `pip install -U agenta`. + +2. Retrieve the application id either from the url. + +## 2. Setup the SDK client + +```python + +app_id = "667d8cfad1812781f7e375d9" + +# You can create the API key under the settings page. If you are using the OSS version, you should keep this as an empty string +api_key = "EUqJGOUu.xxxx" + +# Host. +host = "https://cloud.agenta.ai" + +# Initialize the client + +client = AgentaApi(base_url=host + "/api", api_key=api_key) +``` + +## 3. Create a test set + +```python +from agenta.client.types.new_testset import NewTestset + +csvdata = [ + {"country": "france", "capital": "Paris"}, + {"country": "Germany", "capital": "Berlin"} + ] + +response = client.testsets.create_testset(request=NewTestset(name="test set", csvdata=csvdata)) +test_set_id = response.id + +``` + +## 4. Create evaluators + +Let's create a custom code evaluator that return 1.0 if the first letter of the app output is uppercase + +```python +code_snippet = """ +from typing import Dict + +def evaluate( + app_params: Dict[str, str], + inputs: Dict[str, str], + output: str, # output of the llm app + datapoint: Dict[str, str] # contains the testset row +) -> float: + if output and output[0].isupper(): + return 1.0 + else: + return 0.0 +""" + +response = client.evaluators.create_new_evaluator_config(app_id=app_id, name="capital_letter_evaluator", evaluator_key="auto_custom_code_run", settings_values={"code": code_snippet}) +letter_match_eval_id = response.id +``` + +## 5. Run an evaluation + +First let's grab the first variants in the app + +```python +response = client.apps.list_app_variants(app_id=app_id) +print(response) +myvariant_id = response[0].variant_id +``` + +Then , let's start the evaluation jobs + +```python +from agenta.client.types.llm_run_rate_limit import LlmRunRateLimit + +rate_limit_config = LlmRunRateLimit( + batch_size=10, # number of rows to call in parallel + max_retries=3, # max number of time to retry a failed llm call + retry_delay=2, # delay before retrying a failed llm call + delay_between_batches=5, # delay between batches + ) +response = client.evaluations.create_evaluation(app_id=app_id, + variant_ids=[myvariant_id], + testset_id=test_set_id, + evaluators_configs=[letter_match_eval_id], + rate_limit=rate_limit_config) +print(response) +``` + +Now we can check for the status of the job + +```python +client.evaluations.fetch_evaluation_status('667d98fbd1812781f7e3761a') +``` + +As soon as it is done, we can fetch the overall results + +```python +response = client.evaluations.fetch_evaluation_results('667d98fbd1812781f7e3761a') + +results = [(evaluator["evaluator_config"]["name"], evaluator["result"]) for evaluator in response["results"]] +``` + +and the detailed results + +```python +client.evaluations.fetch_evaluation_scenarios(evaluations_ids='667d98fbd1812781f7e3761a') +``` diff --git a/docs/docs/evaluation/06-human_evaluation.mdx b/docs/docs/evaluation/06-human_evaluation.mdx new file mode 100644 index 0000000000..c7a534658d --- /dev/null +++ b/docs/docs/evaluation/06-human_evaluation.mdx @@ -0,0 +1,60 @@ +--- +title: 'Human Evaluation' +--- + +import Image from "@theme/IdealImage"; + +Sometimes, you may need to evaluate the performance of your models using human judgment. This is where the Human Evaluation feature comes in. It allows you to conduct A/B tests and single model tests to evaluate the performance of your models using human judgment. + +## Single Model Evaluation +Single model test allows you to score the performance of a single LLM app manually. + +To start a new evaluation with the single model test, you need to: +- Select a variant would you like to evaluate +- Select a testset you want to use for the evaluation + +To start a new evaluation with the single model test, follow these steps: + +1. Select the variant you would like to evaluate. +2. Choose the testset you want to use for the evaluation. + +Click on the "Start a new evaluation" button to begin the evaluation process. Once the evaluation is initiated, you will be directed to the Single Model Test Evaluation view. Here, you can perform the following actions: + +- Score: Enter a numerical score to evaluate the performance of the chosen variant. +- Additional Notes: Add any relevant notes or comments to provide context or details about the evaluation. +- Export Results: Use the "Export Results" functionality to save and export the evaluation results. + + + + +## A/B Test +A/B tests allow you to compare the performance of two different variants manually. For each data point you can select which variant is better, or if they are equally good or bad. + +To start a new evaluation with an A/B Test, follow these steps: + +1. Select two variants that you would like to evaluate. +2. Choose the testset you want to use for the evaluation. + +### Invite Collaborators + +In an A/B Test, you can invite members of your workspace to collaborate on the evaluation by sharing a link to the evaluation. For information on how to add members to your workspace, please refer to this guide. + +Click on the "Start a new evaluation" button to begin the evaluation process. Once the evaluation is initiated, you will be directed to the A/B Test Evaluation view. Here, you can perform the following actions: + +- Scoring between variants: Evaluate and score the performance of each variant for the expected output. +- Additional Notes: Add any relevant notes or comments to provide context or details about the evaluation. +- Export Results: Use the "Export Results" functionality to save and export the evaluation results. + + + + +## Toggle Evaluation View (Card/Table mode) +You can also switch to the table view for a different perspective in your evaluation. + +### A/B Test View + + + +### Single Model Test View + + diff --git a/docs/docs/evaluation/07-annotate-api.mdx b/docs/docs/evaluation/07-annotate-api.mdx new file mode 100644 index 0000000000..289c6340e1 --- /dev/null +++ b/docs/docs/evaluation/07-annotate-api.mdx @@ -0,0 +1,520 @@ +--- +title: Annotate Traces from API +sidebar_label: "Annotate Traces from API" +description: "Learn how to add annotations to traces using the Agenta API" +--- + +```mdx-code-block +import Image from "@theme/IdealImage"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +``` + +:::info +Annotations are currently in preview. The interface is subject to change. +::: + +Annotations in Agenta let you enrich the traces created by your LLM applications. You can add scores, comments, expected answers and other metrics to help evaluate your application's performance. + +Screenshot showing how annotations appear in the Agenta UI + +## What You Can Do With Annotations + +- Collect user feedback on LLM responses +- Run custom evaluation workflows +- Measure application performance in real-time + +## Understanding How Annotations Work + +Annotations **link** to specific points (spans) in your application traces. You can **link** them to: +- Parent spans (like an agent invocation) +- Child spans (like a single LLM call within a larger process) + +Each annotation can include: +- Numbers (scores, ratings) +- Categories (labels, classifications) +- Text (comments, reasoning) + +### Annotation Structure + +Here's what an annotation looks like: + +```json +{ + "data": { + "outputs": { + "score": 80, + "normalized_score": 0.8, + "reasoning": "The answer is mainly correct" + } + }, + "references": { + "evaluator": { + "slug": "my_evaluator" + } + }, + "links": { + "invocation": { + "trace_id": "47cb4a13b42a47bab2198509543ff14d", + "span_id": "1a9130f6ad398e55" + } + }, + "metadata": { + "someattr": "somevalue" + } +} +``` + +An annotation has four main parts: + +1. **Data**: The actual evaluation content (scores, comments) +2. **References**: Which evaluator to use (will be created automatically if it doesn't exist) +3. **Links**: Which trace and span you're annotating +4. **Metadata** (optional): Any extra information you want to include + +### What You Can Include in Annotations + +Annotations are flexible - you can include whatever makes sense for your evaluation: + +```json +// Just a simple score +{"score": 3} + +// A score with explanation +{"score": 3, "comment": "The response is not grounded"} + +// Multiple metrics with reference information +{"score": 3, "normalized_score": 0.5, "comment": "The response is not grounded", "expected_answer": "The capital of France is Paris"} +``` + +You can use numbers, text, booleans, or categorical values. + +### Connecting Annotations to Traces + +Each annotation links to a specific span in your trace using a `trace_id` and `span_id`. These IDs follow the OpenTelemetry format. + +:::warning +Agenta doesn't check if the trace and span IDs exist. Make sure they're valid before sending. +::: + +### Working with Evaluators + +Every annotation must reference an `Evaluator`, which: +- Defines what your annotation should contain +- Provides context for interpreting the annotation + +If you reference an evaluator that doesn't exist yet, Agenta will automatically create one based on your first annotation. + +You can add multiple annotations from the same evaluator to a single span, which is useful for collecting feedback from different sources. + +### Using Metadata + +The `metadata` field lets you add extra information to your annotation. Use it to store things like user IDs, session information, or other context. + +## Creating Annotations + + + + +```python +import requests + +base_url = "https://cloud.agenta.ai" +headers = { + "Content-Type": "application/json", + "Authorization": "ApiKey YOUR_API_KEY" +} + +# Annotation data +annotation_data = { + "annotation": { + "data": { + "outputs": { + "score": 40, + "reasoning": "Response contains some inaccuracies", + "labels": ["Partially Correct", "Needs Improvement"] + } + }, + "references": { + "evaluator": { + "slug": "content_quality" + } + }, + "links": { + "invocation": { + "trace_id": "47cb4a13b42a47bab2198509543ff14d", + "span_id": "1a9130f6ad398e55" + } + } + } +} + +# Make the API request +response = requests.post( + f"{base_url}/api/preview/annotations", + headers=headers, + json=annotation_data +) + +# Process the response +if response.status_code == 200: + print("Annotation created successfully") + print(response.json()) +else: + print(f"Error: {response.status_code}") + print(response.text) +``` + + + + +```javascript +async function createAnnotation() { + const baseUrl = 'https://cloud.agenta.ai'; + + const headers = { + 'Content-Type': 'application/json', + 'Authorization': 'ApiKey YOUR_API_KEY' + }; + + const annotationData = { + annotation: { + data: { + outputs: { + score: 40, + reasoning: "Response contains some inaccuracies", + labels: ["Partially Correct", "Needs Improvement"] + } + }, + references: { + evaluator: { + slug: "content_quality" + } + }, + links: { + invocation: { + trace_id: "47cb4a13b42a47bab2198509543ff14d", + span_id: "1a9130f6ad398e55" + } + } + } + }; + + try { + const response = await fetch(`${baseUrl}/api/preview/annotations`, { + method: 'POST', + headers: headers, + body: JSON.stringify(annotationData) + }); + + if (response.ok) { + const data = await response.json(); + console.log("Annotation created successfully"); + console.log(data); + } else { + console.error(`Error: ${response.status}`); + console.error(await response.text()); + } + } catch (error) { + console.error("Request failed:", error); + } +} + +createAnnotation(); +``` + + + + +:::info +If the evaluator doesn't exist yet, Agenta will create it automatically based on your first annotation. +::: + +## Understanding the Response + +When you create an annotation, you'll receive a response that includes the annotation data and its ID: + +```json +{ + "annotation": { + "created_at": "2025-05-13T16:54:52.245664Z", + "created_by_id": "019315dc-a332-7ba5-a426-d079c43ab776", + "span_id": "a1713ea8f59291f6", + "trace_id": "bb39070937f74f169b60dfc420729ad3", + "kind": "custom", + "source": "api", + "data": { + "outputs": { + "score": 0, + "reasoning": "The answer is totally false.", + "expected_answer": "The capital of France is Paris", + "normalized_score": 0 + } + }, + "metadata": { + "user_id": "miamia" + }, + "references": { + "evaluator": { + "id": "0196ca64-9cbf-7ee3-b507-2b559dd13090", + "slug": "main-scorer" + } + }, + "links": { + "invocation": { + "span_id": "09383e1124b264d0", + "trace_id": "5d52a529b48135fd58790f8aa3e33fb8" + } + } + } +} +``` + +:::info +Annotations themselves are stored as traces with their own `trace_id` and `span_id`, which is different from the invocation they're linked to. +::: + +## Viewing Annotations in the UI + +You can see all annotations for a trace in the Agenta UI. Open any trace and check the Annotations tab to see detailed information. The right sidebar shows average metrics for each evaluator. + +Screenshot showing how annotations appear in the Agenta UI + +## Querying Annotations + + + + +You can query annotations in several ways: + +**1. Query by annotation ID:** + +```python +import requests + +base_url = "https://cloud.agenta.ai" +headers = { + "Content-Type": "application/json", + "Authorization": "ApiKey YOUR_API_KEY" +} + +# Query by annotation ID +query_data = { + "annotation": { + "trace_id": "bb39070937f74f169b60dfc420729ad3", + "span_id": "a1713ea8f59291f6" + } +} + +response = requests.post( + f"{base_url}/api/preview/annotations/query", + headers=headers, + json=query_data +) + +if response.status_code == 200: + print("Query successful") + print(response.json()) +else: + print(f"Error: {response.status_code}") + print(response.text) +``` + +**2. Query all annotations for an invocation:** + +```python +# Query all annotations for an invocation +query_data = { + "annotation": { + "links": { + "invocation": { + "trace_id": "5d52a529b48135fd58790f8aa3e33fb8", + "span_id": "09383e1124b264d0" + } + } + } +} + +response = requests.post( + f"{base_url}/api/preview/annotations/query", + headers=headers, + json=query_data +) +``` + + + + +You can query annotations in several ways: + +**1. Query by annotation ID:** + +```javascript +async function queryAnnotation() { + const baseUrl = 'https://cloud.agenta.ai'; + + const headers = { + 'Content-Type': 'application/json', + 'Authorization': 'ApiKey YOUR_API_KEY' + }; + + // Query by annotation ID + const queryData = { + annotation: { + trace_id: "bb39070937f74f169b60dfc420729ad3", + span_id: "a1713ea8f59291f6" + } + }; + + try { + const response = await fetch(`${baseUrl}/api/preview/annotations/query`, { + method: 'POST', + headers: headers, + body: JSON.stringify(queryData) + }); + + if (response.ok) { + const data = await response.json(); + console.log("Query successful"); + console.log(data); + } else { + console.error(`Error: ${response.status}`); + console.error(await response.text()); + } + } catch (error) { + console.error("Request failed:", error); + } +} + +queryAnnotation(); +``` + +**2. Query all annotations for an invocation:** + +```javascript +async function queryAnnotationsForInvocation() { + const baseUrl = 'https://cloud.agenta.ai'; + + const headers = { + 'Content-Type': 'application/json', + 'Authorization': 'ApiKey YOUR_API_KEY' + }; + + // Query all annotations for an invocation + const queryData = { + annotation: { + links: { + invocation: { + trace_id: "5d52a529b48135fd58790f8aa3e33fb8", + span_id: "09383e1124b264d0" + } + } + } + }; + + try { + const response = await fetch(`${baseUrl}/api/preview/annotations/query`, { + method: 'POST', + headers: headers, + body: JSON.stringify(queryData) + }); + + if (response.ok) { + const data = await response.json(); + console.log("Query successful"); + console.log(data); + } else { + console.error(`Error: ${response.status}`); + console.error(await response.text()); + } + } catch (error) { + console.error("Request failed:", error); + } +} + +queryAnnotationsForInvocation(); +``` + + + + +## Removing Annotations + + + + +```python +import requests + +base_url = "https://cloud.agenta.ai" +headers = { + "Content-Type": "application/json", + "Authorization": "ApiKey YOUR_API_KEY" +} + +# Define the trace_id and span_id of the annotation to delete +trace_id = "bb39070937f74f169b60dfc420729ad3" +span_id = "a1713ea8f59291f6" + +# Make the delete request +response = requests.delete( + f"{base_url}/api/preview/annotations/{trace_id}/{span_id}", + headers=headers +) + +# Process the response +if response.status_code == 200: + print("Annotation deleted successfully") +else: + print(f"Error: {response.status_code}") + print(response.text) +``` + + + + +```javascript +async function deleteAnnotation() { + const baseUrl = 'https://cloud.agenta.ai'; + + const headers = { + 'Content-Type': 'application/json', + 'Authorization': 'ApiKey YOUR_API_KEY' + }; + + // Define the trace_id and span_id of the annotation to delete + const traceId = "bb39070937f74f169b60dfc420729ad3"; + const spanId = "a1713ea8f59291f6"; + + try { + const response = await fetch(`${baseUrl}/api/preview/annotations/${traceId}/${spanId}`, { + method: 'DELETE', + headers: headers + }); + + if (response.ok) { + console.log("Annotation deleted successfully"); + } else { + console.error(`Error: ${response.status}`); + console.error(await response.text()); + } + } catch (error) { + console.error("Request failed:", error); + } +} + +deleteAnnotation(); +``` + + + diff --git a/docs/docs/evaluation/_02-quick-start-sdk.mdx b/docs/docs/evaluation/_02-quick-start-sdk.mdx deleted file mode 100644 index 854b62b6bc..0000000000 --- a/docs/docs/evaluation/_02-quick-start-sdk.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Quick Start: Evaluation from SDK" -sidebar_label: "Quick Start (SDK)" -description: "Get started with evaluating your LLM applications programmatically using the Agenta SDK" -sidebar_position: 2 ---- - -import { Redirect } from '@docusaurus/router'; - - diff --git a/docs/docs/evaluation/_evaluation-from-sdk/01-quick-start.mdx b/docs/docs/evaluation/_evaluation-from-sdk/01-quick-start.mdx deleted file mode 100644 index c7d594aeff..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/01-quick-start.mdx +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: "Quick Start" -sidebar_label: "Quick Start" -description: "Quick start guide for running evaluations programmatically with the Agenta SDK" -sidebar_position: 1 ---- - -This quick start guide will help you run your first evaluation using the Agenta Python SDK. - -## Prerequisites - -- Python 3.8 or higher -- Agenta account with API key -- An LLM application deployed in Agenta - -## Installation - -```bash -pip install -U agenta -``` - -## What you'll learn - -- How to initialize the SDK -- How to create test sets programmatically -- How to configure and run evaluations -- How to retrieve evaluation results - -## Quick example - -```python -import agenta as ag -from agenta.client.api import AgentaApi - -# Initialize the SDK -client = AgentaApi( - base_url="https://cloud.agenta.ai/api", - api_key="your-api-key" -) - -# Create a test set -test_set = client.testsets.create_testset( - request={ - "name": "my_test_set", - "csvdata": [ - {"input": "Hello", "expected": "Hi there!"}, - {"input": "How are you?", "expected": "I'm doing well!"} - ] - } -) - -# Run evaluation -evaluation = client.evaluations.create_evaluation( - app_id="your-app-id", - variant_ids=["variant-id"], - testset_id=test_set.id, - evaluators_configs=["evaluator-config-id"] -) - -# Check status -status = client.evaluations.fetch_evaluation_status(evaluation.id) -print(f"Evaluation status: {status}") - -# Get results when complete -results = client.evaluations.fetch_evaluation_results(evaluation.id) -print(results) -``` - -## Next steps - -- Learn about [setup and configuration](/evaluation/evaluation-from-sdk/setup-configuration) -- Explore [managing test sets with the SDK](/evaluation/evaluation-from-sdk/managing-test-sets) -- Understand [configuring evaluators](/evaluation/evaluation-from-sdk/configuring-evaluators) -- See how to [run evaluations](/evaluation/evaluation-from-sdk/running-evaluations) in detail diff --git a/docs/docs/evaluation/_evaluation-from-sdk/02-setup-configuration.mdx b/docs/docs/evaluation/_evaluation-from-sdk/02-setup-configuration.mdx deleted file mode 100644 index 28b858b81a..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/02-setup-configuration.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Setup and Configuration" -sidebar_label: "Setup & Configuration" -description: "Learn how to set up and configure the Agenta SDK for evaluation" -sidebar_position: 2 ---- - - - -## Setup - -First, install the Agenta SDK: - -```bash -pip install -U agenta -``` - -## Initialize the SDK client - -```python -from agenta.client.api import AgentaApi - -app_id = "667d8cfad1812781f7e375d9" - -# You can create the API key under the settings page. -# If you are using the OSS version, you should keep this as an empty string -api_key = "EUqJGOUu.xxxx" - -# Host -host = "https://cloud.agenta.ai" - -# Initialize the client -client = AgentaApi(base_url=host + "/api", api_key=api_key) -``` - -## Configuration options - - - -## Environment variables - -You can also configure the SDK using environment variables: - -```bash -export AGENTA_API_KEY="your-api-key" -export AGENTA_HOST="https://cloud.agenta.ai" -``` - -```python -import agenta as ag - -# Initialize will read from environment variables -ag.init() -``` - -## Next steps - -- Learn about [managing test sets](/evaluation/evaluation-from-sdk/managing-test-sets) -- Explore [configuring evaluators](/evaluation/evaluation-from-sdk/configuring-evaluators) -- Start [running evaluations](/evaluation/evaluation-from-sdk/running-evaluations) diff --git a/docs/docs/evaluation/_evaluation-from-sdk/03-managing-test-sets.mdx b/docs/docs/evaluation/_evaluation-from-sdk/03-managing-test-sets.mdx deleted file mode 100644 index d866710948..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/03-managing-test-sets.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "Managing Test Sets" -sidebar_label: "Managing Test Sets" -description: "Learn how to create, load, and manage test sets using the SDK" -sidebar_position: 3 ---- - - - -## Creating test sets - -```python -from agenta.client.types.new_testset import NewTestset - -csvdata = [ - {"country": "france", "capital": "Paris"}, - {"country": "Germany", "capital": "Berlin"} -] - -response = client.testsets.create_testset( - request=NewTestset(name="test set", csvdata=csvdata) -) -test_set_id = response.id -``` - -## Loading existing test sets - - - -## Updating test sets - - - -## Deleting test sets - - - -## Next steps - -- Learn about [configuring evaluators](/evaluation/evaluation-from-sdk/configuring-evaluators) -- Start [running evaluations](/evaluation/evaluation-from-sdk/running-evaluations) -- Explore [viewing results](/evaluation/evaluation-from-sdk/viewing-results) diff --git a/docs/docs/evaluation/_evaluation-from-sdk/04-configuring-evaluators.mdx b/docs/docs/evaluation/_evaluation-from-sdk/04-configuring-evaluators.mdx deleted file mode 100644 index 0de67a068f..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/04-configuring-evaluators.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Configuring Evaluators" -sidebar_label: "Configuring Evaluators" -description: "Learn how to configure built-in and custom evaluators using the SDK" -sidebar_position: 4 ---- - - - -## Creating evaluators - -### Custom code evaluator - -Let's create a custom code evaluator that returns 1.0 if the first letter of the app output is uppercase: - -```python -code_snippet = """ -from typing import Dict - -def evaluate( - app_params: Dict[str, str], - inputs: Dict[str, str], - output: str, # output of the llm app - datapoint: Dict[str, str] # contains the testset row -) -> float: - if output and output[0].isupper(): - return 1.0 - else: - return 0.0 -""" - -response = client.evaluators.create_new_evaluator_config( - app_id=app_id, - name="capital_letter_evaluator", - evaluator_key="auto_custom_code_run", - settings_values={"code": code_snippet} -) -letter_match_eval_id = response.id -``` - -## Using built-in evaluators - - - -## Configuring evaluator settings - - - -## Next steps - -- Learn about [running evaluations](/evaluation/evaluation-from-sdk/running-evaluations) -- Explore [viewing results](/evaluation/evaluation-from-sdk/viewing-results) -- See all [evaluator types](/evaluation/configure-evaluators/overview) diff --git a/docs/docs/evaluation/_evaluation-from-sdk/05-running-evaluations.mdx b/docs/docs/evaluation/_evaluation-from-sdk/05-running-evaluations.mdx deleted file mode 100644 index aa9a523a02..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/05-running-evaluations.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Running Evaluations" -sidebar_label: "Running Evaluations" -description: "Learn how to run evaluations programmatically using the SDK" -sidebar_position: 5 ---- - - - -## Running an evaluation - -First, let's grab the first variant in the app: - -```python -response = client.apps.list_app_variants(app_id=app_id) -print(response) -myvariant_id = response[0].variant_id -``` - -Then, let's start the evaluation jobs: - -```python -from agenta.client.types.llm_run_rate_limit import LlmRunRateLimit - -rate_limit_config = LlmRunRateLimit( - batch_size=10, # number of rows to call in parallel - max_retries=3, # max number of time to retry a failed llm call - retry_delay=2, # delay before retrying a failed llm call - delay_between_batches=5, # delay between batches -) - -response = client.evaluations.create_evaluation( - app_id=app_id, - variant_ids=[myvariant_id], - testset_id=test_set_id, - evaluators_configs=[letter_match_eval_id], - rate_limit=rate_limit_config -) -print(response) -``` - -## Checking evaluation status - -Now we can check for the status of the job: - -```python -client.evaluations.fetch_evaluation_status('667d98fbd1812781f7e3761a') -``` - -## Configuring rate limits - - - -## Handling errors - - - -## Next steps - -- Learn about [viewing results](/evaluation/evaluation-from-sdk/viewing-results) -- Explore [advanced evaluation patterns](/evaluation/evaluation-from-sdk/setup-configuration) diff --git a/docs/docs/evaluation/_evaluation-from-sdk/06-viewing-results.mdx b/docs/docs/evaluation/_evaluation-from-sdk/06-viewing-results.mdx deleted file mode 100644 index 7e8609e71f..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/06-viewing-results.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Viewing Results" -sidebar_label: "Viewing Results" -description: "Learn how to retrieve and analyze evaluation results using the SDK" -sidebar_position: 6 ---- - - - -## Fetching overall results - -As soon as the evaluation is done, we can fetch the overall results: - -```python -response = client.evaluations.fetch_evaluation_results('667d98fbd1812781f7e3761a') - -results = [ - (evaluator["evaluator_config"]["name"], evaluator["result"]) - for evaluator in response["results"] -] -print(results) -``` - -## Fetching detailed results - -Get detailed results for each test case: - -```python -detailed_results = client.evaluations.fetch_evaluation_scenarios( - evaluations_ids='667d98fbd1812781f7e3761a' -) -print(detailed_results) -``` - -## Analyzing results - - - -## Exporting results - - - -## Next steps - -- Learn about [human evaluation](/evaluation/human-evaluation/quick-start) -- Explore [comparing evaluations in the UI](/evaluation/evaluation-from-ui/comparing-runs) -- See all [evaluator types](/evaluation/configure-evaluators/overview) diff --git a/docs/docs/evaluation/_evaluation-from-sdk/_category_.json b/docs/docs/evaluation/_evaluation-from-sdk/_category_.json deleted file mode 100644 index f2be6bfd52..0000000000 --- a/docs/docs/evaluation/_evaluation-from-sdk/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Evaluation from SDK", - "position": 7, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/evaluation/configure-evaluators/01-overview.mdx b/docs/docs/evaluation/configure-evaluators/01-overview.mdx deleted file mode 100644 index 7cb1292849..0000000000 --- a/docs/docs/evaluation/configure-evaluators/01-overview.mdx +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "Configure Evaluators" -sidebar_label: "Overview" -description: "Set up evaluators for your use case" -sidebar_position: 1 ---- - -import Image from "@theme/IdealImage"; - -This guide shows you how to configure evaluators for your LLM application. - -## Configuring evaluators - -To create a new evaluator, click the `Create New` button in the `Evaluators` page. - -## Selecting evaluators - -Agenta offers a growing list of pre-built evaluators suitable for most use cases. You can also [create custom evaluators](/evaluation/configure-evaluators/custom-evaluator) by writing your own Python function or [use webhooks](/evaluation/configure-evaluators/webhook-evaluator) for evaluation. - -
-Available Evaluators - -| **Evaluator Name** | **Use Case** | **Type** | **Description** | -| ------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------ | -------------------------------------------------------------------------------- | -| [Exact Match](/evaluation/configure-evaluators/classification-entity-extraction#exact-match) | Classification/Entity Extraction | Pattern Matching | Checks if the output exactly matches the expected result. | -| [Contains JSON](/evaluation/configure-evaluators/classification-entity-extraction#contains-json) | Classification/Entity Extraction | Pattern Matching | Ensures the output contains valid JSON. | -| [Regex Test](/evaluation/configure-evaluators/regex-evaluator) | Classification/Entity Extraction | Pattern Matching | Checks if the output matches a given regex pattern. | -| [JSON Field Match](/evaluation/configure-evaluators/classification-entity-extraction#json-field-match) | Classification/Entity Extraction | Pattern Matching | Compares specific fields within JSON data. | -| [JSON Diff Match](/evaluation/configure-evaluators/classification-entity-extraction#json-diff-match) | Classification/Entity Extraction | Similarity Metrics | Compares generated JSON with a ground truth JSON based on schema or values. | -| [Similarity Match](/evaluation/configure-evaluators/semantic-similarity#similarity-match) | Text Generation / Chatbot | Similarity Metrics | Compares generated output with expected using Jaccard similarity. | -| [Semantic Similarity Match](/evaluation/configure-evaluators/semantic-similarity#semantic-similarity-match) | Text Generation / Chatbot | Semantic Analysis | Compares the meaning of the generated output with the expected result. | -| [Starts With](/evaluation/configure-evaluators/regex-evaluator) | Text Generation / Chatbot | Pattern Matching | Checks if the output starts with a specified prefix. | -| [Ends With](/evaluation/configure-evaluators/regex-evaluator) | Text Generation / Chatbot | Pattern Matching | Checks if the output ends with a specified suffix. | -| [Contains](/evaluation/configure-evaluators/regex-evaluator) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains a specific substring. | -| [Contains Any](/evaluation/configure-evaluators/regex-evaluator) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains any of a list of substrings. | -| [Contains All](/evaluation/configure-evaluators/regex-evaluator) | Text Generation / Chatbot | Pattern Matching | Checks if the output contains all of a list of substrings. | -| [Levenshtein Distance](/evaluation/configure-evaluators/semantic-similarity#levenshtein-distance) | Text Generation / Chatbot | Similarity Metrics | Calculates the Levenshtein distance between output and expected result. | -| [LLM-as-a-judge](/evaluation/configure-evaluators/llm-as-a-judge) | Text Generation / Chatbot | LLM-based | Sends outputs to an LLM model for critique and evaluation. | -| [RAG Faithfulness](/evaluation/configure-evaluators/rag-evaluators) | RAG / Text Generation / Chatbot | LLM-based | Evaluates if the output is faithful to the retrieved documents in RAG workflows. | -| [RAG Context Relevancy](/evaluation/configure-evaluators/rag-evaluators) | RAG / Text Generation / Chatbot | LLM-based | Measures the relevancy of retrieved documents to the given question in RAG. | -| [Custom Code Evaluation](/evaluation/configure-evaluators/custom-evaluator) | Custom Logic | Custom | Allows users to define their own evaluator in Python. | -| [Webhook Evaluator](/evaluation/configure-evaluators/webhook-evaluator) | Custom Logic | Custom | Sends output to a webhook for external evaluation. | - -
- -
- Create new evaluator -
- -## Evaluators' playground - -Each evaluator comes with its unique playground. For instance, in the screen below, the LLM-as-a-judge evaluator requires you to specify the prompt to use for the evaluation. You'll find detailed information about these parameters on each evaluator's documentation page. - -
- LLM-as-a-judge evaluator playground -
- -The evaluator playground lets you test your evaluator with sample input to make sure it's configured correctly. - -To use it, follow these steps: -1. Load a test case from a test set -2. Select a prompt and run it -3. Run the evaluator to see the result - -You can adjust the configuration until you are happy with the result. When finished, commit your changes. - - -## Next steps - -Explore the different evaluator types: - -- [Classification and Entity Extraction](/evaluation/configure-evaluators/classification-entity-extraction) -- [Pattern Matching](/evaluation/configure-evaluators/regex-evaluator) -- [Semantic Similarity](/evaluation/configure-evaluators/semantic-similarity) -- [LLM as a Judge](/evaluation/configure-evaluators/llm-as-a-judge) -- [RAG Evaluators](/evaluation/configure-evaluators/rag-evaluators) -- [Custom Evaluators](/evaluation/configure-evaluators/custom-evaluator) -- [Webhook Evaluators](/evaluation/configure-evaluators/webhook-evaluator) diff --git a/docs/docs/evaluation/configure-evaluators/05-llm-as-a-judge.mdx b/docs/docs/evaluation/configure-evaluators/05-llm-as-a-judge.mdx deleted file mode 100644 index 399dfde99e..0000000000 --- a/docs/docs/evaluation/configure-evaluators/05-llm-as-a-judge.mdx +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "LLM-as-a-Judge" ---- - -LLM-as-a-Judge is an evaluator that uses an LLM to assess LLM outputs. It's particularly useful for evaluating text generation tasks or chatbots where there's no single correct answer. - -![Configuration of LLM-as-a-judge](/images/evaluation/configure-evaluators-3.png) - -The evaluator has the following parameters: - -#### The Prompt - -You can configure the prompt used for evaluation. The prompt can contain multiple messages in OpenAI format (role/content). All messages in the prompt have access to the inputs, outputs, and reference answers (any columns in the testset). To reference these in your prompts, use the following variables (inside double curly braces): - -- `{{inputs}}`: all the inputs to the llm application formatted as key-value pairs -- `{{outputs}}`: the output of the llm application -- `{{reference}}`: the column with the reference answer in the testset (optional). You can configure the name of this column under `Advanced Setting` in the configuration modal. -- `{{correct_answer}}`: alias for `{{reference}}` (for backward compatibility) -- `{{prediction}}`: alias for `{{outputs}}` (for backward compatibility) -- `{{$input_column_name}}`: the value of any input column for the given row of your testset (e.g. `{{country}}`) - -If no `correct_answer` column is present in your testset, the variable will be left blank in the prompt. - -Here's the default prompt: - -**System prompt:** -``` -You are an expert evaluator grading model outputs. Your task is to grade the responses based on the criteria and requirements provided below. - -Given the model output and inputs (and any other data you might get) assign a grade to the output. - -## Grading considerations -- Evaluate the overall value provided in the model output -- Verify all claims in the output meticulously -- Differentiate between minor errors and major errors -- Evaluate the outputs based on the inputs and whether they follow the instruction in the inputs if any -- Give the highst and lowest score for cases where you have complete certainty about correctness and value - -## Scoring Criteria -- The score should be between 0 and 10 -- A score of 10 means that the answer is perfect. This is the highest (best) score -- A score of 0 means that the answer does not meet any of the criteria. This is the lowest possible score you can give. - -## output format -ANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER -``` - -**User prompt:** - -``` -## Model inputs -{{inputs}} -## Model outputs -{{outputs}} -``` - -### The Model - -The model can be configured to select one of the supported options (`gpt-3.5-turbo`, `gpt-4o`, `gpt-5`, `gpt-5-mini`, `gpt-5-nano`, `claude-3-5-sonnet`, `claude-3-5-haiku`, `claude-3-5-opus`). To use LLM-as-a-Judge, you'll need to set your OpenAI or Anthropic API key in the settings. The key is saved locally and only sent to our servers for evaluation—it's not stored there. diff --git a/docs/docs/evaluation/configure-evaluators/_category_.json b/docs/docs/evaluation/configure-evaluators/_category_.json deleted file mode 100644 index 838261f53c..0000000000 --- a/docs/docs/evaluation/configure-evaluators/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Configure Evaluators", - "position": 8, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/evaluation/configure-evaluators/regex-evaluator.mdx b/docs/docs/evaluation/configure-evaluators/regex-evaluator.mdx deleted file mode 100644 index 23e27ce4bc..0000000000 --- a/docs/docs/evaluation/configure-evaluators/regex-evaluator.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Regex Evaluator" ---- - -Regular Expressions (Regex) are sequences of characters that define search patterns, often used for pattern matching -within strings. The `Regex Test` evaluator checks if the generated answer matches a regular expression pattern. - -The evaluator takes the regex pattern, and whether to match or not match for that pattern. - -Here are some examples: - -| Output | Regex | Match/Mismatch | Evaluator Output | -| -------------------------------------- | ------------- | -------------- | ---------------- | -| The iPhone 6 has a 1024px screen | `.*iphone.*` | `match` | True | -| The Samsung galaxy has a 1024px screen | `.*Samsung.*` | `mismatch` | False | - diff --git a/docs/docs/evaluation/evaluation-from-ui/01-quick-start.mdx b/docs/docs/evaluation/evaluation-from-ui/01-quick-start.mdx deleted file mode 100644 index a2354b42a0..0000000000 --- a/docs/docs/evaluation/evaluation-from-ui/01-quick-start.mdx +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: "Quick Start Evaluation from UI" -sidebar_label: "Quick Start" -description: "Quick start guide for running LLM and prompt evaluations from the Agenta UI" -sidebar_position: 1 ---- -import Image from "@theme/IdealImage"; - -This quick start guide will help you run your first evaluation using the Agenta UI. - -You will create a prompt that classifies tweets based on their sentiment (positive, negative, neutral). Then you will run an evaluation to measure its performance. - -## Prerequisites - -Before you get started, create the prompt and the test set: - -### Create the prompt - -Create a `completion` prompt that classifies tweets based on their sentiment. - -Use the following prompt: - -**_System prompt_** -``` -Classify this tweet based on its sentiment. Return only the sentiment. The sentiment should be one of the following: positive, negative, neutral. -``` -**_User prompt_** -``` -{{tweet}} -``` - -Commit the prompt to the default variant. - -Create prompt modal showing completion and chat application options - - -### Create the test set - -Download a test set with 50 tweets based on the [Sentiment140 kaggle dataset](https://www.kaggle.com/datasets/kazanova/sentiment140). -Download the test set [here](/examples/sentiment140_first50.csv). Then upload it to Agenta (see how to [upload a test set](/evaluation/managing-test-sets/upload-csv)). - -## Running the evaluation - -Navigate to the **Evaluations** page. Click on **Start new evaluation**. - -1. Choose the test set `sentiment140_first50`. -2. Choose the latest revision from the default variant. -3. Choose the evaluator `Exact Match`. -4. Click on **Start evaluation**. - -Start new evaluation modal - -:::tip - -Agenta offers a variety of built-in evaluators for most use cases. You can also create custom evaluators in Python. One of the most commonly used evaluators is `LLM as a Judge`. See more about [evaluators](/evaluation/configure-evaluators/overview). -::: - -## Viewing the results - -Once the evaluation completes, click on the evaluation run to see the results. - -The overview tab shows the aggregated results for all evaluators. -Evaluation results overview - - -The test set tab shows the results for each test case. - -Evaluation results test case - -Click the expand button in the top right corner of the output cell to open a drawer with the full output. Click the tree icon to open a drawer with the trace. - -Evaluation results test case drawer - - -## Making a change and comparing the results - -Make a small change to the prompt and compare the results. Modify the prompt to use gpt-4o-mini instead of gpt-4o. Commit the change. Then rerun the evaluation with the new prompt revision. - -Now compare the results between the two evaluations. Click the `+ Compare` button on the top right corner of the evaluation results page. Select the evaluation to compare to. - -Evaluation results comparison view - -You might find that `gpt-4o-mini` performs differently than `gpt-4o` on this task. It may cost less but could have lower accuracy or different latency. - -## Next steps - -You have run a simple evaluation for a classification task in Agenta. Next, learn more about the different evaluators and how to configure them. See more about [evaluators](/evaluation/configure-evaluators/overview). diff --git a/docs/docs/evaluation/evaluation-from-ui/02-running-evaluations.mdx b/docs/docs/evaluation/evaluation-from-ui/02-running-evaluations.mdx deleted file mode 100644 index 018e795934..0000000000 --- a/docs/docs/evaluation/evaluation-from-ui/02-running-evaluations.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Running Evaluations" -sidebar_label: "Running Evaluations" -description: "Learn how to run evaluations from the Agenta web interface" -sidebar_position: 2 ---- - -import Image from "@theme/IdealImage"; - -This guide will show you how to run evaluations from the UI. - -## Prerequisites - -Before you get started, make sure that you have [created a test set](/evaluation/managing-test-sets/upload-csv) and [configured evaluators](/evaluation/configure-evaluators/overview) appropriate for your task. - -## Starting an evaluation - -To start an evaluation, navigate to the Evaluations page and click the `Start new evaluation` button. A modal will appear, allowing you to setup the evaluation. - -Start new evaluation - -## Setting up evaluation parameters - -In the modal, specify the following: - -- **Testset**: Choose the testset(s) for your evaluation -- **Variants**: Choose one or more variants to evaluate -- **Evaluators**: Pick one or more evaluators for assessment - -New evaluation modal - -## Advanced configuration - -Additional settings allow you to adjust batching and retry parameters for LLM calls. This helps mitigate rate limit errors from your LLM provider. - -Advanced configuration options include: - -- **Batch Size**: Number of test cases to run concurrently in each batch (default: 10) -- **Retry Delay**: Time to wait before retrying a failed call (default: 3s) -- **Max Retries**: Maximum number of retry attempts for a failed call (default: 3) -- **Delay Between Batches**: Pause duration between batch runs (default: 5s) - -## Monitoring evaluation progress - -Once you start an evaluation: - -1. The evaluation will appear in the evaluations list -2. You'll see the status (Running, Completed, Failed) -3. Progress indicators show how many test cases have been processed -4. You can view partial results while the evaluation is running - -## Next steps - -- Learn how to [view evaluation results](/evaluation/evaluation-from-ui/viewing-results) -- Understand how to [compare evaluations](/evaluation/evaluation-from-ui/comparing-runs) -- Try [human evaluation](/evaluation/human-evaluation/quick-start) for expert feedback diff --git a/docs/docs/evaluation/evaluation-from-ui/03-viewing-results.mdx b/docs/docs/evaluation/evaluation-from-ui/03-viewing-results.mdx deleted file mode 100644 index 52b3b7eb55..0000000000 --- a/docs/docs/evaluation/evaluation-from-ui/03-viewing-results.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "Viewing Evaluation Results" -sidebar_label: "Viewing Results" -description: "Learn how to view and analyze evaluation results in Agenta" -sidebar_position: 3 ---- - -import Image from "@theme/IdealImage"; - -## Overview - -Once your evaluation completes, Agenta provides comprehensive views to analyze the results and understand your LLM application's performance. - -## Overview evaluation tab - -The main view offers an aggregated summary of results. - -Overview evaluation results - -- Average score per evaluator for each variant/test set combination -- Average latency -- Total cost -- Creation date - -## Test cases evaluation tab - -The test cases evaluation tab provides a detailed view of each test case. - -Detailed evaluation results - -The evaluation table columns show: - -- **Inputs**: The input data from your test set -- **Reference Answers**: The expected/correct answers used by evaluators -- **LLM Output**: The actual output from your application -- **Evaluator Results**: Scores or boolean values from each evaluator -- **Cost**: The cost of running this test case -- **Latency**: How long the test case took to execute - -If you click on a test case, you will see a drawer with the full output and the evaluator results. - -Detailed evaluation drawer - -## Prompt configuration tab - -The prompt configuration tab shows the prompt configuration used for this evaluation. - -Prompt configuration - -## Exporting results - -Export your evaluation results for further analysis: - -1. Click the **Export** button on the evaluation detail page -2. Choose CSV format -3. Open in your preferred analysis tool (Excel, Python, R, etc.) - -## Next steps - -- Learn how to [compare multiple evaluations](/evaluation/evaluation-from-ui/comparing-runs) -- Try [human evaluation](/evaluation/human-evaluation/quick-start) for qualitative assessment -- Explore [evaluation concepts](/evaluation/concepts) to understand evaluation approaches diff --git a/docs/docs/evaluation/evaluation-from-ui/04-comparing-runs.mdx b/docs/docs/evaluation/evaluation-from-ui/04-comparing-runs.mdx deleted file mode 100644 index 5546045a93..0000000000 --- a/docs/docs/evaluation/evaluation-from-ui/04-comparing-runs.mdx +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "Comparing Evaluation Runs" -sidebar_label: "Comparing Runs" -description: "Learn how to compare multiple evaluation runs to find the best performing variant" -sidebar_position: 4 ---- - -import Image from "@theme/IdealImage"; - -## Overview - -Compare evaluations to understand which variant performs better. This helps you make data-driven decisions about your LLM application. - -## Prerequisites - -To compare evaluations, you need: - -- Two or more completed evaluations -- All evaluations must use the same test set - -## Starting a comparison - -After your evaluations complete, you can compare two or more of them: - -1. Go to the Evaluations page -2. Click the compare button in the top right corner of the evaluation results page -3. Select the evaluations you want to compare - - -## Overview comparison tab - -The overview comparison tab shows aggregated results for all evaluators. The figures let you compare results between evaluations. - -Animation showing how to compare evaluations in Agenta - -## Test set comparison tab - -The test set comparison tab shows results for each test case. The figures let you compare results between evaluations. - -Comparison view test set - -Click on a row to see a drawer with the full output and evaluator results side by side. - -Comparison view test set - -## Prompt configuration comparison tab - -The prompt configuration comparison tab shows the prompt configuration used for each evaluation. The figures let you compare prompt configurations between evaluations. - -Comparison view prompt configuration - -## Next steps - -- Learn about [human evaluation](/evaluation/human-evaluation/quick-start) for qualitative feedback -- Explore [evaluation concepts](/evaluation/concepts) to understand evaluation approaches -- Understand [evaluator types](/evaluation/configure-evaluators/overview) to choose the right metrics diff --git a/docs/docs/evaluation/evaluation-from-ui/_category_.json b/docs/docs/evaluation/evaluation-from-ui/_category_.json deleted file mode 100644 index 190fc0bdb3..0000000000 --- a/docs/docs/evaluation/evaluation-from-ui/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Evaluation from UI", - "position": 6, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/evaluation/configure-evaluators/02-classification-entity-extraction.mdx b/docs/docs/evaluation/evaluators/01-classification-entiry-extraction.mdx similarity index 100% rename from docs/docs/evaluation/configure-evaluators/02-classification-entity-extraction.mdx rename to docs/docs/evaluation/evaluators/01-classification-entiry-extraction.mdx diff --git a/docs/docs/evaluation/evaluators/02-pattern-matching.mdx b/docs/docs/evaluation/evaluators/02-pattern-matching.mdx new file mode 100644 index 0000000000..283c9e8165 --- /dev/null +++ b/docs/docs/evaluation/evaluators/02-pattern-matching.mdx @@ -0,0 +1,47 @@ +--- +title: "Pattern Matching Evaluators" +--- + +Pattern Matching Evaluation is a method used to assess the performance of LLMs by identifying specific patterns within the output generated by the model. +In Agenta, to perform pattern matching evaluation you can make use of the following evaluators: + +- Regex Test +- Starts with +- Ends with +- Contains +- Contains Any +- Contains All + +## Regular Expression + +Regular Expressions (Regex) are sequences of characters that define search patterns, often used for pattern matching +within strings. The `Regex Test` evaluator checks if the generated answer matches a regular expression pattern. + +The evaluator takes the regex pattern, and whether to match or not match for that pattern. + +Here are some examples: + +| Output | Regex | Match/Mismatch | Evaluator Output | +| -------------------------------------- | ------------- | -------------- | ---------------- | +| The iPhone 6 has a 1024px screen | `.*iphone.*` | `match` | True | +| The Samsung galaxy has a 1024px screen | `.*Samsung.*` | `mismatch` | False | + +## Starts With + +**Starts With evaluator** checks if the output starts with a specified prefix, considering case sensitivity based on the settings. + +## Ends With + +**Ends With** evaluator checks if the output ends with a specified suffix, considering case sensitivity based on the settings. + +## Contains + +**Contains evaluator** checks if the output contains a specified substring, considering case sensitivity based on the settings. + +## Contains Any + +**Contains Any evaluator** checks if the output contains any of the specified substrings from a comma-separated list, considering case sensitivity based on the settings. + +## Contains All + +**Contains All evaluator** checks if the output contains all of the specified substrings from a comma-separated list, considering case sensitivity based on the settings. diff --git a/docs/docs/evaluation/configure-evaluators/04-semantic-similarity.mdx b/docs/docs/evaluation/evaluators/03-semantic-similarity.mdx similarity index 100% rename from docs/docs/evaluation/configure-evaluators/04-semantic-similarity.mdx rename to docs/docs/evaluation/evaluators/03-semantic-similarity.mdx diff --git a/docs/docs/evaluation/evaluators/04-llm-as-a-judge.mdx b/docs/docs/evaluation/evaluators/04-llm-as-a-judge.mdx new file mode 100644 index 0000000000..c9e8c55544 --- /dev/null +++ b/docs/docs/evaluation/evaluators/04-llm-as-a-judge.mdx @@ -0,0 +1,52 @@ +--- +title: "LLM-as-a-Judge" +--- + +LLM-as-a-Judge is an evaluator that uses an LLM to assess LLM outputs. It's particularly useful for evaluating text generation tasks or chatbots where there's no single correct answer. + +![Configuration of LLM-as-a-judge](/images/evaluation/llm-as-a-judge.png) + +The evaluator has the following parameters: + +#### The Prompt + +You can configure the prompt used for evaluation. The prompt can contain multiple messages in OpenAI format (role/content). All messages in the prompt have access to the inputs, outputs, and reference answers (any columns in the test set). To reference these in your prompts, use the following variables: + +- `correct_answer`: the column with the reference answer in the test set (optional). You can configure the name of this column under `Advanced Setting` in the configuration modal. +- `prediction`: the output of the llm application +- `$input_column_name`: the value of any input column for the given row of your test set + +If no `correct_answer` column is present in your test set, the variable will be left blank in the prompt. + +Here's the default prompt used for the country expert demo application (note that it uses the `country` input column from our test set): + +**System prompt:** + +``` +You are an evaluator grading an LLM App. + You will be given INPUTS, the LLM APP OUTPUT, the CORRECT ANSWER, the PROMPT used in the LLM APP. + Here is the grade criteria to follow: +:- Ensure that the LLM APP OUTPUT has the same meaning as the CORRECT ANSWER + +SCORE: +-The score should be between 0 and 10 +-A score of 10 means that the answer is perfect. This is the highest (best) score. +A score of 0 means that the answer does not any of of the criteria. This is the lowest possible score you can give. + +ANSWER ONLY THE SCORE. DO NOT USE MARKDOWN. DO NOT PROVIDE ANYTHING OTHER THAN THE NUMBER +``` + +**User prompt:** + +``` + +INPUTS: +country: {country} +CORRECT ANSWER:{correct_answer} +LLM APP OUTPUT: {prediction}. + +``` + +### The Model + +The model can be configured to select one of the supported options (`gpt-3.5-turbo`, `gpt-4`, `claude-3-5-sonnet`, `claude-3-5-haiku`, `claude-3-5-opus`). To use LLM-as-a-Judge, you'll need to set your OpenAI or Anthropic API key in the settings. The key is saved locally and only sent to our servers for evaluation—it's not stored there. diff --git a/docs/docs/evaluation/configure-evaluators/06-rag-evaluators.mdx b/docs/docs/evaluation/evaluators/05-rag-evaluators.mdx similarity index 100% rename from docs/docs/evaluation/configure-evaluators/06-rag-evaluators.mdx rename to docs/docs/evaluation/evaluators/05-rag-evaluators.mdx diff --git a/docs/docs/evaluation/configure-evaluators/07-custom-evaluator.mdx b/docs/docs/evaluation/evaluators/06-custom-evaluator.mdx similarity index 100% rename from docs/docs/evaluation/configure-evaluators/07-custom-evaluator.mdx rename to docs/docs/evaluation/evaluators/06-custom-evaluator.mdx diff --git a/docs/docs/evaluation/configure-evaluators/08-webhook-evaluator.mdx b/docs/docs/evaluation/evaluators/07-webhook-evaluator.mdx similarity index 100% rename from docs/docs/evaluation/configure-evaluators/08-webhook-evaluator.mdx rename to docs/docs/evaluation/evaluators/07-webhook-evaluator.mdx diff --git a/docs/docs/evaluation/evaluators/_category_.json b/docs/docs/evaluation/evaluators/_category_.json new file mode 100644 index 0000000000..43e5ebe305 --- /dev/null +++ b/docs/docs/evaluation/evaluators/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 8, + "label": "Evaluators" +} diff --git a/docs/docs/evaluation/human-evaluation/01-quick-start.mdx b/docs/docs/evaluation/human-evaluation/01-quick-start.mdx deleted file mode 100644 index ae78c98295..0000000000 --- a/docs/docs/evaluation/human-evaluation/01-quick-start.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Quick Start" -sidebar_label: "Quick Start" -description: "Get started with human evaluation in Agenta" -sidebar_position: 1 ---- - -import Image from "@theme/IdealImage"; - -## Overview - -Human evaluation lets you evaluate your LLM application's performance using human judgment instead of automated metrics. - -
- ⏯️ Watch a short demo of the human evaluation feature. - - -
- -## Why use human evaluation? - -Automated metrics can't capture everything. Sometimes you need human experts to evaluate results and identify why errors occur. - -Human evaluation helps you: -- Get expert feedback to compare different versions of your application -- Collect human feedback and insights to improve your prompts and configuration -- Collect annotations to bootstrap automated evaluation - -## How human evaluation works - -Human evaluation follows the same process as automatic evaluation: -1. Choose a test set -2. Select the versions you want to evaluate -3. Pick your evaluators -4. Start the evaluation - -The only difference is that humans provide the evaluation scores instead of automated systems. - -## Quick workflow - -1. **Start evaluation**: Go to Evaluations → Human annotation → Start new evaluation -2. **Select test set**: Choose the data you want to evaluate against -3. **Select variant**: Pick the version of your application to test -4. **Configure evaluators**: Create or select evaluators (boolean, integer, multi-choice, etc.) -5. **Run**: Click "Start evaluation" and generate outputs -6. **Annotate**: Review each response and provide feedback -7. **Review results**: Analyze aggregated scores and export data - -## Next steps - -- Learn about [configuring evaluators](/evaluation/human-evaluation/configuring-evaluators) -- Understand [how to run evaluations](/evaluation/human-evaluation/running-evaluations) -- Explore [viewing results](/evaluation/human-evaluation/viewing-results) -- Try [A/B testing](/evaluation/human-evaluation/ab-testing) diff --git a/docs/docs/evaluation/human-evaluation/02-configuring-evaluators.mdx b/docs/docs/evaluation/human-evaluation/02-configuring-evaluators.mdx deleted file mode 100644 index 209114c22b..0000000000 --- a/docs/docs/evaluation/human-evaluation/02-configuring-evaluators.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Configuring Evaluators" -sidebar_label: "Configuring Evaluators" -description: "Learn how to configure evaluators for human evaluation" -sidebar_position: 2 ---- - -import Image from "@theme/IdealImage"; - -## Creating evaluators - -If you don't have evaluators yet, click **Create new** in the **Evaluator** section. - -Each evaluator has: -- **Name** - What you're measuring (e.g., "correctness") -- **Description** - What the evaluator does -- **Feedback types** - How evaluators will score responses - -For example, a "correctness" evaluator might have: -- `is_correct` - A yes/no question about accuracy -- `error_type` - A multiple-choice field for categorizing mistakes - -Creating evaluators for human evaluation - -## Available feedback types - -- **Boolean** - Yes/no questions -- **Integer** - Whole number ratings -- **Decimal** - Precise numerical scores -- **Single-choice** - Pick one option -- **Multi-choice** - Pick multiple options -- **String** - Free-text comments or notes - -## Grouping related feedback types - -:::tip -Evaluators can include multiple related feedback types. For example: - -**Correctness evaluator:** -- `is_correct` - Yes/no question about accuracy -- `error_type` - Multiple-choice field to categorize mistakes (only if incorrect) - -**Style adherence evaluator:** -- `is_adherent` - Yes/no question about style compliance -- `comment` - Text field explaining why the style doesn't match (if needed) - -This grouping helps you evaluate different aspects of your LLM's performance in an organized way. -::: - -## Selecting evaluators - -After creating evaluators: - -1. Select the evaluators you want to use -2. You can use multiple evaluators in a single evaluation -3. Each evaluator will appear in the annotation interface - -## Next steps - -- Learn about [running evaluations](/evaluation/human-evaluation/running-evaluations) -- Understand [how to view results](/evaluation/human-evaluation/viewing-results) -- Try [A/B testing](/evaluation/human-evaluation/ab-testing) diff --git a/docs/docs/evaluation/human-evaluation/03-running-evaluations.mdx b/docs/docs/evaluation/human-evaluation/03-running-evaluations.mdx deleted file mode 100644 index dbc5544269..0000000000 --- a/docs/docs/evaluation/human-evaluation/03-running-evaluations.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Running Evaluations" -sidebar_label: "Running Evaluations" -description: "Learn how to run human evaluation sessions in Agenta" -sidebar_position: 3 ---- - -import Image from "@theme/IdealImage"; - -## Starting a new evaluation - -1. Go to the **Evaluations** page -2. Select the **Human annotation** tab -3. Click **Start new evaluation** - - - -## Configuring your evaluation - -1. **Select your test set** - Choose the data you want to evaluate against -2. **Select your revision** - Pick the version of your application to test - -:::warning -Your test set columns must match the input variables in your revision. If they don't match, you'll see an error message. -::: - -3. **Choose evaluators** - Select how you want to measure performance - -Human evaluation configuration - -## Running the evaluation - -After configuring: - -1. Click **Start evaluation** -2. You'll be redirected to the annotation interface -3. Click **Run all** to generate outputs and begin evaluation - - - -## Annotating responses - -For each test case: -1. Review the input and output -2. Use the evaluation form on the right to score the response -3. Click **Annotate** to save your assessment -4. Click **Next** to move to the next test case - -:::tip -Select the **Unannotated** tab to see only the test cases you haven't reviewed yet. -::: - -## Collaboration - -You can invite team members to help with evaluation by sharing the evaluation link. Team members must be added to your workspace first. - -## Next steps - -- Learn about [viewing results](/evaluation/human-evaluation/viewing-results) -- Try [A/B testing](/evaluation/human-evaluation/ab-testing) to compare variants diff --git a/docs/docs/evaluation/human-evaluation/04-viewing-results.mdx b/docs/docs/evaluation/human-evaluation/04-viewing-results.mdx deleted file mode 100644 index e80c933b6f..0000000000 --- a/docs/docs/evaluation/human-evaluation/04-viewing-results.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Viewing Results" -sidebar_label: "Viewing Results" -description: "Learn how to view and export human evaluation results" -sidebar_position: 4 ---- - -## Overview - -After completing annotations, you can review and export the results of your human evaluation. - -## Viewing results - -The **Results** section shows: - -- Aggregated scores across all test cases -- Individual annotations for each test case -- Evaluator performance metrics -- Comments and feedback provided by annotators - -## Comparing with other experiments - -You can compare human evaluation results with: - -- Automated evaluation runs -- Other human evaluation sessions -- Different variants or versions - -This helps you understand how human judgment aligns with automated metrics and identify areas for improvement. - -## Exporting results - -### Export to CSV - -Click **Export results** to download your evaluation data in CSV format. The exported file includes: - -- Test case inputs -- LLM outputs -- All annotation scores and feedback -- Timestamp and annotator information - -### Saving as test set - -Click **Save test set** to create a new test set from annotated data. This is useful for: - -- Bootstrapping automated evaluation with human-validated examples -- Creating regression test suites -- Building training data for custom evaluators - -## Use cases for exported data - -- **Analysis**: Perform statistical analysis on evaluation results -- **Reporting**: Create reports for stakeholders -- **Training**: Use annotations to train or fine-tune models -- **Quality Assurance**: Track quality metrics over time - -## Next steps - -- Learn about [A/B testing](/evaluation/human-evaluation/ab-testing) -- Explore [automated evaluation](/evaluation/evaluation-from-ui/quick-start) -- Understand [configure evaluators](/evaluation/configure-evaluators/overview) diff --git a/docs/docs/evaluation/human-evaluation/05-ab-testing.mdx b/docs/docs/evaluation/human-evaluation/05-ab-testing.mdx deleted file mode 100644 index c2da594532..0000000000 --- a/docs/docs/evaluation/human-evaluation/05-ab-testing.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "A/B Testing" -sidebar_label: "A/B Testing" -description: "Learn how to compare two variants using human evaluation" -sidebar_position: 5 ---- - -import Image from "@theme/IdealImage"; - -## Overview - -A/B testing lets you compare two versions of your application side-by-side. For each test case, you choose which version performs better. - -## Setting up A/B testing - -1. Select **two versions** you want to compare -2. Choose your **test set** -3. For each test case, decide which version is better (or if they're equal) - - - -## A/B testing features - -During A/B evaluation, you can: -- **Compare variants** - Score which version performs better for each test case -- **Add notes** - Include context or detailed feedback -- **Export results** - Download your evaluation data for further analysis - -## Collaborating on A/B tests - -You can invite team members to help with A/B testing by sharing the evaluation link. Team members must be added to your workspace first. - -This is particularly useful for: -- Getting diverse perspectives on performance -- Reducing individual bias -- Speeding up evaluation with multiple annotators - -## Interpreting A/B test results - -After completing the A/B test, you'll see: - -- Win/loss/tie counts for each variant -- Percentage of cases where each variant performed better -- Specific test cases where variants differed significantly -- Notes and comments from annotators - -## Use cases - -A/B testing is ideal for: - -- **Prompt optimization**: Compare different prompt wordings -- **Model selection**: Evaluate different LLM models (GPT-4 vs Claude vs others) -- **Parameter tuning**: Test different temperature or max_tokens settings -- **Feature comparison**: Compare variants with different features enabled - -## Next steps - -- Learn about [exporting results](/evaluation/human-evaluation/viewing-results) -- Explore [automated evaluation](/evaluation/evaluation-from-ui/comparing-runs) for larger-scale comparisons -- Understand [evaluation concepts](/evaluation/concepts) diff --git a/docs/docs/evaluation/human-evaluation/_category_.json b/docs/docs/evaluation/human-evaluation/_category_.json deleted file mode 100644 index 44fdaf5ba8..0000000000 --- a/docs/docs/evaluation/human-evaluation/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Human Evaluation", - "position": 9, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/evaluation/managing-test-sets/01-upload-csv.mdx b/docs/docs/evaluation/managing-test-sets/01-upload-csv.mdx deleted file mode 100644 index 13591eddb7..0000000000 --- a/docs/docs/evaluation/managing-test-sets/01-upload-csv.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Upload Test Sets as CSVs" -sidebar_label: "Upload CSV/JSON" -description: "Learn how to upload test sets from CSV or JSON files" -sidebar_position: 1 ---- - -```mdx-code-block -import Image from "@theme/IdealImage"; -``` - -## Overview - -You can quickly create test sets by uploading CSV or JSON files. This is the fastest way to import existing test data into Agenta. - -## Uploading a file - -To create a test set from a CSV or JSON file: - -1. Go to `Test sets` -2. Click `Upload test sets` -3. Select either `CSV` or `JSON` - - - -## CSV Format - -We use CSV with commas (,) as separators and double quotes (") as quote characters. The first row should contain the header with column names. Each input should have its own column. The column containing the reference answer can have any name, but we use "correct_answer" by default. - -:::info -If you choose a different column name for the reference answer, you'll need to configure the evaluator later with that specific name. -::: - -Here's an example of a valid CSV: - -```csv -text,instruction,correct_answer -Hello,How are you?,I'm good. -"Tell me a joke.",Sure, here's one:... -``` - -## JSON Format - -The test set should be in JSON format with the following structure: - -1. A JSON file containing an array of objects. -2. Each object in the array represents a row, with keys as column headers and values as row data. Here's an example of a valid JSON file: - -```json -[ - { "recipe_name": "Chicken Parmesan", "correct_answer": "Chicken" }, - { "recipe_name": "a, special, recipe", "correct_answer": "Beef" } -] -``` - -## Test set schema for Chat Applications - -For chat applications created using the chat template in Agenta, the input should be saved in the column called `messages`, which would contain the input list of messages: - -```json -[ - { "content": "message.", "role": "user" }, - { "content": "message.", "role": "assistant" } - // Add more messages if necessary -] -``` - -In case the prompt includes other variables (e.g. `context`), make sure to have a column with the same name and the value of the variable. - -The reference answer column (by default `correct_answer`) should follow the same format: - -```json -{ "content": "message.", "role": "assistant" } -``` - -Here is an example of a valid CSV for testing the default chat prompt template: - -```csv chat_test_set.csv -context,messages,correct_answer -test,"[{""role"":""user"",""content"":""hi""}]","{""content"":""Hello! How can I assist you today?"",""role"":""assistant"",""annotations"":[]}" -``` - -## Next steps - -- [Create test sets programmatically](/evaluation/managing-test-sets/create-programatically) using the SDK or API -- [Create test sets from traces](/evaluation/managing-test-sets/create-from-traces) to capture real production data -- [Create test sets from playground](/evaluation/managing-test-sets/create-from-playground) during experimentation diff --git a/docs/docs/evaluation/managing-test-sets/02-create-programatically.mdx b/docs/docs/evaluation/managing-test-sets/02-create-programatically.mdx deleted file mode 100644 index 79c271af22..0000000000 --- a/docs/docs/evaluation/managing-test-sets/02-create-programatically.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Create Test Sets Programmatically" -sidebar_label: "Create Programmatically" -description: "Learn how to create test sets using the API or SDK" -sidebar_position: 2 ---- - -## Overview - -Creating test sets programmatically allows you to automate test set generation, integrate with your CI/CD pipeline, or dynamically generate test cases from existing data sources. - -## Creating via API - -You can upload a test set using our API. Find the [API endpoint reference here](/reference/api/upload-file). - -Here's an example of such a call: - -**HTTP Request:** - -``` -POST /testsets - -``` - -**Request Body:** - -```json -{ - "name": "testsetname", - "csvdata": [ - { "column1": "row1col1", "column2": "row1col2" }, - { "column1": "row2col1", "column2": "row2col2" } - ] -} -``` - -### Example with curl - -```bash -curl -X POST "https://cloud.agenta.ai/api/testsets" \ - -H "Content-Type: application/json" \ - -H "Authorization: ApiKey YOUR_API_KEY" \ - -d '{ - "name": "my_test_set", - "csvdata": [ - {"input": "Hello", "expected": "Hi there!"}, - {"input": "How are you?", "expected": "I am doing well!"} - ] - }' -``` - -## Creating via SDK - -```python -from agenta.client.api import AgentaApi -from agenta.client.types.new_testset import NewTestset - -# Initialize the client -client = AgentaApi( - base_url="https://cloud.agenta.ai/api", - api_key="your-api-key" -) - -# Create test set data -csvdata = [ - {"country": "France", "capital": "Paris"}, - {"country": "Germany", "capital": "Berlin"}, - {"country": "Spain", "capital": "Madrid"} -] - -# Create the test set -response = client.testsets.create_testset( - request=NewTestset( - name="countries_capitals", - csvdata=csvdata - ) -) - -test_set_id = response.id -print(f"Created test set with ID: {test_set_id}") -``` - -## Next steps - -- [Create test sets from UI](/evaluation/managing-test-sets/create-from-ui) for manual creation -- [Create test sets from traces](/evaluation/managing-test-sets/create-from-traces) to capture production data -- [Create test sets from playground](/evaluation/managing-test-sets/create-from-playground) during experimentation diff --git a/docs/docs/evaluation/managing-test-sets/03-create-from-ui.mdx b/docs/docs/evaluation/managing-test-sets/03-create-from-ui.mdx deleted file mode 100644 index d6146d5a67..0000000000 --- a/docs/docs/evaluation/managing-test-sets/03-create-from-ui.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Create Test Sets from UI" -sidebar_label: "Create from UI" -description: "Learn how to create and edit test sets using the Agenta web interface" -sidebar_position: 3 ---- - -```mdx-code-block -import Image from "@theme/IdealImage"; -``` - -## Overview - -The Agenta UI provides an intuitive interface for creating and editing test sets manually. This is ideal when you want to quickly create or edit small test sets. - -## Creating a test set from the UI - -To create a new test set from the UI: - -1. Go to `Test sets` in the navigation -2. Click `Create a test set with UI` -3. Name your test set -4. Specify the columns for input types -5. Add your test cases row by row -6. Click `Save test set` when done - - - -## Editing an existing test set - -To edit an existing test set: - -1. Go to `Test sets` -2. Select the test set you want to edit -3. Make your changes (add, edit, or delete rows) -4. Click `Save test set` to persist your changes - -:::tip -Remember to click `Save test set` before navigating away, or your changes will be lost! -::: - - -## Next steps - -- [Upload test sets as CSV](/evaluation/managing-test-sets/upload-csv) for bulk imports -- [Create test sets programmatically](/evaluation/managing-test-sets/create-programatically) using API/SDK -- [Create test sets from traces](/evaluation/managing-test-sets/create-from-traces) to capture production data -- Learn about [running evaluations](/evaluation/evaluation-from-ui/running-evaluations) with your test sets diff --git a/docs/docs/evaluation/managing-test-sets/04-create-from-traces.mdx b/docs/docs/evaluation/managing-test-sets/04-create-from-traces.mdx deleted file mode 100644 index 32f4ba8da5..0000000000 --- a/docs/docs/evaluation/managing-test-sets/04-create-from-traces.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Create Test Sets from Traces" -sidebar_label: "Create from Traces" -description: "Learn how to create test sets from production traces in observability" -sidebar_position: 4 ---- - -```mdx-code-block -import { Stream } from '@cloudflare/stream-react'; -``` - -## Overview - -One of the most valuable sources of test cases is your production data. Traces captured in the Observability view represent real user interactions with your LLM application. - - -
- -## Adding a Single Trace - -To add a single trace to a test set: - -1. Navigate to the **Observability** view in Agenta -2. Find a trace you want to add to a test set -3. Click the **Add to test set** button at the top of the trace -4. Choose to create a new test set or select an existing one -5. Review the mapping between trace data and test set columns - - Agenta will automatically map the inputs and outputs to appropriate columns - - You can edit the expected answer if you don't agree with the output -6. Click **Save** to add the trace to your test set - -## Adding Multiple Traces at Once - -To efficiently add multiple traces: - -1. In the Observability view, use the search function to filter traces - - For example, search for specific response patterns like "I don't have enough information" -2. Select all relevant traces by checking the boxes next to them -3. Click **Add to test set** -4. Choose an existing test set or create a new one -5. Review the mapping for the traces -6. Click **Save** to add all selected traces to your test set - -## Use cases - -Creating test sets from traces is particularly useful for: - -- **Edge Cases**: Capture unusual or problematic user interactions -- **Regression Testing**: Save examples of correct behavior to prevent future regressions -- **Error Analysis**: Collect failed cases to understand and fix issues - -## Next steps - -- [Create test sets from playground](/evaluation/managing-test-sets/create-from-playground) during experimentation -- [Upload test sets as CSVs](/evaluation/managing-test-sets/upload-csv) for bulk imports -- Learn about [running evaluations](/evaluation/evaluation-from-ui/running-evaluations) with your test sets diff --git a/docs/docs/evaluation/managing-test-sets/05-create-from-playground.mdx b/docs/docs/evaluation/managing-test-sets/05-create-from-playground.mdx deleted file mode 100644 index a9c8d5d603..0000000000 --- a/docs/docs/evaluation/managing-test-sets/05-create-from-playground.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "Create Test Sets from Playground" -sidebar_label: "Create from Playground" -description: "Learn how to create test sets directly from the playground while experimenting" -sidebar_position: 5 ---- - -```mdx-code-block -import { Stream } from '@cloudflare/stream-react'; -``` - -## Overview - -The playground offers a convenient way to create and add data to a test set. This workflow is useful when you discover interesting cases or edge cases while experimenting with your LLM application. - - -
- -## Adding data points from the playground - -To add a data point to a test set from the playground: - -1. Work with your application in the playground -2. When you find an interesting case, click the `Add to test set` button located near the `Run` button -3. A drawer will display showing the inputs and outputs from the playground -4. You can modify inputs and correct answers if needed -5. Select an existing test set to add to, or choose `+Add new` to create a new one -6. Once you're satisfied, click `Add` to finalize - -## Next steps - -- [Upload test sets as CSVs](/evaluation/managing-test-sets/upload-csv) for bulk imports -- [Create test sets from traces](/evaluation/managing-test-sets/create-from-traces) to capture production data -- Learn about [running evaluations](/evaluation/evaluation-from-ui/running-evaluations) with your test sets diff --git a/docs/docs/evaluation/managing-test-sets/_category_.json b/docs/docs/evaluation/managing-test-sets/_category_.json deleted file mode 100644 index 45dbdaf1b2..0000000000 --- a/docs/docs/evaluation/managing-test-sets/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Manage Test Sets", - "position": 5, - "collapsible": true, - "collapsed": true -} \ No newline at end of file diff --git a/docs/docs/getting-started/01-introduction.mdx b/docs/docs/getting-started/01-introduction.mdx index d7e9e591c8..b27a8dcdec 100644 --- a/docs/docs/getting-started/01-introduction.mdx +++ b/docs/docs/getting-started/01-introduction.mdx @@ -14,52 +14,31 @@ import Image from "@theme/IdealImage"; alt="Screenshots of Agenta LLMOPS platform" loading="lazy" /> -Agenta is an **open-source LLMOps platform** that helps **developers** and **product teams** build reliable LLM applications. +Agenta is an open-source platform that helps **developers** and **product teams** +build robust AI applications powered by LLMs. It offers all the tools for **prompt +management and evaluation**. +### With Agenta, you can: -Agenta covers the entire LLM development lifecycle: **prompt management**, **evaluation**, and **observability**. +1. Rapidly [**experiment** and **compare** prompts](/prompt-engineering/overview) on [any LLM workflow](/custom-workflows/overview) (chain-of-prompts, Retrieval Augmented Generation (RAG), LLM agents...) +2. Rapidly [**create test sets**](/evaluation/create-test-sets) and **golden datasets** for evaluation +3. **Evaluate** your application with pre-existing or **custom evaluators** +4. **Annotate** and **A/B test** your applications with **human feedback** +5. [**Collaborate with product teams**](/misc/team_management) for prompt engineering and evaluation +6. [**Deploy your application**](/concepts/concepts#environments) in one-click in the UI, through CLI, or through github workflows. -## Features +Agenta focuses on increasing the speed of the development cycle of LLM applications by increasing the speed of experimentation. -### Prompt Engineering and Management +## How is Agenta different? -Teams often struggle with prompt collaboration. They keep prompts in code where subject matter experts cannot edit them. Or they use spreadsheets in an unreliable process. - -Agenta organizes prompts for your team. Subject matter experts can collaborate with developers without touching the codebase. Developers can version prompts and deploy them to production. - -The playground lets teams experiment with prompts. You can load traces and test sets. You can test prompts side by side. - - -### Evaluation - -Most teams lack a systematic evaluation process. They make random prompt changes based on vibes. Some changes improve quality but break other cases because LLMs are stochastic. - -Agenta provides one place to evaluate systematically. Teams can run three types of evaluation: - -- Automatic evaluation with LLMs at scale before production -- Human annotation where subject matter experts review results and provide feedback to AI engineers -- Online evaluation for applications already in production - -Both subject matter experts and engineers can run evaluations from the UI. - -### Observability - -Agenta helps you understand what happens in production. You can capture user feedback through an API (thumbs up or implicit signals). You can debug agents and applications with tracing to see what happens inside them. - -Track costs over time. Find edge cases where things fail. Add those cases to your test sets. Have subject matter experts annotate the results. +### Works with any LLM app workflow +Agenta enables prompt engineering and evaluation on any LLM app architecture, such as **Chain of Prompts**, **RAG**, or **LLM agents**. It is compatible with any framework like **Langchain** or **LlamaIndex**, and works with any model provider, such as **OpenAI**, **Cohere**, or **local models**. -## Why Agenta? +[Jump here](/custom-workflows/overview) to see how to use your own custom application with Agenta. ### Enable collaboration between developers and product teams Agenta empowers **non-developers** to iterate on the configuration of any custom LLM application, evaluate it, annotate it, A/B test it, and deploy it, all within the user interface. -### Open-source and MIT licensed - -Agenta is open-source and MIT licensed, so you can self-host it, modify it, and use it in commercial projects without restrictions. - -### Works with any LLM app workflow - -Agenta enables prompt engineering and evaluation on any LLM app architecture, such as **Chain of Prompts**, **RAG**, or **LLM agents**. It is compatible with any framework like **Langchain** or **LlamaIndex**, and works with any model provider, such as **OpenAI**, **Cohere**, or **local models**. - +By **adding a few lines to your application code**, you can create a prompt playground that allows non-developers to experiment with prompts for your application and use all the tools within Agenta. diff --git a/docs/docs/getting-started/02-quick-start.mdx b/docs/docs/getting-started/02-quick-start.mdx index 0535b21280..a4b33d93ce 100644 --- a/docs/docs/getting-started/02-quick-start.mdx +++ b/docs/docs/getting-started/02-quick-start.mdx @@ -12,13 +12,13 @@ import TabItem from '@theme/TabItem'; This guide walks you through creating, evaluating, and deploying your first LLM application using Agenta's user interface. In just a few minutes, you'll have a working prompt that you can use in production.
- ⏯️ Watch a short demo of the quick start guide. + Prefer learning by watching? We have a **3-minute video** that covers the same steps. -
- -## Getting Started: Basic Concepts - -### Traces - -A trace represents the complete journey of a request through your application. In our context, a trace corresponds to a single request to your LLM application. - -For example, when a user asks your chatbot a question, that entire interaction is captured as one trace. The trace includes receiving the query, processing it, and returning the response. - -### Spans - -A span is a unit of work within a trace. Spans can be nested, forming a tree-like structure. - -The **root span** represents the overall operation (like "handle user query"). **Child spans** represent sub-operations (like "retrieve context", "call LLM", or "format response"). - -Agenta enriches each span with cost information for LLM calls, latency measurements, input/output data, and custom metadata you add. - -### Span Kinds - -Agenta categorizes spans using span kinds. These help you understand different types of operations in your LLM workflow. - -Available span kinds: -- `agent` for autonomous agent operations -- `chain` for sequential operations -- `workflow` for complex multi-step processes -- `tool` for tool or function calls -- `embedding` for vector embedding generation -- `query` for database or search queries -- `completion` for LLM completions -- `chat` for chat-based LLM interactions -- `rerank` for re-ranking operations - -### Events - -Spans can contain events. These are timestamped records of things that happen during span execution. Agenta automatically logs exceptions as events, which helps you debug errors in your traces. - -## Working with OpenTelemetry - -### Direct OpenTelemetry Integration - -You can instrument your application using standard OpenTelemetry SDKs. Agenta accepts any OpenTelemetry span that follows the specification. For Agenta-specific features (like cost tracking and formatted messages), use attributes in our semantic conventions. See the [semantic conventions guide](/observability/trace-with-opentelemetry/semantic-conventions) for details. - -### Auto-Instrumentation Compatibility - -Agenta works with auto-instrumentation from popular libraries, even if they are not listed in our integrations. We support semantic conventions from [OpenInference](https://github.com/Arize-ai/openinference), [OpenLLMetry](https://github.com/traceloop/openllmetry), and [PydanticAI](/observability/integrations/pydanticai). - -When these libraries send spans to Agenta, we automatically translate their conventions to our format. No extra configuration is needed. This means that if you have any package that auto-instruments using these conventions, it will work with Agenta. - -## Understanding Span Types - -Agenta distinguishes between two types of spans. This separation helps you analyze application behavior independently from evaluation results. - -### Invocation Spans - -Invocation spans capture your application's actual work. They record what your LLM application does when it executes. - -Examples include LLM calls and completions, retrieval operations, tool executions, and agent reasoning steps. - -### Annotation Spans - -Annotation spans capture evaluations and feedback about invocations. They include automatic evaluations (like LLM-as-a-judge or custom metrics), human feedback and ratings, and evaluation results from test runs. - -When you evaluate a span or add feedback, Agenta creates an annotation span. The annotation span links to the original invocation span (explained in the Links section below). This keeps application traces clean while still capturing evaluation data. - -## Organizing and Filtering Traces - -### Attributes: Adding Metadata - -Attributes add information to spans. They are key-value pairs attached to each span. Agenta treats certain attributes specially for better UI experience. - -**Special attributes** use the `ag.` namespace. Cost and tokens get displayed prominently with user-friendly filtering. Model and system information appears in span details. Data attributes (inputs and outputs) are formatted based on span kind. - -**Custom attributes** can be any key-value pair you add. They are searchable and filterable, but they do not get special UI treatment. - -See all available attributes in our [semantic conventions guide](/observability/trace-with-opentelemetry/semantic-conventions). - -### References: Linking to Agenta Entities - -References connect spans to entities you have created in Agenta. They use a structured format and enable powerful organization. - -You can reference applications and their variants, environments (production, staging, development), test sets and test cases, and evaluators. - -Common use cases include filtering traces by application (like "show all traces from my chatbot-v2 variant"), comparing performance, and tracking prompt versions. - -Each reference can point to a specific variant and version. This gives you precise control over trace organization. References are especially useful for teams managing multiple applications and configurations. - -Learn more about using references in the [reference prompt versions guide](/observability/trace-with-python-sdk/reference-prompt-versions). - -### Links: Connecting Related Spans - -Links connect spans across different traces. Agenta uses them to connect annotations to invocations. - -When you evaluate a span, we cannot modify it because spans are immutable in OpenTelemetry. Instead, we create a new annotation span and link it to the original invocation span. This preserves the original trace while connecting evaluation results to the spans they evaluate. - -Links enable several features. You can view all evaluations for a specific application run. You can see feedback attached to the relevant invocation. You can filter traces by evaluation results. - -Links happen automatically when you use Agenta's evaluation features. - -## Applications, Variants, and Environments - -Agenta organizes your observability data around three key concepts: - -**Applications** are top-level containers for your LLM applications. An application could be a chatbot, a summarization tool, or any other LLM-powered feature. - -**Variants** are different versions or configurations of your application. You might have a "gpt-4-turbo" variant and a "claude-opus" variant. Or you might have variants for different prompts or parameters. - -**Environments** are deployment stages. Common environments include development, staging, and production. - -This organization helps you compare performance across different configurations and track behavior in different environments. - -## How Agenta Enhances OpenTelemetry - -Agenta uses standard OpenTelemetry for tracing. We add LLM-specific enhancements on top of it. - -### Automatic Cost Tracking and Token Counting - -We calculate costs for LLM calls based on model pricing. We track token usage (prompt tokens, completion tokens, and total) for each interaction. These metrics appear prominently in the UI and support user-friendly filtering. - -### Prompt Versioning Integration - -You can link traces to specific prompt versions in your registry. This helps you understand which prompt configuration generated each trace. - -### Test Set Integration - -You can convert production traces into test cases with one click. This makes it easy to build test sets from real user interactions. - -### LLM-Aware UI - -The Agenta UI understands LLM-specific data. Chat messages are formatted nicely. You can filter by cost, tokens, model, and other LLM-specific attributes. The UI shows parent-child relationships in your agent workflows clearly. - -## Next Steps - -- [Get started with Python SDK](/observability/quickstart-python) -- [Learn about tracing with OpenTelemetry](/observability/trace-with-opentelemetry/getting-started) -- [Explore integrations](/observability/integrations/openai) for popular LLM frameworks diff --git a/docs/docs/observability/04-opentelemetry.mdx b/docs/docs/observability/04-opentelemetry.mdx new file mode 100644 index 0000000000..8fc4f076d1 --- /dev/null +++ b/docs/docs/observability/04-opentelemetry.mdx @@ -0,0 +1,192 @@ +--- +title: Distributed Tracing with OpenTelemetry +sidebar_label: Distributed Tracing in Otel +description: "Learn how to use OpenTelemetry to instrument your LLM application with Agenta for enhanced observability." +--- + +Agenta provides built-in OpenTelemetry instrumentation to simplify distributed tracing in your applications. This guide explains how to implement and manage distributed tracing using the Agenta SDK, and how to integrate external tracing setups with Agenta. + +## Using OpenTelemetry with Agenta +Agenta supports distributed tracing out of the box when using the provided SDK functions: + +### 1. Sending Requests (Propagation) + +When making requests to other services or sub-systems, use `agenta.tracing.inject()` to inject necessary headers: + +```python +method = "POST" +url = "https://example-service/api" +params = {} +headers = agenta.tracing.inject() # automatically injects 'Authorization', 'Traceparent', 'Baggage' +body = {"key": "value"} + +response = requests.request( + method=method, + url=url, + params=params, + headers=headers, + json=body, +) +``` +The `agenta.tracing.inject()` function returns headers containing: + +- `Authorization`: Authentication information +- `Traceparent`: Identifies the current trace and span +- `Baggage`: Contains application-specific context + +These headers can be modified before sending them as part of the request if needed. + +### 2. Receiving Requests (Extraction) + +Agenta simplifies receiving and handling incoming trace contexts: + +- If you're using `ag.route()` and `ag.instrument()`, extraction is automatic. +- For manual extraction, use `agenta.tracing.extract()`: + +```python +traceparent, baggage = agenta.tracing.extract() # includes 'Traceparent', 'Baggage' + +# Use traceparent and baggage to set up your OpenTelemetry context +# (Implementation depends on your specific use case) +``` + +:::note +`extract()` does not provide `Authorization` because there are many authentication methods (apikey, bearer, secret, access tokens), each requiring different handling. The middlewares and decorators in the Agenta SDK handle this automatically when you use `ag.route()` and `ag.instrument()`. +::: + +## OpenTelemetry Tracing without Agenta SDK +If you're working with systems that don't use the Agenta SDK, you can still integrate with Agenta's tracing infrastructure using standard OpenTelemetry. + +### 1. Setup Requirements +Install dependencies: +```bash +pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp +``` + +### 2. Configure Environment Variables + +```bash +# OTEL_PROPAGATORS = unset or "tracecontext,baggage" +# OTEL_EXPORTER_OTLP_COMPRESSION = unset or "gzip" +# OTEL_EXPORTER_OTLP_ENDPOINT = "https://cloud.agenta.ai/api/otlp" +# OTEL_EXPORTER_OTLP_HEADERS = "authorization=ApiKey xxx" +# OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = "https://cloud.agenta.ai/api/otlp/v1/traces" +# OTEL_EXPORTER_OTLP_TRACES_HEADERS = "authorization=ApiKey xxx" +``` + +### 3. Setup in Code +```python +from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator +from opentelemetry.baggage.propagation import W3CBaggagePropagator +from opentelemetry.sdk.trace import TracerProvider, Span +from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter, Compression + +# Configuration +endpoint = "https://cloud.agenta.ai/api/otlp/v1/traces" +compression = Compression.Gzip +headers = { + "traceparent": "00-xxx-xxx-01", + "baggage": "ag.refs.application.id=xxx", + "authorization": "ApiKey xxx", +} + +# Set up provider, processor, and tracer +provider = TracerProvider() + +processor = BatchSpanProcessor( + OTLPSpanExporter( + endpoint=endpoint, + headers={"authorization": headers["authorization"]}, + compression=compression, + ) +) + +provider.add_span_processor(processor) + +tracer = provider.get_tracer("agenta.tracer") + +# Extract incoming trace context +carrier = {"traceparent": headers["traceparent"]} +context = TraceContextTextMapPropagator().extract(carrier=carrier, context=None) + +carrier = {"baggage": headers["baggage"]} +context = W3CBaggagePropagator().extract(carrier=carrier, context=context) + +# Create and use spans +with tracer.start_as_current_span(name="agenta", context=context) as span: + span: Span + + print(hex(span.get_span_context().trace_id)) + print(hex(span.get_span_context().span_id)) + print(span.name) +``` + +## Using an OTEL Collector + +If you're using an OpenTelemetry collector, you can configure it to export traces to Agenta. +Here's a sample configuration (`otel-collector-config.yml`): + +```yaml +receivers: + otlp: + protocols: + http: + endpoint: 0.0.0.0:4318 + +processors: + batch: {} + +exporters: + otlphttp/agenta: + endpoint: "https://cloud.agenta.ai/api/otlp" + +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlphttp/agenta] +``` + +With this configuration: + +- The collector receives traces via OTLP/HTTP on port 4318 +- It batches the spans for efficiency +- It exports them to Agenta's OTLP endpoint + +## Span Attributes + +When using OpenTelemetry without the Agenta SDK, you need to manually set the appropriate attributes on your spans to integrate properly with Agenta's ecosystem. + +### Namespace Convention + +Agenta uses the `ag.*` namespace for its attributes. Here are the key namespaces: + +- `ag.refs.*`: References to Agenta entities (applications, etc.) +- `ag.data.*`: Input, internal, and output data +- `ag.metrics.*`: Performance metrics and costs + +### Examples + +```python +# Reference to Agenta application +span.set_attribute("ag.refs.application.id", AGENTA_APPLICATION_ID) + +# Data attributes +span.set_attribute("ag.data.inputs.key", "Hello,") +span.set_attribute("ag.data.internals.key", "(Leo)") +span.set_attribute("ag.data.outputs.key", "World!") + +# Metrics - unit values +span.set_attribute("ag.metrics.unit.some_key", 3) +span.set_attribute("ag.metrics.acc.some_key", 15) + +# Cost and token metrics +span.set_attribute("ag.metrics.unit.costs.total", 1) +span.set_attribute("ag.metrics.unit.tokens.total", 100) +``` + +:::info +Apart from these custom attributes, standard OpenTelemetry events, links, status, and exceptions work as usual. +::: \ No newline at end of file diff --git a/docs/docs/observability/05-otel-semconv.mdx b/docs/docs/observability/05-otel-semconv.mdx new file mode 100644 index 0000000000..440657179c --- /dev/null +++ b/docs/docs/observability/05-otel-semconv.mdx @@ -0,0 +1,251 @@ +--- +title: Agenta OpenTelemetry Semantic Conventions +sidebar_label: Otel Semantic Conventions +description: "Learn about the OpenTelemetry semantic conventions used by Agenta's LLM observability system." +--- + +This document describes how Agenta applies domain-specific OpenTelemetry conventions to capture and analyze traces from LLM applications. + +## How It Works +Agenta accepts any span that follows the OpenTelemetry specification. To unlock LLM-specific features—such as nicely formatted chat messages, per-request cost and latency, and links to prompt configurations or evaluators—we add attributes under the `ag.` namespace. + +:::info +The OTLP endpoint accepts batches up to **5 MB** by default (after decompression). Larger requests return an HTTP `413` status code. +::: + +We support two primary instrumentation approaches: + +- **Agenta SDK:** When using our SDK with decorators like `@ag.instrument`, we automatically handle the semantic conventions +- **Auto-instrumentation libraries:** We provide adapters that transform data from standard auto-instrumentation libraries (which follow their own conventions) into Agenta's format + +## Agenta Namespace + +All Agenta-specific attributes are organized under the `ag` namespace to avoid conflicts with other OpenTelemetry conventions. + +## Core Semantic Conventions + +### ag.data + +The `ag.data` namespace contains the core execution data for each span: + +- **`ag.data.inputs`**: Input parameters for the span +- **`ag.data.outputs`**: Output results from the span +- **`ag.data.internals`**: Internal variables and intermediate values + +#### Data Format + +**Inputs and Outputs**: Stored as JSON format. For chat applications using LLM spans, these are formatted as a list of messages: + +```json +{ + "data": { + "inputs": { + "prompt": [ + { "role": "system", "content": "System instruction" }, + { "role": "user", "content": "User query" } + ], + "functions": [...], + "tools": [...] + }, + "outputs": { + "completion": [ + { "role": "assistant", "content": "Assistant response" } + ] + } + } +} +``` + + +**Internals**: User-provided internal information such as context variables, intermediate calculations, or evaluation data that aren't part of the primary inputs/outputs. These are set by the user [in the SDK using](/observability/observability-sdk#storing-internals) `ag.store_internals()`. + +#### SDK Integration + +When using the `@ag.instrument` decorator in Python: + +```python +@ag.instrument +def my_function(input_param): + # Function inputs and outputs are automatically captured + # unless explicitly masked + return result +``` + +The decorator automatically captures function inputs and outputs in `ag.data.inputs` and `ag.data.outputs` unless you choose to [mask sensitive data](/observability/observability-sdk). + +### ag.meta + +The `ag.meta` namespace stores metadata about the span execution: + +```json +{ + "meta": { + "system": "openai", + "request": { + "base_url": "https://api.openai.com/v1", + "endpoint": "/chat/completions", + "headers": {...}, + "streaming": false, + "model": "gpt-4", + "max_tokens": 1000, + "temperature": 0.7, + "top_p": 0.9, + "top_k": 50 + }, + "response": { + "model": "gpt-4-0613" + }, + "configuration": { + "prompt": { + "input_keys": ["country"], + "messages": [...], + "template_format": "curly", + "llm_config": { + "model": "mistral/mistral-tiny" + } + } + } + } +} +``` + +#### Standard Metadata + +:::info +Auto-instrumentation maps common semantic-convention keys—e.g. gen_ai.system, gen_ai.request.*—to the structure above. +::: + +- `ag.meta.system`: Identifies the LLM provider or system being used (e.g., "openai", "anthropic") +- `ag.meta.request.base_url`: The base URL for the API request +- `ag.meta.request.endpoint`: The specific API endpoint called +- `ag.meta.request.headers`: HTTP headers sent with the request +- `ag.meta.request.streaming`: Boolean indicating if streaming mode was used +- `ag.meta.request.model`: The model name requested +- `ag.meta.request.max_tokens`: Maximum token limit for the response +- `ag.meta.request.temperature`: Sampling temperature parameter +- `ag.meta.request.top_p`: Nucleus sampling parameter +- `ag.meta.request.top_k`: Top-k sampling parameter + +Metadata is displayed in the observability overview page as contextual information to help navigate and understand span execution. + +### ag.refs + +The `ag.refs` namespace contains references to entities within the Agenta system: + +```json +{ + "refs": { + "application": { + "id": "uuid" + }, + "variant": { + "id": "uuid", + "version": "1" + }, + "environment": { + "slug": "production", + "id": "uuid" + } + } +} +``` + +#### Reference Types + +- **Application**: Links to the Agenta application +- **Variant**: References specific prompt variants and versions +- **Environment**: Links to deployment environments (production, staging, etc.) +- **Test Set**: References to test datasets +- **Test Case**: Links to individual test cases +- **Evaluation Run**: References to evaluation executions +- **Evaluator**: Links to evaluation functions + +These references enable navigation within the Agenta UI and allow filtering spans by specific entities. + +### ag.metrics + +The `ag.metrics` namespace tracks performance and cost metrics: + +```json +{ + "metrics": { + "acc": { + "costs": { + "total": 0.00003925 + }, + "tokens": { + "total": 157, + "prompt": 26, + "completion": 131 + }, + "duration": { + "total": 1251.157 + } + }, + "unit": { + "costs": { + "total": 0.00003925 + }, + "tokens": { + "total": 157, + "prompt": 26, + "completion": 131 + } + } + } +} +``` + +#### Metric Types + +- **Accumulated (`acc`)**: Metrics rolled up across child spans +- **Unit (`unit`)**: Metrics specific to the individual span + +#### Available Metrics + +- **Costs**: Total cost in USD for LLM API calls +- **Tokens**: Token usage breakdown (total, prompt, completion) +- **Duration**: Execution time in milliseconds + +## Additional Agenta Attributes + +### ag.type + +The `ag.type` namespace contains type information about the span: + +`ag.type.node` can be `workflow`, `task`, `tool`, `embedding`, `query`, `completion`, `chat`, `rerank`. + + +### ag.tags + +The `ag.tags` namespace allows you to add custom tags to spans for categorization and filtering: + +```python +# Add custom tags using the SDK +ag.add_tags({"key":"value"}) +``` + +### ag.version + +Tracks version information for the instrumented application or component. + +### ag.flags + +Contains system-specific flags and metadata used internally by Agenta for span processing and display. + +:::note +When using auto-instrumentation libraries, most attributes are saved twice - once in their original format and once processed under the `ag` namespace +::: + +## Standard OpenTelemetry Attributes + +In addition to Agenta-specific conventions, traces include standard OpenTelemetry attributes: + +- **Links**: Relationships between spans +- **Events**: Timestamped events within spans +- **Version**: OpenTelemetry version information +- **Status Code**: Span completion status +- **Start Time**: Span initiation timestamp +- **Span Name**: Human-readable span identifier +- **Span Kind**: Type of span (server, client, internal, etc.) + diff --git a/docs/docs/observability/09-troubleshooting.mdx b/docs/docs/observability/09-troubleshooting.mdx deleted file mode 100644 index 1894bf298d..0000000000 --- a/docs/docs/observability/09-troubleshooting.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: "Troubleshooting" -sidebar_label: "Troubleshooting" -description: "Common issues and solutions for Agenta observability with Python SDK and OpenTelemetry" -sidebar_position: 9 ---- - -## Common Issues - -This page covers common issues you might encounter when using Agenta observability with either the Python SDK or OpenTelemetry. - -## Invalid Content Format - -You may receive a 500 error with the message "Failed to parse OTLP stream." This happens when you send trace data in JSON format instead of Protobuf. - -Agenta's OTLP endpoints accept only the Protobuf format (binary encoding). The server cannot parse JSON payloads. When you configure your OpenTelemetry exporter to use JSON encoding, the request will fail. - -### Solution - -Configure your OpenTelemetry exporter to use Protobuf encoding. Most OpenTelemetry exporters use Protobuf by default, so you typically don't need to specify it explicitly. - -For the Python SDK, import `OTLPSpanExporter` from the proto package (not the json package). The exporter class name should include "proto" in its import path. - -For the OpenTelemetry Collector, verify that the encoding field is set to `proto` or omit it entirely (since proto is the default). - -For JavaScript and Node.js, use `@opentelemetry/exporter-trace-otlp-proto` instead of the JSON variant. Avoid any exporter package with "json" in its name. - -Do not set `encoding: json` in your configuration files. Agenta does not support JSON-encoded OTLP payloads. - -## Payload Too Large - -Your collector may receive a 413 response when posting to `/otlp/v1/traces`. This means the batch size exceeds the limit. Agenta accepts batches up to 5 MB by default. - -Reduce the batch size in your collector configuration. You can also enable compression (such as gzip) to keep requests under the limit. - -## Missing Traces in Serverless Functions - -Some traces may not appear in the Agenta dashboard when you run observability in serverless environments. This includes AWS Lambda, Vercel Functions, Cloudflare Workers, and Google Cloud Functions. - -OpenTelemetry batches spans in background processes before exporting them. This improves efficiency. However, serverless functions terminate abruptly. They often stop before the background processes finish sending trace data to Agenta. The spans get buffered but never exported. - -### Solution - -Call the `force_flush()` method before your function terminates. This ensures all spans export before the function exits. Import `get_tracer_provider` from `opentelemetry.trace` and call `force_flush()` on it. Place this call in a finally block so it runs even if errors occur. - -## Traces Not Appearing in UI - -First, verify that your `AGENTA_API_KEY` is set correctly and has the necessary permissions. - -Next, check your endpoint configuration. Point to the correct Agenta host. For cloud deployments, use `https://cloud.agenta.ai`. For self-hosted instances, use your instance URL (such as `http://localhost`). - -Finally, confirm that you call `ag.init()` before any instrumented functions execute. - -## Authentication Errors - -You may receive 401 Unauthorized errors when sending traces. This happens for three main reasons. - -First, verify that your API key is correct. Check for typos or missing characters. - -Second, confirm that the key has not expired. Some API keys have expiration dates. - -Third, ensure you use the correct format. The authorization header should follow this pattern: `ApiKey YOUR_KEY_HERE`. - -## Performance Issues - -### High memory usage - -You can reduce memory usage in three ways. Enable gzip compression for OTLP exports to reduce the size of data in memory. Lower the number of spans sent per batch. Implement sampling to avoid sending 100% of traces in high-volume scenarios. - -### High latency - -Instrumentation should not add significant latency. If it does, check three things. Ensure spans export in the background using async export. Tune your batch size and export intervals to find the right balance. Review custom instrumentation to verify that custom spans are not performing expensive operations. - -## OpenTelemetry-Specific Issues - -### Context propagation not working - -Distributed tracing may fail to work across services. Check three things to fix this. Verify that propagators are configured correctly (set `OTEL_PROPAGATORS=tracecontext,baggage`). Confirm that headers pass between services. Ensure all services use compatible OpenTelemetry versions. - -### Spans not nesting correctly - -Spans may appear flat instead of nested in the trace view. This indicates a context problem. Verify that context passes correctly between functions. Check that you use `start_as_current_span` with proper context. Make parent-child relationships explicit in your code. - -## Python SDK-Specific Issues - -### Decorator not capturing data - -The `@ag.instrument()` decorator may fail to capture inputs and outputs. This happens for three reasons. The decorator must be the top-most decorator on your function. You must call `ag.init()` before the function runs. The function must return a value (printing alone is not enough). - -### Metadata not appearing - -Data from `ag.tracing.store_meta()` may not show in the UI. Call this method only within an instrumented function. Check that the span context is active when you call it. Verify that your data format is JSON-serializable. - -## Need More Help? - -Check the [Agenta documentation](/observability/concepts) for more details about observability concepts. Review our [integration guides](/observability/integrations/openai) for framework-specific help. Visit our [GitHub issues](https://github.com/anthropics/agenta/issues) to report bugs. Join our community for support. - -## Next steps - -Review the [setup instructions](/observability/trace-with-python-sdk/setup-tracing) to ensure correct configuration. Explore [distributed tracing](/observability/trace-with-opentelemetry/distributed-tracing) to understand how traces work across services. Check the [integrations](/observability/integrations/openai) page for your specific framework. diff --git a/docs/docs/observability/_using-the-ui/01-filtering-traces.mdx b/docs/docs/observability/_using-the-ui/01-filtering-traces.mdx deleted file mode 100644 index 8a7e64686b..0000000000 --- a/docs/docs/observability/_using-the-ui/01-filtering-traces.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Filtering Traces" -sidebar_label: "Filtering Traces" -description: "Learn how to filter and search traces in the Agenta observability UI" -sidebar_position: 1 ---- - - - -## Overview - -Learn how to filter and search traces in the Agenta observability UI - -## Next steps - -- Explore [query data options](/observability/query-data/query-api) -- Learn about [Python SDK tracing](/observability/trace-with-python-sdk/setup-tracing) diff --git a/docs/docs/observability/_using-the-ui/02-adding-comments.mdx b/docs/docs/observability/_using-the-ui/02-adding-comments.mdx deleted file mode 100644 index 98e180d2a2..0000000000 --- a/docs/docs/observability/_using-the-ui/02-adding-comments.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Adding Comments" -sidebar_label: "Adding Comments" -description: "Learn how to add comments and notes to traces for team collaboration" -sidebar_position: 2 ---- - - - -## Overview - -Learn how to add comments and notes to traces for team collaboration - -## Next steps - -- Explore [query data options](/observability/query-data/query-api) -- Learn about [Python SDK tracing](/observability/trace-with-python-sdk/setup-tracing) diff --git a/docs/docs/observability/_using-the-ui/03-adding-annotations.mdx b/docs/docs/observability/_using-the-ui/03-adding-annotations.mdx deleted file mode 100644 index 99fe14cdcd..0000000000 --- a/docs/docs/observability/_using-the-ui/03-adding-annotations.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Adding Annotations" -sidebar_label: "Adding Annotations" -description: "Learn how to annotate traces with custom evaluations and feedback" -sidebar_position: 3 ---- - - - -## Overview - -Learn how to annotate traces with custom evaluations and feedback - -## Next steps - -- Explore [query data options](/observability/query-data/query-api) -- Learn about [Python SDK tracing](/observability/trace-with-python-sdk/setup-tracing) diff --git a/docs/docs/observability/_using-the-ui/04-exporting-data.mdx b/docs/docs/observability/_using-the-ui/04-exporting-data.mdx deleted file mode 100644 index 47275e0d0c..0000000000 --- a/docs/docs/observability/_using-the-ui/04-exporting-data.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Exporting Data" -sidebar_label: "Exporting Data" -description: "Learn how to export trace data from the Agenta UI for analysis" -sidebar_position: 4 ---- - - - -## Overview - -Learn how to export trace data from the Agenta UI for analysis - -## Next steps - -- Explore [query data options](/observability/query-data/query-api) -- Learn about [Python SDK tracing](/observability/trace-with-python-sdk/setup-tracing) diff --git a/docs/docs/observability/_using-the-ui/_category_.json b/docs/docs/observability/_using-the-ui/_category_.json deleted file mode 100644 index 91b2c97fee..0000000000 --- a/docs/docs/observability/_using-the-ui/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Using the UI", - "position": 7, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/observability/integrations/01-openai.mdx b/docs/docs/observability/integrations/01-openai.mdx index 24f5f3fb39..84000d407b 100644 --- a/docs/docs/observability/integrations/01-openai.mdx +++ b/docs/docs/observability/integrations/01-openai.mdx @@ -1,7 +1,5 @@ --- -title: Tracing and Observability for OpenAI with Agenta -sidebar_label: OpenAI -description: Learn how to instrument OpenAI traces with Agenta for enhanced LLM observability. This guide covers setup, configuration, and best practices for monitoring OpenAI API calls and workflows. +title: OpenAI --- ```mdx-code-block diff --git a/docs/docs/observability/integrations/02-langchain.mdx b/docs/docs/observability/integrations/02-langchain.mdx index 8d365ce859..4f94b2ede3 100644 --- a/docs/docs/observability/integrations/02-langchain.mdx +++ b/docs/docs/observability/integrations/02-langchain.mdx @@ -1,6 +1,5 @@ --- -title: Tracing and Observability for LangChain with Agenta -sidebar_label: LangChain +title: LangChain description: Learn how to instrument LangChain traces with Agenta for enhanced LLM observability. This guide covers setup, configuration, and best practices for monitoring LLM applications using LangChain and OpenAI models. --- diff --git a/docs/docs/observability/integrations/04-instructor.mdx b/docs/docs/observability/integrations/04-instructor.mdx index 0b07fc0b19..20fe4f129f 100644 --- a/docs/docs/observability/integrations/04-instructor.mdx +++ b/docs/docs/observability/integrations/04-instructor.mdx @@ -1,6 +1,5 @@ --- -title: Tracing and Observability for Instructor with Agenta -sidebar_label: Instructor +title: Instructor description: Learn how to implement and monitor Instructor traces with Agenta for enhanced LLM observability. This comprehensive guide covers setup, configuration, and best practices for tracking structured data extraction using Instructor and OpenAI models. --- diff --git a/docs/docs/observability/integrations/05-litellm.mdx b/docs/docs/observability/integrations/05-litellm.mdx index 85f7edd07a..019f9b7892 100644 --- a/docs/docs/observability/integrations/05-litellm.mdx +++ b/docs/docs/observability/integrations/05-litellm.mdx @@ -1,6 +1,5 @@ --- -title: Tracing and Observability for LiteLLM with Agenta -sidebar_label: LiteLLM +title: LiteLLM description: Learn how to instrument LiteLLM traces with Agenta for enhanced LLM observability. This guide covers setup, configuration, and best practices for monitoring API calls and performance using LiteLLM and OpenAI models. --- diff --git a/docs/docs/observability/integrations/06-llamaindex.mdx b/docs/docs/observability/integrations/06-llamaindex.mdx index 5253e193e3..d1074cc474 100644 --- a/docs/docs/observability/integrations/06-llamaindex.mdx +++ b/docs/docs/observability/integrations/06-llamaindex.mdx @@ -1,24 +1,26 @@ --- -title: Tracing and Observability for LlamaIndex with Agenta +title: Observability for LlamaIndex with Agenta sidebar_label: LlamaIndex description: Monitor and debug your LlamaIndex applications with Agenta's observability platform. Get complete visibility into your RAG pipelines and document search workflows. --- ```mdx-code-block import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; ``` + +# Observability for LlamaIndex with Agenta + +:::info +This guide is available as Jupyter Notebook [here](https://github.com/agenta-ai/agenta/blob/main/examples/jupyter/integrations/observability-openinference-llamaindex.ipynb). +::: + Learn how to monitor your **[LlamaIndex](https://www.llamaindex.ai/)** applications using **Agenta's** observability platform. Get complete visibility into your document search, RAG pipelines, and LLM interactions. > **What is Agenta?** [Agenta](https://agenta.ai) is an open-source LLMOps platform designed to streamline the deployment, management, and scaling of large language models. It offers comprehensive observability, testing, and deployment capabilities for AI applications. > **What is LlamaIndex?** [LlamaIndex](https://www.llamaindex.ai/) ([GitHub](https://github.com/run-llama/llama_index)) is a powerful data framework that connects LLMs with your private data sources. It simplifies working with various data formats (PDFs, APIs, databases, documents) and creates searchable indices for context-aware AI applications. - - Open in Google Colaboratory - - ### 1. Install Required Packages Install the necessary dependencies for the integration: @@ -238,4 +240,4 @@ def rag_pipeline(query: str): ## Next Steps -For more advanced observability features and configuration options, see our [complete observability documentation](/observability/trace-with-python-sdk/setup-tracing). +For more advanced observability features and configuration options, see our [complete observability documentation](/observability/observability-sdk). diff --git a/docs/docs/observability/integrations/07-langgraph.mdx b/docs/docs/observability/integrations/07-langgraph.mdx index 5305b0450d..e7316e8133 100644 --- a/docs/docs/observability/integrations/07-langgraph.mdx +++ b/docs/docs/observability/integrations/07-langgraph.mdx @@ -1,14 +1,18 @@ --- -title: Tracing and Observability for LangGraph with Agenta +title: Observability for LangGraph with Agenta sidebar_label: LangGraph description: Monitor and debug your LangGraph applications with Agenta's observability platform. Get complete visibility into your graph-based LLM application performance, debugging capabilities, and execution observability. --- ```mdx-code-block import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; ``` +# Observability for LangGraph with Agenta + +:::info +This guide is available as Jupyter Notebook [here](https://github.com/agenta-ai/agenta/blob/main/examples/jupyter/integrations/langgraph-integration.ipynb). +::: Learn how to monitor your **[LangGraph](https://langchain-ai.github.io/langgraph/)** applications using **Agenta's** observability platform. Get complete visibility into your graph-based LLM application performance, debugging capabilities, and execution observability. @@ -16,9 +20,6 @@ Learn how to monitor your **[LangGraph](https://langchain-ai.github.io/langgraph > **What is LangGraph?** [LangGraph](https://langchain-ai.github.io/langgraph/) is a library for building stateful, multi-actor applications with LLMs. It extends LangChain's capabilities by enabling the creation of complex workflows as directed graphs where nodes represent different processing steps and edges define the flow between them. - - Open in Google Colaboratory - ### 1. Install Required Packages @@ -407,4 +408,4 @@ def content_moderator(user_content: str): ## Next Steps -For more advanced observability features and configuration options, see our [complete observability documentation](/observability/trace-with-python-sdk/setup-tracing). +For more advanced observability features and configuration options, see our [complete observability documentation](/observability/observability-sdk). diff --git a/docs/docs/observability/integrations/08-openai-agents.mdx b/docs/docs/observability/integrations/08-openai-agents.mdx index 9a4491915e..31cebcb6c9 100644 --- a/docs/docs/observability/integrations/08-openai-agents.mdx +++ b/docs/docs/observability/integrations/08-openai-agents.mdx @@ -1,12 +1,11 @@ --- -title: Tracing and Observability for OpenAI Agents SDK with Agenta +title: Observability for OpenAI Agents SDK with Agenta sidebar_label: OpenAI Agents SDK description: Learn how to set up observability and tracing for OpenAI Agents SDK using Agenta open-source LLM observability platform. This comprehensive guide covers setup, configuration, and best practices for tracing multi-agent workflows using OpenAI Agents SDK and OpenAI models. --- ```mdx-code-block import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; ``` Learn how to set up tracing for your [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/) applications with **Agenta** for complete observability into your multi-agent application performance, debugging capabilities, and execution observability. @@ -15,9 +14,9 @@ Learn how to set up tracing for your [OpenAI Agents SDK](https://openai.github.i > **What is OpenAI Agents?** The [OpenAI Agents](https://github.com/openai/openai-agents-python) SDK is a framework for building AI agents that can interact with tools, run asynchronous operations, and orchestrate complex multi-agent workflows. It provides a structured approach to creating intelligent agents with tool calling capabilities. - - Open in Google Colaboratory - +:::info +This tutorial is also available as a [Jupyter notebook](https://github.com/Agenta-AI/agenta/tree/main/examples/jupyter/integrations/openai-agents-integration.ipynb) for interactive learning and experimentation. +::: ## Setup Guide @@ -175,7 +174,7 @@ The trace provides visibility into your application's execution, helping you: - Analyze orchestration effectiveness and workflow optimization, and identify bottlenecks :::info -After setting up observability for your OpenAI Agents SDK application, you can use Agenta's [evaluation](/evaluation/concepts) features to evaluate the performance of your agents. +After setting up observability for your OpenAI Agents SDK application, you can use Agenta's [evaluation](/evaluation/overview) features to evaluate the performance of your agents. ::: ## Real-world Example @@ -276,4 +275,4 @@ async def content_creation_system(content_brief: str): ## Next Steps -For more detailed information about Agenta's observability features and advanced configuration options, visit the [Agenta Observability SDK Documentation](/observability/trace-with-python-sdk/setup-tracing). \ No newline at end of file +For more detailed information about Agenta's observability features and advanced configuration options, visit the [Agenta Observability SDK Documentation](/observability/observability-sdk). \ No newline at end of file diff --git a/docs/docs/observability/integrations/10-pydanticai.mdx b/docs/docs/observability/integrations/10-pydanticai.mdx index eec3ddd731..b882c5bb69 100644 --- a/docs/docs/observability/integrations/10-pydanticai.mdx +++ b/docs/docs/observability/integrations/10-pydanticai.mdx @@ -1,5 +1,5 @@ --- -title: Tracing and Observability for PydanticAI with Agenta +title: Observability for PydanticAI with Agenta sidebar_label: PydanticAI description: Instrument and debug your PydanticAI applications with Agenta's comprehensive observability platform. Set up tracing to debug, monitor and evaluate your PydanticAI applications. category: Integrations @@ -7,7 +7,6 @@ category: Integrations ```mdx-code-block import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; ``` Learn how to connect **Agenta** with **PydanticAI** for complete visibility into your AI agent performance, debugging capabilities, and execution observability. @@ -16,9 +15,9 @@ Learn how to connect **Agenta** with **PydanticAI** for complete visibility into > **What is PydanticAI?** [PydanticAI](https://ai.pydantic.dev/) is a Python agent framework designed to make it less painful to build production-grade applications with generative AI. It provides type safety, structured outputs, and dependency injection for building robust AI agents. - - Open in Google Colaboratory - +:::info +This tutorial is also available as a [Jupyter notebook](https://github.com/Agenta-AI/agenta/tree/main/examples/jupyter/integrations/pydanticai-integration.ipynb) for interactive learning and experimentation. +::: ## Setup Guide @@ -249,4 +248,4 @@ The trace provides comprehensive visibility into your application's execution, h ## Next Steps -For more detailed information about Agenta's observability features and advanced configuration options, visit the [Agenta Observability SDK Documentation](/observability/trace-with-python-sdk/setup-tracing). +For more detailed information about Agenta's observability features and advanced configuration options, visit the [Agenta Observability SDK Documentation](/observability/observability-sdk). diff --git a/docs/docs/observability/integrations/11-dspy.mdx b/docs/docs/observability/integrations/11-dspy.mdx deleted file mode 100644 index f32e59dfdd..0000000000 --- a/docs/docs/observability/integrations/11-dspy.mdx +++ /dev/null @@ -1,279 +0,0 @@ ---- -title: Tracing and Observability for DSPy with Agenta -sidebar_label: DSPy -description: Instrument and debug your DSPy applications with Agenta's observability platform. Set up quickly tracing for an improved LLMOps workflows. -category: Integrations ---- - -```mdx-code-block -import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - -Learn how to connect **Agenta** with **DSPy** for complete visibility into your LLM application performance, debugging capabilities, and execution observability. - -> **What is Agenta?** [Agenta](https://agenta.ai) is an open-source LLMOps platform designed to streamline the deployment, management, and scaling of large language models. It offers comprehensive observability, testing, and deployment capabilities for AI applications. - -> **What is DSPy?** [DSPy](https://dspy.ai/) ([GitHub](https://github.com/stanfordnlp/dspy)) is a framework for algorithmically optimizing LM prompts and weights. It provides composable and declarative modules for instructing language models in a more systematic way than traditional prompting. - - - - Open in Google Colaboratory - - -## Setup Guide - -Follow these steps to integrate DSPy with Agenta's observability platform for real-time tracing and performance analysis. - -### Install Required Packages - -First, install the required dependencies. These packages are essential for the integration: - -```bash -pip install agenta dspy openinference-instrumentation-dspy -``` - -**Package Overview:** -- `agenta`: The core Agenta SDK for prompt engineering and observability -- `dspy`: The DSPy framework for building systematic LLM applications -- `openinference-instrumentation-dspy`: Automatic instrumentation library for DSPy operations - -### Setup and Configuration - -Initialize your environment and configure the Agenta SDK: - -```python -import os -import agenta as ag -import dspy -from openinference.instrumentation.dspy import DSPyInstrumentor - -# Load configuration from environment -os.environ["AGENTA_API_KEY"] = "your_agenta_api_key" -os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" # Optional, defaults to the Agenta cloud API -os.environ["OPENAI_API_KEY"] = "your_openai_api_key" # Required for OpenAI models - -# Start Agenta SDK -ag.init() -``` - -> **What does `ag.init()` do?** -> The `ag.init()` function initializes the Agenta SDK and sets up the necessary configuration for observability. It establishes connection to the Agenta platform, configures tracing and logging settings, and prepares the instrumentation context for your application. - -### Enable DSPy Monitoring - -Initialize the OpenInference DSPy instrumentation to automatically capture DSPy operations: - -```python -# Enable DSPy instrumentation -DSPyInstrumentor().instrument() -``` - -### Configure DSPy Language Model - -Set up your DSPy language model configuration: - -```python -# Configure DSPy with your preferred language model -lm = dspy.LM("openai/gpt-4o") -dspy.configure(lm=lm) -``` - -### Build Your Instrumented Application - -Here's a complete example showcasing three different DSPy use cases with Agenta instrumentation: - -```python -import os -import agenta as ag -import dspy -from openinference.instrumentation.dspy import DSPyInstrumentor - -# Configuration setup -os.environ["AGENTA_API_KEY"] = "your_agenta_api_key" -os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" # Optional, defaults to the Agenta cloud API -os.environ["OPENAI_API_KEY"] = "your_openai_api_key" # Required for OpenAI models - -# Start Agenta observability -ag.init() - -# Enable DSPy instrumentation -DSPyInstrumentor().instrument() - -# Configure DSPy -lm = dspy.LM("openai/gpt-4o") -dspy.configure(lm=lm) - - -# Use case 1: Math reasoning with Chain of Thought (CoT) -@ag.instrument() -def math_reasoning(question: str): - cot = dspy.ChainOfThought("question -> answer: float") - response = cot(question=question) - return response - - -# Use case 2: Retrieval-Augmented Generation (RAG) with Wikipedia search -@ag.instrument(spankind="query") -def search_wikipedia(query: str) -> list[str]: - results = dspy.ColBERTv2(url="http://20.102.90.50:2017/wiki17_abstracts")( - query, k=3 - ) - return [x["text"] for x in results] - - -@ag.instrument() -def rag(question: str): - cot = dspy.ChainOfThought("context, question -> response") - response = cot(context=search_wikipedia(question), question=question) - return response - - -# Use case 3: Drafting an article with an outline and sections -class Outline(dspy.Signature): - """Outline a thorough overview of a topic.""" - - topic: str = dspy.InputField() - title: str = dspy.OutputField() - sections: list[str] = dspy.OutputField() - section_subheadings: dict[str, list[str]] = dspy.OutputField( - desc="mapping from section headings to subheadings" - ) - - -class DraftSection(dspy.Signature): - """Draft a top-level section of an article.""" - - topic: str = dspy.InputField() - section_heading: str = dspy.InputField() - section_subheadings: list[str] = dspy.InputField() - content: str = dspy.OutputField(desc="markdown-formatted section") - - -class DraftArticle(dspy.Module): - def __init__(self): - self.build_outline = dspy.ChainOfThought(Outline) - self.draft_section = dspy.ChainOfThought(DraftSection) - - def forward(self, topic: str): - outline = self.build_outline(topic=topic) - sections = [] - for heading, subheadings in outline.section_subheadings.items(): - section, subheadings = f"## {heading}", [ - f"### {subheading}" for subheading in subheadings - ] - section = self.draft_section( - topic=outline.title, - section_heading=section, - section_subheadings=subheadings, - ) - sections.append(section.content) - return dspy.Prediction(title=outline.title, sections=sections) - - -@ag.instrument() -def journalist(topic: str): - draft_article = DraftArticle() - article = draft_article(topic=topic) - return article - - -# Example usage -if __name__ == "__main__": - # Use case 1: Math reasoning - response = math_reasoning("What is 2 + 2?") - print("Math reasoning response:", response) - - # Use case 2: RAG with Wikipedia - rag_response = rag("What's the name of the castle that David Gregory inherited?") - print("RAG response:", rag_response) - - # Use case 3: Article generation - article = journalist("The impact of AI on society") - print("Article generation response:", article) -``` - -### Understanding the @ag.instrument() Decorator - -The `@ag.instrument()` decorator automatically captures all input and output data from your function, enabling comprehensive observability without manual instrumentation. - -**Span Classification:** -Use the `spankind` parameter to categorize different operations in Agenta WebUI. Available classifications: - -- `agent` - Autonomous agent operations -- `chain` - Sequential processing workflows -- `workflow` - End-to-end application flows (default behavior) -- `tool` - Utility function executions -- `embedding` - Vector embedding operations -- `query` - Search and retrieval operations -- `completion` - Text generation tasks -- `chat` - Conversational interactions -- `rerank` - Result reordering operations - -**Standard Behavior:** -By default, when `spankind` is not specified, the operation becomes a root-level span, categorized as a `workflow` in Agenta. - -Example with specific span kind: - -```python -@ag.instrument(spankind="query") -def search_knowledge_base(search_term: str): - # Knowledge base search implementation - pass -``` - -### View Traces in Agenta - -Once your application runs, access detailed execution traces through Agenta's dashboard. The observability data includes: - -- End-to-end workflow execution timeline -- DSPy module initialization and configuration steps -- Chain of Thought reasoning processes -- Retrieval operations and context augmentation -- Language model calls and response generation -- Performance metrics and execution duration - -Agenta dashboard showing DSPy application trace with detailed execution steps - -The trace provides comprehensive visibility into your application's execution, helping you: -- Debug complex reasoning chains and prompt optimization -- Monitor retrieval effectiveness and context quality -- Analyze language model performance and token usage -- Track application behavior trends and optimization opportunities - -## Advanced Usage - -### Custom Span Configuration - -Configure different instrumentation levels for various application components: - -```python -@ag.instrument(spankind="workflow") -def complex_reasoning_pipeline(query: str): - return math_reasoning(query) - - -@ag.instrument(spankind="tool") -def custom_retrieval_function(query: str): - # Custom retrieval logic - pass - - -@ag.instrument(spankind="chain") -def multi_step_reasoning(question: str): - # Multi-step reasoning implementation - return question -``` - -## Next Steps - -For more detailed information about Agenta's observability features and advanced configuration options, visit the [Agenta Observability SDK Documentation](/observability/trace-with-python-sdk/setup-tracing). \ No newline at end of file diff --git a/docs/docs/observability/integrations/12-agno.mdx b/docs/docs/observability/integrations/12-agno.mdx deleted file mode 100644 index 28c816c8fd..0000000000 --- a/docs/docs/observability/integrations/12-agno.mdx +++ /dev/null @@ -1,251 +0,0 @@ ---- -title: Tracing and Observability for Agno with Agenta -sidebar_label: Agno -description: Trace and debug your Agno applications with Agenta's observability platform. Set up instrumentation and observability for Agno Agents for a better LLMOps workflows. -category: Integrations ---- - -```mdx-code-block -import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - -Learn how to connect **Agenta** with **Agno** for complete visibility into your AI agent performance, debugging capabilities, and execution observability. - -> **What is Agenta?** [Agenta](https://agenta.ai) is an open-source LLMOps platform designed to streamline the deployment, management, and scaling of large language models. It offers comprehensive observability, testing, and deployment capabilities for AI applications. - -> **What is Agno?** [Agno](https://github.com/agno-agi/agno) is a Python framework for building AI agents with tools, structured outputs, and efficient workflows. It provides a simple yet powerful interface for creating intelligent agents that can interact with external systems and perform complex tasks. - - - - Open in Google Colaboratory - - - -Here are the steps to setup tracing and observability for Agno applications with Agenta. - -## Install Required Packages - -First, install the required dependencies: - -```bash -pip install agenta openinference-instrumentation-agno agno -``` - -**Package Overview:** -- `agenta`: The core Agenta SDK for prompt engineering and observability -- `agno`: The Agno framework for building AI agents with tools -- `openinference-instrumentation-agno`: Automatic instrumentation library for Agno operations - -## Setup and Configuration - -Initialize your environment and configure the Agenta SDK: - -```python -import os -import re -from itertools import permutations -import agenta as ag -from agno.agent import Agent -from agno.models.openai import OpenAIChat -from openinference.instrumentation.agno import AgnoInstrumentor - - -# Set up the environment -os.environ["AGENTA_API_KEY"] = "your_agenta_api_key" -os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" # Optional, defaults to the Agenta cloud API - -# Start the Agenta SDK -ag.init() -``` - -> **What does `ag.init()` do?** -> The `ag.init()` function initializes the Agenta SDK and sets up the necessary configuration for observability. It establishes connection to the Agenta platform, configures tracing and logging settings, and prepares the instrumentation context for your application. - -## Enable Agno Monitoring - -Initialize the OpenInference Agno instrumentation to automatically capture agent operations: - -```python -AgnoInstrumentor().instrument() -``` - -## Complete Example of an Agno Application - -Here's a complete example showcasing a logistics dispatch agent with Agenta instrumentation: - -```python -import os -import re -from itertools import permutations -import agenta as ag -from agno.agent import Agent -from agno.models.openai import OpenAIChat -from openinference.instrumentation.agno import AgnoInstrumentor - - -# Set up the environment -os.environ["AGENTA_API_KEY"] = "your_agenta_api_key" -os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" # Optional, defaults to the Agenta cloud API - -# Start the Agenta SDK -ag.init() -AgnoInstrumentor().instrument() - - -# Simulated logistics data -tracking_data = { - "TRK10001": "In transit at Berlin Friedrichshain Distribution Center", - "TRK10002": "Delivered on 2025-06-14 at 18:32 in Charlottenburg", - "TRK10003": "Out for delivery — last scanned near Tempelhofer Feld", - "TRK10004": "Held at customs near Berlin Brandenburg Airport (BER)", - "TRK10005": "Awaiting pickup at Berlin Hauptbahnhof Parcel Station", -} - -distance_matrix = { - "Warehouse": {"A": 10, "B": 15, "C": 20}, - "A": {"Warehouse": 10, "B": 12, "C": 5}, - "B": {"Warehouse": 15, "A": 12, "C": 8}, - "C": {"Warehouse": 20, "A": 5, "B": 8}, -} - -driver_load = {"Alice": 2, "Bob": 3, "Charlie": 1} - - -# Tool: TrackingTool -class TrackingTool: - def __init__(self): - self.name = "TrackingTool" - self.description = "Provides shipment status updates given a tracking ID." - - def run(self, query: str) -> str: - match = re.search(r"\bTRK\d+\b", query.upper()) - if not match: - return "Please provide a valid tracking ID." - - tid = match.group(0) - status = tracking_data.get(tid) - return f"Status for {tid}: {status}" if status else f"No information for {tid}." - - -# Tool: RouteTool -class RouteTool: - def __init__(self): - self.name = "RouteTool" - self.description = "Computes the best delivery route given a start and destinations." - - def run(self, query: str) -> str: - m = re.search(r"from\s+([\w\s]+)\s+to\s+(.+)", query, re.IGNORECASE) - if not m: - return "Specify route as 'from to , , ...'." - - origin = m.group(1).strip() - dests = [d.strip() for d in re.split(r",| and ", m.group(2)) if d.strip()] - - if origin not in distance_matrix: - return f"Unknown origin: {origin}." - for loc in dests: - if loc not in distance_matrix: - return f"Unknown destination: {loc}." - - best_distance = float("inf") - best_order = None - for perm in permutations(dests): - total = 0 - cur = origin - for nxt in perm: - total += distance_matrix[cur][nxt] - cur = nxt - if total < best_distance: - best_distance = total - best_order = perm - - route_plan = " → ".join([origin] + list(best_order)) if best_order else origin - return f"Optimal route: {route_plan} (Total distance: {best_distance} km)" - - -# Tool: WorkloadBalancerTool -class WorkloadBalancerTool: - def __init__(self): - self.name = "WorkloadBalancerTool" - self.description = "Assigns delivery locations to the least busy driver." - self.drivers = driver_load.copy() - - def run(self, query: str) -> str: - m = re.search(r"deliver(?:y|ies)? to (.+)", query, re.IGNORECASE) - if not m: - return "Please specify delivery locations like 'deliver to A, B, C'." - - locations = [ - loc.strip() for loc in re.split(r",| and ", m.group(1)) if loc.strip() - ] - assignments = [] - for loc in locations: - least_loaded = min(self.drivers, key=lambda d: self.drivers[d]) - assignments.append(f"{loc} → {least_loaded}") - self.drivers[least_loaded] += 1 - return "Delivery assignments:\n" + "\n".join(assignments) - - -# Create the dispatch agent -agent = Agent( - model=OpenAIChat(id="gpt-4o"), - description="You are a smart dispatch assistant for a logistics team.", - instructions=[ - "Use TrackingTool for shipment queries.", - "Use RouteTool for route optimization.", - "Use WorkloadBalancerTool to assign deliveries to drivers.", - "Always return concise, formatted answers with relevant detail.", - ], - tools=[TrackingTool(), RouteTool(), WorkloadBalancerTool()], - show_tool_calls=False, -) - - -@ag.instrument() -def handle_dispatch_request(query: str): - result = agent.run(query) - return result.content - - -# Example usage -if __name__ == "__main__": - response = handle_dispatch_request( - "Where is shipment TRK10001? Also, find the best route from Warehouse to A, B and C, " - "and assign deliveries to the least busy drivers." - ) - print("Response:", response) -``` - - -## View Traces in Agenta - -Once your application runs, access detailed execution traces through Agenta's dashboard. The observability data includes: - -- End-to-end agent workflow execution timeline -- Agno agent initialization and tool configuration -- Tool execution sequences and decision-making processes -- LLM interactions and response generation -- Tool call chains and data flow between tools -- Performance metrics and execution duration - -Agenta dashboard showing Agno application trace with detailed execution steps - -The trace provides comprehensive visibility into your application's execution, helping you: -- Debug complex agent interactions and tool usage patterns -- Monitor tool execution performance and decision logic -- Analyze LLM reasoning and response quality -- Track multi-tool workflows and coordination - -## Next Steps - -For more detailed information about Agenta's observability features and advanced configuration options, visit the [Agenta Observability SDK Documentation](/observability/trace-with-python-sdk/setup-tracing). \ No newline at end of file diff --git a/docs/docs/observability/integrations/_category_.json b/docs/docs/observability/integrations/_category_.json index 72d05a3297..52b3e501bb 100644 --- a/docs/docs/observability/integrations/_category_.json +++ b/docs/docs/observability/integrations/_category_.json @@ -1,4 +1,4 @@ { - "position": 9, + "position": 6, "label": "Integrations" -} \ No newline at end of file +} diff --git a/docs/docs/observability/query-data/01-query-api.mdx b/docs/docs/observability/query-data/01-query-api.mdx deleted file mode 100644 index a5021300f8..0000000000 --- a/docs/docs/observability/query-data/01-query-api.mdx +++ /dev/null @@ -1,716 +0,0 @@ ---- -title: "Query Trace Data with the Agenta API" -sidebar_label: "Query via API" -description: "Learn how to programmatically query and filter LLM traces and spans using the Agenta Query Data API with Python and JavaScript examples" -sidebar_position: 1 ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - - - Open in Google Colaboratory - - -The Agenta API lets you query trace and span data programmatically. You can filter by attributes, time ranges, and status codes. The API returns data in two formats: flat spans or hierarchical trace trees. - -## API Endpoint - -``` -POST /api/preview/tracing/spans/query -``` - -Send queries as JSON in the request body. This approach works best for complex filters with nested conditions. - -## Authentication - -Include your API key in the request header: - -```http -Authorization: ApiKey YOUR_API_KEY -``` - -You can create API keys from the Settings page in your Agenta workspace. - -## Response Format Options - -### Focus Parameter - -Choose how the API returns your data: - -**`span`**: Returns individual spans in a flat list. Use this when you need span-level details. - -```json -{ - "focus": "span" -} -``` - -Example response: - -```json -{ - "count": 2, - "spans": [ - { - "trace_id": "abc123", - "span_id": "span001", - "parent_id": "root", - "span_name": "openai.chat", - "status_code": "STATUS_CODE_OK", - "attributes": { - "ag": { - "metrics": { - "costs": { "cumulative": { "total": 0.0023 } }, - "tokens": { "cumulative": { "total": 450 } } - } - } - } - }, - { - "trace_id": "def456", - "span_id": "span002", - "parent_id": "root", - "span_name": "generate_response", - "status_code": "STATUS_CODE_OK", - "attributes": { "..." } - } - ] -} -``` - -**`trace`** (default): Returns complete traces as hierarchical trees. Each trace groups its spans by `trace_id`. Use this when you need to see the full request flow. - -```json -{ - "focus": "trace" -} -``` - -Example response: - -```json -{ - "count": 1, - "traces": { - "abc123": { - "spans": { - "generate_response": { - "span_id": "root", - "span_name": "generate_response", - "status_code": "STATUS_CODE_OK", - "spans": { - "openai.chat": { - "span_id": "span001", - "span_name": "openai.chat", - "parent_id": "root", - "status_code": "STATUS_CODE_OK", - "attributes": { - "ag": { - "metrics": { - "costs": { "cumulative": { "total": 0.0023 } }, - "tokens": { "cumulative": { "total": 450 } } - } - } - } - } - } - } - } - } - } -} -``` - -## Time Windows and Limits - -Control which traces you retrieve using time ranges and result limits. - -### Time Range - -Specify start and end timestamps using ISO 8601 format or Unix timestamps: - -```json -{ - "oldest": "2024-01-01T00:00:00Z", - "newest": "2024-01-31T23:59:59Z" -} -``` - -The `oldest` timestamp is included in results. The `newest` timestamp is excluded. - -You can also use Unix timestamps (in seconds): - -```json -{ - "oldest": 1704067200, - "newest": 1706745599 -} -``` - -### Result Limit - -Limit the number of results: - -```json -{ - "limit": 100 -} -``` - -Combine time ranges with limits for precise control: - -```json -{ - "oldest": "2024-01-01T00:00:00Z", - "newest": "2024-01-31T23:59:59Z", - "limit": 50 -} -``` - -## Filtering Data - -Filter traces and spans using conditions with various operators. - -### Basic Filter Structure - -Each filter needs an operator and conditions: - -```json -{ - "filter": { - "operator": "and", - "conditions": [ - { - "field": "span_name", - "operator": "is", - "value": "my_span" - } - ] - } -} -``` - -### Logical Operators - -Combine conditions using these operators: - -**`and`** (default): All conditions must match. - -**`or`**: At least one condition must match. - -**`not`**: Negates the condition. - -**`nand`**: At least one condition does not match. - -**`nor`**: No conditions match. - -Example using OR logic: - -```json -{ - "filter": { - "operator": "or", - "conditions": [ - { "field": "span_name", "value": "chat" }, - { "field": "span_name", "value": "completion" } - ] - } -} -``` - -### Fields You Can Filter - -Filter by these standard fields: - -**`trace_id`**: Trace identifier - -**`span_id`**: Span identifier - -**`parent_id`**: Parent span identifier - -**`span_name`**: Span name - -**`span_kind`**: Type of span (`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, `SPAN_KIND_SERVER`, `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, `SPAN_KIND_CONSUMER`) - -**`start_time`**: Start timestamp - -**`end_time`**: End timestamp - -**`status_code`**: Status code (`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, `STATUS_CODE_ERROR`) - -**`status_message`**: Status message text - -**`attributes`**: Span attributes (requires `key` parameter) - -**`links`**: Linked spans - -**`references`**: References to applications, variants, or revisions - -### Filtering by Attributes - -Access span attributes using the `key` parameter: - -```json -{ - "field": "attributes", - "key": "ag.type.span", - "operator": "is", - "value": "llm" -} -``` - -For nested attributes, use dot notation: - -```json -{ - "field": "attributes", - "key": "ag.metrics.unit.cost", - "operator": "gt", - "value": 0.01 -} -``` - -### Comparison Operators - -#### Equality - -**`is`** (default): Exact match - -**`is_not`**: Not equal - -```json -{ - "field": "span_name", - "operator": "is", - "value": "openai.chat" -} -``` - -#### Numeric Comparisons - -**`eq`**: Equal to - -**`neq`**: Not equal to - -**`gt`**: Greater than - -**`gte`**: Greater than or equal to - -**`lt`**: Less than - -**`lte`**: Less than or equal to - -**`btwn`**: Between (inclusive, provide array `[min, max]`) - -Example filtering by duration: - -```json -{ - "field": "attributes", - "key": "ag.metrics.unit.duration", - "operator": "gt", - "value": 1000 -} -``` - -Example using between: - -```json -{ - "field": "attributes", - "key": "ag.metrics.unit.duration", - "operator": "btwn", - "value": [500, 2000] -} -``` - -#### String Matching - -**`startswith`**: Starts with prefix - -**`endswith`**: Ends with suffix - -**`contains`**: Contains substring - -**`matches`**: Regular expression match - -**`like`**: SQL-like pattern (supports `%` wildcard) - -Example searching span names: - -```json -{ - "field": "span_name", - "operator": "contains", - "value": "api" -} -``` - -#### List Operations - -**`in`**: Value exists in the list - -**`not_in`**: Value does not exist in the list - -Example filtering multiple traces: - -```json -{ - "field": "trace_id", - "operator": "in", - "value": [ - "trace_id_1", - "trace_id_2", - "trace_id_3" - ] -} -``` - -#### Existence Checks - -**`exists`**: Field or attribute exists (any value, including null) - -**`not_exists`**: Field or attribute does not exist - -Example checking for cost tracking: - -```json -{ - "field": "attributes", - "key": "ag.metrics.unit.cost", - "operator": "exists" -} -``` - -Note: When using `exists` or `not_exists`, omit the `value` field. - -## Advanced Filtering Examples - -### Multiple Conditions - -Filter production traces with slow response times: - -```json -{ - "filter": { - "operator": "and", - "conditions": [ - { - "field": "attributes", - "key": "environment", - "value": "production" - }, - { - "field": "attributes", - "key": "ag.metrics.unit.duration", - "operator": "gt", - "value": 1000 - }, - { - "field": "status_code", - "operator": "is_not", - "value": "STATUS_CODE_ERROR" - } - ] - } -} -``` - -### Nested Logical Operators - -Find API calls that either errored or took too long: - -```json -{ - "filter": { - "operator": "and", - "conditions": [ - { - "field": "span_name", - "operator": "startswith", - "value": "api_" - }, - { - "operator": "or", - "conditions": [ - { - "field": "status_code", - "value": "STATUS_CODE_ERROR" - }, - { - "field": "attributes", - "key": "ag.metrics.unit.duration", - "operator": "gt", - "value": 5000 - } - ] - } - ] - } -} -``` - -### Filter by Application References - -Find traces for specific applications: - -```json -{ - "filter": { - "conditions": [ - { - "field": "references", - "operator": "in", - "value": [ - { "id": "application_id_1" }, - { "id": "application_id_2" } - ] - } - ] - } -} -``` - -### Filter by Linked Spans - -Find spans linked to specific traces: - -```json -{ - "filter": { - "conditions": [ - { - "field": "links", - "operator": "in", - "value": [ - { - "trace_id": "trace_id_value", - "span_id": "span_id_value" - } - ] - } - ] - } -} -``` - -## Complete Query Example - -Here's a full query that finds successful LLM calls from the last month: - -```json -{ - "focus": "trace", - "oldest": "2024-01-01T00:00:00Z", - "newest": "2024-01-31T23:59:59Z", - "limit": 50, - "filter": { - "operator": "and", - "conditions": [ - { - "field": "attributes", - "key": "ag.type.span", - "value": "llm" - }, - { - "field": "status_code", - "operator": "is_not", - "value": "STATUS_CODE_ERROR" - } - ] - } -} -``` - -## Response Structure - -The API returns JSON with these fields: - -```json -{ - "count": 42, - "spans": [...], // Present when focus=span - "traces": {...} // Present when focus=trace -} -``` - -**`count`**: Number of results returned - -**`spans`**: Array of spans (when `focus=span`) - -**`traces`**: Dictionary of trace trees indexed by trace_id (when `focus=trace`) - -### Span Format - -Each span contains: - -```json -{ - "trace_id": "...", - "span_id": "...", - "parent_id": "...", - "span_name": "openai.chat", - "span_kind": "SPAN_KIND_CLIENT", - "start_time": "2024-01-15T10:30:00Z", - "end_time": "2024-01-15T10:30:03Z", - "status_code": "STATUS_CODE_OK", - "attributes": { - "ag": { - "data": { - "inputs": {...}, - "outputs": {...} - }, - "metrics": { - "costs": {...}, - "tokens": {...}, - "duration": {...} - }, - "type": { - "span": "llm" - } - } - } -} -``` - -### Trace Format - -Each trace organizes spans hierarchically by name: - -```json -{ - "trace_id_1": { - "spans": { - "root_span": { - "span_id": "...", - "spans": { - "child_span": { - "span_id": "...", - "..." - } - } - } - } - } -} -``` - -## Error Responses - -The API returns standard HTTP status codes: - -**200 OK**: Query succeeded - -**400 Bad Request**: Invalid filter syntax or parameters - -**401 Unauthorized**: Missing or invalid API key - -**422 Unprocessable Entity**: Validation errors in the request - -## Python Example - -Here's a complete example using Python: - -```python -import requests -from datetime import datetime, timedelta, timezone - -AGENTA_HOST = "https://cloud.agenta.ai" -API_KEY = "your_api_key_here" - -# Query spans from the last 7 days -now = datetime.now(timezone.utc) -week_ago = now - timedelta(days=7) - -query = { - "focus": "span", - "oldest": week_ago.isoformat(), - "newest": now.isoformat(), - "limit": 100, - "filter": { - "operator": "and", - "conditions": [ - { - "field": "attributes", - "key": "ag.type.span", - "value": "llm" - }, - { - "field": "status_code", - "value": "STATUS_CODE_OK" - } - ] - } -} - -response = requests.post( - f"{AGENTA_HOST}/api/preview/tracing/spans/query", - headers={ - "Authorization": f"ApiKey {API_KEY}", - "Content-Type": "application/json" - }, - json=query -) - -data = response.json() -print(f"Found {data['count']} spans") -``` - -## JavaScript Example - -Here's the same query in JavaScript: - -```javascript -const AGENTA_HOST = "https://cloud.agenta.ai"; -const API_KEY = "your_api_key_here"; - -// Query spans from the last 7 days -const now = new Date(); -const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); - -const query = { - focus: "span", - oldest: weekAgo.toISOString(), - newest: now.toISOString(), - limit: 100, - filter: { - operator: "and", - conditions: [ - { - field: "attributes", - key: "ag.type.span", - value: "llm" - }, - { - field: "status_code", - value: "STATUS_CODE_OK" - } - ] - } -}; - -const response = await fetch( - `${AGENTA_HOST}/api/preview/tracing/spans/query`, - { - method: "POST", - headers: { - "Authorization": `ApiKey ${API_KEY}`, - "Content-Type": "application/json" - }, - body: JSON.stringify(query) - } -); - -const data = await response.json(); -console.log(`Found ${data.count} spans`); -``` - -## Next Steps - -Learn about the [Analytics Data API](/observability/query-data/analytics-data) for aggregated metrics and time-series data. - -Explore the [API Reference](/reference/api/category) for complete endpoint documentation. - -Check out [Filtering in the UI](/observability/concepts) to learn about the visual query builder. diff --git a/docs/docs/observability/query-data/02-analytics-data.mdx b/docs/docs/observability/query-data/02-analytics-data.mdx deleted file mode 100644 index 3de7455510..0000000000 --- a/docs/docs/observability/query-data/02-analytics-data.mdx +++ /dev/null @@ -1,473 +0,0 @@ ---- -title: "Analyze Observability Metrics with the Agenta Analytics API" -sidebar_label: "Analytics via API" -description: "Learn how to retrieve and analyze aggregated LLM performance metrics including costs, latency, token usage, and error rates using the Agenta Analytics API with Python and JavaScript examples" -sidebar_position: 2 ---- - -import GoogleColabButton from "@site/src/components/GoogleColabButton"; - - - Open in Google Colaboratory - - -## Overview - -The Agenta Analytics API retrieves aggregated metrics from your LLM traces. The API groups your data into time buckets and calculates metrics like cost, latency, token usage, and error rates. - -Use analytics to: -- Track LLM costs over time -- Monitor performance trends -- Identify error patterns -- Analyze token consumption - -**Endpoint**: `POST /api/preview/tracing/spans/analytics` - -**Authentication**: You can create API keys from the Settings page in your Agenta workspace. - -## Quick Start - -### Python - -```python -import requests -from datetime import datetime, timedelta, timezone - -# Setup -AGENTA_HOST = "https://cloud.agenta.ai" -API_KEY = "your_api_key_here" -BASE_URL = f"{AGENTA_HOST}/api/preview/tracing/spans/analytics" - -headers = { - "Authorization": f"ApiKey {API_KEY}", - "Content-Type": "application/json" -} - -# Get analytics for last 7 days with daily buckets -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=7) - -payload = { - "focus": "trace", - "interval": 1440, # 1440 minutes = daily buckets - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - } -} - -response = requests.post(BASE_URL, headers=headers, json=payload) -data = response.json() - -print(f"Found {data['count']} daily buckets") -for bucket in data['buckets']: - if bucket['total']['count'] > 0: - print(f"\nDate: {bucket['timestamp'][:10]}") - print(f" Traces: {bucket['total']['count']}") - print(f" Cost: ${bucket['total']['costs']:.4f}") - print(f" Avg Duration: {bucket['total']['duration'] / bucket['total']['count']:.0f}ms") - print(f" Errors: {bucket['errors']['count']}") -``` - -### JavaScript - -```javascript -const AGENTA_HOST = "https://cloud.agenta.ai"; -const API_KEY = "your_api_key_here"; -const BASE_URL = `${AGENTA_HOST}/api/preview/tracing/spans/analytics`; - -// Get analytics for last 7 days with daily buckets -const newest = new Date(); -const oldest = new Date(newest.getTime() - 7 * 24 * 60 * 60 * 1000); - -const payload = { - focus: "trace", - interval: 1440, // 1440 minutes = daily buckets - windowing: { - oldest: oldest.toISOString(), - newest: newest.toISOString() - } -}; - -const response = await fetch(BASE_URL, { - method: "POST", - headers: { - "Authorization": `ApiKey ${API_KEY}`, - "Content-Type": "application/json" - }, - body: JSON.stringify(payload) -}); - -const data = await response.json(); - -console.log(`Found ${data.count} daily buckets`); -data.buckets.forEach(bucket => { - if (bucket.total.count > 0) { - const date = bucket.timestamp.substring(0, 10); - const avgDuration = bucket.total.duration / bucket.total.count; - console.log(`\nDate: ${date}`); - console.log(` Traces: ${bucket.total.count}`); - console.log(` Cost: $${bucket.total.costs.toFixed(4)}`); - console.log(` Avg Duration: ${avgDuration.toFixed(0)}ms`); - console.log(` Errors: ${bucket.errors.count}`); - } -}); -``` - -## Request Parameters - -All parameters are sent in the JSON request body: - -### Focus (Required) - -Controls the aggregation level: - -- **`trace`**: Aggregate by complete traces (most common) -- **`span`**: Aggregate individual spans - -Most analytics queries use `trace` to analyze complete LLM requests. - -```python -payload = { - "focus": "trace", - "interval": 1440 -} -``` - -### Interval (Required) - -Bucket size in minutes. Common values: - -- **`60`** = Hourly buckets -- **`1440`** = Daily buckets (24 hours) -- **`10080`** = Weekly buckets (7 days) - -```python -payload = { - "focus": "trace", - "interval": 1440 # Daily buckets -} -``` - -### Windowing (Optional) - -Specify the time range for your analytics. If not provided, defaults to the last 30 days. - -```python -from datetime import datetime, timedelta, timezone - -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=30) - -payload = { - "focus": "trace", - "interval": 1440, - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - } -} -``` - -### Filter (Optional) - -Filter which traces to include in analytics. Uses the same filter syntax as the Query API. - -**Filter by status code:** -```python -payload = { - "focus": "trace", - "interval": 1440, - "filter": { - "conditions": [ - { - "field": "status.code", - "operator": "eq", - "value": "STATUS_CODE_OK" - } - ] - } -} -``` - -**Filter by span name:** -```python -payload = { - "focus": "trace", - "interval": 1440, - "filter": { - "conditions": [ - { - "field": "name", - "operator": "contains", - "value": "openai" - } - ] - } -} -``` - -**Multiple conditions:** -```python -payload = { - "focus": "trace", - "interval": 1440, - "filter": { - "operator": "and", - "conditions": [ - { - "field": "status.code", - "operator": "eq", - "value": "STATUS_CODE_OK" - }, - { - "field": "attributes.ag.metrics.costs.cumulative.total", - "operator": "gt", - "value": 0.01 - } - ] - } -} -``` - -## Response Format - -The API returns aggregated metrics grouped into time buckets: - -```json -{ - "count": 7, - "buckets": [ - { - "timestamp": "2025-10-24T00:00:00Z", - "interval": 1440, - "total": { - "count": 150, - "duration": 45000.5, - "costs": 0.0234, - "tokens": 1200.0 - }, - "errors": { - "count": 5, - "duration": 2300.0, - "costs": 0.0, - "tokens": 0.0 - } - }, - { - "timestamp": "2025-10-25T00:00:00Z", - "interval": 1440, - "total": { - "count": 200, - "duration": 60000.0, - "costs": 0.0312, - "tokens": 1600.0 - }, - "errors": { - "count": 3, - "duration": 1500.0, - "costs": 0.0, - "tokens": 0.0 - } - } - ] -} -``` - -### Response Fields - -- **`count`**: Number of time buckets returned -- **`buckets`**: Array of time-based aggregated metrics - -### Bucket Fields - -- **`timestamp`**: Start time of the bucket (ISO 8601) -- **`interval`**: Bucket size in minutes -- **`total`**: Aggregated metrics for all traces in this bucket - - **`count`**: Number of traces - - **`duration`**: Total duration in milliseconds - - **`costs`**: Total cost in USD - - **`tokens`**: Total tokens used -- **`errors`**: Aggregated metrics for failed traces only - - **`count`**: Number of failed traces - - **`duration`**: Total duration of failed traces in milliseconds - - **`costs`**: Total cost of failed traces (usually 0) - - **`tokens`**: Total tokens in failed traces (usually 0) - -## Common Use Cases - -### Monitor Daily Costs - -Track LLM spending over time: - -```python -import requests -from datetime import datetime, timedelta, timezone - -# Get daily costs for last 30 days -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=30) - -payload = { - "focus": "trace", - "interval": 1440, # Daily buckets - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - } -} - -response = requests.post(BASE_URL, headers=headers, json=payload) -data = response.json() - -# Calculate totals -total_cost = sum(b['total']['costs'] for b in data['buckets']) -total_traces = sum(b['total']['count'] for b in data['buckets']) - -print(f"Total Cost (30 days): ${total_cost:.2f}") -print(f"Total Traces: {total_traces:,}") -print(f"Average Cost per Trace: ${total_cost/total_traces:.4f}") -``` - -### Analyze Error Trends - -Monitor error rates to identify reliability issues: - -```python -# Get hourly metrics for last 7 days -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=7) - -payload = { - "focus": "trace", - "interval": 60, # Hourly buckets - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - } -} - -response = requests.post(BASE_URL, headers=headers, json=payload) -data = response.json() - -# Find high error rate periods -print("Hours with high error rates (>5%):") -for bucket in data['buckets']: - if bucket['total']['count'] > 0: - error_rate = (bucket['errors']['count'] / bucket['total']['count']) * 100 - if error_rate > 5: - print(f" {bucket['timestamp']}: {error_rate:.1f}%") -``` - -### Track Token Usage - -Monitor token consumption patterns: - -```python -# Get daily token usage for last 7 days -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=7) - -payload = { - "focus": "trace", - "interval": 1440, # Daily buckets - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - } -} - -response = requests.post(BASE_URL, headers=headers, json=payload) -data = response.json() - -print("Daily Token Usage:") -for bucket in data['buckets']: - if bucket['total']['count'] > 0: - date = bucket['timestamp'][:10] - avg_tokens = bucket['total']['tokens'] / bucket['total']['count'] - print(f" {date}: {bucket['total']['tokens']:,.0f} total ({avg_tokens:.0f} avg)") -``` - -### Compare Performance - -Analyze latency trends over time: - -```python -# Get hourly performance for last 24 hours -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=1) - -payload = { - "focus": "trace", - "interval": 60, # Hourly buckets - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - } -} - -response = requests.post(BASE_URL, headers=headers, json=payload) -data = response.json() - -print("Hourly Average Latency:") -latencies = [] -for bucket in data['buckets']: - if bucket['total']['count'] > 0: - avg_duration = bucket['total']['duration'] / bucket['total']['count'] - latencies.append(avg_duration) - hour = bucket['timestamp'][11:16] - print(f" {hour}: {avg_duration:.0f}ms") - -if latencies: - print(f"\nStatistics:") - print(f" Min: {min(latencies):.0f}ms") - print(f" Max: {max(latencies):.0f}ms") - print(f" Avg: {sum(latencies)/len(latencies):.0f}ms") -``` - -### Filter by Successful Traces Only - -Analyze only successful requests: - -```python -# Get metrics for successful traces only -newest = datetime.now(timezone.utc) -oldest = newest - timedelta(days=7) - -payload = { - "focus": "trace", - "interval": 1440, - "windowing": { - "oldest": oldest.isoformat(), - "newest": newest.isoformat() - }, - "filter": { - "conditions": [ - { - "field": "status.code", - "operator": "eq", - "value": "STATUS_CODE_OK" - } - ] - } -} - -response = requests.post(BASE_URL, headers=headers, json=payload) -data = response.json() - -# Calculate success metrics -total_count = sum(b['total']['count'] for b in data['buckets']) -total_cost = sum(b['total']['costs'] for b in data['buckets']) -total_duration = sum(b['total']['duration'] for b in data['buckets']) - -print("Successful Traces (Last 7 Days):") -print(f" Count: {total_count:,}") -print(f" Total Cost: ${total_cost:.4f}") -print(f" Avg Duration: {total_duration/total_count:.0f}ms") -``` - -## Next Steps - -- Learn about [Query API](/observability/query-data/query-api) for detailed trace data -- Explore [Using the UI](/observability/concepts) for visual analytics -- Read about [Semantic Conventions](/observability/trace-with-opentelemetry/semantic-conventions) for available metrics diff --git a/docs/docs/observability/query-data/_category_.json b/docs/docs/observability/query-data/_category_.json deleted file mode 100644 index 93a5859395..0000000000 --- a/docs/docs/observability/query-data/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Query Data", - "position": 8, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/observability/trace-with-opentelemetry/01-getting-started.mdx b/docs/docs/observability/trace-with-opentelemetry/01-getting-started.mdx deleted file mode 100644 index 2048c5c03f..0000000000 --- a/docs/docs/observability/trace-with-opentelemetry/01-getting-started.mdx +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: "Getting Started with OpenTelemetry" -sidebar_label: "Getting Started" -description: "Learn how to configure OpenTelemetry to send traces to Agenta's observability platform" -sidebar_position: 1 ---- - -Agenta accepts traces via the OpenTelemetry Protocol (OTLP) endpoint. You can use any OpenTelemetry-compatible instrumentation library to send traces to Agenta. - -## OTLP Endpoint - -Agenta accepts traces via the **OTLP/HTTP protocol** using **protobuf** encoding: - -**Endpoint:** `https://cloud.agenta.ai/api/otlp/v1/traces` - -For self-hosted installations, replace `https://cloud.agenta.ai` with your instance URL. - -:::warning -Agenta does **not** support `gRPC` for the OpenTelemetry endpoint. Please use **HTTP/protobuf** instead. -::: - -## Authentication - -Agenta uses ApiKey-based authentication for the OTLP endpoint: - -```javascript -headers: { - Authorization: `ApiKey ${AGENTA_API_KEY}` -} -``` - -### Getting Your API Key - -1. Visit the [Agenta API Keys page](https://cloud.agenta.ai/settings?tab=apiKeys) -2. Click on **Create New API Key** and follow the prompts -3. Copy the API key and set it as an environment variable: - -```bash -export AGENTA_API_KEY="YOUR_AGENTA_API_KEY" -export AGENTA_HOST="https://cloud.agenta.ai" # Change for self-hosted -``` - -## Configuration - -When using OpenTelemetry SDKs directly (without the Agenta SDK), configure the OTLP exporter to point to Agenta: - -```bash -OTEL_EXPORTER_OTLP_ENDPOINT="https://cloud.agenta.ai/api/otlp" -OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://cloud.agenta.ai/api/otlp/v1/traces" -OTEL_EXPORTER_OTLP_HEADERS="Authorization=ApiKey ${AGENTA_API_KEY}" -``` - -:::info -If your collector requires signal-specific environment variables, use the trace-specific endpoint: - -```bash -OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://cloud.agenta.ai/api/otlp/v1/traces" -OTEL_EXPORTER_OTLP_TRACES_HEADERS="Authorization=ApiKey ${AGENTA_API_KEY}" -``` -::: - -## Supported Languages - -OpenTelemetry SDKs are available for many languages: - -- **Python**: Use the [Agenta Python SDK](/observability/quickstart-python) or OpenTelemetry SDK directly -- **Node.js / TypeScript**: See the [OpenTelemetry Quick Start](/observability/quick-start-opentelemetry) -- **Java**: Use the OpenTelemetry Java SDK -- **Go**: Use the OpenTelemetry Go SDK -- **.NET**: Use the OpenTelemetry .NET SDK -- **Ruby, PHP, Rust**: OpenTelemetry SDKs available for all - -All can send traces to Agenta using the OTLP endpoint above. - -## Using OpenTelemetry Instrumentation Libraries - -Agenta is compatible with many OpenTelemetry instrumentation libraries that extend language and framework support. These libraries work seamlessly with Agenta's OTLP endpoint: - -### Popular Libraries - -- **[OpenLLMetry](https://github.com/Arize-ai/openllmetry)**: Supports multiple LLMs (OpenAI, Anthropic, Azure, etc.) and frameworks (LangChain, LlamaIndex) -- **[OpenLIT](https://github.com/openlit/openlit)**: Comprehensive instrumentation for LLMs, vector DBs, and frameworks -- **[OpenInference](https://arize-ai.github.io/openinference/)**: Arize's OpenTelemetry instrumentation for LLM applications - -### Framework Integrations - -Many frameworks have OpenTelemetry support built-in or via plugins: - -- **LangChain**: OpenTelemetry instrumentation available -- **LlamaIndex**: OpenTelemetry support via plugins -- **AutoGen**: OpenTelemetry compatible -- **Semantic Kernel**: OpenTelemetry integration available -- **Spring AI**: Java framework with OpenTelemetry support - -See the [semantic conventions](/observability/trace-with-opentelemetry/semantic-conventions) page for details on how Agenta maps OpenTelemetry attributes. - -## Next Steps - -- Follow the [OpenTelemetry Quick Start](/observability/quick-start-opentelemetry) for a complete example -- Learn about [semantic conventions](/observability/trace-with-opentelemetry/semantic-conventions) for better trace display -- Explore [distributed tracing](/observability/trace-with-opentelemetry/distributed-tracing) across services -- Configure the [OpenTelemetry Collector](/observability/trace-with-opentelemetry/otel-collector-configuration) to forward traces - diff --git a/docs/docs/observability/trace-with-opentelemetry/03-semantic-conventions.mdx b/docs/docs/observability/trace-with-opentelemetry/03-semantic-conventions.mdx deleted file mode 100644 index 6fbe80c3de..0000000000 --- a/docs/docs/observability/trace-with-opentelemetry/03-semantic-conventions.mdx +++ /dev/null @@ -1,298 +0,0 @@ ---- -title: "Semantic Conventions" -sidebar_label: "Semantic Conventions" -description: "Learn about the OpenTelemetry semantic conventions used by Agenta's LLM observability system" -sidebar_position: 3 ---- - -This document describes how Agenta applies domain-specific OpenTelemetry conventions to capture and analyze traces from LLM applications. - -## How It Works - -Agenta accepts any span that follows the OpenTelemetry specification. To unlock LLM-specific features—such as nicely formatted chat messages, per-request cost and latency, and links to prompt configurations or evaluators—we add attributes under the `ag.` namespace. - -:::info -The OTLP endpoint accepts batches up to **5 MB** by default (after decompression). Larger requests return an HTTP `413` status code. -::: - -We support two primary instrumentation approaches: - -- **Agenta SDK:** When using our SDK with decorators like `@ag.instrument`, we automatically handle the semantic conventions -- **Auto-instrumentation libraries:** We provide adapters that transform data from standard auto-instrumentation libraries (which follow their own conventions) into Agenta's format - -## Agenta Namespace - -All Agenta-specific attributes are organized under the `ag` namespace to avoid conflicts with other OpenTelemetry conventions. - -## Core Semantic Conventions - -### ag.data - -The `ag.data` namespace contains the core execution data for each span: - -- **`ag.data.inputs`**: Input parameters for the span -- **`ag.data.outputs`**: Output results from the span -- **`ag.data.internals`**: Internal variables and intermediate values - -#### Data Format - -**Inputs and Outputs**: Stored as JSON format. For chat applications using LLM spans, these are formatted as a list of messages: - -```json -{ - "data": { - "inputs": { - "prompt": [ - { "role": "system", "content": "System instruction" }, - { "role": "user", "content": "User query" } - ], - "functions": [...], - "tools": [...] - }, - "outputs": { - "completion": [ - { "role": "assistant", "content": "Assistant response" } - ] - } - } -} -``` - -**Internals**: User-provided internal information such as context variables, intermediate calculations, or evaluation data that aren't part of the primary inputs/outputs. These are set by the user [in the SDK using](/observability/trace-with-python-sdk/adding-metadata) `ag.tracing.store_internals()`. - -#### SDK Integration - -When using the `@ag.instrument` decorator in Python: - -```python -@ag.instrument -def my_function(input_param): - # Function inputs and outputs are automatically captured - # unless explicitly masked - return result -``` - -The decorator automatically captures function inputs and outputs in `ag.data.inputs` and `ag.data.outputs` unless you choose to [mask sensitive data](/observability/trace-with-python-sdk/redact-sensitive-data). - -### ag.meta - -The `ag.meta` namespace stores metadata about the span execution: - -```json -{ - "meta": { - "system": "openai", - "request": { - "base_url": "https://api.openai.com/v1", - "endpoint": "/chat/completions", - "headers": {...}, - "streaming": false, - "model": "gpt-4", - "max_tokens": 1000, - "temperature": 0.7, - "top_p": 0.9, - "top_k": 50 - }, - "response": { - "model": "gpt-4-0613" - }, - "configuration": { - "prompt": { - "input_keys": ["country"], - "messages": [...], - "template_format": "curly", - "llm_config": { - "model": "mistral/mistral-tiny" - } - } - } - } -} -``` - -#### Standard Metadata - -:::info -Auto-instrumentation maps common semantic-convention keys—e.g. gen_ai.system, gen_ai.request.*—to the structure above. -::: - -- `ag.meta.system`: Identifies the LLM provider or system being used (e.g., "openai", "anthropic") -- `ag.meta.request.base_url`: The base URL for the API request -- `ag.meta.request.endpoint`: The specific API endpoint called -- `ag.meta.request.headers`: HTTP headers sent with the request -- `ag.meta.request.streaming`: Boolean indicating if streaming mode was used -- `ag.meta.request.model`: The model name requested -- `ag.meta.request.max_tokens`: Maximum token limit for the response -- `ag.meta.request.temperature`: Sampling temperature parameter -- `ag.meta.request.top_p`: Nucleus sampling parameter -- `ag.meta.request.top_k`: Top-k sampling parameter - -Metadata is displayed in the observability overview page as contextual information to help navigate and understand span execution. - -### References - -Use the top level `references` array to link spans to Agenta entities. Every entry represents one relationship and includes: - -- `attributes.key`: the reference category (for example `application`, `evaluator_variant`) -- `id`, `slug`, or `version`: supply whichever identifiers you have; you can include more than one field if available - -Example payload: - -```json -{ - "references": [ - {"id": "019a0159-82d3-7760-9868-4f8c7da8e9c0", "attributes": {"key": "application"}}, - {"slug": "production", "attributes": {"key": "environment"}}, - {"id": "019a0159-82d3-7760-9868-4f8c7da8e9c1", "version": "4", "attributes": {"key": "application_variant"}} - ] -} -``` - -Supported categories: - -- application, application_variant, application_revision -- environment, environment_variant, environment_revision -- evaluator, evaluator_variant, evaluator_revision -- testset, testset_variant, testset_revision, testcase -- query, query_variant, query_revision -- workflow, workflow_variant, workflow_revision - -Consumers (UI, analytics, filtering) read from this array. Instrumentation libraries that cannot emit the array may still set the attribute form (`ag.references..`); the ingestion service converts that dictionary into the same array before storage. - -:::warning -The legacy `ag.refs.*` namespace is deprecated and will be removed after existing SDKs migrate. Do not rely on it. -::: - -### ag.metrics - -The `ag.metrics` namespace tracks performance, cost, and error metrics: - -```json -{ - "metrics": { - "costs": { - "cumulative": { - "total": 0.0070902, - "prompt": 0.00355, - "completion": 0.00354 - }, - "incremental": { - "total": 0.0070902 - } - }, - "tokens": { - "cumulative": { - "total": 992, - "prompt": 175, - "completion": 817 - }, - "incremental": { - "total": 992, - "prompt": 175, - "completion": 817 - } - }, - "duration": { - "cumulative": 19889.343 - }, - "errors": {} - } -} -``` - -#### Aggregation Types - -Metrics are tracked at two levels: - -- **`incremental`**: Metrics for this span only (excluding child spans) -- **`cumulative`**: Metrics for this span plus all child spans aggregated together - -This dual tracking allows you to see both the cost of individual operations and the total cost of complex workflows. - -#### Metric Categories - -##### Costs - -Tracks LLM API costs in USD with the following breakdown: - -**Cumulative (this span + children):** -- **`ag.metrics.costs.cumulative.total`**: Total cost across all LLM calls in this span and its children -- **`ag.metrics.costs.cumulative.prompt`**: Cost attributed to input tokens -- **`ag.metrics.costs.cumulative.completion`**: Cost attributed to output/completion tokens - -**Incremental (this span only):** -- **`ag.metrics.costs.incremental.total`**: Cost for this span's operations only -- **`ag.metrics.costs.incremental.prompt`**: Prompt cost for this span only -- **`ag.metrics.costs.incremental.completion`**: Completion cost for this span only - -:::info -Cost calculation uses the latest pricing for each model provider. Costs are automatically calculated when using standard LLM integrations. Cumulative metrics are automatically calculated by the backend by aggregating incremental values. -::: - -##### Tokens - -Tracks token usage at both aggregation levels: - -**Cumulative:** -- **`ag.metrics.tokens.cumulative.total`**: Total tokens across all operations -- **`ag.metrics.tokens.cumulative.prompt`**: Input tokens across all operations -- **`ag.metrics.tokens.cumulative.completion`**: Output tokens across all operations - -**Incremental:** -- **`ag.metrics.tokens.incremental.total`**: Tokens for this span only -- **`ag.metrics.tokens.incremental.prompt`**: Input tokens for this span only -- **`ag.metrics.tokens.incremental.completion`**: Output tokens for this span only - -##### Duration - -Tracks execution time in milliseconds: - -- **`ag.metrics.duration.cumulative`**: Total execution time including all child spans - - -## Additional Agenta Attributes - -### ag.type - -The `ag.type` namespace contains type information about the span: - -`ag.type.node` can be `workflow`, `task`, `tool`, `embedding`, `query`, `completion`, `chat`, `rerank`. - -### ag.tags - -The `ag.tags` namespace allows you to add custom tags to spans for categorization and filtering: - -```python -# Add custom tags using the SDK -ag.add_tags({"key":"value"}) -``` - -### ag.version - -Tracks version information for the instrumented application or component. - -### ag.flags - -Contains system-specific flags and metadata used internally by Agenta for span processing and display. - -:::note -When using auto-instrumentation libraries, most attributes are saved twice - once in their original format and once processed under the `ag` namespace -::: - -## Standard OpenTelemetry Attributes - -In addition to Agenta-specific conventions, traces include standard OpenTelemetry attributes: - -- **Links**: Relationships between spans -- **Events**: Timestamped events within spans -- **Version**: OpenTelemetry version information -- **Status Code**: Span completion status -- **Start Time**: Span initiation timestamp -- **Span Name**: Human-readable span identifier -- **Span Kind**: Type of span (server, client, internal, etc.) - -## Next steps - -- Learn about [distributed tracing](/observability/trace-with-opentelemetry/distributed-tracing) -- Explore [Python SDK tracing](/observability/trace-with-python-sdk/setup-tracing) for easier instrumentation -- See [integration guides](/observability/integrations/openai) for specific frameworks diff --git a/docs/docs/observability/trace-with-opentelemetry/04-distributed-tracing.mdx b/docs/docs/observability/trace-with-opentelemetry/04-distributed-tracing.mdx deleted file mode 100644 index 57a3a99021..0000000000 --- a/docs/docs/observability/trace-with-opentelemetry/04-distributed-tracing.mdx +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "Distributed Tracing" -sidebar_label: "Distributed Tracing" -description: "Learn how to implement distributed tracing across services with OpenTelemetry and Agenta" -sidebar_position: 4 ---- - -## OpenTelemetry Tracing without Agenta SDK - - -If you're working with systems that don't use the Agenta SDK, you can still integrate with Agenta's tracing infrastructure using standard OpenTelemetry. - -### 1. Setup Requirements - -Install dependencies: - -```bash -pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp -``` - -### 2. Configure Environment Variables - -```bash -# OTEL_PROPAGATORS = unset or "tracecontext,baggage" -# OTEL_EXPORTER_OTLP_COMPRESSION = unset or "gzip" -# OTEL_EXPORTER_OTLP_ENDPOINT = "https://cloud.agenta.ai/api/otlp" -# OTEL_EXPORTER_OTLP_HEADERS = "authorization=ApiKey xxx" -# OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = "https://cloud.agenta.ai/api/otlp/v1/traces" -# OTEL_EXPORTER_OTLP_TRACES_HEADERS = "authorization=ApiKey xxx" -``` - -### 3. Setup in Code - -```python -from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator -from opentelemetry.baggage.propagation import W3CBaggagePropagator -from opentelemetry.sdk.trace import TracerProvider, Span -from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter, Compression - -# Configuration -endpoint = "https://cloud.agenta.ai/api/otlp/v1/traces" -compression = Compression.Gzip -headers = { - "traceparent": "00-xxx-xxx-01", - "baggage": "ag.refs.application.id=xxx", - "authorization": "ApiKey xxx", -} - -# Set up provider, processor, and tracer -provider = TracerProvider() - -processor = BatchSpanProcessor( - OTLPSpanExporter( - endpoint=endpoint, - headers={"authorization": headers["authorization"]}, - compression=compression, - ) -) - -provider.add_span_processor(processor) - -tracer = provider.get_tracer("agenta.tracer") - -# Extract incoming trace context -carrier = {"traceparent": headers["traceparent"]} -context = TraceContextTextMapPropagator().extract(carrier=carrier, context=None) - -carrier = {"baggage": headers["baggage"]} -context = W3CBaggagePropagator().extract(carrier=carrier, context=context) - -# Create and use spans -with tracer.start_as_current_span(name="agenta", context=context) as span: - span: Span - - print(hex(span.get_span_context().trace_id)) - print(hex(span.get_span_context().span_id)) - print(span.name) -``` - -## Next steps - -- Learn about [semantic conventions](/observability/trace-with-opentelemetry/semantic-conventions) -- Explore [collector configuration](/observability/trace-with-opentelemetry/otel-collector-configuration) -- See [Python SDK distributed tracing](/observability/trace-with-python-sdk/distributed-tracing) for Agenta SDK approach diff --git a/docs/docs/observability/trace-with-opentelemetry/05-otel-collector-configuration.mdx b/docs/docs/observability/trace-with-opentelemetry/05-otel-collector-configuration.mdx deleted file mode 100644 index 45c6571dfc..0000000000 --- a/docs/docs/observability/trace-with-opentelemetry/05-otel-collector-configuration.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "OpenTelemetry Collector Configuration" -sidebar_label: "OTEL Collector Configuration" -description: "Configure the OpenTelemetry Collector to forward traces to Agenta" -sidebar_position: 5 ---- - -The [OpenTelemetry Collector](https://opentelemetry.io/docs/collector) is a vendor-agnostic service that receives, processes, and exports telemetry data. You can use it to collect traces from multiple sources and forward them to Agenta. - -## Configuration - -Here's a configuration file (`otel-collector-config.yml`) that receives traces via OTLP/HTTP and forwards them to Agenta: - -```yaml -receivers: - otlp: - protocols: - http: - endpoint: 0.0.0.0:4318 - -processors: - batch: - timeout: 5s - send_batch_size: 512 - -exporters: - otlphttp/agenta: - endpoint: "https://cloud.agenta.ai/api/otlp/v1/traces" - headers: - Authorization: "ApiKey ${AGENTA_API_KEY}" - -service: - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [otlphttp/agenta] -``` - -### Configuration Details - -**Receivers**: The collector receives traces via OTLP/HTTP on port `4318`. - -**Processors**: The `batch` processor collects spans and sends them in batches: -- `timeout`: Maximum time to wait before sending a batch (default: 5s) -- `send_batch_size`: Number of spans to collect before sending (default: 512) - -**Exporters**: The `otlphttp/agenta` exporter forwards traces to Agenta using HTTP/protobuf: -- Endpoint: `https://cloud.agenta.ai/api/otlp/v1/traces` -- Authentication: Uses `ApiKey` authentication header - -:::warning -Agenta only supports **HTTP/protobuf** for the OpenTelemetry endpoint. gRPC is not supported. -::: - -For self-hosted Agenta deployments, replace the endpoint in the exporter configuration: - -```yaml -exporters: - otlphttp/agenta: - endpoint: "http://your-agenta-instance:port/api/otlp/v1/traces" - headers: - Authorization: "ApiKey ${AGENTA_API_KEY}" -``` - -## Next Steps - -- Learn about [semantic conventions](/observability/trace-with-opentelemetry/semantic-conventions) for proper trace formatting -- Explore [distributed tracing](/observability/trace-with-opentelemetry/distributed-tracing) without the Agenta SDK diff --git a/docs/docs/observability/trace-with-opentelemetry/_category_.json b/docs/docs/observability/trace-with-opentelemetry/_category_.json deleted file mode 100644 index aef5391a04..0000000000 --- a/docs/docs/observability/trace-with-opentelemetry/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Trace with OpenTelemetry", - "position": 6, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/observability/trace-with-python-sdk/01-setup-tracing.mdx b/docs/docs/observability/trace-with-python-sdk/01-setup-tracing.mdx deleted file mode 100644 index bd063ec70b..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/01-setup-tracing.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "Setup Tracing" -sidebar_label: "Setup Tracing" -description: "Learn how to set up tracing with the Agenta Python SDK for LLM observability" -sidebar_position: 1 ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - - - Open in Google Colaboratory - - -The Agenta Observability SDK integrates with the OpenTelemetry SDK. It wraps OpenTelemetry and provides a user-friendly way to instrument your LLM applications. - -The SDK provides: - -- Automatic OpenTelemetry setup -- Easy function instrumentation using [decorators](/observability/trace-with-python-sdk/instrument-functions) -- [Reference prompt versions](/observability/trace-with-python-sdk/reference-prompt-versions) to link traces to applications, variants, and environments -- [Add attributes](/observability/trace-with-python-sdk/adding-metadata) to spans for additional metadata - -The SDK works with auto instrumentation. You should use auto instrumentation together with this SDK. - -## Installation - -**1. Install the Agenta SDK** - -```bash -pip install -U agenta -``` - -## Configuration - -**2. Set environment variables** - -1. Visit the [Agenta API Keys page](https://cloud.agenta.ai/settings?tab=apiKeys). -2. Click on **Create New API Key** and follow the prompts. - -```python -import os - -os.environ["AGENTA_API_KEY"] = "YOUR_AGENTA_API_KEY" -os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" -``` - -**3. Initialize the SDK** - -```python -import agenta as ag - -ag.init() -``` - -That's it! You're now ready to instrument your functions and start capturing traces. - -## Next steps - -- Learn how to [instrument your functions](/observability/trace-with-python-sdk/instrument-functions) -- Link traces to [prompt versions](/observability/trace-with-python-sdk/reference-prompt-versions) -- Understand how to [redact sensitive data](/observability/trace-with-python-sdk/redact-sensitive-data) diff --git a/docs/docs/observability/trace-with-python-sdk/02-instrument-functions.mdx b/docs/docs/observability/trace-with-python-sdk/02-instrument-functions.mdx deleted file mode 100644 index 86249b2b4b..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/02-instrument-functions.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Instrument Your Functions" -sidebar_label: "Instrument Functions" -description: "Learn how to instrument functions for LLM observability and tracing using the Agenta Python SDK decorator" -sidebar_position: 2 ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - - - Open in Google Colaboratory - - -To instrument a function, add the `@ag.instrument()` decorator. This automatically captures all input and output data. - -The decorator has a `spankind` argument to categorize each span in the UI. Available types are: - -`agent`, `chain`, `workflow`, `tool`, `embedding`, `query`, `completion`, `chat`, `rerank` - -:::info -The default span kind is `workflow`. -::: - -:::caution -The instrument decorator should be the top-most decorator on a function (i.e. the last decorator before the function call). -::: - -```python -import agenta as ag - -@ag.instrument(spankind="task") -def my_llm_call(country: str): - prompt = f"What is the capital of {country}" - response = client.chat.completions.create( - model='gpt-4', - messages=[ - {'role': 'user', 'content': prompt}, - ], - ) - return response.choices[0].text - -@ag.instrument(spankind="workflow") -def generate(country: str): - return my_llm_call(country) -``` - -Agenta automatically determines the parent span based on the function call and nests the spans accordingly. - -## Next steps - -- Learn how to [add metadata and internals](/observability/trace-with-python-sdk/adding-metadata) -- Link traces to [prompt versions](/observability/trace-with-python-sdk/reference-prompt-versions) -- Understand how to [redact sensitive data](/observability/trace-with-python-sdk/redact-sensitive-data) diff --git a/docs/docs/observability/trace-with-python-sdk/03-adding-metadata.mdx b/docs/docs/observability/trace-with-python-sdk/03-adding-metadata.mdx deleted file mode 100644 index f0cbe08edc..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/03-adding-metadata.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Adding Metadata" -sidebar_label: "Adding Metadata" -description: "Learn how to add metadata and internals to spans for LLM observability and tracing" -sidebar_position: 3 ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - - - Open in Google Colaboratory - - -You can add additional information to spans using metadata and internals. Both use semantic conventions under the `ag` namespace. Metadata is saved under `ag.meta`. Internals are saved under `ag.data.internals`. - -See the [semantic conventions guide](/observability/trace-with-opentelemetry/semantic-conventions) for more details on how attributes are organized. - -## Adding metadata - -Use `ag.tracing.store_meta()` to add metadata to a span. This function accesses the active span from the context and adds the key-value pairs to the metadata. - -```python -@ag.instrument(spankind="task") -def compile_prompt(country: str): - prompt = f"What is the capital of {country}" - - # highlight-next-line - ag.tracing.store_meta({"prompt_template": prompt}) - - formatted_prompt = prompt.format(country=country) - return formatted_prompt -``` - -## Storing internals - -Use `ag.tracing.store_internals()` to store internals in a span: - -```python -@ag.instrument(spankind="workflow") -def rag_workflow(query: str): - - context = retrieve_context(query) - - # highlight-start - ag.tracing.store_internals({"context": context}) - # highlight-end - - prompt = f"Answer the following question {query} based on the context: {context}" - - completion = client.chat.completions.create( - model='gpt-4', - messages=[ - {'role': 'user', 'content': prompt}, - ], - ) - return completion.choices[0].message.content -``` - -## Differences between metadata and internals - -Both metadata and internals can be used for evaluation and filtering. The main differences are: - -1. Internals are searchable using plain text queries because they are saved under `ag.data`. -2. Internals are shown in the overview tab of the observability drawer together with inputs and outputs, making them easy to see. - -As a rule of thumb, if your context is short, put important information that helps understand the span into internals. - -## Next steps - -- Link traces to [prompt versions](/observability/trace-with-python-sdk/reference-prompt-versions) -- Understand how to [redact sensitive data](/observability/trace-with-python-sdk/redact-sensitive-data) -- Explore [distributed tracing](/observability/trace-with-python-sdk/distributed-tracing) across services - diff --git a/docs/docs/observability/trace-with-python-sdk/04-reference-prompt-versions.mdx b/docs/docs/observability/trace-with-python-sdk/04-reference-prompt-versions.mdx deleted file mode 100644 index 19bbbb9d1a..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/04-reference-prompt-versions.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Reference Prompt Versions" -sidebar_label: "Reference Prompt Versions" -description: "Learn how to link traces to specific applications, variants, and environments in Agenta" -sidebar_position: 4 ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - - - Open in Google Colaboratory - - -You can link a span to an application, variant, and environment by calling `ag.tracing.store_refs()`. - -Applications, variants, and environments can be referenced by their slugs, versions, and commit IDs (for specific versions). - -## Basic usage - -You can link a span to an application and variant like this: - -```python -import agenta as ag - -@ag.instrument(spankind="workflow") -def generate(country: str): - prompt = f"What is the capital of {country}" - - formatted_prompt = prompt.format(country=country) - - completion = client.chat.completions.create( - model='gpt-4', - messages=[ - {'role': 'user', 'content': formatted_prompt}, - ], - ) - - # highlight-start - ag.tracing.store_refs( - { - "application.slug": "capital-app", - "environment.slug": "production", - } - ) - # highlight-end - return completion.choices[0].message.content -``` - -## Available reference keys - -`ag.tracing.store_refs()` takes a dict with keys from: - -- `application.slug` -- `application.id` -- `variant.slug` -- `variant.id` -- `variant.version` -- `environment.slug` -- `environment.id` -- `environment.version` - -The values should be the slug, id, or version of the application, variant, and environment respectively. - -## Why link traces? - -Linking traces to applications and variants allows you to: - -- **Filter traces** by application, variant, or environment in the UI -- **Compare performance** across different variants -- **Track production behavior** by environment -- **Create test sets** from production traces with proper context - -## Next steps - -- Learn how to [redact sensitive data](/observability/trace-with-python-sdk/redact-sensitive-data) -- Understand how to [track costs](/observability/trace-with-python-sdk/track-costs) -- Explore [distributed tracing](/observability/trace-with-python-sdk/distributed-tracing) across services diff --git a/docs/docs/observability/trace-with-python-sdk/05-redact-sensitive-data.mdx b/docs/docs/observability/trace-with-python-sdk/05-redact-sensitive-data.mdx deleted file mode 100644 index 7b71f46203..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/05-redact-sensitive-data.mdx +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: "Redact Sensitive Data" -sidebar_label: "Redact Sensitive Data" -description: "Learn how to exclude sensitive data from traces using the Agenta Python SDK" -sidebar_position: 5 ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - - - Open in Google Colaboratory - - -In some cases, you may want to exclude parts of the inputs or outputs due to privacy concerns or because the data is too large to be stored in the span. - -## Simple redaction - -You can do this by setting the `ignore_inputs` and/or `ignore_outputs` arguments to `True` in the instrument decorator. - -```python -import agenta as ag - -@ag.instrument( - spankind="workflow", - ignore_inputs=True, - ignore_outputs=True -) -def rag_workflow(query: str): - ... -``` - -## Selective redaction - -If you want more control, you can specify which parts of the inputs and outputs to exclude: - -```python -@ag.instrument( - spankind="workflow", - ignore_inputs=["user_id"], - ignore_outputs=["pii"], -) -def rag_workflow(query: str, user_id: str): - ... - return { - "result": ..., - "pii": ... - } -``` - -## Custom redaction callback - -For even finer control, you can use a custom `redact()` callback, along with instructions in the case of errors. - -```python -def my_redact(name, field, data): - if name == "rag_workflow": - if field == "inputs": - del data["user_id"] - if field == "outputs": - del data["pii"] - - return data - - -@ag.instrument( - spankind="workflow", - redact=my_redact, - redact_on_error=False, -) -def rag_workflow(query: str, user_id: str): - ... - return { - "result": ..., - "pii": ... - } -``` - -## Global redaction rules - -Finally, if you want to set up global rules for redaction, you can provide a global `redact()` callback that applies everywhere. - -```python -from typing import Dict, Any - -def global_redact( - name: str, - field: str, - data: Dict[str, Any] -): - if "pii" in data: - del data["pii"] - - return data - - -ag.init( - redact=global_redact, - redact_on_error=True, -) - -def local_redact( - name: str, - field: str, - data: Dict[str, Any] -): - if name == "rag_workflow": - if field == "inputs": - del data["user_id"] - - return data - - -@ag.instrument( - spankind="workflow", - redact=local_redact, - redact_on_error=False, -) -def rag_workflow(query: str, user_id: str): - ... - return { - "result": ..., - "pii": ... - } -``` - -## Best practices - -- **Use selective redaction** rather than blocking all inputs/outputs when possible -- **Test your redaction rules** to ensure they work as expected -- **Consider global rules** for organization-wide PII policies -- **Document redacted fields** so team members know what data is missing - -## Next steps - -- Understand how to [track costs](/observability/trace-with-python-sdk/track-costs) -- Explore [distributed tracing](/observability/trace-with-python-sdk/distributed-tracing) across services -- Learn how to [annotate traces](/observability/trace-with-python-sdk/annotate-traces) programmatically diff --git a/docs/docs/observability/trace-with-python-sdk/06-track-costs.mdx b/docs/docs/observability/trace-with-python-sdk/06-track-costs.mdx deleted file mode 100644 index 9ca6bc1b01..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/06-track-costs.mdx +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: "Track Costs" -sidebar_label: "Track Costs" -description: "Learn how Agenta automatically tracks and aggregates LLM costs, token usage, and performance metrics across your traces" -sidebar_position: 6 ---- - -Agenta automatically tracks costs, token usage, and performance metrics for your LLM applications. This data is captured in the `ag.metrics` namespace of each span. - -## Overview - -When you instrument your application with Agenta, we automatically collect cost and performance metrics for spans of type chat. - -Costs are calculated using the latest pricing for each model provider. Token usage is tracked separately for input (prompt) and output (completion) tokens. Execution time is measured in milliseconds for each operation. - -## Metrics Structure - -### Cost Metrics - -Costs are tracked in USD with the following breakdown: - -```json -{ - "metrics": { - "costs": { - "cumulative": { - "total": 0.0070902, - "prompt": 0.00355, - "completion": 0.00354 - } - } - } -} -``` - -The `total` field shows the total cost across all LLM calls in this span and its children. The `prompt` field shows the cost attributed to input tokens. The `completion` field shows the cost for output tokens. - -### Token Usage - -Token consumption is tracked with separate counts for input and output: - -```json -{ - "metrics": { - "tokens": { - "cumulative": { - "total": 992, - "prompt": 175, - "completion": 817 - } - } - } -} -``` - -The `total` field shows all tokens used (prompt plus completion). The `prompt` field shows input tokens consumed. The `completion` field shows output tokens generated. - -### Duration - -Execution time is measured in milliseconds: - -```json -{ - "metrics": { - "duration": { - "cumulative": 19889.343 - } - } -} -``` - -:::info -Agenta tracks metrics at two levels. **Incremental metrics** represent costs for a single span only. **Cumulative metrics** aggregate values from the current span plus all child spans. -::: - -## How to Track Costs - -### With Auto-Instrumentation - -When you use auto-instrumentation from [compatible libraries](/observability/concepts#auto-instrumentation-compatibility), prompts and tokens are automatically extracted and formatted. Costs are calculated when possible. - -```python -import agenta as ag -from openinference.instrumentation.openai import OpenAIInstrumentor - -ag.init() -OpenAIInstrumentor().instrument() - -@ag.instrument() -def generate_response(prompt: str): - response = client.chat.completions.create( - model="gpt-4", - messages=[{"role": "user", "content": prompt}] - ) - return response.choices[0].message.content -``` - -### With Manual Instrumentation - -You can manually add cost metrics to spans using incremental metrics: - -```python -import agenta as ag - -@ag.instrument() -def custom_llm_call(prompt: str): - # Your custom LLM call logic - response = my_custom_llm.generate(prompt) - - # Manually track incremental metrics (for this span only) - ag.tracing.store_metrics({ - "costs.incremental.total": 0.0025, - "costs.incremental.prompt": 0.0015, - "costs.incremental.completion": 0.001, - "tokens.incremental.total": 150, - "tokens.incremental.prompt": 100, - "tokens.incremental.completion": 50 - }) - - # Cumulative metrics are automatically calculated by the backend - - return response -``` - -## Automatic Cost Calculation - -Agenta calculates costs automatically for major LLM providers using the LiteLLM library. When the cost is not provided in the span and the span type is chat, we try to infer the cost from the number of tokens. - -### Custom Pricing - -For custom models or providers, you can manually set costs using incremental metrics: - -```python -import agenta as ag - -@ag.instrument() -def custom_model_call(prompt: str): - response = my_model.generate(prompt) - - # Calculate custom cost - prompt_tokens = len(prompt.split()) - completion_tokens = len(response.split()) - - # Custom pricing - cost_per_prompt_token = 0.00001 - cost_per_completion_token = 0.00002 - - prompt_cost = prompt_tokens * cost_per_prompt_token - completion_cost = completion_tokens * cost_per_completion_token - total_cost = prompt_cost + completion_cost - - # Set incremental metrics - ag.tracing.store_metrics({ - "costs.incremental.total": total_cost, - "costs.incremental.prompt": prompt_cost, - "costs.incremental.completion": completion_cost, - "tokens.incremental.total": prompt_tokens + completion_tokens, - "tokens.incremental.prompt": prompt_tokens, - "tokens.incremental.completion": completion_tokens - }) - - return response -``` - -## Next steps - -Learn about [adding metadata](/observability/trace-with-python-sdk/adding-metadata) to enrich your traces. diff --git a/docs/docs/observability/trace-with-python-sdk/07-distributed-tracing.mdx b/docs/docs/observability/trace-with-python-sdk/07-distributed-tracing.mdx deleted file mode 100644 index 8423b80b66..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/07-distributed-tracing.mdx +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Distributed Tracing" -sidebar_label: "Distributed Tracing" -description: "Learn how to implement distributed tracing across services with the Agenta SDK" -sidebar_position: 7 ---- - -When using the Agenta SDK, distributed tracing is handled automatically with the provided SDK functions. This guide shows you how to propagate trace context across services and extract it when receiving requests. - -## Using OpenTelemetry with Agenta SDK - -Agenta supports distributed tracing out of the box when using the provided SDK functions: - -### 1. Sending Requests (Propagation) - -When making requests to other services or sub-systems, use `agenta.tracing.inject()` to inject necessary headers: - -```python -import agenta as ag - -method = "POST" -url = "https://example-service/api" -params = {} -headers = agenta.tracing.inject() # automatically injects 'Authorization', 'Traceparent', 'Baggage' -body = {"key": "value"} - -response = requests.request( - method=method, - url=url, - params=params, - headers=headers, - json=body, -) -``` - -The `agenta.tracing.inject()` function returns headers containing: - -- `Authorization`: Authentication information -- `Traceparent`: Identifies the current trace and span -- `Baggage`: Contains application-specific context - -These headers can be modified before sending them as part of the request if needed. - -### 2. Receiving Requests (Extraction) - -Agenta simplifies receiving and handling incoming trace contexts: - -- If you're using `ag.route()` and `ag.instrument()`, extraction is automatic. -- For manual extraction, use `agenta.tracing.extract()`: - -```python -traceparent, baggage = agenta.tracing.extract() # includes 'Traceparent', 'Baggage' - -# Use traceparent and baggage to set up your OpenTelemetry context -# (Implementation depends on your specific use case) -``` - -:::note -`extract()` does not provide `Authorization` because there are many authentication methods (apikey, bearer, secret, access tokens), each requiring different handling. The middlewares and decorators in the Agenta SDK handle this automatically when you use `ag.route()` and `ag.instrument()`. -::: - -## Next Steps - -- Learn about [tracing without the Agenta SDK](/observability/trace-with-opentelemetry/distributed-tracing) for raw OpenTelemetry setup -- Explore [semantic conventions](/observability/trace-with-opentelemetry/semantic-conventions) for better trace formatting -- See [instrumenting functions](/observability/trace-with-python-sdk/instrument-functions) for automatic instrumentation - diff --git a/docs/docs/observability/trace-with-python-sdk/08-annotate-traces.mdx b/docs/docs/observability/trace-with-python-sdk/08-annotate-traces.mdx deleted file mode 100644 index 4240c70168..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/08-annotate-traces.mdx +++ /dev/null @@ -1,522 +0,0 @@ ---- -title: "Annotate Traces" -sidebar_label: "Annotate Traces" -description: "Learn how to programmatically add annotations to traces using the Agenta API - collect feedback, scores, and custom metrics" -sidebar_position: 8 ---- - -```mdx-code-block -import Image from "@theme/IdealImage"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - -Annotations in Agenta let you enrich the traces created by your LLM applications. You can add scores, comments, expected answers and other metrics to help evaluate your application's performance. - - - Open in Google Colaboratory - - -Screenshot showing how annotations appear in the Agenta UI - -## What You Can Do With Annotations - -- Collect user feedback on LLM responses -- Run custom evaluation workflows -- Measure application performance in real-time - -## Understanding How Annotations Work - -Annotations **link** to specific points (spans) in your application traces. You can **link** them to: -- Parent spans (like an agent invocation) -- Child spans (like a single LLM call within a larger process) - -Each annotation can include: -- Numbers (scores, ratings) -- Categories (labels, classifications) -- Text (comments, reasoning) - -### Annotation Structure - -Here's what an annotation looks like: - -```json -{ - "data": { - "outputs": { - "score": 80, - "normalized_score": 0.8, - "reasoning": "The answer is mainly correct" - } - }, - "references": { - "evaluator": { - "slug": "my_evaluator" - } - }, - "links": { - "invocation": { - "trace_id": "47cb4a13b42a47bab2198509543ff14d", - "span_id": "1a9130f6ad398e55" - } - }, - "metadata": { - "someattr": "somevalue" - } -} -``` - -An annotation has four main parts: - -1. **Data**: The actual evaluation content (scores, comments) -2. **References**: Which evaluator to use (will be created automatically if it doesn't exist) -3. **Links**: Which trace and span you're annotating -4. **Metadata** (optional): Any extra information you want to include - -### What You Can Include in Annotations - -Annotations are flexible - you can include whatever makes sense for your evaluation: - -```json -// Just a simple score -{"score": 3} - -// A score with explanation -{"score": 3, "comment": "The response is not grounded"} - -// Multiple metrics with reference information -{"score": 3, "normalized_score": 0.5, "comment": "The response is not grounded", "expected_answer": "The capital of France is Paris"} -``` - -You can use numbers, text, booleans, or categorical values. - -### Connecting Annotations to Traces - -Each annotation links to a specific span in your trace using a `trace_id` and `span_id`. These IDs follow the OpenTelemetry format. - -:::warning -Agenta doesn't check if the trace and span IDs exist. Make sure they're valid before sending. -::: - -### Working with Evaluators - -Every annotation must reference an `Evaluator`, which: -- Defines what your annotation should contain -- Provides context for interpreting the annotation - -If you reference an evaluator that doesn't exist yet, Agenta will automatically create one based on your first annotation. - -You can add multiple annotations from the same evaluator to a single span, which is useful for collecting feedback from different sources. - -### Using Metadata - -The `metadata` field lets you add extra information to your annotation. Use it to store things like user IDs, session information, or other context. - -## Creating Annotations - - - - -```python -import requests - -base_url = "https://cloud.agenta.ai" -headers = { - "Content-Type": "application/json", - "Authorization": "ApiKey YOUR_API_KEY" -} - -# Annotation data -annotation_data = { - "annotation": { - "data": { - "outputs": { - "score": 40, - "reasoning": "Response contains some inaccuracies", - "labels": ["Partially Correct", "Needs Improvement"] - } - }, - "references": { - "evaluator": { - "slug": "content_quality" - } - }, - "links": { - "invocation": { - "trace_id": "47cb4a13b42a47bab2198509543ff14d", - "span_id": "1a9130f6ad398e55" - } - } - } -} - -# Make the API request -response = requests.post( - f"{base_url}/api/preview/annotations/", - headers=headers, - json=annotation_data -) - -# Process the response -if response.status_code == 200: - print("Annotation created successfully") - print(response.json()) -else: - print(f"Error: {response.status_code}") - print(response.text) -``` - - - - -```javascript -async function createAnnotation() { - const baseUrl = 'https://cloud.agenta.ai'; - - const headers = { - 'Content-Type': 'application/json', - 'Authorization': 'ApiKey YOUR_API_KEY' - }; - - const annotationData = { - annotation: { - data: { - outputs: { - score: 40, - reasoning: "Response contains some inaccuracies", - labels: ["Partially Correct", "Needs Improvement"] - } - }, - references: { - evaluator: { - slug: "content_quality" - } - }, - links: { - invocation: { - trace_id: "47cb4a13b42a47bab2198509543ff14d", - span_id: "1a9130f6ad398e55" - } - } - } - }; - - try { - const response = await fetch(`${baseUrl}/api/preview/annotations/`, { - method: 'POST', - headers: headers, - body: JSON.stringify(annotationData) - }); - - if (response.ok) { - const data = await response.json(); - console.log("Annotation created successfully"); - console.log(data); - } else { - console.error(`Error: ${response.status}`); - console.error(await response.text()); - } - } catch (error) { - console.error("Request failed:", error); - } -} - -createAnnotation(); -``` - - - - -:::info -If the evaluator doesn't exist yet, Agenta will create it automatically based on your first annotation. -::: - -## Understanding the Response - -When you create an annotation, you'll receive a response that includes the annotation data and its ID: - -```json -{ - "annotation": { - "created_at": "2025-05-13T16:54:52.245664Z", - "created_by_id": "019315dc-a332-7ba5-a426-d079c43ab776", - "span_id": "a1713ea8f59291f6", - "trace_id": "bb39070937f74f169b60dfc420729ad3", - "kind": "custom", - "source": "api", - "data": { - "outputs": { - "score": 0, - "reasoning": "The answer is totally false.", - "expected_answer": "The capital of France is Paris", - "normalized_score": 0 - } - }, - "metadata": { - "user_id": "miamia" - }, - "references": { - "evaluator": { - "id": "0196ca64-9cbf-7ee3-b507-2b559dd13090", - "slug": "main-scorer" - } - }, - "links": { - "invocation": { - "span_id": "09383e1124b264d0", - "trace_id": "5d52a529b48135fd58790f8aa3e33fb8" - } - } - } -} -``` - -:::info -Annotations themselves are stored as traces with their own `trace_id` and `span_id`, which is different from the invocation they're linked to. -::: - -## Viewing Annotations in the UI - -You can see all annotations for a trace in the Agenta UI. Open any trace and check the Annotations tab to see detailed information. The right sidebar shows average metrics for each evaluator. - -Screenshot showing how annotations appear in the Agenta UI - -## Querying Annotations - - - - -You can query annotations in several ways: - -**1. Query by annotation ID:** - -```python -import requests - -base_url = "https://cloud.agenta.ai" -headers = { - "Content-Type": "application/json", - "Authorization": "ApiKey YOUR_API_KEY" -} - -# Query by annotation ID -query_data = { - "annotation": { - "trace_id": "bb39070937f74f169b60dfc420729ad3", - "span_id": "a1713ea8f59291f6" - } -} - -response = requests.post( - f"{base_url}/api/preview/annotations/query", - headers=headers, - json=query_data -) - -if response.status_code == 200: - print("Query successful") - print(response.json()) -else: - print(f"Error: {response.status_code}") - print(response.text) -``` - -**2. Query all annotations for an invocation:** - -```python -# Query all annotations for an invocation -query_data = { - "annotation": { - "links": { - "invocation": { - "trace_id": "5d52a529b48135fd58790f8aa3e33fb8", - "span_id": "09383e1124b264d0" - } - } - } -} - -response = requests.post( - f"{base_url}/api/preview/annotations/query", - headers=headers, - json=query_data -) -``` - - - - -You can query annotations in several ways: - -**1. Query by annotation ID:** - -```javascript -async function queryAnnotation() { - const baseUrl = 'https://cloud.agenta.ai'; - - const headers = { - 'Content-Type': 'application/json', - 'Authorization': 'ApiKey YOUR_API_KEY' - }; - - // Query by annotation ID - const queryData = { - annotation: { - trace_id: "bb39070937f74f169b60dfc420729ad3", - span_id: "a1713ea8f59291f6" - } - }; - - try { - const response = await fetch(`${baseUrl}/api/preview/annotations/query`, { - method: 'POST', - headers: headers, - body: JSON.stringify(queryData) - }); - - if (response.ok) { - const data = await response.json(); - console.log("Query successful"); - console.log(data); - } else { - console.error(`Error: ${response.status}`); - console.error(await response.text()); - } - } catch (error) { - console.error("Request failed:", error); - } -} - -queryAnnotation(); -``` - -**2. Query all annotations for an invocation:** - -```javascript -async function queryAnnotationsForInvocation() { - const baseUrl = 'https://cloud.agenta.ai'; - - const headers = { - 'Content-Type': 'application/json', - 'Authorization': 'ApiKey YOUR_API_KEY' - }; - - // Query all annotations for an invocation - const queryData = { - annotation: { - links: { - invocation: { - trace_id: "5d52a529b48135fd58790f8aa3e33fb8", - span_id: "09383e1124b264d0" - } - } - } - }; - - try { - const response = await fetch(`${baseUrl}/api/preview/annotations/query`, { - method: 'POST', - headers: headers, - body: JSON.stringify(queryData) - }); - - if (response.ok) { - const data = await response.json(); - console.log("Query successful"); - console.log(data); - } else { - console.error(`Error: ${response.status}`); - console.error(await response.text()); - } - } catch (error) { - console.error("Request failed:", error); - } -} - -queryAnnotationsForInvocation(); -``` - - - - -## Removing Annotations - - - - -```python -import requests - -base_url = "https://cloud.agenta.ai" -headers = { - "Content-Type": "application/json", - "Authorization": "ApiKey YOUR_API_KEY" -} - -# Define the trace_id and span_id of the annotation to delete -trace_id = "bb39070937f74f169b60dfc420729ad3" -span_id = "a1713ea8f59291f6" - -# Make the delete request -response = requests.delete( - f"{base_url}/api/preview/annotations/{trace_id}/{span_id}", - headers=headers -) - -# Process the response -if response.status_code == 200: - print("Annotation deleted successfully") -else: - print(f"Error: {response.status_code}") - print(response.text) -``` - - - - -```javascript -async function deleteAnnotation() { - const baseUrl = 'https://cloud.agenta.ai'; - - const headers = { - 'Content-Type': 'application/json', - 'Authorization': 'ApiKey YOUR_API_KEY' - }; - - // Define the trace_id and span_id of the annotation to delete - const traceId = "bb39070937f74f169b60dfc420729ad3"; - const spanId = "a1713ea8f59291f6"; - - try { - const response = await fetch(`${baseUrl}/api/preview/annotations/${traceId}/${spanId}`, { - method: 'DELETE', - headers: headers - }); - - if (response.ok) { - console.log("Annotation deleted successfully"); - } else { - console.error(`Error: ${response.status}`); - console.error(await response.text()); - } - } catch (error) { - console.error("Request failed:", error); - } -} - -deleteAnnotation(); -``` - - - diff --git a/docs/docs/observability/trace-with-python-sdk/_06-sample-traces.mdx b/docs/docs/observability/trace-with-python-sdk/_06-sample-traces.mdx deleted file mode 100644 index 45982d3e81..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/_06-sample-traces.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Sample Traces" -sidebar_label: "Sample Traces" -description: "Learn how to implement sampling strategies to reduce trace volume in Agenta" -sidebar_position: 7 ---- - - - -## Overview - -Sampling allows you to control which traces are sent to Agenta, helping reduce costs and storage when dealing with high-volume applications. - -## Why sample? - -- Reduce storage costs -- Minimize performance impact -- Focus on interesting traces (errors, slow requests) - -## Next steps - -- Learn about [batching traces](/observability/trace-with-python-sdk/batch-traces) -- Explore [cost tracking](/observability/trace-with-python-sdk/track-costs) diff --git a/docs/docs/observability/trace-with-python-sdk/_07-batch-traces.mdx b/docs/docs/observability/trace-with-python-sdk/_07-batch-traces.mdx deleted file mode 100644 index 395f1835ef..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/_07-batch-traces.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Batch Traces" -sidebar_label: "Batch Traces" -description: "Learn how to batch traces for efficient transmission to Agenta" -sidebar_position: 8 ---- - - - -## Overview - -Learn how to batch traces for efficient transmission to Agenta - -## Next steps - -- Explore other [Python SDK features](/observability/trace-with-python-sdk/setup-tracing) -- Learn about [using the UI](/observability/using-the-ui/filtering-traces) diff --git a/docs/docs/observability/trace-with-python-sdk/_09-track-chat-sessions.mdx b/docs/docs/observability/trace-with-python-sdk/_09-track-chat-sessions.mdx deleted file mode 100644 index 025e2e5df6..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/_09-track-chat-sessions.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Track Chat Sessions" -sidebar_label: "Track Chat Sessions" -description: "Learn how to track multi-turn conversations and chat sessions" -sidebar_position: 10 ---- - - - -## Overview - -Learn how to track multi-turn conversations and chat sessions - -## Next steps - -- Explore other [Python SDK features](/observability/trace-with-python-sdk/setup-tracing) -- Learn about [using the UI](/observability/using-the-ui/filtering-traces) diff --git a/docs/docs/observability/trace-with-python-sdk/_10-track-users.mdx b/docs/docs/observability/trace-with-python-sdk/_10-track-users.mdx deleted file mode 100644 index 6b0d4c476a..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/_10-track-users.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Track Users" -sidebar_label: "Track Users" -description: "Learn how to associate traces with specific users for better analytics" -sidebar_position: 11 ---- - - - -## Overview - -Learn how to associate traces with specific users for better analytics - -## Next steps - -- Explore other [Python SDK features](/observability/trace-with-python-sdk/setup-tracing) -- Learn about [using the UI](/observability/using-the-ui/filtering-traces) diff --git a/docs/docs/observability/trace-with-python-sdk/_category_.json b/docs/docs/observability/trace-with-python-sdk/_category_.json deleted file mode 100644 index 0f24e70204..0000000000 --- a/docs/docs/observability/trace-with-python-sdk/_category_.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "label": "Trace with Python SDK", - "position": 5, - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/prompt-engineering/01-quick-start.mdx b/docs/docs/prompt-engineering/01-quick-start.mdx index dc1824c076..a5b41a504b 100644 --- a/docs/docs/prompt-engineering/01-quick-start.mdx +++ b/docs/docs/prompt-engineering/01-quick-start.mdx @@ -7,7 +7,7 @@ sidebar_position: 1 import Image from "@theme/IdealImage"; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import CustomDocCard from '@site/src/components/CustomDocCard'; +import DocCard from '@theme/DocCard'; ``` In this tutorial, we'll walk through three simple steps to get started with Agenta: @@ -15,20 +15,16 @@ In this tutorial, we'll walk through three simple steps to get started with Agen 2. Deploy it to an environment 3. Integrate it with your codebase using the Agenta SDK -
- ⏯️ Watch a video of the quick start guide. - -
+ style={{ display: "block", margin: "0 auto" }} +> ## 1. Create a prompt @@ -166,7 +162,7 @@ response = client.chat.completions.create( ) ``` - + ```javascript const fetchConfigs = async () => { @@ -276,7 +272,7 @@ Model names follow LiteLLM naming conventions: `provider/model` (e.g., `cohere/c ::: :::info -For simpler observability and cost tracking, Agenta also offers an endpoint to directly call LLMs with your prompt configuration. Learn more in the [proxy LLM calls](/prompt-engineering/integrating-prompts/proxy-calls) section. +For simpler observability and cost tracking, Agenta also offers an endpoint to directly call LLMs with your prompt configuration. Learn more in the [proxy LLM calls](/prompt-engineering/prompt-management/proxy-calls) section. ::: ## Next Steps @@ -287,26 +283,24 @@ To continue your journey with Agenta:
-
-
diff --git a/docs/docs/prompt-engineering/02-concepts.mdx b/docs/docs/prompt-engineering/02-concepts.mdx deleted file mode 100644 index 33f69b2080..0000000000 --- a/docs/docs/prompt-engineering/02-concepts.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Prompt Management Concepts" -sidebar_label: "Concepts" -description: "Learn how to effectively manage, version, and deploy LLM prompts and configurations. Discover how prompt management helps teams collaborate, track changes, and maintain consistency across development and production environments" -sidebar_position: 2 ---- - - - -```mdx-code-block -import CustomDocCard from '@site/src/components/CustomDocCard'; -import clsx from 'clsx'; -import Image from "@theme/IdealImage"; - -``` - - -## Why do I need a prompt management system? - -A prompt management system lets everyone on your team collaborate on prompts. This includes product owners, developers, and subject matter experts. The system organizes your prompts so that: -- Product teams can change prompts without going through developers each time -- You can version prompts and roll back to a previous version if needed -- You can link LLM application spans to prompt versions -- You can run evaluations on prompts and compare them to each other - -You can read more about the benefits of prompt management in our [blog post](https://agenta.ai/blog/the-definitive-guide-to-prompt-management-systems). - - -:::info -Agenta allows you to version not only prompts, but **any configuration**. For instance, for a RAG pipeline, you can version a configuration with the parameters `chunk_size` or `embedding_model`. You can read more about this in [custom workflows](/custom-workflows/overview). -::: - -## Versioning in Agenta - -Taxonomy of entities in Agenta - -Agenta uses a Git-like structure for versioning. Instead of having one commit history for each prompt, you can create multiple branches called **variants**. Each variant has its own version history. You can then deploy specific versions to **environments** (development, staging, production). - -## Entities in Agenta - -### Applications - -Prompts are applications in Agenta. Each application has a different type that determines how it runs. You can create chat applications and completion applications from the UI using templates. You can also create custom applications from your own code using [custom workflows](/custom-workflows/overview). - -### Variants -Variants are similar to branches in **git**. Each variant is an independent branch with its own commit history. When you create a prompt from the UI, we create a `default` variant for you. Unlike git branches, you cannot merge variants together. Use variants to experiment with different approaches or configurations. - -### Versions - -Versions are similar to commits in **git**. Each version is an immutable snapshot of a variant. When you make changes to a variant, you create a new version. Each version has a **commit id** that uniquely identifies it. Each version contains a **configuration** with prompts and other parameters. - -### Environments - -Environments are deployment targets for your prompts. Agenta provides three environments: **development**, **staging**, and **production**. Each environment points to a specific version from a variant. When you deploy a new version to an environment, the environment updates to point to that version. Environments track their deployment history, so you can roll back to any previously deployed version. - - -## Best practices for Organizing Prompts - -1. Create a new variant for each experiment or approach you explore. Some teams create variants per model. Others create variants per user or per approach. When you try a new approach, create a new variant. -2. Add commit notes to each version. Explain the changes you made. -3. Deploy variant versions to staging when ready. Use at least a staging environment and a production environment. -4. Have your internal team test the staging environment before deploying to production. At minimum, do a vibe check on the prompt. - diff --git a/docs/docs/prompt-engineering/02-overview.mdx b/docs/docs/prompt-engineering/02-overview.mdx new file mode 100644 index 0000000000..6864593dd9 --- /dev/null +++ b/docs/docs/prompt-engineering/02-overview.mdx @@ -0,0 +1,90 @@ +--- +title: "Overview" +description: "Learn how to effectively manage, version, and deploy LLM prompts and configurations. Discover how prompt management helps teams collaborate, track changes, and maintain consistency across development and production environments" +--- + +```mdx-code-block +import DocCard from '@theme/DocCard'; +import clsx from 'clsx'; +import Image from "@theme/IdealImage"; + +``` + + +Building LLM-powered applications is an iterative process. In each iteration, you aim to improve the application's performance by refining prompts, adjusting configurations, and evaluating outputs. + +Illustration of the LLMOPs process + +### Why do I need a prompt management system? + +A prompt management system enables everyone on the team—from **product owners** to **subject matter experts**—to collaborate in creating prompts. Additionally it helps you answer the following questions: + +- Which prompts have we tried? +- What were the outputs of these prompts? +- How do the evaluation results of these prompts compare? +- Which prompt version was used for a specific generation in production? +- What was the effect of publishing the new version of this prompt in production? +- Who on the team made changes to a particular prompt version in production? + +### Features in agenta + +Agenta provides you with the following capabilities: + +- A playground where developers and subject matter experts can collaboratively create and test prompts and compare models +- A prompt management system where, you can: + - **Versioning Prompts**: Keeping track of different prompts you've tested and a history of changes in production. + - **Linking Prompts to Experiments**: Connecting each prompt version to its evaluation metrics to understand the effect of changes and determine the best variant. + - **Linking Prompts to Traces**: Monitoring how changes in prompt versions affect the traces and production metrics. + +:::info +Agenta goes beyond prompt management to encompass the entire configuration of your LLM applications. If your LLM workflow is more complex than a single prompt (e.g., Retrieval-Augmented Generation (RAG) or a chain of prompts), you can version the **whole configuration** together. + +In contrast to a **prompt**, a **configuration** of an LLM application can include additional parameters beyond prompt templates and models (with their parameters). For instance: + +- An LLM application using a **chain of two prompts** would have a configuration that includes the two prompts and their respective model parameters. +- An application that includes a **RAG pipeline** would have a configuration that includes parameters such as `top_k` and `embedding`. + +```json title="Example RAG configuration" +{ + "top_k": 3, + "embedding": "text-embedding-3-large", + "prompt-query": "We have provided context information below. {context_str}. Given this information, please answer the question: {query_str}\n", + "model-query": "openai/gpt-o1", + "temperature-query": "1.0" +} +``` +::: + + +### Get started + + +
+
+ +
+ +
+ +
+
+ diff --git a/docs/docs/prompt-engineering/_managing-prompts-ui/01-create-and-commit.mdx b/docs/docs/prompt-engineering/_managing-prompts-ui/01-create-and-commit.mdx deleted file mode 100644 index 58b906273b..0000000000 --- a/docs/docs/prompt-engineering/_managing-prompts-ui/01-create-and-commit.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Create and Commit Prompts" -sidebar_position: 1 -sidebar_label: "Create and Commit Prompts" -description: "Learn how to create variants and commit changes using the Agenta UI." -draft: true - ---- - - - - -This section is under construction. For now, please refer to the [Quick Start guide](/prompt-engineering/quick-start) which covers creating and committing prompts from the UI. diff --git a/docs/docs/prompt-engineering/_managing-prompts-ui/01-creating-prompts.mdx b/docs/docs/prompt-engineering/_managing-prompts-ui/01-creating-prompts.mdx deleted file mode 100644 index 6506c050b0..0000000000 --- a/docs/docs/prompt-engineering/_managing-prompts-ui/01-creating-prompts.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Creating Prompts" -sidebar_position: 1 -sidebar_label: "Creating Prompts" -description: "Learn how to create prompts from the Agenta UI." -draft: true - ---- - -import Image from "@theme/IdealImage"; - -This guide shows you how to create prompts from the Agenta UI. -## Creating a new application - -### Creating a new application from the UI - -Go to the App Management page and click on the **Create New Prompt** button, then choose the type of application you want to create (chat for multi-turn chat applications or completion for single-turn applications). diff --git a/docs/docs/prompt-engineering/_managing-prompts-ui/02-deploy.mdx b/docs/docs/prompt-engineering/_managing-prompts-ui/02-deploy.mdx deleted file mode 100644 index eda7f3df09..0000000000 --- a/docs/docs/prompt-engineering/_managing-prompts-ui/02-deploy.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Deploy to Environments" -sidebar_position: 2 -sidebar_label: "Deploy to Environments" -description: "Learn how to deploy variants to different environments using the Agenta UI." -draft: true - ---- - - - - -This section is under construction. For now, please refer to the [Quick Start guide](/prompt-engineering/quick-start) which covers deploying variants from the UI. diff --git a/docs/docs/prompt-engineering/_managing-prompts-ui/03-versions-rollback.mdx b/docs/docs/prompt-engineering/_managing-prompts-ui/03-versions-rollback.mdx deleted file mode 100644 index 7bb5c5763b..0000000000 --- a/docs/docs/prompt-engineering/_managing-prompts-ui/03-versions-rollback.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Manage Versions and Rollback" -sidebar_position: 3 -sidebar_label: "Manage Versions and Rollback" -description: "Learn how to view version history and rollback to previous versions using the Agenta UI." -draft: true ---- - - - - -This section is under construction. For now, please refer to the [Quick Start guide](/prompt-engineering/quick-start) and the [Concepts page](/prompt-engineering/concepts) for information on versioning. diff --git a/docs/docs/prompt-engineering/_managing-prompts-ui/_category_.json b/docs/docs/prompt-engineering/_managing-prompts-ui/_category_.json deleted file mode 100644 index c209af07e8..0000000000 --- a/docs/docs/prompt-engineering/_managing-prompts-ui/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "position": 4, - "label": "Managing Prompts from UI", - "collapsed": true -} \ No newline at end of file diff --git a/docs/docs/prompt-engineering/integrating-prompts/01-integrating-with-agenta.mdx b/docs/docs/prompt-engineering/integrating-prompts/01-integrating-with-agenta.mdx deleted file mode 100644 index 8a5291e6ff..0000000000 --- a/docs/docs/prompt-engineering/integrating-prompts/01-integrating-with-agenta.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "How to Integrate with Agenta" -description: "Integrate applications and prompts created in Agenta into your projects." ---- - -import Image from "@theme/IdealImage"; - -Agenta integrates with your workflow. You can use the latest version of your deployed prompt in your application. With Agenta, **you can update prompts directly from the web interface without modifying your code** each time. - -Here are two ways to use prompts from Agenta in your code: - -### [1. As a prompt management system](/prompt-engineering/integrating-prompts/fetch-prompt-programatically) - -Prompts are managed and stored in the Agenta backend. You use the Agenta SDK to fetch the latest deployed version of your prompt. Then you use it in your application. - -**Advantages**: - -- Agenta operates outside your application's critical path. -- You can fetch and cache the latest prompt version for zero latency usage. - -**Considerations**: - -- You need to set up [observability integration](/observability/quickstart-python) yourself. This is required if you want to trace your calls for debugging and cost tracking. - -A sequence diagram showing how to integrate with Agenta as a prompt management system - - - -### [2. As a middleware/gateway (invoking prompt)](/prompt-engineering/integrating-prompts/proxy-calls) - -You invoke your prompts directly through Agenta. Agenta provides you with an endpoint that forwards requests to the LLM on your behalf. - -**Advantages**: - -- Simplified deployment. -- Automatic tracing without any code changes. - -**Considerations**: - -- Adds slight latency to the response (approximately 0.3 seconds). -- Streaming is not supported for these endpoints. - -This approach works best for applications where latency is not critical. - -A sequence diagram showing how to integrate with Agenta as    a proxy diff --git a/docs/docs/prompt-engineering/integrating-prompts/02-fetch-prompt-programatically.mdx b/docs/docs/prompt-engineering/integrating-prompts/02-fetch-prompt-programatically.mdx deleted file mode 100644 index 22ea6668c6..0000000000 --- a/docs/docs/prompt-engineering/integrating-prompts/02-fetch-prompt-programatically.mdx +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: "Fetch Prompts via SDK/API" -sidebar_position: 2 -sidebar_label: "Fetch Prompts via SDK/API" -description: "Learn how to fetch prompt configurations using the Agenta SDK or API." ---- - -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -This guide shows you how to fetch prompt configurations from variants or environments using the Agenta SDK. - - - Open in Google Colaboratory - - -## Fetching a Prompt Configuration - -You can fetch the configurations from a variant reference (`app_slug`, `variant_slug`, `variant_version`) or an environment reference (`app_slug`, `environment_slug`). The default behavior when fetching is to fetch the latest configuration from the `production` environment. If you don't provide a `variant_version` parameter but only a `variant_slug` or an `environment_slug`, the SDK will fetch the latest version of the variant from the specified **environment/variant**. - -:::tip -Check the [reference](/reference/sdk/configuration-management#prompt-configuration-schema) section for more details on the data format used for prompts. -::: - -### Default Behavior when fetching - -If you don't provide either `variant` or `environment` identifiers, the SDK fetches the latest configuration deployed to the `production` environment. - - - -```python -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=2 # Optional: fetches latest if not provided -) - -print("Fetched configuration from production:") -print(config) -``` -Example Output: - -```python -{ - "prompt": { - "messages": [ - { - "role": "system", - "content": "You are an assistant that provides concise answers" - }, - { - "role": "user", - "content": "Explain {{topic}} in simple terms" - } - ], - "llm_config": { - "model": "gpt-3.5-turbo", - "top_p": 1.0, - "max_tokens": 150, - "temperature": 0.7, - "presence_penalty": 0.0, - "frequency_penalty": 0.0 - }, - "template_format": "curly" - } -} -``` - - - -```javascript -// Fetch configuration from production environment (default behavior) -const fetchResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/fetch', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - }) -}); - -const config = await fetchResponse.json(); -console.log('Fetched configuration from production:'); -console.log(config); -``` - - - -```bash -# Fetch configuration from production environment (default behavior) -curl -X POST "https://cloud.agenta.ai/api/variants/configs/fetch" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - }' -``` - - - -:::tip -Agenta provides a helper class `PromptTemplate` to format the configuration and then use it to generate the prompt. -```python -from openai import OpenAI -from agenta.sdk.types import PromptTemplate - -# Fetch configuration -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug" -) - -# Format the prompt with variables -prompt = PromptTemplate(**config['prompt']).format(topic="AI") - -# Use with OpenAI -client = OpenAI() -response = client.chat.completions.create( - **prompt.to_openai_kwargs() -) - -print(response.choices[0].message.content) -``` -::: - -### Fetching by Variant Reference - - - - -```python -# Fetch configuration by variant -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=2 # Optional: If not provided, fetches the latest version -) - -print("Fetched configuration:") -print(config) -``` - - - -```javascript -// Fetch configuration by variant -const fetchResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/fetch', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - variant_ref: { - slug: 'my-variant-slug', - version: 2, - id: null - }, - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - }) -}); - -const config = await fetchResponse.json(); -console.log('Fetched configuration:'); -console.log(config); -``` - - - -```bash -# Fetch configuration by variant -curl -X POST "https://cloud.agenta.ai/api/variants/configs/fetch" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "variant_ref": { - "slug": "my-variant-slug", - "version": 2, - "id": null - }, - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - }' -``` - - - -### Fetching by Environment Reference - - - - -```python -# Fetch the latest configuration from the staging environment -config = ag.ConfigManager.get_from_registry( - app_slug="my-app", - environment_slug="staging", - environment_version=1 # Optional: If not provided, fetches the latest version -) - -print("Fetched configuration from staging:") -print(config) -``` - - - -```javascript -// Fetch the latest configuration from the staging environment -const fetchResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/fetch', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - environment_ref: { - slug: 'staging', - version: 1, // Optional: omit to fetch latest - id: null - }, - application_ref: { - slug: 'my-app', - version: null, - id: null - } - }) -}); - -const config = await fetchResponse.json(); -console.log('Fetched configuration from staging:'); -console.log(config); -``` - - - -```bash -# Fetch the latest configuration from the staging environment -curl -X POST "https://cloud.agenta.ai/api/variants/configs/fetch" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "environment_ref": { - "slug": "staging", - "version": 1, - "id": null - }, - "application_ref": { - "slug": "my-app", - "version": null, - "id": null - } - }' -``` - - - -## Response Format - -The API response contains your prompt configuration under `params`: - -```json -{ - "params": { - "prompt": { - "messages": [ - { - "role": "system", - "content": "You are an assistant that provides concise answers" - }, - { - "role": "user", - "content": "Explain {{topic}} in simple terms" - } - ], - "llm_config": { - "model": "gpt-3.5-turbo", - "max_tokens": 150, - "temperature": 0.7, - "top_p": 1.0, - "frequency_penalty": 0.0, - "presence_penalty": 0.0 - }, - "template_format": "curly" - } - }, - "url": "https://cloud.agenta.ai/services/completion", - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": "..." - }, - "variant_ref": { - "slug": "my-variant-slug", - "version": 2, - "id": "..." - }, - "environment_ref": { - "slug": "production", - "version": 1, - "id": "..." - } -} -``` - -:::tip Asynchronous Operations in Python SDK -All SDK methods have async counterparts with an `a` prefix: - -```python -async def async_operations(): - # Fetch configuration asynchronously - config = await ag.ConfigManager.aget_from_registry(...) -``` -::: diff --git a/docs/docs/prompt-engineering/integrating-prompts/_category_.json b/docs/docs/prompt-engineering/integrating-prompts/_category_.json deleted file mode 100644 index 78650487dd..0000000000 --- a/docs/docs/prompt-engineering/integrating-prompts/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "position": 6, - "label": "Integrate with Agenta", - "collapsed": true -} \ No newline at end of file diff --git a/docs/docs/prompt-engineering/managing-prompts-programatically/01-setup.mdx b/docs/docs/prompt-engineering/managing-prompts-programatically/01-setup.mdx deleted file mode 100644 index c8e9108dd8..0000000000 --- a/docs/docs/prompt-engineering/managing-prompts-programatically/01-setup.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: "Setup and Installation" -sidebar_position: 1 -sidebar_label: "Setup and Overview" -description: "Learn how to install and initialize the Agenta SDK for prompt management." ---- - -import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; - -This guide shows you how to set up the Agenta SDK for managing prompts programmatically. - - - Open in Google Colaboratory - - -## Prerequisites - -Before starting, familiarize yourself with how versioning works in Agenta. Details are available on the [concepts page](/concepts/concepts). - -:::info Versioning in Agenta - -{" "} - -Taxonomy of concepts in Agenta - -Agenta uses a Git-like structure for prompt versioning: -- Create multiple branches called **variants** -- Each variant is versioned. -- Deploy specific versions to **environments** (development, staging, production) - -**Typical workflow:** -1. Create a variant (branch) -2. Commit changes to the variant creating a new version -3. Deploy the version to an environment - -::: - -## Setup the SDK - -Initialize the SDK before using any operations: - -```python -import os -import agenta as ag - -# Set your API credentials -os.environ["AGENTA_API_KEY"] = "your-api-key-here" -os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" # only needed if self-hosting - -# Initialize the SDK -ag.init() -``` - -:::info -You can skip this step if you are using the API directly. -::: diff --git a/docs/docs/prompt-engineering/managing-prompts-programatically/02-creating-prompts.mdx b/docs/docs/prompt-engineering/managing-prompts-programatically/02-creating-prompts.mdx deleted file mode 100644 index 0b2c40d39f..0000000000 --- a/docs/docs/prompt-engineering/managing-prompts-programatically/02-creating-prompts.mdx +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: "Create Prompts" -sidebar_position: 1 -sidebar_label: "Create Prompts" -description: "Learn how to create prompts from the Agenta SDK." ---- - -import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -This guide shows you how to set up the Agenta SDK for managing prompts programmatically. - - - Open in Google Colaboratory - - - -## Creating a new application - -Prompts are applications in Agenta. To create a new prompt, you need to specify the slug, and the type of the application. - -The type of the application can be `SERVICE:completion`, `SERVICE:chat`, or `CUSTOM`: - -- `SERVICE:completion` is for single-turn prompts. -- `SERVICE:chat` is for multi-turn prompts. -- `CUSTOM` is for custom prompts. - - - - -```python -# Creates an empty application -app = ag.AppManager.create( - app_slug="my-app-slug", - template_key="SERVICE:completion", # we define here the app type - # template_key="SERVICE:chat" # chat prompts - # template_key="CUSTOM" # custom configuration (schema-less, however unless you provide a URI, you can only use the registry but not the playground) -) -``` - - - - -```javascript -const response = await fetch('https://cloud.agenta.ai/api/apps', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - app_name: 'my-app-slug', - template_key: 'SERVICE:completion' - }) -}); - -const result = await response.json(); -console.log(result); -``` - - - - -```bash -curl -X POST "https://cloud.agenta.ai/api/apps" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "app_name": "my-app-slug", - "template_key": "SERVICE:completion" - }' -``` - - - - - -:::warning -The app created until now is empty. You cannot use it from the UI yet. You need to create a variant and commit changes to it to be able to use it (next section). -::: \ No newline at end of file diff --git a/docs/docs/prompt-engineering/managing-prompts-programatically/03-create-and-commit.mdx b/docs/docs/prompt-engineering/managing-prompts-programatically/03-create-and-commit.mdx deleted file mode 100644 index 9678568066..0000000000 --- a/docs/docs/prompt-engineering/managing-prompts-programatically/03-create-and-commit.mdx +++ /dev/null @@ -1,978 +0,0 @@ ---- -title: "Version Prompts" -sidebar_position: 2 -sidebar_label: "Version Prompts" -description: "Learn how to create variants and commit changes using the Agenta SDK." ---- - -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -This guide covers how to create variants and commit changes to them using the Agenta SDK. - - - Open in Google Colaboratory - - -## Creating and Managing Variants - -### Create a New Variant - -Use `VariantManager.create` to create a new variant with initial configuration: - - - -```python -from agenta.sdk.types import PromptTemplate, Message, ModelConfig -from pydantic import BaseModel - -# Define your configuration model -class Config(BaseModel): - prompt: PromptTemplate - -# Create the initial configuration -config = Config( - prompt=PromptTemplate( - messages=[ - Message(role="system", content="You are an assistant that provides concise answers"), - Message(role="user", content="Explain {{topic}} in simple terms"), - ], - llm_config=ModelConfig( - model="gpt-3.5-turbo", - max_tokens=150, - temperature=0.7, - top_p=1.0, - frequency_penalty=0.0, - presence_penalty=0.0, - ), - ) -) - -# Create the variant -variant = ag.VariantManager.create( - parameters=config.model_dump(), - app_slug="my-app-slug", - variant_slug="my-variant-slug", -) -``` - - - - -```javascript -// Step 1: Add variant configuration (creates empty variant) -const addConfigResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/add', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - variant_ref: { - slug: 'my-variant-slug', - version: null, - id: null - }, - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - }) -}); - -const config = await addConfigResponse.json(); - -// Step 2: Commit parameters to the variant -const commitResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/commit', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - config: { - params: { - prompt: { - messages: [ - { - role: 'system', - content: 'You are an assistant that provides concise answers' - }, - { - role: 'user', - content: 'Explain {{topic}} in simple terms' - } - ], - llm_config: { - model: 'gpt-3.5-turbo', - max_tokens: 150, - temperature: 0.7, - top_p: 1.0, - frequency_penalty: 0.0, - presence_penalty: 0.0 - } - } - }, - variant_ref: { - slug: 'my-variant-slug', - version: null, - id: null - }, - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - } - }) -}); - -const result = await commitResponse.json(); -console.log(result); -``` - - - - -```bash -# Step 1: Add variant configuration (creates empty variant) -curl -X POST "https://cloud.agenta.ai/api/variants/configs/add" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "variant_ref": { - "slug": "my-variant-slug", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - }' - -# Step 2: Commit parameters to the variant -curl -X POST "https://cloud.agenta.ai/api/variants/configs/commit" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "config": { - "params": { - "prompt": { - "messages": [ - { - "role": "system", - "content": "You are an assistant that provides concise answers" - }, - { - "role": "user", - "content": "Explain {{topic}} in simple terms" - } - ], - "llm_config": { - "model": "gpt-3.5-turbo", - "max_tokens": 150, - "temperature": 0.7, - "top_p": 1.0, - "frequency_penalty": 0.0, - "presence_penalty": 0.0 - } - } - }, - "variant_ref": { - "slug": "my-variant-slug", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - } - }' -``` - - - - -:::tip -Use `VariantManager.acreate` for async variant creation. -::: - -This command will create a new variant and initialize it with the first commit containing the parameters provided - -- **Parameters:** - - `app_slug`: The slug of your application. - - `variant_slug`: The slug of the new variant. - - `parameters`: A dictionary containing the initial configuration parameters. - -**Note:** If a variant with the same `slug` and `version` already exists, the SDK will raise an exception. - -**Sample Output:** - -```python -{ - "messages": [ - { - "role": "system", - "content": "You are an assistant that provides concise answers" - }, - { - "role": "user", - "content": "Explain {{topic}} in simple terms" - } - ], - "llm_config": { - "model": "gpt-3.5-turbo", - "max_tokens": 150, - "temperature": 0.7, - "top_p": 1.0, - "frequency_penalty": 0.0, - "presence_penalty": 0.0 - }, - "template_format": "curly" -} -``` - -### Committing changes to a variant (Creating a new version in a variant) - -To save changes to a variant (creating a new version), use the `VariantManager.commit` method with explicit parameters. - - - -```python - -config2=Config( - prompt=PromptTemplate( - messages=[ - Message(role="system", content="You are an assistant that provides VERY concise answers"), - Message(role="user", content="Explain {{topic}} in simple terms"), - ], - llm_config=ModelConfig( - model="anthropic/claude-3-5-sonnet-20240620", - max_tokens=150, - temperature=0.7, - top_p=1.0, - frequency_penalty=0.0, - presence_penalty=0.0, - ), - ) -) - - -# Commit the new version -variant = ag.VariantManager.commit( - parameters=config2.model_dump(), - app_slug="my-app-slug", - variant_slug="my-variant-slug", -) - -print("Committed new version of variant:") -print(variant) - -# Commit the new version asynchronously (optional) -# async def commit_variant(): -# variant = await ag.VariantManager.acommit( -# parameters=my_prompt2.model_dump(), -# app_slug="my-app-slug", -# variant_slug="my-variant-slug", -# ) - -# print("Committed new version of variant (async):") -# print(variant) -``` - - - -```javascript -// Commit new version with updated parameters -const commitResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/commit', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - config: { - params: { - prompt: { - messages: [ - { - role: 'system', - content: 'You are an assistant that provides VERY concise answers' - }, - { - role: 'user', - content: 'Explain {{topic}} in simple terms' - } - ], - llm_config: { - model: 'anthropic/claude-3-5-sonnet-20240620', - max_tokens: 150, - temperature: 0.7, - top_p: 1.0, - frequency_penalty: 0.0, - presence_penalty: 0.0 - } - } - }, - variant_ref: { - slug: 'my-variant-slug', - version: null, - id: null - }, - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - } - }) -}); - -const result = await commitResponse.json(); -console.log('Committed new version of variant:'); -console.log(result); -``` - - - -```bash -# Commit new version with updated parameters -curl -X POST "https://cloud.agenta.ai/api/variants/configs/commit" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "config": { - "params": { - "prompt": { - "messages": [ - { - "role": "system", - "content": "You are an assistant that provides VERY concise answers" - }, - { - "role": "user", - "content": "Explain {{topic}} in simple terms" - } - ], - "llm_config": { - "model": "anthropic/claude-3-5-sonnet-20240620", - "max_tokens": 150, - "temperature": 0.7, - "top_p": 1.0, - "frequency_penalty": 0.0, - "presence_penalty": 0.0 - } - } - }, - "variant_ref": { - "slug": "my-variant-slug", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - } - }' -``` - - - - -:::tip -Use `VariantManager.acommit` for async version commit. -::: - -:::info Immutability -Each commit creates a new version of the variant. Versions are immutable once created. -::: - -**Sample Output:** - -```python -{ - "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", - "app_slug": "my-app-slug", - "variant_id": "01968c11-6f7c-7773-b273-922c5807be7b", - "variant_slug": "my-variant-slug", - "variant_version": 5, - "environment_id": null, - "environment_slug": null, - "environment_version": null, - "committed_at": "2025-05-01T07:26:08.935406+00:00", - "committed_by": "user@agenta.ai", - "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", - "deployed_at": null, - "deployed_by": null, - "deployed_by_id": null, - "params": { - "messages": [ - { - "name": null, - "role": "system", - "content": "You are an assistant that provides concise answers", - "tool_calls": null, - "tool_call_id": null - }, - { - "name": null, - "role": "user", - "content": "Explain {{topic}} in simple terms", - "tool_calls": null, - "tool_call_id": null - } - ], - "input_keys": null, - "llm_config": { - "model": "gpt-3.5-turbo", - "tools": null, - "top_p": 1.0, - "stream": null, - "max_tokens": 150, - "temperature": 0.7, - "tool_choice": null, - "response_format": null, - "presence_penalty": 0.0, - "frequency_penalty": 0.0 - }, - "user_prompt": null, - "system_prompt": null, - "template_format": "curly" - } -} -``` - -:::warning -The `user_prompt` and `system_prompt` are helper fields to populate the `messages` field in the `PromptTemplate`. Rely only on the `messages` field in your code. -::: - -## Deploying to Environments - -To deploy a variant to an environment, use the `DeploymentManager.deploy` method with the variant reference and `environment_slug`: The slug of the environment (`development`, `staging`, or `production`). - -```python -deployment = ag.DeploymentManager.deploy( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=None, # Deploys latest version if not specified - environment_slug="staging" # Options: development, staging, production -) - -print(f"Deployed to {deployment['environment_slug']}") -``` - -:::warning -- Deploying a variant without specifying a `variant_version` deploys the latest version. -- Only predefined environments with slugs `development`, `staging`, and `production` are currently supported. -::: - -**Sample Output:** - -```python -Deployed variant to environment: -{ - "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", - "app_slug": "completion", - "variant_id": "01968c11-6f7c-7773-b273-922c5807be7b", - "variant_slug": "my-variant-slug4", - "variant_version": 5, - "environment_id": "01968c14-c35d-7440-bcc8-9def594f017f", - "environment_slug": "staging", - "environment_version": 2, - "committed_at": "2025-05-01T07:26:08.935406+00:00", - "committed_by": "user@agenta.ai", - "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", - "deployed_at": "2025-05-01T13:41:33.149595+00:00", - "deployed_by": "user@agenta.ai", - "deployed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1" -} -``` - -## Fetching a Prompt Configuration - -You can fetch the configurations from a variant reference (`app_slug`, `variant_slug`, `variant_version`) or an environment reference (`app_slug`, `environment_slug`). The default behavior when fetching is to fetch the latest configuration from the `production` environment. If you don't provide a `_version` parameter but only a `variant_slug` or an `environment_slug`, the SDK will fetch the latest version of the variant from the specified **environment/variant**. - -### Understanding the PromptTemplate - -When you fetch a prompt configuration, you receive a `PromptTemplate` object. This object contains all the information needed to format and send your prompt to an LLM provider. - -The `PromptTemplate` includes: - -- **messages**: An ordered list of chat messages with roles and content -- **llm_config**: Model parameters like temperature, max tokens, and the model name -- **template_format**: The syntax used for variable placeholders in your prompt -- **input_keys**: An optional list of required variables for input validation - -Here's what a fetched configuration looks like: - -```python -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug" -) - -print(config) -# Output: -# { -# "prompt": { -# "messages": [ -# {"role": "system", "content": "You are a helpful assistant"}, -# {"role": "user", "content": "Explain {{topic}} in simple terms"} -# ], -# "llm_config": { -# "model": "gpt-3.5-turbo", -# "temperature": 0.7, -# "max_tokens": 150 -# }, -# "template_format": "curly" -# } -# } -``` - -#### Template Format - -The `template_format` field determines how Agenta replaces variable placeholders in your prompts. Agenta supports three formats: - -**Curly format (default)**: Uses double curly braces like `{{variable}}`. This format is simple and safe. It only replaces variables that were defined in your original template, which helps catch missing inputs early. - -```python -"Explain {{topic}} in {{language}}" -``` - -**Jinja2 format**: Uses Jinja2 syntax like `{{ variable }}` and supports advanced features like loops and filters. Choose this format when you need conditional logic or want to transform variables. - -```python -"{% if variable %}...{% endif %}" -``` - -:::tip -Check the [reference](/reference/sdk/configuration-management#prompt-configuration-schema) section for more details on the data format used for prompts. -::: - -### Default Behavior when fetching - -If you don't provide either `variant` or `environment` identifiers, the SDK fetches the latest configuration deployed to the `production` environment. - -```python -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=2 # Optional: fetches latest if not provided -) - -print("Fetched configuration from production:") -print(config) -``` -Example Output: - -```python -{ - "prompt": { - "messages": [ - { - "role": "system", - "content": "You are an assistant that provides concise answers" - }, - { - "role": "user", - "content": "Explain {{topic}} in simple terms" - } - ], - "llm_config": { - "model": "gpt-3.5-turbo", - "top_p": 1.0, - "max_tokens": 150, - "temperature": 0.7, - "presence_penalty": 0.0, - "frequency_penalty": 0.0 - }, - "template_format": "curly" - } -} -``` - -:::tip -Agenta provides a helper class `PromptTemplate` to format the configuration and then use it to generate the prompt. -```python -from openai import OpenAI -from agenta.sdk.types import PromptTemplate - -# Fetch configuration -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug" -) - -# Format the prompt with variables -prompt = PromptTemplate(**config['prompt']).format(topic="AI") - -# Use with OpenAI -client = OpenAI() -response = client.chat.completions.create( - **prompt.to_openai_kwargs() -) - -print(response.choices[0].message.content) -``` -::: - -### Fetching by Variant Reference - -```python -# Fetch configuration by variant -config = ag.ConfigManager.get_from_registry( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=2 # Optional: If not provided, fetches the latest version -) - -print("Fetched configuration:") -print(config) -``` - -### Fetching by Environment Reference - -```python -# Fetch the latest configuration from the staging environment -config = ag.ConfigManager.get_from_registry( - app_slug="my-app", - environment_slug="staging", - environment_version=1 # Optional: If not provided, fetches the latest version -) - -print("Fetched configuration from staging:") -print(config) -``` - -## Deleting a Variant - -To delete a variant, use the `VariantManager.delete` method. - - - - -```python -# Delete a variant -ag.VariantManager.delete( - app_slug="my-app", - # app_id="my-app-id", # you can also use `app_id` - variant_slug="obsolete-variant" -) - -print("Variant deleted successfully.") -``` - - - - -```javascript -// Delete a variant -const deleteResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/delete', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - variant_ref: { - slug: 'obsolete-variant', - version: null, - id: null - }, - application_ref: { - slug: 'my-app', - version: null, - id: null - } - }) -}); - -if (deleteResponse.status === 204) { - console.log('Variant deleted successfully.'); -} else { - console.error('Failed to delete variant:', deleteResponse.status); -} -``` - - - - -```bash -# Delete a variant -curl -X POST "https://cloud.agenta.ai/api/variants/configs/delete" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "variant_ref": { - "slug": "obsolete-variant", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app", - "version": null, - "id": null - } - }' -``` - - - - -:::warning - -- Deleting a variant removes all versions of the variant. This action is irreversible. -- Attempting to delete a variant that is deployed to an environment will fail. -::: - -## Listing All Variants - -To list all variants of an application, use the `VariantManager.list` method. - - - - -```python -# List all variants (syncrhonously) -variants = ag.VariantManager.list( - app_slug="my-app" - # app_id="my-app-id", # you can also use `app_id` -) - -print(variants) -``` - - - - -```javascript -// List all variants for an application -const listResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/list', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - application_ref: { - slug: 'my-app', - version: null, - id: null - } - }) -}); - -const variants = await listResponse.json(); -console.log(variants); -``` - - - - -```bash -# List all variants for an application -curl -X POST "https://cloud.agenta.ai/api/variants/configs/list" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "application_ref": { - "slug": "my-app", - "version": null, - "id": null - } - }' -``` - - - - -**Sample Output:** - -```python - -[{ - "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", - "app_slug": "completion", - "variant_id": "01968aba-9702-7263-a7fd-8b8565753230", - "variant_slug": "my-variant-slug3", - "variant_version": 2, - "environment_id": null, - "environment_slug": null, - "environment_version": null, - "committed_at": "2025-05-01T07:23:26.338901+00:00", - "committed_by": "user@agenta.ai", - "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", - "deployed_at": null, - "deployed_by": null, - "deployed_by_id": null, - "params": { - "prompt": { - "messages": [ - { - "name": null, - "role": "system", - "content": "You are an assistant that provides concise answers", - "tool_calls": null, - "tool_call_id": null - }, - { - "name": null, - "role": "user", - "content": "Explain {{topic}} in simple terms", - "tool_calls": null, - "tool_call_id": null - } - ], - "input_keys": null, - "llm_config": { - "model": "gpt-3.5-turbo", - "tools": null, - "top_p": 1.0, - "stream": null, - "max_tokens": 150, - "temperature": 0.7, - "tool_choice": null, - "response_format": null, - "presence_penalty": 0.0, - "frequency_penalty": 0.0 - }, - "user_prompt": null, - "system_prompt": null, - "template_format": "curly" - } - } -}, { - "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", - "app_slug": "completion", - "variant_id": "01963f1f-28ea-78e1-b390-39d270fe93fe", - "variant_slug": "key", - "variant_version": 4, - "environment_id": null, - "environment_slug": null, - "environment_version": null, - "committed_at": "2025-04-16T15:02:08.874979+00:00", - "committed_by": "user@agenta.ai", - "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", - "deployed_at": null, - "deployed_by": null, - "deployed_by_id": null, - "params": { - "ag_config": { - "prompt": { - "messages": [ - { - "role": "system", - "content": "You are an expert in geography" - }, - { - "role": "user", - "content": "What is the capital of {{country}}? tell me its name in arabic" - } - ], - "input_keys": [ - "country" - ], - "llm_config": { - "model": "gpt-3.5-turbo" - }, - "template_format": "curly" - } - } - } -}] -``` - -## Fetching a Variant's History - -To list all versions for a variant of an application, use the `VariantManager.history` method. - - - - -```python -# List all variant versions/history (synchronously) -versions = ag.VariantManager.history( - variant_slug="variant-slug", - app_slug="my-app" - # app_id="my-app-id", # you can also use `app_id` -) - -print(versions) -``` - - - - -```javascript -// List all versions/history for a specific variant -const historyResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/history', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - variant_ref: { - slug: 'variant-slug', - version: null, - id: null - }, - application_ref: { - slug: 'my-app', - version: null, - id: null - } - }) -}); - -const versions = await historyResponse.json(); -console.log(versions); -``` - - - - -```bash -# List all versions/history for a specific variant -curl -X POST "https://cloud.agenta.ai/api/variants/configs/history" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "variant_ref": { - "slug": "variant-slug", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app", - "version": null, - "id": null - } - }' -``` - - - - -**Sample Output:** - -Same as `VariantManager.list` but limited to the history of a specific variant. - -:::tip Asynchronous Operations in Python SDK -All SDK methods have async counterparts with an `a` prefix: - -```python -async def async_operations(): - # Create variant asynchronously - variant = await ag.VariantManager.acreate(...) - - # Commit changes asynchronously - updated_variant = await ag.VariantManager.acommit(...) -``` -::: diff --git a/docs/docs/prompt-engineering/managing-prompts-programatically/04-deploy.mdx b/docs/docs/prompt-engineering/managing-prompts-programatically/04-deploy.mdx deleted file mode 100644 index 72b528f597..0000000000 --- a/docs/docs/prompt-engineering/managing-prompts-programatically/04-deploy.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: "Deploy to Environments" -sidebar_position: 4 -sidebar_label: "Deploy to Environments" -description: "Learn how to deploy variants to different environments using the Agenta SDK." ---- - -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -This guide shows you how to deploy variants to environments (development, staging, production) using the Agenta SDK. - - - Open in Google Colaboratory - - -## Deploying to Environments - -To deploy a variant to an environment, use the `DeploymentManager.deploy` method with the variant reference and `environment_slug`: The slug of the environment (`development`, `staging`, or `production`). - - - - -```python -deployment = ag.DeploymentManager.deploy( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=None, # Deploys latest version if not specified - environment_slug="staging" # Options: development, staging, production -) - -print(f"Deployed to {deployment['environment_slug']}") -``` - - - - -```javascript -// Deploy a variant to an environment -const deployResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/deploy', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - variant_ref: { - slug: 'my-variant-slug', - version: null, - id: null - }, - environment_ref: { - slug: 'staging', - version: null, - id: null - }, - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - }) -}); - -const deployment = await deployResponse.json(); -console.log(`Deployed to ${deployment.environment_slug}`); -``` - - - -```bash -# Deploy a variant to an environment -curl -X POST "https://cloud.agenta.ai/api/variants/configs/deploy" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "variant_ref": { - "slug": "my-variant-slug", - "version": null, - "id": null - }, - "environment_ref": { - "slug": "staging", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - }' -``` - - - -:::warning -- Deploying a variant without specifying a `variant_version` deploys the latest version. -- Only predefined environments with slugs `development`, `staging`, and `production` are currently supported. -::: - -**Sample Output:** - -```python -Deployed variant to environment: -{ - "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", - "app_slug": "completion", - "variant_id": "01968c11-6f7c-7773-b273-922c5807be7b", - "variant_slug": "my-variant-slug4", - "variant_version": 5, - "environment_id": "01968c14-c35d-7440-bcc8-9def594f017f", - "environment_slug": "staging", - "environment_version": 2, - "committed_at": "2025-05-01T07:26:08.935406+00:00", - "committed_by": "user@agenta.ai", - "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", - "deployed_at": "2025-05-01T13:41:33.149595+00:00", - "deployed_by": "user@agenta.ai", - "deployed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1" -} -``` - -## Rolling Back to a Previous Version - -To rollback to a previous version, you can deploy a specific version of a variant to an environment: - - - - -```python -# Deploy a specific version (rollback) -deployment = ag.DeploymentManager.deploy( - app_slug="my-app-slug", - variant_slug="my-variant-slug", - variant_version=3, # Specify the version you want to rollback to - environment_slug="production" -) - -print(f"Rolled back to version {deployment['variant_version']}") -``` - - - - -```javascript -// Deploy a specific version (rollback) -const deployResponse = await fetch('https://cloud.agenta.ai/api/variants/configs/deploy', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - variant_ref: { - slug: 'my-variant-slug', - version: 3, - id: null - }, - environment_ref: { - slug: 'production', - version: null, - id: null - }, - application_ref: { - slug: 'my-app-slug', - version: null, - id: null - } - }) -}); - -const deployment = await deployResponse.json(); -console.log(`Rolled back to version ${deployment.variant_version}`); -``` - - - -```bash -# Deploy a specific version (rollback) -curl -X POST "https://cloud.agenta.ai/api/variants/configs/deploy" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -d '{ - "variant_ref": { - "slug": "my-variant-slug", - "version": 3, - "id": null - }, - "environment_ref": { - "slug": "production", - "version": null, - "id": null - }, - "application_ref": { - "slug": "my-app-slug", - "version": null, - "id": null - } - }' -``` - - - -This effectively rolls back the environment to the specified version of the variant. - -:::tip -You can view the full history of deployments and versions in the Agenta UI under the Registry and Deployments pages. -::: - diff --git a/docs/docs/prompt-engineering/managing-prompts-programatically/05-fetch-prompts.mdx b/docs/docs/prompt-engineering/managing-prompts-programatically/05-fetch-prompts.mdx deleted file mode 100644 index 0e41a8ffef..0000000000 --- a/docs/docs/prompt-engineering/managing-prompts-programatically/05-fetch-prompts.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Fetch Prompts from Environments" -sidebar_position: 5 -sidebar_label: "Fetch Prompts" -description: "Learn how to fetch prompt configurations from environments using the Agenta SDK and API." ---- - -import { Redirect } from '@docusaurus/router'; - - diff --git a/docs/docs/prompt-engineering/managing-prompts-programatically/_category_.json b/docs/docs/prompt-engineering/managing-prompts-programatically/_category_.json deleted file mode 100644 index 3ec07828bb..0000000000 --- a/docs/docs/prompt-engineering/managing-prompts-programatically/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "position": 3, - "label": "Manage Prompts with SDK/API", - "collapsed": true -} \ No newline at end of file diff --git a/docs/docs/prompt-engineering/playground/01-using-playground.mdx b/docs/docs/prompt-engineering/playground/01-using-playground.mdx deleted file mode 100644 index 5f7a030a81..0000000000 --- a/docs/docs/prompt-engineering/playground/01-using-playground.mdx +++ /dev/null @@ -1,156 +0,0 @@ ---- -title: "Prompt Playground" -sidebar_label: "Using the Prompt Playground" -description: "Learn how to use Agenta's LLM playground for prompt engineering, model comparison, and deployment. A powerful alternative to OpenAI playground that supports multiple models and frameworks." ---- - -```mdx-code-block -import { Stream } from '@cloudflare/stream-react'; -import Image from "@theme/IdealImage"; -``` - -The Agenta playground is a comprehensive prompt engineering IDE that helps you develop, test, and deploy LLM applications. Unlike traditional LLM playgrounds, Agenta integrates prompt management, evaluation, and deployment into a single platform, supporting multiple models and frameworks. - - -
- - -## Key Features - -- **Multi-Model Support**: Test prompts across different providers including OpenAI GPT models, Anthropic Claude, Google Gemini, Mistral, DeepSeek, and OpenRouter models -- **Framework Integration**: Works seamlessly with popular frameworks like LangChain, LlamaIndex, and CrewAI -- **Version Control**: Track and manage prompt versions with built-in prompt management -- **Model Comparison**: Benchmark different LLM models side by side -- **Parameter Control**: Fine-tune model parameters including temperature, top-k, and presence penalty -- **Environment Management**: Deploy configurations to development, staging, and production environments - -## Creating and Managing Prompts - -### Prompt Templates - -Prompt templates form the foundation of reusable LLM interactions. They contain variable placeholders that adapt to different inputs, making your prompts dynamic and versatile. - -Example of a prompt template: -``` -Write a blog post about {{subject}} that focuses on {{key_aspect}} -``` - -Agenta uses curly brackets `{{variable}}` for template variables, automatically creating corresponding input fields in the playground interface. - -### Switching Template Formats - -Agenta lets you control how it processes variables in prompts through different template formats. The playground supports two main formats: - -The default Curly format uses simple `{{variable}}` placeholders. The Jinja2 format provides more control with conditional statements like `{% if variable %}...{% endif %}` and filters. - -:::warning -The playground does not support loops in Jinja2 prompts because prompt variables must be strings. -::: - -:::tip -To use a variable only for filtering in Jinja2 without including it in the prompt text, wrap it in a false condition: `{% if False %} {{variable}} {% endif %}`. This makes the variable available to the playground while keeping it out of the final prompt. -::: - -The format selector in the prompt configuration panel makes it easy to switch between formats. Click the current format name and select your preferred option from the dropdown menu. - -Agenta stores your chosen format with the prompt variant's messages and model settings. When you use the SDK to retrieve and format the prompt, it automatically applies the correct format. - -### Dynamic JSON Schema Variables - -When using the **JSON Schema** response format, you can reference variables directly inside the schema definition. Placeholders using `{{variable}}` work in both keys and values, and any variables you add will appear as inputs in the playground. These dynamic schemas are stored in the registry when you commit a variant. The editor does not yet highlight variables inside the schema, but they will still be replaced when executing your prompt. - -### Adjusting Model Parameters - -To modify model-specific parameters: - -1. Click on the model name in the configuration panel -2. A settings modal will appear with available parameters -3. Adjust the following settings as needed: - -- **Temperature** (0-2): Controls randomness in the output - - Lower values (0.1-0.4): More focused, deterministic responses - - Higher values (0.7-1.0): More creative, varied outputs - -- **Top-k** (1-100): Limits the pool of tokens the model considers - - Lower values: More focused word choice - - Higher values: Broader vocabulary usage - -- **Presence Penalty** (-2.0 to 2.0): Influences topic diversity - - Positive values: Encourages exploring new topics - - Negative values: Allows topic repetition - -- **Frequency Penalty** (-2.0 to 2.0): Affects word choice - - Positive values: Discourages word repetition - - Negative values: Allows word reuse - -## Comparing Prompts and Models - -Agenta's playground allows you to compare different prompts, model configurations, and LLM providers side by side. This helps you identify the most effective combination for your use case. - -### Creating Multiple Variants - -To compare different configurations: - -1. Click the "+Compare" button in the top right corner -2. Select "New Variant" from the dropdown menu -3. Choose a source variant to duplicate (this copies all current parameters) -4. Give your new variant a descriptive name -5. Modify the configuration as needed - -Each variant appears as a separate column in the playground, allowing direct comparison of outputs. - -### Side-by-Side Testing - -With multiple variants set up, you can: -- Enter the same input text across all variants -- Compare the generated outputs side by side -- Review response times for each configuration -- Monitor the cost per request for different models - -This parallel testing helps you understand how different prompts and models handle the same input. - -### Version Control and Deployment - -The playground integrates with Agenta's [prompt management system](/prompt-engineering/concepts) to track and deploy changes: - -1. Click "Commit" to save a new version of your variant -2. Changes remain in development until explicitly deployed -3. Use "Deploy" to push configurations to specific environments (development, staging, production) - -## Working with Test Sets - -### Loading Existing Test Sets - -You can import test sets that you've created through: - -- CSV uploads -- Programmatic creation -- Web UI input - -The test set must contain columns that match your prompt template variables. - -### Saving Test Cases - -To save an interesting test case: - -1. Click the three-dot menu on the right side of the test case card -2. Select "Add to Test Set" -3. Choose an existing test set or create a new one -4. Review the input/output mapping (use default settings unless you have specific needs) -5. Preview the changes to your test set -6. Confirm to save - -The Agenta playground serves as a comprehensive prompt engineering environment, offering advantages over traditional playgrounds like OpenAI's by providing integrated version control, deployment capabilities, and support for multiple models and frameworks. Whether you're developing new prompts, comparing model performance, or deploying to production, the playground provides the tools needed for effective LLM application development. - -## FAQ - -
- Can I load multiple test cases in the playground at once? - -This depends on your prompt type: - -* **Completion prompts**: You can load and run multiple test cases at once in the playground. -* **Chat prompts**: You can only load one conversation at a time in the playground. - -Note: You can always run evaluations against your entire test set at once, regardless of prompt type. This limitation only applies to the playground. -
diff --git a/docs/docs/prompt-engineering/playground/01-using-the-playground.mdx b/docs/docs/prompt-engineering/playground/01-using-the-playground.mdx new file mode 100644 index 0000000000..909641dc2a --- /dev/null +++ b/docs/docs/prompt-engineering/playground/01-using-the-playground.mdx @@ -0,0 +1,125 @@ +--- +title: "Prompt Playground" +sidebar_label: "Using the Prompt Playground" +description: "Learn how to use Agenta's LLM playground for prompt engineering, model comparison, and deployment. A powerful alternative to OpenAI playground that supports multiple models and frameworks." +--- + +```mdx-code-block +import { Stream } from '@cloudflare/stream-react'; +import Image from "@theme/IdealImage"; +``` + +The Agenta playground is a comprehensive prompt engineering IDE that helps you develop, test, and deploy LLM applications. Unlike traditional LLM playgrounds, Agenta integrates prompt management, evaluation, and deployment into a single platform, supporting multiple models and frameworks. + + +
+ + +## Key Features + +- **Multi-Model Support**: Test prompts across different providers including OpenAI GPT models, Anthropic Claude, Google Gemini, Mistral, DeepSeek, and OpenRouter models +- **Framework Integration**: Works seamlessly with popular frameworks like LangChain, LlamaIndex, and CrewAI +- **Version Control**: Track and manage prompt versions with built-in prompt management +- **Model Comparison**: Benchmark different LLM models side by side +- **Parameter Control**: Fine-tune model parameters including temperature, top-k, and presence penalty +- **Environment Management**: Deploy configurations to development, staging, and production environments + +## Creating and Managing Prompts + +### Prompt Templates + +Prompt templates form the foundation of reusable LLM interactions. They contain variable placeholders that adapt to different inputs, making your prompts dynamic and versatile. + +Example of a prompt template: +``` +Write a blog post about {{subject}} that focuses on {{key_aspect}} +``` + +Agenta uses curly brackets `{{variable}}` for template variables, automatically creating corresponding input fields in the playground interface. + +### Dynamic JSON Schema Variables + +When using the **JSON Schema** response format, you can reference variables directly inside the schema definition. Placeholders using `{{variable}}` work in both keys and values, and any variables you add will appear as inputs in the playground. These dynamic schemas are stored in the registry when you commit a variant. The editor does not yet highlight variables inside the schema, but they will still be replaced when executing your prompt. + +### Adjusting Model Parameters + +To modify model-specific parameters: + +1. Click on the model name in the configuration panel +2. A settings modal will appear with available parameters +3. Adjust the following settings as needed: + +- **Temperature** (0-2): Controls randomness in the output + - Lower values (0.1-0.4): More focused, deterministic responses + - Higher values (0.7-1.0): More creative, varied outputs + +- **Top-k** (1-100): Limits the pool of tokens the model considers + - Lower values: More focused word choice + - Higher values: Broader vocabulary usage + +- **Presence Penalty** (-2.0 to 2.0): Influences topic diversity + - Positive values: Encourages exploring new topics + - Negative values: Allows topic repetition + +- **Frequency Penalty** (-2.0 to 2.0): Affects word choice + - Positive values: Discourages word repetition + - Negative values: Allows word reuse + +## Comparing Prompts and Models + +Agenta's playground allows you to compare different prompts, model configurations, and LLM providers side by side. This helps you identify the most effective combination for your use case. + +### Creating Multiple Variants + +To compare different configurations: + +1. Click the "+Compare" button in the top right corner +2. Select "New Variant" from the dropdown menu +3. Choose a source variant to duplicate (this copies all current parameters) +4. Give your new variant a descriptive name +5. Modify the configuration as needed + +Each variant appears as a separate column in the playground, allowing direct comparison of outputs. + +### Side-by-Side Testing + +With multiple variants set up, you can: +- Enter the same input text across all variants +- Compare the generated outputs side by side +- Review response times for each configuration +- Monitor the cost per request for different models + +This parallel testing helps you understand how different prompts and models handle the same input. + +### Version Control and Deployment + +The playground integrates with Agenta's [prompt management system](/prompt-engineering/overview) to track and deploy changes: + +1. Click "Commit" to save a new version of your variant +2. Changes remain in development until explicitly deployed +3. Use "Deploy" to push configurations to specific environments (development, staging, production) + +## Working with Test Sets + +### Loading Existing Test Sets + +You can import test sets that you've created through: + +- CSV uploads +- Programmatic creation +- Web UI input + +The test set must contain columns that match your prompt template variables. + +### Saving Test Cases + +To save an interesting test case: + +1. Click the three-dot menu on the right side of the test case card +2. Select "Add to Test Set" +3. Choose an existing test set or create a new one +4. Review the input/output mapping (use default settings unless you have specific needs) +5. Preview the changes to your test set +6. Confirm to save + +The Agenta playground serves as a comprehensive prompt engineering environment, offering advantages over traditional playgrounds like OpenAI's by providing integrated version control, deployment capabilities, and support for multiple models and frameworks. Whether you're developing new prompts, comparing model performance, or deploying to production, the playground provides the tools needed for effective LLM application development. \ No newline at end of file diff --git a/docs/docs/prompt-engineering/playground/02-adding-custom-providers.mdx b/docs/docs/prompt-engineering/playground/02-adding-custom-providers.mdx new file mode 100644 index 0000000000..c2b3121621 --- /dev/null +++ b/docs/docs/prompt-engineering/playground/02-adding-custom-providers.mdx @@ -0,0 +1,148 @@ +--- +title: "Adding Custom LLM Providers" +description: "Learn how to add and configure custom LLM providers like Azure OpenAI, AWS Bedrock, Ollama, and others to use your own models in Agenta's playground and applications." +sidebar_position: 3 +--- + + +```mdx-code-block +import { Stream } from '@cloudflare/stream-react'; +import Image from "@theme/IdealImage"; +``` + +Agenta supports a wide range of LLM providers beyond the default options. This guide shows you how to configure custom providers and models for use in your Agenta applications. + +You can integrate self-hosted models into Agenta by adding custom providers such as: + +- [Azure OpenAI](#configuring-azure-openai) +- [AWS Bedrock](#configuring-aws-bedrock) +- [OpenAI-compatible endpoints](#configuring-openai-compatible-endpoints-eg-ollama) (including self-hosted models, OpenAI finetuned models, [Ollama](#configuring-openai-compatible-endpoints-eg-ollama), etc.) + + +:::info +You can add custom models to any of the providers already listed in the playground, such as [OpenRouter](#adding-models-to-a-provider-eg-openrouter), Anthropic, Gemini, Cohere, and others. This is especially useful for accessing specialized or new models that aren't included in Agenta's default configurations. +::: + +--- + +## How to Add Custom LLM Providers + + +
+ +### From Settings + +1. Navigate to **Settings** → **Model Hub**. +2. Click **Create Custom Provider**. +3. Select the provider type and enter the required credentials. +4. Click **Save**. + + +### From the Playground + +1. Open any app in the Playground. +2. Click the model dropdown menu. +3. Select **Add Custom Provider**. + +:::note +You can add multiple models to the same provider. This allows you to organize related models under a single provider configuration. +::: + + +## Configuring Azure OpenAI + +To add Azure OpenAI models, you'll need the following information: + +- **API Key**: Your Azure OpenAI API key +- **API Version**: The API version (e.g., `2023-05-15`) +- **Endpoint url**: The endpoint of your Azure resource +- **Deployment Name**: The name of your model deployment + +### How to Retrieve Azure Credentials + +1. **Access the Azure Portal:** + Log in to the [Azure Portal](https://portal.azure.com). + +2. **Locate Azure OpenAI Service:** + - Search for **Azure AI Services** in the portal. + - Click on your resource to view its details. + +3. **Retrieve API Keys and Endpoints:** + - Navigate to the **Keys and Endpoint** section. + - Copy the API key and endpoint URL. + +4. **Find Deployment Names:** + - Go to **Model Deployments**. + - Select the desired deployment and note its name. + +### Configuration Example + +```plaintext +API Key: c98d7a8s7d6a5s4d3a2s1d... +API Version: 2023-05-15 +API base url: Use here your endpoint URL (e.g., https://accountnameinstance.openai.azure.com +Deployment Name: Use here the deployment name in Azure (e.g., gpt-4-turbo) +``` + +## Configuring AWS Bedrock + +To add AWS Bedrock models, you'll need: + +- **Access Key ID:** Your AWS access key +- **Secret Access Key:** Your AWS secret key +- **Region:** The region where your Bedrock models are deployed + +### How to Retrieve AWS Credentials + +Refer to these tutorials for detailed instructions: + - [AWS Bedrock Getting Started Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html) + - [DataCamp AWS Bedrock Tutorial](https://www.datacamp.com/tutorial/aws-bedrock) + + +### Configuration Example + +```plaintext +Access Key ID: xxxxxxxxxx +Secret Access Key: xxxxxxxxxxxxxxxxxxxxxxx +Region: (e.g eu-central-1) +Model name: (e.g anthropic.claude-3-sonnet-20240229-v1:0) +``` + + +## Configuring OpenAI-Compatible Endpoints (e.g., Ollama) + +For any OpenAI-compatible API, including self-hosted models: + +- **API Key:** The API authentication key +- **Base URL:** The API endpoint URL + +This configuration works for: +- Self-hosted models using vLLM +- LocalAI +- 3rd party providers with OpenAI-compatible endpoints +- Fine-tuned OpenAI models + +### Configuration Example + +``` +API Key: your-api-key +Base URL: https://your-api-endpoint.com/v1 +``` + +:::warning +Make sure to include `/v1` at the end of the Base URL. +::: + +:::warning +If you're running both Ollama and self-hosting Agenta on your local machine, set the Base URL to http://host.docker.internal:11434/v1 to allow Agenta's completion service (running behind Docker) to access Ollama. +::: + +## Adding Models to a Provider (e.g. OpenRouter) + +For some providers like OpenRouter, Agenta does not include all available models due to their high number. To add models to an existing provider: + +1. Navigate to **Settings** → **Model Hub**. +2. Select the provider you want to add models to. +3. Enter the API key and an identifier +4. Add the models you want to use +5. Click **Save** diff --git a/docs/docs/prompt-engineering/playground/02-custom-providers.mdx b/docs/docs/prompt-engineering/playground/02-custom-providers.mdx deleted file mode 100644 index bbb65252e8..0000000000 --- a/docs/docs/prompt-engineering/playground/02-custom-providers.mdx +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: "Adding Custom LLM Providers" -description: "Learn how to add and configure custom LLM providers like Azure OpenAI, AWS Bedrock, Ollama, and others to use your own models in Agenta's playground and applications." -sidebar_position: 3 ---- - - -```mdx-code-block -import { Stream } from '@cloudflare/stream-react'; -import Image from "@theme/IdealImage"; -``` - -Agenta supports a wide range of LLM providers beyond the default options. This guide shows you how to configure custom providers and models for use in your Agenta applications. - -You can integrate self-hosted models into Agenta by adding custom providers such as: - -- [Azure OpenAI](#configuring-azure-openai) -- [AWS Bedrock](#configuring-aws-bedrock) -- [Vertex AI](#configuring-vertex-ai) -- [OpenAI-compatible endpoints](#configuring-openai-compatible-endpoints-eg-ollama) (including self-hosted models, OpenAI finetuned models, [Ollama](#configuring-openai-compatible-endpoints-eg-ollama), etc.) - - -:::info -You can add custom models to any of the providers already listed in the playground, such as [OpenRouter](#adding-models-to-a-provider-eg-openrouter), Anthropic, Gemini, Cohere, and others. This is especially useful for accessing specialized or new models that aren't included in Agenta's default configurations. -::: - ---- - -## How to Add Custom LLM Providers - - -
- -### From Settings - -1. Navigate to **Settings** → **Model Hub**. -2. Click **Create Custom Provider**. -3. Select the provider type and enter the required credentials. -4. Click **Save**. - - -### From the Playground - -1. Open any app in the Playground. -2. Click the model dropdown menu. -3. Select **Add Custom Provider**. - -:::note -You can add multiple models to the same provider. This allows you to organize related models under a single provider configuration. -::: - -## Configuring Vertex AI - -To add Vertex AI models, please provide: - -- **Vertex Project**: Your Google Cloud **project ID** (e.g., `my-project-123`) -- **Vertex Location**: The **region** (e.g., `europe-west4`, `us-central1`) -- **Vertex Credentials**: A **Service Account** key in **JSON** format - -### How to Retrieve Vertex Credentials - -Follow Google’s guides to authenticate and create a service account key: - -- Vertex AI authentication: [https://cloud.google.com/vertex-ai/docs/authentication](https://cloud.google.com/vertex-ai/docs/authentication) -- Create / manage service account keys: [https://cloud.google.com/iam/docs/keys-create-delete#iam-service-account-keys-create-console](https://cloud.google.com/iam/docs/keys-create-delete#iam-service-account-keys-create-console) - -**Steps to Retrieve Vertex Credentials in the Console**: - -1. In the Google Cloud console, go to **IAM & Admin → Service accounts**. -2. Select a **Project**. -3. Click the email address of the service account that you want to create a key for. -4. Click the **Keys** tab. -5. Click the **Add key** drop-down menu, then select **Create new key**. -6. Select **JSON** as the **Key type** and click **Create**. - -> Clicking **Create** downloads a service account key file. After you download the key file, you cannot download it again. - -### Configuration Example - -```plaintext -Vertex project: my-project-123 -Vertex location: europe-west4 -Vertex credentials: -{ - "type": "service_account", - "project_id": "PROJECT_ID", - "private_key_id": "KEY_ID", - "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n", - "client_email": "SERVICE_ACCOUNT_EMAIL", - "client_id": "CLIENT_ID", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://accounts.google.com/o/oauth2/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL" -} -``` - -### Available models - -See the LiteLLM docs for an up-to-date list of models: - -- Vertex Gemini models: [https://docs.litellm.ai/docs/providers/vertex](https://docs.litellm.ai/docs/providers/vertex) -- Vertex partner models: [https://docs.litellm.ai/docs/providers/vertex_partner](https://docs.litellm.ai/docs/providers/vertex_partner) -- Vertex self-deployed models: [https://docs.litellm.ai/docs/providers/vertex_self_deployed](https://docs.litellm.ai/docs/providers/vertex_self_deployed) - -:::warning -**Do not include** the `vertex_ai/` prefix in the **model name**. Use the bare model string (e.g., `gemini-2.5-pro`, `claude-3-5-sonnet@20240620`). -::: - -## Configuring Azure OpenAI - -To add Azure OpenAI models, you'll need the following information: - -- **API Key**: Your Azure OpenAI API key -- **API Version**: The API version (e.g., `2023-05-15`) -- **Endpoint url**: The endpoint of your Azure resource -- **Deployment Name**: The name of your model deployment - -### How to Retrieve Azure Credentials - -1. **Access the Azure Portal:** - Log in to the [Azure Portal](https://portal.azure.com). - -2. **Locate Azure OpenAI Service:** - - Search for **Azure AI Services** in the portal. - - Click on your resource to view its details. - -3. **Retrieve API Keys and Endpoints:** - - Navigate to the **Keys and Endpoint** section. - - Copy the API key and endpoint URL. - -4. **Find Deployment Names:** - - Go to **Model Deployments**. - - Select the desired deployment and note its name. - -### Configuration Example - -```plaintext -API Key: xxxxxxxxxx -API Version: 2023-05-15 -API base url: Use here your endpoint URL (e.g., https://accountnameinstance.openai.azure.com -Deployment Name: Use here the deployment name in Azure (e.g., gpt-4-turbo) -``` - -## Configuring AWS Bedrock - -To add AWS Bedrock models, you'll need: - -- **Access Key ID:** Your AWS access key -- **Secret Access Key:** Your AWS secret key -- **Region:** The region where your Bedrock models are deployed - -### How to Retrieve AWS Credentials - -Refer to these tutorials for detailed instructions: - - [AWS Bedrock Getting Started Guide](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html) - - [DataCamp AWS Bedrock Tutorial](https://www.datacamp.com/tutorial/aws-bedrock) - - -### Configuration Example - -```plaintext -Access Key ID: xxxxxxxxxx -Secret Access Key: xxxxxxxxxx -Region: (e.g eu-central-1) -Model name: (e.g anthropic.claude-3-sonnet-20240229-v1:0) -``` - - -## Configuring OpenAI-Compatible Endpoints (e.g., Ollama) - -For any OpenAI-compatible API, including self-hosted models: - -- **API Key:** The API authentication key -- **Base URL:** The API endpoint URL - -This configuration works for: -- Self-hosted models using vLLM -- LocalAI -- 3rd party providers with OpenAI-compatible endpoints -- Fine-tuned OpenAI models - -### Configuration Example - -``` -API Key: your-api-key -Base URL: https://your-api-endpoint.com/v1 -``` - -:::warning -Make sure to include `/v1` at the end of the Base URL. -::: - -:::warning -If you're running both Ollama and self-hosting Agenta on your local machine, set the Base URL to http://host.docker.internal:11434/v1 to allow Agenta's completion service (running behind Docker) to access Ollama. -::: - -## Adding Models to a Provider (e.g. OpenRouter) - -For some providers like OpenRouter, Agenta does not include all available models due to their high number. To add models to an existing provider: - -1. Navigate to **Settings** → **Model Hub**. -2. Select the provider you want to add models to. -3. Enter the API key and an identifier -4. Add the models you want to use -5. Click **Save** diff --git a/docs/docs/prompt-engineering/playground/_03-tools-function-calling.mdx b/docs/docs/prompt-engineering/playground/_03-tools-function-calling.mdx deleted file mode 100644 index 23f571bc15..0000000000 --- a/docs/docs/prompt-engineering/playground/_03-tools-function-calling.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Use Tools and Function Calling" -sidebar_position: 3 -sidebar_label: "Tools and Function Calling" -description: "Learn how to use tools and function calling in the Agenta playground." ---- - - - - -This section is under construction. diff --git a/docs/docs/prompt-engineering/playground/_04-structured-output.mdx b/docs/docs/prompt-engineering/playground/_04-structured-output.mdx deleted file mode 100644 index 59a64ee1e1..0000000000 --- a/docs/docs/prompt-engineering/playground/_04-structured-output.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Work with Structured Output" -sidebar_position: 4 -sidebar_label: "Structured Output" -description: "Learn how to use structured output and JSON schema in the Agenta playground." ---- - - - - -This section is under construction. For basic information on dynamic JSON schema variables, see the [Using the Playground guide](/prompt-engineering/playground/using-playground#dynamic-json-schema-variables). diff --git a/docs/docs/prompt-engineering/playground/_05-test-sets.mdx b/docs/docs/prompt-engineering/playground/_05-test-sets.mdx deleted file mode 100644 index c772b6aa8a..0000000000 --- a/docs/docs/prompt-engineering/playground/_05-test-sets.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Load and Save Test Sets" -sidebar_position: 5 -sidebar_label: "Load and Save Test Sets" -description: "Learn how to load and save test sets in the Agenta playground." ---- - - - - -This section is under construction. For basic information on test sets, see the [Working with Test Sets section](/prompt-engineering/playground/using-playground#working-with-test-sets) in the playground guide. diff --git a/docs/docs/prompt-engineering/playground/_06-images.mdx b/docs/docs/prompt-engineering/playground/_06-images.mdx deleted file mode 100644 index 231f5b22ab..0000000000 --- a/docs/docs/prompt-engineering/playground/_06-images.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Use Images in Prompts" -sidebar_position: 6 -sidebar_label: "Images" -description: "Learn how to use images in prompts with vision-capable models in the Agenta playground." ---- - - - - -This section is under construction. diff --git a/docs/docs/prompt-engineering/playground/_category_.json b/docs/docs/prompt-engineering/playground/_category_.json index 5d11187b61..9b8516fb9d 100644 --- a/docs/docs/prompt-engineering/playground/_category_.json +++ b/docs/docs/prompt-engineering/playground/_category_.json @@ -1,5 +1,5 @@ { - "position": 5, - "label": "Use the Playground", - "collapsed": true + "position": 4, + "label": "Playground", + "collapsed": false } \ No newline at end of file diff --git a/docs/docs/prompt-engineering/prompt-management/01-how-to-integrate-with-agenta.mdx b/docs/docs/prompt-engineering/prompt-management/01-how-to-integrate-with-agenta.mdx new file mode 100644 index 0000000000..e76248986f --- /dev/null +++ b/docs/docs/prompt-engineering/prompt-management/01-how-to-integrate-with-agenta.mdx @@ -0,0 +1,56 @@ +--- +title: "Integrating with agenta" +description: "Integrate applications and prompts created in Agenta into your projects." +--- + +import Image from "@theme/IdealImage"; + +Agenta easily integrates with your workflow, allowing you to use the latest version of the deployed prompt in your application. With Agenta, **you can update prompts directly from the web interface without modifying your code** each time. + +Here are the two ways you can use the prompts from Agenta in your code: + +### [1. As a prompt management system](/prompt-engineering/prompt-management/prompt-management-sdk): + +In this approach, prompts are managed and stored in the Agenta backend. You use the Agenta SDK to fetch the latest deployed version of your prompt and use it in your application. + +**Advantages**: + +- Agenta operates outside your application's critical path. +- Allows you to fetch and cache the latest prompt version for zero latency usage. + +**Considerations**: + +- You need to set up the [integration with observability](/observability/quickstart) yourself if you want to trace your calls for debugging and cost tracking. + +A sequence diagram showing how to integrate with Agenta as a prompt management system + + + +### **[2. As a middleware / model proxy](/prompt-engineering/prompt-management/proxy-calls)**: + +In this setup, Agenta provides you with an endpoint that forwards requests to the LLM on your behalf. + +**Advantages**: + +- Simplified deployment. +- Automatic tracing without any changes to your code. + +**Considerations**: + +- Adds a slight latency to the response (approximately 0.3 seconds). +- Currently, we don't support streaming for these endpoints. + +Overall, this approach is best suited for applications where latency isn't critical. + +A sequence diagram showing how to integrate with Agenta as    a proxy + diff --git a/docs/docs/prompt-engineering/prompt-management/02-prompt-management-sdk.mdx b/docs/docs/prompt-engineering/prompt-management/02-prompt-management-sdk.mdx new file mode 100644 index 0000000000..b9f570deb8 --- /dev/null +++ b/docs/docs/prompt-engineering/prompt-management/02-prompt-management-sdk.mdx @@ -0,0 +1,718 @@ +--- +title: "How to Manage Prompts with the SDK" +sidebar_position: 2 +sidebar_label: "Manage Prompts with the SDK" +description: "Learn how to create variants, commit changes, deploy to environments, and fetch configurations using the Agenta SDK." +--- + +import Image from "@theme/IdealImage"; + + +This guide covers all prompt management operations using the Agenta SDK: creating variants, committing changes, deploying to environments, and fetching configurations. + +:::tip Looking for a simpler introduction? +For a step-by-step tutorial, see the [prompt management tutorial](/tutorials/sdk/manage-prompts-with-SDK). +::: + +## Prerequisites + +Before starting, familiarize yourself with how versioning works in Agenta. Details are available on the [concepts page](/concepts/concepts). + +:::info Versioning in Agenta + +{" "} + +Taxonomy of concepts in Agenta + +Agenta uses a Git-like structure for prompt versioning: +- Create multiple branches called **variants** +- Each variant is versioned. + +- Deploy specific versions to **environments** (development, staging, production) + +**Typical workflow:** +1. Create a variant (branch) +2. Commit changes to the variant creating a new version +3. Deploy the version to an environment + +::: + +## Setup + +Initialize the SDK before using any operations: + +```python +import os +import agenta as ag + +# Set your API credentials +os.environ["AGENTA_API_KEY"] = "your-api-key-here" +os.environ["AGENTA_HOST"] = "https://cloud.agenta.ai" # only needed if self-hosting + +# Initialize the SDK +ag.init() +``` + +## Creating and Managing Variants + +### Create a New Variant + +Use `VariantManager.create` to create a new variant with initial configuration: + +```python +from agenta.sdk.types import PromptTemplate, Message, ModelConfig +from pydantic import BaseModel + +# Define your configuration model +class Config(BaseModel): + prompt: PromptTemplate + +# Create the initial configuration +config = Config( + prompt=PromptTemplate( + messages=[ + Message(role="system", content="You are an assistant that provides concise answers"), + Message(role="user", content="Explain {{topic}} in simple terms"), + ], + llm_config=ModelConfig( + model="gpt-3.5-turbo", + max_tokens=150, + temperature=0.7, + top_p=1.0, + frequency_penalty=0.0, + presence_penalty=0.0, + ), + ) +) + +# Create the variant +variant = ag.VariantManager.create( + parameters=config.model_dump(), + app_slug="my-app-slug", + variant_slug="my-variant-slug", +) +``` + + +:::tip +Use `VariantManager.acreate` for async variant creation. +::: + +This command will create a new variant and initialize it with the first commit containing the parameters provided + +- **Parameters:** + - `app_slug`: The slug of your application. + - `variant_slug`: The slug of the new variant. + - `parameters`: A dictionary containing the initial configuration parameters. + +**Note:** If a variant with the same `slug` and `version` already exists, the SDK will raise an exception. + +**Sample Output:** + +```python +{ + "messages": [ + { + "role": "system", + "content": "You are an assistant that provides concise answers" + }, + { + "role": "user", + "content": "Explain {{topic}} in simple terms" + } + ], + "llm_config": { + "model": "gpt-3.5-turbo", + "max_tokens": 150, + "temperature": 0.7, + "top_p": 1.0, + "frequency_penalty": 0.0, + "presence_penalty": 0.0 + }, + "template_format": "curly" +} +``` + +### Committing changes to a variant (Creating a new version in a variant) + +To save changes to a variant (creating a new version), use the `VariantManager.commit` method with explicit parameters. + +```python + +config2=Config( + prompt=PromptTemplate( + messages=[ + Message(role="system", content="You are an assistant that provides VERY concise answers"), + Message(role="user", content="Explain {{topic}} in simple terms"), + ], + llm_config=ModelConfig( + model="anthropic/claude-3-5-sonnet-20240620", + max_tokens=150, + temperature=0.7, + top_p=1.0, + frequency_penalty=0.0, + presence_penalty=0.0, + ), + ) +) + + +# Commit the new version +variant = ag.VariantManager.commit( + parameters=config2.model_dump(), + app_slug="my-app-slug", + variant_slug="my-variant-slug", +) + +print("Committed new version of variant:") +print(variant) + +# Commit the new version asynchronously (optional) +# async def commit_variant(): +# variant = await ag.VariantManager.acommit( +# parameters=my_prompt2.model_dump(), +# app_slug="my-app-slug", +# variant_slug="my-variant-slug", +# ) + +# print("Committed new version of variant (async):") +# print(variant) +``` + +:::tip +Use `VariantManager.acommit` for async version commit. +::: + +:::info Immutability +Each commit creates a new version of the variant. Versions are immutable once created. +::: + +**Sample Output:** + +```python +{ + "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", + "app_slug": "my-app-slug", + "variant_id": "01968c11-6f7c-7773-b273-922c5807be7b", + "variant_slug": "my-variant-slug", + "variant_version": 5, + "environment_id": null, + "environment_slug": null, + "environment_version": null, + "committed_at": "2025-05-01T07:26:08.935406+00:00", + "committed_by": "user@agenta.ai", + "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", + "deployed_at": null, + "deployed_by": null, + "deployed_by_id": null, + "params": { + "messages": [ + { + "name": null, + "role": "system", + "content": "You are an assistant that provides concise answers", + "tool_calls": null, + "tool_call_id": null + }, + { + "name": null, + "role": "user", + "content": "Explain {{topic}} in simple terms", + "tool_calls": null, + "tool_call_id": null + } + ], + "input_keys": null, + "llm_config": { + "model": "gpt-3.5-turbo", + "tools": null, + "top_p": 1.0, + "stream": null, + "max_tokens": 150, + "temperature": 0.7, + "tool_choice": null, + "response_format": null, + "presence_penalty": 0.0, + "frequency_penalty": 0.0 + }, + "user_prompt": null, + "system_prompt": null, + "template_format": "curly" + } +} +``` + +:::warning +The `user_prompt` and `system_prompt` are helper fields to populate the `messages` field in the `PromptTemplate`. Rely only on the `messages` field in your code. +::: + +## Deploying to Environments + +To deploy a variant to an environment, use the `DeploymentManager.deploy` method with the variant reference and `environment_slug`: The slug of the environment (`development`, `staging`, or `production`). + +```python +deployment = ag.DeploymentManager.deploy( + app_slug="my-app-slug", + variant_slug="my-variant-slug", + variant_version=None, # Deploys latest version if not specified + environment_slug="staging" # Options: development, staging, production +) + +print(f"Deployed to {deployment['environment_slug']}") +``` + +:::warning +- Deploying a variant without specifying a `variant_version` deploys the latest version. +- Only predefined environments with slugs `development`, `staging`, and `production` are currently supported. +::: + +**Sample Output:** + +```python +Deployed variant to environment: +{ + "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", + "app_slug": "completion", + "variant_id": "01968c11-6f7c-7773-b273-922c5807be7b", + "variant_slug": "my-variant-slug4", + "variant_version": 5, + "environment_id": "01968c14-c35d-7440-bcc8-9def594f017f", + "environment_slug": "staging", + "environment_version": 2, + "committed_at": "2025-05-01T07:26:08.935406+00:00", + "committed_by": "user@agenta.ai", + "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", + "deployed_at": "2025-05-01T13:41:33.149595+00:00", + "deployed_by": "user@agenta.ai", + "deployed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1" +} +``` + +## Fetching a Prompt Configuration + +You can fetch the configurations from a variant reference (`app_slug`, `variant_slug`, `variant_version`) or an environment reference (`app_slug`, `environment_slug`). The default behavior when fetching is to fetch the latest configuration from the `production` environment. If you don't provide a `_version` parameter but only a `variant_slug` or an `environment_slug`, the SDK will fetch the latest version of the variant from the specified **environment/variant**. + +:::tip +Check the [reference](/reference/sdk/configuration-management#prompt-configuration-schema) section for more details on the data format used for prompts. +::: + +### Default Behavior when fetching + +If you don't provide either `variant` or `environment` identifiers, the SDK fetches the latest configuration deployed to the `production` environment. + +```python +config = ag.ConfigManager.get_from_registry( + app_slug="my-app-slug", + variant_slug="my-variant-slug", + variant_version=2 # Optional: fetches latest if not provided +) + +print("Fetched configuration from production:") +print(config) +``` +Example Output: + +```python +{ + "prompt": { + "messages": [ + { + "role": "system", + "content": "You are an assistant that provides concise answers" + }, + { + "role": "user", + "content": "Explain {{topic}} in simple terms" + } + ], + "llm_config": { + "model": "gpt-3.5-turbo", + "top_p": 1.0, + "max_tokens": 150, + "temperature": 0.7, + "presence_penalty": 0.0, + "frequency_penalty": 0.0 + }, + "template_format": "curly" + } +} +``` + +:::tip +Agenta provides a helper class `PromptTemplate` to format the configuration and then use it to generate the prompt. +```python +from openai import OpenAI +from agenta.sdk.types import PromptTemplate + +# Fetch configuration +config = ag.ConfigManager.get_from_registry( + app_slug="my-app-slug" +) + +# Format the prompt with variables +prompt = PromptTemplate(**config['prompt']).format(topic="AI") + +# Use with OpenAI +client = OpenAI() +response = client.chat.completions.create( + **prompt.to_openai_kwargs() +) + +print(response.choices[0].message.content) +``` +::: + +### Fetching by Variant Reference + +```python +# Fetch configuration by variant +config = ag.ConfigManager.get_from_registry( + app_slug="my-app-slug", + variant_slug="my-variant-slug", + variant_version=2 # Optional: If not provided, fetches the latest version +) + +print("Fetched configuration:") +print(config) +``` + +### Fetching by Environment Reference + +```python +# Fetch the latest configuration from the staging environment +config = ag.ConfigManager.get_from_registry( + app_slug="my-app", + environment_slug="staging", + environment_version=1 # Optional: If not provided, fetches the latest version +) + +print("Fetched configuration from staging:") +print(config) +``` + +## Deleting a Variant + +To delete a variant, use the `VariantManager.delete` method. + +```python +# Delete a variant +ag.VariantManager.delete( + app_slug="my-app", + # app_id="my-app-id", # you can also use `app_id` + variant_slug="obsolete-variant" +) + +print("Variant deleted successfully.") +``` + +:::warning + +- Deleting a variant removes all versions of the variant. This action is irreversible. +- Attempting to delete a variant that is deployed to an environment will fail. +::: + +## Listing All Variants + +To list all variants of an application, use the `VariantManager.list` method. + +```python +# List all variants (syncrhonously) +variants = ag.VariantManager.list( + app_slug="my-app" + # app_id="my-app-id", # you can also use `app_id` +) + +print(variants) +``` + +**Sample Output:** + +```python + +[{ + "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", + "app_slug": "completion", + "variant_id": "01968aba-9702-7263-a7fd-8b8565753230", + "variant_slug": "my-variant-slug3", + "variant_version": 2, + "environment_id": null, + "environment_slug": null, + "environment_version": null, + "committed_at": "2025-05-01T07:23:26.338901+00:00", + "committed_by": "user@agenta.ai", + "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", + "deployed_at": null, + "deployed_by": null, + "deployed_by_id": null, + "params": { + "prompt": { + "messages": [ + { + "name": null, + "role": "system", + "content": "You are an assistant that provides concise answers", + "tool_calls": null, + "tool_call_id": null + }, + { + "name": null, + "role": "user", + "content": "Explain {{topic}} in simple terms", + "tool_calls": null, + "tool_call_id": null + } + ], + "input_keys": null, + "llm_config": { + "model": "gpt-3.5-turbo", + "tools": null, + "top_p": 1.0, + "stream": null, + "max_tokens": 150, + "temperature": 0.7, + "tool_choice": null, + "response_format": null, + "presence_penalty": 0.0, + "frequency_penalty": 0.0 + }, + "user_prompt": null, + "system_prompt": null, + "template_format": "curly" + } + } +}, { + "app_id": "01963413-3d39-7650-80ce-3ad5d688da6c", + "app_slug": "completion", + "variant_id": "01963f1f-28ea-78e1-b390-39d270fe93fe", + "variant_slug": "key", + "variant_version": 4, + "environment_id": null, + "environment_slug": null, + "environment_version": null, + "committed_at": "2025-04-16T15:02:08.874979+00:00", + "committed_by": "user@agenta.ai", + "committed_by_id": "0196247a-ec9d-7051-8880-d58279570aa1", + "deployed_at": null, + "deployed_by": null, + "deployed_by_id": null, + "params": { + "ag_config": { + "prompt": { + "messages": [ + { + "role": "system", + "content": "You are an expert in geography" + }, + { + "role": "user", + "content": "What is the capital of {{country}}? tell me its name in arabic" + } + ], + "input_keys": [ + "country" + ], + "llm_config": { + "model": "gpt-3.5-turbo" + }, + "template_format": "curly" + } + } + } +}] +``` + +## Fetching a Variant's history + +To list all versions for a variant of an application, use the `VariantManager.list` method. + +```python +# List all variant versions/history (synchronously) +versions = ag.VariantManager.history( + variant_slug="variant-slug", + app_slug="my-app" + # app_id="my-app-id", # you can also use `app_id` +) + +print(versions) +``` + +**Sample Output:** + +Same as `VariantManager.list` but limited to the history of a specific variant. + +## Asynchronous Operations + +All SDK methods have async counterparts with an `a` prefix: + +```python +async def async_operations(): + # Create variant asynchronously + variant = await ag.VariantManager.acreate(...) + + # Commit changes asynchronously + updated_variant = await ag.VariantManager.acommit(...) + + # Fetch configuration asynchronously + config = await ag.ConfigManager.aget_from_registry(...) +``` + +## Caching + +The Agenta SDK includes intelligent caching for prompt configurations to improve performance and reduce API calls. Caching is **enabled by default** and works transparently without requiring code changes. + +### Default Caching Behavior + +All `get_from_registry()` calls are automatically cached with a **60-second TTL**: + +```python +# First call - fetches from API and caches result +config = ag.ConfigManager.get_from_registry(app_slug="my-app") + +# Second call within 60 seconds - returns cached result instantly +config = ag.ConfigManager.get_from_registry(app_slug="my-app") +``` + +The cache uses intelligent key generation based on all configuration parameters, so different parameter combinations are cached separately: + +```python +# These are cached as separate entries +config1 = ag.ConfigManager.get_from_registry(app_slug="my-app") +config2 = ag.ConfigManager.get_from_registry(app_slug="my-app", variant_slug="v2") +config3 = ag.ConfigManager.get_from_registry(app_slug="my-app", environment_slug="staging") +``` + +### Custom Cache TTL + +You can control the cache duration using the `cache_ttl_seconds` parameter: + +```python +# Cache for 5 minutes +config = ag.ConfigManager.get_from_registry( + app_slug="my-app", + cache_ttl_seconds=300 +) + +# Cache for 1 hour +config = ag.ConfigManager.get_from_registry( + app_slug="my-app", + variant_slug="production", + cache_ttl_seconds=3600 +) +``` + +### Disable Caching + +For development or testing scenarios where you always want fresh data, disable caching by setting `cache_ttl_seconds=0`: + +```python +# Always fetch fresh data from API +config = ag.ConfigManager.get_from_registry( + app_slug="my-app", + cache_ttl_seconds=0 +) + +# Common pattern for development +config = ag.ConfigManager.get_from_registry( + app_slug="my-app", + variant_slug="latest", + cache_ttl_seconds=0 # Always get latest changes +) +``` + +### Fallback Configurations + +Ensure 100% availability by providing fallback configurations when the API is unreachable: + +```python +# Define fallback configuration +fallback_config = { + "params": { + "prompt": { + "messages": [ + {"role": "system", "content": "You are a helpful assistant"}, + {"role": "user", "content": "Hello {{name}}"} + ], + "llm_config": { + "model": "gpt-3.5-turbo", + "temperature": 0.7, + "max_tokens": 150 + } + } + } +} + +# This will use fallback if API fails +config = ag.ConfigManager.get_from_registry( + app_slug="my-app", + fallback_config=fallback_config +) +``` + +### Cache Management + +Clear the cache when needed for testing or when you know configurations have changed: + +```python +# Clear all cached configurations +ag.ConfigManager.clear_cache() + +# Clear only configurations for specific apps (pattern-based) +ag.ConfigManager.clear_cache("my-app") # Clears entries containing "my-app" +ag.ConfigManager.clear_cache("staging") # Clears entries containing "staging" +``` + +### Async Caching + +All caching features work identically with async methods: + +```python +# Async with caching (60s default TTL) +config = await ag.ConfigManager.aget_from_registry(app_slug="my-app") + +# Async with custom TTL +config = await ag.ConfigManager.aget_from_registry( + app_slug="my-app", + cache_ttl_seconds=300 +) + +# Async with fallback +config = await ag.ConfigManager.aget_from_registry( + app_slug="my-app", + fallback_config=fallback_config +) +``` + +### Performance Benefits + +Caching provides significant performance improvements: + +- **First call**: Standard API latency + minimal cache overhead +- **Cached calls**: Near-zero latency (typically < 1ms) +- **Reduced API load**: Fewer requests to Agenta servers +- **Improved reliability**: Fallback configurations ensure availability + +### Configuration + +The cache behavior can be customized using environment variables: + +```bash +# Cache capacity (default: 512 entries) +export AGENTA_SDK_CACHE_CAPACITY=1024 + +# Default TTL in seconds (default: 60) +export AGENTA_SDK_CACHE_TTL=120 +``` + +:::tip +The cache is thread-safe and works seamlessly in multi-threaded applications. Each unique combination of parameters gets its own cache entry. +::: + +:::note +Caching is applied at the configuration level. Changes to prompts or configurations in the Agenta UI will be reflected after the cache TTL expires, or you can clear the cache manually. +::: + diff --git a/docs/docs/prompt-engineering/integrating-prompts/03-proxy-calls.mdx b/docs/docs/prompt-engineering/prompt-management/03-proxy-calls.mdx similarity index 97% rename from docs/docs/prompt-engineering/integrating-prompts/03-proxy-calls.mdx rename to docs/docs/prompt-engineering/prompt-management/03-proxy-calls.mdx index 2dcdface09..d0012fd612 100644 --- a/docs/docs/prompt-engineering/integrating-prompts/03-proxy-calls.mdx +++ b/docs/docs/prompt-engineering/prompt-management/03-proxy-calls.mdx @@ -1,8 +1,7 @@ --- -title: "Invoke Prompt (Proxy LLM Calls)" +title: "Proxy LLM Calls" description: "How to invoke your deployed prompts through Agenta's proxy service with automatic tracing and logging." sidebar_position: 4 -sidebar_label: "Invoke Prompts" --- import Image from "@theme/IdealImage"; diff --git a/docs/docs/prompt-engineering/_category_.json b/docs/docs/prompt-engineering/prompt-management/_category_.json similarity index 100% rename from docs/docs/prompt-engineering/_category_.json rename to docs/docs/prompt-engineering/prompt-management/_category_.json diff --git a/docs/docs/reference/api/accept-invitation.api.mdx b/docs/docs/reference/api/accept-invitation.api.mdx index 88367d84c6..bce95f2bf9 100644 --- a/docs/docs/reference/api/accept-invitation.api.mdx +++ b/docs/docs/reference/api/accept-invitation.api.mdx @@ -5,75 +5,370 @@ description: "Accept an invitation to an organization." sidebar_label: "Accept Organization Invitation" hide_title: true hide_table_of_contents: true -api: eJztVt9v4zYM/lcEPm2AV2fF7cV7WbYVuO62NUizDUMbBIzNxrrakk+S2+YM/+8DJTt2nLb7gduelrdY1EfyI/lRDTjcWUhu4MrsUMmP6KRWsI4gI5saWfm/CczTlConUAmpHqTzVsJp/qBHF89u1a1aorRkk1slhBBvV6vFxRNfllolYjOC3XwtrENX202qM0rEV7PZs3cuB49KO3Gna5UJbUSOVtBTJQ1lE6Q3LyD9rmuBhSHM9mJLhVY7zsHl0h5l8RzarVqSq43q8/rh+urnJdlKK0uJCPRQNmHnUZt7W2FKE8Tz2Qwi0BUZb3qZQQLoITYDAERQocGSHBmuUAMKS4IExqFuZAYRSC5RhS6HCAx9qJkSSJypKQKb5lQiJA24fcXXrTNS7SACJ13BH8aVF5cZtG108HXI4FM4+q0Hm3qpjH5PqRv5+FCT2f8jJ4uAFVysAwJZ963O9nxtCphq5Ug5PsKqKmTqaYjfW277ZuSvMlwvJ8l67/qe1GthrLxBGwGVKIvXLC+8QdtGvYXecgJHyd90Dnu49XDdTwd17lqGMV1b+kC51ZJmMs3XdZqStXd1Ifoehr9ORfDy5vz8FPhXLGQWGunCGG3+BuqE4Ixcx5t0VNpTg0KnR6eo9ld3fkyOieY2675I5WhHBtr1QDYag/tRNX7UIUAuXWl3rxXuJ7IWdwQHsFdqzGSIFZ/+WaE5r+C6sxvVeqA3sPtyGt8H+p5z1puwNp4AhtqW5HLNolRp67wOuRwSiMfKY+NmIkRtfFALGzdj5WhjL2sUB5GDCCyZh17WalNAArlzlU3iOC10nZ3hjpTDM5QxVhJ4ji2ltZFu76/MF5fvaP+WMCMDyc16bHDNHRV65NjsUB6s5Dtitjr5mdcu16bffZ0C5eEW08G9uhxk5OIJy6qgkQwMBe+mfWg+kOpOe9OO9rnPTMwXlxABcxAmZ3b25RkvhcnaHRvzJGHqJ6kP3B9DNKHwQN4oIEdYfjMccFpc3BLVGC9s+eOFMF5IR9E1w2z//z74F94HXbc6enJxVaD0muQr3XQTeXP0FrAQQXL6OBiGks9PFjrPJUTd84PFJueZT26gabZo6RdTtC1/DhuZhy+TFrcFq9UdFpZe6YrPlp2wfS5eyuee9tMHwAMWNRv6sX9AI9nbp/fci4Haj332EU155DXyH7o/KpPfV3kvdk1n8l3w9oXfKgPEyZLlyMONea++L9uuR+K/uLpeQQTb7uVU6ozvGHzkjYWPIVxdhdbjpxV/a6BAtat5LyYQMPn3B8FxSMc= +api: eJztVt9v4zYM/lcEPm2AF2fF7cV7We9W4LrbliDNdji0QcHarK2rLfkkuW3O8P8+ULJjJ2m7H7jtaXmLTH4UP5If1YLD3EJyCQuTo5Kf0UmtYBNBRjY1svZ/EzhNU6qdQCWkupfOWwmn+UBPHGdX6kqtUFqyyZUSQoi36/Xy7JGdpVaJuJ7AXn8vrEPX2OtUZ5SI7+bzJ33Ox4hKO3GrG5UJbUSBVtBjLQ1lB0ivnkH6oBuBpSHMtuKGSq1yzsEV0u5l8RTalVqRa4wa8vrpYvHrimytlaVEBHooO2DnQZs7W2NKB4gn8zlEoGsy3vQ8gwTQQ1yPABBBjQYrcmS4Qi0orAgS0Ca/lhlEILkyNboCIjD0qWEmIHGmoQhsWlCFkLTgtjV7WWekyiECJ13JBwuTi/MMui7aIe/u+yXw3w9gh1Fqoz9S6iYxPjVktv8oyDJghRCbgEDWvdbZlt0OAVOtHCnHn7CuS5l6puOPlpu8ncSrDVfHSbI+ur4j9dI11t6gi4AqlOVLlmfeoOuiwULfcAJ7yV/2AQe4zejuZ4H6cB3DmL4J/UW5sZL2YHYvmjQla2+bUgwdC3+dihDl1cnJMfDvWMosNPuZMdr8DdQDgjNyPW/SUWWPDUqd7n1FtV3c+qHYJ5rbrD+RylFOBrrNSDYag9tJNX7W4YJcusrmLxXuF7IWc4Id2As1ZjLEmr/+WaE5rxC6t5vUeqQ3sPt8Gj8G+p4KNpiwEh4BhtpW5ArNElRr67zquAISiKeSaOM2yE4X70TCxu1UMLrYaxfFQckgAkvmftCuxpSQQOFcbZM4TkvdZDPMSTmcoYyxlnC0cvxX8YZNgWfbUtoY6bYe73R5/o62bwkzMpBcbqYGF9xloW/2zXYlw1q+I2awl6TTxhXaDNuvV6UieDFF3L+rUVrOHrGqS5pIw9gEvQKMDQlS3Wpv2peiT+w1pnekWAOZpJDzfPbtbP4cE72DOF2e95OGqZ+0IQlvBtEB1zuWJ5dzhNUP4wdOkYtfoZrihZ0/fRhMdvHhLdtx9v9/LfwLr4W+cx09urguUXrN8pVu+4m9hL2JhQiS3VNhHFo+PtrzPLcQ9W8Q1qCCpSC5hLa9QUu/mbLr+Dgsap6/TFq8KVnEbrG09EIzfLXq9e5r8Vwad7Q9fBfcY9mwoZ/8ezSSo335yIMeqO005nCjnj5eKv9h1L3q+O1VDDLX9iZvQrRv/I4ZIY5WLt88eJwOovy87WayCpaLizVEcNO/oyqdsY/BB95f+BCuq+vQaPzQ4rMWSlR5w1sygYDJvz8AGfBEVQ== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/organizations/{org_id}/workspaces/{workspace_id}/invite/accept"} +> Accept an invitation to an organization. Raises: - HTTPException: _description_; status_code: 500 - HTTPException: Invitation not found or has expired; status_code: 400 - HTTPException: You already belong to this organization; status_code: 400 +HTTPException: _description_; status_code: 500 +HTTPException: Invitation not found or has expired; status_code: 400 +HTTPException: You already belong to this organization; status_code: 400 Returns: - JSONResponse: Accepted invitation to workspace; status_code: 200 +JSONResponse: Accepted invitation to workspace; status_code: 200 - - - - - +> - - - - - +

+ Path Parameters +

+ +
+
    + + +
+
+ +
- - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+
+ + +
+ +

+ Body +

+ required +
+
+
    + + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/add-trace.api.mdx b/docs/docs/reference/api/add-trace.api.mdx new file mode 100644 index 0000000000..991dad4ee9 --- /dev/null +++ b/docs/docs/reference/api/add-trace.api.mdx @@ -0,0 +1,1032 @@ +--- +id: add-trace +title: "Add Trace" +description: "Add Trace" +sidebar_label: "Add Trace" +hide_title: true +hide_table_of_contents: true +api: eJztWllz2zYQ/iuafWpnJMuXnFZPVWRmotqRNBKdh2o0GoiELMS8AoBuVI3+e2cBHiB12nHaPDAPjma52F18e2FBrkGSRwHtCdicOCx4hGkdwohyIlkY9FxoA3HdmeTEoVAHTr/GVMj3obuC9hqcMJA0kPiTRJHHHLWq+UWEAdKEs6Q+wV8RR5mSUaHoEQnUDxKsBgtoT9YgVxFFXZyTFWzqGSGIPQ820zpIJj0kjNXaTR2USSUpxHUZWkC8YUHhUfX7FuYc3y0CHMad2CP8l4FNPdzGr1BfA5PUF9De+bSEynSTUcL5F+rI04ByOCWSujMid0IuJEe312ERch95wCWSNiTz6UH5XS221kEzII7cH6HkQYtNlLjUoz9Aya0WmyhJ4ZqvZsw9UU8cM/cksN6vaj3XxOtNtaRoZVpSwN5USwpXpkVlYqKgLDZdhNWFJvyYPEfYMXgT7ohwGsgj9h+yd6gEmLqfWHAEDRrEPubseNjpz+56/dvZQ388tLq9Dz3rFuoGvde3rVG/c18gjq3RZ2tUIHXve1bfLpCGo8HtQ7fMN+iPHz5ZIzB2kJaEO7R7e6vptgLi09eCpADvE5UpICThcqby5jvyjAWSPlJ+WC1qqtl6JdDA/U+0WoGb6RSSyFjMnNA9ojYLCbtjP4xn3cGthUFhKZ8atMFdiWCNRoNtdyq1XdS626HaLJ8KQR5f71UlpfYpkbKpA5GSs3ksT+2cJ2jdibg/L1LmYehREijSbl15B/wQe96fIgwavSCKpdEHja631Tb3Ljp+pCguhRd12U6OJwbwMw1kCbfE0vIJIk3WfRUwzUWMbyGJH71JUhiW25ngKix+aFhsLdTHaMapi/VEBYLp51KlsDCmDO3HDbd0FG7q4LHg6bRwfFlPfmnHr8Lrfwuv1LGG00oBds+CpxfF172KqmOKM3X5gW/HkcaEtRqyqiGrGrKqIasasqohqxqyquNONWRVYVENWdWQ9fOH188/ZL3FlLPDlrImYXNKXwazrd/jHZOevJ4c6ReQsEH+HAnJY6oIIgoDoeP78vwS/3OpcDiLMCpxK7HjUCEWsVcbJcxQf+17zGfKBdMs+xL0c8KCM08YaxWl5DIGGMWxu6S8ceCkpqdm7QhXkQG0UWhfX+7A8zPxmKvQqlmch/z1YLpUEubhrz3V0wudwtOX1K9pOQMMvEJtIOLui8dDzjSOeJplP6sCo2bj02OuwH1p1Qmf4YscXo3u/m3cavgOpdFH2x5uCdS+LTq147o1O3nj71O5DPEzgCgUKCwicgltaEacPjP6d1PqvGzq1/FNLESUY3Qpz8TcgzYspYxEu9l0vDB2z8gjDSQ5I6xJIgZbutXTWhdZVVwL6sScyZWS1xn27ujqIyUu5dCeTE2GMQaWDpUiW548EbujCJo+F0InlsuQs3+0/+vA0IClXoWoYMiO8i8erG/EjzxqXE1N1oWLHyw5rcZ5q3HRsi+u2ucX7db12fl16y8o3t0c4jOvXw7xlW5Q4GpBfmstbq4brXcX7xrXrZvLxvxq4TQund9vrhY3N2RBbmDrSuTUZaU7jlOX5UeYPEOyQ1BOMm4fSnz6EmHvDYExkRsLjcH6EIL5IHyIqzC67pxLy1NkbknhRGZMLpN0MjHrRjaBHLKmKBGjP2kVk/UuYHfhXxahekf6LQ1GPQsWoUqa9BykM/I9cZ5ogCeNrO3B+dnF2fm+FE4W1DrDXtIViCPzqSxhw5gsFImsPKCLfNUSQFLi/5E/QCuxHPkkMOUZVatgUJb/kn6TzcgjTBV7pXadFLQJJAUtQc3AT0AdsCYvsQC2J7Bez4mgD9zbbJD8NaYci9O0Ds+EMzJH0CbYcJZpmVrDE12p/q46Y0O1BWT3Yl2WSl0SO5he0XEcGsmDvFOjRg8HY4zIefJ5lq+DlhPcFf5tA+DXXbha1UlFW4NHgsdYx66Wif/+BTXi0IE= +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Add Trace + + + + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, + `SPAN_KIND_INTERNAL`, `SPAN_KIND_SERVER`, + `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, + `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, + `STATUS_CODE_OK`, `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + + anyOf + + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + + anyOf + + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf + +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/add-variant-from-base-and-config.api.mdx b/docs/docs/reference/api/add-variant-from-base-and-config.api.mdx index b79ae2556a..d0fa2cf904 100644 --- a/docs/docs/reference/api/add-variant-from-base-and-config.api.mdx +++ b/docs/docs/reference/api/add-variant-from-base-and-config.api.mdx @@ -5,77 +5,668 @@ description: "Add a new variant based on an existing one." sidebar_label: "Add Variant From Base And Config" hide_title: true hide_table_of_contents: true -api: eJztV01v2zgQ/SvEnHYB1c4Ge9JpnTaLBt02Rj66B8cwJuLYZiuRKkkl8Rr+74shJUuykzhNgD1tLpHF4RvOzHvD0Ro8LhykE/iKVqH2DqYJSHKZVaVXRkMKIykFCk334i7aiFt0JIXRArWgB+W80gthNA1u9CUWJNCJ8fnllRhmRs/V4kbf6JFduPRGCyFEiavcoBS/jKSsvf5pTXGCjsZx6ddU1E8iM9qj0uyAvW6PcPYh6R1JY0GJQC1FiRYL8mTdgB1foHLUuP54dTU+fcgohJaKsCaFmgu/bKEzU+VSaOPFLQmUkkO1ArOMnCMZQclXVjeo11oZPRmVZR3NBbnSaEeJGOnVNBVfOueU5FHljhGpOcgAEjAlWeQfZxJSQCln9Y7Z3JpixrHPUMtZzCgkYOlHRc6fGLmCdA2cJ9KeH7Esc5UFsOE3xyVcg8uWVCA/lZZdeUWOfwVcJfnRr0qCFJy3SrMDr3zOL7gu4kzCJgFN99tjccKf28ZB1/kQX9i23h8DeNH298F0u7stbIhSSsUhYj7uRORtRUkDam6/UeY7oOMWYZNAZopC+VlBzuEiHAb16nwO6WT3WJtk+0ZXeQ6baYv5PqCIzzXKZrPvnkulLEmWWZPwR5K5n59ezB2fTwoHNuy/9cfpCC8iIUPijo+O+F9f45dVoPe8ykXDXkheTqo2cX16YVkeYNeoLGtyse0hVrB1Q4cmd8/jNxSMPl5K3l3iltZwLQ/4Gker2leo9CFHQVyNl58T4wuFtCOiyqrXMv3aKghkulNORQbUpkp7WpDteL1ojPigltCTnKF/tcYighj5EEIp34h3HRFqvMJINVckZ7erOvuvwfxco4iTVV0gYxeo1T9BM28APu/A1Mj3xn53JWb0Bti/G4yAeaBr1TruiLSnvx1h9fTSFULSaX/9Prcl1bQn9p0LdcYRdYNoFgTPKI1ouSeKIJSRlvUlwo1xk8Dvx8f7ve8r5krG9J5aa+zPNL5+u4uXOz8pT4XbN8hN1lt9QeEabW2mbY3QWlx11PaXiQcMbHaL59rB9p5qwJ42DckQV7x6iB8cV3Rd2027vbRJb8zu02F8iOl7zFljwgPcHmCsbUF+aXh4Ko3z4er0S0hhWFPTDXmQescEhAQc2bswSEzWUNkcUlh6X7p0OMxyU8kBLkh7HKAaYqmCbhxllVV+FbaMxmefaPWRUJKFdDLtGlwyOWK5+2bbTGOpPhEHHns3jCq/NLaWOCSgmJXLuIsjY9pdtOPe6QMWZU698a2t3v6M1l/rXRvtUm+4emQ4apkJSs9NiKbRaciVGI3PuBGQjZcDHA1+GxzB3sdE1zgM91mQWZOKsAzJTlG25YAEqAgaA09Y/NEucKK48gXqLt6hvrBzvs4g/f93z3/x3VNLwtODH5Y5Kh2HlNBEo4InzeXiIIFWw9MEliz0dALrNb+5tvlmw69/VGRZptP6Wrpllk64fS4bwa7hO63icMTFfheaHJvnVRToTs/nfhx3jDI+/LO2004vYjrwtVd/pRVG8h6L99xA8R5SCN9+vDt0jPBuDTnqRRV1FzH571+oCGap +api: eJztVk1v2zgQ/SvEnHYB1c4Ge9JplTRFg+62RpL24hjGRBzbbCVSJakkXkP/vRhSsiQ7SbOXnjaX0JzvN/OG2oHHtYN0Dl/QKtTewSIBSS63qvLKaEghk1Kg0PQg7qOOuENHUhgtUAt6VM4rvRZG0+RWX2NJAp2Yfbq+EdPc6JVa3+pbndm1S2+1EEJUuC0MSvFbJmUb9Z015Rk6mkXR76loTyI32qPSHICj7lO4fJuMUtJYUiJQS1GhxZI8WTfhwFeoHHWh39/czC4ecwqlpSLIpFAr4Te969zUhRTaeHFHAqXkUq3APCfnSEan5GurO6+ftTJ6nlVVW80VucpoR4nI9HaRio+DPCV5VIVjj9QlMoEETEUW+celhBRQymVrsVxZUy659iVquYyIQgKWvtfk/JmRW0h3wDiR9nzEqipUHpxNvzpu4Q5cvqES+VRZDuUVOf4V/CrJR7+tCFJw3irNAbzyBV9wX8SlhCYBTQ/7tBjwl8y46BYP8ZF1W/tYwKvMz4Pq3rpvbKhSSsUlYjEbVORtTUnn1Nx9pdwPnM56D00CuSlL5ZclOYfrkAzq7acVpPPDtJpkf6ProoBm0fs8D17EP62XpjkOz61SliTTrAP8CTCP8RnVPIj5LHGg4fh9PIYjXMSBDMCdnpzwvzHHr+sw3qu6EN30QvL6oToC7snasapi6XxoC+wQCPcHcFTWsJcoC8C1gh7EMVqW7pXjgoZYHdFyyf0ctrATCN503cwysiLMfqZlO4oMb5PAn6enxwh+wULJgI+4sNbY/wLfmJNxRfBJeSrdsUJh8pH0FWOrtKc1WWgW/XyitbgdsONvExNkbpRu/RI799PeOXteNYAhblj6M25wXTF0qzfoUQ9vRPf5Mt5G+J4K1qnwM3DkMPa2JL8xvIIr43wgoN9ACtN2NN2U1/EbHkBIwJG9D+tovoPaFpDCxvvKpdNpXphaTnBN2uME1RQrBUfvapCKc1YNK8VRXlvlt8FfNrv8QNv3hJIspPPFUOGaJyfOwlht3was1AdiVOKehaz2G2PVv7HBCShOYBOtuGyeyav+Rbl4xLIqaPRC9K09fgbGstGK70Wj/f3E/u3HFpRemVBNR+II1Rnm30iHTUHWRRRPJn9MTp7DtjUQ2eyy5SPmgY8dLEENkoPu7fsGCVAZyAiesPyrFzBoPCIl6qG/ny2QgzwH7/b/n1m/4jOrpYenRz+tClRh2YXm71qqz7tXyEECPdkXCWx4I6Rz2O345rMtmoavv9dkmbKL9v2644md857ddOTdwTfahm+F0Ow3YRuyelFHsh48Dry4o0WWc/Iv6i4GS4vHgd/H9qOwNJJtLD7wpsUHSCF8arJ12B7hbgcF6nUdORh98t8P8fAyug== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Add a new variant based on an existing one. Same as POST /config Args: - payload (AddVariantFromBasePayload): Payload containing base variant ID, new variant name, and parameters. +payload (AddVariantFromBasePayload): Payload containing base variant ID, new variant name, and parameters. Raises: - HTTPException: Raised if the variant could not be added or accessed. +HTTPException: Raised if the variant could not be added or accessed. Returns: - Union[AppVariantResponse, Any]: New variant details or exception. +Union[AppVariantResponse, Any]: New variant details or exception. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + + + +
    + + + + parameters + + object + + required + + +
    + +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + anyOf + + + + + + + + + + + +
    + + uri + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + created_at + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + modified_by_id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/add-variant-from-key.api.mdx b/docs/docs/reference/api/add-variant-from-key.api.mdx index ecf39ddad0..9a933fea78 100644 --- a/docs/docs/reference/api/add-variant-from-key.api.mdx +++ b/docs/docs/reference/api/add-variant-from-key.api.mdx @@ -5,36 +5,36 @@ description: "Add Variant From Key Route" sidebar_label: "Add Variant From Key Route" hide_title: true hide_table_of_contents: true -api: eJylVk2P2zYQ/SvCnFpAWW0WPelUZ5siCyeNsbvNxTCMWXFsMZFIhqSSqIL+ezGkvrzObtPWF0vkm+HwzZtnd+Dx6CDfwsoYB7sUtCGLXmp1IyAHFGL/Ba1E5fcHq+v9J2ohBYMWa/JkObQDhTUx2Ji9FJCCVJCDQV9CCpY+N9KSgNzbhlJwRUk1Qt6Bbw1HOW+lOkIKXvqKF1bGJDcC+n4Xo8n5V1q0HPI4WaGVJ+V5C42pZBEqzz46rXhtPstYvpeX5PhtvFGs++lKPkRc8gfj+hT48s/A19QyqtB1Lf2+JufwGPKjat8fAlOnoX06raimqoBvPCa7DlmSd0OWPoUHdDSV/F9SvkJH010KrQ7y+L/yXYcUQ8Y+HXH64SMV/qT121PKI5OLTCshBq5/t7peU7vBttLIIuDElpzRysXmXV1e8pcgV1hpuN+Qw11TFOTcoamS2wEMPy6PeMovV1fniT9gJUUIS15bq+2/yPpIdII8yoqfpKfanQMqXZzs/kBLpPJ0JAv9bqYfrcV2ocq3OhbITa/d8TkBL8QWIU9DAxnJPe/+U+v5XvHoAbdbTthIb2T36Wv8Fun73mEj5M39/eYsYeztaVNXQiTjbLPgkjW1ya1uPIumJl9q9j6jnQ9e50vIIUNjXNZFj+uzQc8Zm+ILT7WpMEQ7sl9GW2xsBTmU3huXZ1lR6UZc4JGUxwuUGRoZpslR0Vjp2xCy2tysqX1DKMhCvt0tAXcsrCiVU9jUJTRyHfx5MORV40tt5V+x/4MvlzGKWWHJ3s4O+/ob1qaic4ec2x8ccH59bHXzzsKslvCF58xyBqkOOlxjtINAUrLa3EAKTGds2+XFy4tLOGvmEsyziUWYzZGDsA3po25MfYAUqA6DCZ6w/nXeYIZYAzWqZb7ntHNS2dQWT998ZiqUYQZDHd0gqy1biIMU8unHc6AeUjjV1i6FkhWZb6HrmN4/bdX3vPy5Icvy2Q3BD0zitgMhHT8LyA9YOTorbzIy+Ol2mNefE0i/X/YoMdWGGquG3yZFDNUHHypH9XbD5nU850Vwizn4zDzZ2GLEqijI+Gexu8Wkbt7f3bPmhn8JtRYcY/ErOxF+jYXqcO8wPmGtgwrVsYm6jTn58zcXChjm +api: eJylVk1z2zYQ/SucPbUzjOl6euKpsptOPGobje3motFo1sRKREICCAAmYTn875kF+CUrdtNWF4nA28Xi7dtHdeDx6CDfwsoYB7sUtCGLXmp1KyAHFGL/Ca1E5fcHq+v9B2ohBYMWa/JkObQDhTUx2Ji9FJCCVJCDQV9CCpY+NtKSgNzbhlJwRUk1Qt6Bbw1HOW+lOkIKXvqKF1bGJLcC+n4Xo8n5ay1aDnmarNDKk/K8hcZUsgiVZ++dVrw2n2Us38tLcvw03ijW/Xwl7yIu+ZNxfQp8+Rfga2oZVei6ln5fk3N4DPlRtW8PganT0D6dVlRTVcA3HpPdhCzJH0OWPoVHdDSV/F9SXqOj6S6FVgd5/F/5bkKKIWOfjjj9+J4Kf9L67SnlkclFppUQA9e/WV2vqd1gW2lkEXBiS85o5WLzri4v+UuQK6w03G/I4b4pCnLu0FTJ3QCG75dHPOXnq6vzxO+wkiKEJa+t1fZfZH0iOkEeZcW/pKfanQMqXZzsfkdLpPJ0JAv9bqYfrcV2ocrfdSyQm16740sCXogtQp6HBjKSB979p9bzveLRA263nLCR3sju89f4NdL3rcNGyJuHh81Zwtjb06auhEjG2WbBJWtqkzvdeBZNTb7U7H1GOx+8zpeQQ4bGuKyLHtdng54zNsVXnmpTYYh2ZD+NttjYCnIovTcuz7Ki0o24wCMpjxcoMzQSzgoLu8kNQ8OoOSoaK30b8q02t2tq3xAKspBvd0vAPasu6ugUNrUQjVwH8x7cetX4Ulv5dxTHYNpljGLKWM93s/2+/oK1qejcPmdtBHucH5/64LyzcLIlfGFIs9ZBqoMO1xi9InJ0jcUHUvy2Yb4jfZcXP11cPkfqEJCsNrfDEGMRhnjkI8AgfdK2qWGQAtVhgsET1r/MG8wWi6VGtcz3kshOKpxa5OmLz0yFMgxrqKMb9Ldlr3GQQj69ZYc2QAqnItylULJ08y10HVP9l636npc/NmRZSrsh+JEJ3XYgpOPfAvIDVo7OypscD364Gwb7xwTSb5c9yk21ocaq4adJHUP1wbDKUcndsHkTz3kVbGUOPnNZdsAYsSoKMv5F7G4x0pu39w+sv+HvRK0Fx1j8zJaFn2OhOtw7jFJY66BCdWyihmNO/nwFaaQndQ== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Add Variant From Key Route @@ -43,29 +43,347 @@ Add Variant From Key Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + + + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + base_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + config_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/add-variant-from-url.api.mdx b/docs/docs/reference/api/add-variant-from-url.api.mdx index 32a9ec7766..1949d6d4d5 100644 --- a/docs/docs/reference/api/add-variant-from-url.api.mdx +++ b/docs/docs/reference/api/add-variant-from-url.api.mdx @@ -5,36 +5,36 @@ description: "Add Variant From Url Route" sidebar_label: "Add Variant From Url Route" hide_title: true hide_table_of_contents: true -api: eJylVk2P2zYQ/SvCnFpAWW0XPelUZ5sgi6SN4d3NxTCMWXFsMZVIhqSSqIL+ezGkvrzObtPUF1vkm+HMm8cnd+Dx6CDfwsoYB7sUtCGLXmp1IyAHFGL/Ga1E5fcHq+t9YytIwaDFmjxZDu1AYU0MNmYvBaQgFeRg0JeQgqVPjbQkIPe2oRRcUVKNkHfgW8NRzlupjpCCl77ihZUxyY2Avt/FaHL+pRYthzxOVmjlSXneQmMqWYTKs49OK16bzzKW+/KSHD+NHcW6n67kQ8QlfzKuT4GbfwZ+bytGFbqupd/X5BweQ35U7ftDYOo0tE+nFdVUFXDHY7LrkCX5Y8jSp/CAjqaSfyTlS3Q09VJodZDH/5XvOqQYMvbpiNMPH6nwJ6PfnlIemVxkWgkxcP3a6vp+826NbaWRRcCJLTmjlYvDu7q85C9BrrDS8Lwhh9umKMi5Q1MlmwEM3y+PeMqvV1fniT9gJUUIS15Zq+1/yPpIdII8yqAf6al254BKFye73zESqTwdyUK/m+lHa7FdqPKdjgXy0Gt3fE7AC7FFyNPQQEZyx7v/NnruKx494HbLGzbSG9l9uo3fI33fOmyEvLm7W58ljLM9HepKiGS82yy45N5WyUY3nkVTky81e5/Rzgev8yXkkKExLuuix/XZoOeMTfGFI/tZFhzMv0ZXDG4BpffG5VlWVLoRF3gk5fECZYZGhsvkqGis9G0IWa1v3lL7hlCQhXy7WwJuWVdRKaewaUho5FtizgY/XjW+1Fb+Hcc/2HIZo5gUVuxmNthXX7E2FZ0b5Dz92NL0+Njp5p2FVy3hC8uZ1QxSHXRoY3SDQFKyWt9ACkxnnNrlxS8Xl3A2yyWYryYW4WqOHITtqfRxGtMcIAWqw70ET1j/Nm8wQyyBGtUy33PSOalsGounrz4zFUq1eIdEVW3ZQRykkE/vzoF6SOFEWrsUStZjvoWuY3bvbdX3vPypIcvq2Q2xD8zhtgMhHf8WkB+wcnRW3WRj8NNmuK0/J5B+u+pRYaoNJVYNP0EKf1E7v/iDC5WjeLth8zqe8yJ4xRx8Zp1sazFiVRRk/LPY3eKert/f3rHkhv8ItRYcY/EL+xB+iYXq0He4PWGtgwrVsYmyjTn58w+qdxgg +api: eJylVk1v2zgQ/SvCnLqAGmWDPelUJ9tFg3Zbw0l6MQxjIo4tthLJklRbV9B/L4bUl+MmbXd9sUW+Gc68eXxyCx73DvI1LIxxsElBG7LopVbXAnJAIbaf0UpUfruzut42toIUDFqsyZPl0BYU1sRgY7ZSQApSQQ4GfQkpWPrUSEsCcm8bSsEVJdUIeQv+YDjKeSvVHlLw0le8sDAmuRbQdZsYTc5fanHgkIfJCq08Kc9baEwli1B59sFpxWvTWcZyX16S46eho1j345W8j7jkLeO6FLj5J+B3tmJUoeta+m1NzuE+5Ed1eLcLTB2Hdum4opqqAu54SHYVsiT/9lm6FO7R0Vjyf0l5iY7GXgqtdnL/v/JdhRR9xi4dcPr+AxX+aPTrY8ojk7NMCyF6rv+xur5bvVniodLIIuDElpzRysXhXZyf85cgV1hpeN6Qw01TFOTcrqmSVQ+GX5dHPOWvi4vTxO+xkiKEJS+t1fY3sj4QnSCPMuhHeqrdKaDSxdHuL4xEKk97stBtJvrRWjzMVPlGxwJ56LXbPyXgmdgi5HFoICO55d2fjZ77ikf3uM38hg30RnYfb+PvSN+PDhsgr25vlycJ42yPh7oQIhnuNgsuubNVstKNZ9HU5EvN3me088HrfAk5ZGiMy9rocV3W6zljU3zuyH6WBQfzr8EVg1tA6b1xeZYVlW7EGe5JeTxDmaGRcFJX2E2uGBpumqOisdIfQr7F8vo1HV4RCrKQrzdzwA2LLsroGDZOEI18TUxob9aLxpfaym9RG71nlzGKGWM5ryb3ffkVa1PRqXtO0oj9jo8PbXDamRnZHD7zo0nqINVOhzYGq4gcXWLxkRS/bJjvSN/52Z9n54+R2gcki+V1f4exCHd44CPAxjaGsY0DgxSoDhcYPGH9YtpgtlgrNap5vqc0dlThOCJPX31mKpRq9rKJ8luz1ThIIR9fsv0YIIUjDW5SKFm4+Rralpm+s1XX8fKnhiwradPH3jOf6xaEdPxbQL7DytFJdaPfwbNVf63/SCD9cdWD2tQhlFg1/AQpfKTD9A8h2FU5CLntN6/iOc+DqUzBJx7L/hcjFkVBxj+J3cwu9PLdzS3Lr/8zUWvBMRa/sGHhl1ioDn2HmxTWWqhQ7Zso4ZiTP98B3TMmrw== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Add Variant From Url Route @@ -43,29 +43,347 @@ Add Variant From Url Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + + + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + base_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + config_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/admin-cancel-subscription.api.mdx b/docs/docs/reference/api/admin-cancel-subscription.api.mdx index 065d52e7f1..edc3d48fa3 100644 --- a/docs/docs/reference/api/admin-cancel-subscription.api.mdx +++ b/docs/docs/reference/api/admin-cancel-subscription.api.mdx @@ -5,36 +5,36 @@ description: "Cancel Subscription Admin Route" sidebar_label: "Cancel Subscription Admin Route" hide_title: true hide_table_of_contents: true -api: eJyVVMtu2zAQ/BVhTy1AWG7Qk051H0CMtIgRu70YRrCm1jZTilRIKqhr6N+LJWVbipMWPUkgd4fD2RkeIODWQ7GESVkpAwI+Kq2V2cJKgK3JYVDWTEsoALngXqKRpO99s/bSqZp3QUCNDisK5BjqAAYrggKs26JRvyPEvSpBgDJQwGNDbg8CHD02ylEJRXANCfByRxVCcYCwr7nfB8dMBAQVNC/c9gCzaQltu2IYX1vjyXPn1XjMn5LO7AqYN1KS95tGZ3ddMQiQ1gQygcuxrrWSETZ/8NxzOLNp27YV8P7q6hL4B2pVJjZfnLPuP1ChdixvUIl3SQGV5j8VqPKXBdrKwS6a/e0mij0UqxWnFWUCbclBu2rFcQ2dw31P0a82EYRWQOW3fxP/G3mPW4IT2OulUYxswbvt+Wy7fiAZBoNfxnulo7u61RnmLG9S9/VrfE7yvXTYseR6sZhdAKbZDof6KTo8m/ccnsVwZHe2CeycisLOciRq60N0f9hBAXlMSL5OAcr7EclTbECAJ/d0jEnjNBSwC6H2RZ5LbZtyhFsyAUeocqwVsL89ycapsI8tk9n0hvbXhCU5KJarfsGcvZXcMiw7DQprdUOsWxfQSRN21nWBOsZzl7pYGGU2NrZ3Gk4iuWwym4IAvkZSbDx6NxrDcx0HxRwLlDEWx7PjNohnKpzuDwKoipmAQFh9OG8wM1a+QtPD+/fYBvROmgT6FfJao4oZiGQO3USX6c0DAd1MeX7Dh6+b60rAjr1QLOFwWKOn7063LS+nx45HVyqPa82u36D2dMHn9HLAm7suIG8zEC/z/En7Fx/YJ9QNV0fnPKFTfGQ0ijgOlrmk9omUVIde18WLxSgnt89u5wto2z/tnx+a +api: eJyVVMtu2zAQ/BVhTy1AWG7Qk0510wIx0iJGnPZiGMGaWttMKFIhqaCuwX8vlpRfcdKiJwnk7HA4u8MtBFx5qGYwqhtlQMBnpbUyK5gLsC05DMqacQ0VIAPuJRpJ+t53Cy+dankXBLTosKFAjqm2YLAhqMC6FRr1O1HcqxoEKAMVPHXkNiDA0VOnHNVQBdeRAC/X1CBUWwiblut9cKxEQFBB88LNEWExriHGOdP41hpPnisvhkP+1HRQV8G0k5K8X3a6uO3BIEBaE8gEhmPbaiUTbfnguWZ7UBNjjAI+XlycE/9Ereqs5qtz1v0HK7SO7Q0q664poNL8pwI1/hygrTzZRbO5WSazT82KYr+iTKAVOYjzKHZr6Bxujhz9ZrNAiAIav/qb+d/Je1wR7MnehiYzijvejYez7eKBZDhp/CzdKx/d4+YHmoO92d23r/El2/faYTvI1d3d5Iww9/a0qZdpwovp0YQXKRzFre0CT05DYW05Eq31IU1/WEMFZUpIucgBKo8jUubYgABP7nkXk85pqGAdQuurspTadvUAV2QCDlCV2Cp4qW2UdotLhgIPvyfZORU2iW80GV/T5oqwJgfVbH4MmPLg5VE6he27iK26Jja1T++oC2vr+rTtsrvOVeyaMkubynuDe22fUT6S4bDzPbPs4eDDYPjWZfqCYjQZ9/lBmfKz05FgIF7YtTcKBFCTwgOBsPl02GCV3KIGzRHfv/t7InPvT6BfoWw1qhSWJGbbt36WH0cQ0DefG336QvYDMBew5qGpZrDdLtDTD6dj5OX8KnIba+VxoTkeS9SezvTsnxh4d9sn6X0B4nWdj7R59SV+Rt0xOk3RMzrFR6ahEbsms5ZcPpKS2nBUdfa0Mcs+FpOb6R3E+Ae6Ji4p sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Cancel Subscription Admin Route @@ -43,29 +43,254 @@ Cancel Subscription Admin Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/admin-create-checkout.api.mdx b/docs/docs/reference/api/admin-create-checkout.api.mdx index e786824d6d..aebd498ffc 100644 --- a/docs/docs/reference/api/admin-create-checkout.api.mdx +++ b/docs/docs/reference/api/admin-create-checkout.api.mdx @@ -5,36 +5,36 @@ description: "Create Checkout Admin Route" sidebar_label: "Create Checkout Admin Route" hide_title: true hide_table_of_contents: true -api: eJy1VV1v0zAU/SvRfQLJWsrEU54oHxIToFXb4KWqqtvkrjE4tmc700qV/46unbQJ3SYB4qmNfT/PPfd4DwG3HoolzKtGahDwViol9RZWAowlh0EafVFBAcgG69IRBlqXNZU/TBtAgEWHDQVyHGYPGhuCAozbopY/o/taViBAaijgriW3AwGO7lrpqIIiuJYE+LKmBqHYQ9hZ9vfBcRUCggyKDy5HAbOLCrpOHJJZhfrvM5BuG0agVKat1vezdW02Gw5xOLDOjD83rZeavB+f1W2DWobdWuFmcvFwcoJb0gHXKBnjob0FtzDuybdlSd6vW6f+HbzrFCz76hR03YpDeGu0J89e57MZ/1TkSyctA3x0uW1VdtUbcxNGB9KBzdFaJcs4j/y7Z5/9sZKu6zoBr8/PTwN/QyWrNMYPzhn3B1HBOuZkkKnuigJKxf9koMafGihTTm5R7y5vI0unQDHs/YnUgbbkoFt1YjhD53A3QvOzSQVCJ6Dx2+eA/0Le45bgEOxp0whGdsO33TG32XynMkyGvox9pdS93YhIR3gTuk+38T7B91iyweTjzc3iJGCa7XSo76IsZO96WciimmRXpg3MmoZCbVhDrPFJMkINBeRRUvJNUpycEbGUD9LicxDgyd0PysKbUEAdgvVFnsd1Oku7dIYyRyuBme2pbJ0Mu+gyX1x8ot1HwoocFMvV2OCaWZV4MjU7jAit/ESMWL+S8zbUxvUaNCxlnbwYEqlvTXTv0ZvH4rL54gIEcBsJq9nZq7MZ/I7gxJgXAsu4EEPueA3iNxQO/bOONXEbIBA2b44XXBnj3qAexXt+YJPSDngEegi5VSgj82Mh+36Wy/Q8gIB+mjy7OE/uZpgoCGCq1syCYgn7/QY9fXWq6/g4yRuPrZIeN4q5fovK00k9B72AF1f9WrzMQDxe5w/aPfoe3aNq2Tpu/3/I2D9K/zvN9J04Zlvxh5OcLjJfDExlgJPrvCzJhpHXifhylMPyLi6vb6DrfgGvJ8wB +api: eJy1VU1v2zAM/SsGTxsg1Fmxk0/LugEttqFBP3YJgoCx2VirLGmSXCwL/N8HSnbiNG2BbegpscSPx0fyaQsB1x6KOUyrRmoQ8FEqJfUaFgKMJYdBGn1RQQHIBsvSEQZaljWV96YNIMCiw4YCOQ6zBY0NQQHGrVHL39F9KSsQIDUU8LMltwEBjn620lEFRXAtCfBlTQ1CsYWwsezvg2MUAoIMig8uRwGziwq6TuySWYX63zOQbhtmoFSmrZYPk2VtVisOsTuwzow/67ZBLcNmqXDlxxe/jk5wTTrgEiXzOZQyY7hj/L4tS/J+2Tr1/0Rdp2DZrVPQdQsO4a3Rnjx7nU4m/FORL520TObe5a5V2VVvzEUYHUgHNkdrlSwj9/kPzz7bPZKu6zoB709PjwN/RyWr1LLPzhn3F1HBOp6/IBPuigJKxf9koMYfGyhTHtyi3lzexYk8JIpp70+kDrQmB92iE8MZOoebEZtfTQIInYDGr18i/ht5j2uCXbDnTSMZ2Q3fdvvcZvWDynDQ9HmsK6Xu7UaDtKc3sft8GZ8SfU8lG0zOb25mRwFTbw+behYlIDvrJSCLypFdmTbw1DQUasN6YY1P8hBqKCCP8pGvkrrkzIilfJARn4MAT+5hUBHehALqEKwv8jyu00napROUOVoJj1FN4212xqbAY++pbJ0MmxhvOrv4QptzwoocFPPF2OCaRy4N0aHZrn9o5RdiOvt9nbahNq4Xo2Fj6+TFfEl9Z6J7T22P7SOW96RZC7nOBHty8u5k8lwxvUM2nV30m4Nl3JwBRzQD8YiuHVEsbk1cGwiEzYf9BaPkBjWoR/Fe7uwBxB03gX6F3CqUcUUikG3f9Hl6M0BA33Zucmw8VzO0HgTwTNc8LsUcttsVerp1quv4OOkgt7CSHleKl+IOlacjPDthgTdX/f68zUA8jfOeNk8+Ug+oWraOMvEKGfuX6rXTHD4o+2wL/nCS08UtEMPUMsHJdVqWZMPI60ilOcpuy2eX1zfQdX8AZkzTOQ== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Create Checkout Admin Route @@ -43,29 +43,282 @@ Create Checkout Admin Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/admin-create-portal.api.mdx b/docs/docs/reference/api/admin-create-portal.api.mdx index 6a7fd47816..bf8be2b30c 100644 --- a/docs/docs/reference/api/admin-create-portal.api.mdx +++ b/docs/docs/reference/api/admin-create-portal.api.mdx @@ -5,36 +5,36 @@ description: "Create Portal Admin Route" sidebar_label: "Create Portal Admin Route" hide_title: true hide_table_of_contents: true -api: eJyVVEtv2zAM/isGTxsgxFmxk0/LHkCDbmjQZrsEQcDYTKJOtlSJLpYF/u8DJefVtAV2siGR1KfvoR0wrgMUMxhVtW5AwWdtjG7WMFdgHXlkbZtxBQWgFCxKT8i0cNYzGlDg0GNNTF6G7KDBmqAA69fY6L+xeaErUKAbKOCxJb8FBZ4eW+2pgoJ9SwpCuaEaodgBb530B/aCQQFrNrJwezIwG1fQdXMZE5xtAgXpvBoO5VNRKL12UgcF3LdlSSGsWpPd9cWgoLQNU8NSjs4ZXcax+UOQnt0RTdd1nYKPV1eXg3+h0VVC88176/9jKjgvxLJOuCti1Eb+NFMdLguMLc92sdneriLZ52R16rCiG6Y1eejmndqvofe4PWH0u00AoVNQh/Vb5P+gEHBNcBj2emkkI5vKbnc82y4fqOQz4WfxXunovm5+HHOkN7H7+jW+JvpeOmxfcj2dTi4GJm3PRf0SvZ1NorezGIjszrYsnqmJN1Zi4Gzg6HveQAF5TEW+TKHJhQ9HeUpHyEFBIP+0D0frDRSwYXahyPPS2LYa4JoaxgHqHJ0GcXWgsvWat7FlNBnf0PaasCIPxWx+WnAvjkoeOS87yINO35Cw1cdy1PLG+j5G+1BuUpfQoZuVje09c6MILhtNxqBArpF4Gg4+DIbwnL2zYgkDljEM+7PjNqhnLBzuDwqojkkAJqw/HTcEmbBeY3My7y2xzoAd2GD6w7kzqKPnI4xdr+MsvW6goFdSlItaitRJTVAgFt2I/sUMdrslBvrpTdfJcnraRLJKB1wa8fgKTaALNId3At7d9XF4n4F6GeVv2r74nD6haaU6OuYJvZYjo0HUXlDBktpHZUmOT7ou3ieZcnD45PZ+Cl33D53uFMw= +api: eJyVVF1rGzEQ/CvHPrUgfG7o0z3VTQsxaYlJ3L4YE9a6ta1Ed1IkXahr9N/LSuevOAn06Q5pdjWa2dEWAq48VDMY1Y1qQcBXpbVqVzAXYCw5DMq04xoqQAbcS0cY6N4aF1CDAIsOGwrkuMkWWmwIKjBuha36m4rvVQ0CVAsVPHXkNiDA0VOnHNVQBdeRAC/X1CBUWwgby/U+OOYgIKigeeHmqGExriHGObfx1rSePFdeDIf8qclLpyzjoIK7Tkryftnp4rYHgwBp2kBtYDhaq5VMbcsHzzXbA5sYYxTw+eLivPFv1KrObL47Z9x/dAXrWNigMu+aAirNfypQ488B2siTXWw3N8sk9qlYUexXVBtoRQ7iPIrdGjqHmyNFf5hMEKKAxq/eE/8neY8rgn2zt6FJjGLKu/Fwtlk8kAwnxs/SvfLRPW5+aHOQN6v79jW+ZfleO2wHuZpOJ2cNs7enpl6m2S4mabaLFIji1nSBZ6ahsDYcA2t8SHMf1lBBmVJRLnJoStbDUpnT4UsQ4Mk978LROQ0VrEOwvipLqU1XD3BFbcABqhKtgpeMRmm3uGQo8Mh7kp1TYZP6jSbja9pcEdbkoJrNjwF3PG55gE5he+/QqmtiKfvMjrqwNq7P2C6x61zFWql2aVJ5L2vP7SvKR2o54nzPTHs4+DQYvnWZvqAYTcZ9alCm1Ox4JBiIF3LthQIB1KTIQCBsvhw2mCXb02B71O89V08I7pUJ9CeUVqNK4Ug0tr3hs/wMgoDecrY4mc4zkW0HATzLax6Uagbb7QI9/XI6Rl7ObyDbVyuPC81hWKL2dMZm/6DAh9s+Nx8LEK+zfKTNq+/uM+qO0Wl6ntEpPjINi9iZy1xy+UhKsuGo6uwh4y77KExu7qYQ4z/fhSNb sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Create Portal Admin Route @@ -43,29 +43,254 @@ Create Portal Admin Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/admin-report-usage.api.mdx b/docs/docs/reference/api/admin-report-usage.api.mdx index 8d1f6b5339..6863ec0003 100644 --- a/docs/docs/reference/api/admin-report-usage.api.mdx +++ b/docs/docs/reference/api/admin-report-usage.api.mdx @@ -5,59 +5,72 @@ description: "Report Usage" sidebar_label: "Report Usage" hide_title: true hide_table_of_contents: true -api: eJxdUk2PmzAQ/SvRO1sh7ZFT01OjPTTadE8IrSbObHALtmubqBTx36sxbLqBCwK/53kfMyLRNaKssL90xkLhq2lbY6+oFZznQMk4e7igBAngNbB3Ib32ka4MhcDROxs5ohzxebeT14WjDsYLESVOvdYc41vfbp4XMBS0s4ltEjh53xqd5xQ/o3BGRN1wRyjHSR61uvI5a9i8LBo6To0Thd7FBAVPqUGJIgsuzrOfIisuZvlQiBxuHMT5iD60KNGk5GNZFLp1/WVLV7aJtmQK8gZTLQzdB5OGTNkfD088fGO6cEBZ1R8BJxE/J/IIG5EGzxKlN088QMFSJ9/7PjUumL85BCgYcdnMLLFv7JvLdJPajM/iNvvjAQpiY85lt/203WGd1gNYciedc3+fnY+hVinc/UOBOzJylpi6L/8PRJlE3pH9cN+qnAct9wAS/0mFb8lYTMvkcemtmhcNCktzIu2+bbm9WqGRqssK43imyC+hnSb5/bvnIAXVCjcKhs4SV1VP6j1N6e4XD+Jba/ayCTdq+7mU1R5Kp/fdOn4//cA0/QMXMBU5 +api: eJx1kkFvnDAQhf/K6p2tZdsjp5Jeusqhq2xzQiiaNZPFDRjXNqtSxH+vxpBNslK4IPCb8TfvzYRI54C8RFF3xkLhzrStsWdUCr1jT9H0dl8jB4ngybPrfXwaAp0ZCp6D623ggHzC191OXjUH7Y2TQuQ4DlpzCM9Du3lYxVDQvY1so8jJudbodE/2O0jNhKAb7gj5NMujblo+JIbN48rQcWx6IXR9iFBwFBvkyBJwdlrmyRJxtuBDIbC/sJfJJwy+RY4mRhfyLNNtP9RbOrONtCWTkTO4JSjS6ea7SDFX0k4P3sQx9SsO+3sefzDV7JGX1XvBUSZb7PoomxBHx+KzM/c8QsFSJ9/FEJvem3/JISgYAWiWKvHG2Oc+lZvY8hvbHekXtjUUZM4Fe7f9st19NsxasCkO+zUg0imgV44kg7qx62oUFLgjI2eRqfv2diCUkk1H9l2/mxQ/MF3NiPw3Zq4lYzGvN09rwOWykVBYIxa061qmmCuFRnYiLzFNJwr86Nt5lt9/BvYSVqVwIW/oJNaV1axenZUcX3iUubVmJytzoXZYArpZWMn3uoSHn8dfmOf/GkgjyA== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Report Usage - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/admin-switch-plans.api.mdx b/docs/docs/reference/api/admin-switch-plans.api.mdx index 88b6454739..3c52fe7f2d 100644 --- a/docs/docs/reference/api/admin-switch-plans.api.mdx +++ b/docs/docs/reference/api/admin-switch-plans.api.mdx @@ -5,36 +5,36 @@ description: "Switch Plans Admin Route" sidebar_label: "Switch Plans Admin Route" hide_title: true hide_table_of_contents: true -api: eJy1VU1v00AQ/SvRnEBaxaHi5BNBIDUqqFEbuERRNLan8Zb1rru7LpjI/x3NruM4TVsJJE5JZufzzXuTPXjcOUjXMC8qqUHAR6mU1DvYCDA1WfTS6EUBKSA7bN1P6fNyWyvUDgTUaLEiT5Zz7EFjRZCCsTvU8neI3coCBEgNKTw0ZFsQYOmhkZYKSL1tSIDLS6oQ0j34tuZ45y23IMBLr9hwPUo4WRTQdWIoxq38ewXSTcXj58o0xfZxti1NlnGKwVBbM/6ZNU5qcm5sK5sKtfTtVmF28vDrzII70h63KBngw3hLHqHrNty4q4125LjXi9mMPwpyuZU1zw4p3DZ5Ts7dNWpy0ztzfqM9ac/uWNdK5gGq5N5xzP44f9d1nYD3Fxfnib+jkkVE+LO1xv5FVqgtc8XL2HdBHqXib9JT5c4dlMlPXlG313eBQKfr4S33Fqk97chCt+nEwYbWYjtiyRcTG4ROQOV2rxHqKzmHO4Ih2cuuAYzJil+7Y22T3VPuT6i2DnPF0r3faMdHeCO6L4/xKcL3XLGDy+VqtTxLGHf7hC1BrhMmmJsEiU9uTOOZMhX50rCwa+N8kLIvIYUk6DzJ4hlIgtCTqHoQ4Mg+HsTeWAUplN7XLk2SwPBppPcUZYK1BGa0o7yx0rchZL5cXFF7SViQhXS9GTvcMpsiP07dhtVgLa+IkeqVP298aWx/Fg4noIxRDIXUdyaE96jNQ3OT+XIBAniMiNFs+m46g6fInTizEDAPQjjUDs8gnqAwzM+npQoqAE9YfTg+cGcMeYV6lO+VRZ30NYDh6Zfn7chA99DFvt/hOt5qENBvkbfbH+x+kxsBJa89XcN+n6Gjb1Z1HZvjCeVlFdJhppjZd6gcnTUyXAd4c9OL4O0ExPMN/qD22T+GR1QNewet/4eK/b/DscyGf1jJdQIDxYExPHKMmec51X4UdXb8OMugn+X17Qq67g9LL30T +api: eJy1VU1v2zAM/SsGTxsgxFmxk09LtwENuqFBm+0SBAFjs7FaWXIluasX6L8PlB0nadoCG7CTbYkfj+R79BY8bhxkC5gUldQg4FwqJfUGlgJMTRa9NHpaQAbIBiv3S/q8XNUKtQMBNVqsyJPlGFvQWBFkYOwGtfwdfVeyAAFSQwYPDdkWBFh6aKSlAjJvGxLg8pIqhGwLvq3Z33nLEAR46RUfXB0ETKYFhCCGZAzl3zOQbiouP1emKVaP41Vp1msOMRzU1hx+lk2FWvp2pXDtDi+eTk5wQ9rjCiU3c1fKjOGGsGSQrjbakWNcZ+MxPwpyuZU11wkZ3DR5Ts7dNiq57o05vtGetGdzrGsl89iW9M6xz3ZfawghCPh4dnYa+CcqWXTd/GqtsX8RFWrLvPCyw12QR6n4TXqq3KmBMvnRLer26jaS5XgUPNH+RGpPG7IQlkHsztBabA8Y8c10ACEIqNzmLfJ8J+dwQzAEe900NiOZ823Y5zbrO8r9Ea0Wsa4udW93MON9e7vuvl7Gl659LyXbmVzM57OTgN1sn7ElSjNhgrkkyjm5No1nylTkS8Miro3zUba+hAzSqOl03Uk+jaJOO4WDAEf2cSfsxirIoPS+dlmaRoaPOnqPUKZYS3iOZhJvk89sCkx3R3ljpW9jvMlsekntBWFBFrLF8tDghqnWkefYbJgb1vKSuI39Cpg0vjS23w+7XVB2XtwnqW9NdO9b2mM7x/yeNK8nrrODPR59GI1fK6Z3SCazaa8YzKNidjiiGYhn7RoaxfuminIBT1h92l8wSp5Nhfog3hsTPcI3NMbTk+cxyqiLiGLbD3vRLXAQ0I+badBv8X7kSwEl8yNbwHa7Rkc/rAqBj7u9yoMrpMO1YgnconJ0AmRYI/DuulfL+wTEywDvqX3xb/GIqmHruBT+Q8b+l7FPs+QPKzlPZKPYsYdL7nwmeU61P/A62ZIcZRDa7OpmDiH8Aa0BhEs= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Switch Plans Admin Route @@ -43,29 +43,273 @@ Switch Plans Admin Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/agenta-api.info.mdx b/docs/docs/reference/api/agenta-api.info.mdx deleted file mode 100644 index 7ebb8f7847..0000000000 --- a/docs/docs/reference/api/agenta-api.info.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -id: agenta-api -title: "Agenta API" -description: "Agenta API" -sidebar_label: Introduction -sidebar_position: 0 -hide_title: true -custom_edit_url: null ---- - -import ApiLogo from "@theme/ApiLogo"; -import Heading from "@theme/Heading"; -import SchemaTabs from "@theme/SchemaTabs"; -import TabItem from "@theme/TabItem"; -import Export from "@theme/ApiExplorer/Export"; - - - - - - - - - - - - - -Agenta API - -
- - - - - - - -
- - - - - - - - -
- Security Scheme Type: - - apiKey -
- Header parameter name: - - Authorization -
-
-
-
-
-

- Contact -

- Agenta: [team@agenta.ai](mailto:team@agenta.ai) - - URL: [https://agenta.ai](https://agenta.ai) - -
- \ No newline at end of file diff --git a/docs/docs/reference/api/agenta-backend.info.mdx b/docs/docs/reference/api/agenta-backend.info.mdx new file mode 100644 index 0000000000..d2ad3ad8d7 --- /dev/null +++ b/docs/docs/reference/api/agenta-backend.info.mdx @@ -0,0 +1,73 @@ +--- +id: agenta-backend +title: "Agenta Backend" +description: "Agenta Backend API" +sidebar_label: Introduction +sidebar_position: 0 +hide_title: true +custom_edit_url: null +--- + +import ApiLogo from "@theme/ApiLogo"; +import Heading from "@theme/Heading"; +import SchemaTabs from "@theme/SchemaTabs"; +import TabItem from "@theme/TabItem"; +import Export from "@theme/ApiExplorer/Export"; + + + + + + + +Agenta Backend API + +
+ + + +
+ + + + + + + + + + + +
Security Scheme Type:apiKey
Header parameter name:Authorization
+
+
+
+
+
+

Contact

+ Agenta: [team@agenta.ai](mailto:team@agenta.ai) + URL: [https://agenta.ai](mailto:https://agenta.ai) +
diff --git a/docs/docs/reference/api/apps.tag.mdx b/docs/docs/reference/api/apps.tag.mdx index 80bc87791b..a11d2d7c56 100644 --- a/docs/docs/reference/api/apps.tag.mdx +++ b/docs/docs/reference/api/apps.tag.mdx @@ -5,16 +5,9 @@ description: "Apps" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-evaluator-revision.api.mdx b/docs/docs/reference/api/archive-evaluator-revision.api.mdx deleted file mode 100644 index 3e59a50051..0000000000 --- a/docs/docs/reference/api/archive-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-evaluator-revision -title: "Archive Evaluator Revision" -description: "Archive Evaluator Revision" -sidebar_label: "Archive Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJzNWduO2kgQ/RVUT4nkDLOjffLTsjOJZjbZDJrbPiA0KuwCOrHdTl/IEuR/X/UNMAYWGJB4GgZXneo6Vd1dPsxA4UhC3IOPE8w0Ki4k9CPgJQlUjBd3KcSAIhmzCb1SsHkVNGGS8QIiKFFgToqEgZlBgTlBDE3TV5ZCBKyAGEpUY4hA0A/NBKUQK6EpApmMKUeIZ6CmpQGRSrBiBBEMuchRQQxaWxTFVGYM5otuPfgorbsUqqpvwGXJC0nS4F1dXpo/KclEsNLkBTE86iQhKYc6az14Y4gg4YWiQhlzLMuMJZaG9jdpfGZLayyFIUkxFyHh2jn5pbNC0YjE0lqvrUUEKQ1RZwriyypaQ5MNXEzvh5bNepCF9QQFw0IZTmv224mrorlFobMMDE9NKl8ctmUygp9cfB9m/OcJQv7joVciLrI8RXYrWZ0gGxfh+HTVWUKh2BCTYwboeMgQQasxF0cDd2hVBCkq2hHVmH5QLKet0DcGsIogJylxtBV7G8zf3r2KYJjZU3HzTmTyNdFS8XxtsAHnGWGxNdqdbF07hCoycPOufwvivM096FjnWLwF8NYCVFUUjPjgGyVq3RH8yXLWxLOFUVhfBaYpM+cqZt0arzvULZystUj5oP7NcnrrY0HCRKIzFO8+6Sz7S/Liw71WpVbvYTVZA8IU5Tt6oRA43Ursii806N3epgqtR6NFz4nUr/wLk+p/ad2UZMN9P46eXCv6YeSw4+Ar2mOnPjQcBnWzBFFFkAhCRekrqqMeg9cOttWxZOkyPUWQZwfrg6SU0QmC3DhYHyTQNZge8a4LZP059bdd4OuoUQJb8yiBsKNGCXTNo0xINEfJ3dv1xbtXEchMjw6FeTS+5h46WqKeQ1y9Tep38/Gy14IdivIsmEPIDkfIDMKYMLXvVvud9Kei5PwaYsts8kBDElQktdMmLLS/141y68tQhdfUXStyRnfyWQ46e9Tg0RNvJkosS1bsOgCtUrzPtBUC2cKbS/zg7nfeVV0xOdf57Sx7ZbNzd0GpKRSJCUtoF3ad8rRHD3royipFQzbSTic7RazrWoCdXsKCDHaD9iWh8S62D8Zb/eeiWlUZv9+vrpoa3AtmLLX5tT4KwcXhAlxKCpm9bH1XrhpkPKk93WdXLd0VrpEXaX/hCYbBPpejderlGoHBmWw2tWS0nszTdZwvlNOezcuF9nY1ySjQ69jdnMaNo29bgW+fnroNQFfbelE7Ti5uNdVZsFrAmBtRueRSWflYjSGGdmkEUPrZnusgsh0kUdmerZWTq7YXpsFt+SBB26ELxkqVMm63k4zr9AJHVCi8QNbGktldJinRgqmpdel07z7T1F3yEPf6ywb22nE9VDeblw9L9pkMm178dloX++Uaw4vebpCzDLNiyK170Mbs4lqd7h0sDe9wefHbxSU02F02NpsFE7tZQmz7GKIVFub5QwSU250CijD/Y/HArMwUxUtGAW9bMVfejT0div5V7TJDViyNwK7OPfB1hiWdV9qO9rWGCOJNPx6EcvcjGJvuiXswmw1Q0rPIqsp8/UOTMBXtewF2YPjtzSBl0nxOIR5iJqmx8vmhA+8e/N5631rcXvWMQtULU3KzVPMfRPCdpht/+bBHyDj018zbdpKESrWE0jjxTCPOt0z3/vEJquo/GhLXQw== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-evaluator-variant.api.mdx b/docs/docs/reference/api/archive-evaluator-variant.api.mdx deleted file mode 100644 index 16be9417a2..0000000000 --- a/docs/docs/reference/api/archive-evaluator-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-evaluator-variant -title: "Archive Evaluator Variant" -description: "Archive Evaluator Variant" -sidebar_label: "Archive Evaluator Variant" -hide_title: true -hide_table_of_contents: true -api: eJzNV01v20YQ/SvCnBJgY6lGTzxVtRNYTVoLsZIeBEEYkSNxkyWX2Q+5isD/XuxySYmipNqOAvTkD868N/NmdndmCwZXGqIpvF2jsGik0jBjIAtSaLjMRwlEgCpO+ZrmVNvM16g45gYYFKgwI0PKoWwhx4wggo7lnCfAgOcQQYEmBQaKvlmuKIHIKEsMdJxShhBtwWwKh6GN4vkKGCylytBABNZ6FMONcAZNyL3PFUlvlEBZzhy2LmSuSTu468HA/UhIx4oXLimI4MHGMWm9tKL3MRgDg1jmhnLjzLEoBI+9Bv0v2vls90IslFPI8IohlrZyCpHz3NCK1F6oN96CQUJLtMJANChZVyTPm2/ul17KNsfOmCdtu/NylayxyK0Q4OTpCuiEY/Ao1delkI8XpPg7QAYGVIYvMTYXZBgGyMCwFL6hTwvJ9Ty22sjsaAALKQVhfpZxpHs3FULJHFxTmh9BbGoRQFObYf4jgHceoCxZbSQXXyg2x87PO69ZF69kkJHBdhSYJNydChTjlq6narkHW5+LFlO2aP9nP73jXBBzFVuB6tU7K8QfWuZv7q0prHkNh8k6EG4oe6IXKoWbs8Ie+EJH3nPOfzoxnUenRf9Pov4lP3Bt/lPWU0l23J+n0aRqxfCQPEmBbgjOt2TtK/9lULd7ECWDWBEaSuZonnh9JWjojeE+ntMsNxVsb+jFskXyM0g+VbCBJCFBP4HktoINJLVci80FL/xarN834cqv9booS61Ww1ILdlGWWq6GRQu7emmvPjhf93pcLDw/Tz3hAQnz17En5BnuzSBWls7t1+vr7tz2GQVP/FTWe6uUVC8f2hIyyIWfCKoH4tBAyLj19Tl38aw8eFN2WX+QVYCuUpleHRt4d++F1rii3QV62tSL0Zu4r8ck3w3bU59XRR3s9gq+k7dS93Qat5V85+p7N5mMO4BVbdtFHVb7Ra8z0IMfQFLplpBC6mrfMClE0C8UrTk99pvhS/fDFK3722PrR9kPawww0KTW9cZilYAIUmMKHfX7sZA2ucIV5QavkPex4P5EaIqt4mbjXYbj0Xva3BEmpCCazvYNHly7VQ3UNmtqhwV/T07KsCsNrUml4t+rrghLUlp5Oa14vpTevR54fXC94XgEDFwalYiDq1+uBtCRdt/YnRSM/Umpuf1nYAcqNPkDA8r8MQFDmP22++AicyUJU2qNd6aSB69xUMPQP6ZfCOT+QPgwtqHIUwhFhr1dSbukQ6GBQXRi06xrPWOQusaJprDdLlDTJyXK0v37myXlyjkLeAsn7nQLCdfu9wSiJQpNnbib6wZefQyn6nVvNyG186lLnm982MK6v4DBV9qc2pL93ZHWvbUNpsM4psLsgXSuOteEzWEZ3z9MoCz/BcJVcY8= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Evaluator Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-evaluator.api.mdx b/docs/docs/reference/api/archive-evaluator.api.mdx index 1948975256..21c7c75940 100644 --- a/docs/docs/reference/api/archive-evaluator.api.mdx +++ b/docs/docs/reference/api/archive-evaluator.api.mdx @@ -5,36 +5,36 @@ description: "Archive Evaluator" sidebar_label: "Archive Evaluator" hide_title: true hide_table_of_contents: true -api: eJzNV9uO20YM/RWDTwkwWbuLPump7m6CdZN2jazTF8NY0BJtTTq6ZC5uXUH/XnB0sWTZW+92A/TJtkQekoec4XEBFrcGgiW836FyaDNtYCUgy0mjlVk6iyAA1GEsd/RIjQ0IyFFjQpY0exeQYkIQQGvxKCMQIFMIIEcbgwBN35zUFEFgtSMBJowpQQgKsPucfY3VMt2CgE2mE7QQgHMexUqr2KBNcTSLoCxXjGnyLDVkGOZ6MuGPiEyoZc7JQwAPLgzJmI1To8+1MQgIs9RSatkc81zJ0Nc6/mrYp+iklmtmwsoqQpi5yqnOWKaWtqQ7Kd54CwERbdApC8GkFAdSfLx0f7/xlPWxN8o34ryBNI+hMzZL+kZ1KussU4QplKJ9lDqlgFlqkpuZ0U2FUAqGO5PX8xDbptSgsUsw/S+Adx6gLEVjlK2/UmhPzcEHz9kQrxSQkMV+FhhFkruMat7jdZBnPYcd2KbPvUjJuv+kW97pWBBKHTqF+s0Hp9QvJkvf3TubO/sWjotlEGkpudALtcb9k8Qe+cKA3qecf2Uy2WMwov8nUn/LPklj/5XWc0UO3J/H0aIaxfoivIiBYQrsW4r+FfYyqNsORCkg1ISWoke0TwF2rt4ILb2z0udzPspNBTuaerJcHn2PIF8q2DpIRIq+Q5DbCrYO0tC13vMeuyyOX1aXkPXz3u+vA1+vGqVhq43SEPaqURq62ihGue1LZ/WBfXl7vFp6Xh9csEBO7Y5L/FopUZZs/+P19VB5/I5KRl5XjN5r7TXTC2VHRBal8hqgWgnHBioLe2+fc/uuyqMtcij3U1YlyL1JzPaUVDtsCGNwS4cr87ypJ2O04LenuD7IxKWvqwpd23VafKC3Yvd8GbcVfU819m6xmA8Aq972mzqtlHBH9XipEWcsk/PMWK+MbQwBjHNNO0l/jluZZcZFVx+X41pXgwBDetdIaacVBBBbm5tgPA5V5qIr3FJq8QrlGHPpR91Q6LS0e+8ync8+0v6OMCINwXLVNXjgqarmpG/Wtghz+ZGYsVrET52NMy3/rppfq/i48mJKZLrJvHvN3tQnN5rOZyCAy6i4mlz9cDWBAYNdYz4QGPoD0cT2r0EcsdDWDwIo8acBLGHy0+EFZ8YdqOVng3eiYUfrtWbB0l92nCuUft59+KLu5RLqXkJHzBsQEBz932kauhIQ8zAESyiKNRr6olVZ8uNvjjT3bCVgh1rimhlcFhBJw98jCDaoDA2SbK8OePO5PiFvRwd900++6WvKTeUM+RcI+IP2x//R/PmPm8EpapNpGFJuO86D64onrB38+f3DAsryHwt44zI= +api: eJydVdtu2zAM/RWDTxsgxFmxJz8t6wIs6IYGbbaXwChYmYnV+qJKcrbM8L8PlC9xbhiwpzjWIXV4DknX4HBrIVrDfIeZhVhAqcmgU2WxSCACNDJVO3qiHWYVutKAAI0Gc3JkOLCGAnOCCAbEk0pAgCogAo0uBQGG3iplKIHImYoEWJlSjhDVgMX+fuOzuL3mLNYZVWxBwKY0OTqIoKpUAo04RTSxAKdcxq/m/dXBIoGGTwxZXRaWLF9yM53yT0JWGqW5NIjgsZKSrN1UWfDQgUGALAtHhfPUtM6U9EqEL5Zj6hFxbVgnp9obZFm1QR1HVTjaEmvVU7z1iEYcZLpYfvn8QtLBhdLGEhRVlkETN404iztIve5YXdJpqLhpOMnHm5tzgX5iphJffjA3xhv/n+ok5FBl/KQc5fYckJXy6PRaV4wk6BVu4oMIaAzuR9p9K1uCLHtutyN/hi7rod/JWtwSDMmuQ70YwYpP/2UA19Ve3eFGXhzkbdW9XsaXVr5Ll/WQr6vV8ixh6+2xqbN2nIP5aJxzcmnJs65L6/x4uxQiCLWhnaJf4dCxNqzHQ96E3XIAAZbMrt8HlckggtQ5baMwlFlZJRPcUuFwgipEreCMlT8NbhnqB9uSrIxye59vtlzc0f4rYUIGonU8Bjxyy7VNdAwb/EOt7ojl7NbUrHJpadSftjO6PZW2UayXKjalD++k7bh9RvlKBS82rrOlPZ18mEyvFdMFBLPlopsclH5yeh4eBuJErkEoEEC5HxtwhPmnwwGzZKtyLMb5Ljh7RGxQxNFvF+oMlR8Mf33dmb6GznQYLSoLAqKT7d47HwtIuWuiNdT1M1r6YbKm4ddvFRn2LxawQ6PwmdVc15Aoy88JRBvMLJ2RHHYMvHvoRul9AOIy+d7jgg1mhvwPBLzS/vSL5BdF2jdR3UFmUpJ2o+CzvcbdNkzI8v5xBU3zF7ymeKI= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Archive Evaluator @@ -43,29 +43,955 @@ Archive Evaluator as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + evaluator + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + data + + object + + +
    +
    + + anyOf + + + + +
    + + service + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + configuration + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/archive-query-revision.api.mdx b/docs/docs/reference/api/archive-query-revision.api.mdx deleted file mode 100644 index 2d75cabce2..0000000000 --- a/docs/docs/reference/api/archive-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-query-revision -title: "Archive Query Revision" -description: "Archive Query Revision" -sidebar_label: "Archive Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJy9WVFz2zYM/is+PK13bJz19uSneU17zdomWZJmDz6fj5Zgmy1FKSTlxPPpv+9AUooUyYrjuXtJZBn4AHwgCRDeguVLA6MJ/JWjFmhgyiDNUHMrUnUewwi4jlZijbP7HPVmpnEtjEgVMMi45gla1KS/BcUThBE0xWYiBgZCwQgyblfAQON9LjTGMLI6RwYmWmHCYbQFu8kIwFgt1BIYLFKdcAsjyHOHYoWVJECebgbXwcLgPIaimBKwyVJl0BDWu9NT+hejibTIKBYYwU0eRWjMIpeD6yAMDKJUWVSWxHmWSRG50IffDelsa/5lmoixwluI0twrBbeFsrhEXfPzvZNgEOOC59LC6LRgz+hxRtXmcuEYbBrwkmuuBVeWeGzI9pNVsEpC5VIC8dOk787jOvYYHN9KE9/HcuwYPDbXVix4dEznxwGytJDbVaqPBu7RCgYxt7gnKom+tSLBXugzAiwYJGgMX/Zi98F8DeoFg4V0x0Mdh8exoB3C5VVjvbYszdNUIld1U6XxacHKV+n8O0a215+PzgkXl+UHOtMOu9ywDcvJvPmmHkO3LYiEjnLJ9S8fcyn/NKl6e5nbLLdvoCtGYTHZU4trzTf9xDR14VWsfiUySePwDP8PpF6kX4SxL9K6K8iW+us4ug0Lz9e2w3bTBXe7tlmLDoM6q0EUDCKN3GI84/aop8h7DzsYO7LyLP4ZRr552GAkRok/wciZhw1GSrrmx6xEJVl/lOWo5OuoVkq2KislYUe1UtJVWVmjbncp+y/Xu6BeMDAyXx4Kc0O6BYPjBRo45M+rSbMBexAqTh8Iu0dI4QOa467aCw9ZMEhlfGzwSw9JZxo+7gv9IqEXhFUwkCIR3aCdheEZyhenTXHrGF/ot1DlCV1buIlQxf4dnbDhw7SXAwdPK0pZ1GsuD/b4vAQoGOhd3Vy7ALZwrl3j1ipNTwJ/V2uxDUNtmpAW9QtL1V/rfCNb3UmAq/iporbpdd+mdK1RKTmk/BuVaqhnLl2KiMvL0kLhrlW+sjvboe3Z7dxCoIy7boFVr+MECgY/cHPoSfIZN/62I/N9y/mrG5oy0qKjj+tudvw9eP+m5M65X7BGQl/eKcLQTdzMKI/1ApYmGdfCpKqWvd0oeE/Zd3+XtB6kdU/oHunv3D6oOv5FnqAW0V7gxnJtzYNwgwJUcflIV3QuFAWQcButkJ6k+IF1QzcObS87Qvn1PBMNV6lV3Et/xcmBFW+ReSai/RDwURhrghfhQw3nA71BFWEXWPs8K4VqswZKt1si1RbctfMibnBmUBlhxbp7W3Tc5NqNEDc4uKlgaq4suDRYMMBHuqW7BB5s5QNhDL46jJaJnvPzFh/tZeCC8JsUcNldAvbxaCzlqzzxi+zJk91JDTIdWE8ztEk4OBsbOhy87hSurpllhXgD0+dHU4euqcc0mfYFVCF3laYePTfDKad4Z9xdRg/W/y+61SywKEjnt3fv2qPDOy5F7AaDgw9au6124NwwRsuFbNTEpoBMox0V8+Ui1ZPaL6l30M1RzLKv1NbmP15kt6gjY3BL3760UCkubzrINUtaoNezuzuMM09fX3I/3d5etQB9bptJHfvJ9qA5UAY3Z1qlNPvOUmPdpNuuYATDjOa2+DC897PyYTnGNcNta+xdDMPgHBgY1OtyTJ5rCSNYWZuZ0XAYyTSPT/gSleUnXAx5JtwpYDDKtbAbpzK+Ov+Mm0/IXVc8mdYFbmiZ+YXTFKtyxjNBfU85xAjzR/GPXw1hOL/yWoVrihepUy8POOfcYHx1DrUbIZye/HpyCi1K68KubEduh5S23dfAnrFQxU8VMnHbAyzy5PenL8gzykbCVR1vVwafDVsCFRYf7TCTXLhd4HzYhuROICQX/LRauB6jSjAwGHX9slHmeMpgRWtlNIHtds4NftOyKOi106KshSn7nEidbCEWhp7jUDJaLlfHC/xyHXbRm8FTp94MpUy1ojyH9hYg9ModP8m4g2JVLqhtkBtHEWa2htA612jlVZvj6vLmForiX5yb9dA= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-query.api.mdx b/docs/docs/reference/api/archive-query.api.mdx deleted file mode 100644 index 3b17664746..0000000000 --- a/docs/docs/reference/api/archive-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-query -title: "Archive Query" -description: "Archive Query" -sidebar_label: "Archive Query" -hide_title: true -hide_table_of_contents: true -api: eJy9V0tz20YM/isanJKZjal6euKpatxM3KS1Eiu9aDQeiITETZdceh9qFQ7/e2cflEhJdmyN05MoLoAP+IAFwAYMrjWkc/hkSXHSsGAga1JouKyuc0gBVVbwDd3dW1JbYFCjwpIMKafWQIUlQQr+9I7nwIBXkEKNpgAGiu4tV5RDapQlBjorqERIGzDb2ulpo3i1BgYrqUo0kIK13orhRjgB59d2dJ1D2y6cPV3LSpN2Ji7HY/eTk84Ur53DkMKtzTLSemXF6HMUBgaZrAxVxoljXQue+fiSr9rpND23auWiNzwgZNIGpegtrwytSfXce+slGOS0QisMpOOWBTI8VrW9WXmahnZXwrPeF8A8584nFNOB6F4i+rCUUhBW0LJDEttFy7pXcvmVMtMXqqwQ4DjsXH/nnWgZlGTwTGc6ZHZE0QC5XA7f9GM4jQUZV5kVqF69s0L8rmX15saa2prXcCpGbqh8ohYqhdvHiRnqwrNY/cOR6TTOz/D/QOqf8iPX5ru0PhTkkfrzOJrFwgu940kMHLvgdFs2vP3nmbrqmWgZZIrQUH6H5jGDvY6Vo6E3hnt/HkZ5G8yOJp4sW+c/AuRLMBtBchL0A0CugtkI0tG19O3/aTi+xz+FrF9D69/z9aIoHVs7lI6wF0Xp6NqhaGHX59bqrdNtGbyce360Ht7eg/l7wsB3dXbTt22d7M+Xl8fD+i8UPPejePSbUlKdP6lzMsiFe4qj4FBAyGxw+pyu25urYXrsQ/0og4N+jur1qc1mPxm0xjXtW+XDop6M0cydnuJ5v1XNfVwBOsr1UrunN7D7cBhXgb7Hkvp+NpseGQy5HSZ1EhbG0ae4MJZkCuk2yVpq4xdIU0AKSa1ow+mf5D5snknT7ZBtEndOYKBJbbpV0yoBKRTG1DpNkkxIm1/gmiqDF8gTrLmva02ZVdxsvcpkev2Btu8Jc1KQzhd9gVtXSqE4hmK7vGDNP5ALIS65E2sKqfi3kPG46RZBy/HAq5X06pGyiXduNJleAwMXRiBofPHTxRiOaOsLu1uAmb8FHbY/BnbAwi5+YEClvwJgCMtf9gfOM0d9iVXf3kGWDuZoZMDQvyapBXJf4B66iQmcQ0wghIXX3TMGae9DoMvigkHhUp/OoWmWqOmLEm3rXsdFeb5gsEHFcelomzeQc+2ec0hXKDQdebdrEvDqc7wLr0f7DWbodZfMyoW5QWHdP2DwN237Hy7+lhddpTTxeJJlVJue4lFTciW1K/Hpze0M2vY/CKGL/A== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-simple-evaluator.api.mdx b/docs/docs/reference/api/archive-simple-evaluator.api.mdx deleted file mode 100644 index f77fe7d837..0000000000 --- a/docs/docs/reference/api/archive-simple-evaluator.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-simple-evaluator -title: "Archive Simple Evaluator" -description: "Archive Simple Evaluator" -sidebar_label: "Archive Simple Evaluator" -hide_title: true -hide_table_of_contents: true -api: eJzNWEtv20YQ/ivCnBKAsVyjJ56q2gnsJq2F2M5FEIzRciRuunxkH2pVgf892AcpUrRcSbYBneKIM9/MfjO781iDxoWCeAIflygM6kIqmEZQlCRR8yK/SSAGlCzlS3pUPCsFPVItChGUKDEjTdKCrCHHjCCGRuKRJxABzyGGEnUKEUj6YbikBGItDUWgWEoZQrwGvSqtrtKS5wuIYF7IDDXEYIxD0VwLK9B4OrhJoKqmFlOVRa5IWZiL83P7T0KKSV7aM0AMd4YxUmpuxOBrEIYIWJFryrUVx7IUnLkjD78rq7NuuVZKS4jm3gIrjFcKHvNc04Jky8VLJxFBQnM0QkN8XkUbUpy9fHU7d5R1sefCxWO3AFePzChdZF2h4MqsKARhDlXU/JQbIcCyVDt3owaXHqGKLNwOvw5DbIISQFOTYf4SwGsHUFVRLVTMvhPTLZLvXDY2hj855vqoVQQZaez6gknCbaxRjDvs9rwN2diCraPdsZTNur+0D/m0LWBcMiNQvvtkhPhDFfmHW6NLo9/D9pEtCNeU7amFUuLqWXq3dKFH8nPKf1oyrUYvUU+J1L+KL1zp/6V11yF76odxdO9TMTyHezHQd8HqVlH3ITsO6qoFUUXAJKGm5BH1c4CtBzhBTR80d/7stnLpYQcjR5Ypk7cw8uBhg5GEBL2BkSsPG4zUdM1WtprtZ8eVrH3I+n3lqtiGr1e1UrPVWKkJe1UrNV2NFSXM4thcvbO6toa8mnvh5LhdA7p1dUlSveCKfQvqNpKSH4vyILlHEMcjCIuQEiauJzvsfX4rSk4vIZ7pK77SnCTlrPNG1I5OD6oD1yEMVd3n7huRE6qkJ9meHBCDu0C87QOxLHm+b9uyTfEhPVJtyAXelt6js99rV91J61S7rpPMld3K4w2lNlAkl5zRPuz60fWAHAzQlZs553xh/HT9FrYuOwYOGKCu0DX2vflpf4SXaTeDeVVZrV8vLvpz/DcUPHEnG3yU0m0gjhziE9LIXZkN+bgtIArW+XrIfWpVCZ/Cm0N/KRjWjXimFk8tPjaTllK4oE1O7xZ1ZAzu7denGN8sXSbuXN50kGuX7IZez+7uY1x5+p4L7/X9/bgH6GPbDerIr5cGPh9aqwQ3uaeFXUGVhdJu3aRTiGFYSlpy+mfoN1LDZoWhhuv27qkahtUV+Otdr6lcgwWp1qWKh0MmCpOc4YJyjWfIh1hyd6MUMSO5XjmV0fjmM618QYd4Mm0LuBLjs6Yr1gQMS/6ZLH9hQTYyOi0k/8+nQtiQ+abNccrzeeHUA5cj59xgNL6BaNOXwfnZL2fn0OOzLWyvBzJ3PWrb7jNEWyw054cIKHN3AzRh9tvmg/XMBiKsdmq83eHbml0DGZr+1cNSIM9bza6P7ARCZG3AHB60FmcKIoi3dot1gKcRpDZH4gms1zNU9CBFVdmffxiSNobTCJYoOc4so5M1JFzZvxOI5ygU9bxtHhZ49zXcn/eDTW3qnqKOc26DbD20/4MI/qbV9j7UvQ5pnUjrIDJijErdUu49Zjbjmvswvr27h6r6CRGYeTw= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Simple Evaluator - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-simple-query.api.mdx b/docs/docs/reference/api/archive-simple-query.api.mdx deleted file mode 100644 index 8c03d4270a..0000000000 --- a/docs/docs/reference/api/archive-simple-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-simple-query -title: "Archive Simple Query" -description: "Archive Simple Query" -sidebar_label: "Archive Simple Query" -hide_title: true -hide_table_of_contents: true -api: eJzNWFFv2zgM/isBnzbAa3rDPfnpeuuG9ba1XdPtHoIgUGwm0SZLriSnzQL/9wMl2bFrJ02DDriX1pHFj+RHiqK5AcsWBuIxfC1QczQwiUDlqJnlSl6kEAPTyZKvcGp4lguc3hWo1xBBzjTL0KIm6Q1IliHE4N5OeQoRcAkx5MwuIQKNdwXXmEJsdYERmGSJGYN4A3adk5yxmssFRDBXOmMWYigKh2K5FbSBzFsPLlIoywnhmVxJg4Yg3p6e0r8UTaJ5TnZDDKMiSdCYeSEGN2EzRJAoaVFa2s7yXPDEuTn8YUhm0zAr10SC5V5DogovFKzl0uICdcO8d25HBCnOWSEsxKdl5MlwuuT6au5oauN60prv23SUUb0iCyGAXK80XpJsGbXdPg7qvAFRRpBoZBbTKbP7ABuhSpnFN5Y7e3ZreedhB2eWlBR5+juUfPOwQUmKAn+DknMPG5RUdM1c3h+mxyX3IWT97XN+y9eLaqnYqrVUhL2oloquWosRxeLYXB2RbBnBy5nnbZoLVwebkCxNOZ0JJq5bp7ajdKaUQCabWipPJmVULanZD0zsXlM+OCNI5HhjuhxW1aqlOZu1V5o+9OuChOukEEy/ulSfubH/GCXfXBU2L+xreI6XHXF4Fkm3gaMMLfv/cvShEOJJhrjF7EAppjVb70+etuzzSP1CZFIBYI9Jbd9Y91ym6p7I23et4T2aly25lx6yjECJ9KXBrzxkGYHEh0Ohn6wrl4RVRiB4xvtBe5PuEcpnJ01+6xT1fttQFhm1cswkKFO/Ru1B+DHZy4GDp8IqLeoVE0dbfFEBlBFoZvsbnO7h6uDckGzZyeLthn/rXOzCUEXnwqJ+IlV9q6u0byBD7wZMptuT16XXvVXU/klFBkm/IpWGZuTUgidMXFUaStd++qrhdIfTv9u4OUeR9jXJ9ZF3G8oIfuL62Av1E1JZgRUTxaG96LOLZeVp2VPO+gup/0w4vH59d+aXUSugT58UbuhDxUwpjs3uS2U509wo2YjebhS8o+i7vwvKB2HdE7pH+juz97KJf1lkqHlyELixTFtzz913FMq0eqRPGcYlOZAxmyyRngT/iU1FI4d2kB4ufT5PectUuqoPkl8yMmDJOmSe8+QwBHzgxppgRfjRwHlPKygT7APr1rNqU+ObjMLtUqQ+grtOXsIMTg1Kwy1f9R+Lnqav28Uzg4NRDdMwZc6EwTICfGCJnboAHq3lPWEMvjiMjoo99fMWH+xV4ILw2xQw0X8FHGLRmRDPssQn2daS3UENe3qwtiOGcSicrQMdCq+rwnW3Vd0Qr2HyuDT1yJqmT+PJPodq5L6raY+cm3Lc4IobruQ5cz3Zc+RHbkbjUI6XrOclZUkSf7592x2vfGeCp254MnivtTtmR85WUrSMi9Z92N4gVLLjtnz6gtoT1s/KG+g+Jcxi3zX7BY1hC9x21Lu3OjIGt/T2qSQlv7zqsK99nQV6Pbu73Tj39O0L7cfb2+sOoI9tO6hnftI38Lkw+BomfRnapaJJYK6MdZM/u4QYhrnGFcf7oR8MDu/8AHG4qWaA5TCMDiECg3pVjQoLLSCGpbW5iYfDRKgiPWELlJadMD5kOXdn3mBSaG7XTuTs+uITrj8icz3weNLcMKLE8qnS3lZHieWcupyoGlKeFXapNP/l4x8mlUsvVboWeK6ceFXOnHGDs+sLiIDc8HSdnvxxcgodEpub3SWd2O2sL7yG6BELtf90H2buQIBFlv21fUGWUQQyJpt4/TF7NBUMRFh8sMNcMO6y3lmwCeEcQwgnBcthgR9gctdYxI3BbhXVSQRLyoh4DJvNjBn8pkVZ0nIYfI4n1FdqzmZE43gDKTf0nIYroWNmXULg1U04Ka8H2068bX4VXEn+hvYVIPTC20G0qwHLKnM24fVZkmBuG4KdkkUpVmf+9dXoFsryPzkJ5bE= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Simple Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-simple-testset.api.mdx b/docs/docs/reference/api/archive-simple-testset.api.mdx deleted file mode 100644 index c50b4aed50..0000000000 --- a/docs/docs/reference/api/archive-simple-testset.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-simple-testset -title: "Archive Simple Testset" -description: "Archive Simple Testset" -sidebar_label: "Archive Simple Testset" -hide_title: true -hide_table_of_contents: true -api: eJztWEtz20YM/iscnJKZjeV6euKpatyM3aS1J1J60Wg8EAmJmy4f2YdaVcP/ntkHKVK0bNmRZ3rwyTIJfAA+YLEgtqBxpSCewZSUVqQVzBmUFUnUvCyuU4gBZZLxNd0pnleC7rQXBAYVSsxJk7QAWygwJ4ghvL/jKTDgBcRQoc6AgaRvhktKIdbSEAOVZJQjxFvQm8pqKi15sQIGy1LmqCEGYxyK5lpYgeBjdJ1CXc8toqrKQpGyIBfn5/ZPSiqRvLLeQwwTkySk1NKI6HMQBgZJWWgqtBXHqhI8ccGOviqrs+04VklLhebeQlIarxT85YWmFcmOg++dBIOUlmiEhvi8Zg0hzlqxuVk6svrIS+GycFggQ+WITzBEuxMMzizKUhAWULP2UWGEAMtT494VqmjaotTMw0pMfhTTQ9Q2WC9WLr5Sooep++ACHeLVDHLS2PcC05TbxKC47ZEx8DMUTge2SU3PUr7oP+mGd78tSLhMjED55oMR4ndVFu9ujK6Mfgv7oVoQrik/UgulxM2DxO7pwoDch5T/sGRajUFd/Z9I/bP8xJV+lNZDQQ7Un8bR1Jdi6FtHMTB0werWrN91ngd12YGoGSSSUFN6h/ohwE6vTFHTO82dP4etvPew0diRZar0JYx88bDBSEqCXsDIpYcNRhq6Fht78Rxnx90ux5D168ZdOTu+TmqlYau10hB2UisNXa0VJczqubU6sbo1g9O5FyLH/Tugfw02V+AdT/eaVmi9j7twfANubsroOnV94sD921oeuhrGoBNR1J1+GJwWe9Livvad177zon3n1D3jntn56BnnngG36X7zJ80SzVz7OnAdMXC9TvovMOkPr85XUp9N6qUl87HPWTsLPGugOOpL+TOtueJl4V0ZfjA/gDBxi5qA8yO67cqkrq3OzxcXww3LXyh46vYn0W9SlvL565WUNHJhfx0YqUSZ9N4+pZDn+4nahfyp9A661qRW9w2Ru8OmFK46WT8s6siIpvbtfXzvlmEzF5c3HeQ6NbOj17N7OIxLT99Dyb2aTm8HgD63/aSO/cov8tUQTduVX046K+1SsCqVXwHqDGIYVZLWnP4Z+R3hKAy/arTdjcH1KCwSwQ6vct2sDY0UEEOmdaXi0SgRpUnPcEWFxjPkI6y4O0OKEiO53jiV8e31R9pcEaYkIZ7NuwITW12+Xvpibaqw4h/JMhcWlmOjs1Ly/3wRhJ1l5rUsNbxYlk49sDh2zkXj22tgYMPwnJ2f/XR2DgMmu8L2YGDiDkZj270GtsdCGz8woNydCtCE+S+7F9Yzm4Qciy7eocTtLSgCFZr+1aNKIHfF73zYhpzOIOTUpsuhQbvKVMAg7u15m9TOGWS2MuIZbLcLVPRFirq2j78ZkjZ7cwZrlBwXlsvZFlKu7O8U4iUKRQNP22YCbz6HM/M22l0E/QiaDBc2vWsUxv4HDP6mTX8z7fpB1hTQNgiMk4Qq3VEdtC9bae0ZuL2ZTKGuvwPsevUe -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Simple Testset - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-testset-revision.api.mdx b/docs/docs/reference/api/archive-testset-revision.api.mdx deleted file mode 100644 index f861d45d3a..0000000000 --- a/docs/docs/reference/api/archive-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-testset-revision -title: "Archive Testset Revision" -description: "Archive Testset Revision" -sidebar_label: "Archive Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWUtv20gM/isCTy0wjbPBnnRab7NFsu02QePmYhgBLdHWdEePzoy86zX034t5KZZlO47rAHvIKY5FfiQ/cjgUvQKNcwXxGEaktCKtYMKgrEii5mVxnUIMKJOML+hBO4kHSQuueFkAgwol5qRJGogVFJgTxLAp+MBTYMALiKFCnQEDSd9rLimFWMuaGKgkoxwhXoFeVgZCacmLOTCYlTJHDTHUtUXRXAsj4N2Nvngb0XUKTTMx0KoqC0XKoF2cn5s/KalE8spEBDHc1UlCSs1qEX3xwsAgKQtNhTbiWFWCJ5aAwTdldFZrHlbS0KO5s5CUtVPyjvNC05zkmqfvrQSDlGZYCw3xecN6FFmzxfJmZnnsmgiyC5QcC23Y7Ejvp6xhrURRCwGGo00S7x2y5ZDB6e108UM8p4/D4aPUfIbJKQ0MPWSwUOuslCcDd2gNgxQ1HYhqRN9pntNe6EsD2DDISSmc78XeB/OXV28YzITtF7urNUNlO0WC/gz2DE7LUhAWey1eoYpGLUrDHKzE5GcxHURjytCJldNvlOh+Z/lgA+3jWTY1dr3ANOWmXaC47ZBxANmhYXQs5dPuN+vhbbcFCZdJLVC++VAL8acqi3c3ta5q/RY2QzUgXFN+oBZKicu9xG7oQo/c/bWl0Wr06ur/ROrn8hNX+kladwXZU38eRyNXiv5+Pe4Mf0bbK7p34XFQl2sQDYNEEmpKH1CftHe9d7DR0JJVV+lLGPnqYL2RlAS9gJFLB+uNBLqmyxNeUIGs35f+igp8ndRKYKu1Egg7qZVAV2tlQbI/Ix1ervdevWGgRD0/FubO6DYMTheo5xA3b5P++GeuwQeebrQ/38SfduHwVh7u3Og6VWFW23KTt5a3T6ovNdmdFvuuxX3tYK8d7EU72Kl7xpYp/OBpacuoHLrf5FlTSZiQX0e3A0a313eGF3hn6F+dr6QeTeqlIfOpF2MzCxw1UBz0zh2Wec6V/qv34Qg/p92uBZvGaP16cdHfIt6j4KndEUZ/SFnK41eIKWnkwnzaMVaJMuk8fU4xTzaT9Rj0p9I5aNuTmm8bJLcsgJzIblFLRjQyT7cx/rj5Hdu4nGkv11kZBnodu7vDuHT07Uvv1Wh02wN0ue0mdehW3dHmdhlsA89Ksw6vSqXt6ltnEMOgMitc+mfgZ181CCtdNVhtWYQ3A79OBzPOykVYnddSQAyZ1pWKB4NElHV6hnMqNJ4hH2DF7alSlNSS66VVGd5ef6TlFWFKEuLxZF3gztSaq56uWJs4rPhHMjz6pb3bQvL/XEn4dX3mtAxRvJiVVj1sLa1z0fD2Gtbe0OD87Jezc+jxui5sjgkm9pgE2/YxsA0W2viBAeX2jIAmzH97fGA8MwnJsVjH253GjfWHJ0PTv3pQCeT2MFgvVj7DY/AZhnZzrWwd+ywDg3j7Dx4h0RMGmamZeAyr1RQVfZWiaczX32uSJpcTv3SfGmbHK0i5Mp9TiGcoFPW8bhsNvPniz9Pb6PGi6EYT8l2YZC9Q1OY/YPA3LXf8VmObRhbqauUlh0lClV7D6PU4U4DtMbm9uRtB0/wA0hUIpA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-testset-variant.api.mdx b/docs/docs/reference/api/archive-testset-variant.api.mdx deleted file mode 100644 index 3be2d9b923..0000000000 --- a/docs/docs/reference/api/archive-testset-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: archive-testset-variant -title: "Archive Testset Variant" -description: "Archive Testset Variant" -sidebar_label: "Archive Testset Variant" -hide_title: true -hide_table_of_contents: true -api: eJzNV01vGzcQ/SvCnBKAsRyjpz1VjRvYTdoYsZyLIRgj7khiyv0IOXSrCvvfA36spNVKiuMoQE9a7c68N/NmSA5XwDi3kN3DmCxbYgsTAVVNBllV5XUOGaCRC/VIDxwtHh7RKCwZBNRosCAm4xFWUGJBkMGO3YPKQYAqIYMaeQECDH1xylAOGRtHAqxcUIGQrYCXtUewbFQ5BwGzyhTIkIFzAYUVa2+Qgh18ihSD6xyaZuKRbV2VlqwHuzg/9z85WWlU7dOBDG6dlGTtzOnBx2QMAmRVMpXszbGutZIh++Fn631WWwHWxmvDKjLIykWnFLcqmeZktgJ9EywE5DRDpxmy80bsChRYy+WHWRCxy9CaqrxrdVyoRqwtSqc1eGl2pfOSCUDDaobylASjBJkYZjo02OEUF2hDa0lMdesFMa0qTVgeZb1COxivURoRYQ3KH8WMEI0vWzSrpp9Jcr8Z34ZE+3iNgIIYu1FgnivfYqhvOmIcKsAWbNtkHaZi2n2znd5+LpDKSKfRvHjrtP7DVuWrD45rxy9hN1UPopiKJ3qhMbg8KuyOL/TEPeb8pxfTe/T66v8k6l/Ve2X5m7IeSrLn/n0ajWMrph35SQr0Q/C+jejun8+DutyCaARIQ8iUPyA/cc/JkekVqxDPYZY3EXYwCmK5Ov8ZJHcRNpHkpOknkFxG2ETSyjVdnnCXbsX6bZn26Vavk7K0aq1ZWsFOytLKtWax2s2f26u33rcRcLrwwnDyzeMjjTL7DpAnO68nmqbxTr9cXPQHoE+oVR7Gm8HvxlTm+dNPToxK+6d0OOwa6Ep2vn7PPjxpds6TTc7vqxigr1Jh5/vmxs1ZYS3OabN5HjYNYgzG/us+wTcz633IK1Inu61ib+SN6h5O4zLKd6y6V+PxTQ8w1rZb1FEc0Qc7czGE0WNR+SnenyEiTuAZDGtDj4r+Gab50g7TLGqHq/743gzTFQAEWDKP7bzvjIYMFsy1zYZDqSuXn+GcSsYzVEOsVVgGlqQzipfBZXRz/Y6WV4Q5GcjuJ9sGt77PYud0zdZFw1q9I69hummMHC8qo/6L7ZAuGYvo5UVS5awK7u1oGoIbjG6uQYBPI6p3fvb67Bx6mm4b+yWCMiyRljt8BrGjwjp/EEBFWB/AhMWvmw8+srqyXGC5jXewhDsHcNKC6V8e1hpVWAchiFUq7z2k8sL6rmF9wqnEICDbe0drqzwRsKgse6DVaoqW7oxuGv/6iyPjCzlJaFMv6/0KcmX9cw7ZDLWlXszrHQZefEwL6eVgMxB1c2mLXS5D0Nr5fyDgb1ruv12GzWLR9tQqGY6kpJq3IHp7m2++9fq4uRtD03wFGhApvw== -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Archive Testset Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/archive-testset.api.mdx b/docs/docs/reference/api/archive-testset.api.mdx index 6be77a582c..84425b6c21 100644 --- a/docs/docs/reference/api/archive-testset.api.mdx +++ b/docs/docs/reference/api/archive-testset.api.mdx @@ -5,67 +5,834 @@ description: "Archive Testset" sidebar_label: "Archive Testset" hide_title: true hide_table_of_contents: true -api: eJzNV9tu20YQ/RVhnhJgYylGn/hUNW5gN2ltxEpfBMEYLUfipstL9qJWJfjvxV5IkaJlO44D9EkSd+bMzJnhzlENBrcakiUsSBtNRsOKQVmRQiPK4iqFBFDxTOzozgQLYFChwpwMKedZQ4E5QQLx/E6kwEAUkECFJgMGir5aoSiFxChLDDTPKEdIajD7ynlqo0SxBQabUuVoIAFrPYoRRjqDmNzkKoWmWTlEXZWFJu1Azmcz95GS5kpULm1I4NZyTlpvrJx8isbAgJeFocI4c6wqKbivcvpFO5+6l1ilHAdGhAi8tMEp5isKQ1tSvQTfeQsGKW3QSgPJrGEtIT5asb/eeLKGyBvp6T9tkKH2xHOM1R4MYzLrspSEBTSse1RYKcHx1KZ3iXqy6FAaFmAV8u/FDBCNKzaYlesvxM24de99oWO8hkFOBodZYJoK1xiUNwMyRnnGwenBtq0ZRMrXwyf98u6PBVwobiWqV++tlL/psnhzbU1lzWs4LtWBCEP5E71QKdw/SOyRL4zIfcj5d0em8xjN1f+J1D/Kj0KbR2k9VeTI/ds4WoRRjPfWkxgYp+B8Gza8dZ4HddGDaBhwRWgovUPzEGDvrkzR0BsjfD6no7wLsJO5J8tW6Y8I8jnAxiApSfoBQS4CbAzS0rXeu8XztDh+uzyFrF/2fuUc+HrRKC1bXZSWsBeN0tLVRdHSbp87q7fOt2Hwcun5lf7o+rhvczzu1W3+pnHWP52fj4XCnyhF6mXA5FelSvV8lZCSQSHdt7gOjg1kyQen33LzrpqjDXIo9mMZEnR9yfX2Pl112A5a45YO1+VpU0/GZOFO72P6oOmWvq4QOtr12nugN7B7uoyLQN9Dbb1cLG5GgKG3w6bOg2SdLDrJmpPJSqdmq1IHCWsySGBaKdoJ+nsatZqe1gcZ20yj9AUGmtSu1btWSUggM6bSyXTKZWnTM9xSYfAMxRQr4QdcE7dKmL13md9cfaD9JWFKCpLlqm9w6+YpTMjQrGsOVuIDOa6i0p5bk5VK/BvaHsV2FrwcGaLYlN498jb3yU3mN1fAwJURWJqdvT2bwYi7vrF7FZD7V6GN7Y+BHbHQ1Q8MKPfvARjC/OfDgcvMsZ9j0ccbtepopUYODP1jppVE4efcB69jF5cQuwid5tbAIBn8IWlbuWKQuRFIllDXa9T0WcmmcY+/WlKuWysGO1QC1467ZQ2p0O57CskGpaZRgt11Aa8+xbfi9eSgZ4aJtx0tXDt3KK37BQz+ov3wL5R/47N2YOpoMOecKtNzHV1QbrK6Yb+5vl1A0/wHM+W/Ag== +api: eJydVU1v2zAM/SsGTxsgxFmxk0/LugENuqFBm+0SBIUqM7Faf6gSnS0z/N8HyrLj1C0G7BTHeqQeH/noBkjuHSQbWKMjh+RgK6AyaCXpqlymkIC0KtMHvKcOAQKMtLJAQsuRDZSyQEggnN/rFAToEhIwkjIQYPG51hZTSMjWKMCpDAsJSQOyPN7sfA46Gs7hyOpyDwJ2lS0kQQJ1rVNoxUtEuxVAmnJ+FahHyxRafm/Rmap06PiKi/mcf1J0ymrDRUECd7VS6NyuzqPbAAYBqioJS/LEjMm18hrEj45jmhFtY1kh0t0Nqqq7oMBQl4R7tHAieOkRreglerX06uERFcGkrHHxZZ3n0G5bTvUi6iTyJjCaKjTU2rac4uPFxVSanzLXqS88+mptZf9flxRJ6pyfNGHhpoC8Umenb03DSIBe23Z7kkBaK48j3b5VHUEWvHD7UWeG6eqh39E5uUcYkr0N9WJEaz79l/xcV3d1wI06cZK3U/ftMr508r12WQ+5Wq9Xk4Rdb8+buugsHK0HCxdIWcXuNpXrLE0ZJBAbiweNv+IwqS5uTrZu47AKQIBDe+j9X9scEsiIjEviWOVVnc7kHkuSM6ljaTRM+PjT6JKh3soOVW01HX2+xWp5jccrlClaSDbbMeCOh60bn3PY0Dlp9DWykGEtLWrKKqv/dDMRNlPWRbFSutxVPjyIGrh9luoJS15lXGdHez77MJu/VUwIiBarZfCMVN4zPQ8PA/FCrkEoEICFNwwQyuLT6YBZcpsKWY7zTXp6RmvQg/A3xSaX2hvCX96Edm8gtBuG1eRAQHK2yfuebwVkPCvJBprmQTr8YfO25dfPNVru3FbAQVotH1jHTQOpdvycQrKTucMJwWGvwLvbYJ/3EYjXiffdLbm1B5nX/A8EPOHx/NvjV0PWD08TAAul0NAodLLJeMoGV6xu7tbQtn8BJEpv6w== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Archive Testset - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/archive-workflow-revision-rpc.api.mdx b/docs/docs/reference/api/archive-workflow-revision-rpc.api.mdx index 0c356843c1..6ee704bb22 100644 --- a/docs/docs/reference/api/archive-workflow-revision-rpc.api.mdx +++ b/docs/docs/reference/api/archive-workflow-revision-rpc.api.mdx @@ -5,67 +5,1999 @@ description: "Archive Workflow Revision" sidebar_label: "Archive Workflow Revision" hide_title: true hide_table_of_contents: true -api: eJzNWdtuGkkQ/RVUT4k0MV5rn+ZpvXYie5ONLd/2ASGr6Cmgk55L+mIvQfPvq74BwwALBEs8YZiqU12nqrt6jqegcaQg7cE/pfw+FOWrgn4CZUUSNS+L6wxSQMnG/IWeX4PJs6QXrnhZPMuKQQIVSsxJk7RAUygwJ0ihbc0zSIAXkEKFegwJSPphuKQMUi0NJaDYmHKEdAp6UlkMpSUvRpDAsJQ5akjBGIeiuRbWIK66cxeCdK4zqOu+xVZVWShSFu7s9NR+ZKSY5JVNDFK4N4yRUkMjOnfBGBJgZaGp0NYcq0pw5njoflPWZ7qwxEpaljT3EVhpvFNYOS80jUguLPXCWSSQ0RCN0JCe1kmbJBe3mNwMHZXNGDPjF5QcC20JbZhvZq1OZhaFEQIsSy0enzy0ozGBwwdq4s8yeoNMfASUmg+RHTKF8wAZIxg9LuXBwD1anUCGmrZEtaYfNM9pI/SlBawTyEkpHG3E3gTzd3CvExgKd3is71iunplRusxXBhuUpSAsNka7Vp0Lj1AnFo5eUBjUawjfEvHjDMSDjk2Oxa8AXjmAuk6iUTn4RkyvOKg+OcracK4uGpuLwCzj9vRBcdugdYuyxfOnESkfNH9ZzG51LGBcMiNQvvtkhPhLlcWHG6Mro9/Dcq4WhGvKt/RCKXGykdclX2ixu7lLNTqPVoceE6lfyy9c6f+ldV2SLffdOHrwrRgG9n6nwVd0p05ztO4HdbkAUSfAJKGm7Bn1QU/BCw/bOXdkmSp7iyCPHjYEyUjQGwS59LAhSKRrMDngqItk/TkJwy7yddAoka1ZlEjYQaNEumZRXki2b1zbt+tTcK8TUMKM9oW5t752DB0s0cAhLk+T5mg+XPZG8n1RHiX3CGJ/BGERxoSZe//Y7aR/K0qOryE2XE3uaEiSCtY4beJC+ztNlKtQhjq+y21bkSOayUd50dmhBveBeHujxKrixbYXoGWKd7ltxUCu8HaI79393rtuqgrHen87yl5Z73w7p9QWiuQLZ7QNu16e2aEHA3Tt9JQhHxkvJ71FrItGgG3ewaJWdInuHaH1KrYDxC+6z3SnurZuv5+dtWWqJxQ8c8l1PkpZyv01qow0cjdpQ0suG4iSNZ7usqUWBoXv4nnWX0qG8Vafq9EqfW+FuOBN1ps6MjoP9ukqyufaYs/l5UMHu4YgFen17K5P49LTt6m+Vw8Pty1AX9tmUc+9pNpp6ZfgdIBxaXXXqlTayat6DCl0K6sR0ms3imaqG0VD1Z2uUlvrblBuwW/2KNC66xaMta5U2u0yUZrsBEdUaDxB3sWKu/2liBnJ9cS5nN9ef6aJH++Q9vqLBm7g+AZqms1qhxX/TJbKIA17kYv/9F0RNGF/hXP08mJYOvcoirnFdc5vr2Hh2g6nJ7+dnEKL2kVju1OQuZ0SY7vHkCyxMMsfEqDcbRPQhPkf8wd2ZbYkQSuKeBsqufRSHNjQ9K/uVgJ5sXD39UXuQSgyzLVR5Zo5FBoSSNcI67HW/QTGtnHSHkynA1T0KEVd259/GJK2nP0g7A4sub0pZFzZvzNIhygUtdY9O27g3V3YVe8786HVzCeWvLD1tjqb/QYJfKfJun8KuLNjHHtrGkzPGaNKL4C0jjrbhLPNcntz/wB1/R+GFYkO +api: eJydVcFu2zAM/RWDpw0Q4qzYyadl3YAF3dCgzbZDYBSqzMRqbUuV5HSZ4X8fKMuOUzcbsFOU6JF6fHxkGnB8ZyHZwE9lHreFeraQMlAaDXdSVcsMEuBG5HKPd88BcmdwL61U1Z3RAhhobniJDg0laqDiJUICA0hmwEBWkIDmLgcGBp9qaTCDxJkaGViRY8khacAdNIVaZ2S1AwZbZUruIIG69lmcdAUBbkLuaJlB26aU0mpVWbSU5WI+p48MrTBSUxmQwG0tBFq7rYvoJoCBgVCVw8oRnGtdSOGrjh8sxTQjZtqQJk52LwhVd0GBsKwc7tCMGF56RMsGGfwT1eF66zUKcer+AYUbhfVd6AuElg3gqi4KaNO2ZZPwo6KbwC09n3Mov20p1/uLi6laP3ghM69F9NkYZf5fqgwdlwWdpMPSTgGFEie3E5GCG0ZK9HK36VELbgw/jJT8qjqC1IPS7l5zVw/9htbyHcKQ7DzUixGt6fZffaC6uqcDbtSSo7yduufL+NTJ99pjPeTLer2aJOx6e9rURTfHUW+IaHAZgxJdrmjYtbLOz7TLIYFYk3/xOb7nFuN+Adi4d7WNm9Gct3FYFcDAotn3G6E2BSSQO6dtEseiUHU24zusHJ9xGXMtYULV30aXBAUacIuiNtIdfL7FanmFhy/IMzSQbNIx4JZ82DnrFDY0lWt5haRxWFSL2uXKyN+dXcKqyrsoElFWW+XDg96B20cuHrGirUR1drTns3ez+bliQkC0WC3DOHHhx6nn4WHAXsg1CAUMsPSzBA55+eF4QSypbyWvxvn+0u4TgoMyDn+5WBdc+qnxNJrghA0EJwAD8gIwGNwAxy1H5+R08/eWSBnk5K1kA01DKb6bom3p56caDTU2ZbDnRvJ7knnTQCYtnTNItrywOGE9bCR4cxMG720E7PVq+uZX1Pk9L2r6Bgwe8fDiz8pvlbw3VxMQCyFQu1HsZAmSC4cxWl3frqFt/wCO9opx sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Archive Workflow Revision - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/archive-workflow-variant.api.mdx b/docs/docs/reference/api/archive-workflow-variant.api.mdx index 03cbc2b65e..5be93e8fde 100644 --- a/docs/docs/reference/api/archive-workflow-variant.api.mdx +++ b/docs/docs/reference/api/archive-workflow-variant.api.mdx @@ -5,67 +5,1008 @@ description: "Archive Workflow Variant" sidebar_label: "Archive Workflow Variant" hide_title: true hide_table_of_contents: true -api: eJzNV9tu20gM/RWDTy0wjdJgn/S03qRFvO1ugsbtPhhGQEu0Ne1Io84lWa+hf1/MRbZl2W6aukCfchF5DnnI4XBWYHChIZ3AP1J9mQv5qGHKQNak0HBZjXJIAVVW8Ae6f4wm9w+oOFYGGNSosCRDymGsoMKSIIVdw3ueAwNeQQo1mgIYKPpquaIcUqMsMdBZQSVCugKzrB2ENopXC2Awl6pEAylY61EMN8IZtPEOPgWOwSiHppk6aF3LSpN2aBfn5+5HTjpTvHYZQQp3NstI67kVgw/RGBhksjJUGWeOdS145gVIPmvns9qKsFZOHsMDQyZtcIqB88rQgtRWpJfegkFOc7TCQHresJ5EnrZa3sy9jl2KtS3Pu2bHtWrY2qKyQoATp6eeU40BKsPnmJkTMgwjZGSYC99nh5Pk+j6z2shybwAzKQVhdZRxpAeXAaFhDo4eUFg0Uv0I4ps1SAAtbInVjwBee4CmYa2RnH2mzOzp7Ldesj5cw6Akg90gMM+561cUtx1ZD5VyC7bt2A5TOev+Zzu7/VyQcZVZgerFWyvEn1pWr26sqa15Cbu5OhBuqHyiFyqFy6O67vhCT91jzn85MZ1Hr0N/JVH/lu+5Nt+U9VCSPffv02gcWjEO+Ccp0A/B+TasO4yfB3W1BdEwyBShofwezROnV46GXhnu4znMchlgB0Mvlq3zn0HyMcBGkpwE/QSSqwAbSVq5ZssTzvtWrD+WceK3ep2UpVVrzdIKdlKWVq41ixZ28dxevXO+7vI4WXh+0/n2/REXo303yNO91wtS0ziv3y4u+vvUJxQ899vS4I1SUj1/mcrJIBd+HQjXw66BkFnn6/dM4mmzc6Nskn4vQ4CuTqVe7NtDN7eF1rigzfg8bOrFGIzd132Kb3bgic8rUEe7rXJv5A3qHk7jKsh3rLzX4/FtDzDUtlvUYVj6B7t7Nvjto5DuYVBLHR4BpoAUklrRA6fHpN1XdRKXW52s9jwJmiQ+LICBJvXQPiKsEpBCYUyt0yTJhLT5GS6oMniGPMGa+8OgKbOKm6V3Gd6O3tHymjAnBelkum1w53otdE/XbF04rPk7cjrG58vQmkIq/l9oifhwKYKXE4pXc+nd21XXBzcY3o6AgUsjKHh+9vrsHHq6bhu7Y4KZPyYtt/8MbEeFdf7AgEp/RsAQlr9vPrjIXEHiftriHS7jzj0cxTD0r0lqgdwfBh/FKlZ4ArHCsHm/aJdyrDIwSPc//dpCTxkUrmfSCaxWM9T0UYmmcf/+akm5Wk4j3MwpO1lBzrX7PYd0jkJTL+r1oIEXH+J5ejnYbEbdbNp6V0sftbDuL2DwhZYHXq1+aBRtX62i5TDLqDZbGL0Z5xpwfUxub+7G0DT/A3FdSl8= +api: eJydVcFu2zAM/RWDpw0Q4qzYyadl3YAG3dCgzbpDYBSqzMRqbcmV5HSZ4X8fKMuOMzcYsFOU6JF6fHxkGnB8ZyHZwE9tnreFfrWQMtAVGu6kVssMEuBG5HKPD68B8rDnRnLlgEHFDS/RoaEcDSheIiQQ7h9kBgykggQq7nJgYPCllgYzSJypkYEVOZYckgbcoaJI64xUO2Cw1abkDhKoa5/FSVcQ4L5LHS0zaNuUMtpKK4uWklzM5/SRoRVGVsQfErirhUBrt3UR3QYwMBBaOVSO4LyqCil8ufGTpZhmRKwyJIaT3QtC111Q4CuVwx2aEcFLj2hZL4J/QR1utl6gEKYfn1C4UVSvfigPWjZgVV0U0KZtyybRRzk3gVl6NuVQe9tSqo8XF1Op7nkhMy9E9NUYbf5fpwwdlwWdpMPSTgGFFie3E4mCE0ZC9Fq36VEKbgw/jHT8pjuC1IDS7t5yVg/9jtbyHcKQ7DzUixGt6fZfbaC6uqcDLh17t5e3U/d8GV86+d56rIdcrderScKut6dNXXTTG/V+iO6H6S3R5ZomvNK2m2aXQwJxZXAv8TV+5BbjfuptHBxt4+Y44G0ctgMwsGj2/SaoTQEJ5M5VNoljUeg6m/EdKsdnXMa8kjDh6W+jS4ICjbZFURvpDj7fYrW8xsMV8gwNJJt0DLgjE3a2OoUNHeWVvEYSOCyoRe1ybeTvzithR+VdFCko1Vb78CB24PaZi2dUtI6ozo72fPZhNj9XTAiIFqtlmCUu/Cz1PDwM2F9yDUIBAyz9IIFDXn46XhBL6lrJ1Tjf+V6f8BuEcfjLxVXBpZ8Yz6IJNthAsAEwICMAg8EKMKw3OiYn+773Q8ogJ1slG2gaSvDDFG1LP7/UaKiracjySBpvGsikpXMGyZYXFiech10E727DyL2PgL1dS995dfBki5q+AYNnPJz+Q/l1kvfGagJgIQRWbhQ62X7kwGGAVjd3a2jbP8qKgps= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Archive Workflow Variant - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/archive-workflow.api.mdx b/docs/docs/reference/api/archive-workflow.api.mdx index 9b7e347ed3..88c5714e4a 100644 --- a/docs/docs/reference/api/archive-workflow.api.mdx +++ b/docs/docs/reference/api/archive-workflow.api.mdx @@ -5,67 +5,598 @@ description: "Archive Workflow" sidebar_label: "Archive Workflow" hide_title: true hide_table_of_contents: true -api: eJzNV01v2zgQ/SvGnFqAjd1gTzqtN2kRb7sbo3G3B8MIaGlssaVElRw66xX03xekvi07ddMU6Mm2NPNm5s2Q85wD8a2BYAmflP6ykerBwIqBylBzEiqdRRAA12Esdnj/UJkAg4xrniChdr45pDxBCKA2uBcRMBApBJBxioGBxq9WaIwgIG2RgQljTDgEOdA+c66GtEi3wGCjdMIJArDWo5Ag6Qzq/EazCIpi5SBNplKDxqFcTibuI0ITapG5zCGAOxuGaMzGytGHyhgYhColTMmZ8yyTIvSFjj8b55N3Msu0o4FEGSFUtnSqEhYp4RZ1J8Mrb8Egwg23kiCYFKyhxIdL97cbz1cfeiN9D04bCHMfWkMq6RtVmayVkshTKFjzKLVSgiOpzm1mRlclQsEcHO64tJyU/hHENw1ICRrbhKc/AnjjAYqC1UZq/RlDOjIFbz1lQ7iCQYLE+0nwKBKux1zOe7QO0qyGsANbd7kXKVn3n3SrOx4LQqFDK7l+8dZK+adR6atbS5mll3BYqwMRhMmZXlxrvn+U1wNfGLD7mPNfjkznMZjQX4nUv9V7YeibtJ4qcuD+fRwtylGsLsGzGBim4HwL1r/AngZ13YEoGIQaOWF0z+kxwM69G3HCVyR8PqejXJWwo6kny2bRzwjysYStgkQo8ScEuS5hqyA1Xeu9W2LnxfGb6hyy/tj77dXy9axRaraaKDVhzxqlpquJYqTdPnVW75yvWx7Plp5XB9/eH8dWxxlujYwoCmf+2+XlUHX8w6WIvKYYvdFa6adLjgiJC+kFQLkQDg2kCntvv+fuXRUHO6St9r0qE3SdScz2mEpr94MxfIvthXna1JMxWri3x6huFeLS11WGruw6DW7pLdk9XcZ1Sd9jfb1ZLOYDwLK3/aZOSwk8+tRK4AQpVk4eZ8qQl8QUQwDjTONO4MO4Vn5mnHd0cTGu1DQwMKh3tYK2WkIAMVFmgvE4lMpGF3yLKfELLsY8E37KDYZWC9p7l+l89g73N8gj1BAsV12DOzdS5ZD0zZr+8Ey8Q0dXpd2nlmKlxX9l5yv1Hpdejg+RbpR3r6ib+uRG0/kMGLgySqImF68vJjCgr2vsTgMP/WmoY/vXwA5YaOoHBpj4owCEPPm9feEyc/xXwrPGG3brYLFWJBD+S+NMcuFn3UfPq0YuoWoktCLeAIOg/yen7uaKQezmIFhCnq+5wY9aFoV7/NWidg1bMdhxLfja0bfMIRLGfY8g2HBpcJBic2nAiw/V2Xg5anVNP/W6qanrqJPl7hcw+IL7g/9l/uDH9dDklcU0DDGjju/gnnLT1Yz8/PZuAUXxP5y63go= +api: eJydVcFu2zAM/RWDpw0Q4qzYyadl3YAG3dCg7dZDEBSqzMRqZcuV5HSZ4X8fKMmOM7cYsJMN65F6fOSjW3B8ZyFbw502T1ulXyxsGOgaDXdSV8scMuBGFHKP9y8RAgxqbniJDg3FtlDxEj3QyS0X7l7mwEBWkMFzg+YADAw+N9JgDpkzDTKwosCSQ9aCO9QUa52R1Q4YbLUpuYMMmsancdIpAixi8mSZQ9dtKKWtdWXRUpaz+ZweOVphZE3UIYObRgi0dtuo5DqCgYHQlcPKEZzXtZLCV5o+WoppR8xqQzo4GW4QuglBkbCsHO7QjBiee0THYBCKrqgOV1svUozTD48o3CisV74vEDo2gKtGKeg2Xccm4UdF15HbZppzKLvrKMfHs7OpSj+5krnXIPlqjDb/L1GOjktFb9JhaacApcXJ6UScOAUjBXqZu81RA24MP4wU/KYDQdK+tLvXpqqHfkdr+Q5hSPY21IuR3NLpv/SnusLVETdqxVHeoO7bZXwJ8r12WQ+5uL1dTRKG3p42dRE8m9wdPVuiKzT5udbWeQ+7AjJIa4N7iS/pA7eY9qNr07Z/vZd5l8YdAAwsmn3v+8YoyKBwrrZZmgqlm3zGd1g5PuMy5bWECS9/mpwTFMjFFkVjpDv4fIvV8hIPF8hzNJCtN2PADQ1dGKNT2NBBXstLJEHjOlo0rtBG/g6zERdSEaJIMVlttQ/vN0zg9pmLJ6xo9VCdgfZ89mE2f6uYGJAsVsvoHXJxNqzFAAP2l1yDUMAAS28ccMjLT8cDYkndKnk1zjft7QmvQRCHv1xaKy69M/ztbWz7GmLbgQE1Ho5bywKDbNR8YP0fgMa6oOHJ1tC2FPbDqK6jz2HPUw9zafmDIl9subI44TbsFnh3HS30PgH2OucnPEz+K3uuGkL68dlzI+k6Py2s7y7xCKELIbB2o6jJPqMsgzVWVze30HV/AHk2bqA= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Archive Workflow - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + workflow + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/assign-role-to-user.api.mdx b/docs/docs/reference/api/assign-role-to-user.api.mdx index 51414d68f8..5f0160cd87 100644 --- a/docs/docs/reference/api/assign-role-to-user.api.mdx +++ b/docs/docs/reference/api/assign-role-to-user.api.mdx @@ -5,79 +5,359 @@ description: "Assigns a role to a user in a workspace." sidebar_label: "Assign Role To User" hide_title: true hide_table_of_contents: true -api: eJztVt9v2zYQ/leIe0oBzs6CPelp3pqiRjckcJzuwTGCi3S22EqkSlJJPEH/+3CkZMl263bPW15ikffzu7vv2EBGLrWq8spoSGDmnNpqJ1BYU5DwRqCoHVmhtEDxYuxnV2FKkwf9oGd265IHLYQQFe4Kg5m4uHdkF6agN4lY5rQ/T432qLTSW+FzEsZuUau/kZ0KlcnogkpUhRSos8F5CGcSney9P6pMXDhvOyfzt8Jsgt1xfKxh6UtNzouLRfzRKbxD52e38/21efpEqQ85LcjXVvdpPRlTJGJpaxIqegiBvaATrk5Tcm5TF8WuC5MyKd5h4UgYn5N9US7itEDlqDf5frm8vX5NKQCeiHk0G/LPDDmhjRc5PpOoyJbKOUbIG/7aGFsKnysnMGXlyRmDlgTLaUHWGtvF16Pfg9s7noAEU5EN5ZhnkECUf2TBR28eWQgkVGixJE/WQbJqQGNJkMC4KiBBcRdV6HOQwPgqSxkk3tYkwaU5lQhJA35Xsa7zVuktSPDKF3zwV29MzDNo23W0Qc7/ZrIdKx6b5MYi7fkKq6pQaUhi+slxNzcjj5XlFL0ix1+h1c4Fch0EWgnjVuUMz+jcjLua45fACIbY9O5mE1A7VG7l/kTXRQGccW+OxwjaVvYCsUsPYF11iZyGObLTjyS0LVuz5CqjXcTh6vKS/x1ywN2+tcWiE4YfRzp6+eXq6tTwRyxUFuG55r78F1aP6peR7wqoPJXuVKAw6cHtDxRAaU9bstCuB8zRWtyNSvyHiQFybUu3PdcNf5JzuCXYGzvTbGFIl3z7vXpzXtF1Jzcq9ABvRPfbabyN8H3NWS/CtHJiMNa2JJ8bponKOB94weeQwHTPBG7ajFmhnfIYOJDgyD739FHbAhLIva9cMp2mhamzCW5Je5ygmmKlwjA4Smur/C6ozG7nH2j3njAjC8lqPRa4406JtT8U28OOlfpAjEJHXLPa58Z2M9MzVx61OE3uwcXAPtevWFZxmjv2GAp5QhLDVWSAod1A6Y0JUXVAz0LOYnY7BwmMTpyVy8nPk0uQx+t5LByWahpmp08pXIM8AncPK8h97J6w/HW44IS5nCXqsb2wBwSzh1gacR/3wEFIzTDC/z8e/qOPh27APL36aVWgCvQYWrDpyGE1PBOYB5KjR0Pkh7WEnBklWUHTPKGje1u0LR9/qckyBawlPKNV+MSTs2ogU45/Z5BsGLozrRmKyCT6Rnwr4J4mNHPEMxY1f4GEz7Q7fuaEFZH3PNR0Ir9Hbz8FIh9MnOw13jlRY5Yy9Gdl1yO+vb25W4KEp+4tVJqMdSy+MIT4EsM1IftAhOGsgQL1tuZVlEC0yX//ALNiIbI= +api: eJztVk1v4zYQ/SvEnLKAaqdBTzrVu5vFGtsihuNsD44RjKWxxY1EakkqjivovxdDSpZsN+723PpikZzPNzOPrCElmxhZOqkVxDCxVm6VFSiMzkk4LVBUloyQSqDYafNsS0xo9Kge1cRsbfyohBCixH2uMRVXD5bMXOf0LhaLjA77iVYOpZJqK1xGQpstKvknslMh0yi4oAJlHglUae/chzMKTg7en2QqrqwzrZPpR6E33u4wPtYw9L0i68TVPHy0Cp/QuslsejjW62+UOJ/TnFxlVJfWWus8FgtTkZDBgw9sh1bYKknI2k2V5/s2TEoj8QlzS0K7jMxO2oDTHKWlzuTnxWJ2+5qQBzwW02DW559qskJpJzJ8IVGSKaS1jJDTvNpoUwiXSSswYeXRBYOGBMspQcZo08bXod+B2zkeQQS6JOPLMU0hhiD/xIJPTj+xEERQosGCHBkL8bIGhQVBDMOqQASSu6hEl0EEjK80lELsTEUR2CSjAiGuwe1L1rXOSLWFCJx0OW/80RkT0xSaZhVskHXvdbpnxVOT3FikHB9hWeYy8UmMv1nu5nrgsTScopNkeeVb7VIgt16giWDYqpzhBZ27YVdz/BEwgj42tb/beNSOlZvosKOqPAfOuDPHYwRNE3UCoUuPYF22iZyHObDTjSQ0DVszZEutbMDh5vqa/4454P7Q2mLeCsOPIx28/HJzc274K+YyDfDccl/+C6sn9UvJtQWUjgp7LpDr5Oj0BwoglaMtGWhWPeZoDO4HJf5NhwC5toXdXuqG38la3BIcjF1oNj+kCz79p3pzXsF1KzcodA9vQPftND4G+P7OWSfCtHJmMNS2IJdppolSW+d5wWUQw/jABHZcD1mhGfMYWIjAknnp6KMyOcSQOVfaeDxOcl2lI9yScjhCOcZSQnR6N/lT8YFF/aRYSioj3d7bm8ymX2j/mTAlA/FyNRS45zYKjXEsdqgJlvILMUQtq00ql2nTDlRHa1nQYgy4Qec9Nd2+YlGGUW+ppa/yGYP0R4Ee+l4EqTbaR9VWoU35PSbPpJheGb6AxvXo59H1Wxi1CmIym7ZDhokfsi49LwbRSRUO+EN0yMMRFr/2B5w8171ANbTnLwzBNCMWWjyEC+MotLqf9f9fGf/RV0Y7bI5e3bjMUXoe9S1Ytyyy7N8TTBjxyesiEMkqgoypJ15CXa/R0oPJm4a3v1dkmA5WEbygkbjmKVrWkErL3ynEG4buQmv6IjLbvhNvBdxRhmK+eMG84hVE8Ez70/eQv0uyjpPqVuRD8PaTZ/zexNkFyJdT0JgkDP1F2dWAmGd39wuIYN0+mgqdso7BHUOIuxCu9tl7UvR7NeSothXfWTEEm/z7C72UMEE= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Assigns a role to a user in a workspace. Args: - payload (UserRole): The payload containing the organization id, user email, and role to assign. - workspace_id (str): The ID of the workspace. - request (Request): The FastAPI request object. +payload (UserRole): The payload containing the organization id, user email, and role to assign. +workspace_id (str): The ID of the workspace. +request (Request): The FastAPI request object. Returns: - bool: True if the role was successfully assigned, False otherwise. +bool: True if the role was successfully assigned, False otherwise. Raises: - HTTPException: If the user does not have permission to perform this action. - HTTPException: If there is an error assigning the role to the user. +HTTPException: If the user does not have permission to perform this action. +HTTPException: If there is an error assigning the role to the user. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + + + +
    + + role + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/bases.tag.mdx b/docs/docs/reference/api/bases.tag.mdx index 153eae0bbb..bb773bf0b1 100644 --- a/docs/docs/reference/api/bases.tag.mdx +++ b/docs/docs/reference/api/bases.tag.mdx @@ -5,16 +5,9 @@ description: "Bases" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/cancel-plan.api.mdx b/docs/docs/reference/api/cancel-plan.api.mdx index af3caf7845..1226e51e5e 100644 --- a/docs/docs/reference/api/cancel-plan.api.mdx +++ b/docs/docs/reference/api/cancel-plan.api.mdx @@ -5,59 +5,72 @@ description: "Cancel Subscription User Route" sidebar_label: "Cancel Subscription User Route" hide_title: true hide_table_of_contents: true -api: eJyFUk2P0zAQ/SvRO1tN4egThQvVHqi27CmK0NSdbQyOY2ynIkT572iSbml72VyseOaN38eMyHRK0BU+W+esP6FW6AJHyrbz2yM0DHnD7kdw5KEQOYXOJ07QIz6u13IcOZlogyCgse+N4ZRee1c8X5qhYDqf2WdppxCcNfMD5c8kmBHJNNwS9DjJpx5GfpkpFPv+cL0tXhLH4rnrs0xvOTedkA1dylAIlBtolIdFVJlukOUiCAqJ45mjqB/RRweNJueQdFka1/XHFZ3YZ1qRLSlYTLUgTB9tHmbIZrd94uEr05EjdFXfNuxFz2LSfduIPASGBgX7xAMUPLXyv+lz00X7d/YFClaENwtKHLH+tZvhNru5fyZXbHZbKIiMxar16sNqjUcD75olCjJzFG9vz2WoBxeu+qHALVmpZab20/+CMBPPW/I3897N647d1ZLMf3IZHFmP6cJlvERZ4RKlxHYzVuQscdYKjYSvK4zjgRK/RDdNcv275yiJ1QpnipYO4l9VT+rNXgnzFw9ihDEcZIHO5PolpYddlZCv27b7tv+OafoH7X8eaw== +api: eJyFUstu2zAQ/BVhzoTl5shTnVxq5FAjbk6GUKzpjcWGohiSMuoK+vdiJcVxDBTVRRA5O5rH9sh0TNA73FvnrD+iUmgDR8q29esDNAx5w+5ncOShEDmF1idO0D3ulkt5HTiZaINMQGPbGcMpvXSueJrBUDCtz+yzwCkEZ834g/JXkpkeydTcEHQ/yKNuKB9GCcW2219Oi+fEsXhquyzsDee6FbGhTRkKgXINjXI/mSrT1WQ5GYJC4njiKO57dNFBo845JF2WxrXdYUFH9pkWZEsKFreiVuNt8SBQDJXQmS7afB75Vpv1I5+/MR04Qu+qa8BWzE4Jfob1yOfA0KBgH/kMBU+NfK+6XLfR/hlDg4IVAfU0JXFZ/9KO4zY7/tB2T+aV/QEK4nOSvVx8WSz/ZWYeKFab9dwZmbGzdx0jDOomrktQUOCGrNxlpubrx4WolHIa8ld8/y32k8pLPJl/5zI4sh7DrKWfO99h7lz6vaIVO1PvlUItW6J36Ps9JX6Obhjk+K3jKO1VCieKlvaS5a4a1HvUUuwrnyUIYzjIpp3IdVNjN0sthV/WcvN9+wPD8Bc7pSz6 sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Cancel Subscription User Route - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/close-evaluation-preview-simple-evaluations-evaluation-id-close-post.api.mdx b/docs/docs/reference/api/close-evaluation-preview-simple-evaluations-evaluation-id-close-post.api.mdx deleted file mode 100644 index e9a2d5cfd7..0000000000 --- a/docs/docs/reference/api/close-evaluation-preview-simple-evaluations-evaluation-id-close-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: close-evaluation-preview-simple-evaluations-evaluation-id-close-post -title: "Close Evaluation" -description: "Close Evaluation" -sidebar_label: "Close Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJzlWN1vGzcM/1cMPrXANc6CPd3TvCRFs2ZrFrt9MQxDvqNtdbqPSJQ3z7j/faB0nz7bTZoUGJCnxDryR/JHiqK0AxIrA+EUrjdCWUEySw3MAshy1O7XTQwhRCozOMdaZJ5r3Ej8e25kkqv2FzNvi8l4Pve6eWYIAsiFFgkSara5g1QkCCF0NCAAmUIIuaA1BKDxwUqNMYSkLQZgojUmAsId0DZnZUNapisIYJnpRBCEYK1DIUmKBZrIBjcxFMWMQU2epQYN41ycn/OfGE2kZc5yEMLYRhEas7RqcF8KQwBRlhKmxOIiz5WMHOzwq2GdXcu3XDOBJL2FKLNeqXRZpoQr1C0fL51EADEuhVUE4XkRtGhxBtPtp6VjrQu+VC6DxwWk8TmIu0KlL4ssUyhSKIJ6KbVKAdNUeXdjBpceoQgYTskNPgfslvU9lIjomWAjj1AUQSWVLb5iRAcr4N6m7x1ffdAigARJdF0RcSxZT6i7Dqc9Z8sqbMFWSe5YShbdlXaMh21BJHVkldBv3lulfjNZ+u6TpdzSW9gPmEEkYfJILaG12J5kd08XehSfUv6dyWSNXnn+n0j9I7uVhr5J67Ege+pP42jiS7Hsg49ioO8C6xZBt399H9RVC6IIINIoCOO5oFOArcYbC8J3JJ0/x61cetjByJFl8/hHGPnsYUsjMSr8AUauPGxppKJrseVT7HF23FH1GLJ+3brDq+HrRa1UbNVWKsJe1EpFV23l5aA93ga1eUb5fynVOX6xfxJ0z1RDguzJphUApjbhySrHNPYrDxYt8miibZr6JePnDA5WSGU1TxmodaZ5KRJphEphDLNDh9nYO3HwKHuwqLdzQ5jveVkeEN8mu39MHOvbxwKPrKEsgQDWNhEpBCAsZcDelWRuuXf5IeaI8Uf00D850sHYRcqKaMggvYrQJz7WJvjWUPoqCBg18TYklGNzpl8FBddVtA0BGnMUdLg7HRyg9iDvS/1TI/XYXfyaXnQl3LTX60RPgHimen1NKwpW+/nion+r+yKUjH25XHOT/f4rXYwkpHLXq6qiugIqizpfnzLczvbLr4n6NosqsiAxq0P11wzgxogVNuV0XNSRMZjw10OUN3fwqYvLmy7l2gdoTa9n93gYV56+U/n9MJnc9QB9brtJdVfTQauO3EVunfHDRf3sQGsIYVg+Wwz9s8Ww9Wwx3HUeIYqhuzLzAY16Uz1XWK0ghDVRbsIhS9j4TKwwJXEm5FDk0m0jg5HVkrZOZXR38xG3H1DEqCGcztoCY64tXy1dsTpRIpcfkXkrH0pGltaZlv9WcbqHkrXXYmJkusycetUfnXOD0d0NtKYjOD/76ewc9nnsCPO2EJHbFpVt9xmCPRbq+LnzJW5PAKFIfmk+sGecCO6CDd6BtO1dYUoSCP+hYa6EdEXvrO/KjE6hzCgnyuUU2s8mPEOF+49LPrGzANZcG+EUdruFMPhZq6LgZTc5caoC2AgtxYKZnO4glob/jyFcCmWw523dSODNfblf3g6ay2Q3iiq/KSeXHeRfEMBfuO29h7l2sK4qaFfKjKIIc2pp97oXl1q9Ee4+jSdQFP8BQnHajA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Close Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/close-run-preview-evaluations-runs-run-id-close-post.api.mdx b/docs/docs/reference/api/close-run-preview-evaluations-runs-run-id-close-post.api.mdx deleted file mode 100644 index 63f79ec4c3..0000000000 --- a/docs/docs/reference/api/close-run-preview-evaluations-runs-run-id-close-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: close-run-preview-evaluations-runs-run-id-close-post -title: "Close Run" -description: "Close Run" -sidebar_label: "Close Run" -hide_title: true -hide_table_of_contents: true -api: eJzNWEtv2zgQ/ivGnFpAjdNgTzqtN2lRb5JNYKe9GIbBSGObXYpi+fCu19B/L4aUZMkPxXkU2FNiauab4TdDznA2YNnCQDyBTysmHLM8lwamEeQKtf81TCGGROQGZ9rJmdK44vjPDLfitG5m/itPZ7Mgq3JjIQLFNMvQoiYbG5AsQ4ghiEIEXEIMitklRKDxh+MaU4itdhiBSZaYMYg3YNeKtIzVXC4ggnmuM2YhBuc8iuVWkMDIyd4whaKYEppRuTRoCODi/Jz+pGgSzRU5DTGMXZKgMXMneqNSGCJIcmlRWhJnSgme+D32vxvS2TScUpoosjxYSHIXlEpfubS4QN1w7tJLRJDinDlhIT4vIiLCW5Lru7knqI06Fz44xwW4CXSnbaHSicc8F8gkFFG9JJ0QQPxUbg1N7zIgFBHBCb7C14DdkH6AYol9JdggIBRFVEnlj98xsQ1at2k7cvKz52sftIggQ8varrA05aTHxH2L0z1ny7xrwFbRbVnKHtsrzT0etgUJ14kTTL/77IT40+Tyw52zytn3sLthAuEWsxO1mNZs3cnuji7sUdylfEtkksZeev6fSP0rv+HGPknrsU3uqT+Po4eQiuWVdxID+y6QbhG1L66XQV01IIoIEo3MYjpjtguwcdWmzOIHy70/x61cBtjewJPlVPorjHwNsKWRFAX+AiNXAbY0UtH1uKa6dZodX5xOIeuPta9aW77e1ErFVm2lIuxNrVR01VbeDjrgrVCbV6T/t1K9iMBYZl3npRQBSpdRU6RQpmHlh0OH1GxoJ2VYMqGBoM0wLpym9gG1zjUtJUwmKASmMD1UrMbBiUMu1w1CbZ2CxnbLV7sRMBbVzp7KcrEr+TeuD/VUlYvXuN7ec8eJ4ZIuRGrgVnlokSACJmVuw4/mRUgQRQS55gsuu0ATZ2yeQQRLlzEP6GzehLoLENQ44Rw1yqSsLkeqTnvnb5hCwi1eCjMm3Tc/IB0d0qiiar9+HRDyNctH9+3S6YDdbbM/8RAHD8nIyStm2diiGsp2AX66wRmGPZxivJSoU7SVXk959iynxv6Y+vxVyHYp7mqEdoBGpX7juvhIXS5TisvdpuxI6JJcuEweCCmXaWdM6XujszkmF7qXp/gnsBKri+rbsLPL4LO/xlG99HbzL84OsXv6flrmeKgTHA+p8gRkGZFycyegPiv5bqvkOPk9RZYOPadO1X+Nbv0mLwrS+e3iYv8J/40JnnqF3icqvC9/v6doGRf+SX34sIg8aX19zoNmuhul7ZZvqupJh9csupLyFo1hC+yqzjWRREYvFN4nUo72FUyXcs2KV9Mb2D2+jatAX1dwvzw83O8Bhti2g+rHET3KHv9qX+Y0gKrHSXRwoV9OofqNKVSfplD9TRgtFX0/FqGThHpVTZ+cFhDD0lpl4j5JuPSMLVBadsZ4nynuj4vBxGlu115lcD+8xvUXZClqiCfTpsCYcilkR1usDgxT/NrfEuXca+DsMtf8v6ph8uOvZdAqfN2d51695GzgnesN7ofQ6IDh/Ozj2Tns8tYSpmPAEn8MKtv+M0Q7LNT7pz4s82cALLLs9+0H8oz4p55si9cM0877tNy9xX9tXwkWOjZvdlNGcAJlBMlqY/Do22v6E9cjwhDIaQRLSoF4ApvNIzP4VYuioOUfDjXFahrBimnOHom5yQZSbuj/FOI5Ewb3nKwvCng3Ks/D+952QNB2voqnpGCSv/QLolBuqnGmP+fLKlXKWgSDJEFlG2p71xLlVJ3o93fjByiKnzuOXs0= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Close Run - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/close-runs-preview-evaluations-runs-close-post.api.mdx b/docs/docs/reference/api/close-runs-preview-evaluations-runs-close-post.api.mdx deleted file mode 100644 index a18d5a749d..0000000000 --- a/docs/docs/reference/api/close-runs-preview-evaluations-runs-close-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: close-runs-preview-evaluations-runs-close-post -title: "Close Runs" -description: "Close Runs" -sidebar_label: "Close Runs" -hide_title: true -hide_table_of_contents: true -api: eJzNWG1v2zYQ/ivGfdoAOU7TNt30aW7Sol6bJbDTfjGCgJbONjuKVPmS1TP034cjJVvyi+ykKbB8cCTq7jnec8fjkUuwbGYgHsO7ByYcs1xJA3cRqBy1fxukEEMilMF77aS5zzU+cPznHtfy4UOQyZWxEIHGbw6NfavSBcRLSJS0KC09sjwXPPGKva9GSRozyRwzRk+5JsOWo6E37eQ9T/0jt5j5B7vIEWIwVnM5gwimSmfMQgzO8RSKqBJgWrMFRGC5FfQ+dLIzSA0UaxE1+YpJNVuuMSUeKpt3a9U1NUMnB6kZBuegIKy1rtUO/YDJlTTBg7PTU/qXokk0zwkCYhi5JEFjpk50hqUwRE/lKFEuKJVOcWlxhrrm+YWXiCDFKXPCQnxKs3SyyWsTdSp8WiyBycX1FOLxpgAvA542hcpJTJQSyCQU0WpIOiGgqLE6MJ2LgFBEBCf4A/4I2CfSD1AssT8I1g8Iu5JlZ1a893xtgxYRZGhZcyosTTnpMXHT4HRrsmWS12Cr6DYsZZPmSN3H3bYg4Tpxgulf3jsh/jRKdq+dzZ39FTYdJpAySY7RCsuujd0NXdiiuE35isgkja30/D+R+pf6xI09SOs+J7fUH8fRbUhFkCzbvQa2GdieAukWUbNwPQ3qsgZRRJBoZBbTe2bbAGt1PWUWu5b7+ey3chFgO31PlsvTn2Hkc4AtjaQo8CcYuQywpZGKrsninu+utXt3wsNkvV10Bmmdr2e1UrG1slIR9qxWKrpWVp4POuA9oDY/kP5fSvUiAmOZda1FKQKULqM2JEeZhpFvDh2m4LdsGYZMaCDIGcaF09Q+oNZK01DCZIJCYLq7hRmFSeya8qpBWFmnoLHN7avZCBiL+YZPe3qKv3Gxq4GrpvgRF+s6t58YLqkgRsDlgwotEkTApFQ2vNQLIUEUESjNZ1y2gSbOWJVBBHOXMQ/orKpDXQcI395NUaNMyt1lz67T9PwZU0i42VNhRqT77AukpUMaVlRt7187hPye5aP7fOl0oNcniH19/iWzbGQxH8jmBny4wRkEH44xXkqsUrSRXodm9qhJjfwy9fmbI9ukuK0R2gAalvq1cvGCulyW51xuNmV7Qpco4TK5I6Rcpq0xpe+1zmafXOheDvFPYCVWG9VXwbOLMGdfxjF/anXLmZ23id3Q9+Myx0MdMfGQKgcgy4iUzh2B+qjku6qS4+jzFFnadZw6Vr/9IqCRvePjUc3quF74s/+rs7Pt0/0XJnjqNTrvaE9++tE+Rcu4aDmlC5U0vj7mrHO3n6FP1cZK69rM2vL1Co1hM2zbuFdMEhmdsCcfyEbyK5gu5eqb4YrewO5+Ny4DfW3R/XB7e7MFGGLbDKq/qeiUqZOhnSu6Fisvu8Kihl55NdarXY316J6l529KaHGhplbAR8hpATHMrc1N3CMJl56wGUrLThjvsZz7FWQwcZrbhVfp3ww+4uIDshS1z9uawIhyKGRFU2wVEJbzj75whOoJfWfnSvN/qx6KOiSYBy0igLJzuL7Ge/edZbnAxrXcGF5O2W+vp+evuq/fvHjTffX6/Kw7eTlNumfJ7+cvp+fnbMrO4c5v7FPlJ1My3/eudvo3A6i12HB68uLkFDbZbwjTYmKJX0yVJ/4zRBucrtikRi/zKwkssuyP9Qfyk4JITd8arxHsjRNwSabF77aXCxZ6Qm93WebBGMo8ILO1S9Xyzi0Kl6mU0nNKn3gMy+WEGfysRVHQ8DeHmgJ+F8ED05xNiLAxkTivQl9uN3ARCkv3NnQRZC2EeqPIUAEIGv0kwdy2yt7VMvzmenQLEUzKe9xMpaSjGTlHvzFQ85IHDyk1aGwJgsmZo7oQQ8Ckv/8AfFen2A== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Close Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/commit-evaluator-revision.api.mdx b/docs/docs/reference/api/commit-evaluator-revision.api.mdx deleted file mode 100644 index 7069ebaaab..0000000000 --- a/docs/docs/reference/api/commit-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: commit-evaluator-revision -title: "Commit Evaluator Revision" -description: "Commit Evaluator Revision" -sidebar_label: "Commit Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWm1v2zYQ/ivGfdoAOU7TNt30aWnSolnXNUjS7oNhBLRE2WwpUSWptJ6h/z4cScmSX1RLsYegdT4ktsR7Tnc83ssTzUGTiQJ/CK/uCc+IFlLByAORUkk0E8llCD4EIo6ZvqPFkjtJ75liIgEPJP2SUaVfinAG/hwCkWiaaPxI0pSzwKAMPimR4DUVTGlM8FMqUYdmVOG3Veg7q7Rp6T2RjCT6joVGXTJ7H4E/nIOepRR8UFqyZAIeRELGRIMPWcZCyL1yRZJxDvnIA800xwulE3ofLXbvEgXgq5CfIy6+7kHlPw56SePCyn1Yt2TVHqyxGnbvrrqXiNQsIsEuFZw5SKch4uZ8VLHr4cjUXZApLeK1DzAWglOSNGq8VL1zi5B7CFdu/UMQy712oNMsJslDAN8YgDz3ikVi/IkGGtaE12vjs1W83IOYalJ/ChKGDFME4Vc1v27aywosSzSdUFnXFI/rV6rmrdcFAZNBxon85XXG+Z9KJP3LJM30r7BsK2IwTePthIiUZNbo1roorPi2SfYdehIlVuLzMXn0b/EXU/p7Pt1k47J0Ow/d2iiEhMR0S/tXnwBlcw9CqgLJUjS1K9RFBSL3QPFs0hXqBmXxqcjyaarnpnsq1QOe+KMTzz3IJOuK8kEyi8C7I3BEmFISUtk62Pflkl1s4O7KFlarhtx8TSMqaRLQKkjxoKNWx+qN2wZ0genmtt2RR5SWHl+ib7EBN87rWE5JmrJk2wKw7N821aZQZHYd01jn0LfSuQcpkSSmusOR/pkDZbPs1cKfuEtU3rOAbuNaLTPaKgAddO7huBexSWZnxX3oOq8p2Kr9vHYT5AUxHdLaLlQpMuncFLxz4q2e5tyOs+tkcIRmkoY4hm8ehNcNcnXwazuKQ45KFqDocnNBpSJR9iydHB/jn1pbAzdZEFClooz3rt1i8LpO9IHIrNDS0axuLa7A3ioiGdfgH9fm3pJjaKjmBy7gwAX8f1wAyfR0w1TeBdyi2Ta+MRdVUHFpX7OYNkJfIOAO89yBBvk5aZD3me7Q9axItWh7rOwPzoQ0uXULKqSLjx43FxJISjQN70jjVNE6DZ5b2N6ZcVaWhvtQ8sHCOiUh5XQPSi4srFNSuGs822GtK5z1cuaqXeGvnWopvFVqKRy2Uy2Fu0otPzLrc6ABDzTggQb8cRqdAxP4KPu3RxkrBzLwoWRgG4yHypekWm4YumcnJ6sc3EfCWWjs672SUsjuBFxINWGm2LqoXF7ARVC72+ZUVWqFDeSF2X+JgBSNfawmq+lmLcFgl2xeapzRu8W736NQ0S6r2q2rUUaFe613N5txYd3XtMFvbm+vVgDt3tY31dKzCzKid714fyqmeirwJatUKARPiZ6CD4MU+U/6dVDSIGpQMKJq4Chhe7BN2hzObWsFU61T5Q8GARdZeEQmNNHkiLABSZk5S4oGmWR6ZkTOri7f0pkt5eAPR9UFprjYSKkvKzeJpOwtRZ/ZqdIxWuxfu/0eMLTdtmvGjxix14vXxV59I3HK6Xdf/1pP8sLTiPz2PDp91n/+4smL/rPnpyf98dMo6J8Ev58+jU5PSUROYQNdu61wnXltrbKNUJfHq1Ge2wqVVF6FsrOJuE66ldccZ+b+jeCoqwXfUrIKi0Nbj/7ysm2VK8vc3FI244tbZtCofuXVr4sRoNZ91tugSn+ykKx1GrXCuKZ+5VUKtcyG2K8nkTDnoKByzSnrnV1dQmXWhOOjJ0fHK+6oLcbcTgIT5sUhMrdLm4vjXB5kjMrYJHbQlMR/LG7gk2EScQynw2vKPUtMjjvWmn7Tg5QTllQGNpuWhuDSUvVsKJN/XWoyNhX/r5piSvOHMJ+PiaIfJM9zvPwloxLzz8hF/RidOByVs51JTZ/pzFZ8rH19k/hxOc9s5lmqg1ijrMRZENBUN64dVbLu1fubW/Bg7F5fjUWIMpKghfjbB8C3YbWxzZ/ba3PgJJlkNi4sJv78BzpL2qE= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Commit Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/commit-query-revision.api.mdx b/docs/docs/reference/api/commit-query-revision.api.mdx deleted file mode 100644 index 4b7639ab5c..0000000000 --- a/docs/docs/reference/api/commit-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: commit-query-revision -title: "Commit Query Revision" -description: "Commit Query Revision" -sidebar_label: "Commit Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWltvGjkU/ivIT1tpCITm0vK0aZKq2W2bbJJmpUUImZkDuPVcanuSsGj+++rYnhsDw4Slq2pFHtBgfL5zfGyfy5dZEEWnkvQH5I8YBANJhg4JIxBUsTC48kifuKHvMzX6HoOYjwQ8MsnCgDhEwPcYpHoXenPSXxA3DBQECh9pFHHmaoTOVxkGOCbdGfgUnyKB+Ap19RekDDsyytZNe6SC0UCNmKfVBPPrCekPFkTNIyB9IpVgwZQ4ZBIKnyrSJ3HMPJI42Ywg5pwkQ4copjgO4KrnrQeD27rCyWT3Wsr4Zi27XoPBpkKxCXV3afyZhbQaJlwfmCI29TyGm035TWnTKtrHYciBBkV11qBkmDjpUDj+Cq6qtem9NiJxiA+KbmlMqjlXwwIFUxBlzf64PFJcw2pdxGXCjTkVv7yPOf9NhkH7Kohi9YqsWiJT4DcTokLQeb1bSqLkRS79hJ5Eie239z/w6OfwI5Nqk0/XrXFZ+mUeurdnLqA+NFx/1QKUTRzigXQFi3Cp20JdFCASh0geT7eFukNZtIou36ZyFH5igRc+IVrNpACeQKqG0cejCtqKaafUeM1AJg4Jubdr8GsDiRsLz02hN0bNz4iVOIQzm88qoCvvxhLKRy2N6xYeiHrbIIh9TORUuhB4ZgyPmf0yrPWBhk8cbZR4pHxri69SgMQhgqrVF6UaAyo4tyibVO5nPuHP7CxWYTBNMa5AbDiqptAJtWM9mNCY497SwMujStW9+tdQEIcEIRoUmJEgFKS4c+GUuZRfpxoSByskE9y0bhv31xs3YcB1El+2JIv2ekLikG8w3/bm/w5zU/LwuGlMe3FMT1earMhkq+O9EjG8JDI/aPMTp7Shm28Kk8QhTI5wHwto56EfUcFkGBR2bz0KfMfd159TPA9c6SfQj/g5Vk9BEf9z7INgbiNwqahQ8ompmR700kestikLcAE+Ve4M8Imzb1BUdKfRGulhgTnPI1YyFdNlI/kZRQNmtOLMC+Y2Q4BnJpW0VtgvBZxLHIHAhVVg1XiWTnIK95pJc0SyK7ju5rlUwkhCIJlij6uvxYpKtmLEOZXQustgCqZMKJeQOASesVTXG7i1lkvEaH3SGBUVNfHzHp7VtfUF4pddQPnqFNDEojPOX2SJOWS5Jes31c5ZgYXNKBPg4UkygbN0oW3g1VE4q7PTDPGKDJdD0wpZWVzTYFi3oAx5VWqqkdON3K1thS+orsdXpDYfpKTTrUvQT1a8sSXnpiff5PbVnfxyn1oGvTUcAkkQPAfD+K8HZBQG0pzIXrdr0nShcCZ3seuClJOYt27tZBsct6Ai3DA2QkuJrngYcEbhHHSzdj4jRmriyp7E+FlIDBqr2aYq4QXgBs00ULX38sXNyYUug3d35/f8zVb8zXWstiBwKlIvYHCM7P+cwqlzawMOZxsf/dwkjiuAKvBGdLcUx7mBbZ1pZ8WR9yOUfDGwVokHHH6AkgsDa5Wk7hrvMhOlznqXpqPUXzvVknor05I6bKdaUndlWh5BVKuU5sf1wYrviG/c3UKtD/f85Z6/3POXe/5yz1/u+UvY85d7/nLPX/5s/GVT+X8jm3GBiSYWj3q9KnX4QDnzNDHYuhRCX7UteUMPFGW8lBPLE3jorsmYm5NUzdZ+DI2BmkeR07pUW+B/zJT1U7UzWvf466aDiusyqu28ckqz7jXeXb+MC+O+us39cH9/UwE0e1veVMMqtwyZeJu/q+aDmoX4MlsUSgSOqJqRPulESNvCU+e7efmtk7K4smPpa4dIENg06e2KBSd9MlMqkv1Ox+Vh7B3QKQSKHlDWoRHT912CGwum5lrk7Obqd5h/AKrr38GwOOEOD5Q5IuVp2e7QiGGFk9IVlmlkf5t9x3IX7TFS6A08qrf5e3mXz9SPONS+Z1clpcnrCX1zPDk5ah+fHp62j45Peu3x64nb7rlvT15PTk7ohJ6QMsXcVCanjZtKlMjgpkIpyZkzjDktlpE/+dkvH6Js2LS4hWm2vSy1kWm7SHrd3lG7e9ruvb0/PO4fH/Z7bw66p4d/kbzrq5tjmremC7RtWTfrrEptU94FddMuprvcU+Slpm0JiuX9ICvf89XrKj3/akvufKAAqAvTQqGyXJCY+rhUPeh/+SQORnod5zPCOwuOurubhPp2pJla373W2c0VKVAbpHtweNCtbGtpsq4/XX0B0qulfybO0iXPrjeWer6O80QB9X/Nf0DLMK74NCjgrQtFS6ShvegKnlUn4pTpaK5NWNgoNSA2Stnrw3StnEUqvZj0X20zDG/9AVksxlTCF8GTBIf1rcPoYy/tGL03wNQySwPTwu7vucmBbZ0A8l2u5EPMVUbizHUhUrVzh4UIfHN9d49NhX1t2A89lBEUl4effVI+O3psQTgNprE5EAYT//4BWqsxtQ== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Commit Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/commit-testset-revision.api.mdx b/docs/docs/reference/api/commit-testset-revision.api.mdx deleted file mode 100644 index 8ad5630d78..0000000000 --- a/docs/docs/reference/api/commit-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: commit-testset-revision -title: "Commit Testset Revision" -description: "Commit Testset Revision" -sidebar_label: "Commit Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWtty2kgQ/RWqn3arhMHYxome1omTCptk7bKJH5aiqEEaYLK6ZWbkhKX4962eGQlduAgiV9lZ/GBj0X16pqfVlyMtQJKpAHsAfSqkoFLA0IIwopxIFgY9F2xwQt9nciS1wIjTRyZYGIAFnH6LqZBvQncO9gKcMJA0kPiRRJHHHIXR+irCAK8JZ0Z9gp8ijhYkowL/KwKPtMHNgo+EMxLIEXOVqWB+MwF7sAA5jyjYICRnwRQsmITcJxJsiGPmwtJKJYLY82A5tEAy6eEFs/nGg0Zu9FAc6reTx0/2U/8+ND7hkk2IU6eBKwNpLEw8FT1Z7PyRzYhQgeMQQcXaRYzD0KMk2Gr1AxGNfoqytDQsJ87PYmqIJZ6FFgvHX6kjoeTR92qjZbylBT6VJL8K4roMI594tzlnbDqADCwLJJ1Snrfkj/NXsttbbwscxp3YI/y397Hn/SnCoNkLolj+DsWdIgaT1K+mRDgn861uzatCybPbdD+jJ1GjFFTPyaN/hZ+YkLt8ummPRe39PNTXUQgB8WnF/ZdXgLpLC1wqHM4i3OqhUNcZiKUFwounh0Ldoy6uihTvpnINwDQwYm4hAkwU785u1YM5yTmNniuShL0mk6WW15erp0rv9WLfp7gOp0RSd0RkRWyXSNqUTIXVZgNvNWzjSsV8HLlPYeSLhjVGXOrRJzByrWGNkcRd43mNp5E4683cHErir1qtJN5KrSQOq9VK4q7USn3QG7uQygVjTauQZKvhXqk56RCO1Wtn9Tp2THV3TOWqefToYR69Rk/uGgiwBziokag0a9yZOVgvZf3IIQSZHtwBfjbqe6zlrR7J12kgCcA4dZFE2DTKl3uYPPCdJhJgiQZWgJLHVF0QURiYtqvTbuOfXPcK97HjUCEmsde4M8JgHcpHOGGslQr3Q6Y6KwkslxMSexLsdmaaT/mRHV3skcl4TkwGieUs5LWBazSdmbfep/s3nwhYYw44kjgviMS5ieUBFbSktUcJ1bq/OI+zza0VWuFDfPS8mZwjBXCkAJ6UAnikvNwjVQ/XB6NeE+lYNyFxJDGPJOYxg/3aGexIYv7fW7fjzPAEM8MLYTJfhlNfAJlZHeHntFNacKk4xvNOp8wiPhCPuYojbLzjPOSHU4gulYR5+GlDW+WFTu7bfYJ5WDys1aY/hXqBKj2J6bpGcg0BpEU2iypnNPr47S4CGPelTRu5HGWYuFd7d/M2rrX7th3vh37/tgSozzZ/qJpgbiRd593q7TWfylmIL7hFoUDoiMgZ2NCKkMGl31um9RWthNEVLUNnY9vKcYRRJxZzD2yYSRkJu9VyvDB2T8iUBpKcENYiEVN3j6BOzJmcK5Wr295HOv9AiUs52INhVuAeY0pHSV4sPSASsY8U/aXJA8M2sn/10VvAcN8zrYUOwWi9W72q9+4H8SOP7nj1bh1FDWcT8upi0j1vXlyeXjbPL7qd5vhs4jQ7zuvu2aTbJRPShTzdXFUnO2hU1cnRwlWV0karQGviw4Y8KWkeP5g6v+qKUtpmdavkYy69rIfTjJipbvkBcFBt6cPc7DZYHOSyfeWzcxR02p3zZvuy2XndP72wL07tzquT9uXp35AfhbbJZaeZbXKFgaTqcgsTRlW1wshQVe2QsMuF0Sq0TGQs88/30jKAA0cwCVXsJM8YVIppXN32IMOnQPvk9KRdisicMBY14qi7PMkg6mv0Xy6XpVkMLKC+qmggKfH/WH2BK8P86ZMgg7c56Ra4SpPRJP0hW5FHmKpcahELk48HYPLxKkcIVXRMTlb7SR4yzjCT2wNYLMZE0C/cWy7x8reYcky8Q5OaxujAAXp6lqTgBfxD52rlquA3VbVDcS/WKbdQ/LEwa40rx6GR3Co7zBSb25v7PlgwNu9M+6GLOpzg/vC3DYAvYEu1N3uhry3AI8E01jGhMfHnP27PgAo= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Commit Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/commit-workflow-revision-by-variant-id.api.mdx b/docs/docs/reference/api/commit-workflow-revision-by-variant-id.api.mdx new file mode 100644 index 0000000000..1932d11137 --- /dev/null +++ b/docs/docs/reference/api/commit-workflow-revision-by-variant-id.api.mdx @@ -0,0 +1,5443 @@ +--- +id: commit-workflow-revision-by-variant-id +title: "Commit Workflow Revision" +description: "Commit Workflow Revision" +sidebar_label: "Commit Workflow Revision" +hide_title: true +hide_table_of_contents: true +api: eJztWdtu2zgQ/RVjnlpAjh0nTrt6Widp0Wy32yBJs8AGhkFLlM2WElWSSuo19O+LIamrL3VSB9iH9CG1qJkzw8MhecZegiYzBf4d/C3kt4iLBwVjD0RKJdFMJBch+BCIOGZ68uAsJpLeM8VEMpkuJvdEMpLoCQvBg5RIElNNJSIuISExBR8aJiwBH1Ki5+CBpN8zJmkIvpYZ9UAFcxoT8JdAksXnyGDoRYoYSkuWzMCDSMiYaPAhy1gIuVdaJBnnkI890ExzHLi1YTsXIeQ4jtGo0qciXGCIdvBAJJom2kRPU84CM//eVyUSHKtySyWyoxlVFsZysfqGZHou5L5mM7JouQch0XRHVDTtahbTrdDnCJh7EFOlyGwr9jaYT84999zCPw3mL2LShZCqQLJUO26fAnVeg8g9CCQlmoYTovdK35mF7Yw0BsnS8DmCfLGwLkhIOX2GIOcW1gUp6JoucOfuqYwLsk4XZl9WfO01SsFWGaUgbK9RCrrKKPdUql8o11vnnnugeDZ7Ksw1+uYe7G+idnYRNzfFGkgx/UoDDZVDcZe8Ny6r0Oaw0SQkunXakzBkuF0Jv2yepT/ngSWazqhsRounzZGpEJySxAytjwUBk0HGiXz1PuP8DyWS7kWSZvo1Tq8xXcRgmsa7OREpyWIry01XZHw13uaz17Fp74f1d+jGZTq3nmtWiUjNIhLoPe6akYN0e6aIsFvGhfP6bGtC4xk0RIn/OHIdxLqMV5Z41fuqkBfrjCsJc1fpkPFmkCurgCDPEU1SlYpE2Q026Pfxv8alC9dZEFCloox3rpwxPFkoBSKzTq39WrsbjIXJrNJUuxNdUbUT03XybG5bmXPTt9QdDwarbN0SzkLDReedlEI+naqQasI4fnLnS9uAi6Dx9jHH4zhvnUnVrP8UNkEjBtWstljl1lkj9qzJZlNDRucG3/5sHXBeNrSza2zFgl7L7uZpnFv6tm2vDzc3lyuAdm2bi3pmWp9OUQ+dssjMDTYX2B6lQmnT/Og5+NBLsXzpQ29KFO0VPZPqucND9ZbVMZX3bGsFHigq74u+KZMcfJhrnSq/1wu4yMIDMqOJJgeE9UjKoJ3myLztnKGpOcAUDTLJ9MLgjS4vPtLFB0pCKsG/G9cNrrEGbVU1zcoFJSn7SJFf187ZToT9a0vFdXRz64UEYnVfVb3Wux8kTjlt90pFdwRHEXk7jE6Ou8M3h2+6x8OTQXd6FAXdQfDbyVF0ckIicgJF1wOD/mDY7Q+7h8ObwyO/f+gPjw/6x2//gVr7UpWgy7h8bpJWDtcbg20R6tp+m11dnm+zaynsXaloSeadGWxq4F3dSlFb8WXVafX8GLhSRTI1CTKlRVw04ExN6D3hGdFYF+XYPItJYp+bsrEmdXDzsIDawUAkEZtl9vsLHGrrmF1TrUuTl0r69UraR9m0SqAl+nau6UrIvSzs/2Nh93IevGzzl2oojwaj5lgSCaNligbSCqVTEnyjSdi43voHhwf9TcrKOXRGlxdO1zcrxpoh1w3tVqo28IDGRtSDpiT+vXqBWaKCNPMo8bboztYXo06lafpD91JOmFHvJoulk6R34CQpeICiFDwoZWl1GOJHv/FVvdOmYw/mqHD9O1gu0f+L5HmOw98zKlFhjh3IFCm+W0LIFH4OwY8IV3Ql5bItgldXTv2/7lRflTSnUqjQZGFy5Rk+gQff6KL524LpbOaFyF06gzMbq2v6jwpgpR3DVsl6jIKApnqr7bim/i8/X98gse5nhViE6CMJso1/TbLCzN3+YIBjS+AkmWVWrlpM/Pcf4UpQfQ== +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Commit Workflow Revision + + + +
+ +

+ Path Parameters +

+
+
+
    + +
+
+
+ + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + revision + object + + required + + +
    + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + data + + object + + +
    +
    + + anyOf + + + + +
    + + service + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + configuration + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + + object + + +
    +
    + + anyOf + + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + + object + + +
    +
    + + anyOf + + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + + is_custom + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_evaluator + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_human + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + artifact_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + + object + + +
    +
    + + anyOf + + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + description + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + created_at + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + updated_at + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + deleted_at + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + created_by_id + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + updated_by_id + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + deleted_by_id + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + + is_custom + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_evaluator + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_human + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + metadata + + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/commit-workflow-revision.api.mdx b/docs/docs/reference/api/commit-workflow-revision.api.mdx index aab7bf6f30..e20d567960 100644 --- a/docs/docs/reference/api/commit-workflow-revision.api.mdx +++ b/docs/docs/reference/api/commit-workflow-revision.api.mdx @@ -5,36 +5,36 @@ description: "Commit Workflow Revision" sidebar_label: "Commit Workflow Revision" hide_title: true hide_table_of_contents: true -api: eJztWttu2zgQ/RVjnnYBOU7TNt3106ZJi2Z7C5K0+xAYAS2NbLaUqJJUWm+gf18MSd18q+04gNF1HhxI4pwhh8O5HPAeDBtp6N/AP1J9jYX8rmEQgMxQMcNleh5BH0KZJNzcfvcjbhXecc1lCgFkTLEEDSrCuIeUJQh9qEbeMcVZam55BAHwFPrwLUc1gQAUfsu5wgj6MRMaA9DhGBMG/Xtg6eRjbOHMJCM4bRRPRxBALFXCDPQhz3kERVCNSHMhoBgEYLgR9KJcTeezm0HnPIKCBpBe1OaljCakq56GUTkGEMrUYGrsNLJM8NBaofdFy5Te1ZPMFNnIcNT0NGuaxUMaNnnMxQawfUVt/GpFj7ASp4Epw2MWbnMJJx7Sa4iFdf8mdnvbuL4Nc21kMncCQykFsnSpxnPdOXUIRUBweMdEzoxUD0F8VYE40HGesPQhgG8sQFEE5SA5/IKhgdm9eW1NNgtXBJCgmTrBLIo4nSAmLlpmXbSVDVieGhyhamtKhu03zdXN1wUhV2EumPrtdS7E31qm3fM0y83vML1UwuAGk9WEmFJsstSqbVGYMe0y2fdkSZKYcc9dsugH+Y5r8zObLlrjtPR6Frp2XuhTzkrrn50ByRYBRKhDxTPjA/cmUGcNiCIALfLRplBXJEuzYtOnqR2a7lDpB8z4sxcvAsgV3xTlk+IOQWyOIAhhjCyyZcR6zv5YJtnGBm4va9nqZXFovsQYFaYhNkHKiQ7WOlZv/DYUZUW26o7sUFjavUC/xgZceatTOmVZxtNVE8C0fdfJNqUiu+sUxjZ2fSddtDuDXc1fu+coi2UvanvSLqG64yGuYlrX2KzhgB66sN1QzEe5awUfQ9dpS8Eq1eelb7DOmC2Q5hahWrPRxjXBey++zmRObYM8V6RuMG/mdIlzWp825qVrV6EoCFyhzmSq3YE5Ojykf63aBa7yMESt41x0Lv1g2LirDWXuhKbOX3P/aAQVUDHLhYH+YbMvbDbDizL2vi3exbaY5Wa8oEHdBNyhuZJ26cFsoNLQruEJLoU+I8AtHvo9I/C/ZAQ+5maDAmBGao0KwMn+4qTAMrOuwApsYqPdpgVChcxgdMuWFthrR8FTB9s5scbKs+gxlHxysF5JhAIfQcmZg/VKSnMNJ1tMdaWxXk58sivttVUtpbUqLaXBtqqlNFel5VcmQPaM2J4R2zNiv06hsyfFdrJ+20lf2fNiD+TF1oB4oHjFOznO6tnR0SxN9ZkJHtnFdV4pJdXmHFWEhnGbab1LTg8QMmx9XedINRKF8+J61e9kyMqqPtGj2Vgzl1xwQxYPtcboXNPXn5GJtC6n2o9rEVKleZ11Fy/jzJlv2f6+ub6+mAF0e9veVMdYdiqy6rK+JpSgGUu6SpRJbey1ITOGPvQyogjxe6/kzHSv5Ax1z906AnemywtGtqqCsTGZ7vd6oZB5dMBGmBp2wHiPZdweI41hrriZWJGTi/O3OHFZHPo3g+YAm1ecn7SHVVvEMv4WyWL+apPjsvi/bvP9pSZXqVkrkr9e1neMXv1gSSZw4R2hufQnPI3ZH8/j42fd5y+evOg+e3581B0+jcPuUfjn8dP4+JjF7BjaTOaqMi12clWhFuG4qlBFpDUIMxcH25RX9c4zVvRcM0c13VE19fWxaftf9dpVqo1hvm2oauH6k63zm4+i+VhX4K3ir12FNMqDWrKV6Ft5aU76KJoEZhWPqFxOY2l9sSRSrad3Ti7OodHqweHBk4PDGXO0BlN0ZaGNrqUj28/VmssjVR0mCAATG1rBIEv+qj/QzOgce37R4y05/VM8ij9ZBn+YXiYYTxvtkgsMN+ADQ8NhtY1/PjjYFdnwMAhgTDGlfwP390Om8ZMSRUGv3U1DigAR12woGncNv+Jk4S1Fckyang0k9suQbH8zqDoyi+kgTl3S6tqIXcvOJDBKLk7iJAwxM0vHDhrx8uLj1TUEMPTXFRMZkYxiZBn67QPQbU1jjUL3GendPQiWjnLnTg6T/v4DHI5mOQ== +api: eJztWW1v2zYQ/ivGfdoAOX5JnG76NCdp0azbGiRpBswwAlqibLaUqJJUUs/Qfx+OpF79Uid1gH1IPiQ2dffc8eGRfE5ZgSZzBf4E/hbyS8TFo4KpByKlkmgmkssQfAhEHDN9/+gs7iV9YIqJBDxIiSQx1VQixgoSElPw4YFIRhJ9z0LwgCXgw9eMyiV4IOnXjEkagh8RrqgHKljQmIC/ApIsP0YGRS9TRFFasmQOHkRCxkSDD1nGQsi90iLJOId86oFmmuPAnQ3cuQwhx3EMR5U+E+ESQ1TRtcyoB4FINE20iZ6mnAVmzr3PSiQ4VuWWSmREM6osjJv/2hOS6YWQh5rN2KLlHoRE0z1R0bSrWUx3Ql8gYO5BTJUi853Yu2D+dO6555b+eTB/EZMuhFQFkqXacfscqIsaRO5BICnRNLwn+qD0nVvYzlhjkCwNXyLIJwvrgoSU0xcIcmFhXZCCrtkS9+6Byrgg62xp9mXF10GjFGyVUQrCDhqloKuM8kCl+oFyvXPuuQeKZ/Pnwtygb+7B4SZqZxdxcztsgBSzzzTQUDkU98c747IObQ4bTUKiW6c9CUOG25Xwq+ZZ+n0eWKLpnMpmtHjWHJkJwSlJzNDmWBAwGWScyJ/eZZz/rkTSvUzSTP+M02tMFzGYpvF+TkRKstzJctMVGV+Pt/3sdWza+2HzHbp1mS6s54ZVIlKziAT6gLtm7CDdniki7Jdx4bw525rUeAENUeI/jVwHsSnjtSVe974u5MUm40rCTCodMt0Ocm0VEOQ5okmqUpEou8GG/T7+aVy6cJMFAVUqynjn2hnDs4VSIDLr1NqvtbvBWJjMKk21P9EVVXsxXSfP5raTOTd9S93JcLjO1h3hLDRcdN5KKeTzqQqpJozjJ3e+tA24CBpPn3I8TvPWmVTN+g9hEzRiUM1ri1VunQ1iz5psNzVkdG7x6ffWAedlQzu7xlYs6LXsbp/GhaVv1/Z6f3t7tQZo17a5qOem3ekU9dC5rtqdmOqFwJYoFUqb9kcvwIdeiuVLH3szomiv6JNUryhq1bMtFHigqHwouqVMcvBhoXWq/F4v4CILj8icJpocEdYjKYN2amPztHOOpubQUjTIJNNLgze+uvxAl+8pCakEfzKtG9xg3dlKapqVi0hS9oEip66Js90H+9eWh+vjFtYLScOKvq76q7ffSJxy2u6Pio4IjiPyyyg6PemO3gzedE9Gp8Pu7DgKusPg19Pj6PSUROQUik4Hhv3hqNsfdQej28Gx3x/4o5Oj/mjwD9RalqrsXMbl9yZp5XC9GdgVoa7nd9nVJfkuu5aq3peKlkzem8Gm7t3XrRSyFV9WkVbfnwJXKkem7oNMaREXTTdT9/SB8IxorItybJHFJLHfm1KxJm9w87CA2sFAJBGbZ/Y9BQ61tcu+qdblyGsl/XglHaJsWiXQEnp713Ql3l4X9v+xsAc5D163+Ws1lEeDUXAsiYTRMkXTaIXSGQm+0CRsXG/9o8FRf5uycg6d8dWl0/LNirFmyHVDu5WqDTygsRHyoCmJf6seYJaoGs08SrwdWrP1MtSpNE2/6V7KCTOK3WSxcjJ0Ak6GggcoRMGDUopC1WEpMzEjR6ceLFDI+hNYrdDlk+R5jsP2fT2KypApMuO1N/Zf6LL9ih8XDJMzktQ8meEqTLDvWBRydOU8z22D1DXdQeW71ixhI2M9xkFAU73TdlrT5lcfb26RAvfSPxYh+kiCvOBvHwD/w6ENFyhXcWwFnCTzzApLi4k//wFljCnF sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/preview/base/workflows/revisions/commit"} +> Commit Workflow Revision @@ -43,29 +43,5401 @@ Commit Workflow Revision as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + revision + object + + required + + +
    + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf + +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + is_custom + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + data + + object + + +
    +
    + + anyOf + + + + +
    + + service + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + configuration + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + + object + + +
    +
    + + anyOf + + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + + object + + +
    +
    + + anyOf + + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + + is_custom + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_evaluator + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_human + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + + anyOf + + +
    +
    +
    + +
    + + artifact_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + + object + + +
    +
    + + anyOf + + + + +
    + + name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + description + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + created_at + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + updated_at + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + deleted_at + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + created_by_id + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + updated_by_id + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + deleted_by_id + + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + + anyOf + + + + +
    + + + is_custom + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_evaluator + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + + is_human + + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + metadata + + + object + + +
    +
    + + anyOf + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-add.api.mdx b/docs/docs/reference/api/configs-add.api.mdx index 3fbcb17ae9..c966bf55eb 100644 --- a/docs/docs/reference/api/configs-add.api.mdx +++ b/docs/docs/reference/api/configs-add.api.mdx @@ -5,36 +5,33 @@ description: "Configs Add" sidebar_label: "Configs Add" hide_title: true hide_table_of_contents: true -api: eJztWd9vGjkQ/lfQPC+BkoTe7dPRa6VGbRWUkLwghAZ7FtzbX7W9affQ/u+nsRdYoJCKqrpGghcWe+azd75v7LFZgsW5gXAMj6gVptbAJIAsJ41WZemNhBBElkZqbqYoJQSg6UtBxr7JZAnhkjstpZYfMc9jJZxf57PJUm4zYkEJ8lOuGdUqMvzryY821RTtd5q4mDvAtLyNIBwvwZY5QQjGapXOoQrWLWkRx1BNArDKxtxwz75VAE+kjfJz2INRqaU56aM4j7V/FYDIkkTZaULG4JxOndjfDqX1qUapAlDyGFYAUaYTtBBCUSh5FPtGQlUFq+5s9pmEhU33HUWkKRV057n7lEmKeQYNxs5M/I9MfMeD00xpkpyazWTZJ60xOifltJmuFUNvoKwuyDWYPEuNp7jX7fKXJCO0yq1jCu4LIciYqIhbd7UxBKfmeo4aE/eEUip2wXjYsOBZHQ7Z0HtXARQ6PpXyB31I7xu0s/J/hfKbOlayKdZ1Lrwd3X4HuQrAkH5Sgs5U/f5U7eznZ6p+X6oofVI6SxM60/US6GruWbGKSJQipmOkCU1oSU7Rnhwhj9AaWLft5vIn8R48wg7erJweD/yPQL4pWxzzJurPQx4t4T7SHEX5ccXEs5vXmbOXw9lqFztz9nI4a25nZ95eCm/PbJL1kXFr1+ZT7eowujo3M85Vr7d/gH3EWEm3abbeaZ3p00+vkiwqd/BUlvwxdtsgzsRW7w/Edl33TDZxQK2xbMYx8xNk8hLjyrDdumRl2ihlvMlhUxeM1oh7n+OA38sPXds1i7J1eH10D7/GWx++Y4p5PxoN9wA9t9ukeg2Y1sBdRCZkFxnfT+aZYbgc7QJC6NSLuOnUFyEdf2/J+zFp44hxNwmwsDY3Yacj4qyQFzin1OIFqg7mygnfkCi0sqVzGQxvPlD5nlCShnA8aRrcs3S8GLbN1jxgrj4QhyXFhH8PCrvItPrXMxyA4tdbeC9+bxbl3eai9d03THK/qu0ctHyFvuF5XW1398vljRWvK3AZ4R/XUf+qff361ev21XW/155dRqLdE3/2L6N+HyPsH7g0+eWjclGeRpmLYK2SgeOnNRjeNAeE7sWriy7sKmXLmBMfhUv8VfhdNwQ7QlhLAAKgxGU9WMLkr00Hz4z1lmDawNsW5tZU1hKw9M128hhV2rjL8ppd3/AZP1vG4os+6Y4KC5Z3OIblcoaGHnRcVdz8pSDN0pzUZcuMozTmBWWxEukS/qHST49XvrZLezaPCy/KnVWQVyjvMRCCcnvUdtLIwOHt/QgCmNX/CSSZZB+NX3lJwa8QAvCfCuztssS1LSHGdF54kXhM/vwH+GRdvg== +api: eJztV99vGjkQ/lfQPC+B5ge926ejP6RGvSoooXmJUDTYs+B2197a3rQU7f9+GnuBBQI5RYnu5Xhh1575bOab+WZYgseZg/QObtEq1N7BJAFTkkWvjL6UkIIwOlMzd49SQgKWflTk/DsjF5AuedOT9vyIZZkrEfx635zRvObEnArkp9Iyqlfk+O0hnnZvKdvfdHk1C4B6cZVBercEvygJUnDeKj2DOlmv6CrPoZ4k4JXPeeGGfesEHsg6Fe+wB6O0pxnZozi3jX+dgDBFofx9Qc7hjJ57sfcBpfOlQakTUPIYVgKZsQV6SKGqlDyKfSmhrpPVtpl+I+Fhs31NGVnSgq4jd1+MpJxv0GLsfyb+QyYe8eAyU5Ykl2a7WPZJa53ORXnfLteaoTdQ3lYUFlxptIsUn/b7/CXJCatKH5iCm0oIci6r8s51YwzJc2u9RItFeEIpFbtgPmpZ8K0Oh2wUvesEKps/l/Kv9lC+76E9yoCS7TCvWfwwvnrk2DoBR/ZBCXrdQ3Y09HUOIf2grNEFvfZBbW5ylZFYiPzxEt9Lkb9X5k/y8eLAKw5eHLgd9xcGf0JtmnLdEkxWlJUQrDSLcc5PT/fF4xZzJQORnY/WGvt85ZDkUYWiV56ihGwb5EZs7f4LbVi3nMkmDmgtLtoRNPGCrBmFCx1wtyWsTFtdJJocNg3B6Ix59ykO+HfFoxu7dj9chzdG9/DP+BDDd6whfRqPR3uAkdttUmMOuM4wDIEF+bnh2bA0juFK9HNIodeUg+s1TagXZ0YuP7IuEBNUHObely7t9URuKnmCM9IeT1D1sFSwe/Qw7Hbes2lQdUeissovAt5wdPmZFp8IJVlI7yZtgxvOq5gp22ZrkrBUn4ljprHg92Hl58aq35H+BBRfYB69OCicsdebCfjjLyzKWJc7ahwnp00SrKeg/v4Ys7HiQQTOMvzjIhucdy/evnnbPb8YnHanZ5nonoo/B2fZYIAZDg50s1c/lYclnZkQwSaFGnreofhOWrYPhf7Jm5P+IT4bh85wdNkoBIqgECsqghkkOxmzzhVIgIogD+AJi782G3xLTswCdQtvO4O3rrROB0+/fK/MUenWwBGTez2GuXhbxuJpTIY+N+c6SO9guZyio682r2te/lGR5TSdNJ1iyhG7Y+WZrxJ2Cd9pEa/HEtkN+sDmeRUTdEcuWcqix1AIKv1R20mrVEdXN2NIYNr8cSuMZB+LP1l78CekAPzPj71DxYS1JeSoZ1VMmIjJn38AtvDYmQ== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Configs Add @@ -43,29 +40,1921 @@ Configs Add as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + + variant_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + application_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-commit.api.mdx b/docs/docs/reference/api/configs-commit.api.mdx index 84fce6c351..fe9e7dec4a 100644 --- a/docs/docs/reference/api/configs-commit.api.mdx +++ b/docs/docs/reference/api/configs-commit.api.mdx @@ -5,36 +5,36 @@ description: "Configs Commit" sidebar_label: "Configs Commit" hide_title: true hide_table_of_contents: true -api: eJztWttu2zgQ/RVjnuXYdRK3q6d1L0CDtoiROHkxDIOmRjJb3UpSaVVD/74YUrLlS5zCRYJqobxEpmYOqTnUzBxJK9AsUOBO4Z5JwWKtYOZAkqJkWiTxlQcu8CT2RaDmPIkiocEBid8zVPpt4uXgrui8xljTIUvTUHDj2vuqkpjGFF9ixOgolQSsBarSzRfB/njKJIvMEfM8QVAsHNcstMzQAZ2nCC4ki6/IaU1a6JAGxta7cCCToQGJ82sf3OmqclFaijiAwlmPxFkYQjHbgNzJkBBqVzOX6G+jbS9ahVlw6my35Fs48IBSCRuzPRgRawxQHsW5L/0LByxV8wiVYgGeurB3BqXzpUQpHBDeMSwH/ERGTIMLWSa8o9hXHhTFPo20tYREj3ak8KDmcIM+Sow5vp9cH0AuHFAoHwTHlqq/n6oHm2xaqv5+qjB+EDKJI2zpagJd9ZoVCh95zkM8RhqXyDR6c6ZPjpBF6Iy0Kbup94d4dxZhB2+Rz48H/ncg3+Ydinkd9c8hD3JYmX3GgPH8c8XEk8Wr5aw5nFVVrOWsOZzVy1nLW1N4e6JIlpJxq2qTuDRoT/iWMnTP98aKXCgIYONA6tMMqDSJld0ig36f/nmouBSpNu0L3Gaco1J+FnZuSmNwTtXKrSZu28FWE/+/qWo1cWOoajVxo+hqNXETe75WEzeRs1YTN4+zVhM3kbcTNXElRr8kHoakbgsHLgaDfQF7z0LhmaLZ+SBlIk9Xrx5qJozwFBqtjN02CBO+dfY3Yrvue2abODApWV6PY2IXSORFyrRhu31JZVprZazJ46YmGJ0JnX2KA7ouO3VpV2/K1uG10X38Mt7b8B3bMR8nk/EeoOV2m1S7B1TnXfUuP0K9TOgtf5oo+p0yvQQXemUeV73y7X9v/fafqjJKZegxzxNgqXWq3F6Ph0nmnbEAY83OmOixVJjtr5BnUujcuIzGV58w/4jMQwnudFY3uKUNZLfEttmaDZaKT0jBiVlEv0eZXiZS/LI8OyDoIpfWi66etubN5nOFDz9ZlNrcVvv8oHq4Uj0g2XB+4GmHbeg3JuvmvL/fXW+sKA3Buc/eXPrDi+7l61evuxeXw0F3ce7z7oD/Mzz3h0PmsyHsi/YXmHFHe77AjAck1AvM+qgSqFe0DXa9Lu2PltXl0Il6yjrcxj7nhAd7sOec8NEG4vkmpZtbxH5ickOZBUcm83RG46v67oH+2auzPuxmwi1jKmyMm8JWJRZzGpydFLdObuAARqaqgUYW/bs5QSujZBqxuIa3l3i3VrPObxp/6l4aMhHXHtfanDyteFV2wQQH1Z1BlWVJGdydwmq1YArvZFgUNPw9Q0mpd1ZujAXFakplc1kl4RV8w9wukup71xQ3Mg8zm3R3aj3VYesx4hxTfdR2Visy4+vbCTiwKL8cixKPfCT7QYWT/QAXgL4+I29TBczYCkIWB5m97y0m/f0HI34x3Q== +api: eJztWFFvGjkQ/itonpdASULv9uloWqlRrwpKaF8QQoN3Ftzuere2Ny2H+O+nsXfBBEhOVYh0UnhhsWe+8c54vm/ECizODcRj+IpaorIGJhEUJWm0slDXCcQgCpXKuZmKIs+lhQg0/ajI2HdFsoR4xfuWlOVHLMtMCufa+WYKxWtGLChHfio1A1tJpnZL5Xx/vUSNuXvCJJEMhdkwsLC6ogjssiSIoZh9I8FnstJmvDD03usIKp05ELW8SSEerxoXY7VUc1hHmxVVZRmsJ1uQLzpjhOBtpprSg2ibA3BSpKaEcykTCNBuKSVNStD70c2BsOsIDOl7Kei0Qe59gU8bhNS91IXK6dSBwtpkMiWxFOz5WLgG/O/G/Ml6PDtwU4NnBw7z/szg6/1mCwtXt2tQvCvX2A7tCd+aAvZ8bz3BwJoBtg7c+W7BlIUyni163S5/JWSEliVfB4jhrhKCjEmrrHVbG0P0uzz1ykevfPTKR/97PmqI4HORUMbMso7gotfbJ4+vmMnEFbL1QetC/z5zJGRRuqaXljyF7BpkhdjZ/Q/cIJWlOWmf5XoNtcZlmMHCH5A5IzduxNrF25p+JmNwTrABO27qktEa8e5TNeD38qFru6Aa2/T67B5/jfc+fYeCNSYfR6PhHqCv7W5R/R0wratmhs3JLgqebsvC8O8S7QJi6NQdYTr11NvZTL3chKSNK4/jclhYW5q40xFZUSVnOCdl8QxlB0sJDw8wcLutKzZ13G5IVFrapcMbDK8/0fIjYUIa4vEkNLjj2+Xvy67ZplRYyk/EmVOY8+9BZReFlv/4SxCB5AMsvBenhu/t7XaG//AL89J3ZzCTN6rXKNf2QhyQIZNV89CEE+Xeu8vNwwmc5vVNC6wk5/88xT8u0/5F+/Ltm7fti8t+rz07T0W7J/7sn6f9PqbYh31NeoGIDwTqBSIeUKsXiHpUuoQmtJRM0YbYVZk8sjpbTl3wAxshnx2WtFMGPCh1pwx4VAJPF5SbW6q0cNxQU2RNPO9QfCeVhDcIumdvzrrHmKp2aA2G17UConAK2JCMM4PoARduWBAioNzJH1jC/K/tBp+SWTdHFeDtMfTOqTZcZ+mX7ZQZShXM1J68x02NjT8ww0HTJSxBC6b6eAyr1QwNfdHZes3LPyrSTMOT+pLMOG9j1tdFQ8gr+E5Lf0geBNpOBdk8qzwBPxgKWLC9x0AIKu2jtpNAjYY3dyOIYFb/tZIXCfto/MkKiz8hBuC/Z9jbKYJbW0GGal55DvCY/PkXTc0ZEw== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Configs Commit @@ -43,29 +43,2931 @@ Configs Commit as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + config + object + + required + + +
    + +
    + + + + params + + object + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-delete.api.mdx b/docs/docs/reference/api/configs-delete.api.mdx index 2930054eab..f25c7100a9 100644 --- a/docs/docs/reference/api/configs-delete.api.mdx +++ b/docs/docs/reference/api/configs-delete.api.mdx @@ -5,36 +5,36 @@ description: "Configs Delete" sidebar_label: "Configs Delete" hide_title: true hide_table_of_contents: true -api: eJztVt9P2zAQ/leqe3ZpKVC2PK37IYEYAlHGS1Uh17mk3pw42A6sq/K/T2enadpCxyZNe1lfmvjuPp/v++6cJTieWogmcMeN5LmzMGWgCzTcSZ2fxxCB0HkiU3sfo0KHwMDgQ4nWvdfxAqIl2R3mjh55USgpfGjvq9U5rVkxx4zTU2EI2Em09PYYNrw3mOwarSpTD5gvrhKIJktwiwIhAuuMzFOoWLOSl0pBNWXgpFO0MKbYisEjGitDDjswMneYotmLc1fHVwyEzjLp7jO0lqf4p4l98CidyxqlYiDjfVgMEm0y7iCCspTxXuzzGKqKrcx69hWFg7X5BhM0mAu8Cdxd6hgVZdBibMXEOp3/nPwLTrYBn8OgFpQGY+rcdiO1dqf2vN/q3Yqw1rHOlOgXbKFzG1ge9Pv0F6MVRhbOkwXjUgi0NilV56Z2Bvb6xt8iuF2CANb5EPLsfGzyrBgcDwa7qdxxJWO/UeeTMdr8Th6beo7RcanoSTrM7K6D0mLD+gp9NRqerknjxvBF69CfdUiQxJbZtFWgRmMr15Ysg8vLrr4YnVuy/kowdK6wde3XbrCmvKG6Lx/jYyjfPoWf3d5e7wAGbjdJ3aKfQYZurunyKbQlxIK7OUTQq7Vue7Wwe82lZNHQcPH0lEZBBHPnChv1ekLpMj7gKeaOH3DZ44X0bWpRlEa6hQ8ZXZ9f4OIMeYwGosm07TAmAQVJbLo1bPBCXiAVJ+cZvY9KN9dG/gg8M5B0yHmIotOTNG/Wt+in7zwrFD5zK4aZu2a7mZ/93QG49qIRBkcJf3OSDI+7J6eHp93jk+GgOztKRHcg3g6PkuGQJ3z4wg3w13elMZsn2lew1srI89MZXZ+3N4T+weFBH7b1suFM7c+Fb/9V+b0Z2JYQGgkAA8x874NDnr1bGygzklzG8xbejjw3smlU4PC76xWKS9/afu9lrdxmStuQMMF5HA84ZTAnnUcTWC5n3OIXo6qKlh9KNCTQKQsAM6rVhIbLfCXVJXzDRUiSpmDXjwByV2WQ5tZEpGkVIkZCYOH2+k5brXh9Nb4FBrP6sy/TMcUY/kTjhT9BBECfjhTte8WvLUHxPC2DVAIm/X4C1tmP1w== +api: eJy1VlFv2jAQ/ivonk2htGVbnka7Sau2alXb9QWhyjiX4M2xU9vZxlD++3R2CAFa1k0aLyS+u8+f7z5/sALPcwfJFO65lVx7BzMGpkTLvTT6MoUEhNGZzN1Digo9AgOLjxU6f27SJSQrinvUnh55WSopQungqzOa1pxYYMHpqbQE7CU6evseN3ywmO0HnaryAKiXnzNIpivwyxIhAeet1DnUrF3RlVJQzxh46RUt3FJtzeA7Wicjhz0YqT3maA/i3Df1NQNhikL6hwKd4zn+K7GLgNK7alBqBjI9hMUgM7bgHhKoKpkexL5Moa7ZOmzmX1F42IRvMEOLWuBNnN2VSVERg87E1pPYo/NitF16TzEi8UiLKWmuK4HOWUhYDzuqqwlrU+tthWHBlUa7qJnRcEhfKTphZenD6OG2EgKdyyrVu2mSgb1csjty6bYggvUuIs/eu5ZnzeB0NNqncs+VTMNGvffWGvs3PLZvR4qeS0VP0mPh9hOUEVvRF6i1vRGzzdC4tXzZOfQnEwmScAqXdxrUKnad2hF5THk+NTSjd0fRPwmGzhW3bvK617Vtb+zu88d4F9t36L58uLu73gOMs90e6s74GRToF4ZsszSOEEvuF5DAoNG6GzTCHrR26tCSVYXxVFZBAgvvS5cMBkKZKj3iOWrPj7gc8FLCLoFJiPYuKDU4gkNRWemXAW9yffkRlx+Qp2ghmc66CbekrqiX7bR2VLyUH5E6p3lB75PKL4yVv6IIGEgisIhV1BrS7c3mx+H9T16UCp8w+2jvGym0Vj3c99pNFrklnGT89Vk2Pu2fvTp+1T89G4/685NM9EfizfgkG495xsfPGNt/35UcXWcmdLARUjOecy6+oU67m8Lw6Pho+Nw8m4Le5Pqy8Qkugk+sRxHSgO0optUKMMAimAR45MXbTYBYkjYLrjt4ezreYtUqwuNPPygVl8EDwt6rRuKtnbtImOACTgCcMVjQhUimsFrNucMvVtU1LT9WaEmsMxYB5tS3KbnQYi3bFXzDZSRJdtkPXkHpqooy3bFOsrVYMRECS38wd9a5s9efb++Awbz5Z1OYlGos/0E+xH9AAkD/jqg63JuwtgLFdV5F2URM+vwGewsv2w== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Configs Delete @@ -43,29 +43,470 @@ Configs Delete as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + + variant_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + integer +
    +
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-deploy.api.mdx b/docs/docs/reference/api/configs-deploy.api.mdx index 3b8596193d..f1bb51d0aa 100644 --- a/docs/docs/reference/api/configs-deploy.api.mdx +++ b/docs/docs/reference/api/configs-deploy.api.mdx @@ -5,36 +5,36 @@ description: "Configs Deploy" sidebar_label: "Configs Deploy" hide_title: true hide_table_of_contents: true -api: eJztWVFv2kgQ/itonk2gJKF3fjraVGrUVkEJyQtCaFmPYXtrr7u7Tusi//fT7BpjICEV1TWJRF4Cu7Ofx/PNzM4MS7BsbiAcwx3TgqXWwCQAlaFmVqj0MoIQuEpjMTfTCDOpCghA47ccjX2nogLCJe1bTC19ZFkmBXdHO1+NSmnN8AUmjD5lmoCtQEPf7v0Dpxrj3U0j87kDTIurGMLxEmyRIYRgrBbpHMqgXklzKaGcBGCFlbRwQ2fLAO5RG+F12IERqcU56r04d9X5MgCukkTYaYLGsDkeqth7h9L6UqGUAYhoH1YAsdIJsxBCnotoL/ZlBGUZrLbV7CtyC+vta4xRY8rx2nP3RUUoSQNM74VWaYJHJp6ZiUbsrJhYq3Pk5Dk42QZ8CIOSodAYUQ5tprTd0GroQ6lzupVXS0Jfo1mdo1swmUqN573X7dK/CA3XIrOOPrjJOUdj4ly2rithCA5NyhnTLHGfWBQJOsLksCFBWj1ux6E/XQaQa3moH9zqYzg8Tzg0XVlETX+tA+RidPVQXARgUN8LjkeqXj5VW4XXkaqXS9UD1dmRrpdLV/POkiJGXnCJ+0jjGpnFaMrswRbyCK2BddduFv0m3q1H2MKbFdP9hv8VyHdFi2zeRP19yL113WecM158XjHx5OV15Oz1cLa6xY6cvR7OmtfZkbfXwtsTl2TVMm7c2tTYrprRqpl27e1Zr7fbwN4xKSJ3abY+aK304d1rhJYJ13gKi76N3RSQim/s/oJt67pnsrYD05oVTTsqryCRlxhXhm3XJSvRRinjRR4XdcZojWj3KQ7ovfyjK7lmUVab11v38de48Obb5zEfR6PhDqDndpNU7wOmdbEaGidoF4rGyZkyhJgxu4AQOlUeN51qHNKpx8x0K6M2jh43T4CFtZkJOx0uVR6dsDmmlp0w0WGZcO5vkOda2MIdGQwvP2HxEVmEGsLxpClwQw7kXWJTrGaDZeITkhYpS+j7ILcLpcVPz3MAgl5y4U/R25NrXq/n4h9+sCTzuW2r3fJ1+prtuubu7hbNaynKLnAas7/O4/5Z+/ztm7fts/N+rz07jXm7x//un8b9PotZ/5GZ7h946gMDm//9qdQQpLFyvFUeOnBe0RoML5sPhO7Jm5MubHvphjAlHcZd0lmR7rYh2HK/2vFoyJe4jAMWWfLPeoM0I0dPWNrA2wmKDW1q37P4w3YyyUTaGKX5eKlnjMYrTHAOxwFOAlhQdIVjWC5nzOCtlmVJy99y1BQWk6pwmpGtxpTSFqsAWcK/WHglKfe2XeIhcZn7gNjKw5Qj/YkB55jZvbKTRgIYXt2MIIBZ9fNRoiI6o9l3SmrsO4QA9BMUnXYR6taWIFk6z72reEz6+w8CURwP +api: eJztV01v2zgQ/SvGnOXYdRJ3V6d1mwINukWMxM3FMAKaGtlsKVIlqbReQ/99MaQky5/pBsnuZX2xTM48jmbePI7X4NjCQjyFe2YEU87CLAKdo2FOaHWdQAxcq1Qs7EOCudQriMDg9wKte6eTFcRr2neoHD2yPJeCe9feV6sVrVm+xIzRU24I2Am09OsxHPhgMN3ftLJYeEC1ukkhnq7BrXKEGKwzQi2gjJoVVUgJ5SwCJ5ykhTvyLSN4RGNFiGEPRiiHCzQnce4r/zICrrNMuIcMrWULfG5g7z1K53OFUkYgklNYEaTaZMxBDEUhkpPY1wmUZVRv6/lX5A4227eYokHF8TbU7rNOUFIEqB6F0SrD/yvxH1ei1Tt1JfbC+WW03fAORURtLAwm1P3tZtwnRevtqOkfdhShJPQNmjMF+gWba2UDiwb9Pn0laLkRufNkgLuCc7Q2LWTntjKG6LlykjPDMv/EkkSQC5PjlgVFdbwq4+BdRlAY+VxWfTH/vJDtIoiknemmtFeTm0MVjcCieRQcX/eQHZl+nUMOqNDrHNSujRQp8hWXh1VkjyJ/1uZP1uPFgesavDhwO+8vDP6E4FTtuqXJJCq1EFRC5qXlYjDYF497JkXiC9n5YIw2z1eOBB0TvumFwyAh2wZS863dX9CG5labbfLAjGGrdgZ1CJA0I7P+kt29dWrT1kUVTI6b+mR0JrT7VA3ovcLRlV37ym3SG7J7/DWuQvpO3XkfJ5PxHmCo7XZRAwds56oeNTN0S01DaK4tIebMLSGGXtURtlddRb1mOKUmRGN9ebyWw9K53Ma9Hpe6SM7YApVjZ0z0WC5gN4CR3+28J1Ov7RZ5YYRbebzR+PoTrj4iS9BAPJ21De6IXYEv22ZNqVguPiGFqFhGv0eFW2oj/gokiEBQAMvgRakh3t5uRu0PP1mWh+7c0eQwom2o0Ixb/f15aWNFEw+cp+y3y3R40b18++Zt9+JyOOjOz1PeHfDfh+fpcMhSNjwyJv4Lpx64SV/9VJoFVap93Sr6VqR4x/g3VEn7UOifvTnrH2NR5dAZja8rdWLcq1NNAG8G0Q5PG4bSJJZ5aQKHLPtjs0FRUkdkTLXw9rpnK6qGhw5/ul4umVCteSc0VjMI2hAwwXkcDziLYEltGE9hvZ4zi1+MLEta/l6goRaZVXfVnPI2Je1b1s2yhm+4CkGSSHe9QpG5LEJz7Ag2iWnwGHGOuTtpO2spxfjmbgIRzKt/p5lOyMewH6R+7AfEAPQPl7x9t/q1NUimFkWgTcCkz9+ykyhf sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Configs Deploy @@ -43,29 +43,2036 @@ Configs Deploy as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + + variant_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + environment_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-fetch.api.mdx b/docs/docs/reference/api/configs-fetch.api.mdx index fcf353689e..d6eede6c4b 100644 --- a/docs/docs/reference/api/configs-fetch.api.mdx +++ b/docs/docs/reference/api/configs-fetch.api.mdx @@ -5,36 +5,36 @@ description: "Fetch configuration for a variant or environment." sidebar_label: "Configs Fetch" hide_title: true hide_table_of_contents: true -api: eJztWVFv2zgM/isCX7oBbtN1W3dn4IDrtg4rtqFB2u2lCQpFomPtbMmT5La5wP/9QMlJnTTLhg43tED6UkciKZIfRVLSDDyfOEgv4Au3imvvYJSARCesqrwyGlJ4h17kTBidqUltOY2yzFjG2VXkYcYy1FfKGl2i9ntDPdTHyudo5xSXFjN2OuhShaGydp6NkVXWXCmJkj1RGdMYeZVbjCdDzZnEjNeFvyPkWvmcuaKe/DWEyhpZC1JxCOxaFQVJrx3Kp0Grd6QpFzmzmKFFLZCZ8VcUnj3paJqsLpEwXlWFEsF2GniaDvUu60ftWKvvDumwQ87YUXKHZQoLSWQ7V2idMnqHLDLBq7xgXEsmuCb9HHrmDdN1URD9SRYFdO1nyi+Zw6SyKHwxJcYsAORzZBadqa1AEnNKSl0rh8lcsyUBvDB6En23Yhw5aoC+ttqlQ80YY28C9gN0ldEOPxmJRcrOc1wTFFGLbzU6j3JTgAy4cjhf4P35ef/4RmBwTkoe8HekK8e08SwztZZ7kICpMM6cSEgh0rrL4AtIoNXhtZFTSGc07VF7+uxY2/vqKMJn4ESOJaevypJcr9DRr05QBFY9Pc0gvVglI/cuz/tphZCC81bpCTTJYoRAhmaUgFe+oIEz4m0SaINkrRilPU7QbpTzpeVvEhCmLJW/LNE5PsH7KvYmSGGfWilNAkpukpVAZmzJPaRQ10pulH0ioWmS+XTcgnA7PZjvzkFEMUTcGoFNAis7dYvSg0RpJcNsUXqAKG2QQVn0cjnDNg0x2LYkBOQO9vfp33LzcFYLgc5ldcHm9QOS+6bjiltehi8upYqFtN+h8LbG71vRj9xNArUt7ovkZ0vO2wb07w9oqujKoqRmVUkYrQnxt+en6/OPQ3ulBG6hevhQbVuuRwPVtvd6VHB1a1ahMhRTUeAm0IRF7lFecn9vD0UJ7MiHslvJX5T3OUpYkTeeXm52/M+IfD1l5POu1F8XubEz+4gTLqYf50j8sHhtMXs8mM2r2Bazx4NZt5xtcXssuP2gSLZHxqWqfecysz3Nvjg4uHuA/cILJeMN5LG1xt7/9CrRcxUOnspjPMYuExRGLM3+hG8Xfc/o1g/cWj7t+tFEBQm80oU2bLUvmZN2WplI8n3S4Ax2TrM/woDsiku3dN2mbOHe6N3vm/E2um9TxNA18h2BEdsSfW7oorgyjlgq7nNIodcmatdrrzd68wtkqrpoXXB/uC+A3PvKpb2eKEwt9/gEted7XPV4pUJ4OxS1VX4aWI76Jx9w+h65RAvpxahLcEYBEiFfJlt4m1fqA5Lxmpf0+6j2ubHq34hjAooiM49cZB2F3uD2xvv4hpdVzF0rx6nYh9+iueip9+82xbdUlD3gecb/eJkdvth9+erZq90XLw8PdsfPM7F7IP48fJ4dHvKMH8L6U8FvWHXNhcz/vio1/DozAbc2Ao9CVLCj/kl3Qdjfe7a3D6sPa0vElFS4CEllDnqYhmQl/BaBBwlgGTIKeOTl37cTpBnFecl1R15MfI69ayN8SZnOE8n2wW/74PcQH/za3OjxxveqgivducqN6fxinu5c3FAU7nTqDgE/SiCn3J9ewGw25g4/26JpaPhbjZay9qjt28e0lS+ooubz/D2Df3Aa9xBtkt1Q94i8qGO+XmkDqERHjiNBVm6kHXXKU//07BwSGLfvlqWRxGP5NdVUfg0phKdP4g4FJIzNoOB6UsdMFmXS33+QQ/Ta +api: eJztV01v2zgQ/SvEXNwCSpzmq7sCFti0TdCgLWI4bi+2EdDkyGIrkSpJJfEa/u+LIeVEdpw0bdPFHppLZGpmOHzz5g01B8+nDtIhfOJWce0djBOQ6IRVlVdGQwon6EXOhNGZmtaW0yrLjGWcXUYfZixDfams0SVqvz3SI32sfI52aXFhMWNn/bZVWCpr59kEWWXNpZIo2TOVMY3RV7mb9WSkOZOY8brwd4JcKZ8zV9TTv0ZQWSNrQSmOgF2poqDotUP5PGR1QplykTOLGVrUApmZfEbh2bNWpsn6FgnjVVUoEc5OC8/Tkd5ivZgda/LtUA4dAqOjZIdlCgtJZp1LtE4Z3aETmYAqLxjXkgmuKT+HnnnDdF0UZH+axQDt8zPlV47DpLIofDEjxywUyOfILDpTW4EU5oySulIOk2VmKwF4YfQ0Yrd2OAKqj7622qUjzRhjr0Pt++gqox1+MBKLlA1y3ECKmMXXGp1H+RBB+lw5XG7wdjDoHV8LDOCkhIC/E105po1nmam13IYETIXxzamEFKKtuwhYQAJNDq+MnEE6p9cetafH1mm7nx0xfA5O5FhyeqosxfUKHf1qkSK46tlZBulwDn5WIaQQyQMJeOULWugvedWP+wesYJHceFCRYTFeJLDGsSePv1bVJ46/SO6NQZhfrNZjsSAH2xAoQLu7s0P/VqXmvBYCncvqgi3ZBsmPFq/ilpfhiUupYtv1Whbe1nj/KXrRe5FAbYuN4DlvlZ5uAOc2yEdL4H1fKYi5yqIkUVYSxhuK82ZwtrnmDu2lEvhrN3l0U/zMJt/VHT+zUbs2hcpQzAR5PqZZ3i/Nv1mPJw+8rMGTB27j/sTBN0hGu3BNu7aKt2HsNEqyv7t7Vzw+8ULJOCuOrTX2x5VDoucqNL3yGCVk1aAwYuXtI7RBaY9TtBHlZo1by2dtBE1MkDSjdFOKvBrv1vQDOsenCDfB7jcNYLABvf1WDehccevGrlWNW3gjuvcf402E76EZQQP/TsBY2xJ9bmikV8aRS8V9Dil0G8q7bjNaustRT02G1gX4g1ZD7n3l0m5XFKaW23yK2vNtrrq8UrB+uz0Kb9lrMg3a7VDUVvlZiHfUO32Hs7fIJVpIh+O2wTmxJ/Jh1eymFLxS75CQ0byk30e1z41V/8QiJ6AogTx60dGJl/3bi8vxNS+r2H1rmkv3uXapmxsmpDvE+bJU/qJsCNKyUoTqXsb/OMgO97cOXr54ubV/cLi7NdnLxNau+PNwLzs85Bk/hM0C/B/sumFS/vJdF1SIzIS6NfRsSPGKiy+oZXtT2Nl+sb1zH4saB3bUO23Uh4ugPksCBDNI1nh6w1BIAMsgPeCRl3/fvqAsqSFKrlvxokI6dtK0wkpSrVvv72+4399w/8dvuEYnPV77blVwpVv37aj7w6X0udhQRHdIIGr/OIGchkQ6hPl8wh1+tMViQctfa7Sk4OPmqjShth7S6M2XWj6HLziLPURNshUGJJkXddTutfsCzfLocSTolA/ajltzrHd2PoAEJs2naGkk+Vh+RcOXX0EK4WuWvMMwCWtzKLie1lHVYkz6+xfaISQU sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetch configuration for a variant or environment. @@ -42,45 +42,2082 @@ Either variant_ref OR environment_ref must be provided (if neither is provided, a default environment_ref with slug="production" will be used). For each reference object (variant_ref, environment_ref, application_ref): + - Provide either 'slug' or 'id' field - 'version' is optional and can be set to null - If 'id' is provided, it will be used directly to fetch the resource - Otherwise, 'slug' will be used along with application_ref Returns: - ConfigResponseModel: The configuration for the requested variant or environment. +ConfigResponseModel: The configuration for the requested variant or environment. Raises: - HTTPException: If the configuration is not found. +HTTPException: If the configuration is not found. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+
+
+
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-fork.api.mdx b/docs/docs/reference/api/configs-fork.api.mdx index a0b885758c..3dd2976ccb 100644 --- a/docs/docs/reference/api/configs-fork.api.mdx +++ b/docs/docs/reference/api/configs-fork.api.mdx @@ -5,36 +5,36 @@ description: "Configs Fork" sidebar_label: "Configs Fork" hide_title: true hide_table_of_contents: true -api: eJztWVFv2kgQ/itonk1ISULv/HT02lOjtgpKSF4QQsN6DNvYXnd3ndaH/N9Ps2vAkIRUVFcFCV4wuzPfruebmZ1ZFmBxZiAcwR1qiZk1MA5A5aTRSpVdRhCCUFksZ2YSK30PAWj6VpCx71RUQrjgWUuZ5UfM80QKp9j5alTGY0bMKUV+yjXDWkmGfz345SaaYqealVcxhKNtMZMUs815W+YEIRirZTaDKliNZEWSQDUOwEqb8MAN61YBPJA20u/mEYzMLM1I78S5q/WrAIRKU2knKRmDM9p3Y387lNaXGqUKQEa7sAKIlU7RQghFIaOd2JcRVFWwnFbTryQsrKevKSZNmaBrz+IXFVHyBGAVAGUPUqsspSNLr5ilRswdWXqlLO3A4Cw62UiwVcXymkyuMuOJ656e8ldERmiZW2d/uCmEIGPiImld18IQ7JuNc9SYuieMIskqmAwaElYX9PxLDLx2FUChk32JvNVsu6M//35/5gNdaoq4CpARjJ/w8PfDq6fTjyH9IAUdqXr9VB0rroOh6lh6HRRdzTMrkTGJUiS0izShCS1FE7R7W8gjtPrWHbt59It4tx5hC29aTnYb/mcg35UttnkT9dchdxZmn2mGovy8ZOLFw+vI2eFwtjzFjpwdDmfN4+zI26Hw9sIhWbeMG6c2t7HLZrTuhl03e97tPm5g7zCRkTs0Wx+0Vnr/7jUii9I1ntKSb2M3BRIlNmZ/wrarume8tgNqjWXTjspvkMlLjSvDtuuSpWijlPEiz4s6Y7SGPPsSB/xefularlmUrczrrfv8a7z35tvlMR+Hw8EjQM/tJqneB0zrH39XnJKdK75DzpVhvBztHELo1FncdOqrj059t8wnMmnjqHF3CTC3NjdhpyMSVUQnOKPM4gnKDubSub4hUWhpS6fSH1x+ovIjYUQawtG4KXDDzuPdYVNsxQTm8hOxYTJM+Xe/sHOl5b+e4wAkv+Dca/Gbs1tery/DP/zANPd5bavV8jX6mulVvX36uGBeS3FmgbMY/7iIe+fti7dv3rbPL3rd9vQsFu2u+LN3Fvd6GGMPnu4YfsOqT1zW/O+rcjOQxcrxVntn33lFqz+4bC4IpydvTk5h20M3hDnhoHAJZ0m6m4Zgy/1WjgcBUOqyDVjC9K/1BO+M3TzFrIG3FRAbe1l5nqUftpMnKLPGJZqPldHSmYzfLoP5fueeo33OcRWOYLGYoqFbnVQVD38rSHNIjOuCacp2GnEqmy+DYwH3VPoNcs5tu4TD4knhg2Er/3Ju9Bp9ISi3O2XHjdAfXN0MIYBp/X9RqiLW0fidkxl+hxCA/3FibRedbmwBCWazwruJx+TPfw9sE+U= +api: eJy9V1tz2joQ/ivMPptASUJP/VR6m2Z6OmES2heGySzy2qixJVeS01LG/72zkgFDoU3bpLxgpN2VtN9FZgUOMwvxFD6ikaichVkEuiSDTmp1kUAMQqtUZvYm1eYWIjD0uSLrXuhkCfGKZx0px49YlrkUPrH3yWrFY1YsqEB+Kg2XdZIs/7oLy90YSn2qWl6mEE9X4JYlQQx6/omEgwicdDkPXFFKhpSgq7D+e51QDnW0yVBVnkM9qyMgdSeNVgU9Uv3WOR+hfh0drcE9v9mBo6453pAttbKhs4N+n78SssLIkjcJMVxXQpC1aZV3rppgiP4UuxINFv4Jk0RyCubjVoQzFR0/xDhk1xFUJj/YO+uMVNmB3myLfDDcu99DgokrDSXMdpnA7AA2ryaXhyG3ZO6koMdd5N6a+JtFfkscf7NQG5tcpiSWgjPvo5X/1+G/xOPBC68xePDC7b4/cPEDjtEGrpFrC7yX3kLWRtA4kXeSs8HgR/P4iLlMPJCd18Zo8+fOkZBD6UUvHQUL2Q3ItdiZvYc3SOUoIxO63IyhMbhsd1CHDbJnFDbjyrv1tqHvyVrMCDbFjof6ZnQmPPsrDPhcYekmroXGtr2hu8eP8Sq072dXxNvJZPxDwYDtLqiBA7bzJtzqBbmF5tu+1JbrlegWEEOv0YPtNddOr3kLYAGSsR4a7+OwcK60ca8ncl0lJ5iRcniCsoelhP3FR36285JDva9bEpWRbunrjcYX72j5ljAhA/F01g64ZmYFruyGbWDCUr4j7prCgn+PKrfQRn4LBIhA8gYWIYvbwpy92r7TvP6KRRmUuefHNq+yNg34/P44fdZDUUh3UzTkaUVJbuppiv+dp8Oz7vnTJ0+7Z+fDQXd+moruQDwbnqbDIaY4hMPm/A9WPXCLPvqqNQORao9bQ92GFC9Q3JJK2otC/+TJSf8Yi5qEzmh80TgTCu9MawL4MIj2eLphKERAhbclcITF8+0E75L1UKBq1dtTzs6eNix09NX1yhylar3pBFFN18SyYbtcDCLwwppFsGABxlNYreZo6YPJ65qHP1dkWB6z5o6ac8+m7HmLtVBWcEvLsEE25653Jg7PqyCMPaNmEw0ZIyGodD+NnbU8Ynx5PYEI5s1fgEInnGPwC7sefoEYgP9EcLZXqh9bQY4qqwJlQk3+fAf610MQ sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Configs Fork @@ -43,29 +43,2065 @@ Configs Fork as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+
+
+
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-history.api.mdx b/docs/docs/reference/api/configs-history.api.mdx index df6e7e2548..dcd00dce61 100644 --- a/docs/docs/reference/api/configs-history.api.mdx +++ b/docs/docs/reference/api/configs-history.api.mdx @@ -5,36 +5,36 @@ description: "Configs History" sidebar_label: "Configs History" hide_title: true hide_table_of_contents: true -api: eJztWVFv2zgM/isBn5WmS9vszk+X3Qa0WIcGbdqXIAgUmU60sy1Pkrt5gf/7gZLjOM6S9joctgLpSxOJ/ETxIylKWYHlCwPBBB64ljy1BqYMVIaaW6nSqxACECqN5MLMltJYpQtgoPFLjsa+U2EBwYoELKaWPvIsi6Vwur3PRqU0ZsQSE06fMk3IVqKhb49+xZnGaHfSxPnCAabFTQTBZAW2yBACMFbLdAElq0fSPI6hnDKw0sY0cEe6JYNH1EZ6G3ZgZGpxgfogzkOlXzIQKkmknSVoDF/gSw3726F0PlUoJQMZHsJiECmdcAsB5LkMD2JfhVCWbD2t5p9RWNhM32KEGlOBt567TyrEmCxoMLZmYmPOkZNfwUkb8EcYlIJSY0ip20ykxuqUnrN28pYEtlG2Okc3YDKVGk9z//SU/oVohJaZdWzBXS4EGhPlcee2Egb2/MyXFhOzm+UZ19yP8zCUpMvjUUOCzNvvv5HXLhnkOn4p//f6mAa/Jg2aISzDZuTWifF+fPOjfGBgUD9KgUeqfn+qWsf8karflypMH6VWaYJHul4DXc0zK5YRikLEeIg0oZFbDGfcvthDHqEztO7YzcKfxLv3CC28eTE77PjnQL4rOuTzJurPQx7s565xwUVxvWbiycPryNnr4Wx9ih05ez2cNY+zI2+vhbcnDsnqyrh1atMVd30rrR82KhCuNS+2Lt1eruPVTOdyczMuGZz3+7uX3wcey9Cds50PWiv9X26+2xEWouUyPnAjjpXYmn0GHXWrNN2/62vlDSTHJMZ1bu1WZi3a6H68yH5R54zOmGafoo325Zeu5Jp9XO1e793923jv3XcoyC7H49EOoOd2m9Q2/wwStEtFL56ZMgSZcbuEAHpV7Te96jGlt3kJpaMctXEEuUcIWFqbmaDXE7HKwxO+wNTyEy57PJMuZwyKXEtbOJXh6OojFpfIQ9QQTKZNgTsKIR8U22I1HzyTH5GsSHlC34e5XSotv3umGUja5tJr0f4pOG83T7cfvvEk8wWxdUfzzf2G77pRP93ttDdSVJLgLOJ/XESD8+7F2zdvu+cXg353fhaJbl/8OTiLBgMe8cGe95b/fVXq59NIOQ9W0TJ0/HSGo6vmgnB68ubkFNoRsyVMBYALVwDW7nfTwFqBUIcAMMDEZT9Y5MlfmwmyjGIu4WkDbzdAt8ypw8DiN9vLYi7TxlOYj936bdB4iwkPGKzjd8pgSaEeTGC1mnOD9zouSxr+kqOmEJ1Wnc+cvDWhArNcB+sK/sHCm0mVsOvKAInHuQ/OVlWkiuU1hkJgZg/KThvZOLq5GwODefVrQ6JC0tH8K5UY/hUCAPrJgrRdtrixFcQ8XeQ+WDwm/f0Lo6aA4w== +api: eJy1V11z2joQ/SvMPouQkoTe66dLP2aSaTthEpoXhskIeQ1qZcmV5LSU8X+/s5IxBgJJOwkvYGl3td5zdHZZgedzB8kE7riVXHsHUwamQMu9NPoqhQSE0Zmcu/uFdN7YJTCw+KNE59+ZdAnJigw8ak8/eVEoKYJv75szmtacWGDO6VdhKbKX6OjpIZ54bzHb33SqnIeAenmdQTJZgV8WCAk4b6WeQ8WaFV0qBdWUgZde0cIt+VYMHtA6GXPYCyO1xznao3Huav+KgTB5Lv19js7xOf5tYu9DlM6XOkrFQKbHYjHIjM25hwTKUqZHY1+lUFVsvW1m31B42GzfYIYWtcCbiN0Xk6KiDFqIrZHYS+fZ0XbTeywjIo+0mBLp2hRovQsR636XdhUF2zh7W2JYcIXRLpKmf3pKXyk6YWXhA/ZwWwqBzmWl6tzUxsCez1npMXf7/Cy45XGdp6kkX65GLQtK7zAao+hdMSit+ls2fbV/DmC7+DJt17yB9MP4+jEkGTi0D1Lg6x6yIwqvcwjqB2mNzvG1D2pjo2SGYinU4+qxR5HPa/Mn8XjxwGsMXjxwu+4vHPwJoamv65YWk7ysFaGRwzoIt5YvtwQv2nWim+tcblSpYnDe7+8Lzx1XMg3Ydz5aa+yfqM622KTouVRH1EgZsbX7DDlpGuD08Ft/NjFBKkzuQj/ebVBr01ZPiyaHTUMxOmPafQo2eq94dG3X7s5NeWN1D7/Gh1i+Y+3xcjwe7QWM2G6Duos/gxz9wtCcVBhHIQvuF5BAr75Frlc3st5mfqKbi9YFgEIDgIX3hUt6PaFMmZ7wOWrPT7js8ULCbgrDsNt5T6ahITgUpZV+GeINR1efcHmJPEULyWTaNrglfkXGbJs1YPFCfkJKUfOcnoelXxgrf0caMJCUwCJ6UXGIuTebafDjL54X8UrvCHmc5zZkaGaz0/3hamNF4xGcZfyfi2xw3r14++Zt9/xi0O/OzjLR7Yt/B2fZYMAzPjjQCF/9VBrhdGZCBWsq1fC84+I76rR9KJyevDk5PYRn7dAZjq5qpeAiKMUaimAGbIcxDVeAAeZBJsAjz//bbFCWRM6c61a8fSZvpdVQwuMv3ysUl7o1r0SSNwOcixlTPGCwJvqUwYLuRDKB1WrGHX61qqpo+UeJlug6rZvNjCo3ISVarIm7gu+4jGmSZHaDXpC5KiNRd+STpC16DIXAwh+1nbau7ej6dgwMZvWfmdyk5GP5T9Ii/hMSAPpHRN7h5oS1FSiu52UkToxJn/8BFseNMw== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Configs History @@ -43,29 +43,1959 @@ Configs History as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + + variant_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs-list.api.mdx b/docs/docs/reference/api/configs-list.api.mdx index e04a6e7f8d..a5f2180151 100644 --- a/docs/docs/reference/api/configs-list.api.mdx +++ b/docs/docs/reference/api/configs-list.api.mdx @@ -5,36 +5,36 @@ description: "Configs List" sidebar_label: "Configs List" hide_title: true hide_table_of_contents: true -api: eJztWF1vGjsQ/Stonk2g+aD37tOlH1KjpgpKSF4Qiox3FtzrXW9tb9ot2v9+NfYuLJCQ3PShjUReAvbMwZ5z7BnPEhyfW4gmcMuN5JmzMGWgczTcSZ2dxxCB0Fki5/ZOSeuAgcFvBVr3TsclREuadZg5+sjzXEnhHXtfrc5ozIoFppw+5YZgnUS7ZXtnMNk1sKqYe8OsvEwgmizBlTlCBNYZmc2hYquRrFAKqikDJ52igWvyrRjco7EyrGMHRmYO52j24tzW/hUDodNUursUreVzfOnC3nuUzpcapWIg431YDBJtUu4ggqKQ8V7s8xiqijXTevYVRUOXNBgTxzKGlsMVJmgwE/hhfPmk6zZfD+FcBWVARWBrZ2cK9AM215kN7B73+/QvRiuMzJ0nCa4LIdDapFCdq9oY2PMFJh2mdldIOTc8jPM4luTL1ahlQcvb3XuzuVHwrhgURr2U9hujCOEBza/RDur/nerfQa4YWDT3UuCBqj+fqvuQvA5U/flUYXYvjc5SPND1Guhq5ywlExSlULiPNGGQO4zvuHtxhAJCZ+h82s3jX8S7CQhbeLPybn/gnwP5ruxQzNuovw75IIeN2QXOuSgvGiaeTF4Hzl4PZ00WO3D2ejhrp7MDb6+FtyeSZP1k3Mja1ANpXqVfdIz+RVeDcGN4Ce20Guw6wc12LmR4FlcMTo+Pd1++t1zJ2CfZzkdjtPk/z95NecXouFR7nsNKi43ZZ3CxqpOmj2/5QocFUlRS68u27TqmMW2VPsHkcVMfjM6YZp/ijPYVfrq2axdxq/CG6D6+jQ8hfPsU9mk8Hu0ABm43Sd0gn0GKbqGpn5Zr/z3nbgER9Opb3/bqPluv7rNRBkdjPTW+9wAL53Ib9XpC6SI+4nPMHD/issdz6Y+KRVEY6UrvMhydf8byE/IYDUSTadvgmsQT5LBptmKC5/IzUmAyntL3YeEW2sifgWMGkja4CF60c5Ll1box+PEHT/P6HtxteoS6fs32qkbv7xbZayu6jeAk4X+dJYPT7tnbN2+7p2eD4+7sJBHdY/H34CQZDHjCB35BMku030/N2tBHqzMcnbd/EPpHb476sM3chjEdRC78QWyC4aeBbdGyIgQYYOpPITjk6T/rCVoZ0Z/yrIW3JZSNtawYcfjD9XLFZdZqRgUNTZrKwYblEhgw8DqaMliQ3qIJLJczbvHGqKqi4W8FGpLKtC48ZhSnCR3xRSOaJfyLZVgg3UVdfxDJXBVBJFv3Et0ZwWMoBOZur+20dSRGl9djYDCre8qpjsnH8O90yPl3iACoK03eXrV+bAmKZ/MiyCRg0t9/uIrIOA== +api: eJy1V11vGjsQ/Stonk2gJKG9+1T6ITVqqqAkzQtCkfHOgluvvbW9aSna/3419i5Z2IS0VZKXgD1zPJ5zZjxswPOlg2QGN9xKrr2DOQNToOVeGn2WQgLC6Ewu3a2SzgMDiz9KdP6dSdeQbGjXo/b0kReFkiI4Dr45o2nNiRXmnD4VlmC9RLdne2sx6xo4VS6DoV5fZJDMNuDXBUICzlupl1Cx7YoulYJqzsBLr2jhinwrBndonYxxdGCk9rhEexDnpvavGAiT59Lf5ugcX+K/BvY+oPS+1CgVA5kewmKQGZtzDwmUpUwPYp+lUFWs2TaLbygauqTFlDiWKbQcLjFDi1rgh+uLJ133+XoI5zIqAyoCu3f2tsSw4AqjXWR3NBzSvxSdsLLwgSS4KoVA57JS9S5rY2B/LjDpMXddIRXc8rjO01SSL1fTlgWF1717c7lp9K4YlFb9K+1frSKEBzTfQftr3jrHVgwc2jsp8GUPuYsN42UPQX0nrdE5vvRBbW6UzFCshXq4zDsSOW/Mn+Tj2YEbDp4duJ33ZwZ/otHU5brTNOn9aTrCF5NiqKYahFvL19CmOtr1opvrncvYkioGJ6NRt+vccCXTQHzvo7XG/k3L2e00KXou1YFWpIzY2f2DXrJ9puaPX/ncxAApK7kLr+b+M9KYtl6eaPK4aUhG75p2n+KM7hWPru3ab+g2vTG7j1/jQ0zfQ4c1Jp+ur6cdwMjtLqk75DPI0a8MzTKFCd8L7leQwKCuHzeoZ5xBPeNQwaJ1gZrQ92HlfeGSwUAoU6ZHfIna8yMuB7yQsH/4JOz23pNpeAccitJKvw54k+nZZ1x/Qp6ihWQ2bxtckbKiVnbNtjTxQn5GyprmOX2flH5lrPwdBcBAUgCr6EVpIc1e3k9sH3/xvKgrufsaxZnrXgrb+WnYHYDurWiEgeOMvznNxif909evXvdPTsej/uI4E/2R+G98nI3HPOPjEJDUmQn3qSmtk/WOi++o0/ahMDx6dTR8LLu1Q28yPasrlotQsU1ighmwPf62zAEDzEO5gkeev73foChJJznXLbw9Re3EtGXH4y8/KBSXujUxRLHNmmbtYrgEBgyC4OYMViTMZAabzYI7/GpVVdHyjxItyWZe9/oF5WxGvWDVCGgD33EdA6Sm1Q8VS+aqjILZa2DUXKLHRAgs/EHbeat2phdX18BgUQ/+uUnJx/Kf1A34T0gA6KcDeQcFh7UNKK6XZZRMxKS//wHaI0Mi sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Configs List @@ -43,29 +43,1852 @@ Configs List as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + + application_ref + + object + + required + + +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + + + params + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + application_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_ref + object + +
    +
    + anyOf + + + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + commit_message + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + + required + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + application_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + service_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + environment_lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/configs.tag.mdx b/docs/docs/reference/api/configs.tag.mdx index 079f90d7a7..5debe215a4 100644 --- a/docs/docs/reference/api/configs.tag.mdx +++ b/docs/docs/reference/api/configs.tag.mdx @@ -5,16 +5,9 @@ description: "Configs" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/container-templates.api.mdx b/docs/docs/reference/api/container-templates.api.mdx index 2c68b3ec1f..40bc78e698 100644 --- a/docs/docs/reference/api/container-templates.api.mdx +++ b/docs/docs/reference/api/container-templates.api.mdx @@ -5,59 +5,69 @@ description: "Returns a list of templates available for creating new containers. sidebar_label: "Container Templates" hide_title: true hide_table_of_contents: true -api: eJytUsuO2zAM/BWBZyFOe9SpQVG0wV4Wu9tTYBRchYnVypIq0WlTw/9eUMk6j/PqYsgcUjPDGYFxX8Bs4HMMjC5QLtBq2FKx2SV2MYCBJ+Ihh6JQeVdYxZ1i6pNHpqLwgM7jqye1i1nZTMgu7FWgP8rOIxegISbKKAPXWzAw137Mo0BDppJiKFTAjPBxuZTPLZXnwVoqZTd49XQGg67TKLDAMSXvbH2o+VmkZ4RiO+oRzDjJ0dATd1FY7IlBQ0LuwEBz4dtckyqUD2KL2YwwZA8GOuZUTNNYH4ftAvcUGBfoGkwOplY67JAdH2vL6nH9QMdvhFvKYDbtNeBZiJ3U3sJG4GMiMIDJPdARNATs5b4auIvZ/asCQYMTU7pTl0hzYRdru2Nf8ZWcWj2uQYPIONm4XHxYLOF+zzfg6oatnr69Xcug71yY9YMG6tFJjQn7T5eCMEuxcI/hat4cOfVyZfcNpfGy2vdJ4dlWpr/cJI8uwHTWM55zsLlkU+hcktBq6GJhQYzjKxb6nv00ye/fA2VZdqvhgNkJj7pp/bYZycEvOoqH1lKS0B3QD6cF3+VV8jEH9OuXF5im/3FuQv8= +api: eJytkkFv2zAMhf+KwLMQZzvqtKwYtqCXou1OQTCwChNrlSVNorNlhv/7QMe1kwC71ZfAIfn88fF1wHgoYDZwFwOjC5QLbDXsqNjsErsYwMAjcZtDUai8K6ziXjE1ySNTUXhE5/HFk9rHrGwmZBcOKtBvZSfJBWiIiTKK4HoHBqbaj0kKNGQqKYZCBUwHH5dL+blGeWqtpVL2rVePYzPoQY0CSzum5J0dPlT9LDLTQbE1NQim6+XR0BDXUSgOxKAhIddgoJp5q0uoQvkotphNB232YKBmTsVUlfWx3S3wQIFxga7C5ODWu9VQVXfSCv1W5GybHZ8GvdXD+p5O3wh3lMFstpcNT0J9tuK6rQM+JQIDmNw9nUBDwEbeVy3XMbu/w/agwQlAfZ6SvV3Yx2HcsaeZ7TPaVwo70CB7nrGXiw+L5f+WGQfU6mE9mo92MP+NY2gDfWPXZBRooAad1Jiw+TQXhDLFwg2GC70pm+r54i5XaN2cgfeJ62gx0x+ukkcXoB/36cbAbOYQC84cma2GOhaWjq57wULfs+97+ftXS1kOv9VwxOyEY7i6fruSZOKVTuKhtZQknUf07fnYN8GWrExJ/vrlGfr+H3cdUY4= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Returns a list of templates available for creating new containers. - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/containers.tag.mdx b/docs/docs/reference/api/containers.tag.mdx index 0e073f7378..cd25ac1df8 100644 --- a/docs/docs/reference/api/containers.tag.mdx +++ b/docs/docs/reference/api/containers.tag.mdx @@ -5,16 +5,9 @@ description: "Containers" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/create-account.api.mdx b/docs/docs/reference/api/create-account.api.mdx index d007134d19..5ecd23392c 100644 --- a/docs/docs/reference/api/create-account.api.mdx +++ b/docs/docs/reference/api/create-account.api.mdx @@ -5,36 +5,33 @@ description: "Create Account" sidebar_label: "Create Account" hide_title: true hide_table_of_contents: true -api: eJy1V01v2zgQ/SvGnLlxGvSkU902QIN2N0aS7h4MI6CpicyWIlmSauo19N8XQ0qyFMdar5P1JY448/jmzYfGWwi88JAtYJaXUsOSgbHoeJBGX+WQgXDIA95zIUylAzBw+KNCH96bfAPZFoTRAXWgr9xaJUV0nX7zRtMzL9ZY8niqN9cPkC22YB1dESR6el55dGPnmpc4PA8bi5CBD07qAmrWPdGVUlAvGQQZFD34g3xrBlhyqU4FuYzOdc1aC7P6hoKkaC2+YMHF5qtHd5PEeQavZuCFsfj/hvqvJG+JwzjLauWFk5bSOEbWKq5PJTsn3yPI9qiMcB7BmaWyPey8Zwp1TYAOvTXap1Avzs/pT449YeC2EgK9f6jU5KYxBnZ8O/y3JpD5mNQMHowreYAMqkrmo2Fe5UeXchPU4Vr2Q1IyYOn3YzOu4Fr+HYW4f71ArnuwE4qKDW96STMNsNsh8mjcd2+5wFcM4q8Ws4lgd8dL6O9QW+7WGUr0KzKfJ8SGd4v/EtYtYstZ+vscS/Ms3MoYhTRDxirdTz6Sf81ie907o07mRg0xuSGAmtErMUcdJFf+VLwPPYgjh7bvNWRrz53jm9GLkuvoHd2MbOHjAHx7cbE/8/7kSuapKy6dM+70gZdjaF7JB6aGMmJweoTKUgcs0KUBNVCoJ6hJBEnE0heE/LQHWtPf0Xte9OQ+bBrFmNzR6XNK08okHea0ZlFc6erGrpesnbxJ3cNhfEzyjaX1093dfA8w5XaY1A9xw5vMug2vxLA2tPtZ4+l/y8MaMphy2hCnu03Qo/uJzsekVE5BBusQrM+mU6FMlZ/xAnXgZ1xOuZWxKj2KysmwiS6z+dVn3HxCntO7b7HsG9xS2aRCGJp1OeBWfkaSJI0cmFVhbVwzs4GBpNDWyYtipoK82a2ul794adM8aN+9DVCX3GZp3BXaboEbmj6zNKXlqDOgaaYf4ijrui6KM5nNr4AByZiScX725uwcnqZoYEwdx0Xo8UjHwJ5kodO/F0xAXr7bHRAzynKZdrkGb68iBmy6FAT8FaZWcRm7Kd69bYplAbFYgEFbLksGayqnbAHb7Yp7/OpUXdPjHxU6qoglg5/cSb4ifRbUw+u2NrbwHTdELA2b32KnkbmqUi08GTw0FJLHTAi0YdR22av4+fXtHTBYNT9uSpOTj+OP1MX8ETIA+oFE3rE447MtKK6LimZFBgmTPv8A4AWS3A== +api: eJydVV1P2zAU/SvVfc7aDu0pTysMCcQmKlr2UlXTrXNpDIltbAfIovz36dppm5LB0PrSxD6+H+ee4zTgcesgXcEsK6WCdQLakEUvtbrMIAVhCT39QiF0pTwkYOmxIudPdVZD2oDQypPy/IjGFFKEo5N7pxWvOZFTiWFX1dd3kK4a8LUhSEFv7klwRC99wQuzmOMmJoA22UNVVRTQrgdQaNu25ZKc0cqR4zwn0yn/ZeSElYaLgRQWlRDk3F1VjG46MCQfr91YJsXLmKFyZD/W0XfaoqhvHdl91mFXbQJOaBNjD2KitVi/y8UiHmYi/snsrohA25eTkyFTP7GQWeBhdG6ttv9PU0YeZcFP0lPphoBCi6PdQe/OW6m2/eal8rQlG1k7YqhHuo4FQptA6bYc+TjeAfqDnMMtD6WDvA0NZIyWvPs3ptkV0lLGTuK+YuoO1xvWgd7I7tttfIv0vTfWi+VyPggYZ3s81LNg4tFsb+KSfK7Z3kY7fjfoc0hhgnwJTA5md2SfyLowlMoWkELuvXHpZCIKXWVj3JLyOEY5QSPhddpZ2B2dMTRI1pGorPR1iDebX15RfUGYsZ1W6z5gwZqKKjmGHXxh5BUxXwrLIPHK59rK33H0CUguII+nmBBW683h6jp/wdIU1LdzF2g/eSqDfA8qjDYdQnmn2vQab8AUqHqAluu506H8nSUjN6coHkhlkADzHGmbjj+Pp2+R2R0YzeaXnTVR+F5NEQbJq3HtB9VrzBOWXw8bXCXLoUTVizeQzlFV+3F4evETU6AMtgu5m05VKwiqggR2ulonkLPu0hU0zQYd3dqibXn5sSLL6lgn8IRW4oa5WrHZ851OGnigmguLt9KnYEmGF1XUxasbim+PeGImBBn/Lnbds8b8erGEBDbdh67UGZ+x+Mx2x2dIAfhjyaeDUMNaAwWqbcWXSgoxJv/+AJCgiB0= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Create Account @@ -43,29 +40,881 @@ Create Account as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+
+
+
    +
    + anyOf + + + +
    + + user + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + email + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + scope + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + subscription + object + +
    +
    + anyOf + + + +
    + + plan + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + user + object + +
    +
    + anyOf + + + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + scopes + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + organization_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + project_id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + project_name + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + is_demo + + object + + +
    +
    + + anyOf + + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + user_role + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + credentials + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-accounts.api.mdx b/docs/docs/reference/api/create-accounts.api.mdx index b799cfda67..9fdc1fe357 100644 --- a/docs/docs/reference/api/create-accounts.api.mdx +++ b/docs/docs/reference/api/create-accounts.api.mdx @@ -5,36 +5,33 @@ description: "Create Accounts" sidebar_label: "Create Accounts" hide_title: true hide_table_of_contents: true -api: eJztWU1v2zgQ/SvGnLVxNtiTTuttAtToZmMk6fZgGAEtjW22FKmSVFKvof++GFIflO0oToqiG29ysSIOKc6b94YfswHLlgbiKYzSjEuYRaBy1MxyJccpxJBoZBbvWJKoQloDEWj8WqCxf6h0DfEGEiUtSkuPLM8FT1zf4WejJL0zyQozRk+5ppEtR0P/FQa1e2BpyqkHE5OOQddcsgzp165zhBiM1VwuIQLLraAXf1F7GQFmjIs+wwtnUJZRbaHmnzGxlV9cY0pguM/Vo83a3h8N6mvvP+wZIjQzZKD0kkn+j4PkB3ibokk0z2nAPvPzwKyMgJu7nK3JpO0zV0ogk0GnsRlMvNWBYIWTCT8SwHcVwHEAjFcd9MoIHpT+YnKW4H8JyxQXrBD2KTDPK7MtVtxpXOxOmqfOQbm+WkA83Z3NQumMWYihKHgKZdRYyEIIKAPIx9QMRhTLvhH7Rrihvvs4UBtc4wI1ygRfzJQawj3QBBP5VEf/AOp8aplSRgQutb9u1jTkPy7KvMmhRw7dmPfLY+JJfoA4JrUctsHPMJujNiueP0MqWom9UkFZZOSlepCoIYJ7jg/uAVNulXu4Z6Jg/rn1lLmNCMGSC7XOUNq7jEm2RB16e01fraWUqad1lCkyp23HcXHsf6wfx7yWAkF0+5US7isuG8o/c0MyuAzE0knPbyp6fUw72uX1OyTURWTfRuxZ4ml6bSun2p296eYV0quN3lG59R2qCfHY3Z09SzFVn65enpiav1fZvnnoHJ2D81DP/u+xFW2/XgNPL6TlFP/KwUuVIl24lOE8rS7QvTC5ksZz5ez0lH46Jyq4KZIEjVkUYnBdGUP00junQ46Bh2WdRGOK0nImTN+x711gRu7+1FxlOeq+yd5Se5WkjkfJDV2PyaWGAsfkVJiJjsevJ9J1mEiiel1xSq2E2PI3DPsWWrvrzE2ictxdWw65FKB8Ut9NlX1eum+YOi03eb6M4Lezs91U/jcTPPVHpwutXSp7YR5P0Va3/Nxitic9C5V0Wg8IMpcWKXGWs9ZjpjVbBw7/qfwECcbMLPuS6SUaw5ZBBHoqEgTG4JZan2IL+eU/XdkFgW/h9eg+7sa5h68vtO9vbyc7A/rYdoP6zpWHBqO2PJShXSmqHOXK0JA5syuIYegWq2FQRzKo710NaLqBQguIYWVtbuLhMBGqSE/YEqVlJ4wPWc6d/gwmheZ27bqMJuMPuH6PLKXlajoLDW6IOJ4KXbMmCiznH5BA8Re9MCrsSulaTxFwcm7le5HXRMnrtvB18Y1luV/M60LWnmrPdsWiexPdf/nWc6Pw6JGJJsrlwh9HqkiOHIqD0WRMGwvUxsft9OTXk1PYjmbHmMTJ/LpZg+SaKTN1wtUEqqmYxWCRZb+3DTQz4kPGZDDeLnn2X6db/GaHuWDcKc99fFPxagr1Jqhh1iyCFVEvnsJmM2cGP2pRlvT6a4GayDOL4J5pzuaE0JQEv6pptIEvuKap+cz0i5MlmYvC02YrS1EG8T1GSYK57bWdBeqYXN3cQgTzqoqaqZT6aPZAkmcPEAMl+bwpHLp3GxBMLgtKLDH4MenvX4C7P04= +api: eJztWdtu4zYQ/RVjntU4G/RJT/UmATbYpjGSbPfBMAJaGtvcUKSWpJJ1Df17MaQulO0oThZFGzd5MSMOL3PmnOFtDZYtDMQTGKUZlzCNQOWomeVKXqQQQ6KRWbxjSaIKaQ1EoPF7gcZ+VOkK4jUkSlqUlooszwVPXNvhN6MkfTPJEjNGpVxTz5ajof8Kg9oVWJpyasHEuGPQNZcsQ/q1qxwhBmM1lwuIwHIr6MMfVF9GgBnjos/w3BmUZVRbqNk3TGzlF9eYEhhuuLq3adv6i0F97f2HHV2EZoYMlF4wyf9ykPwD3qZoEs1z6rDP/CwwKyPg5i5nKzJp28yUEshk0OjCDMbeak+wwsmEgwTwXQVw7AHjVQe9MoJHpe9NzhL8L2GZ4pwVwj4H5llltsGKO43z7Unz1DkoV1dziCfbs5krnTELMRQFT6GMGgtZCAFlAPkFVYMRxaKvx74ebqjtLg7UBtc4R40ywVczpYZwBzTBRL7W0d+DOl9bppQRgUv1b5s1DfkPizLvcuiRQzfm/fIYe5LvIY5xLYdN8DPMZqjNkucvkIpWYqdUUBYZeakeJWqI4IHjoytgyq1yhQcmCubLrafMbUQIllyoVYbS3mVMsgXq0NtrGrWWUqae11GmyJy2HYfFsf+xfhzzWgoE0e1XSrivuGwo/8INyeAyEEsnPb+r6O0x7WCX15+QUBeRXRuxF4mnabWpnGp39q6bN0ivNnoH5dZPqCbEY3t39iLFVG26enlmav5eZfPmoXN0Ds5DPfu/p1a03XoNPD2XllP8KwcvVYp04VKG87S6QPfB5Eoaz5WT42P66Zyo4KZIEjRmXojBdWUM0WvvnPY5Bu6XdRKNKUrLmTB9x77TwIzc/VdzleWo+yZ7S/VVkjocJTd0PSSXGgocklNhJjocv55J12Eiiep1xSm1EmLL3zDsG2htrzM3icpxe23Z51KA8kl9N1X2eenGMHVabvJ8GcGvJyfbqfxPJnjqj07nWrtU9so8nqKtbvm5xWxHehYq6dTuEWQuLVLiLKetx0xrtgoc/l35CRKMmVn0JdNLNIYtggj0vEgQGINbqn2OLeSXH7qyCwLfwuvRfdqNMw9fX2g/3d6Otzr0se0G9dQ9Dw1G7fNQhnap6OUoV4a6zJldQgxDt1gNg3ckg/rBvQFN1lBoATEsrc1NPBwmQhXpEVugtOyI8SHLOWwOPHK1g1MydeI0mBSa25XrbzS++IyrT8hSWssm09DghljledI1a0LEcv4ZCTF/Cwyjwi6VrsUWAacJLH0rgoT4et2+ip3/YFnuV/r6lWvHU9Dmc0b3mrr/Zq7nuuHJ8xRNlMu5P6tUYa5A/MiSe5Qp7TxQG4/v8dGHo+OnUK8aDEbji0rFzC+wNWDOjFJYJ65NRJuntRgssuy3toJmScTJmAz622bZ7nt3iz/sMBeMO4m6wdcVASdQ75YaCk4jWBJH4wms1zNm8IsWZUmfvxeoiUjTCB6Y5mxGaE0oMyxrSq3hHlc0NZ/CfnH6JXNReAptpDNKNb7FKEkwt72200BG46ubW4hgVj23ZiqlNpo9Um5gjxADrQZ588Lovq1BMLkoKAPF4Pukv78B3TRN3Q== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Create Accounts @@ -43,29 +40,2217 @@ Create Accounts as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + users + object + + required + + +
    + +
    + + + + property name* + + + UserRequest + + + +
    + + +
    +
    +
    +
    +
    +
    + +
    + + + + organizations + + object + + required + + +
    + +
    + + + + property name* + + + OrganizationRequest + + + +
    + + + +
    +
    +
    +
    +
    +
    + +
    + + + + workspaces + + object + + required + + +
    + +
    + + + + property name* + + + WorkspaceRequest + + + +
    + + + + +
    + + + + organization_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + projects + object + + required + + +
    + +
    + + + + property name* + + + ProjectRequest + + + +
    + + + + +
    + + + + workspace_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + organization_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + organization_memberships + + object + + required + + +
    + +
    + + + + property name* + + + OrganizationMembershipRequest + + + +
    + + + +
    + + + + user_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + organization_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + workspace_memberships + + object + + required + + +
    + +
    + + + + property name* + + + WorkspaceMembershipRequest + + + +
    + + + +
    + + + + user_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + workspace_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + project_memberships + + object + + required + + +
    + +
    + + + + property name* + + + ProjectMembershipRequest + + + +
    + + + +
    + + + + user_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + project_ref + + + object + + + + required + + + +
    + +
    + + id + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + projects + + + object + + + +
    + +
    + + + + property name* + + + object + + + +
    + +
    + + + + property name* + + + ProjectScope + + + +
    + + + + +
    + + + + user + + + object + + + + required + + + +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + project + + + object + + + + required + + + +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + workspace + + + object + + + + required + + + +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + organization + + + object + + + + required + + + +
    + +
    + + id + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-annotation.api.mdx b/docs/docs/reference/api/create-annotation.api.mdx index 1357a60ece..aa8209f70c 100644 --- a/docs/docs/reference/api/create-annotation.api.mdx +++ b/docs/docs/reference/api/create-annotation.api.mdx @@ -5,67 +5,1878 @@ description: "Create Annotation" sidebar_label: "Create Annotation" hide_title: true hide_table_of_contents: true -api: eJztW1lv2zgQ/ivGPO0Ccpymbbqrp02PRbNtN0GS9sUwAlqibTaUqPJI6zX03xdD6vSV+ALSgnlwLGoO8uMxo/msGWgyVhD24SxNhSaaiVTBIACRUWmvzmMIIZKUaHpLKhkIQNJvhir9WsRTCGcQiVTTVONXkmWcRVau91WJFNtUNKEJwW+ZRNuaUWVla5ML94RkY2bb9TSjEILSkqVjCICmJsFOR0ZpkUAAE5MQ7BQxWmD3NdMcNa5ZknF6I0lEL5y1AGI6IoZrHJZTzwO4Y2m8zhGJJyLC63vCIYCMk+kKNx/QUtOJU80DiCYkTSlf50ZonkEA3+kQAlDxHY4oYys8vSnstZxlDF25SUV0pxcjCPszIHHMEGXCL+fwLyXafcqDqoWlmo6pbDalJhm2W4ZCcEpS27TcF0RMRoYT+du/4iNT+h8l0u55mhn9OwSlGTH8SiPddsU55A0E5rXteB+tfYPI5AEkVJOni9DfhvOH8GGaJo9TIlKS6VpU2qqbIfoJkcwDiEmBqMdxJY615FviUJN0RCVNI4dR+/z7ZqictqFrC9xTqYqT8xHoLvT2S6GeB6C4GW9r5hp18wBYvM5CACMhE4KHlDEsXmvxPIZ8DXZXJWZLjOSBg+32nkhGinjk4dsYPknv2SI4Hr+H8dNUaUX9wtsWOL9zdwXQ791tEWw8uXjwdgDP7+F9gOj38bYo4mO6IVpID93W0Pk9vDuEfgfvkstERFGP3GbIrdFrlA6v6qpDHgBn6d0jy4XtCVAZSW/Xj3stchlJOzjYADT2agdTdlSdB4D7yNK75bWtogb0a42vKFcN2gJqqQks5jNJYyxC20JeqzJVLpGGqZoueGO5gQetNgr9a8xcOVIB8jxvqmtpqG1QmUiVm5yT42P8F1MVSZa5lB2uTRRRpUaGd64KYQi25SYiYZzSXHmy7v4bK9EowB9jCteiNFYdXo5SiW+JfuSxERNNu5oly7Z9o0fObOfMVh9NFh/CyWdntnASU04P4OStM1s4KeEaTh/YRZsctCVYr6fFNi3x2quXEq3KSwnYXr2UcFVenuLhFXhO79fn9C6M3oXUc+q/NKu3DqHVdNSC1gZ81Dag/hTE3tOB0nN7ntv7OeDzVYldqhKe2/Pcnuf2fj4EPbfnub2nA6Lfx9ui6Lk9z+09BQj9Dt4ll/Hc3ubIeW7Pc3vtetWhub0NV2GtWJFvuWXyXpycLHJ1XwhnsZXuvJNSyO2JuphqwmwRfsVkcxG17m5SshzMo97AXEQlTJCo8TIWoC6mKkXGtJ7C1aIWjM4N3n1oOrklMNB1Idc8Ait4Hbqrh/HWwbduZt/f3FwuGHRz255UR6l1zppviiVUTwS+RpYJhUYzoicQQi/DEEq/92rCVPWQI6EST387PUZyCGGidabCXi/iwsRHZExTTY4I61lmZIAakZFMT63K2eX5Bzp9T0lMJYT9QVPgGheQWxJtsWo2SMY+UAQnJYld0kZPhGT/lWNB7gomTgtHj0vzqn4T7t0PggexW2NNGrjkvWp6y9FTFQtVMUmW76nonprUqCvxC6XlqphcRc16VbnwV1/jOQXPR+SPl6PTF92Xr5696r54eXrSHT4fRd2T6M/T56PTUzIip7Cs3HoYB81Uat8eGiW7A5k+JD7Lyj779jFXGDmg+UMiterhet9+Wo+fBzN+SKSWP8IcYuWWSf5+bTeyWhuAWDoS9gQvsxAbHzpnl+cQNFwfHz07Oob5eNUSxvSDRBb08vi3tyGYC0RVCEKeP7G5B2hKkr/qG9gzjHf4G4ba3rLw2OpQFYg0/aF7GSfMZhfW/ayInH0oIic0f2yEqRzG/wkG2bAPs9mQKPpZ8jzH5iJG9AcB2LU1RKz6mNxMylA5gzs6tb9qsllY16YgKM6NC41zGRlmS07jLIpoptfKDhp5wOXF9Q0EMCxeHU9EjDqS4IDwMwTAN9DdqMKZa5sBJ+nYYBIVgrOJf/8DhLsxXw== +api: eJzVWNtuGzcQ/RVhnlpgZTm+pd2nKomLuE4Qw3bzIhjBaHckMeKSG16cKML+ezHkSrsrybKTJgXqB1smh4ecwzMXagkOpxbSEZzfo7Rwl4AuyaATWl3kkEJmCB19QKW0C6OQgKFPnqx7ofMFpEvItHKkHH/EspQiC3aDj1YrHrPZjArkT6VhbCfIBtsGcmtuLlTOf3OaoJeOz+Gt0wUk4BYlQQrWGaGmkAApX/D51wYzXyCfEr3T7I8TTvKK4Xq/S0avErDam4y6+2Ap9mzymcaQgM3njF+K3fA3EbZKIEcXHMc8FzyD8mqDgsW7CaSj5caGVbIeEcrRlEx7SPli3B0Zay0JVRjavRdkwmReovnlTy/lX1ar/oUqvfu1cVaPP1Lm2rBoDC66O0sJVcvpLhi73AVrLF8xFVUCBTlc07J2//9GkHBUPG3Rv+dw39q3KzYrjsoJGVJZZK4bT3SP0qPTZntK5PuITmCiTYEcGd6LfO9hLmJQST994tVtIdzw2iqBezK2zgvfA/O+Xl4lgM4ZMfaultPOq3fG08PCHTYI1R59N+F/vbqHcJVknSW305MnYmz6WaNmaOmHwu5wjhO9MJRz6msktDPpXTfqqxKQQs33ML6pQVui+hCFuCm/tTRKVL2oMGcwo0fMb9mmtv/pGmjTtHKldcydfL0Rar4vX74JDD62W4j9TuivuN+56ctQzB9FbVXmPTDXsQuAqqray5nJMGBLrWzk/OjwMFZZmxlRxpIPNz7LyNqJl73r2hiSH9NMPBwTj1xV8q2MPjGQdsVL7XIV+Ds5Otpm6D1KkQfr3rkx2nw/PTk5FDKk+1i5Ng2kzjqz31J476qNatdSsc5WNEFhp/si9i1Zi1NqYuJh00BG75ZnH5My+xW3ru3aZWJNb2T3YTdeRfr23ezr29urLcB4t91LjcHTG7Yb6oLcTHO3XWrLoCW6GaQwKA3dC/o8aNRtB9x/kuEKGa7HGwkpzJwrbToYZFL7/ACnpBweoBjEbrZ7gGGY7b1k01A2LWXeCLcIeMOri0tavCbMyUA6umsb3LC6ol66Zk3HWIpLYuYUFkHv3s20EV9Xjgo+wCyuYmpYt9fNa+L8CxalpO2Aju+Bpsdfde51u143lN32cqsl6jRBXD7geIK/nU7OTvqnz58975+cnh31x8eTrH+U/X52PDk7wwmewaqlaXS4bk+aoU6NqbqF/7/YatUN/Ny9WpU9/CPURIfbX6W3KK0XmM1J5R3Iw4NnB4cPabFe0BteXdQ5DrNA3UpGwQySDbWvdc4vtCIkOHCExR/NBJ+Sg4qfhA3erhjsHGwtaEdf3KCUKEIKC9sv6/AcQR2ezFMToJAAJ5kZR3I6guVyjJb+NrKqePiTJ8OBdpfAPRqBY+ZtxBl0tgq5JcxpwYeMqb4f8hybSx8Vv5H2OSXHFcMso9Lttb1rJZurdze3kMC4fsYXOuc1Btkh/p0C8LcB0at0GceWIFFNPWfqFCIm//wDk8aStA== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Create Annotation - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + + annotation + object + + required + + +
    + + + +
    + + + data + object + + required + + +
    + +
    + + + property name* + FullJson-Input + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + + references + object + + required + + +
    + +
    + + + evaluator + object + + required + + +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testcase + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + links + object + + required + + +
    + +
    + + + property name* + AnnotationLink + + +
    + + + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + annotation + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + + + +
    + + + data + object + + required + + +
    + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + + references + object + + required + + +
    + +
    + + + evaluator + object + + required + + +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testcase + object + +
    +
    + anyOf + + + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + links + object + + required + + +
    + +
    + + + property name* + AnnotationLink + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-api-key.api.mdx b/docs/docs/reference/api/create-api-key.api.mdx index ce71059e48..70d2a2e15a 100644 --- a/docs/docs/reference/api/create-api-key.api.mdx +++ b/docs/docs/reference/api/create-api-key.api.mdx @@ -5,65 +5,81 @@ description: "Creates an API key for a user." sidebar_label: "Create Api Key" hide_title: true hide_table_of_contents: true -api: eJzVU02P2jAQ/SvWnFrJIrRHnxq1hyIORbA9AVrNmoF4CY7XnqDSKP+9GiewC/+gucQfM+M3773pgPGQwKyhDE7N6ZJgq2FHyUYX2DUeDHyPhExJoVflYqaOdFH7JipUbaI42fiNL+MhmY1XSqlIby0lVp+Ww+KzUU8V3Y6bl1eyrGzjGZ13/qC4olxIzX4o5/P2GpwYmfIDS+I2+usbieNQ1WZkuyusCWhoAkUU4LMdGBgCnjG45yNdQEOkFBqfKIHp4Ot0Kr/7blettZTSvq3VcgwGDQKYPEs4hlA7m98oXpPkdJBsRSeUFV8CgYHE0fkDaGDHtRxca6mBTTXSDb18Gk7EVSOIQ5MYNATkCgwUR1FEQ6J4pig6ddDGGgxUzCGZorB10+4meCDPOEFXYHDQbyXDttHxJaeUi9mcLj8JdxTBrLcfA1YCfeDjPuzWCwY3z+R5PMm+bLlqovubKQANTmirhizpxfl9k9PH1ssMTkQCDdLGQPR08mUyhUez3QVnm9jM+vXtfA36gYVb/6CBTujkjglP394vBJmQe0L/od6DGg9ounfd/68pGJVj+sNFqNF56EfKutFaaziOw16J48wauu4FE/2Odd/L8VtLUdyz1XDG6PBFtFxve32VWowlQ2WgtJaCuPaMdTs45mFExHA3iy9+rZ6g7/8BgAqFZg== +api: eJzVVMGO2jAQ/RVrTq1kAe3Rp6a7hyIORbA9AVoNzkC8JI7XnqDSKP9eTRLYXaR+QHNJbM+M37z3Ji0wHhOYDWTBqQVdEuw05JRsdIFd7cHAQyRkSgq9ypZzdaKLOtRRoWoSxcnWb30Wj8lsvVJKRXptKLH6tBo+Phv1VNBtu96/kGVla8/ovPNHxQX1hdT8UTnfL6/BiZGpv2BF3ER/vSNxHKraHll+hTUBDXWgiAJ8noOBIeAZg3s+0QU0REqh9okSmBa+zmby+tjturGWUjo0pVqNwaBBAJNnCccQSmf7O6YvSXJaSLagCuWLL4HAQOLo/BE0sONSNq611MCmGumGTh4NFXFRC+JQJwYNAbkAA9OTKKIhUTxTFJ1aaGIJBgrmkMx0asu6ySd4JM84QTfF4OBewKw/VQ8SCt1OytkmOr709bLlfEGXH4Q5RTCb3fuAtfQ1kPUx7NYoBrfomfVYyTpruKij+9PzAxqcACiGLGnU+UPdp4+8jNi+oz2Rz0GD9DnAnk2+TGb/amZMEOlHedD28lxx9GGg7+i6EQUaqEInZ0xYfXs7EJSiQoX+Xb072e5QtW8G+b/GZVSR6TdPQ4nOQzdS1o4e3MBp/CsUYk2zgbbdY6Jfsew62X5tKIqTdhrOGB3uRdfNrtNX2cVkMn0GMmspiL3PWDaDe+5mScx3m4Xlz/UTdN1fyDiT9Q== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Creates an API key for a user. Args: - request (Request): The request object containing the user ID in the request state. +request (Request): The request object containing the user ID in the request state. Returns: - str: The created API key. - - - - - - - - - - - - - +str: The created API key. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + string +
    +
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-app.api.mdx b/docs/docs/reference/api/create-app.api.mdx index a2ba74d105..4170815040 100644 --- a/docs/docs/reference/api/create-app.api.mdx +++ b/docs/docs/reference/api/create-app.api.mdx @@ -5,76 +5,405 @@ description: "Create a new app for a user or organization." sidebar_label: "Create App" hide_title: true hide_table_of_contents: true -api: eJztVlFv2zYQ/ivEvawFNDsL9qSneW2AGt0WI/G2B8cILtJZYkuRLEklcQ3/9+FI2ZKcNesaYE8LAoQh777jfXf3iTsIWHnIVzCz1sM6g5J84aQN0mjI4Y0jDCRQaHoQaK3YGCdQtJ6cMPxboZafka0nN/pGz1zl8xsthBAWt8pgKV4ljJm1r3OxrOl4UBgdUGqpKxFqiugaGxKoyxGwmL8Vr0y8EarXMcwVhdbpQ6RjgMs22DakKCauT4NoelBbUUSHkkN+5xmeQ3LsBI7S0wH73XK5uHgsKIbPxXzDMI6E9AK1IOeMS3DDNIyLy8hSacgLbYKo8Z6EJddI7zmrYAQWBXl/cJtABsaSi0nPS8gh3fMWrYUMHH1qyYefTbmFfBf/lY5KyINrKQNOlHTgI7RWySLCTD94ruMOfFFTg7yyjoMESb6zveXMeR22liAHH5zUFWQQZFC8MbNW/MY2+wwCNVbxpT5SvAbq7eUG8tWp9z477uhWKdive7xlhyHe05YxrTMfqAi3svxWxEVCEPOS8R6M++gtFvQCxD8PGB3msCFfAHs56usS9kxpsjV3nEJX6FTZVV+eAcax3W9hv2cAR94a7VNBz8/O+M94jK/b2GmbVomrzhhe1DKJgecaJtH279rrK8iQJWTPs5JEoKPmx/Pzp2z8gUqWqQQXPMDfTkVJAaXilQzU+KcGyhSj06/oGakDVeRgv+7pQOdwO6DsF5MuyBQ3vnqO3V/Je6zS7EaTL5tGMsSST/+pFJxXCt3ZDSrR05vY/XIabxN9fxfsYML6+wQw1bahUBuWSWs8u1gMNeQwRf6SZeDJ3ZPzkezWKcihDsH6fDotlGnLCVakA05QTtHKOKSeitbJsI0us8X8PW3fEZbkIF+thwbX3A6pwGOzI7doJYtbBqn5YdaG2rhu8CEDyX1YJy/OhRvtqhf4i0dsrKKxQA8KNhLhfn8opP3uWA77/SeS1jcjSL0xMZ3DjEayxGwxhwyY1jRJZ5MfJmdw+mgYGccPcBEn68BFPIbspCrHekAG1MSxgkDY/NQfMFNc7Ab1AK97o8ziV3J0k10/1/+/ZP7jl0w3CIEew9QqlFGrYsV33aRGQY9vzpoHOF/BbneHnn53ar/n7U8tOR7GdQb36CTecSuuWBbrw1juII3Am1Tn76N4sblq0xieaDnrbPKYFUzFs7brgcYsLq+XkMFd9/pqTMk+Dh9YGPEBcoivN/aOuhD3dqBQVy3Lbw4Jk3/+Ajnw8lM= +api: eJztVt9v2zYQ/leIe1kLaHYa7ElPU9MANdotRuJtD44RXKSzxEYiWZKK4xn+34cjZUt2lvRHgD41CBCGvPuO993dJ27AY+kgnUNmjINFAgW53ErjpVaQwpkl9CRQKFoJNEYstRUoWkdWaP4tUcl/ka1H1+paZbZ06bUSQgiD61pjIV5FjMyY16mYVbQ/yLXyKJVUpfAVBXSFDQlUxQGwmLwTr3S4EdavQ5hL8q1Vu0j7ABetN62PUXRYHwdRtKrXIg8OBYf8xTE8h+TYERylox32+9lsev6QUwifismSYSwJ6QQqQdZqG+GGaWgbloGlQpMTSntR4T0JQ7aRznFWXgvMc3Ju5zaCBLQhG5KeFJBCvOcNGgMJWPrckvNvdbGGdBP+lZYKSL1tKQFOlJTnIzSmlnmAGX9yXMcNuLyiBnllLAfxklxne8OZ89qvDUEKzlupSkjAS1/zRmaM+JNttgl4akzNl7qjcA1U64slpPNj722y31FtXcN20ePNOgzxgdaMaaz+RLm/kcX3Ik4jgpgUjLfS9s4ZzOkFiP/sMDrMYUO+APbioK8L2DKl0VbfcgpdoWNl5315Bhj7dr+B7ZYBLDmjlYsFPT054T+HY3zVhk5btrW47IzhRS0TGXiuYSJt39ZeX0GGLCB5npUoAh01v52ePmbjb6xlEUtwzgP8/VQU5FHWvJKeGvfYoNb5welX9IxUnkqysF30dKC1uB5Q9lHHCzLFjSufY/cPcg7LOLvB5GnTQIaY8emXSsF5xdCd3aASPb2R3afTeBfp+79gOxPW30eAsbYN+UqzTBrt2MWgryCFMfKXLAFH9p6sC2S3toYUKu+NS8fjvNZtMcKSlMcRyjEaCccfviycijM2DRPsKG+t9OuAl00nH2j9nrAgC+l8MTS44l6J1T802xOPRrLyJRAnA7LWV9p2qgAJSL5AFb04Ue7Cy179zx+wMTUdqvegmgcK3e8PVbbfPdTKfv+R3vWdClItdUhnN8CRq7eY35Hi+WTeI40nozejk6fI7RxENp10I4h5GMEdL8EMkqPy7QsHCVAT5g88YfN7f8CscVc0qAZ43WMmC5/TgxttegH4+eT5wU+ebig8PfixqVEGUQsV33QjHZQ/PE4rnvR0DpvNLTr6y9bbLW9/bsnyYC4SuEcr8Zbbcs76We1GdANxHM5inX8NKsfmdRtH8kj0WZCjR5YzFc/aLgZiNL24mkECt90zrdEF+1hcsYLiClIIzzz2DhoR9jZQoypb1ukUIib//AfmrwDx sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Create a new app for a user or organization. Args: - payload (CreateApp): The payload containing the app name and organization ID (optional). +payload (CreateApp): The payload containing the app name and organization ID (optional). Returns: - CreateAppOutput: The output containing the newly created app's ID and name. +CreateAppOutput: The output containing the newly created app's ID and name. Raises: - HTTPException: If there is an error creating the app or the user does not have permission to access the app. +HTTPException: If there is an error creating the app or the user does not have permission to access the app. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + +
    + + template_key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + project_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-checkout.api.mdx b/docs/docs/reference/api/create-checkout.api.mdx index f025174cb7..afd91e5cbc 100644 --- a/docs/docs/reference/api/create-checkout.api.mdx +++ b/docs/docs/reference/api/create-checkout.api.mdx @@ -5,36 +5,36 @@ description: "Create Checkout User Route" sidebar_label: "Create Checkout User Route" hide_title: true hide_table_of_contents: true -api: eJy1VVtr2zAU/ivmPG0g4qzsyU/LukFLNxradC8hBNk+idXKkirJpVnQfx9HviRu2sIGe0oinet3Ufbg+dZBtoSvQkqhtrBioA1a7oVWlyVkUFjkHtdFhcWDbjwwMNzyGj1aStyD4jVCBkZyBQyEggweG7Q7YGDxsREWS8i8bZCBKyqsOWR78DtDSc5basoAVVPTGIXUTbl+mq4rnedUYjgwVh//zBsnFDp3fFY1NVfC79aS56OL55MTvkXl+ZoLWtgLL2maOa0QAht2ck1RoHPrxsp/X62vftsWS+6shBBWVMIZrRw6yjqbTumjRFdYYQj9Q8qmkclNF0xLaOVReQrnxkhRRLLSe0c5+8MkIYTA4PPZ2WnhX1yKMqYl363V9i+qgrEkEC/auUv0XEj6JjzW7jRA6mJ0y9XuehOFMwaKYO9OhPK4RQthFVh/xq3luyM0f+h2QAgMard9D/if6BzfIgzF3g6NYCQLug2H3jq/x8KPSF/GvdrWXdyRkA7wtui+vca3Fr7XmvUhF4vF/KRgy+2Y1PPo1OS8c2py59AmN7rxJJoafaXJz0a71sS+ggzSvPV9SlAYTHubuxQYOLRPvcvJAhlU3huXpWn00aQ10YSLlBsBJGmHRWOF38WU2fzyCncXyEu0kC1XxwG3JKdWIOOwgRtuxBUSVJ0XZ42vtBW/W9Y7N1ZtFmEh1EbH9A62WRwumc0vgQGt0YI0nXyaTOEldKNgcgIvohP63vEa2AsUhv3pAaujDcAjr78cLmgyQrzm6qjeu0yNJhvg8PjsUyO5iIqPc+w7EpfQkUiURRppiZ5IYEDSrIj2bAn7fc4d3lkZAh23zxmxVQrHc0na3nDp8GSO4X2ADzedDT4mwF6f7wF3h7+EJy4bCokW/w9txq/0oduKflhB7aL8WC8XWrdNnRUFGn+UdfL0UZXBO/Pr2wWE8AfJyHWY +api: eJy1VV1v2jAU/SvRfdqkiLBqT3ka6ya16qailu4FIXRxLsStY7u2UzVD+e/TdUKA0lbapD0B9v0495x7zBYCbjzkc/gqlZJ6A4sUjCWHQRp9WUAOwhEGWoqSxIOpA6Rg0WFFgRwnbkFjRZCDVaghBakhh8eaXAMpOHqspaMC8uBqSsGLkiqEfAuhsZzkg+OmKZCuK4YhlKmL5dN4WZrViksMB9aZw59lXaGWoVkqXPnDi+eTE9yQDrhEycMFGRR3njLctk0H/L4Wgrxf1k79+xi76rddseTOKWjbBZfw1mhPnrPOxmP+KMgLJy0zvU9Z1yq56YN5CKMD6cDhaK2SIgqT3XvO2e6RtG3bpvD57Oy08C9UsohpyXfnjPuLqmAdL0OQHe6CAkrF32Sgyp8GKCOOblE31+u4JMdEMe39idSBNuSgXbTp7gydw+aAzR+mAwhtCpXfvEf8T/IeNwRDsbdDIxnJjG/bfW+zuicRjkSfx7m61n3cwSLt6e3YfXuMbx19rzXbhVzMZtOTgp22x6KeR1cm570rkztPLrkxdeClqSiUhr1rje8MG0rIIVt1Hs+YCkvZztI+gxQ8uaedo9kCOZQhWJ9nWfTRqDPRCGWGVsJLOJN4m5xzKPC+exK1k6GJ9SbTyytqLggLcpDPF4cBt7xr3fYchw3CoZVXxDz2Rp3UoTRO/u5Wordq2WUxUVKvTUzvOe2xfUXxQLqAFHjODvZ49Gk0fmuYPiGZTC97y6CIltnhiGGQvqBrIIpftSr6BQJh9WV/wShZmgr1Qb13JT1COFAT6DlkVqGM1og4tr3ac+jVZm2j3jzETnFIgXe45P3I57DdrtDTnVNty8fdu8fKFdLjSrEJ1qg8neAYHhL4cNP75WMC6ev4HqjZ/088oao5JL4F/6HN8XO+77bgH05yu7iK6W51eNwudSIE2XCQdfJGcpXBZNPr2xm07R9csHzQ sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Create Checkout User Route @@ -43,29 +43,273 @@ Create Checkout User Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-evaluation-preview-simple-evaluations-post.api.mdx b/docs/docs/reference/api/create-evaluation-preview-simple-evaluations-post.api.mdx deleted file mode 100644 index e38ff4c714..0000000000 --- a/docs/docs/reference/api/create-evaluation-preview-simple-evaluations-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-evaluation-preview-simple-evaluations-post -title: "Create Evaluation" -description: "Create Evaluation" -sidebar_label: "Create Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJztWVlvGzcQ/ivCPLXAylIUH+0+VYkdxE1Su7aTF0EQqN2RxJR7mIcTVdj/Xgy5p1aSrwRIY/tBlsg5OB+Hc5Ar0GyuwB/ByQ0ThmmexArGHiQpSvvrNAQfAolM4wRLmkkq8Ybjl4niUSrqM2oySROlwQOJ1waVfpWES/BXECSxxljTV5amggeWvPdZJTGNqWCBEaNvqSTlmqOiX5Xk9txM2MWvgMXLsxn4o3UCriaBSBSGTSK9TBF8mCaJQBZD5pVDsRECsrEHmmtBA6eq89pJyDwSJ/gNPkbYe+J3oligHyls6CRkmVdQJdPPGBD4BVW1rRcmfmPxagvNPIhQs+ZSWBhy4mPivIFpa7FKSx7P62J5rHGOsqkpmjZH6jZu1gUBl4ERTP7yxgjxp0ri7mmcGv0rrNtLMrjG6G5MTEq23IltkxVa+O7i/UBIEkfLN38kRP9K3nOlb8N0m43r3PdD6Mp5IcQs2uz+bfvbKyDezIMQVSB5WsSHh4g6ronIPLhBqXJpTRkVx6echNTPmBEafBj0Bwd7/aO9F/t2WWz9ODUDk9JMm52b7wHGJqLInGIcupFrgwZDCq0mjt2QMkGASoEHM8aFkUiMUiaShgIWBygEhjDeFBEu3SI2xoNrg3I5URrTtVXmx6y93FkiI0ZIGMPDmkNUp22b/28zPDBKJxF4sDARI7SZ0QnQ6nIwl+QFLhNsUX4Hb/ybLO1cWkuJEZVWqJ+E6VfO1sr4WmJ+EgAMK3srEPKKI5FPAoKTwtoKAIkpMr05Om1MRGsiL3L+XXXJpa0bq1h0zGzWbEWie4h4bYvUjVqpFOWSysBRvaAc3ybswpWwkGVZXYiWBu2ASpNYuS0Y9Pv0r5GP4NJF55kRnYucmMLywyrhIDGOaW0rKiNeW4paVupX7txKkM+l9NMupc+MfkAt3eK6RzHteH/yanoXrHcopx+C0Y9dT7u7g3DC9O5yt8xhIdPY1dyuZ7sWF6DDztCCZdLweyj56MTmSkIU+B2UHDuxuZICrulywjfH2q0lx+1gvVp2TsM6Xt9US4FWqaUA7JtqKeAqtXw70U5erQF8iPsXzeFzF/h/KoOfu8DnLvC5C/wJusBHspdtWmZ7vv3BoN3VfWKCh85dTijIPrylC1EzLmx7VXhUk0AkQWP2PsXteN39KqvfJ0EBFkRqvuuu8wMqxeZYudN2UgtG54pmb2vCyS6nOqerJ9ASXofudjOOHXy79vft1dV5S6Db2+amuhKpU3Mk28ktEnr/yl+0UqYX4EMvf/zqucevXu3xq0fJGCWVEHaXjBTgw0LrVPm9XiASE+6xOcaa7THeYym3R0ZhYCTXS8syPD99h8u3yEKU4I/GdYJL8iPnGU2yclNYyt8hYeSaARgavUgk/7cwiZOtC8dFIJCHXlQPdSdfGZnUfngr7wdq9wB0DVLr5MufRTeeX5Pk/XDVxJWtSuVCzb0oh8tSrH69XtVVRf3ULI6qimUEL2fst4PZ4X734OjFUXf/4HDQnb6cBd1B8Pvhy9nhIZuxQ+t7zXx/d8YNufLuzK0cc3fWMjr3rS/zeJZYLyhSmvWxzvD8tIFif+/FXr8Fd4OYIhkLbCQrXMhOg7fmzKUbU7KKbBgDjSz6o5qgldHRocRVydt00tbaztyZNX7VvVQwbgOVVb/KD+EI8kNIB84eQ6hfdVHdSzAt6OD6I1itpkzhRymyjIatl9Dh8uCGSc6mBNqIAuaiOHcr+AeX9k7NRvauDWtELow7Z2tRniKw4xgGAaZ6J+24FlvOzy6vwINp/kweJSHxSEaW0acPQM/xzip/5cZWIFg8NxSYfXAy6e8/8n/lZQ== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-evaluation.api.mdx b/docs/docs/reference/api/create-evaluation.api.mdx new file mode 100644 index 0000000000..71002d395d --- /dev/null +++ b/docs/docs/reference/api/create-evaluation.api.mdx @@ -0,0 +1,1466 @@ +--- +id: create-evaluation +title: "Create Evaluation" +description: "Creates a new comparison table document" +sidebar_label: "Create Evaluation" +hide_title: true +hide_table_of_contents: true +api: eJztWE1v2zgQ/SsEz27iDfak0zppgAZNWsNJe3EMgZYmNluKUkkqiWvovy9mKMmU5Y98oNjL5hJLnHkkh28eZ7TmTiwsj6b88lGoUjiZa8tnA56CTYws8JlH/MKAcGCZYBqeWJJnhTDS5po5MVfA0jwpM9DuXk+EtGCje80YY5/u7saXzwkQSsTiADO+1xNwpdGNbWeQD3hegKHVXKU84gnNH0O7Rj7gBn6VYN15nq54tKZHaSDlkTMlDHiSawfa4ZAoCiUT8jv9YXFDa26TJWQCfxUG53ISbG0byxR/uVUBPOLWGakXfMCddApfjIqCXaW8whU8SosBi2VKztJBZvu+1aB5IYwRqwBr0iCwq9SiXb3D3Ng4yfWDXLwN97KFYRc1DBqDdRbckf3deatmjxh3JTPp+rGaC5csYyt/Q4AntYMFmADwHM3YLZpVA56J59iAMzXGXq8b8cwmtR3F2plVnIISq4Nu6LJiH8muQhorsYrn4J4AdEwLPjIvubJz78HOa49qE+t8/gMSVxPQM24ahqK7xe7K9y1otpn/+vpmUuqJcHBNUa+QysZA4mKh7ROYOMlVmRGJhV59feDRtE+M9o0uleJVgH/hwdiIwNiFBzu2vzottjm/k7AdonUYFCzjCzxtFIdXVUVnbItcW39AZ8Mh/uvq0G2ZJGDtQ6nYpDbmr0j1rWxp06pL68Pp4dPiNTJRmBwjesR+7K1qn0dhpNDuzcLy3fs3stLAaZHB+wC/EEIA2RDi3UtttLBZc8u09ylrX/jekjVdUWzwMJzvRcSAIqZ1wpU72Oj9D8g1vqfzUGV3MYdm/07WeOEYk5ude9ipAxlYKxYQZvIlIfQnOyYpNDYLT8yWivROLBYGFsJBGht62aVANz6tANX68/K9kDrREXZyNNC0+Ccgp3z1kcYCEcoibR5mOy5cf91SOESaShQiocbBin110l1XtQuJtVDcR+F/bhxz63GhDV2ANWrZtWHcHhHZmLJJTUSk5yMYsYA4ya17eXT20r0XmwF3uRPqD+I3O1DCgU5Wf2aSIGt2UPQhNxmOcMymD05SFrY1indlIzqcIONeC/TNuxLQEe5Q5rdlTkcPwst4+y7dcxGG11er7TuV7TXyQqVSJ/pUAjEfL9YrqP4+O+vXUN+FkilZMZ+eb+6VUnBCqgParPKkM/qCe7IpyH0e7E7L6zxpY5HZxSEFvKk1qQXbb0rBYF4yj3AF9+WnHvRSYhPeRvz2beOjD9+uyRoT7KB7gP5sM3DLHHvjAmViwAvhljzipxD08QNuwTyCsRTz0ige8aVzhY1OTxOVl+mJWIB24kTIU1FIvt32j2iUXaApXREWktJItyK80fjqM6w+gUjB8Gg6Cw1ukTKeBF2zTRFeyM90u/oiio9Kt8yN/N209xIXsPReuF8k42TT8l8+i6xQELbsmyPdasynzchsd4MdjoelYgDY6YLDvne41dEOt1rV4d4edLi/swvKW6kfcopaeyXRkZyL5CdoEicw1p/W8OSvk+G+M6wd2Gh8VSe8SGgzTfjJDAWow5KWH1gWZZTt3IHI/tkM4OEgBzOhA7y+JG0tbL1Rnf/g81JNQgfP7rRQQpKW0NbXdSa11UTzRWxJ1/GUr9dzYeGbUVWFr3+VYDAfZvVNMMdjmqJ6LZvMWHOsI7H1pg1/II1pq7K+5KIceo9Rgts7aDsLpGD89faOD/i8/iSW5Sn6GPFEFH7iEacva67pqujdmiuhFyWqZMQ9Jv79C9/g8/g= +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Creates a new comparison table document +Raises: +HTTPException: _description_ +Returns: +_description_ + + + + + +
+ +

+ Body +

+ required +
+
+
    + + + + + +
    + + + + rate_limit + + object + + required + + +
    + + + + +
    +
    +
    + +
    + + correct_answer_column + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + + + + + +
    + + testset_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testset_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + + status + + + object + + + + required + + + +
    + + +
    + + value + object + +
    +
    + + anyOf + +
    +
    +
    + +
    + + error + object + +
    +
    + + anyOf + + + + + +
    + + stacktrace + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + aggregated_results + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + evaluator_config + object + + required + + +
    +
    + + anyOf + + + + + + + + +
    + + settings_values + + object + + +
    +
    + + anyOf + +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + + + + result + + + object + + + + required + + + +
    + + +
    + + value + + object + + +
    +
    + + anyOf + +
    +
    +
    + +
    + + error + + object + + +
    +
    + + anyOf + + + + + +
    + + stacktrace + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + average_cost + object + +
    +
    + anyOf + + + + +
    + + value + + object + + +
    +
    + + anyOf + +
    +
    +
    + +
    + + error + + object + + +
    +
    + + anyOf + + + + + +
    + + stacktrace + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + total_cost + object + +
    +
    + anyOf + + + + +
    + + value + + object + + +
    +
    + + anyOf + +
    +
    +
    + +
    + + error + + object + + +
    +
    + + anyOf + + + + + +
    + + stacktrace + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + average_latency + object + +
    +
    + anyOf + + + + +
    + + value + + object + + +
    +
    + + anyOf + +
    +
    +
    + +
    + + error + + object + + +
    +
    + + anyOf + + + + + +
    + + stacktrace + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-evaluator-revision.api.mdx b/docs/docs/reference/api/create-evaluator-revision.api.mdx deleted file mode 100644 index c450a86720..0000000000 --- a/docs/docs/reference/api/create-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-evaluator-revision -title: "Create Evaluator Revision" -description: "Create Evaluator Revision" -sidebar_label: "Create Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWltv2zYU/ivGedoAOU7TNt30tDRpUa/tGjiXPRhGQEuUzZYSVV7Seob++3BISrZ8q63YQ7AmD4kj8XxH5+O58chT0GSkIOzDm3vCDdFCKhgEIHIqiWYi68YQQiQp0fSOlkvuJL1niokMApD0q6FKvxbxBMIpRCLTNNP4keQ5Z5FF6XxWIsNrKhrTlOCnXKIOzajC/1ZAb1hzTyQjmb5jsdWTTT4lEPanoCc5hRCUliwbQQCJkCnREIIxLIYiqFZkhnMoBgFopjleqKxv3TrsVhcF4JuQXxIuvh1A5d8eekHjzMpDWLdg1QGscRr2T1edJSI1S0i0TwVnHtJrSLgNjHnsujsydRcZpUW68gGGQnBKso0au6p17hCKAOGqrX8IYrXXHnRsUpI9BPCdBSiKoFwkhp9ppGGFe721nC3jFQGkVJP6U5A4ZpgbCL+s8bpuL+dgWabpiMq6pnRYvzJv3mpdEDEZGU7kL28N538qkbW7WW70r7BoK2IwTdPthIiUZLKR1rooLHG7SfYjMokSS/75mBj9S3xgSv+I03U2LkrvxtC180LISEq3tH/5CVC2CCCmKpIs174iNYG6mIMoAlDcjJpCXaHsVqHY82X03JbulTJYuZmkMVb/FfV3Vf2oo/Zc6YcC0WdoWhpqL6hcZMq54MnxMf6psQlXJoqoUonhrZ5fDEHTDiISxgktePTMinO7Arc0IYZrCI9r5Xa+8ViX859akKcW5L9rQYjR4zXNQBNwh4Y5DTPCdqi4tK2ZzYUbMpxNMVjklSKjxjn3oxd/6r5+0u7rk9EN2q8lqR36Lyf7P2/ANtG6RQfWhKPH3YK5eUZ8R/Re06DriuLWmSXL5PEhlNw4WK8kppweQMmFg/VKSrqGkz3WupKs1xNf7Uq+9qqlZKvSUhK2Vy0lXZWWeyqXW8nt3fXWi+/ltBDA/gz1HJLFalKvzfuz3kjWFOVGMofAmyNwRBhTElO5c6Y/FCWPzyE29CY9mlBJs6iWbcoHHexUUd75bUAK7BFw2x15RDX5UTY6O+zBlSceO0qS5yzbtgFapHiXbqtUZDcei3hj73fSRQA5kSSlukFU/+S+sl74ckYpbhSV9yyi27CL06KdfNBDF3ZSlLCRcS+qDqHrvKZgp7nbBbGHhKWz2C4YD5WvhmqFndC9ODlZnsHdEs5ia1/rjZRCNh/AxVQTZout98rFBVxEtbu7RNVcrXCOPDP7g4hI2dinarScblYOGNyS9UstGa1rvPuj2Sna5VT7dbWRUUmvY3e9GReOvk0b/O76+nIJ0O1tfVNdbz0bRrR6s/e1KdVjgS91c6EQPCd6DCF0cpx/0m+dagyiOuVEVHXAhbRNmP2pa6pgrHWuwk4n4sLER2REM02OCOuQnNkoUjQykumJFTm77L6nE1fEIewP5hfYsuJ8pL6s2h6Ss/cU2XLnST/LYv+4jQ+AodWuUbMMoq/2Zi+m33wnac7p+hfNq+e68Dwhv71MTl+0X7569qr94uXpSXv4PInaJ9Hvp8+T01OSkFNYM6HdVrg+bN1Z5S5CTR6vNuXcVqia3s1N6Vzurc/Zqmt+TObfHPhp1WzEUg0SZnFad/jqsuuOq0yCvW6WCOtJ5RjU+mnr7LILc+c0OD56dnS8hFtbjHmRRDYvlm5ob0OwEBBVKOD2pjYpgqYk/WN2A58MA9BPBz3eprhdmIL4wND0u+7knLBs7rDjQroPPqTnnUzZ3OXDGgLAXDXGRBD2YTodEkVvJC8KvPzVUImxO/COM0T6+oPqRGTD+guduDqJFaNt0yUu58ZF7UL1wMzuJM6iiOZ649rBXK66/HR1DQEM/ZdMUhGjjCRoG/4OAfA7K9paFU7dtSlwko2MHUiDw8SffwFOY/Ua -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-evaluator-variant.api.mdx b/docs/docs/reference/api/create-evaluator-variant.api.mdx deleted file mode 100644 index 076c593466..0000000000 --- a/docs/docs/reference/api/create-evaluator-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-evaluator-variant -title: "Create Evaluator Variant" -description: "Create Evaluator Variant" -sidebar_label: "Create Evaluator Variant" -hide_title: true -hide_table_of_contents: true -api: eJztWNtu20YQ/RVhnlqAshxflJZPVWwHVpPWhu24D4JgrMihtMmSy+zFjirw34vZpShRt8iyAgSF/SBLy5kzu2euywkYNtQQ9uDikQnLjFQa+gHIHBUzXGbdGEKIFDKDDzgVeXhkirPMQAAKv1rU5p2MxxBOIJKZwczQV5bngkcOpPVZy4zWdDTClNG3XJEJw1HTr2XkDSI8dvDZ+CqBsDcBM84RQtBG8WwIASRSpcxACNbyGIqgksisEFD0AzDcCFqoztzokiA8SfUlEfJpjyb+KSFLC0wZnrDI7NFCp4QsLSTCOXQeu04k1w+R1UamKzcwkFIgyzZa7OrGmUcoAoKrXPMSxMoXJejIpix7CeClAyiKYCokB58xophdcv97x9kyXhFAiobVd8HimFNQM3Fd43WdL+dgeWZwiKpuKR3UV+aPt9oWRFxFVjD1y3srxJ9aZs1ullvzKyyelTC4wXQ7JaYUG2+kta4KS9xu0v2LmCSNpfj8mRj9W37k2nyP03VnXNR+HkN3PgohYyluef7lHZBuEUCMOlI8p6PuCnU+B1EEoIUd7gp1S7pbpeK9r/9nruOsVKGOwxXG1LSW+8aq6l7DvPENCwrCnmEZZdEt6Fxm2sff0eEh/atRCbc2ilDrxIrGTSkMwa59L5LWKy2E8+wQZ06C/JkwKwyEh0Wwul2uq/evjfO1cb42znWN88qaHTrnktYzWqfX/Z/3zk20btE8d+Ho5+6e/goVPzCzZfmKmcGm4W4/6634nhY3Oo4sm8c/wsgnD1saiVHgDzBy7mFLI1O6BuM9FvwpWe/GZcmf8rVXK1O2KitTwvZqZUpXZeXl41kA+9se7ekZ496qFvIM9WoQK9xUd3J0tDy33TPBYzeVNS6Ukmr3oS1Gw7hwE4FvEIsCQka1p8+pxf1ioafMTv1R+g2Sp1I9nBsbKwfN+oXWbIizArpe1JHRuKOn35u26VzedCk35/AZvZ7d9cc49/Rt8u/l3d31EqD3bd2pPqNnI1DjvnoxlaIZSXp5lUtNv3NmRhBCK1f4yPGpVc1eulUO0boFAWhUj6i085ZVAkIYGZPrsNWKhLTxARtiZtgB4y2WcxfyGiOruBk7lc519wOOL5HFqCDs9ecFbimefITUxSrnsJx/QOLK9zDoWDOSiv/r3R4ApzOPvBaRQZF6M3sBd/GNpbnAtS/U6jcBOE7Yb6dJ+6R5+vbN2+bJafuoOThOouZR9Hv7OGm3WcLasDDbb6tUG9e3Vaom8LlJm+5li7NytVaOuuXdrZw4Z2NSNQzMor4ePtWyL55VXlIpzBLpPDO9LDi/NzrXXQiAIsQjHB68OThcwq0JU5VhkXPA1K3uMQQLAVaFFgSAqSsxYJClf8we0M4onssJv8TbkAULg0wZZwa/mVYuGHe1xO1iUiZID8oEgblrpqYzl0kCAVDejyirwh5MJgOm8ZMSRUHLXy0qyoR+qTAg8npU1EbTnJjAFxy7m62rvk1XekhcWJ8DC5WYqqTX6EQR5majbH8u8a+vbu8ggEH5ajqVMekoRkejzxCAXnSTtos6tzYBwbKhpeIZgsekv/8ACWvr4Q== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Evaluator Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-evaluator.api.mdx b/docs/docs/reference/api/create-evaluator.api.mdx index d8ae04e20b..ed2d717a74 100644 --- a/docs/docs/reference/api/create-evaluator.api.mdx +++ b/docs/docs/reference/api/create-evaluator.api.mdx @@ -5,67 +5,957 @@ description: "Create Evaluator" sidebar_label: "Create Evaluator" hide_title: true hide_table_of_contents: true -api: eJztWEtv20YQ/ivCnFpgbalGTzxVsR1YTVoLttKLIBgrciRtuuQy+3CjCvzvxexSfIiSIisOEBTxQQaX89j5Zvbb4WzA8qWBaAq3z1w6bpU2MGOgctTcCpWNEogg1sgtPuFWBBjkXPMULWpS3kDGU4QIKoknkQADkUEEnxzqNTDQ+MkJjQlECy4NMjDxClMO0QZ4tr5feDt2nZMdY7XIlsBgoXTKLUTgnEigYJVE5qSEYsbACitpodp/b5RAQW/IIRr7RiVrclL7t9ohg1hlFjPr/ee5FLGPt//RqIzW6t3lmtCwAg091SB0Xi2kx7IZT1tAmKfYGavSvUHPlZLIs6NRjkzvOlgoGJlr7eZcixV0pdGVS3n2NQbvvIGiYFshNf+IsYU92XrrMevaKxikaHeqgyeJoCRxOW7heqh+GmZFZnGJuu0pnbdXmuHt9wWx0LGTXP/01kn5u1HZxSjLnf0ZdmMlG8JiepoS15qvj8LaVoUOtsd0/yAkSaNTn98Ton+q98LYL2F6KMZd7ZchNAlVWPLYSfF3d0C6BYMETaxFTqGea+qmYaJgYKRbnmvqkXRPOorXnuX3ytbcOW0Q4D72DUYeAvVCUZA1jSZXmQmVdTUY0L8WSPDo4hiNWTjZeyiF4WyGjpULSjuFWu/22ktQphbcSQvRoGBwgEp/UPwPir939gyO72i9gOSD7v+c5Y/BegLNn4PR983zoc9Onrg9sStOuMULK/x+DnsJnJz0hh4slyffwsmHYLZ0kqDEb+DkJpgtnWzhmq/pc+OVviO2YL1Z+w+JGq9X9bJFq/KyBexVvWzhqrx8fSPB4PW25z/UTrhA9t0dp+hVrURoQ369uup2Hn9xKRLfV/Rutfaftme2HQlaLqTvAcKVsCsgVdx6+xL2nRU7t0gd7nsVNki5Sc2y0fhUKalvCGP4EmvKPCzqwehN6O2XGkKKK7gu5RopruEN6B4O4ybAdyyxd5PJuGMw5Lad1HCGG02P7zRWimYZuTLWzy/sCiLo5xqfBf7Tr7os0wcGBvXzdrThtIQIVtbmJur3Y6lccsmXmFl+yUWf58LXtMHYaWHXXmU4Hr3D9R3yBDVE01lT4JHKJxREW6zKBc/FOyRoyqHK0NmV0uLfkOVyqrIKWhQ7FeZDPeu4/czTXGJnVlG1ro0WNUxC2k1mtVb2iPRct2p1f1HdonXxtLNQLQfWqcqbOCRbKB9xmdmhx7M3HI+AASEfLAwuf7kcdOy2hOmw8tgf1i1c/jWwncRVKQMGmPqTChZ5+lv9gnZG5VG2xqW9PcW0c/OXebP42fZzyYU/it77pqyzKZR1Bo3vDAMM6KysqCKjKWw2c27wg5ZFQcthbkbllAjD57IxOfsb191hGz3RNnw5PnMtSMdXH9tWCxkLuteB4y78Aa91O3xHXBQ0hnGMuT0qO2scs/H94wQYzMvhW6oS0tGcEKDfCICmjKTti9KvbUDybOmIoiIINunvPzvZFWA= +api: eJy1V21P20gQ/ivRfLqTHBICCVd/ulCoyvXuioDeSRdFaGOPky1rr7svtLnI/72aXccvSQgponwAM55nZveZV6/AsLmGcAKXj0xomAYgc1TMcJldxRBCpJAZvMdHJiwzUkEACr9Y1OZcxksIVxDJzGBm6JHlueCRA/c+a5mRTEcLTBk95YpMG46a/qstbr3KWIrOXLb8mEA4WYFZ5gghaKN4NociqCSZFQKKaQCGG0GCvwlbBBCjjhTP6SgvNXXRMFEEJRPxPTP7DAaQSJWSDsTMYNdwd56nvbz1ZjtjQ05sHv8MJ5+82dJJjAJ/gpMLb7Z0sqZrtrzn8YF+rOXxQWSdLztXcZOvV/WyZqvysibsVb2s6aq8aGHnL83VW8IWAbze8fyZEuHaww6TcvYZIwM14F+pHhIhv75zkG3TRQApGhYzw9oGWRxzKjImrltt4AAeeGZwjqrtLZ21JTMpBbLMiXb7goiryAqmfnlnhfhDy6x7leXW/ErXa12XbHCD6WEgphRb7mW5DSXGt/09hf1rzSZl6Barz4XpwiO3orR1hBp6WbXsXVo0FrjCmIZJ3dynO+A3foBAQWZqmFEWnUDnMtM+Bwb9Pv1pdXO4tVGEWidWdG5KZQheOociaT1oI6UaTcdpFEF7ZD3PdIOug2huEuhPtZu88saFo+90MNgm6B8meOyu37lUyg3tF7ITo2Fc0FOZ9ZsKQkattz9StNNio1Lq6/4p/QGJ9lTPG/GpWlldBlqzOda187SqI6NzR2+fCwDdy7su9RqxqOn17D59jQtP376ien93d71l0Me2HVQ/+zqXjU0sRbOQtKXlUpPNnJkFhNDLFT5y/NqrElb3IACN6hGVdsGxSkAIC2NyHfZ6kZA2PmJzzAw7YrzHcg6b7sfubectqbo2pDGyipulsze+vvqAy/fIYlQQTqZNhVvKLZ8tbbUqUCznH5B485sfjK1ZSMX/9ykQAKcDLDyKiKGsvam30MtvLM0Fbm2VpbUqDdoXqsTNxQ4G/cGw2x92j4d3xydh/zgcnh71T8/+g/Zutk+vuV7t09vYkOAkYb8Nk9Fpd3h2fNY9HY4G3dlJEnUH0ZvRSTIasYSNYGvlORS2scMcCvNLSU3Wj2Cr5YHr+8hqI1Pf5AMSNCJVyRY2ZVk1CBrbQmPCURbzCL0wklnC59Z/r5DI1Q3PEumyqyyxMnXPWfSAWQwBUBn4JOgfHR/1n8r1EtAZX1+VHZRFppFYXo1C0qqmqo4gAExd+wSDLP29fkGnpJp1163s7ajwjc+Ysl4MfjO9XDDu+qPzviqLfwJl8UNjXmkIgBrYgtpEOIHVasY0flKiKEj8xaKiMp4G8MgUZzNibULdebEu6BU84NLNQjdGuq6HkrqwvoA3Rgq1e48YRxHmZq/utNHJrj/e3kEAs/LjMpUxYRSj+9DvEIA+UQntUsvJViBYNrc0BULwNunnO7sd/nM= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Create Evaluator - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + + evaluator + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + evaluator + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-human-evaluation.api.mdx b/docs/docs/reference/api/create-human-evaluation.api.mdx index af0037c4ee..4689429aad 100644 --- a/docs/docs/reference/api/create-human-evaluation.api.mdx +++ b/docs/docs/reference/api/create-human-evaluation.api.mdx @@ -5,71 +5,408 @@ description: "Creates a new comparison table document" sidebar_label: "Create Human Evaluation" hide_title: true hide_table_of_contents: true -api: eJzFVk1v4zYQ/SvCnJU4DXrSqWnXQIxtmyB29+IYwlia2NxKFJccJXEN/fdiSMmSYie7DbBbX2yT8/3ezHAPjBsHyRKu6xL12fQRixpZVdrBKoacXGaVkf+QwG+WkMlFGGl6irKqNGiVq3TEuC4oyqusLknzvb5D5cgl9zqKouh6sbidPmfkrSRROrCZ3us74trqTnZ0CTFUhqyPZpZDApn3n24l0pQOkUIMlr7U5PjXKt9Bsvd/laUcErY1xZBVmkmzXKExhcq83uSzk7T24LItlSi/jBWPrMi1sqnK5RfvDEECjq3SG4iBFRdycGVMNMuhieERrULNqcq9qmIq3bFmE3cHaC3uBpY+Bf1oljuR6rNLg8JxDKTrUoAL5cB0nTI5DndO6U1BaVnlVPhjAbNz1WO8EJNNDEqbmt8X9yyoigA5dsRfqdgiSLVVc4xcn/DXy8+DRNNHUK0/U8Yt6AHlZQfVGIfjMh5SHYV7iGNQpD/pyXdEXyxoGonCkjOVdoEhlxcX8jVuk3mdZeTcQ11Ed60wvJuDb1fzu3Dvv9D+2wH8sZz+Cl1OUOXAoDal43gH7uaqNAX1Tm9qNjW3DPn58vKYFJ+wULmXjabWVvb9jMiJURUjoMcCRZWNblHvbh4gWR4T4nCiNNOGLDSr11nye5W1fRBD6TZvYf4HOYcb6in3uqgvRvRNoElewXUrtxpSuCtvqO7raXwI5TvlrBORjXVkMGBbEm8r2UWmcqJikLeQwMQT9owG2zMGR/aRrPOVr20BCWyZjUsmk6yo6vwcN6QZz1FN0ChoVqKR1Vbxzqtc3c4+0u6aMCcLyXI1FJgLNwLaY7FDodGojyR5ayx9y9a8raz6p9uYSki5DVqSmLDurt+i02cUhg+3YI/daN4su/PViQ4/2cjdthlqDpdH76ibLoMRpvRD5dPsRpEvYnR1O5PAyLrQbhfnP51fwMsHzEhY2g8z335djfw1xC/QOuAkM6H0vQdMWP7SX0gFhREl6oG98F6K/B6JpsP3yiisfT8J/ocnVgsU0zNPTIHK97cvwL5ldzuOR+xexbCVDkiWsN+v0dFftmgaOf5SkxUCr1qerAWmpcyVbUflPfxNO0k2pH22CKtZzAfqvhiGMqiCxlUmSb4puxo06e3NfAExrNtnoawOSMDik0wWfIIE/BszpCTvRjnbQ4F6U8v8SiDYlM+/mmTeNw== +api: eJzFVk1v4zYQ/SvCnJU4DXrSqd6tgRjbNkHi7sUxhLE0sbkrUVpymMQ19N+LISVLip3sNkBbX2yT8/nmzQz3wLixkCzhypWoz2aPWDhkVWkLqxhysplRtfyHBD4aQiYbYaTpKcqqskajbKUjxnVBUV5lriTN9/oWlSWb3OsoiqKrxeJm9pyRt5JE6cBmeq9viZ3RnezoEmKoajI+mnkOCWTef7qVSFM6RAoxGPrmyPKHKt9Bsvd/laEcEjaOYsgqzaRZrrCuC5V5vckXK2ntwWZbKlF+1UY8siLbyqYql1+8qwkSsGyU3kAMrLiQg2ldR/Mcmhge0SjUnKrcqyqm0h5rNnF3gMbgbmDpc9CP5rkVqT67NCgcx0DalVK4AAem65TJcrizSm8KSssqp8IfSzE7V32NF2KyiUHp2vH74p4HVREgy5b4O4gtglSLmmVkd8JfL38XJJo+gmr9hTJuix6qvOxKNa7DMYyHVEfhHuIYgPQHPfmO6MGCppEoDNm60jYw5PLiQr7GbXLnsoysfXBFdNsKw7s5+Daa/wr3/gntf7yA/y2nv0OXE1Q5MKhN6Tjegbs7VdYF9U6vHdeOW4b8fHl5TIrPWKjcy0YzYyrzfkbkxKiKUaHHAkWVjW5R764fIFkeE+JwojTThgw0q9dZ8luVtX0QQ2k3b9X8d7IWN9RT7nVRD0b0Q0WTvILrVm41pHAHb0D39TR+DfCdctaJyMY6MhhqWxJvK9lFdWVFpUbeQgITT9gzGmzPGCyZRzLWI+9MAQlsmWubTCZZUbn8HDekGc9RTbBW8HLZTv1t9FFEoVmJucwZxTtvb3oz/0S7K8KcDCTL1VDgTogTqDAWO1QBa/WJBBSNpe9nx9vKqL+6daokgG3QkqyFkrf9ip09o9B/uCL7wo6G0bI7X51o/5Nd3q2ioeZws/SOutEzmG9KP1Q+zW5OBQw/YPaVtG95MjbAe3H+0/nFa6C3CtH0Zt72KWa+Tzu8vBjEL8p6KKgMj9I3KTBh+Ut/IWgKdUrUA3vhYRX5hRPNhg+bUXj7fmT8D2+xtmhMzzypC1R+EHgA9m0btHN71AarGLbSKskS9vs1WvrTFE0jx98cGSHzquXMWkq2lAG07Wi9h6+0k2RD2meLsMPFfKDxi6kpEy1oTDNJ8k3Z1aCbb67vFhDDun0/yo6BBAw+yQjCJ0jAP0ZDSvLAlLM9FKg3TgZdAsGmfP4Gl4/sxg== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Creates a new comparison table document Raises: - HTTPException: _description_ +HTTPException: _description_ Returns: - _description_ +_description_ - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + + + + + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-invocation.api.mdx b/docs/docs/reference/api/create-invocation.api.mdx deleted file mode 100644 index 4c7e401e25..0000000000 --- a/docs/docs/reference/api/create-invocation.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-invocation -title: "Create Invocation" -description: "Create Invocation" -sidebar_label: "Create Invocation" -hide_title: true -hide_table_of_contents: true -api: eJztW1lv2zgQ/ivGPO0Ccpymbbrrp02bLuptuwmStC9GENASbbOhRJVHWq+h/74YUqfP+ALSgHkILGoO8uMxo/mkKWgyUtDtQy95ECHRTCQKbgMQKZX2qhdBF0JJiaZ3rJSBACT9bqjSb0U0ge4UQpFommj8SdKUMyfX+aZEgm0qHNOY4K9Uom3NqMKrmsm5e0KyEbPtER0SwzX2xCgtYghAT1IKXVBasmQEAdDExDiOUmBsYoL9JEYLHJFmmqPGNYtTTm8kCemFc5AFcM+SqOmIRGMRrvBT3KcPhEMAKSeTJV4+ou0sgHBMkoTyGTcpW+FEaJ5CAD/oAAJQ0T0OJ2VL/LzL7WdBPqlTIMnkYgjd/hRIFDFEmfDLBsaVRLMPWVC2sETTEZX1psTEg2bLQAhOSWKbFvuCkMnQcCJ/+1d8Ykr/o0TS7iWp0b9XCIjBNxrqpivOIauNeFbbjvfR2jeITBZATDV5ugj9bThfhw/TNH6cEpGSTFai0lTdDNHPiGQWQERyRD2OS3GsJM+JQ03SIZU0CR1GzfPvu6Fy0oSuKfBApcpPzkegO9fbr7l6FoDiZrStmWvUzQJg0SoLAQyFjAmeecawaKXFXgTZCuyuCswWGMkCB9vdA5GM5PHIw7cxfJI+sHlwPH7r8dNUaUX9wtsWOL9zdwXQ791tEaw9uXjwdgDP7+F9gOj38bYo4kO5IVpID93W0Pk9vDuEfgfvksuERFGP3GbIrdCrlQqvqqpDFgBnyf0jy4XNCVApSe5Wj3slcilJWj1bG9XYqx1M2VG11gD3iSX3i2tbeQ3oeY1vfbnqk534RSaxuM8kjbAIbQt7jUpVsWTqa7as47+zXMFaq7XC/wozV45kgCzL6upaGmobVCoS5Sbr5PjYldZVKFnqUni4NmFIlRoa3rrKhSHYlqsIhXFKM+XKqvvvrERQ1feP8WBoUBzLDjNHsUR3RD/yGImIpm3N4kXHQK1HzmzrzFYjTRodwskXZzZ3ElFOD+Dk3JnNnRRwDSZrdtUmB28B1ttJvm0LvPbqpUCr9FIAtlcvBVyll6d4mAWe43v+HN+F0buQfE79WbN8qxBaTk/NaW3AT20D6i9B9D0dKD3X57m+XwM+X6XYpUrhuT7P9Xmu79dD0HN9nut7OiD6fbwtip7r81zfU4DQ7+BdchnP9W2OnOf6PNf36HrVQbi+DVdlpViScZll9l6dnMxzd18JZ5GVbr2XUsjtibuIasJsUX7J5HMRNu5uUsK8nZ2FGuYVTBCrUY06LE+KqriqFBnRakqXi1owWjd4d910cktfoOtcrn4klvA6dJcP49zBt2pmP9zcXM4ZdHPbnFRHsbV69S/JYqrHAj8zS4VCoynRY+hCJ8WQSn90KgJVdZAjoRKjgZ0eIzl0Yax1qrqdTsiFiY7IiCaaHBHWQR4F94CioZFMT6zK2WXvI518oCSiErr927rANS4gtySaYuVskJR9pAhOQmK8PjN6LCT7rxgLclkwdlo4elyaV9WXcu9/EjyYYe7Lt4IHq7gtR1eVHFTJLBV0kqN/KpKjqszPlZrL4nIZRatV5cJhdY3nFrwckj9eD09ftV+/efGm/er16Ul78HIYtk/CP09fDk9PyZCcwqLy62Ec1FOrfXuolfAOZPqQ+CwqA+3bx0yh5IDmD4nUsoftfftpPI4ezPghkVr8SHOIlVsk/fu1XctybQBiyVDYEzyPVWc2PrTOLnsQ1FwfH704OobZeNUQxvSDhBb04vi3tyGYCURlCEKeP7a5B2hK4r+qG9gzjHf4AkNlb1F4bHSoDESa/tSdlBP3boN1P80jZx/yyAn1l48wlcP4P8Yg2+3DdDogin6RPMuwOY8R/dsA7NoaIFZ9TG7GRaicwj2d2LecbBbWtikIinPjQuNMRobZktM4C0Oa6pWyt7U84PLi+gYCGOSflsciQh1JcED4vwuAX6i7UXWnrm0KnCQjg0lUF5xN/PsfQhA8Fw== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-legacy-application.api.mdx b/docs/docs/reference/api/create-legacy-application.api.mdx deleted file mode 100644 index dc769f9e66..0000000000 --- a/docs/docs/reference/api/create-legacy-application.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-legacy-application -title: "Create Application" -description: "Create a new application using workflow data stored in legacy format" -sidebar_label: "Create Application" -hide_title: true -hide_table_of_contents: true -api: eJztWt1v00gQ/1esebqTTNND9+SnCxRED+6o2sJLFFUTe5IsrL1mP1pykf93NLuOYzttaNJyiqB9SBN75je78z1rL8HizEAygmFZSpGiFaowMI4hI5NqUfJvSOClJrQUYVTQTYRr0sgZUcyiG6U/T6W6iTK0GBmrNGWRKCJJM0wX0VTpHC3EoErSnu80gwRSD3oViK5aqBCDpi+OjH2hsgUkS0hVYamw/LVFN/hkeHVLMOmccuRvpWYZVpDp0W7enEq/9SVgsXg/hWTUJxDmKnXGqrxLZBclQQITpSRhAVXcXCqclFCNY7DCSr5waqKXAaGKGY6uUTq0Sj8E8VUDEkDnLsfiIYBvPEBVxSsiNflEKdtrRfTOm6jlIq+97jZxqxhysthdDWaZYCaUZ13r9NdrrBbFrA0rCksz0l1J+aR7pb3N22VBKnTqJOrfXjsp/zaqeHZalM7+Dv09M4awlN+PCbXGxVb1dllhQ8fbeP9hTTLHhp8ekkb/Ve+Esd/T6V177HPvpqHL4IVQYE733P/mCpi36iW8/aBOWhBVDEa62b5QF8zLq8J+NHVz1DVp84AVf6zZqxicFvuifNAiIMj9ESQjzAkz0js7+49SyWMYUGTbEGKoa2MCzolse6bOtuboc5qSpiKlNshqoeOdwupNbQZWga+s97XIAaWlw0v0OxjgotY6l1MsS1HctwD09btLtVkJ8lbnNLa36wfuKoYSNeZk9wjpX9lR7uY9W+uTrUT6WqR0H9Va7WgnB6yhq5hb76mYOY2blfFxZL3sCNipDT1B3yFtdKG7YITR5la5PIQITRnPR+1RYvxduPMwvkDFsGsYVo2/YEpVmODzz4+P+V933rpwaUrGTJ2MzmtiiPedglLlAlMvhNomYArugabopIXkuIr7w9Nd5fZpjPqVx6j3zu6RNTe4dkibgfcnn6S2qfUeo9Q+OjrsWSqcFWVXuLUrabXTGVp6ZkVO22tPgI2GXlmuzH6EkA8BthaSkaQfIOQkwNZCVuqaLK4ebwBZKevFIuJZZK2vR5Wy0lYjZaWwR5WyUlcj5fBmvafh/2n4fxr+f5725Gn+P8iu6yB95ekI4P88AngofzOiV37e//P5882J/iNKkYVnpq+0Vnr/cT4ji8IX29or+wRSpZ27u0RVq1YER25tWzXagtzMNtNNe94yBme09uy7Sb0yoku++70jGN5XEF3TtQt3o96g3bu3cRLUt83Aby4vzzYAg21zsnPFD69LZZilRDuHBAalpmtBN4PwMHvQsqcZQIhTnwVHy9Apwdza0iSDQSqVy45wRoXFIxQDLIUPDUOp08IuPMvw7PQtLUJlhmQ0bhP4WhEM3yVrdI6leEusgjDawdDZudLiv9WzdsH+GbovrxZ2wPP18/dXXzEvJd3yPL05+mkd8YTQ7x7SNNfqM5b6GKw+4ljP5c30uXaTbhA1l0Nz1iKrO+Wm/Vvf8q1t+6ds/1w3nZ1+p1t4WxVxzdmpbZ1UfEvGDM4jiqnydqn9bOitHg3PTiFuLf346I+j4429d4g5dWDqU8fKqP52s8GVezWOBTFQ7vMGWML8r/UNXhl7c338VePVb3wMO29l9Ob6JoE91vshtcNa+moHpURRtCaLEGkjqCMNYgjc0DmpNBAD54U5h2cyguVygoY+aFlVfPmLI80hNY7hGrXACdthNG6mDx9tn2kRahJv7plPTUwuXQimXqbmLBo4hmlKpd1KO25lkLP3F5cQw6R+xSVXGfNo5K3xZwL+jZmwq2QZri1BYjFznFwTCJj89w1yvlik -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create a new application using workflow data stored in legacy format - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-metrics-preview-evaluations-metrics-post.api.mdx b/docs/docs/reference/api/create-metrics-preview-evaluations-metrics-post.api.mdx deleted file mode 100644 index 67c07cc21c..0000000000 --- a/docs/docs/reference/api/create-metrics-preview-evaluations-metrics-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-metrics-preview-evaluations-metrics-post -title: "Create Metrics" -description: "Create Metrics" -sidebar_label: "Create Metrics" -hide_title: true -hide_table_of_contents: true -api: eJztWVlv20YQ/ivCPLUAdVi+Ej7ViR3ETVwbtpOHCoIxIkfSpssje7hRBf33YnZJkZRs+YBSJIX9YEvLOXa+/ebgeg4GJxrCAZzcorRoRJZqGAaQ5aTct9MYQogUoaGbhIwSkb7JFd0K+vuGKp3ls5s80wYCUPTVkjZvsngG4RyiLDWUGv6IeS5F5NS6X3SW8pqOppQgf8oVuzaCNH8rrPJHYSjR6xJj6QKYA6az8zGEgzlgHAu2jvKiIVpJmFlOEMIoyyRhCotguaSNEukEFsNFUC5loy8UmbpQaqWExTAAI4zkhXduE4uA94vP3EzpuXIjUkMTUk3Pyai5Uo/hbl8QCRVZieqXd1bK33WWtk/T3Jpf4a4QC5gfoYRK4WwzLA1VeBKkZ4wkazz/eP8DRP/IPgptHsL0vhhXtZ+G0HXBuVtSWvg0agZeiX4uRAKIaYxWGgih3+vvd3qHnZ09NqINGrsRxgAotQmXipzS2K98tWQp5my3aeqXtI0i0hoCGKOQVhErKpUpXoowjUhKiqEWR1V5rvwm1oNeBBDjS2ZtJ7OO0WcWg6BuUd6J2Z0IrRg6LQ2we5GQNpjkmyk0zlSCzL4YDbVZaTPFl1aZohGlqER2I+JHOrFWxBvtXxUmW6csxywujG82WRm4tKnTXTsA3wCFopgzpjB8J+nPfIt761ps7SQ9CRoF0bXCh3yVLfNhZ5e+RcOCTVYmjLLkFnSepdrnVL/X4z8x6UiJ3LhyA1c+1cdWti4LYc7x53X6KLNeaYWAVRRvnUSthPV8w30ZELZfxs6teUYdW9N6QiHzuv/zGWETrI8YEp6DUTkl+BE+vkGz1QrtK0ncOnLbsnn8PZx88mYLJzFJ+g5Ojr3ZwkkJ12i2xXZTgvVmVjScEq+teinRWnopAduqlxKupZftmfb2amPtI7J2zUg58v7ws219Ji+9/zzz7s/RKF5G3h9x5H3EsFtLjsHwLpf3Gl9OpAs33u71++sD7GeUInZKrRNO4+dPrzEZFHLDFCqzqPH0KUk7vB+nj5nfoBst9WTTHcAZaY2T2hvG/aIOjNY1P33omDku77qQq5fgJbwe3fvDOPbwbTrg99fXF2sG/dk2D9U32VbFoITMNONbzOJmMkczhRC6xS1mt3aL2S1eJ7pc7ElxC3JnZJWEEKbG5DrsdiOZ2biDE0oNdlB0MRcuxTRFVgkzcypHF6cfaPaeMCblyFsTuGIWeV40xZZHgrn4QIxQigl/P7Jmminxjz9sLmS8H6/FEDA/L6sb15NvmOSSGjeog+pVqHoPqYbneset3w1V7bPWG4vm1KiovUZFZBN77d5hu//6emc/3N8J+686vcOdP2GlqsHuGF/tjw/22vuHO4ftvf2Dfnu0O47a/ej1we744ADHeABVoXqcvMsZkY4zh2lBoSN3Yq2ji1OoB9vr7HR6sEqjhjBXBYxcVSgPxD2GYIUaS1LwZJC4kgCGMPmtesDHxUxMMK3ZW2NtYzdLXhj6Zrq5ROEy3vmeF4QeQEFodl27zK/ekQPg7JxyFoQDmM9HqOmTkosFL3+1pJi5wwBuUQkcMWQDhnFacngOf9HMvYi7Gtl2BYLFpfWcXamXXMu8xlEUUW42yg5riXpxfnUNAYyK/x0kWcw6Cjk0/h0C8H8ofHzh3K/NQWI6sVziQvA2+edf3xN+Tg== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Metrics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-new-evaluator-config-evaluators-configs-post.api.mdx b/docs/docs/reference/api/create-new-evaluator-config-evaluators-configs-post.api.mdx index 3576f65ebe..6c6ad046b4 100644 --- a/docs/docs/reference/api/create-new-evaluator-config-evaluators-configs-post.api.mdx +++ b/docs/docs/reference/api/create-new-evaluator-config-evaluators-configs-post.api.mdx @@ -5,73 +5,348 @@ description: "Endpoint to fetch evaluator configurations for a specific app." sidebar_label: "Create New Evaluator Config" hide_title: true hide_table_of_contents: true -api: eJzVVk2P2zYQ/SvEnFpAtbeLnnSqs7tAjG0TY9fJxWsYXGksMZVIhhyt4xr678GQsiXbqfOBXOqLbXI4fHzvzZA7IFl4SBdw9yKrRpJxHpYJ5OgzpywpoyGFO51bozQJMmKNlJUC99EiM3qtisZJjvVibZyQwlvM1FplQlo7etJPeuIKnz5pIQQPrVQufvHkfk3FvEQxvRVmLajEQ/gDUuP0fsUB2k3Y6/ZV2g8d7y+kVaI2OVYjSMBYjMPTHFLIHErClcbN6oB+FVf3A74b8StrPEECDj826OmVybeQ7sJf5TCHlFyDCWRGE2riKWltpbKw3/iDZ9524LMSa8m/rGM0pNDzPy1r5G/aWoQUPDmlC0iAFFU88Ibn2wR6oP/g9tKCno973PJKj0RKF37FE3FTmeeK0clqNgATz9HlNc8fMKNB3scujXgf07TteWzPySIe7BT3OZrl4Ki4OdEX2pa3ceit0T5iv7664q9jWz42WYber5tKPHTB8MOSqPwSv9OcSf1W2awzzM3qcs5ZjBIx98+VWm/friFdfI/obXLYUzdVBe3ygg2SrpzylaRLYG9ilJhwfmhs/g1r3sWosOYrdlM5JHvPDUg/N+AA7RGM5Rd4PXLhH9fX58Z7LyuVx4Zz55xxP+66HEmqKviPsPbnAZXJjmZ7ZY/pG6inNGGBDtplz550Tm4HHP9lIkBWpfbFJTn+Ru9lEXwdQy5Yk8kQc579mnJ8rrh1FzdQoqc3svvfx7iN9H1ps33I6/l8dpYwalsjlYavhq7XW0klpDDub4NxdxuEFuZe0PlAfeMqSKEksj4dj7PKNPlIFqhJjqQaS6tC8XjMGqdoG5ZMZtN73L5GmaODdLEcBjyyOaLcx2EHpqVV98HHsQPBpKHSOPVv1DABxa4s4yo+Gdvuob+57j7J2lbY3zy9dCdtp5847yqcWOm1Cbg6difh1GIym0ICzE8skKvR76MrOH1GHAVzwciMBpjiNNfnEb0HYhltHaoFCGX9Zz/ByFjDWupBvth7xBvcDJ4LXXGfQNv19ft/fex0TiH8RGNbSRVKOzC564y96MX2UYBg7WUCJfs/XcBu9yw9vnNV2/LwxwYdu3eZwIt0Sj6z5AvuKuXexzuItrmJ9P0Wap/Dqyb69qQVcpuKKyZZhpYuxi4HJTp7+ziHBJ67dxgfG1JwcsN9RW4ghfDgC7qEhxqP7aCSumi4e6UQc/LnMzubzFg= +api: eJzVVk2P2zYQ/SvEnFpAtbeLnnSq9wOIsW1i7G5y8RoGlxpLTCSSIal1XEP/PRiStmQ78TZBL/XFNvlIzrz3ZsgteF46yOdw+8LrlnttHSwyKNAJK42XWkEOt6owWirPvGYr9KJiuEMzodVKlq3lhHVspS3jzBkUciUF48aMntSTmtjS5U+KMUZDS1mwX5y3v+bssUI2vWF6xXyFe/g9+taq3Yp9aNfhrJurvB86PJ9xI1mjC6xHkIE2GIenBeQgLHKPS4Xr5T76ZVzdD7g04pZGOw8ZWPzcovNXuthAvg1/pcUCcm9bzEBo5VF5muLG1FKE88YfHfG2BScqbDj9Mpai8RJdwi5lQb/8xiDk4LyVqoQMvPQ1DUyMYdMCugwUb/Ac8i3Ndxn0SX3CzbkFPXd3uKGVDr2XqnRLmkgBFoWkTHg9GwQec0776uePKPxg34e0DfsQt+m6U2zP33xHQsrwOIHTsBaDnHF9ZAroOjrPojNauZjE5cUFfR16+aEVAp1btTW7T2D4aR3Pa/hj+hmriaRXfDGLqOSN/1ZztXm3gnz+I+p32f5M1dY1dIszfshSDRZL7s8Fex1RbEL7Q2uKf7HmfUSFNa/4bui5AemnBhxEexDG4hu8Hrjwj8vLU+N94LUsYpe6tVbbn3ddgZ7LOvjPY+NOAbUWB7O9sof0DdSTymOJFrpFzx63lm8GHP+lY4CkSuPKc3L8jc7xMvg6Qs5Yk8hgjzT7mnKUVzw64QZK9PRGdr+fxk2k71uH7SBvHh9nJxtGbRv0lab7JF0QhvsKchj3V8g4XSGhhdkXtC5Q39oacqi8Ny4fj0Wt22LES1Sej7gccyPh+NqdhFl2TdBQWQ5Fa6XfhP0ms+kdbt4gL9BCPl8MAQ/knOiFQ9heBm7kXTB5bE8waX2lrfwnCpyBpACquIrSJk/e93fh7RfemBqHd1mvbNpy//+oS/UTp02IjpJqpUOku6sw0nDFxSdUVKdEaWToYvT76OJ7vKUFbDKbplrjItTaLuUAo9I+UGavCUXehEIDj7z5s5+gKEn+hqvBfrFtsbe4HjxPUl84CnHbl/7/9XGVfOTxix+bmsvQFQKT21QT8154FwUIVbHIoKLSyeew3T5zh+9t3XU0/LlFS95eZPDCreTPJP+cGlK1c/kWooWuI32/hbZB8LqNrj7qotTh4oqJEGj8WexiUN2zdw+PkMFzevdR2pCD5WtqSXwNOYQHZtAlPAxpbAs1V2VLjS+HuCd9vgJ1bfHe sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Endpoint to fetch evaluator configurations for a specific app. Args: - app_id (str): The ID of the app. +app_id (str): The ID of the app. Returns: - EvaluatorConfigDB: Evaluator configuration api model. - - - - - - - - - - - - - - - +EvaluatorConfigDB: Evaluator configuration api model. + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + + + + +
    + + + settings_values + object + + required + + +
    + +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
    + + settings_values + object + +
    +
    + anyOf +
    +
    +
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-portal.api.mdx b/docs/docs/reference/api/create-portal.api.mdx index da8f0674ad..5b3110f6db 100644 --- a/docs/docs/reference/api/create-portal.api.mdx +++ b/docs/docs/reference/api/create-portal.api.mdx @@ -5,59 +5,72 @@ description: "Create Portal User Route" sidebar_label: "Create Portal User Route" hide_title: true hide_table_of_contents: true -api: eJx9kjFv2zAQhf+K8GbCcjNyqtulRoYacTMZRnGmLxYbSmRJyqgq6L8XRzlu7CFaBIl3x/fedyMynRL0Dl+sc7Y7Ya/gA0fK1nfrIzRMZMr8M/iYyUEhcgq+S5ygRzwsl/I6cjLRBumBxrY3hlN66V31dCmGgvFd5i5LOYXgrClX1L+S9IxIpuGWoMdJHnU38msRUW2KiOo5cayefJ9lbsu58SI0+JShECg30KgPs6E65WgD17P+VEMhcTxzFNcj+uig0eQckq5r43x/XNCJu0wLsjUFi2kvHaaPNg+lZbVZP/LwjenIEXq3f1+wFRdzNLdlI/IQGBoU7CMPUOiole9Vnxsf7d+SBhSs2G3mLsnBdi++tNvsSn0RV602ayiIjTmg5eLTYon72G6KBQCZAuDt7nIMdZfC1T8UuCUrZ5mp/fz/QJRJ3i117+Z9QOlG1zWMzH9yHRzZDtNFxXgBuMMFoAArCIXtDBEKsqeNANc7jOOBEj9HN03y+3fPUUjtFc4ULR0kt91+Um+xCsRXHiQAYzjI0pzJ9TOdu80UuNcN23zf/sA0/QMPMRcX +api: eJx9ksFu2zAQRH9FmDNhuT3yVCeXGjnUiJuTYRRremOxoUiWpIy6gv69WElxEgOtLoLE2eXsvO1R6JShd7izzll/wl4hRE5UbPDrIzRMYir8I4ZUyEEhcY7BZ87QPT4vl/I6cjbJRqmBxrYzhnN+7lz1OIuhYIIv7IvIKUZnzXhF/TNLTY9sGm4Juh/kUTct70cT1WY0UT1lTtVj6Ir0bbk0QYzGkAsUIpUGGvVhGqjOJdnI9eQ/11DInM6cZOoeXXLQaEqJWde1caE7LujEvtCCbE3R4tbKajyt7kWKYS/tTJdsuYz9Vpv1A1++Mh05Qe/27wVbGXHK7aOsR7lEhgZF+8AXKHhq5XvVlSYk+2eMCgpWDDRTlYRk/XMYy21x/ObtjswL+yMUZM7J9nLxabH81zBzQbXarGdSZEZSrz5GGdRNXNegoMAtWTkrTO2XtwNxKWBa8u/6/QfnB3/XYAr/LnV0ZD2G2UU/k95hJi1kR9ayBBNtKMhCN7IZeoe+P1Dmp+SGQX7/6jgJtb3CmZKlg2S42w/qNWIB+sIXCcAYjrJdZ3LdROpmhQX0dRU337bfMQx/AWDxJaY= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Create Portal User Route - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-query-revision.api.mdx b/docs/docs/reference/api/create-query-revision.api.mdx deleted file mode 100644 index 7e32efd1f5..0000000000 --- a/docs/docs/reference/api/create-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-query-revision -title: "Create Query Revision" -description: "Create Query Revision" -sidebar_label: "Create Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWt1T2zgQ/1cy+3SdMYTSlt7l6WihU64UOKDcA5NhFHuTqJUlI8lALuP//WYl27HjfJhcetO5KQ/BKNrfrnZX+2WmYNnIQO8W/kxRczTQD0AlqJnlSp5E0INQI7N4d5+intxpfOCGKwkBaLxP0dh3KppAbwqhkhalpUeWJIKHDqH71ShJayYcY8zoKdGEb4lXbwpzsEu+f2CaM2nveOTw5eR8CL3bKdhJgtADYzWXIwhgqHTMLPQgTXkEWVDukKkQkPUDsNwKWqDjTjo3HrdzQpth+1zq+P4s2z6Dx2ba8iELtyn8YQ6ZcxgK5ylVbBZFnKzMxEXNaA3uA6UEMllllwuU9bOgWFKDrxjalTJ9cEJkAcRo2YbCFJxnbLi0OEJd5xwP6ivVMyzmBSHXYSqY/uVDKsQfRsmdE5mk9gUsOiK3GLcjYlqzyWq11EjhWSr9TJokis3N+x9o9EydcmPX6XTZGeepn6eh69znJIux5fmbEhBtFkCEJtQ8sXmw2wTqqAKRBWBEOtoU6opos4Yy5kLMZR6d37tMsHA/JQOuMaJMMhfS5wNWHe3SZxHICHWGYnWKbsEkShrvdvt7e/SrpkG4SsMQjRmmonOZb4Zg02QUqtQTzXnx7ATv3Q4y45ClwkJvr4zr1Rw2s8XPbPZjZjOW2rHSWwP3aHS/6Ya0Q6WtO5a7uLDitrsrRwnPGDbaOP58zsl/JvLNEvl5ajfI5A2qZ6RyT/s/z+Wr1NoimW+iox87m/tuK7pjdqtRxCfbqHPolJUm0fdg8sXD5kwiFPgdmBx52JxJoa7BNjNRoax3RToq9LVVLoW2Si6FwrbKpVBXyeUBdbNKae+uNzn5VgrPALZ30FyHbD6b1AuwRy4j9UjYKzZJfKSSdJtee+YhswCUiLYNfu4hKabhU1votQo9I6wsAMFjvhh0YWKYQzl11HRuHeGaegtlGlMDwUyIMvJrFGHzP/ordeDgyaOkRf3AxMYSnxQA1H8sq+aaCbCBc7msVyo2/FX6YhOGyjQuLOo1rupHdb6QLXsSYDKaZdSmet23itoaqUgg6Vek0tVm7VSNeMjEecEhc22Vz+yOd172LBduyFFElXaqlKSsddyGLIBvONk0knzCie92RNo2nT+7oClOmi2o4xYXO9S/PqcouXHiZ0HNoOtvCjcQADd3ZMdqAlNxwjQ3SlastxwF78n67nNE/iCse0L3SJ8D+1jr48/SGDUPW4Eby7Q1j9yO3WJUPFKLzrikA8TMhmOkJ8G/YZXRlUNrxYdL7893vCYqlYqt6MeMBBizhjKPeNgOAZ+4sSaXIv+jgnNMKyhDXATWjGfFpsqsgcztXKS8gstuXsgM3hmUhlv+sPhaLOjkmoUQM9i5KmEqogyZMDSgwSfq0p0BN+ZyTBidzw6jwWJF/LzGJ3ue64Lw6ypgYnEKaCPRoRDPksQ72UyS5UbN96yZoPnAWbvQeeB1UbhsM4sM8QL686FpAa2pnum2v+pAJfKi1NR2XHjEXDO6Mf2/oS1ngZkbLL7e32+ODm+Y4JEbDHaOtXZXbcO5YYSWcVHLifUNQoVLMub6JLXCtKfKC+jmKGa0KtVW5j9+y/KtThmda/p2naPSuTzrfF89peXq9dpdfowjr75Vxv14fX3RAPS2rRvV924dP0y8nL2tjNGOFb3OTJQh4ITZMfSgm9DYFh+79/71Z7eY4pouBGBQU7vkDJVqAT0YW5uYXrcbCpVGu2yE0rJdxrss4e6mGwxTze3EkRxenHzCyUdkrvK97Vc3XJEreeeobyvtwhJOtU0xqMhnjPxvb3EqdEkeT0V6ICe9nL2TPX5icSJw8TvW5hwaXg3Zr2+GB6933rx9+Xbn9ZuD/Z3Bq2G4sx/+dvBqeHDAhuwA6lPltjSzSXFbitr8ty1RMdecDRVnk7By3jNz97rflMu+qy0vpOsohsrZpcgOzuqdw4sTqLTTsLf7cnevgVvb7Gqe0IWXwqjuawjm3Kt0LCovYhdbwCKLf599QZKRL8dMVvCWuf/coCp3MYtPtpsIxl0EcSJM85txC/nNyO3HXX1W3g4IgO76mC5T7xam0wEz+EWLLKNlZ3Dy+NxfBqS3Wwpk4+IyTH3NT9mJIu6OCzdlGd+MvhQZPcVhGGJiV+7tV+77xfnVNZWw+b8pxCoiGs3oYPTZA6iVVG5tCoLJUerm7eAx6ecfFShK7w== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-query.api.mdx b/docs/docs/reference/api/create-query.api.mdx deleted file mode 100644 index 5552a5386d..0000000000 --- a/docs/docs/reference/api/create-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-query -title: "Create Query" -description: "Create Query" -sidebar_label: "Create Query" -hide_title: true -hide_table_of_contents: true -api: eJztWN1v2zYQ/1eMe9oAJvaCPelpbtKiXrvFTdy9GEZAi2ebHSUq/MjqGvrfhyMlS7ITJ3HTohjmh9ih7vN3x9+R2oDjSwvJFD54NBItzBjoAg13UucjAQmkBrnDm1uPZg0MCm54hg4NaW0g5xlCAuHpjRTAQOb1/8DA4K2XBgUkC64sMrDpCjMOyQZ4vr5cBBtuXZAN64zMl8BgoU3GHSTgvRRQsq1E7pWCcsbASadogYJe90YCSlolZ2jdKy3W5KDx7YxHBqnOHeYu+C4KJdOQY/+T1TmtNZEVhhBwhEayqVLZW16oAFw7Dy6EJJNcjTuie5nOtVbI83ZqVfLlrGT1kp5/wtQdzP9NCKJkkKHjRwZTe27cyNzhEk3XczbvrrRzuN8XpNKkXnHz0xuv1O9W5yejvPDuZ7gvRekwe5oSN4avD8PSUYVnQfoHIUkax5f3OyD6p34vrXsM04dy3NV+HkKTqufi1n9S/vsRkG7JQKBNjSwo1WNNXbRMlAys8stjTV2TbrkHxg7fnAdCvFeuoZxpxRu7ZBWVryJTQVmSFYO20LmN3XQ2GNBXBxi49mmK1i686l1VwnA0oaXaR6Wd5mwiPQ8SVJ0F98pBMihZw4MNsv8z4lcz4qV3R1DintYzODHq/sdJ8RCsT2DFYzD6sWkxnuLEDXdPPHsJ7vDEyRDPw14inYneMIDlC/EtnHyMZisnAhV+AycX0WzlpIZrHg61L3RarcF6FY+sDV4v6qVGa+ulBuxFvdRwbb18/dxl8HLhhSvBI3P8HgOP6mynb5zcv56d7Q/rv7iSIozi3mtjtDl+Ugt0XCr6VY2CXQGl087T57Bua67G6dGk+l7HAMMctcvWWWFbimYyWMuX2FDlw6IBjN6Enj52dqK8outKrlXaBt6I7sNpXET4DhX17WQy3jMYa9staty7vQ/VvTZDt9J0Oy60deFW7FaQQL8weCfxn/5tvE33gYFFc1fflr1RkMDKucIm/X6qtBenfIm546dc9nkhQxNbTL2Rbh1UhuPRO1y/RS7QQDKdtQWuqW9iJ3TFtkXghXyHFHB1Tx96t9JGfonlrS7rq6hFSVNHXjXX6NefeVYo7FyD62Nec8ZqDgbb8ddUvwvjdjnSxbY/afPnCx0ir0ozDLj0huMRMCAEo4XB6S+ngz27HWHabTwNu61OOzwGtlOALfTAALOw1cAhz35rHlBkVOOM5y17O92wM64r7B1+dv1CcRn2UfC8qRplClWjQDxX03ZmQF2+on5KprDZzLnFj0aVJS1X6E83IKTlc9V6o/I3rrsvYO648uQ/9NIdN5LkQ+uwutRkKOqdR2Y6Cduy0d1jKWKQqDFMUyzcQdlZa4OML68nwGBevZTJtCAdwyl1+psA0Bsn0g6NHNY2oHi+9EQsCUSb9PkXFK5kWw== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-queues-preview-evaluations-queues-post.api.mdx b/docs/docs/reference/api/create-queues-preview-evaluations-queues-post.api.mdx deleted file mode 100644 index 7415790468..0000000000 --- a/docs/docs/reference/api/create-queues-preview-evaluations-queues-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-queues-preview-evaluations-queues-post -title: "Create Queues" -description: "Create Queues" -sidebar_label: "Create Queues" -hide_title: true -hide_table_of_contents: true -api: eJztWVtv2zYU/ivGedoAOXbdJN30tLRpUa/tmiZpXwzDoKUjmy1Fqbxk9Qz/9+GQuvoWO0ixYmgeHJk614/nRnoJhs00hCN4eceEZYZnUsM4gCxH5b4NYwghUsgMTr5atKgnucI7jn9PsGYpX03yTBsIQOFXi9o8z+IFhEuIMmlQGnpkeS545Lh6n3UmaU1Hc0wZPeWKFBuOmr55ofTEDaZ6kyARzvolMLl4n0A4WifgeqLJFGk4E7RgFjlCCNMsE8gkBGC4EbQy1J2bmjKAGBNmhYEwYULjahWUrNn0M0amwVkj94HsfeVsWgWVLmmFgNV4FUCKhrWtZXHMiZOJq5bdNUUhRBvF5awplkuDM1RtTem0vVL6SUvbdUHEVWQFU7+8skL8qTPZHcrcml9h3WOSUezDAUxMKbbYAkONW5sVNhDex/uOkCSOjf3/kRD9K3vLtbkP010+rnMfh9Ctj0KQLMUD/d+0gHhXlAs6UjwnVx8q6rIhYhXAHSpdSGvLqDk+FSSNVIRBf3B20n928uSUhGjDjN27uQGgtCmVtxxl7FdcUYmpRlkp/ZK2UYRaQwAJ48IqJEalMkVLEZMRCoExjLfl/I03Ymu+x2w939vVyWpUEx6vuVDVuuph3akkUykjPKzlcSMsypw7PAc/alSdYewiRUcomeLZHouONWS34ptCWaXcYD75govDNB+lyWDeeUOSjyjil8zVly17qqyc8Ph+MGrR11Z2hvFW7dQmucKYIrQQvDXInE0vXBPe8L2m/+Db5X2Kiq66W5H2mq59D4cVCawFGGXRLeg8k9oH8qDfp3+tOgE3PqsSKzrXBTGl08NGgSiznmmtVtdOvHAUjWrRXwU/J4j/ZoJ4b80DRogNriNmCM/7Px8i9sF6wBTxEIx+7DHCn0viCTP7p4CqNMfMYNdwZ89uLb7+xZ0LB5bN4++h5KMXWyiJUeB3UHLpxRZKSrimi6KFHaCn6Oz3g/V84bpcjdejainRqrSUgD2qlhKuSsvjifbyGnPvQ8K/nIl/+OG3ObSX2n8OxD8H4kcdiO8fhRthOBof4a2uBtaVm35PB4PN+fYTEzx2PJ2XlC8PH25jNIyLPVOqyKLW22PmkPFulN5m3kACMtWzfafxd6g1mzUg303qwOjc0tv7tpj88qoLumatq+D16O5249LDt29/X9/eXm0I9Hvb3lTfzTpV/KRo5hldgRYXmzkzcwihV9yB9hp3oD1/2OhRTUVFld7tkFUCQpgbk+uw14tEZuMTNkNp2AnjPZZzl5waI6u4WTiWi6vhG1y8RhajcpHbILihGPJR0SarNoTl/A0SPn5mgwtr5pni//itDoCTn3PPRQBQdF7X97Uvv7E0F9i8fx01zklr5yF/tqkOJvU0Xc2MdYC0ka6Wq57YvN6pG1yje5Xto24TI3iasN/OkvPT7tmzJ8+6p2fng+70aRJ1B9Hv50+T83OWsHMKq3YxP4KvrsOj0uZm2TtMkMtCLpPM7VMRlBcuCjoXV8MWCv2TJyf9DbhaxFRnWOTqTLnJ7jUEa+FWBRo19dQVGTDI0j/qFxQCFNwpkw1563mwNrsXoWbwm+nlgnFXQpzqZZEiIyhShDQ3fluozuQBELxzSqtwBMvllGn8qMRqRctfLSrKhXEAd0xxNiXARgTivMyKJXzBhTv3u5rbdQWHyIX1WbBWf6k2eo6LKMLc7KUdNzL/6v3NLQQwLX7LSLOYeBQjz+gzBKDfS7x74dKvLUEwObNUMkPwMunvX80jrOY= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Queues - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-results-preview-evaluations-results-post.api.mdx b/docs/docs/reference/api/create-results-preview-evaluations-results-post.api.mdx deleted file mode 100644 index ab5a752d7b..0000000000 --- a/docs/docs/reference/api/create-results-preview-evaluations-results-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-results-preview-evaluations-results-post -title: "Create Results" -description: "Create Results" -sidebar_label: "Create Results" -hide_title: true -hide_table_of_contents: true -api: eJztWVlvGzcQ/ivCPLXA6rDiI9mnOheipmkMW8lDBUGgdkcSU+4RHq5VYf97MeSesryWBaeoC/tBlrhz8ZuDM9wNaLZU4E/g3TUThmmexAqmHiQpSvtrFIIPgUSmcSZRGaHVLJV4zfGvGVY85bNZmigNHkj8blDp10m4Bn8DQRJrjDV9ZWkqeGDZ+t9UEtOaClYYMfqWSlKtOSr6lUulr1xjpG5TLITdwAZYvP68AH+yARaGnKQzcdEgrSj0OkXwYZ4kAlkMmVcuKS15vIRsmnnFUjL/hoGuE8VGCMimHmiuBS28t0ZkHkSo2YHGFJorNTzWuETZ1BzNmyv1PezWBQGXgRFM/vTeCPGrSuLuKE6N/hl2bTGHeQ8mJiVbt8PSYIUHQfqJkCSOw937LyD6e/IbV/o+TO/a4zb3wxAa5zF3jVJxl0bNjVekX3MSD0JcMCM0+DAcDE96g7Pe0TEJWTG1mvGwDUcPFomMGPEaw8NW2z4wteqMQrshyQK8R3TrNom/kIVKB0zdJ+4hlo5zkbkGlDKR/914e0oZ/M5CmXmgNNOmFTIPMDYRHUMpxqFb+W7QYEgniYljt6RMEKBS5F/GhZEIucNoKWBxgEJgCHUbyhPqyhlx2+DMs26S10zsNHGnD7e2OioEEEA8QqVZlO4ZoSHT2CWm9jAtpWZ0tqbI9IyHNwdbfGlFdEbhTb0oDKy3MJ39ieu2enKlMe18xLX1boAxkzzJc7I9E2sicrY876SJHyjg0sSW91ZMut6DSwwpoMrtNC0tNe4MlkvbdryxXU8t6F2+1EF03cl9NhRdTIsu5ZRduq4Jsiyri9DSoF1QaRIrV36GgwH9C1EFkqfangBw5TJkYUTnMiem1Dis+QoS45i24qraxRtLsRVAzz3bD6n4n40+oOTf4npAzXe8//O2rQ3WPfq2QzAqGjc3VYUzph/1qHCVJOycW7NMGv4IJV+c2FxJiAJ/gJK3TmyupIBrvn7E9q8A6/U6P4gKvB5VS4FWqaUA7FG1FHCVWh5PtJNXmzQO6eSLKeR53Hhy48bTOHyeyMRRn8IL7c9TyPMUsnsy2GP+qGE3me4y5c6poxwSMjtxHA+Ht2eKr0zw0DJ1XIIdPFCEqBkXLYOBSILG04fUvOndOP2WOANtt6+WbTH1CZViy9rQdzepBaMzpqf3uZ/25VTndPVTsYS3LF93bOOtg6/NwR/G44tbAp1vm051fU+niqAI9Sqhu/78/j5legU+9PO7/n7trr+fT3h9imaU1BVYHxkpwIeV1qny+/1AJCbssSXGmvUY77OU29xXGBjJ9dqynF+MPuL6A7IQpQ3eGsEVRZGLiyZZ6RKW8o82p2IW0e9zo1eJ5H87Z1NFJXscF0FA8XlZvZd4d8OiVGDjPcOkmk6r0bCaZ+pNUP0GtdbRwIsFe3myOD3unpwdnXWPT06H3fmLRdAdBq9OXyxOT9mCnUK9UamFVr3h2FdQ0UPUzr3aoVadKoPGqUDWH3cHZ93hq/HRiX9y5A9f9gZnR39As7IP6rW4srRRb/e1tCiv+9HnV3OLxHo8D/BzG0+d84sR1F0x6B31BrAd5A1iqlkssDWrCBf7GLytwC1DlrCNbMECjSz6pXpAwUR5ErG4Ju9WTjWsKaNW443up4JxW4+s7k2ebhPI041U117IVZcqHlDtWFGO+hPYbOZM4RcpsoyWvxuUlFdTD66Z5GxOkE0IxlWRYRtwjnzjKnjXli8iF8Zl1FY1p0rrOM6DAFPdSjutlZGLz1dj8GCev/+LkpB4JKOt0acPQG8Z3f4oA2ltA4LFS0MF2Acnk/7+AUSfvbk= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Results - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-runs-preview-evaluations-runs-post.api.mdx b/docs/docs/reference/api/create-runs-preview-evaluations-runs-post.api.mdx deleted file mode 100644 index 09ce2f35b6..0000000000 --- a/docs/docs/reference/api/create-runs-preview-evaluations-runs-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-runs-preview-evaluations-runs-post -title: "Create Runs" -description: "Create Runs" -sidebar_label: "Create Runs" -hide_title: true -hide_table_of_contents: true -api: eJztWltv2zYU/isGnzZAjd2gwwA/zU1aNGuzBHbaF8MwaOnYZkeRKi9ZXUP/fTikJFOyLTtuCnSD85DYFM855Mfv3KisiaELTfpj8uaRcksNk0KTSURkBsp9u0lIn8QKqIGpskJPMwWPDP6ZwkbAP5hmUhsSEQVfLGjzWiYr0l+TWAoDwuBHmmWcxU6m+1lLgWM6XkJK8VOm0KhhoPEbqsS/zECqtx/PuVv3mlCxupuT/rg5gelpzKWGpD7JrDIgfTKTkgMVJI+qIWE5J/kkIoYZjgM3unPlNeQRquPsEb5H2QeU96pobL5T2cBryPOonCVnnyFG/MtZmxMdWvHW4bWtNI9ICobWl0KThKEc5fc1TLcWq41iYhGqZcLAAlTdUjqrj4R73G2LxEzFllP1y1vL+Z9aihc3IrPmV9LcL+ooOHKEEFWKrlqxrYuSLXzbZG8RSZTY4ubPhOhf8gPT5hCm+/bYlH4aQg+ehUTQdDf9t/e/vQKUzSOSgI4Vy3Crp6q6DlTkEXkEpQttdR0biU/FFDQ/p5Yb0ieXvcvfLnq/X7x8hUq0oca2Hm5EQNgUg24GIvEjXyxYSDB6WiH8kLZxDFqTiMwp41YBCiolFQ7FVMTAOSRkssvjR34RO/09oU1/r0dObSBrrH9PEP4bVm1YvYfVhh37QWCORhFh4lH65EAiQoWQxn8J6YMq8ohIxRZs5zmVSmOrjUxJRJY2pU6hNTJUdedV5Jiv5qBAxIVH7vHU+s4DppzCu5JFSBduF6eqGaEsZpTdSa4CZS5VSpGp1rKkPbMkrSllWEK17fU7JjlPd6f7fHTaYRfrDaYw0Y+dip0OMbTimho6MpA1w9bhnHDj93CM8WJGRdEavQ6t7EmLGjk3dfzNgDYhbkseDUXDQj4IaS+xLKBZxkQzke05ulhym4odR8pE0nqm+DzIB/vm+Zh/CH9UVuhqg/rW7+zKr9mFbMhOjW4ZNcu2aff4/DjmOFVHLNxT5YDK4kSKzR2h9Unkuy3JcXQBipZ25aNj5a9cC7K1yIDG2DAcQsV1FfvA0N7G0PcvJM/zUNgoC25AZ1JoT5HLXg//1CoRMvJ5e255Z1hMxoR9WhsUS+uFGg692cKVmxE4by+Pzt3TuXuqN0J31pzQPm1JPaF/8rL/8waqDdYjOqhTMPq5Wyh/U5RMqTmyJE2ogReGufXst+Ijc9IZOLBslvwIIx+92sJIAhx+gJFrr7YwUsI1W02fr4gvwXq96twkIV7PaqVEq7JSAvasVkq4KivP2+tEz9nJ/dSNf3hhUVo/XwacLwPOlwHny4DzZcD5MuA/dRlw6BogYO/4eK26atdz1/u/urzc7u4/Uc4SJ9F5gzn59NY+AUMZb+nSuYxrT5/S60z2I/ShTKzo13rRxtdb0JouoC1xV0giGB2fkw+wEfflTRfzwmRYwevR3b+Naw9f2+m+e3i431Loz7Z+qL5i7hTcScEsJb72Ll5oe68m3eLNdzd4893Fi5YuOhYoLAPc6VjFSZ8sjcl0v9uNubTJBV2AMPSCsi7NmPMeDbFVzKycyOD+5j2s3gFNQDnOBhNGyB/PiPq06jBoxt67oOEjJxlYs5SKfSvrJ6yOyNJL4eaRmcPNW/o3X2macdi8dR8HN0TBTRDegAV3OdXX8j6muCErbkQ2bXwV0jesqcNfDVeVVPhObVNZB2VzWbcW9em4iNABL0uH8PVkWSRuasFapRfUJk1VuTuMKq/2wmQ4DpOdT2+bFdT3HGSWxkoLepXzMAxO3Hrm0p1xQeaBY1BncH9TA6p38fKit4VobTLGJxq7+FQSxD0mUYOqFUmxdk5dcCIGaPrH5gHSB90C6+iNvrr/NG4VipMw8NV0M059ne0Mr4u9j0nhWmg3+D+U4h4zIhghluiM/TFZr2dUw0fF8xyHv1hQ6EOTiDxSxegMwRojgMvSm0rEr3ycfvHgizI05L2nEbMxnnqJQRxDZlrnToJ4cX83eiARmRX/+ZLKBGUUxX3h7z5BJmZ+c+htOLYmnIqFxTDbJ14n/vwLHWwpfA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-scenarios-preview-evaluations-scenarios-post.api.mdx b/docs/docs/reference/api/create-scenarios-preview-evaluations-scenarios-post.api.mdx deleted file mode 100644 index 424b48a1b0..0000000000 --- a/docs/docs/reference/api/create-scenarios-preview-evaluations-scenarios-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-scenarios-preview-evaluations-scenarios-post -title: "Create Scenarios" -description: "Create Scenarios" -sidebar_label: "Create Scenarios" -hide_title: true -hide_table_of_contents: true -api: eJztWFlvGkkQ/iuonnal4bTByTwtSRyFTbK2bJKHRQg1MwV0tudwH05YxH9fVfdcHMYY2avVKn7AUFNH11fn9Ao0myvwR3B5z4RhmiexgrEHSYrS/hqE4EMgkWmcqABjJnmiJqnEe47fJ1hKVZ5O0kRp8EDinUGl3yThEvwVBEmsMdb0laWp4IEVbH5TSUw0FSwwYvQtlWRec1SOnumlH1xjpHZ5ZsK6sQIWL69m4I9WwMKQk34mrjdYSw69TBF8mCaJQBbD2itISksez2E9Xns5KZl+w0BXmWIjBKzHHmiuBRHe20OsPYhQsxMPk1suzfBY4xzlpuVoukmp+rDfFgRcBkYw+ct7I8TvKonrgzg1+lfY52IG8xFCTEq2PAzLhig8CdLPhCRJnB7efwHRP5JPXOnHMH3Ix23ppyE0zHLuHqXirpA2HS9Zv2YsHoQ4Y0Zo8KHT6nQbrYtG+5yUKM20OQijBxibiBpGinHoKHcGDYZU7yaOHUmZIEClwIMZ48JIJEEpE0mkgMUBCoEhVPwo+8+tO8Su02vPhk7eM7H3iHvjugXXIFdAIPMIlWZRetjhWSIjRliFTGOdhA4HpNC6tohMeLgvKIVWY3hYCdKNiWuDENY7SeDaKZcYEvqZ4v0AZg3zre3alXRytVqK3Bad9TFzZQ8+aFE5kzeu78Oa1JZqtDRoCSpNYuXKtdNq0b8QVSB5qm0Gw63LnpkRtZuMmdLmtPERJMYJbWVJ6cdby1GpihaVws+p8zJT58roE8bOjtQT5o6T/Z8PnkOwHjF5TsEoHz1uOwwnTD9rI3W9JKz17bFMGr6EkS9ObWYkRIEvYOSdU5sZyeGaLrPRcIQdOySOAevN0k6PEq9ntZKjVVjJAXtWKzlchZXnU+30VXalI6p2R0m+R/3nF6bqopdb/7lEPW2JOmp9qgA9Gu+zemBlKjactV2Xzjud3YXoKxM8tGK1S0qK07ehEDXj4sBOI5Jg4+lTxtr4Yaw+Je6AdlFR80OvKZ9RKTav7K0Ps1owakN6+lisyS9nOuOrFnQBr0P3YTfeOfgOhfjDcHi9o9DFdjOormXXqlkUoV4kdOGSXaCkTC/Ah2Z23dKsXLc0iwW1Se0DJTU1GycjBfiw0DpVfrMZiMSEDTbHWLMG402WcltpCgMjuV5akf714CMuPyALUdoUrjDcUia53NhkK8LCUv4RCaWYRfS7b/QikfxvF3DqN3QeJ0UwUI7elFdDlz9YlArcuuoZlet1uduWC1m1i1dfYsuWXOm3ZcNrbTQsEjyvty7qndfDdtfvtv3Oq0brov0nlE0HzmbsVXfWO693L9oX9fNur1Ofns2Ceid43Tub9Xpsxnr5y+kssbBkmdC3oNf61wOonrbVaDdasJ0NG8xU3CywxZ1jah+DtxXdIq40LiJb2aCRRb+VDwhxSqeIxRV9e5Jv4zxFcDX+0M1UMG5L11pfZXk5giwvyXjl+rD68uQBFdqC0tkfwWo1ZQq/SLFeE/nOoKQEHHtwzyRnU4JtRFAu8lRcwV+4tO9ott3Vba0TuzAu9bZaH7UlJ9EPAkz1Qd5xpeKur26H4ME0u6uMkpBkJCPn6NMHoFtR56G/crQVCBbPDXUrH5xO+vsHYz1K3Q== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Scenarios - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-secret.api.mdx b/docs/docs/reference/api/create-secret.api.mdx index 572daf3bbd..02a497c72e 100644 --- a/docs/docs/reference/api/create-secret.api.mdx +++ b/docs/docs/reference/api/create-secret.api.mdx @@ -5,67 +5,1163 @@ description: "Create Secret" sidebar_label: "Create Secret" hide_title: true hide_table_of_contents: true -api: eJztWVtP4zgU/ivVefZSQPuUp+0MSIuApZrCvFRVZZLTxoMTG9vpkKn631fHTtKkHTJQHnY1Ki9NfPl8zneuDmtwfGkhmsIEY4POwoyB0mi4Eyq/SiCC2CB3OLd+HhgYfC7Quk8qKSFaQ6xyh7mjR661FLHfOfxmVU5jNk4x4/SkDeE6gZbeUuQJmv3xnGfosfLybgHRdA2u1AgRWGdEvoQNa0byQkrYzBg44SQN/EN7NwwStLERmuQ4FOqiBbHZsHqdevyGMZFQr/s7qLFhUPGzp9CTyBP67Z7NAPMiI961USuRoJk/YQkM4sI6lc3rUWjJFCx0TXikJHe8q937zlUacy7oRJWiQWCEZGMu6TFB1CJfGE7DEnXKpU7pZWnUMzDIhHWGS7+f5y41SosYGGg0WuKLcKWfcmqJLkUz9290olGFQ0NAmIlcdNRzPE+4ScaV6rWiDRX71GL5Mw1rwGssf2o7cmBhMCEWCKJHhgk6J/Klvbi/+zUUydsStwfWw7H3Wiy4BjH+o/AGe8TEqPgJGFi+xIw/eWZXaBy+bCn/Xxn5s9fh7SYujDw0hB+MJOwVGvuBRPC12r5htbsdguJdkQG+OMNtF4QniaA0w+W4pbkzBe66W98BlwG5L1V1qe94NoNMJSi9ZMJhZvcNYWWx7Au2Cc3/Vyq2w9ALuudxt6Tfjs4VCjeGly1NbgMVLbec18ofYvqa8EHNkKeasv0OSw3xu9hdQfvO8qIPrgn6vdmqcYFXg9Wz1i6RVIDeeIwvVnul7C1ZteoTmvraFs83Jm2oTXsv+ZcfsFrlNnjx+ekp/XQaBJgUcYzWLgo5+FIt9hnzoL7mWO6P5f5Y7o/l/ljuj+X+Nyz3DETSRw2DhTIZdxBBUYikV/wrnwx+uw8BUiwwLmOJfeU6fFRJ5twdKljofpLBiMIICp18EO8hIOzgPZbzfoO/BfJTOQi23qJ+HLLXGje45HF5U1uiLsBd1Pf0ro2f7jVodctYdaAbBn+en+83mV+5FIlvIQeXxihzeIeZoONC9uRuqeLO7Bt4FrnDJbnv7PVEeaOCgD6p2d7qcIuWWpRtMnt9qSdjcE+zv7IH6RWOrta163ZDb2D3dTUuAn29sXx/P94DDLbtGjXE4GBSfxrN0KWKvplqZeldc5dCBMMVL6Qbrs6G4RJjh/4+Y6hX8XbxbQ+kzmkbDYexVEVywpeYO37CxZBr4WPAYlwY4Uq/ZTS+usayyjrRdNZeMCHPCb7QXdaYgWtx7e8fIcvCqHCpMuJHMDADQdpVHk9qk09+2X73vXzhmQ4Jbpu+K6jGwl2qtuVt+6E0dMC7V6L6plPNNj1tu2v0vVmD6S0j8oXyGlZGHHn+BqPxFbS6Qjg9OTs53ZOus5jikseupVOYBrZjqMZE1LVnPijBIc/+2k6QZOQMGc9beLt+s1OnKiM5fHFDLbnwIVe1xsGlpuBdijQ7a+7GFhhQTKTkfNEU1utHbvHByM2Ghp8LNOQ7MwYrbgR/JJqms1YJntbEfg6Z6Q8flrRcFsFrdrIUZZCwYxTHqF3v2lkrPsZ3k3u60VT/Q6BeBCIw/DuFPP8OEfi7Be32buzH1iB5viwosUQQMOnvX8hYe/I= +api: eJztVk1v2zgQ/SvGnLlxEuxJp3WTAA2yuzFqtxfDCCbU2GYjkSpJufUa+u/FkJJMf8Tt5lhUF0nkcDjz3rwht+Bx6SCbwSesCw9zAaYii14ZfZ9DBtISenpyJC15EGDpS03OvzP5BrItSKM9ac+fWFWFkmHl8LMzmsecXFGJ/FVZ9usVOf5bEeZkj8c1lhR86c3jArLZFvymIsjAeav0EhrRj+i6KKCZC/DKFzzwL69tBOTkpFUVx/FWV7eJi6YRnZ15/kySQejs3sc0GgEtPkcJvSid83t/bwGk65JRr6xZq5zs0wttQICsnTflUzcKSUyTsMMD++Mk0ePJ7PoYmShlKeddQhQCTrr1qHO0+bidu50+ptD8lDsBpcmpcKnfm5DJntcUYA7/FLIntgmpHgERPP7AQVtlPTtpeKGsU1dNutbbmsKAq4x2kcrry0t+7ZUXTGopyblFXQw+tMZM49tU8btYzhSLAJWf07OAhbElesigrlV+Vt/3AZZfrgkVakFyI4vT0R8t/LszP6CxjeT/yLMH86gGO1W0ImsE/Hl9fayjT1ioPKhkcGetsW8XUU4eVcFfylPpjg0KI/dmf4IbpT0tGeP5DhO0FjcpmiYGyESUbnlKx53pP+QcLkOdRJPXTQMYgynP/ogPzitu3dolXOzgjei+nsZthO9swU2n4yOHkdt9UmOTHUy6u0NJfmX4UlEZx/8V+hVkMFzz1WO4vhrGPu1Cx7Zrsi7QUtsCMlh5X7lsOJSFqfMLXJL2eIFqiJWCw41HYXZww6ZBU45kbZXfBH+j8f0DbVrZZLN5ajDhqop1sm/WU4SVegjtN7YJGNV+Zaz6L5IvQHEArRoYEq7XD7tL0903LKuo0F3/aV317O9n09djcsuIR8XhidA1+nbWVKRRpc2X52iT+AysKb0wIcOW4Ba+dyhfKGicqYixXF5cXVy+hne7YDAa37f6RemT/KIZiANGey75qCuDeMETln/tJjhKLpoSdeLvsL4Omm5LmKdvflgVqII0w9bbtvRmEEqPM7zqrwnhZFpxhWYz2G6f0dFHWzQND3+pyXIRzQWs0Sp8Zrxm8+QwmXUI38T29UfQLpsXdSyfg1bGbSauGElJlT9rO09ENH6cTEHAc3sT51MVMrD4lfsCfoUMgC/zvDrUcxjbQoF6WXP3ySD65Oc7LPAZeg== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Create Secret - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + + header + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + secret + object + + required + + +
    + + +
    + + data + object + + required + + +
    +
    + anyOf + + + + +
    + + + provider + object + + required + + +
    + +
    +
    +
    +
    + + + +
    + + + provider + object + + required + + +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    + +
    + + + models + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + provider_slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + model_keys + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + data + object + + required + + +
    +
    + anyOf + + + + +
    + + + provider + object + + required + + +
    + +
    +
    +
    +
    + + + +
    + + + provider + object + + required + + +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    + +
    + + + models + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + provider_slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + model_keys + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + header + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-simple-evaluator.api.mdx b/docs/docs/reference/api/create-simple-evaluator.api.mdx deleted file mode 100644 index b992864e48..0000000000 --- a/docs/docs/reference/api/create-simple-evaluator.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-simple-evaluator -title: "Create Simple Evaluator" -description: "Create Simple Evaluator" -sidebar_label: "Create Simple Evaluator" -hide_title: true -hide_table_of_contents: true -api: eJztWllv20YQ/ivCPLUAbblGn/hUxXZgNWkt+MiLYQgrciRtujyyhxvV4H8PZpfHUrRkSbYLIVAeHJCcY+eb2Tl29QSazRSE93DxyIRhOpMKHgLIcpRM8ywdxhBCJJFpHCue5ALHWFFCADmTLEGNkmQ8QcoShBBqijGPIQCeQgjfDMoFBCDxm+ESYwinTCgMQEVzTBiET8DSxdXUytGLnOQoLXk6gwCmmUyYhhCM4TEUQU2RGiGgeAhAcy3oRW1GbxhDQV9IISr9IYsXpKTRr6XBAKIs1Zhqqz/PBY+s2f2vKkvpXbO6XBIomqOipwaEzqepsJD69rQJuBpHRuksedboSZYJZOlaK4eqd+YkFAGJa61mV4k1dKXQuUlY+hqBl1ZAUQQVUTb5ipGGhujGRlSt+KNFriu1CCBBvRQjLI45uYqJUQvdVVHkieWpxhnKtqZk0n7jG/m8Loi4jIxg8pePRog/VZYeDdPc6F9h2WKSwTUmmzExKdliLbhtVuggvI73L0KSODpRuk+I/p195kq/hOkqG5e5t0Po1kVhmc02sr+7AuItAohRRZLnZOquos49EUUASpjZrqJuiJdWxZZ3UztDPaJUr1jxl5K9CMBIvquUO8mdBLG7BEES5shiW6G2C/b3guQtHMjjtyqYtkyuztDXOEWJaYS+kGqhD1ttq8vSDUVV8zf1yB6lpf1L9Fs44KZEncopy3OebloAlvHdptpUiqzXKY3tHPqOu2g3nftav/YvUFbzjho8yUsoH3mEm0DrOugtArAUXdi2e8pnxg0Z76HrrKVgiyb0nNn+qNODbi7hzI5Lz+pspo97b4R4eEHUtRthoChIpkSVZ6lysX16ckL/tdoMuDFRhEpNjehdl8Sw86QTZcYxLW0VH2qioF5nyozQEJ4UAawYSQ6j0mFUconqyugdMmOHa4vU6Hh/8mlpHawbjEu7YLTf85I7vIrHbG3n4bXMMdN4pHmC6+uLE9sbWLBMHr+HkjsntlQSo8B3UHLuxJZKKrgmi/HbDRkVWB8W9liuwetNtVRo1VoqwN5USwVXrWX/5rnDgH8Y8A8D/s/Tnhxm/L3suvYyVg5j/v815r+Oux7M3VD/++lpd47/wgSPrWW9CyntheuOQ3yMmnFbZst4XCYQWdT6us1+8qqEC+HG6M9ZxKpGPFGzbqLxJy2l2AybmF5NasHo3dLXlw5ZyC6nuqTzS3YNr0N3tRnnDr517r28vR11BDrftp3qeuGeCwfvJMEO7vOM7tvzTGl7ua7nEEI/l/jI8d++u3/v1ycYqg9uH1fX77aTgrnWuQr7/UhkJj5mM0w1O2a8z3Jut47CyEiuF5ZlMBp+woWr3BDeP/gEtpa48GiT1Z5hOf+EBFR58T8wep5J/p/zeXnz77ozCx6F6XVzH3/xnZFFnfv0+ljIO/5xiaF9gFO/K89f6Lk5AGmm9no2bUKp7ZP6tWvdPLKyj66bw+aTbXz9R+E/Ni1pqxtql2WvXjacrcrXStTP5FMXYDydZtYrZSwOrM97g9EQAm/pJ8e/HZ90bG8RU3phkU0vlUvt59rAKrjqsIIAMLG5BTSy5I/mA62MIrk8GivlrQ7/pdG/DDGN33U/F4yn3qzgdsY9lDuDHGflgXfuqCAA2u1z2kzhPTw9TZjCOymKgl6736PQFoi5YhPh/SLlH1x0f8RCT7Qeu4UemeTEY3dM5WwrzPGeuSx9ZFNUw9vJ2JRNHccgijDXa2kfvAwxurq5hQAm5Y9akiwmHskICvobAtCPeIjbbiT77gkES2eGkmwITib9+wFW1GmZ -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Simple Evaluator - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-simple-query.api.mdx b/docs/docs/reference/api/create-simple-query.api.mdx deleted file mode 100644 index ab7808d5a8..0000000000 --- a/docs/docs/reference/api/create-simple-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-simple-query -title: "Create Simple Query" -description: "Create Simple Query" -sidebar_label: "Create Simple Query" -hide_title: true -hide_table_of_contents: true -api: eJztWm1PGzkQ/ivRfLpKGxLSQtt8OgpU5foCBdqTDkXI7E4St17v1vYCuWj/+2nsfc0mS8hRqXcKH1DieJ4Zj+ddnoNhEw3DK/icoOKoYeRBFKNihkfyJIAh+AqZwWvNw1jg9Y8E1Qw8iJliIRpURDwHyUKEIdhfr3kAHnCZfwcPFP5IuMIAhmMmNHqg/SmGDIZzYHJ2OrYYZhYThjaKywl4MI5UyAwMIUl4AKlX7JCJEJCOPDDcCFog2WedkwBSWiVmqM2bKJgRg5K3UQl64EfSoDSWdxwL7tuj9r7pSNJaKVmsSBGGlDKcZ0dpLLuDrz5Gm9ifiDb1IEDtKx6TGJtCHVUgUg+0SCabQl0QberBWFjLqIKwIODEgomzmhIabG6iSCCTVT4551Hq5UvRzTf0Taswb60QRLK5MM0zc2lwgqrOObypr1TPsJwX+Fz5iWDqt0/RB67NHzqS3RMZJ+YZPOaQi9TwKBVdZhoK0bBfV0NvEyEe0g83GK5HxJRis3bDqZE+TqMfSZPkl2xRo3Xfv+MyiO5Icy2bJN6hNmtGuoAZ7Bpuw0KLvTjI1INIBE8NfuogUw8k3q8L/WCE/kRYqQeCh3w56FKLW0D5YKnp3CpA1S4byiSkvMa0jzJwaxRosy+jVh1Y+NSzQqlbJjaW+CQHSD1QzCxPFU3PauCcE23asOJyw5+FLTZhKJhzYVA9YKou70dWsQGOWSLobpkMSsdrqtf+GinwQEYkkHQrMlJQvblown0mTnMOqc3DLmRY3pnvrxZuzFEE9GFRksLj7YbUg+842zT3vUeKKnDLRLJuVn90pMxPmi6JZsujqKtb1o9fX634qVe70Ic9hWsq2/Q13WMF7TAKY6a4jmTl9laj4A+6fft/QvYgjP2E9iP9vzF3sor/KQlRcX8tcG2YMvqOm6ldDPKPVNMxLukAITP+FOmT4N+xyujCoq3Fh0tnz9e8Jiql6bXop4wEmLKGMo+4vx4C3nNtdCZF9qWCc0wrKH1cBtaMZ/kmr+LXXDsTKVxwlef5TOO1Rqm54bfL3WJJvdcQ4pBp7FwUMBVRbE+QeoD3zDfX9gI35nJMGJ2PFqPBoiV+XuK9Oc10Qfh1FTCxPAWsI9GBEI+SxBlZKcnqS832LMEqe56rLHDWHDoLvDYKF7VWniGewWgxNC2h1dUzXY3aDlQgL0tNLXS2qzvHW655JI+YrckeQ39hO1aLcmh72AdV5Xq8UQvEuestIU0JS6GOI6mdjQz6fZc4K80cXCS+j1qPE9E5zzbDxi2oHyWOaCH1VK+HdlRupp96Zee6skT9JXtYN3cIrtnT1rfuHoPOgS0kkzj4GUy+ONiMSYACfwKTIwebMcnVdWPnL09UtufKeuOmK6W+npRLrq2CS66wJ+WSq6vg8hRDkqcTz8m0HbpsNHQ5Tcy/mbo48v/12KVNQ6vnLg2qRwxeNlHqdvKynbxsJy/byct28oLbyct28rKdvGwnL//xycvmlMW8xM1aXgwGzfHKVyZ4YIcnnWOlrJttOFsJ0DAuavmwvkFE/ops+XCCarnWD5ET0LYSetKWZj+i1myCZUW9eqtVRueSfn3ISOlcjnW2r57OMvU67a4+xpFTX9vVvru8PGsAurutX6obOnScKXQ+Z09IQjTTiN6jxJE29gGKmcIQerHCW453Pfc+pffDPWPpgQca1W3+PiVRAoYwNSbWw17PF1ES7LAJSsN2GO+xmFsH1+gnipuZJTk4O3mPs3fIbMF7NapuuCArcnZR31ZcCYs5lTRe/jLmIDHTSPG/3WVnz2OmjopUQPZ5Xj5cOb5ndJzaw5MMqbjsutaKZTfWqLQK2Uih7OfLrrXSatVaqrx1gkF/8KLbf9kdvL7c3Rvu7Q4Hr3b6L3f/grIDatvjGhl4Pmav9sb7L7p7L3dfdl/s7Q+6N8/Hfnfgv95/Pt7fZ2O2D0WL0i+6jFoLUXYE/byi7y/W12XZlZXH1VL3qihlS+XYirX8mpWf5UIF0BZplaS9mJxdrVjLpLSUph7FvZGzdC7HkbWSPEVZG+wcnJ0Qd1TaXWZ/Z3en37ji2mZbePmmYhjuZ/AWjL0wc6pxQhvkwCALfy9/IMnIrUImK3jL/XBh0JuZu8F704sF4zaQWQHmmYteQeaiZJsWC9xMmttakeLNlFx6eAXz+Q3T+EWJNKXlzPKv5hBwzW5E5f2Yu7fKc7P85qwf3zLFab91Wy93MwJydIcuR3RtgCxpG/mCYrmjOPB9jE3r3lElRp2dXlxSwZ09QQujgGgUIx3Q/yHUbcmuzUEwOUkoxA/BYdLfP+QcfAg= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Simple Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-simple-testset-from-file.api.mdx b/docs/docs/reference/api/create-simple-testset-from-file.api.mdx deleted file mode 100644 index d477e249ad..0000000000 --- a/docs/docs/reference/api/create-simple-testset-from-file.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-simple-testset-from-file -title: "Create Simple Testset From File" -description: "Create Simple Testset From File" -sidebar_label: "Create Simple Testset From File" -hide_title: true -hide_table_of_contents: true -api: eJztWUtv4kgQ/itWnXYkJ2SiPfm0zGSjZGd2Eg3MXhBCjV1Az7bdnn6wyyL/91F128bYQEgg0h5yimOqvur66tFFsQbD5hqiEQxRG41GwzgEmaNihsvsPoEIYoXM4ETzNBc4MV5uMlMyncy4QAhB4Q+L2nyQyQqiNcQyM5gZekytMDxnyvRmUqUXCTOMXut4gal7yhUZMxw1/efwojWYVY4QgTaKZ3MIgZSZgQimPGNqBSEYbkgUbkmjCJ3mxKt11TGzKfkY6yWE8F3LjLxsQgRDUgkhwRmzgiyRbBFC5a4Wdk7QLFs9zCAatY0UYf0ms0JA0TBQUhsMCKOBmbEUT8X8QhgNzAR1rHhOwTsV+qYB1bDgE+Y06CFhNDBT9HlxCuafhFEQqBeU0+8YmzI7ucKEMsAlWEOZUnbyVIIXhLpBMcqie6FzmWmfuNdXV/Rni30Y2DhGrWdWBF9LYQib1cHyXPDYVVrPZeWB0oil9UqlezwzOEfVKIWPTqKRw1cbhrfJbRWd6ER0W2DBtGMlZqW3nTBNpRTIsoNxumM6GNYoRehhFYtPxfQQuyLfSpFb4dOujVeE0E1AliScAsPE4xYZR6RoFZotS+l0+03Tvd22IOYqtoKpX26tEH9omV08WJNb8w7arhIIN5geqcWUYquDxLZ0oUPuIWVfiSF0O8X/idQv8jPX5kla9znZUX8eR1UHPOUOqHr/GXp+q9f7jphMmDkE2LiXE2bwwnB3nv1WPnrYoO/IsnnyGka+edjSSIICX8HIjYctjVR0TVcTnhxpx1qeHEXWh1VwnzT5OquViq3aSkXYWa1UdNVWThmnqjHqfMcrPWftO2D7GqyuwAlPWk2rbL1PH+H4BlzdlMF9Uk9KO+7f2nL3qDTDnI+iasoqw3dW7EGN+9Z33vrOq/adc/eMHbPz0TPOjgG36n7jZ80S1Vz7NnAdMXC9TfqvMOl3r843Ul9M6g3bs8hozwYvGiiO+qb8FZdcc5n5o3S/MB9AGLgtSolzim69Minc/uXX6+vuhuUvJnji9ifB70pJ9fL1SoKGcUFPe0YqIeOtT5+TyON2oDYuf5b+gK416fmuIXJTbFqzeSPq+0UdGX6n+dRGjPzypku5Rs5s6PXs7nfjxtN3KLh3w+FjB9DHdjuofgAJfDIE1eB5q2Qa3Pp9c4pmIWk1nUtNJnJmFhBBL1e45PhPz2/yeuUUrHs2F5IlQHOrWqLSLmxWCYhgYUyuo14vFtIml2yOmWGXjPdYzl35aIyt4mblVPqP959wdYcsQQXRaNwUGFBi+VTZFqujxHL+CYk0/50f+tYspOL/+fiHwMn5hdciVng2k069JLDvDhf0H+8hBHLD03V1+f7yCtokbglTTbDY1URl230MYYuF2n9amqeuIMAgS3/bfEAnI9pTljXwno5Za0lRcmLwX9PLBeOuANxh1mU4R1CGk+LmcKFeZ2o6uQ/qOIQFZUE0gvV6yjR+U6Io6PUPi4riNg5hyRRnU2JxRLW4qCK4hr9x5VanrmlclL8CLJmwdLpdv15QfXulfhxjbhrinX5D+VHn6uPDYAghTMsfSVKZkA4BO9xw80iHLIqfE33HDQ== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Simple Testset From File - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-simple-testset.api.mdx b/docs/docs/reference/api/create-simple-testset.api.mdx deleted file mode 100644 index 516d14ae1c..0000000000 --- a/docs/docs/reference/api/create-simple-testset.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-simple-testset -title: "Create Simple Testset" -description: "Create Simple Testset" -sidebar_label: "Create Simple Testset" -hide_title: true -hide_table_of_contents: true -api: eJztWltvGjkU/ivoPO1KQyAkIe08LW1alW27iQLdh0UoMjMG3PVcanuyZdH899Wx5z5AJpRITZY8NKnnXHw+H5+bvAZFFhLsCYypVJIqCVMLgpAKoljgD12wwRGUKHonmRdyeqcMHVgQEkE8qqhA/jX4xKNgQ/L9jrlgAfPBhm8RFSuwQNBvERPUBXtOuKQWSGdJPQL2Goi/up5rKWoVohSpBPMXYME8EB5RYEMUMRdiK6PwI84hnlqgmOK4kBjQGroQ4zqqo1K9CdwVqsi1KxFRC5zAV9RXWnsYcuZogztfZeDjWr63UCAcilGJ/0vNr32Ycw1k0ZYywZJIDZ5DJJUbjZ4FAafE32nlByJb40xKbBmxgjg/KtOIiGMrJQtmX6mD51wB+L02tC4vtsCjqnKcxHUZ4kr4TQmMbQdeEMt8RRdUlDV5s/JK0bzNusBhwok4Eb+8jzj/XQZ+e+iHkfoVqpaiDKao14yJCEFWO2Ets0IN2V28nxFJ5Kg51c+E6B/BJybVQ5hus7HK/TiExsYLk7DTyP76DpA3tsCl0hEsRFP3FXVVEBFbIHm02FfUCHlxV6R6m+qhCMPAHXMrHpB48cPRtLkzpzGnNXQ17FsiWaZ5Y9TEpPAE0d6Cw8oeZXJN6nPviGoo2yWKthXTbrVdwVsjtjXQPh+F7lMo+WLEJkpcyukTKLkyYhMlKVyz1QFPIwXrzSo5lBSvg2pJ0cq0pIAdVEsKV6blcKKNvA1VSOOEsaFUSKPV9FGhOa0Qjtnrwex1rJgOXTHVs+YR0f0QvUIkH2oIsAbYq5Bo1Gvc0nsmWeCbrdRbjh0SRrpdTeSYHLJRY94XTrLmbrpTzK1pLCGOUZ6gMgz8pBDqdbv4q1RPwihyHCrlPOKt24QY9u4/nSAyTBUPLeRLTYEJbE4irsDuJuVa0rZuKyePDeyzCcfXkdojetS4HhE+DO8L72F3wdqgDNgHo5+7iz22P8f250nbn0OMSQ7dQh3HLsexyzHuvOy4cxy7/N8LrmOl/wSV/jOZvTwPUF/Q+OVHeLORiRm3nPd69QnLn4QzV89PWu+ECMT+4xWXKsI4/rWlpOKBU/r6GEeeVg8qN/lTYDaoQ5NcbCoi88smJVkUTn07qQajNcavD42+0C6jOqEr+EwOr0F3uxlXBr5dh/thPL6pCTRnWz5UU4C0jDO0xtmzE4+qZYDvUsJAmmcoagk2dEJB7xn9p2PeqXSS2ld2AOtUcZ8+U4kEBxuWSoXS7nQcHkTuCVlQX5ETwjokZPq6SOpEgqmVZhncDD/S1QdKXCrAnkyLBCN0JOMaZbLsVEjIPlIEKXkgM4jUMhDsX3PeyRuZpeFCFNBFb/O3K+++E7Sn8vYkKzgqQznztqU4UsOVPN/l1UE2dMjdpox/tmyatAJZEuXLjdAEzubk1cW8f96+uDy9bJ9f9Hvt2dncafec1/2zeb9P5qSv3Srf7qTcozQTkfcdTemL/QT0ur3zdvey3Xs9Pr2wL07t3quT7uXpX1BuCXbRFav6XXSVwrzpdiuVdlO2SunclO0xtKnbldwod63EM2IM71hl+/NAO0py9Qf6mrUGN0OwAC+kcbTuyelJt+Z+JWKM5sTRnp/eIv0ZwSrd5+wmgwXU06EcFCXeb/kH3BmGDo/4BXnbok1lqJbcaUW/q07ICdMBW29hnQSiCSSBCP1US4Ns/C7BArwBS4xc9gTW6xmR9IvgcYzL5qEcXgqXSTLjhadyf9NV9W3dPeER7kXHq3siGHLo8GSl4QRFGc63Jh22dS7IeWupEdOW4Rg4Dg3VTtppIRjfXI/GYMEseW3nBS7yCIIw4L82AL4rRG4dt/TaGjjxFxFmMxuMTPz5D4O+xIM= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Simple Testset - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-testset-from-file.api.mdx b/docs/docs/reference/api/create-testset-from-file.api.mdx new file mode 100644 index 0000000000..8098546d83 --- /dev/null +++ b/docs/docs/reference/api/create-testset-from-file.api.mdx @@ -0,0 +1,937 @@ +--- +id: create-testset-from-file +title: "Create Testset From File" +description: "Create Testset From File" +sidebar_label: "Create Testset From File" +hide_title: true +hide_table_of_contents: true +api: eJylVk1v2kAQ/SvWnB1Mo558KiGNkqZJUKG5IIQWe4BNbO9md5yWIv/3anZtMF9N1JxY7DfPM2/ejL0GEgsL8RhGaMkiWZiEoDQaQVIVNynEkBgUhFPygOncqHw6lxlCCAZfSrR0odIVxGtIVEFYEB/zMiOphaForkx+lgoSfNkmS8zdSRt+Ckm0/M/xxWuglUaIwZKRxQJC4GBBEMNMFsKsIASSxFC44ogqdJFTH3YYjkWZc3H94SOE8G34cM/ltSmCEYdUITTl2axcMJUoVg9ziMf7pFW4uVKUWQZVi7DWMBgyR4uzEDl+lPOeOVqcKdrESM1d+ij1ZYuq9YQcSTR9O6AXxojVu9jvGpqKuT1YzZ4wodpA0mDKTXIeaBGwq6YnzVcx3TacTInugtWqsN5U590u/+woBcMySdDaeZkFP2owhG3nCq0zmTj7R0/Wq3vKtokqfVBdlywIF2haNu07xFbVo2Ju5NjT7oi+b4noMzpsw6bWygn3+fz8UJpHkcnUFR58NUaZ/9clRRIy45MkzO0hIFPJzt132LfRtppsJfAu3Bb7XfkEWfDcLo6thAZ6h9aKhR+pE9ujgTox6kXxhvxcl390jWt1YiuvV/d0GZdevmMPayDXo9HggND3drepfTdAQTONV0blwZXf3jnSUvGG18oytxa0hBgibfBV4q+otqyNSp0pkUIIFs0rGusaVZoMYlgSaRtHUZKpMu2IBRYkOkJGQkvYT6Xn7gZ9hrpVYTEpjaSV4+sNbm5xdY0iRQPxeNIGDNln3jm7sO0+0vIWWUO/a6FX0lIZ+cfbIQTJCSx9FIski7ly4bWedW4XInnGgkvlOn3a3c6nTvdUMXVA0Bvc1OMiEjcuTR4OBuGeXBuh+CWVu1kBQpF/2d7gLLkxuShafP9o594boRaG8DdFOhPSDYXLYl13egx1p2Gznixn6rs9CWHJvojHsF7PhMWfJqsqvvxSouGeTUJ4FUaKGSs45rFcNt1bwzOu3Ppz++PMDQ/Ds5KTOvZ1wKPug3pJgppa8IPVw97YuHfwMBxBCLP6IyRXKccwseMNt0dOsqr+ArYKFDQ= +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Create Testset From File + + + + + +
+ +

Body

+ required +
+
+
    + + + +
    + + testset_slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + testset_name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + testset_description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + testset_metadata + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    string
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-testset-revision.api.mdx b/docs/docs/reference/api/create-testset-revision.api.mdx deleted file mode 100644 index 1b24828bb4..0000000000 --- a/docs/docs/reference/api/create-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-testset-revision -title: "Create Testset Revision" -description: "Create Testset Revision" -sidebar_label: "Create Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWl9v2zYQ/yrGPW2AHKdJ6m56Wtq0iNd2CRI3L4YRnCXKZkdLKkml9Qx/9+FISrYs21FcBcgG5yFxpLvf8Y73j0fPQeNYgT+APlNaMa1g6EGSMomaJ3EvBB8CyVCze20J7iV74IonMXgg2beMKf02CWfgzyFIYs1iTR8xTQUPDEbnq0pieqaCCZsifUolSdCcKfqvAryV4gElx1jf89DIiGdXEfiDOehZysAHpSWPx+BBlMgpavAhy3gIC6+giDMhYDH0QHMt6IHTunVnkVs9Iofm5ZTxc32a18Pio9Q8wqBJAecO0kmIhHGbVezylk1QGY8JUDG1cRGjJBEM451SL1G1+gXKwrOwEoOfxbQQC9oLS5aMvrJAQ8WiH4yiVbyFB1OmsbwKDENOLo/iumSMbRuwAstjzcZMliVNR+Unq+ptlgUBl0EmUP7yIRPiT5XE7V6cZvpXWNeUMLhm03pMKCXOdpq1zAoVy+7i/UyWJI6KU70ki/6VfOJKP2bTbTqucz/NQn3rhRDjlNXUv7oC4l14EDIVSJ5ql2r3gbpYgVh4oEQ23hfqlnhrBOKNqw7vTDXayEHliEsWUjmrFJVqsiwj3thaBgtCXiJpmTHzQKVJ7FLZyfEx/SnZEW6zIGBKRZlo3Thi8PYtiUGSWaY1X17q8M5Q0GZGmAkN/vFKXVmtpNsS9KGmvrSaipmeJLIxcItG8U7xUg+VSNuamzyxI/pNAFIBVArHe+ejz4790E78l9qJq0zv0U9UuJ7QUFje/3lHscusNVqKfWz0snsKe+oM71E3mrtssQ9b58ZYWRo+h5AvFtYJCZlgzyDkwsI6Ibm5RrMGC1RurLczV6JyezUqJbdWISU3WKNScnMVUh6YrPZI9d31zrE30v560Jyizoa4Xk2q7R+VwXserqU/l8QfX0L9VJ7X3FYvVHmvtqGSF5I3d6rP1dk1i31b4B4y2CGDPWsGazpnbOjCa3dLG1rlPPsNn9SV5B3yoXWr0bodzgzPcGaols6DUfc26gUZ87GDMfUCezUUtc7c+ZzPLqV69K6P8HPcxVhwYWaMZycn1SniHQoemhlh672Uidx/hBgyjVzQpy1tlUiC0tunOPNwfbOWSn9K7AJNelLjTY3khgGQJdlOaozR6tPbxya/pJcV7ehKI8PcvNa629W4sObbtb2X/f51BdDubXlTbRPSyrvOm+UF6pTpSUJ3rGmiCDpFPQEfOilNcNn3jmt9VSef6KoOUMMq6fBi9iqTAnyYaJ0qv9MJRJKFRzhmscYj5B1MuYkbxYJMcj0zLOfXvY9sdskwZBL8wXCV4Ja8yfpHmazYGkz5R0aWsmMDN2fk/9hN94CTxhPLRaYgP71Z3hO//4HTVLBt976bptJwGuFvr6PuWfv1m1dv2mevuyft0WkUtE+C37unUbeLEXahPGGuy7N6tqjLU5oE12Uqequ1SSbdL5TnkO7GwZX2ZSNUTGqW0VF2s+KxPY8W8UudYhwlxrz5cNh4SOv8ugcrB2E4Pnp1dFzBLRFTNsLAZKPcAcxr8NZcsXBC8IBNTSoCzXD6x/IFrYwcf4rxCt72aFkbMjmH1OyH7qQCuUk5ZhFzF0gDcIG03GllsoULJvCAssOEgs8fwHw+QsW+SLFY0ONvGZMUMUPnWiMy3YBS3ySPnTn8zWbmNsbk6LZJUEQuMhsra/macqnlOA8CluqdtMOV/HB9ddsHD0bumxbTJCQeiaQZ/fYB6Gsb2mjlz+2zOQiMx5kZ0YPFpJ9/AYPlmTg= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-testset-variant.api.mdx b/docs/docs/reference/api/create-testset-variant.api.mdx deleted file mode 100644 index eb543c68de..0000000000 --- a/docs/docs/reference/api/create-testset-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-testset-variant -title: "Create Testset Variant" -description: "Create Testset Variant" -sidebar_label: "Create Testset Variant" -hide_title: true -hide_table_of_contents: true -api: eJztWG1v20YM/isGP22AHOfV7fRpbtMiWbslSNx8MYyAlij7utNL705ZPUP/veCdJFty7DpuOhRD88GxT+TD40MeSd0CDE41+CMYkjaajIaxB2lGCo1Ik8sQfAgUoaF74wTuH1AJTAx4oOhTTtq8SsM5+AsI0sRQYvgrZpkUgYXofdRpwms6mFGM/C1TbMAI0vyrjbtRQIQWOplfReCPFmDmGYEP2iiRTMGDKFUxGvAhz0UIhVdLJLmUUIw9MMJIXih97VyyGKAyIsLgOQ0MSsjSQiQtyavYTRdnqC2/AWrSj25ikqaSMNlq9QJ1Z1ijFJ6DVRh8K6aDKAqvEksnHyngFGgx+tY6uo5XeBCTweYuMAwFZwjK6wYZmwKwAisSQ1NSTUvxpLmy6t7jtiAQKsglql/e5lL+odOke5lkufkV2p4yhjAU76aESuF8K61NVVhjdpvun8wka6wl1Y/E6F/pe6HN1zjd5GNb+2kMDV0WQoIx7ej/+g5Yt/AgJB0okbGr+0Kdr0AUHmiZT/eFumXdHQ7inSumr23pflSBi7dQFHLtb5fg9VLZwLtxdR8Kxl3iGJWTXdBZmpR17PjwiP81SITbPAhI6yiXnZtSGLx920eQ5k6plchLF15bCY5khLk04B8yHetdZ1Nx/tl/fvaf/6z/XOVmjwa0pvWEDuR0/+ctaButO/SgfTj6sZuQG+rDezQ71pwQDXWNsPvZbMU1iLAzsGTlWfg9jHxwsKWRkCR9ByPnDrY0UtE1mT9jla7IejUv63TF17NaqdiqrVSEPauViq7ayrdPOR483/Z4TztPTY81kJ2V64mmsOPR6fHx+gB0h1KEdrzpvFEqVftPPyEZFJK/lc2hLSDToPH0KXV4XLT6ydLn96nbIEcp1tOV+asOzrJXaI1TWhbPzaKWjM6Qn35tZGW/nOlSbiXYS3odu5vdOHf0bYvuxXB4vQboYtsMqjvNnWq2u6uvSWIys5QvUrJU8+8MzQx86GWKHgT90yvnS90rZ1HdAw80qQdS2kYqVxJ8mBmTab/XC2Sahwc4pcTgAYoeZsKmuqYgV8LMrcrg+vIdzS8IQ1Lgj8arArecSy47mmJ1YDAT74h5cr0LBrmZpUr860LugWB/Z06LieAsvVleBr35jHEmacPlzuo4DScRvjyL+qfdsxdHL7qnZ/3j7uQkCrrHwW/9k6jfxwj70BqRd1Wqp97WdMvvKc3ZtHxzKUfE5VxTd+9lqjZjXi+7alcfJq5dSZRad6uR3AasM7i+BA84tA7h8ODo4HANtyHMpQEDy10VD/sYvFZm1DkBHlBs6wIYwvj35QPeGadhjMkK3sbUbc0dZXoY+mx6mURhj7/dw6LM6hGUWQ31K5Zmf8vMBg/4oM74IPgjWCwmqOmDkkXBy59yUpy+41JhwsSNuArNqkRewN80t+90tlx2ba1gcZm7xG2VTi5rTmMQBJSZrbLjlbN6fXU7BA8m5d1mnIaso5Ad408fgO9JWdvmmF1bgMRkmnO188Fh8t8XEuVTzA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Testset Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-testset.api.mdx b/docs/docs/reference/api/create-testset.api.mdx index 65bf68dbb7..c8c67e899d 100644 --- a/docs/docs/reference/api/create-testset.api.mdx +++ b/docs/docs/reference/api/create-testset.api.mdx @@ -1,71 +1,351 @@ --- id: create-testset title: "Create Testset" -description: "Create Testset" +description: "Create a testset with given name, save the testset to Postgres." sidebar_label: "Create Testset" hide_title: true hide_table_of_contents: true -api: eJztWEtPI0cQ/itWnRKpwQTlNKd4YVeQ3QQE3lwshMozZbs3PY/tB1nHmv8eVfd4ntiAl5U2UTiA6a5H11fVX5drAxaXBqIZTMlYQ9bAnYC8II1W5tllAhHEmtDSvQ0CIKBAjSlZ0qy4gQxTggiq/XuZgACZQQSfHek1CND02UlNCUQLVIYEmHhFKUK0AczWVwtvxa4LtmKsltkSBCxynaKFCJyTCZSilsicUlDeCbDSKl6oTj66TKDkdXZHxr7JkzW7aLxb7UhAnGeWMuu9F4WSsY90/MnkGa81Zys042AlGf5vG/5gY6E8gu1YugIrNB68GA2ZR4Oe57kizPZGeYFmNK2tlCKY1Rh/rc1goizFViyff6KY89wD+J0PdGivFJCS7aUTk0QyrqiuO2DsSnjLrMwsLUl3PaXz7ko7vMd9QSx17BTqH945pX41eXZ0mRXO/gj9SNmGtJQ+Twm1xvVeWLuqMEB2n+5vjCRrDIrqe0L09/yDNPYpTHfF2Nd+GULTUIUV7Twr/uEJWLcUkJCJtSw41ENNnbdMlAKMcstDTd2y7jMu4pkn5EclG7Kb1Yw1pMpg4CbwJJQlW9JkijyrGOr05IT/dOCBWxfHZMzCqdFNJQwH02mcu6DUK9HmrGdegnO0QKcsRCccb8PCu+j2fz7+1/DxlbMHEPJA6wWMHHT/45S8D9ZncPIhGH3fpBw62OQe7T6DrZ4zQUtHVvrz7PYSaDQZTTxYrki+hZOPwWzlJCFF38DJeTBbOdnCNV9zM/9KXfoWrDdr36g3eL2qly1atZctYK/qZQtX7eXrX30Br3c8/0XoyefjsZfjaa365Q9dw8+np8NG4Q9UMvFtwOit1rk+vEtIyKJU/Kl6DvoCKo87uy9h3ruy94I0wX7IwwE5L6lZtvqUOh3N62AMLqmhy92iHozRlHef6t04ruC6kmult4E3oLs7jPMA3760Xkyn1wODIbfdpIb7O5rWU4CU7Crn+UCRmzAVsCuIYFxoepD017hq1cwYBBjSD9txgdMKIlhZW5hoPI5V7pJjXFJm8RjlGAvpa9lQ7LS0a68yub58T+sLwoQ0RLO7tsAtl04ohq5YnQcs5HtiWKpBxcTZVa7l3yHD1axiFbQ4bi7Km2aG8PYLpoWi3gyg7jJ73WSYMbR7QV5pWrKmj6hfy6ZQuojXy4Fd6lJmrsgWuT9QlcWJx280ub4EAYx0sHBy/NPxycBuR5gvJsY+pC08fhtEL1F1ikAApf5WgiVMf2k2+GRcDClmLXuDwum971WWLH2x40Kh9JfO+95UNTWDqqag/gJgQADfiRXXXjSDzWaOhj5qVZa8HCZPXDqJNDhXrdnTn7TuD6seUDk+gi+8B9SSNXydiW1dsKmgeRaY7Mhf40Z3wGrMOEFjEsdU2L2yd63rdH11OwUB82p8leYJ62jk6Pl3BMATOtb2BejXNqAwWzomogiCTf75B1Tz0GM= +api: eJzdVsFu2zgQ/RViTi2g2mmwJ53qpgUadHdrxO5eHKOYiBOJrUSp5Mipa+jfF0PKkuxu0kWP9UUy+eZx5vFxqAMw5h7SDazJsyf2sE1Ak8+cadjUFlK4coRMChVHiHowXKjc7MgqixUlyuOOFBc0ILhWy9pz7sjPbu2tXbjcp7dW0OqZZ/c8DZGqvh/ClCee3dojw7M3JuONZ5coz277PB1ASiNjYL0hbp0VYs8uVeuClNHnnCoL6esZJFA35FCqutaQQpz41K8ICTj62pLn17XeQ3qArLZMluUVm6Y0WQidf/aiygF8VlCF8tY4IWZDXv5JYfLkfUOQgmdnbA4JsOFSBv6W+S6BzO+kEoEapirEotZGFsFyOeFk11Jy5KvvPlPGQtAPoHO4n/Bf9bxddx4TKzSOtGx4yHNMYzvJkB56N0AnLGOUZBIGfFNbH+u9vLiQx6lnVm2Wkff3baluerCs9WuKGv2UntdaxPjfqkc3fEJ+Ch0tr9WCfyqj0ZAMWo7kEzlFyxXxylRNSYMaXZD2j8vLH8X7B0ujgzTqrXO1+3XlNDGa8sRip4Cyzk4NaPcf7iHdnEvTJcOIsUw5Oei2j3vwzzomKIpXPn9K6r/Ie8xpNPTj0CCGWsvsz3ZF6opL97jJfozyRnUfL+NNlO+/FjtC3q3Xyx8I495WxEUtjaapvYQ0yAWkMOdjp03Ak9uR80Hw1pWQQsHc+HQ+z8q61TPMyTLO0MyxMXDemBdhVl0JFLqt0GWtM7wPfIvl9XvavyPU5CDdbKeAlfglOuAUNoiPjXlP+6O1U1i0XNTOfI/bmoCRBIoYJcWKE2/G/vn2G4rbx3447ubQ9zaHYCFj7+uwcK9oX9VrzL6QlcMlCsWCL2YvZxePydAHqMXyuj8wmPEkgQiD5EzoQWJIgKpwWoAJq1fjhNQne1ihnfD11+J6uD5OsppcH7/RBdqbg+kbz5sSTTjgQc9Db+8N8ORDohDnpxs4HO7Q00dXdp0Mf23JiUm3CezQGbyTjd+IGYqjXQ/whfaiXVTxRTj1Ai/baM+zJigNKkYssowafhK7nRzO5YfVGhK46y/9qtYS4/BBOgo+QArhw0Giw3kJYwco0eat9K0UIqf8/gUg1jPu sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - + +Create a testset with given name, save the testset to Postgres. +Args: +name (str): name of the test set. +testset (Dict[str, str]): test set data. -Create Testset +Returns: +str: The id of the test set created. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-trace.api.mdx b/docs/docs/reference/api/create-trace.api.mdx deleted file mode 100644 index 9e7b4525ae..0000000000 --- a/docs/docs/reference/api/create-trace.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: create-trace -title: "Create Trace" -description: "Create Trace" -sidebar_label: "Create Trace" -hide_title: true -hide_table_of_contents: true -api: eJztXG1z2jgQ/iuMPl1nTEjSvLR8Opq4Ey4tMED64RiGEbYAFVv2yXJSjvF/v1nJNrIhvDXtpR31Q17ErlbafXZXftR4iQSeRqg+QH2OHcqmaGihICQcCxqwpovqyOEECzISHDsEWYiTf2ISiQ+Bu0D1JXICJggT8CMOQ486UrH2NQoYjEXOjPgYfgo5TCsoieR4iJn8AbNFe4LqgyWigvjRuqQy746wKIqLRUhQHUWCw6otNAm4DzLIxYJUBfUJSqxcjMWeh5KhhQQVHgzcqGkrDYESC8Wh+yOMPKhpUyMu8cgPMHKrpk2NZO4aL0bU3dNOHFN3L2d9WFSaru6vF7WSeSu3kjnsRa1k7sqtSGCnBsrTZkqQHCSVB+juEO+FmKXSIeaEiR3r37bejpygsFYlus0dhMU+JDVlj4HKSGQhzFggsl9iNmfBE0PD0ib7MNP6erJ9728aT6EsWMiZYQoGnwI+n3jBE7gJR3P4FgQeKPhj4rpK+Z+Y8AWykOf5oBr4oUfSBTszLGT54ZjNN28A3L5j/XPKdiApW3+v02iN7put29FDq9exb5ofm/YtsrTxZqtvd1uNT4XBnt39YncLQzefmnarXxjqdNu3DzdluXar9/DZ7upbaveJB9u6h3U/vy2G/a1h2QYwCdYWllUGRQJzMZI15ztqFGWCTAnfbhYsVfpKExHm/hSrNnNzm5HAIo5GTuDuCelev9F/6I1u2rc2gMKWMdXG2velAbvbba+HU5q9AaubA6qW5ZMowtPjoypnqXxOZ0kshIXgdBwLUuq72HUp5Bj2OoXGu4fVjR73x8WRcRB4BDM5tNkWcih3Yg/zPz7GnvdXFLBqk4WxeANFQk0SjL8SR8g50nPCHkqYc7zY6qWiqqywa/ae022s/JlAXZoQTphT9t0zp5pHwiOqjkjHRPdLqg5w8eLp0SAB3cRCL9ddVZsyUPtxUFtTLFaXboZDzcLuxXVX6E0s5FE23w/Gh52FDj1pGRj9VBjBkx3lxIVWlwVWC1qpjX2ibH4Qxj5JVCUWmuFotmeZNIXpl0aUjpc7HM0OwsudggkcDr85JBRr7dIE7big2bk7wbePhIn9kjF7yHiudGfPEHAujwT2wxc5zOsPqPnEJpX/z+YggaDHudQabMDUQbluKxTuMpz3ohULUzL90cMCThwHWe9JMjI7oOyJp5185m4gfvcUK9BkPMEbtAlS2qclrwwPwkjuKEPKGlLWkLKGlDWkrCFlDSlrSNlXeYo1pKzhPl4H92FIWQMjQ8qawvQqEGVI2dcYNEPKGlT8rqRsSshuPbAY5tMwn4b5NMynYT4N82mYT8N8mqOiYT4NwfD6oWaYTwMjw3yawvQrIMown68xaIb5NKj4zZnPl6Aed9QzKdXnhBzm5r76H6+7Zk9fDtBVf/uPkiTRPSF4TORAFAYsUvg+Pz2Hby6JHE7Taol6seOQKJrEXqWbCkte5ahXCDhBrJRK6aLxhFICiLsJjj2B6qfmNHlcwWjH4oiKsaZ1QMlQur/ggXJHJkmpHPyJzKSL8w258gV71JWZULE5D/jxieISgaknz6+bge4FTuHTQ6A2LLtIc0jG9SYW8qPptsTQeKGM0n1OVDqjonjVHUGGfSnTqZxOWeTuVd59fhu3yn3bAnvX73fWJlSxLQZV3VxU+um7VHwiZgG8YyUMIpgvxGKG6qgWcvJIyVNNqLJbU3+XUIM+QzhwNTI4MfdQHc2ECKN6reZ4QeyeSJobn2BawyGV8IyIE3MqFlKl0Wnek8UdwS7hqD4Y6gI9gI8CRFEsjwUO6T0B16ijF2rEYhZw+m9G4lPY4kxpwd4BmN3V62LsbxgIdO3Gb1B8vQs0jYvq6XX1/H3/7LJ+eVY/f3dyen32NypeiW2T02+1tsmVLqbQ2wl+dzm5uqheXp9dVy8ur86r47cTp3ruvL96O7m6whN8hdZumvZVK10d7au26imrPMi70mpIu9TR8kW7mylevGg3J/m1iHYb8exVg0bta8vRGPpt/l4x6tukChz4RoK7TEevVlJoqCUKdKBRnNraJVe5+v2Q0BStQR6lB4vBclOINkVyfYqMihgsv3Mt+iOq9lQ1yJ6a9LKaPx1tC0zZhGx82V9LQa5TNglkqch6sSxElUaniSzN96cnZyenqFwWC8LQ5bAjVo946ceQfYWKl9c6eWsnWxwSBPt/rj6AlUFt9THT5itV4cJa8mInyDdRCz24LUxSy8u0QA9QWqDTwGohjpCFoM3MoKDXB2i5HOOIPHAvSWBYXSjWB0MLPWJO8Rh8NYAeOstq8hLNyUIeXmWzr8pOB+JerGpwqfFDU1YaDQeCvlV2qPWcTrsHCTVOX+Tlq5zjGHYFX+sIwavAQFs2BTm2RB5m01ilnpoT/v0Hj5fYXA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Create Trace - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/create-workflow-revision.api.mdx b/docs/docs/reference/api/create-workflow-revision.api.mdx index 9a50d1d154..9dad3b974b 100644 --- a/docs/docs/reference/api/create-workflow-revision.api.mdx +++ b/docs/docs/reference/api/create-workflow-revision.api.mdx @@ -5,67 +5,3436 @@ description: "Create Workflow Revision" sidebar_label: "Create Workflow Revision" hide_title: true hide_table_of_contents: true -api: eJztWutP20gQ/1ei+XQnOYTy6p0/HQUquD5AQHsfoght7HWy7drr7gOai/y/n2Z37dgxSZMQJHQtHyDYM7/xvGfHmYImIwVhH/4R8mvCxYOCQQAip5JoJrKLGEKIJCWa3j14ijtJ75liIoMAJP1mqNJvRDyBcAqRyDTNNH4kec5ZZEF6X5TI8JqKxjQl+CmXKEIzqvC/NvJiknsiGcn0HYutlGxymUDYn4Ke5BRCUFqybAQBJEKmREMIxrAYiqCiyAznUAwC0ExzvFBq3vnsoDsXSA/bF9TErzR6Bk2cBCI1S0i0TRWOPaSXkHAbPXXsptuYuouM0iJ99AGGQnBKsqUSL1TnxCEUAcLRe8IN0UI+BfGsAnGgY5OS7CmA5xagKIKSSAy/0EhD2zdvrcnacEUAKdWk+RAkjhlmEOFXDbMucmUNlmWajqhsSkqHzSt17R6XBRGTkeFE/vbWcP63Eln3IsuN/h3mVUUMpmm6GhORkkyWWrXJCi3TLuP9gJZEjlZ4viSLfhTvmdI/sukiHee517PQrYtCyEhKV9S//QTIWwQQUxVJlmtfuDeBOq1BFAEobkabQt0g7yqZeO2bzYltb4+yYHtjksbYINtN6pHK28S8dt0RCsSeYWlpqL2gcpEpF397u7v4p2FKuDFRRJVKDO9ce2IINm2ykTCOaS6cZ0qcWAr0Z0IM1xDu1ttUvTcvKve/uvRL7NLE6PGCfrkJuEPDvMe0WQ0VSbua2XqxpArYPMRGqBQZbVyXPnj2XwPKzzmgXBq9wYTS4lpjRHG8//MZZZlZVxhSNrHRy55S3Lk4viN6q1XQzQ5x59gay+Txcwj55GC9kJhy+gxCTh2sF1KaazjZYqsrjfVm4ptdaa+tSimtVUkpDbZVKaW5Kin3VLYnrtXD9bNn38pAHcD2FPU2JPPdpNmat6e9kWxTlE+SOQS+OQJHhDElMZVrV/rnMsnLC4glo8k1TaikWdSoNuWDDtbqKOfeDWgCe1Ba1SMvqCe/yEFnDR/ceMPjREnynGWrDkDzJl5n2ioFWcdjE984+h13EUBOJEmp3iCrf/JYWcx8NTMpOorKexbRVayLO5W1YtBDF3afkrCRcS88nkPWSUPAOqupU2LPCK2j2BoQT2Sv9k6FXWId7O2111SfCWexVa5zJqWQm++oYqoJs53Wh+Q8ARdR4+46KVVrFC6KZ1q/FxEpp/pUjdq15tHlgiNZTGqN0bnFuz9aLqJeTrSnayykSvM66y5W49SZb5l/z29vr1qAzrdNp7rBulMtq65nL/1SqscCXwzmQiF2TvQYQujluCKkD71yZ6Z65c5Q9cBls62V/ambp2Csda7CXi/iwsQ7ZEQzTXYI65Gc2QRSNDKS6YllOb66eEcnrn9D2B/UCWxHcRHSJKucQ3L2jqKt3FHSb7HYv87tATDU2c1o1n4Yqdezl5tn30mac7rwZeWji0/YT8gfh8nRQffw9avX3YPDo73ucD+JunvRn0f7ydERScgRNHeYq/I09pKrMjVWjasyVSu02qrMVcDmsqu65ndVfsvtd0azRUd1nJ8lTDPyqstuRq1SGifOLBHWqeUu0oZM5/jqAmqnJdjdebWz28JtEGOBIpEtUGVE2NsQzMVmFZUQAE1tdQJNSfrX7AY+GaaCX9F5vCUJNLeK8CGq6XfdyzlhWe3E4XKrDz63ap5XtoT4/IIAsGSMMSHDPkynQ6LoJ8mLAi9/M1RiEg18rA3ReP1BdSqx+fWVTlyvwsLdtVULyblx6TNXxLHAOo7jKKK5Xko7qNWMq8ubWwhg6L8xkIoYeSRB1fB3CIDfP9BWq3Dqrk2Bk2xk7E4YHCb+/AfPFTi4 +api: eJztWd9v2zYQ/leMe9oAOXac2F31NKdp0azrGiRpBswwDFqibDaUqJJUUs/Q/z4cSf204zqpC+wheUgk6u6748cj9Z2yBk0WCvwJ/C3kXcTFg4KpByKlkmgmkosQfAgkJZrOHpzFTNJ7pphIwANJv2ZU6TMRrsBfm1smaQi+lhn1IBCJponGRyRNOQsMaO+LEgmOqWBJY4JXqcSQmlFlYVyAjSck00shzVWy+hSBP1mDXqUUfFBasmQBHkRCxkSDD1nGQsi90iLJOId86oFmmuPA2KLlHoRE0z1R0bSrWUx3Qp8jYO5BTJUii53Yu2A+Ovfcg4TEz4b5i5h0IaQqkCzVjtvnQJ3XIHLP1UY4I/qg9L2xsJ2xxiBZGv6MIJ8trAsSUk5/QpBzC+uCFHTNVzMWHqqMC7LOVp2LsM7XQaMUbJVRCsIOGqWgq4xyT6X6gXK9de65B4pni+fCXKNv7sHhJmpnF3Fz/G6BFPMvNNBQORQH9DvjsgltDhtNQqJJE5CEIcPtSvhl8yz9Pg8s0XRBZTNaPG+OzIXglCRmaHssCJgMMk7kL+8yzv9QIuleJGmmf8XpNaaLGEzTeD8nIiVZ7WS56YqMb8Z7/Ox1bNr3A3naMp1bzy2rRKRmEQn0AXfN2EG6PVNE2C/jwnl7tvdEMpIcMtlbi1jsb3v3NHIdxLaMN5Z40/uqkBfbjCsJM6l0yPRxkCurgCDPEU1SlYpE2Q026PfxT+OlC9dZEFCloox3rpwxPFsoBSKzTq39Wns3GAuTWaWp9ie6omovpuvk2dx2Muemb6k7HQw22bolnIWGi85bKYV8PlUh1YRxvHLnS9uAi6Dx9CnH4zRvnUnVrP8UNkEjBtWitljl1tki9qzJ46aGjM4NPv3eOuC8bGhn19iKBb2W3cencW7p27W93t/cXG4A2rVtLqrVK52iHjpXVT8RU70U2HOkQiF2SvQSfOilWL70oTcnivaKRkT1iqJWPfBAUYliwSxZJjn4sNQ6VX6vF3CRhUdkQRNNjgjrkZRBO6mxedp5g6bmuFI0yCTTK4M3vrz4QFfvKQmpBH8yrRtcY8XZGmqalctHUvaBIptWw7u+g/1rC8MDhgksrRfShbV8VXVWb7+ROOW03RkVvRCcROS3YTQ67Q5fHb/qng5Hg+78JAq6g+D16CQajUhERlD0ODDoD4bd/rB7PLw5PvH7x/7w9Kh/+vofqDUrVcG5jMv7JmnlcL0N2BWhruR32dXF+C67lp7el4qWQN6bwabi3detlLAVX1aLVvdPgSs1I1OzIFNaxEW7zdSM3hOeEY11UY4ts5gk9r4pEmvCBjcPC6gdDEQSsUVmPwHgUFu17JtqXYi8VNKPV9IhyqZVAi2Jt3dNV7LtZWH/Hwt7kPPgZZu/VEN5NBjtxpJIGC1TtItWKJ2R4I4mYeP11j86Puo/pqycQ2d8eeFUfLNirBly3dBupWoDD2hsJDxoSuLfqweYJepFM48Sb4fKbH0GdSpN02+6l3LCjFY3WaydAJ2AE6DgAUpQ8KAUoVD1VniN8nqJ4tWfwHqNxp8lz3Mc/ppRiXJy6o7POfI5wd5hWQjLNdzRlWnbTJPTNQofzXlmhWSr4cFmxHqMg4CmeqfttKavLz9d3+Bk3If7WIToIwnOEH/7APhvAG1mhcITx9bASbLIrES0mPjzH6ul3uU= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Create Workflow Revision - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + + revision + object + + required + + +
    + +
    + + author + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-workflow-variant.api.mdx b/docs/docs/reference/api/create-workflow-variant.api.mdx index 9f87384c7b..eab2a6a319 100644 --- a/docs/docs/reference/api/create-workflow-variant.api.mdx +++ b/docs/docs/reference/api/create-workflow-variant.api.mdx @@ -5,67 +5,1660 @@ description: "Create Workflow Variant" sidebar_label: "Create Workflow Variant" hide_title: true hide_table_of_contents: true -api: eJztWG1v20YM/isGP22AHKd566ZPc5MU8douQZJmHwwjOEuUfe1Jp95LUs/Qfx94J8mW3+o4KdANzQfHPpEPjw95JHVTMGykIezD31J9ToR81DAIQOaomOEy68UQQqSQGbx/LCXuH5jiLDMQgMIvFrV5I+MJhFOIZGYwM/SV5bngkcPofNIyozUdjTFl9C1XZMFw1PRrCXi9BI8deDa5TCDsT8FMcoQQtFE8G0EAiVQpMxCCtTyGIqglMisEFIMADDeCFip/Wz2SA6YMT1hkXtBCt4QsLSTCMT2P3XSS6/vIaiPTlRsYSimQZRst9nTr1CMUAcHhAxOWGameg3heg3jQsU1Z9hzACwdQFEElJIefMKJ0WozNW0fZMlwRQIqGNTfB4phTujFx1aB1XSjnYHlmcISqaSkdNlfmvVttCyKuIiuY+uWtFeJPLbN2L8ut+RUWXSUMbjDdTokpxSYbWW2qwhK1m3Q/EJOksZSePxKjf8n3XJtvcbrOx0XtpzF067MQMpbilv4v74B0iwBi1JHiObm6K9TZHEQRgBZ2tCvUDelucxLvfGU+dZ1gpQa1Aq4wpl6yVNBX1N0G4rXvI1AQ8gzJKItuQecy0z75Dvb36V+DR7ixUYRaJ1a0rkthCHZtR5G0Xmkhl2c+nDoJCmbCrDAQ7hfByi62rtT/7Gc/+9l/sp9dWrNDQ1vSekJH87r/85a2idYtetouHP3YTc2/csT3zGxZvWJmsG242896K77bxK2uI8vm8fcw8tHDlkZiFPgdjJx52NJIRddw8oL1viLrzaSs+BVfL2qlYqu2UhH2olYqumorz5+aAni57dGetp/CVnWQ7bXrAalw09bRwcHyPHXHBI/dtNQ6V0qq3YepGA3jwo0Dvj0sCggZNZ4+pRIPioWOMnP6vfQbpDilejQ3ztXhmXULrdkIZ+Vzvagjo3VLT781A5Nf3nQpNxfuGb2e3fVunHn6NoX34vb2agnQx7YZVH+eW/WgeFdf46RoxpJuenKp6XfOzBhC6OQKHzg+dqpxVXfK2VZ3IACN6gGVdrGySkAIY2NyHXY6kZA23mMjzAzbY7zDcu7SXWNkFTcTp9K96r3DyQWyGBWE/cG8wA1lk8+PplgdGpbzd0hM+f4FXWvGUvF/fNAD4OTx2GsRFZSn17PbqvOvLM0Frrt9aszncJiw346Tk6P28etXr9tHxycH7eFhErUPot9PDpOTE5awE1gYubdVqqfouWmZXnsW5916rRxXy1ejcmyczTp1R58lbzML6mVfAevjRfUsS6SjuBr4XQBb3aseBECh9gj7e6/29pdwG8JULFjkqKzi4x5DsJApdY5AAJi6SgEGWfrH7AHtjPKynNJLvPXJvDCMlPli8Kvp5IJxVxHcJqZlnvehzHOYvcRp8rjMdQiADu+YzkbYh+l0yDR+VKIoaPmLRUUJPSgVhkRdnyrTuErtKXzGiXttdCW07eoHiQvrU3mhnFKp8xrdKMLcbJQdzB3fq8ubWwhgWF7HpjImHcXIM/oMAehul7Rdzrm1KQiWjSxVwBA8Jv39C+Qhkw8= +api: eJztWG1v2zYQ/ivGfdoAOXacOO30aU7TolnXNUjSDJhhGLR0stlSosqXpJ6h/z4cKcmSHXtOkH4Zlg+ORN7rw+NzZ6/AsLmGcAx/SvU1EfJBwyQAmaNihsvsMoYQIoXM4PShlJjeM8VZZiAAhd8sanMu4yWEK/fKFcYQGmUxgEhmBjNDWyzPBY+czd4XLTNa09ECU0ZPuSKPhqOmt8r+1kbGUnTGsuWnBMLxCswyRwhBG8WzORRBvZJZIaCYBGC4EbTwB+kWAcSoI8VzCuS5pi4aJoqghCeeMrPPYACJVCnJQMwMdg138ez28sab7YwMObF5/COcfPZmSycxCvwBTi682dJJBddsOeXxgX6s5fFBYJ0vO5dxE68X9VKhVXupAHtRLxVctRct7Py5tXpDukUALxeejykRjjceMSlnXzAicqgUKmZ551S2TRcBpGhYzAxrG2RxzOmSMXHVooEDcOCZwTmqtrd01l6ZSSmQZW7pcV8QcRVZwdRP76wQv2mZdS+z3JqfKb1WumSDG0wPU2JKseVelNuqhPi2v126Hys0iwCYMjxhkXnB+hyVJsvqrDw8rRgqI4/Vw1ay2+p3ZYt4THbdhcZ1K5nsNHHtWxgUBdlSqHOZaV9ng36f/rU6BtzYKEKtEys616UwPLvTRdJ6pY2ybRCbkyiCZlM8HOUapoNAbgLnI9sHW5m7x+10MNiG6o4JHjsgOm+Vkur5OMVoGBf0VN6xTQEho9buUyhiUmzcy3XSv0sfIB1AqueNk6rvzfrSac3muL6pu0UdGJ1b2v23Y6C8vOtSrnEia3g9urvTuPDw7btY729vr7YM+rNtH6rvtJ2qHDp39TCYollImhdzqek9Z2YBIfRyhfccH3ozprFXDZG6Vxa07kEAGtU9Ku0OzCoBISyMyXXY60VC2viIzTEz7IjxHss5bIY0crudNyTqmEpjZBU3S2dvdHX5AZfvkcWoIBxPmgI3VG++gtpi9eGxnH9AwtLPnjCyZiEV/9uXRQCcAlh4LQKLKvl6PRW//c7SXODGVFvaqgujnU693BwsYdAfDLv9Yfd4eHt8EvaPw+HpUf/09V/Qng33yTXHu31yGxManCTs9TA5O+0OXx2/6p4Ozwbd2UkSdQfRL2cnydkZS9gZbI1ch6ptzFCHqvmhaA3WU3Tr4YXraWS1kWn1jYXrKd4zYZmRqrG2sCnL/Ht7WtnssIdG0Gya/1fDf6YaHF/yLJGOQap5ydPTOYu+YhZDAER1/nD7R8dH/V18Vip0RleXZedsF4wXI6hbjFlzJQSAqWubYJClv643KEoiaZdGbW83s298Zy6p0eB308sF4649uiBWJemPoSR9CIBoHwKoiR/qWYYeqaEtqF+EY1itSPazEkVBy98sKqLwSakwIzTH1K0XFZmv4Csu3ZTkxoqu66kkLqwn740Rg9q/1xhFEeZmr+yk0dKuPt3cUi7lDx2pjElHMUqQPkMA+tWEtF0pubUVCJbNLU0FIXib9PcPcS3I6A== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Create Workflow Variant - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + + variant + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-workflow.api.mdx b/docs/docs/reference/api/create-workflow.api.mdx index 63c8b5e2b2..c9cc6b8823 100644 --- a/docs/docs/reference/api/create-workflow.api.mdx +++ b/docs/docs/reference/api/create-workflow.api.mdx @@ -5,67 +5,877 @@ description: "Create Workflow" sidebar_label: "Create Workflow" hide_title: true hide_table_of_contents: true -api: eJztWN9v2zYQ/leMe9oAJvaCPelpbpIiXrslSNz1wTACWjrbbClR5Y+knqH/fThSliwpdh0nBYpteYlN3n1Hfnf8eOYaLF8YiCbwUenPc6keDUwZqBw1t0JlowQiiDVyi/ePpQUw0PjFobFvVLKCaA2xyixmlj7yPJci9r79T0ZlNGbiJaacPuWakK1AQ98qwM7MXPpVrYFnq+s5RJO2gTD3sTNWpU0ju8oRIpgpJZFnULBqKHNSQjFlYIWVNDAyvfOAUDCCwwcuHbdKvwTxsgIJoEuX8uwlgFceoCjYxkjNPmFsoTba5O2tp6wLVzBI0fLmIniSCEoRlzcNWjvLNFaLbLENKzKLC9TNSOmsObK9u6djQSx07CTXP711Uv5uVHYyynJnf4b2VglDWEwPc+Ja89VeVpuu0KF2n+8fxCR5dMrzR2L0T/VeGPstTnftse39PIbGoQoh4ykeuP/uCsi3YJCgibXIaavHQl1sQRQMjHSLY6HuyPeQk3ju5fJJU9JNoTEhwa3Ub7oL4jaoLBQEVbta7dAPmFxlJpTZ2WBA/xqMwZ2LYzRm7mTvtjQGdqxYx8oFp1bV1os/9xaUtjl30kI0KFhD43eJ+f9q/x9U+2tnj5D7jtcz9D74/ssFfx+tByj+MRz92JIfmtfkntt9gAzmSqdkAwm3eGKFX8/uKEGhk97Qk+Xy5HsE+RBgyyAJSvwOQS4CbBlkQ9dsdS+SA+M4J5KDyHqz6o2Sbb5eNcqGrSrKhrBXjbKhq4ry8p6Cwestj9Z0wP3x1NVxgFvVRhS+J/n17KzbdfzFpUh8T9G71Frp41uOBC0X0jcA4UJoG0gVN2afo73TonWH1Lt9r8ICKTOpWWw1PVVC6vvBGL7AWjB3m3oyemOa/VZrSPsKoUu7rQTX9AZ2d2/jItC3L69X4/FNBzDktpnUcIJ7H+sngBTtUtHrQK4MQebcLiGCfq7xQeBjf9P4mT4wMKgfUBufGqclRLC0NjdRvx9L5ZJTvsDM8lMu+jwXvp4Nxk4Lu/Iuw5vRO1xdIU9QQzSZbhvcUfGEcmiaVZnguXiHREy4oGDo7FJp8XfIMQNBG1wGL9o5leVt/cBx+ZWnucT2g0XVtG41p9SZt9vLaqzsDsvuvezS6taiukDrymmmoBoOglPVNslHNld+w2Vah57O3vBmBAyI+IAwOP3ldNDBbRjTSeWxP6kbtvw0sFbeqowBA0z9MQWLPP2tnqCVUXGUTXGJ162k1p1fZs3iV9vPJRf+GPrg67LIJlAWGdS/LwwwoGOypGqMJrBez7jBD1oWBQ1/caiplqYMHrgWfEY8TUgDlpuqWsNnXPmfMV6sTvxJJXPpQhW1hItEJXgM4xhzu9d2unVgbq7vxsBgVj6epSohH839wxp/hAiAXuDI2xeYH1uD5NnCkdZEEDDp7x8ptcdc +api: eJy1V21v2kgQ/itoPl0lEwgJ5OpPR5pWzfV6jZL0Kh1CaLHHsM3a6+5LUg75v59m19gYJ5RGKV+wd2ee2X3m1WswbKEhnMAXqe4SIR80TAOQOSpmuMwuYwghUsgMzh5KCQhA4TeL2pzLeAXh2r1yhTGERlkMIJKZwczQFstzwSOH1fuqZUZrOlpiyugpV2TJcNT0Vhlo7WQsRYeWrT4lEE7WYFY5QgjaKJ4toAiqlcwKAcU0AMONoIW/SbcIIEYdKZ7TSZ4LdbEFUQQlL/GMmX2AASRSpSQDMTPYNdyd52krbzxsZ2zIiM3jX2Hks4ctjcQo8BcYufCwpZENXfPVjMcH2rGWxweRdb7qXMbbfL2olQ1blZUNYS9qZUNXZUULu3hurN6QbhHAyx3PnykRrmA8AinnXzEyUCtsSso7p9KGLgJI0bCYGdYEZHHMKcmYuGqUgQN44JnBBaqmtXTeXJlLKZBlbulxWxBxFVnB1G/vrBB/apl1L7Pcmld0vcZ1CYMbTA9TYkqx1V6Wm6rEeNveU7ofN2wWLbW2V8bK8IQR4iPCdUWf1GV52ga59o0AioJQFOpcZto7a9Dv01+j7MKNjSLUOrGic10Kw7P7RSStV9rx/VZ1cBJF0GgthwduTVE7dn9Amj/bo4yV1/aUnQ4GbZb+YYLHjoPOW6Wkej5FMRrGBT2VMborIGTU2P2ZFJsWO3Fd3/Yv6Q9I3Kd6seWkqvDUQas1W2Ad6U+LOjI6t7T7I/7pXt50Kbflippez+7T17jw9O1Lp/e3t1ctQO/bplN9p+p8qaeoFM1S0oCVS02QOTNLCKGXK7zn+NCbM429TeTqHgSgUd2j0s4/VgkIYWlMrsNeLxLSxkdsgZlhR4z3WM5h9wRjt9t5Q6KubmiMrOJm5fDGV5cfcPUeWYwKwsl0W+CGwssHTFOs8hXL+Qck6vyoBmNrllLx/3wUBMDpAEuvRdxQ4F7XU+Tb7yzNBe5OgSVYFQjN+1TL24MYDPqDYbc/7B4Pb49Pwv5xODw96p+e/QvNWWqf3PY4tE9uZ6KBk4T9PkxGp93h2fFZ93Q4GnTnJ0nUHUSvRyfJaMQSNoLWiHKo2s7McaiaHyJqsn5Gt2r2XM8iq41MNyM+1zO8Z8IyI9XW2tKmLPPvze7uEoJniXQxU+ZOGZDnLLrDLIYAKLi9b/tHx0f9pyK4VOiMry7L0khFuo4XL0ZMN3Kkyg4IAFNXF8EgS/+oN+iUlI3uFhVeO3V3PibKJDD43fRywbire874uszqCZRZDQFQXkPdkzQEQOVpSVUgnMB6TQKflSgKWv5mUVGGTgO4Z4qzOVE3odq73OTqGu5w5dqdaxJdVyFJXFifmzsNg4q51xhHEeZmr+x0q1Bdfbq5pQuU332pjElHMfdNyB4gBKCPR9J2YePW1iBYtrBU40PwmPT7H+ae3Zg= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Create Workflow - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + + workflow + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + workflow + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/create-workspace.api.mdx b/docs/docs/reference/api/create-workspace.api.mdx index cea856d870..84899cd3d3 100644 --- a/docs/docs/reference/api/create-workspace.api.mdx +++ b/docs/docs/reference/api/create-workspace.api.mdx @@ -5,36 +5,36 @@ description: "Create Workspace" sidebar_label: "Create Workspace" hide_title: true hide_table_of_contents: true -api: eJzVGNtu2zb0V4zztGFqfGnXbXpa1hZo0LUx0nR9CAKBkY5tthSpkFRcz/C/D4ekJEq+NAv2srxEPDz3O70FVaFmlit5UUAKuUZmMVsr/dVULEdIoGKalWhRG0hvtiBZiZCC0ksm+d+OMuMFJMAlpFAxu4IENN7XXGMBqdU1JmDyFZYM0i3YTUXkxmoul5CA5VYQ4DLiN7ooYLe79WzQ2D9UsSHaIddcSYvS0hWrKsFzRz3+YpQkWCe00mSl5Wjo5C04rsoHut8lUKDJNa+IpxMhN5cL54I+4S5pIbIWAkjxhtXriMUuCWhPY3VN8F3LBNTdF8xtz9c33rSI6JUL5+c2mrsdcdBoKiWN98ZsMqF/PWPhY53naMyiFqOrgAxP9rfPqSJj9pTXvarF6JxsKnDBamEhhdlk9vOz6fTZZDaaztLZy/TFy7Pn01+nv/3y02SSTibk1roqHiHgk8d6pIDZ82kngBenGFO2Jv/rrEp65fzYMiW6Ess71xli8dxiafbzoDaoHWJRcKJnYh7d+5IeJncbPKKl1FXCMzsig+6zY6FAWZdUJWotUUMCDxzX7gMLbpX7eGCiZv677YEZK0ouXdJUQm1KlDYrmWRL1HGttVV2pQQ2umb/QbiJ32gQ8wp1yY3hSh7z/THjNbIiMxtjsQwuyKJiNsEbMYwq348FVlXZA9OcSV9DAveApSr4YtMAslzJBV/WumXeETXsI2Jdy8ygfuBu8AShBnONttG1Pfmi786BcR+bdEP5wLWSLmxdBCM7j2NEZh/FcXIsGmuwZdodA4cOENTsAI4+5J13NnmhA7QR6eEEvj1YYD2AkaqDaDqR8Yh3/GPAgTUgcI9BIdZU15kvzISKO5O49kCr9sX0Ok3LdgAdchlcazRos4oZs1a6aCy640KEXCdB3bG1dyHU2sT2NgByeXyOg6L0MAQe4nDua9QcW4TuGKeFGeRFe8+kVHZQdz2Qw+LyQQ2qsw8apFCm60NZ04CH2CZHyTRXh0jiuz0paGphDwpqb4Y0JVrN80M03c2Q5r7GGg+RhIuoU87brtjNRWBas83JBjuPmun3NqxuwBxq/ScU6Pfz7wty07IZeIdkvXejt13P/o3B78PU/p4Obq93xga8waJwcPq1Crld88Vstr9e/sUEL/yq/0ZrN22fuFsWaBkXJxYCofLe7SMGMJcWabbvbo/H8M9Qfm4HMstTK9N7NIYtMd7UjqE6Z4wetemTXV50wIti0bnXe/e4Ga+9+w4Ja1DeXl/P9xj62PaD6hf40ed4QKBdKXpWVspY95S0K0hhHCeRGW8Hb8nduB0aVPa0EDSPz1oLSGFlbWXS8TgXqi7O2BKlZWeMj1nFXZobzGvN7caRnM8v3uHmLbKCts+b2xjhI2WVz5M+WhsiVvF3uGmqIIXz2q6U7iaRe/SuPBW5hPL1qnu1vvnGykpg9+rsYt53XpcKg6wELhfKKRTice7MHZ3PL6hXojaeweRsejbZY9tDphJjuY2U8de0TPX82nqUmm7p6gsssvL37oJspaCWTEb8DqTAYP8N5ln8ZseVYNwVkJO+Ddlx02sxlADp/m8NUYLcJrCi7EpvYLu9YwY/abHbEZiGMeXAbQJuxbwj/91soeCGvgtIF0wY3NOxbUXww1WouB9HXWj6ujd5IilJaDbRCRL4ipsDv5K4lrJqcnEbsF55gc+ufYttuOz1QepRnuI8z7GyJ3Fvo/KbX368hgTuwu8opSqIRrM1NRW29hqryjbPCQfbgmByWVPrSsHzpL9/AHl8Y4c= +api: eJzVVk1v20YQ/SvEnFqUlmjVRtA9RXECxEhTG7aSHATBGJEjcWOSu9ld2lEI/vdiuBRJSbZq+FZdRO7O55s3M6xAaTLopCouExAQG0JHd4/K3FuNMUEIGg3m5MhYEPMKCswJBCizvpMJhCALEKDRpRCCoR+lNJSAcKakEGycUo4gKnAbzVrWGVmsIQQnXcYHV2YdXCZQ1wuvTda9U8mGVfaNxapwVDi+Qq0zGTdRj79bVfBZ70sbzslJsvzm430+gn/4vg4hIRsbqdlm46LYXK2ahHcV67A7KcosAw58a+r9wEQdtmKvMzXj87ozAmr5nWK3A/HcpzZQumiK962rXV2zBUNWq8J6NCZRxH87ycJtGcdk7arMgptWGF6Nt2dQcofuGOo+1CSYck4JrbDMHAiYRJPzk+j85PQ8iN6IP8/FWTSK/jqbRJM/okhEEcNa6uQFDr54qZc6eHPaO5DJMcPM1vB/zaqQmxcL+Qu3YR3pzl6uDiGnfNnMgSfcozG4Oer9c6v9X7RuxkoDcCu3F/DAZMf1jree82eTySHNv2Imk8ZE8MEYZV7P8YQcyoyfpKPcHgpkKt65fUGxZOFoTQbqRQ+Px7RP928V97Ww62Ol+0zW4pqGjHlOtAEjeNHE4by861ZuUIseXo/u82m89/A95Wwr8nE2uz4w6Gu7W1Q/SIJvg4WVk0sVLzOtrGsWmEtBwHhIIjuu/Aarx92usxCCJfOw3XSlyUBA6py2YjyOM1UmI1xT4XCEcoxawn4w0+Y2uGDRhvqW4tJIt2nsTa8vP9HmI2FCBsR8MRS4ZaZ57uyK9f2l5SfabDtDwLR0qTLbnmj3cOq1GCbm8E2/UT/8xFxn1G/Enge7OfT02GMqyGKlmoDaGrXZvsP4ngruWUbOG4lGp6PoOXhahWB6fdm2IMZuEJgXg3CvAB30EALlTf+BI8zf9hecNxc9x2Jg7wmK7I3lNlVHP91YZyibBmu8Vy175jsjiJkiui+gAYEWIaRMOjGHqlqipS8mq2s+/lGSYRosQnhAI3HJEM4rSKTl5wTECjNLB6F1Ewp+u2kb8fegr85uyFuqFMyTB8xKfoMQ7mnTf7I1AybdsrBqLy+8n5OZH7hb5YOpyBPLa0zjmLQ7KrsYNOP11e0MQli2X3e5SljH4COPGHz0gSrt4eXPPz6rIMNiXfIgE+Bt8u9fEaWeaA== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/organizations/{org_id}/workspaces"} +> Create Workspace @@ -43,29 +43,790 @@ Create Workspace as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + type + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + members + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + user + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + + + roles + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + role_description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + permissions + + object + + +
    +
    + + anyOf + + + +
  • +
    + Array [ +
    +
  • +
    + string +
    + **Possible values:** + [`read_system`, + `view_application`, + `edit_application`, + `create_application`, + `delete_application`, + `create_app_variant`, + `delete_app_variant`, + `modify_variant_configurations`, + `delete_application_variant`, + `run_service`, + `create_secret`, + `view_secret`, + `update_secret`, + `delete_secret`, + `view_app_environment_deployment`, + `edit_app_environment_deployment`, + `create_app_environment_deployment`, + `view_testset`, + `edit_testset`, + `create_testset`, + `delete_testset`, + `view_evaluation`, + `run_evaluations`, + `edit_evaluation`, + `create_evaluation`, + `delete_evaluation`, + `deploy_application`, + `view_workspace`, + `edit_workspace`, + `create_workspace`, + `delete_workspace`, + `modify_user_roles`, + `add_new_user_to_workspace`, + `edit_organization`, + `delete_organization`, + `add_new_user_to_organization`, + `reset_password`, + `view_billing`, + `edit_billing`, + `view_workflows`, + `edit_workflows`, + `view_evaluators`, + `edit_evaluators`, + `view_testsets`, + `edit_testsets`, + `view_annotations`, + `edit_annotations`, + `delete_annotations`] +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-annotation-by-trace-id.api.mdx b/docs/docs/reference/api/delete-annotation-by-trace-id.api.mdx deleted file mode 100644 index d7f9700da3..0000000000 --- a/docs/docs/reference/api/delete-annotation-by-trace-id.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-annotation-by-trace-id -title: "Delete Annotation" -description: "Delete Annotation" -sidebar_label: "Delete Annotation" -hide_title: true -hide_table_of_contents: true -api: eJylVU1v2zAM/SsBTxsgNFmxk08L1gAt2mFFm+1SBAFjM7FaWVYluptn+L8Pkr+bthi6UxyJfCTfI6kKGA8OojtYap0zssy1g42A3JAN/y4SiCAhRUxb7G22u3LLFmPaygQEGLSYEZP1UBVozAgiGBlIDREY5BQEWHospKUEIrYFCXBxShlCVAGXxvs5tlIfQABLVv5g7YFmFwnUtejRnUE9An8syJYT9D0qN4FHXX7fhwSngTxoe6ILpaDeDKFvDeom8sZjO5NrR86jnS4W/ichF1tpPCnevIhjcm5fqNlNawwC4lwzaQ45GKNkHDic3zvvU40yNNbzzrKJEOdF49QmJzXTgeyImK/BQkBCeywUQ7SoBYxUUlI/TCufRug4/F9yxKD1O6HGEndG+e6eYh6Ve+XLOUZ5y2Voa+/ca1LX3unz6emxhD9RySR4zFbW5vb9+iXEKJX/kkyZOzZQeTy5/Qfiuh6oN0PRaC2WY5ryJkGvS+YOb03WN3IODwQ92OumgYzZ2t++RPgwd3ehriZ0azcSeqC3Yff1Ms4a+t5S93y9vj4CbLSdinoWFths6AafH3GaD9strDFOIYK5sfQk6dd8mCQ3r7oOr0GAI/vULbvCKoggZTYums9jlRfJCR5IM56gnKORoc8dxYWVXAaX5fXFJZXnhAlZiO42Y4Nb30xNe0zNemXQyEvyRLWLcFlwmlv5p6srrMO08fJMSL3Pg3s3EiG52fL6AgT4MhqKFiefThbwnLiJsZ8DjMMcdLHDNYhnLPT1gwDKwhAAE2ZfhgufmckdZ6hHeC/pNEmoZ4HpN8+NQhnaPISvWgHvoBUQxsvQgfAvTrumNgLS3LE3rqodOvphVV374+Yh8TIl0uFOjZ6SByonD88TqsLnEhR+Qiu9+cuuz4roNwp8uGkH5+MMxMvFdbrrchyzS6cvKayEtGuqqr1exjEZHjkebTCffD8LZ6ur1XoFdf0XlMbCfA== -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Annotation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-annotation.api.mdx b/docs/docs/reference/api/delete-annotation.api.mdx index d200d1dcfa..150231bc3a 100644 --- a/docs/docs/reference/api/delete-annotation.api.mdx +++ b/docs/docs/reference/api/delete-annotation.api.mdx @@ -5,36 +5,36 @@ description: "Delete Annotation" sidebar_label: "Delete Annotation" hide_title: true hide_table_of_contents: true -api: eJy9Vclu2zAQ/RVjTi1AWG7Qk041GgMJkqJB4vZiGMFEGltMKIohR25dQf9ekFodJ0GbAj1p4azvzTxWwLh1EK9grnXByLLQDtYCCkM2fJ2nEENKiphusbcBAQYt5sRkvXsFGnOCGNhiQrcyBQFSQwwGOQMBlh5LaSmFmG1JAlySUY4QV8B74/0cW6m3IIAlK/9j6QNNzlOoa9FHdwb13wRHvf+6CeUdpvEh2z+6VArq9ZD4xqBu8q59aGcK7cj5aCezmX+k5BIrTYAhhpsySci5Takm160xCEgKzaQ51GCMkklALbp33qcaVWisR5plkyEpysapLU5qpi3ZESyfg4WAlDZYKoZ4VgsYeLlVUj8cdn6YoUPwX8ERA9NvDDUmuDMq7u4p4VG7l76d4yivuQyD7J17TuraO308OTmm8DsqmQaPycLawr6dv5QYpfJvkil3xwaqSA5O/wC4bgbq9dA0Wov7MUxFU6DnJXfb1/bqCzmHW4I+2MumAYzJ0p8+B/iwdqvQV5O6tRsRPcDboPtyG6cNfK+xe7ZcXh0FbLg9JPU0SNZkPpasnDgrBj0LIsYZxBAZSztJP6Jhk1xUdRNeR1W7NjUIcGR3neiVVkEMGbNxcRQlqijTKW5JM05RRmhkmHhHSWkl74PL/Or8gvZnhClZiFfrscGNH6tmUA7Neo7QyAvykLWCOC85K6z81XUYZDFrvDwmUm+K4N4tRyhuMr86BwG+jQas2fTDdAZPITww9huBSdiILnc4BvEEhb5/EEB5WAdgwvzTcOArM4XjHPUo3nOMHRTUo8D0kyOjUIaBD+mrlsoVtFTCWBYdCH859FdT3MngWkBWOPZ+VXWHjr5ZVdf+92NJ1jO2FrBDK/HO47eqIJXOv6cQb1A5OiqxVw54d90uyPsJiOdL71jVntIdqtJ/gYAH2o/vUq8G/zFvB05QnKyb1Ko9nScJGR75HQmkH+l+1U4Xl4vlAur6N1du3PI= +api: eJy9VU1v2zAM/SsBTxsg1Fmxk0/L1gAt2mFFm+0SBAVrs7FaW1YlOltm+L8PlD/iNO1WDMNOcSzyiXyPfK6Bce0hXsJ8g7mHlYLSkkPWpTlLIYaUcmK6QWNKDm9BgUWHBTE5SazBYEEQAztM6EanoEAbiMEiZ6DA0WOlHaUQs6tIgU8yKhDiGnhrJc+z02YNClhzLi8WAjQ5S6Fp1IDuLZp/AX5t0bTYK0n3tjSevGQcT6fyk5JPnLah1RiuqyQh7++qfHLVBYOCpDRMhiUcrc11EpiJ7r3k1KMqrBM2Wbc3jEg8OOv7e03pasf1K2nsg8rbe0p4j7jliNoBdrWDmQ1FX2jz8EewUY8vggxMNo3AvT8+PiT+G+Y6DRmTuXOl+3vWU2LUuTxppsIfBuRlsneKZvvlLkz2PrUyjd0bbZjW5KBZ7ehA53A74v+ibAsUvQq//p1Un8l7XBMMYC+HBjImCzn9kxTSV3t1FzcSZEdvy+7LbZy09D13WR9yulhcHgC22u6LehLMZDIbm0lBnJU7pwn2whnEEFlHG03fo91I+ajuR7SJ6m5uG1DgyW16O6pcDjFkzNbHUZTkZZUe4ZoM4xHqCK2Gp2XNwunkk4SC+IKnpHKatwFvdnl2TttTwpQcxMvVOOBaZq6dov2wQUC0+pyEz87HZhVnpdM/+/aDm2VtlhCmzV0Z0vvNaWv7iMkDGdlR6bMte3r07mj6UjNdwmR2edatDiZhdfo6QhioJ3QNRIECKsLeABMWH3YHUqUtPRdoRnjPSbtX2MAI0w+ObI46bEa4vu40X0KnOaiRkXhQ4u/D1yXuDWulICs9S15d36Knry5vGnn9WJET9VYKNug03gqXyxpS7eU5hfgOc08HJQ4WA2+uuk16OwH1fOm9wkbk3WBeyT9Q8EDb8edQbOM/3tuTE6wp66e27k5nSUKWR3kHTirjPezkyfxivphD0/wCkinHgQ== sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Delete Annotation @@ -43,29 +43,316 @@ Delete Annotation as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + annotation + + + object + + + + required + + + +
    + + +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-api-key.api.mdx b/docs/docs/reference/api/delete-api-key.api.mdx index bafd11e1d9..92d621ddfe 100644 --- a/docs/docs/reference/api/delete-api-key.api.mdx +++ b/docs/docs/reference/api/delete-api-key.api.mdx @@ -5,77 +5,322 @@ description: "Delete an API key with the given key prefix for the authenticated sidebar_label: "Delete Api Key" hide_title: true hide_table_of_contents: true -api: eJztVU1v4zYQ/SvEnHYBws4GPelUAzGwQXZRI+v2khgBLY0lbiSSS47SqIL+ezGkZNlxs0BPvfRkeTgfj2/eDHsgVQbIHmDltLjDLsBOQoEh99qRtgYyuMEaCYUyYrW5Fc/YiT81VYIqFKV+QRNNzuNBv4qD9fFAtVShIZ0rwkK0Af3i0TyalS9D9miEEBz0NAZ9COQ/ZmJb4ZTGHmKWqR5ZsUdRRBzFIsV7/NFiIPHhPn2MCbTJbaNNeTy3+++YU6x+j9R6MwEodE6ZWMVfbY3yncitIaUNhysR2jzHEESDIagSReusmYyHtk5wtDUptdIBp8yft9vN+jXHSGAmbs8vo4MwlsTBtqYQ1ovCYrLssbam5Muye+QMJFiHXnGi2wIySBw8KaefnrEDCU551SCh5yb2YFSDkMFMLkjQ3ESnqAIJzIr2WEBGvkUJIa+wUZD1QJ3jyEBemxIkkKaaDXfYiU1KNQw7zhCcNQEDB11fXfHPuV6+zRzdj84ggblFQ+yunKtZGdqa5ffAMf0lkNQ3kKCKQscG1RvPZJDm2gn+BHKqI0atjmKGYRgGCb9cX1+i/EPVuogYxNp76/8NRHcChPOS0jV/acImXDrUNj87Vab77RDbdU76II8WbQhL9DDsBjnZlPeqO+nMF5sAwiChCeXPmvg1aRiOyd53jWSILZ8Oc+1jN2YBPcR7pdKj325OM9Ob2H3/GjeJvn8qNrnwQF0kTL1tkCo7T0acCKogg+UzdmHZz5MwgISA/mUaldbXkEFF5EK2XOa1bYuFKtGQWii9VE4Dyz1g3npNXQxZbW7vsPuMqkAP2cPu1OEbqyP1+9ztSLVy+i7O7Dikq5Yq6/VfqYnjnFYpiq+mzcHG8JGFVQTHewQk8DWSkK8WnxZX8HZpnznHvZZHYU+14zHINywc7w8SsImqBkLV/DofMDJnAzXKnOR7M3dv0PTzaP3/mvynr8koRcJXWrpa6bg8ogb6cXAe+PEIICE7eUR2EiobiE/7fq8C/u7rYWDzjxY9D8dOwovyWu1Zqg89FDrwdwHZQdUBfyKISDmvlI/iPYDTABlW1ouqW/4HkpGeP3ZxXVbTfPajwypn9k5CL7Y7D/Jxk9ysv6y3axiGvwHPjSEW +api: eJztVU1v4zYQ/SvEnHYBwk6DnnSq2xjYIFvUyLq9JEYwlsYSNxKpJUdpVEH/vRhKsuy4WaCnXnqyPJyPN2/mkR0w5gGSB1jVRt1RG2CnIaOQelOzcRYSuKGSmBRatdrcqmdq1Z+GC8UFqdy8kI2m2tPBvKqD8/EAGy7IskmRKVNNIL94tI925fOQPFqllAQ9jUEfAvuPidoWNKVxh5hlqsdO7UllEUe2GOI9fWsosPpwP3yMCYxNXWVsfjx3+6+Ucqx+T9x4OwHITMqJWsVf4yz6VqXOMhor4ahCk6YUgqooBMxJNbWzk/HQlAMc4+yQGk2gKfOn7Xazfk0pEpio2/NmTFDWsTq4xmbKeZU5Gix7Kp3NpVlxj5yBBleTR0l0m0ECAwdPWJunZ2pBQ40eK2LyMsQOLFYECczkggYjQ6yRC9AgrBhPGSTsG9IQ0oIqhKQDbmuJDOyNzUEDGy7FcEet2gyp+n4nGULtbKAgQddXV/Jzvi9fZo7uR2fQINySZXHHui5lM4yzy69BYrpLIMPcQANmmYkDKjdeyGAjtQf4E8ipjhp3dVxm6Pu+1/Dj9fUlyj+wNFnEoNbeO/9vINYnQCQvoynlyzBV4dKhdOnZKdr2t0Mc1znpvT5ajGXKyUO/6/VkQ++xPZnMZzcAhF5DFfLvDfHXYYfhmOx910iG2sppP9c+TmNeoIfY11B69NvNaWZ6B3bfb+NmoO+fik0uIqiLhMNsK+LCzcqIiuACElg+UxuW3ayEHjQE8i+TVBpfQgIFcx2S5TItXZMtMCfLuECzxNrA24twFU/VL+IKooVAaeMNtzHfanN7R+0nwow8JA+7U4cvsjrDMpy7HeeAtbmLgh4VvGq4cN78NUx4FHExREnfxh5cDB8pGrH9jOkz2Qw0SJ8D7KvFD4ur95oZA+R2GhWAaVTAhCO6gX5D15Eo0EBVXH9gwuqn+UBQ1i5whfYk3xuBvkHVzRr8/9n5T5+dcS2ZXnlZl2jiLRN3oBsV9iCvTAANyclrs9NQuMBy2nV7DPS7L/tezN8a8iKUnYYX9Ab3srYPHWQmyHcGyQHLQN9ZiEi53D0f1XsAJzFZ2awXLBv5B1qQnr+K8V4tJq12o8MqFfZOQi+eARH18cq5WX9eb9fQ938DcL4vpQ== sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Delete an API key with the given key prefix for the authenticated user. Args: - key_prefix (str): The prefix of the API key to be deleted. - request (Request): The incoming request object. +key_prefix (str): The prefix of the API key to be deleted. +request (Request): The incoming request object. Returns: - dict: A dictionary containing a success message upon successful deletion. +dict: A dictionary containing a success message upon successful deletion. Raises: - HTTPException: If the API key is not found or does not belong to the user. +HTTPException: If the API key is not found or does not belong to the user. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-evaluation-preview-simple-evaluations-evaluation-id-delete.api.mdx b/docs/docs/reference/api/delete-evaluation-preview-simple-evaluations-evaluation-id-delete.api.mdx deleted file mode 100644 index aa5521f96c..0000000000 --- a/docs/docs/reference/api/delete-evaluation-preview-simple-evaluations-evaluation-id-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-evaluation-preview-simple-evaluations-evaluation-id-delete -title: "Delete Evaluation" -description: "Delete Evaluation" -sidebar_label: "Delete Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJydVctu2zAQ/BVjTy1AWG7Qk041GgMxkqJB4vZiGAYjrS2mlMiQK7euoH8vlnpYip0cerJkzr5mlqMKSO49xGtYHKQuJSlTeNgIMBZdeFumEEOKGgm32GO21uFB4e+tV7nVwxO/HcJUut02wSDASidzJHRcsIJC5ggxjNAgQBUQg5WUgQCHL6VymEJMrkQBPskwlxBXQEfLwZ6cKvYgYGdcLgliKMuQhRRpBpzGmixTqOsNJ/XWFB4957mazfgnRZ84ZRkHMTyWSYLe70o9eWjBICAxBWFBDJfWapWEtNGz55hq0Jt1zB6ppkJiyiaobVkVhHt0gx6/BoSAFHey1ATxrBavaOGaxfH7LhD3/uy16BFFqTXwyG+xITqkeXrGhAY9PQZdT/hl2jNR1xz4+erqnLifUqu0yb9wzrj/Zy1FkkrzkyLM/TlAm2R0+hY9Azo65uvNaXDpnDwO5r4zTYNQC8j9/tKqddBv6L3cI/TJ3oYGMiYrPr1E+mnN12GupnSLG8h3ordh9+0xrhv63lP4ZrW6P0vYaDsW9Trc38lpF7g/pMycnCFcbsoghqg1hqgxhmhgDFE12ukaBHh0h84OSqchhozI+jiKEm3KdCr3WJCcShVJq8Ime0xKp+gYQub3y1s83qBM0UG83gwBj7xYzaqMYb1K0qpbZNJaI5qXlBmn/nYzBiPKmihmRRU7E8JbAuehucn8fgkCeIyGrtn003QGr0kcgflOyCTcia52OAbxioV+fhCAebgQQCjzL6cD7swaT7ksBvkuaTZqqGeB8A9FVksVVj6Ur1ox19CKyUoFOWHoSx4ExGOb2gjIjCcOraon6fGH03XNf7+U6Fi0jYCDdEo+MYXrClLl+TmFeCe1x7Mue/uADw/tLfk4AXG5+07YglXlxvgNBPzC49mHJphA1q1O1WLmSYKWBtFnnsU71m//9eJusVpAXf8DUiCCCw== -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-evaluations-human-evaluations-delete.api.mdx b/docs/docs/reference/api/delete-evaluations-human-evaluations-delete.api.mdx index 5698522406..7c14655059 100644 --- a/docs/docs/reference/api/delete-evaluations-human-evaluations-delete.api.mdx +++ b/docs/docs/reference/api/delete-evaluations-human-evaluations-delete.api.mdx @@ -5,41 +5,38 @@ description: "Delete specific comparison tables based on their unique IDs." sidebar_label: "Delete Evaluations" hide_title: true hide_table_of_contents: true -api: eJzdVU1vGzcQ/SvEXNoAtOQYPe2pai3AQhzUcNRe5EVA7460TLgkTc46UQX992DIVVYr2SlyrS5akm++3rwhd0BqE6FYwU3XKnsxf1amU6SdjVBKqDFWQXteQwHXaJBQRI+VXutKVK71KujorCD1aDCKRxWxFrxuUAfRWf3UoVhcx8mDfbCzsInFgxVCCK+2xqla/HqrI60ihfJNIZYNHkx0jZb0WmOIwq3Z3QvRyIk6pZS83yN1wXKAmTA60sEuQ+pz+19SYiDBeQyp5kUNBWT8RxyY+NgwN6OdDAIJAZ86jPSHq7dQ7NJSB6yhoNChhMpZQkt8pLw3ukr200+RCd1BrBpsFX/5wFmQxsir41C6TluasE0ftPUIBUQK2m5gLw8bKgS1BQmkyfD6qJViUUfYD1D3+Akr6rPP6a7OYpaDq9z4wSHs9+wtYPTOxpzy1eUl/40V86GrKoxx3Rlx34PhJ0g5qewHFPSJHoKIXqrHHCSBj3YyqC/mt6ur8/z/UUbXCS3mIbjwM8mPO1ojKW1GjRwDjKtGp8pu/1pDsTqv9vuOtoQbDLAvX1fBrav6lklo4+acvQH6HmNUGxwk9To0kSGWfPpfsuK6cuged6Srgd7M7utlXGf6Xgp2gNwsl3dnDnNvW6TGDbMNEryiBgqYpsm+OJI+SIgYnjHExH0XDBTQEPlYTKeVcV09URu0pCZKT5XXsC/ZouqCpm0ymd0t3uH2BlWNAYpVeQz4wOrI/R7DBq17/Q65cqtaXs86alzQ/+YmStAsyyZbcWmsu/vhDpp/Va03+OIdsjr0keWi7dqlsD17s1SUmN0tQAKXnwfgcvJ2cgmnD8EIzAOhqjQQh5zTMcgT9r7zBhKwTdMAhKr9fTjgiryL1Cp75O98mE8z2g1j+b99pXqBEH6lqTdKp5FODO96Oa/gXM6lhMZF4sPdjgv/O5j9nrefOgys2FLCswqagyW5yoO8WMyfcQsF/JnJvUgDz3DTZa2e3H98N2WLWVWhpx9iy6O5vJ7fzpdzkPDYv6Otq9kqqC98nagvUEB6qHNR/NDy3g6MspuOL60Cslf+fQNegBQw +api: eJzdVU1v2zgQ/SvEXLoLKHYa7Emnuo2BGM1ig9TbiyMUDDW22FIkQ47Seg3/92JIufJHkkWu9cUi+ebr8c1wAyRXEcoFXHWttGfTR2k6SdrZCFUBNUYVtOc1lHCJBglF9Kj0UiuhXOtl0NFZQfLeYBT3MmIteN2gDqKz+qFDMbuMozt7ZydhFcs7K4QQXq6Nk7X441pHWkQK1Z+lmDe4M9E1WtJLjSEKt2R3T0QjJ+qUUvJ+i9QFywEmwuhIO7sMqU/t36TEoADnMaSaZzWUkPFfcGDiS8PcHOxkEBQQ8KHDSO9dvYZyk5Y6YA0lhQ4LUM4SWuIj6b3RKtmPv0YmdANRNdhK/vKBsyCNkVf7oXSdtjRhmz5o7RFKiBS0XcG22G3IEOQaCiBNhtd7VylmdYTtAHX3X1FRn31Od3ESsxpc5YsfHMJ2y94CRu9szClfnJ/z36FiPnVKYYzLzojbHgyvIOWoshco6BPdBRG9VPc5SAI/2Mmgvpi/Li5O8/8sja4TWkxDcOE1yR/eaI0ktTm4yEOAcergVNr1P0soF6fV/trRlnCFAbbV8yq4dqq/sgLauDplb4D+jTHKFQ6Seh6ayBBzPv0/WXFdOXSP29PVQG9m9/kyLjN9TwXbQa7m85sTh/luW6TGDb0NBXhJDZQwTp19tid9KCBieMQQE/ddMFBCQ+RjOR4r47p6JFdoSY6kHkuv4XhITtKp+MBQ2FbsTnVB0zr5m9zMPuL6CmWNAcpFtQ/4xNLJYjiEDY3g9UdkWqxseT3pqHFB/5dvuADNCTTZiutmUd4OA2r6Q7be4JMDZrG7ZNaStkuXwvbU9jW9l+ob2hoKYH5yueejt6Pz50joDcTkZtZ3jlSpc3b5JxgURzT/IhgKwDa1DRDK9t1wwNV5F6mVds/fadcfZ7YZ+ve3fc56sRD+oLE3UqfeTwxvet0v4FT3VQGNi8SHmw0X/m8w2y1vP3QYWL1VAY8yaA6WpFvspMbC/oZrKOFDJvcsTQaGmy7r9mhQ8hDLFhOl0NOL2GqvgS+n19P5FAq47x/c1tVsFeR3njvyO5SQXvRcFL/IvLcBI+2q4+lWQvbKv58VKSK/ sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Delete specific comparison tables based on their unique IDs. Args: - payload (List[str]): The unique identifiers of the comparison tables to delete. +payload (List[str]): The unique identifiers of the comparison tables to delete. Returns: A list of the deleted comparison tables' IDs. @@ -49,29 +46,299 @@ A list of the deleted comparison tables' IDs. as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-evaluations.api.mdx b/docs/docs/reference/api/delete-evaluations.api.mdx new file mode 100644 index 0000000000..3c6ad18953 --- /dev/null +++ b/docs/docs/reference/api/delete-evaluations.api.mdx @@ -0,0 +1,344 @@ +--- +id: delete-evaluations +title: "Delete Evaluations" +description: "Delete specific comparison tables based on their unique IDs." +sidebar_label: "Delete Evaluations" +hide_title: true +hide_table_of_contents: true +api: eJzdVU1vEzEQ/SvWXABpSUrFaU+kNBIRRVRt4JJGyPVOsgav7dqzLSHKf0djb7r5aEFcySVr+3k+3rwZr4HkMkI5g/G9NK0k7WyEeQEVRhW05zWUcI4GCUX0qPRCK6Fc42XQ0VlB8tZgFLcyYiV4XaMOorX6rkUxOY+DG3tjR2EZyxtbJTPfsHclXl7oSLNIYf6qFNMatzd1hZb0QmOIwi3Y6hNOyYlsMjm5QmqDZT8jYXSk7b0MqY7vv0jxQQHOY0jxTCoo4ThKKCDgXYuRzly1gnKdljpgBSWFFgtQzhJa4iPpvdEqXRx+j0zfGqKqsZH85QM7I42RVzs+vukqbWnCJn3QyiOUEClou4RNsd2QIcgVFECaDK93CicmVYRND3W331FRF30Od3bkc96bymXuDcJmw9YCRu9szCGfnpzw374+rlulMMZFa8RVB4Z/IOUgsz9Q0AW6dSI6Ye6KN8f89vT0OMyv0ugqwcQ4BBf+Jcb9wlVIUpu9eu0DjFN7p9KuPi+gnB0n9bijLeESA2zmzxf7wqmuMgU0cXlMUg/9hDHKJfbKeR6ayBBTPv2bejiv7LrD7cinpzez+3wa55m+p5xtIR+m08sjg7m2DVLt+k6FArykGkoY7vdsxHCPISbW22CghJrIx3I4VMa11UAu0ZIcSD2UXsPhzBulU/GeobCZsznVBk2rZG90OfmIqw8oKwxQzua7gGsWTZbBPqxXutcfkQmxsuH1qKXaBf0r17YAzQHU+RZnzHK86ifQ+KdsvMEnJ8hsW15WkbYLl9x2pHY5nUn1A20FBTA/Od2TwZvByXMkdBfE6HLS9YxUqWe28ScYFAc0PxIMBWCTGgYIZfOuP+DsvIvUSLtj74m2Pohs3Xfu//46dZoh/ElDb6ROzZ+IXnfC3xvq3JG1i8Tb6zVn/iWYzYa371oMLN95AfcyaHaTtFtstcbK/oErKOF9Zvd1GgoMN20W7sGM5PmVb4yUQk9/xM53evd8fDGejqGA2+5JbVzFt4J84JEjH6CE9DTnpPjN5b01GGmXLQ+2ErJV/v0GKyEQqA== +sidebar_class_name: "delete api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Delete specific comparison tables based on their unique IDs. + +Args: +delete_evaluations (List[str]): The unique identifiers of the comparison tables to delete. + +Returns: +A list of the deleted comparison tables' IDs. + + + + + +
+ +

+ Body +

+ required +
+
+
    + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-evaluator-config-evaluators-configs-evaluator-config-id-delete.api.mdx b/docs/docs/reference/api/delete-evaluator-config-evaluators-configs-evaluator-config-id-delete.api.mdx index a4053fb136..3240633f9b 100644 --- a/docs/docs/reference/api/delete-evaluator-config-evaluators-configs-evaluator-config-id-delete.api.mdx +++ b/docs/docs/reference/api/delete-evaluator-config-evaluators-configs-evaluator-config-id-delete.api.mdx @@ -5,73 +5,304 @@ description: "Endpoint to delete a specific evaluator configuration." sidebar_label: "Delete Evaluator Config" hide_title: true hide_table_of_contents: true -api: eJzdVUFv2zwM/SsCTxsgJF2xk08L1gwLtmFFl32XNAhUm4612ZIq0d3yGf7vAy07Tuq2wK47xZHIJ/LxPakBUvsAyQaWD6qsFVkfYCshw5B67UhbAwksTeasNiTIigxLJBRKBIepznUqcMgUqTW53tdecd7s1tyahd+H5NYIIcawXQzb6Uy8CuRfJ2JdoKiNvq9R6AwN6VyjFzYXVOCL8DdItTfDCXfWlolYe4bJY6HaGvFLBRHqNMUQ8rqU4oMqAwpLBfpfOuAMJFiHEXWVQQKxxd2k4ONC6FfCbhqks90uAoAEp7yqkNAzxQ0YVSEk8EQOSNDMtFNUgASP97X2mEFCvkYJIS2wUpA0QAfHEIG8NnuQQJpKXjiOT7zvMMUqg7bdMlRw1gQMnH15ccE/59P9duRG3PTBICG1htAQhyvnSp12/Mx/BM5pphUx+ajMSUkDmLiKkpmUOEquXwliGrTKRA8Abdu2Et5eXk57+E+VOusqFEvvrf+bBpzn8ZOOFGVISpf8pQmrMA0obXq2q8zha96N93w2rTyuaEO4Rw/ttpXDmvJeHU7Y+mxjgdBKqML+pVl/wRDUHuEI9oIsmAyx5t12PNve/cCUznS26fqKR/dx2xFmpDey+3wbV5G+pw4bQj6u19cTwDjbCqmwowU7B1EBCcxH7817782bJ3zUgoSA/mFwXO1LSKAgciGZz9PS1tlM7dGQmik9V04DeyRgWntNhy5lcb36hIePqDL0kGy2pwHfWDRRBudhxwkopz8hE9J7fVFTYb3+P862d3kRs7hjbXLbpffkLLrixOJ6BRK4jajvi9mb2QU8vpfPglnvKu30PpzdbYN8xMKxf5CAVSd2IFTVu3GDK3M2UKXMCd4zPn5cVjNa799/OfqxE/6muSuV7vzb8d302t2M932IY2L1goTkqXdgK6GwgTitae5UwO++bFtevq/Rs0K3Eh6U1+qO9bJpINOBvzNIci7vhWG8uunt/lo8V/mgYsMS5vL4H0j4iYdnHq7uTisGtzR95CJN0dEJxuQKZlsd7X61/LxcL6Ft/wBSbf2+ +api: eJzdVcFu2zgQ/RViTi1A2NmgJ53qbbyo0S42SN29OIbBUCOLrUQq5CitK+jfFyNKlh3FAfbak2Vy5vHxzbxhA6T2AZINLJ9UUStyPsBWQopBe1ORcRYSWNq0csaSICdSLJBQKBEq1CYzWuCQKbSzmdnXXnHe7N7e24Xfh+TeCiHGsF0M25lUvAnk3yZinaOorXmsUZgULZnMoBcuE5Tjq/B3SLW3wwkPzhWJWHuGySJR46z4oYIItdYYQlYXUvylioDCUY7+hwk4Awmuwoi6SiGBeMXdhPBxIfQrYTcNMuluFwFAQqW8KpHQs8QNWFUiJPBCDkgwrHSlKAcJHh9r4zGFhHyNEoLOsVSQNECHiiECeWP3IIEMFbxwLJ/40GGKVQptu2WoUDkbMHD29dUV/5xX98tRG3HXB4ME7SyhJQ5XVVUY3ekz/xY4p5kyYvFR2RNKA5i4iS0zoTi2XL8SxDRolYoeANq2bSW8u76e3uFfVZi0YyiW3jv/fy5QeS4/mShRiqRMwV+GsAzTgMLps11lD/9kXXnPa9PK44qxhHv00G5bOawp79XhRK3PLhKEVkIZ9q/V+m8MQe0RjmCvtAWLIda8245nu4dvqOmszzbdveLRfdx2hBnljepevsZNlO+lw4aQj+v17QQw1rZEyt1owc5BlEMC89F789578+YFH7UgIaB/GhxX+wISyImqkMznunB1OlN7tKRmysxVZeD5rFt0u+IDhwIbKKCuvaFDh7e4XX3Cw0dUKXpINtvTgC/cUbFHzsOO5VGV+YSsVj8IFjXlzptfsfD9CMhjFsthbOa69F65ntufSn9HyzOD7xlpX83+mF1dukyfIBa3q94YSnfGGHh0YSCfyXUUCiRg2bkCCFX5ftxglpULVCp7gnfB8M/pNaNHf/8npm8Bwp80rwplOqN3ejd9k2/GhyHEMnGbg4TkpQdjKyF3gTitaR5UwK++aFtefqzRc7duJTwpb9QD986mgdQE/k4hyZjeK8V4c9fPhbfiEvOhoy23M9PjfyDhOx4uvHDd8MsH5zR95EJrrOgEYzKr2WLHuXCz/LxcL6Ft/wNmjQxc sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Endpoint to delete a specific evaluator configuration. Args: - evaluator_config_id (str): The unique identifier of the evaluator configuration. +evaluator_config_id (str): The unique identifier of the evaluator configuration. Returns: - bool: True if deletion was successful, False otherwise. +bool: True if deletion was successful, False otherwise. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + boolean +
    +
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-invocation-by-trace-id.api.mdx b/docs/docs/reference/api/delete-invocation-by-trace-id.api.mdx deleted file mode 100644 index cfaff8e380..0000000000 --- a/docs/docs/reference/api/delete-invocation-by-trace-id.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-invocation-by-trace-id -title: "Delete Invocation" -description: "Delete Invocation" -sidebar_label: "Delete Invocation" -hide_title: true -hide_table_of_contents: true -api: eJylVU1v2zAM/SsBTxtgxFmxk08L1gAN2mFFm+1SBIFiM7FaRVYlOptn+L8PlL+btBi6UxyJfCTfI6kSSOwdRA+w1McsFiQz7WAdQGbQ+n/LBCJIUCHhRnY2m22xISti3MgEAjDCigMSWoYqQYsDQgQDA6khAiMohQAsPufSYgIR2RwDcHGKBwFRCVQY9nNkpd5DACRJ8cGKgSbLBKoq6NCdEXoA/pyjLUboO6HcCF7o4vvOJzgOxKDNic6Vgmrdh743QteR14ztTKYdOka7mM34J0EXW2mYFDbP4xid2+VqctcYQwBxpgk1+RyMUbLmMHx07FMOMjSWeSdZR4izvHZqkpOacI92QMxXbxFAgjuRK4JoVjEdnUpK6qdx5eMILYf/S07Qa/1OqKHErVG2fcSYBuXecDmnKG+59G3Nzp0mVcVOny8uTiX8KZRMvMdkYW1m369fgiSk4i9JeHCnBiqLR7f/QFzbA9W6L1pYK4ohTU3FrMvB7d+arG/onNgjdGCvm3oyJiu+PUd4P3cPvq46dGM3ELqnt2b39TIua/reUvdqtbo9Aay1HYt66RfYpO8Gzg8pzfrt5tcYpRBBaCweJf4K+0lyYdl2eAUBOLTHdtnlVkEEKZFxURjGKsuTqdijJjEVMhRG+j53GOdWUuFd5rfLayyuUCRoIXpYDw3uuZnq9hibdcoII6+RiWoW4TynNLPyT1uXX4dp7VX5fbDLvHtD2twnN5nfLiEALqOmaDb9NJ3BS+JGxjwHIvZz0Mb21xC8YKGrHwLAgx8CIBSHL/0FZ2YyRwehB3jndBol1LFA+JtCo4T0be7Dl42AD9AICMNl6CDgF6dZU+sA0swRG5flVjj8YVVV8XH9kLBMiXRiqwZPyRMWo4fnKFTOuXiFj8JKNj/v+qKIbqPAh7tmcD5OIDhfXKu7LoYx23S6kvxKSNumKpvreRyjoYHjyQbj5LtZuFzcLFYLqKq/cgjCdA== -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-invocation.api.mdx b/docs/docs/reference/api/delete-invocation.api.mdx deleted file mode 100644 index d68707ef30..0000000000 --- a/docs/docs/reference/api/delete-invocation.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-invocation -title: "Delete Invocation" -description: "Delete Invocation" -sidebar_label: "Delete Invocation" -hide_title: true -hide_table_of_contents: true -api: eJy9Vclu2zAQ/RVjTi1ARG7Qk041GgMxkqJB4vZiGMFEGltMKIohR25dQf9ekFodJ0GbAj1p4azvzTxWwLh1EK9goXdFgiwL7WAtoDBkw9cihRhSUsR0K3sbEGDQYk5M1rtXoDEniIEtJnQrUxAgNcRgkDMQYOmxlJZSiNmWJMAlGeUIcQW8N97PsZV6CwJYsvI/lj7QZJFCXYs+ujOo/yY46v3XTSjvMI0P2f7RpVJQr4fENwZ1k3ftQztTaEfORzudTv0jJZdYaQIMMdyUSULObUo1uW6NQUBSaCbNoQZjlGxQi+6d96lGFRrrkWbZZEiKsnFqi5OaaUt2BMvnYCEgpQ2WiiGe1h6MjpdbJfXDYeeHGToE/xUcMTD9xlBjgjuj4u6eEh61e+nbOY7ymsswyN6556SuvdPH09NjCr+jkmnwmMytLezb+UuJUSr/Jplyd2ygiuTg9A+A62agXg9No7W4H8PUrWUtIHfb1/bqCzmHW4I+2MumAYzJ0p8+B/iwdqvQV5O6tRsRPcDboPtyG2cNfK+xe75cXh0FbLg9JPUsSNZkMZasnDgrBj0LIsYZxBAZSztJP6Jhk1xUdRNeR1W7NjUIcGR3neiVVkEMGbNxcRQlqijTE9ySZjxBGaGRYeIdJaWVvA8us6vFBe3PCVOyEK/WY4MbP1bNoBya9RyhkRfkIWsFcVZyVlj5q+swyGLWeNVBGTZFcG/hm4XiJrOrBQjwbTRgTU8+nEzhKYQHxn4jMAkb0eUOxyCeoND3DwIoD+sATJh/Gg58ZaZwnKMexXuOsYOCehSYfnJkFMow8CF91VK5gpZKGMuiA+Evh/5qijsZXAvICsfer6ru0NE3q+ra/34syXrG1gJ2aCXeefxWFaTS+fcU4g0qR0cl9soB767bBXk/AfF86R2r2lO6Q1X6LxDwQPvxXerV4D/m7cAJipN1k1q1p7MkIcMjvyOB9CPdr9rZ/HK+nENd/wYx6Nzq -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-legacy-evaluations.api.mdx b/docs/docs/reference/api/delete-legacy-evaluations.api.mdx deleted file mode 100644 index d5bca5c084..0000000000 --- a/docs/docs/reference/api/delete-legacy-evaluations.api.mdx +++ /dev/null @@ -1,77 +0,0 @@ ---- -id: delete-legacy-evaluations -title: "Delete Evaluations" -description: "Delete specific comparison tables based on their unique IDs." -sidebar_label: "Delete Evaluations" -hide_title: true -hide_table_of_contents: true -api: eJzdVU1v2zgQ/SvEXNoCqp0Ge9JpvRsDNZqiQertxTEKhhpL7FIkQ47Seg3/92JIubLiJEWu64s15JvvN8MdkKwjlCuY30vTSdLORlgXUGFUQXuWoYQLNEgookelN1oJ5Vovg47OCpK3BqO4lRErwXKDOojO6rsOxeIiTm7sjZ2FOpY3tkpmvuLgSry+1JFWkcL6TSmWDR40dYWW9EZjiMJt2OojTsmJbDI5uUbqgmU/M2F0pINehlSn+q9SfFCA8xhSPIsKSuijNFhLtT0OFgoIeNdhpL9ctYVyl0QdsIKSQocFKGcJLfGV9N5olRSn3yJXcQdRNdhK/vKBfZLGyNKRj6+6SkeasE0ftPUIJUQK2tawLw4HMgS5hQJIk2H5qH9iUUXYD1B3+w0V9dHncFcnPteDqdztwSDs92wtYPTOxhzy+dkZ/41p8rlTCmPcdEZc92B4QVEeZPZMCfpAD05Ez8/L1DJxTOUc+h/n56fRfpFGVwkm5iG48JJQx/2rkKQ2o7aNAcap0a20208bKFenuf060ZawxgD79dM9v3Sqb1ABbaxPazVAP2KMssaBQE9DUzHEkm9/RyLOK7vucUcsGsqbq/t0Ghe5fI85O0DeL5dXJwZzb1ukxg1zCwV4SQ2UMB2PbsRwjyGmqnfBQAkNkY/ldKqM66qJrNGSnEg9lV7Dfs0aqguatklldrX4gNv3KCsMUK7Wx4DPzIvc6TFs4LTXH5BztrJledZR44L+L7evAM2EbLIWJ8WMux52zfyHbL3BR3fF6tBBJoq2G5fc9nWbpaTE7GoBBXD6mfpnk3eTM3i45UdgHgWp0igcYk7XUDyo3q+6QQHYpjkAQtn+OVxwRt5FaqU9stcP7XzUpVFEu2Eg/+9PUM8Twh809UbqNNOp0Luez6OVzYPWuEh8vNtx5v8Es9/z8V2HgSm7LuBeBs1uEl+LA7+Yzf/iFkr4O1f3bZp1hpsuk/XB6uO1lDVmSqGnZ7Hro5G8mF/Ol3Mo4LZ/MFtXsVaQ33mTyO9QQnp/c1L8ovLZDoy0dcf7qoRslX8/ASc7B2I= -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete specific comparison tables based on their unique IDs. - -Args: -delete_evaluations (List[str]): The unique identifiers of the comparison tables to delete. - -Returns: -A list of the deleted comparison tables' IDs. - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-metrics-preview-evaluations-metrics-delete.api.mdx b/docs/docs/reference/api/delete-metrics-preview-evaluations-metrics-delete.api.mdx deleted file mode 100644 index c5ed7e33da..0000000000 --- a/docs/docs/reference/api/delete-metrics-preview-evaluations-metrics-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-metrics-preview-evaluations-metrics-delete -title: "Delete Metrics" -description: "Delete Metrics" -sidebar_label: "Delete Metrics" -hide_title: true -hide_table_of_contents: true -api: eJy1lVFP2zAQx79Kdc8uKQXKlqd1oxIVTEPA9lJV6OpcWrMkDrbD1lX57tPZoUkpMAlpfUhj++7s+93flw04XFqIZzB5xKxCp3RhYS5Al2T8aJpADAll5OguJ2eUtHeloUdFv+6o9dmu3QVbEGDooSLrPutkDfEGpC4cFY5fsSwzJb1jdG91wXNWrihHfisNb+4UWR49xVWJHypHuX9x65IgBuuMKpYgINUmRwcxVJVKoBZPBmgMrkGAUy7j8dcQrzdNLNStmV7ck3TNqZWhhJl09563IVpUTbBpYq9DslBzzDaGMxX5CVvqwoaMhoMB/yVkpVElh4EYbiopydq0ynrXjTGI9zKTugpOTXKqcLQk06HwxVsISCjFKnMQD2rxX1F3tprNX+L+NtyGSO3xHg+H+wB/YKYS79ebGKPN++kl5FBlOwR2DTItd1axWH9LIZ49J1WLvQrU89dxXepwQCaa2+VL5Fuy1uKSWvavm3oYvVte/ZfcOa+wdWPX0XyLN9B9PY2zgO+tGp/f3l7tBQy13S3qme8lvUYJ4CW60m1HAgEluhXEEDU9Ker0pKgRdAQCLJlHMtZXqTIZxLByrrRxFMlMV8kBLqlweIAqwlJBPWcPWRnl1t5lfDW9oPU5YULGK7hjcMM6CsrYNdsWBUt1QcyowJzH48qttFF/QrkFKM51FbwYAiv0uu2ek9+YlxntdcMZHKX44SQdHfdPTg9P+8cno2F/cZTK/lB+HB2loxGmOAKWnCpS7Q/UVGDs0+2Nr6YggMEE3oODw4MBPK/CjjFfKpT+Uj1l45dBPOO6JQoCKPc3Chxh/qld4FxLbV2ORSfeXtF3TrOF6ui3i8oMlb8wfu9No4YZNGrgrTvftW2LAwEs7pW23I9gs1mgpe8mq2uefqjIcNnnAh7RKFwwshljXD0JYAM/ae37qG8xfX+/2DyrQsGftRtuBcFjLCWV7k3beUfnZ5PLye0EBCyaz2iuE/YyyMnxMwbgz3XIMN6EuQ1kWCwr7hExhKj8+wur57i9 -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Metrics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-queue-preview-evaluations-queues-queue-id-delete.api.mdx b/docs/docs/reference/api/delete-queue-preview-evaluations-queues-queue-id-delete.api.mdx deleted file mode 100644 index 7f3b188a7c..0000000000 --- a/docs/docs/reference/api/delete-queue-preview-evaluations-queues-queue-id-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-queue-preview-evaluations-queues-queue-id-delete -title: "Delete Queue" -description: "Delete Queue" -sidebar_label: "Delete Queue" -hide_title: true -hide_table_of_contents: true -api: eJydVU1v2zAM/SsBTxsgxFmxk08L1gAN2mFdl+0SBIFqM7E62XIlKltm+L8PlD/TpD3sFDt8JB8fP1wByb2DeA2Lg9RekjKFg40AU6INb8sUYkhRI+H22aPHbWnxoPD3FgePxuK2LUKl223jAgJKaWWOhJbTVFDIHCGGDggCVAExlJIyEGDx2SuLKcRkPQpwSYa5hLgCOpbs58iqYg8CdsbmkiAG70MUUqQZ8I0DT5Yp1PWG47nSFA4dh7iazfgnRZdYVTJxiOG7TxJ0buf15KEFg4DEFIQFMVyWpVZJqDN6cuxTjWiVlpUi1WRIjG+cWraqINyjHdH7HBACUtxJrwniWS0GMThdcfy6C0q9XXEtekThtQau9oIGogOZxydMaMRkaHiAL9O+/Lpmv49XV+dq/ZRapcFpsrDW2P+XKkWSSvOTIszdOUCb5MT6mjAjITq5681Qt7RWHkdl35mGINQCcre/NFod9As6J/cIfbDXoUGMyYqtlzQfxnod6mpSt7hR4wZ5G3VfL+O6ke+tBt+sVvdnAZvenjb1OqzqJIwBU0PKzLD1YYUpgxiidvOj0eZHzeZHVTfDNQhwaA/dvnurIYaMqHRxFCXa+HQq91iQnEoVyVKFyXWYeKvoGFzm98tbPN6gTNFCvN6MAd95nJoBOYX1vZGlukWWqr00c0+Zsepv0/X23GSNF2uhip0J7q1s80BuMr9fggAuoxFpNv0wncFL6U7AvAkyCZvQ5Q5mEC9U6OsHAZiHNQBCmX8aDMysNI5yWYzivejUCZdeAMI/FJVaqjDjIXPVtnANbQs58ejgtyeIH+L+GG0EZMYRe1XVo3T4w+q65r+fPVpu1UbAQVolH1m4dQWpcvycQryT2uEZwf5UwLuHdiPeT0BcJt61s+BeMld+AwG/8Dj+foRdz7pZqVrzPEmwpJHj2Wnioeon/Xpxt1gtoK7/AY0hav8= -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Queue - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-queues-preview-evaluations-queues-delete.api.mdx b/docs/docs/reference/api/delete-queues-preview-evaluations-queues-delete.api.mdx deleted file mode 100644 index 809fc4a9d2..0000000000 --- a/docs/docs/reference/api/delete-queues-preview-evaluations-queues-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-queues-preview-evaluations-queues-delete -title: "Delete Queues" -description: "Delete Queues" -sidebar_label: "Delete Queues" -hide_title: true -hide_table_of_contents: true -api: eJy1ldtO20AQhl8lmusNDgFC66umJRIRVKVAexNF0cQeJ0ttr9kDJY387tXsOjgJh0pI5SLs4Z/ZnW9mx2uwuDAQT2D0gLlDK1VpYCpAVaT9bJxCDCnlZGl278iRmVWaHiT9nlFrstmaBSUI0HTvyNjPKl1BvIZElZZKy0Osqlwm3i66M6rkNZMsqUAeVZqPtpIMz7zbmUz9RFoq/MCuKoIYjNWyXICATOkCLcTgnEyhFhsBao0rEGClzXn+nb11xqmBuhWp+R0ltrmx1JQyjfbcaWveIvKOxqm5DkFCzf5ae6sd+QVTqdKESPq9Hv9LySRaVuwEYrhxSULGZC7vXDdiEO9llSgXjJrAZGlpQXor/i9eISClDF1uIe7V4r8h3jpmMn2J91tYGxa1B3vc7z9H9xNzmXqrzkhrpd/PLSWLMt+JfleQq2RnF8vVtwziyT6lWjxjX09fR3WpwgWZZmEWL1HfSL+SMbiglvvrUg+jc8u7/ypyjisc3ei2ar3FG+i+HsZZwPdWhs9vb6+eOQy53U3qme8eHV8HXEEF2aVqGxAIqNAuIYao6UHRVg+KQg+KQIAh/UDa+Bw5nUMMS2srE0dRkiuXHuCCSosHKCOsJNRTtkiclnblTYZX4wtanROmpH31bgluuIpCXezKnlKClbwgJlRiwfOhs0ul5Z+QbAGSI10GK0bA9XnddsvRIxZVTnvdbwJHGX44yQbH3ZPTw9Pu8cmg350fZUm3n3wcHGWDAWY4AC43WWbKX6ehP/TBdoZXYxDAWALr3sHhQQ/2M7Aj5geFiX9Qm1j8Nog9qk88QQAV/jWBJSw+tRscaaWMLbDc8ref8J3LPBG19GijKkfp34o/et1UwgSaSuCTtz5hTV/jAZf1UhnuQ7Bez9HQD53XNS/fO9Kc8qmAB9QS5wxswhCXm+Sv4RetfO/0zaXrXxbLcxeSvddouAkEi2GSUGXf1E63SvxsdDm6HYGAefPJLFTKVho5Nv6NAfjDHAKM12FtDTmWC8fdIYbglf/+Arv/r/M= -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Queues - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-result-preview-evaluations-results-result-id-delete.api.mdx b/docs/docs/reference/api/delete-result-preview-evaluations-results-result-id-delete.api.mdx deleted file mode 100644 index 9863e716ad..0000000000 --- a/docs/docs/reference/api/delete-result-preview-evaluations-results-result-id-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-result-preview-evaluations-results-result-id-delete -title: "Delete Result" -description: "Delete Result" -sidebar_label: "Delete Result" -hide_title: true -hide_table_of_contents: true -api: eJydVU1v2zAM/SsBTxsgxFmxk08L1gAN2mFFm+0SBIFqM7E62XIlKltm+L8PlD/TpD3sFDt8JB8fP1wByb2DeA2Lg9RekjKFg40AU6INb8sUYkhRI+HWovOatqXFg8LfWxxcWpPbdhiVbreNFwgopZU5ElrOVEEhc4QYeiQIUAXEUErKQIDFF68sphCT9SjAJRnmEuIK6FiyoyOrij0I2BmbS4IYvA9RSJFmwEOIPFmmUNcbDuhKUzh0HONqNuOfFF1iVcnkIYZHnyTo3M7ryUMLBgGJKQgLYrgsS62SUGv07NinGvEqLctFqsmQGN84tXRVQbhHO+L3NSAEpLiTXhPEs1qM5OB8xfH7Loj1fs216BGF1xq43EsqiA5lnp4xoRGXoe8Nfpn2CtQ1O36+ujoX7KfUKg1ek4W1xv6/WimSVJqfFGHuzgHaJCfWt6QZSdEpXm+GwqW18jiq+840BKEWkLv9pfHqoN/QOblH6IO9DQ1iTFZsvST6MNrrUFeTusWNWjfI26j7dhnXjXzvdfhmtbo/C9j09rSp12FfJ80cMDekzAzrHxaZMoghai9ANLoAUXsBoqof5BoEOLSHbu+91RBDRlS6OIoSbXw6lXssSE6limSpwvg6TLxVdAwu8/vlLR5vUKZoIV5vxoBHnqhmRk5hfXtkqW6R1WovztxTZqz62zS+vTpZ48VyqGJngnur3DyQm8zvlyCAy2h0mk0/TWfwWr0TMC+DTMIydLmDGcQrFfr6QQDmYROAUOZfBgMzK42jXBajeK+bdUKmV4DwD0WllirMeUhdtV1cQ9tFzjw6/t0l4qd4OEobAZlxxH5V9SQd/rC6rvnvF4+Wu7URcJBWySfWbl1Bqhw/pxDvpHZ4RrE/GPDhod2LjxMQl6l3HS24ncyW30DALzyefErCymfdvFStfZ4kWNLI8+xC8WD18369uFusFlDX/wBrx3Il -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Result - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-results-preview-evaluations-results-delete.api.mdx b/docs/docs/reference/api/delete-results-preview-evaluations-results-delete.api.mdx deleted file mode 100644 index a6ebe0d994..0000000000 --- a/docs/docs/reference/api/delete-results-preview-evaluations-results-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-results-preview-evaluations-results-delete -title: "Delete Results" -description: "Delete Results" -sidebar_label: "Delete Results" -hide_title: true -hide_table_of_contents: true -api: eJy1ldtu2zAMhl8l4LVTZ2mbbr5atgZo0A4rum43QRAwNp2oky1Xh25Z4HcfKDm1kx4GFFgvUh1+UuJHit6CxZWBZAaTB5QOrVClgXkEqiLtZ9MMEshIkqWFJuOkNYtK04OgXwtqbR73FkELEWi6d2TsJ5VtINlCqkpLpeUhVpUUqTeM74wqec2kayqQR5Xmw60gw7PgdyEyPxOWCj+wm4ogAWO1KFcQQa50gRYScE5kUEc7AWqNG4jACit5fuPd9aaZgbpVqeUdpba5s9CUMZHOyfPWQcspuJpm5iYECjV7bD1Y7cgvmEqVJkQzHAz4X0Ym1aJiL5DAN5emZEzuZO+mEUP0Vl6pcsGoCU2UllakOwg+e0UEGeXopIVkEG75nzB3DprNn2P+KtkGR+3ZngyHT+n9QCkyb9abaK3029FlZFHIvfj3BVKle7tYbr7mkMwOOdXRE/z1/GVYVypckHkWZvUc9530CxmDK2rJvyz1MHq3vPuvSue4wtGNrlPvLd5A9+UwzgO+11J8cXt7/cRhyO1+Us99E+mFQuAaKsiuVduKIIIK7RoSiJtmFHeaUdw0oxgiMKQfSBufJaclJLC2tjJJHKdSuewIV1RaPEIRYyWgnrNF6rSwG28yvp5e0uaCMCPtC7gj+MZ1FCpjX/aYFKzEJTGjEguej51dKy3+hHRHIDjWdbBiCFyhN23bnPzGopJ02AZncJzj+9N8dNI/PXt31j85HQ37y+M87Q/TD6PjfDTCHEfAFSfKXPn7NAkY+2h74+spRMBcAu7B0bujARwmYU/MbwpT/6Z2wfhtiA6wPgKFCKjwDwosYfGx3eBQK2VsgWXH35Oc793mkaml3zauJAr/XvzZ26YYZtAUAx/d+Z7t2huPuLbXynA3gu12iYa+a1nXvHzvSHPW5xE8oBa4ZGQzxrje5X8LP2nje6jvMH3/vFguXcj3QbfhThAsxmlKlX1VO++U+fnkanI7gQiWzeezUBlbaeTg+DcB4M90iJArhNe2ILFcOW4RCQSv/PcXOr62nw== -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Results - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-run-preview-evaluations-runs-run-id-delete.api.mdx b/docs/docs/reference/api/delete-run-preview-evaluations-runs-run-id-delete.api.mdx deleted file mode 100644 index f9cc7a31e7..0000000000 --- a/docs/docs/reference/api/delete-run-preview-evaluations-runs-run-id-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-run-preview-evaluations-runs-run-id-delete -title: "Delete Run" -description: "Delete Run" -sidebar_label: "Delete Run" -hide_title: true -hide_table_of_contents: true -api: eJydVU1v2zAM/SsBTxsgxFmxk08L1gAN2mFFmu0SBIFqM7E6WVL1kS0z/N8Hyp9p2h52smM9io/vkUwFnh8cpBtYHLkM3AutHGwZaIM2/lrmkEKOEj3ubFA7Y/Eo8PcOBzx9d7t4KvLdrgEDA8MtL9GjpQQVKF4ipNDAgIFQkILhvgAGFp+DsJhD6m1ABi4rsOSQVuBPhqKct0IdgMFe25J7SCGEeIsXXhJgFdRkmUNdb+k2Z7Ry6OiCq9mMHjm6zApDhCGFh5Bl6Nw+yMmqBQODTCuPyhOcGyNFFutLnhzFVCNSxpI+XjQZMh2aoJarUB4PaEfkvkYEgxz3PEgP6axmnRCUTJ2+76NG71dbsx6hgpRAtV7UzzqIfnzCzI9YDBavglrmfeF1TVGfr64udfrJpchjyGRhrbb/L1KOngtJb8Jj6S4BUmdnp2+JMhKhE7reDlVza/lpVPSdbghCzaB0h9daqoN+Q+f4AaG/7G1oFGOyptPXFB/aeRPralK3uJFpg7yNum+Xcd3I9569N+v1/cWFjbfnpl7HAZ2sgiJi6As9zHgcW19ACkk76clo0hOa9KRqOrcGBg7tsZvvYCWkUHhvXJokmdQhn/IDKs+nXCTciNivDrNghT/FkPn98hZPN8hztJButmPAAzVS0xrnsN4VbsQtkkjtZpkHX2gr/jZ+twumaKJIBaH2Ooa3gs0jucn8fgkMqIxGntn003QGL0U7A9MM8CzOQJc7HgN7oUJfPzDAMg4AeOTll+GAmBntfMnV6L4zj86Y9OV7/OMTI7mIvR3zVq15G2jNo7SjxR6XDj3SdvlsGRTaeYqoqkfu8IeVdU2fnwNaMmnL4Mit4I8k2aaCXDh6zyHdc+nwgly/HuDDqp2CjxNgr5PujFTkIvGkX8DgF56Gf4o43UXXI1V7OM8yNH4UdrGMqJn67r5e3C3WC6jrf4keXs8= -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Run - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-runs-preview-evaluations-runs-delete.api.mdx b/docs/docs/reference/api/delete-runs-preview-evaluations-runs-delete.api.mdx deleted file mode 100644 index 7a536c92a5..0000000000 --- a/docs/docs/reference/api/delete-runs-preview-evaluations-runs-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-runs-preview-evaluations-runs-delete -title: "Delete Runs" -description: "Delete Runs" -sidebar_label: "Delete Runs" -hide_title: true -hide_table_of_contents: true -api: eJy1lW1v2jAQx78KutehobSlW16NrUhF67SKdnuDEDqSC7hL7MwP3RjKd5/ODg3p06RK4wXxw53t/+/O5x1YXBtI5jC5x8KhFUoaWESgKtK+N80ggYwKsrTUTpplpele0K8ltQ5hYhmsIAJNPx0Z+1FlW0h2kCppSVpuYlUVIvVe8Z1RksdMuqESuVVp3tYKMtzTTi5F5pvCUukbdlsRJGCsFnINEeRKl2ghAedEBnW0N0CtcQsRWGEL7s+c7E0zA3VrolZ3lNrmtEJTxhT2ey5a1xbMzMlpZmZBHNS8VutrtSM/YColTVAwHAz4k5FJtah4CUjgxqUpGZO7ojdrjCF6K6NUueDUiBLS0pr0gfJP3iKCjHJ0hYVkwKf8D2gPtpgvnuP8MtCGQu2Rng6HT6F9x0Jk3qc30VrptxPLyKIoOsq7BoVKO7Mot19zSOaPCdXRE+r14mVMVyockEmWZv0c8b3pFzIG19Qyf9nUw+jd8uy/Upt1ha0bu4Mcb/EGui/LuAj4Xovv5e3t9ZMFQ2y7Qb3w9aI3c5KzpyS7UW2xgQgqtBtIIG4qTnxQcWKuODFEYEjfkzY+Pk4XkMDG2sokcZwWymVHuCZp8QhFjJWAesEeqdPCbr3L+Hr6mbaXhBlpn7cHBjecQSEnumYP4cBKfCamI7Hk/tjZjdLiTwh0BIJVboIXy+fcnLW1cfIby6qgTq2bw0mO787y0Wn/7Pz4vH96Nhr2Vyd52h+m70cn+WiEOY6AE03IXPnDNNzHXmpvfD2FCBhKoDw4Oj4awGP2HWO+Spj6q7RX4qchesT0gSZEQKW/R2AJyw/tBOuslLElyoP1uqHuHOWBpqXfNq4KFP6O+I13TQ7MockB3vfgofKVjD+czBtluPbAbrdCQ990Udc8/NOR5mAvIrhHLXDFsOYMcLMP+w5+0NbXSl9S+v4+sXnhQpgflRe++sFjnKZU2VdtFwepfTG5mtxOIIJV8zSWKmMvjayM/xMAfnyDPE4MHttBgXLtuCYkEFbl31+UG6ST -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-scenario-preview-evaluations-scenarios-scenario-id-delete.api.mdx b/docs/docs/reference/api/delete-scenario-preview-evaluations-scenarios-scenario-id-delete.api.mdx deleted file mode 100644 index d3ae6c8920..0000000000 --- a/docs/docs/reference/api/delete-scenario-preview-evaluations-scenarios-scenario-id-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-scenario-preview-evaluations-scenarios-scenario-id-delete -title: "Delete Scenario" -description: "Delete Scenario" -sidebar_label: "Delete Scenario" -hide_title: true -hide_table_of_contents: true -api: eJydVctu2zAQ/BVjTy1AWG7Qk041GgMxkqJB4vZiGAYjrS2mlMiQK7euoH8vlno6dnLoyZI5s4/Z4aoCknsP8RoWB6lLScoUHjYCjEUX3pYpxJCiRsKtT7CQTpmtdXhQ+HuLA6k/9NsBp9LttuGCACudzJHQcb4KCpkjxDDCggBVQAxWUgYCHL6UymEKMbkSBfgkw1xCXAEdbaCSU8UeBOyMyyVBDGUZopAizYDHNvZkmUJdbzikt6bw6DnK1WzGPyn6xCnLTTClTBL0flfqyUMLBgGJKQgLYri0Vqsk9Bw9e+ZUo8qsY+FINRkSUzaktmBVEO7RjSr8GhACUtzJUhPEs1qcSMIZi+P3XZDs/b5r0SOKUmvghi8rITqceXrGhEb1DC7oGMu016Gumfr56upctp9SqzTwJgvnjPt/zVIkqTQ/KcLcnwO0SU5O35JnJEene70ZWpfOyeOo8zvTFAi1gNzvL9msg35D7+UeoQ/2NjSIMVnx6SXZB4uvQ19N6hY3Gt8gb6Pu221cN/K9N+Ob1er+LGAz29OhXoebO+mcwNUhZWZYCOFSUwYxRO1GiEYbIeo3QlSNLF2DAI/u0O2B0mmIISOyPo6iRJsynco9FiSnUkXSqmBkj0npFB0DZX6/vMXjDcoUHcTrzRjwyL5qnHIK64ckrbpF1qzdQPOSMuPU32b87Q7KGhaLooqdCfRWv3kobjK/X4IAbqNRazb9NJ3Baw1PwHwlZBKuRJc7HIN4pULfPwjAPNwHIJT5l+GAK7PGUy6LUbzzkZ2U02tA+Iciq6UKfg/Jq3aWa2hnyblHH4VhL/FzPF5SGwGZ8cTcqnqSHn84Xdf890uJjme2EXCQTsknVnBdQao8P6cQ76T2eFZmvzzgw0N7Rz5OQFwuv5trwUPlivkNBPzC46sPTFgAWeebqkXMkwQtjbhn+4oN1nv/enG3WC2grv8BCcJ8wA== -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Scenario - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-scenarios-preview-evaluations-scenarios-delete.api.mdx b/docs/docs/reference/api/delete-scenarios-preview-evaluations-scenarios-delete.api.mdx deleted file mode 100644 index b323b1a055..0000000000 --- a/docs/docs/reference/api/delete-scenarios-preview-evaluations-scenarios-delete.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-scenarios-preview-evaluations-scenarios-delete -title: "Delete Scenarios" -description: "Delete Scenarios" -sidebar_label: "Delete Scenarios" -hide_title: true -hide_table_of_contents: true -api: eJy1lW1v2jAQx78KuteGUNrSLa/GVqShbVrVdnuDEDqcC3hL4sx2ujKU7z6dHZpQ+iBNWl9QP9ydfb87/7MDh2sL8Rymd5hV6JQuLCwE6JKMn80SiCGhjBwtraQCjdJ2WRq6U/R7Sa1XZ3cZ7EGAoV8VWfdeJ1uIdyB14ahwPMSyzJT0rtEPqwtes3JDOfKoNHwBp8iG9RB5qRI/V45yP3DbkiAG64wq1iAg1SZHBzFUlUqgFnsDNAa3IMApl/H8pgnYmyUW6tZOr36QdM29laGEyRycvmiDtMT24WaJvQ4JQ81R2yjOVOQXbKkLG7IaDYf8LyErjSo5Dt+skpKsTausd90Yg/hXblJXwalJTxWO1mQ6ID54CwEJpVhlDuJhLf4z7s5h88VT7F/h20CpPeGz0eiY4XfMVOIde1NjtPl3gAk5VNkBg0ODTMuDXSy2X1OI549Z1eKoCPXieWCfdbggM83t+in2e9MvZC2uqaX/vKmH0bvl3dd6nvMKRzd2nb5v8Qa6z6dxGfC9VOSPt7dXRwFDbQ+LeuklpbdvBe6jnNxGt/IEAkp0G4ghauQp6shT9CBPEQiwZO7IWF+pymQQw8a50sZRJDNdJQNcU+FwgCrCUkG9YA9ZGeW23mVyNftE24+ECRnfxh2DG+6l0B2HZg+FwVJ9IuZUYM7zSeU22qg/oeQCFOe7CV4Mgrv0uhXS6T3mZUbHwjiH0xTfnKfjs/75xclF/+x8POqvTlPZH8m349N0PMYUx8B9p4pU+xs1ZZj4fHuTqxkIYDIB+nBwMhjC41IcGPPLQulf1j4dvw3iEdgHpCCAcv+swBHm79oNTrbU1uVYdOI9UfmD+zxwdXTvojJD5d+NP33XtMQcmpbgwztfulbseMxdvtGWlQl2uxVa+mayuublXxUZrv1CwB0ahSvGNmeUm30X7OAnbb2meq3p+4fG5lkVqv5Id1gTgsdESirdi7aLTrtfTj9Pb6cgYNV8VnOdsJdBTo9/YwD+hIcc411Y20GGxbpisYghROW/v8eGwIU= -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Scenarios - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-secret.api.mdx b/docs/docs/reference/api/delete-secret.api.mdx index fb5b371864..5daf9cd574 100644 --- a/docs/docs/reference/api/delete-secret.api.mdx +++ b/docs/docs/reference/api/delete-secret.api.mdx @@ -5,36 +5,36 @@ description: "Delete Secret" sidebar_label: "Delete Secret" hide_title: true hide_table_of_contents: true -api: eJx9VE1v2zAM/SsGTxsgxG3Rk08L0AAN2mFFm+0SGAVjM7E6f6gSHSwz/N8Hyh+Jk3a+2BYfJfK9RzXAuHMQreGFEkvsIFZQGbLIuiqXKUSQUk5Mr87HQYFBiwUxWUlroMSCIIIu/KpTUKBLiMAgZ6DA0nutLaUQsa1JgUsyKhCiBvhgfCJbXe5AAWvOZaErJFim0LaxbOBMVTpyknNzdSuvlFxitZESJaFOEnJuW+fBcw+GVsHtzc0l9hfmOvW9BQtrKwsKkqpkKlmwaEyuEx8O35wkNCcFGyvEsO5KSYlR5/KlmQp3CcirZBLF8vBj6ymbdt6qcUWXTDuy0MatGtbQWjyc0PNYdQVKi4Xb/Y/J7+Qc7jwZHeRzqCcjWEm0PZ5dbd4o4YmKa99Xd3SPi4/bHOnt2P28jbuOvo8OGyD3q9XTxYbyqDNR77xDg5fBoQVxVh2t6z3LGUQQ7rHOOdxfh51dXdiMvm1BgSO7H3xd2xwiyJiNi8Iwyas6neGOSsYZ6hCNBnGno6S2mg8+Zf60fKDDPWFKFqJ1fAp4ERt1xpjCRk3Q6AcSivqJmtecVVb/7dTupyrrsoQDXW4rn97TNffFBfOnJSiQNjpyrmbXsys4p2wClgnAxE/AcLYPgzpjYewfFFDh7Q9MWHw7BqQyUzkusDzZ71yhSTEjA0x/ODQ5am9uf3TTS7cGL510du2F6i4rBdHx4okVZJVjATfNBh39tHnbyvJ7TVYkihXs0WrcCGHrBlLt5DuFaIu5o4u6xqsBvjz3E/A1APVxvYOMpWi4x7yWP1Dwmw6T+9EPdzaYpOnj8yQhwyeZF3eRuGl09t3icbFaQNv+A4gm8mk= +api: eJx9VE1v2zAM/SsGTxsgxGnRk0/L1gAN2mFFm/USGAUrM7Faf6gSHSwz/N8Hys53u1ySiI/U4+OjWmBceUgW8IRNwZAqqC05ZFNXswwSyKggpmdP2hGDAosOS2JyktRChSVBAn342WSgwFSQgEXOQYGj98Y4yiBh15ACr3MqEZIWeGNDIjtTrUABGy7k4DFUimYZdF0qBbytK09eci7HV/KVkdfOWKEoCY3W5P2yKaKHAQydgqvLy3PsExYmC71FU+dqBwp0XTFVLFi0tjA6hONXLwntAWHrRBg2PZWMGE0hvwxT6c8BRa2Polhtfi2DZMedd2p3YiqmFTno0k5tz9A53BzIc1f3BKXF0q/+p+RP8h5XQYwe8jk0iBHNJdrt765fXknz0RQXoa/+6gGX7svs5e3V/byN616+jy7bQm7m8/uzgvJRJ0O9Dg6NHrcOLYnzem/d4FnOIYF4LRaP1xdxb1cftzvfdqDAk1tvfd24AhLIma1P4lgXdZONcEUV4whNjNbAKY1JiEY/BApiXU+6cYY3od7kfnZLmxvCjBwki/QQ8Cge611zDNsNDK25JdFvWLdJw3ntzN/eCsPK5X2WCGSqZR3SBy0Hbt9Rv1ElOyp99rTHo4vR+LNmhoRocj8bVgV1WJUtjwADdSLXTihQQGXYE2DC8ts+ICxt7bnE6qDe6SiPSO3UYPrDsS3QhC0IV7fDjBcQZiwdXoSJhjmDgmT/QqUK8tqzgNv2BT39dkXXyfF7Q07GlSpYozP4IuItWsiMl98ZJEssPJ3x2r0h8OVhWJWvEaiP+W5HWsk811g08g8UvNHm6CENr0C+NUw7xCdak+WDzLNHS5y1W4Hr6d10PoWu+wfAZwA6 sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Delete Secret @@ -43,29 +43,228 @@ Delete Secret as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-testsets.api.mdx b/docs/docs/reference/api/delete-testsets.api.mdx index 80b4632668..a65a244b0d 100644 --- a/docs/docs/reference/api/delete-testsets.api.mdx +++ b/docs/docs/reference/api/delete-testsets.api.mdx @@ -5,36 +5,33 @@ description: "Delete specific testsets based on their unique IDs." sidebar_label: "Delete Testsets" hide_title: true hide_table_of_contents: true -api: eJzVVd9v0zAQ/lesewGk0JaJpzxRaKVVG2LaCi9dNbnJtfFI7My+bJQq/zs6O2nSlgF7pC+N7e/O9333wzsguXEQL2COjhySg2UEKbrEqpKU0RDDBHMkFK7ERK1VIqhBipV0mAqjBWWorKi0eqhQzCZucKtv9dhuXHyrG/SdSp14fakcLRzZ5ZtYzDNsTVSKmtRaoXXCrNlddwkZkfoAvNNrpMpq9jsWuXLUwgMk3Zu98mFABKZEK5nILIUYAuyuRUEEFh8qdPTRpFuId5AYTaiJP2VZ5irxtsN7x0rswCUZFpK/SsueSaHjVY8kLxVhEfa3JUIMjqzSG6ijdkNaK7cQASnKed2IL2apg7qDmdU9JtREqSymnKj+XcvORcjSPos1u+nMyFboN1xptAtBn41G/HeY7JsqSdC5dZWL6wYM0b/L8mLm7SWiqbI+gTqC92dnpzF+k7lKfQRiaq2xLwnwMG8pklT5QeCHgNwkB6dSb7+sIV6cEtzvKE24QQv18nnWlyYEyMIUbnMqWAf9jM7JDXYSPg/1Yog5n/6tiJhXuLrB9Sqpkzeo+zyNSZDvd5e1kPP5/OrEYchtgZSZrishglJSBjEMe/3p0D6idV7yyuYQQ0ZUung4THJTpQO5QU1yINVQlgrqJVsklVW09Sbjq9kFbs9RpmghXiz7gBsuipDmQ9heYVmqC2TCWha8HleUGat+htxFoLgas2DFjLjcrruBMv0hizLHkwGxaFPHFaL02nhEI9jYExLjqxlEwNRDzY8G7wYjOB7NB2DuAZn4Hmjj9ccQHSm31wwiwMI3ABDK4kN3wGxK46iQuufvuEePwumNz//70WjST/iDhmUule9Tr+GuqdH9GPYzODOOeG+3Y3ZfbV7XvP1QoeUyXEbwKK2SK07wgpOetQW5g++4hRg+BeHe+uZleF6FAjyaZTxngsU4SbCkP2KXvR6bTC+n8ylEsGpeusKkbGXlE48G+QQx+OeS7X1P+L0d5FJvKh5AMQSv/PsF6wnaHw== +api: eJzVVd9v2jAQ/lese9kmZdBVe8rTaEEqaqdVLdsLRZVJDuI2sVP70pYh/vfp7IQEGNv6OF6I7e/O9333w2sguXQQT2GCjhySg1kEKbrEqpKU0RDDEHMkFK7ERC1UIqhGirl0mAqjBWWorKi0eqpQjIeud6fv9MAuXXyna/S9Sp14f6UcTR3Z2YdYTDJsTFSKmtRCoXXCLNhdewkZkfoAvNMbpMpq9jsQuXLUwAMk3Zq982FABKZEK5nIOIUYAuy+QUEEFp8qdHRm0hXEa0iMJtTEn7Isc5V42/6DYyXW4JIMC8lfpWXPpNDxqkOSl4qwCPurEiEGR1bpJWyiZkNaK1cQASnKeV2LL8apg00LM/MHTKiOUllMOVHdu2ati5ClbRY37KY1I1uh33Cl0S4EfXpywn+7yb6tkgSdW1S5uKnBEP27LG9m3lwi6irrEthE8Pn09DDGHzJXqY9AjKw19i0B7uYtRZIq3wl8F5CbZOdU6tW3BcTTQ4LbHaUJl2hhMzvO+sqEAFmYwi0PBWuhX9E5ucRWwuNQL4aY8Onfioh5hatrXKeSWnmDusdpDIN8v7usgVxMJtcHDkNuC6TMtF0JEZSSMoih3+lPh/YZrfOSVzaHGDKi0sX9fpKbKu3JJWqSPan6slSwP7oG/lScMxQ2M3aXVFbRyvsbXI8vcXWBMkUL8XTWBdxyxYQa2IVt5ZelukRWQ8uC14OKMmPVz5DYCBQHkAUrpsu1eNNOm9GrLMocD6bHtMkrl4/SC+MRtZo1nzOZPKJOIQLWJlA96X3qnRwToDYQg+tx3Swy8c3SxO5hEO1JvBUXIsDCdwoQyuJLe8DMSuOokLrjb7+Z98LqzNn/+3WpS4HwlfplLpVvaK/hui7m7bz2wzozjnhvvWZ2322+2fD2U4WWS3IWwbO0Ss452VMugKwpzjU84gpiOA/CffRdzvC8CsW4N/R4IAWLQZJgSX/EzjrNOBxdjSYjiGBeP4mFSdnKyheeIfIFYvDvKtv7/vB7a8ilXlY8qWIIXvn3C0rh6K4= sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Delete specific testsets based on their unique IDs. @@ -49,29 +46,299 @@ A list of the deleted testsets' IDs. as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/delete-trace.api.mdx b/docs/docs/reference/api/delete-trace.api.mdx deleted file mode 100644 index 18553d5da6..0000000000 --- a/docs/docs/reference/api/delete-trace.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: delete-trace -title: "Delete Trace" -description: "Delete Trace" -sidebar_label: "Delete Trace" -hide_title: true -hide_table_of_contents: true -api: eJydVk1v4zYQ/SvGnHYBNk6DnnSq0aTYdFMk2Li9GMZiTI0tbiiSSw7TuoL+e0FKtiQ7yW57kkzOm4/3ZkZugHEXoFjB0qNUZgdrAdaRR1bW3JZQQEmamD6zR0kgwKHHmph8QjVgsCYoIN9+ViUIUAYKcMgVCPD0NSpPJRTsIwkIsqIaoWiA9y7hAvsUVAAr1ukgpUGz2xLadp3wwVkTKCTI1eVVepQUpFcu5QcFPEYpKYRt1LNPvTEIkNYwGU7m6JxWMpcz/xISphml4XwqllUXQdrYgfrslGHakR+l90u2EFDSFqNmKC5bAVqZp4xHs7/fZloUUx3OAwSHJrH0BgGPDk2uXwykfhdfApDZq01kOkkGy1Kl+lE/TLIZLKbeW3HGwOjIxHozPdlYqwlNPno5FkjlZdTo3/0atf4tWPPDfWQX+X0qpfNiN19IcnbSs/c9KPQe99P0tIbUOweGTrCZ2LOIr4EXA6XtGXDc36ujtiPdRo7ul6TvlHkahf926ne5sV4KfOo2HJu/bZP9T1cvzMqfqFWZJ2F24731/39QSmJUOr290ujaysntf2m19SlFI0Jsl2BisQ67twbjdwoBdzTw/bppJmO2TLffEjnV1YXu7UZqDfR27L5exnVH31vCflguH84cdtpORb3O63m27NdzTVzZYW3nhc0VFDB3np4V/TXnbtHnJ4V5c+jWFgQE8s+HzR69hgIqZheK+VxqG8sL3JFhvEA1R6dyqwaS0SveZ8ji4fYj7T8QluShWK3HBo+plbrmmJoddUGnPlKiqf+mLCJX1qt/OsX7D0vVoRIPymxthh9mNSc3WzzcgoBURkfQ5cWPF5dwStvEOE0ByjwFh9j5GsQJC8f6QQDVeQSACeufh4uUmbOBazQjfycqTXI5EsD0N8+dRpX7O0duevlW0MvXr5e+gbOEINLndVg5lQ2cEE2zwUB/eN226fhrJJ9kWgt4Rq9wk0hbNVCqkN5LKLaoA50ld1wR8O5TPwnvZ8MCniZ9kNIkHZ9Rx/QLBDzRfvwvIc94deiTpr9eSEmOR8CzlZQa6tjh1zd3N8sbaNt/ARyf/NI= -sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Delete Trace - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/delete-traces.api.mdx b/docs/docs/reference/api/delete-traces.api.mdx index 962bdfb943..f65bd36e22 100644 --- a/docs/docs/reference/api/delete-traces.api.mdx +++ b/docs/docs/reference/api/delete-traces.api.mdx @@ -5,36 +5,36 @@ description: "Delete trace." sidebar_label: "Delete traces" hide_title: true hide_table_of_contents: true -api: eJydVE1v2kAQ/StozhYmUU8+FTVIQUmbqKG9IBQN9gCbrr3O7jgqtfzfq9m1wYZ8qD1hdt7MvHnzUQPj1kGyhLu1I/uCa6UV72EVQUYutapkZQpI4Io0MY3YYkpjiMCUZFFs8wwSyLz10VsdRFCixZyYrISuocCcIIHCZPSoMohAScjniuweIrD0XClLGSQb1I4icOmOcoSkBt6X4ujYqmILEWyMzZEhgarycVixFsA3k9FonkHTRKfZ3L+nQ2tRkIopdx/TaM54OGialWRypSkc+RiXk4n8DFV9qNKUnNtUevS9BUMEqSmYChY4lqVWqRc6fnLiU/f4llbawCpkcIxcvcq3o/cQEI0wDhCzfqKUB6osu0Cro+MXozWlHPwPTJtGIn26vDwv7CdqlXnao5m1xv5/VRkxKi1fh3YMAdqkAysW+7uNH7uhDDIa7YsqmLZkoVkdleia3pV8awJBaW/utu/J+pWcwy3BIdjbUC/GaCHWj7ogdYXULa7Xj6O8Qd23y7gK8r2WrINcLxb3ZwFDb3PinTkuuN9s3kECsemfi/jlIj7svrx3i19ZDQnsmEuXxHGqTZWNcUsF4xhVjKUC2RNHaWXl6ojL9H5+Q/trwowsJMtVH/AgMxK6PoQdV7dUNyT1t0dgWvHOWPUntLK9BLvgJQWqYmO8e6vF1JMbTe/nEIGUEcZ5Mr4YT+D0Jg7AMt6Y+vHucnszRCcqHOqHCCj3sw1MmH8+GoRZaRznWPTi9U+wOyVTH/fr7Fa32jD95rjUqPxMe1J1288lDPoptV+IY0i1imBnHAusrtfo6IfVTSPP4aZK2zLlcK17V/UX7Qcn/wV1JSz8Hr6PdgP4Sv5YJXg/D1HXP0kb/KZpSiX3vM4OjEQ5DPPV7Ha2mEHT/AUpU19i +api: eJydVU1v2kAQ/StozhYmUU8+lSZIQUmbqKG5RCha1gNssvY6u2NUavm/V7NrGxvyofaE8bz5ejPzXAGJjYPkEW5XDu1OrJRWtIdlBCk6aVVByuSQwCVqJByRFRLHEIEp0Aq2zVNIIPXWJ291EEEhrMiQ0HLoCnKRISSQmxSfVAoRKA75WqLdQwQWX0tlMYVkLbTDCJzcYiYgqYD2BTs6sirfQARrYzNBkEBZ+jikSDPgh0lxNE+hrqPjbO7f0wlrBSMVYeY+L6M+qcNBXS85kytM7tDHOJ9M+GfI6n0pJTq3LvXoZwOGCKTJCXNiuCgKraQnOn527FP16i0sj4FUyLBD61SAHBfc1vfQQOoIHAkq3+yuBd8HRM39BYhZPaOkAYePXdou5PIQ4sJojZJCpK7DuuaYX87PTwl5EFqlvt3RzFpj/5+NFEkozU/dGIcAbeTAKvL97dqv65AQXqnmjcoJN2ihXh44aZelbfnGhAKZ48xtPiL4OzonNghdsPehnozRgq2fzYP7CqkbXG8eB3oDu++3cRnoeytZC7laLO5OAobZZkhbcxAGrwi0hQRi05eZeHcWd5rB71vBKK2GBLZEhUviWGpTpmOxwZzEWKhYFAqO9WnqraMLhgIfn0NZWpYyjje9m1/j/gpFihaSx2UfcM8LFFZiCDvoQaGukclplGVa0tZY9SfMuZGXbfDi7lW+Nt69Iaqp7ZuQL5izbHWXCpPx2XjyXjONw2h6N2/uQEh/B20dHgbREV0dURABZv4IgFBkXw8GrrIwjjKR9+L1Nd4dF1UdDvHkY9DwRPib4kIL5ZffF1U1g3+EweCZgzN2DKmWEWyNI4ZV1Uo4/GV1XfPrINo8wlQ5sdI92X7B/eCbshO65Cr8wX6MdgP4kv9YxXi/G1E7S04b/KZSYkE9rxMl4ijd1l/ObmaLGdT1X9E4gSA= sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Delete trace. @@ -43,29 +43,295 @@ Delete trace. as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/deploy-to-environment.api.mdx b/docs/docs/reference/api/deploy-to-environment.api.mdx index 21936144cd..eaa77049ca 100644 --- a/docs/docs/reference/api/deploy-to-environment.api.mdx +++ b/docs/docs/reference/api/deploy-to-environment.api.mdx @@ -5,74 +5,326 @@ description: "Deploys a given variant to an environment" sidebar_label: "Deploy To Environment" hide_title: true hide_table_of_contents: true -api: eJzdVcFu2zgQ/RVizqqdBnvSad3GQI3ubo3E24tjGBNpLLFLkSpJpVEF/XsxpGzJTpu21/XFNjnzhnzz5rEDj4WDdAtL/Sit0RVp72CXQE4us7L20mhI4YZqZVonUBTykbR4RCtRe+GNQC1ozL3X93phC5feayHEdGevsaJU/IMVCXMQvqTpLiPloYjwZhaThyJ7maengjIfI2dc7Balo2O5d5vNevmUUTh2KlaxTIwOVQ4olZtBAqYmixy1yiGFGLH3Zj85EiRg6XNDzr8xeQtpB5nRnjfSDrCulcwCwvyTY446cFlJFfKv2jK+l+T43yUJvObbmiAF563UBSTgpVe8MGlDoAr6BEYeXsr8ODC0yjknM1Ul/b4i57AIFVG3Hw6Qbi8R+uS0ohuloN+NmG8Divh7QOn75BhqHj5RdqRIWspZQ88uenb2CW6U08ZMbrvGVhnMoeciI6i3DYUFVxvtIp/XV1f8da7QuybLyLlDo8TtEAzJL3esD2X/uL5+DvwRlcxDmlhaa+xvoF7oICePUvEv6alyzwOUyc52f6FlUnsqyEK/G3uD1mI7UcZfJh6QdVG54iURnTp9BHtBqUyG2PDuz3TB94qlh7jdVLZHeiO7P77GTaTve8WOITz/zwBjbyvypeFZr43jlBp9CSnMJ5p18+gDkIAj+0jWBe4bqyCF0vvapfN5pkyTz7Ag7XGGco61DCPjKGus9G1IWaxX76l9R5iThXS7mwbcsTpiv8/DTlRjLd8TnyKaBSwaXxorv8YmJiBZlmXM4qux7m5Hp1o+YVUr+r7zjH2cusq4eukbo+RA6oMJpxzIXgQOxGK9YjSyLs7L1ez17AouH5CzYJ4fzML8HK8YtiG5IPtEMyRAVRge8ITVn+MGE8AtrVBP8KLBiI0RyzNDPzvUxND/fw/coCVPT35eK5Rh+gO73aD9M792gZyg/l0CJc9IuoWue0BH/1rV97z8uSHLAt8N6nlgHWzZecqj1Dv4j9rwcgRmXwV/4HDVRGlf2CVbWcxYZHytF2N3kzFef7jbQAIPw9NcmZxzLH5h78EvkEJ45Tk7zFpY60ChLpqo7IjJn2+llSM5 +api: eJzdVsGS0zgQ/RVVn73JMLUnnwiQKlIskJoJXDKpVI/dsQWyZCR5GK/L/77VkhM7GZiFK7nEkbpfS69fP6cDj4WDdAtL/SCt0RVp72CXQE4us7L20mhI4Q3VyrROoCjkA2nxgFai9sIbgVrQmHun7/TCFi6900KI6c5eY0Wp+IAVCXMQvqTpLiPloYjwZhaThyJ7maengjIfI2dc7Aalo2O5t5vNevmYUTh2KlaxTIwOVQ4olZtBAqYmixy1yiGFGLH3Zj85EiRg6VtDzr8yeQtpB5nRnjfSDrCulcwCwvyLY446cFlJFfJTbRnfS3L865IEXvNtTZCC81bqAhLw0itemLQhUAV9AiMPz2V+Hhha5ZyTmaqSfl+Rc1iEiqjbjwdIt5cIfXJa0Y1S0O9GzNcBRbwfUPo+OYaa+y+UHSmSlnLW0JOLnp19ghvltDGT266xVQZz6LnICOptQ2HB1Ua7yOf11RV/nSv0tskycu7QKHEzBEPyyx3rQ9m/r6+fAn9GJfOQJpbWGvsbqBc6yMmjVPwkPVXuaYAy2dnuL7RMak8FWeh3Y2/QWmwnyvjHxAOyLipXPCeiU6ePYM8olckQG979P13wvWLpIW43le2R3sjuz6/xJtL3o2LHEJ7/J4CxtxX50vCs18ZxSo2+hBTmE826efQBSMCRfSDrAveNVZBC6X3t0vk8U6bJZ1iQ9jhDOcdawqVbLsKueM2hYZ4cZY2Vvg14i/XqHbVvCXOykG5304Bblk4Uw3nYqQ9Yy3fER4xOAovGl8bKf2OHE5B8gDJm8b1ZlDejjS0fsaoV/diWxiZPLWdcvTSVUY8g9cGEUw6dGCh4hdlX0jkjknWRnavZi9nVzzgbEsRivRoGDbMwaMfrhjBILrpy6gckQFWYMvCE1ctxg8ng3leoJ3jRicTGiOWZ858dbuL8f96bcNCVp0c/rxXKYBOB3W4YkjNjd4GcMCa7BEoepnQLXXePjj5Z1fe8/K0hy2LfDUq6Z01s2aLKo+w7+EpteMUEZv8KRsLhqokyv/BV9ryYscj4Ws/G7ibzvv54u4EE7od3eGVyzrH4nU0Kv0MK4e8AZ4e5C2sdKNRFE1UeMfnzH9QgMcg= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Deploys a given variant to an environment Args: - environment_name: Name of the environment to deploy to. - variant_id: variant id to deploy. +environment_name: Name of the environment to deploy to. +variant_id: variant id to deploy. Raises: - HTTPException: If the deployment fails. +HTTPException: If the deployment fails. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/edit-annotation-by-trace-id.api.mdx b/docs/docs/reference/api/edit-annotation-by-trace-id.api.mdx deleted file mode 100644 index cdaf933438..0000000000 --- a/docs/docs/reference/api/edit-annotation-by-trace-id.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-annotation-by-trace-id -title: "Edit Annotation" -description: "Edit Annotation" -sidebar_label: "Edit Annotation" -hide_title: true -hide_table_of_contents: true -api: eJztmktv2zgQgP+KMacWUONssSef1k27aLbtNkjSXgIjoMWxxYYiVZJKqzX03xdDSpbkh5I4KdAWyiFBpHmQH8nhiMMVOLa0MLmCqVLaMSe0sjCLQGdo/H+nHCaAXLhrtpa4nhfXzrAYrwWHCDJmWIoODRlagWIpwgRaAkLBBDLmEojA4NdcGOQwcSbHCGycYMpgsgJXZKRnnRFqCRE44SQ9uCRDo1MOZRmtrduMqZbxrzmaomN9waTtmGeq+LjwDew6IqPVE5VLCeWscX2RMRU8z4JttO6V5gXZ2+xIrJVD5byrLJMi9qjGX6xW9KxpSGYIrhNoQ7Nqqtvvwti0m844FyTL5NmGlTs7J5TDJZpuf9N598lca4lM+Ue7fUEsTJxLZp79q98L6/6xWr04VVnuntOYBTN6/gVj14t2UxvKh2hfEpkyghQd+3kJ/Z1LeRcf4TC9nxIzhhW9VLqqDyP6gUiWEXBWER047uXYSL4mWuUOgSY6XAWkLfNNqH3DhbtTvRUh9ho5D7EJypKsGbSZVjYM2MvjY/rD0cZGZCHQwEUex2jtIpej80oYDg5hsc6D0sb4N4098RIRcFywXDqYHJfRRuRr5tWGcYPMIb9mrm/2RbDQJiUZoo0vnEixd4hPgtnR1A9vnvEf4eRTMFs54SjxBzh5HcxWTmpc84J2x/v5yXPB7wXrVeE3w4bXk3qpaa291MCe1EuNa+2lziQemyJETcZzoKkm0YlAG7EUaldahCpPKSzEuXU6hQiSPGUKImC50+0IcSHSTKI3+jFYay3AWr2M4EYo3ueI8UTH9P8tk5TtSVbscfOOLLWdBFWalglTCmWfG+1kBhF8wzlEYPkN9SgTezydVPY6zjLhR+FXSZo+5u4xWVNQ/63Tpj5C+/f7La0HbPiHQP0lMqefB+Vm8kTpygINqjhg6m7/4cOuJz+4RWO3Uoj7x9zPlTptBDJfHrwLkG4ZwdPtU+F7dy+785rZDiNlFLBd3zIjmHIDvsPwGbwV23AGfnfzc2idxWHiHQpuWLmPBTis3UMJtr78B3iPgDes4aeAOKzjQynS53rOnDYDuoPRDWv48QiHFfyYXCZmFgdyDyPXo9c6QjxvTh3KCKRQN/c8NuwOwM94fNwD4L1QN7uPt6pToN+rf9V51awrYO9XsuucTNVTZGcJ7oGzsFFcF99C4e7Ply+3a3WfmRTcS4/eGKPN4YU6jo4Jfwi/Z7CljjtvH3JkOduk3mKu4xoTpHbZd9njA1rLltgM4X5RD2N0SW/vGk7pCxjkupJrh8A13kB3fzdeB3x9I/v28vJsy2AY2+6gUtF21JpA/kw+0TxclIkTf63GJTCBcUY7KH4bN/VSO17Vi6mkYgma2/ryTW4kTCBxLrOT8TiWOudHbInKsSMmxr5EMiONODfCFV5lenb6Dou3yDgamFzN2gIXNJPC3OiKrYeFZeIdEqXqYs40d4k24r+6W/56ThK0CAPN0fPmJs2b74wi8vZNmKqM0xQrmhN2j1OohfZy9ZrynRxNz04hanZFOD764+gYNul3hGkxsdgvproP/jVEGzTXHKlqlfqVBA5Z+lfzglqWaeuoItfY2x7sTnPWLB1+d+NMMuFXine+qqbBFVTTANqFcwpLk3VcnUWQaOtIeLWaM4ufjCxLelydol+tgAvL5rJ1QeoGi851KsrbqC1+nvj0d058d6ludGIdlODZebX2no+a0kG3c/XsUUXbZ92cdZd8VEnqqbmqXp8ETy/82m/Ut0IhhamgMY1jzFyv7Ky1BM+mlydvIYJ5ddcr1ZyUDCP89Nu3VWdhDOgyGD1bgWRqmVP4mkAwSj//A9Jcbqw= -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Annotation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-annotation.api.mdx b/docs/docs/reference/api/edit-annotation.api.mdx deleted file mode 100644 index 78b1ad538d..0000000000 --- a/docs/docs/reference/api/edit-annotation.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-annotation -title: "Edit Annotation" -description: "Edit Annotation" -sidebar_label: "Edit Annotation" -hide_title: true -hide_table_of_contents: true -api: eJztmlFv2zYQgP+KcU8twMZZsSc9zU07NGu7Bknal8AIaPFssaFIlaTSeYb++3CkZEl27MROOrSF85DEEu+O/I48nnlcgOczB8kVjLQ2nntptIMxA1OgDZ9OBSSAQvprvmwBDApueY4eLQkvQPMcIQFveYrXUgADqSGBgvsMGFj8WkqLAhJvS2Tg0gxzDskC/LwgOeet1DNg4KVX9OCSFA1OBVQVW2p3Bde7KOd6/nEautc3QyrrJ7pUCqpxa/ii4DraHUfV6PwrI+akb9VSarRH7YOpolAyDXCGX5zR9KztSGEJp5foYreWHNfeRW90u86FkNSWq7MVLfcOTmqPM7T98eaT/pOJMQq5Do/utgWptGmpuH32t3kvnf/LGf3iVBelf04ei2rM5AumfivaVWmodpG+JDIVgxw9/3EJ/VkqdR8f6TF/mBC3ls+3UumL7kb0A5GsGAheEz1w3MixbfmaaFV3NGijw1VE2lHfBtc3Qvp7xTsRYqOS8xiboKpIm0VXGO2iw14eH9MfgS61soiBBi7KNEXnpqUanNeNYe8QlpoyCq34v+3sSWjBQOCUl8pDclyxlcjXzqsV5Ra5R3HN/bbZx2BqbE5tiDa+8DLHrS4+iWoHo+DeshDfw8inqLY2IlDhdzDyOqqtjTS4JnPaGx9mpyyleBCsV/OwGba8ntRKQ2tppQH2pFYaXEsrTR7x2BSBtfnOnqraNIeBsXIm9V1JEeoyp7CQls6bHBhkZc4pCeOlN90IcSHzQmFQ+jFq6yzARrxicCO12GaIi8yk9PmWK8r1FJ9vMPOONHWNRFGalhnXGtU2M8arAhh8wwkwcOKGRlTIDZZOan09Y4UMXvhZkqaPpX9M1hTFf+m0aRuhzfv9mtQOG/4+UH+KzOnHQbmaPFG6MkWLOo2Y+tv/1xLtfFt+cIvWraUQD4+5n2tx2ghUOdt7FyDZisHT7VPx2+5GducNszuUVCxiu77lVnLtD/j2w2fxVq7DOfC7n59H5x0eJt6+4A4r97EAD2t3X4Kdb/4HeI+Ad1jDTwHxsI73pUhf10vujT2g2xvdYQ0/HuFhBT8ml0m5wwO53chtkescIZ63pw4VAyX1zQOPDfsO+BGPj7cAeC/1zd3HW/Up0K81vvq8atxv4B5WsuudTDVT5M4S3I6zsBVcFt9i4e73ly/Xa3WfuZIitB68sdbY/Qt1Aj2X4RB+g7OVSXtvdzmyHK9S7zA3aYMJcjfbdtXjAzrHZ9i6cHPTAGNwSW/vc6cKBQwyXbfrhsAl3kh38zBeR3zbPPv28vJsTWH0bd+pVLQdjLp3aHL0mRHxJkuahUs1PoMEhgXtoPht2NZL3XDRLKZquKhXaEVlE7S3zSWc0ipIIPO+cMlwmCpTiiM+Q+35EZfDUCwZk0RaWunnQWR0dvoO52+RC7SQXI27DS5oTsVZ0m+2dBAv5DskXvUFnVHpM2Plv80AwzWdLEoREJqt5+2dmjf/cIrN63di6oJOW7Zoz9oDWKmnJrRrVlcY5GB0dgqs3R/h+Oi3o2NY9UOvMS0rnoZl1YwhvAa2QnPJkepXeVhT4JHnf7QvqGeFcZ5qc62+dbf3urNk6fEfPywUl2HNBOOLekJcQT0hoFtCpwCVdC5cJU3cHjPIjPMkt1hMuMNPVlUVPa6P1q/GDEKaOyF6VwsQ0tH/ApIpVw7XurgMPvDsvF5jzwdtiaDf9WZuaJoYlBPSJ2Bwg/PuDTEKKP+j3QZOCFpZM98X9duTaOhFCC2t9FqkpU5HiVGaYuG3th13VvjZ6PLkLTCY1FfJciNIyHLyKf0OXTVFdCzdNaNnC1Bcz0qKjglEpfTzH7UPiSI= -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Annotation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-evaluation-preview-simple-evaluations-evaluation-id-patch.api.mdx b/docs/docs/reference/api/edit-evaluation-preview-simple-evaluations-evaluation-id-patch.api.mdx deleted file mode 100644 index 50bda0b140..0000000000 --- a/docs/docs/reference/api/edit-evaluation-preview-simple-evaluations-evaluation-id-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-evaluation-preview-simple-evaluations-evaluation-id-patch -title: "Edit Evaluation" -description: "Edit Evaluation" -sidebar_label: "Edit Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJztWltz00YU/iue8wQzchwChFZPNUkYUmhJk8BLxuNZS8f20pVW7CXF9ei/d86urpbtOAFmmMY8AF6d66dz9XoJhs00hDdwdsuEZYbLVMMoAJmhcp/OYwgBY27GWFGMM4W3HP8Za55kAhtP9LhJxuPxOGMmmkMAGVMsQYOKtC0hZQmS4CYxBMBTCCFjhjgUfrFcYQyhURYD0NEcEwbhEswiI2ZtFE9nEMBUqoQZCMFaJ8VwI4ig9ql3HkOej7xQ1Oa1jBckaVVHJFODqaFHLMsEjxz34LOWKZ3VJmSKEDIcNX2q3eg+mwqH8BJYuvgwdc63CbgeR0JqMqJJVDg5kVIgSyEPqqPUCgHkTOnnue6deAl5QOIEv8VvEfae+L0oFplvFDb0EvI8KKnk5DNGZu17urTpG4dXV2geQIKGtU1hccyJj4mLFqYdY4tYaYjlqcEZqramZNI+afq4XhdEXEVWMPXkjRXidy3T/nmaWfMUVv0lGdxgshsTU4ottmLbZoUOvtt4/yAkiaMTmz8Ton/K91ybuzDd5OMq9/0QuvZRWBSqnfzvWkC8eQAx6kjxrKwPDxF12hBBmbm+WGyoiFsz1BWNW1T6G6z7VLCTr2w1R9vVThtm7NaICgBTm1BPyjCN/ckXixaptCubpv5I2yhCrclZxoVVSIxKSUVHEUsjFAJjGK0rM1feiLVF5otFtRhrg9mKlUXu3g12N4U3JdUmxyOrjUwggLlNWAoBMGskkHUFmAsKLd9eNijfIcT/Ik97V85TYkRtNJpH4fq197V2vtHtHwUAw9rfGoRijJHqUUBwVnpbA6AwQ2bWV6e13W1F5GXBv23YuXIzc12LTplrxZ1KdA8RZzE3a3XW4+1Nc0YdbRd16WdkyPPcYaIzmWoP99HhIf3Tamhw5Svx1IreZUEMDx6lI2k90wrstcknjoK66pRZYSA8rEO308P2s/jjnsU/WPOAYbzDdY9p3PP+z8fxbbDuMI8/BKOfeyCPFDKD8ZiZHQfzmBnsG+7s2azlxIvtDR1YNot/hJKPXmyhJEaBP0DJqRdbKCnhmizG32+VKcF6vej5rabE67tqKdGqtJSAfVctJVyVlv3Gt9/49hvffuPbb3z7jU+uG/Tvw16taX7Fe3F01N3qPjHBYx8uZ1RkH77SxWgYF269KiOqTSBk1Hp6n+F2tBp+tdfvZVSCBYmerYu/egDXms2wDqfNpA6M3jU9vWvlJr+86oKu2UAreD26m9049fBte79vr68vOgL9u22/VFrve40wcnvcXMb+1q24qDNzCGFQ3PEN/B3foHHHN1i2ru1yas2obsurPasEhDA3JtPhYBAJaeMDNsPUsAPGByzjLoE0RlZxs3Asw4vzd7h4iyxGBeHNqElwRVHl46RNVr0ilvF3SIgVl4pDa+ZS8X9LF92l4txzESQUr5f1PeDZV0Yedu/xqm8LGt8K+GvCaq+vPpa7OR3U23G90lWLSx1Q7TdTHdOgB8+n7JeX0+MX/Zevnr3qv3h5fNSfPJ9G/aPo1+Pn0+NjNmXH0BjiGlKLaaycutojVT3n3OymY9SZEnZnXNNhd2fudKbdWauafugygKdT6aKlbIQuFnvDi/MWgocHzw4OO6+lRUz1j0Wu/pWh5h5DsBL0VbhTi0tc8QODLPmtfkCWZVIbane1vG5+rqyqRcgb/GoGmWDcFTenfFlk7g0UmUtp6XIXml+P0awctq/dRwHMpTbEulxOmMaPSuQ5HbuIoYQM4JYpziYE4M0SYq7p/zGEUyY0dqysGgU8uSzq4dNe/WVB2/oyi1NKYTKMPkEAf+Oi8wsBV+7nZZ1YFjQnXl3fFeVaRqdHUf/wHMMowsxspR01auPF8PrkLQQwKX42kMiYmBQjkOlvZ7DMPMD0uwI6W4Jg6cxSXwnBC6U//wEZ3XVy -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-evaluator-revision.api.mdx b/docs/docs/reference/api/edit-evaluator-revision.api.mdx deleted file mode 100644 index ce7f77626a..0000000000 --- a/docs/docs/reference/api/edit-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-evaluator-revision -title: "Edit Evaluator Revision" -description: "Edit Evaluator Revision" -sidebar_label: "Edit Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWVFz0zgQ/iuZfTpmnKYUKHd5utKWoQccndJyD51MZ2PLiUC2jCQXchn/95uVZDuOk5CEZCZzdzwAsXe/1X67Wq1XUzA40tC/h8tHFDkaqTQMApAZU2i4TK8i6AOLuHlgpcCDYo9cc5lCABkqTJhhijCmkGLCSL4l+sAjCICn0IcMzRgCUOxrzhWLoG9UzgLQ4ZglCP0pmElGINoono4ggFiqBA30Ic8tiuFGkEC14s6Nt9K5iqAoBg6cafNKRhNCnLcVytSw1NArzDLBQ+tq77OWKT2rl5IpIsJwpunXAgZaMrGwfE4B08mH2JLSFOD6Icy1kUlTyDs9lFIwTKEIqkdpLgSQU6XfV7pz7hCKgOCqZf0MYkWmBx3nCaY/A/jGAhRFUArJ4WcWmkXxe205a+MVASTMYHMVGEWcooXiusFra50+f2ZgeWrYiKmmpWTYfDLr3mJbEHIV5gLVL69zIf7QMu1epVlunsC8r4TBDUvWU0KlcLKS1qYqtLhdpfuemCSNVn4eEqN/yndcmx9xuszHee3NGLp1WeiL2Fr+t1dAukUAEdOh4pnxNWIbqIsZCNqT0Sqg+Sq5cnNG623LsqpeRtws1KjL6v2i2jj4AeaNK9JQFASumM5kql3qnRwf0z8NFuFjHoZM6zgXnRsvDFvX8lDmTmkuk+s1n1sJCmWMuTDQPy6CJUfAslpfSz+i4piah91FsT79Pjlse/gF8E2qL7GQ3/Zg8i8PPWex9nIf3s15tQdvnIXd09VkCZXhMYa7NHDmIUsLuRkvaQK2AXdoVMvQrKyHM6gk2jXc1sAVlY0A7eGuNY62rrXvvXoR/N91/Se7rg+52aLtamlt0Hc53X9547WK1jU6r204OuzWK1QMDYse0Oy0DJ472M6ZJSvPon0YuXOw3kjEBNuDkQsH642UdA0nOzzrSrJeTfxpV/K1UyslW5WVkrCdWinpqqw8MtVuJddP109evQhAi3y0LcxH0t35l4btH3DV2bw773PFt0W5U9whiO0RBCGMGUZ2HLZZpd8XJYeXECt6kxsWM8XSsFFtyoUONjpR3vgwFOVkcd2IHNCZfJCNzgYx+OiJp44Ss4yn6zZA8xRv0m2Vhmzg6RDfOvuddtEcch9q/3aQubJc+bqmlALF1CMP2TrsugH+BjnooQs7KYr5KHf3Gvuwdd4wsNGM7QLtR0LrW2wTjJ/Vr4ZqbiD3/OSkPYP7hIJH1r/OpVJSbT+Ai5hBbg9bn5XzAkKGjbeb7KqZs8Ilcu32Oxli2dgnerTowmnBgMGJLBe1ZHRu6e2PJqXklzPt5Rojo5Jex+5yNy4cfasC/Ob29roF6GLbDCoNYzvt2zSwg4CxpBtA2uCBu7rrQy+j4Sf71qtmILpXjkN1b7rw9q8At83Lm0LbaMHYmEz3e71QyDw6whFLDR4h72HG7c7SLMwVNxOrcnZ99ZZN3MEO/fvBrIA9alzeNMWqkGHG3zJi0N9RuvkW/9slg7+bdM2bZZXy96a+Rrz8jkkm2PJrwGoENTNqcgWkOSyqnvlZD/2uRy71nKD6Gq6TrRm16jG1Z/Asxl9fxKfPuy9ePn3Zff7i9KQ7fBaH3ZPwt9Nn8ekpxnhq/eJpLC0t5ZzPkt45u76CmQ8ROD56enTcstkQpo2Pod34Jaf2NQRz0a3iCgGwxO56MAyT3+sXtLJMauPHXx5veWLOfeT7GBv23fQygTyd6eVd0t6DT1qYGVhruzV94kIA/cUX14MAxlIbAplOh6jZnRJFQY+/5kxRcg78/HhIlN5PIeKa/h9BP0ahWWu9Vc2EX258aXjSqQ/fph9lAqeUvbRA+gUBfGGTpXfttgKOy60y9bLnzmzX1qkaq1W2qaQ6jbMwZJlZKTuYKRPXd7cQwNBfuycyIhWFRDr9bZctLQt2q9hnUxCYjnI7CAYHSX/+AV4UOQ4= -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-evaluator-variant.api.mdx b/docs/docs/reference/api/edit-evaluator-variant.api.mdx deleted file mode 100644 index 5e16c872c4..0000000000 --- a/docs/docs/reference/api/edit-evaluator-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-evaluator-variant -title: "Edit Evaluator Variant" -description: "Edit Evaluator Variant" -sidebar_label: "Edit Evaluator Variant" -hide_title: true -hide_table_of_contents: true -api: eJztWN9T20gM/lcyempnHEKhpXd+Ogp0yrW9MpT2HpgMo9jrZNu1190f0FzG//uNdtd2HCcpUDrXuTseILGlT6tPWkloAQanGuJLOLlGYdFIpWEcgSyZQsNlcZpCDCzl5orVAlfXqDgWBiIoUWHODFMEsYACc0biq5JXPIUIeAExlGhmEIFiXyxXLIXYKMsi0MmM5QjxAsy8JAxtFC+mEEEmVY4GYrDWoRhuBAk05x189EYGpylU1dhjM21eyHROgKumElkYVhh6hWUpeOL8HH3SsqBn7UlKRSwYzjR967vfE8mE43IBWMzfZY6RrgDXV4nVRuZdoeDyRErBsIAqah4VVgggn2qvT/XgyCNUEcE1p/oexIbKADqzORbfA/jKAVRVVAvJySeWmHXRe+k46+NVEeTMYPcUmKacgoXirMNr75whe5ZgeWHYlKmupXzSfbLs3npbkHCVWIHq0UsrxO9aFsPTorTmMaz6ShjcsPx2SqgUzrfS2lWFHrfbdN8Sk6TRy8+fidE/5Buuzbc43eTjqvbdGLrwWRgq2K3875+AdKsIUqYTxUty9b5Qx0sQdCfTbUCrNXLr5Uxvdy1DTT1JuVmr0BbVyzWVcbwd8dwXaKgqglZMl7LQPu/2dnfpT4dCeG+ThGmdWTE4D8Jw7zqeSOuVVtK4PfKRk6A4ZmiFgXi3itaX/011vhV+uMi1/Y5iGMGNVJ8zIW8e0MSfATJYQGV4hol5QAuHATJY+L9h/hcb5jtr7tExe1p3aJle91/eM7fReoumeR+Ofu6umSiGhqVXaG5ZvlI0bGi4O89mK0cednDoyLJl+iOMfPCwwUjKBPsBRo49bDBS0zWZP2DBr8l6MQ8lv+brQa3UbDVWasIe1EpNV2NFCzu9b66+J91/crRb10LuoN4MYn6Ie7q315/bPqLgqZvKBidKSXX/oS1lBrlwE4FvEKsCQiadt3epxeNqpae0Xr+R/oAUqVxP1+0n2n6hNU5ZW0A3izoyBhf09luzNfnlTQe5pYC39Hp2N7tx7OnbFt9XFxdnPUAf225QaYAf9JYv4KaPmaRtEbWRyC96YhiVil1zdjNqBi89ChO0Hi3WbYoqiEAzdV0vlawSEMPMmFLHo1EipE13cMoKgzvIR1hydws0S6ziZu5UDs9OX7P5K4YpUxBfjpcF3lOK+aTpijXxwpK/ZkRfWGcdWjOTiv/lMyHssWZei/ih5D1vd04nXzEvBdu4M2qG3qXh1m+muuNp8yxMl/S9HfLayaTpv22idSPWPKZaA/sZ/vIsO3g6fPb8yfPh02cHe8PJfpYM95JfD/azgwPM8MC5xYtMOlbq2d1xPjg8O4UIKDoefXfnyc5uz2ZHmC49Js75mlL3GqKV4DZhhQhY7m48GIb5b+0LOlkptQkDd8DbmJQrU0WIsGFfzagUyN3FdmdYhIS9hJCwsPQ/nyaPQ9JCBPHaBec4gpnUhiAWiwlq9kGJqqLHXyxTlJjjgDIhPi8XkHJNn1OIMxSa9U7bFEt4dB5qwuNBO991vaiTt5i7wwpL3yCCz2y+aSXrKt+sviWLIHrkrQ5dfWqheuWaSqnXOEwSVpqtsuOl+nD24QIimIT1bC5TUlFIjNNvd2rpSHDXxD1bgMBiaqnAxuAh6edv53jQ6Q== -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Evaluator Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-evaluator.api.mdx b/docs/docs/reference/api/edit-evaluator.api.mdx index c4d977e4e4..08a61b04ff 100644 --- a/docs/docs/reference/api/edit-evaluator.api.mdx +++ b/docs/docs/reference/api/edit-evaluator.api.mdx @@ -5,67 +5,978 @@ description: "Edit Evaluator" sidebar_label: "Edit Evaluator" hide_title: true hide_table_of_contents: true -api: eJztWG1v20YM/isGP7WAHKdJ6m76NDdJEa/dGuRlXwIjOEuUfd1Jp95LVs/Qfx94pxfLil3HS7FiaD4k0Yl8SD7k8ahbgmEzDeEdnD8wYZmRSsMkAJmjYobLbBxDCBhzc4+VAASQM8VSNKhIdQkZS5HEKol7HkMAPIMQcmbmEIDCz5YrjCE0ymIAOppjyiBcglnkpKuN4tkMAkikSpmBEKx1KIYbQQK1f71xDEUx8ZiozVsZLwho3UQkM4OZoVcszwWPXDyDT1pmtNZ4kCuK1nDU9NSE2XmVCMfVEli2+Ji4yNsCXN9HVhuZtoXKEKdSCmQZFEG9lFkhgGKpohzr3qlHKAKCa3mzL2JNXQk6tynL/g3ghQMoiqASktNPGJnHsvXOcdbFKwJI0bC2FyyOOSWJicsWrx0/y2pZgeWZwRmqtqV02l5ZDe9xWxBxFVnB1It3Vohftcz64yy35iWsx0oY3GC6mxJTii220tpWhQ6323R/IyZJo1Of3xOjv8sPXJuvcbopxnXtpzF046uw7FQ7xd/1gHSLAGLUkeI5hbov1NkKBO3JeBvQek/cujnj3bbleczNo5JNF71baYWTDRBXvgVDURCWQp3LTPsKOzo8pD8tsuDaRhFqnVjRuyqFYe9OHUnrldYKtvH11ElQxhJmhYHwsAhgQ0v90ep/tPqP1uzR6ztaT2j2Xvd/3u230bpDu9+Ho++730cKmcH4npkd+37MDPYNd/5stnLqYXsjR5bN429h5NbDlkZiFPgNjJx52NJIRdd0cf98J2VF1tuF+6Bo+HpWKxVbtZWKsGe1UtFVW9HCzvat1WvS/U+GksfOjl306lHCjyEnR0fdyeMPJnjs5oreuVLuI3bPsSNGw7hwM4A/EtYFhIxab5/SfSfF2inShPtBegcpN6mePfbt3JwQWrMZNi1zs6gjo3dDb782DlJc3nQpt5Lihl7P7uYwzjx92xJ7cXNz2QH0uW0nlUbQlZHHzRlzSTcWdGAE/vIhhEGu8IHjX4N6xNKD5eplRQEBaFQP1X2GVQJCmBuT63AwiIS08QGbYWbYAeMDlnNX3hojq7hZOJXR5fg9Li6QxaggvJusClxTJfnaaIvVaWE5f4/EUnmTMrJmLhX/2ye8vEqZey2igWr0qrn+OP/C0lxg5/qinmJXplV/OdKeN+u1clyk52Zqa0aN+kBt6qidkHqZmgccJ+yn18nwpP/6zas3/ZPXw6P+9DiJ+kfRz8PjZDhkCRu6cHiWSMdGWQAjx3VvdDmGACgrHv3w4NXBYcdmS5j2NIvcnq6odK8hWEtqnU4IAFO3ocEgS39pXpBnudSmnKBLvE7NrY0HZUYNfjGDXDDu9quzvSzr8Q7KeoSVjxENAYStC7RJAHOpDckvl1Om8VaJoqDlzxYVVd0kgAemOJsSaXdLiLmm/2MIEyY0dlyrGx68uCr39cteM5W1Xa4qM6OyJL/oCQL4ExfrV32ua82r0l+WIqfeWt/1lgai02qpDXqNURRhbrbKTlb2+OXtDQQwLa//UhmTimJEK/123koXvNsDbm0JgmUzS80xBA9JP/8Ab4Uy9Q== +api: eJy1V1tv2kgU/ivoPLWSCYSEZNdPSxKqZrvdjXLZlTZC0WAfwzRjjzuXtCzyf1+dGYNtDAmN0jwQOHOu35zbLMGwmYbwHsZPTGiYBCBzVMxwmV3GEALG3DzgExOWGakggJwplqJBRVJLyFiKxLbieOAxBMAzCCFnZg4BKPxqucIYQqMsBqCjOaYMwiWwbPFX4rSYRU5atFE8m0EAiVQpMxCCtTyGItjkKCYBGG4EkcYr053LGAo6IYuozZmMF2Rm04FIZgYz4zzIc8EjF23vi5YZ0Sr/ckVYGI6aflUgtI48CLsDqgWQWSEa7v9JskUAMepI8Zxcea2qi5qKIoBIITMYPzCzJ9gxM9g13Pmz28q5V9sZGTJi8/hnGLnzaksjMQr8CUYuvNrSyAqu6YJy+HXpuROss4XLzgqvN7WyQmttZQXYm1pZwbW2ooWdvTZXb0i2CODt3PM+JcL1sy0q5fQLRgYqgX+kekyE/PbBibRVFwGkaFjMzEa3YnHMqciYuGq0gT1w4JnBGaqmtXTapEylFMgyR9puCyKuIiuYevfBCvG7lln3MsuteU/hNcIlHdxgup8QU4otnkW5KUqIt+3tkv28QpMytIXqS9d04SVbt9RyYctogG1c1Vy4rzX3bZPl2g8UKArSo1DnMtP+zgf9Pv1rdG+4sVGEWidWdK5LZnj13Imk9UIbKVRrMo6jCJoj6mVka/DsBWsdMO/VdrDKiD1ax4NBG6C/meCxC78zVsrtFa9EJ0bDuKBvZZZvMggZNU5/pEgnxUZlVOH+Ib2DBHuqZ7X7WbeuKu21ZjOsamU3qwOjc0unL10AxeVNl3y1u6jg9ejuDuPCw/dcEX28vb1qKfR327zUccxNZ1xbFVM0c0lLJHWKwO+DIfRyhU8cv/XW2ap7y/r+WEAAGtXTasW0SkAIc2NyHfZ6kZA2PmAzzAw7YLzHcg6bnozcaeecWF0H0hhZxc3C6RtdXX7CxUdkMSoI7yd1hhtKM584Tbb1nbGcf0KCsNx8R9bMpeL/+WwoV9+5lyKMKIGvq4V0/J2lucDWQllqW2dEM6A1ub7TwaA/GHb7w+7h8PbwKOwfhsPjg/7x6b/QXMue46tvVs/xbSxHcJSwX4bJyXF3eHp42j0engy606Mk6g6iX0+OkpMTlrATaG07+4ptrC/7ivl9pALrR2TXewPXD5HVRqar5wLXtfdPRZvblGX+d3NRqA03ymIeoSdGMkv4zPq3FZFcCfEskS67ymorU/eMRY+Y0VOKysAnQf/g8KC/K9dLgc7o6rJspiwytcTybHQljWpa1xEEgKnrpGCQpb9VB+RlLrVx4a71tYp94/1SVovB76aXC8Zdo3S2l2UjuIeyEUBtcGkIIGw8JicBzKU2xL9cTpnGOyWKgshfLSqq6EkAT0xxNiUA75cQc03fYwgTJjS2XFtPGnh3XTbU951qB2q6vKr6jEqe/KJfEMAjLjafvW5czFdtZVmynHtrXdfUKxWtGUfzx0uMoghz8yzvpNZcr+5uIYBp+dhNZUwiihGs9Om8lS54l9+OtgTBspmlqRSCV0l//wNBMmdw sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Edit Evaluator - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + evaluator + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + evaluator + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/edit-invocation-by-trace-id.api.mdx b/docs/docs/reference/api/edit-invocation-by-trace-id.api.mdx deleted file mode 100644 index 6089ca766f..0000000000 --- a/docs/docs/reference/api/edit-invocation-by-trace-id.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-invocation-by-trace-id -title: "Edit Invocation" -description: "Edit Invocation" -sidebar_label: "Edit Invocation" -hide_title: true -hide_table_of_contents: true -api: eJztmktv2zgQgP+KMacWUONssSed1k27aLbtNkjSXgIjoKWxxYYiVZJKqzX03xdD6mnHiuOkQFsohwSR5kF+Qw4pDtdg2cpAeAWn8lZFzHIlDcwDUBlq999pDCFgzO01bySuF8W11SzCax5DABnTLEWLmgytQbIUIYSOAJcQQsZsAgFo/JpzjTGEVucYgIkSTBmEa7BFRnrGai5XEIDlVtCDSzI0OY2hLIPGusmY7Bj/mqMuetaXTJieeSaLj0vXwL4jMlo9kbkQUM5b1xcZk97z3NtGY1+puCB7mx2JlLQorXOVZYJ7VNMvRkl61jYk0wTXcjT0X0t1+52PTbfpLI45yTJx1pPco3NcWlyh7vc3XfSfLJQSyKR7dLcviLiOcsH0s3/Ve27sP0bJF6cyy+1zipk3oxZfMLKDaDe1oXyI9iWRKQNI0bKfl9DfuRD38eEW0/2UmNasGKTSV30Y0Q9EsgwgZhXRkeNOjq3ka6JV3iHQZocrj7Rjvk21b2Ju71XvZIidRs59boKyJGsaTaak8QF7eXxMf2I0keaZTzRwkUcRGrPMxeS8EoaDU1ikcq+0Ef+2sSdOIoAYlywXFsLjMtjIfO242jCukVmMr5kdGn0BLJVOSYZo4wvLUxwM8Yk3O5m58OZZ/COcfPJmKycxCvwBTl57s5WTGteioNVxPz95zuO9YL0q3GLY8npSLzWtxksN7Em91LgaL/VO4rFbhKDd8Rxoqt3oBKA0X3HpJ241ZyDKjVVpm8ia3qPMU8oUjUCSp0xCACy3qps0LniaCXR+PnoHZQA3XMZ9RyxOVDTgp36Pt0zQ/k+wYoeXd2SbhmXCpESx4SbjA06UFRkE8A0XEICJb6g7Gd/h56SyT1H4VTZNH3P7mF2TV/+tt01DhHav91taD1jwD4H6S+ycfh6Um5sn2q4sUaOMPKb+8u8/7Ab2B7eozdYWYv+c+7lSp4VA5KuDVwHSpT3Nk61T/nt3J7vzmtkdRsrAY7u+ZZozaUd8h+HTeMu34Yz87udn0ViD48A7FNw4cx8LcJy7hxLsfPmP8B4Bb5zDTwFxnMeHUqSP85xZpUd0B6Mb5/DjEY4z+DF7mYgZHMk9jNyAXufI8Lw9dSgDEFze7Hls2A/Az3h8PADgPZc3dx9vVadAv1f/7j+veu8Cv1cJr3dSVQ+ZO0tyDxyVrWJTjPOFvD9fvtyu3X1mgsdOevJGa6UPL9zFaBl3h/I7gi9U1Hv7kCPM+WYUOsxbTJCa1dDljw9oDFthG9Ldog7G5JLe3hdO4coX5LqS66bEBq+nu7sbrz2+oci+vbw82zLoY9sPKhVxJ50B5M7oExX7izNR4q7Z2ARCmGa0ouK3aVs/NdN1PblKKpagvq0v4+RaQAiJtZkJp9NIqDw+YiuUlh0xPqWCCk0Gg1GuuS2cyuzs9B0Wb5HFqCG8mncFLmgk+bHRF2vCwjL+DolSdVFnlttEaf5f3S13XSfxWoSBxuh5e7PmzXdGGXr7ZkxV1mmLF+2Ju8PJ5VI5uYr8zHVyMjs7haBdJeH46I+jY9ik3xOmycQiN5nqPrjXEGzQbDhS1Sp1MwkssvSv9gW1LFPGUjmutbcd7F5zGpYWv9tpJpiv0znn62oYXEE1DKBbSKe0FDZ5dh5Aoowl4fV6wQx+0qIs6XF1qn61hpgbthCdC1M3WPSuV9E+jtrixonbDi+I712qG51okhI8O6/m3vNJW0rod64ePbLo+qyb03TJZZWkHprr6vWJ9/TCzf1WfSsVUpryGrMowswOys47U/BsdnnyFgJYVHe/UhWTkmaEn367tqrMx4Auh9GzNQgmVzmlrxC8Ufr5H3pBdAE= -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-invocation.api.mdx b/docs/docs/reference/api/edit-invocation.api.mdx deleted file mode 100644 index 2377bf8f2a..0000000000 --- a/docs/docs/reference/api/edit-invocation.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-invocation -title: "Edit Invocation" -description: "Edit Invocation" -sidebar_label: "Edit Invocation" -hide_title: true -hide_table_of_contents: true -api: eJztWktv2zgQ/ivGnFpAjbPFnnRaN+2i3rbbIEl7CYyAFsc2G4pUSSpdr6H/vhhSsiQ7VmwnXbSFckhich7kNw+OOVyBY3ML8TWM1Z1OmBNaWZhEoDM0/tOYQwzIhbsRawqIIGOGpejQEPMKFEsRYnCGJXgjOEQgFMSQMbeACAx+zYVBDrEzOUZgkwWmDOIVuGVGfNYZoeYQgRNO0sAVCRqMORRFtJZuM6YOEc7U8uPML6+thkSWIyqXEopJrfgyYyronQTRaN0rzZckb1NTopVD5byqLJMigDP8YrWisXohmSE4nUBLnxo4bs0FazSXzjgXRMvkeYtyj80J5XCOpr3fdNoemWotkSk/dL8uSIRJcsnMs7/1e2HdX1arF2OV5e45WSyI0dMvmLhOaDe5oTiE+4qQKSJI0bEfF6E/cykfwkc4TPdjYsawZScqbdbDEP1ASBYRcFYi2uO4E8ea8jWhVdxDUGeH6wBpQ3ydXN9w4R5kb2SInUIuQm6CoiBpBm2mlQ0Ge3l6Sn842sSILCQauMyTBK2d5XJwURLD0Sks0Xlg2rB/vdgzTxEBxxnLpYP4tIg2Ml/tVxvCDTKH/Ia5Lu+LYKZNSjSENr5wIsVOE58FsYORN2+e8e+h5FMQWyrhKPE7KHkdxJZKKrimSzob99OT54LvBdarpT8Ma7yeVEuF1lpLBdiTaqngWmup6ojHlghRXe8cKaoucyLQRsyFCoFbxgwkuXU6rRPZeveo8pQyxZpgkaeM6jKWO91MGpcizSR6PR+DgiKCW6F4WxHjC5106Knm8Y5Jqv4kW+7Q8o5kk1sumFIoN9RkokOJdjKDCL7hFCKw/Ja2k4kdes5K+WSFn6Vo+pi7x1RNgf2XLpu6ENp93m9xHXDgHwPqT1E5/ThQbhZPVK7M0KBKAkzt4/9rjmbZVR/cobFbJcT+OfdzyU4HgcznR58CxEs1zZOdU+Hb7k7sLirM7hFSRAG2mztmBFOuh+84+AzeiW1wevwexs+hdRZ7xzsWuD5yHwtgH7vHItj45t+D9wjw+hh+ChD7OD4WRfpynjOnTQ/d0dD1Mfx4CPsIfkwtkzCLPXKHIdfB17gyvKhvHYoIpFC3e14btg3wI14fdwDwXqjb+6+3ylugX2t/D99XvfeG36uF17qpqlzm3pbcgV5ZM66bcaGR9/vLl9u9u89MCu6pB2+M0eb4xh1Hx4S/lN9hfKmT1uwhV5iTTSs0MK9hgtTOu55+fEBr2Rxrk+4m9WAMrmj2IXNK374g1SVdMyWu4Q3o7t7G6wBfl2XfXl2dbwkMtm0blZq4g3HzTU2KbqF5eNmSLPwjG7eAGIYZnaj4bVj3T+1wVQVXMVyVEVtQ2wTNXfUoJzcSYlg4l9l4OEykzvkJm6Ny7ISJIbVWKCwsJrkRbulZRufjd7h8i4yjgfh60iS4JJ8KXtImWxuIZeIdEl7lg51R7hbaiH+rDfpnO4vARYCQt17Ub2ze/MMoV2+/kSkbPHUbo75798AKNdOerrTByG9yMDofQ1Sfl3B68tvJKWzaoUVMYcUSH1bVHvw0RBtornGk/lXqYwocsvSPeoJWlmnrqDFXy9s2e2s5aywd/uOGmWShY+eVr0qHuIbSIaDZUqcEFTceYMVVHp9EsNDWEd9qNWUWPxlZFDRcXrVfTyLwZe+U0LteAReW/ucQz5i0uLXEdfKBZxdljD0f1C2D9tIr31DkGFQj0ieI4BaXzRdjlFD+R70VOD5pLSp/X5WzZ0HRC59aau6tTEuLDhyjJMHMddJOGhF+Pro6ewsRTMunZanmxGQY2ZR++6XqLBiW3p7R2AokU/OcsmMMQSj9/Af9SI53 -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-legacy-application.api.mdx b/docs/docs/reference/api/edit-legacy-application.api.mdx deleted file mode 100644 index 10b71c9857..0000000000 --- a/docs/docs/reference/api/edit-legacy-application.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-legacy-application -title: "Update Application" -description: "Update an application using workflow data stored in legacy format" -sidebar_label: "Update Application" -hide_title: true -hide_table_of_contents: true -api: eJztWt1T2zgQ/1c8+9TOOITSlt756dJCp1x7V4ZCX5gMs7HXiVrZciUZmsv4f7+R5O9ASkJ6k+nBA2B797fS7mo/JC1A41RBcAmjLOMsRM1EqmDsQ0QqlCwzzxDARRahJg9TDxs6L1csnXo3Qn6NubjxItToKS0kRR5LPU5TDOdeLGSCGnwQGUnLdxJBABQxfeVIrlqY4EOGEhPSJM24FpBiQhBAi+aKReADM+PKUM/AB0nfciYpgkDLnHxQ4YwShGABep4ZbqUlS6fgQzmaAPLcomimuSFoTd87iaAoxg6VlH4tormB6gsJRaop1eZTa3DDL8pobNEaQybN1DUj1aNd/hhza44FYDr/GNv5dwmYugpzpUXSJSqnORGCE6ZQ+PWrNOcczGyqmZ4o741DKHwDR9fIc9RCPgTxuAZxoLM8wfQhgO8sQFH4FZGYfKFQtyz2wfpOy25vre6WcQsfEtLYHQ1GETNMyE+71umPt/ScFixLNU1JdiUlk+6b9jRvlwUhk2HOUT55m3P+pxLp4CTNcv0U+nM2GExTcj8mlBLnK9XbZYUlHa/i/cto0nAs+ekuafRv8YEp/SOd3jXHPvd6Gjp3XljGrXvNf3kEhrfoBeHNoI5aEGZtRquA+vFx5SKN7Aixv7K68eqapHrA6D+X7IUPuWSbolxI5hD45gjcIMwII5uX1nP8n6USxfPppjCfDO/WHWJFvD6jmCSlIbVBqoGO11pi70ozFFWmv69FdihE7V7QX8MAn0qtm9SKWcbS+yaDvn7XyTyVIGt1E9I2dn3HXXRLzV3NZbvnKHfznjb6NFYiec1Cuo9qXUW9hgOW0IUtw2M2zSUuZ8ntyHrTEbBWSXqEtlpaqkjXwTiOmL5VatOPXHaaivEPwM5cWwNFYVAlqUykyvn3wf6++dPt/T7lYUhKxTn3zkpi2Lj7CUXumHrLpa1uQ2FqnxhzriHYL/x+03RXan1sn/7P7dPHXG8QIZe41giRjvcX76BWqfUeLdQmOtrtHiqUhJqiK1xZgbRKZ7N3NtAsodV5xsF6I6us3O64bV2I28irhETE6ScIOXKwpZBKXZP51faajUpZr+eea0QrfW1VSqWtWkqlsK1KqdRVS9m9vu6x0X9s9B8b/V+nPHns9Xey6tpJX3ls9//Ldv+h/HWL7tr7FwcHyx39Z+Qscmedx1IKuXk7H5FGZpNt6ZV9Ai7Cztd1VlUrVzhHbk1b1NqCRE1vO+lt+i2lcEqNZ99NapXhnZuvP9pwMfNyoku6duKu1eu0e/c0jpz6Vhn43fn56RKgs21CeibMWbpZuL47Cw9gmEm6ZnQzdIfrw5Y51XDRPUYvwC3b6qzdFk4w0zpTwXAYcpFHezilVOMesiFmzK4URWEumZ5bltHpyXuau0QNweW4TWBTh/ODLlltAszYezIaKU/5R7meCcn+qe4C2EN+V4xZLRl/PGuO5Y+/Y5JxuuVYvd4Jau34uEjQ3bOp35VbLua52fFo2vS6GW28prum6temzoLnMf72Mj58MXj56tmrwYuXhweDyfM4HByEvx8+jw8PMcZDaIrqulJsYGwV3H7k7cemPu2URt0c3UqeDWcnDXai9i3B1fkZS2NhbVbdlbAe4Y1OT8BvDX1/79ne/pJeOsQmymBoo0xlcPu5nmDlerXTgQ+U2BADmjD5o/lgRpYJpcudshKvvKgy6two6W0B1LFuK9daSk/W9F0PM44sbXUgbkleQrkkwQfHDZ0dTQU+BL37LWMfZkJpw7xYTFDRheRFYV5/y0mapTf24Rolw4mxyeUCIqbM/xEEMXJFK2b95KwMZE+9u8ZfLc/UDNWsFvMEPnyl+fJdHBuoZ1UEWJREb5y8gQ2nDchSdjGR33GMwpAyvZJ23Ip6pxfn4MOkvJ2TiMiwSDRaNr/teEXmFGyu75h3C+CYTnOTDwJwkObnX0/3wkQ= -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Update an application using workflow data stored in legacy format - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-metrics-preview-evaluations-metrics-patch.api.mdx b/docs/docs/reference/api/edit-metrics-preview-evaluations-metrics-patch.api.mdx deleted file mode 100644 index fcd38352af..0000000000 --- a/docs/docs/reference/api/edit-metrics-preview-evaluations-metrics-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-metrics-preview-evaluations-metrics-patch -title: "Edit Metrics" -description: "Edit Metrics" -sidebar_label: "Edit Metrics" -hide_title: true -hide_table_of_contents: true -api: eJztWFlv20YQ/ivCPLUAZTm+0vKpSuzAbpLGsJ28GIIxIkfSpssls4cTVeB/L2aXFKnDii0oBVLYDzK5nGu/OXdnYHFsIL6Fs3uUDq3IlYFBBHlB2r9dpBADpcLeZWS1SMxdoele0Nc7ajjm3+4KtMkEItD0xZGxr/J0CvEMklxZUpYfsSikSDxf77PJFa+ZZEIZ8lOhWbMVZPitEsuPwlJmVilG0ts/A1TTDyOIb2eAaSpYOsrLBdKGwk4LghiGeS4JFZTRfMlYLdQYykEZ1Uv58DMltk2knJRQDiKwwkpeeOONKCO2F7c0ptbcqBHK0pj0ouZsuLjS3sN6XZAInTiJ+pc3Tso/Ta66F6pw9ldYt8UK5kcwodY43QzLAis8CdL3jCRzbO/e/wDRv/J3wtjvYfrQHpe5n4bQTRVzIt20+whGuc7QQgzOiXSjxAv+DPekjQhp+QhIV4R8qtjLCIxF6zb6JgJSLuPyU5BKw8oXR45SLiFOqbBkXJKQMbwZFNJpYkatc81LCaqEpKQUWlY01ew6GLFqchlBis/pupt0PWUkyxWWdQ55H2r6WSraOoJ5C/nvK/86mdxbhKaU46buEGt931J1FfoRlCywEWC1I79gilyZ4OuD/X3+l5JJtCiszwW4DiE4crJzVRFz7G3X1pLcBaal0Gn28NpTRJDSCJ20EO+H7vLcDXefXh+c3SK/VriekGCB93/eEDfB+oiOuA1GdUtMNKGl9A7tI1tjipa6VmS0UfzrILbT92a5Iv0RSj4GsZWSlCT9ACWnQWylpIZrOL3b3TBRg/Vq2glzRY3XTrXUaM211IDtVEsN11zL88y13czVamhz7T/PHPZzNIowikUeB32Pci1sa0FaDs1aAKsXGRmLWbHTMnQzl8qRm5BCLfId5u11JbLKWu1UJXyzyEbAlVOe9ztDaCV40wz6iFG3lRy3gyfN0vOJtPTj7dHBweoA+wmlSD1T54zTePvpNSWLQm6YQmWeLHx9StIOHsbpXR4M9KOlGa/zYwOpMTimBvSHST0YnRv++j03876C6oquXYLn8AZ0H97GaYBvk4PPb24uVwQG3y46lU82nSZ+MrKTnO/r6lu4Au0EYuhVV3a91pVdrzpN9LjWk+YO5F3ktIQYJtYWJu71Epm7dA/HpCzuoehhIXyGGUqcFnbqWfqXF29pek6Ykvax2yK45iAKYbFINvcIFuItMUAKM37vOzvJtfgn+JrrGNsTuBgBDs+r5nbx7BtmhaSF28Lb5iTUHEOa2blq4HA4wt+ORydH3eOXL152j45PDrrDw1HSPUh+PzkcnZzgCE+g1Zyb4Km7bKuFVj2s9BEs1Cj3W6wc2vcAdvqXFwvy9vde7O3DslMXiDlHMfE5WuPjP0O05Km5j7hPZz5BwRJmfzQfGL0iNzZD1ZK3FEMLtsydZOmb7RUShc8+r3lWRdctVNHFiluXyM15NQLOlEluuLLBbDZEQx+1LEte/uJIcxgNIrhHLXDIgN0yiJM6oGbwN039odjXq65PViaXLgTQUu3iuhI4+klChd1IO2ilzWX/5vU5RDCsbq2zPGUmjbw3/o0B+Go8bDCehbUZSFRjx/UmhiCU//4FiAQCrw== -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Metrics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-query-revision.api.mdx b/docs/docs/reference/api/edit-query-revision.api.mdx deleted file mode 100644 index 8f84065480..0000000000 --- a/docs/docs/reference/api/edit-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-query-revision -title: "Edit Query Revision" -description: "Edit Query Revision" -sidebar_label: "Edit Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWd1v2zYQ/1eMe1oBJU7TNt38tLRJ0axtkiVp9hAYBi2dbbYUpZBUEs/Q/z4cqU9Llh3PHYZhfXAV6e53HzzeHY8LMGyqYXAHvyeoOGoYehDFqJjhkTwLYAAYcDO6T1DNRwofuOaRBA9ipliIBhUxL0CyEGEAdbIRD8ADLmEAMTMz8EDhfcIVBjAwKkEPtD/DkMFgAWYeE4A2isspeDCJVMgMDCBJLIrhRhABqTnvXWUSemcBpOnQAaM276JgTmjLcvxIGpSGPrE4Fty35vW/6UjSu1KNWJHxhhwxWCyZ0/w+EdZ5C2ByfjGxjmBBwAmbicsaaUmRWTqOIoFMQuotG58OUy9/FY2/oW+qRDIRAsjk3CMfrBKpByEatqUyueRSDJcGp6jqksNx/U3VhnZZ4HPlJ4Kpnz4kQvymI7l3JuPEvIA2E7nBcDMmphSbd7ulxgrPcukX8iRxbL+8/4BHz6PPXJt1Pl1l4zL38zx0k8Wc2/cb2d/UgHhTDwLUvuKxybbYNlAnFYjUAx50AS0nly5gm1+WHbOUjfJkdBpw00pdZqO75ZQy7MC6cjkN0pRAFeo4ktqF2+HBAf1X8xxcJ76PWk8S0bvKiGHr1OdHiWNait5S3/eWgpZvwhJhYHCQei0Zs1yFttz6wBRn0ox2t2KuQNw6XFsfPNi9lDq+s2XXNjhspgyfMH+Xyh9nkLmExMwitTNwh0b7mpnO3FBBJdI9w20+6NjlBGgLndZsunXe+ZKxp97/BXybAn6RmC0qeIPrGSXc8f7Ha3iXWzco4tv46N9dxX2FzGAwYmanWeS9g+0dW2clcfAjhHx1sJmQAAX+ACEnDjYTkrtrvMtKlDvrXV6Ocn/tVErurUJK7rCdSsndVUh5QNXsUjYP19uMPfVAi2S6Lcw18e68abXll3U1YI9cBtEjYXcQSXykFnSXUXvuIFMPIhHsGvzCQVJOw6dNodc69JywUg8ED3k7aGthWEL5bLnJbhXgmn4LZRLScYFpH2Xg3lGGzf4YdvrAwlNESYPqgYmtNT7LAej8saqbaxbABs6Vbdw6zlF/FLHYhKE2jQuDak2ouqmVa2SLMwkwGZQVtele+zWiY42MSCHp3shIVY9mn6Mp95m4yCWk9ljlKruVnbU9q5WbcBRB25yr6HUsQerBd5xvm0k+4dyddkSyaTl/dkOTW5q29HHtzY6bwG3elNxa9VOvtqDrdwrXNGvUI1rHagGLwpgpriNZWb3VKHhPq29/pxQPwtgntI/0OzaPtVP7eRKi4v5G4NowZfQjt6NQlEH+SEd0xiUZEDLjz5CeBP+OVUHXFm0jOVy6eB7xmqrUKm7EP2OkwIw1nHnC/c0Q8IlrozMtsj8qOKf0BqWPbWDNfJYTVWYNtNw2RIotuGrn+UzjSKPU3PCH9m3RcpJrNkJMY++6gKmoMmFCY+oBPtEp3S7g1lJOCaP3xWI0RHTkzxt8MheZLwi/7gIm2kvAJhodC/EsTVyQlZqsXtSMZs28zCXO2obOEq/NwsUxM68QL2C4nJpaeHXVprthl0EFcltp2nQ0eMLsYXRr/r/DW8wC3Rzx9eFhc3R4ywQP7GCwd6qU3Wpbzg0DNIyLWk2sE4jIX1Ex1xepjqX9HDkF7RxFT7tKbWX+40hWk1pn9G7o67pAJbuc6IyuXtIy9zrvrjbjxLmva3E/3txcNgDd2tYXlWbIvfp9Gdgh0yyiez2aFnjuYm4A/ZhmtvjYv3fXgP18hKv7i8alXgoeaFQP+eVfogQMYGZMrAf9vi+iJNhnU5SG7TPeZzG3O1+jnyhu5pbl+PLsE84/IrOd8N2wSnBNoeWCpU5WrBOLOfU6+eAimznyP10EZFeOM8dFfqGgvSpvCE+fWBgLbL/hy0eC5TyuHCIVo5IyUuouL17TYQ5eTdjPbyZHr/fevH35du/1m6PDvfGrib936P9y9GpydMQm7Mjqx+UksublSdc6r3d8eQaVUyoc7L/cP2jIrBHbVsK3uzb3jf0M3tIqFetDVTu0WxYMsvDX8gNpFkfahExW8Nqjamn6k62TwSfTjwXjdltaBRZZxN1BFnHgxufcNj1F1IEHg+Zl8tCDWUQnxjtYLMZM41cl0pReW1oKpGzYPyY/3i0g4Jqeg6xyNRQtshz8dJVt5he98sBQNyCPPkmhl3XZAFnL3nL3bfPVLI/xRUb33oncs1mlxGkkWUqAjuPY9zE2nbTDysa+/HpDjWp2FR5GAbEoRp6mX6typXGy7xYgmJwmdqoODpL+/QXWn/qS -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-query.api.mdx b/docs/docs/reference/api/edit-query.api.mdx deleted file mode 100644 index 3c59d2e332..0000000000 --- a/docs/docs/reference/api/edit-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-query -title: "Edit Query" -description: "Edit Query" -sidebar_label: "Edit Query" -hide_title: true -hide_table_of_contents: true -api: eJztWFtv2zYU/ivGeWoBOU5zcVc9zU1SNGu7urnsxTACWjqy2VGiwktWT9B/Lw4pWZbtOImXFsOwPCQOea7fOfwO6QIMm2oIR/DFouKoYRyAzFExw2V2HkMIGHNzc2tRzSGAnCmWokFFOgVkLEUIwe3e8BgC4BmEkDMzgwAU3lquMIbQKIsB6GiGKYOwADPPSU8bxbMpBJBIlTIDIVjrrBhuBAlQUPPOeQxlOfb2UJu3Mp6TkVXzkcwMZoa2WJ4LHrkcel+1zGit8Z4rytBQtmHhg19fToQDpgCWzT8nLlsWx5xMMjFsiTYSVV4TKQWyDMpgNdVyXAb1kpx8xcgsC2VWCKBM6/zfuSDKAFI0bMdgas+NG54ZnKJqe04n7ZXlHDb7goiryAqmXryzQvymZdY9z3JrXsKmFLnB9HFKTCk23w5LSxWeBOknQpI0di/vT0D0d/mRa/MQpvfluKr9NISuqp7zh/tR+a9HQLplADHqSPGcUt3V1OmSiTIAHm8ztEol2ww7WlkFZoV7zmJuNko15DOqGGS8QfXCMxaUJdlQqHOZad9VB/v79KcFEFzaKEKtEys6F5Uw7ExskbReaaVJmzhPnARVKWFWGAj3y6Dhwwbj/5nxHzPjZ2t2oMY1rSdwo9f9j5PjNlgfwY67YPTvpsdIITMY3zDzSJqMmcGu4S6e+72ceLOdgQPL5vGPcHLtzVZOYhT4A5ycerOVkxquibu+PtNgqcF666+uDV7P6qVGa+GlBuxZvdRwLbxoYae79uol6f70Gb7BwIM6i+nrJ/fRwcH6sP6DCR67Udw5U0qq3Sd1jIZxQZ+qUbAqIGTU2n0K6y7NVT89mlQ/Sh+gm6N6uull1kwGrdkUG6q8X9SB0bmi3YduTpSXd13JLZW2gdeje38apx6+bUV9f3U1XDPoa9suKt3aOl+q126KZibpDUxDIvDP2hB6ucI7jn/1bv2TuVfU798SAtCo7urnsVUCQpgZk+uw14uEtPEem2Jm2B7jPZZz18saI6u4mTuVwfD8A87fI4tRQTgaLwtcUvv4hmiLLWrBcv4BKfLqYT6wZiYV/9tXuXqdz7wW5U6NedG8qs++sTQX2HoV17e95qrV3A8WU7Bpgjaai2U68XCYsF+Ok/5R9/j1q9fdo+P+QXdymETdg+hN/zDp91nC+i4sniXSZVVVb+Aw6wyG5xAAoeut7++92ttf89kSpgPJIncga0jcNgQrxVmUBQLA1J1GMMjSX5sNiiyX2qQsW7LXapiVeV5VxeA308sF4+6gOb9F1UwjqJoJ/MWbznsA4eILlXEAM6kNCRbFhGm8VqIsabkq0GgcwB1TnE0IqVEBMdf0OYYwYULjWkwLioIXF9VJfNlp7k/tWOu2yii5OyYs/QcB/Inz5a99HMfM6p4tqu0T76nrmKBRXyNGIi2vMYgizM1W2fHSqRxeX0EAk+rroFTGpKIYYUm/XaTSJe7OjFsrQLBsaonKQvAm6ec7hjp+tg== -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-queue-preview-evaluations-queues-queue-id-patch.api.mdx b/docs/docs/reference/api/edit-queue-preview-evaluations-queues-queue-id-patch.api.mdx deleted file mode 100644 index 3de67b5f2f..0000000000 --- a/docs/docs/reference/api/edit-queue-preview-evaluations-queues-queue-id-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-queue-preview-evaluations-queues-queue-id-patch -title: "Edit Queue" -description: "Edit Queue" -sidebar_label: "Edit Queue" -hide_title: true -hide_table_of_contents: true -api: eJztWVlvE0kQ/itWPYE0jkOAsDtPa5IgvLBLNgcvlmW1p8t2Q89BH1m81vz3VXXP6Qs7EAmh5MGxu+v86uianiUYNtMQDuHijknLjEgTDaMA0gyV+zXgEAJyYcZfLFocZwrvBP47xpre7+hxQSH4eJwxE80hgIwpFqNBRTqWkLAYIYSSDgIQCYSQMUPECr9YoZBDaJTFAHQ0x5hBuASzyIhPGyWSGQQwTVXMDIRgrZNihJFE8A8J7gw45PnIy0NtXqd8QUJWxUdpYjAxtMWyTIrIedP7pNOE1mrtmSI0jEBNv5zx68tT6YBcAksWH6bO2zaB0GNNBiVGMNlwapKmElnS8GKgO9c1ZQAcp8xKA+GUSY15HpSs6eQTRqbBWQfRIfHG2ZQHla7ESgn5KA8gRsPa1jLOBXEyedmyu6ZoR6EhViQGZ6jamuJJe6X0k5Y264JIqMhKpp68sVL+qdOkO0gya57CqsckQxiM92NiSrHFBhhq3NqssIbwLt6/CEniWIv/z4To3+l7oc23MN3m4yr3YQjd+Cwsqn8v/9ctIN6cakFHSmTk6n1FnTdE5AEIvkvQaq/ZJZj6TgB3qPR3WPexYM8D0IYZuzNjAsDExtS+M0y4X3H9iZqisknil7SNItSanGFCWoXEqFSqaCliSYRSIofRpkZy7Y3Y2EQ4W20i7ZZnNaqx4CsuFIXb+PItyFcLef/CvtWoOgPu0k9HmDAl0h0WHWrIdsXXhbJKucFs/BkX+2k+SJPBrPOOJB9wMpwz17TWYrq/hAsuzEaN9TE7LM7KjXlVCbnypzTkOUlTqLM00T5/To6P6V+r5uHaJ/PUys5VQQz3Psyj1Hqmlb5bW3zmKBqH8HEe1DPAtsx/nAYeYhr4YM09xoE1rgPmAc/7iw8Eu2DdYyK4D0Y/90gQKWQG+ZiZPUcDzgx2jXD2bNdy5sV2+g4sm/GHUHLrxRZKOEp8ACXnXmyhpIRrshj/uGGqBOv1ouPnqhKvH6qlRKvSUgL2Q7WUcFVaHmfO+82cjdOv0v44h/6Cc6jLpKIC9738ubKJv/rZPZMWgrcPpd83F1czqZ9nX5ycrI+wH5kU3LF0Lqgk7j+/cjRMyFYStwlkGrV2Dxk1Rqvhr51+n3oDKUNiPdsUpnoc0prNsM6l7aQOjM4N7X4riuSXV13QNdtZBa9Hd7sb5x6+XeF9e3NzuSbQx7YdVHqW6fgEcgP1POX+arO4CDVzCKFXXJ/2GtenPX992luW16I5tU9Ud+WtqVUSQpgbk+mw14tkavkRm2Fi2BETPZYJV4caI6uEWTiW/uXgHS7eIuOoIByOmgTXlEs+O9pkVWBYJt4h4VTc1/atmadK/OdDXlzazj0XAUFZelVftl58ZXEmsXVZWj0QrTz4+IeY6gmkHpur4bBOkzbe1TJ1CXg+Zb+9nJ6+6L589exV98XL05Pu5Pk06p5Ev58+n56esik7hcZBWbOXJ17jOCvPk/rcGO6nYLTa3Q/gqxvzsDRu5NJMJNPUBafIyL4Lfad/OWg5dHz07Oh4DaUWMTUZFrkmU0bWbUOwkmNVdtGhHbsOAwZZ/Ee9QZZlqTYxSxryWkWwMpgXyWXwq+llkgnXPJzeZVEeQyjKg9Q23kcUAwZ9Cat3B6MA5qk2xLVcTpjGWyXznJa/WFRUBqMA7pgSbEKwDZfAhabvvMi6NQOrHgxPropW87RTPxW1DS9LJaE6IVvpFwTwGRfNNxyuic7LOlwW22deU9e1upp9rfNTV/Yc/SjCzOykHTXazmX/5uwtBDAp3n3EKScmxQha+nS2ppnHl16O0NoSJEtmlrp1CF4o/f0Pt2ntTg== -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Queue - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-queues-preview-evaluations-queues-patch.api.mdx b/docs/docs/reference/api/edit-queues-preview-evaluations-queues-patch.api.mdx deleted file mode 100644 index 5a305910dd..0000000000 --- a/docs/docs/reference/api/edit-queues-preview-evaluations-queues-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-queues-preview-evaluations-queues-patch -title: "Edit Queues" -description: "Edit Queues" -sidebar_label: "Edit Queues" -hide_title: true -hide_table_of_contents: true -api: eJztWVlzE0cQ/iuqfkqqVpYxYBI9RWBTKCTB2IYXlUrV2m1JA7MHczgoqv3vqZ7ZU5clByoUhR9sebbPr3t6vlmtwOBcQ38El3coLRqRJhrGAaQZKfffMII+UCTM5JMlS3qSKboT9PeEaoXy0SRDEy4gAEWfLGnzPI2W0F9BmCaGEsMfMcukCJ1a74NOE17T4YJi5E+ZYr9GkOb/vFX+JAzFelNgJl3wK8Bk+WYG/dG6gNATzaEkRqDkBbPMCPowTVNJmEAARhjJK0PduaklA4hohlYa6M9QasrzoFRNpx8oNA3NGri3HO9LF1MeVL4SKyXk4zyAmAy2o8UoEqyJ8qoVdy1RGNFGiWTeNCsSQ3NSbU/xtL1S5slL231BKFRoJaqfXlopf9dp0h0mmTU/w3rGbKOowwFKqBQut8BQ49ZWhQ2E9+n+yUiyxkb9vyVE/0r/ENrch+muHNe1j0Po1nchJBjTgflvRsC6Oe8FHSqRcaoPNXXRMJEHIKJ9hgKYpSpGA32wVkR7DQ/5MdyR0v8huveFeh6ANmjs3o4JgBIb88jMKIn8iptUEQ8+myR+SdswJK05GRTSKmJFpVLFSyEmIUlJEYy3DZIbH8TWIRLh+hBpjzyrSU1EtJZCNUCrD/dBvr6RD9/Y7zSpzjBy7adDSlCJdE9Exway2/FN4axybiibfKTlYZ6P8mQo67xmy0ecDBfohtZGTQ+3cBkJsxFnLf3Wn5fbDPKBLBRF3LbFsbq187wJ9nPtj3DI2VytbpQlt6CzNNG+5c5OT/lPa0zAje//mZWd60KYG/9hTCBMrVdaG9V1Ci+cROPcPs2DHwTi/yEQb6x5AIPY0DqCQnjd75xD7IP1ABLxEIy+bRYRKkJD0QTNgWwiQkNdI1w8u7288GY7AweWzaKv4eSdN1s4iUjSV3By4c0WTkq4psvJl+NfJVjPlx1PxUq8vqiXEq3KSwnYF/VSwlV5+UFTH0ZTG6df5f0Hdf0OqavrpGIH7gejNn1tE7e97mGpheHdLPV+Itxow9ExNFtXhDV37PfJ2dkmv32PUkROp3PJ++Xh5DYig0LuYakyDVtPj+Eh490o/ZH6ABnIWM+31bDmSlrjvAH5blEHRueWn95XYs7Luy7kmrOugtejuzuNCw/fvvq+ur292jDoa9suKl98OlX3xGQWKb/+LF9rZmgW0Ide8Qq013gF2vN3jR6PVFI86F2BrJLQh4Uxme73eqFMbXSCc0oMnqDoYSbc3tQUWiXM0qkMroavafmKMCLlGrchcMMt5JuiLVbVAzPxmhgeT9lgYM0iVeIfX+kABKe58FqcPzfndf229vIzxpmk5tvXUeOatHYd8leb6l5Sk+mKMtb90Qa6WubZAY9n+MvT2fmT7tNnj551nzw9P+tOH8/C7ln46/nj2fk5zvAcGsdnrV6eg41Drjxl6tNkdJiD8frMP0KvHtejMrhx7jafSGapq0/RiwNX/c7gatjK6PTk0cnpBkwtYR4vGLrxUhbXPYZgrc2qBuOzPHazBQxh/Fv9gEufpdrEmDTstdt/jbAXDWbos+llEoWbG87xqtgYIyg2BvttfJ1QXcQDYLAWqeaJDKvVFDW9UzLPefmTJcU7YBzAHSqBU4ZrxBAuyr2wgo+0dJd9N2i7bsqwuLS+99eGLg9ErzEIQ8rMXtlxY8NfDW5fvIIApsUXGHEasZJCTo1/9wH4OxKfX3/l11YgMZlbHpR98Eb551/TL6tX -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Queues - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-result-preview-evaluations-results-result-id-patch.api.mdx b/docs/docs/reference/api/edit-result-preview-evaluations-results-result-id-patch.api.mdx deleted file mode 100644 index 2debb87fa8..0000000000 --- a/docs/docs/reference/api/edit-result-preview-evaluations-results-result-id-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-result-preview-evaluations-results-result-id-patch -title: "Edit Result" -description: "Edit Result" -sidebar_label: "Edit Result" -hide_title: true -hide_table_of_contents: true -api: eJztWVlzGkcQ/itUP9lVi5BlS072KViWS4rtWIWwX1QU1ew2MM7soTlkEWr/e2qOvQAjhOVUnFgPCGb7mm/6mt4lKJxJCK/h7Ba5RsWyVMIogCwnYX9dxBACxUyNBUnN1TgXdMvoy5hqBv9IjksaFo/HOapoDgHkKDAhRcKoWUKKCUEIFSEEwFIIIUdlqAXdaCYohlAJTQHIaE4JQrgEtcgNo1SCpTMIYJqJBBWEoLWVopjihmBgJXcuYiiKkRNIUr3K4oWRsio/ylJFqTKPMM85i+yOep9llpq1Wn0uDCSKkXRijJL19Sm3cC4B08WHqd0wxjEzMpFftkhrCr+zSZZxwhSKYHWzxagIyqVs8pki1SRKNedgtloi8MYaUQSQkMI9jSk112pYqmhGoq05mbRXmnvYrAsiJiLNUTx5ozn/XWZp9yLNtXoKm7bIFCW7MaEQuNgOS4sVHgTpe4Ok4dj/eP8BRP/I3jGp7sP0a3tc5X4YQkPvcyzetvvVsN0m0URwALckJHPBuAOka0I+efYigDnK+fjxzDtHOe84G5XAiO4RvRU7w1/KIqkilPeJe4ilQy/SayAhMvHvdeIfKS2cWSiLAKRCpbdCFgClOjGVNqc0dis3mjSZ2iV0mrolqaOIpDTni4xrQeAPzCxFmEbEOcXQtKGqw1fOiHWDi7VNbWJ3hfMsZgo2MdSV87osfxutqMUMXOmFojDyBMk8S6VzrKPDQ/MvJhkJlisb4HDl9j7VvDPwxLB3hY4y7ZhW/LQ2+dRSBBDTFG0xP3RW+sJeH+TPEv/NsfxBqz2CeY3rAdHseP/jVX4brDuU+X0wKut8JAgVxWNUO5apGBV1FUtoq/hTJ7bTt2bpPP4eSj46sV5JTJy+g5LXTqxXUsI1WTxiYS/BerXwpb3E61G1lGhVWkrAHlVLCVel5Wcj+bOR/D8Vnx+kl2z0S5V2E62pInGLfKPZG492NUhLAQY0lpBUmOSPmpCHlVTb5+WEZv50t7fFAyuicxHfrTaRUlE+/pMWm8ZWJfeVorzzlhb2xCNKUbDMh+quk64rz+bDUej0gQIGOnVzsu3dfrWdtqWVxi3XgG+8jFTXAHeFeHF0tH5r+IScxZan40Jo7ytDTAqZ9WCfFVYJeBa1nj4kqzX6e5dI6l2/y5yBtp+Xs21e856kxBnVmeXrpBaMztA8ve+Azb6cak/XrHsVvFWC+so2Xjv4tp3v+XB4uSbQnW37UM31seNdyF5y5lnshsR+pqzmEELPz6J7jVl0z8+ie8tqxFwYxyVxW46gteAQwlypXIa9XsQzHR/gjFKFB8h6mDMb5pIiLZhaWJb+5cVbWpwTxiQgvB41Ca6MOzkHaZNVZ4M5e2vDxw+/+1rNM8H+cqfuB+Bzx2WwMI46qOfWZ3eY5Jzac+fyGlrfAeuLi++e4PkUfzmenrzoHr989rL74vjkqDt5Po26R9GvJ8+nJyc4xRNodEa1E1Utzq4y6s6l4YnNDmRXQWVT0SiEdZ2xhWaaWWi9S/XtwXX6lxetnRwePDs4hFW3ahGbLIGRBbM8F/sYghUPqXzDmJfYFAGKMPmtfmAsyzOpEkwb8tpe3DKl8g1Fd6qXc2Q2/K3ipffva/D+bfQ2Xs+UUwrzLaxfpIwCmGdSGb7lcoKSPgpeFGb5RpMwfjwK4BYFw4lB7noJMZPmewzhFLmkNROrPApPBj5dPO3UDVHb9NLXU+PoxlrzCwKwdbDxvsdmwnkZSUv//NSp6tp8VfOvpW+TWh1HP4ooV1tpR43Ucdkfnp5DABP/IijJYsMk0KBrPq2xWe4gNqFm1pbAMZ1pk3JDcELN39+N80uJ -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Result - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-results-preview-evaluations-results-patch.api.mdx b/docs/docs/reference/api/edit-results-preview-evaluations-results-patch.api.mdx deleted file mode 100644 index b1e2d6a035..0000000000 --- a/docs/docs/reference/api/edit-results-preview-evaluations-results-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-results-preview-evaluations-results-patch -title: "Edit Results" -description: "Edit Results" -sidebar_label: "Edit Results" -hide_title: true -hide_table_of_contents: true -api: eJztWVlzGkcQ/itUPyVVi5AlW054CpblkmI7ViHsFxVFNbsNjDN7eA5ZhOK/p3pmLw6tgJJTcWI9oGW2r/n6nGEBBqcaurdwcYfSohFpomEYQJqRct+uIugCRcKMFGkrjR5liu4EfR1RxVG+G2VowhkEoOiLJW1epdEcugsI08RQYvgRs0yK0PF1Pus04TUdzihGfsoUazaCNH/LxfKjMBTrTYqJdPYvAJP5hwl0bxeAUSRYOsrrFdKKwswzgi6M01QSJrAMyiVtlEimsBwug2IpHX+m0NSJEislLIcBGGEkL7xxRiwDiMnggcYUmis1IjE0JbWqOR6vrtT3sF0XhEKFVqL66Y2V8nedJu2rJLPmZ9i2xRzmHZhQKZw3w7LCCntB+p6RZI7D3fsPIPpH+k5o8ximD+1xnXs/hAZ5zImoafcBTFIVo4EuWCuiRolX/BruSGnh03IHSDeEfMrZlwHMUM9GT2feJepZy9toFIb0iOhG7Ji/kEXahKgfE7ePpYNcZK6BlErVvzeIv6eycOGgXAagDRrbCFkAlNiYW1tGSeRXvliyFHF7sknil7QNQ9Ka/YtCWkWQO4yXQkxCkpIiqNtQ9r0bb8SmwcuNTW1j77vudhGJOggev4q8n7fAbSK5yQpFEW+yaJVbDc2FsKq+b8ywZIGVAKMsuQWdpYn2wXhyfMz/ItKhEplxRQFuPF4TK1v9nJiBOqy/h6n1TGuxXe3h3FEEENEErTTQPfZW/hgLnj7/P1hzQAHY4NqjAnje//hk0ATrDqPBIRgVs0GoCA1FIzQ7trYIDbWNiKlR/LkX2+o5s2wWfQslH73YXElEkr6BktdebK6kgGs8f8JhoADr1TwfBwq8nlRLgVappQDsSbUUcJVafgyfP4bP/1Pz+U7mz9q8VGrnbE0MqTuUW83e6tr1JC0EMGgiJm0wzp60IA9KqW7OywjNSET3B1vcdyJaV9H9+hCpDWWjP2leGz9LowvuG0NZ6y3NncdDSlCJNE/V5gSticjZ8nRUNtlTQN8mjveR+b/czqqlpcaGc8EOp48adrd7nW50eUhYuhPH85OTzTPFJ5Qickwtn2AHHygiMihkw8FApuHK231q3vBhnN6l3kA37etpU0y9J61xShXoD5M6MFoDfvuY+3lfXnVOV++KJbxl+XpgG689fE0OvhwMrjcEet+uOpUPm60qfmIys5Tvkosb4gzNDLrQya+TO7Xr5E5+wOtwMJPiocC5yCoJXZgZk+lupxPK1EZHOKXE4BGKDmbCpb6m0Cph5o6ld331luaXhBEpF7s1ghsOIh8Wq2SlRzATb11KJRjz9541s1SJv7yvuaCyPZ6LEeDw7Fc33xf3GGeSVm6yb6vDaXUyrI4z+UwFpxP85cXk7Hn7xctnL9vPX5ydtMenk7B9Ev56djo5O8MJnkFtXqqCpxx8dpVRzTO1CKzPJbsKKkaNWnusus/Q9Z9J6tDNY6nnfNfqXV+tbOX46NnRMazH0woxlwcMXXkoXONeQ7AWJGV4sH2xqw1gCOPfqhfsuCzVJsakJm8tfFdsKePD0L3pZBKFS3yneZEH9i3kgc2Ka7+tVLcXAXCSzlLNRRUWizFq+qjkcsnLXywpjuBhAHeoBI4ZsFsGcVbE8gJc94JzXyrbrk4wubQ+dtfKJpc0z9ELQ8pMI+2wlrHXvcH5JQQwzn/MidOImRTy3vizC8C/GPkNcrDz2gIkJlPLpa4LXij//Q2oZAeq -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Results - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-run-preview-evaluations-runs-run-id-patch.api.mdx b/docs/docs/reference/api/edit-run-preview-evaluations-runs-run-id-patch.api.mdx deleted file mode 100644 index bf0898f887..0000000000 --- a/docs/docs/reference/api/edit-run-preview-evaluations-runs-run-id-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-run-preview-evaluations-runs-run-id-patch -title: "Edit Run" -description: "Edit Run" -sidebar_label: "Edit Run" -hide_title: true -hide_table_of_contents: true -api: eJztWltTGzcU/iue89TMLJiQhLR+qgNkQhMaxpC8MB6PvCvbSmRpowuN69n/3jmS9mp7MYbMpK15AKzV+c5F57ryEgyZaujdwvkd4ZYYJoWGYQQypcp9ukigBzRhZqSsGKWK3jH614iWu3Fdj9xTloxGKTHxDCJIiSJzaqhC9CUIMqfQA78LImACepASg1sV/WaZogn0jLI0Ah3P6JxAbwlmkSKVNoqJKUQwkWpODPTAWodimOG4YWBF5yKBLBt6NKrNG5ksEKIJHkthqDD4iKQpZ7HTovtFS4FrJe9UoQ0Mo9rBWLG6OOHOeEsgYvFx4vSsb2B6FHOpkXt1U1BrLCWnREAWFUvCcg6oRa7Zhe6ceoQsQjjO7uhjwD4gvYcisXkkWN8jZFmU75LjLzQ2lZMp3WpgxVtnr1XQLII5NaQuCkkShnSEX9VsuiJs8I4KLBOGTqmqc5qP6ytVHdfzgpip2HKifnlrOf9DS3FwIVJrnkFTX8Rghs63IyJKkUWrbeuksGLfNtpLtCRSrPjmz2TRP+UHps19Nt2kY5P6YRa68V4YctJW+q9KgLRZBAnVsWIpqror1FkFAiNzfbLYkANbI9QljTuq9COk+xzIswi0Ica2ekwEVNg5lpOUisSvfLPUUkzWygrhl7SNY6o1KkMYt4oioVJS4VJMREw5pwkM16WRay/E2iSSkGYSqadjbWjakD9EbXPnV7pYV39ycd7TRelym43AnG9isbuTvs5ABEQIafyHqk8iRBaBVGzKRBtobLWRc4hgZufEAVojq1AfPUSGpXBCFRVxCPMN4V/X/AndhdvprjDXSPvkwdBSpwa5qVZTyZpNLn240306d1rDt+xdbh3E2oAYWHFGDLk2NG3mwvsLzYXXYRvmYUfhojX3uk+yBwl17cLU+W9KSdPEbRWpATQI9JimJ8RyA73n2GuQNGWiWR03HF0suZ2v6f2+MpG0nik+rxSZTft8IbnP/ggWsNpMfek1O/Uyu5RN012zm+vOW7Zd4fPtPMdBbSG4d5V7IMOJBOW2QH2Q813mzrF1V4uc1tWjbenPE2buVRrnj02qIsDATz2QZZkLHJ1Kof1pHx8d4Z9apwLXvgRPLO8MwmbYeTiKpfVEjdgs5T11OypxeJRF+Uy1qVrvp6v/23T10ZodxqsVqgfMV572Pz5gtZl1iwlrFxv93CNWrCgxNBkRs2V3mRBDDwxz8mzmcuphO31nLJsmP4LJJw8bmCSU0x/A5MzDBia5ucaL0dP147mx3iw6fk7N7fWkXHJrFVxygz0pl9xcBZf9DL/bDF9pEAru+7l+P9fv5/r9XL+f6/dz/b9qrn8MbTGT+3n+5fHx6gj/mXCWOILOORbe3ef3hBrCuBup1wcLl3Ht6UMGmmHzlEqVP+TVE4NXT9uc8pJqTaa0rToXhkRjdHzhvcflUC/POuyrVrzCvN66m9U48+ZrO9x3NzdXK4D+bOuHiu9yOug8bmifycRfk4crdQxc6IZL+G7lEr6Ll/Ddpb9ezzCGqLrL796t4tCDmTGp7nW7MZc2OSRTKgw5JKxLUuYCRdPYKmYWjqR/dfGeLt5RklAFvdthdcM1epH3i/q24khIyt67/BBu/fvWzKRif+etkrv8n3kqNAH656C8tj//TuYpp5Vr9+JVUOWVj7/OL17aFB/zFy+4UL76KOf1IneXnlM/gmIZmxR4MSG/vpqcvDx49fr564OXr06OD8YvJvHBcfzbyYvJyQmZkBOodOgled5qV/rovJENDettSNkVH86DxzeYeddYNoe11q/SrDShsqH/LkQotEfV6nhbrX6+3pUS1G1TKTUNSYMz5vswtzlxJtI5QvD7vnOzTv/qomajo8Pnh0crhq9txlRGYpfKci9yjyFq+HPhydhLz10eA0PJ/PfyAUqWSm2wry7xKqHWeMUQTsHQ76abcuKbbsd1GfS+hRCEyLTyzRk3IeGfXvimyzCCmdQGKZbLMdH0k+JZhsvfLFUYbMMI7ohiZIwGu11CwjT+n0BvQrimK8IVOR5+GYRU9qxTuk5d6DwgBUYjyomfIAqHGWR0KXqWx3p+0qeez8GN7w5z4pW6gjnfU/TjmKamde+wktau+jen7yCCcfimzlwmSKQIGhV/O0ll6i2LyQDXlsCJmFqsBT3woPjzD6fMjm4= -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Run - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-runs-preview-evaluations-runs-patch.api.mdx b/docs/docs/reference/api/edit-runs-preview-evaluations-runs-patch.api.mdx deleted file mode 100644 index bd38826999..0000000000 --- a/docs/docs/reference/api/edit-runs-preview-evaluations-runs-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-runs-preview-evaluations-runs-patch -title: "Edit Runs" -description: "Edit Runs" -sidebar_label: "Edit Runs" -hide_title: true -hide_table_of_contents: true -api: eJztWt1v2zYQ/1eMe9oAJU7TNt38NDdJ0azNGiRpX4wgoKWzzY4iVX6k9Qz978ORki3Jtuy4KdANzkNiU7w73vF3n8oMLBsb6A3g/IEJxyxX0sBdBCpD7b9dJNADTLi9106a+0zjA8ev97jYHh7cZ8zGE4hA4xeHxr5WyRR6M4iVtCgtfWRZJnjsibqfjZK0ZuIJpow+ZZpkWo6GvhFP+sstpmb58Uj4Y8+AyemHEfQGzQ3c3MdCGUzqm+w0Q+jBUCmBTEIezZekEwLyuwgst4IWLkznNHDII2In+AN+D7P3RB9Ysdh+J7N+4JDnUblLDT9jbGGxa3Gh106+8fZaZppHkKJl9aOwJOFEx8RVzaZLhzVWczmusuXS4hh1XVI6rK9UdVwtC2KuYyeY/uWNE+JPo+TBhcyc/RWa+hKPAiNbEDGt2bTVtnVSWLJvG+0lWZIolrD5M1n0L/WeG7vJput0bFI/zkK3AYUgWboa/sv6L5+AaPMIEjSx5hmpuiurswoL8szVwaJgFMFI6ZRZ6IFzPGn3UB80HlCb7zjdp4I8j8BYZl0rYiJA6VIK5BnKJKx8cegwoZDspAxLxsUxGkPKMC6cRiLUWmlaipmMUQhM4G5VGLkJh1gZRBLWDCL1cGwsZo3zr4nsf6NPG03tyuO8w+kCcuuNwD02I+DyQYWMAxEwKZUNX6qYJBZ5BErzMZdtTGNnrEohgolLmWforKqy+hBY5JQER6hRxoWbr3H/uuZPCBfhxruyuSHaJ3eGljx1XZpqOZSs2OTDh7/dp4PTCrlUxHBN1cPAs1jpENdOnjHLbixmzVi4OdFcBB22EV7smEO0Bq9NJ3vUoW68m3r8ZsiaJm7LSA1G1wU9hekRc8JC7xnVGizLuGxmxzVXFyvhUrniSrlMWu+UnleSzLp9IZFssj8xK3i1mfoyaHYazuxDNma7RreM2Unbtit6vh1yPKstDh6gsoFlcSOFcltwfRT4LktwbF3VkqRV+Whb+vOELzttBcTUg2yyiW9U1pnCkITr0BBBnudVUqsd+gWTKWkCPI6PjuhPrbSBm5CzR050rovNlKx366ti5QJRw5kXCpz6HRXHPcqjfTu2b8fqndUHZ3fox5aoHtGQBdr/eUfWZtYtWrJdbPRz92SxRmYxuWd2y3I0YRYPLPfnWS/lNLDt9L2xXJb8CCEfA9tCSIICf4CQs8C2EFKaazi9f7oCvjTW62knNLalvZ5USmmtuZTSYE8qpTTXXMq+6d+t6a8UCHPp+0HAfhCwHwTsBwH7QcB+EPCfGgRsGgJU0DvYnquZt+u57/1fHB8vd/efmOCJp+icU07evbVP0DIuWrp0oeLa08f0OnfrLfS+TKzk12bchtdLNIaNsS1xzy1JxuiEnLwBjaRXEF3sqybDuXmDddercRbM13a7b29vr5YYhrutXyqNfToFclK0E0Uv0csX5MGpoVu8Su9WXqV3ac7SJb9CTVWAvxynBfRgYm1met1uLJRLDtkYpWWHjHdZxr3zGIyd5nbqSfpXF+9w+hZZgtpDtrLhhuATAFHfNr8LlvF3PmaEwAl9ZydK83/K8omKI5gEKtKdgHm9eOt//o2lmcDFW/xBZUBUGQTRAKwyypl/LccxxYCsGIgsuvh5RF+Apm79+TKVLvB8xH57OTp5cfDy1bNXBy9enhwfDJ+P4oPj+PeT56OTEzZiJ1Cp2xfkZQFeqa7L8rYoYwdFIK/At/SbUHaWteSiZKwVhJUSpskq95c2T79H1Zw5qObEkAUXJ6jbppKAGictYFjuo2h5588zUh4LBeb7Hmmd/tVFzUhHh88Oj5YsX9tMYYzFPoyVQPKPIWpAeg5mKrFTH8PAIkv/WDwgmGXKWCq3F/yqbtYYPRT3YPGb7WaChWLci50Vmg+gcECSWvnnl2LYGQGFkYkyFPNhNhsygx+1yHNa/uJQk6fdRfDANGdDMtWAzDcpfa6092kI5ge3oXIjQcHHGoGdgm6g6McxZrZ1710lrFz1b0/fQgTD4h9uUpUQkWakGP3uAQExC9qRU9LaDASTY0fBuAeBKf38CwllT7c= -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-scenario-preview-evaluations-scenarios-scenario-id-patch.api.mdx b/docs/docs/reference/api/edit-scenario-preview-evaluations-scenarios-scenario-id-patch.api.mdx deleted file mode 100644 index 12fed250af..0000000000 --- a/docs/docs/reference/api/edit-scenario-preview-evaluations-scenarios-scenario-id-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-scenario-preview-evaluations-scenarios-scenario-id-patch -title: "Edit Scenario" -description: "Edit Scenario" -sidebar_label: "Edit Scenario" -hide_title: true -hide_table_of_contents: true -api: eJztWEtvGzcQ/ivCnBJgZTlO7LR7quI4iJu0MWwnF0MQRrsjiSmXu+bDjSrsfy+G3JceUWzF6aGID7ZMzovfDD+OZgkWZwbiGzi7Q+nQilwZGEWQF6T9f+cpxECpsGOTkEIt8nGh6U7Q32NqVZpNM27lRDoeF2iTOURQoMaMLGl2tgSFGUEMHVGIQCiIoUDL8ppundCUQmy1owhMMqcMIV6CXRRe1WqhZhDBNNcZWojBOW/FCitZ4Kqy3TtPoSxHwSQZ+ypPF2xn3UOSK0vK8hYWhRSJP9ngs8kVr7UBFJrBsYJMWA9uNnem0kO7BFSLD1N/bExTwVZRXqyIthLV6SZ5LgkVlNH6gctRGdVL+eQzJbYrpJyUwIetUXjjgygjyMjinsHUnls3QlmakV71nE1WV7pn2O4LEqETJ1E/eeOk/N3kqn+uCmefwrYjCkvZ/ZRQa1zshmVFFR4E6R+MJGvsn97/ANE/8/fC2G9h+rUzrms/DKHrquZEuuv061d3l0W+wxHckTYiXMd7QLph5FOlXkZgLFq3MzcRkHIZM2NBKg0rt44cMcdop1RYMi5JyBg+DArpNLGi1rnmpQRVQlJSCp0oWqK9CkFshlxuoL1VvWKes1RY2KbSMtxNS1PbI+mYugw0CWXJNjWZIlcm1PHR4SH/SckkWhTWpwKuAgJTJ3uXlTDszaZJ7oLS2rVogz71EhGkNEUnLcSHnM4OCbcJ/UnH303HH5zdg483tB5AyEH3f87Iu2C9ByXvg1HNyYkmtJSO0d6Tm1O01Lcio53mT4PZ3tCH5Yr0Rzj5GMxWTlKS9AOcvA5mKyc1XJPF+PFesxqsV4teeNhqvB7VS41W46UG7FG91HA1Xn4++vs9+p0nrfHOcCpL+g7l1rC3ctQ6irUBpguRkbGYFY96Y64bq6VHqaqu+35Ru3QqfEfb3cFUhnf2L9/dSzUdTOh+XhwdbTY8n1CK1Gv1zjjp+3c7KVkUPrPVW7ouIPNkZfchz1anMQnPb3vu93kI0DciZrYtWe3TagzOqH1rvi7qwehd8+63csnnCq4rue6FbeAN6H79GK8DfLsy/Pb6+mLDYMjtalK58+01ZeT7s3mehnlENcCwc4hhUA0/Bp3hx6AZfgyWnYlGyUxB+q6eeTgtIYa5tYWJB4NE5i49wBkpiwcoBlgIf6kMJU4Lu/Aqw4vzd7R4S5iShvhm1BW44qIKZbIq1mQIC/GOGLBq2jJ0dp5r8U/IfTVvmQctRoTL9bIdkpx9wayQtD7kqPvotoltO6+K/uH5FH85np686B+/fPay/+L45Kg/eT5N+kfJryfPpycnOMUT6FB7W0w1R7cU6Dlw6l3XWR161HrDi/MVI4cHzw4OYT2zK8J8UTHxF7UGxW9DtJaeJjFM7Zm/pWAJs9/aDY6syI3NUHXsrRfSSjBNaix9sYNCovB30LteViV2A1WJsefOUK79lsOf4+7obBTBPDeWdZfLCRr6qGVZ8vKtI82lNIrgDrXACeN3s4RUGP6cQjxFaWgjzIbQ4MlldW+f9tp2dTX8utwU1xpHzP9BBH/RYm3G50lpXpfzspI4Dc76njpaCxtMyiwXNIZJQoXdKTvq3OGL4fXpW4hgUo3+sjxlJY2MMf/24eZFAJpng7y2BIlq5pj9YghG+edfTSVFvg== -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Scenario - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-scenarios-preview-evaluations-scenarios-patch.api.mdx b/docs/docs/reference/api/edit-scenarios-preview-evaluations-scenarios-patch.api.mdx deleted file mode 100644 index 4b7c70d962..0000000000 --- a/docs/docs/reference/api/edit-scenarios-preview-evaluations-scenarios-patch.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-scenarios-preview-evaluations-scenarios-patch -title: "Edit Scenarios" -description: "Edit Scenarios" -sidebar_label: "Edit Scenarios" -hide_title: true -hide_table_of_contents: true -api: eJztWFlvG0cM/isCn1pgZTm+0u5TFceB3aSNYSt5EQSB2qWkSWcPz+FGFfa/F5zZS4dlW7D7UMQPsnaGx/Aj+S01SzA40xAO4eIepUUjslTDKIAsJ+WermIIgWJhxjqiFJXI9DhXdC/o7zE1Oq3dcY4mmkMAiu4safMuixcQLiHKUkOp4a+Y51JETrP3TWcpr+loTgnyt1yxdyNI+/XSMD8IQ4nelJlKF8USMF18nkI4XALGsWD7KK9XRBsJs8gJQphkmSRMoQjqJW2USGdQjIqgWsom3ygybaHUSgnFKAAjjOSFD+4QRQAJGdzzMJXnxo1IDc1IrXpOJqsr7Ri2+4JIqMhKVD99sFL+rrO0e5Xm1vwM20IsYX6CEiqFi92wrKjCsyD9g5Fkjf3T+x8g+mf2SWjzGKYPxbiu/TyEBmXNiXhX9AFMM5WggRCsFfFOi1e8DfektPCN+QRIN4x8LdWLALRBY3fmJgBKbcIklFMa+5U7S5ZiJhGbpn5J2ygirTkYFNIqYkWlMsVLEaYRSUkxtE7RcNqtP8TmkYsNtLeqlxx0EYt2fnzxNwq3NVVtM8t0KBTFHGhDatuPW22zwxtPo1Cw0caIUZbcgs6zVPvqPzo85H8x6UiJ3LgEwq3HbWpl56YUZsD2Y+Mos15prZmaKM6dRAAxTdFKA+EhF8EPEn8dEv9szR4svqH1DBr3uv9zHt8F6xOIfB+MKiaPFKGheIzmiYweo6GuEQntNH/uzXb67lg2j1/DyRdvtnQSk6RXcPLemy2dVHBNFuOXewdWYL1bdPzrsMLrRb1UaNVeKsBe1EsFV+3lx6iw36jQeqXV3hnO1JC6R7n12Fs5ah3FygDThUhIG0zyF+2YQW21cCiV1bU78Y36jU1d6Twy05SGdw40TxqeWkAPnzmg6XrCKdy4dHJ0tDkQfUUpYqfWueCi2H8aismgkDtmGplFK7vPea2NHsbqU+YP6AYVPduWzObVqzXOqAH+YVEHRmfAu4/lmuPyrku5dkPX8Hp0Hw7jvYdvV4ovB4PrDYM+t6tJ5Um5066hhMw848uL6joiRzOHEHrl7UWvdXvRq+fTHrMHKeY0lyarJIQwNybXYa8XyczGBzij1OABih7mwjWapsgqYRZOpX999ZEWl4QxKVfBLYFbLiRfGqtidVYwFx+JQUox4ee+NfNMiX98vplu+Dxei1HgEr1pLlouvmOSS1q7OBk203Uz2jbzWPlSgOMp/nI6PTvpnr5987Z7cnp21J0cT6PuUfTr2fH07AyneAYtwm9KqGLuhhhHjhqnmQutTGbfAdfpX1+tWDk8eHNwCOsJXRHm/sTI9WeFi9uGYC1DdW6Y8RPXnGAIk9+aDUYtz7RJMG3Z26ifldPU6TH03fRyicL1nvO9LCtrCGVlsevWbVr7108A3CnzTDO3wXI5QU1flCwKXr6zpLiERgHcoxI4YdCGDOS8KqYl/EUL9yPL8VXXNSuLS+uLZ427mFe8Rj+KKDc7ZUetprnuD84vIYBJeXmXZDErKeTo+DME4FtCH2K49GtLkJjOLPNNCN4o//0LC2P+/A== -sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Scenarios - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-simple-evaluator.api.mdx b/docs/docs/reference/api/edit-simple-evaluator.api.mdx deleted file mode 100644 index b2404d8eda..0000000000 --- a/docs/docs/reference/api/edit-simple-evaluator.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-simple-evaluator -title: "Edit Simple Evaluator" -description: "Edit Simple Evaluator" -sidebar_label: "Edit Simple Evaluator" -hide_title: true -hide_table_of_contents: true -api: eJztWktv2zgQ/ivGnFpAjtMkTXd12jRJkWzbbZBHL4ER0NLIZpcSVZLK1mvovy+G1NNKXNtJFkbhHtpKmvmGM5wn6RkYNtbg38LpPRMZM1JpGHogU1TMcJmch+ADhtzcaR6nAu+wpAMPUqZYjAYVIcwgYTESdUlxx0PwgCfgQ8rMBDxQ+D3jCkPwjcrQAx1MMGbgz8BMU+LVRvFkDB5EUsXMgA9ZZlEMN4IIqmX2zkPI86HDRG3ey3BKQPMiApkYTAx9YmkqeGDVGnzTMqF39QpSRUobjpqeajU7nyJhTTYDlky/RFbzNgHXd0GmjYzbRIWKIykFsgRyr3qVZEIA6VJqea57xw4h9wiutZp1ESvTFaCTLGbJUwDPLECeeyWRHH3DwDR268r6TCX4g7VcFzX3IEbD2mthYchpq5i4aFm3s9rCZxqwPDE4RtWWFI/ab5pKPiwLAq6CTDD16kMmxJ9aJv3zJM3Ma5jXmDC4wXg5JqYUmy40bpsVOhZexPuZLEkcHS/dJIv+JT9xbX5m08d0nOdezULXzguLfLWU/t0VEG/uQYg6UDwlVdeFOmlAUGSGi4DmM+PCEA3tCtl8ZLWz1T0q/YTVfy3Ycw8yxddFuVHcIYj1EQQhTJCFth6t5vgvZRItsvG6MFfE++wOsSBbX2KECpMAmyDlQocrhdhZsQ15WeOX3ZENSlGbl/RX2ICrwupUWlma8mTZYjBv31UqTynI7jqltLVd33Hn7RZzU2vZ5jnK47wXtT1pl1Dd8wCXMa3rpldwwAI6ty14xMeZGyheQtZxS8AKDekJs71Spx9dHuE05OZBifUcctsYJoYLgS7dKAN5TogKdSoT7fx6b3eX/mm1G3CVBQFqHWWid1kQw9oTTyAzxzQXJk0zEwX1PBHLhAF/N/fgkdFkOzJtRyaXpL5kZo2s2OFaIS063l98alpk1iXGpnVstNlzU6CQGQzv2MKuo9Euh8xg3/AYF9cWB9s7ssbK0vAlhNw42EJIiAJfQMiJgy2ElOYaTe+eb8AojfV+2nPDZ2mvZ5VSWquSUhrsWaWU5qqkbN4stx3ut8P9drj/ddqT7Xy/kV3XRvrKdsT/v0b8p3FXg7kb6g/29rpz/FcmeGg1650qZa9W1xziQzSM2zJb+OM8gZBB6+sq8dSoEs6Fa6U/yYCVjXisxw/d6NaTltZsjLVPP05qjdG7pq8/O2IhvZzogq5ZsivzOus+rsaJM9+i7T27vr7oALq9bW8qHej0nDM0zhHs2D6RdKtOge25m3EfBqnCe47/DNw1+6A6vtCDWfNCPQcX0uWdu22qYGJMqv3BIBAyC3fYGBPDdhgfsJTbKNIYZIqbqWU5ujj/iFNXxMG/HTYJbFlxntImqzaJpfwjks2K2/6jzEyk4v+67S+u+12jZu1IHntZX9Gf/mCkX+eKvTohapwEuRzRPsup3hVHMfRcn4XUA3w1ptZe1d6e6jV1YLAfsd/eRocH/bfv3rzrH7w93OuP9qOgvxf8frgfHR6yiB1C3W5XPWQNY/vj5qNoPtada6tpalfvRlmtOVsFspXPH0i7zg95Ekm7Y4XLHll/6B1dnIPXWPruzpud3Y5dWsSUhVhgs1C53fZzpWDpeJXLgQcY2xQEBln8R/2BVpZKbYoTtALvsSiZOx8onM/gDzNIBeNJY6BwEXQLRQRRgFg8aBxOavDAb/0wZejBRGpDjLPZiGm8USLP6fX3DBVFytCDe6Y4G5ERb2cQck3/D8GPmNDYWWOVsuHVZZGZXvfqqt9eexlNCYUSrYuewIO/cTr/ExqbdydluM4KkmMnrW+zYw3RKRaUyB3HURBgahbSDhvp6eLmGjwYFT+riWVILIqRfelvu1pplbdxa9/NQLBknFF698FB0p//AIsChy4= -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Simple Evaluator - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-simple-query.api.mdx b/docs/docs/reference/api/edit-simple-query.api.mdx deleted file mode 100644 index bb32edb1d1..0000000000 --- a/docs/docs/reference/api/edit-simple-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-simple-query -title: "Edit Simple Query" -description: "Edit Simple Query" -sidebar_label: "Edit Simple Query" -hide_title: true -hide_table_of_contents: true -api: eJztWutPIzcQ/1ei+dSTNiTkeFzzqfSgKr0HFLhWahQhsztJ3PN6F9sLpNH+79XY+8wmS0ipdK3CB5Q4nt+Mx/OWF2DYVMNwBL8mqDhqGHsQxaiY4ZE8D2AIGHBzq3kYC7y9T1DNwYOYKRaiQUWkC5AsRBiC/fWWB+ABlzCEmJkZeKDwPuEKAxgalaAH2p9hyGC4ADOPiU4bxeUUPJhEKmQGhpAkFsVwI2gDyTbvnAeQpmOHh9r8GAVzAlmG9yNpUBr6icWx4L49Su9PHUlaK7nHig5q6NDDhRO+ueyOtgAm5xcTe9i60KlXrMhECCABc7E/E23qQYDaVzwmMbaFOq1ApB7woA1oWZFtwKRUDybCWkEVkgUBJ3ZMXNYU0mB6F0UCmaxyyQ80Tr18Kbr7E33TKspPVggi2V6Ypiq5NDhFVecc3tVXqmdYzQt8rvxEMPXd5+gj1+YXHcnuuYwT8wZecshlaniRim4yDYVo2LeroZ8SIZ7TDzcYbkbElGLzdsOpkb5Mo59Ik+SjbFmj9TjwyGUQPZLmWjZJfERtNnTNgBnsGm5DRIu9OMjUg0gErw1+4SBTDyQ+bQr9bEj5TFipB4KHfDXoSotbQvloqencKkDVLhvKJKQcxrSPMnBrFHSzL+NWHVh4iqnSoHpgYmuJz3OA1APFzOq00fSsBs4V0aYNKy43/F7YYhOGgjkXBtUzpupyfGQVG+CEJYLulsmgdLymeu2vkQIPZEQCSbciIwXVm4um3GfiIueQ2pzsQoblnfn+euEmHEWwqkAoPN5uSD34ivNtU+oHpKgCD0wkm2b4F0fK/KTpimi2Ooq6Gmbz+PWbFT/1ahf6vKdwTUWavqV7rKC9j8KYKa4jWbm99Sh4T7dv/0/JHoSxn9B+pP935lFW8T8nISrubwSuDVNGP3JbQ6IM8o9U3zEu6QAhM/4M6ZPgX7HK6NqibcSHS2fPt7wmKqXpjehnjASYsYYyT7m/GQI+cW10JkX2pYJzRisofVwF1oxn+Sav4tdcOxMpXHCd5/lM461GqbnhD6vdYkW91xDiPdPYuS5gKqJMmNCYeoBPzDe39gK35nJGGJ1PFqPBoiV+3uCTuch0Qfh1FTCxOgVsItGJEC+SxBlZKcn6S832rMAq+59RFjhrDp0FXhuFi1orzxBvYLwcmlbQ6uqZRuO2AxXIq1JTC53t8K7wgWseyVNma7KX0F/b/tSinAVUNzyjKNftjdcCXLkeE9KUkBTqOJLa2ceg33dJs9LUwXXi+6j1JBGdq2wzbN2K+lHiiJbSTvVqaEflVvqpV3awa8vTb7KX9RUyg8Ete93a9r2D7ZzYIjKJg3+DyRcHmzEJUOC/wOTUwWZMcnXd2UnLK5XsubJ+dFOWUl+vyiXXVsElV9ircsnVVXDRIplua6vXRLsbuHwrA5eLxPyTiYsj/1+PXNo0tH7m0qB6wdBlG6Xupi67qctu6rKbuuymLribuuymLrupy27q8h+fumxPWcxL3KzlYDBojld+Y4IHdnjSOVPKutmWs5UADeOilg/rG0Tkr8mWzyeolmv9GDkBbSuhp21p9hNqzaZYVtTrt1pldG7o1+eMlM7lWGf76uksU6/T7vpjnDr1tV3tzzc3lw1Ad7f1S6U5W8cZQufX7GFJiGYW0asTaik894JkCL1Y4QPHx557htK7d29Veov8xUkKHmhUD/mDlEQJGMLMmFgPez1fREmwx6YoDdtjvMdibv1co58obuaW5OTy/APOf0Zm697RuLrhmozJmUd9W3EzLOZU2Xj5U5iTxMwixf9yd569h5k5KtIEmelV+Y7l7InRwWrvUDKk4s7ryiuWaTIBbyfs3eHk6KB7eLx/3D04PBp0795O/O7A//7o7eToiE3YEZRTh7LlLxvbSjdW67ry7goG/cFBt3/cHXx/s384PNwfDt7t9Y/3/4CySWrb43qdTSXNuph+0YjUuoyyaejnRX9/uQQvK7Osgq5Ww6Oi2i0VaYva8mtWoZYLFUBbx1Xy+nL+duVkLdnSUpp6FBrHzhm4nETWgvIsZu2zc3J5TtxRaXfR/b39vX7j+mubbW3mm4rRuJ/BW3KEwgWoDAptHASDLPyh/IEkiyNtQiYreKtcdWkSnDmCwSfTiwXjNtJZ9ovMjUeQuTE5q8UCN7TmtpgcFs/Hxh7MIrKnESwWd0zjFyXSlJYz5xiN6X4UZ3ekudECAq7pc5Al/4ZwRbKA766ymPimU/ZcdaFzl5bzihkUBlJIaaP9LI8Xi+zn945T18bkkryRoih9OIoT38fYtO4dVwLj5ZcbKvGzx29hFBCJYqRU+m8lrZimXVuAYHKaUFIZgoOkv78BoFmWYw== -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Simple Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-simple-testset-from-file.api.mdx b/docs/docs/reference/api/edit-simple-testset-from-file.api.mdx deleted file mode 100644 index c4caba067f..0000000000 --- a/docs/docs/reference/api/edit-simple-testset-from-file.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-simple-testset-from-file -title: "Edit Simple Testset From File" -description: "Edit Simple Testset From File" -sidebar_label: "Edit Simple Testset From File" -hide_title: true -hide_table_of_contents: true -api: eJztWd9v4zYM/lcCPt0BbtMVe/LTeu0V7e52LZrcXoIgUCwm0U22fJKcLQv8vw+UbMc/kjRtUmAPfWoakx/JjxTF0GuwbG4gHMEQjTVoDYwDUClqZoVK7jmEgFzYiRFxKnFivdRkplU8mQmJEEDKNIvRoiacNSQsRgihlBQcAhAJhJAyu4AANP7MhEYOodUZBmCiBcYMwjXYVUqaxmqRzCGAmdIxsxBCljkUK6wkgcLV3j2HPB97RDT2k+IrgmkbiFRiMbH0KM6kFSnTtk/YZ5xZZ3jjQqopdivQ0H8uwH2OTUXC9Krm2i1p5IHTnHi1rjomWUyUR2YJAfwwKiHS6xC9IakEwHHGMkmWSDYPKlY9yWtgyeph5mhvGsmD6pskkxLycZe+b4RRw+RoIi1Syvux0Dc1qJoFX2vHQQ8Jo4YZo8/hMZh/EEZOoF5QTX9gZBu1OvLFUFOmcpvsPxt5TqAaTaoS40vq8uKC/jS4hkEWRWjMLJO9p0IYGnXL0lSKyB3JvquXPUUbqcwrFcGIxOIcda1Ir51ErbouNnw2qWwdB9nJX1NgwYxjIWJFtJ2kTJWSyJK9WbljpjesUPLAw2oWHYvpIbbluVUQt9IXWRsvD6BbboxzQYlh8rFBxgEFWaamYSmeNr+ph7fdFkRCR5lk+sNtJuXvRiVnD5lNM/sR2qESiLAYH6jFtGarvcS2dKFD7j5lf+4C6PaF/xOp39RXYeyztO4KsqP+Mo7KfndMxy87/Qk6fKuzRxqZRT5hdh9g7cbkzOKZFc6f3VauPWzvypGVpfwtjHz3sIURjhLfwMiNhy2MlHRNVzQXHWbHDT+HkPVp5SaiDV8ntVKyVVkpCTuplZKuyoqR2fy1tTog3TyA07lXRM7ad0DzGiyvwIngraZVtN7nXTi8AZc3Ze+eV3PRlvu3stx1tZjST0RRfTgP4LTYgwr3ve+895037Tun7hlbZueDZ5wtA27Z/cYvmiXKufZ94Dpg4Hqf9N9g0u9ene+kvprUG7ZjbdGeDV41UBz0S/kJl8IIlXhXuj+Y9yAM3NakwDlGt1qZ+HXLr5eX3Q3Ln0wK7vYnvc9aK/369QpHy4SkTztGKqmixtOXFPK4nahNyF+Vd9C1JjPfNkRuDpsxbF7L+m5RR4bfNj63/6K4vOlCrlYzG3o9u7vDuPH07Uvu3XD42AH0uW0m9TMXtudLoVeOnbdaxb1bv5iO0S4UbbBTZaxbVNsFhNBPNS4F/t33e7t+MQOb/nozDef9LJWK0dbZoF6Wu+1MSwhhYW1qwn4/kirj52yOiWXnTPRZKtxJMhhlWtiVU7l6vP+CqztkHDWEo3FdYEA15qumKVYljKXiCxJ/xVb9KrMLpcW/vhSKxfrCaxFBIpkpp15weeWc61093kMAFIZn7uL8l/MLaPPZEKbjwSJ3PErb7jEELRaq+GmzHbuzARZZ/NvmAXlGOYhZUsN7Ln2tbUXBiMV/bD+VTLiT4FxZF5kdQZFZyprDhWqvaSCAsPFOokjwOIAFlUc4gvV6ygx+1zLP6eufGWrK4TiAJdOCTYnR0Rq4MPSZQzhj0mDH0aqxwIen4vx87G0uhWYAZZ4TSvKSyYz+gwD+wlXzJYrrDYuyjNaFwLW3dVa8LygBtr3noH7jla6iCFNbE+/0PyrS6vQ8PgyGEMC0eL0SK046BOxwg81HKu88/w81EAUg -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Simple Testset From File - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-simple-testset.api.mdx b/docs/docs/reference/api/edit-simple-testset.api.mdx deleted file mode 100644 index 8c5f9fc4eb..0000000000 --- a/docs/docs/reference/api/edit-simple-testset.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-simple-testset -title: "Edit Simple Testset" -description: "Edit Simple Testset" -sidebar_label: "Edit Simple Testset" -hide_title: true -hide_table_of_contents: true -api: eJztWltvGjkU/ivoPLXSEAi5tfO0aZMq2bbbKCH7sAghMzbg7txqe7Jl0fz31bE9dyCEEm1TkYcm9ZyLz+fjc5MXoMhUgjuAPpNKMiVh6EAUM0EUj8JrCi4wytVI8iD22UgZKnAgJoIETDGB3AsIScDABft9xCk4wENwISZqBg4I9i3hglFwlUiYA9KbsYCAuwA1j5FTKsHDKTgwiURAFLiQJFqK4spHArvB1jWFNB0aiUyqdxGdo5i6Ai8KFQsVfiJx7HNPG9T5KqMQ1wr9sUBzFWdS78Ya2Pgw8TVQCyDh/MtE21wlmBGp4fGIZDVCa+I4inxGQkidfClMfB/QmszKKyJb/VxK6hixgng/KtOISFMnI4vGX5mnmgB/0IY25aUOBEyR6i4IpRxxJf5NBYzGPu3xlsTyULEpE1VNwbi6UjZvuS7wuPASn4hXHxLf/11GYfs6jBP1GuqWogyuWLAZExGCzNfCWmWFBrLreD8jksjRcKqfCdE/ok9cqscwXWVjnftpCPWNF9rAspH9zR0gb+oAZdITPEZTtxV1URKROsDpOkH1ILZOMIYzByip36xmWMKQMOK05g3Wox/fwuaOncWf1jXVR7AiquWal0bQ0e4gKkd+B3Yr+y6X6wlGFKMjojaUTYlibcW1i61W8N6IbZ1r/09i+hxK7o1Yq4Qynz2Dkgsj1irJ4BrPd3gaGVjv5vZQMrx2qiVDK9eSAbZTLRlcuZZdx4wlFcnGyWNJ2ZAFweGTwnRWLewz2aOZbF897bp6ambNPaLbIXqBSD7WHGANsFUhsVHfccseuORRaLbSbD/WSLjTzamVc0m5Wqqv6BAHeZs3XCPk1jSYkKYoTTAZR6EtgnrdLv6q1JVwl3gek3KS+K1bSwxb96FelBimmneWcqWmwOQ1IYmvwO3aUs22r6tKyX0j+2JC8ZdEbRE5GlxPCB2G9xfvZdfBukEJsA1GP3c3u2999q3Ps7Y+0k+m2/rqHfLuRy77kcs+7uzjzn7k8hJHLv9jwbWv9J+h0n8hc5eXAeovNHr5Ed58ZGLGLce9XnPC8ifxOdXzk9alEJHYfrxCmSLcx79WlFR+5FW+PsWRh/WDKkz+FJkN6tAkp8uKyOKySUmmpVNfTarBaPXx62ODL7TLqLZ0JZ8p4DXorjbjwsC37nCv+v2bhkBzttVDxVFby7hCq58/LwmYmkX4+gTvk2NekbjQiQV74OyfjnmO0rGFr+wsihI4BSxYxUP2MiURPrgwUyqWbqfj+VFCD8iUhYocEN4hMdf3RjIvEVzNNcv5zfVHNr9ihDIB7mBYJrhDjzI+UiXLj4fE/CNDtOybmPNEzSLB/zUHb5/FzAwXwoG+els8Zrn8TtC22mOUvPKoTefMY5fybA1XisRXlAn59KHwn+pB5MtYNcHRhLw5mZwet0/ODs/axyenvfb4aOK1e97b06PJ6SmZkFMoUkG1Wxpsxj6sNDqDaiOz6Q6eSl9uOqDX7R23u2ft3tv+4Yl7cuj23hx0zw7/gmrfsI6uXPqvo6tV75tut1aOb3wu1fp6U7an0GYuWXGxwu2sZ6SYA7AUDyeRdhQbH871FWyd31yDA3hZjRN2Dw4Pug3XrBBjyCeevhXZDdOfEazKXc9vOTjAAh3vQTES/FZ8wJ3FkVQBCUvyloek2tzN3nbFvqtO7BOuY7rewMKGqwHYcIVeqqVBPqGX4IBbcvehA7NIKmRaLMZEsnvhpykuf0uYwLA0dOCBCE7GCN9gAZRL/JuCOyG+ZI395ZkRXt3aBPC6VVQ11X1noSvEuPVA/AT/Bw78zebVV306uc2yyLiwBO+NrrZOQYWARkbGbGk4zj2PxWot7bCUBW7u++DA2L71CyKKLIIgsviv3mukTddBUq8twCfhNMEc6oIRiT//AcYO4Io= -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Simple Testset - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-testset-revision.api.mdx b/docs/docs/reference/api/edit-testset-revision.api.mdx deleted file mode 100644 index 92da00c7cc..0000000000 --- a/docs/docs/reference/api/edit-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-testset-revision -title: "Edit Testset Revision" -description: "Edit Testset Revision" -sidebar_label: "Edit Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWd9v2zgM/lcCPm2A03Rd19356bp1Q3vbbkWb7qUICsaWE+0Uy5PkbrnA//uBkuzEdn41S4HdoX1YO5v8SH6iKJqagcGRhvAW+kwbzYyGQQAyYwoNl+lFDCGwmJs7417fKXbPNZcpBJChwgkzTJH+DFKcMAihKXjHYwiApxBChmYMASj2LeeKxRAalbMAdDRmE4RwBmaaEYQ2iqcjCCCRaoIGQshzi2K4ESTgfe1ceRudixiKYuCgmTZvZDwlvKalSKaGpYZeYZYJHtkge1+1TOnZ3JFMEQWGM23dasbekkiEZXEGmE4/J5aOusAYtaUwQs0agj7ooZSCYQpFUD1KcyGAwirjPkfd6VcoReBgFUY/i+kgiiIoxeTwK4tMm/L3NtA2XhHAhBmse4FxzIlgFJc1Mlp++gVfgOWpYSOm6pYmw/qTxfCW24KIqygXqJ69z4X4U8u0e5FmuXkOzUgJgxs22U4JlcLpWlrrqtBidp3uJ2KSNFpJ9Ssx+pf8yLXZxOmqGJvaD2Oo77LQ15yt4m97QLpFADHTkeKZ8Rt7F6izBYgiAB6vA2qWtXXAtq5t3JRlGXwXc7NUfl4Hb9vFbLAW78pVVCgKAlZMZzL1Jezo8JB+1fiD6zyKmNZJLjpXXhh2LryRzJ1SI4fnHr+1ErSICebCQHhI4S+p16sKcyl7j4pjau72t3blIfXFIdszKoD926njl/HsPw6Hj8rwBKN9Gjj1kKWF3Iyl2hu4Q6N9jmZtrVhAJdGu4bY+rNn1BGgPPq1xtHMd+uTVi+CpjfjvtBGfc7NDH9HSekAj4XT/553EOlq3aCV24ejX7iUixdCw+A7NXmvXWwfbObVk5Vn8GEZuHKw3EjPBHsHImYP1Rkq6htM9HlAlWW+m/ogq+dqrlZKtykpJ2F6tlHRVVu6ZavdI26frF69eBKBFPtoV5pp0994620MfN7V/dAze8bhR/nwR3+zC9qW8PHM7F7Eue7UlJ3lleXmn+lid3X6xryvcpwr2VMEetYLtu2Ys6cK37paWtMpl9Rs8qCspO+Sn1m2L1u3pm+ERvhnaR+cTqTuTekZkbvowpl5gp4Ziq2/ucqrnXGl/em+P8HPa1VjQjRSPj47aU8QvKHhsZ4Sdd0pJtfsIMWYGuaC/VrRVQka1tw9J5kFzseZBf5TOQVue9GhZI7lkAOREVotaMjp9ertpzktxOdNerjYyLOl17K4O48zRt255z/v9yxagW9v6otI4udO8ugNbvceSLhppVwXuljCEXkbjW/a95/te3SvHubo3W3LJWAC1sOq+vI7MlYAQxsZkOuz1IiHz+ABHLDV4gLyHGbc7SbMoV9xMrcrp5cUHNj1nGDMF4e1gUeCa8stlTF2sWizM+AdG3PmLUDd55P+4NPBXoGOnReRQ5l7N7yvf/cBJJtiq+8aqKWmMAN3F5uIAj57Mz8R5B1GNOOZpVV+f6jE1VPAywd9eJSfH3VevX7zuHr86OeoOXyZR9yj6/eRlcnKCCZ7YOHiaSOt1OXG1JHdOLy9g4esSDg9eHBy2bNaEaYtjZLd4yaF9DUFjNat1hADYxO5vMAwnf8xfkGeZ1GaC6QLeqhRszG38ihr2w/QygdzuYuvCzKfnLfj0hGrkru0G9CkKAYTLbsIHAYylNgQwmw1RsxslioIef8uZojQc+DuCIZF5O4OYa/o7hjBBoVnL16ouwrMrv/2fd+bnWj2GMlVTytN7FDn9DwL4m01XXN3bGjcut8TMS751Rru2Es2RWoWZiqbTOI0ilpm1soOFUnB504cAhv4efyJjUlFIdNO/1mlpObCbwj6bgcB0lNtRPDhI+vkX7rJIFA== -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-testset-variant.api.mdx b/docs/docs/reference/api/edit-testset-variant.api.mdx deleted file mode 100644 index a4343fd996..0000000000 --- a/docs/docs/reference/api/edit-testset-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: edit-testset-variant -title: "Edit Testset Variant" -description: "Edit Testset Variant" -sidebar_label: "Edit Testset Variant" -hide_title: true -hide_table_of_contents: true -api: eJztWG1v20YM/isGP7WAHKdJmm76tDRtkaztGiROvwRGQEuUfd3ppXenrJ6h/z7w7mRZUuy8LMW6YfmQOBL5kHzII+lbgsGZhvAKxqSNJqNhEkBekEIj8uw0hhAoFubauNfXN6gEZgYCKFBhSoYUqy8hw5QghI7ctYghAJFBCAWaOQSg6GspFMUQGlVSADqaU4oQLsEsCkbQRolsBgEkuUrRQAhlaVGMMJIFvKeDz87E4DSGqpo4ZNLmdR4vGK5rKMozQ5nhV1gUUkQ2wtEXnWf8rPGjUBy/EaStV53AewKJtAwuAbPFp8Ry0RaYo7b0RaipI+hDnua5JMygClaPslJK4KjqqE9QD8YrlCpwsAqjv4vpIKoqqMXy6ReKTJ/wdzbQPl4VQEoG215gHAvmF+VZi4yenz7da7AiMzQj1baUTttP1sO73RZEQkWlRPXsXSnlrzrPhqdZUZrn0I2UMYSh9H5KqBQuttLaVoUes9t0PzKTrNErqh+J0d/yD0KbuzjdFGNX+2EMjV0V+oZzr/j7HrBuFUBMOlKi4FAfC/VmDaIKQMTbgLpNbRuwbWt3HkrfBN/Gwtwq3nTBq14rm2xDO3fdFKqKYRXpIs98/9rb3eU/LfLgoowi0jop5eDcC8Ojm26Ul06pU8CNw8dWgjOYYCkNhLscfL9Xb2rKtejT5aseS5y3AFAZkWD0lAaOPKS38P/c+dfMnU+lecTg6Wk9YPI43f/46NlG6z1mz2M4+rGHT6QIDcXXaO7Zc2I0NDTC+rPZyrGDHRxZssoi/h5GLh2sNxKTpO9g5I2D9UZquqaLJ+zSNVmvF75P13w9qZWarZWVmrAntVLTtbKiZTl7bK1esO4/tyHdNkDurbzaaNw2dLC311+APqMUsV1vBm+VytXjt5+YDArJn/xw6ArIPGq9fUgfnlSdedLE/CF3DnKWUj277Tt5Myu0xhk1zXOzqCVjMOa3dy2oHJcz7eXWkt3Q69jdHMYbR9+27J6Mx2c9QJfbdlJ5Ex50LhzA7h3znO9GeIAE7mojhFGh6EbQHyO/XOqRX0T1aNm/F6kgAE3qpr5AKZWEEObGFDocjSKZl/EOzigzuINihIWwta8pKpUwC6tydHb6nhYnhDEpCK8m6wIXXFyuXNpiq0xhId4TE+evbo5KM8+V+NPVgL+1mTstZobL9ry5Y3n7DdNC0oY7ktV22tlC3V3M+g7JT5pVrtk/VlO2Kal2blaPuaPAfoI/vUwOD4YvX714NTx4ebg3nO4n0XAv+vlwPzk8xAQPbRgiS3LrdL1WW44HR2enEABnw6Hv7rzY2e3ZbAnz8cbIhltTaF9D0EnmKo0QAKX2bIMhTH9pXrBnRa5Nitka3oby62wOPp+GvplRIVHYA2w9WPrSvAJfmrD6kqQ5Wl+eEEB4y8XdJIB5rg2rL5dT1HSpZFXx468lKS7BiceYMpNXS4iF5s8xhAlKTT1PVw0Rnp37c/980Oxv7QjqMs0W1lVZ8n8QwO+0uP2i0fa2eX0all7w2Nkc2g7UAPUaMjdLp3EURVSYrbKTtR5wdjmGAKb+2jHNY1ZRyFzzb+tzbimwB8I+W4LEbFZyCw3BQfLPXwLwZ4c= -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Edit Testset Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/edit-testset.api.mdx b/docs/docs/reference/api/edit-testset.api.mdx index 55451e23a7..173da76fb5 100644 --- a/docs/docs/reference/api/edit-testset.api.mdx +++ b/docs/docs/reference/api/edit-testset.api.mdx @@ -5,67 +5,1356 @@ description: "Edit Testset" sidebar_label: "Edit Testset" hide_title: true hide_table_of_contents: true -api: eJztWG1v2zYQ/ivGfWoBOU7z1k2f5iYpkrVbg8TZl8AIztLZZkeJKkll9Qz99+FIWbKkxEm8FOuG+UPskPf63OnhiUuwODMQ3sCIjDVkDYwDUBlptEKl5zGEQLGwt9ZvQwAZakzIkma1JaSYEIRQ7t+KGAIQKYSQoZ1DAJq+5EJTDKHVOQVgojklCOES7CJjTWO1SGcQwFTpBC2EkOfOihVWskAZWe88hqIYe4tk7DsVL9hM20GkUkup5S3MMikil8ngs1Epr9X+M815WkHGRVMm2NmYSofQEjBdfJq6nJsCczQOnggNtQTLFCdKScIUiqBaSnMpgbNZZXmGpjeqrBSBN6sx+rs2vYmiCFZiavKZItsF+L1LtGuvCCAhi80oMI4F44ryogFGJ86yvGtmRWppRrrpKZk0V9bTu98XREJHuUT96n0u5c9Gpf3zNMvta2hnyjaEpeRpSqg1LjbC2lSFDrKbdH9hJFmj01TfE6K/qo/C2McwfSjHtvbzEBr5LiyJ5Un5dyNg3SKAmEykRcapbmvqZM1EEYCINxlqk9gmw47OHn0oT2Nh75Wrae+m4q7xveqXni+hKNiOJpOptGSqvd1d/mrABFd5FJEx01z2Lkth2JpWI5V7pVar1pEeOwmu1RRzaSHc5WxrNn6Idv/n5X8NL3/K7RbE3NF6BjN73f84NW+C9QncvA1G3zc5R5rQUnyL9okkHaOlvhUunoe9HHuzvaEDK8/ib+Hk2pstncQk6Rs4OfFmSycruCaL25c71lZgvVu4gb3G60W9rNCqvKwAe1EvK7gqL0bms2179Yp1/4EJ4r6T43Gt6uT3U8PB3l53UPgNpYjdGNA71Vrp7aeEmCwKyb/K46AtIFXU2H0O846L1glSJ/tR+QC5LomZ3fdWWp8OxuCMarp8WNSB0Rvx7mOTG+flXZdya+Wt4fXoPpzGiYdvU1nPRqOLjkFf22ZReWLsjaq3/YTsXPEtAB8VgX+pD2GQaboT9MegnNPMYFlfABQQgCF9t7ohyLWEEObWZiYcDCKp8ngHZ5Ra3EExwEy4pjYU5VrYhVMZXpx/oMUZYUwawpvxusAV95DviqZYVRDMxAdifMq7iWFu50qLP32py+uJuddiALg7L+tLhdOvmGSSWpcC1bjZGiv9pcP6UMgr9WxWDxTVsVl3TBP6apkpAvan+MPh9Oigf/j2zdv+weHRXn+yP436e9GPR/vToyOc4pELX6RT5YItSz102PaGF+cQAFfBW9/debOz2/HZEOanFyOX7go6tw1Bq4hV+SAAStyjC5Yw+ane4MgyZWyC6Zq9Vne1RoCyfpa+2kEmUbjn0nlelp13A2XnQfWOYCCAcO36aRzAXBnLssvlBA1da1kUvPwlJ839NQ7gDrXACcN1s4RYGP4dQzhFaagTVkVq8OqyfHZf9+qpqxnuqgdTbsA7lDn/BwH8TovmNZnjpfmqxZelwLH31XfsURvokCkTndcYRhFldqPseO05vrgeQQCT8vIsUTGraGRA+a+LVbnUXbe7tSVITGc5018I3iR//gKH5uxq +api: eJy1V1lvGzcQ/ivCPCXAyjpsKe0+VT6KuOlh2HIfKggGtTuSmHCXG5LrRhX2vxdDUtrLshXD8YMskXN+/GY43IJhKw3hDKaojUajYR6AzFAxw2V6HUMIGHPzYNw2BJAxxRI0qEhtCylLEELw+w88hgB4CiFkzKwhAIVfc64whtCoHAPQ0RoTBuEWWLr5a2ltmE1GNrRRPF1BAEupEmYghDznMRRBU6KYB2C4EbTk4+5cx1DQOvlDbc5lvCEnTfeRTA2mxvrPMsEjm2fvs5YprZXRZYpQMBw1/dql39pw6R9OphJ8mgtRC/1P0i0CiFFHimcUyGtNXVZMFAFECpnB+IGZI4GOmcGu4Taew14unNnOxJCTPIt/hJN7Z9Y7iVHgD3By6cx6Jzu4Fhvi7+uoeRCs843lZonXm3rZobX3sgPsTb3s4Np70SJfvZard6RbBPB24bmYqEYjpl1dtswypdjmWSvTvX4RQIKGxcw0GhWLY041xsRNrQscAQNPDa5Q1SNIFvWVhZQCWWqXnvYFEVdRLph692suxG9apt3rNMvNewh2RuTiM0bG2uAGk+OUXoanrmoBb/k7pPvHDs2ipdbq5E/KlG18tu/F7Uvg1vV+KAqyoVBnMvV8GPb79K/WauEujyLUepmLzq0XhldfEZHMnVLjwCsdwUp4pvrbpMWcw7C08H0JKBfRUzD5XB1OZ8NhG5q/meCxTbxzpZRUr8clRsO4oG+ejU0BIaPa7vcU07xoMLhM9nfpArTVrFeVk9l3mJKeWrMVlpw+LGrB6Exp9yX4KS/n2stVTqKE16F7OI1LB99zhfNxOr1pGXRnWz/Uq5ibznQ/ySVo1pImPKrnwA1sIfQyhY8c/+15lurethzuCghAo3rcTX+5EhDC2phMh71eJGQen7AVpoadMN5jGYdmDBO727kgUdsjNEa54mZj7U1urj/h5iOyGBWEs3lV4I4I5ihTFyt7fMY/IYHnh9JJbtZS8f8cD/xcunZahA5R97acF6++sSQT2Jj3vK09E+rp7JerIxcM+8NRtz/qDkbTwWnYH4Sjs5P+aPAP1Kem5+Sqg89zco3ZBU6X7KfRcnzWHX0YfOiejcbD7uJ0GXWH0c/j0+V4zJZsDK1h5Fi1xnRxrJobF0qwvke3cq3PtsSHytVsOc7TpbRn5svBM+ycRV8wpecIsdWdVv9kcNI/REmv0JncXPtux6IqA5wYYVcj/Z7uEAAmttWBQZb8Um5QlJnUJmFpxV6jGhuvAE9pg99MLxOM2z5mPW99pc7AVyrsbxQNAYSVp9g8gLXUhmS32wXTeK9EUdDy1xwVldw8gEemOFsQdLMtxFzT9xjCJRMaW2HtLwF4d+t73ftOOUbUw92VZUo1+chETr8ggC+4qT8ZbR9f76p+6wUunK+u7balgdblQxeD05hEEWbmWdl5pe/d3E8hgIV/KiYyJhXFCFD6tLFKm7rtOnZtC4Klq5yuixCcSfr7H+CZIWE= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Edit Testset - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + testset + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Input + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/edit-trace.api.mdx b/docs/docs/reference/api/edit-trace.api.mdx index 31793a031e..465aa50082 100644 --- a/docs/docs/reference/api/edit-trace.api.mdx +++ b/docs/docs/reference/api/edit-trace.api.mdx @@ -5,67 +5,898 @@ description: "Edit Trace" sidebar_label: "Edit Trace" hide_title: true hide_table_of_contents: true -api: eJztXFtT47gS/iupftqpcggwA7Obp5MFT00OM5BKwjycFEUptkK02LJXlpnJpvzft1ryRXZCbsPsYbbEAxBZrZa6v+6WP4GWIMlDAt0JjAXxGH+AOweimAoiWcT7PnSB+kzeS0E8Cg7ERJCQSipQZgmchBS6oJ7eMx8cYBy6EBM5BwcE/TNlgvrQlSKlDiTenIYEukuQixjlEilQpQOSyQAbcBK01fchy+60PE3k75G/QKHmcF7EJeUSH5E4Dpin5tz5I4k4tlXaYoErkowmqj0mXP1C+OJmppbBJA2T1Z6eoERS/57Ievfm7GeRCLEP+ETStmQhhcwpu/E0CACXUyzyQg/b6knIHEhj/0coudXD5kp8GtAfoORSD5srKcw1XSAUdtOTpszfyVi/LxQsKnu9qJbCWqWWwmAvqqUwV6mljJudQsJR0N3SfRQTnveOiaBcbpn/pvkO1AC1uequm8xBeRpiPmH8KdIRCQ4QziNZfEj5I4++crhrLHKMI63Op1j37qrJA6YFB7w5YajwayQeZ0H0Fc1Ekkf8EUUBCoRT6vta+M+UigU4EAQhikZhHNB8wt6cSJXOBOGP6xeAZt8y/0fGtyCpmP9o0Lu+v+pfX97fXo8G7kX/Q9+9BMdo71+P3eF171OtceQOv7jDWtPFp757Pa41DYY3l7cXzX4316Pbz+7QXNLNmAa4rCuc9/PL0iXgMIApsF4TlWUgkUTIe5VzviNHMS7pAxWb1aKm1lhLAuX+P6LV5X6pM5FEpsm9F/k7Qno07o1vR/cXN5cugsJVPjXabq4aDe5weLPqTqX2ArWud6ieVkiThDwc7lU1SutzPkrmAJFSsGkqaaPuEt9nGGMkGNQK7w5a11o8nNZbplEUUMJV03pd4DHhpQERv3xIg+C/ScTbfR6n8g0mCT1INP2DelKNke8TdhAiQpDFRivVRVWGXdH3nGyvsmeGeWlGBeVe03bP7GqeqEiY3iId4t0vuTjCJUgfDgYJymYOvFx11WXKQu3HQW1FsJ5dhgUODQ3bJzes0Js5EDD+uBuM99sL7bvTsjD6R2FUvdpNSscaTmuUsU+MP+6FsU8KVZkDc5LMd0yTNjH91Igy8fKRJPO98PJRwwQ3h988GsuVcmmddpjT3NKcaNsnyuVuwVi8ZDyXuot3CNyXJ5KE8Yts5s0X1HJgG8r/z+KggGD6uVEaXMTUXrHuahRuU2xQnEWBaqj+EBCJO469tI8UGVlsUHbE01Y+czsQv3uICjQFT/AG1kHKeNqwyt1eGCkNZUlZS8paUtaSspaUtaSsJWUtKfsqd7GWlLXcx+vgPiwpa2FkSVmbmF4Foiwp+xqdZklZi4p/KymbE7IbNyyW+bTMp2U+LfNpmU/LfFrm0zKfdqtomU9LMLx+qFnm08LIMp82Mf0MiLLM52t0mmU+LSr+5cznS1CPW/KZ6jUWlO5n5rH+i9dto+f3Egz1XQCQZZl6x0jiiCcaz6fHp/jDp4knWJ4dYZR6Hk2SWRq0hnlnOPjKAC9KtVAjPAxeUPVAom5G0kBC99juHg9LEDepPCBDrEjtkSK07E+4gdwSOapXCX4dOO9O18TKFxIwX0VCyxUiEocHik8lYYHar64HehB5taf7QO2uaSLDIAW3mzkQJg+bAsPggQoK97muyhgtzaNucTKuS6vO+5kURWlebd3nl3GpzbfJsR/H48HKgNq3dae6PpOtcX5tS0jlPMLLXBDojr6fpQudWNAnRr92pM6xHf1PCJ1lAdQMywsVT8V1L6kIoAtzKeOk2+l4QZT6R4rdJkeEdUjMFEoT6qWCyYUS6Q36V3TxkRKfCuhO7swOI0SRxkW9W+kSErMrihbKL5rppXIeCfZXwd2r22bmWgpNgPgcVrfGuN8I8ubGQd+kfqsL1o537eP37dPfxidn3bOT7umvR8fvT/4H9ZOwTf3Mw6xN/RrnUfB2Rn49m52/a5+9P3nffnd2ftqevp157VPvt/O3s/NzMiPnsHLAtKtY48RoV7GqtFThUBanqsk4yzHCxjiSqZ+3GAcm5WmIcQjx7AmDwegb0zGI+U32roj0Tb1q1PdaXrvJQlczqdXVBvM5MZhNY+6Koqw+7+OaujaMo3x/MVmuc9E6T64OUTAQk+V3zsV8MzVepqo7oozsWr4UbXJMU4Wqf8U/SWGsMz6LVKooSrJKRK3eoA+OYfvjo5OjY2hmx1pnLHbEk9WbXf4Yo6+W8cpcpw7rVKUDSUn4n+oBziyOEhkSboxXS8a1mZSpTtJvshMHeESY5XqXeaKeQJ6oc7caDk7Aweuwqn3FPEokSiyXU5LQWxFkGTbr48Tu5M6BJyIYmaLJJkvwWYK/+9CdkSChK5Mr9wHwyzAvd29a1S6rPukiwjlm7CcSpPgJHHikC/OSMFXI50VFWOaPL7Smtiq3lfjK7gN3Blqi5yHkNva9M0rf4BajeZpfJhbqgBcEjYrf1UwjtXBVkVTbEgLCH1Id93pI/PobRxQo7Q== +api: eJztWllzGjkQ/itUP+1WDcYXzi5PS/CkwtoBCoY8LEVRYkYYxXNF0njDUvz3rZbm0Iy57Di7eSAPDtXT6m59fak1swZJHgS0JuBw4rLwAaYWRDHlRLIo7HrQAuoxOZOcuBQs4PRrQoV8H3kraK3BjUJJQ4k/SRz7zFXLGl9EFCJNuEsaEPwVcxQqGRWKHpNQ/SDhqr+A1mQNchVTaAHhnKxgY+WEMPF92EwtkEz6SBiptRsLlEkVKcTzGFpA/EFJ4UH1uxYWHN8tAlzG3cQn/Je+Q33cxq9grYFJGghobX1aQWW6ySnR/At15XFAuZwSSb0ZkVshF5Kj3y1YRDxAHvCIpHXJArpXfkeLrbXRDEhi70coGWuxqRKP+vQHKLnVYlMlGVzz1Yx5R+pJEuYdBdb7Va3rmXi9qZYMrVxLBtibasngyrWoTEwVVMVmi7C80JQfk+cAOwZvyh0TTkN5wP599g6UAFP3IwsPoEHDJMCcHQ3avdldt3c7G/dGA7vT/dC1b8Ey6N2eYw977fsScWQPP9vDEqlz37V7Tok0GPZvx50qX783Gn+yh2DsICsJd2j3861m2wpJQF8LkgK8R1SmgJCEy5nKm+/IMxZK+kD5frWoqebolUBD7z/RaoderlNIIhMxcyPvgNo8JJy2Mx7NOv1bG4PCVj41aP27CsEeDvvP3anUdlDrdodqswIqBHl4vVeVlNqnVMrGAiIlZ/NEHts5j9C6FfFgXqbMo8inJFSk7bqKDvgh8f0/RRTWu2GcSKMPGl3vWdvcuejwkaK8FF7UZdsFnhjATzSUFdxSS6sniCxZd1XALBcxvoUkQfwmSWFY7uSCT2HxQ8Pi2UJ9jGacelhPVCCYfq5UChtjytB+2HBbR+HGAp+Fj8eF48t68ks7/im8/rfwyhxrOK0SYPcsfHxRfN2rqDqkOFdXHPi2HGlMWE9D1mnIOg1ZpyHrNGSdhqzTkHU67pyGrFNYnIas05D184fXzz9kvcWUs8WWqibhcEpfBrOj3+Mdkp6+nxzqF5CwQf4CCckTqggijkKh4/vy/BL/86hwOYsxKnErietSIRaJXxumzGC99j3mE+WCaZZdCfo5ZcGZJ0q0ikpyGQOM4theUt44cDLTM7O2hKvIAdootK8vt+D5mfjMU2jVbM4j/nowPSoJ8/HXjurpR27p6Uvq17SaAQZekTYQcQ/Ewz5nGkc8zbKbVYFRc/DpIVfgvrTqlM/wRQGvRnf3Nm41fPvS6KPjDJ4J1L4tO9X2mKw56Sv/gMplhB8CYAHFSVEuoQWNmNMnRv9uSJ2XDf06voGFiHKMLuWZhPvQgqWUsWg1Gq4fJd4ZeaChJGeENUjMoKq7rZ7WOsiq4lpQN+FMrpS89qB7R1cfKfEoh9ZkajKMMLB0qJTZiuSJ2R1F0PS5ENqJXEac/aP9bwFDA5Z6FaKCITssvniwv5Eg9qlxNTVZly5+sOQ06+fN+kXTubhqnV+0mtdn59fNv6B8d7OPz7x+2cdXuUGBqwX5rbm4ua433128q183by7r86uFW790f7+5WtzckAW5gWdXIscuq9xxHLusOMIUGZIfggqScftQ4dOXCDtvCIyJ3FhoDNb7ECwG4X1cpdF161xanSILS0onMmNymWSTiVk38glknzVliRj9aauYrLcBuw3/qgjVO7JvaTDqWbiIVNJk5yCdke+J+0hDPGnkbQ/Ozy7OznelcLqg1h50065AXFlMZSkbxmSpSOTlAV0UqJYAkpLgj+IBWhlHQgYkNOSVqlbJorwASPpNNmKfMFXtld51WtEmkFa0FDYDQAEWYFFeRkIi43o9J4KOub/ZIPlrQjlWp6kFT4QzMkfUJthxllmdWsMjXakGr1pjXfUFZPcTXZcqbRJbmF7Rdl0ay728U6NGD8YYkfP086xABy0nuCn82wLAz7twsaqTirYGn4QPiY5dLRL//QtjpNE+ sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Edit Trace - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, `SPAN_KIND_SERVER`, + `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/edit-workflow-revision.api.mdx b/docs/docs/reference/api/edit-workflow-revision.api.mdx index 25e207207e..52975ed3be 100644 --- a/docs/docs/reference/api/edit-workflow-revision.api.mdx +++ b/docs/docs/reference/api/edit-workflow-revision.api.mdx @@ -5,67 +5,3454 @@ description: "Edit Workflow Revision" sidebar_label: "Edit Workflow Revision" hide_title: true hide_table_of_contents: true -api: eJztWd9v2zgM/lcCPm2A03Td1t356bq2w3r7VXTt7qEICsaWE22y5Ulyu1zg//1ASXbiOMmSLAWCu9vDttjkR/EjRdHUBAwONYS38JdU3xIhHzT0A5A5U2i4zC5iCIHF3Nw9+Pd3it1zzWUGAeSoMGWGKUKYQIYpgxBaknc8hgB4BiHkaEYQgGLfC65YDKFRBQtARyOWIoQTMOOcMLRRPBtCAIlUKRoIoSgsiuFGkEC13M6VN9K5iKEs+w6bafNaxmMCnDcVycywzNArzHPBI+tn76uWGT2briRXxILhTNOvtvstkURYKieA2fhTYhlpCnB9FxXayLQp5F0eSCkYZlAG9aOsEALIp8rrC905dQhlQHDsHkWBRqpfQTyvQRzoqEgx+xXAtxagLINKSA6+ssgsiN4bS1kbrgwgZQabi8A45hQrFJcNWlvL9MkzA8szw4ZMNS2lg+aTWe8W24KIq6gQqJ68KYT4U8use5HlhXkK864SBjcsXU8JlcLxSlabqtCidpXuB2KSNFrpuU+MfpTvuTY/43SZj/PamzF07bLQF7C1/G+vgHTLAGKmI8Vz40vENlBnMxC0JeNVQPMlcuXejNfalVVJPY+5Wagwram3CwpjfzXilavPUJYErZjOZaZd3h0dHtI/DQrhcxFFTOukEJ0rLwxbl/FIFk5pLo2nSz61EhTHBAthIDwsg8XVf1mZr4XvUXHMzN3uAlifel8ctD30Ati9oSZ+7dEjeOIsoDI8wWiXLpx4yMpCYUZLzsltwB0a7Xc0K2vGDCqJdg23dWLF7idAewBqjcOt69EHr14G/zcm/8XG5FNhtuhMWlobtCZO91/em6yidY3mZBuO9rs7iRRDw+I7NDutgqcOtnNiySry+DGM3DhYbyRmgj2CkTMH641UdA3GOzzqKrJej/1hV/G1UysVW7WVirCdWqnoqq3cM9XuuNZP1y9evQxAi2K4Lcxn0t15M27bB1x1NO/O+0LxbVFuFHcIYnsEQQgjhrGdFm1W6R+Lkv1LiBWtyRVLmGJZ1Kg21UL7G50ob30Yymrytm5E9uhM3stGZ4MYfPbEU0eJec6zdRugeYo36bYqQzbwdIhvnf1Ou2zOgPe1f9vLXFmufDmllALF1D2P2Drsugn3BjnooUs7T0n4sHBT/8ewddowsMkY6gztN0LrU2wDiF9Ur+dObmb14uioPab6goLH1rnOuVJSbT+jiplBbk9an5LzAkJGjbebbKmZg8Jl8dTr9zLCqqtP9XDRbcyC4YITWS5qyehc09ufjRLJL2fayzUGUhW9jt3lbpw5+lbF9+319WUL0MW2GVSaV3ZaV01ghwAjSXdjtLkDd60VQi+n+SB76FUDM92rBoa6N1l0L1aC2+DVFZptsWBkTK7DXi8SsogPcMgygwfIe5hzu6c0iwrFzdiqnFxevGNjd6RDeNufFbCHjEuaplgdL8z5O0b0+cs7N9jif7tM8Ld2rm2zlFLyXk1v2M5/YJoLtvSGrB49zYyYXOVoDonqZ37GQ7+ns5bpgKD+DJ4mWjNi9WPqy+B5gr+9TI5fdF++evaq++Ll8VF38DyJukfR78fPk+NjTPDYusWzRFpWqvme5bxzcnkBM18gcHjw7OCwZbMhTJseI7vpK0rtawjmgluHFQJgqd3xYBimf0xf0MpyqY0fe3m8pUk593HvI2zYD9PLBfJspod3CXsLPmFhOuPVdlP6pIUAwoXXuf0ARlIbgphMBqjZjRJlSY+/F0xRYvb9WHpAfN5OIOaa/h9DmKDQrLXauljCkytfE552pkdu04sqeTPKXMoi+gUBfGPjZRfQtvKNql0y8aKnzmrX1qcpVKtcUyl1GidRxHKzUrY/Ux8ub64hgIG/jE5lTCoKiXH6265aWhLsNrHPJiAwGxZ2+AsOkv78A7rD5xY= +api: eJztWdtu2zgQ/RVjnlpAjh0nTnf1tG7TotnuJUjTLrCBEYylkc2WErUkldZr6N8XvOhmO66TusA+pA+pRM2cGR4OqTPyCjTOFYQ38JeQnxMuviiYBiBykqiZyC5iCIFipm+/+Oe3ku6YYiKDAHKUmJImaRBWkGFKEEJlcMtiCIBlEEKOegEBSPqnYJJiCLUsKAAVLShFCFegl7lxVVqybA4BJEKmqCGEorAommluDK48du8ihrKcOkhS+qWIlwZnPUIkMk2ZNo8wzzmL7KwGn5TIzFiTQC7NnDUj5WD8HDeeYKEXQtqrbPlnYue9O/kyqC2ygnMwWVfTmTi0MoAYNe2Jakz7mqW0E/rcAJYBpKQUzndi74L53buXgV/ex8H8gTZdiElFkuXac/sYqPMWRBlAJAk1xbeoD0rfKwfbm2gTpMjjHxHkg4P1QWLi9AOCnDtYH6Sia7Y02/NAZVyR9XJp92XD10GjVGzVUSrCDhqloquOckdSfUe5fvTuZQCKF/PHwrw3vmUAh5uom13C7fm/BVLMPlGkW2dv9YZ4Y102oe1hozFGjV1AjGNmtivyy+5Z+m0eWKZpTrIbLZ11R2ZCcMLMDm2PBRGTUcFRPntTcP6rEln/IssL/dxMrzNdg8E0pfs5oZS43Mly19Uwvhnv/rPXs+neD/iwZTp3nltWCaVmCUb6gLtm4iH9nqki7Jdx5bw92zuUDLNDJvvRIVb72909jFwPsS3jjSXe9K5UDGwzbiTMTaNDpveDXDkFBGVp0CSpXGTKbbDRcGj+67x04X0RRaRUUvDelTeGRwulSBTOaW2/tt4N1sJm1miq/YluqNqL6TZ5LredzPnpO+pOR6NNtj4iZ7HlovdaSiEfT1VMGhk3V/58WTfgIuo8fcjxOC3XzqRm1r8Jl6AVg2q+TW1vEXvO5H5TS0bv2jz91jqYebnQ3q6zFSt6Hbv3T+Pc0bdre729vr7cAHRr213U1zHTvaoaeldNQ5OSXgjT8pizOnBtSwiD3NQufRnMUNGgaoTUoKpoNVi1ep4SAlAk76quqJAcQlhonatwMIi4KOIjnFOm8QjZAHMG6+lN7NPeK2NqDy5FUSGZXlq8yeXFO1q+JYxJQngzbRu8N7XnqqlrVi8k5uwdGV59s+Y6EPavKxHfri2clyHOVPVV02O9/oppzmm9R6q6IjhJ8KdxcnbaH784ftE/HZ+N+rOTJOqPop/PTpKzM0zwDKpuB0bD0bg/HPePx9fHJ+HwOByfHg3Hw7+h1bY0peczru+7pNXD7YZgV4S2pt9l15blu+zWlPW+VKxJ5b0Z7Grffd1qMdvw5VRpc/8QuFo9MnUbFUqLtGq8mbqlO+QFalMX9diiSDFz91252JI4ZvOwiNxgJLKEzQv3NcIMreuXfVNtS5KnSvr+SjpE2ayVwJrY27umGwH3tLD/j4U9yHnwtM2fqqE+GqyKY1kirJapGkcnlF5i9JmyuPN6Gx4dHw3vU1beoTe5vPB6vlsxzsxw3dFutWqDACi1Yh40YfpL88BkmQul7TxqvHv15trnUK/RNH3Vg5wjs5rd5rDyWvQGvBaFAIwahQBqPQpNj2Wuw/Z3+GkAC6G0AVitjOMHycvSDP9TkDTCcuoP0plh9mYFMVPmOoYwQa5oI9e6C4JnV17sP+81X0a6c6jEZ7a05zUvzB0E8JmWaz8Y2E5mUYnblbd45YL1bb/RIGy0X6Y1ch6TKKJc77SdtvT+5Ydrw6j/FSEVsf0hAw3N5q9NVti5u98HzNgKOGbzwqlUB2n+/Qe0fzsc sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Edit Workflow Revision - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + revision + object + + required + + +
    + +
    + + author + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/edit-workflow-variant.api.mdx b/docs/docs/reference/api/edit-workflow-variant.api.mdx index 98c473da0f..5dc81c3d24 100644 --- a/docs/docs/reference/api/edit-workflow-variant.api.mdx +++ b/docs/docs/reference/api/edit-workflow-variant.api.mdx @@ -5,67 +5,1678 @@ description: "Edit Workflow Variant" sidebar_label: "Edit Workflow Variant" hide_title: true hide_table_of_contents: true -api: eJztWN9T20gM/lcyempnHEIppXd+OkrpwLW9MkB7D0yGUex1su3a6+4PaC7j//1Gu2s7jpOUUjrXuTseILGlT6tPWkloAQanGuIr+FOqT5mQtxrGEciSKTRcFqcpxMBSbq5vw/vrG1QcCwMRlKgwZ4YpAlhAgTmDGFYFr3kKEfACYijRzCACxT5brlgKsVGWRaCTGcsR4gWYeUkQ2iheTCGCTKocDcRgrUMx3AgSqA87+OBtDE5TqKqxh2bavJDpnPBWLSWyMKww9ArLUvDEOTn6qGVBz9qDlIooMJxp+tbzvSeRCUfjArCYv8scHV0Brq8Tq43Mu0LB4YmUgmEBVdQ8KqwQQC7VPp/qwZFHqCKCYzcoLBqpvgfxuAHxoDObY/E9gCcOoKqiWkhOPrLErIndK0dZH66KIGcGu4fANOUUKhRnHVp7xwypswTLC8OmTHUt5ZPuk2Xv1tuChKvEClSPXlkhfteyGJ4WpTWPYdVVwuCG5XdTQqVwvpXVrir0qN2m+5aYJI1eev5MjP4h33BtvsbpJh9Xtb+NoUufhaF63cn//glIt4ogZTpRvCRX7wv1cgmCrmS6DWi1QG69m+mdbmUoqMcpN2vl24p61S+L46145742Q1URsGK6lIX2Sbe3u0t/OvzBhU0SpnVmxeA8CMO9S3girVdayeH2xEdOgoKYoRUG4t0qWlv5N5X4Rvbhgtb0OYpeBKgMzzAxD2jhMEAGC//3sf9gH3tnzT0aWU/rGzqZ1/2Xt7JttN6hl92Ho5+7mSWKoWHpNZo7Vq8UDRsa7s6z2cqRhx0cOrJsmf4II+89bDCSMsF+gJGXHjYYqemazB+w3tdkvZiHil/z9aBWarYaKzVhD2qlpquxooWd3jdXL0j3H5y41nWQu2s3A5Ifrvb39vrz1AcUPHXT0uBYKanuP0ylzCAXbhzw7WFVQMik8/ZbKvG4WukordNvpD8gxSnX03Ubg7ZbaI1T1pbPzaKOjMElvf3axEt+edNBbincLb2e3c1uvPT0bQvvyeXlWQ/Qx7YbVBqsB6vrEHCjx0zS8oZ6SOQ3LzGMSsVuOLsd1bOqHoXBVo8WaxY3FUSgmbqpVzxWCYhhZkyp49EoEdKmOzhlhcEd5CMsubsAmiVWcTN3Kodnp6/Z/IRhyhTEV+NlgQvKL58xXbEmWFjy14y4C8ulQ2tmUvG/fBqEtdLMaxE5lLnn7Q7o+AvmpWCbdjjNtLs01fpFUXcubZ6FsZK+t+NdO5M0nbdNsm60msdUZeBphr88yw72h8+eP3k+3H92sDecPM2S4V7y68HT7OAAMzxwXvEik46Uemh3lA8Oz04hAgqOR9/debKz27PZEaYLj4lzvmbUvYZoJbZNVCEClrvbDoZh/lv7gk5WSm3CpB3wNiXkyjgR4mvYFzMqBXJ3p90RFiFZryAkK7T/hmnyNyQsRBCv2zWOI5hJbQhgsZigZu+VqCp6/NkyRUk5DiATIvNqASnX9DmFOEOhWe+sTZWER+ehGDwetGNd14c6cYu5O6uw9A0i+MTmG5ajruLN6guyCJJH3ujQ1aUWqVemqYR6jcMkYaXZKjteKgxn7y8hgknYlOYyJRWFRDf9doeWjgN3RdyzBQgsppYKawwekn7+Bv7Op6k= +api: eJztWNtu20YQ/RVhnhKAsmTZclI+Vc4FcdOL4TgpUEMwRuRQ2mTJZXaXTlSB/17MLkmRkqXKhvNS1A8yuTvXw9mZQ67A4txAeAN/Kv0lkeqbgWkAKieNVqjsIoYQKBb29lu1f3uHWmBmIYAcNaZkSbOBFWSYEoRQ7d+KGAIQGYSQo11AAJq+FkJTDKHVBQVgogWlCOEK7DJnTWO1yOYQQKJ0ihZCKApnxQorWeCTN927iKEsp94iGXuu4iWb2XQQqcxSZnkL81yKyKU0+GxUxmtr/7nmhK0gw3d1glsbPsEVYLb8I3EpdwMvg2YlK6QEDrEO/XfWLQOIyURa5BzIY029bpkoA4g0oaX4Fu0+gy1QY7TUt8LFs9vLK2+2N7HspMjjH+HkozdbOYlJ0g9w8tqbrZzUcM2WXKGH+XFleAhY50tXm2u8ntRLjVbjpQbsSb3UcDVejCzmj63VD6xbBvB04fmYEuna1j0m1ewzRbbVNOrG9tapbJsuA0jJYowWuwYxjgUfMpSXnTZwAA4iszQn3fWWzrorM6UkYeaW7vcFkdBRIVE/e1tI+YtRWf8iywv7nNPrpMs2hKX0MCXUGpd7Ue6qMuLb/nbp/lajWQaA2ooEI/uE9TmpTFbVWXt4WDHURu6rh61kt9WrQQT3ya6n0E0zSqY7TVz5EQZlybY0mVxlxtfZaDjkf52JAR+KKCJjkkL2riphePSki1ThlTbKttXYnEQZtIfi4Sg3MB0Echs4H9k+2KrcPW6no9E2VJ9QitgB0XujtdKPxykmi0LyVXXGNgWkijq7D2kR03LjXK6T/lX5APkBpGZ+H1VaHzpjcE7rk7pb1IHRu+bdf3sMnJd3XclN22SshtejuzuN1x6+fQfr3fX15ZZB/2y7D/VNLGyvLobep4aLpmQXiskqt6vAU84QBrmmO0HfBjM0NKgprBlU1WwGqzVbLSEAQ/quprOFlhDCwtrchINBJFURH+GcMotHKAaYC9iMbeJ2e69Y1LUsQ1GhhV06e5PLi/e0fEcYk4bwZtoW+MCF50upK9Y8RczFe2JQK5Y9KexCafG3r4+KaC+8FqPGJX21psdvvmOaS9qgt5WtpkK66TTLbYYJo+Fo3B+O+8fj6+OTcHgcjk+Phqcv/4IuSdwn1+Z5++Q2qBqcJPhynJyd9scvjl/0T8dno/7sJIn6o+ins5Pk7AwTPIMt7nWo2gaZOlTNs6M1WA/RbViMMLdRYaxK61cXYW7pDmWBVunW2qJIMfP3XdqyOWoPjaA9Pf+vhv9MNbjGKbJEuQ5SEyffns4x+kIZv1Zzq/MPd3h0fDTc1c8qhd7k8qIaod2C8WIMdadjNr0SAqDUzU+whOnP6w2OMlfGujQae7ta/Marc9UYLX23g1yicFPShbCq2v8NVO0fAuABAAE0IwAaSsOXYeujxTSAhTKW1VcrVvuoZVny8teCNPfyaaU7Y1hvVhALw9cxhAlKQ1uRNqwDnl1Vw/V5b83GuxnU/T5buhBlwXcQwBdadj+uOOKwqMfJqhJ45X313XhfG9hiO8xEvMYkiii3e2Wnrfl6+fGa4aw+uaQqZhWNjDH/uliVS93VsltbgcRsXjA/CcGb5L9/AI59IyU= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Edit Workflow Variant - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + variant + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/edit-workflow.api.mdx b/docs/docs/reference/api/edit-workflow.api.mdx index b56a3b520c..cbc4d9d9ee 100644 --- a/docs/docs/reference/api/edit-workflow.api.mdx +++ b/docs/docs/reference/api/edit-workflow.api.mdx @@ -5,67 +5,895 @@ description: "Edit Workflow" sidebar_label: "Edit Workflow" hide_title: true hide_table_of_contents: true -api: eJztWG1z2zYM/is+fGrv5DhNUnfTp7lJevHarrm8rB9yvhwtQTZbSlRJKqnn03/fgdSLJTmu46a33rZ8SGISeEA8AEEYSzBspsG/gY9SfY6EvNcw8UCmqJjhMhmH4AOG3NzeF/vgQcoUi9GgIsUlJCxG8KEUuOUheMAT8CFlZg4eKPyScYUh+EZl6IEO5hgz8JdgFimpaqN4MgMPIqliZsCHLLMohhtBAuXheuMQ8nziIFGb1zJcEE7bQiATg4mhLZamggfWmcEnLRNaqw+QKnLVcNT0qfKxsxMJS9MSWLL4EFm3mwJc3waZNjJuChUOTqUUyBLIvWopyYQAcqX0cax7xw4h9wgO75jImJHqexBPKxAHOs9ilnwP4JkFyHOvFJLTTxiYNbF6YynrwuUexGhY8xAsDDmFiInzBq2dYxapsgLLE4MzVE1L8bS5surdelsQcBVkgqlnbzIhftcy6Y+TNDPPoe0qYXCD8XZKTCm22MhqUxU61G7SfU9MkkYnPX8mRv+Q77g23+L0IR/b2o9j6MplYVGltvK/ewLSzT0IUQeKp+TqrlAnKxB0JcNNQO2CuPFuhlvdytOQm7WCdQm9qevgZD3Ahau+kOeEpFCnMtEuvQ729+lPgym4zIIAtY4y0bsohGHnIh3IzCm1srU+6rGVoHBFLBMG/P3ca9T2h4r4/1X+P1jlP2RmhzLf0XpEnXe6//JCv4nWLSr9Lhz93KU+UMgMhrfMbFnyQ2awb7g9z8NWjh1sb2TJytLwRxi5drCFkRAF/gAjJw62MFLSNV3cPt0jWZL1emG/SdR8PamVkq3KSknYk1op6aqsaJHNds3VS9L9J/qRdU/HFmpVG+FakKODg27X8ScTPLQ9Re9UKal2bzlCNIwL2wC4B6EtIGTQ2H1M7Z3krTek9vaddAekyMR6tu4bc/0+aM1mWBfMh0UtGb0r2v1WI0h+OdOF3EqAa3oduw+7ceLo2xTXs6ur8w6gi20zqNR+9j7Ws4gYzVzSkIJeC89NHHwYpArvON4Pyq5PD5Yr84kcPNCo7soJRqYE+DA3JtX+YBAImYV7bIaJYXuMD1jKbWZrDDLFzcKqjM7Hb3FxhixEBf7NZFXgktLIJUZTrIoJS/lbJIqK2ckoM3Op+F8u2sX0ZO60iANK0It65HH6lcWpwPbIompfV9pUNw9pNprVWtEn0ue6X6ubjOoprXOoGYxqmcoGHEbsl5fR8Kj/8tWLV/2jl8OD/vQwCvoHwa/Dw2g4ZBEbWm94EklLRhH8kaW6NzofgwcUFIe+v/dib79jsyFM95kF9j6XTNpt8FoxraIJHmBsLzMYZPFv9QadLJXaFK1zgdfOt1ZfUMTT4FczSAXj9qpa08siF2+gyEWov4No8MBfnZdNPJhLbUh6uZwyjddK5Dktf8lQUcZNPLhjirMpMXazhJBr+j8EP2JCY+dgVaWDZxfFhX7eq5ux5oHLrEwoJSlP6BN48BkXrcGerVbzMuuXhcSxM9a3NaVG6JRYKn9OYxQEmJqNspOVy31+fQUeTItpXyxDUlGMOKXf9rDS+m7z364tQbBkllFR9MFB0s/f9M8rvQ== +api: eJy1V21v2zgM/isBP22A06Rp097506Uvw3q7l6IvN+CKoGBsOtEqW54kt8sF/u8HSnYcJ22WFV0+JLFEPiQfkRS9AItTA+EdfFb6IZHqycA4AJWTRitUdhFDCBQLe/9U7UMAOWpMyZJmxQVkmBKEUAvcixgCEBmEkKOdQQCavhZCUwyh1QUFYKIZpQjhAuw8Z1VjtcimEECidIoWQigKh2KFlSxQO9e5iKEsxx6SjD1R8Zxx1i1EKrOUWd7CPJcicsH0vhiV8VrjQK45VCvI8NMyxo0dH+MCMJv/nbio266XwXIlK6QE9rF2/i/WLQOIyURa5OzJa6HOViDKACJNaCm+R7sNcIXWGC11rXD+vGzl1MN2RpaNFHn8M4zcetjKSEySfoKRMw9bGanpmsw5R3ez4xJxF7JO5i45G77e1ErN1tJKTdibWqnpWloxspi+NlevWbcM4O3c8z4l0nWsZyDV5AtF9pm28cGpbEKXAaRkMUaLbUCMY8FFhvKy1QZ24EFklqak29bSSXtlopQkzNzS87YgEjoqJOp3Hwopfzcq615keWHfc3itcBlDWEp3U0Ktcb6V5bYqM75p7yXdP2s2yw21zVMZaSsSZMRnhJuOfte05fEmyJW/CKAsGUWTyVVm/GEN+n3+abVduC6iiIxJCtm5qoTh1fdFpAqvtHb2K93BSZRB62rZPXEbijZz9zuked+eZawK21N2OBhssvQPShE7DjrnWiv9eopisigk/6tydF1Aqqi1+yMlNi7X8rqJ9g/lHWTuUzN9bthoktYYnFKT6S+LOjI6N7z7Pf45Lm+6kls5ioZez+7LYZx5+raV08ebm8sNQH+27UM9j4XtfG7GuJTsTPF8x2Ue+GEthF6u6VHQU2+Chnp12preYmW+KyEAQ/qxngALLSGEmbW5CXu9SKoi3sMpZRb3UPQwF7Duy8jtdk5Z1HUQQ1GhhZ07vNHlxSeafySMSUN4N14VuOZE86nTFlueGubiEzGJ1WA6KuxMafGfz4dqNJ15LWaJU/iqmSfPv2GaS1qfByuwZUq041kur45kMOgPht3+sLs/vNk/CPv74fBwr394/C+0p6ptcquD0Ta5tdkGDhL8ZZgcHXaHx/vH3cPh0aA7OUii7iD69eggOTrCBI9gY1jZVW1t+thVzY8TDVk/oru89oW5jwpjVVoP+8Lc0yPKAq3SK2uzIsXMP7fveVcaIkuUy5mqiqqEPMHogTJ+9eDk9mfb39vf67+UwZVCZ3R5UTVJbtdNvngxZrpVI8vqgAAodR0SLGH6W7PBXubKWBfFEm+9iNdeKqoSsPTN9nKJwvU/Z3pRFfgdVAUOAXCJQ3M3GQggXH2NGwcwU8ay0mLBwrdaliUvfy1Ic62OA3hELXDCJN4tIBaG/8cQJigNbfi3vEXg3VXVLN93mumk7XddzxkXM58wP0EADzRfe990N8Gs7heLSuLUG+u6ft0gbFxffLV4jVEUUW63yo5XGufl7Q2zWL2EpipmFY1MLX87Z5WL3WWuW1uAxGxa8IUTgofkz//0fDpz sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Edit Workflow - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + workflow + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + workflow + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/environment-revisions.api.mdx b/docs/docs/reference/api/environment-revisions.api.mdx index ffc94468d1..b276bc585c 100644 --- a/docs/docs/reference/api/environment-revisions.api.mdx +++ b/docs/docs/reference/api/environment-revisions.api.mdx @@ -5,36 +5,36 @@ description: "List App Environment Revisions" sidebar_label: "List App Environment Revisions" hide_title: true hide_table_of_contents: true -api: eJy9V99v2zYQ/leEe1oBIk6DPelpXhusQdslSLPuwTAMRjrbbCWSJU9ePUH/e3EUJUu24wTJ1ifb0vH77r77wXMNJFce0hlMrfUwF2AsOknK6KscUkC9Uc7oEjUtHG6UV0Z7EGClkyUSOj5bg5YlQgrS2oXKQYDSkIKVtAYBDr9VymEOKbkKBfhsjaWEtAbaWj7lySm9AgGkqOAHU2uTqxyaRvTIQz/CoydzRMzLHUDyJwM0zZzPeWu0R8+mF+fn/JGjz5yyLAGk8KnKMvR+WRXJbTQGAZnRhJrYXFpbqCwoNvni+Uw9oLeO9STVMrTBPBx465jodHyCRIIZvmBGj9jftFbxTI62MFvMF0y0kU5J3QFIvb1ehpyOoTgX8YmuigJYvQ78bYRL2KvPLdw+U8fSSfAino6j0+toPF25/teB3UbcGGFHc5RDacIVupMkHd4QLFSLIiz9YRGdTvShU3uuHCcuTa6WCvPF/fYU+sdolvy+fVT3/0X0HWvZ9d+zKQJCw81clooWJXovV88uzjcBJfkYURjXoSQWh05J+qa1Sqb0s/qlEd0Jc89DYTQ/ZxAGeJ/EcWmMghowDabrMFORRjont0cKz7ONcSup1b9hgL6gVa8HMLEz/zHuq7cywxfA/t1hxAvppHLxYupvwcFoHrb2cd2uK7IVXX4n1DnmC2gapvv14uLwTvosC5W3kV46Z9zzL6QcSarixLApTDZ6+wQN+5k3f7gCPpjWwTB6/OrkyNk1VGvysGkQI7njt4+liuNqqaPdICk7eVt1Hw7jbSvfMbLO5N3d3c0BYJvbcVI/KE9h5A03ldvBylUirQ3vZCuksIHRGlKYSGv9pG5rrpn0VTap91emBgR4dJtuZ6tcASmsiaxPJ5OsMFV+JleoSZ5JNZFWhUbwmFVO0TYcmd5cvcftO5Q5Okhn86HBJy6xtmjGZn2+pFXvkeWLO920orVxsWe7hW7dnmJ9lF6a4Qo3Dc4l05srEMBhtMKdn70+O4d9OUfG3B0yo90KFl+D2FOhjx8EYBlaAwhl+dvuBXtmjadS6gHeo9kbeddLQvidJraQKnRC8KWOmZ1xI/PJtJ8nwwU8PdiI5wLWxhOfrOt76fEvVzQNP/5WoeMEzgWEa+We5ZzVkCvP33NIl7LweOBkP1Tgl9vYO68SEMed75KsOcMbWVT8CwR8xe3unwGPiZ/IeqBRmEnrrn7raDbNMrQ0ADgYoVzoff/9cXkHTfMDOiGNWQ== +api: eJy9V99v20YM/lcEPq2AEGfBnvQ0Nw3WoO0SpFn3YBjGRaKta6S76x3l1RP0vw88nWTJvxIkXZ9sS7yP5EfyO7oGEisHyQymxjiYx6ANWkFSq+sMEkC1llarEhUtLK6lk1o5iMEIK0oktHy2BiVKhASEMQuZQQxSQQJGUA4xWPxWSYsZJGQrjMGlOZYCkhpoY/iUIyvVCmIgSQU/mBoTXWfQNHGPPIzDP3q2j4B5tQWI/mSAppnzOWe0cujY9OL8nD8ydKmVhimABD5XaYrOLasiugvGEEOqFaEiNhfGFDL1jE2+Oj5TD9wby3ySbD20yRxPvA0s7nh8BkUxe/iKKT1hf9tahTMZmkJvMFuwo7WwUqgOQKjNzdLXdAzFtQhPVFUUwOx14O8CXMRRfWnhdj11XjoKXuWn89HxdTCfrl1/dGJ3ATdk2Lk56EMqwhXak046vCGY7xZJWLr9Jjpd6P2gdkI57LjUmVxKzBYPm1Pon4JZ9HbzJO//C+lbr2U3fy924REaHuaylLQo0TmxenFzXnqU6FNAYVyLgpgcOkXpZWsVTelnzUsTdyf0A4vCSD9n4AW8L+K4NUZJDTwN1HVYqeBGWCs2BxrPsY22K6Hkv15AXzGqNwOYMJn/aPvojEjxFbB/dxjhQjrJXLiY+ltwIM3HNfdYzZ+haqMybaXjcF1uKjIVXX0nVBlmC2gaTue3i4v9O++LKGTWMnllrbYvv/AyJCGLE2JW6HT09hk16jV1frzDPuo2QC9tbnVS0rYD25ocN/VkRPf89qlW4Lxa18FuUJQtvS27x9N419J3yFln8v7+/nYPsK3tuKgfpSMvqcNN6G6w0pVIueadb4XkNzzKIYGJMMZN6ranm0nfZZN6dyVrIAaHdt3thJUtIIGcyLhkMkkLXWVnYoWKxJmQE2Ek7IY49W+jSzb1U+gwraykjceb3l5/wM17FBlaSGbzocFn7r+2o8ZmfTGFkR+QuQ0L5bSiXNsgGN02mbenmDyplnq4P4bY3or0ERWPHufZhn1+9uvZ+bFkwoFoensdxkiktN0FgxnEO3T1REEMWPoZAkJR/r59wVEa7agUaoD3ZJlHUfb0EH6niSmE9CPjY6lDC8x44vlk0gvb8J9Asreaz2PItSM+WdcPwuFftmgafvytQsvFnMfg9eyBqZ3VkEnH3zNIlqJwuBdkrz7wy10YsjcRxIeD7wquuNprUVT8C2J4xM32LwrryU/0useRF6+86+U6mE3TFA0NAPa0lpu+H9Q/ru6haf4D6TXAew== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> List App Environment Revisions @@ -43,29 +43,731 @@ List App Environment Revisions as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + +
    + + deployed_app_variant_id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deployed_variant_name + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deployed_app_variant_revision_id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + revision + object + + required + + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + + + revisions + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + + + +
    + + deployed_app_variant_revision + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deployment + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + commit_message + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + deployed_variant_name + object + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/environments.tag.mdx b/docs/docs/reference/api/environments.tag.mdx index d816445626..52a71c5ae9 100644 --- a/docs/docs/reference/api/environments.tag.mdx +++ b/docs/docs/reference/api/environments.tag.mdx @@ -5,16 +5,9 @@ description: "Environments" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/evaluations.tag.mdx b/docs/docs/reference/api/evaluations.tag.mdx index 444539c5cd..3eef824932 100644 --- a/docs/docs/reference/api/evaluations.tag.mdx +++ b/docs/docs/reference/api/evaluations.tag.mdx @@ -5,16 +5,9 @@ description: "Evaluations" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/evaluator-data-map-evaluators-map-post.api.mdx b/docs/docs/reference/api/evaluator-data-map-evaluators-map-post.api.mdx index 257dcd8fba..b0b4945d9c 100644 --- a/docs/docs/reference/api/evaluator-data-map-evaluators-map-post.api.mdx +++ b/docs/docs/reference/api/evaluator-data-map-evaluators-map-post.api.mdx @@ -5,74 +5,393 @@ description: "Endpoint to map the experiment data tree to evaluator interface." sidebar_label: "Evaluator Data Map" hide_title: true hide_table_of_contents: true -api: eJztVk1v4zYQ/SvEnLaAaqdBTzrV7QZYY7uIkbi9OEYwkSYWtxLJJUfZuIL+ezGkJH+kmy1yri+WyDfDmTdvhuqAcRcg38DVE9YtsvUBthmUFAqvHWtrIIcrUzqrDSu2qkGnuCJFz468bsiwKpFRsSeSfRr9KG2Y/CMWNLszd2bhdyG/M0op5elLS4HVu5v08EOu1hVNy/bhMxU8S1iH+9piqd5N8X1C57TZLY1reTkeMbgY0YU1jNpos4uxjp4l0BjMDXHrzRjPuevrlo995ynfKa8moZSNsCFcyMA68iiMLUvIYcLfy6n3Dbr7aSnEV2eDmA3B/WrLPeQdSOhkWB7RuVoX0eX8c5BKdBCKihqUJ+flQNYU5E0LHfEJy1KLCdarIwT7ljLgvSPIYQqZNdeysEzWfQZDcm91NDAIff8SI4lqT6WobQj3cN724OP1SkMvvg++JJ64EJw1IZFxeXEhf6civm2LgkJ4bGt1M4AheyvdqfZv5vt6MP8eTeMxr7BzJlahp8/g58vLlwz8ibUuY37qynvr355+SYy6jrpjasJLQG2Lk100++tHyDfdmG5gH3WSTSsyLnbkod8eSEHvcX/E2+82BRiVGqJKT/0dKZFCwB3B5Ozb0EiGWsvu9woieaWjB9xRZQ70Jna/ncb7RN+/HTZCPqzXqxcOU20b4srKiBkGiEOuIIf5YbzMG3SQQSD/RD5E2ltfQw4Vswv5fF7Uti1nuCPDOEM9R6eh34pF0XrN+2iyWC0/0v4DYUke8s32GHArwkilPoVNLKPTH0mSNtjI+6Llynr9d6pfBloUWSUryUokd3MYhVfP2LiaTkbbyXgSG20ebTxyIG0RE1KL1RIykNST7i9mP80u4PxSOwHHC6OIfTDGG7chO2Nu4gwyoCY2ATBh88thQyKT0jRojvxNfavey3X5KVboJKKj2f//jfufbtxBakzPPHc16jgXYr26oSs2h3t4uG2kYytpnHwDXfeAgf7wdd/L8peWvEh/m8ETeo0PIqqNjKNqbIIO/qI95PBbqtSPcWgIvG6T6M9mqMy3ZLEoCnL8KnZ71Nur69s1ZPAwfBU0thQbj19lIOFXyCF+cYh17MK41kGNZtfK2Msh+ZTfP9pQebg= +api: eJztVk1v2zgQ/SvEnLqA1s4Ge9Jp3TZAjW4RI/HuxTGCiTSx2EokS1JpvIL/ezEk9WFnkxY51xdL5JvHmTcfVAcedw7yDVw8YN2i19bBNoOSXGGl8VIryOFClUZL5YXXokEjfEWCHg1Z2ZDyokSPwlsi3qeeR0jlyd5jQbMbdaMWdufyGyWEEJa+tuS8eHMVH37LxbqiYVnffabCzyLW4L7WWIo3g3+f0BipdktlWr/sj0gUPbrQyqNUUu2Crz0zOxqcuSLfWtX7c0p92fopdx7jHeJqIkroAEvuQgbakEVWbFlCDgP+lk+9bdDcDksuvBrt2Cw591aXe8g7YNdJeX5EY2pZBMr5Z8eZ6MAVFTXIT8bygV6S4zfJcoQnLEvJJlivJghvW8rA7w1BDoPLXvqaF5bR+pBBCu61RElBOByeYjhQaankakvujudtR46XMw0H5h652J+w4IxWLopxfnbGf8dFfN0WBTl339biKoEhe63cMfev1vsymf9Ipv6YF9Q5KVaW55DBn+fnTxX4F2tZhvjEhbXavj78kjzKOtSdp8Y9BdS6ONpFtb+8h3zT9eE6b0OdZMMKj4sdWThsR1HQWtxPdPtbRwdDpbpQpcd8k0ok53BHMJA9Dw1iiDXv/ighHFc8OuEmmRnljeo+H8b7KN//HdZDPqzXqyeEMbcN+UrziEkDxKCvIIf5OF7mDRrIwJF9IOuC7K2tIYfKe+Py+byodVvOcEfK4wzlHI2E06G/CLviHUPhsGW6orXS7wPfYrX8SPsPhCVZyDfbKeCaqybWwTFsSAEa+ZFYEYUNvy9aX2kr/4vJzUCyA1W04pC5Hq/GOXnxiI2p6WjuHc0utpHqXocjk6IpnrdYfCFVQgasTQz1bPbH7Ow5AZKBWKyWqWGwCA3T+x5gkJ1IPIgLGVATugU8YfPXuMFecg4bVBO+ocHFe75XP4VUHnk2uSR+Xc0/dTWnsvP06OemRhkGSMhXl9pnM17Y6Vri1q64w/INdN0dOvrH1ocDL39tyXIbbDN4QCvxjgtsw3Or6huigy+0hxzexUz9HqYLw+s2NsDJsOVBGC0WRUHGv4jdTobA6vJ6DRncpc+HRpdsY/EbTy78BjmETxO2Dh0Z1jqoUe1ano85RE7+fQeh7IhH sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Endpoint to map the experiment data tree to evaluator interface. Args: - request (Request): The request object. - payload (EvaluatorMappingInputInterface): The payload containing the request data. +request (Request): The request object. +payload (EvaluatorMappingInputInterface): The payload containing the request data. Returns: - EvaluatorMappingOutputInterface: the evaluator mapping output object +EvaluatorMappingOutputInterface: the evaluator mapping output object - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + inputs + object + + required + + +
    + +
    +
    +
    + +
    + + + mapping + object + + required + + +
    + +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + outputs + + + object + + + + required + + + +
    + +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/evaluator-run-evaluators-evaluator-key-run-post.api.mdx b/docs/docs/reference/api/evaluator-run-evaluators-evaluator-key-run-post.api.mdx index 62d259236d..73d8671fe2 100644 --- a/docs/docs/reference/api/evaluator-run-evaluators-evaluator-key-run-post.api.mdx +++ b/docs/docs/reference/api/evaluator-run-evaluators-evaluator-key-run-post.api.mdx @@ -5,75 +5,328 @@ description: "Endpoint to evaluate LLM app run" sidebar_label: "Evaluator Run" hide_title: true hide_table_of_contents: true -api: eJztVk1v4zYQ/SvEnLKAaqdBTzrV3QZYI1nESNJeHCNgpLHFXYnkkqPsuoL++2JIWR/2Jm0D9FZfLIozjzNvZp7YAMmdh3QNl8+yrCUZ52GTQI4+c8qSMhpSuNS5NUqTICMw2qG4vv4opLXC1fpBP+iF2/n0QQshhMMvNXoSZ7fx4V0q7gvsX5unT5jRLNri4djHz7gXZ55cZ81LsxVU4GDT+Vi5L43MxVkf81Lbmpaa0G1lhh3CwSwzmqTSSu8C2iGMXJKcceS3SLXTQ/C+LikVPfZNTWPwLvxjVBOs/AwSMBadZOaWOaQwJOhq/div/OPjJPXHsG2NJ0jASicrJHRcmQa0rHCC9Bn3kIDi0lhJBSTASSmHOaTkakzAZwVWEtIGaG/Z2ZNTegcJkKKSX/T5iSvcQ9tuIgh6+s3ke/Y8xuSMURNvSWtLlYUk558890gzOtI6poAUel4prk14knmu2EWWq5FFBO/CjOSOwlxG7zYBj0RK7yKS3t9sAzf/HLNNejJ0XZbAGR9OuTtgtwlkDnPUpGT5nxz1fgTfti8n/kJvQ9uyl0NvjfaR4Yvzc/6bzuxdnWXo/bYuxW1nDG+uYdfdby3iTef+o3yHLlv3x2x+QMPRGHY8/HJxcZr6n7JUeUhMXDpn3NvzzpGkKkMXE1b+1KA02WR36Jbp3I06QmnCHTpoNwMb0jm5HxF2bWKA3I+V3702xx/Re7lD6MFeGXkmQ9zz7t9VgvOKR3d2o5IM9EZ2X07j90jfa23+4f5+dQIYa1shFYYltFdFKiCF+aCh82aiie3c1RpYKdzzQTtrV0IKBZH16XyelabOZ3KHmuRMqrm0Kgynx6x2ivbBZbFaXuH+A8ocHaTrzdjgjhslln5q1rMurboK8typ9qKmwjj1V6xnp9pF9OIsuQVvB+G9/CYrW+JEOKfidyJRjKL01oQgOloXIUWxWC0hASYjTsb57OfZORx/3ifG4buWhUk5ZBC2ITnismcREsAqjAkQyurXYYMj4+JVUo/whi/PbSjXJJhmGNX/rx3/6trR9R/hN5rbUqogHqFkTTc66+EK4SGB9PhCwdOzSaDgcUvX0DRP0uMfrmxbfv2lRscDskngWToln7jR1g3kyvNzDulWlh5fqWcoDCvMO/FSvIch0hwPh8crSIADPL4BBQEtDmPadDbv43E/BZkbME5UnxU5eiyyDC29arsZqdHq5u4eEnjqbkmVydnHya/MoPwa4zUh/aAT4V0DpdS7moU6hYjJv+8VAgW6 +api: eJztVlFv4zYM/isCn3qAl3TFnvy0XFfggvbQou32kgYBazOxrrbkk+jeZYb/+0DJsZP02m0F9ra8xLLIT+RH8rNaYNx4SBdw8Yxlg2ydh2UCOfnM6Zq1NZDChclrqw0rtoqiHamrq88K61q5xjyYBzNzG58+GKWUcvS1Ic/q5DY+fEjVfUHDa/v4hTKeRFvaHbt6oq068ex6a1nateKCRpvep8ZtaTFXJ0PMc1M3PDdMbo0Z9Qg7s8waRm202QS0XRg5Mk4k8lvixpkxeN+UnKoB+7rhffA+/GNUG6z8BBKwNTkU5uY5pDAm6BqzGlZ+tTpIfRW2a+sZEqjRYUVMTirTgsGKDpCeaAsJaClNjVxAApKUdpRDyq6hBHxWUIWQtsDbWpw9O202kABrLuXFkJ+6pC103TKCkOePNt+K5zGmZEyGZQvrutRZSHL6xUuPtHtH1k4oYE1eVlpqE54wz7W4YHmzZxHB+zAjuXthzqN3l4AnZm02Eclsr9eBm3+O2SUDGaYpS5CMd6fc7bC7BDJHORnWWP4nR53vwXfd64m/0tvQdeLlyNfW+Mjw2emp/B3O7F2TZeT9uinVbW8M765h393vLeJ17/6jfMcuWwzHLH9Aw9EY9jz8cnb2MvU/sNR5SExdOGfd+/POiVGXoYuZKv/SoLTZwe7YLYdzt9cR2jBtyEG3HNlA53C7R9iVjQFKP1Z+89YcfybvcUMwgL0x8kKGupfdv6uE5BWP7u32SjLSG9l9PY3fIn1vtfmn+/ubF4CxthVxYUVCB1XkAlKYjho6bQ80sZu6xoAohXveaWfjSkihYK59Op1mpW3yCW7IME5QT7HWcPyxm4VddS6mYXI9ZY3TvA14s5v5JW0/EebkIF0s9w3upItiXxyaDSXBWl8G7e4lfdZwYZ3+Mxa7l/QiegkF0p+3oypffMeqLulAVQ+V8YV+CYo2axuC6DnvM/yI2ROZHBIQtmLyp5OfJ6evUdI7qNnNvB8pzMJI7bIJZpAckT7QDQlQFeYJmLD6ddyQKKXKFZo9vPETdRvqehBUO870//eTf3U/6XuR6TtP6xJ1UJlQsrafscV41/CQQHp885AxWyZQyFymC2jbR/T0uyu7Tl5/bcjJsCwTeEan8VGabtFCrr0855CusfT0Rj1DYUSKPqjX4t0NlJF4JDxZQQIS4PFVKShtsRvZtrc5j8f9FPRwxHjxeRDpjh6zLKOa37Rd7snWzfXdPSTw2F+nKpuLj8NvwiB+i/HakH7QjPCuhRLNphFFTyFiyu8v12AUSQ== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Endpoint to evaluate LLM app run Args: - request (Request): The request object. - evaluator_key (str): The key of the evaluator. - payload (EvaluatorInputInterface): The payload containing the request data. +request (Request): The request object. +evaluator_key (str): The key of the evaluator. +payload (EvaluatorInputInterface): The payload containing the request data. Returns: - result: EvaluatorOutputInterface object containing the outputs. - - - - - - - - - - - - - - - +result: EvaluatorOutputInterface object containing the outputs. + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + inputs + object + + +
    + +
    +
    +
    + +
    + + settings + object + +
    +
    + anyOf +
    +
    +
    + +
    + + credentials + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + + outputs + object + + required + + +
    + +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/evaluators.tag.mdx b/docs/docs/reference/api/evaluators.tag.mdx index b2e3821907..96d3587403 100644 --- a/docs/docs/reference/api/evaluators.tag.mdx +++ b/docs/docs/reference/api/evaluators.tag.mdx @@ -5,16 +5,9 @@ description: "Evaluators" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-analytics.api.mdx b/docs/docs/reference/api/fetch-analytics.api.mdx deleted file mode 100644 index 4399d86e81..0000000000 --- a/docs/docs/reference/api/fetch-analytics.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-analytics -title: "Fetch Legacy Analytics" -description: "Fetch Legacy Analytics" -sidebar_label: "Fetch Legacy Analytics" -hide_title: true -hide_table_of_contents: true -api: eJztV01vGzcQ/SvCnLeWa/S0p6pJgxhxayNWexGEYsQdSYy5HyFnnarC/vdiSO0uV7IURUmRS0+GzDfzHudrh1tgXDlIZzC1qHSxgnkCZUUWWZfFbQYpLInV+i8s0GxYKwcJVGgxJyYrhlsoMCfBlaqWU11ACh9rshtIwNLHWlvKIF2icZSAU2vKEdItYLG5X3oHvKnEgWMrAhKgos5FEltUBAm4CgvRxZqNAN94pibpLIvaGGgOEQLp1Nkc+ZvKwxUVjODjVTAZyontZijUk55WGiCR1NJk5L6F1IhXF0wrsiel3AfeWEpBn76LlN8DbyzF6Fx/lZJzeO88SUwrVvYZzX/NfNvyxOQWmb6GuKjzxWd43wvFoFG0YbJfwNpVcjBsxLslV5WFIyeAm+tr+ZORU1ZXMlcghcdaKXJuWZvR+x0YElBlwVSwv0xVGa38GBp/cGKzjUgrK0OKdWBQZR2M9gLeX/OVRySQ0RJrw5BeNwksavVE7D1optwdOmadk2PMq8h5Nwd2IyWFDJl+EGhEOO0sm6QvolMS+wpIgEsO6CP3vKjEXoxBVodRf2n9vG7t9/yq0oXIXuL0lTfe88jlExUXu5wG64FPcRrg5eIDKY6SMek+d00CZG1pX6iO/9PxHdLxAqofTrOoY5N4doeG6lIZKfnFDwHo3aK1uIF9wEDrbH5K7L3JOr3dbGsaMfnp5uZwFP6JRmc+a6NfRd7lczAjRm1OzDNTqsHpl3yu58dDdFcGgRLF3K1eGpYt9DdyDlfUx/s41AdjNJXTz2Vd7hWod7gowX14Q3SPX+N1CN+p3L6dTh8OHIbcDpP6Rrbm0R2tUG1Gk2h5zonXpezVVek3qwp5DSmMK0vPmj6NOezhY1l63Theux3Z53bnrq2BFNbMlUvHY2XKOrsK++gV6jFW2nebI1VbzRtvMnm4fUebt4QZWV/CEeBRCiqUyBDWZQcr/Y4kWLs1YVLzurT6n3ba+G1hHawa/8lblvF2MPHiRpOHW0hArhHCdH3149U17AdvAJZeQOV7oeVuF+9hFLr7S5/nvhGACfOf+wNRJnHPsYj8Hc3VQFUXCqa/eVwZ1L7evYbtLo0z2KVRSmb3oArvF3HXJ3OewFrSn85gu12goz+saRr5d1i4JF+Zdrgw0cr1RJvomfWMphY1vlePYnePnnPA3bPjHHD3MDgH3K7u52CjmX0OfLchnxWMdrHtwXP5YbWgfUckbQVL/IPVRCmqYvEH81i8dE39cP84hab5F+vbLmw= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Legacy Analytics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-annotation-by-trace-id.api.mdx b/docs/docs/reference/api/fetch-annotation-by-trace-id.api.mdx deleted file mode 100644 index b1dfd0f386..0000000000 --- a/docs/docs/reference/api/fetch-annotation-by-trace-id.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-annotation-by-trace-id -title: "Fetch Annotation" -description: "Fetch Annotation" -sidebar_label: "Fetch Annotation" -hide_title: true -hide_table_of_contents: true -api: eJztmktvGzkMgP+KwVMLqHE22JNPm03bbTbtNkjdXgLDkGdojxqNNNUjXdeY/76g5u1XHCcFisWcDM+IpPRRpGTSK3B8YWF0C+dKaced0MrChIHO0IRvlzGMYI4uSqa8HjKdLafO8AinIgYGGTc8RYeGNK1A8RRhBK0BQsEIMu4SYGDwmxcGYxg545GBjRJMOYxW4JYZyVlnhFoAAyecpAdjUjS4jCHPWa3dZly1lH/zaJYd7XMubUc9V8uP8zDBriFSWj5RXkrIJ43pTxlXheUJ6baZVhYtaTs7PaWPGG1kREZQaLiPIrR27uXgphwMDCKtHCoX5pBlUkSB4fCrJZlVa4aZIexOFBYi7QuhcnJCOVygaYG5CCMYxDjnXjoYneYMGi91F72m3CB3GE+524eGwVyblMZAzB2+ciLFvbwuCrWDcwc5A5/FP8PI50JtaSRGiT/ByOtCbWmkwjVb0p47zI73Ij4I1p/LsMUaXs9qpaJVW6mAPauVCldtpYrPpwYea/LIkaqa9MFAG7EQaluyQeVTyoORt06nwCDxKVfAgHunoT0zkWYSg9KPhbZWAFbiOYM7oeJ9hnic6Ii+33NJOVTy5Q4zV6SpbaQQpW2ZcKVQ7jOjncyAwXecAQMb39GKMrHD0kWpr2MsE8EL4Zxoe4DHsaA0w+V1J7Uc4KMqlXXcls66T2ZaS+QqPNpuCyJhIi+5efGPfi+s+9tq9eqjd5l3LylNFnr07CtGbu8W2RAPKz5YfExscgYpOv7rMnrrpXyQkHCYHijFjeHLvVzWZB8H9QPBpHTFS6g9yn0oW6mYF+AMztGgigpM3eO/uC7tuR/co7EbV4jDc+6XUpwOAukXR58CJJszeL5zqrhF7mR3UzHboiRnBbbpPTeCK9fjOw6fwXuxCafn9zA/h9ZZ7DfeseD6yH0qwD52jyXY+uXfw3sCvD6GnwNiH8fHUqSf6547bXp0R6PrY/jpCPsIfspdJuIWe3KPI7dHrlVCvGmqDjkDKdTdgWXDrgN+xfLxHgDvhbrbXt4qq0D/r/WV9apJd4DdqqLpyN0WtbxOZaraIi1VTSfykbuwEaybb3lOAr+fnW326r5wKeIwevDGGG2Ob9TF6LgIRfgdzpY66rx9TMlysk69xVxHFSZI7WJfC/UDWssX2Lhw99AAYzCmtw+5U4YGBpkux7VTYI23oLt7Ga8LfPs8+248vt5QWPi269S31KgetHZQKMonmprYC3ShV+0SGMEwowMUvw+bdqkdrqpYyqlXgua+6mh7I2EEiXOZHQ2HkdQ+PuELVI6fcDEMHZIJSUTeCLcMIufXl1e4fIc8RgOj20l7wCfaSMXW6A6rvcIzcYUEqex2n3uXaCN+VIsKPe+kkCIKQs11EK9CIUxucH59Caw5zOD05LeTU1iH1hlMMcCjEAOV7fAa2BqFev3UbEpDAIBDnv7RvKCZZdo6aqQ1+rb4qDOfGoLDf90wk1yEHR6sr0r/3ULpP2g3vCmdjOp8OGGQaOto8Go14xY/G5nn9Lisft+uIBaWz2Tr7wJ3uOz8uYDuWzSX4OBwbZ0R4G2ia4uokwm8uClj5uWgKfl3F1e5XS3bNqvp1EsK2SCp9tSqfH0eRZi5luBG8qLJ13Hw15sx5Pl/EX6Ljg== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Annotation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-annotation.api.mdx b/docs/docs/reference/api/fetch-annotation.api.mdx index 102ca6242f..bf269eb19e 100644 --- a/docs/docs/reference/api/fetch-annotation.api.mdx +++ b/docs/docs/reference/api/fetch-annotation.api.mdx @@ -5,67 +5,1134 @@ description: "Fetch Annotation" sidebar_label: "Fetch Annotation" hide_title: true hide_table_of_contents: true -api: eJztmlFv2zYQgP+KcU8twMZZsSc9zUvbNWu7Bonbl8AIaOlssaFIlTyl8wz99+EoyZLixHWcdCgGPSWWeHfkd7wjfec1kFx6iC5hYowlScoaDzMBNkcXPp0mEMECKU6v5GYICMilkxkSOpZeg5EZQgTkZIxXKgEBykAEuaQUBDj8WiiHCUTkChTg4xQzCdEaaJWznCenzBIEkCLND6asaHSaQFmKjXafS/MQ5dKsPi7C9PpmWGX9xBRaQzlrDV/k0lR2Z6za59Z49Kzt5fEx/0nQx07lAUMEF0Uco/eLQo/O68EgILaG0FCYQ55rFQdq4y+eZdadGeaOQZOqLMS2qITqySlDuETXwXISRghIcCELTRAdlwI6fukt+pZyh5IwuZK0C42AhXUZj4FEEr4gleFOXieV2tGEoBRQ5MmPMPKpUlsbSVDjDzDyqlJbG2lwzVe84/azUxQq2QvW76uwxVpeT2qlobWx0gB7UisNro2VJjofG3iizSIHqmqThwDr1FKZu1INmiLjzBcXnmwGAtIik5zaZEEWujNTWa4xKP1YaesEYCNeCrhWJtllSCapjfnzjdScQbVc3WPmHWvqGqlEeVum0hjUu8xY0jkI+IZzEOCTa15Rru6xdFLr6xnLVfBCOBm6HpBJojjNSH3WSy17+KhJZT23ZfP+k7m1GqUJj+62BbFycaGle/aXfa88/emtefGxoLyg55wmKz12/gVj2rlFtsTDivcWnzKbUkCGJH9eRm8Krb9LSBFme0pJ5+RqJ5dbsg+D+oFhcrqSNdQB5S6UnVQsK3AOF+jQxBWm/vH/tUC32nU/uEHnt64Q++fcz7U4HwS6WB58CrBsKeDpzqnqDnkvu/OG2R1KSlFhu7qRTklDA77D8Dm8UdtwBn7f50foyeOw8Q4FN0TuYwEOsXsowc43/wHeI+ANMfwUEIc4PpQif10vJFk3oDsY3RDDj0c4RPBj7jKx9DiQexi5HXKdEuJ5W3UoBWhlrvcsG/Yd8DOWj3cAeK/M9d3lrboK9P9aX12vmvUH+DtVtA25y6qW16tMNVuko6rtPT5wF7aCm+ZbWbLAry9fbvfqPkutkjB69No56w5v1CVIUoUi/D3O1jbuvX1IyXJ2m3qHuY0bTJD55a4G6gf0Xi6xdeH9QwOM0ZTffs+dOjQw2HQ9rpsCN3gruvcv41WFb5dn306nZ1sKK9/2nfqGW9OjSbc1nSGlltvWS6TQqaYUIhjnfIDit3HbLvXjdRNL5XhdB2jJXRN0N01nu3AaIkiJch+Nx7G2RXIkl2hIHkk1Dr2SGUvEhVO0CiKTs9N3uHqLMkEH0eWsO+CCt1S1SfrDNv6RuXqHjKvuek8KSq1T/zTLC73vtJJiHsosbBBvgiJMbjQ5OwXRHmtwfPTL0THcxtcbzNEg4xANje3wGsQtCpv1c9spC6EAhDL7rX3BM8utJ26ptfru8FZvPhsIhH/TONdShb0erK9rT15C7Unotr45sUSdnx9ETb6dCUitJ5Zbr+fS4yeny5If1yXxy5mAcD2dM77LNSTK8/8JRAupPW5NcZM04Nl5HRvPR21pvz/1xqmGPcp3Of4EAq5x1f29BCeC/9BuAyckm7TZqOv67SSOMaeO3FZu5B29CbM/Xk+hLP8F+xqmBA== +api: eJy9VU1v00AQ/SvRnEBa1aXi5BMBCq0KomoDlyhC0/Uk3tZeb3fHgWD5v6NZf9QhbQ8IcYrtnZmd997MSwOMmwDpEk63WARYKagceWRT2fMMUlgT6/w7Wltx/AgKHHosiclLXgMWS4IU2KOm7yYDBcZCCg45BwWe7mvjKYOUfU0Kgs6pREgb4J2TvMDe2A0oYMOFfFhIodl5Bm2rxurBof0Xxa8d2q72StKDq2ygIBknx8fyk1HQ3rgINYXrWmsKYV0Xs6s+GBToyjJZlnB0rjA6MpPcBslpJl04L2Sy6W6YkBjfdl/WkcC+1+rmljTvoVpOcE/4zZAxxq3Jk9UUQEFh7F2Ub0A6f7hNeOwvsXVRQLtqW3Vw7WHiCLltJeH1yckhQ9+wMFmMnp16X/m/pycjRlPIk2Eqw2FAUem90wMGe7UncI1l2pAXxCNg9B53E7yfKj3QBGXYPDc9nykE3BCMxZ4OjWTMFnL6GNlTjQVXd3UfN1Hxgd6O3adhvO/oe07Zs8Xi8qBgp+2+qB9k6Wfz6dKXxHklhrAhjh7AOaSQOE9bQz+Sh9kOSTOMaps0/fy2oCCQ3w6eUfsCUsiZXUiTRBdVnR3hhizjEZoEnYE/W5rH09k7CQVZ3kC69oZ3sd788vyCdmeEGXlIl6tpwLXMWzdB+2GjeOjMBQmXvdnMa84rb34N2KPl5F2WkGXsuorpw8Z0vb1FfUdWFlRwdm0fH706On4KTJ8wm1+e92uDOq7N0EcMA/UHXSNRoIDKuDPAhOWbhwPp0lWBS7STeo/IutfXSAjTT05cgSYuRby96SVfQi85qImhiQOlE4dKB99aKcirwJLXNDcY6Ksv2lY+39fkRbyVgi16gzdC5bKBzAR5ziBdYxHooMXRXeDFVb9EL2egHm99ENiKulssankDBXe0m/5liWP8x3sHcqIr5cPQNv3pXGtyPMk7MFGZ7nEfP54uoG1/A6kopgw= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Annotation - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + annotation + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + + + +
    + + + data + object + + required + + +
    + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + + references + object + + required + + +
    + +
    + + + evaluator + object + + required + + +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testcase + object + +
    +
    + anyOf + + + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + links + object + + required + + +
    + +
    + + + property name* + AnnotationLink + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluation-ids-evaluations-by-resource-get.api.mdx b/docs/docs/reference/api/fetch-evaluation-ids-evaluations-by-resource-get.api.mdx index 371cea6b02..a1a39d9667 100644 --- a/docs/docs/reference/api/fetch-evaluation-ids-evaluations-by-resource-get.api.mdx +++ b/docs/docs/reference/api/fetch-evaluation-ids-evaluations-by-resource-get.api.mdx @@ -5,78 +5,354 @@ description: "Fetches evaluation ids for a given resource type and id." sidebar_label: "Fetch Evaluation Ids" hide_title: true hide_table_of_contents: true -api: eJztVU2P2zYQ/SvEnBJAsLeLnnSqi2wTIymycNxevIbBlcYSU4lUOKNtXEP/vRjK+vJHgUVPBXqySb2ZeTN8jzwC64wg3sDDiy5qzcZZgm0EKVLiTSVriOEX5CRHUtiDlElJ7Z1XWmXmBa3ySK72CSo+VKi0TZVJZ0/2yS58VpdomeInq5RSuqp2JlVviP3bWK1zVMt3yu0V5yjfQtI/c5Pkip3aS+FRWZq1Sbpqu1BtlCus3X6g87p00tUnQ7z5/PwVE16m244ivS7rk11pQ9g1/WG9fnz4nmAYaKyWbbvTLgwpY190YVIlc00SJJLNFK3BdpYr5NrbLmkgSuy3sVqowhALxekRzSACV6EPG8sUYghkdwNKWh4tafd82PW8MmSIoNJel8joRShHsLpEiGFCHiIwIpRvNfoDRODxW208phCzrzECSnIsNcRHCOgYiL2xGUTAhgvZWHWjXQugaaLLQial23X2uqBrhbT3WpCGsaRLAs0VBsuUoGm2kp0qZwlD3P3dnfxMjfGlDse0rwu1OoEhgsRZRssC11VVmCSMdv6VJOb4LzmGIio4Ug2mFdKjJamfD6pv6D0yNE3TRPDj/f1lE7+L5tosD947/5oOKi/yYtPOKEXWppB/fStTQOGSyVdtD5/3QVXnLfc7xjJm6KHZyhymA+vG8sm1BGVUJWX/pLNfkUhnCH2y29AwjF6PHcyFm2GivU3oqy19wm2HNMN42+nebuNdO75rxTqIXCQXCduzLZFzJxbvXMs5xDAfeXs+8jZEQOhfOlPXvoAYcuaK4vk8KVydznSGlvVMm7muDIghCJPaGz6EkMXj8iMePqBO0UO82Y4BX0Qg7ZFPYYPmK/MRpfmTyxc1586bv9pzPNk8b6OkO2P3LoSfBrEI5NTicQkRSButlu9mP8zu4Pz9moBF2zoJ2u5qh88QnU2h7x8iwDIIGxh1+dPwQZhVjrjUdpTvmjnPOR0Hj/3/vP6Xn9eTnhm/87wqtAmXUBDS8eTBDYzIQwRjF24jyB2xgI7HZ034my+aRrbbJ06MlhrSz8XokbsppDer0530Vt1i9gcerjzewk+w4eK9qHcW077DQ8hWFt5ITLgHos63Qr6NXSRyOKOoi1dFsvQ32PuHNTTN3zPfriY= +api: eJztVU2P2zYQ/SvEnBJAsLeLnnSqk2wTIymycJxcvIbBlcYSE4lUOKNtHEP/PRjqw/JXgUVPBXqySb2ZefM4j9wD64wgXsHdky5qzcZZgnUEKVLiTSVriOFP5CRHUjiAlElJbZ1XWmXmCa3ySK72CSreVai0TZVJJw/2wc58VpdomeIHq5RSuqo2JlUviP3LWC1zVPM3ym0V5yjfQtK/c5Pkip3aSuFRWZq0Sfpqm1BtlCus3fZA53nppKsPhnj18fErJjxP1z1Fel7WB7vQhrBv+t1yeX/3I8EgaKzmbbvHXRhSxj7pwqRKdE0SJJLNFK3BVssFcu1tnzQQJfbrWM1UYYiF4vERTSACV6EPG/MUYghkNweUtDxa0uZxtxl4ZcgQQaW9LpHRy6DsweoSIYYj8hCBkUH5XqPfQQQev9fGYwox+xojoCTHUkO8h4COgdgbm0EEbLiQjUUv7VIATROdFzIpXa+z1QVdKqS914I0jCWdE2guMJinBE2zluxUOUsY4m5vbuTn2Bif6nBM27pQiw4MESTOMloWuK6qwiRB2ulXkpj9v+QYiqjgSHUwrZAeLUm92qmhobfI0DRNE8Hvt7fnTXyRmWuz3Hnv/HM6qLyMF5tWoxRZm0L+Da0cAwqXHH3VdvdxG6bqtOVhx1jGDD00a9HhWLBelg+uJShSlZT905z9hUQ6QxiSXYcGMYZ57GEu3AxHs7cKfbWlO9z6kOYgb6vu9TbetPJdKtZD5CI5S9iebYmcO7F471rOIYbpyNvTkbchAkL/1Ju69gXEkDNXFE+nSeHqdKIztKwn2kx1ZeD0TZiFr+q1QEHcQpjU3vAu5Jvdz9/j7h3qFD3Eq/UY8Emmp52HY9jBEJV5j6JMdwXMas6dNz/bQ+7ugLyNktaN3boQ3qnUcXulk29oU4hA+mxp30x+m9xca6YLULP7eWcCnQQT9DwCDKITuQahIAIsgwOAUZd/HD4Iy8oRl9qO8l1y8Sm3/cGM/7/D/+V3uJttxh88rQptwm0VBmnfmXUFI/IQwdiu6whyRyyg/f5RE372RdPIdvsWiulSQ/qxGL2GVwfpxaK7vF6qa8y+4e7CKy/8BBtu6LN6JzHtg30IWcvCG4kJd0LUe1jIt7GzRA5nFHX2/EiW4ap7e7eEpvkFCsK8tQ== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetches evaluation ids for a given resource type and id. Arguments: - app_id (str): The ID of the app for which to fetch evaluations. - resource_type (str): The type of resource for which to fetch evaluations. - resource_ids List[ObjectId]: The IDs of resource for which to fetch evaluations. +app_id (str): The ID of the app for which to fetch evaluations. +resource_type (str): The type of resource for which to fetch evaluations. +resource_ids List[ObjectId]: The IDs of resource for which to fetch evaluations. Raises: - HTTPException: If the resource_type is invalid or access is denied. +HTTPException: If the resource_type is invalid or access is denied. Returns: - List[str]: A list of evaluation ids. +List[str]: A list of evaluation ids. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluation-preview-simple-evaluations-evaluation-id-get.api.mdx b/docs/docs/reference/api/fetch-evaluation-preview-simple-evaluations-evaluation-id-get.api.mdx deleted file mode 100644 index 462dc6d36c..0000000000 --- a/docs/docs/reference/api/fetch-evaluation-preview-simple-evaluations-evaluation-id-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-evaluation-preview-simple-evaluations-evaluation-id-get -title: "Fetch Evaluation" -description: "Fetch Evaluation" -sidebar_label: "Fetch Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJzlWN9v20YM/lcMPrWAGmfBnvQ0Lz/WrNmaJW5fAsM4n2j7upNOueNlcw397wNPkiVZtps0KTAgT4kl8iP5keLxuAYSCwfxHZw/CO0FKZM5mERgcrTh12UCMcyR5HKKG5FpbvFB4T9Tp9JcY+uNm7bFVDKdLpAgglxYkSKhZWNryESKEENHFCJQGcSQC1pCBBbvvbKYQEzWYwROLjEVEK+BVjkrO7IqW0AEc2NTQRCD9wGFFGkWaEIaXCZQFBMGdbnJHDrGOTk+5j8JOmlVznIQw62XEp2bez24qYQhAmkywoxYXOS5VjLADr841lm3fMstM0eqtCCNL5Uql1VGuEDb8vE0SESQ4Fx4TRAfF1GLlmAwW32cB9a64HMdUrdfQLmp1MYxhW2hypeZMRpFBkW0eZR5rYFpqr27dIPTEqGIGE6rB3wO2BXrl1BC0jPBRiVCUUS1lJl9QUk7K+DGZxeBrz5oEUGKJLquiCRRrCf0dYfTnrNVFbZg6yR3LKWz7pN2jLttgVRWei3smwuv9e/OZO8+eso9vYXtgBlEEaaP1BLWitVBdrd0oUfxIeU/mEzW6JXn/4nUP82VcvRNWvcF2VN/GkfjshSrPvgoBvousG4RdfvX90GdtSCKCKRFQZhMBR0CbDXeRBC+IxX82W/ltIQdjAJZPk9+hJFPJWxlJEGNP8DIWQlbGanpmq34FHucnXBUPYasX1fh8Gr4elErNVsbKzVhL2qlpmtj5eWgS7wHtO4Z5f+5Uuf4xfZJ0D1THQnyB5tWBJj5lEeqHLOkfHLv0SOPJtZnWfnIlXMGByuU9panDLTWWH4kRSZRa0xgsuswuy2d2HmU3Xu0q6kjzLe8rA6Ib5PdPyb29e19gUvvyKQQwdKnIoMIhCcD7F1F5op7VznE7DH+iB76F0c6uA2RsiI6ckivIvRxGWsTfGsofRUEjJp4GxKqsdnYV0HBeR1tQ4DFHAXt7k47B6gtyJtK/9BIfRtufE0vOhNh2ut1oidAPFN9c00rClb7+eSkf6v7LLRKynI55yb7/Ve6BEkoHa5XdUV1BbSRnbdPGW4n2+XXRH1lZE0WpG6xq/6aAdw5scCmnPaLBjIGY367i/LmDn4X4ipNV3LtA3RDb8nu/jDOSvoO5ff9eHzdAyxz203qBW8lBq06Che5peGNRb11oCXEMKzWFcNyXTFsrSuG684OouCTGe1DvafwVkMMS6LcxcOh1MYnR2KBGYkjoYYiV+H7cSi9VbQKKqPryw+4eo8iQQvx3aQtcMtFVZZJV2yTIZGrD8iEVRuSkaelseprHWDYkCxLLWZEZXMT1OvGGJwbjK4voTUWwfHRT0fHsE1gR5i/ByHD91DbDq8h2mJhEz+3vDR8DEAo0l+aF+xZbhxx+2vwduRr6+5SkUD4Lw1zLVSo9mB9XeXyDqpccqJCNqG9L+HhKe5ulSYRLI0jVl2vZ8LhJ6uLgh+HUYlTFMGDsErMmMG7NSTK8f8JxHOhHfa83HQOeHNTfSBvB83tset9ndeMk8qO8S+I4G9c9RZg4ftf1pWzrmRGUmJOLe1eu+IS21T+b+djKIr/AG8I0bY= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-evaluation-results.api.mdx b/docs/docs/reference/api/fetch-evaluation-results.api.mdx new file mode 100644 index 0000000000..e2b95d96b1 --- /dev/null +++ b/docs/docs/reference/api/fetch-evaluation-results.api.mdx @@ -0,0 +1,303 @@ +--- +id: fetch-evaluation-results +title: "Fetch Evaluation Results" +description: "Fetches the results of the evaluation" +sidebar_label: "Fetch Evaluation Results" +hide_title: true +hide_table_of_contents: true +api: eJzVVU1v2zAM/SsCTysgxFmxk0/Ltm4NumFF2u2SBoFqM7ZaW3Ylulhm+L8PlO3YTtYCO+5kfZDU4+MjXQOpxEG4hotnlVWKdGEcbCTE6CKrS95DCJ+RohSdoBSFRVdl5ESx81s8+N2ZO7OwiQvvjBBidLHVsXjjyJ6FRx5Cx62txacKHYk3q3bRWfbHxf0DRsTxV0iVNf0TW9qXuA3FdoR2CxKKEq1/YBlDCDsGvx3B6TIACaWyKkdCyxTUYFSOEMIEOUjQTEGpKAUJDElbjCEkW6EEF6WYKwhrYCwQgiOrTQISSFPGBwOxYhlD02w4iCsL49Cx3/l8zp8p4TdVFKFzuyoTq84YJESFITTE5qosMx35sMGDY596wNI0TSPh3fn5aeCfKtNxi+bC2sL+Q1QoLRNLusUdIymd8UoT5u7UICuiya0y++87z/OUqkYeTrQhTNBCs2lkf6asVfsRn1+LFiA0EnKXvEb9N3ROJQiHYK9UickQt3zbDG+3wpuUfe3zap/u7DZDmIHelt2X0/jU0ve3x3qTy9vb65OAbW1zpLRgcSdIXseUQgjBoFwX1BMZN8Ggeof2uZd8ZTMIISUqXRgEUVZU8UwlaEjNlA5UqeF4Fiz8rfjIpsBqdhhVVtPex1tcL69wf4kqRgvhejM2uGEltdqYmh3Kokp9hcxS14mLitLC6t9twbtOTFsvpkGbXeHdO8Y6bB9U9IiGW5fzbGHPZ29n85eS6RzE4nrZNYSKfEP0OLwZyCO6DkSBBMx9NwChyt8PF4yyLBzlyozi+XkqRpNhdSjOBF89NOf/NoO7ihL+oqDMlPb96umrO7muR4OWMw+P526v2I2EtHDEHnV9rxz+sFnT8PFThZZ1t5HwrKxW96yCdQ2xdryOIdypzOErrPpsubPPxEuge20aFiZD5B1IeMT9yc/CD660V3/d2SyiCEsaeZ/MWW6TQ09/ubiFpvkDiRqhEg== +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetches the results of the evaluation + +Args: +evaluation_id (str): the evaluation id +request (Request): the request object + +Returns: +_type_: _description_ + + + +
+ +

+ Path Parameters +

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluation-scenarios-evaluations-evaluation-scenarios-comparison-results-get.api.mdx b/docs/docs/reference/api/fetch-evaluation-scenarios-evaluations-evaluation-scenarios-comparison-results-get.api.mdx new file mode 100644 index 0000000000..865d61070a --- /dev/null +++ b/docs/docs/reference/api/fetch-evaluation-scenarios-evaluations-evaluation-scenarios-comparison-results-get.api.mdx @@ -0,0 +1,305 @@ +--- +id: fetch-evaluation-scenarios-evaluations-evaluation-scenarios-comparison-results-get +title: "Fetch Evaluation Scenarios" +description: "Fetches evaluation scenarios for a given evaluation ID." +sidebar_label: "Fetch Evaluation Scenarios" +hide_title: true +hide_table_of_contents: true +api: eJztVcFu20YQ/ZXFnBKAlVyjJ56qxm4iJEUNW+1FFoz1ckRuQu4yO0M3qsB/L2ZJipQlG0jOPVkevnn7dmbe7B5Y5wTpGq6fdNlott4RbBLIkEywtfwPKfyObAokhQeQIoNOB+tJbX1QWuX2Cd0UsLya3bt7twh5U6FjSu+dUmqCeLCZekMc3qZqVaBaXim/VVzglES4/ymsKRR7tRUV48GR/lZbwoH7w2p1c/3NYJSdquUJnSXlPKutb1ymRLYxSCThDJ3FrKNEboIbOD9Z4vVYnLv+9E2qFqq0xCL6XFlmkICvMcTwMoMUovyHyf0P2EmQzgOMr2odLHn3EJCakukhR4YEah10hYxBmrgHpyuEFKZ8NiNIwEobvzYYdpBAwK+NDZhByqHBBMgUWGlI98C7WvKJg3U5JMCWSwlMpkMtM4K23QgN1d4RkmReXlzIn+O5uWtigbdNqW57MCRgvGN0LHBd16U1kXj+mSRnP1XTnz7kqjiHahSj7g5TOFV4FvDuUELRIiVU75Ghbds2gV8uL0/V/61Lm3U01yH48D3S6yDNZ9sVJ0PWtpRflrGiU0DpzdFX7XZ/bmNHjzvSJoeIdYw5Bmg3bTLEdAh6N2nbJ98JhDaBivLXOvwHEukc4UD2yjBIMdRKvrbj2f7xMxo+mq51vFd3dI/bjDRjebvqvnyNq6585w4bIGL9E8KutxVy4cWAg2O4gBTmE4/Mz3luPnrup95zkABheBrM1oQSUiiYa0rnc1P6JpvpHB3rmbZzXVt4vkcX8at6J1AQCxGaJljeRb7FzfIj7j6gzjBAut5MAXcyWd2sHMMObdK1/YhStX4HLBoufLD/dgPQb4Ciy5KyWLf1U5P12n7T5gu6DBKQe3ayL2Y/zy5eukyfoBY3y94g2kSDDDoiDJJn5ToUChLAKroDGHX16/hBVNaeuNJuwvfyDniucD/a9f8X7MdesH62GL/xvC61jZskNnLfG2k9fWykl2esFOfixEybBApPLBT7/aMm/CuUbSvh7p0SS2SW9GMpu2SrS8JXGvzmtl87b9VLur/g7uzbKAFBR0c+6WDlyGjAZDCMaOnSF0a6M8k6eQeE5bBz3l+voG3/A+IHTYY= +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetches evaluation scenarios for a given evaluation ID. + +Arguments: +evaluation_id (str): The ID of the evaluation for which to fetch scenarios. + +Raises: +HTTPException: If the evaluation is not found or access is denied. + +Returns: +List[EvaluationScenario]: A list of evaluation scenarios. + + + +
+ +

+ Query Parameters +

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluation-scenarios.api.mdx b/docs/docs/reference/api/fetch-evaluation-scenarios.api.mdx new file mode 100644 index 0000000000..5c7f02757f --- /dev/null +++ b/docs/docs/reference/api/fetch-evaluation-scenarios.api.mdx @@ -0,0 +1,771 @@ +--- +id: fetch-evaluation-scenarios +title: "Fetch Evaluation Scenarios" +description: "Fetches evaluation scenarios for a given evaluation ID." +sidebar_label: "Fetch Evaluation Scenarios" +hide_title: true +hide_table_of_contents: true +api: eJztV0tz2zgM/iscnNoZTpzN7Emn9SbZrafZJpNke3E8GUaCLbYSqZJQWq9H/30HFC3J8SNuzj3FIYEPwIcHoRWQWnhIpnD5rIpakbbGw0xChj51uuL/IYG/kNIcvcBOSPgUjXLaejG3Tiix0M9ohgKTi5MH82DGblGXaMgnD0YIMZB41Jl458m9T8R9jmJyIexcUI5DEMb+nus0F2TFnL3oDQf4W6U9rrE/3N/fXP5IMbidiMkWnPbCWBJzW5tMsNtpit7zcYZGY9ZCItXOrDGvtKdpT85dtD5LxFgU2hM7vYuWE5BgK3TheJJBAsH9x0H8nSxIqJRTJRI6TsYKjCoREtggCyRoTkalKAcJDr/V2mEGCbkaJfg0x1JBsgJaVqzsyWmzAAmkqeCDy0FyMmiaGYP4yhqPnvXOTk/5z2bq7+rA0bwuxG0UBgmpNYSGWFxVVaHTADv64llnte2Lck4tOQDCMtiqHJNDurWss4BkltfzEP5mBI3sTkxdFMCOr2PiQOQLno6ngBmtamp92O1am4n9iJ/4vpHxfr/cPZ83EtiBVjBefA4HTQcB9ukLprSR4WnrRhRZg8x2xbUu0AkH1jvWZaAjrg28kWBreoUDh74uaPv8p2PuMnwopZEQCeicdTsLYydFJXqvFpu0BIRtY6+xHe4GOLctAQ0XvqedLpm6fMJdtnqUc9ZtJBSK0KTLt8JcRfXXgohZO1gl1yH3B8rkOhZHCN05TOlRGf89zKkd7rfqh0kIKGIcUbgH/WOljcHdQ+DJ2gKVOTwFvLhpERoJxhK+dZx8Yt1GRu4O9UQcOdY9ptbM9eKIqWOdOG9lOwu/euo1tS2e5VGF3XfsnsK+jRk+0v7gCQ790I/NvlgOOhRc6W2Hh1SEvUoMHqW7biVoGvbs97Oz7Sf5syp01sq3yfiJ93iz2DIkpYsDVV7YdOP2iJ7ShnDBI2y2n/wr2zrIpJT+YO/8EyvwiCc2kCHaBnklqxxXa1puFWZP77rU94Vx0dK3y9hahFfSLcA2tyVSbnkxXCCFDZBySGDUF5wfrTaqrxntWR49uuf15li7AhLIiSqfjEZpYevsRC3QkDpReqQqDS+X+3G4FecsGoaGx7R2mpYBb3wz+YjLD6gydJBMZ0OBOy6rtlA2xfr3oNIfkSmLC+24ptw6/V+b/bjQ5q1WE9axuR0uR9G3P1X6FQ23H8fZun168tvJ6b5gooIY30xid6iU+nUuioF8QVdHFEjAMrQGEKryj/6Cvaysp1KZAd6BRn7h4arv1V+fVW/7rIq1RfiDRlWhdBgjIZGr2EXDsc0ZSF5O8Z2NNJOQh/VuCqvVk/L4ryuaho+/1ei4HWb87jqtnrg4pyvItOffGSRzVXg8kOp3t3H6vBf7Ili3jFl2G34CIOErLrc+BcNwzddNuYoy45STNNDeegu4e7u58/flPTTN/1ICiI8= +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetches evaluation scenarios for a given evaluation ID. + +Arguments: +evaluation_id (str): The ID of the evaluation for which to fetch scenarios. + +Raises: +HTTPException: If the evaluation is not found or access is denied. + +Returns: +List[EvaluationScenario]: A list of evaluation scenarios. + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + + inputs + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + + +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + + outputs + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + result + object + + required + + +
    + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + cost + object + +
    +
    + anyOf + + +
    + number +
    +
    +
    +
    +
    +
    + +
    + + latency + object + +
    +
    + anyOf + + +
    + number +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + correct_answers + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + is_pinned + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + note + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + results + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + + result + object + + required + + +
    + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluation-status.api.mdx b/docs/docs/reference/api/fetch-evaluation-status.api.mdx index 479ba9c3af..62df16b309 100644 --- a/docs/docs/reference/api/fetch-evaluation-status.api.mdx +++ b/docs/docs/reference/api/fetch-evaluation-status.api.mdx @@ -5,74 +5,299 @@ description: "Fetches the status of the evaluation." sidebar_label: "Fetch Evaluation Status" hide_title: true hide_table_of_contents: true -api: eJzVVU1v2zAM/SsGTysgxFmxk08LsG4NumFFm+2SBoVqM7Y6W3Ylulhm6L8PlL+TtsCOO0WmSOrx8ZFpgGRqIdrCxbPMa0mq1BZ2AhK0sVEVf0MEn5HiDG1AGQaWJNU2KPf+C4ewxZ2+0yuT2uhOB0EwublXSfDOkjmLjkIClbS+Bp9qtBS8u2kPnWdvLh8eMSbOf4NUG90/8XLSFiAIKCs03rROIII913A/QTX4VdLIAgkNE9GAlgVCBDP8IEAxEZWkDAQwMGUwgYhMjQJsnGEhIWqADhUHWzJKpyCAFOVsGOkN1gk4t+Mktiq1Rctx58sl/8xpv63jGK3d13lw0zmDgLjUhJrYXVZVrmKfNny0HNOMWJxzTsCH8/PTxD9lrpIWzYUxpfmHrFAZ5pVUiztBkirnkyIs7KlDXsazW6kP3/ee5zlVTgwWpQlTNOB2TvQ2aYw8TPj8WrYAwQkobPoW9d/QWpkiDMne6BKTEWz41o1vt/KbtX3r62qf7vx2Y5qR3pbd18v41NL30mO9y+Vmc32SsO1tgZSVrO0UyeuYMoggHJVrw2YmYxcOordonnvF1yaHCDKiykZhGOdlnSxkiprkQqpQVgpYrxbj2ig6+JDV9foKD5coEzQQbXdTh1vWStv9udtAvKzUFTIP3aytaspKo/60Le1mLWujuFCl96UP7zhZeXDB6noNAriMVtbLxfvFEo6X18yZZS5jL/P+bX8N4oiFoX4QgIXXOBDK4uN4wciq0lIh9SSf35XBZN5ve8pnsJpx4v7T9dr1kvA3hVUulZ9FT2LTSXE7WaIcER3v1C7XTkBWWuKApnmQFn+Y3Dk2P9VoWHA7Ac/SKPnA7d82kCjL5wSivcwtvsGtr5mH9ix4DXMvSs2KZIT8BQJ+4eHkf8DvpKyXfdP5rOIYK5pEn6xQno9hXL9cbMC5v6G8lJU= +api: eJzVVU1v2zAM/SsGTy0gJFmxk0/Ltm4NumFFm+2SBoVqM7ZaW3Ylulhm6L8PlL+TtsCOO0WWHqmnx0emBpKJhXAD588yqySpQlvYCojRRkaV/A0hfEGKUrQBpRhYklTZoNj5L+zDZrf6Vi9NYsNbHQTB6OROxcGJJXMaHoQEKm6wBp8qtBScXDeLFtltF/cPGBHnv0aqjO6ueDlpQxAEFCUav7WKIYQdv+FuxKrHldLIHAkNC1GDljlCCBP+IECxEKWkFAQwMWUwhpBMhQJslGIuIayB9iUHWzJKJyCAFGW8McgbrGJwbstJbFloi5bjzhYL/pnKflNFEVq7q7LgugWDgKjQhJoYLssyU5FPO3+wHFMPXJxzTsD7s7PjxL9kpuKGzbkxhfmHrFAa1pVUwztGkirjlSLM7TEgK6LJqdT7Hzuv81QqJ/odpQkTNOC2TnR70hi5H+n5rWgIghOQ2+Qt6b+jtTJB6JO9USUWI1jzqRvubuw3KfvGv6u5usVthzSDvI26rz/jcyPfS5d1kIv1+uooYVPbHCkt2NsJkvcxpRDCfHCundcTG7t5b3qL5rlzfGUyCCElKm04n0dZUcUzmaAmOZNqLksFhwNh6U+DTwwFNrPFqDKK9j7f8mp1ifsLlDEaCDfbMeCGjdRYYwrrqyJLdYksUtuIy4rSwqg/Tb3bRkybKFZB6V3hw1vBWm4fZfSImjuX39nQXszezRavPaYNCJZXq7YfZOT7oePhYSAO5OqFAgGY+2YAQpl/GA6YZVlYyqUe5fNDNRgNhpuuNhN69dCa/+kcbutK+JvmZSaVb1ovYt16djOathwRHg7fNtdWQFpY4oC6vpcWf5rMOd5+qtCw+bYCnqVR8p6tsKkhVpbXMYQ7mVl8Q1v/Zu7u0+A1zp1BNbuTGfIXCHjE/dEfhh9eadcCdYtZRhGWNIo+mrXcK31ffz1fg3N/AT8ooyQ= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetches the status of the evaluation. Args: - evaluation_id (str): the evaluation id - request (Request): the request object +evaluation_id (str): the evaluation id +request (Request): the request object Returns: - (str): the evaluation status +(str): the evaluation status - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluation.api.mdx b/docs/docs/reference/api/fetch-evaluation.api.mdx new file mode 100644 index 0000000000..26f247a023 --- /dev/null +++ b/docs/docs/reference/api/fetch-evaluation.api.mdx @@ -0,0 +1,957 @@ +--- +id: fetch-evaluation +title: "Fetch Evaluation" +description: "Fetches a single evaluation based on its ID." +sidebar_label: "Fetch Evaluation" +hide_title: true +hide_table_of_contents: true +api: eJztV0tv4zYQ/ivEnHYB1U6DnnSqm6RdY/sIst5cHMNgpLHEXZnUkqOgrqH/XgwpyZJfyW6whwI92SJnPs7jm+FwCyQzB/Ecbp5kUUlSRjtYRJCiS6wq+Rti+BUpydEJKZzSWYECO2nxKB2mwmihyInp9ehBP+iJzVz8oIUQPcmlSsUbR/ZtLGY5ium1MCtB+QCMjFjxWR7lDqmyugXaGRj0vRymPe0RRGBKtP5jmkIMXma5k4AISmnlGgkte70FLdcIMQyshAgUe11KyiECi18qZTGFmGyFEbgkx7WEeAu0KVnZkVU6gwhIUcELO1PFNIW6XjCIK4126Fjv8uKCf4Yx/lAlCTq3qgpx1whDBInRhJpYXJZloRIPO/7kWGfbs6W07DqpcIJKz9nHRkWMtzwvNylLEWRLaz5hQs/I3wapRudJWiU16wSTCNfuULuO2gVprdz00O6Dvpimrg/HGXsd4J8eoQdp8Um5kPvXId81QK3NLfC3od512iyDjhy2GZB689fKE3gfrFvRVVEAU6+FmwWEJjstXiiA1yFyQBnTkaTKHbIx6J/mzYzXfT6KamjMudPvvXQdAVpr7FEfzCPzcVDDc1ijczJD6EHdeITDw+pdco5C+b1FP2OuKsgXV5ZZzCRhurR+cUiBYXya7mPsMjF6pbKX++KblU/hoEajHuRnZE4lFr0xkhGqMm0/Fgddy9irYASHQ6ap4oYji9uexaEPDu2qjyGJDgpCFP7nxnNqB1zoQtfDmnTs2jHuRBPZiYq7hohMzye0MsNlYhy9PDon6X4QmwjIkCy+I37rQSEJdbL5Pof0quYIRVfGrnkHuJp+IOWrsIW9Cqpi4pPTq7ivBfoYVD3QM9zxld9c63v9oH8Z79+lJy7C/vXV9fajne1r2gsPO3XNnvx0eXk4Bd3LQqVhdAqF980jUIokVXGm6xYmGey+4AZUmjBD2zD8eMH9bpLGywjWLjvX2/5ouk0Hdmak5GCI0AyfYQH7FY6ODsi+C2/b1k65cR3Cd+ywVuTdbHZ7ABhyu0bKDU/gGZIfuimHGMa7MduNt4OZu2aKoX1q5/LKFhBDTlS6eDxOClOlI5mhJjmSaixLBftvlInfFVcs6u8Ch0llFW083uR2+h4371CmaCGeL/oCH5hBgRNDsS4dslTv/TXaPBcmFeXGqn/aR4V/LuRBi91XemW8eteEvW2/yOQzal+OaF0w+2L04+jilDONgpjcTptCkIkvhNYOL8YlNwhXFygeBNa+CoBQrn/ebbCVpXG0lrqH5995vZfWvl3bXTH+h96ETRIJ/6ZxWUjlS9NHbNswc957AHI7i4fvwUUEub/I5rDdsm8fbVHXvPylQssEWzQ99JHTPd9Cqhz/TyFeycLhmTC+uWtK9604ZWpLQr2Bbg4CiIAnu/2nq+9MeUvzbSMzSRIsqad90Ei5Hrqi/e1mBnX9LyZMh+U= +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetches a single evaluation based on its ID. + +Args: +evaluation_id (str): The ID of the evaluation to fetch. + +Returns: +Evaluation: The fetched evaluation. + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + + + + +
    + + testset_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testset_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + aggregated_results + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + evaluator_config + object + + required + + +
    +
    + anyOf + + + + + + + +
    + + settings_values + object + +
    +
    + anyOf +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + + + result + object + + required + + +
    + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + average_cost + object + +
    +
    + anyOf + + + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + total_cost + object + +
    +
    + anyOf + + + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + average_latency + object + +
    +
    + anyOf + + + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-evaluator-revision.api.mdx b/docs/docs/reference/api/fetch-evaluator-revision.api.mdx deleted file mode 100644 index 94819468c9..0000000000 --- a/docs/docs/reference/api/fetch-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-evaluator-revision -title: "Fetch Evaluator Revision" -description: "Fetch Evaluator Revision" -sidebar_label: "Fetch Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJzNWdtu20YQ/RVhnhKAsVyjT3yq60vtJk0M3/pgCMaIHEqbLLnMXuyqAv+92AspUZRUSZYAP1kWZ87snJndHR5NQeNIQfwEFy/IDWohFQwiECVJ1EwU1ynEkJFOxs9UWzxLemGKiQIiKFFiTpqkBZlCgTlBDF3TZ5ZCBKyAGErUY4hA0k/DJKUQa2koApWMKUeIp6AnpQVRWrJiBBFkQuaoIQZjHIpmmluDZsm92xCld51CVQ0suCpFoUhZvJPjY/snJZVIVtqsIIY7kySkVGZ47zYYQwSJKDQV2ppjWXKWOBL635X1mc6tsZSWIs18hEQY7xSWzgpNI5Jzaz1zFhGklKHhGuLjKlpCkwtcTL5ljs12kJn1C0qGhbactuzXE1dFjUVhOAfLU5fKR4/tmIzgVcgfGRevBwj5d4BeiDjL8hDZLWR1gGx8hP3T1WYJpWYZJvsMcBog6whGj4XcG7hHqyJIUdOGqNb0k2Y5rYU+t4BVBDkphaO12Otg/gruVQQZd2fi6p3I1HNilBb50mBDIThhsTbateqdeYQqsnBN178FsWnzADo2ORZvAbxyAFUV1UZi+J0SvewIvnScdfFcYTS2V4Fpyuy5ivymxesGdatP1lakfNj+Zj695bEgYTIxHOWHS8P5n0oUn74ZXRr9ERaTtSBMU76hF0qJk7XELvhCh971barReXRa9D2R+lV8YUr/L62rkuy4b8fRvW/FMIzsdhx8RXfstIeG3aDO5yCqCBJJqCl9Rr3XY/DMw/ZOHVmmTA8R5MHDhiApcTpAkHMPG4LUdA0ne7zrarJ+n4TbruZrr1FqtpooNWF7jVLT1UR5IdkdJTdv18fgXkWguBntCnNnfe09tLdEA4e4eJu07+b9ZW8k2xXlQTKPwHdH4BZhTJi6d6vtTvpDUfL+GmLNbHJLGUkqktZpUy90sNWNchXKUNWvqZtW5B3dye9y0NmiBneBeDtRYlmyYtMBaJHibaatOpArvL3Ed+5+7121FZP3Or+9y15Z7Xwzo9QWiuQLS2gTdr3ytEUPBujKKUUZGxmvkh0i1lkrwEYvYbUMdo7uJaHzLrYNxlv9G1GtqqzfrycnXQ3uETlLXX69CymF3F2AS0kjc5dt6MpFAy6S1tNtdtXcXeEbeZb2F5FgPdjnarRMvVwiMHiT1aaOjN69fbqM85ly+uTy8qGDXUsyqun17K5O49zTt67AV/f3Nx1AX9t2US+tWNzrarPglICxsILyiLTTjvUYYuiXVv2k134jgqh+rYeq/nSpllyB3+e17uwmLRhrXaq430+4MOkRjqjQeISsjyVzW0tRYiTTE+dyenP9mSb+Zof4aTBv4O4a3zhts6ZmWLLPZCkMircXuNi/vhuC0u2nN0crKzLh3GtBzC2ud3pzDXMTOxwf/XJ0DIuUtoztDsHE7ZA6tnsM0QILTf4QAeVue4AmzH+bPbArK4XSQScKeGsquPA6HMjQ9I/ulxxZMTf1+uo+QaguzEm7yjVxqDBEEC//vWAQwVgobUGm0yEqepC8quzXPw1JW8VBUFqHltOnKaRM2c8pxBlyRZ31NqcLfLgNm+hjb3ZNtfOoK13YMtsF2v8ggh80WfkThzsrxnVPTYPtaZJQqedQOkebbb5md/xxcQ9V9R942M1s -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-evaluator-variant.api.mdx b/docs/docs/reference/api/fetch-evaluator-variant.api.mdx deleted file mode 100644 index 68c33fa925..0000000000 --- a/docs/docs/reference/api/fetch-evaluator-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-evaluator-variant -title: "Fetch Evaluator Variant" -description: "Fetch Evaluator Variant" -sidebar_label: "Fetch Evaluator Variant" -hide_title: true -hide_table_of_contents: true -api: eJzNV01z2zYQ/SuaPSUziOV6euKpqj9qN2njiZ304NF4VuRKRAISDLBwqmr43zsAQUoUJdd2lJme/MHd93bfYoHdFTAuLCR3cP6AyiFrY2EqQFdkkKUurzJIYE6c5vfUWtw/oJFYMgio0GBBTMZjrKDEgiCBgeW9zECALCGBCjkHAYa+Omkog4SNIwE2zalASFbAy8pjWDayXICAuTYFMiTgXEBhycobdAGPPjUko6sM6nrqsW2lS0vWw50cH/sfGdnUyMqnBAncuDQla+dOjT5EYxCQ6pKpZG+OVaVkGhQYf7beZ7URYmW8PiwbhlS7xilGLkumBZmNUE+DhYCM5ugUQ3Jci6FIgbdcvp8HKfsca2OZ9e0el6sWnUXplAIvz1BAL5yAb9p8mSv97YAUf0XIyICG5RxTPiDDJEJGhrkKx3m/kNLep86yLnYGMNNaEZaPMl7Z0WmDUAsP15XmexC7WkTQ3BVYfg/gZQCoa9Ea6dlnSnlX/1wEzYZ4tYCCGPtRYJZJ3xWornu67qvlBmzbFz2mYtb/z2Z6u7kglSZ1Cs2rC6fU71aXb947rhy/hu1kPYhkKp7ohcbg8lFht3xhIO9jzn94Mb3H4Ij+n0T9U7+Tlv9T1n1JDtyfp9FtcxTjQ/IkBYYheN9a9K/8l0GdbUDUAlJDyJTdIz/x+sqQ6Q3LEM9+ltMGdjQJYrkq+xEkHxvYSJKRoh9ActbARpJWrtnygBd+K9avy3jlt3odlKVVq2NpBTsoSytXx2KVW7z0rN54X/96HCy8ME894QGJ89euJ+QZ7t0gVtfe7eeTk+Hc9gmVzMJUNjo3RpuXD20ZMUoVJoLmgdg2UDrtfX3OXTytt96UddbvdBOgr1RhF7sG3vV7YS0uaH2B7jcNYoxu/dddkq+H7buQV0Md7TYKvpa3UXd/GmeNfI/V9/L29noA2NS2X9QLv12MBuM8hPEj134BWVCzbHAOCYwrQw+Svo27ycuO4whtx6tdu0cNAiyZh3ZNcUZBAjlzZZPxOFXaZUe4oJLxCOUYKxnawFLqjORlcJlcX72l5SVhRgaSu+mmwY0/Y82p6Zt1BcNKviWvX1yQJo5zbeQ/zVGIm1HeeHmBZDnXwb2dckNwo8n1FQjwaTTKHR/9dHQM23r2jH17YBrao+UOn0FsqdDlDwKoCL0BTFj8sv7gI6u05TiaRrz95dt6gKMWTH/zuFIoQw+EIFaxtHcQSwsb65H1KcfygoBk53I5FZBryx5itZqhpY9G1bX/91dHxpdwGlFmXtC7FWTS+t8zSOaoLA2i7e4VePUhts/r0XoU6mfRlrlchmCV83+BgC+03LcOh0sib8/TKppO0pQq3gAZ3Gn+4HV98dv5LdT1v/I/Z7g= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Evaluator Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-evaluator.api.mdx b/docs/docs/reference/api/fetch-evaluator.api.mdx index cc07cf7275..6b5a20de3a 100644 --- a/docs/docs/reference/api/fetch-evaluator.api.mdx +++ b/docs/docs/reference/api/fetch-evaluator.api.mdx @@ -5,67 +5,641 @@ description: "Fetch Evaluator" sidebar_label: "Fetch Evaluator" hide_title: true hide_table_of_contents: true -api: eJzNV01z20YM/SsanJKZjaV6euKpqj9qN2njiZVeNBrPioTETZdcZhfrVtHwv3ew/BApSq7sOjM9SSKBB+ABu3jaAsm1g2gOV49Se0nGOlgIMAVaScrktwlEsEKK0wdsLEBAIa3MkNCy7xZymSFE0Fo8qAQEqBwiKCSlIMDiV68sJhCR9SjAxSlmEqIt0KZgX0dW5WsQsDI2kwQReB9QSJFmgzbB0W0CZblgTFeY3KFjmPPJhD8SdLFVBacOEdz7OEbnVl6PPtXGICA2OWFObC6LQqs4VDr+4thn20mtsMwDqSpCbHzlVGescsI12k6KF8FCQIIr6TVBNCnFjpQQL998XAXK+tgrHdpw3EC5h9g7MlnfqE5laYxGmUMp2ke51xqYpSa5Wze6qBBKwXBH8noeYtuUGjT1mcz/C+BNAChL0RiZ5ReM6dAcXAfOhnilgAxJ9rOQSaK4y1Lf9Xgd5FnPYQe26XMvUrbsP+mWdzgWxMrGXkv75tpr/asz+buPngpPb2G/WAZRhNmJXtJauXmS2D1fGND7lPNvTCZ7DEb0/0Tq7+aDcvSvtB4rcuD+PI5m1SjWF+FJDAxTYN9S9K+wl0FddiBKAbFFSZg8SHoKsHP1JpLwHamQz/EoFxXsaBrI8kXyPYJ8rmDrIAlq/A5BLivYOkhD13LDe+y0OGFZnULWz5uwv3Z8vWqUhq02SkPYq0Zp6GqjOO3XL53Ve/bl7fFq6QV9cMICObQ7TvFrpURZsv2P5+dD5fGH1CoJumJ0ZW3QTC+UHQmSVDpogGol7BtoE/fePuf2XZR7W2RX7gdTJci9ydz6kFTbbQjn5Bp3V+Zx00DGaMZvD3G9k4nzUFcVurbrtHhHb8Xu8TIuK/qeauzNbHY3AKx622/qNevgjuYJQiM1LJHXSEEWUwoRjAuLjwr/Grcay423XXFcggCH9rHRz95qiCAlKlw0Hsfa+ORMrjEneSbVWBYqzLfD2FtFm+Ayvbt9j5sblAlaiOaLrsE9j1I1HH2zti+yUO+RaaqV+9RTaqz6VnW8lu5p5cU8qHxlgntN2TQkN5re3YIALqMiaHL2w9kE9mnrGfMpkHE4BU3s8BrEHgtt/SAAs3AEgFBmP+1ecGaFcVRrzhpv2KW9jVpzQPg3jQstVRjxEHxbd3AOdQeho98dCIh6f3EWAlLjiO2326V0+NnqsuTHXz1a7tNCwKO0Si6ZtfkWEuX4ewLRSmqHg9TaOwLefKqPwtvRTsj0U256mXMjOS/+BQL+xM3+n7Fw0NNmWLa1yTSOsaCO8+Be4qlqZ/yXqxmU5T/tE9lb +api: eJydVU1v2zAM/SsGTxsgJFmxk0/LumwNumFFm+0SBIUqM7Fa21IlOltm+L8PlD/ifGHATnGsR+rxPZKugOTGQ7yE2VZmHlYCjEUnSZtinkAMaySVPuJWZqUk40CAlU7mSOg4rIJC5ggx9IhHnYAAXUAMVlIKAhy+ltphAjG5EgV4lWIuIa5AFrvv65CFdpazeHK62ICAtXG5JIihLHUCtThG1CsBpCnjV7Pu6mieQM0nDr01hUfPl1xNJvyToFdOWy4MYngolULv12UW3bdgEKBMQVhQoGZtplXQYfzsOaYaELeOVSLd3KBM2QS1HHVBuEHWqqN4HRC12Mt0tnzz9IyK4ExpQwmKMsugXtW1OInbS71sWZ3Tqa+4rjnJ+6urU4F+ykwnofxo5lww/j/VSZCkzvhJE+b+FJAZdXB6qSsGEnQK16u9CNI5uRto99U0BFn23G8G/vRd1kG/ofdyg9AnuwwNYkQLPv2XAVxXc3WLG3ixl7dR93IZnxr5zl3WQW4Wi7uThI23h6Z+5mGOZoNhzpFSw3O+QQqzTSnEMLYOtxp/jft29eNqOOE1CPDott0SKF0GMaRE1sfjscpMmYzkBguSI6nH0mo4pjINp9E1Q8M0e1Sl07QL+aZ381vc3aBM0EG8XA0BD9xnTeccwnrTpNW3yBq2u2laUmqc/tO0Q7uc0iaKRdLF2oTwVs+W20epXrDgbcZ1NrQno3ejyaVi2oBoejdvx0WqMC4djwADcSRXLxQIwDzMChDK/MP+gFla4ymXxSDfqZ0HtHo9CH/T2GZSh1kIl1et1UtorYbBbvIgID5Y6CsBqfHE+Kp6kh5/uKyu+fVriY49WwnYSqflEyu4rCDRnp8TiNcy83hCrV8m8Oa+nZm3EYjzlDtfCzaVefE/EPCCu+NPT9gIadc4VQuZKoWWBsEnC4w7rB+GL7MF1PVfgqRuyw== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Evaluator - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + evaluator + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-human-evaluation-human-evaluations-evaluation-id-get.api.mdx b/docs/docs/reference/api/fetch-human-evaluation-human-evaluations-evaluation-id-get.api.mdx index 41250d4702..be473f2825 100644 --- a/docs/docs/reference/api/fetch-human-evaluation-human-evaluations-evaluation-id-get.api.mdx +++ b/docs/docs/reference/api/fetch-human-evaluation-human-evaluations-evaluation-id-get.api.mdx @@ -5,73 +5,430 @@ description: "Fetches a single evaluation based on its ID." sidebar_label: "Fetch Human Evaluation" hide_title: true hide_table_of_contents: true -api: eJzVVk1v2zgQ/SvEnFpAtbPBnnRaY5Ntje5H4Li9OIbASGOLXYliyVGwXkH/vRhSsiS7cYr21JMt6c3jfLyZYQMk9w7iDbyrS6nf3D7JopakKu1gG0GGLrXK8DPE8AdSmqMTUjil9wUKPKLFo3SYiUoLRU4sb2YP+kEv7N7FD1oIMUImKhOvHNnXsVjnKJY3otoJyidkVIkdn+VZVki11T2Rd3PwMpB4MGYjihlEUBm0/mGZQQwek+Rsnoy8OX3hkmTia5LskSACI60skdByshrQskSIYQKFCBSnyUjKIQKLn2tlMYOYbI0RuDTHUkLcAB0MGzuySu8hAlJU8IshLLHMoG23TOJMpR06tru+uuKfaVHu6zRF53Z1IVYdGCJIK02oieHSmEKlnnb+ybFNM/LFWE4TqXCCyi75x05FzJdcxi2MEQFrbPUJU3oBfxdQnc0op8HgmxK2ZkgbwZO0Smo+MQREWLpzijbqX0hr5WFE+THYi2XmxnRc7x8j/NszDJQusfikXJDOD1E7seqYeq975u+jXR2tGYOOHL5UwXVAdRXsbUKTvGzFqWE7R5Lqr7g6WNwHRBtBalESZomkS/jfA0osiG1qk32DzYeA8jZDkqpHluikrTfge77rh4nYz1U8VeapsJ5TxbiUk1qcJPmYu0liJhFvhwhPZii0LQf66/X1+XT5KAuVhQ67tbay3z9aMiSpiokgp4CiSidfpT78s/PD9lS4xzdKE+7RQrt9Xs1/VmkXZQSl21+q/F/onNzj0BoXJg8noxs6L4iE4wpHd7jtuIP79IbsPh/GTUjf1w47lnW9vjsjDLUtkfKKt2C/zCiHGOZ++b0ZLb95M9loLQsL7VO/9WpbQAw5kXHxfJ4WVZ3N5B41yZlUc2kU8M5ymNZW0cGbLO6W7/HwDmWGFuLNdgy4Z6mE4k9hx7xLo94jp6Hbt4ua8sqq/0NFu32bByuOU+ld5c37TeSdE4u7JbcYWhdUfTX7ZXYFp9ebCZhVLlOv8v5s/5mbapKFY/zc9KWXOBDK8rfhA3tmKkel1CM+f5sK9xkxasYTr5qh3362+1dXQ8L/aG4KqXwL+uQ1nQI3cKZAiCCe3qq2EeSVI0Y3DYf5wRZty68/12hZZdtufD5yzTcNZMrx/wzinSwcXsjoq1XXqK/Fcw73StQHP6WLmp8ggn/xcHYB9HMo77XedJhFmqKhkfXZ2OSmOLbo29s1tO0X4FkAhA== +api: eJzVVk2P2zYQ/SvEnBJAsTeLnnSKm90mRtpm4XVy8RoCVxpbTCSKIUeLuoL+ezGkZEt27A2SU0+2pDePM2++2ADJrYN4Be/rUupXt0+yqCWpSjtYR5ChS60y/Awx/IGU5uiEFE7pbYEC92jxKB1motJCkRPzm8mDftAzu3XxgxZCDJCJysQLR/ZlLJY5ivmNqDaC8hEZVWLDZ3mWBVJtdU/k3Tx4GUg8GLMBxQQiqAxa/zDPIAaPSXI2TwbeHL9wSTLyNUm2SBCBkVaWSGhZrAa0LBFiGEEhAsUyGUk5RGDxW60sZhCTrTECl+ZYSogboJ1hY0dW6S1EQIoKfnEIS8wzaNs1kzhTaYeO7a6vrvhnnJT7Ok3RuU1diEUHhgjSShNqYrg0plCpp51+cWzTDHwxlmUiFU5Q2SX/2KmI+ZLLuJkxImCNrb5gSs/g7wKqsxloGgx+SLAlQ9oInqRVUvOJISDC0p1StFH/QlordwPKz8FezDM3pON8/xrh357hQOkSi0/KhdL5JWonFh1T73XP/HO0i701Y9CRw+cyuAyoLoO9TWiS561YGrZzJKn+jqsHi/uAaCNILUrCLJF0Cf82oMSM2KY22Q/YfAoob3MQqXrkEh219Qp8z3f9MCr20yoeV+ZxYZ2rimEqR7k4Enmv3UiYUcTrQ4RHMxTalgP97fr6dLp8loXKQofdWlvZnx8tGZJUxaggx4CiSkdfpd593Phhe1y4+zdKE27RQrs+X81/VmkXZQSl217K/F/onNzioTUuTB4Woxs6zxQJxxWO7nDrYQf38gZ1z4dxE+T73mH7tC6XdyeEIbclUl7xFuyXGeUQw9Qvv1eD5TdtRhut5cJC+9RvvdoWEENOZFw8naZFVWcTuUVNciLVVBoFx1eGmf8q3jIUeKE5TGuraOf5ZnfzD7h7jzJDC/FqPQTccx2FyhjD9kmRRn1A1qhbxrOa8sqqf0O6u2WcBysWQelN5c37NRV8+12mX1FzS3Gcwe2ryevJ1blgOgMxu5t37SBT3w69Hx7G3TeSay8UT4fS9wIQyvLN4QN7aSpHpdQDPn/tChcfMejaI++aQ2P+3y5qXT4J/6GpKaTyverFa7pSXcFJqUIE8fj6tY4grxwxumk4zE+2aFt+/a1GyxW37ubsI+d/1UCmHP/PIN7IwuEFRV8suo5+Kc453Fel3vlxXtT8BBF8xd3JTdEPrLyv+6bDzNIUDQ2sT+YrN8i+l9/dLqFt/wPfwg8T sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetches a single evaluation based on its ID. Args: - evaluation_id (str): The ID of the evaluation to fetch. +evaluation_id (str): The ID of the evaluation to fetch. Returns: - HumanEvaluation: The fetched evaluation. +HumanEvaluation: The fetched evaluation. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-human-evaluation-scenarios.api.mdx b/docs/docs/reference/api/fetch-human-evaluation-scenarios.api.mdx index c8e103e27d..da17e7a15f 100644 --- a/docs/docs/reference/api/fetch-human-evaluation-scenarios.api.mdx +++ b/docs/docs/reference/api/fetch-human-evaluation-scenarios.api.mdx @@ -5,76 +5,668 @@ description: "Fetches evaluation scenarios for a given evaluation ID." sidebar_label: "Fetch Human Evaluation Scenarios" hide_title: true hide_table_of_contents: true -api: eJztVsFy20YM/ZUdnJIZRnI9PfFUTa3WmqSxxlJ8kTWaNQmJm5K7zC7oROXw3ztYkhIpWZLjXnuyvAQegAc87JZAcuMgXMBtkUn9Yfws00KSMtrBMoAYXWRVzv9DCH8gRQk6gTsj4SLU0irjxNpYIcVGPaPuGkxuBo/6UY/spshQkwsftRCiY7FSsXjnyL4PxTxBMbkRZi0owS4IY39PVJQIMmLNWewDe/h7qRy22Lfz+XT8I0KfdigmR3DKCW1IrE2hY8FpRxE6x8cxaoVxDYlUWN1iflKOFntyZk30ZShGIlWOOOmXaBlAACZH648nMYTg018lzPaqw8LOAwLIpZUZElpuTAlaZggh9CiDABS3JJeUQAAWvxXKYgwh2QIDcFGCmYSwBNrm7OzIKr2BAEhRygfjTotiqKolg7jcaIeO/a6vrvhPfwBmhWdqXaTivjGGACKjCTWxuczzVEUedvjVsU95nIu0Vm65AMLMx8otU0Sqjqxij6S3d2tffr+CKtid6CJNgRNva+JCggOeXk8BM5oXVOdwIjU2WNX9OI07YSvxma1a0BWHeoXTgzerqqC1M09fMaJehxfdNPr4HS68nI8H1oeBPX7bi14ajg1MQRfYeJZWSU0XWH6orRqKW58a/TV+d7XlJU46yRxFuUxLG+QkL3cNG1yCIXzrhD6wb8X6NPa1IEoTbtCexZ15vIq1aC1GtJLafUf71jR/r1HEqEbhKXarXGmNL2vzyZgUpT4vTiemNUIVgP4PHH72HF4Yh+Nl6du3H+vLM+GnoTFpt53wV6DwHqKzP2a77V1VnNqv19fH2/NBpiqu7cfWGvszq7OvvBhJqvSMNFMT9b7+zJgtT6vgk6kTZGoytzkn37/QObnBvaTO7GEmQ8z566W2cl116Mauq60dvTW7p8u4qel7KdhuJubz6RFg3dsMKTF8k2+Q/GVNCYQw9Df6h/3cuWHZG8JqeOK2d2if26u+sCmEkBDlLhwOo9QU8UBuUJMcSDWUufJKcBgVVtHWu4ymk4+4vUUZs94Xy67BjOennoi+2f4uztVHZG6aR8aooMRY9U/d5uaRkdRelb/N1sa7NzyNfHJiNJ3w2kXr6lG/GvwyuILD92PPmEdfRn7029j+MwQHLOzqhwAw83MPhDL7bf+BM8uNo0zqDt5FrR7kV+7l+P9T921P3WaqCH/QME+l8pvCt7NshLKAI6FAAOHhvn5RK8sAEuOIQcrySTr8YtOq4uNvBVqWw7K5+594OBclxMrx7xjCtUwdnmn4u/tmzbwXp+poJaO3/onhH3QAAfyN26Pnud+iSSvKsrEZRdyqjvfR0mf17hbMn+M5VNW/asW9Lw== +api: eJztVsFy2zYQ/RXMnpIZRnI9PfFUNVZqTdJYY6u+yBoNTK5EJCTAAEsnKof/3lmQlEjJkhzn2pNl8O3D4u2+BUoguXYQzuG6yKR+N36SaSFJGe1gEUCMLrIq5/8hhA9IUYJO4BYkXIRaWmWcWBkrpFirJ9RdwORq8KAf9Miuiww1ufBBCyE6iKWKxRtH9m0oZgmKyZUwK0EJdkmY+3uiokSQESvOYrexp7+VymHLfT2bTcc/IvRph2JyQKec0IbEyhQ6Fpx2FKFzvByjVhjXlEiF1S3nJ+VovhPnrtl9EYqRSJUjTvo5WQYQgMnR+uVJDCH49JcJq73sqLCNgAByaWWGhJYLU4KWGUIIPckgAMUlySUlEIDFb4WyGENItsAAXJRgJiEsgTY5BzuySq8hAFKU8sK4U6IYqmrBJC432qHjuMuLC/7Tb4C7wiu1KlJx24AhgMhoQk0Ml3meqsjTDr84jikPc5HWyg0fgDDze+WWJSJV76xiz6Q3Nyt//P4JqmC7oos0BU68PRMfJNjT6eUSsKJ5QXUOR1JjwLKux3HeCaPEZ0a1pEve6gVB9x5WVUGLM49fMKJehefdNPr8HS28nQ8b1m8DO/62Fr00HANMQWfUeJJWSU1nVL6vUY3EbUzN/pK4mxp5TpNOMge7nJel3eSoLjeNGnwEQ/jaDr3n2Ir9aexLSZQmXKM9yXvn+Sr2orUY0VJq9x3ta9N8X7OIUc3CXeyWudIan/fmozEpSn3anE5Ma4YqAP0LGn72Gp5ph8Nh6cu3a+vzPeG7oYG00074K1D4CNGZH3fb6V1VnNrvl5eH0/Nepiqu8WNrjf2Z0dl3XowkVXrCmqmJel9/ps0Wx13wydQJsjSZW5+y79/onFzjzlIn5jCLIWb89VxZ+Vz11g2u662tvLW6x49xVcv33GbbnpjNpgeEdW0zpMTwTb5G8pc1JRDC0N/o73Z954Zlrwmr4ZHb3qF9aq/6wqYQQkKUu3A4jFJTxAO5Rk1yINVQ5gr232Qj/1W8Z6i3icOosIo2nm80nXzEzTXKmIfBfNEF3HFz1e3Sh+0u6lx9RBaueYGMCkqMVf/WPdC8QJI6qvJX3cr48EbEJrc/ZfQVtZ/LaF2d9sXgt8HFscM0AWI0nTQekZH3SJuHh0GwJ9dWKAgAM28QIJTZH7sPnGVuHGVSd/jOmnovz3Ln2//fxK97EzcdRviDhnkqlR8pvpxl46g5HDgKAgj3B/uzploEkBhHTFKWj9LhPzatKl7+VqBlayyaR8IjN+q8hFg5/h1DuJKpwxMFf3PbzKO34tg5WvvojX+L+JcfQABfcXPwjvfjNmkNWjaYUcSl6kQf3A7s5O0k+ms8g6r6Dzy/y74= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetches evaluation scenarios for a given evaluation ID. Arguments: - evaluation_id (str): The ID of the evaluation for which to fetch scenarios. +evaluation_id (str): The ID of the evaluation for which to fetch scenarios. Raises: - HTTPException: If the evaluation is not found or access is denied. +HTTPException: If the evaluation is not found or access is denied. Returns: - List[EvaluationScenario]: A list of evaluation scenarios. +List[EvaluationScenario]: A list of evaluation scenarios. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + + + inputs + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + + + outputs + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + vote + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + score + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + correct_answer + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + is_pinned + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + note + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-invocation-by-trace-id.api.mdx b/docs/docs/reference/api/fetch-invocation-by-trace-id.api.mdx deleted file mode 100644 index 3c93f919bb..0000000000 --- a/docs/docs/reference/api/fetch-invocation-by-trace-id.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-invocation-by-trace-id -title: "Fetch Invocation" -description: "Fetch Invocation" -sidebar_label: "Fetch Invocation" -hide_title: true -hide_table_of_contents: true -api: eJztmktv2zgQgP+KMacWUONssCefNpu222zSTZC6vQSGQUtjiw1Fqny46xr674uh3n4ojpMCxUInw9I8yG84Q5rjNVi2MDC6h0u5VCGzXEkDkwBUitp/u4xgBHO0YTzllch0tppazUKc8ggCSJlmCVrUZGkNkiUII2gIcAkjSJmNIQCN3xzXGMHIaocBmDDGhMFoDXaVkp6xmssFBGC5FfRgTIYGlxFkWVBZNymTDePfHOpVy/qcCdMyz+TqZu4H2HZERosn0gkB2aR2/SllMvc8IdsmVdKgIWtnp6f0EaEJNU8JCom7MERj5k4M7gphCCBU0qK0fgxpKnjOcPjVkM66McJUE3bLcw+hcrlSMTguLS5QN8BceIkAIpwzJyyMTjPCUUapPekN4xqZxWjKbBeaAOZKJyQDEbP4xvIEO3ld5GYH5xayAFwa/Qwnn3OzhZMIBf4EJ29zs4WTEtdsRWvuMD/O8eggWH+u/BKreb2ol5JW5aUE9qJeSlyVlzI/n5t4QV1HjjRVl48AlOYLLvPELXIGQmesSiitNmaP0iVUGiuB2CVMQgDMWQXNwfIkFej93OQOsgAeuIzajlgUq7DDT/kel0xQVRVstcfLFdmmZRkzKVFsuEl5hxNlRQoBfMcZBGCiB5pOyvf4uSjsUxT8PtGMAIsiTmWGidtWaTkgRmUpa4UtmbWfzJQSyKR/tNsXhFyHTjD96h91zY392yj55sbZ1NnXNQI1+4qh7VwiW+p+xgerj4lNFkCClv26jN47IR4lxC0mB2oxrdmqk8uG7tOgfiSYVK5YAbVH2YWyUYpZDk7jHDXKMMfU3v7z41LH+WCJ2mwdIQ6vuV8KddoIhFscvQuQLp1pXmyfyk+Re9ndlcx2GMmCHNt0yTRn0vb4jsOnccm34fT8Hudn0ViD/cI7Flyfuc8F2OfusQQbv/x7eM+A1+fwS0Ds8/hYivTj3DGrdI/uaHR9Dj8fYZ/BzznLhMxgT+5p5Dr0GleGd/WtQxaA4PLhwGvDdgB+xevjDgDXXD7svt4qboH+X/N7/L7q2gd+l8m6Q3ef3+21bqrKJdNcs3VD62mrslasmnFZRgq/n51t9+6+MMEjLz14p7XSxzfuIrSM+0v5PcEXKmy9fcoV5mQzCg3mNSZIzKKrpfoRjWELrEO6X9TDGIzp7WPhFL59Qa4LuWZJrPDmdPdP422OryuyH8bj2y2DeWzbQX1PjetBYwX5S/pYUVN7gdb3rm0MIximtKHi92HdPjXDdZlbGfVKUC/LDrfTAkYQW5ua0XAYCuWiE7ZAadkJ40Pqp1AuGAyd5nblVc5vL69w9QFZhBpG95OmwCdaSPnSaItVUWEpv0KCVHS/z52NleY/ykn5Hnica2W+CTxXXr0Adu4HNzi/vYSg3tzg9OS3k1PYhNYSphxgoc+B0rd/DcEGhWr+1GxKfAKARZb8Ub+gkaXKWOqi1fZ2xKg1ngqCxX/tMBUs76957+sifvdQxA+aDXAqJ6OqPk4CiJWxJLxez5jBz1pkGT0ubsPv1xBxw2ai8feBB1y1/mxA5y8aiw+wP8bOCPAu1Y1JVMUEXt0VOfN6ULcA2pMrwy5XTZ/lcKop+WoQl2tqXbw+D0NMbUNxq3jR4Ks8+OvdGLLsPzp5kOg= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-invocation.api.mdx b/docs/docs/reference/api/fetch-invocation.api.mdx deleted file mode 100644 index 76f28e4ff6..0000000000 --- a/docs/docs/reference/api/fetch-invocation.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-invocation -title: "Fetch Invocation" -description: "Fetch Invocation" -sidebar_label: "Fetch Invocation" -hide_title: true -hide_table_of_contents: true -api: eJztmt1v2zYQwP8V455aQI2zYE96Wpa2q5d0DRK3L4YR0NLZYkORKj/ceYb+9+Gobzt2HCcdikFPiSXeHfk73pG+8xosWxgIJzCSSxUxy5U0MA1AZaj9p1EMIczRRskdr4dAABnTLEWLmqTXIFmKEILVLMI7HkMAXEIIGbMJBKDxm+MaYwitdhiAiRJMGYRrsKuM5IzVXC4gAMutoAdjUjQYxZDnQa3dZEw+RTmTq09zP72uGVJZPpFOCMinjeHbjMnC7pRUm0xJg4a0nZ2e0p8YTaR55jGEcOuiCI2ZOzG4KQdDAJGSFqX1c8gywQtqw6+GZNatGWaaQFteWIiUK4TKyXFpcYG6heXCjwggxjlzwkJ4mhOM2i+dRW8o18gsxnfM7kMTwFzplMZAzCy+sTzFvbwuCrWDcwt5AC6Lf4SRz4Xa0kiMAn+AkbeF2tJIhWu2oh13mB3neHwQrN9Xfos1vF7USkWrtlIBe1ErFa7aShWdzw28oMkiR6pqkkcASvMFl0XgljEDkTNWpRRWG6tH6VJKhvWAxKWMsh1zVkF7sjzNBHo7nwoDeQD3XMZdQyxOVLTHTvUel0xQThVstcPKJemmbZkwKVFsmMn4HiPKigwC+I4zCMDE97ScjO+wc1HqJy/4k6HtARbHnNIME9ed1HKAj6pU1nFbOus+mSklkEn/6GFbEHEdOcH0q7/UFTf2T6Pkm0/OZs6+bhCo2VeM7N4tsiXuV3yw+JjY5AGkaNnPy+i9E+JRQtxieqAU05qt9nLZkH0a1I8Ek9IVK6H2KPehbKViVoDTOEeNMiowdY//bw71at/9YInabF0hDs+5X0pxOgiEWxx9CpAs3Wle7Jwq7pA72d1UzB5QkgcFtrsl05xJ2+M7Dp/GJd+G0/N7nJ9FYw32G+9YcH3kPhdgH7vHEmx98+/hPQNeH8MvAbGP42Mp0pdzx6zSPbqj0fUx/HyEfQQ/5y4TMYM9uaeR2yPXKhneNFWHPADB5f2BZcOuA37G8vEeAFdc3j9c3iqrQP+v9T1er7ryjn9IZdOgmxS1vU6lqtoy7T3bNLSetisbwboZl+ck8OvZ2Xbv7gsTPPajB++0Vvr4xl2MlnFflN/hfKGiztunlDCnm15oMW8wQWoW+xqqH9EYtsDGpbuHehiDMb19zJ3Cty/IdDmunRJrvAXd3ct4W+Db59kP4/H1lsLCt12nvqdW9WDUblWnaBNFbewFWt+5tgmEMMzoQMXvw6Z9aobrKrby4boM2Jy6JqiXVafbaQEhJNZmJhwOI6FcfMIWKC07YXxInRWKCoOR09yuvMj59egSVx+QxaghnEzbA25pSxWbpDus9g/L+CUSrrILfu5sojT/p1qe74UnhVTu28Fz5cVLdOd+coPz6xEEzTEHpye/nJzCJr7OYIoGFvloqGz71xBsUKjXT22n1IcCWGTpb80LmlmmjKV+WqPvAW915lNDsPi3HWaCFZ02b31denICpSeh3QqnxBK2fo4QVvl3GkCijCW59XrGDH7WIs/pcVkin0wD8NfVGeGbrCHmhv6PIZwzYXBrinXSgFc3ZWy8HjSl/u7UK6dK8ijd7egTBHCPq/bvJygR/Id2Kzg+2STVRl2Xb8+jCDPbktvKjbSj6zD7490Y8vxfxkmrXg== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Invocation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-legacy-application.api.mdx b/docs/docs/reference/api/fetch-legacy-application.api.mdx deleted file mode 100644 index f1e3c0612f..0000000000 --- a/docs/docs/reference/api/fetch-legacy-application.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-legacy-application -title: "Fetch Application" -description: "Get an application using workflow data stored in legacy format" -sidebar_label: "Fetch Application" -hide_title: true -hide_table_of_contents: true -api: eJzNWN9v2zgM/lcMPm2A1/SKe/LT5fpj7W13K9Z2L0VQMDaTaJMtT6LaywL/7wdJdmInTS5JWyBPiW3yI/WREinOgHFsILmHfllKkSILVRgYxJCRSbUo3TMk8JE4wiLChVBkjSjG0ZPSP0ZSPUUZMkaGlaYsEkUkaYzpNBopnSNDDKok7fWuMkhgRJxOHoLMQwsUYihRY05M2nk1gwJzggRaMg8igxiE86pEnkAMmn5aoSmDhLWlGEw6oRwhmQFPS6dtWItiDDHU7iRgrUdhwdIJtBYfXWVQVQOHakpVGDIO6OT42P10SbmxaUrGjKyMvtbCEEOqCqaCnXjL695343RmLedK7UhhESykygal2mdRMI1Jt5w89RIuMiO0kiE5ruK2CW+xmH4ZeeK66CPpw7xeQJiH1BpWeVeodmaolCQsoIrnrworJTieGveuTHQaEKrYwdEjSous9EsQz+cgAXRicyxeAnjpAaoqboTU8Dul3KL5s8/KVkZceO5WcasYcmLseoNZJpwSyusOvyv+1jnZgm0i3rGUD7tv2st83hakQqdWon53YaX8y6jiwxfLpeX3sLxoByKY8i21UGucbiR4SRdWaN6k/Lcj02mspOohkfqP+iwM/y+t6xa5or4bR7chFetjcSsGVl1wutXSCb8f1FkLoooh1YRM2QPyJsDWMZwh0wcW3p/1Vk4DbNT3ZNkyewsjdwG2NpKRpDcwchZgayMNXcOpq2nb2fGFaxuy/pz6Srbg61WtNGzNrTSEvaqVhq65FSPteN9cvXG6roq8mnv1ynG5BnQr6yNp84It9q1Wd5HUYl+UOy0CgtwfQTqECWHme7Pdzue3ouTwEmJDZ/GVRqSpSDtnROPoYKc6cFmHoWq63W0jckCV9CDbkx1icFMT7/pALEtRbNu2LFO8S4/UGPKBd6V37+wP2lX3xnWoXddB5sp65esFpS5QpB9FStuwGy6wO+RgDV35e+dIjK1+5i74OrZOOwZ2ukKdoW/tV25Qu2C8VH9+Ra8qp/f7ycnqjf4bSpGFMcC51krvf53PiFH4Yltn5bKAVGnn6y67qlUrQiK3lq3mbEFuxs8NQRb3LWNwTIvMXi/qyYhu3dfnOF8MYO79uoLpWq5duOf0BnbXL+Ms0LcpwJe3t9crgCG2OfFEuTnTmNiPlHgCCfRKTY+Cnnph7tRrhdP0Zt0JUwVh2zZjKN84wYS5NEmvl0plsyMcU8F4hKKHpfA7xVBqteCpV+lfX32iaSjUkNwP2gK+dIQ86IrNQ4Cl+ESOkXoA1rc8UVr8asZkfv4VmjHPkihGyqs3Ey3vXNS/voJ40W/B8dFvR8ewPN3rCLuEx9QnfGPbf4Z4iYX5+iEGyn22AxPmfyw+OM9KZbge2tR4F276F/U7Y7+ly+h817188lgTyvQv90qJomg1wiEz7qHODIghaENnsGYghmRpAjmIYaIMO+XZbIiG7rSsKvf6pyXtMmAQwyNqgUMXj/sZZMK4/xkkI5SGNiz53dd6P72P1vnfZEnhXHUzMvcEMfyg6eq01J8XkyYRZ7VQP02p5Jb6yvHmMna+lT6e30JV/QeWQaHB -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Get an application using workflow data stored in legacy format - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-legacy-evaluation-results.api.mdx b/docs/docs/reference/api/fetch-legacy-evaluation-results.api.mdx deleted file mode 100644 index 5d704549b3..0000000000 --- a/docs/docs/reference/api/fetch-legacy-evaluation-results.api.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -id: fetch-legacy-evaluation-results -title: "Fetch Evaluation Results" -description: "Fetches the results of the evaluation" -sidebar_label: "Fetch Evaluation Results" -hide_title: true -hide_table_of_contents: true -api: eJzVVU1v2zAM/SsGTy0gxFmxk08LsG4NumFFmu2SBoFqM7Y6W3Ylulhm6L8PlO3YTtYCO+4UWeLH4+Mj0wDJ1EK0gesXmdeSVKktbAUkaGOjKv6GCD4hxRnagDIMDNo6JxuUe/+JR78H/aAXJrXRgw6CYPSwU0lwYclcRicegUpaW4PPNVoKLlbtobPsr8vHJ4yJ46+QaqP7FDs6VLiLgt0I7Q4ElBUan2CZQAR7Br/LMZXxYTdC1RUCAippZIGEhploQMsCIYJJASBAMROVpAwEMDJlMIGITI0CbJxhISFqgCFBBJaM0ikIIEU5Xwz8BssEnNtyEFuV2qJlv6v5nH+mvN/XcYzW7us8WHXGICAuNaEmNpdVlavYhw2fLPs0AxbnnBPw/urqPPAPmaukRXNtTGn+ISpUhvkl1eJOkKTK+aQIC3tukJfx5FXqw7e953lKlRPHG6UJUzTgtk70d9IYeRjx+aVsAYITUNj0Leq/orUyRTgGe6NLTEaw5lc35G71N2n7xtfVpu7stkOYgd6W3dfL+NjS97dkvcnNen13FrDtbYGUlazxFMnrmDKIIByUa8NmImMXDqq3aF56ydcmhwgyospGYRjnZZ3MZIqa5EyqUFYKWLAW49ooOniXxd3yFg83KBM0EG22Y4N7Fkvb/qnZkXlZqVtkIrphW9SUlUb9bnvaDVvWenGlSu9L796RsvDggsXdEgRwGa2u57N3szmcrq+JMetcxl7nfW7/DOKEhWP9IAALL3IglMWH4YGRVaWlQupRPL8tg9HAr46cT3A1w8z9bxu26yLhLwqrXCo/hp6+plPhZrQ/ufLodJ32QtwKyEpL7NE0j9Lid5M7x9fPNRrW2lbAizRKPnLnNw0kyvI5gWgvc4tvsOqr5YG9DF4D3etRsxgZIn+BgJ94OPsP8Pso6xXfdDaLOMaKRt5n65NH4ziqn6/X4NwfLH2VVw== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetches the results of the evaluation - -Args: - evaluation_id (str): the evaluation id - request (Request): the request object - -Returns: - _type_: _description_ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-legacy-evaluation-scenarios-comparison-results.api.mdx b/docs/docs/reference/api/fetch-legacy-evaluation-scenarios-comparison-results.api.mdx deleted file mode 100644 index a8ea7d7d9d..0000000000 --- a/docs/docs/reference/api/fetch-legacy-evaluation-scenarios-comparison-results.api.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -id: fetch-legacy-evaluation-scenarios-comparison-results -title: "Fetch Evaluation Scenarios Comparison Results" -description: "Fetches evaluation scenarios for a given evaluation ID." -sidebar_label: "Fetch Evaluation Scenarios Comparison Results" -hide_title: true -hide_table_of_contents: true -api: eJztVcFu4zYQ/RViTruAaqdBTzrVaNKusSkaJG4vjmEw1FjiViK1nFG6rqF/XwwlS3LsDdqee7JMzrx5nDePPADrnCBdw+2LLhvN1juCTQIZkgm2lv+Qws/IpkBSOAQpMuh0sJ7UzgelVW5f0E0DljezJ/fkFiFvKnRM6ZNTSk0itjZT74jD+1StClTLG+V3igucggj2X4U1hWKvdsJiLBzhH7QlPGJ/WK3ub78YjLRTtTyDs6ScZ7XzjcuU0DYGiWQ5Q2cx6yCRm+COmHeWeD0257GvvknVQpWWWEhfassMEvA1hri8zCCFSH9bYq7Nfjtpw5CyNb6qdbDk3TYgNSUTJFDroCtkDCLTAZyuEFIY82lrM4mzItTnBsMeEgj4ubEBM0g5NJgAmQIrDekBeF9LPnGwLocE2HIpCxP91TIjaNuNwFDtHSFJ5vXVlfycTsZjE1u4a0r10AdDAsY7RscSruu6tCYCzz+R5BymbPrqx1wVJ03dxSapkZN6HMbtp6FJUjE2qW3bNoEfrq/P+f2hS5t1ELch+PBvyNVBBGTbHT9D1raUL8tY0XlA6c3Jrnb733ZRs9Oet8mwYh1jjgHaTZsc13QIej8R5s53BKFNoKL8LQ1/RSKdIwxgb8gtzVAr2W3H2v75Exo+mZ91PFdXuo/bjDBje7vufvsYN137LhU7hoh9zwA7bSvkwouJcuToCS4ghfnEBfNLjpqPjvpudBRheDnaqQklpFAw15TO56b0TTbTOTrWM23nurYgPiA0TbC8jymL++VH3H9AnWGAdL2ZBjzK8HTjcBo2KKFr+xGlMb2RFw0XPti/O417Gxddlpzcup2fOmURyanF/RISkGN0c341+352Ba/v7ZNgmXtt4twfa8dtSF51YTg/JIBVHHpg1NWP44Ywqz1xpd0ErzPvP3XtK7KH0Zj/vzf/7b3pR4zxC8/rUtt4Z0RtD71l1tOHQ+S9YJo4Kme22SRQeGKBOByeNeHvoWxbWe7eHHFGZkk/l3Jr7HRJ+IbA7x76C+a9+hbvP3F/8Z2TBYmOxnzRwUrJ6MPk6Bvh0qUvjKgzyTq78QVluF1+uV1B234FVswuPQ== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetches evaluation scenarios for a given evaluation ID. - -Arguments: - evaluation_id (str): The ID of the evaluation for which to fetch scenarios. - -Raises: - HTTPException: If the evaluation is not found or access is denied. - -Returns: - List[EvaluationScenario]: A list of evaluation scenarios. - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-legacy-evaluation-scenarios.api.mdx b/docs/docs/reference/api/fetch-legacy-evaluation-scenarios.api.mdx deleted file mode 100644 index 2801de0de8..0000000000 --- a/docs/docs/reference/api/fetch-legacy-evaluation-scenarios.api.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -id: fetch-legacy-evaluation-scenarios -title: "Fetch Evaluation Scenarios" -description: "Fetches evaluation scenarios for a given evaluation ID." -sidebar_label: "Fetch Evaluation Scenarios" -hide_title: true -hide_table_of_contents: true -api: eJztV0tv2zgQ/ivEnFpAsLPBnnRao8lujWSbIMn24hgGI40tthKpkqO0XkP/fTGkbEl+N6c99BSHnMc3M9+MhisguXAQT+D6VeaVJGW0g2kEKbrEqpL/hxj+REoydAI3QsIlqKVVxom5sUKKhXpF3RUYXw2e9bMe2UVVoCYXP2shREdiplLxzpF9H4unDMX4Spi5oAy7Rtj290wlmSAj5oyidezNP0jlcG3749PT/fWPBD3sWIx3zCkntCExN5VOBcNOEnSOj1PUCtNgEqmyem3zVjmatMl5bLxPYzESuXLEoPelZQARmBKtPx6nEIOHP8txIZPlrJOGjQpEUEorCyS0XJMVaFkgxNDLGUSguCalpAwisPitUhZTiMlWGIFLMiwkxCugZcnKjqzSC4iAFOV8cN2pUQp1PWUjrjTaoWO9y4sL/tNnwGPlUzWvcvHQCEMEidGEmlhclmWuEm92+MWxzmoXi7RWLjkAwsL7Ki3niFTwrFJvSS/v5j78fgR1tDnRVZ4DA1/HxIFEW3k6PwWc0bKigGE/tFCJwxY/8X0dNfeH5Z74vI6AAQTB5uKzP6g3JsC8fMGEehWeBBiNyNrIdF9ca56OObAW2KYCm8SFwOsITEUncmDRVTntnv90zJsKHytpk5AI0Fpj+8To+y/QObk4CuHvRqSOwJFMvpKVCb6VbI+thVP1WkPr1siHs2v/lCl/17HzEKpRcxc62huLrooX3OertfKBdesIckmok+Vbzdw26qeCaCh0lLJ3nohHOHvXMNWHbi0mNJPaffdDswv/AI2/4vIYVW5w2W/QA3LnNSw729OoHwLukYe9E+rxgnlNMWoi5uHlZqXSGvdPzxdjcpT6+Ph04j5YqCPQht7cGp9Yt46aOh8bJs2sNnaWGD1XizPGtbHiQ5DdePg1jP5fw+iE2k7Ro7MmQjvqDkyEh4ZuZ/rvLFJ+kLQfv5a53eHmV7ZdWB5Qi8AvRcKvyiKoiM6e8bjZ8uqaYf5+ebm7ZX2WuUqDfKjMT6xYfRqmSFLlR/ovN0nv9gzuKU244HE1PVyJWxMAcm4Kd7SrO21wqml9MkRo3RMl5riC62iHpW1617w/FMZVSN8+Z2sRfmzsGAy1LZAywyv/Askv9ZRBDMOWfW646lGxHh54Dzi0r+vHQGVziCEjKl08HCa5qdKBXKAmOZBqKEvl54LDpLKKll5ldD++weVHlClaiCfTrsAjMydwoS/WbuuluvGfr+YZMqooM1b9GwrcPEOyoFX7JXpuuivtyIMTo/sxfwLRukDyi8FvgwvYfmL2hJn0MqF28W6uIdrKwiZ+iAALz3gglMUf7QUjK42jQuqOvdCme/tzC9mqbcFf7+C3vYMbPhH+oGGZS+Wngy/kqmmO7mjmCsTbk3pvf0wjyPzuO4HV6kU6/Mfmdc3H3yq03AJT/tBbJV+YkJMVpMrx7xTiucwdHin1u4dmqLwXhyJYt4luV7wYIAoL5ta3xs/MbN2IzRIKo4SL1NHeGfHcsZtx8tf1E9T1f4vvHQI= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetches evaluation scenarios for a given evaluation ID. - -Arguments: - evaluation_id (str): The ID of the evaluation for which to fetch scenarios. - -Raises: - HTTPException: If the evaluation is not found or access is denied. - -Returns: - List[EvaluationScenario]: A list of evaluation scenarios. - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-legacy-evaluation.api.mdx b/docs/docs/reference/api/fetch-legacy-evaluation.api.mdx deleted file mode 100644 index f715468b83..0000000000 --- a/docs/docs/reference/api/fetch-legacy-evaluation.api.mdx +++ /dev/null @@ -1,77 +0,0 @@ ---- -id: fetch-legacy-evaluation -title: "Fetch Evaluation" -description: "Fetches a single evaluation based on its ID." -sidebar_label: "Fetch Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJztWEtv4zYQ/ivEnHYB1U6DnnSqsUm7RvoIHG8ujmEw0ljirixpyVFQ19B/Xwyppx3LeRzaADklpmY+zuObITk7IBkZ8Bdw+SCTQpLKUgNLD0I0gVY5/wYffkMKYjRCCqPSKEGBjbS4lwZDkaVCkRHTi9FdepdOdGT8u1QI0ZFcqVB8MKQ/+mIeo5heiGwtKO6BUSbWvJdFmSEVOq2BWgOdvpXDsKM9Ag+yHLX9MQ3BByuzSjCSwXbVCoIHudRyg4Sand9BKjcIPvSMBQ8UO59LisEDjd8LpTEEn3SBHpggxo0Efwe0zVnZkFZpBB6QooQXWovFNISyXDKIybPUoGG987Mz/tMP9U0RBGjMukjErBIGD4IsJUyJxWWeJyqwsOOvhnV2HVtyzREg5XZQ4ZB9bJTHeKthuUmeCyeb6+wrBnRC/tpJVToPUiuZso4ziXBjDrVLr16QWsttB+3W6YtpaLpwnLHXAf5lETqQGh+Ucbl/HfKsAqptroFfhjprtFkGDRmsMyDT7d9rS+B9sGYlLZIEmHo13NwhVNmp8VwBvA6RA8qYhiQV5pCNTv84b+a8bvORFH1jhna/tdKlB6h1pvs+9PffoDEyGjThz0rEeRF8Iy2DF8flpkUo2/Rm91wcvYayaEzraF9adw7xT0HZb8sufUyRkK30KNIYScJwpe1in4/9YFWtMNOrIEvXKhoK7FPaTE2wY1I1eV7SYlpbv+H2CR050+IKtzbJSKTSyKws50zfSRmGitusTK477rru38/AIAuqLcSt26L0INBosyBpyNhPTkpMbPKKPHyCzhcnZXVO8MQecDYrvaDvR7Nnbc+M5SNx/eS4wvF4RvQeQxINFDiyvveT/1c/OaF20D+aPHawJk1HarvUkVOwFRWzqnlxS3tALSNcBZmhoVS9U+U/PXoOgDygjGTynrc3l7e64hJJmAbb9+S9peQNXzzWmd7wF+Aj/idS9mrwktvIINBzryjV+3TvktJ9Ve4/Co+86LrvsOaR8uit+Dl3Hn61lyV78sv5+eFz/lYmKnQzAJfgF7/lQySpkoEbe5IFva9PoLBKCSPUVUd+/OD9IwsqLz3YmOiJ1XSq9m0whOsAJ1jAfrmtvQOyt+Gty+eYGxcufI9tVot8ns+vDwBdbjdIccYTpQjJTo8oBh/G7bzIjHe94VHJFEP9UA+YCp2ADzFRbvzxOEiyIhzJCFOSI6nGMle2kxgMCq1oa1Um19Mr3H5GGaIGf7HsCtwwSVza+2JNxGWuruz1vRptTQqKM63+rQdgdrQVOy32UKXrzKo39y02Tkyup1xPqI3j89no59EZ7M8He8LMbxlYftd7289cSb0oNP7zo2NjyQ2EcvNr+4EtyzNDG5l28Ow4sjMQ3Ldn19bYGxpdVokj/IfGeSKVrTgbsV1FuEVnQMldyu/PK5cexPY+tYDdjn37opOy5OXvBWom1bJqjfec4sUOQmX4/xD8tUwMDoTxw6yqyI/imKk18dItNGc6gAf2Tb43WrUNJ66pvatkJkGAOXW0D/oj10BTi79fzqEsfwCp687l -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetches a single evaluation based on its ID. - -Args: - evaluation_id (str): The ID of the evaluation to fetch. - -Returns: - Evaluation: The fetched evaluation. - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-legacy-evaluations.api.mdx b/docs/docs/reference/api/fetch-legacy-evaluations.api.mdx deleted file mode 100644 index 8280b19ff4..0000000000 --- a/docs/docs/reference/api/fetch-legacy-evaluations.api.mdx +++ /dev/null @@ -1,77 +0,0 @@ ---- -id: fetch-legacy-evaluations -title: "Fetch List Evaluations" -description: "Fetches a list of evaluations, optionally filtered by an app ID." -sidebar_label: "Fetch List Evaluations" -hide_title: true -hide_table_of_contents: true -api: eJztWEtv4zYQ/isET7uAaqdBTzrV2E27QdJu4GRzcQyDkcYyd2lKS46Cuob+ezGkXoxtOY9Du0VOhqmZj/P4ZkjOlqPILI9n/OxBqFKgzLXl84inYBMjC/rPY/4bYLICywRT0iLLlww68YjlTk4otWFLqRAMpOx+w4RmoijY+cfRnb7TE5PZ+E4zxmh1IVP27nOtN7No5u9jNtEtVK3JMK8hGa6gv6vDnAKWRjewl9LirPNjHrPJPntHPOJ5Acb9O095zJfk3kJBJpLNoifJI14II9aAYChIW67FGnjMvQM84pKi870Es+ERN/C9lAZSHqMpIeI2WcFa8HjLcVOQmkUjdcYjjhIVLUzIyZRX1Zy0bZFrC5YUTk9O6CfMwnWZJGDtslRsWgvziCe5RtBI4qIolEyc7eOvlnS2u0YIYwRZKxHWbq/CUDRQ+p1lOmQwGRs17j/BsYjQv0KCR+SvvFSt8yCMFJp0vEmNpaF2FT12qUG79frsPLV9OEre6wD/dAg9SAMP0spcv9rUaQ3U2NwAvwx12mqTDFi00GRA6M3npePyY7B2RZdKcaJkA3fjEersNHi+Fl6HSAElTIsCyz1s9PqHeXND6y4fqgyNGdr91klXEQdjchP6EO6/BmtFNmjCH7WI9yL5hkYkL47LdYdQdenN76k4gg4za03raZ85d3bxj0G5b/M+fWyp0FV6lhnIBEK6MG4x5GMYrLpz5maR5Hops6HAPqXNNAQ7JNWQ5yUtprP1G2yG1M4aQXYBG5dkQJQ6swvHORs6KdJU+gPsqueuPw7CDAyyoN6C3fotqognBlwWBA4Z+8FLsYlLXlmkT9D54qWczhGeuCPPZSUI+uNoBtYGZsz3xPWD5wrF4xnR24fEWijuyfrWT/5b/eSI2k7/aPPYw5q0HanrUgdOwU6UTevmRS3tAYzIYJHkFodS9UaVf/Xo2QGKOOYo1Fvefri8NRWnBIJONm/J+5GSN3zxWOZmTV84HfE/oXRXg5fcRgaBnntFaZ/nwSWl/6p8/Cg88KLrv8PaR8reW/Fz7jz0mq+C6Lu3PHNTFnbpxhCsP4+pKnL7l9PT3ZnArVAydWLMs+EZA4GQ+imgkGrgeq/yJPj6BL5LjZCBqdv3/lP6Mk/akKxt9sTSO9YoXDCYbxdHKEN++a2jncrowtvU2iE3Pvrw7dusEfl0c3O1A+hzuwZc5TSKygDd1AlXPObjcBZlwTw0g6jSKB7zFWJh4/E4UXmZjkQGGsVIyLEopGszFpLSSNw4lcnV+QVsPoFIwfB4Nu8LXBMpfJpDsW5sVMgLd7evR2CTEle5kX/73NWTsJXXIo+kXuZOvb2MkXFscnVOxQbGev6ejH4enfDH88ZAmPgsEsfnZm/3mcosiELrP71I1o7MHEGsf+0+kGVFbnEtdA+vLjwaFZ4FEQ+s2naV9f8biNZZRvgLx4US0pWjC++2ZmN7P29GxCt3EZvx7fZeWPhiVFXRsp+GEuFSacW9oiJbCmVhIJzvpnU9vmeHbHHP9K6z1xcA7mjuevc90WxGjWbVUHxba02SBArsae30RUJpa/D3sxteVf8A/Prtzg== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetches a list of evaluations, optionally filtered by an app ID. - -Args: - app_id (Optional[str]): An optional app ID to filter the evaluations. - -Returns: - List[Evaluation]: A list of evaluations. - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-list-evaluations-evaluations-get.api.mdx b/docs/docs/reference/api/fetch-list-evaluations-evaluations-get.api.mdx new file mode 100644 index 0000000000..2ee9a8e056 --- /dev/null +++ b/docs/docs/reference/api/fetch-list-evaluations-evaluations-get.api.mdx @@ -0,0 +1,980 @@ +--- +id: fetch-list-evaluations-evaluations-get +title: "Fetch List Evaluations" +description: "Fetches a list of evaluations, optionally filtered by an app ID." +sidebar_label: "Fetch List Evaluations" +hide_title: true +hide_table_of_contents: true +api: eJztV0tv2zgQ/ivEnFpAa2eDPem02jRtg3a3gZvm4hgGI41lthSlkqNgvYb++2JISZZiO48GvSz2ZIuc+TiPb4bDLZDMHcRzOL+TupakSuNgEUGGLrWq4m+I4S1SukYnpNDKkShXAnfikSi9nNR6I1ZKE1rMxO1GSCNkVYmLN5Mbc2MSm7v4xggheHWpMvHqU6s3d2QXr2ORmB6q1RRUtpCC1jg81WPOkGprOtiPytF858ciFskheycQQVmh9V8XGcSwYveWLLocyI3+50gQQSWtLJDQcsi2YGSBEENwByJQHKvvNdoNRGDxe60sZhCTrTECl66xkBBvgTYVqzmyyuQQASnSvJCwyxk0zYK1XVUah44VTk9O+Geck891mqJzq1qLWSsMEaSlITTE4rKqtEq9/dOvjnW2+0ZIayVbqwgLf1ZlOTakwskqe8hgNjbq3H+CYxGjf8WUHpG/DFKtzp20ShrWCSZ1lo61m+i+Sx3addAXF5kbwnHyXgb4l0cYQFq8U06V5sWmzlqgzuYO+MdQZ702y6Ajh10GpNl8Wnku3wfrV0ytNTAlO7irgNBmp8MLtfAyRA4oYzqSVB9gY9A/zpsrXvf50PXYmIdOv/bSTQRobWkP+lDeMh9HRT2HAp2TOcIA6twj7B/W7JJzEMrvLYYZc7UmX1x5bjGXhNnS+sUxBcbxaRtWaZdpaVYqf7ovvn35FI5qNBpAfkPmVGrRGyMZoa6y7mMYhE7lLBjB4ZBZpkJjvxxYHBrj2K7mEJLooSBE4X9uPKa2x4U+dAOspGfXjnFHmshOVMxaIjI979DKHJdp6ejp0TlK973YREAlSf0T8TsPtCQ06ebnHDKomgMUXZW24B3gavqFlK/CDvYsqIrEJ2dQcc8F+hJUPdAj3PGV3081o34wvIzv36VHLsLh9dX39oOd7TnthYegZhR9PwIJP6r6UVAMRtrR/3fIIeAg/HZ6uj9YXUutMi8qQs0+Y6oa96QMSSr9QMPWZTrafcLlqQxhjrYtjsO1+rFM+wAVLn+oLf7ZNqoe7LioD4YIffQRArFf4ehor0524e064jE33oTwHTqsE3l/dXW5BxhyWyCtS57uu9Gd1hDDdDDUMxvR3nXTfG01xLAmqlw8naa6rLOJzNGQnEg1lZWC+8+ixO+KMxb114bDtLaKNh4vubz4gJv3KDO0EM8XQ4HPzJjAgbHYbjCv1Ad/47aPjKSmdWnVPyGx7VtjHbTYXWVWpVfv+7W37Q+ZfkPjKxetC2afTH6dnBxzplUQyeVFS3yZeuJ3dngxrs5RuPpA8cxQeNYDoSx+322wlVXpqJBmgHe4Xu9bt92V4H/vMdpmnPBvmlZaKl+3Przblrb9dd49z9f+PpzDdnsrHX6xuml4Obw9mXyZcvJWczWupHb4QDhfzdrCfS2O2cKj3+CZ245Q4CnvW/4tU27OHWnd0X3baiVpihUNtPYaKKP0xfru/Aqa5l9FErTE +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetches a list of evaluations, optionally filtered by an app ID. + +Args: +app_id (Optional[str]): An optional app ID to filter the evaluations. + +Returns: +List[Evaluation]: A list of evaluations. + + + +
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + + + + + +
    + + testset_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testset_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + aggregated_results + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + evaluator_config + object + + required + + +
    +
    + anyOf + + + + + + + +
    + + settings_values + object + +
    +
    + anyOf +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    + + + result + object + + required + + +
    + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + average_cost + object + +
    +
    + anyOf + + + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + total_cost + object + +
    +
    + anyOf + + + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + average_latency + object + +
    +
    + anyOf + + + + +
    + + value + object + +
    +
    + anyOf +
    +
    +
    + +
    + + error + object + +
    +
    + anyOf + + + + +
    + + stacktrace + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-list-human-evaluations-human-evaluations-get.api.mdx b/docs/docs/reference/api/fetch-list-human-evaluations-human-evaluations-get.api.mdx index c79ae06c90..3167a00bdb 100644 --- a/docs/docs/reference/api/fetch-list-human-evaluations-human-evaluations-get.api.mdx +++ b/docs/docs/reference/api/fetch-list-human-evaluations-human-evaluations-get.api.mdx @@ -5,73 +5,450 @@ description: "Fetches a list of evaluations, optionally filtered by an app ID." sidebar_label: "Fetch List Human Evaluations" hide_title: true hide_table_of_contents: true -api: eJzdVkuP2zYQ/ivEnBJAsTeLnnSK0WwTI2my8Dq5eAWDlsYWE4lSyNGirqH/Xgypp1+bNreeDFPfN5zHNzM8AMmdhXAF76tc6ld3TzKrJKlCW4gCSNDGRpX8H0L4AylO0QopMmVJFFuBPTwQhcPJLNuLrcoIDSZisxdSC1mWYv528qgf9czsbPiohRB8ulaJePG54a0smehlKGa6M9UwBRWNSUEpDm91NhdIldGt2Y/K0spF0wcThWJ2zukJBFCUaNy/eQIhbDnGNUPXKdtYD9BnTnZIEEApjcyR0HAmD6BljhCCjw8CUJy8HxWaPQRg8EelDCYQkqkwABunmEsID0D7kmmWjNI7CIAUZXww4xwkUNcRs21ZaIuWCbc3N/wzLtJDFcdo7bbKxKIBQwBxoQk1MVyWZaZi5//0m2XO4dQJaYxkbxVh7u4qDeeJlL9ZJdccZmeDNvyfCCxg698wpmfw9x7VcPoyrD3hMrEXglgypA7gSRolNd/oA2rjHJuog+OEtCa/er6YJ3Zojkv/awY/OQu9Sbs2+KQsh/mLvlqxaCy1XreW/5vZRcdmDFqy+FwFlx7VVLDl+H55nsWpYZ4lSdUZV3vGg0fUAcQGJWGylnQN/7tHiRkxpyqTn+B88SjH6ZNUbFiioz5fgZsC3TgYiP1UxWNlHgvrkiqGpRzV4ijJXe5GiRlFHPURHg1RV7Ku9n60CLcT3MwVDi4GG+TMyTvkbHG+fru9PR1eX2WmEt+od8YU5t9MrvGESpCkyka6HgOyIh59lXr/eevG97H+uxOlCXdooI4uN8XHIu6SldvdNQH9idbKHfYddmWAcTKa2fWM1jguf3WDi4aDoE2vz+7lMN769J27rFPHcnl/YtDXNkdKC96m7XqkFEKYuvX5arA+WY9ontq9WZkMQkiJShtOp3FWVMlE7lCTnEg1laUCXoEW48oo2jvK7H7+AffvUSZoIFxFQ8ADS8MXewzrt1ypPiCH3WzsWUVpYdTfvoLN4k49i+NSels4ervAnHNidj/nzkRjvYpvJq8nN3D8ehqBWdUydqpu73afuRdHWeji51mRO0kDoczf9B/Ys7KwlEs9sHetMY99O/Rd9j995DUFJ/yLpmUmletPl+lDI88VnMozCiAtLPHHw2EjLX4xWV3zsX/NsQITZeUm497byszilcy+WDRt+lJc8ug77ocPR3aFQU73bvJvWHcrnj9pq/lDw5rFMZY0YJ2MS7bStea7uyXU9T8xjSRr +api: eJzdVkuP2zYQ/ivEnBJAsbeLnnSqmmwTI2mz8Dq5eA2DlsYWE4lSyNGirqH/Hgypp1+bNreeDFPfN5zHNzM8AMmdhXAJ76pc6ld3TzKrJKlCW1gFkKCNjSr5P4TwB1KcohVSZMqSKLYCe3ggCoeTWbYXW5URGkzEZi+kFrIsxezN5FE/6sjsbPiohRB8ulaJePGx4S0tmdXLUES6M9UwBRWNSUEpDm91NudIldGt2Q/K0tJF0wezCkV0zukJBFCUaNy/WQIhbDnGNUPXKdtYD9BnTnZIEEApjcyR0HAmD6BljhCCjw8CUJy8bxWaPQRg8FulDCYQkqkwABunmEsID0D7kmmWjNI7CIAUZXwQcQ4SqOsVs21ZaIuWCbc3N/wzLtJDFcdo7bbKxLwBQwBxoQk1MVyWZaZi5//0i2XO4dQJaYxkbxVh7u4qDeeJlL9ZJdccZmeDNvwfCCxg618wpmfw9x7VcPoyrD3hMrEXglgwpA7gSRolNd/oA2rjHJuog+OEtCY/e76YJXZojkv/cwb/chZ6k3Zt8ElZDvMnfbVi3lhqvW4t/zez847NGLRk8bkKLjyqqWDL8f3yPItTwzxLkqozrvaMB4+oA4gNSsJkLeka/rVHiYiYU5XJD3A+eZTj9EkqNizRUZ8vwU2BbhwMxH6q4rEyj4V1SRXDUo5qcZTkLnejxIwiXvURHg1RV7Ku9n60CLcT3MwVDi4GG+TMyVvkbHG+fr29PR1en2WmEt+od8YU5t9MrvGESpCkyka6HgOyIh59lXr/cevG97H+uxOlCXdooF5dbooPRdwlK7e7awL6E62VO+w77MoA42Q0s+sZrXFc/uoGtxoOgja9PruXw3jj03fusk4di8X9iUFf2xwpLXibtuuRUghh6tbnq8H6ZD2ieWr3ZmUyCCElKm04ncZZUSUTuUNNciLVVJYKjl8kkfsqXjMUeD9ajCujaO/sRfez97h/hzJBA+FyNQQ8sG68EsawfgWW6j1yTpp1HlWUFkb948vbbPXUszhopbeFo7fbzfv2u4y/ouZO5Di92zeTXyY3l4JpCCK6nzXyl7GTf+uHg3HTjtLVJYqHSu60D4Qy/63/wF6WhaVc6oG9ax187OOhb8f/6WuwKT7h3zQtM6lcI7tMHxodL+FUx6sA0sISfzwcNtLiJ5PVNR/7Zx+rMVFWbjJu0q3MLF7J7It5088vxSWPvuJ++MJkVxjkesCtiA1rcMmDKm31f2hYURxjSQPWyVxlK10Pv71bQF1/B8jEMvo= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Fetches a list of evaluations, optionally filtered by an app ID. Args: - app_id (Optional[str]): An optional app ID to filter the evaluations. +app_id (Optional[str]): An optional app ID to filter the evaluations. Returns: - List[HumanEvaluation]: A list of evaluations. +List[HumanEvaluation]: A list of evaluations. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-new-analytics.api.mdx b/docs/docs/reference/api/fetch-new-analytics.api.mdx deleted file mode 100644 index 893bc9e5f8..0000000000 --- a/docs/docs/reference/api/fetch-new-analytics.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-new-analytics -title: "Fetch Analytics" -description: "Fetch Analytics" -sidebar_label: "Fetch Analytics" -hide_title: true -hide_table_of_contents: true -api: eJzFWUtz2zYQ/isanJoMY7mZnnSqkjgTN07sxmp60Gg8K3AtIQFBBgBtKRr+984CJAWKEkU/Mr3YErWPD/vGcsMsLAwbTdlEAxdqwWYRSzPUYEWqzmM2Yrdo+fJG4f0NKJBrK7hhEctAQ4IWNTFvmIIEiTblOf0qFBuxHznqNYuYxh+50Biz0S1IgxEzfIkJsNGGgVpf3joBdp2RAGM1gYgYqjwhWFYDRxYxk4EibFZYSYTvnaYiqjlVLiUr2hREUqPTCdhnhQcLVBaYs5myKDFBq9dNoE5pN1JPEkBNZYzmOaAGeoWyuEDdCeXS6w2hKLz/X6B89npDKMSm70A+BUwf1eeVnlC5BotPUazyZH5E7xdS0YhYIS3qB2itQ8ozhrJMhvwhuVmJunZ8BeHUaLJUGTT0++vTU/oXo+FaZFQuiDjnHI25zeXgS0nMIsZTZVFZZ5Ysk4K76jL8ZohnE+jMNNUeK7wGnuaeacd1W4O9dRQRi/EWcmnZ6LSI2Dzn39E6CcJiYtqCrUjQWEiyQHid2mWVGLEYLL4i0kDhpOYsom04dkHcxlLEqDhQ+WyEB8SxIHOAvGqAfGwa7UbZPE0lgnKP9utiXGieS9C/vc+l/Muk6tVlbrPcvqBzeCnp/BtyX8ZKo/bhAq1h3V37mrxkpbbGQ8yfSnsWLa4wsqeBvwOnteW8cYETQPDwt3RvysgKAm46K6Iym1wylI83RbQTcz6sLHmw4dxdKmpav6QzFtvQ/sWdbZ87mkx2J5C3EO+FitP7I1YqW1LnOfakcZ9uE1Wt9zmFV101YgpXfUXnuYiPQF45mVIkYr/QPr3uwnHTuXWMumdsGI4q9s+o/pdfZp02cOJ3quYTu3Pkm/ITu+3BWP23jsX92eR67JFQ9bN0qhvVgYGKt0WybV73a0pdRKUESPknKtVh/l2kC8FBXlYaCtdofYFvdr+D1UagjPf1wO0YQQRFxL7jumdPapn5I1IHYHcg8/2ueoa+Vp10t3Qf7nlW5/iQVvPVwS+ihkOPZ4pwE5e5IT/OwrklyUALk6rAe4el4A/yvvu7oHiQ1n1C95H+zu19owd8zhPUgvcSbixoa+6FXbqHcfWRhjYQig6QgOVLpE9SfMdQ0bWT1kuPUD6eb0QD6oUwthf/EgjAElrGfCd4Pwm4EsZ1b0JRfgnknNETVBz3CWvXs4ooGAbI3S5E6hQ8lHkcDN4YVEZYcbc/LcL4PgTiLRgcXNdiAihunC8ihivg9sY58NFazkjG4JOT0VLRUT8nuLKXpS1IftMEIPe3gD6IxlI+CIkPsi2Sw04taY4MlL5wNhK6LLyuCteDcdUhXlBvPDRVvt0W7eZg2TVG1b3nYeNXueX52w2sRVReCjtuSk5O2LpUqrCjdylfeYZUPYTKU7cOqh7GwnCNvmIJBe4GysHiItXUyYZGqIXEnYdJLq3I3ONam7s5RhWWl+1ZfkLwaAYHu+xqcFdgGzHNXhLXXOxm7wPGkzfCBRm7S4R67GjylXidDFg9XgasSAbGi8cXmDNi7goob27aEXTcm67L1UPP4B5Xe8Z6hVAURP/H69ftjcNXkCJ2+4TBmdauHj9y3RCjBSE7kkGm/MBYdXyS6cj/i9QDdBsCs+gK109oDCxwa+rDpM4YA58HR6oZncurLumac09pXm/dw8d4583X5dgPk8lVS6D3bdOp72nnPBgH++YE7TKldXSWumWkT2w2zDTeCbwfWl/YhvWOelituAzqu2pNnWvJRmxpbWZGwyGXaR6f+IvuCYghZMIFv0Gea2HXjmV8df4R1x8Q3O1oOgsJrimSfGw0yWq3QCZo/o2qJdw4t8tUi5/e4eUybum5Cnc5uk3D5dvYgRuMr85ZxOgY3j6nJ7+fnLJdqzWI3fjGXRJUuqsbfdMK9fmpiicuA5hFSP7c/kDIyO4JqEBe20kNOLUNLK7sMJPgS5pTvin9N2Wl/yhIyhcQEQvfM3gvziK2JL+PpmyzmYPBf7QsCnpcrl6mGxYLA3MZrDLdnaV+JVHeP5jLzoO05QuCPsT1ir4Pcb1E70McrLn7kJeL6V4HrPbJfYirhfGWdkZftCDicvO1rPJiUzKNOccsPGirApOUOpuvLq8nrCj+Aw+a/zc= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Analytics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-organization-details.api.mdx b/docs/docs/reference/api/fetch-organization-details.api.mdx index bffb0405b3..50b808edcf 100644 --- a/docs/docs/reference/api/fetch-organization-details.api.mdx +++ b/docs/docs/reference/api/fetch-organization-details.api.mdx @@ -5,67 +5,316 @@ description: "Return the details of the organization." sidebar_label: "Fetch Organization Details" hide_title: true hide_table_of_contents: true -api: eJydVU1v2zAM/SsGTxsgJF2xk08L0G4tuq1Bm22HIChYm4nV2pYr0e0yw/99oPxRO22yj1Ni6ZF8JJ/IChg3DsIlXNoN5voXsjY5rBTE5CKrC/8ZwhVxafOAEwpiYtSpC8zaf5qB3QQUmIKs/ziPIYQ1cZTcDDE3rT0oKNBiRkxWCFSQY0YQwgisY1CghUGBnIACSw+lthRDyLYkBS5KKEMIK+BtIeaOrc43oIA1p3IwTCw4j6GuV+LGFSZ35MTy+OhIfsYZX5dRRM6tyzS4asGgIDI5U84Cx6JIdeTdTu+c2FQDNoWVQrBuIuj4EEMhpdr096O+yn2twDzlZA8m7AH1Tgv3408GsFq1sAow316ufWPGhrXqT/IyTUHK2blayHmt4MnYe1dg1GbPlLmXDPpYgNbidsDox7O5T2ONZco3vdMxO4xjLdwxnQ9q3qij9W9u7yjig8xPmiBBHxrqetd+qL4leGn6pnU9GVd89boET1r517UEeH98/FJ63zHVcaPXU2uN/X/dNW9t1IMxIDXR6PYvmq5zpo0IbLW/gZ9NQ1Dal7nNIfV9IedwQ0Pl7YP6YgSNxv7QHMmrCd3iBt14Lm9T3f1pNL16NVgHOVss5i8cNr3NiBMjQ3BD7KcdJxDCdDjf3LTaGXc1KHBkH7uhWNoUQkiYCxdOp1FqyniCG8oZJ6inWGivYkdRaTVvvclsfn5B2zPCWObEcjUEXItQmtaPYX3VsdAXtO2kHcKs5MTYbjG0wzhprCRLna+NN28LMvPkgtn8HBRIGo2mjybvJkewu1ZGYNE4Rl7jXWx/DWqnCn3+oIAyL3BgwuzD84UwK4zjDPOBv4+yjYLRQjjpt9HOtOxf3D/svraETD95WqSovf4996pt/3K03iRsuLvvVgoS41iwVXWLjr7ZtK7l+KEkKy1eKXhEq/FWCr6sINZO/scQrjF1dCCVN1ftG3kb7KPbySAXDTxiWsoXKLin7SvL2Q+BpJNa1aJmUUQFD+xfzCzRZP8+Pp0uoK5/Awqq8AE= +api: eJydVU1v5DYM/SsGTy0gzKRBTz512ux2g22bIJttD4NBwNgcWxtb8kp0tlPD/72gLDv2ZGf6cbIlPYqP5CPVAWPhId3CjSvQ6L+QtTWwU5CTz5xuwjKFO+LWmYRLSnJi1JVP7D4s7cxuBQpsQy4srnNIYU+clQ9zzEO0BwUNOqyJyQmBDgzWBClYVzzoHBRocdwgl6DA0edWO8ohZdeSAp+VVCOkHfChESvPTpsCFLDmSjZuXJFc59D3O7H2jTWevBhcXlzIZxnfhzbLyPt9WyV3EQwKMmuYDAscm6bSWYhg/cmLTTcj0TgJm/XgQefniAkpFYM9jfpNznsF9oshdzbOAOiPCnYafzWD9SrCOkBzuNmHMiwNezXtmLaqQNI5XnUv+72CL9Y9+QazGD1T7V8zmHwBOoeHGaM/XsxDGHtsK36YLl2ywzzXwh2r21nOB1HE++3jJ8r4LPOrwUkyuYa+P7afi24LQZGhaGNNlhnfLZQ3qf0qir3vxcH3l5evpfc7VjoP4OSNc9b9f90NnbWowRJQ2Wxx+i+Krg1TIQLbnS7gL3YgKOWrfXFOfb+S91jQXHmnoCEZyaCxfyiOxDW4jrhZNV7SO2T3dBhDrb7qbIS8u7+/fXXhUNuauLQy8griMNu4hBTW89Hn190w3HpQ4Mk9j5OvdRWkUDI3Pl2vs8q2+QoLMowr1GtsNBzP4004TX4SaFC2p6x1mg/hvs3t9Xs6vCPMZXZsd3PABxHPIIclbKoENvo9HUa5p7BpubRufBriXC4HK4lcm70N5jFJkduPmD2RkbaROAfaF6vvVhengokGyeb2OvYAZqEHRh4BBuooXVOiQAHVoQGACesfXg6EZWM912hm972VtymZd2tyNb1NR9N06sj/8BLGdDL9yeumQh36I3Dvojy2sJAHKEjj67dTUFrPAum6R/T00VV9L9ufW3JS5Z2CZ3QaHyXn2w5y7eU/h3SPlaczEXxzF1vn2+QUy1EJRmTwjFUrK1DwRIeXFzqMhHIUWRcPN1lGDc/MXk0wUePULT+/uYe+/xtOFuuP sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Return the details of the organization. - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + default_workspace + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-plans.api.mdx b/docs/docs/reference/api/fetch-plans.api.mdx index 4dabad9271..733b02a8d9 100644 --- a/docs/docs/reference/api/fetch-plans.api.mdx +++ b/docs/docs/reference/api/fetch-plans.api.mdx @@ -5,59 +5,69 @@ description: "Fetch Plan User Route" sidebar_label: "Fetch Plan User Route" hide_title: true hide_table_of_contents: true -api: eJx1Usuu2jAQ/RV01hahXWZVKvWB7gbd27tCUTWYgbh1bNeeoNIo/15NePSC1GyiZM4Zn4cHCB0K6g0+Ou9dOKAxiIkziYthtUONPYttvydPocAgc0kxFC6oB7xfLPS142KzS8pAjZfeWi5l3/vZ8wUMAxuDcBCFU0re2emA6kdRzoBiW+4I9TDqYx5WflYJs7WnMHstnGfPsRdd2rG0UTUeWGCQSFrUqLZnK9VVc+F85KwuB/TZo0YrkkpdVdbHfjenAwehObmKksPYKMP22clpoizXqyc+fWXacUa9ad4CXlT3OYx72AA5JUYNSu6JTzAI1On3spc2Zvdn8g8DpwbbM0udu7CPE92Jn/CTuNlyvYKB2jhHspi/my/wGNQdWCMnO0V+PXsawzykcPMPA+7I6UyYug//BqosxSIdhTf7/tfLnahbEsK/RTtxAeNFwnDpbINLZ9ri1Fpj0MYiOhqGLRV+zX4c9fevnrMW0xgcKTvaakybZjTXFLWzn3xSv9Zy0ptxJN+fy3i4etrl7RZ9+fQN4/gXyGwKcQ== +api: eJx1ksFu2zAQRH9FmDNhuT3qVKdoUyMXI2lOhlCs6bXFhiJZkjKqCvr3YmXZSQxEF0Ha2eXsPA7IdEyotrgz1hp3RK3gA0fKxrv1HhUOnHXzK1hyCQqRU/AucUI14PNyKa89Jx1NkA5UeOq05pQOnS0eZzEUtHeZXRY5hWCNng4ofyfpGZB0wy2hGkZ51M3I72Kh2FhyxXPiWDz6LsvQlnPjxeORMxQC5QYVyt15lfLiOXE8cZQtB3TRokKTc0hVWWrru/2CjuwyLciUFAxuD19N1eKrSDHWMk530eR+mrfarB+4/8G054hqW78VPMlS56TeywbkPjAqUDAP3EPBUSvfqy43Ppp/UzhQMGKgOXdJLMYd/NRusuVXb3ekX9jtoSB7nm0vF58Wy4+WmRuK1WY9syE9sbn4mGRQN3Fdg4ICt2SklpnaL68FcRl8yi25N/M+AvjO3DWVzH+zwDMO42xhmOFuMcMV3BPeWqHxKUtpGHaU+DnacZTffzqOAqlWOFE0tJPItvWoLokKvxfuZV+tOcgVOpHtzmBu7qhwvV63+28/MY7/AQbWGQA= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Fetch Plan User Route - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-query-revision.api.mdx b/docs/docs/reference/api/fetch-query-revision.api.mdx deleted file mode 100644 index 4792f38a8a..0000000000 --- a/docs/docs/reference/api/fetch-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-query-revision -title: "Fetch Query Revision" -description: "Fetch Query Revision" -sidebar_label: "Fetch Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJy9WVFz2zYM/is+PLV3bJz19uSnZU26Zm2TLEmzB5/PR0uwzZaiFJJK4vn033cgKUWyZMXx3L0ksgx8AD6QBAivwfKFgdEY/spRCzQwYZBmqLkVqTqPYQRztNFyep+jXk01PggjUgUMMq55ghY1aa9B8QRhBE2xqYiBgVAwgozbJTDQeJ8LjTGMrM6RgYmWmHAYrcGuMgIwVgu1AAbzVCfcwgjy3KFYYSUJkJ+rwXWwMDiPoSgmBGyyVBk0hPX++Jj+xWgiLTKKBEZwk0cRGjPP5eA6CAODKFUWlSVxnmVSRC7w4XdDOuuaf5kmWqzwFqI090rBbaEsLlDX/PzgJBjEOOe5tDA6LtgGPc6oWl3OHYNNA17ygWvBlSUeG7L9ZBWsklC5lED8NOm787iOPQaHt9LE97EcOgaPzbUVcx4d0vmTAFlayO0y1QcD92gFg5hb3BGVRN9ZkWAv9CkBFgwSNIYverH7YL4G9YLBXLrDoY7D41jQDuHyqrFeW5ZmaSqRq7qp0vikYOWrdPYdI9vrz0fnhIvL8j2daYddbtiG5WTWfFOPodsWREJHueT6zcdcyj9Nqt5d5jbL7VvoilFYTHbU4lrzVT8xTV14FatfiUzS2D/D/wOpF+kXYeyLtG4LsqX+Oo5uw8LztW2/3XTB3a5t1qL9oE5rEAWDSCO3GE+5Pegp8sHDDk4cWXkW/wwj3zxsMBKjxJ9g5NTDBiMlXbNDVqKSrN/LclTydVArJVuVlZKwg1op6aqsPKBudym7L9e7oF4wMDJf7AtzQ7oFg8MFGjjkm9Wk2YA9ChWnj4TdI6TwEc1hV+2FhywYpDI+NPilh6QzDZ92hX6R0AvCKhhIkYhu0M7CsIHyxWlT3DrGF/otVHlClxZuIlSxf0cnbPgw6eXAwdOKUhb1A5d7e3xeAhQM9LZurl0AWzjXrnFrlaZngb+rtdiGoTZNSIv6haXqL3W+ka3uJMBV/FxR2/S6b1O61qiUHFL+jUo11DOXLkTE5WVpoXDXKl/Zne3Q9mx3bi5Qxl23wKrXcQIFgx+42vck+Ywrf9uR+a7l/NUNTRlp0dHHdTc7/h68e1Ny59wvWCOhL+8UYegmbqaUx3oBS5OMa2FSVcvedhS8p+y7vwtaD9K6J3SP9HdmH1Ud/yJPUItoJ3BjubbmUbhBAaq4fKQrOheKAki4jZZIT1L8wLqhG4e2kx2h/Hqeioar1CrupL/k5MCSt8g8FdFuCPgkjDXBi/ChhnNGb1BF2AXWPs9KodqsgdLtlki1BbftvIgbnBpURljx0L0tOm5y7UaIGxzcVDA1V+ZcGiwY4BPd0l0C97ZyRhiDrw6jZaLn/LzFJ3sZuCD8JgVcdpeAXTw6kfJVnvhF9uzJ9qQGmQ6s5xnaOBycjQ0dDl53ClfXzLJCvIXJ5tHUoWvqMY0nfQFVyF2lqUfPzXDKKd4pd5fRvfX/i241CywK0vn1/fv26PCOSxG7weDgTGu31facG8ZouZCNmtgUkGm0pWK+XKR6Uvsl9Q66OYpZ9JXa2vzHi2wXdWQMbunblxYqxeVNB7lmSQv0ena3h3Hq6etL7qfb26sWoM9tM6kfaa49aI6TwU2ZlinNvRdo3ZjbLmEEw4yGtvg4vPdj8mE5wzXDdWvmXQADg/qhnI3nWsIIltZmZjQcRjLN4yO+QGX5ERdDngm39Q1GuRZ25VROrs4/4+oTctcKjyd1gRtaW361NMWqRPFMULNTTi7C0FH845dAmMgvvVbhOuF56tTLU805Nzi5OofaNRCOj345OoZNHhvCrlZHbluUtt3XwDZYqOKnspi4PQEWefLb8xfkWZYam3BVw9uSto35SiDC4pMdZpILt/CdB+uQ0jGElIIfUAvXVlRpBQaj9o8ZEwbLlO5kY1ivZ9zgNy2Lgl47WcpUGKfPiMjxGmJh6DkOtaHlaHWOwJvrsF3eDp5b8mYAZXoV5Tb0sQChKe747cWdCMtyEa2D3EkUYWZrCK0DjFZbtQ/+OLuFovgXo/nr+Q== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-query.api.mdx b/docs/docs/reference/api/fetch-query.api.mdx deleted file mode 100644 index 45c653c4a4..0000000000 --- a/docs/docs/reference/api/fetch-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-query -title: "Fetch Query" -description: "Fetch Query" -sidebar_label: "Fetch Query" -hide_title: true -hide_table_of_contents: true -api: eJy9V1Fz2zYM/is+PLV3bOzm9qSneU2zZu3WtHH34vPlYAm22FGiQoLZXJ3++46kZEt2kia+tE+2RQDfhw8QAdfAuLaQzOGTIyPJwkKArsggS11eZJDAijjNr28cmQ0IqNBgQUzGO9VQYkGQQDi9lhkIkCUkUCHnIMDQjZOGMkjYOBJg05wKhKQG3lTez7KR5RoErLQpkCEB50IUlqy8gWe1GV1k0DQLH89WurRkfYjTycR/ZGRTIytPFxK4cmlK1q6cGn1ujUFAqkumkr05VpWSachu/NV6n7pHqzI+d5YRIdUuOrVsZcm0JtOj9yZYCMhohU4xJJNGRDECVrn5uAoyDeOuVNC8b4BZJj0nVJcD051Fy2GptSIsoRH7IjaLRnSP9PIrpdw3Kp1S4DXsqJ8HEo2AghiPJNMhiwOJBsjFcvikn8PdWJBKkzqF5sW5U+oPq8tXHx1Xjl/CXTlKpuKRXmgMbh4WZugLT1L1Ty+m9zi+wj9B1L/0B2n5u7Lel+SB+9M0mrWNF++ORylwSMH7NmL49h8X6qwXohGQGkKm7Br5oYC9GytDplcsA5/7Ud7EsKNpEMtV2Y8A+RLDtiAZKfoBIGcxbAvSybUM1//jcMId/xixfotX/06vZ0Xp1NqidII9K0on1xbFKrc+tlevvG8j4PnohdG6//buzd87AnzXZzt9m8bb/nJ6ejis/0YlszCKR2+N0eb4SZ0Ro1T+WzsK9g2UTgenT7l1e3M1To9dqh90JBjmqF3ftdnsJoO1uKbdVXm/aRBjNPOnd+m826rmIa8I3dr1SruTN6p7fxpnUb6HivpuNrs8CBhrOyzquV8XR5/adbEgzrXfItfEYXvkHBIYV4ZuJf07volL57juFsgGBFgyt91+6YyCBHLmyibjcaq0y05wTSXjCcoxVjI0s6XUGcmb4DK9vHhPm3eEGRlI5ou+wZXvn9gRQ7NtMbCS78kzbzfbqeNcG/ktlrldb/Po5ZOX5UoH91anaSA3ml5egACfRlRlcvL6ZAL7Wg2MfetjGlq/ww7HIPZU2OYPAqgIfQ9MWPy6O/DMKm25wLIXb1iavdHZ5s/0H48rhTL0dACu27LNoS0bxB3Xv1oCku3uvxCQa8vesK6XaOmLUU3jH7cb8Xwh4BaNxKWXal5DJq3/nkGyQmXpgNP2NoAXn9umfznarSpDrl0BS5/cLSrnf4GAf2jT/4cSXue86466PZ6mKVXcczy4fXwbbbv597czaJr/AeUwgiU= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-queue-preview-evaluations-queues-queue-id-get.api.mdx b/docs/docs/reference/api/fetch-queue-preview-evaluations-queues-queue-id-get.api.mdx deleted file mode 100644 index 3ba06422c8..0000000000 --- a/docs/docs/reference/api/fetch-queue-preview-evaluations-queues-queue-id-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-queue-preview-evaluations-queues-queue-id-get -title: "Fetch Queue" -description: "Fetch Queue" -sidebar_label: "Fetch Queue" -hide_title: true -hide_table_of_contents: true -api: eJzNV0tzGzcM/isanJKZjeV6etpT1dhuVKeNa9m5eDQaaheSmHC5axJ0q2j2v3dA7lMPW06dmZ60IgF84AeQADZAYmkhvoeLR6GcIJlrC9MI8gKN/zdOIYYFUrKaPTh0OCsMPkr8e4atQtixs0pCprPZEgkiKIQRGRIahtiAFhlCDLUURCA1xFAIWkEEBh+cNJhCTMZhBDZZYSYg3gCtC9azZKReQgSL3GSCIAbnvBWSpFjgLzY8GKdQllO2Z4tcW7Rs4uz0lH9StImRBXsNMUxckqC1C6cGN5UwRJDkmlATi4uiUDLxhxx+sayz6bhVGGaJZEBIcheUKm+lJlyi6bj33ktEkOJCOEUQn5ZRIMNj6fWnhaepb3ehfIQOC0g7s/jgUJMUquPAPM8VCt1xYGwHk1ay48hCKItlGdWq+fwLJtTRbLPDc3zpfSqjBks7paCclhFkSKLvrUhTyZpCXff8biX68e2YrTnsIWXz/kp9Tl7ajwWJNIlTwry5dEr9bnP97pOjwtFb2D4yG5GE2ZFawhix3kNEy9yWLuyQ/JTyH0wma+ykwP+J1D/zj9LSs7QeOuSO+ss4ug2pWD0uRzGw6wLrllH/efg+U+cdE2UEiUFBmM4EPWWw86SlgvAdSe/PYZT3wexg5MlyRfojQO6C2QokRYU/AOQ8mK1Aarrma64Px+H4InAMWb+ufW1o+XpVlJqtBqUm7FVRaroalNczHew9orH/If0/V+plBJYEuScfpQhQu4y7jwJ1GlZ8PeSibpzWYcmGMs2HEVI5w0UajckNLyVCJ6gUpjDdV64mwYl9LjfVr0HnoInt8tUvts6imcl061hVxeh8PBeG7QJyfEG5s2gG49S/eTZBLYzMn/DopY4cBp5UYA04YTH7iuvjkF+ERFgMrtjyC3qSc+Fr5Z6WxDhd3cBjG8kbp0MbuYvedqn3teG9ied92ufP8SdqetKyZK2fz852W9jPQsnUqwwu+Ep8f/+aIgmpekncF1B50tt9Sasx3Q5/e+iPeXCQMySzy31hatsha8US21w6LOrJGNzy7nNR5HMF6Equ+5w19AZ2Dx/jPND3VHg/3N5e7xgMse0H9ZLHrUHIIN9Rr3KewuqZilYQw7Caw4adOWwY5rDhpp6wSn490TzWA5gzCmJYERU2Hg4Tlbv0RCxRkzgRcigK6a+hxcQZSWuvMroeX+H6A4oUDcT3067AhFMpJEdfrImLKOQVMk3V6DdytMqN/BYiXs1/q6DFPEi9yL16RdnIOzcYXY+hU5rg9OSnk1PYpq0nzLdAJP4W1Nh+G6ItFprzc1XJ/BUAQpH90m6wZ0VuKRO6Y68fpa3WsTo/4T80LJSQPr098KaK4D1UEWTczvBdlUD+iJtJeRrBKrfEWpvNXFi8M6osefnBoeFITSN4FEaKOfN2v4FUWv5Oq+Fux8HmlYA3N9VleDto+/a+43U0NYeSfeV/EMFXXHfneX/NV3WqbKrtUZJgQR3FnVeJc6rJ8t8ubqEs/wU/p6yy -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Queue - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-queue-scenarios-preview-evaluations-queues-queue-id-scenarios-get.api.mdx b/docs/docs/reference/api/fetch-queue-scenarios-preview-evaluations-queues-queue-id-scenarios-get.api.mdx deleted file mode 100644 index 102b34a9f7..0000000000 --- a/docs/docs/reference/api/fetch-queue-scenarios-preview-evaluations-queues-queue-id-scenarios-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-queue-scenarios-preview-evaluations-queues-queue-id-scenarios-get -title: "Fetch Queue Scenarios" -description: "Fetch Queue Scenarios" -sidebar_label: "Fetch Queue Scenarios" -hide_title: true -hide_table_of_contents: true -api: eJydVdtu00AQ/ZVonkCy4lDx5CciKDQqiNIWXqIo2tqTeIvt3e4lYCz/O5pdX9ZNUiSectkzM2fOmZ1twLC9hmQNlwdWWGa4qDRsIhASlfu1yiCBHZo03z5ZtLjVKVZMcaG3UuGB468tjqEeo7cdlmfbAL9HAxFIpliJBhWVbaBiJUICPR4i4BUkIJnJIQKFT5YrzCAxymIEOs2xZJA0YGpJcdooXu0hgp1QJTOQgLUui+GmIMA3SjxbZdC20VDNalRBsSeLqp5U27FCT8qxqv66c4RfLkxFOkRliwLazUjlu0blmWyolpai0qgp+8ViQR8Z6lRxSUpCAnc2TVHrnS1mtx0YIkhFZbAyjpOUBU+d8PGjppgmYCwVeWi4r5AK64M6crwyuEcVCPXeISLIcMdsYSBZtCSAN2/LM5eGGyynX/4lRw9gSrH66PdY/q6rNFtlOmSx3rRjkHh4xNQEUePUOp/7JKtMD5K1LSV4e3FxrPAPVvDMRc8ulRLq/+XN0DBeTISZAgqRTk7PzVMwP71F7ea8ap+FJ0jClnp/ypAe+gW1ZnscLTgPdWLM7un0lPjjNVm7vnzpDhfM+yivV/d8Gx+8fC85fXV/f3OU0Hs7NfUj7aqZv/b9PNBElWhyQcusX0MmhwTibonFwRKL/RKLm34ptbEOEmlUh357WVVAArkxUidxnBbCZnO2x8qwOeMxk9wtAI2pVdzULmR5s7rG+gpZhsqNdwC4o/HyAzOFDV4xya+RpOs22dKaXCj+x09Bt89yH0Xa8GonXHgn49KRmy1vVhABteFFW8zfzBfwXMoJmG4GS93N6Gu7Y4ieqTD0DxFg6a4FGGTlu/GAmEmhTcmqIN855yakBiUM/jaxLBh3w+8oNJ2ra+hcJQbBuxb5Z4a+JMGDM5q7iSAXmrYONM0D0/hdFW1Lf/sngvzLuGYPRfBI/MR68qRQQSLorD8wxQl+OvRZZ8PygVe33R17PYPodMf9QFR1WLOnM7TntkfeT1vTHS/TFKUJAo+WHZEfrsyny3to279Yz83T -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Queue Scenarios - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-result-preview-evaluations-results-result-id-get.api.mdx b/docs/docs/reference/api/fetch-result-preview-evaluations-results-result-id-get.api.mdx deleted file mode 100644 index e21976457e..0000000000 --- a/docs/docs/reference/api/fetch-result-preview-evaluations-results-result-id-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-result-preview-evaluations-results-result-id-get -title: "Fetch Result" -description: "Fetch Result" -sidebar_label: "Fetch Result" -hide_title: true -hide_table_of_contents: true -api: eJzVWEtv20YQ/ivCnBKAsRyjJ56qJnbtOmkMW8nFEIQRORI3XS7p3VnVqsD/XuxySZGSLD/gBO1J0nIe337z4IzWwLgwEN/C6RKlRRaFMjCJoChJ+18XKcQwJ06yqSZjJU9LTUtBf09poxEemWkjI9LpdEEMEZSoMScm7bysQWFOEEMrBhEIBTGUyBlEoOnOCk0pxKwtRWCSjHKEeA28Kp2iYS3UAiKYFzpHhhis9VZYsHQC197y4CKFqpo4g6YslCHjbJwcH7uPlEyiRemQQww3NknImLmVg+sgDBEkhWJS7MSxLKVI/EWH343TWXdwldpRxaL2kBS2VgpwhWJakO7g++AlIkhpjlYyxMdVFOjwztTqy9wz1Tc8lz5OXQFMU+FAobzqiW4kAohZUUhCBVW0TWM1qaLmqJh9p4S7QspKCY7EBvuZB1FFkBPjC8E0nqMdjnqe81n/pHuH/b4gETqxEvWbMyvlH6ZQ775YLi2/hX13FEz5E7VQa1wdJqavC89i9bMj02m8PMI/gdQ/i0/C8KO0PnTJHfXncTQOiZdoQqZ0inyIh053SJHpHYucDpr/UJsdjDwsW6Y/wsnX2mxwkpKkH+DkY202OGnomq1cq32aH99Pn0LWbyvfZTd8vaqXhq3WS0PYq3pp6Gq9vJ7p2t6StBH1O+MJVbtj5FtQryLI0GSvePNzNFm4M2tM6BHTB4vT6Te2yHCC5jFzz0E6DiaDB9K60P/dPvk/e/mcejarCAwj24OsRUDK5m5WLEml9cmdJUtu/NJWqfrI1POUCzEKabWbpnzM3FGCKiEpKYUuhnaQvKlB7APczkutd1etikkvUe6FvTe020XaGHCkiZwMY16+akMet1b9nFcSurH3/sWIr72JwUV6vz1EGqZy+het9k3LjfYNUzm4pJWPeEIKtShCqT51wL4JaqEctVXPNHBtVT2eb+dpd/y/3Vynj7T1uDeB6ul/D4H7vD2k3q4BVeXUfjk52d0avqEUqdcZ1CX04pUhJUbhMzh0hW0BWSS9p8/pap35vm4km1t/KmqAfp43i0NZ85mMwQVtOsvDop6Mwdg9fSzA7l616yDXfe+19LYN6oFrfKzpOxTf8/H4asdgHdt+UM/cmjsIOeS3nKxw62+zyXIGMQzD/jvs7L/DsP8O1+1iW7m8Jb1sFl+rJcSQMZcmHg4TWdj0CBekGI9QDLEUvsoNJVYLXnmV0dXFJa3OCVPSEN9OugI3Lpvq/OiLtaHBUlz66gkr98hyVmjxTx30sHZntVble+m88OqBtZEHNxhdXUBnjIHjo/dHx7DNXE/YFQImvhAa3/4xRFsstPd3r4jcVwEwYf7r5oFDVhaGc1Qde1uB6mFpCWC652EpUfgU957XIYi3EILoHHf++Gg2cfct3vxHMYkgKww7vfV6hoa+allV7vjOknbBmkSwRC1w5qi7XUMqjPueQjxHaWgHYtsr4M11KIm3g81Lvw+9Cahy0XRo3S+IwPf6zl8pvtqzJl3W4fkoSajkjuZOc3J51eb676djqKp/AUN2MQM= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Result - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-results.api.mdx b/docs/docs/reference/api/fetch-results.api.mdx index c0747c0672..7ab6eaeb32 100644 --- a/docs/docs/reference/api/fetch-results.api.mdx +++ b/docs/docs/reference/api/fetch-results.api.mdx @@ -5,73 +5,298 @@ description: "Fetch all the results for one the comparison table" sidebar_label: "Fetch Results" hide_title: true hide_table_of_contents: true -api: eJzNlN9v0zAQx/8V655A8pYy8ZQnKjFYNRBTV3jpqspLrolHYmf2ZaJE+d/ROUnTrGwSbzw1te/n15+7BkhlHuI1XNWlMmeXT6qoFWlrPGwkpOgTpyv+DzF8QkpyoYpCUI7Coa8L8mJnnbAGw1liy0o57a0RpO4LvDN3Zu6yukRDPr4zQgiBhxRbnYqzM7E9yrJljyVS7cxgP7kGCbZCF9wXKcSw45q2fS0goVJOlUjouKkGjCoRYpjkBAma26kU5SDB4WOtHaYQk6tRgk9yLBXEDdC+YmdPTpsMJJCmgg9GkcQihbbdcBBfWePRs9/FbMY/U/Fu6yRB73d1IZa9MUhIrCE0xOaqqgqdhLDRg2efZqylbdtWwvuLi9PAP1Sh066aS+es+4eoUDlWk3RXd4qkdMFfmrD0pwaFTSa3yuy/7YLOU6laeTjRhjBDB+2mlcOZck7tj/T8YrsCoZVQ+uw16b+i9ypDOAR75ZVYDLHi23bMbe8fMKHJs69DX13q3m4zhhnl7dR9uY2PnXx/SzaYXK1WNycBu7ctkXLLRGdIgWPKIYYoD2M58uujZgJzG43se3RPA/i1KyCGnKjycRQlha3Tc5WhIXWudKQqDYytx6R2mvbBZX6zuMb9FaoUHcTrzbHBLSPTQTA1O+ivKn2NLEc/cvOacuv07+5l+5HLOy/uV5udDe69NPNQnJjfLEACt9HRPTt/dz6D55toYsy0qyTQPuQO1yCfqXDoHyRgGVAHQlV+GC+4ssp6KpU5itctvuVB6EkxzThu/8mG7F+E8BdFVaF0GKwgRdNztYYTrkBC/HxNDmhtJOTWE/s1zb3y+N0VbcvHjzU6pmcj4Uk5zR0FllLt+TuFeKcKj69I9mbZD+Jb8VLpA2GG8eIS+R9I+In7k90e9kw+MNz0NvMkwYqOvE/WIsN+GMHPlyto2z9nQXSY +api: eJzNVcFu2zAM/RWBpw1Qm6zYyadlW7cW3bAi63ZJg4K1mVitLbkSXSwz/O8DZSeOm7XAbjvZlkjq8fE9uQHGdYBkAWd1ifbo9BGLGtk4G2CpIaOQelPJNyTwiTjNFRaF4pyUp1AXHNTKeeUsxbXUlRV6E5xVjLcFXdtrO/PruiTLIbm2SilFuyNuTKaOjtTN3ik3kjEnrr3dxo+2QYOryMf08wwSWAmmmx4LaKjQY0lMXppqwGJJkMDoTNBgpJ0KOQcNnh5q4ymDhH1NGkKaU4mQNMCbSpIDe2PXoIENF7IwkKTOM2jbpRQJlbOBguSdTKfyGJP3vU5TCmFVF2reB4OG1FkmyxKOVVWYNJad3AXJaQYsbdu2Gt6enBwW/omFyTo0p947/w9VofLCJpsOd0aMppA3w1SGw4DCpaNdtJtvq8jzmKpW71aMZVqTh3bZ6u0aeo+bPT6/uA4gtBrKsH6J+q8UAq4JdsVemJKQoa5ktx3Odrd3lPJo7IvYV3d0H7ccygz0duw+38bHjr6/HbYNObu6ujwo2M22JM6dKHpNHHXMOSQwyaMtB/2GSTMSczsZtB/IP26FX/sCEsiZq5BMJmnh6uwY12QZj9FMsDLw1N2zuKs+SCiIpgOltTe8ifVml+cXtDkjzMhDsljuB3wXPXUKGYfthoOVuSDhqvfjrObcefO7G3vvx7zLEjKMXbmY3vPWY3uP6T1ZMbD02cGeHr85nj7XTJ+gZpfnvS0wjbbY4ohhoJ/QtSMKNFAZPQFMWL4bNgRl5QKXaPfqdTfkfDeREahm8OV/cpX202H6xZOqQBMdGKloegEu4ECAoCF5ep9uNbjUkLvAktc0txjohy/aVpYfavKipKWGR/RGOoq6ykyQ9wySFRaBXqDs1bx37Gv1HPSt2qxITSDKF2i4p83BTyBeSPlWz00fM0tTqngv++D+FOHvvPr59Ara9g+yg4Mn sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetch all the results for one the comparison table Arguments: - evaluation_id -- _description_ +evaluation*id -- \_description* Returns: - _description_ +_description_ - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-run-preview-evaluations-runs-run-id-get.api.mdx b/docs/docs/reference/api/fetch-run-preview-evaluations-runs-run-id-get.api.mdx deleted file mode 100644 index b6079d2031..0000000000 --- a/docs/docs/reference/api/fetch-run-preview-evaluations-runs-run-id-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-run-preview-evaluations-runs-run-id-get -title: "Fetch Run" -description: "Fetch Run" -sidebar_label: "Fetch Run" -hide_title: true -hide_table_of_contents: true -api: eJzNWEtz2zYQ/iuaPSUzjOVkeuKpqp00auLGIzu5eDQaGFxJSEGAwUOtquF/7yxAUqQetPzITE+2wN1vd79dYBfYgGMLC+kdvF8x6ZkTWlmYJqALNOHXOIMU5uj4cma8mhUGVwL/nuFWnNbtLHwV2Wy2QAcJFMywHB0aAt+AYjlCClEGEhAKUiiYW0ICBn94YTCD1BmPCVi+xJxBugG3LkjLOiPUAhKYa5MzByl4H1CccJIEJl4NxhmU5ZTQbKGVRUsA787P6U+GlhtRkLeQwo3nHK2dezmYVMKQANfKoXIkzopCCh6CG363pLNpOVUY4saJaIFrH5UqX4VyuEDTcu4iSCSQ4Zx56SA9LxMiIlhS6y/zQFAXdS5DVo4LCDvjUlsirS1UOXGvtUSmoEyaJeWlBOKndmtsBxcRoUwITooVPgfsM+lHKMbdM8FGEaEsk1pK339H7lq0but14tWHwNc+aJlAjo51XWFZJkiPyesOp3vOVnXXgq2z27GU33dX2jEetgVcGO4lM68+eCn/sFq9+eJd4d1r2A2YQITD/EQtZgxb97K7owt7FPcpXxGZpLFXnv8nUv/Un4V1D9J6LMg99cdxdBtLsTryTmJg3wXSLZPuwfU0qMsWRJkAN8gcZjPm+gBbR23GHL5xIvhz3MpFhB2MAlm+yH6Gka8RtjKSocSfYOQywlZGarru19S3TrMTmtMpZP22Dl1ry9eLWqnZaqzUhL2olZquxsrLQUe8FRr7jPL/VqmXCVjHnO89lBJA5XOahgpUWVz54dEjDRvGKxWXbBwgKBgmpDc0PqAx2tASZ4qjlJjB9FCzuolOHHK5GRAa65Q0ttu+uoOAdVjsxFS1i13Jv3B9aKaqXfyE6+05d5wYoehApAFupeOIBAkwpbSLP9oHIUGUCWgjFkL1gXJvnc4hgaXPWQD0TrehvkQIGpxwjgYVr7rLka7TjfwFS0j6xVNhbkj3xTdIz4Q0qana718HhELPCtl9uXI6YHc77N8FiIObZOLVJXPsxmExVt0G/PCAM44xnGK8kmhKtFNeD3n2KKduwjYN9Vsg26W4bxDaAZpU+q3j4i1NuawohNodyo6kjmvpc3UgpUJlvTml763J5phcnF4e4p/AKqw+qq9iZBfR53CMY/HU0y3cOHvErun7aZUToE5wPJbKA5BVRqrgTkB9VPFd1cVx8n2KLB26Tp2q/xzd5k5elqTzy7t3+1f4b0yKLCgM3lPjffr9PUPHhAxX6sObRWre+fqYC810N0vbkD/X3ZM2r130FeUVWssW2NedGyKJjEFsvA+UHMUVTVdy7Y7X0BvZPR7GZaSvL7kfb2+v9wBjbrtJ/UCPTAOqnnBrX2p6eapfk2jfwrB6fRq2Xp+G9Po03MSXpZK2EJpV/ezkjYQUls4VNh0OudQ+O2MLVI6dMTFkhQj7xCL3Rrh1UBldjz/h+iOyDA2kd9O2wA0VUSyLrliTEVaIT+F4qB68Rt4ttRH/1pNSePdaRq0yNNy5DuoVWaPg3GB0PYbW6AvnZ2/PzmGXsI4w1T/jof5r2+EzJDssNPHTAJaH4geHLP91+4E8K7R1NIxt8dr52bmYVtE7/McNC8niqBbMbqrc3UGVO7LaemoMczX9Sau3wWkCS20daWw298ziVyPLkpZ/eDSUo2kCK2YEuyfG7jaQCUv/Z5DOmbS451xzMsCrSbUBXg+2LwJdp+s8Kkoi+Um/IIn9pX6/DBt7WZdI1XxgxDkWrqW2dw5RLTWV/fv7WyjL/wAbjVX3 -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Run - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-scenario-preview-evaluations-scenarios-scenario-id-get.api.mdx b/docs/docs/reference/api/fetch-scenario-preview-evaluations-scenarios-scenario-id-get.api.mdx deleted file mode 100644 index ca686f016a..0000000000 --- a/docs/docs/reference/api/fetch-scenario-preview-evaluations-scenarios-scenario-id-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-scenario-preview-evaluations-scenarios-scenario-id-get -title: "Fetch Scenario" -description: "Fetch Scenario" -sidebar_label: "Fetch Scenario" -hide_title: true -hide_table_of_contents: true -api: eJy9V0tzGzcM/isanJKZjeV4etpT1cRu3KSNx1Zy8Wg00C4kMeVy1ySoVtXsf++A+5Zkx/Y4OWlF4vHhAwmAO2BcOYhv4XyD2iOr3DiYRZAXZMO/yxRiWBIn67lLyKBV+bywtFH0z5w6nXbTzTs5lc7nK2KIoECLGTFZ8bUDgxlBDD1BiEAZiKFAXkMElu68spRCzNZTBC5ZU4YQ74C3RVBlq8wKIljmNkOGGLwPVlixFoGb2vboMoWynIlJV+TGkRMrZ6en8pOSS6wqJAJR8UlCzi29Hl3XwhBBkhsmwyKORaFVEgIef3Ois+shK6yQxqrykOS+UqoBK8O0IttD+C5IRJDSEr1miE/LqKUkuDPbz8vA19D0Uoec9QUwTZXAQn01EO0kahiLPNeEBspon8pyVkbNUr74Rgn3hYzXGoTGBv1FAFFGkBHjM8E0nqMDlgaes8VwpR/DcV+QKJt4jfbVhdf6D5ebN589F55fw7EYFVP2SC20FrcPEzPUhSex+qeQKRrPz/BPIPWv/JNy/F1a7wvyQP1pHE3rg5dYQqZ0jvwQD70KkSLTG1YZPWj+XWV2NAmwfJH+CCdfKrO1k5Q0/QAn7yuztZOGrsVWyu3j/ISa+hiyftuGOtvx9aJeGrZaLw1hL+qloav18nKmK3sbsk5VXeMRt/bAyNdaXboEI/sHr38EZHwmjb0gk1Yrd548SY+03phqyVUtT4JBpb2VhkfW5laWEjQJaU0p9FB0c8JNBeIY5Laltd6FTsNkN6iPwj5ao/ZZbAxIuVAZOcaseNEbM22tloGl+nQ9dua49qYaN/bLWX+guW0MHye16f+HMI+Zvd9AO8GUpSj+cnZ2OPB8Ra3SoDU6l6Q/f9pJiVGFzNa9dF9A58lg9yltqzeYVO23i/tTXgEMg4hbHUtW11qdwxV1veZ+0UDGaCq738ulxFW5ruX6F7alt2L3/jDeV/Q9lOEP0+nVgcEqt8OkXsisPmrPURjQ1rlM8c0ozmuIYVwP8ePeED9uh/jxrjebl1IoyG6a6d1bDTGsmQsXj8eJzn16gisyjCeoxliocKccJd4q3gaVydXlR9p+IEzJQnw76wvcyJmqTslQrE0QFuojCV/1u2HieZ1b9V+V+vrlsK60ylBplmGAbribBHCjydUl9KownJ68PTmFff4GwnIdMAnXofEdtiHaY6GNXwpoFu4CMGH2a7chyIrccYamZ+8gXQM0LQVM//K40KjCUQ++d3Uqb6FOpbjuveK6x4R8x/3H1iyCde5YdHe7BTr6YnVZyvKdJyspm0WwQatwIQTe7iBVTr5TiJeoHR3AbOsGvLqur8frUTcVDuE3aTWSU0Es/yCCv2m79yoMd3/dHJtdLTFJEiq4p3tQquR8tef+9/MplOX/T0YcUQ== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Scenario - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-simple-evaluator.api.mdx b/docs/docs/reference/api/fetch-simple-evaluator.api.mdx deleted file mode 100644 index bedcaee7df..0000000000 --- a/docs/docs/reference/api/fetch-simple-evaluator.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-simple-evaluator -title: "Fetch Simple Evaluator" -description: "Fetch Simple Evaluator" -sidebar_label: "Fetch Simple Evaluator" -hide_title: true -hide_table_of_contents: true -api: eJzNWFlv20YQ/ivCPCXAxnKNPvGpqo/aTdoYPvJiCMZoOZI2XR7Zw60q8L8Xe5AiRcuVZBvQUxxx5pvZb2Z3jiUYnGlIHuD8CaVFUygNYwZFSQqNKPKrFBKYkuHzRy2yUtIj1YLAoESFGRlSDmIJOWYECTQSjyIFBiKHBEo0c2Cg6IcVilJIjLLEQPM5ZQjJEsyidLraKJHPgMG0UBkaSMBaj2KEkU6g8XNwlUJVjR2mLotck3YwJ8fH7p+UNFeidCeABG4t56T11MrBTRQGBrzIDeXGiWNZSsH9gYfftdNZtlwrlaPDiGCBFzYoRY9FbmhGquXiqZdgkNIUrTSQHFdsRYq3ly++Tj1lXeyp9NHYLCD0I7faFFlXKLoyKQpJmEPFmp9yKyU4lmrnrvTgNCBUzMFt8Gs3xCYoEXRuM8xfA3jpAaqK1ULF5Dtx0yL51mdjY/jCM9dHrRhkZLDrC6apcLFGed1ht+dtzMYWbB3tjqVs0v2lfcjnbQEXiluJ6sOFlfJ3XeSfvlpTWvMR1o/sQIShbEstVAoXL9K7pgs9kl9S/sOR6TR6iXpIpP5ZfBHa/C+tmw7ZU9+No7uQivE53IqBvgtOt2Ldh2w/qLMWRMWAK0JD6SOalwBbD3CKhj4Z4f3ZbOU0wA5Gnixbpu9h5D7ARiMpSXoHI2cBNhqp6ZosXDXbzo4vWduQ9evCV7EVX29qpWarsVIT9qZWaroaK1ra2b65eut0XQ15M/fiyXG9BnTr6hMp/Yor9i2qu0gqsS/KvRIBQe6PIB3CnDD1Pdlu7/N7UXJ4CfFCX3FDU1KU884bUTs63qkOXMYwVHWfu21EDqiSHmR7skMMbiPxrg/EshT5tm3LOsW79Ei1IR94V3r3zv6gXXUnrUPtug4yVzYrX68odYEi9SQ4bcNuGF13yMEIXfmZcypmNszW72HrtGNghwHqDH1j35uftkd4nXYzmFeV0/r55KQ/x39DKVJ/ssG5Un4DsecQn5JB4ctszMd1AVnwztdd7lOrSoQUXh36S8GxbsQzPXtu8bGatLTGGa1yerOoJ2Nw574+x/hq6fLgzxVMR7l2yW7oDexuPsZZoO+l8F7e3V33AENsu0G9cMulQciG1iLBz+3zwq2fZmT8rsnMIYFhqehJ0N/DsI4aNvsLPVy2F08VhDtd76Z8VwVzY0qdDIdcFjY9whnlBo9QDLEU/hpp4lYJs/Aqo+urz7QIVRySh3FbwNeVkCpdsSZKWIrP5EiLW7GRNfNCiX9D/ONaLHRqnkiRTwuvHgkceecGo+srYKtmDI6Pfjo6hnUSO8LuTiD3d6K27T8DW2OhOT8woMxfCDCE2S+rD86zstAm7nMi3saYrY2rkQpD/5hhKVHkrf42xPMBYjxduDwetHZlGhgknXXimMG80MYpLpcT1HSvZFW5n39YUi5uYwZPqAROHIsPS0iFdn+nkExRaur52Lwg8OEmXpSPg1UR6vpexzZ3gXV+uf8Bg79osb749M/AvE6eZRQZcU6laSn3Xi2XZU3q/3Z+B1X1H4qAb2U= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Simple Evaluator - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-simple-query.api.mdx b/docs/docs/reference/api/fetch-simple-query.api.mdx deleted file mode 100644 index ec223c9884..0000000000 --- a/docs/docs/reference/api/fetch-simple-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-simple-query -title: "Fetch Simple Query" -description: "Fetch Simple Query" -sidebar_label: "Fetch Simple Query" -hide_title: true -hide_table_of_contents: true -api: eJzNWN9T2zgQ/lcy+1RmXMIx95Sn4wpcubZAgfYeMpmMYm9itbJkJBnIZfy/36wkOzZ2QsjQmXsBx9Z+u/r2h1a7AssWBkZj+Fqg5mhgEoHKUTPLlbxIYARztHE6NTzLBU7vC9RLiCBnmmVoUZPsCiTLEEbgvk55AhFwCSPImU0hAo33BdeYwMjqAiMwcYoZg9EK7DInOWM1lwuIYK50xiyMoCgciuVW0AIybjm4SKAsJ4RnciUNGoI4PjqifwmaWPOcrIYR3BZxjMbMCzG4CYshglhJi9LScpbngsduk8MfhmRWDbNyTRRY7jXEqvBCwVouLS5QN8z74FZEkOCcFcLC6KiMPBlOl1xezR1NbVxPWvN7m44yqt/IQgigrVcaL0m2jNrb3g/qtAFRRhBrZBaTKbPbABuuSpjF95Y7ezZr+eBhByeWlBR58iuUfPOwQUmCAn+BklMPG5RUdM1c3O+mxwX3LmT96WN+zdebaqnYqrVUhL2ploquWosRxWLfWL0l2TKCtzPP2zQXrgo2IVmScMoJJq5bWdtROlNKIJNNLdVOJmVUvVKzHxjbraacOyNIZH9juhxW1aqlOZu13zT30K8LYq7jQjD97lJ95sb+bZR8f1XYvLAH8JpddsThVSTdBY4ytOz/y9F5IcSLDHGL2Y5STGu23B48bdnXkfqFyKQCwJ6T2j6xHrlM1CORt+1Yw0c0b1tyLz1kGYESyVuDX3nIMgKJT7tCv1hXLgmrjEDwjPeD9gbdM5TPTpr2rRPU221DWWTUyDETo0z8O2oPwo/JVg4cPBVWaVE/MLG3xRcVQBmBZra/wekmVwfnhmTLThSvF/xTx2IXhio6Fxb1C6HqG12lfQMZejdgMllnXpde91VR+ycVGST9G6k0ND2nFjxm4qrSULr201cNpztk/2bj5hxF0tck1ynvFpQR/MTlvgfqJ6SyAg9MFLv2oq8ultVOy55y1l9I/TVh9/r13ZlfRi2Hvpwp3NBFxUzJj83uS2U509wo2fDeZhS8J++7vwuKB2HdE7pH+juzj7KJf1lkqHm8E7ixTFvzyN09CmVSPdJVhnFJG8iYjVOkJ8F/YlPRrUPbSQ+XPp6nvGUqHdU7yaeMDEhZh8xTHu+GgE/cWBOsCD8aOGf0BmWMfWDdelYtatzJyN0uROoU3JR5MTM4NSgNt/yhPy16mr5uF88MDm5rmIYpcyYMlhHgE4vt1Dlwby1nhDH44jA6KrbUzzt8sleBC8JvU8BE/xGwi0UnQrzKEh9ka0s2OzWs6cFajxjGoXC2EjoUXleF626rOiEOYPK8NPXImuaexpNtG6qR+46mLXJuynGDD9xwJU+Z68leI3/rZjQOZX/Jel5SliTx+/Fxd7zynQmeuOHJ4Exrl2Z7zlYStIyL1nnYXiBUvOG0fPmA2uLWz8ob6K4SZrHtmP2CxrAFrjvqzUsdGYM7+vpSkNK+vOqwrn2cBXo9u5u3cerp2+baj3d31x1A79u2U89pzjfwkTD4GuZ8GdpU0RRwgdaN/WwKIxjmGh84Pg79VHB472eHw1U1ACwhAoP6oZoPFlrACFJrczMaDmOhiuSQLVBadsj4kOXcJbrBuNDcLp3IyfXFJ1x+ROYa3/GkueCWosnHR3tZ7RqWc2ptomoyeVLYVGn+r3d6GE+mXqp0fe9cOfGqhjnjBifXFxABbcNzdHT42+ERPGeutdidzLFdD/jCZ4iesVDvnw7BzGUBWGTZH+sPZFmujM2YbOD1OurZIDDQYPHJDnPBuAt0p38VnDiG4ERylcMCP7PkrpcY1bPcSQSpojvXGFarGTP4TYuypNdhwjmeUAOpOZsRdeMVJNzQcxJqf8e4ulbAu5uQEgeDdcvdNrpyqKRdhj4VIDS964mzS/a0ipZV+HwSx5jbhmCnNlFY1UH+19kdlOV/T1Hb2g== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Simple Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-simple-testset-to-file.api.mdx b/docs/docs/reference/api/fetch-simple-testset-to-file.api.mdx deleted file mode 100644 index dad3210b9e..0000000000 --- a/docs/docs/reference/api/fetch-simple-testset-to-file.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-simple-testset-to-file -title: "Fetch Simple Testset To File" -description: "Fetch Simple Testset To File" -sidebar_label: "Fetch Simple Testset To File" -hide_title: true -hide_table_of_contents: true -api: eJztWEtv20gM/isCTy0wjbPBnnRab7NB0nabIHb3YhjGWKKt6Y406jzS9Rr678U8JEtW7DiuA/SQUxyJ5Ed+5HAorkHTpYJ4AmNUWqFWMCUgSpRUM1HcpBDDAnWSzRTLS44z7cVmWswWjCMQKKmkOWqU1swaCpojxFDLsRQIsAJiKKnOgIDEb4ZJTCHW0iABlWSYU4jXoFel1VRasmIJBBZC5lRDDMY4K5ppbgWCp9FNClVFGkTrzszZCIDfDMpVB3FBuepA0mJ1u3BuY2FyS0OiHoDAVyUKS0TXJQsWnhSGc6imG6euGMdobF/2fHK/j/HpmeifLU5lH0tUpSgUKmvv4vzc/klRJZKVNqsQw8gkCSq1MDy6D8JAIBGFxkI7L8qSs8QVwcCxEa9bPpbSlohmHiERxisF91ihcYmylbL3ToJAigtquIb4vCJ1iXRj7lpecFeduwUyqlxJJjRE22NvLgRHWuyl75qqaNxYqYg3K2nysza9iapqKknMv2Ki+8V85QLt26sI5Ki36oKmKbOJofyuQ8YBlVOnpoOUz7tP2uE9jgUJk4nhVL65Mpx/UKJ4d2t0afRb2A7VGmEa8wO1qJR0tb/Wu7rQI3ef8t+WTKvRq6tfidTP4hNT+kladwXZU38eR2NfiqGHHdeQfC8i3a5znKnLlomKQCKRakxnVO8z2Lo9UqrxnWbOn90o773ZaOjIMmX6EiBfvNkAkiLHFwC59GYDSE3XfGWv4sNw3H17CFl/rtwlvOHrpCg1Ww1KTdhJUWq6GhTFzfLYWh1Z3YrA6dwLkdPtO6B7DdZX4IylW00rtN6nXTi8Adc3ZXSTuj6x4/5tkPuuhsHwRBS150ECp7U9auy+9p3XvvOifefUPeOR2fngGeeRAbfuftNnzRL1XPs6cB0wcL1O+i8w6fevzldSjyb10pL51OesnQWOGigO+lK+xwemmCi8K/0P5j0WRm6FFez8jG6zMqkqq/P7xUV/w/IP5Sx1+5PoLymFPH69kqKmjNtfO0YqLpLO2+cU8nQ7UZuQPwnvoGtNavnYELk5bErRZSvru0UdGc2mrMf3ZjE2cXF56CDXqpkNvZ7d3WFcevr2Jfd6PL7rGfS57Sb1yq5CI18LUT13jkV05VehOepM2JVpKZR2q1GdQQyDUuIDw+8Dv0MdhBFYDdabYbgapOJ7wQW1m06F8qHepxrJIYZM61LFg0HChUnP6BILTc8oG9CSuaOkMDGS6ZVTGd7dfMTVNdIUJcSTaVtgZIvMl01XrMkYLdlHtASGHebQ6ExI9r+vhbDHzLyWZYgVC+HUA5lD51w0vLsBAjYMT9352W9n57BNaEfYng+auPNRY7vXQLZYaOIHApi7wwEaaf7H5oX1zGYhp0XL3hP529pWBEI0/qcHJafMnQTnyTqkdgIhtTZpzio0e00FBOLOGrzJ8JRAZisknsB6PacKv0heVfax3w/bJKZM0TlvbYj/xdXWlvuBcmMddAd7n3zYQG/kp/YfyazC42BbTDSdC97chwP6NtrcOl2G6joqVm3M2qEWI675ZHWZroPAMEmw1C3VXq+07jdH7e52NIaq+gHQUHa4 -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Simple Testset To File - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-simple-testset.api.mdx b/docs/docs/reference/api/fetch-simple-testset.api.mdx deleted file mode 100644 index ec78be7799..0000000000 --- a/docs/docs/reference/api/fetch-simple-testset.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-simple-testset -title: "Fetch Simple Testset" -description: "Fetch Simple Testset" -sidebar_label: "Fetch Simple Testset" -hide_title: true -hide_table_of_contents: true -api: eJztWEtz20YM/isanJKZjeV6euKpahzXbtLGYyu9eDQeiITETZeP7IJuFQ3/e2cfpEjRsmVHnunBJ8sk8AH4gMWCWAPj0kB0A1MybIgNzAQUJWlkWeQXCUSwII7TWyOzUtEtezEQUKLGjJi0VV9DjhlBBOH9rUxAgMwhghI5BQGavlVSUwIR64oEmDilDCFaA69Kq2lYy3wJAhaFzpAhgqpyKCxZWYHg4egigbqeWURTFrkhY0FOjo/tn4RMrGVpfYcIrqs4JmMWlRpdBWEQEBc5U85WHMtSydiFOv5qrM6641ipLREsvYW4qLxS8FfmTEvSHQffOwkBCS2wUgzRcS0aQpy1fPV54cjqIy+Uy8FugRSNIz7GEO1GMDgzLwpFmEMt2kd5pRRYnhr3ztGMpi1KLTysxvhHMT1EbYP1YsX8K8U8TN2ZC3SIVwvIiLHvBSaJtIlBddkjY+BnKJwObJOanqVs3n/SDe9+WxBLHVcK9ZuzSqnfTZG/+1xxWfFb2A7VgkimbE8t1BpXDxK7pQsDch9S/sOSaTUGdfV/IvXP4pM0/Citu4IcqD+No6kvxdC39mJg6ILVrUW/6zwP6rQDUQuINSFTcov8EGCnVybI9I6l82e3lfcedjRxZFVl8hJGvnjYYCQhRS9g5NTDBiMNXfOVvXj2s+Nul33I+nXlrpwNXwe10rDVWmkIO6iVhq7WilHV8rm1em11awGHcy9Ejtt3QP8abK7AW5lsNa3Qeh93Yf8G3NyUo4vE9Ykd929reehqGIMORFF3+hFwWOzrFve177z2nRftO4fuGffMznvPOPcMuE33mz1plmjm2teBa4+B63XSf4FJf3h1vpL6bFJPLZmPfc7aWeBZA8VeX8pXdCeNLHLvyvCD+QGEa7eoCTg/otuuTOra6vx8cjLcsPyFSiZufzL6oHWhn79eSYhRKvtrx0ilirj39imFPNtO1CbkT4V30LUms7xviNwcNmNw2cn6blFHxmhq397H92YZduPi8qaDXKdmNvR6dneHcerpeyi559Pp5QDQ57af1DO78Bv5WhhN24VfRpwWdiG4DPs/TiGCcanpTtI/Y78gHIfJ14zXmxm4Bjux6rtmV1hpBRGkzKWJxuNYFVVyhEvKGY9QjrGU7uAYiisteeVUJpcXH2l1TpiQhuhm1hW4tiXli6Qv1uYHS/mRLF1hSzmpOC20/O4zHxaVqdeyfMh8UTj1QN3EOTeaXF6AABuGJ+r46KejY9imrydsTwPG7jQ0tt1rEFsstPGDAMrcUQAmzH7ZvLCelYXhDPMO3o5sbe0kAhFM//K4VChdvTsP1iGTNxAyaZPl0KDdXhoQEHW+aWYC0sKwVVqv52joi1Z1bR9/q0jbjM0E3KGWOLf83awhkcb+TiBaoDI08K/tGvDmKhyOt6NNx+/73WQ1tym9Q1XZ/0DA37Tqr6DdwU+bolkHgUkcU8kd1UGfstXVlvtvH6ZQ1/8BgZbrRw== -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Simple Testset - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-subscription.api.mdx b/docs/docs/reference/api/fetch-subscription.api.mdx index 6d1efd54db..ace8e35fba 100644 --- a/docs/docs/reference/api/fetch-subscription.api.mdx +++ b/docs/docs/reference/api/fetch-subscription.api.mdx @@ -5,59 +5,69 @@ description: "Fetch Subscription User Route" sidebar_label: "Fetch Subscription User Route" hide_title: true hide_table_of_contents: true -api: eJyFUk1v2zAM/SvBOwtxtqNPzYB9BL0UzXoKjIFRmFibbakSHcwz/N8HOm6a+FJfBIuP1PtgD6FTQr7DF1dVrjmhMPCBI4nzzeaAHEcWW/5K7T7Z6IJewyByCr5JnJD3+Lxa6XHgd0SObWstp3Rsq8XzBIaB9Y1wIwqnECpnx3ey30l7eiRbck3I+0E/Mxv5TZkstjdMFi+J4+LZt6LDa5bSK+UTCwwCSYkc2f6iLJtJSBzPHFV7jzZWyFGKhJRnma18e1jSiRuhJbmMgsNQaIdto5NubFk/bR65+8F04Ih8V9wCtirj4s09rId0gZGDgnvkDgYN1fq/bqX00f2jiZxTveWlS41wzdGP7U6qET+SW6yfNjBQGReHVstPyxXmvt2BNQGyYwJvb49lmJkLV/0w4Jqc1oSpfngvKLPgk9TU3Mz7KKY7cldHhP9KFipyDYaJSj9FuMMUoaZ2G2JhUPokiuj7PSV+idUw6PVry1FzKgzOFB3t1bVdMZg3UzXCP9ypfGs56L6cqWov2cwWU6O97tb3rz8xDP8Bxkwaeg== +api: eJyFUktv2zAM/isGz0Kc7ahT02GPoJeiWU+BMTAyE2u1JVWig3mG//tA201SA0N1MSR+pL8He2A8JdB7uLd1bd0JCgU+UES23m1L0HAkNtWv1B6SiTbIMyiIlIJ3iRLoHj6v1/Ip6YrQsGuNoZSObZ09zWBQYLxjcixwDKG2ZvxP/jtJTw/JVNQg6H6QoxYjvwmTbHfDJHtOFLMn37IMb4grL5RPxKAgIFegIT9MyvKFhETxTFG099DGGjRUzCHpPDe1b8sVnsgxrtDmGCwsuWzGavZFoDAUMs600XI3zts8bh+o+0FYUgS9L24BO9E4Gfce1gN3gUADBvtAHShw2Mh903Llo/2LM3MrBKqpS1yy7ujHdss1Xbndo3khV4IC0TnRXq8+rdb/EzM3ZJvH7RwVmjGqNx4jDNTCrotRoIAatFJjwubuWhCWwSdu0N3M+yjPdyQv7jD94TzUaB0MM5V+znoPc9YS723ahYLKJxZE3x8w0XOsh0GeX1uKklmh4IzR4kEc3BeDejNY4nyhTuQbQ0EW64x1O+W02GCJ+bKE37/+hGH4B2X9KQk= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Fetch Subscription User Route - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-testcase-preview-testcases-testcase-id-get.api.mdx b/docs/docs/reference/api/fetch-testcase-preview-testcases-testcase-id-get.api.mdx deleted file mode 100644 index 38139d6a0a..0000000000 --- a/docs/docs/reference/api/fetch-testcase-preview-testcases-testcase-id-get.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-testcase-preview-testcases-testcase-id-get -title: "Fetch Testcase" -description: "Fetch Testcase" -sidebar_label: "Fetch Testcase" -hide_title: true -hide_table_of_contents: true -api: eJztl99v20YMx/8Vg08toMZusCc9zWuaNmu3Bo27F8MwaIm2rjvp1DteNlfQ/z7w9MNSnGZJ4QJ72FMcHckv70PegVcB485BvIQFOU7QkYNVBKYki6xMcZVCDFviJFtza7AuLd0q+qv/4NaHNZWu1ztiiKBEizkxWYleQYE5QQwDQ4hAFRBDiZxBBJa+eGUphZitpwhcklGOEFfA+1JcHVtV7CCCrbE5MsTgfYjCirUYdDuYXKVQ1ysJ6UpTyJbiCs5nM/mTkkusKmVvEMONTxJybuv15GNrDBEkpmAqWMyxLLVKAorpZyc+1SCz0gooVo1CYnzj1CasCqYd2UGGr4JFBClt0WuGeFZHPZIgV+w/bAOvcWixccRCbWT1MJo66i0KrzUIkyEsRxxYRXDa2Dd93MQSMqVr5EfGTpHpBaucHhR41YSdzFlEfJn+CJFPTdhWJCVNP0DkognbinS4NvsTVqOD9cu+LUrH66QqHa1epQN2UpUOV69yutBNvK0O1+EwJKapkvOP+np0Jo9EN8ZowmKo0uZRr+ScN5/M5jMl/GAqlyEJcfn+ZDrl6Og6Ginnm/GX4R7u14JE2cRrtM9+N++V41+dKV588Fx6fg5P2eWROzwJ0qJllBPjf5fRpdf6XwkppvyRXmgt7h9unrHv06D+JjDl8OL/UE8G9UJg1kcux4PLPVEe49ZPLnUt5j+dnx8POn+gVmkYYyavrTX2+6eclBiVll8t4bsG2iSj1ad0yOCebIpy2O170yQYzrzb3TcYHrrYOdzRoUrfNg0wJgtZvQ/1YShdhn010q3doMQHvA3db2/josH3UF3fLhbXRwGb2o6Leilz+aTvnnAXZkYm9m4E5wximLYD+7Qf2KfVYA6vQeY/e9tN6t5qiCFjLl08nSba+PQMd1QwnqGaYqlCcztKvFW8Dy7z66t3tH9LmJKFeLkaGtxIHzWdMTbri4KlekfCqH0jzD1nxqqvTbnbV0LWeAkEVWxNcG95zUNyk/n1FUQg22jozM5ens3gLrORsRwBTMIR6LTDMkR3KPT7hwgoD/0PTJj/fFiQzErjOMdiEO+oRKNsegRMf/O01KhCewftqi3fEtryweGp4CCCePiUWkWQGcdiXVUbdPTJ6rqWz188WSnSKoJbtAo3gmxZQaqc/E4h3qJ2dJRYfzvAs4/tIXg+OVyZ44S7QhZSxVvUXv6DCP6k/Z03XzjhWdcoVWsxTxIqeeB7dCFJR/Xd/eb1Aur6H99vClU= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Testcase - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-testcase.api.mdx b/docs/docs/reference/api/fetch-testcase.api.mdx new file mode 100644 index 0000000000..d38802bf23 --- /dev/null +++ b/docs/docs/reference/api/fetch-testcase.api.mdx @@ -0,0 +1,258 @@ +--- +id: fetch-testcase +title: "Fetch Testcase" +description: "Fetch Testcase" +sidebar_label: "Fetch Testcase" +hide_title: true +hide_table_of_contents: true +api: eJydVU2P2zYQ/SvGnBJAXW0XPelUNx/NNi2ySJxeDCMYU2OLCSUq5HAbR9B/D4aibMneRZOcLFNvPvjezFMHjHsPxRpW5NkTe9hkYFtyyNo2tyUUsCNW1Qcmzwo9QQYtOqyJyUlgBw3WBAWMgA+6hAx0AwW0yBVk4Ohz0I5KKNgFysCrimqEogM+tBLq2elmDxnsrKuRoYAQYhbWbASwSrkXtyX0/UZS+tY2nrxkubm+lp+SvHK6lb6hgHdBKfJ+F8zibQJDBso2TA0LHNvWaBWvmX/0EtNNOmudkMB6qKBsGIJSw7ph2pObdPgsIvrsSEMs0Rze7CJHWJZaKqG5myU+IeZU9NlFrclRE+rt/GRrrSFs4tHDtUBpp4JB9+RlMOYvb5tf3gRuAz+VWwxZ7PYjKY5JNFP9nVHoHB7m7RkDotJIzllspOmi4mPBo/bQX4RNR2udRHog8qh/30uO325uLsflXzS6jMOweOGcdT8/KyUxaiNPicNzgLFq9vZHZmDTn9F+uu3fdmhQ2K39/qH1GqH/kPe4p5MOj0MjGYuVvP0//uVeQ+mEm0hxondg9/FrPB/oe6jYCHm1Wt1dJBy0nYv6UpxrsTo5V01cWfG0PXE0Mq6ggLx1dK/pv5yTB+bjEvu8m9haDxl4cvej8QVnoICKufVFnitjQ3mFe2oYr1Dn2Go4b2gZ3y6eCTQOuScVnOZDzLe8u31Nh1eEJTko1psp4J1M2zA/c9hROmz1axImkx8vA1fW6a/DUCRHroYooUo3OxvDE6uptz9QfaJGzFfuObR9ffXr1fVjl0kBi+XdbVoaVHFpxj4iDLIzuo5EQQZUx40BJqx/P72QLlvrucZmku9C1FlXRzqYvnDeGtRxIWLtLgm+hiQ4DHYdP3sn55bnYvo122RQWc8S2HVb9PTemb6X48+BnGi3yeAencatMLnuoNRenksodmg8XfR4tBZ48jZt0NPFyVHnvY/6NiLuPZog/yCDT3Q4++xGe6jG+ekSYqkUtTyJvXAzGbTjavz5YgV9/w1zEMd+ +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetch Testcase + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testcase + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-testset-revision.api.mdx b/docs/docs/reference/api/fetch-testset-revision.api.mdx deleted file mode 100644 index 7cce0422bc..0000000000 --- a/docs/docs/reference/api/fetch-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-testset-revision -title: "Fetch Testset Revision" -description: "Fetch Testset Revision" -sidebar_label: "Fetch Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWUtz20YM/isanJKZjeV6euKpbhzXbtLEYyu+eDQeiISkTZeP7IJuFQ3/e2cfpEVSkmVFnunBJ8si8AH4gMWC0BIYZwaiOxiRYUNsYCwgL0gjyzy7TCCCKXE8v2f//F7TgzQyz0BAgRpTYtIWYAkZpgQRdAXvZQICZAYRFMhzEKDpeyk1JRCxLkmAieeUIkRL4EVhIQxrmc1AwDTXKTJEUJYOhSUrKxCcHVwHG4PLBKpqbKFNkWeGjEU7OT62fxIysZaFjQciuCnjmIyZlmpwHYRBQJxnTBlbcSwKJWMX/vCbsTrLFQ8Lbclh6S3EeemVguMyY5qRXvH0vZMQkNAUS8UQHVeiR5Ezmy2+TB2PbRO17ANqiRlbNlvS2ymrRCORlUqB5ahL4q1HdhwKOLydNn4dz+Hj8PioWU4xPqSB0wBZWyh5nuuDgXu0SkCCTDuiWtF3LFPaCn1mASsBKRmDs63Y22D+CuqVgKly3WJztc7RuE4RYziDPYOTPFeE2VaLF2gGowalEh5WY/yzmB6ismXoxfLJN4q531nOXaB9PMcmY9sLTBJp2wWqqxYZO5BdN4yWpXTS/mY1vPW2IJY6LhXqN+elUn+aPHv3peSi5LfQDdWCSKZ0Ry3UGhdbie3oQo/c7bXF6DR6dfV/IvVz/kkafpLWTUH21J/H0ciXYrhf9zvDn9H1ivZduB/U2QpEJSDWhEzJPfJBe9d7Dzs4dWSVRfISRr562GAkIUUvYOTMwwYjNV2TxQEvqJqs3xfhiqr5OqiVmq3GSk3YQa3UdDVWHkj3Z6Tdy/U2qFcCjCpn+8LcWN1KwOECDRxi9zbpj3/2GryXSaf9hSb+tAu7t/L6zh1cJqae1dbc5I3l9ZPqS012h8W+aXBfO9hrB3vRDnbonrFmCt95WlozKtfdb/ysqaSekF9Htx1Gt9d3hhd4Z+hfna+k7k3qmSXzqRdjOwvsNVDs9M5dL/O8K/1X790Rfk67WQtWldX69eSkv0W8RSUTtyMcfNA61/uvEBNilMp+2jBWqTxuPX1OMY+7yXoM+lPuHXTtyczWDZJrFkBeZLOoI2Mwsk/XMf64+b1zcXnTQa61Mqzp9exuDuPM07ctvRej0VUP0Oe2ndRzu+gedHfL4Nr3PLer8Bmx23vzHCIYFnZ/S/8Mw+BrhvU+1wyXa7bgFdgZVj/U+/JSK4hgzlyYaDiMVV4mRzijjPEI5RAL6Y6SobjUkhdO5fTq8iMtLggT0hDdjVcFbmyB+ZJpizXZwkJ+JEte2NT71aP84esg7OjnXsuyI7Np7tTrVaVzbnB6dQkrr2VwfPTL0TF0yWwJ27OBsTsbtW33GESHhSZ+EECpOxjAhOlvjw+sZ0VuOMVsBW9j7jobj0AF0788LBRKV//Oh2XI6x2EvEKzrDaudENuQUC07jeOsYB5btgCLJcTNPRVq6qyX38vSdv8jcN2fWLZvFtCIo39nEA0RWWo52vTUeDNdTg4bwePN0I7hjrHmU3wA6rS/gcC/qbFhh9lXHeY17W0DJKncUwFr2D0mpktuuZE/PFhBFX1HwFH/r4= -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-testset-to-file.api.mdx b/docs/docs/reference/api/fetch-testset-to-file.api.mdx new file mode 100644 index 0000000000..a048dce2c8 --- /dev/null +++ b/docs/docs/reference/api/fetch-testset-to-file.api.mdx @@ -0,0 +1,856 @@ +--- +id: fetch-testset-to-file +title: "Fetch Testset To File" +description: "Fetch Testset To File" +sidebar_label: "Fetch Testset To File" +hide_title: true +hide_table_of_contents: true +api: eJydVctu2zAQ/BVhTy1ARGnQk0510wZNXwlqtxfDCBhpbTGhSJVcpXUF/XuxFCXLdtxDTzbM2eXszHLcAsmNh2wJC/TkkTysBNganSRlzXUBGayR8vKO+vM7sndrpREE1NLJCgkd17dgZIWQwYBTBQhQBjKoJZUgwOHPRjksICPXoACfl1hJyFqQZnuzDj1oW3MPT06ZDQhYW1dJggyaRhXQiUNEtxJAijT/FAdIrgvoGBn5MNm7UBXp/GzQbff4rKX2e4TQNBVrcjn/AQI+zm++siqH5IaLr5TGZMGHHfNx6GtrPHrudHF+zh8F+typmiWFDOZNnqP360Yn3yIYBOTWEBoKgtS1VnlwIH3wXNNO2NWO/SHV35Dbpi+K9JQh3KCb8LsMiE4M1jwrub1/wJzgSM6p6KbRGrpV14mjqp2Yy8jo2Jlx1q7jFq8vLo6l+SG1KsLgyXvnrPt/XQokqTR/U4SVPwZom++dntrCiQCDtt1qJ4F0Tm4nun22PUEWvPKbiTNHi/MFvZcbhLHZaWgQY1iyf8vPc/VXR9zEiZ28vbqnx3jXy/fcZQPkw2Jxe9Sw93bf1CsOkGR4nwubXPUBUiGVlhOmtp5CoFAJGaS1wyeFv9K4rz5td6HSpYX9ZbSVHC8e3dMQP43TkEFJVPssTXNtm+JMbtCQPJMqlbWCQ1qzcJpcMjQkice8cYq2od/s9voTbj+gLNBBtlxNAXPeuX6L9mGjgbJWn5D1jCk0a6i0Tv3pVyMmUdlXsWDKrG0oj9pGbm9l/oiGR+U5e9rnZ6/Ozk8NEwuS2e11fDoyD09n4BFgIA7kGoUCAViFdwOEsnqzO2CW7FMlzaTfKWv3yI2qEP6mtNZShdcRKLTR9SVE12HMKQ8Csr2/k9H6lYCSdyZbQtveS4/fne46/rlPdzawUF7e60m+P+L24P/gSeqGeQX3n6RTXPB88cFAYyjBi2/x7b1MQDw/6LATZju9cyA0mTDkSjmsXBsBszzHmialRzHI9MfHdHszX0DX/QW3m60c +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fetch Testset To File + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-testset-variant.api.mdx b/docs/docs/reference/api/fetch-testset-variant.api.mdx deleted file mode 100644 index 65f3cfcaa6..0000000000 --- a/docs/docs/reference/api/fetch-testset-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fetch-testset-variant -title: "Fetch Testset Variant" -description: "Fetch Testset Variant" -sidebar_label: "Fetch Testset Variant" -hide_title: true -hide_table_of_contents: true -api: eJzNV9tuGzcQ/RVhnhKAsVyjT/tUNY5rN2ljxEpeDMEY7Y60TLmXkEO3irD/XvCyknZXUhxXAfqkC2fOmTkzJIdrYFwaSO5hSoYNsYGZgKomjSyr8iaDBBbEaf7AYf3hEbXEkkFAjRoLYtLOfw0lFgQJ9OweZAYCZAkJ1Mg5CND0xUpNGSSsLQkwaU4FQrIGXtUOwbCW5RIELCpdIEMC1noUlqycQQx19ClQjG4yaJqZQzZ1VRoyDuzi/Nx9ZGRSLWuXDCRwZ9OUjFlYNfoQjUFAWpVMJTtzrGslU5/7+LNxPuudAGvtlGEZGNLKBqcYtyyZlqR3An3tLQRktECrGJLzRvQF8qzl6v3Ci9hlaE1l1rU6LlQjNhalVQqcNH3pnGQCULNcYHpKgkmEjAwL5dvrcIo5Gt9aKca6DYKYV5UiLI+yXqMZTTcojQiwGtP/ihkgGle2YFbNP1PKw2a88okO8RoBBTF2o8Ask67FUN12xDhUgB3Ytsk6TMW8+89uevu5IJU6tQr1iyur1O+mKl+9t1xbfgn9VB2IZCqe6IVa4+qosD1fGIh7zPkPJ6bzGPTV/0nUP6t30vA3ZT2U5MD9+zSahlaMJ/KTFBiG4Hwb0T0/nwd1uQPRCEg1IVP2gPzEMydDplcsfTyHWV4H2NHEi2Xr7EeQfAywkSQjRT+A5DLARpJWrvnqhKd0K9avq3hOt3qdlKVVa8PSCnZSllauDYtRdvncXr1zvo2A04Xnh5NvXh9xlNl3gTzZeTPRNI1z+vniYjgAfUIlMz/ejN5oXennTz8ZMUrlvsXLoW+gqrSz+j3n8Kzp3SfbnN9VIUBXpcIs982N27vCGFzS9vA8bOrFGE3d6j7BtzPrvc8rUEe7nWJv5Q3qHk7jMsh3rLrX0+ntADDUtlvUKzegj3pTMfjBI6/cBL+kMK9zDgmMa02Pkv4ex+nSjOMkasbr4fDegABD+rGd8q1WkEDOXJtkPE5VZbMzXFLJeIZyjLX0zW8otVryyrtMbm/e0uqaMCMNyf1s1+DOdVfol67ZplRYy7fklIvvi4nlvNLya2iC+LTIg5eTRpaLyru3A6kPbjS5vQEBLo2g2fnZT2fn0FeyY+w2BqZ+Y7TcfhlET4VN/iCACr8rgAmLX7YLLrK6MlxguYN3qHC9SzcqwfQPj2uF0ve+D2Edi3oPsaiweV8Yl24sLAhI9rzLZgLyyrBzX6/naOijVk3j/v5iSbvizSLG3El5v4ZMGvc9g2SBytAg0s1ZAi8+xC3zcrQdfboZtAUuVz5UZd0vEPAXrfa/I/2xkLd9tI6GkzSlmncgBqeYa7jNXvjtzRSa5l86vCCi -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fetch Testset Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fetch-testset.api.mdx b/docs/docs/reference/api/fetch-testset.api.mdx index 311897eb33..79c78ebe90 100644 --- a/docs/docs/reference/api/fetch-testset.api.mdx +++ b/docs/docs/reference/api/fetch-testset.api.mdx @@ -5,67 +5,834 @@ description: "Fetch Testset" sidebar_label: "Fetch Testset" hide_title: true hide_table_of_contents: true -api: eJzNV9ty20YM/RUNnpKZjaV6+sSnqnFcu0kbT6z0RaPxQCQkbrq8ZBfrVuXw3zu7XN5E3+I6M32SxAXOAQ6gBVgB495AtIYVGTbEBjYCipI0sizyywQi2BHH6Q035yCgRI0ZMWnnV0GOGUEE4fxGJiBA5hBBiZyCAE1frdSUQMTakgATp5QhRBXwoXSehrXM9yBgV+gMGSKw1qOwZOUMQmizywTqeuMQTVnkhowDOV0s3EdCJtaydEFDBNc2jsmYnVWzT8EYBMRFzpSzM8eyVDL2Oc6/GOdTDQIrtVOAZcMQF7ZxCvHKnGlPehDgW28hIKEdWsUQLWrRCuLZ8sPHnRdrjLxTXvz7DVI0XvgYQ7a9YQhmWxSKMIdadI9yqxQ4ndrwLtDMVh1KLRpYjfF/xWwgapdsY1Zsv1DM09Kd+0SneLWAjBjHUWCSSFcYVFcjMSZxhsYZwLalGTFl2/GTYXp3c0EsdWwV6lfnVqlfTZG/+Wi5tPwajlN1IJIpe6IXao2HB4U98oWJuA85/+bEdB6Tvvo/ifp78UEaflTW+5KcuH+bRqumFcO99SQFpiE431qMb53nQZ0NIGoBsSZkSm6QHwIc3JUJMr1h6eO5n+VtAztberFsmXwPks8NbCBJSNF3IDlrYANJK9f24AbP03j8dHmKWD8f/Mjp9XpRllatjqUV7EVZWrk6FqPs/rm9eu18awEvF54f6Y+Oj7smx+Ne3eSva2f94+npdFH4A5VM/Bowe6d1oZ+/JSTEKJX7FsbBsYEq4tHpt9y8m/pogvTJfiiaAF1dMrO/a6/qp4MxuKf+urzf1IsxW7nTu5Tud7q1z6uhDnaD8vbyNuren8ZZI99DZb1Yra4mgE1tx0U9dwvrbNUtrBlxWrhNdh/2V04hgnmp6VbSX/OwqJl51e+wNQgwpG/bJddqBRGkzKWJ5vNYFTY5wT3ljCco51hK39WGYqslH7zL8uryPR0uCBPSEK03Q4Nr10RNW4zNuopgKd+TEyis10vLaaHlP02tw4adNl5OAZnvCu8exFr64GbLq0sQ4NJopFmc/HCygGPBRsau/zH2/d9y+2MQRyp0+YMAynzzAxNmP/UHLrKyMJxhPsA7rs/RFA0KMP3N81Kh9K3tqatQuzWE2kG3ZhsQEA3eQTYC0sKws62qLRr6rFVdu8dfLWlXoY2AW9QSt06vdQWJNO57AtEOlaFJWN29AK8+hfZ/PesXl3G4bRVzV8JbVNb9AgF/0mH8ruT/2mnbJFUwWMYxlTxwndxErpu6vv7l3Qrq+l/SnLUr +api: eJydVcFu2zAM/RWDpw0Q4qzYyadlXbcG3bCizXYJgkKVmVitbakSnS0z/O8DbdlxkgYDdopjPVKPj3x0DSQ3HpIlLNCTR/KwEmAsOknalPMUElgjqeyBunMQYKWTBRI6jquhlAVCAuH8QacgQJeQgJWUgQCHL5V2mEJCrkIBXmVYSEhqkOXu+7rNQTvLOTw5XW5AwNq4QhIkUFU6hUYcI5qVANKU86tAPJqn0PB7h96a0qPnKy6mU/5J0SunLZcECdxXSqH36yqP7gIYBChTEpbUErM216pVIH7yHFOPaFvH+pDublCm6oICQ10SbtDBnuBli2hEL9GrpZvHJ1QEJ2WNiy+rPIdm1XCqo6i9yMvA6FShodam4RTvLy5Opfkpc522hUdXzhn3/7qkSFLn/KQJC38KyI06OD03DSMBem2b1V4C6ZzcjXT7ajqCLHjhN6PODNPVQ7+h93KDMCQ7D23FiBZ8+i/5ua7u6oAbdWIvb6fu+TI+dfK9dlkPuV4sbk8Sdr09bOpnNnC0GAxcIGWGnb0JfqYMEoitw63GX3EYUx/Xe083IMCj2/amr1wOCWRE1idxrHJTpRO5wZLkROpYWg3HJGbtaXTJ0Na/HlXlNO3afLPb+Q3urlGm6CBZrsaAe56wbmYOYUO7pNU3yOqFXTSrKDNO/+kGIayjrItieXS5Nm14UDJw+yjVM5a8v7jOjvZ08m4yPVdMCIhmt/NgFKlao/Q8WhiII7kGoUAAFq1LgFAWH/YHzNIaT4UsR/mOG3lAalCD8DfFNpe69UB7dR2avITQZBi2kQcByWh5rwRkxhNj6/pRevzh8qbh1y8VOu7WSsBWOi0fWbtlDan2/JxCspa5xxNawwKBN3fBJ28jEK/T7Ttacju3Mq/4Hwh4xt3hR6bdAVk/MHUAzJRCS6PQk5XFkzUY4MvVAprmL9AyZhQ= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Testset - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-trace-by-id.api.mdx b/docs/docs/reference/api/fetch-trace-by-id.api.mdx index 81dc03e114..c4c10cb26f 100644 --- a/docs/docs/reference/api/fetch-trace-by-id.api.mdx +++ b/docs/docs/reference/api/fetch-trace-by-id.api.mdx @@ -5,67 +5,4336 @@ description: "Fetch trace by ID." sidebar_label: "Fetch trace by ID." hide_title: true hide_table_of_contents: true -api: eJztm1Fz2jgQgP8Ko6frjC+0nXvi6bhA75ikkCHkXjoZRtgLqBjbJ8tpfQz//WYly9jGGBqaS5ruU1pb3l2tVqvdb9CGKb6IWecTG81ikA98JnyhUnbvMA9iV4pIiTBgHfYBlLtsKcldaM3S1qB3wRwWRiA5Dhh4rMPmOGSqh0xn6VR4zGERl3wNCiTq2LCAr4F1mBmjBwgUHnG1ZA6T8E8iJHiso2QCDovdJaw562wYD9LRXEtQaYQSYiVFsGBbJ38iAgULkGx77zAllI/PJtrcgce2ODBTPg/lmiur+p8EZFrSPed+XFIOQbJGD4URBAp8WIPSn/AFBIqjq8pGoevmPPEV6+hvoPiRNe2DsWKL5kqIozCIIUZt79++xT9l798mrgtxPE/81jgbzBzmhoGCQGkHRZEvXL0W7c8xfrOpdV8kcc2UMLrcMMk+r/o39+bOwUHi+yXvXuqvtw6LIx5oeULBWv+jqiZQ8FXtv8jjoFNd2Lo1NIqODL+NeJCtuB0Tzj6Dq0pr/KkYglZqYWqjCfiXxureZISqTfAc1jvE91uHrUTgmfWzIXB70x1OrwbD3vRueHvTvxx8GPR7bD9obJgdGr97PhhO+uNh97r08LY//rs/Lj26vB70h5PSo5vxqHd3WR03Gt7efeyPqx5AX17hfND1iks1VaLeC9me6jCPK/hVjyosCX7amgjjIAi8x4npB14uJFZcJfHUDT2oOHvSndzdTi9HvT66rz9pcnRh7OgKPVJ40B+PR+PKMyOw6iRtyiVasjNsDXHMF3Bi6trbWUZm62MmZeswrpQUs0SZfbOTyT1P4Kbn/k1hZ5n0WQ7/Jn3dnXRcoQcIVEXPgZ196q7ApYwVX0eNOz0f9L9O+Eii0FMszqCy/n30VpYkMjlcSp426u8bF2/1AQnVHPyjJsnqfLcO80WwOi2UXsMh8WKC1jqzYu21CFbfGqrXegVPVejY/VI4Lwo5v+aAqbOnvFLHtZsCpCIcY0IEix5XPK+ZcKKVDBZ61dU6EKBPGYe4Uebgpq4PTanAlcAVeFNeX7SdcLJcGgmtri7cksg7U96dkVCRZ6r/M0X+kWau2Uk9X2RtKOWhDgvuptd2JQ4mNRmGNXmqfqnzkiZJdB6xuk7IPuVsMw7D/JiRAN9Dv1V/2Km7YkkED6HpL7DzCYJQ2f8kwSoIvwSs1HcBTFBQjfu+adIoyBbgWa13/qRPLlpOdo7uBJnDvoRyNffDL9ibLblA7yger/BPGPr4wXoGnmc+tp2nG64jHzJnuktuPCJ5sCp6Yhh6Z7g0m3RFXubZ4yXIE4f2jTbg4Haz3ULZJn3APK4XydqQx3Qgx48ircDILwayWFt3mxahrgDyasPSBpltZ3SrYtqTvZbBtiFn9h9543H01Pdg34hsnvDVhYxfNBS3TY1B42KUugW7VQ+ey2bnfDe/6FV0V7okOKPJsxJeUum4W5FsXLFtsUt6cK96XPGnmABWcWYBlRTuk/joYybaaHmSWXwEMwsJ8yeZwhjlflPXdWjjnHvsP64akQBHCseqiCZvoDkndXn4zqmcSWe0Sg4LFfhNWc9CwsekDQvkiAi9UiJEyOT1IpNSmHxVkh88SGu4RL1LngccErAgYEHAgoAFAQsCFgQsCFgQsCBgQcCCgAUBCwIWBCwIWJwELJgrpJv4XP6S/RDkDXPy2Kl7WZnR/Z7BTZMcagMfEQ5Z/5y1sVljl1X5eXV8X4486yb6LQmhGUIzhGYIzRCaITRDaIbQDKEZQjOEZgjNEJohNENohtAMPA+a+THs7eor5oX+6uS4MSYWrqJ/wil+lwvfDbG4szduuHOFkz/1ztVPSieartMTPCR4SPCQ4CHBQ4KHBA8JHhI8JHhI8JDgIcFDgocEDwkePjs8JGBBwIKABQELAhYELAhYELAgYEHAgoAFAQsCFgQsCFgQsHhxwOLV/9qJfktCaIbQDKEZQjOEZgjNEJohNENohtAMoRlCM4RmCM0QmiE082xo5sewt/ki2rcblCut0VLoj0+Ozom+UvY819207obrbujp03LfS2AwzTfPflJGQ9fxCKESQn2x25MQKiFUQqiEUPfaa0KohFAJoRJCJYRKCJUQKiHUnxKhErAgYEHAgoAFAQsCFgQsCFgQsCBgQcCCgAUBCwIWBCwIWLw4YPHqf/NFvyUhNENohtAMoRlCM4RmCM0QmiE0Q2iG0AyhGUIzhGYIzRCaeTY082PY+xKu45UPweNaCjOs0VJED6fugbG+WPc8l/607t2lv1KBZB62PoByly2TAzPQtEXBv71/j+Z5ELtSZN0L+5v7wtN1T6svZSh10x4o2zRHkS9MjdT+HJt2J3aXsOb7idkDxYUuDQ6kdD90S29PqBByz90fjoJrW8RhcRsvmhJ9occ51lVpZ7RMxXckwHBeRvV+V7Fzr/Hu4Wn0jPuaIuCvyeRmT6BZ2zWoZeixDlsAfhFxtWQd1g5nMcgHPhO+UGn74V1b54C4vbG5YIvbHOQDyFivRCJ91mFLpaK40267fph4F5oA8Qsu2jwSOuRicBMpVKo/6d4MriD9C7gHUm+FwoBbjBWz+uVhueN5JK4gtRCnw7qJWoZS/GtLcYFBujRf4URFMA9Nc13cFa3uzYA5DKdhwvrtxbuLt3qLFoO9NBjDnLtqV9hlr7H+L3khn7+GXDrGmQK+/n33Ai2LwliteVCQZzaidnVrlrYGvYuqRZvdZqsfnXkJT+925CN222bmbbJF/sRKi4xeeKfTHS40c7CuyNL+vcOWYYzpim02Mx7DnfS3W3xscB0upidiPvMxrufcj8FhK0hZxzYmDnvgfoIG6TB44FLg6PovD070l3G2ed60Ds3QBkeQFnVaa/IZ6bSwtJG3yV53XezkCx/uZTE0Pt8xf/YnbLv9DyUBByQ= +api: eJytVU1v20YQ/SvEnFqAEG2jJ56qNEkjpK0NR+3FMIwRORI3IXc3u0OhLMH/XswuKZO2FCBoTxK4bz72zZu3PTAePOQPcLvz5I64U7XiDh5TKMkXTllWRkMO74mLKmGHBSW7Ltm8XUEKxpJDAWxKyGEvkKcAedp1T6qEFCw6bIjJSY0eNDYEOURMAChJbpErSMHR11Y5KiFn11IKvqioQch7QN3d7kMG7qxk8OyUPsCQnr4ozXQgB8NjCqy4lm/b0O6mhEGAY/G9cQ3yVPprS65b1N5j7RfFSbeNMGQsaaaaGuIQggfSjELVsimhbo9tzZCHGJoHTa29j10M0q4jb4325KXazdWV/CzZ/9QWBXm/b+vkfgRDCoXRTJoDQdbWqgizyD57iem/RZ/ZfaaCF9d+gCM5L+VS8Ba1hxmRt1uqhUylD6f6M+6/mW6WZh0Y+8OU5P97mq2j/yPNvTE8SzM7nz4mUftRTG+6qKdhSOGnm5vXo/oLa1WGQSTvnDPue+ZknWwUq6iEkhhVLf8UU+NfA2pTLE6/a0uGk2zROZxL8zcTG4QhhcYfJPNLgU/Q38l7PAj7I+QyNJCRbOV0eK59dlZyr1h6xM2G8kxvZPfyNd5G+s4VmyAfttu7VwnjbBviyoirHYiDj3EFOWRm7pLZ8ToLVuazfrK0QdaH3HFyvNbVkEPFbH2eZUVt2nIVjWOFKkOr4KXTRlkmvwg06NFT0ToxZcm3vtt8pO4DYUkO8ofHOeCTCClKYwk7TQWt+khC0uiF65Yr49Q/cd6jJVYxSlhQem9C+GJlkjdYfCEt9j2tVQ5Xq+vV1aXLjAHJ+m4z7gMWYR+mPqKVpi/oOhEFKVATlgGYsPn5+UC6tMZzg3qW7+xrteisf97K8+iRMaa/ObM1qrAOob1+VMMDLNQgbFxLYFAEpPKKjc/cYwqV8Swhfb9DT3+6ehjkc3x+ZLCl8rirZw/QF+rmr9UR61YaCpI4olOCPh958aI/3I9b9mNy6YaTUHQ3rzl1c7pR8I9qUmE/Hq+Lguy82Vd2J82fVuvXd1sYhn8BBjnlqg== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch trace by ID. - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + anyOf + + + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + + spans + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + context + object + + required + + +
    + + +
    +
    +
    + + + + + + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + parent + object + +
    +
    + anyOf + + + + + + +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + context + object + + required + + +
    + + +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    + + +
    + + nodes + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + tree + object + + required + + +
    + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + node + object + + required + + +
    + + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`agent`, `workflow`, `chain`, `task`, + `tool`, `embedding`, `query`, `completion`, `chat`, `rerank`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + parent + object + +
    +
    + anyOf + + + + + +
    +
    +
    + +
    + + + time + object + + required + + +
    + + +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + exception + object + +
    +
    + anyOf + + + + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + stacktrace + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metrics + object + +
    +
    + anyOf +
    +
    +
    + +
    + + meta + object + +
    +
    + anyOf +
    +
    +
    + +
    + + refs + object + +
    +
    + anyOf +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + tree_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + otel + object + +
    +
    + anyOf + + + +
    + + kind + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + events + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + context + + object + + + required + + + +
    + + +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + nodes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    +
    + + +
    + + trees + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + tree + object + + required + + +
    + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + nodes + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + tree + object + + required + + +
    + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + node + object + + required + + +
    + + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`agent`, `workflow`, `chain`, + `task`, `tool`, `embedding`, `query`, `completion`, + `chat`, `rerank`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + parent + object + +
    +
    + anyOf + + + + + +
    +
    +
    + +
    + + + time + object + + required + + +
    + + +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + exception + object + +
    +
    + anyOf + + + + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + stacktrace + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metrics + object + +
    +
    + anyOf +
    +
    +
    + +
    + + meta + object + +
    +
    + anyOf +
    +
    +
    + +
    + + refs + object + +
    +
    + anyOf +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + tree_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + otel + object + +
    +
    + anyOf + + + +
    + + kind + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + events + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + context + + + object + + + + required + + + +
    + + +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + nodes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    +
    + + +
    + + roots + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + trees + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + tree + object + + required + + +
    + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + nodes + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + + +
    + + lifecycle + + object + + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + tree + object + + required + + +
    + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + node + object + + required + + +
    + + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`agent`, `workflow`, + `chain`, `task`, `tool`, `embedding`, `query`, + `completion`, `chat`, `rerank`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + parent + + object + + +
    +
    + anyOf + + + + + +
    +
    +
    + +
    + + + time + object + + required + + +
    + + +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + exception + + object + + +
    +
    + anyOf + + + + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + stacktrace + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + data + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + metrics + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + meta + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + refs + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + tree_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + otel + + object + + +
    +
    + anyOf + + + +
    + + kind + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + events + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + + anyOf + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + context + + + object + + + + required + + + +
    + + +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + + anyOf + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + nodes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-trace.api.mdx b/docs/docs/reference/api/fetch-trace.api.mdx index d3e2370e53..a1038a8bf0 100644 --- a/docs/docs/reference/api/fetch-trace.api.mdx +++ b/docs/docs/reference/api/fetch-trace.api.mdx @@ -5,67 +5,900 @@ description: "Fetch Trace" sidebar_label: "Fetch Trace" hide_title: true hide_table_of_contents: true -api: eJztXFFv4jgQ/itonm6lbOmt7omn49r0yrULCOi+VBUyyUC8OE7WdtrlUP77yXYSEmgLtN29ruQnwJnxjGc+jyefkNegyEJC5xYmggSUL+DOgyRFQRRNeC+EDsxRBdFUCRIgeJASQWJUKLTSGjiJETpgnk5pCB5QDh1IiYrAA4HfMiowhI4SGXoggwhjAp01qFWq9aQS2qYHiiqmB7QX2OqFkOd3Wl+mCZcotcqn01P9EaIMBE21e9CBcRYEKOU8Y61RIQweBAlXyJUWJ2nKaGBW0/4qtc665kYq9FoVtRaCJLNKhXeUK1ygqLl3ZiQ8CHFOMqagc5p7IFPCjT7hq8HchIUqjOUjBgQSheGUqKb4djTmiYi1DIRE4UdFY4Tcq8R4xhjo8FRe2WlbXQW5B1ka/ggjN3bawkiIDH+AkXM7bWGkDNdspaF1mJ0so+FBwfprZWC2idebWimjVVkpA/amVspwVVaqfXjQFrPQ3SM+TgkvpFMikKs9/j/n79BM0PDVij4XDuRZrAsU5feJ3cjgAeE8UeWPjC958sDhbmuREz3Trj/lug83TRZotn0QEaoNPiRiOWfJgw4TkUv9kSRMK8QzDEOr/C1DsQIPGItNSYpThoXDQUSUKY+C8OXjC9Bh3+P/kvI9SCr9Hw+7/elVr38+vemPh/5Z76Lnn4NXG+/1J/6o371uDI790Rd/1Bg6u+75/UljaDganN+cbcsN+uObz/6ovqTBBJle1pX2++ll2SPlZQAzYO0TU2VAKiLU1NScV9So8hB41qy21JpYTUAe/hSrPg8rm1IRlclpkIQHQno86U5uxtOzwbmvQeGbnNbGBldbA/5oNNhNpzF7pq0+nlDrVoxSksXLs2pmaX0uZsk9IEoJOssUbp27JAyp3mOEDRsH7wFWH414PGuOzJKEIeFm6HFbEFARZIyI3y4yxv6RCf84yFSaqQ+6SthZktlXDJSZpGgUDtEiQpDVs3Ha0jVFdsfiU8rdTUhzXZrmKJAH2+F7orG5RyGpba5ekuAvhbpGDMsWL8aJ1s09eLsD1p5UDm0/FG07is0aMyqhWLOw37vRBsC5B4zy5WFIPq4jOrbfckj62UjavILeVrmt5W3rPLumfHkUzK4NsHIPIiKjA4ulK0+/OqjqkLkkMjoKMpcWKbpR/B5gQWS4vL1J3vwqojq898jVYVuyfOd4qoaXrxS6TZeKxOmb9Pb199VqYreh/+dTwmChnuqtM8LXsDpqx/sWiPsM10jU8qTaMn3BiNLdx1HWx4aeLJuVAyG12xQdjcVXT7GBTckcfIDHQFV7uhWVu6MwUgXK0bSOpnU0raNpHU3raFpH0zqa9r02so6mdTzIu+FBHE3rkORoWlee3hGoHE37TvPmaFoHjNeeEu+Ypi0o2mebF8eFOi7UcaGOC3VcqONCHRfquFDXLTou1JENvwraHBfqkOS4UFeefh1QOS70nebNcaEOGK89Jd4/F/oWZOSeqmakJgLxuDBP7L9i981eXI9QXTKQ51rjj0+fYOdOgi+E0dAQPS1fiES8/EKCEBWhzBzAjxcBlgSNp8dsq7vtrNRahJK1yj2I5eK5MlN7wy3JqadETTBaliHagyu9Lmu6kKu/eVXhtdF9ehnnNnzPpfZyMhnuTGhz20zqhb4FozUpbsGIUUWJvhxjgcpciqEi6EA7FXhP8aGtLFja9h/X7XW5TXK9T1Dcl7dnZIJBByKlUtlptwOWZOGJIe7ICaFtklKDVIlBJqhaGZXusHeFq0skIQro3N7VBcYaRhYYTbEqJySlV6hDVNzb0c1UlAj6b0lLmss7IqulY0D5PDHqZU0yzrW6wx54mzdoOD35/eQUtkPWENY7gARqc3IVjzWV2IhCtX7DTRr4g0IS/7l5oD1LE6liwmvzNTPUcKVav8Lvqp0yTYnmheF1kb1bKLJX9NoFdm118PQNJpv+O0qk0hrr9YxIvBEsz/WwpU87t3ce3BNByUzH7HYNIZX6ewidOWESd5yrqgP8Nio2wYfW5pxpOl1mkus03hOW6V/gwRJX9YtYzPaOSpisi8fdQDcbNcWdaqTxVKH7b38Cef4fELbnuA== +api: eJztWktv2zgQ/ivGnFpAjbPBnnRa11a23qS2YSu5GIFBSxObjUSpJJWu19B/X5DU2684TfYB6BSHGs4Mv/lmyAG5BUlWAuw5uJx4lK3gwYIoRk4kjdjQBxseUXrrheTEQ7AgJpyEKJGrSVtgJESwQX9dUB8soAxsiIlcgwUcvyeUow+25AlaILw1hgTsLRC2GT9qDXITKw1CcmU9tYoRyiSukEP6YIGkMlBjyknsDH1I1ShHEUdMoFAary4v1R8fhcdprLwHG2aJ56EQj0nQmWbCYIEXMYlMaj/iOKCeXmz3m1BzthUvY66gkNRYeEYuqBGpO136d5+JpMpIYkw0llMK97VEakEU+CjkMVgseIx4SCTY4BOJnyQNsYoVS4KgBtTYqEwtYPjjrZWPjMrUAhETJvbqJpyTzVEtMz03tQx5GlqI71MVFBJMajGoR2SP+UMTS4mfVgEe5V4SEP5h7GKglvERrC1QiaEAe+/XBioPaTESLb+hJ18GlMeRSPQX5G3D2TdqOz0d0iT238PInVGbGfExwHcwMjBqMyM5XMuNqkwvs5Mk1H8RWJ83ugyVeL2plRytwkoO2JtayeEqrBRl/EiJK0uwSf8T4oq8mXRMODJ5wv9j/k60gqrtJ8pOoIEsCVXOzia90eJmOBos7kazidMfXg+dAViV8eHIdaaj3m1tcOZM751pbah/O3RGbm1oMh0P7vpNufFodvfVmUK1LGcl4Ub5vbvUfFlmV30dSBrwEdGZAkISLhc6b34iz4qd+JhZZanjmpmAzP9HrDrML2wKSWQiFl7knzBbUMLtuXezRX88cBQpHB3Tytj4pjHgTKfj3XBqs31ldX9AjVshCkFWr4+q1tL5mmlJLSBScrpM5Et3znNOXFVHwmV9ZBlFARKmh/bbKnfA6yQI/hAR+zROZJzIykZY2fZ29s3Ds04fKhpz4ayNtldCqjj8jEw2oMt8bR4i8nw9VATzdFQUF5KE8ZvkRfVcXChumfHezNiZWO1z5oYL1VA36oWjaFWxftpzxxAxtSCg7OlljDxvZz53328Z9m8yLI9tJW4Njt1S9nQWxW41sU4ZrnT5uQ97zjZVYNtuq+222m6r7bbabqvtttpuqz3xtN1Wy4y222q7rf8Rw/773dZbtDt7fGlaEi5HPA9m19zsnVppfrGaX5o2lpndTBcXuGmqFP56dbV733tPAurr29yOw3nEX3/Z66MkNFC/DuR8EHm1r2fdaDeDVuFGZBxUQIdidaxGVI4nRuSwqAaj46qvp4Kh1mVMZ3KVaJTwGnQPL2Ng4DvGqy+uO9lRaGJbD+q1eoDQcbMHCCHKdaTeJaxQ6vcIcg02dGOOzxR/dKUhS9dcKne3eRalKo2QP+cPFxIegA1rKWNhd7teECX+BVkhk+SC0C6JKTTd6Omvnb4S1SwX6CWcyo3W15sMb3DzBYmPHOz5Q1VgpjhmWFMXK2/LY3qDCr/sPUUvkeuI078MFbJHFWszSwFE2WOkp+f1zPj2mXhPyFTFKN4qwOXFLxeXhxaTTej0JsMsVYgnyzNWJgZWA64CKHW+D3WegEQS/lZ+UF7GkZAhYRV99VDWXCqwkPin7MYBoToHtOFtFuY5ZGHOqnFGclNlLPXKpKzQ60i9epjDdrskAu94kKZq+HuCXEXswYJnwilZKvzmW/CpUL99sB9JIHDHuaKMwIdpli0fO+V+VXc6jypTIX0mQaL+AwuecFN9LKPrwDqnzDb73PM8jGVl4k7ZUtwq0uB3x4U0/RsjoCRz sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Trace - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + oldest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + newest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, + `SPAN_KIND_SERVER`, `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, + `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, + `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-usage.api.mdx b/docs/docs/reference/api/fetch-usage.api.mdx index b08828674c..ca33031b4a 100644 --- a/docs/docs/reference/api/fetch-usage.api.mdx +++ b/docs/docs/reference/api/fetch-usage.api.mdx @@ -5,59 +5,69 @@ description: "Fetch Usage User Route" sidebar_label: "Fetch Usage User Route" hide_title: true hide_table_of_contents: true -api: eJx1Uk2PmzAQ/Svona2Q9sipqdSPaC+r3eYUoWriTMAtYNceolLEf68GknQTqVwQzHvj9+ERQlVCscdH1zSuq1Aa+MCRxPlue0SBE4utv/eJKoZB5BR8lzihGPF+vdbXkZONLigDBV57azmlU99kLxcwDKzvhDtROIXQODsfkP9IyhmRbM0toRgnfczDys8qIduphGyXOGYvvhfd2rLUXkVWLDAIJDUK5IfFS34VnTieOarNEX1sUKAWCanIc9v4/riiijuhFbmcgsNUKsP20ckwUzbP2ycevjIdOaLYl28Bryp8SeMeNkKGwChAwT3xAIOOWv3e9FL76P7MAcDAqcN6Yal11538THfSzPhZXLZ53sJAbSyZrFfvVms8JnUH1szJzplfz57HMA8p3PzDgFtyOhOm9sO/gSoLPklL3Zt9/y3mTtUtCuHfkoeGXIfpomG8lLbHpTQVN9dWGtQ+iY7G8UCJd7GZJv39q+eozZQGZ4qODprTvpzMNUYt7ScPathaDno1ztT0SxsPl0/LvF2jL5++YZr+Au0pCyo= +api: eJx1kkFvm0AQhf8KeueVcXvkVKdqUyuXKKlPFqrG6zFsA7vb3cUqRfz3agA7iaVwQTBvZr95bwckqiKKPe5M0xhboVRwngMl4+z2iAInTrr+1UWqGAqBo3c2ckQx4PN6La8jRx2Mlw4UeO605hhPXZM9LWIoaGcT2yRy8r4xejog/x2lZ0DUNbeEYhjlUTcjvwtCthOEbBc5ZE+uSzK15VQ7gaw4QcFTqlEgP8y75BfoyOHMQdYc0IUGBeqUfCzyXDeuO66oYptoRSYnb3B7+maqZl9FirGUcboLJvXTvM3j9oH7H0xHDij25VvBs2w1W/VeNiD1nlGAvHngHgqWWvnedKl2wfyb3IGCEYB67hJfjD25qd2khl/Z7ki/sD1CQfacsderT6v1R8ssDdnmcbuEQ3oK58IxyaBu7LoaBQVuyUgtMbVfXgtC6V1MLdk38z5M8B3d1ZbEf1PuGzIW48IwLOnusaQrcFO+pULtYpLSMBwo8i404yi//3QcJKVS4UzB0EE825ejulgqAb5wLwtrzV7u0Jmabk7m5pZKsNf7dv/tJ8bxP0g6Gbk= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Fetch Usage User Route - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-user-profile.api.mdx b/docs/docs/reference/api/fetch-user-profile.api.mdx index 8092308b24..84dcae3422 100644 --- a/docs/docs/reference/api/fetch-user-profile.api.mdx +++ b/docs/docs/reference/api/fetch-user-profile.api.mdx @@ -5,59 +5,69 @@ description: "User Profile" sidebar_label: "User Profile" hide_title: true hide_table_of_contents: true -api: eJxdUk1v2zAM/SvBOwtxuqNOzWFYg16CtT0FRsEqTK3NtlSJDuoZ/u8DnY829kWw+Ci+Dw4IkROJD+1mD4sDi6teu8zpNaZw8DXDIHGOoc2cYQf8WK302HN2yUdthMVT5xznfOjqxe8zGAYutMKtKJxirL2b5hR/svYMyK7ihmCHUT8ze/Ilc1psrxwalioow3cWGESSChbFF8nM6cgpw+4GdKmGRSUSsy0KV4duv6R3boWW5AuKHmOpHa5LXvqpZb3dPHL/wLTnBLsrvwOelOhJ/S1sgPSRYUHRP3IPg5Ya/V93UoXk/02CYeBVUXXqUqm+PYSp3Us94Sdyi/V2AwOVcfJgtbxbrjB35gasHpObPL7MnsowMxeu+mHADXmtCVNz/1VQZjFkaaj99t4siBsuVwOEP6WINfkW43nycA5ph0tIpUEVsujVMLxR5pdUj6Nef3ScNIfS4EjJ05u6sitHczFNI/rLvcpzjqOuwJHq7uT9bLU0uuu6/Pr5jHH8D6yG/Jw= +api: eJx1UsFu2zAM/ZXgnYU421GnZcOwBb0E7XoKjIKVmVqrLamSHMwz/O8DHSdpDUwXQeIj+fgeB/jAkbL1bldB48jZ1E9d4vgUoj/ahqEQOQXvEifoAZ83G7kqTibaIInQeOiM4ZSOXbO6n8FQMN5ldlngFEJjzdSn+J0kZ0AyNbcEPYxy1KLkY+K42l85tJxrLwxfOEMhUK6hUdxIJo4njgn6MKCLDTTqnEPSRWEa31VremGXaU22oGCx7LadoqtvAsVYSjnTRZv7qd52v7vj/idTxRH6UL4HPMgUZ2k+wgbkPjA0KNg77qHgqJX3tsu1j/bvpAYUrBCoz1mig3VHP6Xb3PCN21cyr+wqKMicZ9qb9af15n/DzAmr7X43m0FmMuPCY4JBLeS6CgUFbslKLDO1X24BYRl8yi25d/UWjn3gdBUj859chIaswzh3HmY3D7i4WSrUPmX5GoZnSvwYm3GU77eOo3hSKpwoWnoWhQ7lqC4Cil2v3Mt4xnCQXTlR0519WOyg2Hjdqx/ff2Ec/wGdpws6 sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + User Profile - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-workflow-revision.api.mdx b/docs/docs/reference/api/fetch-workflow-revision.api.mdx index fbb8267e0a..2989530282 100644 --- a/docs/docs/reference/api/fetch-workflow-revision.api.mdx +++ b/docs/docs/reference/api/fetch-workflow-revision.api.mdx @@ -5,67 +5,2193 @@ description: "Fetch Workflow Revision" sidebar_label: "Fetch Workflow Revision" hide_title: true hide_table_of_contents: true -api: eJzNWNtu20YQ/RVhnhKAsVyjT3yq60vtJk0M3/pgCMaIHEqbLLnMXpyqAv+92JskipIqKTLgJ184c2bnzOzO7pmCxpGC9An+FvJbwcUPBYMERE0SNRPVdQ4pFKSz8fOPYPAs6YUpJipIoEaJJWmSFmIKFZYEKXQsn1kOCbAKUqhRjyEBSd8Nk5RDqqWhBFQ2phIhnYKe1BZDacmqESRQCFmihhSMcSiaaW4N4np7tyFI7zqHphlYbFWLSpGycCfHx/ZHTiqTrLYpQQp3JstIqcLw3m0whgQyUWmqtDXHuuYscwz0vyrrM11YYi0tP5r5CJkw3imsnFWaRiQXlnrmLBLIqUDDNaTHTdIlycWtJl8KR2U7xsz4BSXDSltCW+abWWuSmUVlOAfLUofHRw/taEzg8IHa+LOMXiETHwGlZgVmh0zhNEDGCEaPhTwYuEdrEshR05ao1vSDZiVthD63gE0CJSmFo43Ym2D+Cu5NAgV3x8b6jmXqOTNKi3JlsKEQnLDaGO1a9c48QpNYOHpBblCvIXxLxIsZiAcdmxKrnwG8cgBNk0QjMfxKmV5xUF06yrpwri4a24vAPGf29EF+06J1i7LF86cVqRy2/7OY3epYkDGZGY7y3aXh/E8lqg9fjK6Nfg/LuVoQpqnc0gulxMlGXpd8ocPu5i7V6Dw6HfqWSP0sPjGl/5fWdUl23Hfj6N63YhjY+50Gn9GdOu3Ruh/U+QJEk0AmCTXlz6gPegqeedjeqSPL1PlrBHnwsCFITpxeIci5hw1BIl3DyQFHXSTr90kYdpGvg0aJbM2iRMIOGiXSNYvyQrJ749q+XR+De5OA4ma0L8yd9bVj6GCJBg5xeZq0R/PhsjeS7YvyIJlH4PsjcIswJszd+2O3k/61KHl7DbHhanJLBUmqstZpExc62GmiXIUyNPEtt21F3tBMfpMXnR1qcBeItzdKrGtWbXsBWqZ4l9tWDOQKb4f43t3vvZu2qvBW729vslfWO9/MKbWFIvnCMtqGXS/P7NCDAbpxekrBRsYLSa8R66wVYJs3WNSKztG9ETpPsR0gftJ9pjs1jXX79eSkK1M9Ime5S653IaWQ+2tUOWlkbtKGllw24CJrfd1lSy0MCt/F86w/iQzjrb5Uo1X63gpxwZusN3Vk9O7t11WUz7XFJ5eXDx3sWoJUpNezuz6Nc0/fpvpe3d/fdAB9bdtFvbRiaq+jXoJTAcbC6q0j0k5b1WNIoV9bgZB+9KNipvpRMVT96SqptQG/w6Mq6+5YMNa6Vmm/n3Fh8iMcUaXxCFkfa+Y2laLMSKYnzuX05vojTfxMh/RpsGjgpozvmrbZrGBYs49k+Qt6sFe22L++FYIQ7O9tjlNWFcK5RyXMLa53enMNC3d1OD765egYlvlsGdvtgZnbHjG2+wzJEguz/CEBKt3eAE1Y/jb/YFdWC6WDQBTw1pdv6R0cuND0j+7XHFm1cN31pX2CUFqYy6HK9W8oLySQrtTSBwmMhdIWYjodoqIHyZvG/vu7IWlLOAgK7tAS+jSFnCn7ew5pgVxRZ7WzcwXe3Ybt8743n07tLGKZK1tjK6jZvyCBbzRZp/67Q2Ic+2kaTE+zjGq9ANI502zjzfbFHxf30DT/AXsQfZM= +api: eJy1VlFv0zAQ/ivVPafL6LYCeaKDARMgpjLgoaom17kkZo4dbGdbifLf0dlpmm4rIAR9aB3nu8vdd5+/pgHHcgvJAr5qc51JfWthGYGu0DAntDpPIYEMHS+ubjvAlcEbYYVWEIHB7zVad6rTNSQNcK0cKkdLVlVScJ8j/ma1oj3LCywZrSpDT3ACLV3dMCOYclcGMx+q1h8zSBYNuHWFkIBefUPuIAInnKSNOWZoUHGENupRqpYS2mVLVYUC/1HCNtobR41f7aOnbVtfjK20sqHTyeEh/aRouREVkQMJfKo5R2uzWo7mHRiiv+WS6zoEdSUL5TBHM6j5pUcMaPozijb6mPft/RFTpBBhMCWJhdqW+3P27QfqjieTh2x9YVKknovRmTHa/D1VKTomJK2Ew9I+BEjNd+4+IMk6I1Q+ZGJDt9dht8eMYesBk+91KJBmUNp8MKwu3xb6Aa1lOamyg+yHejJGl3T3d3OgvsKjO9xgJFt6A7v723gV6PvV8Xh7eXnxIGGY7e5QX9MRGm3kMJpvHaZEV2gyoRwpc8VcAQnEFYkXb+MVsxhvjp6NN5K2cdObgEhbiMCiuUFj/fRqIyGBwrnKJnHMpa7TA5ajcuyAiZhVAu7XN/N3Ry8JCu2S0vHaCLf2+WYX5+9w/RZZigaSxXII+ETiC3LahfWTZJV4h0SsYiVdz2pXaCN+BI1EIKiAIkQRcyTr+dZ3z+5YWUl8xEcF0XaUsWcn2fR4fPL0ydPx8cl0Ml4dZXw84c+nR9l0yjI2JXpknQ9VRVyF1vst5pwRq9r5ZtpHbPb/Pq8lJjLtievk1U3llPFrVOlOlsODJweH+8bYBYxmF+edezDu3WMzAQ+D6J5QeolABFh66wCHrHyxvUFVVtq6kqlBvv3q3imvV4TDOxdXkglvEb6IplP+AjrlQwSkfYigVz9sR0LrZHAC6IQX2jpK0DQU+NnItqXt7zUakvEyCvpZEbULsq9iI+gGrnHt/zm8z469yRBc1kHA9zyX/DBEzDjHyv0Suxyc8Tdnl9RX9zZR6pRCDKNm6TsBoFcT5xtMmrDXgGQqr8klEwgp6fMThXcJJQ== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Workflow Revision - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+
+
+
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + revision_ref + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-workflow-variant.api.mdx b/docs/docs/reference/api/fetch-workflow-variant.api.mdx index 31c2b0ce2d..0cf3dd4cab 100644 --- a/docs/docs/reference/api/fetch-workflow-variant.api.mdx +++ b/docs/docs/reference/api/fetch-workflow-variant.api.mdx @@ -5,67 +5,1008 @@ description: "Fetch Workflow Variant" sidebar_label: "Fetch Workflow Variant" hide_title: true hide_table_of_contents: true -api: eJzNV01z2zgM/SsenNoZNnYze9JpvfnYZNvdZhq3e8h4MrAEW2wpUSXBZF2P/vsOKcq2LDtN03Smp3wIeA94AEFwBYwLC8kN/KvN57nS9xamAnRFBlnq8jKDBObEaX57Hw1u79BILBkEVGiwICbjEVZQYkGQwK7hrcxAgCwhgQo5BwGGvjhpKIOEjSMBNs2pQEhWwMvKQ1g2slyAgLk2BTIk4FxAYcnKG7TRDj42HIPLDOp66qFtpUtL1qMdj0b+R0Y2NbLy+UAC1y5Nydq5U4P30RgEpLpkKtmbY1UpmYb0h5+s91ltRVgZLw7LhiHVrnGKgcuSaUFmK9KTYCEgozk6xZCMatGTKNCWy3fzoGOXYm0rs67Zw1rVYm1ROqXAi9NTz6smAA3LOab8jAzjCBkZ5ip02eEkpb1NnWVd7A1gprUiLB9kvLSDkwahFh6O7lA5ZG1+BPFsDdKA5q7A8kcALwJAXYvWSM8+Ucp7Ovs8SNaHqwUUxNgNArNM+n5FddWR9VApt2Dbju0wFbPuf7az288FqTSpU2henDul/rK6fPXOceX4Jezm6kEkU/FILzQGlw/quuMLPXUfcv7bi+k9eh36K4n6j34rLX9T1kNJ9ty/T6NJ04pxwD9KgX4I3rcW3WH8NKjTLYhaQGoImbJb5EdOrwyZXrEM8RxmOWlgB+Mglquyn0HyoYGNJBkp+gkkpw1sJGnlmi2fcd63Yv2xjBO/1etZWVq11iytYM/K0sq1ZrHKLZ7aq9fe118ezxZe2HS+fX/ExWjfDfJ47/WCVNfe67fj4/4+9RGVzMK2NDgzRpunL1MZMUoV1oHmetg1UDrtfP2eSTytd26UTdJvdROgr1NhF/v20M1tYS0uaDM+D5sGMQYT/3Wf4psd+Cbk1VBHu61yb+Rt1D2cxmkj30PlvZhMrnqATW27RT33K/9gd8uGsHvk2j8KFtS8ADiHBIaVoTtJ98N2WbXDuNna4WrPe6AGAZbMXftycEZBAjlzZZPhMFXaZUe4oJLxCOUQKxlOgKXUGcnL4DK+unxDywvCjAwkN9Ntg2vfYE3LdM3W1cJKviEvXnyzjB3n2sivTR/E10reeHl1ZDnXwb3db0Nwg/HVJQjwaTSyjY5eH41gV8yOsT8bmIaz0XKHzyB2VFjnDwKoCAcDmLD4ffPBR1Zpy3EpjXgHa7dz9UYpmP7jYaVQhv4PMaxiXW8g1hU2TxbrE461BQHJvtfeVECuLXuA1WqGlj4YVdf+318cGV+/aQSZeTVvVpBJ63/PIJmjstSLdT1R4MX7eHBeDjYrUDeHtsblMsSqnP8LBHym5YHnaZgOedtLq2g5TlOqeAujN8x8061PxJ9nE6jr/wGy1UCI +api: eJydVcFu2zAM/RWDpw0Q4qzYyadlXbcG3bCi67pDYBSqzMRqbUmV5HaZ4X8fKMuO0zQYsFOU6JF6fORjWvB84yBbwS9tH9aVfnaQM9AGLfdSq2UBGazRi/L2OQJun7iVXHlgYLjlNXq0lKEFxWuEDOL9rSyAgVSQgeG+BAYWHxtpsYDM2wYZOFFizSFrwW8NRTpvpdoAg7W2NfeQQdOELF76igA3fepkWUDX5ZTRGa0cOkpyMp/TR4FOWGmIPWTwoxECnVs3VXIVwcBAaOVReYJzYyopQrHpvaOYdkLMWJLCy/4FoZs+KPKVyuMG7YTgaUB0bBAhvKC239dBoBim7+5R+EnUoH0sDzo2YlVTVdDlXccOondyriKz/GjKsfauo1TvT04OpbrhlSyCEMmZtdr+v04Fei4rOkmPtTsEVFrs3R5IFCdhIsSgdZfvpODW8u1Ex6+6J0gNqN3mtckaoN/QOb5BGJMdhwYxkmu6/VcbqK7+6YjLp7M7yNure7yMT718rz02QM6vry8PEva93W/qZ/JuMkxDcjN6t0ZfanL3Bnsr+xIySI3FJ4nP6R13mA6Wd2kcZ5e2O3d3wMChfRrs39gKMii9Ny5LU1HpppjxDSrPZ1ym3Eh4SW4RbpNTggL52aForPTbkG9xubzA7TnyAi1kq3wK+EGT18/SPmxsIzfyAknVuJUWjS+1lX/6AYmLqeyjSDap1jqER4Ujt49cPKCiHUR19rTns3ez+bFiYkCyuFxGA3ERDDTwCDBgL+QahQIGWAf3gEdef9hdEEujna+5muQ72uA9dqMsHn/71FRcBpMEDm1s/gpi84EBtR8YjAMA40ajYzZZ8TmDUjtP4W1LYT9t1XX082ODljqZx9g70nXVQiEdnQvI1rxyeMB0XDrw5ip6620C7PUKhm6rbaBYNfQNGDzgdv+vKOyNchimNgIWQqDxk9CDNUdTN3rly9k1dN1fcHR4xA== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Workflow Variant - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fetch-workflow.api.mdx b/docs/docs/reference/api/fetch-workflow.api.mdx index 68dfcd4d87..dae5d8732d 100644 --- a/docs/docs/reference/api/fetch-workflow.api.mdx +++ b/docs/docs/reference/api/fetch-workflow.api.mdx @@ -5,67 +5,598 @@ description: "Fetch Workflow" sidebar_label: "Fetch Workflow" hide_title: true hide_table_of_contents: true -api: eJzNV01v20gM/SsGTy0wjd1gTzqtNx8bb7vboHG3B8MIxhJtTTvSqDOcZF1D/33BkWRLlp2maQr0ZFtDPpKP1PB5AyRXDqIZfDT281KbewdzAaZAK0mZfJJABEukOL29rw1AQCGtzJDQsucGcpkhRNAY3KoEBKgcIigkpSDA4hevLCYQkfUowMUpZhKiDdC6YFdHVuUrELA0NpMEEXgfUEiRZoMmu8EkgbKcM6QrTO7QMcrpaMQfCbrYqoLzhghufByjc0uvB+9rYxAQm5wwJzaXRaFVHMocfnLss2llVlgmgVQVITa+cqoTVjnhCm0rw7NgISDBpfSaIBqVYktJCJev3y0DX13opQ4dOG6g3G3sHZmsa1RnsjBGo8yhFNtHudcamKQmt4kbnFUIpWA4vJPaSzL2RxAvtiAVaOozmf8I4FUAKEvRGJnFJ4zpwBRcBsr6cKWADEl2k5BJorjHUl93aO2lWQ9hC7bpcidStug+aVd3OBbEysZeS/vi0mv9lzP5q3eeCk8vYb9WBlGE2SO9pLVy/SCve77QY/ch57+ZTPboTeivROo/5q1y9E1ajxXZc/8+jqbVKNaX4KMY6KfAvqXoXmBPgzpvQZQCYouSMLmV9BBg695NJOErUiGf41HOKtjBOJDli+RnBPlQwdZBEtT4E4KcV7B1kIauxZqX2OPihE31GLL+WIfttePrWaM0bG2jNIQ9a5SGrm0Up/3qqbN6w768PJ4tvaAOvr0/Dq2OR7htZURZsvlvp6d91fGv1CoJmmJwYa2xT5ccCZJUOgiAaiHsG2gTd06/5+6dl3s7ZFftW1MlyJ3J3OqQStvtB+fkCncX5nHTQMZgyqeHqN4pxFmoqwpd27UavKO3Yvd4GecVfQ/19Wo6ve4BVr3tNvWSBfDg404AZ0ipYWm8Qgp6mFKIYFhYvFN4P2xknxtuWqK4BAEO7V0jm73VEEFKVLhoOIy18cmJXGFO8kSqoSxUGG2HsbeK1sFlfD15g+srlAlaiGbztsENz1E1GV2zbVNkod4gc1QL9rGn1Fj1tWp3LdnTyotJUPnSBPear3FIbjC+noAALqNiZ3Ty+mQE+5x1jPkVkHF4BZrY4RjEHgvb+kEAZmH+gVBmv+8OOLPCOKrVZo3Xa9HeLq0pIPyPhoWWKox3iL2p2zeDun2w0+0OBETt/zVzAalxxNabzUI6/GB1WfLjLx4tN2ku4E5aJRdM2WwDiXL8PYFoKbXDXmLb2wFevK9fgpeDnYDpJtw0Mucusv7mXyDgM673/oCFNzxtBmVTW4zjGAtq+fYuJJ6o7XT/eTGFsvwfCqXUMw== +api: eJydVU1v2zAM/SsGTxsgxFmxk0/Lum4NumFFm62HIChUmY7VypYr0ekyw/+9oL/i1C0G7JQgeiQfH/mYCkhuPURruLHuITH2ycNGgC3QSdI2X8YQQYKk0tunDgACCulkhoSOIyvIZYYQgXSkE6noVscgQOcQwWOJbg8CHD6W2mEMEbkSBXiVYiYhqoD2Bcd6cjrfgoDEukwSRFCWTRrSZBiw6JIHyxjqesMpfWFzj56znMzn/BGjV04XTBwiuC6VQu+T0gRXHRgEKJsT5sRwWRRGq6bP8N5zTDViVjhWgXRbQdmyDeoI65xwi27E8LRB1AIGobhEvv+ZNCJ1cfbuHhWNwnrd+wahFgM4L42BelPXYhJ+UHTdcdtMcw5t1zXn+HhyMlXptzQ6bjQIzpyz7v8lipGkNvxNE2Z+CjBWHb1OxOm2YKRAL3O9OWggnZP7kYLfbUuQtc/89rWt6qE/0Hu5RRiSvQ1txAhW/Pov/bmvtnSHG43iIG+r7tttfGnle61YDzlfrS4nCdvZHg/1Kzs2uDk4NkNKLXt5i9QYmFKIICwc7jQ+hXfSY9jvrQ+r/uutjmsQ4NHterOXzkAEKVHhozBUxpbxTG4xJzmTOpSFhpdkFs1rcMpQYOt6VKXTtG/yLS6XF7g/Rxmjg2i9GQOuedPa3TmGDWOThb5AVrG7QYuSUuv033YhuiuUtlEsk84T24T3Z6Xl9lmqB8z53nCfLe357MNs/lYzXUCwuFx2hmHrRsMtbGEgXsg1CAUCMGvcAoQy+3R4YJaF9ZTJfJRvMtAjVoMchH8oLIzUjRma2lU37DV0wwYBPG44HCoPAqLRyHl/U+uJg6qKwb+cqWv+uT3oPLdYe3ln2ACJNB4njIYjAu+uOq+8D0C8zvQB95M/kJ00JSObldlJp7lcsyGinyjzaEMXSmFBo6jJ4eIsgwu+na2grp8BUd9kyQ== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fetch Workflow - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + workflow + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fork-evaluator-variant.api.mdx b/docs/docs/reference/api/fork-evaluator-variant.api.mdx deleted file mode 100644 index a719f0cc59..0000000000 --- a/docs/docs/reference/api/fork-evaluator-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: fork-evaluator-variant -title: "Fork Evaluator Variant" -description: "Fork Evaluator Variant" -sidebar_label: "Fork Evaluator Variant" -hide_title: true -hide_table_of_contents: true -api: eJztXFlv2zgQ/ivGPLWAHKdpm+76adOkRbO9giTtPgSBQUuUzYY6SlJpvYH++4KHDupwZNdeOKn6kEISZ4b8hhp+nBF9BwLNOIyv4M0togkSEeNw7UAUY4YEicJTD8bgR+xmgrMGk1vECAoFOBAjhgIsMJMq7iBEAYYx1FpOiAcOkBDG8D3BbAEOMPw9IQx7MBYswQ5wd44DBOM7EItYKuGCkXAGjjQeIAFjSBKlRhBBZYO8w4Ov2srg1IM0vda6MRevI28hFVZNuVEocCjkIxTHlLhqoKNvPArlvaInMZMwCIK5vMpHteTRhOFbwolWhMLFZ1/hYrf2qYK8vQHhEzfhIgrsRgaYaRRRjEJInfxWmFAKcuQZNqd8cKw1pI5UZ/V9XY054EbpPAlQ+CsK3ykFaepkjaLpN+yKJh+/VZjV9aUOBFgguxfI84h0KaJnFq61fpo5VlJLQoFnmNmWgql9pzy8ZlvgEuYmFLEnbxNK/+ZRODwN40Q8hepYpQ4icNBNCDGGFkthtUWhhu0y2Y8SSSlRm5+7hOin6APh4j5M28ZYlV4NoUs9C02g6zT+eg+kbOqAh7nLSCxq0aK7qpOSitQBTpPZuqoupKzsFaq+TXZsusWsHt+6m/lqxFMHEkbW1fKFEa2Brq+BSg1zjDy1eK022bcFySYcSLxlGqrL6dII7S2NzefYxwyHLi4ryTp6vdJr9c64Ic14QFeP7FBY2r1Av4IDLgzqcjlFcUzCrgtAFd9VVpvMkPK6DGNrT30tndp8dFfXr92bKO2yZwWe0kuY3RIXd4FWM+0VJqBRnSp67pNZorcf27B1bBnoRD/PDa0/QYohNbJQztFsbVLw0Yiv1Ju3Ebtp7s2a25DOr0kDwV8v8me8vmfxPYvvWfwWWfwu+f4hvU0m4v8f8f3+sF7PM002R/eLfFrWEZVQc+BHxG58Gv3YhtF/jO6qzXqysU+o9Qm1hxY8+qX4d1+Ku7yKpnzRHvbXC4E9me8jSB9BHnMEuTdwNBZiN04Xy+XXElvcvMmcLNoWi1FuY3SVUW1hNC0su2e8G2G8Gcw94e2Xq3656ivIfQX5Pgf2FeQ+0PcV5B1ev3ZvorTL/uYV5Ix97kQBudqZ++vHG9zutBUV+vx+v9t5oLGt3+387rudDm9i1+z+BkOtnR5DTBAfuZs0cGRUGgsejsW8UXfjZK45RUp3K1oqEBtaFkc8rkrnNJryeVLFuT4fAmmaqrWOx1HI9Qt6sL8v/7PmGlwkros59xM6ODeNYe1jJG6UaKEKRGV2kajDNR72UUIFjPdXLYg/jozo9iduTyw6E4tH9OHA50SsQS1qUitwCy37yMnFMlg7sIt1MNpteuEyjAT2JmhpWqIUvjwk8FCQAC+1cqzVDo4UWEnsbcPIF63WGPEwxVswcqLVGiMZXNPFBgN+BtbrhQn5GV4btZKhlVvJANuolQyu3MqDSvZWP3dpWkJWEM+JmCZxLw4O6rztK6LEU6xs8IaxiK1P2jwsEFGlArNAVBvQyLWerhKLS5luvaYUo/4QuSgLJwGf1fOlDQmgTFl7UwXG4FI+vY9My3Fp06adtc3I4NXotg/jRMO3zL/vLi/Pagq1b22nSgI/qH18AIp9zCN5Wj2OuD6bLjclMIplMgv/GOXMi48MheYjebAddFoyO8OuSkIwFyLm49HIpVHi7aEZDgXaQ2SEYqImPcduwohYKJGjs9P3eKFLEDC+ui43UHlxPUfsZrl7UEzeY4mWOT1/lIh5xMi/2vHm2LwuMykE5Vw9L064v/mJgphiqJ5Qbz6TnjPeErPV2U+bm+b3DLWU1wXDK2hJvvgWs8x2V35bB6tSM1MmzGtfxSNV1ytf0vJlUXGzij124aFUESgkrdy+lY1uSBqn5ZxsqTzRhOZWkGmx3/INODz30R8v/cMXw5evnr0avnh5eDCcPvfd4YH75+Fz//AQ+egQ2j7m7irduAvdlTllfym5Dd+0flK1MvrrCNu7+pVN/tIs2SU/P/zY8UtzZpdcUUlfdh2SldnpKmSyjPsSXBL6kVpCs7yOWqAHR2en4JRmxf7es7392lisxpIQIleBmq2/6nE+dzImkHMA+SYGig2CwCj4q3ggeybJh0nGGH2thKWy4zR0QOCfYhRTRMLSByqay1yB4TLlYMAh9wHXfP1GkrS5JEHjK7i7myKOvzCapvK2/vkdSVo8wtGUSpbnI8pxrTs5U4Yn54YQPh0Um3u7mzd40f67P/KuFFHEST2ZSqddXeefz6gOaR3H2uxQsdNCtkbWJZHWEkeui2OxtO11iR2efb64BAem5seBgsiTMgxJUOXfMYD8+SMprd4wde8OKApniX6ftU757z+l9CiM -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Fork Evaluator Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/fork-workflow-variant-by-revision-id.api.mdx b/docs/docs/reference/api/fork-workflow-variant-by-revision-id.api.mdx new file mode 100644 index 0000000000..b8be4a8f03 --- /dev/null +++ b/docs/docs/reference/api/fork-workflow-variant-by-revision-id.api.mdx @@ -0,0 +1,2491 @@ +--- +id: fork-workflow-variant-by-revision-id +title: "Fork Workflow Variant" +description: "Fork Workflow Variant" +sidebar_label: "Fork Workflow Variant" +hide_title: true +hide_table_of_contents: true +api: eJztWVtv2zYU/ivGeWoBOXac2N30NDdp0azrGiRpBywwjGOJstlQokpSST1D/33gRVdf6qTusIfkIYmpc/3OIfkdeQUK5xL8W/iLi7uI8QcJEw94SgQqypOLEHyIuLibPrjn03sUFBM1nS2ngtxTSXkypSF4kKLAmCgitL0VJBgT8KEpQxPwIUW1AA8E+ZpRQULwlciIBzJYkBjBXwEmy4+RMaKWqTYilaDJHDwdSowKfMgyGkLulRJJxhjkEw8UVUwvXDm/nYsQci3o4inCr8L5mhGxbMQTIZMHD+izdWzjmVh3RKrXPFxqF200Ap4okijjPU0ZDUw9el8kT/RaFVsqdLUUJdKasWmvP8FMLbg4VDZjay33IERF9rSqRbuKxmSn6XNtMPcgJlLifKftXWY+OPXcc6V/mpk/0YQLIZGBoKly2D7F1HnNRO5BIAgqEk5RHRS+M2u2M1baSZaGP8PJJ2vWOQkJIz/Bybk165wUcM2Weu8eqI0LsF4vzb6s8DqolwKt0ksB2EG9FHCVXu6JkD/Qrp+deu6BZNn8qWautW7uweEStdlFzNxcG0zy2RcSKKgUirvtrVFZN20OG4UhqtZpj2FI9XZFdtk8S7+PA00UmRPR9BbPmiszzhnBxCxt9gUBFUHGULx4mzH2u+RJ9yJJM/VSp9dIV9ugisT7KaEQuNyJclNVI77ub/vZ69C098PmO3Rrmc6t5oYqoVA0wkAdcNeMnUm3ZwoP+0VcKG+OtkY1fgKHKO0/DlxnYlPEayVe1y5YFWwSrijMbcVDJtuNXFkGBHmurQkiU55Iu8EG/b7+07h04ToLAiJllLHOlROGJxOlgGdWqbVfa3eDkfhvcK5DZyPbgJszWeZucTsdDNah+oyMhgaIzhshuHg6TiFRSJn+zx0ubQHGg8bTx5yNk7x1IFVJ/8FtgIYJynmtUuW+2cD0rMh2UQNG50Y//V4ZdF7WtZNr7MMCXovu9jTOLXy79ta7m5vLNYO2ts2ivuXirlM0Q6doMHN3Lbge1FIulRnE1AJ86KV6E5KH3gwl6RXzm+wVW1P2VrXhLO/pMQ88kETcFzNcJhj4sFAqlX6vFzCehUc4J4nCI6Q9TCm0Yxybp50zLWqOLkmCTFC1NPbGlxfvyfIdwZAI8G8ndYFr3YC2pZpiZTUxpe+JBteNcnYGof/YPnHT3MJqafR0a19VU9abbxinjLSnpGIugpMIfxlGo9Pu8NXxq+7pcDTozk6ioDsIfh2dRKMRRjiCYt6BQX8w7PaH3ePhzfGJ3z/2h6dH/WH/b6gNLlX/uYjLz03QyuX6SLDLQ53V75KrE/Ndci1uvS8ULbK8N4JN9ruvWklnK7wsL60+P8ZcyR+pnAaZVDwuRm8qp+QeWYZK90W5tshiTOznJmGskRy9eWhA7GLAk4jOM/smRS+1Gcy+odZJyXMn/XgnHaJtWi3Qont793RFLZ4L+/8o7EHOg+dt/twN5dFgqBxNIm64TDE6WqL0GoM7koSN661/dHzU38asnEJnfHnhSH2zY6yYxrrB3UrWBh6Q2DB6UATj36oHOkrNIE0epb1tpLP1PtRRNEW+qV7KkBrebkJYOT56C46PggeakYIHJSc11NuxUvDAb35pYIjpxIOFprf+LaxWWv+TYHmul+37e00vQypxxmpv8O/Isv3KX5dOR2rIqXky0/XYpN1KsRyg4MWVmxNedqo3Ks3UC8qaLOs+i4jq+ZkhaFFQ4pWTOLPOumZUqSysTW56qrIa4yAgqdopO6nNCpcfr290JdzXDzEPzbc1qMujf5touUnefrGg11bAMJlnltxam/rnXyR5jVQ= +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Fork Workflow Variant + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+ +

Query Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + revision + object + + required + + +
    + +
    + + author + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/fork-workflow-variant.api.mdx b/docs/docs/reference/api/fork-workflow-variant.api.mdx index 5d01d9eb97..f92f4cb184 100644 --- a/docs/docs/reference/api/fork-workflow-variant.api.mdx +++ b/docs/docs/reference/api/fork-workflow-variant.api.mdx @@ -5,67 +5,2487 @@ description: "Fork Workflow Variant" sidebar_label: "Fork Workflow Variant" hide_title: true hide_table_of_contents: true -api: eJztW21T2zgQ/isZfbqbcQilQO/y6WgpA9c3BmjvQybDKLacqMiWqxfaHOP/frOS7PgtwXGTG9qGD5DY2l3pWWn3kbQ8IIWnEg1H6B8u7kLGv0o09hBPiMCK8vgiQEMUcnF3+9W9v73HguJYIQ8J8kUTqV7yYI6GD8jnsSKxgo84SRj1jYbBZ8ljeCb9GYkwfEoE6FeUSPiWKV7+5laQeyqpVYPj+YcQDUfVxiEzA1negMpbX0vFo3IjNU8IGqIJ54zgGKVe/ijWjKF07CFFFYMHF7L3ympIPVBH7jHTWHHxPRpf50qs0pmOcPw9Cs+NgjT1skZ88pn44K+sUebqMwNZXV3qoYgoXO4EDgIK/sTssgRrrZtSCRpPi2pprMiUiLKlaFJ+Uhxdsy3kU+FrhsVvZ5qxvyWP+xdxotXvqDpU0EEVidoJYSHwfCWqZVFUg3aV7DtAEiRq0/MpIfqev6VSPYbpsjFWpddD6MbOQhTjiLQcf70HIJt6KCDSFzRRtWDRXtVpQUXqIcn0tKuqa5CFXuHqaiqHpnsi6uGtvZlPTjz1kBa0q5aPgloNrLsGBhpmBAdErD3ZtwXJJhxIg1UaPMiQEVZoiLSmweoAHawMzVckJILEPikqyTo6XmtZnTs3AAQm9bb1yBMKS08v0K/hgGuHOqRTnCQ0bpsAqviuk20yQ8brEMY6T30rnXoowQJHRHVY0r/yRFkue7nAE7xExD31SRtoldBkrQnoVKcecPOQTrUl9duw9apkoA37vHKk/hQbgtRIQqXE086c4J0TX6czZ1zcNXem4x6k9SJpYPfd4n7G6nccfsfhdxx+ixz+Kfn+R1pNLuD/H+H98bBeO2O63RzXz5JLL+tGD9j/IpVs0FTFQu2wbndwtjs4+8HCxC7p/upJt8VK/GTj2/L43i0A7lj7LoDsAsjPHEAeDRxVCrUNXug64Ujb5g2V9ecj2sJIrAUsFA2xv8khnDiVzkJAEjVr1N24MGsTDKRbMTwzLxoawp03FSSAK/P85roBEVBwZe/HUZqmRUE4WjMPZMJjaSPPwf4+/CktInStfZ9IGWrWu3KNkdf1mt3n2gpV8Coe4WlzrR+QEGum0HB/zZ3EzzDBdruhX3A39EGrDmymJrUGnbGyPzmfWQVrC0LTBaOnzWh8QbAiwS1eeStXiF4BVqSvaERWWnll1fZODFg6CbZh5KNV64wEhJEtGDm1ap2RDK7JfIPxPgPr5dxF/AyvjVrJ0MqtZIBt1EoGV27lh6p1qOzhmzJIe+mcIKWGbR0eHNT51CfMaGDYUu+1EFx0J1MBUZiaOhmXHqoNGPdLb9eJxIWDA5tRFoN+y32cBZNITuvFAg3H45my5U0NGL0bePsY5YVxWdOuXWm3kcFr0V0+jFML3yr3nt/cXNYUWt+WnQpEu1fdUSFDPWYcqlcTLuF7gmHjgAYJnL6Tr4OMrMqBY7ZyAHWuyN7Im2KH0YOthkIzpRI5HAx8xnWwh6ckVngP0wFOqJnwkvhaUDU3IieXF2/I3FbfoOFoXGxgSkLsDCk3y52DE/qGAFY2g6ETrWZc0H+t2z1EYcy2wsrgBzP1alGH+/objhJGUKWutrGSNqe6BUprr/3LpDR/5jil2784brcgJHnaXcywsqvyxzZMFZq5u7W86GvxyhS0Fb+y4tdFqVmpyqlccVMohVlIlopaSmUYDdUSafG2qlCX04TmVpBZYr/58go9D/EfR+HxYf/oxbMX/cOj44P+5Hno9w/8P4+fh8fHOMTHqHIN1VaoaT/4VCZS+bh3Gw5Zdi7UFr0uMqVddVuh0ka5rZA7XNmH6U7jkJuwlG2TTdDrnVxewDDydbq/92xvv4ZeqTGkWOwbl2QxzbzOV3MWXfO4ijxEIpNfkSI4+mvxAnoG8dztbZ2+ZSmgQuBdhFXkmxokDNO4UO5qs8MIuexQgF0u3CYt+7mDpDeDrDIcoYeHCZbko2BpCo+/aCIgDYyd0ATAG43zqliTIe7I3FZMAfXom7wLzZm2CaBCQ4AiWIkT3yeJWtl2XEh8lx+ub5CHJu7fMyIegIzAMDr4PUQI/tMDpM3qNc8eEMPxVNtIY3XCz3+wbTUT +api: eJztWW1T2zgQ/iuZ/dTOOCQEQq/+dAHKlOvdlQHKzRyTYRRbTlRky5VkaC7j/36zkvyalwYabu4DfAAi7z67erSSnnUWoMlUgX8Lfwl5H3HxqGDsgUipJJqJ5DwEHyIh7+8e3fO7ByIZSTR4kBJJYqqpRIAFJCSm4IN7fsdC8IAl4ENK9Aw8kPRbxiQNwdcyox6oYEZjAv4CSDL/HBkMPU8RQ2nJkil4GDomGnzIMhZC7pUWScY55GMPNNMcB25s2M55CDnauWwkfWCKiaSWzreMynkjn4hwtfOELl1km9HYxqNKH4twjjHadAQi0TTRJnyachaYBeh9VSLBsSq5VOLyaEaVhbFhlp+QTM+E3NV0RhYt9yAkmm6JiqZdzWK6EfoUAXMPYqoUmW7E3gTzh3PPPbf4z4P5k5h0IaQqkCzVjtvnQJ3WIHIPAkmJpuEd0Tul78TCdkYag2Rp+BJBvlhYFySknL5AkFML64IUdE3muHl3VMYFWcdzsy8rvnYapWCrjFIQttMoBV1llAcq1U+U641zzz1QPJs+F+YKfXMPdjdRO7uIm6tqBaSYfKUB3kiFQ3GZnRmXZWhz2GgSEt067kkYMtyuhF80z9If88ASTadUNqPFk+bIRAhOSWKGVseCgMkg40S+Ocs4/02JpHuepJl+i9NrTBcxmKbxdk5ESjLfyHLTFRlfjrf+7HVs2vth9SW6dplOreeKVSJSs4gEeoe7ZuQg3Z4pImyXceG8Otua9HkBVVPiP41cB7Eq46UlXvYuVAysMq4kzG2lQ8brQS6tAoI8RzRJVSoSZTfYoN/HP41LF66yIKBKRRnvXDpjeLZQCkRmnVr7tXY3GIv/huc6dTazFbw5yHLulrfDwWCZqhvCWWiI6HyQUsjn8xRSTRjH/9zh0jbgImg8fcrZOM5bB1I16d+FTdAoQTWtrVS5b1YoPWuy3tSQ0bnGpz9aBpyXDe3sGvuwoNeyu34ap5a+TXvr4/X1xRKgXdvmop4Jed8piqFzUzZeMdUzgZ1ZKpRtxPQMfOiluAnpY29CFO0VDZvquXJWvUV1QOU97OrAA0XlQ9HBZZKDDzOtU+X3egEXWbhHpjTRZI+wHkkZtDMcmaedEzQ1B5eiQSaZnhu80cX5Jzr/SElIJfi347rBFZafLaimWbmWJGWfKFLrWjnbgbB/bJW4Zm5mvZA7LOzLqsf68J3EKaftHqnoiuAgIr8Mo6PD7vDd/rvu4fBo0J0cREF3ELw/OoiOjkhEjqDodmDQHwy7/WF3f3i9f+D39/3h4V7/8P3fUGtbqupzGZefm6SVw/WGYFOEuqbfZFeX5ZvsWsp6WypaUnlrBpvad1u3UsxWfFlVWn1+ClypHpm6CzKlRVw03kzd0QfCM6KxLsqxWRaTxH5uysWaxMHNwwJqBwORRGya2RcnONTWL9umWpckr5X085W0i7JplUBL7G1d05WweF3Y/8fC7uQ8eN3mr9VQHg1GyLEkEkbLFI2jFUrHJLinSdi43vp7+3v9dcrKOXRGF+dO0jcrxpoh1w3tVqo28IDGRs+DpiT+tXqAWaJ+NPMo8dZJztbbUCfRNP2ueyknzKh2k8LCqdFbcGoUPEA9Ch6UirQ6CfFfv/GNgZGlYw9mKG39W1gs0PuL5HmOw/blPYrLkCky4bXX9/d0vvTCH1cOEzXa1MSZ4HKscm/NsOye4M2laxLedqrXKc2ZF4o1mddjFinV5mcaoFkhiBfO4MTG6po2pQJY6tqwo7IeoyCgqd5oO671CRefr65xHdxXD7EIzXcjBBcHf5tkhZm7/VIBxxbASTLNrLS1mPjzL6brhaA= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Fork Workflow Variant - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+ +

Query Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + + revision + object + + required + + +
    + +
    + + author + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-all-workspace-permissions.api.mdx b/docs/docs/reference/api/get-all-workspace-permissions.api.mdx index ab12ab47b7..5dcecd6447 100644 --- a/docs/docs/reference/api/get-all-workspace-permissions.api.mdx +++ b/docs/docs/reference/api/get-all-workspace-permissions.api.mdx @@ -5,67 +5,144 @@ description: "Get all workspace permissions." sidebar_label: "Get All Workspace Permissions" hide_title: true hide_table_of_contents: true -api: eJztVkuP2zYQ/ivEnAV726NO9SFIFunBSLbowWsItDS2mVCkMjOy4xr+78XIeq+T5gd0L2t+882LnIeuUCDn5CpxMUAK71GM9d6cI33lyuZoKqTSMbsYePEaXsMnlJoCG2u8YzFx3/DtyTpvdx7/WzN9DcYY86dj2ax7yjY1q97iAJu4+4K5sCGsCBmDuHAwcsRf82gdY+fww8vL+t33HJtUU/O8VzOExrGxwSBRJEMo5PDU+XhsGRKIFZJVO88FpHBAyaz3WU/PRnRIgJCrGBgZ0iv8/vSk/6bX/rnOc2Te1958asmQQB6DYBCl26ryLm9cLr+w6lyB8yOWVn85wbIxLpcKIQUWcuEACWCoS0g3QGiLjC8sWEICJ4fnbGRRY8TCyRhT94RWUMHsZMnZIJBAgR7fgGUs3P7SAVkew94dauqND0qd+ZEy1SFjpJPLcXDKmBNKF2t/qqtiIm0NT9kaG4aToxhKDJIVWPl40Z+jPH/MGKX9Q07jR5CFsTc6HFsLA9CGOQCNPp6sr7vL1lsYgP5FJpzW7gRrTc8wDXX2mo3LvkI7+2OgNT+GWutjqH3rmpEyih41VFsUWcDzHZT41k2kgw3un1nQM3RuZSbW9pesssznSEWX0c5539a6OhqOfb57H888zrcD9MrH5/GjRJo/wR1pON9qJIc9YTiOy4JnddHLbQhRZn03gRqWC6c4684pNCuhjOpHVdPBczbnGCy5+EhlLHvjBbn28tBRL5nrlDpU80c6g2Su863GGh+ptIJtAuLE67AblgXckm4CWiJ7gYHUTVWjC27lvfm7H+3r0ay+6V8CJcoxtpMdEqisHCGFZV/WvJwOeB1fSAzp5go1eUjhKFJxulzmPtbFwh4wiF1Yt7SVg9tWNfKanFwaldX6+SNePqAtkCDdbMeEzzrk75tjSuuHva3cR9Rcgy31vKrlGGnoG6cL5njX0uRc2MdGvb2aVROcWa2f9R2Q+L6Snha/LZ6aXh0vqglZ95PNm/3U+W7EOqgnt9Dnrw9aWqcyQVv+MQg0siqylDaM7P38tWbBXYeF+f93zK99x7QlJPhdlpW3rmmh5u2ubdVvYKh6bYXR9W8TOEYW5VyvO8v4F/nbTWGdiFra2wSaPb/TQttsb0lXh1r1X/GiFZNrJlp51tf3cp596Wg39A35/t0L3G7/AnMr6lI= +api: eJztVU2P2zYQ/SvEnAV726NOcYMgWSQHI9miB68hjKWxzSxFqpyRHcfwfy9G1neybX5A97LW4+Ob7+EVCuI82kps8JDCexKDzplziC9cYU6molhaZhs8L579s/9MUkfPBo2zLCbsGz6e0DrcOfrvm+mzN8aYT5Zls+4p29SsesUBNmH3lXJhE6mKxOTF+oORI/2aRbRMncEPT0/rd99yakJNzeNeZSIZywa9oRhDNJEkWjp1Nn6uDAmEiiKqzmMBKRxIMnQu6+nZiA4JROIqeCaG9Aq/Pzzov2nav9R5Tsz72pnPLRkSyIMX8qJ0rCpn88bk8ivrnStwfqQS9ZcVKhtxuVQEKbBE6w+QAPm6hHQDkbDI+MJCJSRwsnTORopKLKzMoDwSCs3Aghz9AA7M7ITRopcJcwSWobD7SwdkefB7e6jvqeSfyo8ux9pnTPFkcxqMMuWRpAuq/6qrYnLaCk/Z6hv5k43Bl+QlK6hy4aI/Rxl5nTEK+1VOY0eIhakXHT5bhQFo3RyA5j6d0NVdsjULA8Cd6ITT6k6wVnqGqauzajYm+1bu9MdAKz+GWvUx1Na6ZopZDI7UVSyKzNP5Dkr40UyIB/T2+8zpGTpXmR3rnpCsQuZziEUX0c461w6FGho++3j3Lpx5HG8HjIsQ4jzld2RcaJ5Vuj9H74NM6zaFuv4fgdsExIrTsR7WItySbtYxRrzAQOr2h9FVvnLO/NUvsfVoK930L4GS5BjaHQYJVChHSGHZ14WX01Wm80eRId1coY4OUjiKVJwul7kLdbHAA3nBBdolVrYJaLzmVs2peatUuG1VLq+jlUujt1o/fqTLB8KCIqSb7ZjwRXfdfYFOaf3Ow8p+JE2Ex1K/V7UcQxy6wqoDx/stjdz6fWiut3lrffsD8xfyTddQ5LvbD4vfFg+vBdNeMKv1Y7uyMW9WdudHQ9OVNElXnyhthBKtnglh+WY4UC+rwFKiH+n9e1lnTl6HN+T/p/3Xnva2nYS+ybJyaJtZa2p3bcdjA8N46MyM0r9N4BhYlHO97pDpz+huN4X/rilqm28TaF60nTbdZntLup7UCXihi3ZMrpFoB6Kr7609e/x1MvrJff/uCW63fwCoIY1k sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Get all workspace permissions. Returns a list of all available workspace permissions. Returns: - List[Permission]: A list of Permission objects representing the available workspace permissions. +List[Permission]: A list of Permission objects representing the available workspace permissions. Raises: - HTTPException: If there is an error retrieving the workspace permissions. - - - - - - - - - - - - - +HTTPException: If there is an error retrieving the workspace permissions. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • +
    + string +
    + **Possible values:** [`read_system`, + `view_application`, `edit_application`, + `create_application`, `delete_application`, + `create_app_variant`, `delete_app_variant`, + `modify_variant_configurations`, + `delete_application_variant`, `run_service`, + `create_secret`, `view_secret`, `update_secret`, + `delete_secret`, `view_app_environment_deployment`, + `edit_app_environment_deployment`, + `create_app_environment_deployment`, `view_testset`, + `edit_testset`, `create_testset`, `delete_testset`, + `view_evaluation`, `run_evaluations`, + `edit_evaluation`, `create_evaluation`, + `delete_evaluation`, `deploy_application`, + `view_workspace`, `edit_workspace`, + `create_workspace`, `delete_workspace`, + `modify_user_roles`, `add_new_user_to_workspace`, + `edit_organization`, `delete_organization`, + `add_new_user_to_organization`, `reset_password`, + `view_billing`, `edit_billing`, `view_workflows`, + `edit_workflows`, `view_evaluators`, + `edit_evaluators`, `view_testsets`, `edit_testsets`, + `view_annotations`, `edit_annotations`, + `delete_annotations`] +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-all-workspace-roles.api.mdx b/docs/docs/reference/api/get-all-workspace-roles.api.mdx index c6801a440d..50cfaf38ca 100644 --- a/docs/docs/reference/api/get-all-workspace-roles.api.mdx +++ b/docs/docs/reference/api/get-all-workspace-roles.api.mdx @@ -5,67 +5,119 @@ description: "Get all workspace roles." sidebar_label: "Get All Workspace Roles" hide_title: true hide_table_of_contents: true -api: eJztVMtu2zAQ/BViz4Tl9qhTfQgSIz0YTooeHCPY0GuLCUWq5MqJK/jfi6Ut+QG0+YHqYomcfczsrDtg3CQoF/AzxLfUoCFYalhRMtE2bIOHEm6JFTqn3nuIisFRGj35Jz8nbqNPCpWziVVYZyRu0Tp8cfSvmPLJK6XUd5t4MVSfB0dzSk3wiZalmgxpLxAqvLyS4aQiNZESebZ+o7iizyqjTdQXvnt8nN18GMo0SzVdK/SKYgxRBWPamNR7ZR2pSBwtbfsK13lBQ2goomSZrqCEDfEzOvc8AJ8zEDTEI7EEZQdfx2P5uZT6oTWGUlq3TvUqgAYTPJNngWPTOGtyseI1SUwHyVRUo7xZpjonx9XKCgbdLEp3bA9FedcQlJA4Wr+Bve4PDnqeHWCMuAMNbNnJd9+NEjNMnDvNQ80zu708GmriKhxVAA0NcgUlFIMWqejFSBS3FMV7HbTRQQkVc5PKojAutKsRbsgzjtAW2FjYLyXCtNHyLodMZtN72t0RrihCuVieAx5EkAPhS9ggADb2noSfx1q+Jy1XIdrfWVjQYGUY1SFKaFm/Djn8KMckN6cmsyloEBqH8Y1HX0ZjuN6fC7DMEk2eZV87X4O+UmHgDxqoRit3TFh/O11IZ01IXKM/y/e3CV211Z1s9X/DP9vwo22YPrhoHFovq5Ln1R09voCTx2XVs+RLDVVILLdd94KJfkS338vxr5aiGHmpYYvRCp/sYt27Tjz+RjvxhxEG4jN07cG8V/8B4v1h8W5vHmG//wP6PA52 +api: eJztVE1v2zAM/SsCz0Kc7ejTsqFog+4QpB12SIOCVZhYrSx5Ep02M/LfByp20gZo+wfmi23p8evxkR0wbhKUC/gd4lNq0BAsNawomWgbtsFDCZfECp1TzwNExeAoje78nZ8Tt9EnhcrZxCqsMxK3aB0+OPrIprzzSin10yZeHKPPg6M5pSb4RMtSTY5u3yBUeHgkw0lFaiIl8mz9RnFFn0VGm2gIfHV7O7t4MZTLLNV0rdArijFEFYxpY1LPlXWkInG0tB0inPsFDaGhiOJluoISNsT36Nz9EXifgaAh9oUlKDv4Oh7L6y3VN60xlNK6dWpgATSY4Jk8CxybxlmTgxWPSWw6SKaiGuXLMtXZOa5WVjDoZlGyY3sIyruGoITE0foN7PVwcODz1QHGiDvQwJad/A/ZKBHDxLlTP9Q8V7eXR0NNXIWeBdDQIFdQQnHkIhUDGYnilqJor4M2OiihYm5SWRTGhXY1wg15xhHaAhsL55qc5Fv1Q6CwX4o700bLu+xvMpte0+6KcEURysXyNeBG2Dqw8RZ2ZAcbe01SvMda/ictVyHav5l10GAlgepgJTVbvw7ZvOeqz+07mifyK9AgdR7SHo++jMbvFdMbqMls2jcdTW76kEeGgT6j60gUaKAardwxYf3tdCFZNiFxjf6Vv/daeZZed9Lf/1Xw2SroJcT0wkXj0HqZqdyvrh+GBZyGQXZCpnypoQqJ5bbrHjDRr+j2ezn+01IUUS81bDFaqScrWg8KFL0/0U70YaQC0Ru69iDks2Uhc3Cc0MuLW9jv/wFK9h0F sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get all workspace roles. Returns a list of all available workspace roles. Returns: - List[WorkspaceRoleResponse]: A list of WorkspaceRole objects representing the available workspace roles. +List[WorkspaceRoleResponse]: A list of WorkspaceRole objects representing the available workspace roles. Raises: - HTTPException: If an error occurs while retrieving the workspace roles. - - - - - - - - - - - - - +HTTPException: If an error occurs while retrieving the workspace roles. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-config-deployment-revision.api.mdx b/docs/docs/reference/api/get-config-deployment-revision.api.mdx index d2cdd35c39..b8b63992a5 100644 --- a/docs/docs/reference/api/get-config-deployment-revision.api.mdx +++ b/docs/docs/reference/api/get-config-deployment-revision.api.mdx @@ -5,36 +5,36 @@ description: "Get Config Deployment Revision" sidebar_label: "Get Config Deployment Revision" hide_title: true hide_table_of_contents: true -api: eJyVVNFu2jAU/ZXoPG2SBazaU56G1qpF3bSqZXtBCLnJJXGX2K7toLHI/z7ZCQEKbNoTwb73+N5z7rktHC8s0gU+K7kWhcWSQWky3AklZzlSFORWWbxc5aQrta1JupWhjbBCSTBobnhNjkzAaSF5TUhxJnYlcjAIiRSauxIMhl4bYShH6kxDDDYrqeZIW7itDijWGSELMDjhqnBwPcAmjz1sMsvh/TKgWa2kJRsAriaT8JOTzYzQoRukeGqyjKxdN1Xy2AeDIVPSkXQhnGtdiSw2P36xIafdF+W99wwfr65OgX/wSuQxLbkxRpn/QIU2gXAnurpzclxU4Us4qu1pQKWyo1sut9/WkfljzjwbToR0VJCBX3q2O+PG8O0BsV9UVyA8Q22Lv2nwlazlBWEAuxwayUjm4dbv31bPL5S5I/0Xsa/u6T5uuYfZ09uxe7mN646+c4/tQu7m84cTwE7bY1FvySWdLZIzYxeKJVeq3iPRCK5EinHnFjveW2DcnreDB4Mls9l5pzEVUpTOaZuOx1mlmnzEC5KOj7gYcy0Q5txS1hjhtjFl+jC7p+0d8ZwM0sXyMOApzFg3Ncdhg2Bci3sK/PWunTauVEb87kahN2vZZQWChFyrmN5zOY3FJdOHGRhCGx1zk9GH0QRv+TwKDvbgWbTH7u14DfaGhaF/MFAdvQFHvP60vwiVaWVdzeUB3j/lO6puoMTRLzfWFRfRCrGWtpd2gV7amLyDBEN6YdstGUplXchs22du6bupvA/Hrw2ZIOCSYcON4M+BzkWLXNjwnSNd88rSSZHDVsG7x9487xOw88XvRJZB4Q2vmvAPDD9pe3lDxyVR7uap7YOnWUbaHcCc7LQweIMhbm/m8P4POBkyRQ== +api: eJyVVNFu2jAU/ZXoPm2SRVi1pzyNtVWLumlVy/aCEHKdS+I2sV37Bo1F/vfJTghQYNWeCPa5x8fn3uMWiBcOsjlcarWShYMFA23QcpJaTXPIoEBairi5zNFUelOjoqXFtXRSK2BguOU1EtrA04LiNUIGJ7BLmQMDqSADw6kEBhZfG2kxh4xsgwycKLHmkLVAGxNYHFmpCmBAkqqwcDXQJg89bTLNwftFYHNGK4cuEFyMx+EnRyesNOE2kMFjIwQ6t2qq5KEHAwOhFaGiAOfGVFLEy6fPLtS0O1Hee8/g88XFMfEvXsk8liXX1mr7H6xgbDCcZKc7R+KyCl+SsHbHgEqLg12uNj9W0flDzzwbVqQiLNCCX3i2XePW8s2esd90JxA8g9oV/+rBd3SOFwgD2XloNCOZhV2/O1s/PaOgg/7P4726o3vcYkezs7dz9/w1rjr7Th22hdzOZvdHhF1vD5t6g5R0sUhOjF0Qi1TqPiMxCFRCBmmXFpfuIpC2p+PggYFDu95mp7EVZFASGZelqah0k494gYr4iMuUGwlvNU7ibnIZoBBC4FA0VtIm8k3up3e4uUWeo4VsvtgHPIYB7EbqEDZ0kxt5h8HcPtKThkpt5Z9uTvokl11VcE+qlY7lvdG9tq9cvKAK0Q/37GSPR59G43OX6QuSyf20zxEXMUdbHREG7I1dg1HAAOsYIiDk9ZfdRlBptKOaqz2+d/t8oHKwh/A3pabiMmYmamn7GZhDPwOxeEsJDLIzz+KCQakdhcq2feIOf9rK+7D82qANzVwwWHMr+VOwdt5CLl34ziFb8crhkcjh+YEPD33KPibATovfNlyFbq951YR/wOAFN+ef8vialNvZanvwRAg0tEdz9PiFIRySc3M9A+//AtfHQNQ= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Get Config Deployment Revision @@ -43,29 +43,254 @@ Get Config Deployment Revision as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-config.api.mdx b/docs/docs/reference/api/get-config.api.mdx index 69eec783cf..fc5feb6336 100644 --- a/docs/docs/reference/api/get-config.api.mdx +++ b/docs/docs/reference/api/get-config.api.mdx @@ -5,36 +5,33 @@ description: "Get Config" sidebar_label: "Get Config" hide_title: true hide_table_of_contents: true -api: eJy9VU1v2zAM/SsGTxtgJFmxk0/LuqINuo+g63opgkK1mUSdLLkSHSwz/N8HSv5M2q7YYafEEslHvfdEVUBi4yC5hVOj13LjYBWDKdAKkkYvMkhgg3SX+k2IoRBW5EhoOacCLXKEBO6FwzuZQQxSQwKPJdo9xGDxsZQWM0jIlhiDS7eYC0gqoH3BeY6s1FyWJCle+CgcRosM6jruigfsO//1LMBaKDdCEHr/be17HGNx4WZFl0pBverRAwXRV0YadoB6J63ROWr6H22c9XBtLysGcYXRDh2XPZnN+CdDl1pZsFSQwPcyTdG5damiqyYYYqaPUJNvpiiUTL2y0wfHOdWg1cKy7iQDwpD1FwQbURZDWlrLLO3QOhkAmkypCTdoh6khNrppYuuxuyoQWSa5V6GWg9aClZqq5v4BUxoUXfYV6vo4rFfq9sBXh52PmhmIc44UztxRXNeM9P7k5FiRG6Fk5vmOzqw19t/lyJCEVPxPEubuOECZdLT7CuO1ktSrnilhrdgP+PxsQoOsTu42L1nhCzonNt4GIeT5UE9GdM27f1OJzxWgm7iBFj29gd3nj/Ep0PcUWBtycX29PCoYtB2Leo4UnbbzMEfammZKes/QFhKYps0wjcGh3bXTsrQKEtgSFS6ZTlNlymwiNqhJTIScikL6MeAwLa2kvU+ZLxeXuL9AkaGF5HY1DPjOXgnqj8M64kUhL5F5aAbZvKStsfJ3kLSZYtuQxQeVem18esPJ3DcXzZcLiKG70zCbvJvM4JCXUTDbXKTe5i2234b4gIXu/BAD5t7jQCjyD/0Gd1YYR7nQg3ojGUaddMcn/EXTQgnp7etxq0ai9vr7u701jnipqvgh+2FVXfNyGO+sQiaduFeDAX+A111qeHPVePdtBPHTffzE/ejJ3AlVcpS/mkdIIXo8q16T8cSb1aet+MNKzvOmilsT8GFD/jxNsaBB1tG04iqd/c/PrqGu/wDyNdUc +api: eJy9VU1v2zAM/SsGTxtgJFmxk0/LuqINuo+g7XopgkKVmUStLLsSHSwL/N8HSv5Mmq7YYafEEsn39B5F7YDEykFyB6e5WaqVg0UMeYFWkMrNLIUEVkj30m9CDIWwIkNCyzk7MCJDSOBBOLxXKcSgDCTwXKLdQgwWn0tlMYWEbIkxOLnGTECyA9oWnOfIKsNlSZHmhc/CYTRLoaritnjAvvdfRwGWQrsBgjDbH0vPcYjFhesVU2oN1aJDDxJE3xmpzwDNRtncZGjof9A46+AaLgsGcUVuHDouezKZ8E+KTlpVsFWQwHUpJTq3LHV0VQdDzPIRGvJkikIr6Z0dPzrO2fWoFpZ9JxUQ+qq/YthAshhkaS2rtEHrVACoM5UhXKHtp4bY6LaOrYbdtQORpoq5Cj3vUQutVFfNHx5RUq/ovKtQVYdhnVN3e321z3xApmfOOVI4cytxVTHSx5OTQ0duhVap1zs6sza3/25HiiSU5n+KMHOHATqXg903NF5jSbXolBLWim1Pz695IMjuZG71Wit8Q+fEyrdBCDke6sWIbnj3by7xuQJ0HdfzopM3qHv8GF+CfC+BNSEXNzfzg4LB26Gp50jRaTMPM6R1Xk9J3zO0hgTGsh6mMTi0m2ZallZDAmuiwiXjsdR5mY7ECg2JkVBjUSjYx5r63eiUQ/2McChLq2jr603ns0vcXqBI0UJyt+gHXHMjhdYYhrWuiEJdIotUT7lpSevcqt/B73rErUMWq6DMMvfptWA1t89CPqHh2d9eepiMPowmxw5TJ0TT+ay+D0L6+9Dw8GEQ78nVCgUxYOYvAxCK7FO3wSyL3FEmTK/ewK8Bo1YKwl80LrRQvs897q72spkTfgisc0e8tNvxi/fT6qri5fAOsCOpcuJB916CPbz29sO7q7rJ30cQv8zjCbeDt3UjdMlR/g4fIIXo4VB7S8YLj1uXtuAPqzjPN1jcNAQfNuRPpcSCelkHY42rtPfk/OwGquoPPCXjqw== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get Config @@ -43,29 +40,344 @@ Get Config as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + + + parameters + + + object + + + + required + + + +
    + +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-get.api.mdx b/docs/docs/reference/api/get-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-get.api.mdx index 134b72247f..58b295fd04 100644 --- a/docs/docs/reference/api/get-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-get.api.mdx +++ b/docs/docs/reference/api/get-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-get.api.mdx @@ -5,73 +5,317 @@ description: "Fetch the score of a specific evaluation scenario." sidebar_label: "Get Evaluation Scenario Score Router" hide_title: true hide_table_of_contents: true -api: eJzdVU1v40YM/SsDnlpAa2WDnnSqgaSJsS0aJG4vjmEwI1qarTSjnaGCuoL+e8GR/BUrQXvdk+UZ8pF8fOR0wFgEyFZw39ZoP92+YtUiG2cDrBPIKWhvGvkPGfxCrEvFJamgnSfltgpVaEibrdGKDq4qaLLojZs922c790XInq1S6sRkszfZmDxTy5LU4kbwBHwCSLFTW4keER+JW2/3oDdGiy36ndLOMhprbDFmOXovbhTaXBkOQ+YzSMA15GOQRQ4ZFMSbqeyi+ca7lslvSqHoxCxMukwemnwzYhXEkECDHmti8sJ9BxZrggymPSEBI/Q3yCUk4OlbazzlkLFvKYGgS6oRsg541whKYG9sAQmw4UoOjk1VTwdKcuj7taCFxtlAQQCur67k57zrT63WFMK2rdTjaAwJCNVkWcyxaSqjI376NYhPd5mUe/lKWirHPDexX9WDlx6wGWKfJ98fs98HVXfEaqqUpyjGx9gjFWV8YhYmXSYPF7kase6Ioe/7PoGfrq8vGfkTK5MPzrfeO/9/6GjOis6J0VTyZZjqcGlQOX12i3b3+zZK5i1fhxNjmQry0K+FxOEMvcfdiSJ+dUOCwnMdio/E8xuFgAXBAewDnQkZaim3/TH2ofNH4a5iXUPo0W59hDnSO7D7fhk3A31TwfYm98vlwwXg0NuauHTj8MeR5BIySOOUfzqZ8nRiLNNuelb7NE45JBDIv+7Hu/UVZFAyNyFLU125Np9hQZZxhibFxoCMYiDdesO76DJ/WHyh3T1hTh6y1frU4EnUNOjj3OzQGmzMFxKmxsUyb7l03vwzNH3cJ+XgJVQYu3XRfWRtHpNT84cFJCBlDMK/mn2eXcHbZ+HMOK5gHQdhHzteQ/KGhUP9kADVcQqACeufjxeSWeMC12hP8P7LGnibY3cc0O/rFRv7zfQ3p02FJk50JLobBb2CC0EL45c1QALZuw/QoOp1AqULLKBd94KB/vBV38vxt5a8CHedwCt6gy8io1UHuQnynUO2xSrQB2354XFcDz+q9+rai9uKsiVT+QcJ/EW79x/PuAbL/Rx1o/Fca2r4BOZia8vAHTbE3e0S+v5fAjE5AA== +api: eJzdVU1v40YM/SsDnrqA1k6DnnSq26SJsS0aJG4vjmEwI1qaXWlGO0MFdQX99wVH8lcsB9trT5ZHj2/Ix0eqBcY8QLqE+6ZC+/H2FcsG2TgbYJVARkF7U8t/SOE3Yl0oLkgF7Twpt1GoQk3abIxWtA9VQZNFb9zk2T7bmc9D+myVUkeQ9Q6yNlmqFgWp+Y3wCfkIkWKnNnJ7ZHwkbrzdkd4YLVj0W6WdZTTW2HzIcoie3yi0mTIc+swnkICrycdL5hmkkBOvx7KL8LV3DZNfFyLRESyMhowemmw9cOXEkECNHiti8qJ9CxYrghTGIyEBI/LXyAUk4OlrYzxlkLJvKIGgC6oQ0hZ4WwtLYG9sDgmw4VIODk1VT3tJMui6lbCF2tlAQQiur67k57TrT43WFMKmKdXjAIYERGqyLHCs69LoyD/9HCSmPU/KvXwmLZVjlpnYr/LBSw/Y9HefJt8dst9dqu6I1VgpT9GMj7FHKtr4CBZGQ0YP55kauO6Ioeu6LoGfrq/PFfkbS5P1wbfeO/9f5KhPis6I0ZTyZJiqcA4onT55i3b75yZa5q1e+xNjmXLy0K1ExP4MvcftkSN+d32ConMV8vfM8weFgDnBnuwdn4kYaiFvu8Pd+84fjLuMdfVXD7jVgeYgb6/u5TJuevnGLttB7heLhzPCvrcVceGG4Y8jyQWkMI1T/vFoyqcjYzltx2e1m8YphwQC+dfdeDe+hBQK5jqk06kuXZNNMCfLOEEzxdrA21U7i2/VrwIFmdNAuvGGt5Fv9jD/RNt7wow8pMvVMeBJrNab5xS27xvW5hOJjMPWmTVcOG/+7R0xLJuijxKdjN24GD5IOuT2C+ovZGU7SZ192leTHydXl4oZAtTsYT5MDOo4Mbs8IgySN3LthYIEqIrjAkxY/Xx4IVnWLnCF9ojve/bF21zbwyT/vz53Q++Z/uFpXaKJox+FbgfnL+HM+aL4eQ2QQHrxS9Xbf5VA4QILadu+YKC/fNl1cvy1IS8mXiXwit7gi1hq2UJmgjxnkG6wDPROW354HPbIB3Wprp3RrbhcMpV/kMAX2l7+ysZ9Wexmqh3AM62p5iOas/Uuw7dfJXe3C+i6b5V/R48= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Fetch the score of a specific evaluation scenario. Args: - evaluation_scenario_id: The ID of the evaluation scenario to fetch. +evaluation_scenario_id: The ID of the evaluation scenario to fetch. Returns: - Dictionary containing the scenario ID and its score. +Dictionary containing the scenario ID and its score. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-evaluator-config-evaluators-configs-evaluator-config-id-get.api.mdx b/docs/docs/reference/api/get-evaluator-config-evaluators-configs-evaluator-config-id-get.api.mdx index 4afc7ecf0e..34391cf2e0 100644 --- a/docs/docs/reference/api/get-evaluator-config-evaluators-configs-evaluator-config-id-get.api.mdx +++ b/docs/docs/reference/api/get-evaluator-config-evaluators-configs-evaluator-config-id-get.api.mdx @@ -5,70 +5,299 @@ description: "Endpoint to fetch evaluator configurations for a specific app." sidebar_label: "Get Evaluator Config" hide_title: true hide_table_of_contents: true -api: eJzNVk2P2zYQ/SvEnFpAsLeLnHSqmyySxSapsbvJxWsYXGkkMZFIhhwt6gr678WQsi3ZXjfoqScb5JuvN2+G6oBk6SFdwc2LrFtJxnlYJ5Cjz5yypIyGFG50bo3SJMiIAimrBO7QIjO6UGXrJGO9KIwTUniLmSpUJqS1syf9pO+RWqd9+qSFEOKj8rTaB3wbPLz7Y52KhaiVJ2GK1wII8/wNM/IzSMBYjIe3OaRQIm32RptodDjww4nfnIJUvtmUSJCAlU42SOiYkQ60bBBSOGMACSgmxkqqIAGHP1rlMIeUXIsJ+KzCRkLaAW0tu/DklC4hAVJU88G+eBGrF7c59P2aXXlrtEfP1tdXV/wzbcZDm2XofdHW4n4AQwKZ0YSaGC6trVUWmJl/82zTjTKyjnkjFSOo/FKWnFQy0PA66jPf9wl75t5sLvtcRpSIvg/cfsftzxF2h1u29EikdOk3fBGLkXr7ZxE6J/Nccf2yXo7Kjc0ZIkQhQZ/sY+q2roF7sIv5MIQQX2OIPoHMoSTMN5IuJfs2osSC/UNr85+w+RJRwaY/znIssRUE/YWuTEg/ZnOS7SSN9Rleow6h7zn6m+vrU+F9lbXK4xTeOGfcf1ddjiRVHfRH2PhTQG2yye2hs1P6Rt1TmrBEB/36wJ50Tm5HHH80MUHuSuPLS+34hN7LMug6Qi5Ik8kQj3z7b53jumLoATfqxIHeyO7rZbyL9J0LtoN8eHxcnjiMvW2QKjNszLDzqIIU5odVOR9W5bw7s/l64NFzL7sd2boaUqiIrE/n86w2bT6TJWqSM6nm0qowUR6z1inaBpPF8vYOtx9Q5uggXa3HgAdWTNTAFLanX1p1F8Q9bOdFS5Vx6u/Y2GEvV9GKy1W6MMF8YGYRkhOL5S0kwGVEcV/NfptdwfHDNwGz2GUWxL6LHa55tiYs7OvnkWyC0oFQNr8fLjgzazw1Uo/8vUcSxy/DcU7dYej+p+/y0CjCv2hua6nCuAWGukFtq8Om8pFY1hskkJ57a9cJVMYTm3Xds/T4xdV9z8c/WnSsqXUCL9Ip+cwdXnWQK8//c0gLWXu8wOAv98N0/ipey3ynO82iC48NpAAJhAfr7MdBWEHVTt/dgFxkGVoa+TjZmDwI++l8f/MIff8PsRtW8A== +api: eJzNVk1v2zgQ/SvEnHYBwc4GPelUNw3aIO2ukaS9OIbBUGOJrUyy5CioV9B/Xwwp2/LnFnvakw3yzdebN0O1QLIMkM/g9lXWjSTrA8wzKDAorx1payCHW1M4qw0JsmKJpCqBG7RQ1ix12XjJ2CCW1gspgkOll1oJ6dzo2TybB6TGm5A/GyGE+KQDzbYBb6KH9+/muZiIWgcSdnkugLAv31BRGEEG1mE6vCsghxJpsTVaJKPdQehPwuIYpIvFokSCDJz0coWEnhlpwcgVQg4nDCADzcQ4SRVk4PFHoz0WkJNvMIOgKlxJyFugtWMXgbw2JWRAmmo+2BYvUvXiroCum7Or4KwJGNj6+uqKf/ab8dgohSEsm1o89GDIQFlDaIjh0rlaq8jM+Ftgm3aQkfPMG+kUQReXsuSksp6G86g/+b7L2DP3ZnHZ5zShRPK94/Y7rn+NsHtcs2VAIm3KsOCLVIw067+WsXOyKDTXL+vpoNzUnD5CEhJ02TamaeoauAebmI99CPE1hegyUB4lYbGQdCnZm4QSE/YPjSt+weZLQkWb7jDLocRmEPUXu7JH+iGbe9nupTE/wWvSIXQdR39zfX0svK+y1kWawlvvrf/vqiuQpK6j/ghX4RhQW7V3u+vsPn2D7mlDWKKHbr5jT3ov1wOOP9mUIHdlFcpL7fiMIcgy6jpBLkiTyRBPfPtvneO6UugeN+jEjt7E7vky3if6TgXbQD4+PU2PHKberpAq22/MuPOoghzGu1U57lfluD2x+Trg0fOvmx3Z+BpyqIhcyMdjVdumGMkSDcmR1GPpNBw+JpN4K24YGsctoGq8pnX0N5ne3eP6I8oCPeSz+RDwyHJKAtmHbXsjnb6Pyu9X96Shynr9d+p6v7SrZMVcaLO00bynrc/tnVTf0fBEcZ0p7avRH6Orc8X0BmIyveunQqo4FZs8IoyHcI+uLVE8u6s4EkAoV293F5yls4FW0gz8fUASh0/IYW7tbjr/pw943zTCnzR2tdRxLiNDbS/L2W6lhUQsCxMyyE89yvMMKhuIzdr2RQb84uuu4+MfDXrW1zyDV+m1fOFuz1oodOD/BeRLWQe8wOBvD/0Y/y7OZb7RoGEBxlcJcoAM4st28isi7qpqo/W2R06UQkcDH0erlYdiO8Yfbp+g6/4BGvRlfw== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Endpoint to fetch evaluator configurations for a specific app. Returns: - List[EvaluatorConfigDB]: A list of evaluator configuration objects. - - - - - - - - - - - - - - - +List[EvaluatorConfigDB]: A list of evaluator configuration objects. + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
    + + settings_values + object + +
    +
    + anyOf +
    +
    +
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-evaluator-configs-evaluators-configs-get.api.mdx b/docs/docs/reference/api/get-evaluator-configs-evaluators-configs-get.api.mdx index 5f3234bb06..1980ea48f0 100644 --- a/docs/docs/reference/api/get-evaluator-configs-evaluators-configs-get.api.mdx +++ b/docs/docs/reference/api/get-evaluator-configs-evaluators-configs-get.api.mdx @@ -5,73 +5,325 @@ description: "Endpoint to fetch evaluator configurations for a specific app." sidebar_label: "Get Evaluator Configs" hide_title: true hide_table_of_contents: true -api: eJzdVk1v2zgQ/SvEnLaAYKdBTzqttwlSI91do3F7cQyDkUYSW5lkyVFQ19B/XwwpWVI+vN3rngwM5+PNmzcjH4Fk6SHdwPWjrBtJxnnYJpCjz5yypIyGFK51bo3SJMiIAimrBPbeIjO6UGXjJPt6URgnpPAWM1WoTEhrZ/f6Xi9c6dN7LYRg007l4jdP7k0q1hWK5ZUwhaAKT+6fkBqn+4iPytPmhO99KHj1xzYVC1ErTxz8Ch5hHr5iRn4GCRiL0bjMIYUSaXcK2sUgP1j8yVQiQQJWOrlHQsdcHUHLPUIKsRVIQDFL3xt0B0jA4fdGOcwhLWTtMQGfVbiXkB5B6sPfRchAB8sZPDmlS2iTk0U3dQ3tNgFSVLNhYa1Y5tCyzaG3Rnv0nOzy4oJ/pqO6a7IMvS+aWnzqnCGBzGhCTQGCtbXKAhHzr55jjiOAHQjpnORWFOE+1LKO6SMVK6t85Nu1MABmsElH0etef/F7m3BmHtHufM5V9BIx9zC4b3g4F3YSjbjFA0d6JFK69Dt+iM0MM5F5rpgXWa9G7ZJrMOkrRD2dndddV0J8iSXaBDKHkjDfSToH9n30EgvOD43NfyHmc/QKMe1TlGMpbiAINUxlQvpTNidoJzC2L/Aal5Hx9k+96sQNkhj4j45+sPiT6QYZPMN/d3n5XNFfZK3yuM3Xzhn3X+Q8lW2OJFUdBPyyrmuTTV5/YV2VJizRQbsd6O+3p6fko4kAmaa9L8/N80/0XpZhMaLLGW0zGWLNr/82eu4rlu78RqMc6I3svt7GVaTvpWK9y4f1evUsYZztHqky3eUNB5UqSGE+XNx5d3GBt9Q99qe2cTWkUBFZn87nWW2afCZL1CRnUs2lVWH5PGaNU3QIIYvV8hYPH1Dm6CDdbMcOd6yNOO2p23D7rLoNe9Ad+UVDlXHqZxxhd+urGMWNKV2YEN7f6wBOLFZLSIDbiDK+mL2dXcDTL+vEmWUtsyDrvnZ45jWcsHDqn7d3HzQNhHL/+/DAyKzxtJd6lO/FnXwK6jjs1//jy98NlvAHzW0tVVjEwOix0+FmOII+DiIQs02gMp74/Xh8kB4/u7pt2Ry/9Sy2XHn5UI++9uGTNPw1CB8aSCHI9FE6xd5BlUmvIk4ToxZZhpZGUc/OG2c5rdLN9Rra9h/3llyW +api: eJzdVsFu2zgQ/RViTi0g2NlgTzqtmwSpke6ukbi9OIbBUGOJrUyy5ChYr6F/L4aULDuJve11TwbIN5w3b96MvAOSZYB8ATfPsm4kWR9gmUGBQXntSFsDOdyYwlltSJAVayRVCezRQlmz1mXjJWODWFsvpAgOlV5rJaRzo0fzaCa+DPmjEULw0UoX4l0g/z4X8wrF9FrYtaAK9/B7pMabPuKTDrTY87uKCa8/LHMxEbUOxMEn+Aj79BUVhRFkYB2mw2kBOZRIq33QKgWF4STsj0okyMBJLzdI6FmrHRi5QcghlQIZaFbpe4N+Cxl4/N5ojwXk5BvMIKgKNxLyHdDWcVggr00JGZCmmg8mzolpAW275OjgrAkYOODy4oJ/jrvx0CiFIaybWtx3YMhAWUNoiOHSuVqrWOv4a+CY3WsS0nvJbDXhJuZynhUinTLr4hxhJpt1KpxG/cX3bcYvcxdW59+cJZRIbw+9+Ybbc2F7X4g73HJkQCJtyrDii1SMNNu/17Fxsig06yLr2UG5qU9dhmQZaLN9TtPUNXBv+pwPXQrxJaVoM1AeJWGxknSO7FVCiQm/D40rfiLmc0LFmPYly0O3LSB6MXblSPSXah6xPaKxfEPXNG/Mt7/qXSdukcSgfwKG4STsj26RyTP93y8vXzv6i6x1kQb2xnvrf8XOx7YtkKSuo4Hf9nVt1dHtYI1j/Q/arw1hiR7a5SB/Pz29JJ9sIsgybUJ5rp9/YgiyjIORIGe8zWKIOd/+V+u5rpS6wx20cpA3qXu6jOsk31vJesjH+Xz26sHU2w1SZbvlGncmVZDDeFiq426pAk+pf+63aeNryKEiciEfj1Vtm2IkSzQkR1KPpdPw8oM0ibfiiqFxMgOqxmvaxvcms+kdbj+iLNBDvlgeAh7YOMkKx7BhMTp9F4ekW/KThirr9b+pv92ur1IUV63N2sbwfpknbh+k+oaGh4/rTLQvRr+NLk4V0wWIyWza+V+q6P+eR4TxvB7JtReKx3wTzQ+EcvPHcMEsnQ20kebgvTeH9yW53TCI/49/AV2TCf+hsauljhMbFd11hl0M2zKkRkRhlhlUNhDf73ZPMuBnX7ctH6fvPhuv0EE+1TyQa1kHPKPlu/tudt+LU6Tid2/4ixG/ZpBDtPuz9JozRXdnvRuZQoqaKIWODqJe7VB+ZT+vtzdzaNsfLvt1uQ== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Endpoint to fetch evaluator configurations for a specific app. Args: - app_id (str): The ID of the app. +app_id (str): The ID of the app. Returns: - List[EvaluatorConfigDB]: A list of evaluator configuration objects. - - - - - - - - - - - - - - - +List[EvaluatorConfigDB]: A list of evaluator configuration objects. + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + + +
    + + settings_values + object + +
    +
    + anyOf +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-evaluators-endpoint-evaluators-get.api.mdx b/docs/docs/reference/api/get-evaluators-endpoint-evaluators-get.api.mdx index bff073893a..8214bc6bdc 100644 --- a/docs/docs/reference/api/get-evaluators-endpoint-evaluators-get.api.mdx +++ b/docs/docs/reference/api/get-evaluators-endpoint-evaluators-get.api.mdx @@ -5,62 +5,271 @@ description: "Endpoint to fetch a list of evaluators." sidebar_label: "Get Evaluators Endpoint" hide_title: true hide_table_of_contents: true -api: eJy9VU1v2zAM/SsCz0KS7ejTAqzoihRr0Y9TGgSMzcRqZUmV6GJe4P8+SHYcJ+162GG+2KDIp8ePR++BcRcgW8LFG+oa2foAKwkFhdwrx8oayODCFM4qw4Kt2BLnpUChVWBht4KGuMmTeTJ3xLU3IXsyQghxrQIvB+RVJubv44TdPFPOYQISrCOP8dKrAjLYEa+P8GvqWYxtO2KQ4Ck4awIFyPbwdTaLr9MM7us8pxC2tRZ3vTNIyK1hMhzd0Tmt8nT39DnEmD2EvKQK45diqhK485Eiq+4qgxXFNzeOIIPAXpkdSGDFOhp+xvNWwgs1n7ktqIlehfKU87oOY8yNtZrQjLy/JzfxGBJ0IGZldmHNVDmNnGKxKFTMBPXtiC/7muQBtyv6CPa+BxIPB6D2bAz2gKa52UK2PE+llYPF1FpDuxrRHUG0EmwIHyId8vwM6iYEiJy2WGuGbIs6UBu7/1orT2GtdbVGp9Yv1Pz7JXc9mrjWlZg7JRYR7YNrO+GMZuO8JgcDeo/NqNIPMbBt37eiT6SIckyj1U3OyWR81PGeyyiJa9ph3gzC+4TMQQ3iklgcd4AYJD+yXRJDGx8JFXFpe42CBIdcQgbTozITUf9GPqQG1F5DBiWzC9l0mmtbFxPckWGcoJqiU6kHgfLaK25SyPz2akHND8KCPGTL1djhPiqz0+Cp29AFdGqRatdpFOY1l9ar30nhIEHFrVB2UTEhZbY2hfd1mSdyYn57BRJiGt0emU2+TGZwvh9PnONSwZyP+6E/BnlWhSF/kEAVqnjGhNW340Fk5mzgCs0I7y+tOqe1P+63/7fB+/Iz/eKp06iS6FPe+35KlkAnv5rSBo7W/X6DgR69bttofq3Jx0FYSXhDr3AT27JctfLQtTgjabHCPM/JxfQjbtf8s2UeZ2cY2cuLB2jbPxsiaS0= +api: eJy9VU1v2zAM/SsCz0LS7ejTsq3oihRr0XanNAgYm4nVypIq0cUyw/99kOw4Tvpx2GG+2KDIp8ePRzfAuA2QLeD8BXWNbH2ApYSCQu6VY2UNZHBuCmeVYcFWbIjzUqDQKrCwG0FD3OTBPJhb4tqbkD0YIYS4UoEXA/IyE7PXccKuHynnMAEJ1pHHeOllARlsiVcH+BX1LMa2LTFI8BScNYECZA18PjuLr+MM7uo8pxA2tRa3vTNIyK1hMhzd0Tmt8nT39DHEmAZCXlKF8UsxVQnc+UiRVXeVwYrim3eOIIPAXpktSGDFOhp+xvNWwhPtPnKb0y56FcpTzqs6jDHX1mpCM/L+ntzEr5CgAzErsw0rpspp5BSLRaFiJqhvRnzZ1yT3uF3RR7B3PZC43wO1J2PQAJrd9QayxWkqrRwsptYa2uWI7giilWBDeBNpn+dHUNchQOS0wVozZBvUgdrY/edaeQorrasVOrV6ot2/X3Lbo4krXYmZU2Ie0d64thPOaDZOa7I3oPe4G1X6Pga27etW9IkUUY5ptLrJOZqMtzrecxklMUjuAxp7HYgLYnFQvxjEPrJdEEMbHwkVcWl7dYIEh1xCBtODJhNF/0I+pNLXXkMGJbML2XSaa1sXE9ySYZygmqJTcLptZulUfIuuqTWB8tor3iW82c3lnHY/CAvykC2WY4e7KNhOmsduQ3PQqXkqaSddmNVcWq/+JOGDBBUJlF1UzFaZjU3hfdF6bl8xfyJTgISYZ0f7bPJpcvZeMn2AmN1c9nsHcz6skN4N5Em5hkKBBKpQxTMmrL4cDiJLZwNXaEZ47/T0lF5zWIH/b8n3rWD6zVOnUaW9kPJu+nFaAB39jUobOFqbZo2BfnndttH8XJOPQ7GU8IJe4Tq2aLFs5b6DcV7S7oVZnpOL6UfcbhBO9n2co2G2L87voW3/AqNKdWc= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Endpoint to fetch a list of evaluators. Returns: - List[Evaluator]: A list of evaluator objects. - - - - - - - - - - - - - +List[Evaluator]: A list of evaluator objects. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + +
    + + + + settings_template + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + oss + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + requires_llm_api_keys + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-own-org.api.mdx b/docs/docs/reference/api/get-own-org.api.mdx index a609a250b7..c1c74e3a8c 100644 --- a/docs/docs/reference/api/get-own-org.api.mdx +++ b/docs/docs/reference/api/get-own-org.api.mdx @@ -5,59 +5,97 @@ description: "Get User Organization" sidebar_label: "Get User Organization" hide_title: true hide_table_of_contents: true -api: eJx9U8tu2zAQ/BVjzoTl9qhTfShSI0ATNM3JEAKa2lhMJZIhl05dQf9erOQ30OogCdoZ7s7MqocPFDVb71Y1SmyJX/yHe/FxC4VIKXiXKKHs8XmxkEdNyUQbhIEST9kYSuk1t7MfBzAUjHdMjgWuQ2itGRsUb0k4PZJpqNPyFqK0Zzt1sLXceR8IJRJH62QIttzKh1WNQcHpjv6H+i71YVBHgN+8keFRy3u2kWqUa2l0OKk6Mx/iVjv7Zxz1IXPIjEEudSP5jnj2nCjOLglQ6Igbf/AQCkFzgxKFv0Clwn8INFHcUUwo1z1ybFGiYQ6pLArT+lzP9ZYc67m2hQ4WQyUMk6Pl/UhZPq7uaf+NdE0R5bq6BDyJt5Od17CTZTrYe9ofDSixzNz4eNZhRWQzsUS9da9+pB98Wo7DzZaPKyiIjMmWxfzTfIFbs67AshbajGtx7D2WoW5cOOmHAnXaSo1Jd1/OBZks+MSddhfn/Subq6FOTjD95iK02jrZrHGE/pDbGle5QUGSqxQan1jKfb/RiZ5jOwzy+T1TlHAqhZ2OVm/EqnU1qKOTktsv2otmYyjIhux0m6dAbn4RyfO0TXdff2IY/gLwUT55 +api: eJx9U01v2zAM/SsBz0Kc7ajTsmHoggJrsa6nwCgYmY3V2pIqUekyw/99oO18Ap0PtiE+ko/vUR34QBHZereqQMOW+Mm/uycft6AgUgreJUqgO/i8WMinomSiDZIBGh6yMZTSc25mvyYwKDDeMTkWOIbQWDM0KF6S5HSQTE0tyl+I0p7t2MFW8uZ9INCQOFonJNhyIwerCnoFDlv6H+qnxPteHQB+80KGh1neso1UgV5Lo6lSecq8i1t09u9A9S5zyAy9POpq5Bvi2WOiODtPAAUtce0nDUFBQK5BQ+HPUKnw7wJNFHcUE+h1Bzk2oKFmDkkXhWl8rua4Jcc4R1tgsHBNYDlEZ98ECn0p5UyOlvdDveX96pb2PwgriqDX5TngQYQftb6EHfXEYG9pf1BHwzJz7eNpSCsE6jFLpLHu2Q/pk4gTt69oXsmJyjLnSHsx/zRffDTMlDBb3q+m/UEz7M+BxwADdSXXUShQQC1aiTFh++UUEJbBJ27RndX7yMQLckdVmP5wERq0TlZwoNBNBq/hwmBQIBaXCmqfWMJdt8FEj7Hpezl+yxTFqFLBDqPFjci2Lnt1UFU8fKW9zGwMBVmlHTZ5NOfqLom3x7W7+f4b+v4fYDlNCA== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get User Organization - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-projects.api.mdx b/docs/docs/reference/api/get-projects.api.mdx index 65bc6d3b68..aaf6ac0850 100644 --- a/docs/docs/reference/api/get-projects.api.mdx +++ b/docs/docs/reference/api/get-projects.api.mdx @@ -5,59 +5,304 @@ description: "Get Projects" sidebar_label: "Get Projects" hide_title: true hide_table_of_contents: true -api: eJytVE1v2zAM/SsGz0KS7ejTAmzoggJr0a7YIQgCRmZitbak6qNbZvi/D5Q/knhFMWzLxYFEPr73SKqBgAcP+RrupbHkYSPAWHIYlNGrAnI4UNhaZx5JBg8CHHlrtCcPeQPvFwv+FOSlU5ZTIIf7KCV5v49VdtcHgwBpdCAdOBytrZRMFeaPnnMa8LKkGvmfClQncOuYSFBdKeMOqNXPlLVVRcLRx5s95OsGwtES5OCDU/oAAvbG1RgghxhVAa0YI3SsKmg3AoIKFR/cnMFmK469rKSxprdq/TH2FwZqBXw37slblPQfRXwbMHsFpxr/Qv+EOnDvx6Bn/jbfE85tl9VzGzAGZlOUadZQO3pyW2eqv5bz4MlldwzQClB+W1BtXsXaGVMR6jfBVj77yPltK4YYs2O+aUOeo3JU8FKdOTaRvvlNqh+35QSKzuHxzJUhJLuikA150PJPTNbwIkJATaE0/T4zFwwl5DA/22xP7oWcT1ZEV0EOZQjW5/O5rEwsZnggHXCGao5WJTc8yehUOKaU5e3qmo6fCQtykK835wH3vN3dHl+GjQ6jVdfESru5gGUMpXH98oAAxZLKLou1Kr1P3RuMWSZy2fJ2BQJYRmfCYvZutoCpNRfB/DChTA/TUDtdg5i4MOoHAVSj4rtAWH84XTAza3yoUZ/hTTpxwWU0INCPMLcVKp2mnSs3fZfGMUqvc2l84LOm2aGnB1e1LR8/R3LciI2AF3QKd2zLetOKwTXu0RMdWZ+UZHkIXrCKnfmTB5l7Nw7M1aev0La/AIODGsY= +api: eJytVE2P2jAQ/SvRnC2gPeZU+qEtWqmLlq56QAgNzkC8JLbXdralUf57Nc4HkLarqi2XIPvNmzdvZlxDwIOHdA0raSx52AgwlhwGZfQigxQOFLbWmUeSwYMAR94a7clDWsPr2Yw/GXnplOUQSGFVSUne76siue/AIEAaHUgHhqO1hZIxw/TRc0wNXuZUIv9TgcpIbh0LCapNZdwBtfoeo7Yqizz6dLeHdF1DOFmCFHxwSh9AwN64EgOkUFUqg0YMCF0VBTQbAUGFgg/uLmiTBWOvM2ks6aVcf8z9iYkaAV+NO3qLkv5jEV96zq6Cc45/kX9m7bV3Y9Apf1nvmWfZRnXaeo5e2ZhlHNXnrjy5rTPFX5fz4Mkl90zQCFB+m1Fpfsm1M6Yg1C+SLXzynuObRvQYs2O9cUOeKuUo46W6cGxU+uanUv2wLWdSdA5PF670kOSGQtLHQcM/MVrDK4SAkkJuun1mLRhySGF6sdme3DM5H62oXAEp5CFYn06nsjBVNsED6YATVFO0Csbp5vE2ecfQaJUnWTkVTpFvvlzc0ukjYUYO0vXmErDi1W+X/Bo22I9W3RLb0A4NzKuQG9dtFghQLCBvo9gIpfextb1rnba3KI+kuRNcZyt7Nnk1mf2umC4gmS8X3QuGMr5gvY4IAzGyazAKBFCJiu8CYfnmfMEqrfGhRH3BN2rZlabBjEDfwtQWqHRcC85cd+0c5i0+47nxgc/qeoeeHlzRNHz8VJHjpmwEPKNTuGOL1ptG9A5yv4504vqkJMvT8oxF1TZi9HJzH4fJuvnwGZrmB0NmKVU= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get Projects - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + user_role + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + is_demo + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-single-testset.api.mdx b/docs/docs/reference/api/get-single-testset.api.mdx index 0f30ce6838..f4f7ac966b 100644 --- a/docs/docs/reference/api/get-single-testset.api.mdx +++ b/docs/docs/reference/api/get-single-testset.api.mdx @@ -5,73 +5,295 @@ description: "Fetch a specific testset in Postgres." sidebar_label: "Get Single Testset" hide_title: true hide_table_of_contents: true -api: eJzVVMFu2zAM/RWBpw4Qkq7YyacFWLcV27CizXZJg0K1aVubLbkiXTQz/O8DZTtO1rXAjjvFkR6fyMdHdsCmIEg2sEZiQibYasiQ0mAbtt5BAu+R01IZRQ2mNrep4gGqrFOXnrgISIsbd+NWoaDkximlJsitzdQJcXiVqHWJymbK54pL3FOwV7nQx/gr5Da4iUICAt63SIzZ/Gauct+6TCusCJVx6uN6fXn+mGJMdwEafIPByJ+LDBIokG/JuqLC25EDNDQmmBoZg5TegTM1QgJz0qDBSumN4RI0SBo2YAYJhxY1UFpibSDpgHeNRBIH6wrQwJYrORjVVBcZ9P1WGKjxjpAk6Oz0VH6OVb5u0xSJ8rZSVyMYNKTeMToWuGmayqaxsOUPkphuTqTv+17Dm7Ozp8TfTWWzGKbOQ/DhH1ihCSIm2yHvDNnYSr4sY01PAZVPj26N233No8LHOvV6f2IdY4EB+m2vpzMTgtkdiPnZDwlCr6Gm4iXdvyCRKRD2ZM9DoxhqLbf9/La/+4EpH/V8E+sanh5x25lmlndQ9/ky3g3y/e2xCSJefkI49LZGLv1o6OhgLiGB5ehZWnaze3vQQBgeJnu3oYIESuaGkuUyrXybLUyBjs3C2KVpLIhFCdM2WN7FkNXlxSfcfUSTYYBksz0EXIs9hoYfw/Zam8Z+Qil9HKxVy6UP9tfQxXG2yiFKarMu9zF8lGEVk1OrywvQIGUMTj5dvF6cwp/r6QgszjZpdPb0drwG/YcK+/pBA9bR1sBo6rfzhWTWeOLauAO+D8jqOu4Ttd7vk6OMunm+/rvdOTaQ8ZGXTWVsnLmoXDdabjOtSQINycHK3GooPbEguu7OEH4LVd/L8X2LQWy11fBggjV30uRNB5kl+c4gyU1F+IKMJ1fjNL5SzyU5Wc+J7x5M1co/0PATd8erPW6acnJ2NwJWqahwEPpkMcoI7Ifww/ka+v43SC97gA== +api: eJzVVcFu3DYQ/RViTglA7LpGTzplm7qJkRY17G0u64VBUyOJiUQqnJGRjaB/D4aSVrtxHaDHniSRbx5nHt+MemBTEmQ72CIxIRPsNeRINrqWXfCQwR/ItlJGUYvWFc4qHqHKeXUTiMuItLr3934TS8ruvVJqhjy4XL0ijq8zta1QuVyFQnGFRwoOqhD6FH+L3EU/U0hAxC8dEmO+nFmoInQ+1wprQmW8er/d3lx9tZjSXYGG0GI08nGdQwYl8gM5X9b4MHGAhtZE0yBjlNJ78KZByGBJGjQ4Kb01XIEGScNFzCHj2KEGshU2BrIe+NBKJHF0vgQN7LiWhUlNdZ3DMOyFgdrgCUmCLi8u5HGu8l1nLRIVXa1uJzBosMEzeha4adva2VTY+hNJTL8kMgzDoOHXy8vnxB9N7fIUpq5iDPE/sEIbRUx2Y945snG1vDnGhp4D6mDPdo0//F0khc91GvRxxXnGEiMM+0HPayZGczgR888wJgiDhobKn+n+FxKZEuFI9jI0iaG2sjssZ4fHT2j57M53qa7x6Am3X2gWeUd1Xy7j91G+fztshoiXnxGOd9sgV2EydHIwV5DBevIsrfvFvQNoIIxPs727WEMGFXNL2Xpt69DlK1OiZ7Mybm1aBz+2/CbtqrcCBfEvoe2i40Pi29xcf8DDezQ5Rsh2+1PAnXhndMM57HgRpnUfUHSZum7TcRWi+zZe8dR41RglhTtfhBQ+aTTl9puxn9FLp0qdY9oXq19WFy8VMwWozc311ALGphaY80gw0D/IdRQKNGCT/A+MpnmzbEiWbSBujD/he4es7tLgUdvj4DnLrF8a8X83ZKfLZPzK67Y2LjVnUq6fvLmb5ymBhuxktu41VIFYEH3/aAj/ifUwyPKXDqNYbK/hyURnHuXCdz3kjuQ9h6wwNeFPZHx1O7Xta/VSkrMNvXjwydSdfIGGz3g4/wekkVTNLu8nwMaKCiehzyaotMOxW99dbWEYvgMSJooP sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Fetch a specific testset in Postgres. Args: - testset_id (str): The id of the testset to fetch. +testset_id (str): The id of the testset to fetch. Returns: - The requested testset if found, else an HTTPException. +The requested testset if found, else an HTTPException. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-testsets.api.mdx b/docs/docs/reference/api/get-testsets.api.mdx index 6790f5ef5a..9121891458 100644 --- a/docs/docs/reference/api/get-testsets.api.mdx +++ b/docs/docs/reference/api/get-testsets.api.mdx @@ -5,65 +5,144 @@ description: "Get all testsets." sidebar_label: "Get Testsets" hide_title: true hide_table_of_contents: true -api: eJzNVE1PGzEQ/SvWnN0kVJz21KhCECG1CMIpRDDsTrKmG9vYY0q62v9ezX4kWQ6ox+7FK897no/37BoYtxGyFSwpciSOsNZQUMyD8WychQwuiRVWleIeMXmwD/aWOAUbswf7Rc1VZSIrtxkgyj2/UD4g0UTqgE9Xy+XNxXtO7dFP6rfhUkVGTlHlriB1PjtXZqOsOyRTGEhtXLLFBDQ4TwGFuygggy3x44ADDYGidzZShKyGr7OZLONO7lKeU4ybVKnbHgwacmeZLAscva9M3maYvkTh1BDzknYof4Zp1x7ugxTCpkv1aApZeO8JMogcjN2CBjZcycaigEaDxR19hvoh8UZDHgiZikfkz9DfO5Sas3CSL/6Bc9+hWk6jB1inVDu912QCFeIF6agveVTRKNX6eLR45474Z2Kf+DDZYxIMAfcnpQwQJdY6GK+RT8OOuHS9vKDBI5eQwfRE6EjhjYK4toYUKsigZPYxm07zyqVigluyjBM0U/QGmrUw8hQM71vK/GZxTfsrwoICZKv1KeBOxO5kHcMOc0Vvrmk/jCeDeeLSBfOnNQ1oMGK0smNJO8ZuXEvve5+3xan5zQI0SBudNWeTs8kMPl69EVh8inmr8ZC7DYssoykc+gcNtEMjMSbcfTsGpDLvIu/Qnpw3kuNDLfXxnvxPL0KvCtM7T32FxrYXQsZR99ZZAZ88baWLLHt1/YyR7kPVNLL9miiIO9Ya3jAYfBatVutGD1KKcX7RXoaeS7UiHlapc8SHR0MMdXDx5cUSmuYvFW3aMA== +api: eJzNVE1PGzEQ/SvWnLdJqDjtqSlCECG1CMIpRDB4J1nDxjb2mJKu9r9Xsx/5QCrqsXvxyn4z82bes2tgXEfIFzCnyJE4wjKDgqIOxrNxFnK4IFZYVYp7xOje3tsb4hRszO/tFzVVlYms3GqAKPf0THpAoonUAR8v5/Pr83dNbepH9ctwqSIjp6i0K0idTk6VWSnrdsUUBlIrl2wxggycp4ASOysghzXxw4CDDAJF72ykCHkNXycTWY47uU1aU4yrVKmbHgwZaGeZLAscva+MbiuMn6PE1BB1SRuUP8O0aZP7IETYdKUeTCELbz1BDpGDsWvIgA1XsjEroMnA4oY+Q/2Q8yYDHQiZigfkz9BnHUpNWWKSL/4h5q5DtTFNNsA6pdrpvSYTqBAvSEc95SNGR6WW+9TinVvin4l94t1k90UwBNweUBkgSqy1M14jXwYb4tL18kIGHrmEHMYHQkcKbxTEtTWkUEEOJbOP+XisK5eKEa7JMo7QjNEb+GjnaXuqzgQKzVLS6RQMb9t80+vZFW0vCQsKkC+Wh4BbcUKn+TFsN3T05oq2w+xymCYuXTC/W0dBBkYIlF2U9GrsyrXh/WB6bt9Rv5AVDaTPjvZkdDKa/K2ZPkBNr2e9oVG3Zhh4tDDR72hcu0FBBrRBI2dMuPm2PxCW3kXeoD3Id6TbB071/kL9T09HrxDTO499hca2N0fGUfceWwAfvIGliyx7df2Eke5C1TSy/ZooiFOWGbxhMPgkui2WTTbIKiZ6oa0MXQtbERGr1Lnjw+si5trZ/eJ8Dk3zB3r16L8= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get all testsets. Returns: + - A list of testset objects. Raises: -- `HTTPException` with status code 404 if no testsets are found. - - - - - - - - - - - - +- `HTTPException` with status code 404 if no testsets are found. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-variant-by-env.api.mdx b/docs/docs/reference/api/get-variant-by-env.api.mdx index 9ff0b6e622..54ba4f898b 100644 --- a/docs/docs/reference/api/get-variant-by-env.api.mdx +++ b/docs/docs/reference/api/get-variant-by-env.api.mdx @@ -5,77 +5,575 @@ description: "Retrieve the app variant based on the provided app_id and environm sidebar_label: "Get Variant By Env" hide_title: true hide_table_of_contents: true -api: eJztVk1vGzcQ/SvEnGJgIalGelmgQOXESIQ0jeHY7sEWBHp3pGWyIhmSq2Yj7H8vhlxKXH/IgY1eip4sL9+8NzOcD27B8ZWF/BqmWluYZ1CiLYzQTigJOZyjMwI3yFyFjGvNNtwILh275RZLpqQ/0EZtRIklIRaiZFyWDOVGGCXXKN3oRt7IqVnZ/EYyxiLqlXXmKGcXFbLZW6aWOw2nmEl1o+ZSmVFgSMhTmvRzwhftE17v0jkXFqNT7y8uzk6/F+gjz9nsvrmwTCryopHeee4auyhUib/9OpkcZUwZJpaMsyteN3hqDP1vmSGRO/jXKV62TLkKDcOo/pgZyQTH0TVGRs+nWl8FF8/RaiUthmzEWMs0ihFkoDQaTkKzEnJYoVv0h4vbdoFyAxlobvgaHRqqjS1IvkbIIVwcZCCoNr41aFrIwOC3RhgsIXemwQxsUeGaQ74F12oys84IuYIMnHA1fZhqzWYldF22o06u7uX8pwlZ182JIiTGktXxZEJ/hoX+uSkKtHbZ1CxmETIolHREkm8p9loUPm3jL5Zstokn2lBSnQgKfZ5+IgOZx4YcHEb/SZgug3hVh/n7gug1os1TOtEqammjvmDxlNZZQPVaNBieFDrhFncq3uKwhMcH/kLJpVg9qfDGw3YajRH+YmT7aekremhHhdh/kU1dA9VMZLo0ghgMboQV4d57qJAOV2gS1fMIIkcNcoflgrvnKr8JDGzqfAi6fCHfZWDo+daqFEuBJTV9yP5zOD/2LOyk7S9ImRWX4ofvlBcQf0poeua/lflqNS/wBbR/RY5+AEWguqUaHkyb6/282zXpoP/uNNagX9JG2Jf4sHyTopoPmv3OOF9A15Grr4+P7w+uK16LMmTJ75znT60SHRc1/RIO1/Y+oFbF4PQn8h9bpJvvU82N4W3SNH+o4KAvSrs61NUf0Vq+8h0dIAd2gF/AF3T61DVTXEG6x83TkRjTG7L7eBhvQ/oeEosQemPcIwx3u0ZXqX4d+/3rKshhzLW24wc3tEWzieu5MTXkUDmnbT4eF7VqyhFfoXR8xMWYa+FbwGLRGOFabzI9m33A9j3yEg3k1/MU8JkKJFz5ELbLNtfiA1Lw/faeNq5Spu/WuL+rYEXRCblU3jzWuHeOTc9m1ERowmCFyeiX0QTuvkEHYKptXvjajtr+GLI7WdjFDxng2hc2OOTr3/cH5JlW1q25TPjeoWNxEZ607NRne+DRdt9h/z+Q/4sP5L7KHX53Y11zIcMTws/G0Jl+N1jIHno9zzOolHUE2m6pDC5N3XX0Obxoqf1KYfltTeNnyWuLBwrs1Xk/qY7YY559xTZ9nG8ovZCDn8P/gtDwqb5Xm/f78JZa/JoGfhXHy7Y3nRZ0g4nVvf1ELLtZ+O70ArruHwciA0I= +api: eJztVk1vGzcQ/SvEnGJgIalGelmgQGXHSIQ0jeHI7sEWBHp3JDFekQzJVbMR9r8Xww9p1x9yYKOXoifLy5n3hjPzZrgFx5cW8msYa21hlkGJtjBCO6Ek5HCBzgjcIHMrZFxrtuFGcOnYLbdYMiX9gTZqI0osyWIuSsZlyVBuhFFyjdINbuSNHJulzW8kYyxZvbHOHOVsukI2ecfUYsfhFDNd3sS5UGYQEDrgXZju5w5e8u/g+pAuuLCYgvownZ6ffS/Q3zxnk4fuwjKpKIpa+uC5q+28UCX+9utodJQxZZhYMM6ueFXjmTH0v2WGSO7Zv+3ay4Ypt0LDMLE/5UY0IXB0tZEp8rHWVyHEC7RaSYshG+muZfcWA8hAaTSciCYl5LBEN4+H89tmjnIDGWhu+BodGuqNLUi+RsghFA4yENQb32o0DWRg8FstDJaQO1NjBrZY4ZpDvgXXaHKzzgi5hAyccBV9GGvNJiW0bbaD7pTu9fhnHbC2nRFESIwlr+PRiP70G/1LXRRo7aKuWMoiZFAo6Qgk39LdK1H4tA2/WvLZdiLRhpLqRGCIefqJDGTeNuTgsPWfZNNmkEp1GD82RORIPs/xJK/EpY36isVzXOfBKnLRYHiW6IRb3LF4j8MU3j7gF0ouxPJZhlNvtuOojfCFkc3nhe/ovh81Yvwi66oC6pmEdGkEIRjcCCtC3aOpkA6XaDqsF8mIAjXIHZZz7l7KfBoQ2Nj5K+jylXiXASHirVUpFgJLEn3I/kswP0UUdtLEAimz5FL88Ep5BfDnDkxE/luZO6t5ga+A/SthxAGUDNUt9XBv2lzv591OpD393RNWTy9dIexbvN++naaa9cR+b5zPoW0p1LfHxw8H1xWvRBmy5HfOy6dWiY6Lin4Jh2v70KBSRe/0J/KfJNLO9qnmxvCmI5o/VAjQN6VdHlL1J7SWL72ig8mBHeAX8JROnysz3StQR7tZdySm9IbsPn2NdyF9j5ElE3pjPAAMtV2jW6m4jv3+dSvIYci1tsNHN7RFs0nruTYV5LByTtt8OCwqVZcDvkTp+ICLIdcC7r/rxv6UnZKp14fFojbCNR5vfD75iM0H5CUayK9nXYMv1D2hH/pmu1JwLT4iZSau9nHtVspEKaflvgpedHUhF8q7JwGE2E54cYfSqwxNmLwwGvwyGD11mejAxueTKAJeeBGkOLwZZPfStUsUZIBrrwBwyNe/7w8oSq2sW3PZwXuPjqWNedKwM1+WXmTbvRT/f0n/F1/SseMdfndDXXEhw1vDD9EgYb9ELGSPPbNnGayUdWS03VIbXJqqbelzePqSFEth+W1Fc2rBK4sHGuzNRRxpR+ypyO6w6b7iN5ReyMEP7H+BqP+m37PN4uK8Jblf02ZYpVGzja7jgirY8XqwyAhlNzTfn02hbf8BFTwR0Q== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Retrieve the app variant based on the provided app_id and environment. Args: - app_id (str): The ID of the app to retrieve the variant for. - environment (str): The environment of the app variant to retrieve. +app_id (str): The ID of the app to retrieve the variant for. +environment (str): The environment of the app variant to retrieve. Raises: - HTTPException: If the app variant is not found (status_code=500), or if a ValueError is raised (status_code=400), or if any other exception is raised (status_code=500). +HTTPException: If the app variant is not found (status_code=500), or if a ValueError is raised (status_code=400), or if any other exception is raised (status_code=500). Returns: - AppVariantResponse: The retrieved app variant. +AppVariantResponse: The retrieved app variant. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + + + + + +
    + + uri + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + modified_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-variant-revision.api.mdx b/docs/docs/reference/api/get-variant-revision.api.mdx index 925a1951ac..301e32f1de 100644 --- a/docs/docs/reference/api/get-variant-revision.api.mdx +++ b/docs/docs/reference/api/get-variant-revision.api.mdx @@ -5,36 +5,36 @@ description: "Get Variant Revision" sidebar_label: "Get Variant Revision" hide_title: true hide_table_of_contents: true -api: eJy9Vstu2zoQ/RVhVrcAEaVBV1pd94E26MtIc7MxDIMWxxZbiVTJUXBdQf9eDCnJkt2kj0VXtsl5nnNm6BZI7j1kK7iTTktDHtYCbI1OkrbmWkEGe6TNfbzdOLzXXlsDAmrpZIWEjt1bMLJCyGAw1AoEaAMZ1JIKEODwa6MdKsjINSjA5wVWErIW6FCzpyenzR4EkKaSD/qKkmsFXSfGDEMJG9NUW3S/m0Ybwn1wG/Lc9AGTDzFg1605jq+t8ejZ9erykj8U+tzpmoGBDD41eY7e75oyuemNQUBuDaEhNpd1Xeo84Jh+9uzTTsqpHaNMOmbQKniYw8ddQHOOCXffn5imLIELHKpndMQIyi81yg6VVXqnUW22h8c4eN+bJc8P7JVbs9P78/Lj+SYy9HC0F8Es+cBm3VxBLUilNGMly+UkdmSxD2i3nzGnScDlMULXnZsdxbCalbg+Lenl89CdQ0moNpIebSJaJQuKiFSVpk2F3ss9/imJL0KU5H0f5We9TKZwyuPIz6yVSZpFXfdDdZRCx8meXV2dC/xOlloF+SavnLPuz9WtkKQug84JK39uUNp8dvsLGA7y7tZHsKRz8jCh6p2NBQbB+/2jQh+gH4I9bBrASG759mdEcV8xdW+3nq63Ad6I7sNtvIzw/SjZYPLm9nZ5FjByOyf1NVIyLNabiYyQCtsv+7DbqYAM0n6b+7Q97vUuHeTn0/ZkGXcgwKO7Hx6FxpWQQUFU+yxN89I26kLu0ZC8kDqVtQ5T4DFvnKZDcFksr9/i4Q1KhQ6y1Xpq8In1FRUzNxvJkrV+i4xd/1gsGiqs09+iDPqnooheDI42OxvchwkJxSWL5TUI4DYiapcXTy8u4RTLmTGPhszDaAy5wzWIExTG/kEAVmEugFBW/x4vuLLaeqqkmcR7gLpZTSMQhP9TWpdSB/GHCtqe1tXwSHsQkM0e7JFZvjl9aNcCCuuJA7TtVnr8z5Vdx8dfG3TM3lrE0FvGctWC0p6/K8h2svR4Vuu4TuCfm35qniQgftzDwLBheu9l2fAvEPAFD/P/Hbwk/mLmU5jCQioG/ba91SLPsaaJ/9n+ZKGPY/j61S103XdXDUwA +api: eJy9Vk2P2zYQ/SvCnFpAWG0WPelU7yZIFvmosdnmYhgGLY4tJhLFkKNFXUH/vRiSkiU73qQ55GSbnI83b94M3QGJvYN8BZ+EVUKTg3UKjUErSDX6XkIOe6TNU7jdWHxSTjUaUjDCihoJLbt3oEWNkMNgqCSkoDTkYASVkILFr62yKCEn22IKriixFpB3QAfDno6s0ntIgRRVfBARJfcS+j4dMwwQNrqtt2j/bxqlCffebcjzEAMmH0LAvl9zHGca7dCx6831NX9IdIVVhomBHD62RYHO7doqeYjGkELRaEJNbC6MqVThecw+O/bpJnCMZZZJhQxKeg99+Gvn2ZxzwtXHE91WFTDAAT2zk46k/FCh7FA3Uu0Uys328FwP3kez5PbAXkWjd2p/Dj+cb0KHLke782bJBzbr5wrqQEipmCtRLSexQxdjwGb7GQuaBFweI/T9udlRDKsZxPUppJe3vjqLglBuBD1bRLBKFhQYqWtFmxqdE3v82Sbe+SjJ+xjle7VMpnDax7E/s1ImaRbGxKE6SqHnZH/c3JwL/JOolPTyTV5Z29ifV7dEEqryOies3blB1RSz2x/gcJB3vz6SJawVh0mr3jUBoBe82z8r9IH6IdhlU09G8si332sU1xVSR7v1dL0N9AZ2L5fxMtD3rWSDyZvHx+VZwNDbeVNfIyXDYn2YyAipbOKy97udSsghi9vcZd1xr/fZID+XdSfLuIcUHNqn4VFobQU5lETG5VlWVE0rr8QeNYkroTJhFJziW/jb5I5N/Yg4LFqr6ODjLZb3b/HwBoVEC/lqPTX4yOILcpqbjZ0URr1FJja+JIuWysaqf4NG4jtSBi9mTuld492H8QnYbkXxBTW/b1xngH199eLq+lIx0SFZLO/jDInCz9CAw5tBekLXSBSkgLUfICAU9Z/HC0ZpGke10JN4F3o8wzaSQvgPZaYSyk+JR9DF/q+G19xBCvnsZR8lwDenL/I6hbJxxAG6bisc/m2rvufjry1a7uQ6DaG3zOuqA6kcf5eQ70Tl8AzruHfgt4c4Xr8nkH67hqHbmlv9JKqWf0EKX/Aw/4PC2+QXZj6lyW+uctByF60WRYGGJv5ni5ZFP87r61eP0Pf/Aa5LWo8= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Get Variant Revision @@ -43,29 +43,429 @@ Get Variant Revision as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + + + config + + + object + + + + required + + + +
    + + +
    + + + + parameters + + + object + + + +
    + +
    +
    +
    +
    +
    +
    + + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-variant-revisions.api.mdx b/docs/docs/reference/api/get-variant-revisions.api.mdx index 7b258aa7d6..f8ca1331c8 100644 --- a/docs/docs/reference/api/get-variant-revisions.api.mdx +++ b/docs/docs/reference/api/get-variant-revisions.api.mdx @@ -5,36 +5,36 @@ description: "Get Variant Revisions" sidebar_label: "Get Variant Revisions" hide_title: true hide_table_of_contents: true -api: eJydVk1v2zgQ/SvCnLYAEWeDPem07gfaoNvWSLO9GIbBiGOLXYlkyVGwrqD/Xgwp2lKcpNs92RZnhm/emzdyDyT3Aco1fJFeS0MBNgKsQy9JW3OtoIQ90vY+nW493uugrQkgwEkvWyT0nN+DkS1CCTlSKxCgDZTgJNUgwOO3TntUUJLvUECoamwllD3QwXFmIK/NHgSQpoYfjJCKawXDsOEKwVkTMHDS1eUlfygMldeOwUIJn7uqwhB2XVPcjMEgoLKG0BCHS+caXcXeFl8D5/TnQKT38sDoCdt4l/PMCOl0s1axkjl82sXG5/AHcXxiuqYBBp4b4ka4jcTh5EZtCPfoJ73f5KBBQGuV3mlU27vDc3R9GMOKlwfOqqzZ6f05/PR8m+R6utqrGFZ85LBhLnYPUinNHMpmNamddB0L2ruvWNGk4OpUYRjOw07jsZ5B3DyE9Ppl7M6jJFRbSc82kaKKJSVG2lbTtsUQ5B7/r4ivYpXiw1jlZ70c1Z7reNRn1srkmqVz4/xPR+E0Hmm6i7dIRfbJzdGcw8Cw/ri6OrfIF9loFQ1QvPHe+l/xx3yQFJLUTXTE40ZpbDU7/Q9sZyMMmxOt2Y65979sAhitEfbPWiKLlIs9HRrJKG759GeScl/p6jFuM91Zmd7E7tNtvE70PXZZDnl3e7s6K5i0nYv6+BQIaJFqO+7wuLGphhIW444Oi/60rYfFdLcH9Pd5sXe+gRJqIhfKxaJqbKcu5B4NyQupF9LpaI+AVec1HWLKcnX9Hg/vUCr0UK4304DPPE5pQOZhp/3r9HtkqsZXyrKj2nr9Pak+vlXqlMVcaLOzMT1bJ4IrlqtrEMBtJJIuL36/uISH1M2C2Qmyik7Id8djEA9YOPYPArCNNgBC2f55OmBkzgZqpZnUe0qpGagjE4T/0sI1UsdhjxD6UcV1ftNydjl7656E3AiobSCO7vs7GfBv3wwDP/7WoWetNiLVuWPm1j0oHfi7gnInm4BnwI67An67GS3xogDxOOCsp2Ex72XT8S8Q8A8e5v8Uot3rPC79GLCsKnQ0ST3bTjxXxxl/++YWhuEHVosFTA== +api: eJydVtFu2zoM/RWDTxtgNF2xJz8t7Yat2HZv0HV9CYJAtZhYmy1pEl0sM/zvAyUrsZum271Pba1D6pCHh2oHJLYeiiXcCaeEJg+rHIxFJ0gZfS2hgC3S+iGerh0+KK+M9pCDFU40SOg4vgMtGoQCElJJyEFpKMAKqiAHhz9a5VBCQa7FHHxZYSOg6IB2liM9OaW3kAMpqvnDQCm7ltD3K87grdEePQddnJ/zD4m+dMoyWSjgS1uW6P2mrbObAQw5lEYTamK4sLZWZaht9s1zTHdMRDgndsyesAl3WccdIRVvVjJk0rt/N6HwKf0+33/RbV0DE08FcSFcRuzh6EalCbfoRrXfJFCfQ2Ok2iiU6/vdc+36PMCyyx1HlUZv1PaYfvy+jnKdznYVYNk/DOunYncgpFTcQ1EvRrmjrkNCc/8NSxolXBwy9P0x7DAeywnF1WNKby9DdQ4FoVwLeraIiMrmFDvSNIrWDXovtvh/RbwKWbLPQ5Y/1bJXe6rjXp9JKaNr5tYO8z8ehcN4xOnO3iNlySc3e3P2PdN6fXFxbJE7USsZDJC9c864/+KP6SBJJKHq4IinjVKbcnL6F91ORuhXh7YmO6baP5lIMFjDb5+1RBIpJTsNDc3Ibvn0T5JyXfHqAbca76zU3tjd02W8je176rIE+XB7uzhKGLWdivr0FOTQIFVm2OFhY1MFBcyGHe1n3WFb97PxbvfoHtJib10NBVRE1hezWVmbVp6JLWoSZ0LNhFXwmM48nGZXDA3e8Vi2TtEu5Jsvrj/i7gMKiQ6K5WoM+MKzFqdnCjssZ6s+IvdxeG/mLVXGqV9xJIYnp4pR3CilNyaEJ19Fbpei/I6a3yiuM9I+P3t1dn6qmCEgmy+uB8uIMlgm8QgwyB+1a98oyAGb4BcgFM2bwwGztMZTI/Qo3ylJJ+T2XSH8STNbCxVcESh0g9zL9CRzdDF5ng+Kr3KojCdGd9298PjV1X3Pn3+06Fi3VR7z3HMXlx1I5fl3CcVG1B6PiO2XCry4GbzzMoP8acJJW83CPoi65b8gh++4m/5LEfZClUanGwDzskRLo9CjNcYztjfD+3e30Pe/AQZqE9s= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Get Variant Revisions @@ -43,29 +43,443 @@ Get Variant Revisions as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + + + config + + + object + + + + required + + + +
    + + +
    + + + + parameters + + + object + + + +
    + +
    +
    +
    +
    +
    +
    + + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-variant.api.mdx b/docs/docs/reference/api/get-variant.api.mdx index 9e72dd044c..a82b12bcbf 100644 --- a/docs/docs/reference/api/get-variant.api.mdx +++ b/docs/docs/reference/api/get-variant.api.mdx @@ -5,36 +5,33 @@ description: "Get Variant" sidebar_label: "Get Variant" hide_title: true hide_table_of_contents: true -api: eJylVk1v2zgQ/SvGnLoAEWeDnnRaN1u0QdttkCbZg2EYjDSW2EokS1LZVQX992L4IUt1EhfJybL45s3Xm6F6cLy0kK3hlhvBpbOwYaA0Gu6EkhcFZFCi296HU2CgueENOjRk1YPkDUIG8XwrCmAgJGSguauAgcHvrTBYQOZMiwxsXmHDIevBdZosrTNClsDACVfTixjI4qKAYdgQg9VKWrRkdHZ6Sj8F2twITSFCBl/aPEdrd229uIpgYJAr6VA6gnOta5H7jJZfLdn0k0C0oXydCB641pTFEwGutPbBMY8NBXga/Q9hBjat0m8WYG9zzE+ySr60UV8xP+brMqCirztu8aijN9zi6MVbPO3C4wN/ruROlEc9nHvY6KM1wjdGdp93XnNzu4GNb2Rb10CaSUw3RhCDwXthReh7hArpsEQz8XqVQBSoQe6w2HL3XM/ngWGxcj4FXbyQ7yYwRL5GFWInsNjedbH6z+H8FFkWb7rYIGVKLsUPPykvIP48oYnM/ynzzWqe4wto/00cYTewBFR3pOHZslmnOZ4MKZtvqdlgzeZlOgh7ic/lOxHVZjbscQ7TItrCMFCor8/ODhfXLa9FEar01hhlnr+1CnRc1PQkHDb2EFCrfHb6G/VPIzJs9qXmxvBuMjQfVQjQi9KWT031J7SWl36iA+RxqC/G4ppOj7WZ8gquI24zXYmpvKG6j6fxdyjfQ84S5P319eUBYejtvKnv0C1ux+uyQVepeIv629NVkMEyis8u+70mB2Bg0dynq7U1NWRQOadttlzmtWqLE16idPyEiyXXwg+Hxbw1wnXeZHV58QG798gLNJCtN1PAF5JOEMMcNvaBa/EBqSzxUl+1rlImznG616tgRXkLuVPePKnfB7dYXV7QeKEJKxdOT/48OYVfyzQDk+p57lWffPtjYL9UYcwfGGDjJQ8OefPX/oAi08q6hssJ37wrs1DG/B3+75a65kKGa8fPU+jYOq0LCwyyyR7ZMKiUdYToe1oVN6YeBnr9vUVDXdnEVXNHNVr3UAhLzwVkO15bPAhm3ADw6ioK/Y8FsIeDTJ2Tnd9odUv/gME37OZfZX6IqySMPgJWeY7aTUwPdg4paNTwu7fXMAw/AXuSdw8= +api: eJylVk1v2zgQ/SvCnHYBIs4GPem0TrZog7bbIE2yB8MwJtJYYiORLEllV2vovxf8kqW6iYvkFMd882b4Zt7QO7BYGchXcIeao7AG1gykIo2WS3FZQg4V2c1jOAUGCjW2ZEm7qB0IbAlyiOcbXgIDLiAHhbYGBpq+dVxTCbnVHTEwRU0tQr4D2ysXaazmogIGltvGfRELyS5LGIa1YzBKCkPGBZ2dnro/JZlCc+VKhBy+dEVBxmy7JruOYGBQSGFJWAdHpRpe+BstvhoXs5sUorS7r+UhAyrlbvFMgUulfHHMY4MAz6P/dpiBTVX6RQH2McfypKiUS2n5lYpjua4CKua6R0NHE52joTGLj3g+hccH/kKKLa+OZrjwsDFHp7lvjOg/b/3MzeMGNn4juqYBNzOJ6VZzx6DpkRse+h6hXFiqSE+yXieQK1QTWio3aF+a+SIwZEvrr6DKV/LdBobI18qSbzmVm/s+qv8Szk+RJTvvY4OkrlDw/71TXkH8eUITmf+V+sEoLOgVtP8kjrAbWALKezfDs2WzSj6emJTNt9TMWDO/TI2wH/H5+E6Gaj0ze/RhWkQbGAZX6puzs8PFdYcNL4NKb7WW+uVbqySLvHGfuKXWHAIaWcxOf0H/ZJFhvZcatcZ+YpqPMhToh9JUz7n6ExmDlXd0gDwN9WJkN+70WJvdvULqiFtPV2KSN6j79DX+CvL9LFmCvL+5uTogDL2dN/Ud2exufC5bsrWMr6h/PW0NOSzi8JnFbj+TAzAwpB/T09rpBnKorVUmXyyKRnblCVYkLJ4gX6Di8GPqpT/NLhzUO8dQ0Wlue8+3vLr8QP17wpI05Kv1FPDFzVWYlDlsbBIq/oGcZvHFX3a2ljqaPD36dYhyonCxlT48WSPUdo7FAwnvP9JhJ8PpyR8np09dJgZky6vLaA8svD1SHR4G7Ae5RqGAAbXeG2AJ2z/3B65KJY1tUUz45u2blTRqYek/u1ANchHeJ2+80NpV2isGGOSThbNmUEtjHWK3czvlVjfD4L7+1pF2HVrHnXTv9FrtoOTGfS4h32Jj6KCYcVXAb9fREb9nwH5eZOqi6P3qazr3HzB4oH7+8827vU5DsouAZVGQspPQg+Xkpmkc9ndvb2AYvgN0xIWe sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get Variant @@ -43,29 +40,518 @@ Get Variant as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + + + + + +
    + + uri + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + modified_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/get-workspace.api.mdx b/docs/docs/reference/api/get-workspace.api.mdx index 5a9852e900..7fb010eb1c 100644 --- a/docs/docs/reference/api/get-workspace.api.mdx +++ b/docs/docs/reference/api/get-workspace.api.mdx @@ -5,67 +5,218 @@ description: "Get workspace details." sidebar_label: "Get Workspace" hide_title: true hide_table_of_contents: true -api: eJzllE1v2kAQhv/Kai69rID26FORGiUoUhslVD0QVA32gDexd52dcRKK/N+rWcAYesu1XIxn5p2Pnce7A8ENQ7aAXyE+c4M5wdJCQZxH14gLHjK4JjFvR7cpSNBVPHr0j/6epI2ejzaDq9CKkZIG8cgccodChXlzUiZvyxQ/sWFidsEPU2WP3hhj+m4yMy/7miasz5PvleiYjsKb+fzu6j2n1HtmZuu+nikCsfFBTImvZBqKtUvljQR9W4dYGykdG8xVPAILoaGI+jIrIIMNye++NFiIxE3wTAzZDr5MJvo4P7mHNs+Jed1W5v4QDBby4IW8aDg2TeXyVGL8xKrZAecl1aj/nFCdkjdROxG3L+WKJPXbH2vIFjuQbUOQAUt0fgOd7S2+rSrolhbESaWGWQGdBY81aYZz3Snqu/q7Cwo+VvDbIEVnD2EfSzVXe9cngbB6olzSGl5aF6lQitNoh5CB9gT3SY8x4nYw9XFBRnEfCPRnoSYpwwECsNCglJDBuMeBwQJTfKXIaa42VpBBKdJwNh7nVWiLEW7IC47QjbFxaTamvI1OtkkyvZvd0vaGsKAI2WI5DHhQJvbbPw/rzwsbd0s6z367MG2lDNH9SWyBBac8lnuVDuT8OiT5Yfxpas5M72ZgQcfYEzwZfR5N4PJGOAtWnDFPOB9rJzfYi1Po5wcLVKNTnxDWX08O7awJLDX6Qb7zjfwDZv89/cc31YECoXcZNxW69Lml498dYF3AANalhTKwqHW3WyHTz1h1nZpfWorK49LCK0aHK6VjsezsER5F9Zm2uuZcu1dcsGr3DF7cZopw/+VcX82h6/4CIHk7pg== +api: eJzllE1v2zAMhv+KwMsuQpLt6NOyrWiDAlvRZtghDQpGZmK1tuRKdNss8H8fqDiOk2GXXpeLY5Ivv/TIO2DcRMgW8MuHp1ijIVhqyCmaYGu23kEGl8Tq9eBWOTHaMo7u3b27JW6CiwebwpVvWHFBg3iM0RuLTLl6tVwkbxMpfIgqUozWu2Gq7N4ppVTfTabmRV9T+fVp8r0SbaSD8Go+v7l4M5R6z9Rs3ddTuaeonGdV4AupmkJlU3nFXt7WPlSKCxsVGhGPQIOvKaC8zHLIYEP80JcGDYFi7V2kCNkOPk0m8jjd3F1jDMW4bkp12wWDBuMdk2MJx7ourUklxo9RNDuIpqAK5Z9lqlLyOkgnbPelbJ6kbvtjDdliB7ytCTKIHKzbQKt7i2vKEtqlBrZcimGWQ6vBYUWS4VR3jPou/vaMgvcV/DZI0eou7H2p5mJv+yTgV49kOB3Dc2MD5UJxGq0LGWiPcB/1GAJuB1MfDkgJ7gOB/DRUxIXvIAANNXIBGYx7HCJoiBReKMQ0VxNKyKBgrmM2HpvSN/kIN+QYR2jHWFs4v2XT5FVfJTQNHsk0wfI25ZvezK5pe0WYU4BssRwG3AkwezROw/plYm2vSYbdHz1MGy58sL8TeKDBSgPFXiXTWrf2Sd7tpuvtC5oncjlokDn3bU9GH0eTfw3TCdT0ZtZxjyZxf+gjhYE+W1e/KNBAFVrxMWH1+eiQLmsfuUI3yHd6dH8R3F+8//iT1hHB9MbjukSb7mVa/66jegEDqpcaCh9ZrLvdCiP9DGXbivm5oSBsLjW8YLC4ElIWy1YfQBJsn2grx2yke8EGy2bP49lnT3Dur9jlxRza9g/UIEo1 sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Get workspace details. Returns details about the workspace associated with the user's session. Returns: - Workspace: The details of the workspace. +Workspace: The details of the workspace. Raises: - HTTPException: If the user does not have permission to perform this action. - - - - - - - - - - - - - +HTTPException: If the user does not have permission to perform this action. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + type + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/handle-events.api.mdx b/docs/docs/reference/api/handle-events.api.mdx index 7239e1f558..156ce9c472 100644 --- a/docs/docs/reference/api/handle-events.api.mdx +++ b/docs/docs/reference/api/handle-events.api.mdx @@ -5,59 +5,72 @@ description: "Handle Events" sidebar_label: "Handle Events" hide_title: true hide_table_of_contents: true -api: eJxdUk2PmzAQ/SvRO1sh7dGnplKljfbQaNOeIlRNzGzwrjGubaJSxH+vBpJ0AxcE82bmfcyATOcEfcRX65z1Z5QKbeBI2bZ+V0GjJl85/sUX9jlBIXIKrU+coAd83mzkVXEy0QbpgcahM4ZTeu3c6uUKhoJpfWafBU4hOGumFcVbkp4BydTcEPQwyqMWI58mEqtvNxIN57oVdqFNGQqBcg2N4jSrKFKONnAxky6gkDheOIrSAV10oivnkHRRGNd21ZrO7DOtyRYULMZSOkwXbe6nlu1+98z9E1PFEfpYfgQchPlsxyNsQO4DQ4OCfeYeCp4a+d52uW6j/Ts5AAUrEuu5S7Rb/9pO7Ta7CT+RW233OyiIjNmUzfrTeoOlVQ9gMZ3MZPpt91SGWrhw1w8FbshKLTM1X/4XhJnY3ZD/MG+ZzAOZuwOZ/+QiOLIe43X1cA3tiGtoktIUm1C4jZN7rCVjfcQwnCjxz+jGUX7/7jhKOqXChaKlk3h1LEd1s1KCe+deRBvDQe7kQq6bE1lcoAR6P6r998MPjOM/FmYOTA== +api: eJx1Uk2PmzAQ/SvRO1sh7ZFTs1WljfbQqGlPCFUTMxvcNca1TVSK+O/VAMnuIpULgnkz8z5mQKJLRF7gwVhr3AWlQus5UDKtO1TIUZOrLP/kK7sUoRA4+tZFjsgHfNzt5FVx1MF46UGOU6c1x/jc2c23BQwF3brELgmcvLdGTyuyX1F6BkRdc0PIh1EetRr5OJHYfLmRaDjVrbDzbUxQ8JRq5MjOs4ospmA8ZzPpDAqRw5WDKB3QBSu6UvIxzzJt267a0oVdoi2ZjLzBev1+qm4+CxRjKeN0F0zqp3n74+GJ+0emigPyonwLOIms2av3sAGp94wc5M0T91Bw1Mj3vkt1G8zfyR4oGCFQz11ijHHP7dRukuVXbg+kX9hVUBCdM+3d9sN29z8xS8Nmfzws6ZCe0rnxmGBQK7vuRkGBGzJSS0zNp9eCsJRcGnJv5q0jfEfq7kbiPynzlozDuKwelnQLLOlKnFO+QuE2Tg63lmPICwzDmSL/CHYc5ffvjoMkVSpcKRg6i29FOaqbrRLiC/ciWmv2clBXst2czupUJdz79R2/nr5jHP8BBLsc2w== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Handle Events - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/health-check.api.mdx b/docs/docs/reference/api/health-check.api.mdx index 34aa4dc3e8..239ad076d7 100644 --- a/docs/docs/reference/api/health-check.api.mdx +++ b/docs/docs/reference/api/health-check.api.mdx @@ -5,59 +5,69 @@ description: "Health Check" sidebar_label: "Health Check" hide_title: true hide_table_of_contents: true -api: eJxdUkFu2zAQ/IoxZ8Jye9SpRhEkRi5B05wModjQm4iNRLLkyogq6O/FSoobSxdC3BnuzOwOCJETiQv+cEKJmqmR+pet2b7BIHGOwWfOKAd83e30OHG2yUWloMRjZy3n/NI1mx8LGAY2eGEvCqcYG2enDsXvrJwB2dbcEsph1M+snrybNGy+LxpaljqotlcWGESSGiWKWSkMMqczp4zyOKBLjZoQibksCtuE7rSlV/ZCW3IFRYexUobtkpN+ouwfDvfc3zGdOKE8Vp8Bj6pzNn8NGyB9ZJSg6O65h4GnVv/3ndQhub+TXxg4P4eqLHXq/EuY6E6aCT+J2+wfDjBQG3MEu+2X7Q7rYK7AGjHZKeKP3lMZZpXCxT8MuCWnNWFqv/0vqLIYsrTkP723msOVlksAwu9SxIacx7h0HpYZHZdtQmVQhyx6MwzPlPkpNeOo1386TjqGyuBMydGzhnKsRvORmU7ojXt1Zy1HXYAzNd0c/WqxdHKXZbm9+Ylx/AcGdfiJ +api: eJx1UsFu2zAM/ZXgnYU429GnZcWwBr0U63YKjIGV2VqLLWkSHcwz/O8DHTdtDUwXQeIj+fgeR4TIicQFf6hRomFqpflpG7YnGCTOMfjMGeWIj7udXjVnm1zUFJR46K3lnJ/6dvNtAcPABi/sReEUY+vs3KH4lTVnRLYNd4RynPSYVcnbmcPmZuHQsTRBuT2zwCCSNChRXJjCIHM6c8oojyP61OoQIjGXRWHb0NdbemYvtCVXUHRYN9vP0c2NQjFVWs72yckw19vfH+54uGWqOaE8Vm8BDzrERZn3sBEyREYJiu6OBxh46vS976UJyf2dxYCB8xfFNUtlcP4pzOlOWn7l9pnsiX0NA53zQnu3/bDd/W+YJWGzvz8sXpCdvXjhMcNgVnJdhYIBd+Q0Jkzdp9eAsowhS0f+Tb2VYe84XcUQ/iNFbMl5TEvncTHzuKwdKoMmZNGfcXykzD9SO036/bvnpJZUBmdKjh5VoGM1mRf91K0TDzqdtRx1U87U9hcbVhuoLl636uuX75imf188Byc= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Health Check - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/human-evaluations.tag.mdx b/docs/docs/reference/api/human-evaluations.tag.mdx index 3e4ee7417a..592e00ba89 100644 --- a/docs/docs/reference/api/human-evaluations.tag.mdx +++ b/docs/docs/reference/api/human-evaluations.tag.mdx @@ -5,16 +5,9 @@ description: "Human-Evaluations" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/import-testset.api.mdx b/docs/docs/reference/api/import-testset.api.mdx index c1fb8108bd..a2ea57d6aa 100644 --- a/docs/docs/reference/api/import-testset.api.mdx +++ b/docs/docs/reference/api/import-testset.api.mdx @@ -5,74 +5,373 @@ description: "Import JSON testset data from an endpoint and save it to Postgres. sidebar_label: "Import Testset" hide_title: true hide_table_of_contents: true -api: eJzlVU1vGzcQ/SvEnBqAllyjpz1VTQNETRoLltKLLBj0ciQx3SUZctaOKux/L4bclVZ2LAe99rQfnDcfbx5n9kBqE6FYwgIjRaQIKwkaYxmMJ+MsFDCtvQsk/phffxKUrYRWpMQ6uFooK9Bq74wloawWUT2gMCTIiZmLtAkYR7f21k7CJha3VghxtP8pUnhTiMnAxeebjww1OeYhzCgju/B3VtXYo2mLIn27dXrvUzRr4YN7MBp1SuAGqQm2z0Gbkgqx2KIIGJuKenQX2AdXYowjkOA8BsVUTDUUkM/vuiAgwaugaiQMzOIeOBMoQDW0dcH8k4AgwTCRXxsMO5AQ8GtjAmoo1qqKKCGWW6wVFHtQdne9To5o59lRpGDsBlp5+GObqoJ2JYEMVfxjchKr5SOOgJF+c3rHXktnCS2lAN5Xpkym428Xj4+PF2sX6osmVGhLpzmp/SAfH7h8Mhj5q+8Sv5/md8zmXW/TShi26xym0574xHYtA7Ohu/+CJQ0MuaC7Jy1oW0YEjN7ZmPO8urzkx6mM503JLV03lbjpjEG+RM2XyJiXmTD6XD1TzdW/VnWuVkIZUBHqO3WW17fZSkzouwwdNbXk5LroJ85Xp4TPkeam9hUe2MhM/nJ19Zy8v1RldKJGvAvBhf/OnEZSpkocEtbxuUHlypPTH7gSxhJuMEC7OjKjQlC7AX8fXdldEAl13Jyj+k+MUW1Sb7LJGbUzGWLBp691hevKoTu7QT+O9GZ2Xy7j90zfuUvyfrGYPXOYe1sjbR2PMe9iHl60hQLG3V2K48MNlxAxPPRTrQkVFLAl8rEYj8vKNXqkNmhJjZQZK2/SQIpYNsHQLkEms+kH3L1HpTFAsVwNDeasjdztU7MD0cqbD7jrZfx0xnXzdJtRXJixa5fg/UxMyYnJbAoSuIws48vRz6NLeLrgToxZ1qpMsu5jp2OQT1g41A8SsE6aBkJV/3o84MyY6VrZgb9uny4OK+Qkm8G0/r9v3k4LhN9o7Ctl0t1NTdh3yl32KyZyE3rtriRsWd/FEvb7exXxc6jaln/nDczy1Caq+2qwg//G3Xf29oOqGs4h6ftBBcOgJGfZy4+9ZfDb3LiLNA6O2NdXLo+y7GJSlujpBXAarZzI4RrPrucLkHDf7fnaacYMPMvhB6fdtv8CFsduaw== +api: eJzlVlFv2zgM/isCn3aAmnTFPfnpst6A5bZbgya7lzQoVItJtNmSJ9HpssD//UDJTpx2SYe97im2xY/8+JEiswNSqwDZHGYYKCAFWEjQGHJvKjLOQgbjsnKexD/Tm4+CkpXQipRYelcKZQVaXTljSSirRVAbFIYEOTFxgVYew+DO3tmRX4XszgohDvavAvk/MjHqufh0+4GhJsXchxkkZBv+3qoSOzStUcR3t4zPHUWzFJV3G6NRRwK3SLW3HQdtcsrEbI3CY6gL6tBt4Mq7HEMYgARXoVcsxVhDBun8vg0CEirlVYmEnlXcATOBDFRNa+fN9wgECYaF/Fqj34IEj19r41FDtlRFQAkhX2OpINuBstubZXRE24odBfLGrqCR+y+2LgpoFhLIUMEfRkexGj7iCBjojdNb9po7S2gpBqiqwuTRdPjt4vHx8WLpfHlR+wJt7jST2vX4VJ7TJ4OB37oq8fMxvwObt51NI6FfrnOYtvfER7ZrGJgM3cNnzKlnyAndPylB0zDCY6icDYnn1eUl/xy38bTOuaTLuhC3rTHIU9J8Dow5rYTR5/IZa87+paxTthJyj4pQ36uzul4nKzGiHyp06Kk5k2ujHzlfHAs+RZqasipwr0ZS8s+rq+fi/acKo6M04q33zv+6chpJmSJqSFiG5waFy49Of+JKGEu4Qg/N4qCM8l5te/p9cHl7QSSUYXVO6n8xBLWKtUkmZ7qdxRAzPn2pKpxXCt3a9epxkDepezqNv5N85y7Ju9ls8sxhqm2JtHY8xioX0vCiNWQwbO9SGO5vuISAftNNtdoXkMGaqArZcJgXrtYDtUJLaqDMUFUGni6NUTwV12wap1XAvPaGttHfaDJ+j9t3qDR6yOaLvsGUGye1wrHZvgqqMu9x2/X40wHYDtt1QnHWxi5dhHcDM3F7o/IvaPmucJ6J9uXg9eDyVDItQIwm47b/VR77v+MRzUA+kWsvFEjAMjY/EKryr8MBs+SSlMr2/LWLd7bfNUesemP9d1/RbV8QfqNhVSgTL3kswq5t8Xm3iwIXoWvyhYQ1X4RsDrvdgwr4yRdNw5/TquZW1Saoh6K3rL/g9gcLfqOKmjnEXt8obxgUW1t2rcjeEvg6Fe4izo0D9uXdzDMvuRjlOVZ0AhxnMBPZ3/fJzXQGEh7aPwSl04zpeZb9F6bdNP8Dnod8+g== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Import JSON testset data from an endpoint and save it to Postgres. Args: - endpoint (str): An endpoint URL to import data from. - testset_name (str): the name of the testset if provided. +endpoint (str): An endpoint URL to import data from. +testset_name (str): the name of the testset if provided. Returns: - dict: The result of the import process. +dict: The result of the import process. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+
+
+
    + + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/ingest-spans-rpc.api.mdx b/docs/docs/reference/api/ingest-spans-rpc.api.mdx index 3680a95149..e25577cf07 100644 --- a/docs/docs/reference/api/ingest-spans-rpc.api.mdx +++ b/docs/docs/reference/api/ingest-spans-rpc.api.mdx @@ -5,67 +5,898 @@ description: "Ingest Spans" sidebar_label: "Ingest Spans" hide_title: true hide_table_of_contents: true -api: eJztXG1z2jgQ/iuMPl1nTEjSvLR8Opq4Ey4tMED64RiGEbYAFVv2yXJSjvF/v1nJNrIhvDXtpR31Q17ErlbafXZXftR4iQSeRqg+QH2OHcqmaGihICQcCxqwpovqiLIpicQoCjGLRjx0kIU4+ScmkfgQuAtUXyInYIIwAT/iMPSoI5VrX6OAwVjkzIiP4aeQw9SCkkiOw4xSiS3aE1QfLBEVxI/WJR1OsCDuCIuiuFiEBNVRJDis3EKTgPsgg1wsSFVQn6DEysVY7HkoGVpIUOHBwI2attIQKLFQHLo/wsiDmjY14hKP/AAjt2ra1EjmrvFiRN097cQxdfdy1odFpenq/npRK5m3ciuZw17USuau3Irg2CGpgfK0mRIkCEnlAbo7xHshZql0iDlhYsf6t623IycorFWJbnMHYbEPiU3ZY6AyElkIMxaI7JeYzVnwxNCwtMk+zLS+nmzf+5vGUygLFnJmmILBp4DPJ17wBG7C0Ry+BYEHCv6YuK5S/icmfIEs5Hk+qAZ+6JF0wc4MC1l+OGbzzRsAt+9Y/5yyHUjK1t/rNFqj+2brdvTQ6nXsm+bHpn2LLG282erb3VbjU2GwZ3e/2N3C0M2npt3qF4Y63fbtw01Zrt3qPXy2u/qW2n3iwbbuYd3Pb4thf2tYtgFMgrWFZZVBkcBcjGTN+Y4aRZkgU8K3mwVLlb7SRIS5P8WqzdzcZiSwiKORE7h7QrrXb/QfeqOb9q0NoLBlTLWx9n1pwO522+vhlGZvwOrmgKpl+SSK8PT4qMpZKp/TWRILYSE4HceClPoudl0KOYa9TqHx7mF1o8f9cXFkHAQewUwObbaFHMqd2MP8j4+x5/0VBazaZGEs3kCRUJME46/EEXKO9JywhxLmHC+2eqmoKivsmr3ndBsrfyZQlyaEE+aUfffMqeaR8IiqI9Ix0f2SqgNcvHh6NEhAN7HQy3VX1aYM1H4c1NYUi9Wlm+FQs7B7cd0VehMLeZTN94PxYWehQ09aBkY/FUbwZEc5caHVZYHVglZqY58omx+EsU8SVYmFZjia7VkmTWH6pRGl4+UOR7OD8HKnYAKHw28OCcVauzRBOy5odu5O8O0jYWK/ZMweMp4r3dkzBJzLI4H98EUO8/oDaj6xSeX/szlIIOhxLrUGGzB1UK7bCoW7DOe9aMXClEx/9LCAE8dB1nuSjMwOKHviaSefuRuI3z3FCjQZT/AGbYKU9mnJK8ODMJI7ypCyhpQ1pKwhZQ0pa0hZQ8oaUvZVnmINKWu4j9fBfRhS1sDIkLKmML0KRBlS9jUGzZCyBhW/KymbErJbDyyG+TTMp2E+DfNpmE/DfBrm0zCf5qhomE9DMLx+qBnm08DIMJ+mMP0KiDLM52sMmmE+DSp+c+bzJajHHfVMSvU5IYe5ua/+x+uu2dMXBHTV3/6jJEl0TwgeEzkQhQGLFL7PT8/hm0sih9O0WqJe7DgkiiaxV+mmwpJXOeoVAk4QK6VSumg8oZQA4m6CY0+g+qk5TR5XMNqxOKJirGkdUDKU7i94oNyRSVIqB38iM+nifEOufMEedWUmVGzOA358orhEYOrJ8+tmoHuBU/j0EKgNyy7SHJJxvYmF/Gi6LTE0XiijdJ8Tlc6oKF51R5BhX8p0KqdTFrl7lXef38atct+2wN71+521CVVsi0FtyvepVFRJt5BPxCyA96yEQQTzhVjMUB3VQk4eKXmqCVV2a/KCrKZexgLNhnAgbGSEYu6hOpoJEUb1Ws3xgtg9kVw3PsG0hkMqMRoRJ+ZULKRKo9O8J4s7gl3CUX0w1AV6gCGFiqJYHhAc0nsC/lHnL9SIxSzg9N+Myaewz5nSAgcAOrurd8bY3zCw6Nq136D4jhfoHBfV0+vq+fv+2WX98qx+/u7k9Prsb1S8F9smp19tbZMr3U6htxP87nJydVG9vD67rl5cXp1Xx28nTvXceX/1dnJ1hSf4Cq1dN+2rVro/2ldt1VhWyZC3ptWQdrOjJY12QVO8fdGuT/K7Ee1K4tn7Bo3f15aj0fTb/L2i1bdJFYjwjSx3mZNeraTQVUs86EDjObW1S8Jy9fshoSlagzxKTxeD5aYQbYrk+hQZHzFYfuda9OdU7dFqkD066bU1f0TaFpiyCdn9sj+ZglynbBLIUpE1ZFmIKo1OE1ma709Pzk5OUbk2FoSh1WFHrJ7z0o8h+woVL6918upO9jkkCPb/XH0AK4MC62OmzVcqxYW15MVOkG+iFnpwZZiklpdplR6gtEqngV0lZiSroKzVEE4o7fUBWi7HOCIP3EsSGFZXi/XB0EKPmFM8BocNoJvOssK8RHOykMdY2farsueBuBerQlw6AkB7VhoNByK/VXaodZ9OuwdZNU5f6eWrxOMYtgZf6wjBi8FAW3YGObZEHmbTWOWfmhP+/Qcuy97e +api: eJztWktz2zYQ/iuaPbUzlOWXnJanKjIzUe1IGonOoRqNBiIhCTFfAUA3qkb/vbMA39bLjtPmwBwcDbjYXXz4dhcLcgOSLAWYE7A5cViwhKkBYUQ5kSwMei6YwIIlFXImIhKIGY8cMIDTrzEV8n3orsHcgBMGkgYSf5Io8pijJre+iDDAMeGsqE/wV8RRtWRUqHHUqCYF68ECzMkG5DqiYALhnKxha2QDQex5sJ0aIJn0cGCs5m4NkJw4tKKFuC5DD4g3LBk8an7fxFziu1WAw7gTe4T/MrCph8v4FYwNMEl9AebOpxVUpttsJJx/oY48DSiHUyKpOyNyJ+RCctx9AxYh91EGXCJpUzKfHtTf1WobHXQD4sj9EUYetNrEiEs9+gOM3Gq1iZEUrvl6xtwT7cQxc08C6/260XOLeL2plRStzEoK2JtaSeHKrKhITAxU1aaTMMnQRB6D54g4kjeRjgingTzi/yF/h0pB0fYjC46gQYPYx5gdDzv92V2vfzt76I+HVrf3oWfdglEY7/Vta9Tv3JcGx9boszUqDXXve1bfLg0NR4Pbh25VbtAfP3yyRlBYQZoS7tDv50tNlxUQn74WJAV4n6hIASEJlzMVN98RZyyQdEn5YbNoqWHrmUAD9z+xagVuZlNIImMxc0L3iNmMEnbHfhjPuoNbC0lhqT0tjA3uKgPWaDR4vp3KbBet7t5Q7ZZPhSDL1++q0tL4lGjZGkCk5Gwey1Mr5wlWdyLuz8sj8zD0KAnU0G5beQX8EHvenyIMmr0gimWhDhaq3rOyuXfS8SNFeSq8qMp2cjyRwE80kBXcEk+rJ4g0WPdlwDQWkd9CEj96k6AoeG5nimta/FBaPJuoj9GMUxfziSJCcZ8rmcJCThWsH3fc0izcGuCx4PE0Or6sJr+04tf0+t/olW5sYdMqBLtnweOL+HWvWHXMcGYuP/DtONIUYa2brLrJqpususmqm6y6yaqbrPq4UzdZNS3qJqtusn5+ev38TdZbdDk7fKlaEjan9GUw2/o93jHtyVvKkX4BCVuUz5GQPKZqQERhIDS/L88v8T+XCoezCFmJS4kdhwqxiL3GKBEG47XvMZ8oF0yL7AvQz4kI9jxhrE1UgqvQwCiJ3SnljYmTup66tYOuIgNoq9C+vtyB52fiMVeh1bA4D/nrwXSpJMzDX3uypxc6pacvyV/TagQU8Aq1g4i7L5aHNrNwxNMi+0UVGA0bnx7bClyXNp3IFfYih1eju38Ztxq+Q2H00baHzxTqvS1vak+9+G/osDfAp3IV4gcBUShQX0TkCkxoRZw+Mfp3S+rQbKn7mpb+agATEuXIMrVDMffAhJWUkTBbLccLY/eMLGkgyRlhLRIxqPrQUU8bXRRV/BbUiTmTa6WvM+zd0fVHSlzKwZxMiwJjJJimTFksD6KI3VEET58PoRPLVcjZP5oHBjB0YKVnITpI3VH+5YP1jfiRRwtXVJNN6QIIU0+7ed5uXrTtiyvz/MJsX5+dX9/8BeU7nENyxWuYQ3KVmxS4WpDf2oub62b73cW75nX75rI5v1o4zUvn95urxc0NWZAbeHY1cuq0yl3HqdPyo0weKdlhKB8q3EJU5PRlwt6bgkJnXphYaLAPIZg3xIekSi3szv602k3mnpROZoUOZpJ2KMX8kXUih7wpa0T2JyVjstkF7C78qypUDUm/qUHWs2ARqqBJz0M6It8T55EGeOLIyh+cn12cne8L4WRCozPsJdWBODLvzhIx5GQpSWTpAbfIV6UBJCX+H/kD9BJzkk+Cgr5K9ir5lKUASb/JVuQRpvK+srxJEtsEksSWAJfTUKjcoNLb1IAVZkNzApvNnAj6wL3tFoe/xpRjkpoa8EQ4I3MEb4IFaJWmqw080rWq96pSNlWZQHEv1umpUjWxoukZHcehkTwoOy0k7OFgjMycJ59r+Zq8nODS8K8JgB994WyVL9XYBjwSLGPNYa0T//0Ll5Ta6g== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Ingest Spans - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, `SPAN_KIND_SERVER`, + `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/ingest-spans.api.mdx b/docs/docs/reference/api/ingest-spans.api.mdx index 0a5d66d840..b3a93a6476 100644 --- a/docs/docs/reference/api/ingest-spans.api.mdx +++ b/docs/docs/reference/api/ingest-spans.api.mdx @@ -5,67 +5,898 @@ description: "Ingest Spans" sidebar_label: "Ingest Spans" hide_title: true hide_table_of_contents: true -api: eJztXG1z2jgQ/iuMPl1nTEjSvLR8Opq4Ey4tMED64RiGEbYAFVv2yXJSjvF/v1nJNrIhvDXtpR31Q17ErlbafXZXftR4iQSeRqg+QH2OHcqmaGihICQcCxqwpovqiLIpicQoCjGLkIU4+ScmkfgQuAtUXyInYIIwAT/iMPSoIxVrX6OAwVjkzIiP4aeQw7SCkkiOy9lAiS3aE1QfLBEVxI/WJR1OsCDuCIuiuFiEBNVRJDis2kKTgPsgg1wsSFVQn6DEysVY7HkoGVpIUOHBwI2attIQKLFQHLo/wsiDmjY14hKP/AAjt2ra1EjmrvFiRN097cQxdfdy1odFpenq/npRK5m3ciuZw17USuau3Irg2CGpgfK0mRIkB0nlAbo7xHshZql0iDlhYsf6t623IycorFWJbnMHYbEPSU3ZY6AyElkIMxaI7JeYzVnwxNCwtMk+zLS+nmzf+5vGUygLFnJmmILBp4DPJ17wBG7C0Ry+BYEHCv6YuK5S/icmfIEs5Hk+qAZ+6JF0wc4MC1l+OGbzzRsAt+9Y/5yyHUjK1t/rNFqj+2brdvTQ6nXsm+bHpn2LLG282erb3VbjU2GwZ3e/2N3C0M2npt3qF4Y63fbtw01Zrt3qPXy2u/qW2n3iwbbuYd3Pb4thf2tYtgFMgrWFZZVBkcBcjGTN+Y4aRZkgU8K3mwVLlb7SRIS5P8WqzdzcZiSwiKORE7h7QrrXb/QfeqOb9q0NoLBlTLWx9n1pwO522+vhlGZvwOrmgKpl+SSK8PT4qMpZKp/TWRILYSE4HceClPoudl0KOYa9TqHx7mF1o8f9cXFkHAQewUwObbaFHMqd2MP8j4+x5/0VBazaZGEs3kCRUJME46/EEXKO9JywhxLmHC+2eqmoKivsmr3ndBsrfyZQlyaEE+aUfffMqeaR8IiqI9Ix0f2SqgNcvHh6NEhAN7HQy3VX1aYM1H4c1NYUi9Wlm+FQs7B7cd0VehMLeZTN94PxYWehQ09aBkY/FUbwZEc5caHVZYHVglZqY58omx+EsU8SVYmFZjia7VkmTWH6pRGl4+UOR7OD8HKnYAKHw28OCcVauzRBOy5odu5O8O0jYWK/ZMweMp4r3dkzBJzLI4H98EUO8/oDaj6xSeX/szlIIOhxLrUGGzB1UK7bCoW7DOe9aMXClEx/9LCAE8dB1nuSjMwOKHviaSefuRuI3z3FCjQZT/AGbYKU9mnJK8ODMJI7ypCyhpQ1pKwhZQ0pa0hZQ8oaUvZVnmINKWu4j9fBfRhS1sDIkLKmML0KRBlS9jUGzZCyBhW/KymbErJbDyyG+TTMp2E+DfNpmE/DfBrm0zCf5qhomE9DMLx+qBnm08DIMJ+mMP0KiDLM52sMmmE+DSp+c+bzJajHHfVMSvU5IYe5ua/+x+uu2dOXA3TV3/6jJEl0TwgeEzkQhQGLFL7PT8/hm0sih9O0WqJe7DgkiiaxV+mmwpJXOeoVAk4QK6VSumg8oZQA4m6CY0+g+qk5TR5XMNqxOKJirGkdUDKU7i94oNyRSVIqB38iM+nifEOufMEedWUmVGzOA358orhEYOrJ8+tmoHuBU/j0EKgNyy7SHJJxvYmF/Gi6LTE0XiijdJ8Tlc6oKF51R5BhX8p0KqdTFrl7lXef38atct+2wN71+521CVVsi0FtynepVHrpu1R8ImYBvGMlDCKYL8RihuqoFnLySMlTTaiyW5MXZDVoM4QDVSNjE3MP1dFMiDCq12qOF8TuiWS58QmmNRxSic6IODGnYiFVGp3mPVncEewSjuqDoS7QA/QoPBTF8lDgkN4T8Iw6eaFGLGYBp/9mHD6FHc6UFmwdcNldvS3G/oaBP9cu/AbFt7tAz7ionl5Xz9/3zy7rl2f183cnp9dnf6Pijdg2Of1Sa5tc6V4KvZ3gd5eTq4vq5fXZdfXi8uq8On47carnzvurt5OrKzzBV2jtomlftdLN0b5qq5aySoO8Ka2GtDsdLV20q5nivYt2cZLfimiXEc/eNGjMvrYcjaDf5u8Vob5NqkCBb+S3y2z0aiWFflpiQAcaw6mtXVKVq98PCU3RGuRReq4YLDeFaFMk16fImIjB8jvXoj+hag9Vg+yhSa+q+cPRtsCUTci+l/2xFOQ6ZZNAloqsFctCVGl0msjSfH96cnZyispVsSAMTQ47YvWEl34M2VeoeHmtk5d2ssMhQbD/5+oDWBmUVh8zbb5SES6sJS92gnwTtdCDy8IktbxM6/MApfU5DewqMWE6aDIzKOf1AVouxzgiD9xLEhhW14n1wdBCj5hTPAZXDaCDzrKSvERzspBHV9nqq7LPgbgXqxJcavvQkpVGw4GYb5Udah2n0+5BPo3T13j5KuU4hk3B1zpC8CIw0JY9QY4tkYfZNFaZp+aEf/8BA1jYJg== +api: eJztWktz2zYQ/isanNoZyvJLTstTFZmZqHYkjUTnUI1GA5GQhJgEGQB0o2r03zsL8AHSetlx2hzoQ+yAi93Fh293sSA3SOKlQPYEuRx7lC3R1EJRTDiWNGI9H9mIsiURciZizASyECdfEyLk+8hfI3uj/ks58ZEteUIs5EVMEibhEY7jgHpKUeuLiBiMCW9FQgx/xRzMSEqEGlfaYRJbDxbInmyQXMcE2Qhzjtdoa+UDLAkCtJ1aSFIZwMBYzd1aSHLskYoW7PsUPMDBsGTwqPl9EwuJ71aBPMq9JMD8l4FLAljGr8jaICpJKJC982kFlek2H4nmX4gnTwPK4wRL4s+w3Am5kByYYKFFxEOQQT6WpClpSA7q72q1jQ64gZLY/xFGHrTa1IhPAvIDjNxqtamRDK75ekb9E+0kCfVPAuv9utHzTbze1EqGVm4lA+xNrWRw5VZUJKYGqmqzSZBwSCoPwXNEHMibSseYEyaP+H/I36FSYNp+pOwIGoQlIcTseNjpz+56/dvZQ388dLq9Dz3nFlnGeK/vOqN+5740OHZGn51Raah733P6bmloOBrcPnSrcoP++OGTM0LGCrKUcAd+P19qtiyGQ/JakBTgfawiBQmJuZypuPmOOKNMkiXhh82CpYarZyLC/P/EqsP83KaQWCZi5kX+EbM5JdyO+zCedQe3DpDCUXtqjA3uKgPOaDR4vp3KbBes7t5Q7VZIhMDL1++q0tL4lGrZWghLyek8kadWzhOs7kQ8nJdH5lEUEMzU0G5bRQX8kATBnyJizR6LE2nUQaPqPSubeycdP1KUp6IXVdlOgScQ+IkwWcEt9bR6gsiCdV8GzGIR+C0kDuM3CQrDczdXXNPih9Li2UTLOEdPNBHMfa5kCgc4ZVg/7rijWbi1UEDZ42l0fFlNfmnFr+n1v9Er21hj0yoEu6fs8UX8ulesOmY4N1cc+HYcaUxY6yarbrLqJqtusuomq26y6iarPu7UTVZNi7rJqpusn59eP3+T9RZdzg5fqpaEywl5Gcyufo93THv6xnKkX0ii7RYmcCLiiAnN58vzS/jlE+FxGgMLwfXE84gQiyRojFJh9Or3lk+EC6pF9gXk51QEepwo0SYqwWQ0LEpidwp5Y6Jkrmdu7aCnyAHS4F5f7sDzMw6or9BqOJxH/PVg+kRiGsBfe7JlEHmlpy/JV9Mq4w28Iu0g4B6K5aHNNI50WmS/qAKj4cLTY1sB69KmUzljLwp4Nbr7l3Gr4TsUNh9dd/hMod7b8qb21Ev/xjh96R8SuYrgY4A4EqAvxnKFbNSKOXmi5O+W1KHYUvczLUg9hAO/1N4kPEA2WkkZC7vV8oIo8c/wkjCJzzBt4ZiiqvWOetrogqhitiBewqlcK32dYe+OrD8S7BOO7MnUFBgDtTRZymJF+MT0jgBs+iSIOolcRZz+oxlgIQoOrPQswAVIOyq+eXC+4TAOiHEZNdmUrnog6bSb5+3mRdu9uLLPL+z29dn59c1fqHxbc0jOvHA5JFe5M0FXC/xbe3Fz3Wy/u3jXvG7fXDbnVwuveen9fnO1uLnBC3yDnl2CnDqtcqtx6rTi0FLESH7sKYaM+4aKnL422HsnYPTgxkSjlT6EYNH6HpIqNas7O9Fq31h4UjqDGb3KJOtFzMyR9xyHvClrBPanxWKy2QXsLvyrKlT1yL6eAdZTtohU0GQnHx2R77H3SBicLfLCh87PLs7O94VwOqHRGfbSuoA9WfRhqRhwspQk8vQAWxSqooAkweEfxQPwErJRiJmhr5K3Sj7lKUCSb7IVB5iqjK8sb9KUNkFpSkuBK2gI6iAvryAD2hO02cyxIA882G5h+GtCOKSnqYWeMKd4DrBNoOisskS1QY9krWq8qo5NVRpAPEh0YqpUSqhiekbH80gsD8pOjSQ9HIyBk/P0E61Q05ZjWBT8ayMEH3nBbJUp1dgGBZgtE81erRN+/gU9ONQy sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Ingest Spans - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+ required +
+
+
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, `SPAN_KIND_SERVER`, + `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/inspect-workflow.api.mdx b/docs/docs/reference/api/inspect-workflow.api.mdx deleted file mode 100644 index eaf5f4c8e4..0000000000 --- a/docs/docs/reference/api/inspect-workflow.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: inspect-workflow -title: "Inspect Workflow" -description: "Inspect Workflow" -sidebar_label: "Inspect Workflow" -hide_title: true -hide_table_of_contents: true -api: eJztV01v2zgQ/SvGnLYAG6dBTzqtd7eLuu0iRpy2B8NY0NJYZkuRLD+ceg3992JI2ZJix00M9LTxxSI5MyTfm3kkt+B56SCbwWdtvy6lvnMwZ6ANWu6FVuMCMhDKGcz9v3eNCTCw+C2g83/oYgPZFnKtPCpPn9wYKfLoPPzitKI+l6+w4vRlLIX2Ah211midSCZcba6XkM224DcGIQPnrVAl1Gzfo4KUUM8ZeOEldXxq3GsGwYpzo3y0IkWQ50eQFGGFvEDr+lF4UQjCgstJb+utxa+CxMlQnhtmSr41A1GcisBgqW3FPWQQgihORhwXUNdsN6wXXzD30A7f4BItqhy7QXYLnR84nprpbUMDQRDz7rGM/JSpB/ETymOJtr+satHvWWgtkavYdXwuyIXNg+T2t7+DlO+cVi/HygT/Ao7tX3isHufEreWbk5j1XeEI3k8gYNqgXjOouDFClY9k4D6+T5jzn91Ep5JsJ3FTtGuR41h5tEtOOUdeJGnCYgGZtwFjhzNaubS2q8tL+ivQ5VYYH0sUpiHP0bllkIObxhjYsxg+i+GzGP4KMbwO/gw1PPB6ghwm3/+jHtYMXl9dHUreJy5FEQVt8MZabc/XuwI9F1FmGu7uG0id90afknudKkl0t7v+oNMCIx+uPAS6gyI6x0tsoX/YNIIxuKXRY5C3h8ss7itN3dh1JWsPb0L34W38leA7xe/b29vJQcDEbZ/UcbrgDz63F/wK/UrT5d9oRzEN9yvIYGgsrgXeDXdvATdsXgfAwKFdR82fbdMJAivvjcuGw1zqUFzwEpXnF1wMuRExXR3mwQq/iS6jyfg9bpJiQTabdw1iDaW06JvtGeFGvEcCSPGK2qPgV9qK/xLXDARtNJ1KETRKz5v2FfPmO6+MxN6p07IcT9RuU3ab7VnXk9l+vdOcQi11XHJD0CgCMhhNxsA6015evLq4hPsk9Yyp5ngea2633zi8X9wO+T3mwACrWHDgkVe/twO0MmK54qoT70hO9NazB97jdz80kgvVuTmkdJlBky7AYJ8wkYuUMnMGK0qvbAbb7YI7/GhlXVP3t4CWsmLOYM2t4AvCazbfXyxiwnzFDWTwZ5Kfl7H2yFyGlA/3pIhkInmM8hyNP2k771TA5Hp6CwwWzVu30gX5WB7fwfwOMgB6MZN3TNDYtwXJVRlIPTJIMen3A+hBT+M= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Inspect Workflow - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/invite-user-to-workspace.api.mdx b/docs/docs/reference/api/invite-user-to-workspace.api.mdx index 0acb514d02..50beb5d89d 100644 --- a/docs/docs/reference/api/invite-user-to-workspace.api.mdx +++ b/docs/docs/reference/api/invite-user-to-workspace.api.mdx @@ -5,79 +5,407 @@ description: "Assigns a role to a user in an organization." sidebar_label: "Invite User To Organization" hide_title: true hide_table_of_contents: true -api: eJztVktv4zYQ/ivEnLKAaqdBTzrV7aZYY1skcLztwTGCiTS2uCuRCkklcQX992JIPe0k3UWBnjYXR5z3NzMfWYPDvYV4A1dmj0r+jU5qBdsIUrKJkaX/jGFhrdwrK1AYnZNwWqCoLBkhlUAl9Mh4dqtu1cLsbXyrhBAT2Z1MxZl15l0s1hmJ5Xuhd8JldOyA7Uo85BpTcbZUj9LRih4qsq617ISJVg6lkmp/4kbINAo5UoEyjwSqdMje19NGetLmiy0xoVfT6zV8cStylVFdffda57FYm4qEDNo+yBNaYaskIWt3VZ4f2pCURuI3zC0J7TIyT9K2PlFa6lx+WK+vL58T8ujHYhnc+lpSTVYo7USGjyRKMoW0lqt1mr922hTCZdIKTEZYvujQkGA9JcgYbdr8OiQ7oLrAM4hAl2Q8tMsUYpC+LXcsvHP6rocIIijRYEGODE9WDQoLghiOBgEikDxaJboMIjD0UElDKcTOVBSBTTIqEOIa3KFkc+uMVHuIwEmX88F4YsUyhaaJ+ljjlv7nQH91zkKUbfBB1v2i0wMbHrvkqSTlWIRlmcvE5zj/bHmX6tOIaAweOE1HheXz0jDWTpL/8vP7VoKXXqGJgLvmTVAdrnYe/N7n1LiJpsEZu/ZAVXkOXGXnfuW9NoOJvv9MiZtguWmzHJlN9tYHbAXXYXmhadinIVtqZUPeF+fn/DMln5t+jcSqVYavBzlE+eni4tTxn5jLNMzPJe/AN3g9alFKru3RKz3MdTKRDg067kt/IpWjPRlotsfNGqD8XYcEGd7C7t8akj/IWtzT0Pk35skTwpql/9Z1riuEbvVGAzDAG9B9vYz3Ab6XgnUqTGEnDkNvC3KZZkoqtXWeflwGMczHhGPn9RH/NPOeJOy8HhNGMw/cBhFYMo8djVUmhxgy50obz+dJrqt0hntSDmco51hKvzSWkspId/Ami+vlRzp8IEzJQLzZjhVueJTCcEzVBloo5UdimFpSW1Qu06a7o1tWy4IV48BDuhqY6fIZi5Kx2/QUMrS6ZYpNd+JTk2qnffwW84WvTiyulxAB4xDW5nz24+wcTp4IY2V/Lyd+jbrkvRiiIxh7ACHqk3SExc+DgEvjzhaoRv4Cu4hPfCmutZg8X45Sq4et/v6Q+f6Q6TnG0bOblzlKT59+LuuWPDaT14qFCOLT58vAHyw/eXJ4CtlGkDErxRuo63u09MnkTcPHDxUZZoltBI9oJN63q5pKy/+nEO8Y3jdm+WzVEvE78VpRHZMoppFHzCv+ggi+0OGFFxlfPv9j+Ali/pbLOqasW5VfQ7Qf/F00uDi5mjnzYLFIeDre1N2Orozrq5s1RHDfvuQKnbKNwSfmSHwK6eoyTAE/9fishhzVvuLbNIbgk//+AaHXmm8= +api: eJztVk1v4zYQ/SvEnLKAaqdBTzrVu5tijW2RwPG2B8cIJtJY4kYiFZJK4gr678WQlC3HG7dFgV7aXByR8/lm5g07cFhYSFdwZQpU8nd0UitYJ5CTzYxs/GcKM2tloaxAYXRFwmmBorVkhFQCldAj5cmtulUzU9j0Vgkh+O5O5uLMOvMuFcuSxPyj0BvhSnqtx+INbiuNuTibqyfpaEGPLVkXNYfLTCuHUklVHJkRMk9CaFSjrBKBKt8H7dOInp61ebANZvRmeDsJn9OCXGvUkNa91lUqlqYlIYO0d/KMVtg2y8jaTVtV2+iS8kT8hJUloV1J5lnaaBOlpcHkp+Xy+vIlIw96KubBrM8l12SF0k6U+ESiIVNLazlbp/lro00tXCmtwGyE5TcNGhIspwQZo02Mb0ByAGpwPIEEdEPGQzvPIQXpy3LHl3dO3+0gggQaNFiTI8MN1YHCmiCFUH9IQHIjNehKSMDQYysN5ZA601ICNiupRkg7cNuGtawzUhWQgJOu4oMrU4h5Dn2f7CyPC/iP7f82GAte1sEGWfde51tWfG2Se5CU4ytsmkpmHqPpV8sD0x17RGNwy2E6qi2fN4aRdZL8l+/WUwFeeoE+Aa6RV0G1vdp4qA9cMELxQLVVBZzLYGThdfs+GST0/VfK3AFiqxjLSO1gFjmG4eI6DCT0Pds0ZButbIju4vycfw555GY3GmIRheGvQxm8/HBxcWz4V6xkHgjgkvv6b1h9VYicXKzEG5WqdHZwe1SGWLpRHaRyVJCBfr1HfuiHAcqfdQiQ4a1tcaoVfiFrsSDYGTvRNX7Il3z7Z1XnvILrKDdqgD28Ad230/gY4PuWs0GEaenIYKhtTa7UTDONts5TiishhemY4e20C5zST3cMYKfdmA36aaApSMCSeRoYqTUVpFA619h0Os0q3eYTLEg5nKCcYiPhaO/5W/GBRf0gWcpaI93W25tdzz/T9hNhTgbS1XoscMPtFRrmUGw/rY38TAxdpLNZ60pthhUc+awMWowNN+5iz0mXL1g3jOdqRx778keOWA0nPjSpNtr7j3WIyb3H7IEUMygDFfI+n3w/OX8LjaggZtfzOGaY+TEbEvFikLzCe4c0JLuAHWH94/6C0+TK16hG9gL7iC+8CJdaHLxUXoXY7af+/zfLf/jNEkfM0YubNhVKz6q+HbvIKSs44BRIIN29VPa0wsdHzwzPLOsESuaodAVdd4+Wvpiq7/n4sSXD/LBO4AmNxPs4pLm0/H8O6YZRPdG5Z4tIy+/EW7kMHKKYQJ6wavkLEnig7f7NxRvoX/R6AJRfdeVAjV0U+RC8fecX0t7E0X7myIPGLONeOCm7Hu2N66ubJSRwHx9ttc5Zx+AzkyI+h3B1E2rOrzo+66BCVbS8UlMINvnvDxCnhYQ= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/organizations/{org_id}/workspaces/{workspace_id}/invite"} +> Assigns a role to a user in an organization. Args: - organization_id (str): The ID of the organization. - payload (InviteRequest): The payload containing the organization id, user email, and role to assign. - workspace_id (str): The ID of the workspace. +org_id (str): The ID of the organization. +payload (InviteRequest): The payload containing the organization id, user email, and role to assign. +workspace_id (str): The ID of the workspace. Returns: - bool: True if the role was successfully assigned, False otherwise. +bool: True if the role was successfully assigned, False otherwise. Raises: - HTTPException: If the user does not have permission to perform this action. - HTTPException: If there is an error assigning the role to the user. +HTTPException: If the user does not have permission to perform this action. +HTTPException: If there is an error assigning the role to the user. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ + + +
+ +

+ Body +

+ array + required +
+
+
    +
  • +
    + Array [ +
    +
  • + + +
    + + roles + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/invoke-workflow.api.mdx b/docs/docs/reference/api/invoke-workflow.api.mdx deleted file mode 100644 index 7649c17bed..0000000000 --- a/docs/docs/reference/api/invoke-workflow.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: invoke-workflow -title: "Invoke Workflow" -description: "Invoke Workflow" -sidebar_label: "Invoke Workflow" -hide_title: true -hide_table_of_contents: true -api: eJztnVtv27gSgP+KwaezgHJp2qS7fjrZxIvmNE0C2+0CJwgCRqITbWRJS1FpfQL99wPeJOpqSbbTODt9aGBZvA2Hw5lPFucZMXwfoeE1+jOgjzMv+B6hGwsFIaGYuYF/5qAhcv2n4JHcfld3IAuFmOI5YYTyos/Ix3OChkjfcOs6yEKuj4bo75jQBbIQJX/HLiUOGs6wFxELRfYDmWM0fEbYX1zORDVsEfJqIkZd/x5ZaBbQOWZoiOLYdVBipXf4seeh5MZCzGUev6A7PzhzUMJvLPYo8uL7NfSpVR8mvK3KXjxh6mKf/UT5fJM9qJWT7uFLykv3qV5ulDy5kRv4P1FwY9WFWsmlfXxJ0aW9aiG7J0L53xfv2jfVbsJv462RiP0eOAveQtY4ozGxkB34jPhMNB6GnmsLI7T3VxT4/FrWtZByE8VcEvFP2TIn9Mm1ya1qpnznzBPmzhwbdhyXt4K9q9ytpdHfBYFHsG8OXwvkJrH0peDuL2KzRhn9ITqRWGhOGO7ZmfJUuD4j94TmW57f5a+YY6huC9kutWMP03/9EXvef6LA3znzw5j9gqqG6DIyb1cIU4oXzWLJFUWdRPqFS5KX6D+9LyDRi+DcjdgymdaNsVi6m4SmSue0Gei5vtPVbCEHF7U3v9ZMJ+G1zsg26fhVJs+EG/EwZiDZtUj2TMoysVAQMxBrT7G2sB6XSry8Goptcgs2Yr2aPOVSHeQthZQ02It1SzmzGlLCYDs2ajuk0IsWpMkBiULsd56OlavIRHc5Jd4kxP4vqEqwxrcFkXaLJiaii4mFbEowI84tZi2jXwczssPcOWms/0RWOzgWMxiHziYa+SqrVY04xCMbaORUVqsa0eK6W3CssCZeoIX1+0KAgkxea21FSyttRQtsra1ocaWtqI1ENFCstmAaxf188Sy5nSuvujvElEg21jM0uRIV5Poqb20SB/HjOV+0nHFK2oAshH0/YPpD7D/6wXcfFU3RlNdU7o8ed/um8T1HHhayH7DLGzQ4K8PRI/8TBB4vML8jjiMLa3zjeXNeNJiHHlEdth8wE2CHYv+xegBc7Ev6/+j6SzRJ939ydXxx+/ns4vT268XkanRy9sfZ6BRZxvWzi+lofHF8nrs4GY2/jca5SyfnZ6OLae7S1fjy9OtJ8b7Li8nXL6OxOSRtTj/zftcPS+KxfgomlPUCCyuDIoYpuxU2ZwUbVbnHF5vlLQ2msiQivvMirY58J20zYpjF0a0dOC1VejI9nn6d3J5cno64UozEnBrXLj8XLozG48vydIpmT3ir1RMquzUnUYTv+8+qqGXwRdWSWAgzRt27mBVdA/Dl+rnLx5k8E26XZoQS3y7KTvW26IGtj1cJMN9XSQRft9D6dle5TYGqbU7VSgXz1mWs9dBoYXnnxpn2JhbyXP+xnRp384W6elqgRi+qRtljq+t0Yo1JK2xj567/2EnHzoVWJRZ6wNFDSzMJhmmrNcrUl084euikL5+kmnDn8IdNQlbaLmHS+k3aKBUnl+0T8Yt0r2Yx6iCjznTrGIL75RHD83AtzrwZoKYVw1L+mZuDUARzngtbw4jrVKe1PpJauKzhdC/KKExFrGyKFcgnkE8gn0A+gXwC+QTyCeQTXEUgnwTI51aqGpBPUCMgn2CYtkGjgHy+xkkD8gla8cbJ5zrQ4xJ7Ju6aUlITxTH+TcOPT40AoG49GU6+HzhqQ6xemptlWJ47I/bC9hoH1I7TrhvJtqevrZFlJ0SZ1bp6lY0qd07usb041zNxOr2s1jsaBBWvRlZPdd57yvtKS1ZifuWNg4DJHqV6v2r7uvkNUE5SCzk7DZpXpAbtK4S0+qBb77GdOazBXzWSXc5hGwhs7uVFZwWRqkEX6lOSlfi8ye5sWLUlfq9dbppZFsJizjYbu5X5PAUiqmBo58Ijf/nIZLdk/QW3SolbssfygDQjrVMyTUMFAS1RzxzxRCuCzZRoLhms6HKpE2qcNRFFYVM1/dhOk5FzVPVSrd2X5cpZm1zELNqPFW/QdKLHuobOrrZ8238jjmc2I+q+qqimdq2W32lezwBOsXw/fU4Yde2NyOiLqrrDuQI9msAKZG9kCGNebye4WLdwVt32+3kjlJA1PoXm3Rm02IzEd1ZhT+IkTbtbnelbwIjXZPWWPSFtakQ9pXxBg7F5gFFrtvvDiA1ayFaheVfd0dF5l8UrTnv5URGKbDJUXRkfnMheKwG9mlnVwqxA8D3twBK4MfrBKK7dSFMa0f/dWwAWACwAWACwAGABwAKABQALABYALABYALAAYAHAAoAFAIufDiyy3+PwyTqdXla/7pZ9WRhRt5+cXIgO9lAHFT+rMFYFdsrLT73jwm9btJjgtySAZgDNAJoBNANoBtAMoBlAM4BmAM0AmgE0A2gG0AygGUAz5Oegme3o7zEPBrERX+V63bVDWQYzqRGlhtTbUMTJYuU2AaKuROcum8gsYsrPqoIeNQc51GnlP+dchwbpVp060M6Paz52oJ3QDbPe+wCc8gkFfarKNpsm/JZ/c76FnFKHy6bEIT5zsdf2ndYqMppWwdWM2JS0S2zSdVOaqKo7LMuxyu2XWBVJDpflJFvf2oup2xvBUlfW4PWvweM1PBDs9EidBOaoYI5KHe22nX5S05Do5JltZwReQ294Db2LFVFS57gCh6Hrt00CWZRvF36hGxKzTt2w93OjiSydWJAxcc3nFeTzoKnksJvZxmTViUhhO3PvY5k+exNtneQaaLNx6lS8dQ7tEre7Nruu0Sme0Pe2mCc8SRLhLEdh4EdSYw/29/kfh8glI0SEJrFtkyiaxd5grG5GvXMBr287W/fBQm8qX6rMw9Z1+ZdKdVj/suwqBmBrUiBuh3C3MWvqq5RsC7O03YlTX6XUawLzrc6duk2C3t70qa9Syq3JE2RQrTnMC/IIQB4ByCMAeQQgjwDkEYA8Al1mdbvzCLxKd27Jr5AglYAB1kDbNqptkE0ANGljmgQJBUCpNmqe/iE5BbZj3iCtACjGqrvE688sADlVgYUCCwUWCiwUWCiwUGCh4C0CCwUW+ia0DVgoaBKwUDBP26NUwEJf6bwBCwXFWHWXeP0sdB0wcolVgyyrcDImnIypQgk4GRNOxoSTMeFkTDgZs+yr6qVauy8v4GRMOBkTTsaEkzHhZEw4GfMlQnM4GRNOxmyGG5BlFYAFAAsAFgAsAFgAsABgAcACgAUACwAWACwAWACwAGDx9oHFm0/lAb8lATQDaAbQDKAZQDOAZgDNAJoBNANoBtAMoBlAM4BmAM0AmvlpaGY7+vtGs6xCrs+l234W2TlkhmOPZWHd4f6+EX2gY38Q++RHSGyOpQilAR0Eth1TSpzdwZVHcEQGjC4G+B67/sDDjNBdEatXhowlYbQ5BOZE6nHa1cP9/RbQo1G+642yjL71F9h647QGvZGxb7fUqSq7mszM9uHgAJWSsX3DnusIl3sw4oPun4nNIQy7wiut8Sa8wM592+Xd4Jt6M3eu4weuGNF9k49hhNfLAnohjIFUuCUWlI9LNl0OaDPxSunWD+NUiq9pej9Np1elCuXc5if1TGTmG/yZ0cI5YQ+Bg4YoDCJeZYjZAxqivZCn0iXf9zRYjPZkVj8k8yeKfFPXzzJ3LXpgLIyGe3u2F8TOrmCSeBe7ezh0hUJHxI6pyxaiyPHV2WeykLlS0fD6xrxBJPCUSpG/LZ0PHLqfyUJjxSE6jtlDQN3/6eDQ5cOU+XCFyLhyqkzBPDfh6AfmzJNXWJvOcPiMZh4WqUOziJxLP72WviqcqYfGD7l8XGauuVx6tKQyfVdSyjOVlJMiJUa6Hn2OZGKg+Yq+KY/u2nTPs2/TXTK7lHskZD76yW4xH+CUr6rHMFVfmMs5fZ4hbn4/w78ezo4+7Bx+fPdx58Ph0cHO3fuZvXNg/3b0fnZ0hGf4yHwI0b6QlZmNJ8MoaLDfpSKldplZUGp5r16wz5B2tzEp0qzYMjrYP/iws/9x5+C36bvD4eG74cGvu/sf3/1X8d2GG3LegNymU4CbuQHZFORgqREbN3WhaBtL9eZ3v+xqLuZKMmqX42u5RaeAVeYGmq6GQYg6KYOmPS2n5ybjKpKf1A0o4xXXz2VNMWRbJ5Abc5hGkN1q3RZj2iQXziXSG88dkmY418WE8UY7adb3pDHVeoXhEbnRzY+e+THLWp5LmJ1P3mxkVc5KFq1mltG3IvGu2AZdfxZIBTcjmMHx1Rkyzfn+7rvdfVTcNXM381nBNsuIk/o6HZ/eDNNtUDx9Ex4QYgTP/519wXvG99059o36ypt0rjup/nPl2As9/rQvyyIv9+9rpPZv49FgJHZHsYffWOiBb/fDa/T8fIcj8pV6ScIvy0eDXPscN8J3HndkZtiLiIUeCbfd6fyL+PQJezHvinDNlpUQx+R1LPOEqYvl+a09S/ZpNdXt7s2mRVdqN4u9s/I3/AN1eQXCbdILSMyWrOhEOug7U8mVddmSs877Iksc29z6N957YziJV5cTvo/cBY74RcRcbi8Ucz3j/w8RslAgFFXsP+LaM/Kwfx/LDULWyf/9H53l6Bw= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Invoke Workflow - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/list-api-keys.api.mdx b/docs/docs/reference/api/list-api-keys.api.mdx index 4322c1a472..80f3651c79 100644 --- a/docs/docs/reference/api/list-api-keys.api.mdx +++ b/docs/docs/reference/api/list-api-keys.api.mdx @@ -5,65 +5,186 @@ description: "List all API keys associated with the authenticated user." sidebar_label: "List Api Keys" hide_title: true hide_table_of_contents: true -api: eJzdVMtu2zAQ/BViTy1A2GmPOlVogzZIgAZ5nBzD2NBri4lEMuQqjWvo34ulZPlRtIce64PNx+54ZjjkFhjXCYoZlMGqS9okmGtYUjLRBrbeQQFXNrHCulbl9YV6pk1SmJI3FpmW6oflSnFFCluuyLE1eblNFCcP7sGVcZ2KB6eUUpFeWkqs3t30g/eFuqtIWWd8Y9163PePT2Q4d98Qt9HtAITITL7K6wuhekMpeJdoXqhS1cLSrzLJyz+RzLRAgw8UUeRdLKEAaV1gsAsRBxrigJug2MLHszP5ObbktjWGUlq1tdqRAA3GOybHUo4h1GKF9W76lKRnC8lU1KCMLFOTwUMUJmxpmNHKvsmIN4GggMTRujVoYMu1LFz3FZ0GE0mkLZD/Vv+5r1IlS0+NiRdtGrvQbb6voJid9nd6XHFtXUM33yNeYWJ1n0ZMegu2t3KxRKZ/hT0fYdQXgek6vavt45CP5aW1kZaS1sGqIx8OWf4eEtgjYoy4OXBpV5IDpsaL0MlHQ0NceYnJmoRFQK6ggOmQlUTxlWLKcttYQwEVc0jFdGpq3y4nuCbHOEE7xWCz5ESmjZY3uaUn+Y1wSRGK2fyw4Fby0ifjuGy0EYO9JFHisJF52XLlo/2ZjQQNVrJa9V0ixbqVz+2D8DKTkysDGkRGn+6zyYfJGZw+A0fFEnU0OUW7/87boE9cGPWDBmrQyh4TNp/2G8Is+MQNugO847M4IbPd37X/8XkajpfpjaehRuskvNnX7ZC/GTwPb3XlE8t8u33ERPex7jpZfmkpSsTmGl4xWnyUA5/NO73Lg6TvmTZycsZQkGi/Yt32sTp5vCSV4zX4en4HXfcLULMi0A== +api: eJzdVE1v2zAM/SsCTxsgJNmOPs3biq1ogRX9OKVBwMpMrMaWVYnumgX+7wNlx00ydIcdl4OjD/Lh8fFRO2BcR8jmkHurLmgbYaGhoGiC9WwbBxlc2sgKq0rlV+dqQ9uoMMbGWGQq1E/LpeKSFLZckmNr0nEbKUzu3b3Lwzpm904ppQI9tRRZvbvuF+8zdVuSss40tXXr8b55eCTDKfuauA1uDyBE5vLJr86F6jVF37hIi0zlqhKWzSqRvHiLZKIFGhpPAaW88wIykNQleruU4kBDGHAjZDv4OJvJ37EkN60xFOOqrdSeBGgwjWNyLOHofSVS2MZNH6Pk7CCakmqUlWWqE7gPwoQtDTta2RdZ8dYTZBA5WLcGDWy5koOrPqLTYAJJaUvkv8V/6aNUzpJTYeRlG8csdNsfK8jmp/mdHk9cW1XQLV4RLzGyuosjJr1420u5LJDpX2HPRhj1VWC6Tu9jezuktjy1NlAhbh2kOtLhkOWfJoFXRAwBtwcq7UOSwdQ4CJ38NNTEZSM2WZOw8MglZDAdvBIpPFOIqdw2VJBByexjNp2aqmmLCa7JMU7QTtFbOB2tPN2qLxKa9Ihk2mB5m/D6Cr4TFhQgmy8OA27ETL1tjsNGjdHbC5IyHdayz1sum2B/JZVBgxUCZZ8ldVq3alL6oMrA7TOaDbkCNEidPe3Z5MNk9lYxQ4IM4jATaJLd9jxSGOgTuUahQAPVaOWOCetPrxfC0jeRa3QHeMdNOyG1ex3K//EdG1rN9MJTX6F14vKk624w6hw2w6NeNpFlv9s9YKS7UHWdHD+1FMRuCw3PGCw+SPPni07vvSFO3NBWOmcMeZmBZ6za3mInr5w4dJyXb2e30HW/AYK5MV8= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + List all API keys associated with the authenticated user. Args: - request (Request): The incoming request object. +request (Request): The incoming request object. Returns: - List[ListAPIKeysResponse]: A list of API Keys associated with the user. - - - - - - - - - - - - - +List[ListAPIKeysResponse]: A list of API Keys associated with the user. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + +
    + + last_used_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + expiration_date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-app-variants.api.mdx b/docs/docs/reference/api/list-app-variants.api.mdx index aa96e137fa..e5b1038d05 100644 --- a/docs/docs/reference/api/list-app-variants.api.mdx +++ b/docs/docs/reference/api/list-app-variants.api.mdx @@ -5,73 +5,585 @@ description: "Retrieve a list of app variants for a given app ID." sidebar_label: "List App Variants" hide_title: true hide_table_of_contents: true -api: eJzdVk1v2zgQ/SvEnFpAsNNgTzqt2xSt0XYbuE724BgGI40ltjLJkpR3vYL+ezGkaEv2Ou42tz3FIWfefL15VAOOFxbSBUy0trBMIEebGaGdUBJSmKEzArfIOKuEdUytGdeabbkRXDrL1sowzgqxRekvpjejB/kgJ6aw6YNkjNHpSuTshXXmZcrmJbLpDcG4Er2HU8zEIH1YjzNDVxsZoT4K6xYTre+D2QytVtLiMmWT89lRnEF+kIDSaDhVOM0hBXJdUZrRDxLQ3PANOjTUmwYk3yCkEGqBBAT1RnNXQgIGv9fCYA6pMzUmYLMSNxzSBtxOk5d1RsgCEnDCVXQwoURyaNsleYciLDlcX13Rn+EIvtRZhtau64rFiiGBTEmH0pE517oSma9n/NWST3OaBDeG7yhzhxsfSxvqghMhclfZTySdeNvQkKet/yCbNoGurRfwu6F2MaLPpTjRK8bSRn3F7FKs22DVxXrkFi8Ges0t7qN4j6dDePuAnym5FsXFCG+82T5GbYQfjNx9XnsODv3aZH8i66oC4lJEujOCEAxuhRWBD52pkA4LNL2os2hEiRrkDvMVd78a+U1AYBPnS9D5M/HuAkKHt1G5WAvMV4+7rvu/gvmpQ2Gvd92AlCm4FP/4DXoG8OceTIf8lzLfrOYZPgP2z4gRNCOJhuqRODwQoMVBofZLOti/o8Ua7Et/EQ4UH9K3R6rlYNmPJHlFxR8oFg69fjNShvsotG1LBf12fX0qe/e8Enno5VtjlPkvmjfUthwdFxX9OiN+lcoGtz8xpbhI7fIwkCixse6PKiToqWuLp3b/E1rLC7/3weS8qW8Gm9PtJTJQXSF0Z7fsC2dsb+ju+TJuQvv+LVg0eT+f354Ahtlu0JWKXtkCnX9XXQkpjLnWdtwEtrbj3sNr0Wzjq1ubClIondM2HY+zStX5iBcoHR9xMeZa+D2xmNVGuJ13mdxOP+DuPfIcDaSLZd/gC/EjTHxodngktfiAVHv33k9qVyrTrXR89svgRcUJuVbePS6CT45Nbqe0aWiC+sLV6NXoCo4/rQbGRG2eeWrH2P4akqMu7OuHBHDjeQ0O+eb3wwVlppV1Gy57eKfLd5RQc9iv/+lnXzdlh3+7sa64kOGd9dIQiOkFlDqT7oV0z81lAqWyjoyahuTxzlRtS8ffazREv2Vn/UhkWDSQC0u/c0jXvLL4RL9fzLq1fcnO5RkpKnc+qaqm/yCBb7g7fJl6OSoj+5vucpJlqF3P7UQ9aU32m/ru7Rza9gdYKx2V +api: eJzdVk1z2zYQ/SuYPSUzHMn19MRTaTvTaJI0HsV2D7JGA5MrEjEFIACoVuXwv2cWICRRqqw0vvUkCnj79gP7FmjB8dJCOoNMawvzBAq0uRHaCSUhhSk6I3CNjLNaWMfUknGt2ZobwaWzbKkM46wUa5R+Y3IzepSPMjOlTR8lY4xWF6Jgb6wzb1N2VyGb3BCNq9BbOMVMdLJP63mm6BojI9VHYd0s0/ohwKZotZIW5ynLTkdHfgbxQQJKo+GU4aSAFMh0QWFGO0hAc8NX6NBQbVqQfIWQQsgFEhBUG81dBQkY/NYIgwWkzjSYgM0rXHFIW3AbTVbWGSFLSMAJV9NCRoEU0HVzsg5JWDK4vLign+ERfGnyHK1dNjWLGUMCuZIOpSM417oWuc9n/NWSTXscBDeGbyhyhyvvSxuqghPBc5/ZDwSdeGwoyMvoPwjTJdCX9Qx/f6i9j2hzzk+0ir60UV8xP+frNqB6X0/c4llHV9zi1ou3eNmFxwf+XMmlKM96uPawrY/GCH8wcvN56XtwaNcl2xXZ1DVQL0WmeyOIweBaWBH6oYcK6bBEs+d1GkEUqEHusFhw97OerwMDy5xPQRev5LsPDD3fShViKbBYPG366v8M56eehV1t+gNSpuRS/OMV9Ariz3s0PfNfyjxbzXN8Be2fkSPMjCQC1RP18GAAzXYTaivSgf4OhDXQy74Qdi0+bN+9ppoPxH4wkheU/K7FwqKf34wmw0MctF1HCf16eXk89h54LYpQy3fGKPNfZt5wthXouKjp68Twq1U+2P2BU4pC6ua7A4kjNub9UYUAfeva8iXtf0Jreel1HyCnob4Y7I52zzUD5RVc97j5/uCM5Q3VPZ3GTSjfvzmLkPd3d7dHhOFsV+gqRbdsic7fq66CFMZcaztuQ7d2472L16JZx1u3MTWkUDmnbToe57VqihEvUTo+4mLMtYDD50rmd9k1Qb2ILOaNEW7j+bLbyQfcvEdeoIF0Nt8HfKHmCe0whO1uUC0+IBWmfwxkjauU6fUe3wRVsKLMhVwqbx5VEmK74vkzSi9FNGE8w8Xol9HFqWR6A5bdTnoN8NxrIMbhYZAclGtbKEgAV14A4JCvftttUJRaWbfico/vWKUHgbU7If5P34f9iTv82411zYUMF7KfIaGD/aSlyqTbibtt4nkClbKOQG1Lc/Te1F1Hy98aNNSK8x79RI0xa6EQlr4LSJe8tvhCvd9Me32/ZafijO0qNz6ouqF/kMAzbnZPWD+3qqiEtt/M8hy12zM7GrMkma2kf393B133HXgSLCQ= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Retrieve a list of app variants for a given app ID. Args: - app_id (str): The ID of the app to retrieve variants for. +app_id (str): The ID of the app to retrieve variants for. Returns: - List[AppVariantResponse]: A list of app variants for the given app ID. +List[AppVariantResponse]: A list of app variants for the given app ID. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + + + + + + +
    + + uri + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + modified_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-apps.api.mdx b/docs/docs/reference/api/list-apps.api.mdx index 33be1d177c..3b86056d73 100644 --- a/docs/docs/reference/api/list-apps.api.mdx +++ b/docs/docs/reference/api/list-apps.api.mdx @@ -5,76 +5,390 @@ description: "Retrieve a list of apps filtered by app_name." sidebar_label: "List Apps" hide_title: true hide_table_of_contents: true -api: eJztVk2P2zYQ/SvEnFpAsLeLnnSqgC4aI2mz2Di9eI3FWBpLTCmSIUfbuIb+ezGUtJay3STtuSfbnK838x6HPgNjHSHfQeF9hH0GFcUyaM/aWcjhjjhoeiSFyujIyh0Veh/VURumQJU6nOTgwWJLq3t7b4tQx/zeKqWeztV3b1M6NLvIYf99rrYNqWRxR8UNiadiNyZVh1PKdEfcBTsle6Mj7wrv97kqvhHKHepIU/yr7fb25lNJCUmuNqlwIPUnRoVWUQguqDB0q22dYM3LrCAD5ymgxG8qyEGsD2KCDDwGbIkpyCjPIBAghwkNZKBlmB87CifIINDHTgeqID+iiZRBLBtqEfIzoD29PaYcfPKSI3LQtoY+ezqxnTHQ7zNgzUYOCu/Vb1Kml9NA0TsbKUq666sr+Vhy+q4rS4rx2Bl1NzpDBqWzTJYTCO+NLlOn6w9RYs4ziCMMDAGlGc3Uplo+yHxYD5Wld13N/MdGlrA3FfTZZU5f8R6aHPwHv/8+sK3Y+gw6XyFT9YD8pervBy9VMPR9Nrm5wwcqeUHobmo8m7M/K7KEIQimnxMXSeoqXce+l2o/Xl8/J/F3NLpKFKkb0e6/YXDJVEWM2si3F6g0rlxYv2Hk2jLVFKDfX6Y1CWbq940bAMoM2lh/afy/UoxYJ74m3l9yTcMY2f0KU9LXUHr0m3FzGe8w3Zfb+HkY3z8Vm1xk9zxLOHDbEjdOtklNnPYIN5DDelwrkcLjtFO6YCCHhtnHfL0ujeuqFdZkGVeo1+h1kniksguaTymkuN28ptMrwooC5Lv93OGdqGHgd+l2ueBevybpdNxmRceNC/qvgbRxpTVDlLSi7dGl8EneCZwqbjeQgbQxCPdq9cPqCj5/ZxbOImQsk5Cn2sksN2kxhaf+IQNqk4qBCdufLgZB5l3kFu0s3+WKfQbkfLlF/79987dvFAXTJ157gzpd28TGeVRtWn3pL0TjIsvv8/mAkd4H0/dyPDx/IsxKRzyY2QP4B52W7+Ujmk7qJVE/YtDinzScTZqTRENcUUpvs6hn60+yPF21X2620Pd/A86yDpM= +api: eJztVk2P2zYQ/SvEnFpAsLeLnHSqmi4aI0mz2Di5eI3FWBpLTCiKIUfbuIb+ezCktJaz3STtuSfb5Hy8eW9m6CMw1gHyDRTOBdhmUFEovXasOws53BB7TfekUBkdWHV7hc4FtdeGyVOldgc5uLPY0uLW3trC1yG/tUqph3P105sYDs0msN/+nKt1QyredHvFDYml4m4MqnaHGOmGuPd2CvZKB94Uzm1zVfwglBvUgSb/F+v19dXnkiKSXK1iYk/qLwwKrSLvO698qlbbOsKap1lABp0jj+K/qiAHub2TK8jAoceWmLxQeQSBADlMaCADLWR+6skfIANPn3rtqYJ8jyZQBqFsqEXIj4D28GYfY/DBSYzAXtsahuzhxPbGwLDNgDUbOSicU39KmkFOPQXX2UBBwl1eXMjHuaZv+7KkEPa9UTejMWRQdpbJcgThnNFlrHT5IYjPcQZxhIHeoxSjmdqYy3nhh3XKLLXramY/FnIOe1XBkJ14+o51KjLZJ7v/Ttha7oYMelchU3WH/K3s75KVKhiGIZvMut0HKvlM0M1UeDZXf5bkHIYgmH5OWsRWV3Ech0GyPbu8fCziezS6ihKpK+ndf6PguVIVMWoj356Q0nTl2e0PUK4tU00ehu2JralhpnpfdQmgcNCG+lv0v6YQsI56Tbo/ZRrJGNX9jlJSV0o92s20OdGb2H26jN8Tff+UbDKR3fMoYNK2JW462SY1cdwj3EAOy3GtBPL3007pvYEcGmYX8uWyNF1fLbAmy7hAvUSn4evdXcRb9VxMY/8HKnuv+RDjFderl3R4QViRh3yznRu8lVZJ4p+bnabf6ZckNIyrrui56bz+Oyk67rsmeUmd2u676D71fsL2G5Yfycq0SJ0J9sXil8XFU8WMDqq4Xo0dj2Xs+AlHNJORO6PrgSjIgNrY7sCE7a+nC0HpusAt2lm80yx+Beh4Grf/H8n5Izk2CNNnXjqDOs53VOM4tnfckfG/RtMFlt/H4w4DvfNmGOQ4vZPSpJUOuDOzl/IjHc4f1ns0veSLDX6PXot97Ods6j8JlPyKUmqbeT3akxLlYSb/uFrDMHwBH3EdIg== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Retrieve a list of apps filtered by app_name. Args: - app_name (Optional[str]): The name of the app to filter by. +app_name (Optional[str]): The name of the app to filter by. Returns: - List[App]: A list of apps filtered by app_name. +List[App]: A list of apps filtered by app_name. Raises: - HTTPException: If there was an error retrieving the list of apps. +HTTPException: If there was an error retrieving the list of apps. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + +
    + + app_type + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-bases.api.mdx b/docs/docs/reference/api/list-bases.api.mdx index 14d885bbc8..acab4a92c1 100644 --- a/docs/docs/reference/api/list-bases.api.mdx +++ b/docs/docs/reference/api/list-bases.api.mdx @@ -5,78 +5,363 @@ description: "Retrieve a list of bases filtered by app_id and base_name." sidebar_label: "List Bases" hide_title: true hide_table_of_contents: true -api: eJztVt9v2zYQ/leIe0oBwc6CPelpHhKsRrsmSL29OEZAS2eJHUWy5CmrZ+h/L46UbCme2+1xwJ5s36/v7rvjnQ9AsgqQr+FnGTDAJoMSQ+GVI2UN5PCI5BW+oJBCq0DC7sSWLcVOaUKPpdjuhXTuWZVCmjIqn41scPZknszCVyF/MkII4fFzi4HE1WP68iYXqxqFMoVtlKkG/SxZ9xGvAvnecHnL2FQj6wTZPgGx3fcuR2RxdR+zl3odyG8yYfuffaRo08dip2kwcYs72WoKLP5gTSrkEan1ZqjlvQq0ZsLuW3ItbXKxOLJzEgu7/YQFBeHReQxoiOtk1BN3TGUCkCrgEP/tavVw96XAmHculjFXj+JPGYQ0Ar23XvjUmSFmCgUZWIdesuOyhBw4reeogwyc9LJBQs8dPwATATkkriEDxQ3/3KLfQwbcD+WxhJx8ixmEosZGQn4A2jt2C+SVqSADUqRZsHBOLEvouuwY+tiTy9F3UodJeGn297uY3xSIw/YS02oN3eYEzaSLD4zTsdhjcNZwzfkBbq6v+WM61h/bosAQdq0Wj70xZFBYQ2goZuGcVkXkcf4psM/hnALpveRqFGETsZxn9kkl5Fi9Kr/FWUycSctGXH3Pvi80G6zSnE1YXR/Bx4FfMZbGlLEH6cBFnHCRVkLXMdSPNzfnLP4utSojR+KOZ/LfUDilqkSSSvO3C1xqW0y0/2BKlCGs0EO3OVE1dGwo+L1NCTIJTai+Rf2vGIKsEI7BLptGMsSKtd9rE9eVoHu7UY9O9CZ2L5dxm+j7O7DBhHfKWcDU2waptrwsKqS4JaiGHObD1gjoX4aV0XoNOdRELuTzeaFtW85khYbkTKq5dCo+y4BF6xXto8viYfkO929RlughX2/GBh95HFKDp2anJ+bUO+RS+42yaKm2Xv2VutZvlTp5cS3K7Gx0H5ZSTE4sHpaQAZeRJvd69sPsGl4fu4kxT7Is4iQP2FEN2SsWjvVDBtjEMQZC2fx0UnBmzgZqpBnFGz2yV5kcTu/o/wv8n7vA/egSfqG501LF7RJn5tA/rrSe49+t2gZiweHAot+87joWp0PJ76dUQW716FRenJTYWF4sb8SlLP7A/fjiv0jdslFcm2dAyXh8w0/2G/7hFTvER50Nj5BTTo6LgvkbeZ0dBI5yXD6/3K2g674CcIabKg== +api: eJztVktv2zgQ/ivEnFJAsNOgJ53W3QSt0UeC1LsXxwhoaWyxpUiWHGXrNfTfF0NKlhyv291jgZ5sz+ObmW8e9B5IbgPkS3gtAwZYZVBiKLxypKyBHO6RvMInFFJoFUjYjVizpdgoTeixFOudkM49qlJIU0blo5E1Th7Mg5n5bcgfjBBCePzaYCBxcZ++vMjFokKhTGFrZba9fpKsO8SLQL4znF9zbKqQdYJsl4BY7zqXQ2RxcRuzl3oZyK8yYbufHVK06bDY6RhMXONGNpoCiz9akwq5R2q86Wt5rwItmbDbhlxDq1zMDuwMYmHXn7GgIDw6jwENcZ0cdeCOqUwBpArY479dLO5uvhUY887FPObqUfwlg5BGoPfWC58602MmKMjAOvSSHecl5MBpPUYdZOCklzUSeu74HpgIyCFxDRkobvjXBv0OMuB+KI8l5OQbzCAUFdYS8j3QzrFbIK/MFjIgRZoFM+fEvIS2zQ7Qh56cR99IHY7gpdndbmJ+x4EYtpOYRmtoV0NoJl185Dgtiz0GZw3XnO/h6vKSP47H+lNTFBjCptHivjOGDAprCA3FLJzTqog8Tj8H9tmfUiC9l1yNIqxjLOeZfVIpcqxeld/jLCbOpGUjrn5k3xWa9VZpzo5YXR6Cj4GfMZbGlGP30p6LOOEinYS25VCvrq5OWfxTalVGjsQNz+T/ofCYqhJJKs3fznCpbXGk/Q9TogzhFj20q4GqvmN9we9tSpBJqMP2e9R/wBDkFuEAdt40kiEWrP1Rm7iuFLqzG/VooDexe76M60TfvwXrTfimnACm3tZIleVjsUWKV4IqyGHaX42A/qk/GY3XkENF5EI+nRbaNuVEbtGQnEg1lU7B8wdkFrXidzaNOxuwaLyiXcSb3c3f4e4tyhI95MvV2OATz0rq/rHZsH9OvUPmoTs3s4Yq69XfqaXdyamSFxeqzMZG9/5ipdxey+ILGl4VrjOlfTl5Obk8V0znIGZ3827kZRFHvs8jmkH2jK4DUZAB1nHegVDWvw0KztLZQLU0I7zRNj7LaD8s3K+n+qd7qrsxJvxGU6elimcozsy+28J0x+P/ssoGYsF+z6I/vG5bFqcXlXepVEGu9ehNPTspsbF8gV6Ic1l8wd34r8GT1A0bxft6EigZjx/7wX7FP7xih7jgWb+QnHJynBXM38jr5OVglMOVenOzgLb9B82nqbk= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Retrieve a list of bases filtered by app_id and base_name. Args: - request (Request): The incoming request. - app_id (str): The ID of the app to filter by. - base_name (Optional[str], optional): The name of the base to filter by. Defaults to None. +request (Request): The incoming request. +app_id (str): The ID of the app to filter by. +base_name (Optional[str], optional): The name of the base to filter by. Defaults to None. Returns: - List[BaseOutput]: A list of BaseOutput objects representing the filtered bases. +List[BaseOutput]: A list of BaseOutput objects representing the filtered bases. Raises: - HTTPException: If there was an error retrieving the bases. +HTTPException: If there was an error retrieving the bases. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-environments.api.mdx b/docs/docs/reference/api/list-environments.api.mdx index 6ae59d178c..03a799802d 100644 --- a/docs/docs/reference/api/list-environments.api.mdx +++ b/docs/docs/reference/api/list-environments.api.mdx @@ -5,73 +5,569 @@ description: "Retrieve a list of environments for a given app ID." sidebar_label: "List Environments" hide_title: true hide_table_of_contents: true -api: eJzdVk2P2zYQ/SvEnBJAsLeLnnSqgV00RtLuwnHTg9dYcKWxxEQiGXLk1hX034MRRcsf602K7akny+LMm5nHeTNqgWThIV3BzFoP6wRy9JlTlpTRkMICySncopCiUp6E2QjUW+WMrlGTFxvjhBSF2qIW0loxv5k86Ac9c4VPH7QQgt8+qly88eTepmJZopjfMAyV2HuQES4GOYXusRZIjdMR7oPytLod7e4asg2tUzF7LkFhnj5jRn4CCRiLTnJZ8xxSYOPHw3iQgJVO1kjomJAWtKwRUggFQAKKCbGSSkjA4ddGOcwhJddgAj4rsZaQtkA7y16enNIFJECKKn4xY3Zy6Lo1e3trtEfPDtdXV/xzzPvHJsvQ+01TicVgDAlkRhNqYnNpbaWyvp7pZ88+7XkS0jm548wJ6z6WdcwCqRA5FHg55d/5vEsiAz9QXMIRmPHv2N8Hq8EnR1uZHeaPHGgrnZI6Aki9u9v0t3EM1SX7N7qpKmBWI/jNACc4q08B7jRSjBIpeFWcGCPy9Ww9DrfKK6P/68IWA+5QYQzzbAylCQt0LwaJeAxmXCG1+qfvslfkfXcAM6T5l3FfvJUZvgL2z4gRdJVEw6D5I5GuQq8no5gP+vQA8mywPHKyIzVBif0QEreHw6PrOIGfr6/PpfxJVioPtd86Z9y/0fGxXnMkqSp+uiDoymRHpz/A6r4l1iOBcWzEuj+YkCBzUfviJWH/ht7LoldBMLls2pMhlnz6vcvjukLowe7gykZ6A7uXy7gJ9D0XLJq8Wy7vzwDD3dZIpeHNUSD1u4JKSGEqrfXTNrRVNz1ZKB7dNm6TxlWQQklkfTqdZpVp8oksUJOcSDWVVvW97TFrnKJd7zK7n7/H3TuUOTpIV+tDg4/cI+HWj83G4W/Ve+T6hz02a6g0bpBhXGdl8OICld6Y3j3O9D45MbufQwJcRmjnq8lPkys4/U44Mub2lhmNK2Y4huSEhX39kADWfW8Doax/GQ84M2s81VIf4J0L8CShdtTY/+kbZrhawr9paiupekn2nLZDR654ojAd6X7UHTXlOoHSeGLDtn2SHv9wVdfx668NOu67dQL9znriLli1kCvPzzmkG1l5fIHoN4tBs2/FpVxjb2puzK2sGv4HCXzB3fip1c+iMrZ9OxzOsgwtHbidjU7Wx16mv94uoeu+Aamtvfc= +api: eJzdVk1v20YQ/SuLOSUAIblGTzxVrY1GSFobipoeZMFYkyNxY3J3sztUqxL878FwuaI+LMeBc+pJFHfmzczbeTNsgOTaQ7qAibUelgnk6DOnLCmjIYUZklO4QSFFqTwJsxKoN8oZXaEmL1bGCSnWaoNaSGvF9Gp0p+/0xK19eqeFEPz2XuXijSf3NhXzAsX0imGowM6DjHAxyDF0hzVDqp2OcB+Up8X1YHdTk61pmYrJUwkK8/AZM/IjSMBYdJLLmuaQAhvf78eDBKx0skJCx4Q0oGWFkEIoABJQTIiVVEACDr/UymEOKbkaE/BZgZWEtAHaWvby5JReQwKkqOQXE2Ynh7Zdsre3Rnv07HB5ccE/h7x/rLMMvV/VpZj1xpBAZjShJjaX1pYq6+oZf/bs05wmIZ2TW86csOpiWccskAqRQ4HnU/6Tz9skMvCC4hKOwIx/w/42WPU+OdrSbDG/50Ab6ZTUEUDq7c2qu41DqDbZvdF1WQKzGsGvejjBWX0KcMeRYpRIwavixBiRryfrcbhRXhn9owub9bh9hTHMkzGUJlyjezZIxGMw49ZSq/+6LntF3jd7MH2a/xj36K3M8BWwf0eMoKskGgbNH4h0EXo9GcS816fnG/Bcw7zgivduYi/lk8F1z2QM1Aeld0NOXO8Pp7blAn++vDwdFZ9kqfLA7bVzxn3PnDicBzmSVCU/nRkYpckOTl9wa7uWWw4XFMdSrPuDCQkyF5VfPzc4/kDv5bpTWTA5b9qRIeZ8+q3m4LpC6N5u78oGegO758u4CvQ9FSyavJvPb08Aw91WSIXhzbRG6nYRFZDCWFrrx01o23Z8tLA8uk3cVrUrIYWCyPp0PM5KU+cjuUZNciTVWFoFx7t90p2K39i0E5bHrHaKth3e5Hb6HrfvUOboIF0s9w0+cgOFljg0GzaPVe+RyemX6KSmwrh+BsRdWgQvrl7plenc40IJuf0qs0fUrCauM6R9MfppdHGumN5BTG6nvQ5kRsOu680gOaJrRxQkgFUnAiCU1S/DAWdpjadK6j28U6UeJdYMYvw/fUz110z4L41tKVWn3Y7Tpm/dBY8epiPdzdyD7l0mUBhPbNg0D9LjX65sW379pUbHPbhMoJusD9wRiwZy5fk5h3QlS4/PEP1m1ov7rTiXa+xTzU26kWXN/yCBR9wO33zd0CqiBJr+cJJlaGnP7WTGslZ2ev79eg5t+xUUaPEZ sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Retrieve a list of environments for a given app ID. Args: - app_id (str): The ID of the app to retrieve environments for. +app_id (str): The ID of the app to retrieve environments for. Returns: - List[EnvironmentOutput]: A list of environment objects. +List[EnvironmentOutput]: A list of environment objects. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + +
    + + deployed_app_variant_id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deployed_variant_name + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deployed_app_variant_revision_id + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + revision + object + + required + + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + organization_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + workspace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-evaluators.api.mdx b/docs/docs/reference/api/list-evaluators.api.mdx new file mode 100644 index 0000000000..db8f4d234a --- /dev/null +++ b/docs/docs/reference/api/list-evaluators.api.mdx @@ -0,0 +1,1040 @@ +--- +id: list-evaluators +title: "Query Evaluators" +description: "Query Evaluators" +sidebar_label: "Query Evaluators" +hide_title: true +hide_table_of_contents: true +api: eJy1V0tz2zYQ/iuaPTUztOV6euKpsq00btrGtZ32oPF4VsRKQgwSDB5OWA3/e2cBiiL1iuJxfLBlYHe/xbdPLcHh3EI6gfEzKgsPCeiSDDqpi2sBKShp3SM9o/LotLGQgKHPnqy70KKCdAmZLhwVjj9iWSqZBd3hJ6sLPrPZgnIMt0X1YQbpZAmuKglS0NNPlLnGojQk2I2cHAp0yJ446RQLjlfwf3sy1W3EhzppLRVeKah3aQyCyqDVqeua8WypC0uW3To/O+M/gmxmZMm+Qwp3PsvI2plXg9tGGJLjn1oaJtHJiJBpH5Uab2XhaE4G1u5eBok6gZZoFpeOcrttrsCcdvJpnZHF/CAvf7FunfRf+zJTVx0TdQKZIXQkHtEdMpjATJucZUCgoxMngz/7US6j2cEo0ONL8SNAPkazDYggRT8A5CqabUBWdE2rRymOxPFeiqPIuqgG16LL16uirNhqUVaEvSrKiq4WxSo/f2mu3rFuncDruRd9mqnQPA/1tpXCv9o8zZT+8jaobJuuk3Xr6xlEISQXGaqbXhs4godVo+mh5dP+yVRrRViEo91YkEmTeYXmp7deqd+tLk4+eFd694bf13svG2na1jFaaAxWB3ne0GXStxH3Kf+5IpSTdIvYb0XqKmpuBWrLhR1jp+NnfOMuGa6cGXrlIJ3sNNudi3GI7Bpxtp1Qcbr9cn6+PdD+QSVFGFeDsTEB/IXTTJBDqQ7MJ6Wz3u33JOrDft7+0NFBpja38848bct3HXdrcU7rIOwXDWQM7vn2WxHgd0XoRq4TjDW9kd39z7iK9B3Konf39zdbBmNs+0GNu824u5zl5Baa97Y5sckS3QJSGJaGniV9Ga4XuSEkYMk8k7EhNt4oSGHhXGnT4TBT2otTnFPh8BTlEEsJm+ijcDu4ZNFQdpYyb6Srgr3RzfV7qt4RCjIhvzsCd5xaMVn6Ym2csJTviWmLyw6MvFtoI/+LGZCAZAcWUYt54aS9Xe+l46+YlyoEvm3R0j5m3jqdQ+qMp4QPOutWe7bwORbx/35PZhxZzHRwswlVw8EFZk9UCEiA+Yz0nJ3+fHq2j7RGYTC6uW4qETO3Xu4aMUg2wtIGBBKgPJQhOML81/UFe1lq68IjWns7MmVjBWyId/TVDUuFMtRZQF82WTSBJougs6eyJS6EhbbcxmC5nKKlj0bVNR9/ZlwOfwLPaCROmbUJV/lilRlLeKIq7MChHZ2EWmRx5WMmbLQmbhtRY5RlVLqDsg+divhtfA8JTJuvLbkWrGKQn8O/UwD+7sPKIV/C2RIUFnPPzSSFaJJ//gc8UYWR +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Query Evaluators + + + + + +
+ +

Body

+
+
+
    +
    + anyOf + + + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + metadata + object + + required + + +
    + +
    + + + property name* + FullJson-Input + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + evaluator + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-organizations.api.mdx b/docs/docs/reference/api/list-organizations.api.mdx index 8b2a7c2d04..de65436e3a 100644 --- a/docs/docs/reference/api/list-organizations.api.mdx +++ b/docs/docs/reference/api/list-organizations.api.mdx @@ -5,65 +5,184 @@ description: "Returns a list of organizations associated with the user's session sidebar_label: "List Organizations" hide_title: true hide_table_of_contents: true -api: eJztVE1v2zAM/SsCL7sISbajTwuwYg06LEWbYYc0GFibidXakivKbT3D/32gYidxtvWy63JoUvLx6/FRLQTcMSRrWPodWvMTg3EWNhoy4tSbKv6bwA2F2ltWqArDQbmtcid4VsjsUoOBMvViQq5CTqpm8u9YMTEbZyd39s72aZI7q5SKqdandTeJmv9jATRMQ/7L1er64jWlOESiFluJ8qQMK7SKvHdeeQre0LOxu5hyXHTrXRnNGQa8R6YJaHAV+ehfZJCAdPtjFAUaPHHlLBND0sKH2Uy+xnze1mlKzNu6UDc9GDSkzgayQeBYVYVJY8bpA0tMC5zmVKL8MoHKmLzy0k4w+1Imk7+hqQgS4OCN3YGGYEIhhkUGnQaLJb2F+ir+ToN7seTfAi4joDtTyt/xn05gne5hLaBtlltI1ueBnT5YbF0U0G2OqVZi7zS8OP/IFab99AMp54kGA3qPzUlH34/h3RHl7h8oDXGLT7XxlMl1mAx66gZmxnOfNDc6pL8XH9auvojelyMFdfLRUFLInYhsR9JPhSGHBKbnamPyz+Q5clj7AhLIQ6g4mU7TwtXZBHdkA07QTLEykUemtPYmNDFkfr24ouaSMJN9rzengFtR3J7dMexAMlbmipqBnATmdcidH8bXYETt+T5KZjJ262J4T8M8Nqfm1wvQIGPs72M2eT+ZwfkrNALLsWAaj2WoHd2gz1g4zA8aqEQjvkBYfjw6pLPKcSjRnuT7w2Z+U/vhZP8/kccnstdGoNcwrQo08Q7iUtpexWsYq3ijIXccxNG2kuabL7pOzE81eRHqRsMzeoP3Ipv1ptODqkTDj9TI/lMZRHSERb0X59kjKto+XNXnixV03S/QHnFC +api: eJztVMFu2zAM/RWBl12EpNvRp2VbsQYdlqLNsEMaDKzMxGptyZXodlngfx+o2Emcrb3sOh9ih3ykyMdHbYFxHSFbwCys0dlfyNY7WGrIKZpg6/Q3g2viJrioUJU2svIr5Y/wUWGM3lhkytWz5UJxQaqJFN5EFSlG693o1t26Lk1265RSKdXi+Nxlpib/eADaSH3+i/n86vynodREpqYriQqkbFToFIXggwrEwdKTdeuUcnjoKvgqmXNkvMNII9DgawrJP80hA6n2xyAKNASKtXeRImRbeHd2Jq8hnzeNMRTjqinVdQcGDcY7JscCx7ourUkZx/dRYrYQTUEVypdlqlLyOkg5bHdH2Vx+eVMTZBA5WLcGDWy5FMM0h1aDw4peQ30Vf6vBPzsKrwFnCdCeKOVl/KcjWKs72BbQbWYryBanga3eW1xTltAuD6nmYm81PPvwEGs0Xfc9KaeJegOGgJujir4fwtsDyt/dk+E0xcfGBsplO2wOHXU9M8O+j4obLNLLh/djV19E77OBglp5NFTEhReRrUnqqZELyGB8qrZI4YlCTBw2oYQMCuY6ZuOxKX2Tj3BNjnGEdoy1hdPNniSv+ijQRHIk0wTLm5RvcjW9pM0FYS5iWCyPATcixx31Q9h+AljbS9r0zGUwabjwoedGg5UCil2UNGzdyqfwjqOutg9oHsjJBKTPXdlno7ejs5ea6QLU5GrabRWatFV9HQkG+oSuPVGggSq04mPC6v3BIVXWPnKF7ijfX0b4x1rsd/v/XXq4SzudMP3kcV2iTQuThrLt5L6AodyXGgofWRzbraT5Fsq2FfNjQ0FEu9TwhMHinUhosWx1rzDR8wNtZP5GGhE9YdnshHpy24rO9+v3+XwObfsb30Z/0Q== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Returns a list of organizations associated with the user's session. Returns: - list[Organization]: A list of organizations associated with the user's session. +list[Organization]: A list of organizations associated with the user's session. Raises: - HTTPException: If there is an error retrieving the organizations from the database. - - - - - - - - - - - - - +HTTPException: If there is an error retrieving the organizations from the database. - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + + + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-secrets.api.mdx b/docs/docs/reference/api/list-secrets.api.mdx index e9ca7faa8d..2a388bfe7a 100644 --- a/docs/docs/reference/api/list-secrets.api.mdx +++ b/docs/docs/reference/api/list-secrets.api.mdx @@ -5,59 +5,617 @@ description: "List Secrets" sidebar_label: "List Secrets" hide_title: true hide_table_of_contents: true -api: eJzNV01v20gM/SsGz0Kc7FGn9TZFN3C6DdbNXozAoCXammakmcxQRtRA/33BkeRISlabuIfWF0nz8cj3yOHQT8C49xCvYUWJI/ZwF4Gx5JCVKa5SiEErzxvfzkbgyFtTePIQP8Fv5+fySMknTlnZAjGsyiQh73elnv3dLoYIElMwFSzL0VqtkmBh/s3LnifwSUY5yptiygO4deIIq8bUvSpSeXJlCWLw7FSxhwioKHPx3zpzUCm5zT1VYq70bPJNNyq0WLGWrQ3TpeDVEaTIwSwW1ZcdxOv32jWWClSBYEZOmGJR+QS1vKZEVhU7hzKsyWaobSYfe2ceIIJceXaow34sOHPGqgQisOSspkfFVZhisyfOyG3Cl1h0pmRyAkS5KtSAHmORoktvWuod0aMUL6Wl6jWGHeCSKqjrqJs322+UcMiEh1I5SkUFgZjwYUXMqtj7y69f/h9K/O25OwEb4KL3RqxJDVH8exkCtqXUmeQeIvC4pxzvg7IHckyPz5L/UkH+EDi8PcSl08MkH4ojIrYjRak11D1Tt04L9oGcV81ZPQXln3Z7HXXpdgpKSMUI6JEd+iEIpqmSioL6psecXUnjdJsy8LFBfi1HX5d+kNkR5CYl7SfKmNflfuqwrWT+Z1HsH8Pg6IuM+yz8RpxbFHQOqx6Tz40UvbTcdORPCX0n+KxTKEgt1X6k0lH4MfbQ0SlbwfXZUqDfW62OKfCfhzWo1pu9lAuojkClU9JEsDMuR4YYylKlk+5fhWKQEb5aCgrM6dQg/CV75dLsX/inQV32IKaO258NjToCrXaUVImmqes6cYRM6Qb5VMc+NAizhRwjKG36g3i3DcIIb1ttpgP+Fsg/qlkT62fUH4ecjMY17TGprrtIdBfwEPWNZyZ0Xsc8fdGgdb3jdJXpVs2uledZ18TW8hulKQxWRJATZ0Ya3D2JgxY5gxjmByw1zw8X87blnUtbQE6uvyBpuEkhY7Y+ns8Tbcr0DPdUMJ6hmqNVQVZPSekUV2HL4uZqSVWbyPH6rr9gJX1vk7rDZUdR0aplaGmbgwuLkjPj1PfQP0MESri1IgppVexM2N4qtAjOzRY3V9C7xeH87OLsHMYaDRZLy44JPxeNdhqikQpH/tJl5ahkjgnz358nxDNrPOdY9PBGIRmVlVYApkeeW40qdA9tJ9OEaw0hXELsIsSpQ5J0yoxnWfL0tEVPt07XtQw/lOQkLncRHNAp3IpK67texVy3LTEskoRsQEddNrEY/XORUB4T6dPHr1DX/wLHrYz1 +api: eJydVE1v2zAM/SsBz0Kc7ujTsnbYghZrsXS7BEGhykyiVpZUiQqWBf7vA2UncT5WYPPFhkU+Pr5HagsklxHKGfyUyRDMBTiPQZJ2dlJBCUZHeoqoAlIEAQGjdzZihHILH0YjflUYVdCeU6CEaVIKY1wkM/jeBYMA5SyhJQ6X3hutcoXiJXLOFqJaYS35SxPWGdwHJkK6LfWqbcVv2niEEiIFbZcgAG2qmb0Pbq0rDE+vuOFyKZKrn3Z/uS3SZDh1mnu5ZbxGQCUpl5V2c7+Acrav4J5fUFHu+C3pgBVXySwEXIQlaSsZqofu7ObxHhrxb3ACalehiX3c69zJEWrv9IbpNwJ0dbGJvUwLF2pJUEJKuurzssmYI8RJlmWFkgmd2WBlje9Veg/5G+ey5P1x+T+omx5E04gzkXdxX9s2GgFGL1BtlLnM/izxbhd+YmPH5FLNC8bm4dqLeTaDu/Voa+wAZQhy06Oyixrc6UiDabeJDT8nWsJRhIAaaeV4h5fIBL2kFZRQrHnRi/VVcdjqiGGNIWZJUjBQworIx7IolHGpGsolWpJDqQvpNZyWHefTwTWHZpsiqhQ0bTLe+GFyi5vOiXI27wdMee3byToO2wsuvb7NG91OHowTrVzQv/P1AQI0E+gEZkG0Xbic3qnXcfsk1StmT7jPlvZoeDUc/a2ZLmEwfph0t5dUdNiALgzEiVx7ofhqqqXmM0JZfzwcMEvvItXS9vBOrDvZkU4Mwl9UeCO15XnJlbedrTPItnKDV9nQFmkuYOUi8fl2+ywj/gimafj3W8LABs0FrGXQ8pnlms17uz/bAl+mJYyVQp+hpUmtKSc3OHu6n7Yvnx+haf4AofknIQ== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + List Secrets - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
  • +
    + Array [ +
    +
  • + + +
    + + data + object + + required + + +
    +
    + anyOf + + + + +
    + + + provider + object + + required + + +
    + +
    +
    +
    +
    + + + +
    + + + provider + object + + required + + +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    + +
    + + + models + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + provider_slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + model_keys + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + header + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-testsets.api.mdx b/docs/docs/reference/api/list-testsets.api.mdx new file mode 100644 index 0000000000..78e47f32ba --- /dev/null +++ b/docs/docs/reference/api/list-testsets.api.mdx @@ -0,0 +1,1124 @@ +--- +id: list-testsets +title: "Query Testsets" +description: "Query Testsets" +sidebar_label: "Query Testsets" +hide_title: true +hide_table_of_contents: true +api: eJydlU1P20AQhv9KNGc3pqgnnxooKohWpZD2EkXVxB7sBdu77I4pruX/Xs2u4zik0Ko55MP7ztczM5sOGHMHyQqW5NgRO1hHoA1ZZKXriwwSKJXjH7w9jsDSQ0OOT3TWQtJBqmummuUrGlOq1FvGd07X8sylBVXoT+v2yy0kqw64NQQJ6M0dpTx4VJYyyaMixgwZJQ9WXIpwibm7DlGhj0b7uilL6Ce6z4PtbBT3fS/undG1IydZHB8dyUdGLrXKSKqQwE2TpuTcbVPOrgcxRP9embFCjFWIkOomGA1pqpopJwu7PE+9oo9goPo6nZHCID4kIEW+xjRktD5wNdYaOL07Pj5E8x1LlfnCZ2fWavv/XDJiVKV8U0yVOxSUOt07PUDi2Ko6nwLYsu3XOwRoLbYTbp90SFCAVy6fdGbwNx0g5zAnGJ29LPUwZks5/Rt+qSuEHnSTTuzwBrovl/Eh4PtTsK3kfLm8OnAYervf1K8N2Xa23O10RVxoWfacxKFBLiCB2Fh6VPQz3m5/DBE4so9kne9LY0tIoGA2LonjtNRNNsecasY5qhiNgueRF/50dipSv7uO0sYqbr2/xdXFJbXnhBlZSFbrqeBGxioMyr5s7BEadUmCrMZKfi8aLrRVv0L3I1CSQBGshIkM7PXuMjt7wsqUvunjJZR0IlT1rfZxBs5DESeY3lOdQQQCJNR3NH87P3qp6sFgtri6GNYIU79G24S9DKJnXEeiEAFVfoeACav3uwPJ0mjHFdYTfwdt3stq5Mb0xLEpUfkV8bG7YQRWMIwAjJeV+JEJLrRjEXTdBh19s2Xfy+MHiSm9i+ARrcKNEFvJehbbtnZwT62/Bv098sYvkcjLJrTx2Z0i+x4sFmlKhl/VrifD/PFsCRFshj+qSmdiYlGKkfcEQP7rxNiPlX/WQYl13sgtkEBwKa/fmrJ0fQ== +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Query Testsets + + + + + +
+ +

Body

+
+
+
    +
    + anyOf + + + +
    + + + metadata + object + + required + + +
    + +
    + + + property name* + FullJson-Input + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-workflow-revisions.api.mdx b/docs/docs/reference/api/list-workflow-revisions.api.mdx new file mode 100644 index 0000000000..967aecd1bc --- /dev/null +++ b/docs/docs/reference/api/list-workflow-revisions.api.mdx @@ -0,0 +1,2062 @@ +--- +id: list-workflow-revisions +title: "Query Workflow Revisions" +description: "Query Workflow Revisions" +sidebar_label: "Query Workflow Revisions" +hide_title: true +hide_table_of_contents: true +api: eJzNWE1z2zYQ/SucPbUziOR6euKpip00TprYtR334Hg0ELmUEIMEA4ByVQ3/ewdfNCVRlOzITU8ei9i3b98uFgssQdOpgvgW/hLyPuPiQcEdAVGipJqJ4iyFGDhTevzgv48lzpliolBAoKSS5qhRGoglFDRHiGFOJaOFHkvMgAArIIZvFcoFEJD4rWISU4gzyhUSUMkMcwrxEmixOM8sjF6UBkZpyYop1KT5pag4h/qOQIoqkaw0DCGG91fnnyK3OhJZJDEjEQ6mg2j5Be5x8QXiaE55hTUQ0ExzA3XjOEaXmEH9fEBDzkcddPlfh33pSb5E3DlqmlJNf0TwwfcTFPgY6O6SYRd2lxYZN9vqBwhhHT9BhbeW6C4JelFb8bMi4VWKYyqTGZtj+j0KTITgSItOCUIYZ85fNAr+avNVoipFoVAZ3OOjI/NnNbyrKklQqazi0aVfDAQSUWgstGVTlpwltgUOvypjs2xxLaVpkJo5D4monJFnyQqNU5QttU/siprAY++Ml8A05moTjlZ6JmRfURDIhMyphhiqiqW9Co0cmkkw1bgnqln6SrMce6FPDWBNIEel6LQXuw/mozevia+i58F8opbuaqKfB3XagqgJJBKpxnRM9UHlO3Gw0chWRlWmL+Hks4P1TlLk+AJOTh2sdxLkmizGLD1UGQexXi+is7St10G9BLUaL0Gwg3oJcjVe5ijVd5TrjTevCSheTZ8Lc2VsawKHC9RF547CLkgx+YqJbvXJMIOGQ2kd2jYbf2qvANI0ZWa7Un6x2kt36xC69Yq3fLL6S/ss6vYFCZNJxan86W3F+XslilfnlS4r/bOJbyVeA+J7/z5WVEq66NV5zdaIvulxe/ttjUEbwu7K1Kmz7EgUlZplNNEH3DgjD+m3TfCwH+Ng3M02XFkORzZcMPwWd/89TVwP0cV4I8Wb1mHEa5WDK6XNKdBMqilmtOIa4ttO9MfJ7dYPPHfbXapmqKprA/br8fHmDHZDOUvthBW9kVLI5w9gKWrKeM9IxUWy8vUpbeFuu3x/CEfQDkFq2hoBm3rpGHLcku1LrRjRtfm6KxEmLufar1upvyCvU3d7GKdOvr6aend9fbEB6HK7mtQ/zaAfhXqI2gWWo54J85wwRW2fDvQMYhiWZibGh+GEKhyGRwY1bCblIRBQKOfhjaGSHGKYaV2qeDhMuKjSAZ1ioemAsiEtGaxzGtmv0YlZareowqSSTC8s3uji7AMu3iFNUdriby24MgXnSmh1WZM9WrIPaMT0FyA3brN/XF3428/MWRm1WJEJax66kuP2mib3WJjrUjMLwNHgl8HRtmC8QTS6OPP7xjfCwMMuA7ImVyMUEMDcbhrQSPPfHj8YlqVQOqdFC68nr2sDtxdG4996WHLK7O6wLJY+57fgcw4ETNaBQJN3aN+RCJiCnglluhIsl2bxZ8nr2vzsrpQmgylTdMJbl8o1Rk1XedqLSVcc97jYeN+yFhCD7R7/OZe1V6fDkNnjNWUPRq33oMPQ2vW2sQen8C7TT8gZdTxmPJrd+TN9YrbxrTkkZqGFLL39KEmw1C2rjTPNoDRt8fc311DX/wJDY1ap +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Query Workflow Revisions + + + +
+ +

Query Parameters

+
+
+
    + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + revisions + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-workflow-variants.api.mdx b/docs/docs/reference/api/list-workflow-variants.api.mdx new file mode 100644 index 0000000000..4470841c06 --- /dev/null +++ b/docs/docs/reference/api/list-workflow-variants.api.mdx @@ -0,0 +1,1092 @@ +--- +id: list-workflow-variants +title: "Query Workflow Variants" +description: "Query Workflow Variants" +sidebar_label: "Query Workflow Variants" +hide_title: true +hide_table_of_contents: true +api: eJzVWNty2zYQ/RXOPrUzjOR6+sSnKnbSKGljN3bSB0ejgcClhBgkGFzsqhr+ewc3mrrLjjyePmlGwJ49e7DYxXIBmkwVZDfwt5C3BRf3CkYpiBol0UxUwxwy4Ezp8X1YH98RyUilFaRQE0lK1CgtwgIqUiJk0O6UWEAKrIIMvhuUc0hB4nfDJOaQFYQrTEHRGZYEsgWQan5ROBw9ry2O0pJVU2jS9p/KcA7NKIUcFZWstgwhg/dXFx8TvzsRRSKxQIkVxTTB3rSXLL7CLc6/QpbcEW6wgRQ009wCxqCTT1hA86O4lmnQIIj0P5Dgi2f6bAqUqElONHkJGaLvw1X4M7LdJ8U+6A1KFNxetReQwTk+XIO3juc+AXaCdqJnFeUmxzGRdMbuMP8RASZCcCTVRgViFEPvLxlEf41dlahqUSlUFvf05MT+LId3ZShFpQrDk09hM6RARaWx0o5NXXNGXVXsf1PWZtHhWktbMzXzHqgw3iiwZJXGKcqO2GduR5NCW06zBTCNpVpH80o+LiGin4/WdvUsnwZ13oFoUqASicZ8TPQuwBQKIUu7B3Ki8ZVmjs92L2ceNhk4dUydP4eTzx42OMmR4zM4OfewwUmUazIfs/xAP8aw/CCxXs+TYd7V66heolqtlyjYUb1EuVovipvpU3P1yto2KRyPnufka/gmSDH5hlRveFvEcroK3aTQ9sYlQJLnzF4ywi+XysABOsQ6s+StnCz/062im30BZZIaTuRPbw3n75WoXl0YXRv9s41vKV4LEsrWIVZESjLfqfOKrRV93eM24277JlKzglB9xBQdBMiQoNHD4/IhgmxKibVg181Dl+7o4jVd6+P2qZFjQQzXkN1sxH7ovTehZY22OlRtV2wai/Xr6el6E/1COMtdi0zeSCnk0ztojpowvqMpckGXVh9zO0bbxftDeIJW31JNOz28zZeHZFOKTPHhJLZvdWIk13Z13znYuLzrsG/UPdkor1d3exjnXr5dCfXu+vpyDdCf7fKh/mVfakk7KnXSq0Q9E3ZCnKJ246CeQQb9WuIdw/v+hCjsx2lQ9eNLpw8pKJR3cWw0kkMGM61rlfX7lAuT98gUK016hPVJzWCV0cCtJmd2q7ugCqmRTM8d3uBy+AHn75DkKF3mdzZc2XTzCbS8rT07UrMPaKUM79eB0TMh2b8+K8LjdeatrFasKoQzjzXCc3tN6C1W9rVr4/S0T3q/9E62BRMMksHlMNyaUFkiD7cN0hW5WqEgBSzdlQGNpPztYcGyrIXSJak6eNtPdeWpGHTR+I/u15wwdzUciUU48RsIJw4p2DOHtP0GYPE6HwxsMs+EsgUJFgu797PkTWP/9vOAPb+cKTLhnYlghVBbUZ4y9W4K5hbn658tnAlk4ArIC1Fa/opwHEYHzMT7CXWG+uOw2jei7qcUp+vdfLzNhpn0wWwUMnZir/ONbRWzWEoWwX5AKda6Y7XW2SxKWx1/f3MNTfMfDcGeBg== +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Query Workflow Variants + + + +
+ +

Query Parameters

+
+
+
    + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + variants + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/list-workflows.api.mdx b/docs/docs/reference/api/list-workflows.api.mdx new file mode 100644 index 0000000000..a54fd1239f --- /dev/null +++ b/docs/docs/reference/api/list-workflows.api.mdx @@ -0,0 +1,668 @@ +--- +id: list-workflows +title: "Query Workflows" +description: "Query Workflows" +sidebar_label: "Query Workflows" +hide_title: true +hide_table_of_contents: true +api: eJzFV9ty2zYQ/RXOPjUziOR6+sSnKnYuTtrYjZ32wdF4IGIpIQYJBhc7qob/3lmApKirZdeZPGlE7J49exbYBRbg+NRCeg3/aHObK31vYcxAV2i4k7o8E5CCktbd3HfrDCpueIEODXkuoOQFQgqtxY3BHBjIElL45tHMgYHBb14aFJDmXFlkYLMZFhzSBfByfp4HHDevCMc6I8sp1Kz7UnqloB4zEGgzIytiBim8vzz/mETrROeJwZwlOJgOksUXuMX5F0iTO6481sDASacIqk0z+YQ51E9HJHbreeeKtPwJmYfAj8j9TSD6UPZ7UbflX6Djgjv+MyRoYz9ChT9bug8J8RB2TwtZZsoLvOEmm8k7FP9HionWCnm5VYs2mbMYLxm18WpaNWgrXVq0hHt8dEQ/qxle+ixDa3Ovkk+NMTDIdOmwdIFNVSmZhR4w/GrJZ9HjWhnqEE7GCJn20alhKUuHUzQ9zU+CRc1g2UXSBUiHhd2Ei1I+bm+0gT6S73o9nwZ12oOoGWQGuUNxw90+QAa5NgXZgOAOXzoZ+OyOchJhk1GQx1fiRwT5HGGbIAIV/oAgpxG2CdLKNZnfSHFgHO+lOEisV/PkTPT1etYorVpdlFawZ43SytVFscpPn7pXL8m3ZvB89CKnONG2QerJV8zclrbazpZ16JpBNx9WALkQkg4ZVxcrbeAAHdpGsxKtmKx+6bfR7bEgkybziptf3nil3ltdvjz3rvLuBeW3ki+BNG3rEC9uDJ/v1XnNl0TfjLjLeTnBNtw2CzMyTuY864eI9DZN6RIjMOdeOUivx9vQl4Psuun/4y043WypawL57fh4cxT9zZUUYdAkr43R5ulzSKDjUu2ZLEpnK6uP2WLj3bL9oSNBUraw094k7A7esmLW8ikua7DbNIiRXNHqQwWgvGLoxq5Xi6W8Ud3daZxG+fbtpXdXVxcbgLG2q0X9i+47SX8/Fehmml4TU3ThCeFmkMKwMngn8X444RaH3e1gCAwsmrv2heGNghRmzlU2HQ4zpb0Y8CmWjg+4HPJKwjqBUVhNTsg0nBmLmTfSzQPe6OLsA87fIRdowg7vGVzS7or7ZdWsKxWv5Ack5ZpL38i7mTby37gJmhvfLHqRNLLMdXBvVGy4veLZLZZ0RaQ8I+2jwa+Do13JNA7J6OKsOSR0nLsbU2MGbE2uTihggEU4IeCQF78vF4hlpa0reNnD2yzi2rWq0cPhdzesFJfhBITgi6bA19AUGBhQiaF/BWRAG3WmLXUZWCzI4LNRdU2f442ZiiWk5RPVuzOvsei6xeMehNu43+J88yEbXCCF0BaeTOahN9oBdNr35fMQOuDFdACn3ptvP63ot+V9tHQb0x8jyS8cStYeItoF0X+UZVi5ntfGfCCUrte8fX0Fdf0fACLBAw== +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Query Workflows + + + +
+ +

Query Parameters

+
+
+
    + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + workflows + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/log-evaluator-revisions.api.mdx b/docs/docs/reference/api/log-evaluator-revisions.api.mdx deleted file mode 100644 index b4ff537bc8..0000000000 --- a/docs/docs/reference/api/log-evaluator-revisions.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: log-evaluator-revisions -title: "Log Evaluator Revisions" -description: "Log Evaluator Revisions" -sidebar_label: "Log Evaluator Revisions" -hide_title: true -hide_table_of_contents: true -api: eJztWd9v2zYQ/leMe9oAOU7TNt38tDRp0axpGyRp92AYwVmibLaUqJJUWs/Q/z4cKcmSbKu2agMZtjwkjsT7zvfdL/K4AINTDcMRvHpAkaKRSsPYA5kwhYbL+DKAIQg5vWfF+3vFHrjmMtbggWJfU6bNSxnMYbgAX8aGxYY+YpII7luMwWctY3qm/RmLkD4lijQYzjT9V2K3vCrV3vPA4sfzDyEMRwsw84TBELRRPJ6CB6FUERoYQpryADKvXBGnQkA29sBwI+hBaXPvJgfvXZIEfJPqSyjkt0Mo/SvHbupcWvqAimNsDmLoJ4fdtHP/Kksz6xqXVh7CuoZVB7DGaThAWDSiYf8OqfsBleEh+vtUcJZD5hoClpjZWmweGzZlqhXswkpnmVeskJPPzDewxusFc/pKTtdKUJHiigVU5palZl0AVaFuXGmDLMuqEEalzD7QiYy1K1Inx8f0J2DaVzyhkgdDuE19n2kdpqJ3ky8Gr2uF9GXqhBoULm04tyuI9hBTYWB4XMu2ZdEeLoAbFum2Wvt/BXrsFejfXx8wNTPX8fcC7tCo7qBhW6LS0r7hEWsvRQSYeRAxrXHait0G8y4XzzwIhd10VXHqmcj1vZ9qI6O1yiZSCoZxq7ZL3Tt3CJlHcLUtVlfEMsxz0FkaYfwzgG8swFZV/rXlbBXPOsZg/VtgEHCqqyiua7xu4be1zSma1J9UzVuvC3yu/FSg+uV1KsSfWsb9D6lJUvMrNI0lkLwibyOFSuG8ldiGLKzQ2x6mBq3ESog+JlLfyyuuzQ9p3WTkivhuHN25UIQYo87l4D3aslPfNHSDuqhAZB74iqFhwT2avZbBcwfbO7NkpUlwCCUfHWyuJGCCHUDJhYPNlRR0TeZ77HUFWS/nebcr+NqrloKtUktB2F61FHSVWh6Y0j8Rrp9y8cwDLdJpV5hbkqU+tDdDcw6x2U3qvXl/1qeKd0X5qLhDEN0RBCHMGAZM7VzpD0XJ4wuIlr3JDQuZYrFfqzbFFx3v1FHe5G4gCuwRcFuPPKKe/Cg3Ojv44DYnnnaUmCQ83nYD1KR4l91Wocg6npp45+h30pkHCSqMmOmQ1f/xWNksfL2klBzF1AP32Tbs0rRopxjMoTM7KQr5NHVj+EPoOq8p2GnUdoH2kLByFtsFo+IB5722ubyuTrZGuynS5fgts7O8Zycnq9O6Tyh4YJnovVJKqu6juoAZ5KJlzCakX3u7S/6NN5N2JX0sjgCRnq4WprWjCLdk81JLRu+O3v5otEp2OdX5utpwqaDXsbvZjAtHX5uH39zdXa8AOt/WnXolp731sRQxM5N0tZVITdAJ0qwaBgnNSdm3QTku0YNycjoQkkyj7Le1dbRw+y+YGZPo4WDgC5kGRzhlscEj5ANMuE04zfxUcTO3ImfXl2/Z3PV7G8qVBbYDuSCpLyv9gwl/y4gud/TMx178b+d5DziZ7fZ0lkIK1pvlHd2r7xglgq3cuW24ZYOnIf72PDx91n/+4smL/rPnpyf9ydPQ75/4v58+DU9PMcRT2HRdtq30+rHzzrq7CNdnwTur3EWoEzVdbKpNbrcVyi9rjilmeBxKG3LFaNUGdO/s+hIqZz84PnpydAzNlKstpgqKvq2gRbza1+A1MqfMGfJJZMsnGIbRH8sX9M0oWfOJY463OcMbc5U8fwz7bgaJQB5Xjk8u+UeQJ381LnTFc/SZSsDYgxlVjeEIFosJavZRiSyjx19TpijLx7nnJsTfaFwes2wB+MLmrvlSc+nbykrLReryu9FoqAk4iTPfZ4lpXTuuFLbrD7d34MEkv5mPZEAyCsk8+j0EoGt+U9wJ2WcLEBhPUzvlBodJP/8AqWvzVA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Log Evaluator Revisions - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/log-query-revisions.api.mdx b/docs/docs/reference/api/log-query-revisions.api.mdx deleted file mode 100644 index 48f890fc3b..0000000000 --- a/docs/docs/reference/api/log-query-revisions.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: log-query-revisions -title: "Log Query Revisions" -description: "Log Query Revisions" -sidebar_label: "Log Query Revisions" -hide_title: true -hide_table_of_contents: true -api: eJztWV9T2zgQ/yqZfbrOGEJpS+/ydLTQKXcUOKDcA5NhFHuTqJUlI8lALuPvfrOSbezYcUIuvXs5HoKjaH/7R7ur3fUcLJsYGNzCHylqjgaGAagENbNcyZMIBiDU5O4+RT270/jADVfSQAAa71M09oOKZjCYQ6ikRWnpkSWJ4KGj738zStKaCacYM3pKNKFb4jSYwyLuig13PHIc5Ox8DIPbOdhZgjAAYzWXEwhgrHTMLAwgTXkEWVDukKkQkA0DsNwKWiB1Z73LHLh3QrvhB/BZ4OD1eWCaM2m3rs6Nx815bZ9LHd/rsm0dPDbTlo9ZuE3hD3PInEOEiZ22YnNpcYK6E+zIUWdZUOxQo28YWljQpjh9c6omrbspjLjGiCJwMRgWTVMFu/ThB1mWVUGsTtEtmERJ40Nof2+P/kVoQs0TCksYwFUahmjMOBW9y3wzBJtGcahST7RgwGf5P7odZPQxS4WFwV7pP7Xg5xbjpVng/6j576OGpXaq9NbAPRpFI7O4Jipt3bE8xu4AJcAsgBiNYZNO7C6YLzl5FsBYuJuyisOiiFOEMHFR89cGp5FSApmssiqYDxtZoUueT04Ip5dlGwrTVLs148Wj+kpVh3ZeEHIdpoLpnz6lQvxmlNw5T22S2lfQpmMe7OtQMa3ZrNswdVp4kVW/kDGJYvMT/heMeqZOubErzbpMyQb5y2x0nTueZPHG0XTGXNTW76LNoI4qEFkAoUZmMbpjdqtZ5KOH7R06Y6VJ9COYfPWwOZMIBf4AJkceNmdSmGu0zZuoMNaH4joq7LVVLoW1Si6FwbbKpTBXyeUBtfkH7nqTk2cBGJFONoW5ItosgO0pmtuQLd4m9QLskctIPRJ2xyaJj1SSbtNrzzxkFoAS0bbBzz0k5TR8Whd6pUHPCCsLQPCYt4Ou01+cOmrSW0e4ot5CmcbUPzATooz8GmXY/Muw0wYOnjxKWtQPTGws8UkBQP3HsmqueQE2G2ZXuHU0Vn+WvtiEoTKNC4t6hav6CYcvZMueBJiMnm/Upnndr4raGqlIIOlXpNLVVu1UTXjIxHnBIXNtlb/Z6z3OMuHGHEVUaadKScpax23IAviOs00zye84892OSNe9zl9c0BSaZi11XHuxQ/3rS4qSGyd+FtQOdHWkcJpgcXNH51i9wFScMM2NkpXTW46C93T67nNC/iCse0L3SJ8j+yir+GdpjJqHa4Eby7Q1j9xO3WJUPFKLzrgbwcXMhlOkJ8G/Y5XRlUNbiw+X3p/veE1UKhXXop8yEmDKGsY84uF6CPjEjTW5FPmXCs4xraAMsQ2smc+KTZVZAx23c5EyBJdFXsgM3hmUhlv+0B4WLZ1csxBiBntXJUxFlDEThgY0+ERdujvAjbkcE0bvi8NosOjIn9f4ZM9zWxB+3QRMtF8B60h0KMSLJPFO9izJ8kPN96wYoPnEWQvoPPG6LFy2mcUN8QqGi6mphdZUdboddilUIrddTevOCo+Ya0Y3poflOtWH3i9QrD5/LCeGmRs/vt3fbw4Yb5jgkRsf9o61dgG54XQxQsu46JgOChUuuVdXX2UdDnCqvIBu2mImXRdyZUrktyzf6ozRu6ZfV7kz6eVZ5/vqF19uXm/d5WocefN1ne7n6+uLBqA/2/qhnqpJr+lDMdqpojdFiTIEmzAarEM/odEuPvbv/Zulfjnp7QtFOhnU1FW5k0q1gAFMrU3MoN8PhUqjXTZBadku432WcJcQDIap5nbmSA4vTn7H2WdkrkC+HVY3XJEvee+obysPhiWcSqBinpGPIvlf/sipHiZ5PBUZgrz08vmd1/ETixOBS95htby1gjdj9vO78cHbnXfvX7/fefvuYH9n9GYc7uyHvxy8GR8csDE7gIVXUOsSNefj61JuQvM8wV6XojaXXpcof0Gzl7nuZKzc4RU3jXON3uHFCVRac9jbfb27B4teW9vs6qfQJaHi5N3PECz4YOl9VKrELgOBRRb/+vwDSUY+HzNZwWsPkoWRV+6FFp9sPxGMuyzjBJjn8XMLefzkFudoKu7hqj41oZQwpagb3MJ8PmIGv2qRZbTsToniIj/kERnulvLdtAiZuW8g6KqjxLzjslLZEzSTNCVQT3EYhpjYzr3DSmK4OL+6pno4f1kcq4hoNCPd6HMAUKvP3NocBJOT1A3vwWPS399UmGkU -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Log Query Revisions - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/log-testset-revisions.api.mdx b/docs/docs/reference/api/log-testset-revisions.api.mdx deleted file mode 100644 index 96473caed6..0000000000 --- a/docs/docs/reference/api/log-testset-revisions.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: log-testset-revisions -title: "Log Testset Revisions" -description: "Log Testset Revisions" -sidebar_label: "Log Testset Revisions" -hide_title: true -hide_table_of_contents: true -api: eJztWd9v2zYQ/leMe9oAOXbzq5ueljYtkjVrgsTNi2EEZ4mS2VGiSlJZPUP/+3Ck5NiS7DiuPQxD+tC60t13vI93x9NxBgZjDf4QBkwbzYyGkQcyYwoNl+llCD4IGT8Y9/ZBsUeuuUw1eKDYt5xp806GU/BnEMjUsNTQT8wywQOL0PuqZUrPdDBhCdKvTBG+4UzT/0rklS/mJh94aLHT6XUE/nAGZpox8EEbxdMYPIikStCAD3nOQyi8uUSaCwHFyAPDjaAHpa+d2xK6c0nysAdLNQuVT4+oOKZmDy7dO+TS3u7tLOOjMjzCYJcGzkrI0kLIMjNpxeapYTFTa8HOrXZBzDsJOf7KAgMN3q5k3CpGMc4VCylDqkhtsn4l41uXDFAUxaKWUTmzD3QmU+0C+7Dfp39CpgPFM0oS8OEuDwKmdZSLzm0pDN62ORXI3CnVqHpa+HsrQfRGmAsDfn8hOp+S3J8BNyzRq7Pz/xLJlT+79+PfyhTMzUSqnYE7NMpANGxDVBLtGp6w9UlJgIUHCdMa47XY62D+KNULDyJhD7FFnOVonaC2R1iAZQ42DI6lFAzTtRYvUHcGc5TCc7AKgx/FdBAblKmP1tEmnmXT4PIqMAw5lQsUN0tkbEB2a21NxstPFt1rtwUBV0EuUP30MRfidy3T7nVustz8DHVXCaQsNZtooVI4XUtsTRca5K6PLYNWoxFX/yVSP8srrs2ztK5ysqH+Mo4GLhQhxWTrHP6MtlYsn4XbQZ0vQBQeBIqhYeEDmp3WrvcOtnNmycqzcB9GvjjY0kjIBNuDkXMHWxqp6BpPd3hAVWS9m5ZHVMXXTq1UbM2tVITt1EpF19zKI1P6B8L1vlQvPNAij7eFuSPdwoPdOVpyiPXTpNn+0TH4wMNa+Zv3i88tYfNSXp25nctQV71ay0n+TKe6r85ut9h3c9zXCvZawfZawXZdM1q68I27pZZWuap+oxd1JVWH/Nq6bdC6vX4z7OGboXl0vpK6NannROZzH8bUC2zVUGz0zV2NcN1Smp/emyM01rh6Iq0XZ3PDlxjR8/FhYWeRx4eHzWnjPQoe2lli54NSUm0/agyZQS7WDAqFDJbeviToR6sJu5JugbaM6bit4WwZFDmR1aKWjM6A3j43DSa/nOlSbmm0WNHr2F3txrmjb93+XgwGNw1At7fLm3ol405bHCXMTCRd5GRSE3CGNFGHXkZzXvZXr2yQdW8+9+0JSW5ppugrx25WrgT4MDEm036vFwiZhwcYs9TgAfIeZtwmmGZBrriZWpWzm8tPbHrBMGTKBvGCwB2FkwuQZbH53mDGPzGiys0XyoEk/9vtugecXJ44LeKCAvX26Ubqw3dMMsFqN0ytd0pwFOEvJ9Hpcffk7Zu33eOT08Pu+CgKuofBr6dH0ekpRngKteuhTZXa5uSb6m6jszRn3lSpvGTpE488jaSlqhoE203unN1cwsJHL/QP3hz0oR6CS8JUUTCwvFd7aF+DV4umeRyBByyx5QQMw+S3pxe0MgrfBNMFvFURXxsnlRFl2HfTywRyWzTsEmZlMgyhTIanHdMLO06/KSVGHkwoh/whzGZj1OyLEkVBj7/lTFHUj8pdGxN3Q6pfkyr+Z/Anm9qrF1tou7bKkLjIXbzXii4VRKdxFgQsM2tlRwtpfnN9NwAPxuW9bCJD0lFIztHfPgBd8Zrqhsc+m4HANM7tPB4cJv35B+MYQPk= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Log Testset Revisions - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/log-workflow-revisions.api.mdx b/docs/docs/reference/api/log-workflow-revisions.api.mdx index 600c4f676d..2d29bca338 100644 --- a/docs/docs/reference/api/log-workflow-revisions.api.mdx +++ b/docs/docs/reference/api/log-workflow-revisions.api.mdx @@ -5,67 +5,2214 @@ description: "Log Workflow Revisions" sidebar_label: "Log Workflow Revisions" hide_title: true hide_table_of_contents: true -api: eJztWW1P20gQ/ivRfLqTHEKhpXf5dBRalSvXIqDchyhCE3udbLv2uvsCzUX+76fZtY2dFzdJEwnpjg8Q7JlnMs+87O7sDAyONfQH8LdUX2MhHzUMA5AZU2i4TC8i6IOQ4/vH4vW9Yg9cc5lqCECxb5Zp80ZGU+jPIJSpYamhj5hlgocOovdFy5Se6XDCEqRPmSIDhjNN/5XQq99URu955NDT6acY+oMZmGnGoA/aKJ6OIYBYqgQN9MFaHkEeVBKpFQLyYQCGG0EPSn871wV254IUYA+m5ixUXj2g4piafTh156ELi7s31MSvPNqDJ94CKsNjDHfpwmkBWViIWGYmS7F5atiYqVawc6ed50EpIUdfWGhg0aEyGfSlHC9VoKLiikVUlFVpLGGmDnTtCxHyPK8DGGWZe6AzmWpfU0eHh/QnYjpUPKMChT7c2DBkWsdWdK4LYQi2redQWq80x9+TC2dOgjiP0QoD/cN6Ej11mP4MuGGJbukM/9fQM6ohtGYi1c7APRrVJhq2JiqJdg1PWHu5EmAeQMK0xnErdhvMX4V6HkAs3Dpax2lmLNf3odVGJkuNjaQUDNNWaxe6c+YR8oDg2AMKi2YF4Wsivq1APOjEJpj+DOB7B7BOJ3znKFuEc3Ex2PwSGEWcug+Kqwata4Rtaf9ORs0nde+W24KQq9AKVL+8s0L8qWXa/WRNZs2vMO8rgRSNax0tVAqnrbzO6cICu+1ZatBpLGTocyL1o7zk2vyQ1lVOLqhvxtGtT0VIMdm6G3xE13WaS+t2UOc1iDyAUDE0LLpHs9MueOZhO6eOLJtF+zDy2cMWRiIm2B6MnHvYwkhJ12i6w6WuJOvNtFjsSr52aqVkq7JSErZTKyVdlZUHpvRPpOtdoZ4HoIUdbwtzQ7q0DO3M0YJDnF9Nmkvz7ry3im+L8llxjyC2RxCEMGEYMbVxp98XJc8vIVq2JtcsZoqlYaPblF90uNGK8r4IA1HgDkrrRuQZrcnPcqOzQQxuCuJpR4lZxtN1N0DzFG+y2yoNucDTIr519nvtPIAMFSbMbFHV//FcWa189UQpBYqpBx6yddilmcpGOVhA526eEvOx9ZPVfdg6axjYZBp1ju6MsHAU2wCixr+PXcusVdeHP4ONzOhqQJW7adfLo6PFedYdCh45FjpvlZJq+2FWxAxy0TKJEjJsvN2k9oarKbuUIZbb/0SPF5vS0imEF1kt6sjo3NLbH40eyS9vupBrTK5Kej27q9049/S1Bfj97e3VAqCPbTOol3LcWZpJCTMTSRcVmdSEnCFNcqGX0SSRPfbK0ZruVaPFnpDkGNW966qDmd95wcSYTPd7vVBIGx3gmKUGD5D3MOOu1DQLreJm6lROry4+sKlf6V0e1wTc2uNTpClWRQcz/oERWf7QWcy7+D8+7gFwctrv5hyBlKrXTzcub79jkgk2f4Oy/M4EjmP87VV88rL76vWL192Xr06OuqPjOOwehb+fHMcnJxjjCczdfqyrtHQYu67yNjqNWem6So3x57pKxa3AIfHP01i68JXzSZccndOrC6idoODw4MXBIcwnb0OYehGGrheVsXevIZjLwir/IACWuEYEhmHyx9ML+maU98XYrsBbWStzw4kiFQ37bnqZQJ7WziC+jAZQlFGNd13LFPpMxTQMYELl1x/AbDZCzT4rkef0+JtliuplWAR7ROwNhtVRxZXSVzb1Cxg16a7rUCQurK+UuYZNzdRrnIYhy0yr7LDWIa4+3dxCAKPixjKREekoJO/odx+Abj9Nef3gns1AYDq2blAMHpN+/gVvRfqO +api: eJy1WFFv2zYQ/ivGPW2AHKdp6256mpu0aNZuCZK0ezAC4yydbLaUqJJUUs/Qfx+OpGzZkd00c/OQIBTvu+N3H49HLsHizEA8hn+U/pJJdW/gNgJVkkYrVHGeQgxSzSb34fNE050wQhUGIihRY06WNCMsocCcIIaUSjuHCEQBMXytSC8gAk1fK6EphThDaSgCk8wpR4iXgMXiInMAdlEygCgszUhDHa2GikpKqG8jsMJKHjhzTmoeYmgy9rVKFwyXqMJSYR1yWUqRuIUMPhtV8Njab6l5mVaQ4f/uUAss7ERT1hmUmn6mxMI6givKSFORUEecNUfleToQYB3ttOOFT3bkqK5rF4spVWH8Qk+Oj/lPSibRomRuIIbrKknImKySvaswGaKnUpmoyhtt5XMd8qmb0WLJ2QlLuXkIh5WdK93JobFaFDOIIFM6RwsxVJVI9wpn5NHqCFK09EhUntq3Iu9KTUuTDFhHkJMxONuLvQ/mr2BeR2FHPQ3mb3Thbib6aVBnLYg6gkQTWkonaA9K36mH7Y2cMqoy/RlOPnrY4CQlST/ByZmHDU4auqaLiUgPJeOGrNeL3nna5uugXhq2Vl4awg7qpaFr5eWOtPkfcv0UzOsIjKxmT4W5Zts6gsMt1K8uk+7IfcyR0BzKb51J5zmTk8UU7dZJimkqeLuivNyspd/nofP0zaebI1OlJGHhhrp9QSJ0UknUv7ytpPzTqKJ/Udmysr/C9lHGIKH2P8YKtcbFXp63bOHB4bm//AZC/RHR3aLszNSZt+xIFGorMkzsATfOKECGbdN4eFzEjXF3tE07dLhgP3nEZov7/36M3ADxg/1RY30Veo2WHLyU2i3YurlNKcNKWojHnejrhnYcGp7b3S7NqqnyDdmLk5OHPdgnlCJ1HVbvjdZKP70BS8mikHtaKqmSja8/UhZud9P3QfkAXRNkZq0WcKWXjibHT9k91ZHRu+Gv30sEr8u7DvM29NfQ69ndvYwzT98+Tb27ubl8AOhzu5nUD2rWa9TQa8srJztXfLsqlbHuLmXnEMOg5JaY7gdTNDRoOnozWDXKA6l4dYb0XXPvqrSEGObWliYeDBKpqvQIZ1RYPEIxwFLAdlQj97V3ylPdJjWUVFrYhcMbXZ6/p8U7wpS0k39rwjVLzotoc9oqf1iK98R0huugb7jFv14Z4Vo491bMF4v5an2Fe/MN81JSx5WMSxE8z/C3l9nwRf/lq2ev+i9eDk/60+dZ0j9Jfh8+z4ZDzHAIzbm/1tKqo1gPobVaTCvrFlN33Nh+rj9uLIpMOeKaiuyz8hqTL1SkGyjHR8+OjnelMRj0RpfnoWaEQ6DJgJsG0ZZQVhKBCCh3BQMsYf7H+gNHyfrMsWjh7dT01lUjCMLSNzsoJQpXF1wMyyD3MQS5QwQseIhgJXlo3w4jfoTg3Tzn3RKPYbnk+R+1rGse9s8MLN5UGJzK1kPDF1q0HiXuUFYclFO9E9iUuR9zVZs3il8Go1Nffvuu9qxtH5RiLpPeYpQkVNq9c29be//y4vqGlx6eLnKVso1G5oN/xwD8GGObG7IbW4LEYla5GyZ4TP75D6h2D5I= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Log Workflow Revisions - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+
+
+
    + +
    + + variant_ref + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + revision_ref + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + revisions + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/mark-variant-as-hidden.api.mdx b/docs/docs/reference/api/mark-variant-as-hidden.api.mdx index d097a92669..8611cbb5db 100644 --- a/docs/docs/reference/api/mark-variant-as-hidden.api.mdx +++ b/docs/docs/reference/api/mark-variant-as-hidden.api.mdx @@ -5,73 +5,298 @@ description: "Mark a variant as hidden from the UI." sidebar_label: "Remove Variant" hide_title: true hide_table_of_contents: true -api: eJzVVMtu2zAQ/BViTy3A2mnQk041UAM1kqBBkubiGMFGWltMJJIlV0FcQf9eLCX50TQFeuzJMjmzj9nhtsC4iZAt4RaDQcsRVhoKinkwno2zkMEFhieF6rkHKIyqNEVBVq2DqxWXpL4vJnf2zs7CpqnJcszurFJKoff3I+vDBzXzfkii2KlAtXsmoV2hiTRyvt7cXM5fckrJM7VYS4JAykSFygf3UFHdc43dpOTo/VgbaHCeAgp3UUAGNYansYR7jPd94aDBY8CamIL03oLFmiCDEWkK0GCkd49cgoZAPxoTqICMQ0MaYl5SjZC1wFsvzMjB2A1oYMOVHIydLgroupVEiN7ZSFFIpycn8nMs83WT5xTjuqnU1QAGDbmzTJYFjt5XJk/NTR+jcNp9IV3XdRo+nZ6+DnyLlSkSTc1DcOEfooIPIiibvu6CGE0lX4apjq8BlcuPbtFuv62Twsc6dXp3YizThgJ0q06PZxgCbg/EPHd9gdBpqOPmb7pfUIy4IdgFexuaxFA3ctvtc7uHR8r5aObL1FefesCtDic9ytur+3YbX3r5/pRshIj9XwXsZ1sTl05MXVBFTMnEXEIG08G2cdruDdyBhkjheXR4EyrIoGT2MZtO88o1xQQ3ZBknaKboDYhLI+VNMLxNlNnl4oy2XwkLCpAtV4eAa3FIP/Nj2E5u9OaMpPvhbc0aLl0wP/tBDs+r7FnSnrFrl+iDErNUnJpdLkCDtNGb+WTycXICv6+oI7CYG/Nk7jF3ugb9mwq7/kED1cnZwIT15/2FVOZd5BrtQbyrtLvU7W7rHFXT7p/X/7U7h8kxvfDUV2jSe0uStYPXluOKjKAhO1iXKw2liyyItn3ASN9D1XVy/KOhIH5a6Z77INNdtlCYKN8FZGusIv1Fw3dXw0t8r94qcvScFcM9Y9XIP9DwRNvjtZ62TDlauh0As1xEO6C+Wori/d0D/DI/n9/Moet+AfNTesA= +api: eJzVVE1v00AQ/SurOYG0JKXi5BMBIhHRiqotvaRRNbUn8VJ7d9kdVw2W/zuatZ0PSpE4coqz+958vH0zLTBuImRLuMFg0HKElYaCYh6MZ+MsZHCO4UGheuwBCqMqTVGQVevgasUlqW+Lya29tbOwaWqyHLNbq5RS6P3dyHrzRs28H5IodipQ7R5JaJdoIo2cz9fXF/OnnFLyTC3WkiCQMlGh8sHdV1T3XGM3KTl6P9YGGpyngMJdFJBBjeFhLOEO411fOGjwGLAmpiC9t2CxJshgRJoCNBjp3SOXoCHQj8YEKiDj0JCGmJdUI2Qt8NYLM3IwdgMa2HAlB2OniwK6biURonc2UhTS6cmJ/BzLfNXkOcW4bip1OYBBQ+4sk2WBo/eVyVNz0+9ROO2+kK7rOg3vTk+fB77ByhSJpuYhuPAPUcEHEZRNX3dBjKaSL8NUx+eAyuVHt2i3X9dJ4WOdOr07MZZpQwG6VafHMwwBtwdinrm+QOg01HHzN93PKUbcEOyCvQxNYqhrue32ud39d8r56M2Xqa8+9YBbHb70KG+v7sttfOrl+1OyESL2fxawf9uauHRi6oIqYkom5hIymA62jdN2b+AONEQKj6PDm1BBBiWzj9l0mleuKSa4Ics4QTNFb+D3sZ+lW/VRoCAWjpQ3wfA2xZtdLL7Q9jNhQQGy5eoQcCX26Q1xDNu9BXrzhUSaYfBmDZcumJ/9Kw+zV/Ys6d3YtUv0Qaahtg+YP5CVYZU++7JPJm8nJy81MxDU7GIxTAHmaQrGOhIM9G9y7YQCDVSnEQAmrN/vL6RK7yLXaA/iXaYlp2526+moqnY/h//Xkh1ekemJp75CkwYzSdYOplyOuzSChuxgr640lC6yINr2HiN9C1XXyfGPhoJ4a6V77r289LKFwkT5LiBbYxXpLxq+uhxG9rV6qcjRf1bM94hVI/9AwwNtj/d/WkflaO92AMxyEe2A+mx7yhzsJvXT/Gx+PYeu+wWvvYlP sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Mark a variant as hidden from the UI. Arguments: - app_variant -- AppVariant to remove +app_variant -- AppVariant to remove Raises: - HTTPException: If there is a problem removing the app variant +HTTPException: If there is a problem removing the app variant - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/mark-variant-revision-as-hidden.api.mdx b/docs/docs/reference/api/mark-variant-revision-as-hidden.api.mdx index f213a24683..db85bb0196 100644 --- a/docs/docs/reference/api/mark-variant-revision-as-hidden.api.mdx +++ b/docs/docs/reference/api/mark-variant-revision-as-hidden.api.mdx @@ -5,74 +5,308 @@ description: "Mark a variant revision as hidden from the UI." sidebar_label: "Remove Variant Revision" hide_title: true hide_table_of_contents: true -api: eJzdVU1v2zgQ/SvEnHYB1soGe9KpBmIgRlNs4Ka9OEYwkcYWE4lkScqoK+i/L4YSbTlpCiwW6KEn2+SbD755b9xBwJ2HfA1f0CnUwcNGQkm+cMoGZTTk8BHds0CxHwDC0V55ZbRALypVlqTF1plGhIrE5+XsXt/rudu1Deng83sthBBo7UMKf/dOzK0dq4lghKPG7GkAptwPqmTgKpVaXk2R93qFylPKfn13d7v4VlDsNxfLLbfiSCgvUFhnHmtqhlild7FNtDY9ByQYSw45dllCDg2659Tsw7Ef9A/DW0GCRYcNBXLMWwcaG4IcUogqQYJi3iyGCiQ4+toqRyXkwbUkwRcVNQh5B+FgOdIHp/QOJAQVaj5I5CxL6Ht5rDAh53+XODHLNTacwlujPXmOury44I9zGXxqi4K837a1WI1gkFAYHUgHhqO1tSoik9mT55ju1Enf972Evy8vXyf+grUqY5hYOGfcf8gK1vH0ghr6LimgqvmbCtT414DaFGe3qA//bOMUz4li1scTpQPtyEG/6WU6Q+fwMGHzxgwNQi+h8bufEf+RvMcdwTHZ29BIhrjj2/5U2zw+URHOhr6O7xpKj7jNVE2J3oHdt59xNdD3o2IJwl57lXCYbUOhMuygkmoKFI0SKsghG63hs+5kkj5LcvZZN1F2DxI8uX1yV+tqyKEKwfo8y4ratOUMd6QDzlBlaBWwej0VrVPhEEPmt8sPdLgmLMlBvt5MAZ9YOYMWzmHHMaBVH4hZGV03b0NlnPo+DHj0XTVE8bOV3poYPjI0j82J+e0SJPAzBpFfzP6aXcDL1XoGZtFjEUWfasdrkC9YOL4fJFATFQ+BsHl/uuDOrPGhQT3Jt4oLVKT9kpbAy7a6k/9+++U/Tj3Qt5DZGlX0cKS7G/W7Tqvdg4T8bM0fJcw30/W8kVAZHzi46x7R02dX9z0ff23JsUw3ckj7yKJZd1Aqz99LyLdYe/rJRP5Yjcb/U7zVf5KyZh3vsW75F0h4psP5PxXvuV9YeUpR3KdVMmk3IuYFj3IS+2r9s5uPq+ZqcbO4W0Df/ws+jAPM +api: eJzdVU1v2zgQ/SvEnLoAa6XBnnRad2OgRlts4Ka9OEYwkcYWG4lkScqoV9B/L4YSbTnZBCgK7KEny+Sbrzfzhh0E3HnI1/AFnUIdPGwklOQLp2xQRkMOH9E9CBT7ASAc7ZVXRgv0olJlSVpsnWlEqEh8Xs5u9a2eu13bkA4+v9VCCIHW3iXz16/F3NoxmghGOGrMngZg8n2nSgauUqjl1RR5q1eoPCXv725urhffC4r55mK55VQcCeUFCuvMfU3NYKv0LqaJ1qZyQIKx5JBtlyXk0KB7SMneHfNBfzfUChIsOmwokGPeOtDYEOSQTFQJEhTzZjFUIMHRt1Y5KiEPriUJvqioQcg7CAfLlj44pXcgIahQ80EiZ1lC38tjhAk5vxzixCzH2LALb4325Nnq8uKCf87H4FNbFOT9tq3FagSDhMLoQDowHK2tVRGZzL56tulOmfR930v48/LyqeMvWKsymomFc8b9hFewjrsX1JB3SQFVzV8qUOOfAmpTnN2iPvyzjV08J4pZH0+UDrQjB/2ml+kMncPDhM0PZkgQegmN371E/EfyHncER2fPQyMZ4oZv+1Nsc/+VinDW9HWsawg94jbTaUr0Duw+X8bVQN9/BUsQ1toTh0NvGwqVYQWVVFOgKJRQQQ7ZKA2fdSeR9FkaZ591k8nuQYInt0/qal0NOVQhWJ9nWVGbtpzhjnTAGaoMrYLH62oeb8XfDAUebU9F61Q4RH/z6+V7OrwjLMlBvt5MAZ94rIZBOYcde4RWvSembJTkvA2VcerfofujKKvBijlRemui+UjfmNtbLB5Is4q5ziHti9mb2cVzxYwGYn69HNWBRVRHyiPCQD6i60gUSKAmSgMCYfPX6YKztMaHBvXE3ypuWpEWUdoWj9PrTkL97V+JcQICfQ+ZrVFFsUe6u3HQ1+kN8CAhP3sPjrPON9M9vpFQGR/YuOvu0dNnV/c9H39ryfHIbuTg9p4HaN1BqTx/l5Bvsfb0QkdercYN8Yd4Lv801ppneo91y/9AwgMdzp80Xoj/Y+QpRXHxVkmw3YiYF9zKie2Td4KVfdxJV4sPi5sF9P0PWesSWw== sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Mark a variant revision as hidden from the UI. Arguments: - app_variant -- AppVariant to remove - revision_id -- Revision ID to remove +app_variant -- AppVariant to remove +revision_id -- Revision ID to remove Raises: - HTTPException: If there is a problem removing the app variant +HTTPException: If there is a problem removing the app variant - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/observability.tag.mdx b/docs/docs/reference/api/observability.tag.mdx index 12136b8216..e8ac404fae 100644 --- a/docs/docs/reference/api/observability.tag.mdx +++ b/docs/docs/reference/api/observability.tag.mdx @@ -5,16 +5,9 @@ description: "Observability" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/open-evaluation-preview-simple-evaluations-evaluation-id-open-post.api.mdx b/docs/docs/reference/api/open-evaluation-preview-simple-evaluations-evaluation-id-open-post.api.mdx deleted file mode 100644 index e9be541d06..0000000000 --- a/docs/docs/reference/api/open-evaluation-preview-simple-evaluations-evaluation-id-open-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: open-evaluation-preview-simple-evaluations-evaluation-id-open-post -title: "Open Evaluation" -description: "Open Evaluation" -sidebar_label: "Open Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJzlWN1v20YM/1cMPrWAGmfBnvQ0L0nRrNmSxW5fDMM4S7R93elOvQ9vnqH/feCdPi3bTZoUGJCnxBL5I/kjxeNxB5atDMRTuN4w4ZjlShqYRaBy1P7XTQox/ZJzrCXmucYNx7/nhme5wNYbM2+L8XQ+96q5MhYiyJlmGVrUZHEHkmUIMXQUIAIuIYac2TVEoPGr4xpTiK12GIFJ1pgxiHdgtzkpG6u5XEEES6UzZiEG5zyK5VaQQBPX4CaFopgRqMmVNGgI5+L8nP6kaBLNc5KDGMYuSdCYpRODh1IYIkiUtCgtibM8FzzxsMMvhnR2Ld9yTfRZHiwkygWl0mUuLa5Qt3y89BIRpLhkTliIz4uoRYs3KLd3S89aF3wpfP6OC3AzT4QyRGFbqPRloZRAJqGI6kfSCQFEU+XdjRlcBoQiIjjBN/gcsFvSD1Assc8EGwWEoogqKbX4gok9WAEPTr73fPVBiwgytKzrCktTTnpM3Hc47TlbVmELtkpyx1K26D5px3jYFiRcJ04w/ea9E+I3o+S7O2dzZ9/CfsAEwi1mj9RiWrPtSXb3dKFH8Snl34lM0uiV5/+J1D/ULTf2m7QeC7Kn/jSOJqEUyz74KAb6LpBuEXX71/dBXbUgiggSjcxiOmf2FGCr8abM4jvLvT/HrVwG2MHIk+Xy9EcY+RRgSyMpCvwBRq4CbGmkomuxpVPscXb8UfUYsn7d+sOr4etFrVRs1VYqwl7USkVXbeXloAPeBrV5Rvl/LtUpfrZ/EnTPVGOZdSebVgQoXUZzVY4yDU++OnRIo4l2UoZHJswZFCzjwmmaMlBrpelRwmSCQmAKs0OH2Tg4cfAo++pQb+fGYr7nZXlAfJvs/jFxrG8fCzxxxqoMIli7jEmIgDmrgLwrydxS7wpDzBHjj+ihf1Kkg7GPlBTRWIP2VYQ+CbE2wbeG0ldBwKiJtyGhHJuVfhUUXFfRNgRozJHZw93p4AC1B/lQ6p8aqcf+3tf0oivmp71eJ3oCxDPV62taUZDazxcX/VvdZyZ4Gsrlmprs91/pUrSMC3+9qiqqKyBU0nn7lOF2tl9+TdS3KqnIgsysDtVfM4Abw1bYlNNxUU/GYEJvD1He3MGnPq5gupRrH6A1vYHd42FcBfpO5ffDZHLfAwy57Sb1Lkc5aJWRv8etFW0t6q2DXUMMw3JpMQxLi2FraTHcdXYQxZCWFnQ8o95UywqnBcSwtjY38XCYCOXSM7ZCadkZ40OWc/8RGUyc5nbrVUb3Nx9x+wFZihri6awtMKbKCrXSFavTxHL+EYm1ck0ycnatNP+3CtOvSdZBi2jhcqm8etUdvXOD0f0NtGYjOD/76ewc9lnsCNNHwRL/UVS2/WuI9lio46e+l/kvAiyy7JfmBXlGeaAe2OD1k7Z3fyk5sPiPHeaCcV/x3viuzOcUynxSnnxGob0zoQEq3t8s+bTOIlhTYcRT2O0WzOAnLYqCHvupiRIVwYZpzhbE43QHKTf0fwrxkgmDPWfrJgJvHspv5e2guUh2g6iyKym15B/9ggj+wm1vF+Zbwbqqn10pM0oSzG1Lu9e5qNDqr+D+bjyBovgP3CPYNA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Open Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/open-run-preview-evaluations-runs-run-id-open-post.api.mdx b/docs/docs/reference/api/open-run-preview-evaluations-runs-run-id-open-post.api.mdx deleted file mode 100644 index b6fa8715db..0000000000 --- a/docs/docs/reference/api/open-run-preview-evaluations-runs-run-id-open-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: open-run-preview-evaluations-runs-run-id-open-post -title: "Open Run" -description: "Open Run" -sidebar_label: "Open Run" -hide_title: true -hide_table_of_contents: true -api: eJzNWEtv2zgQ/ivGnFpAjdNgTzqtN2lRb5JNYKe9GIbBSGObXYpi+fCu19B/L4aUZMkPxXkU2JMtaeabmW+GnCE3YNnCQDyBTysmHLM8lwamEeQKtX8aphDTk5xpJ2dK44rjPzPcStN7M/NfeTqbeVGVGwsRKKZZhhY1WdiAZBlCDEESIuASYlDMLiECjT8c15hCbLXDCEyyxIxBvAG7VqRlrOZyARHMc50xCzE451Est4IERk72hikUxZTQjMqlQUMAF+fn9JOiSTRX5DPEMHZJgsbMneiNSmGIIMmlRWlJnCkleOJD7H83pLNpOKU0EWR5sJDkLiiVvnJpcYG64dyll4ggxTlzwkJ8XkREhLck13dzT1AbdS58ao4LcDNLRG6ItKZQ6cRjngtkEoqofiWdEED8VG4NTe8yIBQRwQm+wteA3ZB+gGKJfSXYICAURVRJ5Y/fMbENWrdFO3Lys+drH7SIIEPL2q6wNOWkx8R9i9M9Z8u6a8BW2W1Zyh7bb5oxHrYFCdeJE0y/++yE+NPk8sOds8rZ97AbMIFwi9mJWkxrtu5kd0cX9ijuUr4lMkljrzz/T6T+ld9wY5+k9ViQe+rP4+ghlGK55Z3EwL4LpFtE7Y3rZVBXDYgigkQjs5jOmO0CbGy1KbP4wXLvz3ErlwG2N/BkOZX+CiNfA2xpJEWBv8DIVYAtjVR0Pa6pb51mxzenU8j6Y+271pavN7VSsVVbqQh7UysVXbWVt4MOeCvU5hXl/61ULyIwllnXuSlFgNJlNBIplGl488OhQxo2tJMyvDJhgKBgGBdO0/iAWueaXiVMJigEpjA91KzGwYlDLtcDQm2dksZ221d7EDAW1U5MZbvYlfwb14dmqsrFa1xv97njxHBJGyINcKs8jEgQAZMyt+GhuRESRBFBrvmCyy7QxBmbZxDB0mXMAzqbN6HuAgQNTjhHjTIpu8uRrtOO/A1LSLjFS2HGpPvmC6RjQhpVVO33rwNCvmf57L5dOR2wux32Jx7i4CIZOXnFLBtbVEPZbsBPDzjDEMMpxkuJukRb5fWUZ89yauyXqa9fhWyX4q5BaAdoVOo3touPNOUypbjcHcqOpC7JhcvkgZRymXbmlL43JptjcmF6eYp/Aiuxuqi+DZFdBp/9No7qpbubP3F2iN3T99Mqx0Od4HgolScgy4yUwZ2A+qziu62K4+TzFFk6dJw6Vf81uvWZvChI57eLi/0j/DcmeOoVep+o8b78/J6iZVz4I/XhxSLypPX1OQea6W6WtiHfVN2TFq9ZdBXlLRrDFtjVnWsiiYxeaLxPlBzFFUyXcs2OV9Mb2D0exlWgryu5Xx4e7vcAQ27bSb1TKHtUPP7Qvszp9qm+TaJ1C/3yDqrfuIPq0x1UfxNuloo+3UHROkK9qu6enBYQw9JaZeJ+PxG5S8/YAqVlZ4z3meJ+sRhMnOZ27VUG98NrXH9BlqKGeDJtCoypkkJttMXqtDDFr/0eUd56DZxd5pr/V41L/vJrGbQK33XnuVcvGRt453qD+yE05l84P/t4dg67rLWEaRGwxC+Cyrb/DNEOC3X8NIVlfgWARZb9vv1AnhH9NJFt8RpJ2jmclsFb/Nf2lWBhXPNWN2X+JlDmj4w27hz9bE0/cX0/6NM4jWBJ+Y8nsNk8MoNftSgKev3DoaZMTSNYMc3ZI/E22UDKDf1PIZ4zYXDPx3qTgHejci28720vB9q+V9mUlEpyl54gCq2musr0a3xZFUrZh2CQJKhsQ21vS6KKqqv8/m78AEXxE3eXXHU= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Open Run - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/open-runs-preview-evaluations-runs-open-post.api.mdx b/docs/docs/reference/api/open-runs-preview-evaluations-runs-open-post.api.mdx deleted file mode 100644 index aaadb1457e..0000000000 --- a/docs/docs/reference/api/open-runs-preview-evaluations-runs-open-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: open-runs-preview-evaluations-runs-open-post -title: "Open Runs" -description: "Open Runs" -sidebar_label: "Open Runs" -hide_title: true -hide_table_of_contents: true -api: eJzNWG1v2zYQ/ivGfdoAOU6TNt38aW6Sol6bJbDTfjECg5bONjuKVPmS1TP034cjJVvyi+ykKbB8cCTq7jnec0fekUuwbGagO4LrRyYcs1xJAw8RqAy1f+sn0KU3OdZOmnGm8ZHjP2Nci4cPXiRTxkIEGr85NPadShbQXUKspEVp6ZFlmeCx1+t8NUrSmInnmDJ6yjSZtRwNvWknxzzxj9xi6h/sIkPogrGayxlEMFU6ZRa64BxPII9KAaY1W0AElltB7wMnW/3EQL4WUZOvGJez5RoTYqG0+bBWXRMzcLKfmEFwDnLCWuta7dAPmExJEzw4Oz2lfwmaWPOMIKALQxfHaMzUidagEIbouRzFygWlwikuLc5QVzy/9BIRJDhlTljontIsnazzWkedCp8US2BycTuF7mhTgJtxLJQhv6tCxSQmSglkEvJoNSSdEJBXWO2b1mVAyCOCE/wRfwTsE+kHKBbbHwTrBYRdybIzK957vrZB8whStKw+FZYknPSYuKtxujXZIskrsGV0a5bSSX2k6uNuWxBzHTvB9C/vnRB/GiXbt85mzv4Kmw4TSJEkx2iFZdfE7oYubFHcpHxDZJLGVnr+n0j9S33ixh6kdZ+TW+pP4+g+pCJIlu5eA9sMbE+BdPOovnE9D+qqApFHEGtkFpMxs02AlX09YRbblvv57LdyGWBbPU+Wy5KfYeRzgC2MJCjwJxi5CrCFkZKuyWLMd++1eyvhYbLeLVr9pMrXi1op2VpZKQl7USslXSsrLwcd8B5Rmx9I/y+Feh6Bscy6xk0pApQupTYkQ5mEkW8OHSbgS7YMQyY0EOQM48Jpah9Qa6VpKGYyRiEw2d3CDMMkdk151SCsrFPQ2Gb5qjcCxmK24dOenuJvXOxq4MopfsTFep/bTwyXtCFGwOWjCi0SRMCkVDa8VDdCgsgjUJrPuGwCjZ2xKoUI5i5lHtBZVYW6DRC+vZuiRhkX1WVP1al7/oIpJNzsuTBD0n3xBdLQIQ1Kqrbr1w4hX7N8dF8unQ70+gSxr8+/YpYNLWZ9WS/AhxucfvDhGOOFxCpFa+l1aGZPmtTQL1OfvxmyTYqbGqENoEGhX9kuXlGXy7KMy82mbE/oYiVcKneElMukMab0vdLZ7JML3csh/gmswGqi+iZ4dhnm7LdxzJ67u2XMzpvE7uj7cZnjoY6YeEiVA5BFRArnjkB9UvLdlMlx9HmKLO06Th2r33wRUMve0fGoZnVcz/3Z//XZ2fbp/gsTPPEarWuqyc8/2idoGRcNp3Sh4trXp5x1HvYz9KksrLSuzawpX2/QGDbDpsK9YpLIaIWafCAbya9gupCrFsMVvYHd/W5cBfqaovvh/v5uCzDEth7U2wxlq8icFO1c0Z1YcdcV1jR0iouxTuVirEPXLB26GKOlhZoaAR8fpwV0YW5tZrqdTiyUS07YDKVlJ4x3WMb9+jEYO83twqv07vofcfEBWYLaZ21FYEgZFHKiLrYKB8v4R79thL0Tes7Oleb/lh0U9UcwD1rkPuXmYH2Jd/2dpZnA2qXcCM6n7Lc304vX7TdvX71tv35zcdaenE/j9ln8+8X59OKCTdkFPPiyPlV+MgXvPe9qq3fXh0qDDacnr05OYZP7mjAtJRb7pVR64j9DtMHpik1q81K/jsAiS/9YfyA/KYbU8q3xqqHeOP4WXFr8bjuZYKEh9GaXRRaMoMgCslq5Ty0u3Pytqu9R55Q73REslxNm8LMWeU7D3xxqCvdDBI9MczYhukZE4bwMfFFq4DJsKu370EGQsRDojQ2GFn/Q6MUxZrZR9qGS3ne3w3uIYFLc4aYqIR3NyDf67YL3JzhIiUFjSxBMzhztCV0ImPT3H+UgpYA= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Open Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/otlp-receiver.api.mdx b/docs/docs/reference/api/otlp-receiver.api.mdx index 9351223d39..9298c31e2e 100644 --- a/docs/docs/reference/api/otlp-receiver.api.mdx +++ b/docs/docs/reference/api/otlp-receiver.api.mdx @@ -5,59 +5,100 @@ description: "Receive traces via OTLP." sidebar_label: "Receive traces via OTLP" hide_title: true hide_table_of_contents: true -api: eJx9U0Fu2zAQ/IoxZ8JyetSpRi8NUsBGnJ4MoVjTm4gpJTLkyqgr6O/FSo4dG2h0kUTOLHdnhj2EXjLKLVa7zOlAO+edHFEZ7Dnb5KK40KLEI1t2B55JIst5dnA0Wz39WM9hECInUtj9HiWC+PgrTegEg8Q5hjZzRtnjy2Khr+vSm85azvm587PHExgGNrTCrSicYvTOjkcUr1k5PbKtuSH9ikkbEDedkIWkG7/kGBklsiTXvsBAnHhd2EyIYTDvkLB7ZStjr2+dS7xXPU6FqgvxW/CerUz8c6eDPgYNSx10/hiylookNUoU4aOsxeGuUH2KSUUY6CYnNaBHlzxK1CIxl0Vhfej2c3rhVmhOrqDoMFTKsF1Si5SyXN8/8PE7054Tym31EbBRhSZRrmFnaSi6Bz7CoKVG/5ed1CG5v6PSMHDqTj2xdEbXPoeRfhJkOTY3W67vYaBjTH4u5nfzBW4DdAVWc8mO5r6fPW7D3Khwnh8G3JDTPWFqvl42tDMVvaH2Q73/5PW2rf6Ss88ifhJM+I8U0ZNrMZw67U9Ob3HltApyp3dDfFT+5HdlUGs8yi36fkeZfyY/DLr81nFSSyuDAyVHOxV4Ww3mXX91+zcfVSlrOWrEDuS7ycab66EpOOdxvdo8YRj+ARPcVac= +api: eJx9U01vozAQ/SvRnK2Q9Mhps71s1JUSNd29ILSamGlwa7BrD2iziP++GiCfUssFsN+8Gb/33AHjIUKawWYfKbS4N9bwEXIFBUUdjGfjakjhmTSZlmYcUFOctQZnm5ef2zkocJ4CCmxdQAqOrf8TRnQABYGid3WkCGkHD4sHed1S7xqtKcbXxs6eJzAo0K5mqlng6L01emiRvEWp6SDqkiqULx9kADZjh5ZCNCOEj54ghcjB1AdQwIatLPyeIL2CyMhN/Aq8GxF9r04Qt38jzcPJPhoTqBD1Tm3PlPmF4tFZS5pHpvMJe3kUVMSlE928i0LqkUtIIXHXdiTtMhFdk1F96UJBWkKaddAECymUzD6mSaKta4o5HqhmnKNJ0Bu4N3M17M4eBQp9LnS6CeK78K226yc6/iAsKECa5deAncg+Kn0LOyuI3jzRERTUWMn/quHSBfNvsA8UGBmgHKtEAFO/uqF8Umua7Tvqd6oLUBdHYTFfzhefHWYqmK226yk9qIf0nOYYYKDu5DoLBQqoQiN7TFh9u2zIlOJOhfUV3ycX4n687hLkr+7QJB7TX068RTOkc5i0myKRwU0kRJilXD62XurHYOQKSslRmkHX7THSr2D7XpY/Ggpib66gxWBwL2Jnea9OXojz73QUpbQmL1ls0TajpXf3TxJxDu52s3uBvv8PXy53Zw== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Receive traces via OTLP. - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/otlp-status.api.mdx b/docs/docs/reference/api/otlp-status.api.mdx index 7f0e8e8a05..dcd34b614a 100644 --- a/docs/docs/reference/api/otlp-status.api.mdx +++ b/docs/docs/reference/api/otlp-status.api.mdx @@ -5,59 +5,100 @@ description: "Status of OTLP endpoint." sidebar_label: "Status of OTLP endpoint" hide_title: true hide_table_of_contents: true -api: eJx9k1uL2zAQhf9KOM8iTvrop4ZS2rCFDd3tUzBFkSextrKllcahqfF/L2M7V2j94ovO3L4z7sD6kJBv8bxLFI96Z53lEwqFkpKJNrD1DXK8sOY2zfx+9vz6bTOjpgzeNjyHgg8UtcjWJXJ4duFnGtRQiJSCbxIl5B0+LBZye0jcGkMp7Vs3+z6JoWB8w9SwyHUIzpqhQPaWJKZDMhXVWp5ClPJsxwpT3bwDnwIhR+JomwMU2LKjyxzoe3WW+N0bGR56fW9tpFJoTImKa+An7xwZHuMvnfZyKdTElZfpDySZguYKOTJ/yzQ7LjOBk3HUhgSOHFIU+h3a6JCjYg4pzzLjfFvO9YEa1nNtMx0s+kIiTBvFHwlZbdZPdPpKuqSIfFvcCl4E0MjkXnYho4N9ohMUGl3L+6rlykf7ZwANBSvmVGOUjGibvR/CJx6robnZarOGgowx2rmYL+cLPG7PnVi81Wbw9lx7OIZ6oHCZHwpUaytnTLr+eD2QzoJPXOvmJt8/lvWxre66Zv/b7wkY02/OgtO2QT912k1Ob3HntABZyo/BLkj86HehUPnEou66nU70I7q+l8/vLUWxtFA46mj1TgBvi16d+Yvbv+gkpIyhIIMctWtHGx/+DtmCyzp++fyKvv8LS5BUqQ== +api: eJx9U8tu2zAQ/BVhz4Rl96hT3aBojRSI0aS9GEKxptYWE4pkyJVRV9C/FyvJjxhIdJFEzr5mZjtg3CcoNvCwTRQPuDXW8BFKBRUlHU1g4x0U8MjIbcr8Lnt4+rHOyFXBG8czUOADRRTYqoICPNvwJw1oUBApBe8SJSg6+DSfy+smcas1pbRrbfZzAoMC7R2TY4FjCNbooUD+nCSmg6RralC+QpTybMYKB4rJjBA+BoICEkfj9qCADVs5+D1BegVTlx+Ax6mh79UJ4rfPpHmY7LU1kSrh7lT2nLK8pLjz1pLmMdN5wl4eBQ1x7YW1PUnOgFxDAbm/1iI/LHIhNeeImoRUuaQoqnXQRgsF1MwhFXmurW+rGe7JMc7Q5BgM3Cq5HG6zO4FCX0o63UYRXfIt16t7On4nrChCsSmvAY/C+kj0W9iZQAzmno6gwGEj/8uWax/Nv0E9UGCkgXqMkvmN2/khfCJr6u0L6hdyFaiLoDCfLWbz94aZArLlejWZB/VgnlMfAwzUDV1nokABNWjkjgmbz5cL6TL4xA26q3zvbMNte93Fxx8t0EQe01/Og0UzmHPotJsssYE3lhBiFrJ5bIPEj8YoFdQ+saC7bouJfkXb93L82lIUeUsFB4wGt0L2puzVSQtR/oWOwpTWFGSQA9p2lPRm/cQRZ99++/oEff8fFdF2Zw== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Status of OTLP endpoint. - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/otlp-v-1-traces.api.mdx b/docs/docs/reference/api/otlp-v-1-traces.api.mdx index 2319544567..36f4319cdd 100644 --- a/docs/docs/reference/api/otlp-v-1-traces.api.mdx +++ b/docs/docs/reference/api/otlp-v-1-traces.api.mdx @@ -5,59 +5,97 @@ description: "Receive traces via OTLP." sidebar_label: "Receive /v1/traces via OTLP" hide_title: true hide_table_of_contents: true -api: eJx9k0GPmzAQhf9KNGcLkh45Neql0VZKtNmeEFpNzGzw1mCvPaCmiP9eDRCyyWG5YOw39vh7jx4YzxGyHPanSKHDk7GGL1AoKCnqYDwb10AGz6TJdLTigJriqjO42r/8OiSgwHkKKLJdCRk4tv6127xOQlAQKHrXRIqQ9fBtvZbX/d7HVmuK8a21q+dZDAq0a5gaFjl6b40ez0jfo9T0EHVFNcrIB+mAzXRCZOR2HPHFE2QQOZjmDArYsJWJ46QYBnWVuNM7aR57/WhNoFKAzBsVt8IfzlrSPNUvnQ7yKKiJKycAvIuylUeuIINUeKTdJl14CGYKwryHNljIoGL2MUtTbV1bJnimhjFBk6I3MBRSodsgrkjJ9rB7ostPwpICZHnxWXAUJhOGe9kCA715ogsoaLCW723LlQvm38gWFBjxo5qq5FameXNj+YxgOza32h52oECuMTm4TjbJGh4zcycWO1GPdl7PHpdBPVBY7g8KqEYja0xYf78tSGeCucbm037XiN5oLzF9bK2/peurZM/QmP5y6i2aBoa52372Nx/zLiw2op88LhRUEoIsh74/YaTfwQ6DTH+0FMTGQkGHweBJoObFoK7MxeE/dBE6WpOXIHVo28m6h59AnF9Sd9gfX2AY/gOYFktC +api: eJx9U8FuozAQ/RU0ZyskPXLabC8bdaVETXcvEaomZhrcGuzaA9os4t9XA4S0kbZcAPvN8/i9Nx0wniJkB9geI4UWj8YaPkOuoKCog/FsXA0ZPJIm01LCATXFpDWYbJ9+7hagwHkKKLBNARk4tv65XT2PQFAQKHpXR4qQdXC3vJPXZ+59ozXF+NLY5HECgwLtaqaaBY7eW6OHM9LXKDUdRF1ShfLlg3TAZjyhpRDNCOGzJ8ggcjD1CRSwYSsLvydIryAychO/Au9HRN+rC8QdX0nzcLP3xgQqRL7LsTNlfqW4d9aS5pFpvmEvj4KKuHQinHdRSD1yCRmkomPartJZR7GHgnjVQRMsZFAy+5ilqbauKRZ4oppxgSZFb+DWv/Wwm9wLFPpc6HQTxGrhW+82D3T+QVhQgOyQfwTsRehR28+wWTP05oHOoKDGSv7XDZcumL+DYaDASAPlWCVXNvWLG8onfabevqN+o7oAdfUQlovVYvm/y0wFyXq3mfKCesjLpY8BBupGrlkoUEAVGtljwurbdUO6FD8qrD/wXWbgass8B7ctdtf4fjU6k4BMfzj1Fs2QyaHbbgrCYRgo0WQl+DEMuYJS0pIdoOuOGOlXsH0vy+8NBbE0V9BiMHgUgQ95ry76i9tvdBZ1tCYviWvRNqONN1MmKZjjudvun6Dv/wFsAm0C sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Receive traces via OTLP. - - - - - - - - - - - - - - \ No newline at end of file +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-analytics.api.mdx b/docs/docs/reference/api/query-analytics.api.mdx index fe2cd56fdf..fe11dd9a78 100644 --- a/docs/docs/reference/api/query-analytics.api.mdx +++ b/docs/docs/reference/api/query-analytics.api.mdx @@ -5,36 +5,36 @@ description: "Query analytics, with optional grouping, windowing, filtering." sidebar_label: "Query analytics, with optional grouping, windowing, filtering." hide_title: true hide_table_of_contents: true -api: eJztWFFv4zYM/iuBnr2mLfbkp+WuvV1x3dr1snsJgkKxGUdXWfJJcros8H8fKNmKlKSJ2y7AHvaUwCb5UfxIiuaaGFpokk7I3UyDWtIZ48ysyDQhsgJFDZPiJicp+VGDWj1SQfnKsEyThFRU0RIMKFRfE0FLICmZS1VSQxLCRKdFEqLgR80U5CSdU64hITpbQElJuiYg6hLxORQ0Q1lagDAUPTCrCk1qo5goSEJymNOaG5J2MgkxzHCU+eRgmyYJPMlq/QpHqFjdze1RYlw02T4RNeekmYawiBGiSp6Dfs353wJ750BCXAHPp8f93YGEuEwYTBv+HmS0UYA6CH3T4UQUM26gTY6T0uxxQnTDSnigooATo49ZCcrihOi0qh5ZfmLoUVUNbvIIF8SSKSlKEKfOtusAKfRgSRWjJ0f/1qI0+FCBrqTQoNHa5fk5/uSgM8Uq7JAkJV/rLAOt5zUfPLTCJCGZFAbdRx+qirPMNtThd406670eVgobr2EOy0hD+WMma2dkq2CCHEG5wUcr1yRkThmvFTwqaiDQE3U5i9Q+ObnBA8o1iYfT5pBWB6YtFl0WRzVGyyKS59SAyFbHVG5bMe+ZkU8gdI9IjJ1gC7ejthdto5NTY1lhBkqrtkUKK0EbWlaBRX9JtRdgikbgJxQlcSk7zSYh2qVMD3bb5Nrl97hqx7BXPUZVR1MPit5PT+MveTn7DpmJyngSBHo7WtshaM+1cXvLpaCwb+2gcUUNvZfMxaT1gSpFV4GvKHPcx6BCtwovqqegUOIa2PI0ytg2FXe8H3VzmO812MriLPW58ab71ufLrM6ewOjTl4OfJA6lz2YMaMO2686/ce5g1jzHflC7SXiv1bYsDhm96vS37Ha1+BabH10mRfY29fems4990m2M7sn+Tvw3MIpl+mp8h2yAUlL9z8Z/go1XtNVgfnf11DEZePLBtoCW5xd65Ye2TRzD7tpJ/DWzp58FAt3DwR846g28MGkahPv58nJ3HvtGOcstzYNre55XDGNxBudgKOMH+h+XWfS2x7Tp+Z++HNFb6RzEoJe62NdcN9xrTQvY0POyqA3GYIxvj1GF53LQrVw0HXfhddE9cIm68B1K3c/j8f2OQcdtTKrj3y8hksEzM4uBtK8pHxRK1hUTBT4XuXy2f/034hkeBsxC4jqjAGNXGGZBUjKU4e5juLwYhnsOfNUtOWrFSUoWxlQ6HQ4zLuv8zO0izigb0orZvNWQ1Qq3KKgyur/5AqvPQHNQJJ1MQ4GvmHIuiWIxzx+t2BfAcLbfPqPaLKRif3cNzH4BLZxWYy/RuXR3cjvXWucGo/sbkhA8hgvk+dnF2TnZDm8kjNVCM1stHXa3dImj4M+PraO0pUIM0PKXzQv0rJLalFQE9t7NZuS9D5mBv8yw4pTZyrG+rlumJyRiGkNygQOXZ3uakIW9BSZkvZ5RDX8q3jT42H1lIqE503TGg+/MJ1iFi68l5TX6Yev9RWG3m+oj6zdKfYT9GqiPcND7ezkdbFv6yIf7kT7yfqPRRzheQ/TR2KwNNtLTxD2eYbFMsBkvukJdt2qjLIMq1Nq5O9CKbyy/Xo9J0/wDE1VCpA== +api: eJy1Vt9v2zYQ/leEexbsJOiTnuZt2Rq0W7I26x4MIzhLZ5kNRbIk5cwz9L8PR0oK1SSF08JPlnkf77tfvLsDeKwdFEu4XjuyO1wLKfweVjloQxa90OqqggK+tGT3d6hQ7r0oHeRg0GJDnixfP4DChqCAjbYNeshBqOEW5GDpSyssVVBsUDrKwZVbahCKA5BqG+aXVGPJWKxJeWQL/N6wSuetUDXkUNEGW+mhGDA5eOElY36LtF2XJ5aUrXuFIaj215vgypSXVfYnqpUSulVKyxwpq5YVudf4/z2015Ek5VX0cHrePyNJyvsgVKUffoRXKE812W8S/xNZJukV0lNfGCdN8ciTsnvR0AdUNZ2Y/VY0ZANPyo7G3InqxNQLY7KrasJLaiesVg2pU1faZcKUWrBDK/Dk7J96lo4PLTmjlSPH2i7OzvinIldaYbg7QgEf27Ik5zatzD70YMih1Mqz+WyDMVKUoZnOPzu+c/iWhXr9mUo/cWsJXnuUd6Vug/cbFLK1dGfRM9cgDB0Ad3X6KdGTCp01ory+J+V64finwr7n9iF4H9rxYuj3o19J2J41c0fWcVRyWLflPXmXKn1GXSIdDrO/OKvZCIau67oc3lxcPA39J5SiCoHNLq3V9jVxN5ZHnBcxsxV5FJK/hKfGPQVIXU6kRxTW2NpW3TjN0FrcJ5PrvY4GQpdD42rW/PXcG6B/kHPIrWBQ9jI0BCO7ZWn3yP1sxtivSN3jJg9hCG+M7stu/BrD9xzZAHl7e3vzRGHM7TSpMf/jrpFnD8JvMx3EKLPa6tYIVfM5j4XwOY6DGTtDfqt5a6nJh03Fb6GAuU5XnPnufJ6uMywadpnWSihg671xxXxeSt1Ws7hyzFDM0Qj42uRFkGa/MDQUtaOytbxJsb7FzdU72r8lrMhCsVylgI9cj7HCprAxuWjEO+JY9z1w0fqttuK/WDZ9J9zGWxxMoTY6XB9eXbTtZyzvSfHUGN5oAWez89nZS870F7LFzVX/rLAMz2qwY1jCpuEaAwU5UBPeFHjC5qdHAVtptPMNqkTfD6d94sUYPk//+rmRKMITC7Ye+pJYwqQkODTn3BjHsljlsOVOWizhcFijo7+t7Do+jpOHk1sJh2uZzJ572qeL8A5ly3aExvAiOO6qx2DHDfMY8LgWHgMed7mjTE72r2Pw6cZ0DH7ccY4BTxeTY248LhKP6FUej9f8bJbcs7fDkz301xZlSSa99WTEsJax//x+eQtd9z8ojo6j sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Query analytics, with optional grouping, windowing, filtering. @@ -43,29 +43,1123 @@ Query analytics, with optional grouping, windowing, filtering. as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + + + + + + + + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + anyOf + + + + + + + + + + +
    + + + + data + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    + + + +
    + + count + object + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + + + buckets + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + + +
    + + + + total + + + object + + + + required + + + +
    + +
    + + count + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + duration + + object + + +
    +
    + + anyOf + + + +
    + number +
    +
    +
    +
    +
    +
    + +
    + + cost + + object + + +
    +
    + + anyOf + + + +
    + number +
    +
    +
    +
    +
    +
    + +
    + + tokens + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + + error + + + object + + + + required + + + +
    + +
    + + count + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + duration + + object + + +
    +
    + + anyOf + + + +
    + number +
    +
    +
    +
    +
    +
    + +
    + + cost + + object + + +
    +
    + + anyOf + + + +
    + number +
    +
    +
    +
    +
    +
    + +
    + + tokens + + object + + +
    +
    + + anyOf + + + +
    + integer +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-annotations.api.mdx b/docs/docs/reference/api/query-annotations.api.mdx index 9d4d5b6c21..7df55fa1c1 100644 --- a/docs/docs/reference/api/query-annotations.api.mdx +++ b/docs/docs/reference/api/query-annotations.api.mdx @@ -5,67 +5,1639 @@ description: "Query Annotations" sidebar_label: "Query Annotations" hide_title: true hide_table_of_contents: true -api: eJztXG1v2zYQ/ivGfdoAOXbcvLT6tPRlaNasyZK0A2YYAS3RNhtJVEkqiRfovw9H6tWW5Xcg7ZQPiSXx7siH5N3pHjrPoMhYgt2HsyDgiijGAwkDC3hIhb46d8GG7xEV0ztSaGKBoN8jKtVb7k7BfgaHB4oGCj+SMPSYoxt2vkke4D3pTKhP8FMoULdiVOq2mU5zNb0cgd2fbcUFG7OZFmoaUrBBKsGCMVhAg8jHgTiRVNwHCyaRTwKwgESK45AUUx5K3DA/9OitIA69NHpjK1MXRJ4H8SC24J4F7moWiTvhDl4/EA8sCD0yXWDvE+qstOZMSBBQbzWDXHkhWPBIh2CBdO9xkCFbYPNdornSrJn9ok3iugyng3hXMxNV3auCWhYoOqaibMkflu8MOfcoMZhX2wKHCSfyiPjlM79gUv0hedA+D8JI/QpWqoYPv1FHVQwqx2BWGuJ1pG8RmdgCnyrychH6PfK8ZfgwRf3VhIgQZFqLSll0PUT/RCRjdBwjKmjgzKJW3vLa5dQ1eKBCzrmNhcjP9eZrIh5bIL1ovKmaG5SNLWBLfMWIC58osCGKWJULyDWeuxDP4Zo/vk7Rq97QxlM/EMFI4owb+NaGT9AHNg9Og99y/BSVStJm4W0KXLNztwWw2bubIlhI2xvwtgCv2cO7ALHZx5uiiK+hEVFcNNBtDF2zh7eHsNnB2+QyDpG0QW495GrkCgWx67z+UIm+x4L7FYti5SmRIQnu6pGoxTIkQQuHb4HCfm6hSo+ztQTKCxbcV1dwkorRzzW+5cWtCz3xdSrzIvlfujxVncVkje4qltL/FNscuVYCswWPLHD5I/anxs8F9JFKtaJ3cYmibcX8Ku9QKAwblbEF3HN3rfzSqIwtCOjTqqqXesXPqEv7Jp9VK60sLc8tcJTGcQuXivq+ZeSGdGjgmnsuzS4GtRho9RgWAkUFsiKb9vg8VYB1Y6JopaL5EvqcnmuUrVvQf2drcb24MuMRrg0pBnEcG4aMCeqCrURE9Q0Z8kCahd3rdvEPYipYaN664SZyHCrlKPJa10ljsDbl1hweGaEZwPPev9MtcGJHJPIU2N2S/9JaFjgsR1CiqHtHdrt93hm1rTO9TqPQ3YeRL0ZtYsSlHt2DkfdGbWIkhWs4XeKa1/EKKVhvp4nvT/HaqZUUrcxKCthOraRwZVZeYkS0Ckz0Ioe5Af9c2ICpeIGAXuiZ16Odi0aMaJl2XmRmI7K5ZCxk8CNRzZeR2oZrNuI/Ndlch9BitnlOag26eRNQU77ZJQmoDZR1UBZcMaki6ht6vqHnXwZ8TWFxm8JiQ8839HxDz/94CDb0fEPPvxwQm328KYoNPd/Q8y8BwmYHb5PLNPT8+shtQM83ZPxPTRivRL7nNFrf1PJKlal0iVRyzXMWqxrJYrW6vyLbJzN6LtZc31GvN8/mfSUecw3p/UEILjan8lyqCPNq6DiPO6Wn6xQ1B4tRuuBOBqQvx1U8QV5ulZKMaQ754qYajNYtPl024Z6mONB00q7oJDN4DbqLh/HewFc3tR9vb6/mFJq5LU+q5nlb5eXjUzXh+EXJkEtUGhI1ARs6IQZZ+tgpUKodUzm1QFKBQULPUSQ8sGGiVCjtTsfxeOQekDENFDkgrKMJlAFKOJFgaqpFzq7OP9HpR0o0k98fFBvc4Coy66LcLJsSErJPFHsREF8v7EhNuGD/mslG4h77Y6QQAlyf1/kXPj88EfTXZqEVv8CZ0mM5C2ZYrIysyginlFdKaKGc/JgrPGel5iym5ivKBMf8Gr0YvBqR18ejk6P28enhafvo+KTXHr4aOe2e8+bk1ejkhIzICVQVY/djoJho7dpCoaC3J9X7xKeqKLRrGzNlkz2q3ydSi169d22n9HK6N+X7RKr6BWcfKzd9Bdit7kLOG1ceJuwXcr9CaM2SuCzSD2ZO2KUn6aDX7R21u6ft3pvbw2P7+NDuvT7onh7+A/mBuLo25lzbasPJTqx1s0NnpRNl+QGxbnrAqxvrg2MjrsNVmnjpYNg6uzoHqwB49+DwoAuzEbrUGBMu4uillsY6/RismaibxVs8++DrbAsUJf5v+QPsGUZ4PNeR66tKCEodyqKuok+qE3pE/8sBY/45yRX6kOQKUD6AlQQRTHsmmFvYfXh+HhJJvwgvjvF2Eh77Awv0thoiYH3M6SZpcvAM93Sqj3vp5LOtMy9s7kUmGZhJRDFJNBJnjkNDVdt2UEh/ri5vbsGCYfI/IXzuoowgOCr8bQOusTA7W6bvPYNHgnGEuaMNRif+/AfFZnTo +api: eJzVWG1PHDcQ/iun+dRKexzhLe1+KkmoQkMEBZIvJ4R83rk7B6+98QvJ5bT/vRp7X2E5aASVyodA7JlnxjPjZ8a7BscWFtIpHN0yaeEqAV2gYU5odZxBCl89mtU1U0q7sGghAYNfPVr3RmcrSNfAtXKoHP3JikIKHgQnX6xWtGb5EnMWdtXqdA7pdA1uVSCkoGdfkDtIwAknaeGwsfM32T2PhqBMGhXlpYTyqlUJgqNGsixLctAWWlm0ZHVne5t+ZWi5EQVhQwoXnnO0du7l6LwShuTpJykMRcmJaIFrH5UqH4VyuEDTOdfbIFEmoGVGbg4Fwzoj1AISmGuTMwcpZMzh2IkcNwbgNEKWCUiRi2Hs2qNNOCdBu0ygm+x0DcJhbgcObZA5zK7Z857mbYQdHQZXfJG9hJFPEbYykqHEFzDyLsJWRupwzVbXInuiHe9F9qRgvVmNjrNuvJ7VSh2txkodsGe1UoersWILpir8u6i1zkXBVCXtDOP4iPglyVTyN0JlkRbmzEvykHvrdE7id9RR+ZwYshFY+pwpSIB5p+FqiL0+EDqdQXvDsW+HFWKDkW84gwRsdkP4hRiGv4iwlArmIrVmmaAdJs96t/ShzHQyMcgN+ay/MtNaIlNhadgWcGG4l8z88qeX8i+r1fjUu8K7X9vTVnzfwWXGsNXGuriDFnL9QPd4R8EoE8jRsSYwTQD+dyGqiPcpWs8Qxk3KH+uAht46R4OK40BPwFsmPXPa3N96PqKo2EH6xROzdw/hgnTLBG7RWBFb+8/AfK7Uyw0l2d7Z8zpuIfRoncXhfvNEjLt+VaicWXxW2IHD0fwnDGbEV23KB5nqvK2WMKCoG7uJrvo185Id4JFj1aY7sIPnOxHqZhMlnYQT/4S1itp7960O4KAnHS8iGwwJEUbTiaaPJjcOtoPmbDM2x5F7b2fn/pT9mUmRBfHRkTHa/PyInaFjQm4YR6Xmvd1/w+pXD4fuRPMmurldbKqtj2gtW2Cbh4dFQzBGl7T7WAroXNF0JdcloCa8MboPH+NdDN8mpnp/eXl2DzDmtp/U+ODq11SObqnpuVhoS6AFc0tIYVIYvBX4bdJ5UkzCi5JmHDREwCFH3khIYelcYdPJhEvtsy22QOXYFhOTODH1vTgMu6O3JBpY2SL3RrhVwDs8O/6Aq/fIMjSh0DsCF1RisWj6Yu1QUogPSC4qloeq926pjfgRKyEBQQ4soxbFh4r3vH0TH31neSErFm6uJ8E3DNWWRMNx7VIcTdtxsx4iq9mwM93ca8e9BhxQd+fst/35wd54//Wr1+O9/YOd8Wx3zsc7/PeD3fnBAZuzA6jbaetD0xrbJeacETPvgqWy38T+C1N1Z3tZW50uFf4j1FyH3NUMGOvuDeM3qLIe5PbWq63thwq1Uhgdnh1XLMh4CF1dY0EMkjtXobkE9ETIAwWCQ5b/0W6Ql3Tt6E3S4g3d0p5jTbU7/O4mhWQikFwwv64u8BSqCwz9rwJJ/CxEXLSkC59OYb2eMYufjCxLWo776fQqgVtmBJtR8KZEtMv6Uq7hBlfh20joCONAhyQufbyEd7oDMXfUOOQcC7dR9qrDSWenF5eQwKz6XJXrjHQMo1PRvykAffVqPniEtTVIphaeCD2FiEk//wAhqYii sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Annotations - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+
+
+
    +
    + anyOf + + + +
    + + annotation + object + +
    +
    + anyOf + + + +
    + + trace_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`custom`, `human`, `auto`] +
    +
    +
    +
    +
    +
    +
    + +
    + + source + object + +
    +
    + anyOf + + +
    + string +
    **Possible values:** [`web`, `sdk`, `api`]
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + references + object + +
    +
    + anyOf + + + +
    + + + evaluator + object + + required + + +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testcase + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + attributes + object + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + oldest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + limit + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + + annotations + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + + + +
    + + + data + object + + required + + +
    + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + + references + object + + required + + +
    + +
    + + + evaluator + object + + required + + +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + testcase + object + +
    +
    + anyOf + + + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + links + object + + required + + +
    + +
    + + + property name* + AnnotationLink + + +
    + + +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-evaluations-preview-simple-evaluations-query-post.api.mdx b/docs/docs/reference/api/query-evaluations-preview-simple-evaluations-query-post.api.mdx deleted file mode 100644 index 0fc53cf099..0000000000 --- a/docs/docs/reference/api/query-evaluations-preview-simple-evaluations-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-evaluations-preview-simple-evaluations-query-post -title: "Query Evaluations" -description: "Query Evaluations" -sidebar_label: "Query Evaluations" -hide_title: true -hide_table_of_contents: true -api: eJztWVlvGzcQ/ivGPLXAypIVH8k+1YkdRI1bu7aTAhUEg9odWUy5R3jYVoX978WQe2qlja8AQV0/2F7uzEfOx+FwZnYJml0r8MdwfMOEYZonsYKJB0mK0j6NQvDhq0G5uMJK5CqVeMPx9krxKBXYeOWE00Rp8EDiV4NKv03CBfhLCJJYY6zpX5amggdWp/9FJTGNqWCOEaP/Ukkr0BwVPVXwVjNenM7AH69KzYS1ZbMAV1eBSBSGTSG9SBF8mCaJQBZD5pVDsRECsokHmmtBAyO19c4hZB7BCX6DTwE7IX0HxQL9RLBDh5BlXiGVTL9gQNtQSFW7fG7i95avNmjmQYSaNZfCwpCTHhNnDU5bi1Va8vi6DstjjdcomzNF0+ZI3cb1c0HAZWAEkz+9N0L8qpK4N4pTo3+GVXsJg2uM7qfEpGSLTm6bqtDit0v3N2KSNFq++SMx+ntywpX+FqebbFzVfhhDl84LIWbRevdv299eAelmHoSoAsnTdqS4P9RRDYJOZriyKbljrUJ6MEtkxDT4YAwPaxR8279Goeo8tRc2yFZn9w+KsOsP7i2Pw+SWFtQRB2O8RaW7CKpZEzKNPc0tvx0b4CAzDxIRPjf4qYMkH8G7+0Lnu9C15DuLKXjE14OuPWYrKCdWm+yWIcrutWFsIrprmQowDt0YeWz+MOnkwMKTQ8Ya5Q0Tj17xqADIPJBMrz9z7XDSwjkn3S63/bP0xTWu+lB3P3eJBGSkSVkFl3SPa2nQDqg0iZVz7+FgQH8asQAuTBCgUjMjts5zYfAem48EiXFKK7RXNryzErS9M2aEBn+QebU0xqUjRST5P4152WnMqdGPyGNaWg9IZJzufzyT6aL1HqnMYzj6sXOZQCLTGF6x572e3znYrUNLlknD7zHJJwebTxKiwO8wyZGDzScp6Jourvj6WPuIrKMg6+1iaxTW+XrWWQq2ylkKwp51loKucpbng3Z4NyjVE9z/c65O9rPVm6B5pyrNtOkMWlX6lpbJ21eDBkNqc5g4dkPK5RlkLOPCSMoyUMpE0lDA4gCFwBAm6y6zC7eItVeZ66oojenz1SOb4vYmwwOjdBKBB3MTsRg8YEYnlLYWZC4odrkkZsPk94ihNt3burCWkiIqrVC/CNMvna2V8bWk9EUQcFjZW5GQp82JfBEUHBfWVgRITJHp9dHpPhXfea7/kKLriNls7yl1W4v0dTFP1Yuk8YPwVVnIZbYq3B0O23XfZyZ46BzqmMLw44u+EDXjoqNwE0nQePuQ9HeymauTJCjpjNT1Og+tUnSl2DVWxG8WtWRsXdLbdZxXFfbY2uWmzuXqV2xJr2N3sxlHjr6uDf5weXnWAnR729xUd0U0nShCPU/oY0X+5SFleg4+9PMvFX33paJfq8H79k6lOxslZRp2q4wU4MNc61T5/X4gEhNus2uMNdtmvM9Sbk+WwsBIrhdW5fBs9BEXH5DZBtB4Uhe4IGdy7tEUK3eGpfwj0ipczQCHRs8Tyf9xe079HlqP0yImyE3Pq68qx3eM7Gp/JSnbCLV2AXVLagV/+VgU7Xk3JS+bq1qvrGgqP2puSDls26VjeDVjr/dm+7u9vYOdg97u3v6wN301C3rD4M3+q9n+PpuxfWj1K4u+JAwHw93e4KA3fHO5s+fv7fjD19uDg52/oGovdsm4LuH9FlH2/wZlC6/Rn6vabYOiXTbIbBtulthdLG4u6yNbh2cjqOWtMNje2R606GoIUzhigQ1HhQvY1+CtOGPphnQnRTYWgUYW/VK9oJWR/9P9VOGtOy4r1WXujBrvdD8VjNtoY6df5idpDPlJogNjzxI0O1p5jkrRYU5H0B/DcjllCj9JkWU07N7744kHN0xyNiXmxuQG8+LwLOFvXNj+mY3RPRugSFwYd1hW4jXFUqdxGASY6k7ZSS1KnJ1eXIIH0/zDZJSEpCMZmUe/fSBnS8tmnR1bgmDxtaEQ64PDpJ9/AST1AHA= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Evaluations - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-evaluator-revisions.api.mdx b/docs/docs/reference/api/query-evaluator-revisions.api.mdx deleted file mode 100644 index 2c263e1794..0000000000 --- a/docs/docs/reference/api/query-evaluator-revisions.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-evaluator-revisions -title: "Query Evaluator Revisions" -description: "Query Evaluator Revisions" -sidebar_label: "Query Evaluator Revisions" -hide_title: true -hide_table_of_contents: true -api: eJztWttu2zgQ/RVjnnYBOXbcXFo/rZu0qLdtkk3SFljDCGiJstnqVpJy6g3074shKVkXW5FdGwja5CGJafIMeTiaGR7qASSZCuiP4M2ceDGRIRcwtiCMKCeShcHQgT58jylf3NG0xx2ncyZYGAiwgNPvMRXydegsoP8AdhhIGkj8l0SRx2yF0vkqwgDbhD2jPsH/Io42JKMCP1WxFUKwuHShPyr3dj016fUdmLizYyFDv9hJLiIKfZiEoUdJAImVNQWx50EytkAy6WHDULTONEJiIVw2wZ9BzDg2oLPYJ8HPAL5TAElipZ3CyVdqS1h2yky+VZxV8RILfCpJcRbEcRjuG/GuCrxW5ikkZ8E0D8sCSaeUFy35k2JLfnmrbYHNuB17hP/xNva8v0UYtIdBFMs/obxWxGCS+s0GEc7JopbW4lCocFs39iMyiSMq/vmUGL0IPzAhH+N03RrLozdj6FZ7IQTEpw3XX50Bjk0scKiwOYtkJVo0hzrPQSQWkFjO1jziBswCN+Q+kdCHOGZOLfhAo2W4pQ03Tvu4hea+OzB2kBwiawnOmcGubckUqTVUIaAB3ngleRPNl3OuTKkIJQSZbu0wH83wRoHy2iSgfzDprQ6Y+WzlruOimJHmlFezWvMVfDbDEwuEF0+3hbnBsZh7nF35+NCpZfWaupTTwN5s37O9aF0jvwXG54QzEshn5vfM/GfN84odSCu05y3Yu/NrorM9YIHtxQ69I9yesTldvY5GpaMGag1SoMSCexY44T1SUFNYB/SeCrnTvHKhIRMLQs/ZNfilhsSCg/5oCv3ovl8gVmKBx3y2GnRlzVZC+aBG47q5Qx8pOmgQ+3hKI8KmgaPbsPwxH8a1HCh45T6S8jnxtp7xMAVILODr6otqbVrBuValRM2T8yXzxRX5d+Mkfq2PqJDgUDyvMo7PjuQxVQ0iCgOh/bvX7eKfQmUJN7FtUyHc2Gtdm85gbXvStcNYDyrxvlzEmeqB++uS2JPQ764Mv/qguzrgVtPl7oJeNUUMdfwI+TfXC+/3YPKLgS5ZXK5yH6srrWoPq9EWdk9XkSXCJXOJvUsDAwOZWtjTqWlvR5hdHSesZyXqt1SiLmO5hRRVGbWBFqXH/uJiVB2tDdSobTh62nKUzSmR1Lkjuy2KzzRsa6DIiiNnH0Y+aVhjxKEe3YORcw1rjKR0TRY7zHUpWa8XJtulfO3USspWZiUlbKdWUroyK7/ywVzVD6QuN+9u9TFn26J84kwjrD6WNUJQB7IZJQ4ta8yPR/pnpaak1FQmOt4oo7wz24AUqCNg0x15Qjn5SRY6G+zBjSEeK0oSRSxoWgCVKd6k2koNqY3HJL619+vRiQUR4cSncoun+jf3lfWDr5aU4kZRPmc2bcIuqkUb+aCBTpRS5LJprF+o2Iets4KBjQSyc6IOCT8lslXk7ToxW+SVrdFmhkQmvyVKyzvq9apq3WfiMUcx0XrDeci3l+ocKgnzamQ2L7QL327y/I3Xk/YhtEl6BPDFdNXF6gopQndZ31WR0brFb1eRvtRFR2pd2rTpVxCXUno1u+uXca7pq9vhd7e3VxVAvbfFTVU6bmu1N/lUzkJ8TSkKBYJHRM6gD50IlVJ638kEE9HJtNOOeqUJdARQ8XX0oGswmEkZiX6nY3th7ByQKQ0kOSCsQyKmHjpB7ZgzuVBDBlfD93Shc75y51wHlYW0oxS7ZXtEIvae4iz08dNIX+w/vfso2ON89CjkBB32evm+1ZsfxI88uv79qUydyqlQOrYUdaSszchARhk3asxSQsgOykvvKm5T1pxKgvDCJS+P3ZOj9vHp4Wn76Pik1568cO12z3518sI9OSEuOYHcCxKjZiPGqToIvW7vqN09bfde3R4e948P+72XB93Tw38he1NhtL7POKcF5rJ++X5/lCuMl2vUFe7yM1arzWaPXrLuRnu/tkp3t/swVr2k1O5VuF9M7xHrti+9Dqzro2/1mnqZua/rZlduhfu05fVYN73e6ibq2swN1UObCtQqJLQGV0PInaChe3B40K08EYXOmIeIrfJQ+sSrr8EqxZ4s6uDVn6+SEEhK/L+WX+DMMOAZ3dbg1cXJkj5lYpCkP2Qn8ggLcsdQHUJHYEIo5FxIv/O5RNWBdGzBDKNvfwQPDxMi6CfuJQk26+/7o7G56Zggh6NxdmBVTviNLnQZg2m6rXIUdvdiHSVLKRvTqR4xsG0aydq+41yCuLq8uQULJuZdVT90cAwnuED83Qd0O8WQCpuq7QE8EkxjHSM0Jv78D6HRs+o= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Evaluator Revisions - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-evaluator-variants.api.mdx b/docs/docs/reference/api/query-evaluator-variants.api.mdx deleted file mode 100644 index fa126ea748..0000000000 --- a/docs/docs/reference/api/query-evaluator-variants.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-evaluator-variants -title: "Query Evaluator Variants" -description: "Query Evaluator Variants" -sidebar_label: "Query Evaluator Variants" -hide_title: true -hide_table_of_contents: true -api: eJzNWdty2zYQ/RXNPrUzjOV6+qSnqnYyduPGbu2kDxqNByJXEhKQYHCxo2j4750FQIrUzbQuiZ88lnb3HBwssIvVHAybaOgN4O0jE5YZqTQMI5A5Kma4zK4S6MFXi2r2gKXFwyNTnGVGQwQ5UyxFg4qCzCFjKUIPFqY8gQh4VgaBCBR+tVxhAr0xExoj0PEUUwa9ObBsdjN2ccwspzjaKJ5NIIKxVCkz0ANreQJFVFlkVggohhEYbgR9UK2jc5VAQZZrOOl9SDGlGPlwg6kmi2fItmWrN9DVwk4OIGI7GncEtpnHMYVrKdSdo7GeYkjMn5l1nzyFzdm34PgKs3DB/jmJf2hWlrS2ZGed1yvI0jrjppTuz3GF+0AQdcwEdax4Thf6kaEvakh1BmPB9tuWFtjvHEYd1Rwf9H4ZM0XDjoz5N0HUMXkWC5vgA1PxlD/iXrffSEqBLNtK4MrjdfolXiPB8Zv5wdfvB4JscnhCfWAWCTP4xnA6WlupOOQ6GSmSn0TmxiPXyQie8r248MzgBNVW3GsH0tBAJah2gsXMptSgMh1jlngZ6D4L/xBq64Nz41gU9JFCnctMo7viz05P6U/9muzBnY1j1HpsReffYAwRxDIzmBnHMc8Fj12b3P2syWdeW0GuqIk23CPE0nqnJRUX3M6dBa1tzKww0DstotX65oJVpamJ0ei6j9JOR/Ak1ZexkE8HhPgvhAwITBk+ZrE5IEI/hAwIvhY1YjeF5PohttrIdPcLUnfOfYQionDV1uwTsdqLEHRqU5btE/DSBSiK6gjJ0WeMDazZ/lBbV+IVkS94DRYsSTidCiZuG7q2qHVrb5d01Pykvrz1WBBzFVvB1C/vrBB/aZm9ubEmt+ZXWF4sBQkHqo2Xbw+3tiFNX1iR9/nSHoVn+WsV9YO85to8K+vGGrns/jKNfMsVhdKyT4scNa/8A7S8EcQKmcHkgZmDlvJzH7bTd2LZPDkGyEcfNoAkKPAIIBc+bAAp5RrNDnjhl2L9OQtXfqnXQVFKtSqUUrCDopRyVSju5b1jrvoHdASHo+fnHM8XkPAgrp308qG98fGs693QYPgSGF11bEVBfr+fna02eJ+Y4Ilr3zpvlZJq9+4uQcO42NKaCRk3vn3JpT3cLNm19ARJ1VRP1o2BFoVFazbBhf6bTZ0YnXv6dp3mi6594NbloYNdLTMW8np1Ny/jwsu3bYMv7+9vVwL6vW1u6j/0tuiszaUUzVTSPDuX7jmWMzOFHnRzhY8cn7pVk6a7ZbfdLZ8qGtVjOeS2SkAPpsbkutftxkLa5IRNMDPshPEuy7k7IBpjq7iZOZf+7dV7nF0io/cH5XLN4I6SyqdJ02wxksr5eyQW4THVt2YqFf/O6gOdqfciRXg2ls697H8duU7/9goioGV4qU5Pfjs5hWUBG8Z0HljszkOJ7b6GaEmFav0QAabuMIBBlv6x+IKYkfKhaQ3xtuzXUm0OYhj8Zrq5YNxlvWMxD1s5gLCVUHs5UaTaDxZ+Q4cRTCkJegOYz0dM40clioI+9t/TniVcs5GovU6/4Gz1tw36j2i5o9vCRb/YJ0xaX+70cqjG/HxX191hd1rp8uC3jXeYwbYxbY5O23iUo842tqa9aZgrtjFdMw5spYof3LUzDfO1NsbV/KuNcTmfahU4DJUWtsNw1kd07w2ock7LO3cenPpxjHkdYaXQU5SqVtze3N1DUfwPi8PuoA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Evaluator Variants - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-evaluators.api.mdx b/docs/docs/reference/api/query-evaluators.api.mdx index 1f5d39761c..88812c32e9 100644 --- a/docs/docs/reference/api/query-evaluators.api.mdx +++ b/docs/docs/reference/api/query-evaluators.api.mdx @@ -5,67 +5,1036 @@ description: "Query Evaluators" sidebar_label: "Query Evaluators" hide_title: true hide_table_of_contents: true -api: eJztWVlv2zgQ/ivGPO0Ccuy4OVo9rXuh3h7JJmkXWMMIaGlss0sd5ZHEa+i/L4aUdViO6rgp0D3ykNjUzMfhx+HwG2UFms0V+GN4dcOEYTqRCiYeJClKpnkSj0Lw4YtBubzG0sIDiV8MKv08CZfgryBIYo2xpo8sTQUPrHPvs0piGlPBAiNGn1JJ0Jqjom8FpHWMl2cz8MebRjNhQ7zfgKvrwCidRHUjvUwRfJgmiUAWQ+YVQ7ERArKJB5prQQMj1XnhEDKP4O6J62GIBaM56MJELP4WwDcWIMu8tVEy/YyBhtKomPK15ayJl3kQoWb1KFgYctouJs5rvDbiVFryeF6F5bHGOcr6TNG0PlJd3va5IOAyMILJn14bIX5VSdwdxanRP8PmWgmDa4x2c2JSsmUrrXVXaHDb5vuemCSPRn7+SIx+SN5xpb/G6X1r3PR+GENXLgshZhHuuP5mBOSbeRCiCiRPaan7Qr2sQOx0jH6jwrf9GBUl4lribGNz8wTdrFM3KNU3RP8pd888UMLM94W5JF+qSGEbggezREZMgw/G8LC9NIWtbF7gDCXGAVZy5+sHs9iDzgXxSwHHgTAhXjMZLPgNbg9/p1LqgDrDNVDmwS2Pw+SWVt5y0cR4i0rvSFvINHY1t8nbkt0OMvMgEeFjg585SDqAeLcr9Fe3+wNhZR4IHvHtoFtr2AbKO+tN65Yhbr9ni9gwNhFpFKYCjEM3RuUg/zJp5cDC2/TRKG+Y2Dvi0Rog80Ayvb2gNWt1A+eCfNsOzO9FLm6pPDuXrQun0CAjF5JrXNKZ0dKgHVBpEiuX14N+n/7UKixcmiBApWZGdC5yY/D2FXpBYpzTBt9l8C+sBe3rjBmhwe9Xi6zTedvL6v/68L+oD8+M3kMgNrweoBCd779cIrbRuoNG3IejH1kkehBIZBrDa/a4V/MLB9sZWrJMGn6PST462HySEAV+h0leOth8kjVd0+X14wnMNVnPl51RWOXrUWdZs1XMsibsUWdZ01XM8o/S8rU7q1ZCt9io6nU+3k26qEJrZFa4HA0GTWnyiQkeWuHReSVlIvfXJSFqxkWLuBBJUHv6kPI8uZ+jd4kLkGiM1LyijIo9K68Qpdi80jzdb2rJ6FzR021klyJwbNflps7tqo1mQa9j9/5lvHT0te3sm6ur8wag29v6plrR2qklT4R6kdALyDRRhJkyvQAfeqnEG463vVIe9uwrSvBAoaQ22+6QkQJ8WGidKr/XC0RiwgM2x1izA8Z7LOU28xUGRnK9tC7D89FbXL5BZnuS8aRqcEk55LKiblZsCEv5W6Qo3FUGQ6MXieR/ua2mFoTicV5EAGXnRfki9dUdi1KBjRejhcCtCFmS8ZtStBjLlWQu9XNBV6qQ4q4tM6i+FUVON95yjCtvMUpvV8LK71SO4MmMPT2enRx1j08PT7tHxyeD7vTJLOgOgmcnT2YnJ2zGTuwGNPt6t5BaS75uvWHQHxx1+6fdwbOrw2P/+NAfPD3onx7+AWUH3WbjGuHdgita3H7RpdZa0LKj7K87wn5mO81ZYrMiPwJDm3Od4fkIvAp9/YPDg36D+5oxVTUW2Kq2Tin7GLyN5C7SmrrlyJY00MiiX8oHFBmdo7zJyPG2nLoNDZXntsY73UsF47Zm2dlX+YEcQ34godaxee7/BlRZFnR+/TGsVlOm8KMUWUbD7rk/nnhwwyRnU6JrTGVzsT6BK/gTl7Y9tPW9a4sbmQvjTtxGrac67DyGQYCpbrWdVErM+dnlFXgwzf+hESUh+UhGi6LfPlCGWVbsWbRjKxAsnhsqzz44TPr5G1xdoH4= +api: eJy1V0tv20YQ/ivCnFqAtlyjJ54q2wripq1V22kPgmCMuCNp4yWX2YcTReB/L2aXoki9ohqOD7a8OzPf7DdPrcDh3EI6huELKguTBHRJBp3Uxa2AFD57MssnekHl0WljIQFDnz1Zd6XFEtIVZLpwVDj+iGWpZBaU+5+sLvjMZgvKMdwWy7sZpOMVuGVJkIKefqLM1RalIcF+5ORQoEN2xUmnWHC4hv+bvbmP+FAljaXCKwXVPo1eUOk1OlVVMZ4tdWHJsluXFxf8R5DNjCzZd0jhwWcZWTvzqndfC0Ny+lNLwyw6GREy7aNS7a0sHM3JwMbd6yBRJdAQzeLSUW53zRWY014+rTOymB/l5S/WrZLua19n6qZlokogM4SOxBO6YwYTmGmTswwIdHTmZPDnMMp1NNsbBHp8KX4EyMdotgYRpOgHgNxEszXImq7p8kmKE3G8l+Iksq6WvVvR5utNUdZsNShrwt4UZU1Xg2KVn782Vx9Yt0rg7dyLPs1U6J7Hetta4V9tnmdKf3kXVHZNV8mm9XUMohCSiwzVqNMGTuBh3Wg6aPm0ezLVWhEW4Wg/FmTSZF6h+emdV+p3q4uzO+9K737m93Xey0bqtnWKFhqDy6M8b+ky6buIh5T/XBPKSbpD7PcidRM1dwK148KesdPyM75xnwxXzgy9cpCO95ptz8U4RPaNONtMqDjdfr283B1o/6CSIoyr3tCYAP7KaSbIoVRH5pPSWef2/yTq5DBvf+joIFOb23lrnjblu4m7tTinTRAOiwYyeo98+70I8LsidC3XCsaG3sju4WfcRPqOZdH7x8fRjsEY225Q424zbC9nObmF5sWt1JZtlugWkEK/NPQi6Ut/s8n1w2oHCVgyL2RsiJA3ClJYOFfatN/PlPbiHOdUODxH2cdSwrYPg3Dbu2bRUHyWMm+kWwZ7g9HtB1q+JxRkQpa3BB44wWLKdMWaaGEpPxC7GFceGHi30EZ+i3mQgGQHFlGL2eHUvd9sp8OvmJcqhL9p1NI+Zd46nUPqjKeED1pLV3O28DkW8f9uZ2YcWcx0cLMOWM3BFWbPVAhIgPmM9Fyc/3J+cYi0WqE3GN3W9YiZ26x4tRgkW2FpAgIJUB6KERxh/tvmgr3kDAiPaOztyZetRbAm3tFX1y8VylBtAX1Vp9IY6lSC1rbKlmI6TRJYcOalY1itpmjpo1FVxcfxPh1PEnhBI3HK1I254Bfr9FjBMy3DOhw601koSxZXPqbDVpfiDhI1BllGpTsqO2kVx+ju4RESmNZfYXItWMcgP4p/pwD8RYi1Q9aEsxUoLOaeG0sK0Sb//Ae6wotj sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Evaluators - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+
+
+
    +
    + anyOf + + + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + metadata + object + + required + + +
    + +
    + + + property name* + FullJson-Input + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + evaluator + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-invocations.api.mdx b/docs/docs/reference/api/query-invocations.api.mdx deleted file mode 100644 index d146ff7bf0..0000000000 --- a/docs/docs/reference/api/query-invocations.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-invocations -title: "Query Invocations" -description: "Query Invocations" -sidebar_label: "Query Invocations" -hide_title: true -hide_table_of_contents: true -api: eJztXFlv2zgQ/ivGPO0Ccuy4OVo9bXosmm3aZJO0C6xhBLRE22yooySV1Bvovy+G1GnL8g2krfKQWBJnhvxIzozmo/MEiowl2H049x8ChygW+BIGFgQhFfrq3AUbvkVUTO9YoYkFgn6LqFSvA3cK9hM4ga+or/AjCUPOTMPOVxn4eE86E+oR/BQK1K0YlXiV69SS/vRyBHZ/tlUg2JjNtFDTkIINUgnmj8EC6kceDsSJpAo8sGASecQHC0ikAhySYoqjxA3zQk5vBXHopdEbW5k6P+Ic4kFswT3z3dUsEncSOHj9QDhYEHIyXWDvA+qstOZMiO9TvprBQPEQLHikQ7BAuvc4yJAtsPkm0Vxp1sx+0SZxXYbTQfhVaQoW9aqglvmKjqkoW/KG5TvDIOCUGMyrbYHDhBNxIn77FFwwqf6Sgd8+98NI/Q5WqiYYfqWOqhhUjsGsNMTrSN8iMrEFHlXk+SL0Z8T5MnyYot5qQkQIMq1FpSy6HqIfEckYHceICuo7s6iVt7x2OXUNHqiQc25jIfJzvfmSiMcWSB6NN1Vzg7KxBWyJrxgFwiMKbIgiVuUCco3nLsRzuOaPr1P0qje08dQPRDCSOOMGvrXhE/SBzYPT4LccP0WlkrRZeJsC1+zcbQFs9u6mCBbS9ga8LcBr9vAuQGz28aYo4mtoRFQgGug2hq7Zw9tD2OzgbXIZh0jaILcecjVyhYLYdV5/qESfM/9+xaJYeUpkSPy7eiRqsQyJ38LhW6Cwn1uo0uNsLYHygvn31RWcpGL0c41veXHrQk98ncq8SP63Lk9Vrp+8pH1XsZR+UWxz5FoJzBY8Mt8NHrE/NX7Op49UqhW9i0sUbSvmVXmHQmHYqIwtCLi7a+WXRmVsgU+/r6p6qVf8hLq0b/JYtdLK0vLcAkdpHLdwqajvW0ZuSIf6rrnn0uxiUIuBVq+3gqICWZFNe3yeKsC6MVG0UtF8CX1OzzXK1i3of7K1uF5cmfEI14YUgziODUPGBHXBViKi+oYMA1+ahd3rdvEPYipYaN664SZyHCrlKOKt66QxWJtya04QGaEZwPPev9EtcGJHJOIK7G7JfxmGrtphOYISRd07stvt88aobZ3pdRqF7j6MfDZqEyMu5XQPRt4atYmRFK7hdIlrXscrpGC9nia+P8Vrp1ZStDIrKWA7tZLClVl5jhHRKjDR2Z7JGedFPnQjSjojoHNDKdG80FevS0QXaeeCmZDVGNmQfP5xqObLSG3DNRvxn5psrkNoMds8J7UG3bwJqCnf7JIE1AbKOigLrphUEfUNPd/Q888DvqawuE1hsaHnG3q+oed/PAQber6h558PiM0+3hTFhp5v6PnnAGGzg7fJZRp6fn3kNqDnGzL+VyWMF5PxOa3WN7W9UqUqXTKV3PNcD6oaySIh1l+R/ZMZXRdr7u+o15tn974QzlxDgr8TIhCbU3suVYTxGnqOB07p6TpFzsFilC4KQHpyXCAXM1+Sl1+lJGOaQ764qQajdYtPl0041wQHmk7aFZ1mBq9Bd/Ew3hr46qb2/e3t1ZxCM7flSdW8b6u8fDyqJgF+cTIMJCoNiZqADZ0Qgy597BQo1o6ppFogqcCgoecoEhxsmCgVSrvTcXgQuQdkTH1FDgjrIN2CW0VSJxJMTbXI2dX5Bzp9T4lm9vuDYoMbXEVmXZSbZVNCQvaBYi984uH1WaQmgWD/mclGThj7Y6QQAlyf1/kXQN99J+i/Ye4LnSldllNghtXKqKqMgEp5pYQmysmQuUJ0VnrOYmy+okywzK/Rq8GLEXl5PDo5ah+fHp62j45Peu3hi5HT7jmvTl6MTk7IiJxAVXF2PwaKideuLRQKfHtSvU98qopEu7YxU0bZo/p9IrXoVXzXdkovq3tTvk+kql949rFy01eC3eou5MBx5eHCfiEXLITWLKnLIv1g5sRderIOet3eUbt72u69uj08to8P7d7Lg+7p4b+QH5Cra2POua02nOwEWzc7hFY6YZYfGOumB766ZtijQIerJDqf6WDYOrs6B6sAePfg8KALsxG61BgTLuLopZbGOv0YrJmom8VbPPvg6WwLFCXeH/kD7BlGeDzUkeurSghKHcqirqLfVSfkxJz30OafklyhD0muAOUDWUkQwbRngrmF3YenpyGR9LPgcYy3k/DYH1igt9UQAetjTjdJk4MnuKdTffxLJ59tnXlhcx6ZZGAmEcUk0UicOQ4NVW3bQSH9ubq8uQULhsn/iPACF2UEwVHhbxtwjYXZWTN97wk48ccR5o42GJ348z/dWHo6 -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Invocations - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-metrics-preview-evaluations-metrics-query-post.api.mdx b/docs/docs/reference/api/query-metrics-preview-evaluations-metrics-query-post.api.mdx deleted file mode 100644 index f0d8b16d60..0000000000 --- a/docs/docs/reference/api/query-metrics-preview-evaluations-metrics-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-metrics-preview-evaluations-metrics-query-post -title: "Query Metrics" -description: "Query Metrics" -sidebar_label: "Query Metrics" -hide_title: true -hide_table_of_contents: true -api: eJztGWlv2zb0rxjv0wbIsePmaPVp6YV6bZMscTtghhHQ0rPNjjpKkUk9Q/99eKRO21HkzOmGof3Q1tS7+W6uQLF5Au4Y3twyoZniUZjAxIEoRml+DX1w4atGubwJUEnuJTexxFuOdzdYohTfLGQcJQockPhVY6JeRv4S3BV4UagwVPRfFseCewa39yWJQjpLvAUGjP4XS2KvOCb0KyNt0MLlxQzc8TrITBgtqgDM9zmRZ+KyBlpCqGWM4MI0igSyEFKnOEqU5OEc0knq5EfR9At6qgoUaiEgnTiguBJ08NYIkTokMHukMDnnkg0PFc5R1jkH0/pJVYftvMDj0tOCyZ/eaiF+TaKwOwxjrX6GbSpyhUE7JCYlWzabpYYKO5n0I1mSMB5/vd/BoufRB56oh2x6n47r2LtZaJT5XKKY0o0WcABDHVCoxxj69uSrRo0+RaoOQ3uUaM/DJAEHZowLLZEQpYwkHXks9FAI9KEiQpk5rq0Qm/IWAq5fUuZo/6as7T35OlchdYwTyVsmtlp8q4etERvmBCrEHjBOSba9zMOCNGHxABPFgrjZT2aRDJgCF3ymsEtIzS5YUK2yaHvRW5m1129U8iMn8zBkkkc33G+potbcb770jGRn6K9x2FnDjNcODlfyNupJHe5RsysdZkpZuk+vj+Vo4+c7sDOsNrLptmTw0bYYv1Hzsj193fHQj+5IooY2JMQ7TNReg+vckkwdiIS/b+IXlmTqQIjf2pJ+0K/OiVbqgOAB3060TX78YLBJb+mjbFfYGEVnVi58LH5MGm1gyO87o0umcCuhzU5jM0oIt8lvfy98cYur7uzvV7ZJh5RQqWPnEn1wldRoDpI4CrO6Pej36R8yreQxEaIkZYvwTIvOVQZM1fdxvb4XaYu0ZvdSiVcGgu53xrRQ4PZtx52PCEUe+TEh/OMJ4UKrR4wIG1g7zAgW938+JDSZtcWU8Bgb5WOCJ5Ep9G/YfgvJK0u2c2bE0rH/FEw+WbIZEx8FPgGT15ZsxiQ313S5x74rN9bLZdZ+5fbaK5fcWgWX3GB75ZKbq+CyP9KW3i3KhNua0SJqN4h8ztD/8xNypaAV3OnS2I9CsbdC8ZrZQrHXTu87zNRPP9WWg2Uzyc3hcUu7WfaQ45zw1ljImtCNka5W2Q1EJTjGu3W4RUeamvb2aDDYbGA/M8F9g9R5Q2H8+O7VR8W4aOhCReTVvu4StJP77fQhsgKa1jKZb7vH0qRJwuaVHcv9oMYYnRF9feiaSS/LOoOrpuDCvNa696vx2pqv6YLfjUaXGwTt3dYv1Yw2ndKBAlSLiJ4ysqeJmKkFuNDL3jJ6lbeMXjZN9MxbBiV8lFSGzD1pKcCFhVJx4vZ6noi0f8DmGCp2wHiPxdyEWYKellwtDcrZ5fA9Lt8hM3PseFIFuCZPsr5RByuuhcX8PZIUIQvo95lWi0jyv+yFUzIjeSwWmYF89Kp8d3nzjQWxwLV3lHwaKkeRsn+ulMpKHSzXt2V1nFRTab+2xhz3J7XUCIP+4KjbP+0OXowOj93jQ3fw/KB/evgH1FeG4/sBJ2uJEJ7N2PPj2clR9/j08LR7dHwy6E6fzbzuwHtx8mx2csJm7ATWN3bjdmiTMie25VMs0dqz2Al8fQmVL5uaTJvvjJpg7OqnrZbZUqdf7GVqS5eaO9gdSD81FXcWGZ/OwvjMREzn7HIIlRYP+geHB31YD+UaMGVm5pnMnAeE+QzOWmgWQUndWWDSMihkwS/lB5KM0kHAwgq99cxRE6YIS4XfVC8WjJuka1ivsqQyhiypEOfKq2q5pnDsgyq5wILSkTuG1WrKEvwkRZrSsf3ujicO3DLJ2ZTMNiYfWOR5ZAV/4tIsREyt6ppETeBC27yxVreopliMM8/DWDXCTioZ8/LiegQOTLNX3CDyCUcy0o/+doE8LbZKuit7tgLBwrmmUuOCpUl//gbwBUqP -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Metrics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-queries.api.mdx b/docs/docs/reference/api/query-queries.api.mdx deleted file mode 100644 index dad87d2f4e..0000000000 --- a/docs/docs/reference/api/query-queries.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-queries -title: "Query Queries" -description: "Query Queries" -sidebar_label: "Query Queries" -hide_title: true -hide_table_of_contents: true -api: eJzNWE1zIjcQ/StUn5IqrSGunOYUss7WknVsJ7C5UJRLzDSgjebD+vAuoea/p1rSMDMY47GBJCeKUbfe01Or1a0NGL7UEE3hd4tKoIYZg7xAxY3Is1ECETxYVOv7hzDMoOCKp2hQkdsGMp7i1kokwEBk1X9goPDBCoUJRAsuNTLQ8QpTDtEGeLa+Xbg5zLqgObRRIlsCg0WuUm4gAmtFAiXbWmRWSihnDIwwkj4Q63VvlEBJVjtc9DFkuFKcfITBVJPFCyS7sNR7aGpplycQ7WX4MQHtxz+nUB2EGTsKTWru57yi3BBEEzNBHStRUNyfGfqqgdRksJD8uK3ogP3BYTRRzflBJ7uYKRp+ZszfCKKJKbJY2gTvuYpX4hGPylTzPJfIs4MERh6vN6zwWgGO38y/nCpvCLLN4SvqE7NIuMF3RtDROkjFITfJ5DL5j8jceuQmGSlScRQXkRlcojqIe+1AWhqoBNWbYDGzKV3iXMeYJV4GymfhD6F2Pji3jkVJnxTqIs80urR+ORjQTzNNRjC2cYxaL6zs/RGMgUGcZwYz4zgWhRSxqyb6XzT5bBorKBTVGkZ4hDi33mlHxZrbe2dBa1twKw1Eg5JBVZpEm/oOak/sE2tLMZ4kgkhxedcy7XLUKxFn5VbXfP4FY9Ml8zKf/N5G5un27Y20dN7+0lzDfiyIhYqt5Oq7D1bKX3Wevbu1prDme9i3xqBzFy9fHhwUpu0Lr1LVp3kWytj/q6g3+bXQ5kVZn82Xu+6v02gSAs+nmWPKJdY+/icofxjECrnB5J6bk6b1937a3tCJZYvkHCCf/bQBJEGJZwC58tMGkEquueu2TlQbVGL97HupWq+TolRqbVEqwU6KUsm1RXEd1htj1TdNDE5Hz/eqO6d3pyNqHO+qu2qO+z58ewdOZy9NKFBvb+eyJOsfLy+fXuZ/cikSd1X3flEqV2+/yRM0XMgDN7LM49boa5Ly7Hl1rnNP0F2zermvba8vDq35Emupnzd1YvQmNLpP6bpCm7p1eehg19j5Wl6v7vPLuPLyHdrWj5PJ3ZMJ/d62N9W32HXYpGhWOb3rFLmrtwtuVhBBv1D4KPBrP1RT/ar+1Kgeq7ceqyREsDKm0FG/H8vcJhd8iZnhF1z0eSFcpGuMrRJm7VyGd6NPuP6InIpKCtWGwZiix8dD26x+WyjEJyQWoUIeWrPKlfibN7v0lfeipYtskTv3oNLQkesN70bAgJbhNRlc/HAxgF2lWsYU+Dx2gV9hu2FgOyps1w8MMHVRDwZ5+lM9QMxI7ZRnjfl2N2bnZg0KGPxm+oXkwsW0g96EPZtC2DOoa2AW+oYZgxXtbzSFzWbONX5Wsizpsx+nrUmE5nPZ6Cz+wnX7Je+RS0sk3DF8wVy/yj68er3OoStEeD3qYtp+9OniUT3SdLE13U3Di0gX0z0PGZ1U8U8O3UzDy0AX423n3sW46qw7TRza4dp2Rn+UIGOXS1h19imcvdMwjrFoIjy5tmiWbRK8ux1PoCz/AWwoyVw= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Queries - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-query-revisions.api.mdx b/docs/docs/reference/api/query-query-revisions.api.mdx deleted file mode 100644 index f97fc8e282..0000000000 --- a/docs/docs/reference/api/query-query-revisions.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-query-revisions -title: "Query Query Revisions" -description: "Query Query Revisions" -sidebar_label: "Query Query Revisions" -hide_title: true -hide_table_of_contents: true -api: eJztWltv2zYU/isGn1ZAjh03l9ZPc5sUzdomWZJmwAwjoKVjmy11KUkl8Qz99+GQulqyLHv2sBXpg2sz5HcOPx6em7Qgik4l6Q/J7yEIBpKMLOIHIKhivnfhkD75EYKYP5hPAY9MMt+TxCICfoQg1TvfmZP+gti+p8BT+JUGAWe2Ruh8k76HY9KegUvxWyAQX6Gs/oIUcfVqb341If3h8swJ15rmJ1DHYSiF8uvC1GyGmgdA+mTs+xyoRyIrHZJKMG9KolFkJUP++BvYKj/JCzkn0cgiiimOAx+0EpFFXFB0S2USyZkY5imYgihKdsfFkfweqmURmwk75FT88iHk/Dfpe+0LLwjVK1K1RabAbbaICkHn9bQUlpKNKP2CTOKK7Y/3X2D00v/MpFrH6ao9Lq/ejKG72OY86kLD/Zc1wLWRRRyQtmCBKl225lBnOYjIIjRUM1/UgVlk4guXKtInYcicWvCBQUtxlw48Ntr1Eprb7iCWg+RQVUtwTgxObSumSa2hCgFj4I13khfRfDtnWpT2UFLS6dYG8yVeHpVMNZuDMWN+E/tu/aMCMrJSJz9ZxUHR0z+CKAeD5prfx8sji0geTreFucW1kUWYsyvbvnBq2byBCQjw7M3OW9PeukFuU6YfqWDUUy+M75Hxe8PxEvNJIvNC/V6N3ZCccs88m4cOPFBhz9gjVO+hIgcsK22AWoMEKLLIE/Mc/wm3X5OcevAEUu00dlwayMgiPnd2DX5lIDGpgOem0GvP/BKxIotw5rJq0Mq8bAnls16N+xYOrEkswAtdrF6otMFzzBimOPGPUS0HGl6bjwLxSPnWGl8kAJFFxKocopx/lnBudLpQc2v+SG2xIs5uFKhvTPVGIlyGpRwTeG+UCEEPyMD3pLHtXreL/xUyR3Ib2jZIOQl56yaeTKxti0DbD82iJc6zDbzXM/BsJzTkivS7JZerkVY42WJY3J2TK4aCC+0vdi+liG/2sus9GGwqFJtQe5fKD2LIRMKeqoW9pe67SqOtlwbGNg2Mq1Bt0cEordqghWHW/uQ9jDpaGzQxtuHov93FsAVQBc4D3W2e9d7AtgaarDBw9iHkq4GNhTjAYQ9CzgxsLCSha7zLSJSQ9S4JRwlfO5WSsJVKSQjbqZSErlTKz1zn6fC7FE2KCdhLEfVSRP0viiiLTBhXINaYqnlEZhLZtCYh1HOyiFqmV//Vx7LG81Ehz4x4viD5k/OnzKb8KpEQ6bLKRPZijbPySRkD7lS1ltNcR0+ILPId5tt6kk8wN9UOD5uG840TmmSnVS2i6mQH69dNkpJ7rX5kFQ50/U1h+ACUyQc8x3wA892ACiZ9L3d6q1HgB56+/pyiPXClv4H+ip9j9eTl8S9DFwSzG4FLRYWST0zN9KCTfMUSnTL9BNelyp4BfuPsO+QF3Wq0RnKYZ+z5gRVUxVSx0foZRQVmtETmGbObIcAzk0rGWsQ/cjjnOIKdxiqwsj9LJuV6DXjc2kTSK7jq5tlUwoMETzLFHquvRZM25HsqoXWbwuRUmVAusUEDz1il6wPcWso5YrS+aIySiBr/eQfP6irmAvGLFFBeHQKaaDTgfCNNjJFlmqw+1HhOBVbW+xrGjrNwoWPHq71wWmYmEeIVGS27poq1Mr+nYW2fLkX+J/29M6qL0a3Xlzryq/rvG2ysIECmHcNItx+Per1yg/Gecubo9mHrXAh9IbfsLjqgKOM13UHu2yvi6vpQVmMAn32joO62yGldQM51icyU1VM1Ga07/Os6c8Z9GdHxvGLgi+k17K7expmhr+50P97dXZcAzdkWD9XYT9mKXFAzH182CnyJwAFVM9InnQCbu/DU+WFeTuqkvV49glpKEFhZ6dMKBSd9MlMqkP1Ox+Z+6BzQKXiKHlDWoQHTTkGCHQqm5nrJ4PriE8w/AtVJ8nCUn3CL9mQspDgtPRwaMEyDkp5G3I5kf5ljx5wY9TGrkAy01JvstanzZ+oGHKpfg0q6hVmrLusvpV2UzDyKPKfDSbuVvJ7QN8eTk6P28enhafvo+KTXHr+e2O2e/fbk9eTkhE7oCcm9dDFstmKUdF5Jr9s7andP2723d4fH/ePDfu/NQff08E+Svv0wXD1nlOuzZret8N7AMPeoNNufqYWz31jXNtMcT7rqafn+5Cw9G96HoPKDUJMQF8rvpMyuO7KkWq6bY4reppYVl7PdtCItlJtZ9dhNqr9upKvKia8vXJIh6OvcGlxfkFxLhXQPDg+6pVtQmKzzXlsHj+S26j8Ta8lvpB4DU0xXRw6igLq/Zn9AzdBTudTL4a1ybkvNyth3KHhWnYBTpuODVmER+70hif0eMabDwLxvmUEa7zeyyAz9ZX9IFosxlfBV8CgiicGhP4sfR42RvCHGqlni6ham+MM0BYNqW0eUtJ4rB1gMfmbFwLYhULVzRzmXfn11e4e1TPyeqOs7uEZQ3B1+9gkp5NZ6bEE49aahcQgGE//9DZL6bwk= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Query Revisions - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-queues-preview-evaluations-queues-query-post.api.mdx b/docs/docs/reference/api/query-queues-preview-evaluations-queues-query-post.api.mdx deleted file mode 100644 index 5b9847c957..0000000000 --- a/docs/docs/reference/api/query-queues-preview-evaluations-queues-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-queues-preview-evaluations-queues-query-post -title: "Query Queues" -description: "Query Queues" -sidebar_label: "Query Queues" -hide_title: true -hide_table_of_contents: true -api: eJztWetvGkcQ/1fQfGqlw2DiR3Kf6sSJ4iaNHdtJpSKElrvB3mTvkX3Yoej+92p27wn4DBRHUVV/wLA3752Z/e3cHDS7UeAP4fUdE4ZpnsQKRh4kKUr76ywEH74ZlLPxN4MG1TiVeMfxfowVR/HI0aWJ0uCBxG8GlX6ZhDPw5xAkscZY01eWpoIHlrX3RSUxrangFiNG31JJyjVHRb+sZMsUz86n4A8XCabCevAwAVdjRabEmjNBC3qWIvgwSRKBLAYPNNeCVs5U56qi9CDEKTNCgz9lQmGWeQVrMvmCga5xVtH7SPa+sTZlXqkrNkJANso8iFCzprUsDDlxMnHRsLuiyIUoLXl8UxfLY403KJuaoklzpfCTllbrgoDLwAgmf3ljhPhdJXH3LE6N/hUWPSYZXGO0HhOTks1WhKGKW5MVliLcxvsHRZI4lvb/Z4roh+Q9V/qxmD7k4yL3ZhG6dlkIMYtwTf+XLSDejGpBBZKn5Oq2ok5rIjIPjEI55mGbNA+miYyYBh+M4WGr9E8KZecsrEle2PM8bx/XsX765jptkKWJd+jNpYlzZ5zcp/fFabSu/Ah1VtX6HfUjnSyrO+o9j8PknuxpOQRivEel19ydkGnsam4Tv6UynMjMg0SEuxZ+7kRS8eL3dUU/mlUfSFbmgeARXy10Zf9bkPLecpPfMkTZbhvGJiJ4wVSAcejWqJXkP0atMbDiKR9jjfLOHd5bWXxWCKB6Ynp1M1zu88s1QrxtWftnmYsrUnXDbL90+AkyYiQwxSWG4Gtp0C6oNImVy+5Bv0//Gj0arkwQoFJTIzqXOTF428KwIDGOaSHqlQuvLEUNNPUzz6E3h8KKFvI/ent69HZu9BbwbYlrA/zmeP/jAK4trGsguG1i9HNDuEAi0xiO2W4Pv1dObOfEBsuk4VMo+eTE5kpCFPgESk6d2FxJEa7JbIdIsQjWy1mBfvN47VRLEa1SSxGwnWopwlVq2Z1oJ+8OpfoX6f85Z888UJpp09qUKvCTltDHnochWFQfuyXljmlyhnFhJB3SKGUiaSlgcYBCYAijVcfVlTNilcnl6Vdqp01ji8dX87B95OK09TVguxsVoUQmefJDrj9XubJSucZ0/BVn62neSJPGtPOOJG+ASU6ZPStXQJLq3tkejOW75QrtFcwcFoJXJp61acnrivKjw321NBxugn9VCVgzi34PBoNlfPuZCR5ans5rqpftwW2ImnHRglJFEjSeboJDRg9H6X3iDKRARupm1R5WWEkpdlML+cOkNhida3r62BaTX051TlfvdWV4XXQfduPUha9tf99eX18sCXR729xUe/PplOkTob5NaAKdz5RTpm/Bh14+g+7VZtA9d9fo2Rk09VWU1O3tLhkpwIdbrVPl93qBSEy4x24w1myP8R5LuS1QhYGRXM8sy8nF2TucvUVmr7jDUZ3givLIZUaTrNwUlvJ3SFY43AYnRt8mkv/ttptutGSP46IgUIZeVvPy199ZlApszL/Lm9LCjcjdbsqrSYWnS9RYpUgz1uVyOYmDZ1P2/HB6dNA9PN4/7h4cHg26k2fToDsIXhw9mx4dsSk7gvqAbbgey6jqU+vqKOde66vYiHxxclRMiGDQHxx0+8fdwYvr/UP/cN8fPN/rH+//BdWgp43GzWvW9TKfxPTLYUpjUlINPvrF4KKf2YHINLHZlpfXic3lzsnFGdQwDvT39vf6S9veIKaOyQLbMYtUtY9pkxtFU5YLwZPItkvQyKLfqgdkGdVpxOKavIWKXriE5PWi8bvupYJxNxmWthm7Yh9CXuykuPaSqhwueO71FCXALXUJfwjz+YQp/CRFltGye+4PRx7cMcnZhII2pAy4Lep7Dl9xZqcY9gTp2vZJ5MK4el44TajTO46TIMBUt9KOao3s4vzqGjyY5G/FoiQkHsnIPfr0gfIsdT76c7c2B8HiG0MHgA9OJv39A8wEYu0= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Queues - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-results-preview-evaluations-results-query-post.api.mdx b/docs/docs/reference/api/query-results-preview-evaluations-results-query-post.api.mdx deleted file mode 100644 index 8c9a18cdcd..0000000000 --- a/docs/docs/reference/api/query-results-preview-evaluations-results-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-results-preview-evaluations-results-query-post -title: "Query Results" -description: "Query Results" -sidebar_label: "Query Results" -hide_title: true -hide_table_of_contents: true -api: eJztWllvIkcQ/iuonxJpMJj1sTtP8V5asocdm91IQQg1MwV00nNsH7YJmv8eVffc4PFA8GYTxQ+26en66uiq6qoa1kTRhSTumLy5pVxTxaJQkolDohiE+TT0iUu+ahCrqQCpuZLTWMAtg7spFCT5M7szjqQiDhHwVYNULyN/Rdw18aJQQajwXxrHnHmGtve7jEJck94SAor/xQLZKwYSP1loQxWuLufEHdd3zLlRoryB+j5DdMqvKluLHWoVA3HJLIo40JAkTr4klWDhgiSTxMmWotnv4KnyplBzTpKJQxRTHBfeGiEShwSg6J7CZJwLNixUsABR5RzMqitlHbbzIh4TnuZU/PBWc/6zjMLuMIy1+pFsU5EpCNoRUSHoqtksFVKyk0k/oiWRYv/j/QYW/RR9YFI9ZtOHdKxT72ahUepzUlGlGy3gEAh1gJEeQ+jbla8aNPgYqDoM7ZLUngdSEofMKeNaABIKEQlc8mjoAefgk5IIReK4sUJsypsLWD+k1NH+SVnbe/JNpkLiGCcSt5RvtfhWD6uBDTOAEtgjxilg28s8zKGRigUgFQ3iZj+ZRyKgirjEpwq6SNTsgjlqmUXbg97KrL1+o4JfgvdNDFRNmX+/97lcG4jO0L+vAj7B2RSs0hCGePoHrFqmsS3uCXHnPazKWO1OYbcgsFysyB6EVLBoyvyWLqU185vxU8jO0K9x2NmjUl476Fbwtu6kwwNqdq3DVCmL+/T6WI42X30DdobVxu21Lflem4ruFywVt98Wdyz0ozsUqKHqC+EOpDpoLvtkIROHRNw/NPilhUwcEsJ9W+hH3eoTYiUO4Sxg20HbpL0Phhr1Fj6IdnUExeBMb2cf8g+TRhsY+ENfoIIq2Aq0WdhtBgnSNrntr7kvbnHVXd392nZEJEkS2x4xAT5xldBgFmQchWmVNOj38Q9aVrAYcTBF2ZJnrnnnOt2Mtc5+jZUXaUtUM3uhwyuzA493Tk0P1rdSYquHhHkW+b8f+9v92KVWezRkG1Q7dGSW9j/ekjWZtUVPto+NsqbME0AV+FN62HvklYXtXBixdOw/BZPPFjZl4gOHJ2Dy2sKmTDJzzVYHrLoyY71cpcVXZq+DcsmslXPJDHZQLpm5ci6Hg7Z4tyAks3fGPh3Il5Q8cciSyuUBNX9H5TLVWQnqwSPQjcGJ9BkWSOVR+RjcLpKOUsiUgxlHfL958l92+bwx1vzux12leinnfuiS9xvMcg47TakVkeVpR13orRON6qihOUAfHCcUHX1bgKxr31LoF+X7uFCnKmnOcasD2b5go8cum89W2iXbjXfqOWTeJCSm4zgZDDZ7ii+UM98QdWyA7d1Q+KAo4w2NAY+8ytNdct7kYTt9iKyAptqXiyaf+ghS0kVpyPjwVmOMzgifPnb8qJdlne4r34q5efP09YAar635mg743Wh0tQFoz7Z6qKbb7BQOFIBaRvgqL301F1O1JC7ppe/yeqV3eb20weuZd3no0SCwMjDnpAUnLlkqFUu31/N4pP0juoBQ0SPKejRmJv4leFowtTIkF1fD97B6B9RMFsaT8oYb9CTrG9Vt+bHQmL03cRXSAD9faLWMBPvTHjhmVZTHUqEZ0Eevi/eOb+5pEHOovkfM+tOiOSw6mtLtUro6itcXxYUyKaf0fmWMP+5PKimaDPqDk27/vDt4MTo+dU+P3cHzo/758W+kOjIfP7xxUk3I/dpw2nAskmrhzaVR8DhbndTyKXk2p89P52cn3dPz4/PuyenZoDt7Nve6A+/F2bP52Rmd0zNSn8aO25FNirTblk8+IG3PYqft9QljNklsOqZsINi0x8712mqZTuz6+dCtMlGruJYdcPUTU0XMIxMeaUa4MMHXubgaklIBT/pHx0d9Us8Klc2Y5KlnAiKLLfOYOLUoz+Mbi6PAZHiigAY/FQ9QMswsAQ1LePUkVBEmj3AF96oXc8pM/jas12l+GpM0PyHn0hcUiiGUY7+bgC6wxMzmjsl6PaMSPgueJLhsn7vjiUNuqWB0hmYbow8ss5S0JjZoXtlrr2tyPm7n2qag2hWI15OluPA8iFXj3kkp+V5d3oyIQ2bpFyKCyEcaQVE//O0S9LTYKokpC9fWhNNwofHWconFxJ+/ABAHaJk= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Results - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-runs-preview-evaluations-runs-query-post.api.mdx b/docs/docs/reference/api/query-runs-preview-evaluations-runs-query-post.api.mdx deleted file mode 100644 index c631a39f63..0000000000 --- a/docs/docs/reference/api/query-runs-preview-evaluations-runs-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-runs-preview-evaluations-runs-query-post -title: "Query Runs" -description: "Query Runs" -sidebar_label: "Query Runs" -hide_title: true -hide_table_of_contents: true -api: eJztWltv2zYU/isGnzZAjh03l9ZPS5MW9Zo0mZN2wAwjoKVjmx1FqbwkdQP99+GQkizZsqI4LlZszUMSU+dCnhu/c+QHoulMkf6IvLmj3FDNIqHI2CNRDNJ+GgSkT74YkItbaYS6jSXcMbi/hSW9e+Bo4khp4hEJXwwo/ToKFqT/QPxIaBAa/6VxzJlvGTufVSRwTflzCCn+F0tUrBko/CSNfUzF4nJK+qPVx1Nu976ZgKlbn0cKgjKRXsRA+mQSRRyoIImXLwnDOUnGHtFMc1wYqNapk5B4KI6zO3iOsHPkd6Kor58p7MRJSBIvo4omn8FH+2dUS68OjXhr7bUuNPFICJqWt0KDgCEf5Vclm65tVmnJxKwolgkNM5BlTeGkvFI8Y7Uu4jPpG07lL28N57+rSLQHIjb6V7J6XpTBNITNmKiUdFFr2zIrWbNvHe8FWhI51mLzR7Loh+icKf2YTTedcZX7aRa6cVFIBA2rw3/9/Os7QN7EIwEoX7IYj7qtqLOCiMQjSlNtav3iERAmxJoZgwjcyhcDBgIsfEYIt6SM74NSxCNTyriRgIxSRhKXfCp84BwCMq5K1mu3icpUdRtcDZ00/P/NvTbPr+vsCAneFFOQIPyNB9qUNuVSfwdSPSMIPqXsaF9uZtuKuUZeLO/VN07ulGkkQ6pJnxjDgvoyH9TW92FmvaoUbO6Q4dIJdvdNg2v1HM01DgLV/OL6A6FFdTbcMxFE97ibGhwg4B6UbuiSgGpoa2brS00BciITj0Q82LXwSycSayR8bSr60VD6gLISj3AWsmqhldfMipRzy43nlgHIZnWSKj+vPlix0w/jWhtY8RiNQoO8o3zrHQ8yAVhtqK6+c9av0/UkQd66mP0zj8WKUH1SrA8dfCZJkjgszSSCWC0N2AUVRyK9AnrdLv4pXYTk2tXzqeGtYUqMhXw7FO5HxjGt2Hx5gFNLgb6dUsM16XcTe7s4EJ4Vj5/g/f8N3i+N3gK9r3E9Ab473v84fq8zawMAv42NfmwE70ugGoJbuttL+dSJbZ1YY5k4+B5KPjqxqZIAOHwHJWdObKokM9dkcbs72JoZ6/WiNQiK9tqplsxauZbMYDvVkpkr17JbdO/tsnf5oZvXAkDItaPT6Or1VQYCSkO8qSEpU/4Ni6ouJdvie1gs69xmwzA70kDgeRc5iEQ8QoWItPtQLIQowmJhNmOiTqhvlI5C4pG5CakVaHRESnjXiljviH+2v1u1vxubW/Tu7sKpQu8Sr4+siMokGRpxRjW91hCvjtAaNM/uDE2UpxR5iJbC67GdPXGog2lq4zcGumriJ/Rrw5S/UC72EeXSOGZiFZRtcJ0fcROKCpcyEdT6FJ8XkM0mOodeHrM/Cktl1Zn6wp3s1O3ZlnGIt61uMdXzOrIrfN4scqyoBht3ofKIyNQj6eEaSH1S8F1kwdG4n0JNz+nT17ZXCGDsfAvRO2ouVeXtemJ7/4Neb727/0Q5CyxH6w3eydu39gFoynhNl84jv/T0Kb3OeLOFzrOLFfNazeri9QKUojOou7hzS6IxWu5OfiQa8VxOdUpXvAxz8zrrbj7GmTNfnXff3dxcrQl0vi071c59WmnohKDnEb54TV+nuqQmnfTla6fw8rWDc5aOffmKyQUSoYD1kJGc9Mlc61j1Ox2fRybYozMQmu5R1qExsxmkwDeS6YVlObkavIfFO6B2tDcaFwmuMYZcVJTJcofQmL23hcNVT3Ji9DyS7FuGoRAhkbnjQgNgdA6XL4rffKVhzKHw4jefERVmQTgDK0xz8o/ZRCadkaUzkWUjnxf1ZdyUHZAvZyC6gJCX71yWuHlcRmqjBzSWHZ2PyIspfXk4PTpoHx7vH7cPDo967cmLqd/u+a+OXkyPjuiUHpG18XU2pia9bu+g3T1u917d7B/2D/f7vZd73eP9v8hy2lxH44bGzTaRj4O7+US3NK5dTl+72fS0m1gYNY2s69M4P7GB1Tq5GpBCQ0O6e/t73TVTl4ixdFHflq4sbuxj4q1EcB67CKtDW7eIBhr+tnyAO8OUQYi9lFdKrZV5Qxq6Gr7qTsypQ+BW70OadSOSZh2qLXxJIp1weu7LERgOc0zW/og8PEyogo+SJwkuu+f90dgjd1QyOkGDjdD78yzR0sudnLoy3r5xmA21ucRaKelYbh3Hie9DrGtpx4V6cnV5fUM8Mkm/lxFGAfJIiofD332CMRa7E2Ii4toD4VTMDFbhPnEy8ecfkXCm1w== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-scenarios-preview-evaluations-scenarios-query-post.api.mdx b/docs/docs/reference/api/query-scenarios-preview-evaluations-scenarios-query-post.api.mdx deleted file mode 100644 index 25cb45417d..0000000000 --- a/docs/docs/reference/api/query-scenarios-preview-evaluations-scenarios-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-scenarios-preview-evaluations-scenarios-query-post -title: "Query Scenarios" -description: "Query Scenarios" -sidebar_label: "Query Scenarios" -hide_title: true -hide_table_of_contents: true -api: eJztGdtuGkf0V9B5aqXFYHxL9qlO4ig0qe3aJJWKkDXsHmDS2UtmZ+xQtP9enZm9Al4vLkmrqn7AMHvuc+67AsXmCbhjuLhnQjPFozCBiQNRjNL8GvrgwheNcnmXeBgyyaPkLpZ4z/HhDkukylMLHUeJAgckftGYqFeRvwR3BV4UKgwVfWVxLLhnsHufkyiks8RbYMDoWyxJBMUxseeWuMELl1czcMfrMDNhVKkCMN/nRJ+J6xpoCaGWMYIL0ygSyEJIneIoUZKHc0gnqZMfRdPP6KkqUKiFgHTigOJK0MFbI0TqQICKPVOYnHPJhocK5yjrnINp/aSqw3Ze4HHpacHkD2+1ED8nUdgdhrFWP8I2FbnCoB0Sk5Itm81SQ4WdTPoLWZIwnn+938Gil9EHnqinbPqYjuvYu1lolPlcopjSjRZwAEMdULzHGPr25ItGjT6Fqg5De5Roz8MkAQdmjAstkRCljCQdeSz0UAj0oSJCmT5urRCb8hYCrl9S5mj/pKztPfk2VyF1jBPJeya2Wnyrh60RG+YEKsSeME5Jtr3Mw4I0YfEAE8WCuNlPZpEMmAIXfKawS0jNLlhQrbJoe9FbmbXXb1TyS41r3HG/pXZac7+R9o0OO0O/pLuzShmH9tpYjtbBvgM7w2oj3WyNlqwI/0r1fXuAP/DQjx5IpIZCHeIDJmqv7ndpSaYORMLfN/ErSzJ1IMSvbUk/6ViXRCt1QPCAbyfaJoN8MNikt/RRtkv9jLqpLKH6WPyYNNrAkN93zpNM4VZCm7V4M0wIt8lxfyt8cYur7u7wN7aRhZRwqavlEn1wldRoDpI4CrPSNuj36R/ZVvKYKFHhsHVqpkXnJgOmAvW8ftiLtEVaM3ypxWsDQRc8Y1oocPtUf/MenVCLXPJ/G/232+grrZ7RR29g7dBIW9z/eCfdZNYWrfRzbJT30p5EptC/Y/utJa8t2c65EUvH/rdg8tGSzZj4KPAbMHljyWZMcnNNl3vsvXJjvVpmLVhur71yya1VcMkNtlcuubkKLvsjbendo0y4rRotonaDyKcM/V8/RlZKWsF9333Jd5iRyiml+eI3J5EtrUvZjoxzwtuNmq/R1geEynxbtAgVQ493bJiSosNJTbt0PBhsNkSfmOC+QetckFM8vxvyUTEuGnoaEXm1p7uUtcnjtvoQWQFNo5LMt11mWXqThM0rY+3joMYYnRE9fequSS/LOoOrBnRhXmvdx9V4Y83XdMXvRqPrDYL2buuXalrlTtWJAlSLiJbI2UI4ZmoBLvSyHXKvskPuFf1pz+yQKYWgpMRm7kpLAS4slIoTt9fzRKT9AzbHULEDxnss5ibaEvS05GppUM6vh+9x+Q6ZGY7GkyrALXmT9Y86WHE1LObvkaQIWUC/z7VaRJL/aS+dcg7JY7HIFOSnN+W+++IrC2KB6/vrvMEuu9uyJatk30pqLddmZcKdVFNev7Y+GvcntRQGg/7guNs/6w5ejg5P3JNDd/DioH92+DvUVzXjxwEnZcKCoxl7cTI7Pe6enB2edY9PTgfd6dHM6w68l6dHs9NTNmOnUFmXjNthTLJ1R1vw9W1DvlVo0jZfDjTB2Bm/rZbZ9N4vBvDadF27ITvs9lNTrGbGFfLwOjde3Dm/HkKlkEP/4PCgD+shVgOmjMk8kzFzJzWPwVkLlyJQqAYHJl2CQhb8VD4gyShIAxZW6G1GdE2cIlgUflW9WDBu0qFhvsqCfQxZsBPvynum6kDq2JdM5AYLShTuGFarKUvwoxRpSsf2uTueOHDPJGdTMt2Y/GCRx/cK/sClGX5NHemaJErgQtt4XqsplO8txrnnYawaYSeVXHZ9dTsCB6bZW60g8glHMtKQPl0gb4utmu7Knq1AsHCuqQy4YGnS31+kXlIP -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Scenarios - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-simple-evaluators.api.mdx b/docs/docs/reference/api/query-simple-evaluators.api.mdx deleted file mode 100644 index 5995694a63..0000000000 --- a/docs/docs/reference/api/query-simple-evaluators.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-simple-evaluators -title: "Query Simple Evaluators" -description: "Query Simple Evaluators" -sidebar_label: "Query Simple Evaluators" -hide_title: true -hide_table_of_contents: true -api: eJztWW1v2zYQ/ivGfdoAOXbcvLT6NDdp0axdkyVpB8wwAlo62eyol5KUUy/Qfx+OlGXJklXbTYFgbT4kMc17SD73wrvjA2g2VeCO4NWciZTpWCoYOxAnKJnmcXThgwufU5SLO8XDROAdriY6IPFzikq/jP0FuA/gxZHGSNO/LEkE9wxG75OKIxpT3gxDRv8lklbQHBV9KiCNYLS4DMAdrU8KhNnp5glc3Xmp0nFYnaQXCYILkzgWyCLInGIoSoWAbOyA5lrQwIXqnFmEzCG4DfvaDbEgNgedpSGLvgXwjQHIMmc5KZ58Qk/DatKN0VSx8GvDXB01cyBEzap7Yb7PSWlMXFXYre1WacmjaRmWRxqnKKsrhZPqSPmQzWuBx6WXCiZ/eZ0K8buKo+5FlKT6V1g/MWFwjeF2QkxKtmgltyoKNYbbZP8gJkmiZqVPidH38Tuu9Nc43XTGdendGLo1Vri92f5JUafZbAvHvJMYrJGZG8R6dJijVDxudrw68bXNf8zFMweUSKf7wtyQLMUBvw3BgSCWIdPgQppyvz0g+K2cXmOAEiMPS7r6uiMUOuhcE7+04cgTqY93THozPsfm7W8VwCxQZ7gEcsDHgKVCgxswoTBz4J5HfnxPTLSE+wjvUektafSZxq7mIbbbt4XMHIiF/9jglxYycyDCL9tCf1X97wkrc0DwkDeDNsaQNZR3RprOLX1svu2KvWGUhpQwMOVh5NsxH4sP41YODLwxJ41yzsTeO75YAmQOSKaxEageK2s41yTb5kB/FbbYEIl2DGbXNluCjAQpdeKSPEnLFM2ASuJIWese9Pv0h4iVPNEmcsFN6nmoVJCKznU+GZx9ky4vTq3QGuurI5yZGSX/7JdDr825moPtz1ztx83VLlO9R7JWk9ohW7Oy//N0rY3WLfK1fTiyCZsDEQub4+sWCc97Zq7FaiDbD+q8BJE54ElkGv079rjX9JmF7QwNWWnif49FPljYfBEfBX6HRc4tbL7Ikq7J4u7xks8lWS8XHcpDV3w96ipLtopVloQ96ipLuopVnl6e75DmWdu9+nhVTir5vigfJLcIzendVggmsZsh81HuHJ9/Fn5rhV9to+Od7oE3uRqIApNMbquRJ3STPsn0ZAcd3OTEUx7IkoRH26Yt6xTvkiMtFzKKp6t3b+u30pkDCZMsRL2HV//gtrJZ+GpFKSkK5Zx7uA27VHfuZIM5dGZqzoBPU/tG8D3WOqsssEMBdc5MYv8NpXqtU9bQF1Plsni0C7oqKvfMtAGOBoN6of+RCe6bo3deSRnL/at8HzXjoqVUF7FX+XYXhxtvZupd7LFlph6qaT0SlUsxpdi01KDcPNWQ0bmlb5soX7VURuZcdul8XvlOL+i17G4+xrmlr02/b25vr2qAVrdVpZoWUMeaQ6diSSHqWUwPbUmsCDphegYu9BKJc473Pfvy1lu1XnrmRQ6st5tYOnqw+RbMtE6U2+t5Ik79AzbFSLMDxnss4cbBFHqp5HphRIZXF29xYe93Y8elCebGsTZSnVaohyX8LdIubIEIw1TPYsn/tYqnJh/tx0oRHWSr16sHw1dfGB2r9gBYNI9KTSIbPqptnmIs79LkbbS8TbKq7bOGB4NRKS9cmZlN8FafKVmDZwF7fhycHHWPTw9Pu0fHJ4Pu5FngdQfei5NnwckJC9iJYbbeIrc7rHSzl11rGPQHR93+aXfw4vbw2D0+dAfPD/qnh3/DqvncNsf2kLfbXNEd7hcN3kr3dtWM7S+bqf3MNGmD2Kg7t/ShMabO8OoCnBJ9/YPDgz6sW3tlMgUv5pngtbQV8zU4a1Zb2Cs1mkMTuUAjC39bfUE7Iz/JO3M53mbnWus85Lar8YvuJYLxqFSqWL8bQe53ZBEGECptT8e+h1NAmZG/uiN4eJgwhR+kyDIatt+7o7EDcyY5mxB9o3FR0Rj7+wcX9p6jsN41MY2mi9S61lqIp/BrJYaeh4lunTsuhZSry5tbcGCSv9CHsU8yktHp6LcLZHGGHuN0ZuwBBIumKUVlFywm/fwHRdQDEQ== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Simple Evaluators - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-simple-queries.api.mdx b/docs/docs/reference/api/query-simple-queries.api.mdx deleted file mode 100644 index 5d2a99d4fb..0000000000 --- a/docs/docs/reference/api/query-simple-queries.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-simple-queries -title: "Query Simple Queries" -description: "Query Simple Queries" -sidebar_label: "Query Simple Queries" -hide_title: true -hide_table_of_contents: true -api: eJztWm1v2zYQ/isGP62AHDtuXlp9WtqkaNY2yZK0A2YYBi2dbLYUpZBUEtfQfx+O1KstK7aXAt3QfnBl+u7h8d54d8qCaDpVxB2SPxOQDBQZOSSKQVLNInHuE5fcJSDnY8XCmMP4LqNyiIS7BJR+E/lz4i6IFwkNQuMjjWPOPAPQ+6oigWvKm0FI8SmWCK8RxF1YcMMk5pcBcYfLBAE38lUJqO8zBKf8qkZaUuh5DMQlkyjiQAVJnWJJacnElKSj1MmXoslX8HSVSCSck3TkEM00x4V3Rghk2V2YfOdyGyY0TEHWdw4n9ZXqGZr3Ih6TXsKp/O0i+siU/kNFonsu4kS/INsccpmbbKWi20xDIWj682roXcL5U/phGsLNmKiUdN7uODXW7TT6CTWZrrCUBDcmJDFu5+ajAS11svCVECwpPTvmcrzdg1TMxuwGBloR+kvGnjpE8WS6K8wN8qYOYX4bgkOCSIZUE5ckCfNbEc/9Vl1eQwAShAcVGz1tXqP2zjXqFoUVHk98GFPpzdg9NIvekJNWZbVAnZMcyCE+BDThmrgB5QpShzww4UcPqIWW5CngAZTeUIU+1dDVLIT2LGEhU4dE3H9u8EsLmTpEwOOm0E+a/gKxUodwFrJm0MY8s4Ty0XDjuaUPsl02EEmIdypVHgjfrvlQfBm16sDAG3fSIO8p31ni8xwgdYikGhqBVvPpCs418rYFz1+FLzZkoC0S2LUtKUiKTFhfMIlRpGUCZkHFkVDWswf9Pv6HSpUs1iZjkZvE80CpIOGd64yYOLtWJl6UWKYljZfivzUUldjsZ+k2Q1iTYQUNm02xQV68oCaC6ufeDeq0ApE6xJNANfhj+rwR/dbCdk5M6CSx/yM2+Wxhs0184PADNjm1sNkmubom8/Hz3VG5st7MO3hdlfp61l1ybRW75Ap71l1ydRW7/HzlgPOruditubhM9L/pLiz7/7q9aNPQ+v5ihWuLBmMXpdoOw8EEuKTU+o31q9b8VWv+J2pNhwSMa5BPuKqdb0XSVpBZ8Uao8MvIW1Wv+TXC+k9EKJCwKyKSpGq5aMo8yi/zHVJTf9qsUS8K1w68GHC/UncWkhQhbwhSh3yD+a4X6gfAtELuKU82rUW3Tpb5SZsa6uZEioX+NvnrixE/dWoGfTpSGI4vmRqjHavVVxTGVDIViYr11qPAHVrffE7RH7g2T2Ae8XOiH0QV/yIJQTJvI3ClqdTqgemZWfTzR+xlKBN4gJBqb2YmsZx9g+pGNwZto32YsP48ZjVR8areiH9GUYAZXVHmKfM2Q4BHprTKpMi+VHDOcAXnMk1gq/ksJ6o0ZWhu4yJFCK6LPI8qGCsQiml23xwWm0xv3lIFnZsCpmF2A4/U02NjwJ13OUOMzieDsbJFS/68hUd9mekC8esqoLz5CthEohPOt5LEOlkpyXqjZjQNWOWQYJglzlpAZ4nXZOGi2spviBdktJyaGnhV9UzD1nFGgbzlGCSbfdwznJyeUlOT7ThGWZle1nexb242PE4Jy0AV85TUDGcOBoPV8csXyplvhiudMylNFO44e/FBU8ZbZig88tZcpk/fXy1W/xhZAU2noaZtt/AnUIpOK+Pi9aRGGZ1b/PUpH8Zz2a0zuvptl6nXanf9MU6t+tqM+/729moF0Nq2blQ74ra+0Cl9KAQ9i/DtYBwpxI2pnhGX9GIJ9wweevZ1YS+bhvXsaz6HKJD4gsFYKpGcuGSmdazcXs/jUeLv0SkITfco69GYmSygwEsk03PDcnJ1/gHm74Gaqng4qhLcoC9Z76iTFYahMcO6x8kmcOQk0bNIsu/W5FgEozyWCxWBXnpdvuU8e6R4ptpby3yAUHbvZY+aLr18GVZerpROYsci5XcccZCXAX11GBwddA+P94+7B4dHg+7kZeB1B97ro5fB0REN6JHRzuorB1tD1Tq2vDMjg/7goNs/7g5e3+4fuof77uDVXv94/29SNlhtNLZP2ky4ogPqF01MrUMpG45+3jD0U9OIBJExWX6pGIfonFydE6eivv7e/l6fLPtqjdiUSp4uJ67Zz8RZ8rzC57AqCU3eIRpo+Hv5A0qGjh5SUcFbExpLs9nM+TQ86l7MKTPJxUiwyKJmSLKoQXcwaKScI2c+hIlghqHmDsliMaEKPkuepricOeNwhPW8ZHSCihtilpvlgbKwvQLeapiOuyYXFeX/amrGtGk5TjwPYt1KO6pkg6vLm1ssfbM/CggjH3kkxaPhp0tIrRQzawvCqZgmmE1dYjHx3z+bzxVa -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Simple Queries - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-simple-testsets.api.mdx b/docs/docs/reference/api/query-simple-testsets.api.mdx deleted file mode 100644 index 5be2e2df34..0000000000 --- a/docs/docs/reference/api/query-simple-testsets.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-simple-testsets -title: "Query Simple Testsets" -description: "Query Simple Testsets" -sidebar_label: "Query Simple Testsets" -hide_title: true -hide_table_of_contents: true -api: eJztWm1v2zYQ/ivGfdoAOXbcvLT6NLdpUa9dkzluB8wwDFo62+yol5JUUs/Qfx+OlGxZshXHc4BuSD4kNsV7eHx4PJ4eZgmazRS4Qxig0gq1gpEDUYySaR6FPR9c+JagXIwVD2KBY513c0DitwSVfh35C3CX4EWhxlDTRxbHgnsGofVVRSG1KW+OAaNPsSR8zVHRtwzQmIWL6ym4w3KXqTA+7u4wZ8o45jGFpY56ESO4MIkigSyE1Fk1hYkQkI4c0FwLanjPVGOwQkkdCyuZ928xLUSaOnm3aPIVPQ3rbhn578xEq3ipAwFqtukF831ODDNxs0FGxU+lJQ9nRVgeapyh3BwpmGy2FKe3fSzwuPQSweRP7xIhflVR2OyFcaJ/hvJMCYNrDPYzYlKyRS2tm6ZQYbbO9jdikiwqQfUjMfop+siVfojTXXMsWz+OoYGJwppwvTW5IAva3yk9bA/abG+PJU5LRGbBUN7IdygVt/liD9Irjn/JzFMHlEhmh8Lckm3qAPfrEByYRjJgGlxIEu7XIvb8Wj77OEWJoYeFdXp4E2T8N/rELrkbeiLxccykN+d3uN35fZJWzwI1ujlQ6sA9D/3onuZdk4dDvEel9yTNZxqbmgdYH8kWMnUgEv6xwa8tZOpAiN/3hX5wsT8RVuqA4AHfDro1W5RQPhprmrf0Udb7hmES0BnOlIehb9t8XH0Z1XJg4E34aJR3TBzscS8HSB2QTONWoGpWrOD0ybZuu/yxisUtWedRaatvSxhIyYzqGS5p32iZoGlQcRRmJUWn3aY/RKvksTZZCm4Tz0Olpolo9LPO4BxaCXlRYo1KnK8n8Mb0oLWdskRocNvrJGsgdqTV5wLqP1NAXSf6gAqqYvWIEsra/s9rqDpa9yiiDuHIVlEOhCzYngr3qEQ+MXOCbWadw6CuChCpA55EptEfs+OeqG8sbKNryEpi/ykG+Wxhs0F8FPgEg1xZ2GyQnK7JYny8qjAn6/Wi0fOLfB11lJyt1Sg5YUcdJadrNcqPV4A7tPKs7hjMj8Ax93e9rzzkwuPKdxqs0fNNnthx/u440vNXq+NRlL9OZMt3VOzbFe5z3nnOO0+ad46dM7bUznvXOFsK3Dz7jR5VS+R17XPBtUfB9VzpP0GlXz06n0k9mNQrIvOh11mqBQ4qKPZ6U+7jHSet1LpyuIxS8bAykioKFsP9kdVKUUmNPHPW6VQFmC9McN/IK423UkbycPXFR824qBFRRORtPH1MnI92s/Qxsg6azKVm22rM9V5Uis0KQbG7qyGjMaCn2whfS11DMy87dNavKKiv6LXs7p7GlaWvbnXfDwY3FUC7tpuLaqS5hg2GRiGKAtTziG4k40gRcMz0HFxoxRLvON637BVlKxfEWubiEqiWlXSxYNYqkQJcmGsdK7fV8kSU+CdshqFmJ4y3WMzNllLoJZLrhTHp3vQ+4OI9MqPDDkfFDrcUTTY+NrutlobF/AOSF1YHgG6i55Hkf9tFJ9mV/LFWRAXFaX99s/r2O6NJlW5KV0VJSbgj4XJTdsukzOxMXFcQaeV6Zli4flkHlH2NW3+n8gpeTNnL8+nFWfP88vSyeXZ+0WlOXky9Zsd7dfFienHBpuzC8Fi9krAebtwm5LcG0Gl3zprty2bn1eD03D0/dTsvT9qXp3/CWvyv62M1/P2cW6nz7ZXAvqGer8Xwdi5mt1Mjkk8jsxZZTHdN6DS6Nz1wCvS1T05P2lCO643OlKaYZ1YzjwzzGJxSjK6ik4T+wOQo0MiCX9YPyDPaEwELC3i7tlFJTMriVON33YoF4yYTGReW2Q4bQrbDKB4MHBRkZ8f+gwCljTntS3cIy+WEKfwsRZpSs33uDkcO3DHJ2YSoG1JOnOebagl/4cIo3CZ5N03mou4isZuolMgpyVqLrudhrGv7jgqp4+b6dgAOTLJ/Wggin2wko7nRbxco2gw5ZoOZtiUIFs4Syr0uWEz6+Qc2A1Yx -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Simple Testsets - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-spans-rpc.api.mdx b/docs/docs/reference/api/query-spans-rpc.api.mdx index ef0a0cb22e..149afa5841 100644 --- a/docs/docs/reference/api/query-spans-rpc.api.mdx +++ b/docs/docs/reference/api/query-spans-rpc.api.mdx @@ -5,67 +5,964 @@ description: "Query Spans" sidebar_label: "Query Spans" hide_title: true hide_table_of_contents: true -api: eJztXFFv4jgQ/ivIT7dSdumt7omn49pU5doFDui+VBUyyVC8OE7Wdtrjqvz309hJSKCF0NLdruSnVcOMv/HMl/Hk08qPRNM7RTo3ZCJpwMQdufVInICkmsWiF5IO+Z6CXE1VQoWayiQgHkmopBFokOj4SASNgHTIPA5SRTzCROFEPCLhe8okhKQzp1yBR1SwgIiSziOhYjWYmwX0KsEFlJYYgEdApBGGpCUNgHgEsTEuzTRHw3ODlHmlp0g5J9m2BZqU0cmI6qOGR+9AaEpMvoQGDhFouaoHakB3R2pNKqHGPAR1jFAruExouAO5M5SBxa2GIuDhp4TSt7jVUDiL2KsiaYJ7ZUCqsOgl7yl/a+RegVMFl1TDa4BFGs324I4QovaiMK5BHoBaMtk6Zri6BJXEQoFCg88nJ/hPCCqQLMG+QjpknAYBKDVPeWuUGxOPBLHQILTZTJJwFpg21P6m0OexAppIbFKaWYQgTq3TRsLX2zw1Fh4JYU5TrknnJLN9RdUTxzRE6gkACVRDOKV6d2vIu0yHhFTDR80i2Jn8U7tsq4s9gqRJ+BYg13bZHCQEDm8AcmaXzUGKdM1WUxY2xElTFjZK1l+rVi+s5uuoKEW2SpQiYUdFKdJVopijLgfYXLZwwhMacnuk7h7zcUJFbp1QCULviX9XvEOzQC1Wa9rknGTiPrYvMvEIFSLWxR+pWIr4oXa2m01OcKXteIp9N4c2RzT2lQVlCPgQy+Wcxw+YJqqW+E8cY2+HaAZhaJ2Lnsd5ZFpSlHDIAw4WZoaQIKlYPr0BTPue+JdM7GFSEf942O1PL3v9s+l1fzz0T3vnPf+MeJXnvf7EH/W7V7WHY3/01R/VHp1e9fz+pPZoOBqcXZ9u2g364+sv/qi6pcEEOG7rEuN+flv2AHkZwQxZ+9R0GaI0lXpqes4relSTU3eMSK2J9SQgwh+C6ouwxFSa6lRNgzhsSOnxpDu5Hk9PB2c+ksI3Na08G1xuPPBHo8F2OQ3sKaI+XVAbVgRK0buXV9Ws0vqSr5J5hGot2SzVsHHu0jBk+I5RPqwdvC+dJzfnnlkcc6DCPHoaiwRMBimn8rfzlPO/VSw+DlKdpPoDdgm7Sjz7BoGd5/NBoYkXlZKudn8E1H1Nk91CfM65u05phq1pDhJEsJm+Zwabe5CK2eHqJQX+mrsjY3h692KeoG/mkeMdsPakcmx7U7ZtOdZ7zKigYgVhf3SjNYEzj3Amls2YfNhEdOi85Zj0o5m0/uK8KWtbqdvGeXbFxPIgml0ZYmUeWVC1aNgsXXv61UlVpcwFVYuDKHNhmYKD4r8B5EKGq9tR6uaXGcX03oPQzV7J4pvjuR5efFLgmK40jZKjzPbV79VyYfdC/+RTwnChWuqNM8JHWh30xvuWiPuAy0NprctsQJ9zqnH6OAh9bOTJYlhpSKntoehgLr56iTVtCuXgA3mKVJVfN7JyexBHykQ5mdbJtE6mdTKtk2mdTOtkWifTvtdB1sm0Tgd5NzqIk2kdk5xM69rTOyKVk2nfad2cTOuI8dpT4h3LtLlEu3N4cVqo00KdFuq0UKeFOi3UaaFOC3XTotNCndjwq7DNaaGOSU4Lde3p1yGV00Lfad2cFuqI8dpT4v1roccQI/d0NWM1kQCHpXli/1fsvtXze03KSwayDD3++PyZbN1J8JVyFhqhp+VLGcuXX0gQgqaMmwP46SbA46D26yGv1e1mVSojQqFaZR6J1N2uNlP5wi3EqedMTTJaViHawyvcl4XO7apfXmV6bXaf38aZTd+u0l5MJsOtBW1t60X9B6WxlmWiRyLQixhvtUlic69JQvWCdEg7kXDP4KGtLVvaRulvF7KaAnlf3HaTSk46ZKF1ojrtdsDjNPxkb4L5RFmbJsyQVEGQSqZXxqU77F3C6gJoCJJ0bm6rBmNkkOVE3awsB03YJWAU+QUd3VQvYsn+KxRJc0/Hwnrh9pmYx6RyL0fXBNfqDnvEW388k5NPv386IZvZqhkj+Wmg14dW/jOqiLUslPs3sqRhPtFAoz/XP2BkmPOIisp69eLUQin3r+Ff3U44qqFZDvyY1+2G5HXLx2xLW5UvZ6t365EF1rpzQx4fZ1TBteRZho/t71igkCk645XbTZawqtxodE95ipGYt/FZ2/x+oSbG5Q0/TYzLO3iaGBe35DSxrVxt08Q8v4ymUTKKO2TWxrf4h2RobV4Br6As5t96dQMcqCpeWx0XVynf4OFgPCFZ9j8n5HMi +api: eJztWt1v2zYQ/1eMe9oANc6KPflprqOiXlLbs5W+BIFBS5eYDUWpJJXONfS/DyQlmZa/E2fdAD0loe7ud7z7HT/CW4IijxI6dxAIElL+CPceJCkKomjC+xF04FuGYjGVKeFyKtIQPEiJIDEqFFpxCZzECB14SMJMggeUl0rggcBvGRUYQeeBMIkeyHCOMYHOEghfDB+MAbVItQGphHbAA+RZrF1SgoQIHmhs7ZeiimnBjwYp9ypNnjEG+aaEFqm8EzFRZ3WPPCJXBEy8uEKGMSqxWHfUgO731Io4riYsQnkOVx1cyhU+otjrytDiuq5w/P5TXBlYXNcVRmP6Kk+Owb0xIGu8oUyhOAG3SqxVzLV5gTJNuESpBd5fXuofEcpQ0FSXGXRgkoUhSvmQsda4EAYPwoQr5MpMJ00ZDU1Vtr9KrbN0QFOha1ZRi/CMQlIrUudu6d2XQiTXIJmFqMVpJdwzErlXMnNvdRSF1oGIKHynaIxHkc4ruXZO4yWN7BIit9omQpDFXisTo5t7dj2qWSFRRHVSCBut5WA9I1vgdymuJF5tAkIqwowR8cswQKan8St4S6AKYwmdrV9rUbnPq5Fk9hXD/WtZFahQIFEYTcl509mzZltdk9Isjd4C5NaaLUAiZPgGIFfWbAFShmu2mNLoSJwso9FRwfqwaPUjN15nRSmjVaGUATsrShmuCsVUYgGwa4nTBxos5HXxHBDX5C2kUyKQqwP+7/N3ZAy42E+UH4hGeaqYjLqD6XV/cDW9HUxGfq//se9fgeeM9weBPx50b9YGJ/74iz9eG+rd9P1BsDY0Gg+vbnt1ueFgcvvZH7snl3JJuNZ+b061nJbdJF8WJBPwATGVAlIRoaambl5RZ8ds8RON1AqsJiCP/hVUn0cVplREZXIaJtEB2IoSQTe4nUx7wytfk8I3OXXGhte1AX88Hm6m08D2NOr2hFq3YpSSPL48q8ZK63NhJfeAKCXoLFPH7pwvPULGs/WRWZIwJNwMbcda7YAfM8b+lAl/N8xUmilnI3S2vY19c7fW4UNFTRdO2mi7q5BqDj8jV7XQFb7WDxFlve5aBMty1BSXisTpWerC8TyoDDfMeGtmbCi695Y7ywU31bX1wte0ctAPe+5bIuYeMMqfjmPkaTvzqft+w7CfybAyt07eahy7ofzpJIrdGGIdAq7gVie/LWcbN7DNbau5bTW3rea21dy2mttWc9tqTjzNbathRnPbam5b/yOG/fdvW+e47mzxpY4kA4F4WpgD+7J3aKblw2r5aFqbZtFCUT3g5rk2+Pv795vvvV8Io5F5zW35QiTi5Y+9ESpCmf5tR82zJFz7ekrV3deT5nAjsQ7qQMfycd8a4RxPrMhuUROMVqC/HkqGnpeFLuScbKzCa6O7expXNnz7ePUpCEYbBm1u15P6l+4OaFmiehCjmie6gSZNTAtFStQcOtBOBT5T/N5Wli1t86+GdtlZIFE8l401mWDQgblSqey02yFLsujCNp1cENomKYW6B13ztdXToobgEsNMULUw9rqj/jUuPiGJUEDn7t4VmGh6WcKsi60eylN6jdrFojOim6l5IugPy4KiQWJutXRsKH9I3IaIwrcPJHxCrheLqk0BLi9+u7jcNZlCodUd9YsqIaFaHa8KMfBq4aoCpY/2sSkRUEjiP1YftJc6OTHhjr31LK65VMVC4d+qnTJCDf0N8LJI8B0UCS4WYstvWZizab73YK5J0bmD5XJGJN4Klud62H7XyYqoJDPmtJg84cLpsnomLNOemLLdKVv0PB0jXHUdHSNc9QUdI1x27hzlctlusxK+138IqqUNab2SZDpKVqsbhpi6EBsLqLZSFeRoOAkgz/8BwdA2uw== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Spans - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + oldest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + newest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, + `SPAN_KIND_SERVER`, `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, + `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, + `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-spans.api.mdx b/docs/docs/reference/api/query-spans.api.mdx new file mode 100644 index 0000000000..daa98f8ff2 --- /dev/null +++ b/docs/docs/reference/api/query-spans.api.mdx @@ -0,0 +1,968 @@ +--- +id: query-spans +title: "Query Spans" +description: "Query Spans" +sidebar_label: "Query Spans" +hide_title: true +hide_table_of_contents: true +api: eJztWktz2zYQ/isanNoZxnIzPelURWYa1Y6kSnQuHo8GItcSYhBkANCpquF/7yxAUhD1dpSmneHJNri732L3WzyMXRFN54p0HkggacjEnDx6JElBUs0S0Y9Ih3zJQC6nKqVCEY+kVNIYNEhUWhFBYyAd8pSEGX5lolQgHpHwJWMSItJ5olyBR1S4gJiSzopQsRw+GQN6maIBpSWCewREFqM7WtIQiEcQF33STHMUfG+Qcq/SFBnnJN+WQJHKOxlTfVH36ByEpsTESmjgEIOWy01HDehhT62I42rCI1CXcNXBZULDHORBV4YW13VFwNcf4srA4rqucBazb/LkFNw7A7LBG8Y1yDNwq8RaxRzNS1BpIhQoFHh7fY0/IlChZCmWGOmQSRaGoNRTxlvjQph4JEyEBqHNdNKUs9BUZPuzQp2VA5pKrFfNLMILSMWsSJ27pXefCpEcQTILUYvTWrhnJHKvZObB6igKrUMiquGNZjGcRDqv5NoljZc0skuI2mmbSkmXB61MjG7u2fWoZoVGEcOkUD7ayMFmRnbA71NcS3yzCRIyGWacyp+GAXCcxs/EWxGmIVaks/NrLSqPeTWSzD5DeHgtqwIVSqAaoim9bDp71myra1KapdH3ALm3ZguQCDh8B5Aba7YAKcM1W05ZdCJOlrHopGC9W7b6kRuvi6KU0apQyoBdFKUMV4ViKrEA2LfE4WEGCnksniPiSN5COqUShD7i/yF/R8aAi/3MxJFolKeKyag7mN72BzfT+8Fk5Pf67/v+DfGc8f4g8MeD7t3G4MQff/LHG0O9u74/CDaGRuPhzX2vLjccTO4/+mP35FIuCbfo9/ZUy2nZTfJ1QTIBH1BTKURpKvXU1M031NkpW/wEkVqB1SQgon8F1RdRhak01Zmahkl0BLaiRNAN7ifT3vDGR1L4JqfO2PC2NuCPx8PtdBrYHqLuTqh1Kwal6Pz1WTVWWh8LK7lHqNaSzTJ96s752iNkPNscmSUJByrM0G6s9Q74PuP8D5WIN8NMp5l2NkJn29vaN/drHT9U1HTJWRttdx1S5PALCF0LXeFr/RBR1uu+RbAsR6S40jROL1IXjudBZbhhxvdmxpaie295sFxwU11bL3yklYN+3HPfEjH3CGfi+TRGnrczn7vvNwz7kQwrc+vkrcaxOyaez6LYnSHWMeAKbn3y23G2cQPb3Laa21Zz22puW81tq7ltNbet5sTT3LYaZjS3rea29T9i2H//tnWJ684OX+pIKpAA54U5sC97x2ZaPqyWj6a1aRbtE9UDbp6jwV/fvt1+7/1EOYvMa27LlzKRr3/sjUBTxvG3PTXPk3Dj6zlV91hPmsONxDqIgY7V/NAa4RxPrMh+UROMVoBfjyUD52WhCzknG+vw2ujun8aNDd8hXn0IgtGWQZvbzaT+id0BrUnRJRODXiTYPDMHbZpm9IJ0SDuV8MLga1tbsrTNfxraWDsgX8qWmkxy0iELrVPVabdDnmTRlW03uaKsTVNG6thd87XVQ1FDbQVhJpleGnvdUf8Wlh+ARiBJ5+HRFZggsSxVNsXWT+QpuwUMWtET0c30IpHsb5v/ojViYbUwKkw8JW4rROHbOxo+g8BlompQINdXv1xd75tModDqjvpFfdBQrw9WhRjxauGqAoWH+tgUB9FA49/WH9DLNFE6psKxt5m/DZeqWGj4S7dTTpkhvgFeFbl9IEVuiyXYMrtsmkJ6LhJscHggq9WMKriXPM9x2HaVYJ4ipuiMO30lz7B0WqteKM/QCVOre2WLRqdThKtWo1OEq2agU4TLdp2TXC57bNbCj/iHZCht+OqV/MIoWa1uGELqQmytmmilqsLf/YDk+T8MzC+/ +sidebar_class_name: "get api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Query Spans + + + +
+ +

Query Parameters

+
+
+
    + + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + oldest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + newest + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + spans + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + + +
    + + parent_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + span_kind + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`SPAN_KIND_UNSPECIFIED`, `SPAN_KIND_INTERNAL`, + `SPAN_KIND_SERVER`, `SPAN_KIND_CLIENT`, `SPAN_KIND_PRODUCER`, + `SPAN_KIND_CONSUMER`] +
    +
    +
    +
    +
    +
    +
    + +
    + + span_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + start_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + end_time + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + status_code + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`STATUS_CODE_UNSET`, `STATUS_CODE_OK`, + `STATUS_CODE_ERROR`] +
    +
    +
    +
    +
    +
    +
    + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
    + + timestamp + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + traces + object + +
    +
    + anyOf +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-testcases-preview-testcases-query-post.api.mdx b/docs/docs/reference/api/query-testcases-preview-testcases-query-post.api.mdx deleted file mode 100644 index 5a5da5ab27..0000000000 --- a/docs/docs/reference/api/query-testcases-preview-testcases-query-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-testcases-preview-testcases-query-post -title: "Query Testcases" -description: "Query Testcases" -sidebar_label: "Query Testcases" -hide_title: true -hide_table_of_contents: true -api: eJztWG1v4kYQ/itoPrWSCYQk5M6fyl3udPTShCZcKxWhaLEH2Ova69tdJ6HI/72aXduYlzgkIlI/NB8IXs88M/vMi2ZYgmEzDf4IhqhNwDRqGHsgE1TMcBn3Q/DhR4pqcWcKgbtE4T3Hh8qJk0ikNuCBwh8pavNBhgvwlxDI2GBs6CtLEsEDC9z6rmVMZzqYY8ToW6LIrOGo6akAv+OhfWbx4noK/mgJ3GDkRBYJgg/aKB7PwIOpVBEz4EOa8hAyrxBgSrEFZF6pEadCQDb2wHAj6KC4fKMfaquI2mg0dzxcN/2cxXoLGk2jbx174HEoHwhjDX6dgRgfUJs9HQiZwabhEdZ6ceUgMw+kCA8Nfu0gMw9ifNwX+lnirggr80DwiO8G5bHBGapalEurTfdWIap63zBOI6oIpgOMQ3cWYvkwruXAwmeedUrdM/Fqj/sFQOaBYgZ3AsVpNHkG54Z0s1UxyMl3DKhMC4E/y1zchqnTKxvG71T8N67oISMV6gBcYQi+USnaA53IWLu87rTb9I8oVTyhZgA+3KZBgFpPU9G4yYXBe23vCGTqlDb4Xjn/0UpQXKcsFQb8dl71rgX6lS6z3ZbesjMcFvu2xA0UMoPhHTtszX90sI2eLa40Cd/CyDcHmxsJUeAbGLlwsLmRgq7J4oDRKMj6sMiDUvB1UCsFW6WVgrCDWinoKq0cDtrhTYUdTKqQLAw51T8Tg7Wa3DI6kVIgi6tWcj+y8VZHq3Pls3WCVF7vTGHZq2//m428eofdtiDgKkgFUz9dyUuuza9axs3r1CSp+RlecsstdXgRScOcowgN++9y9DkV4lmG8qa/j9bzQ+WG7stI/Y3IpOJl/5N6MFIviMx9Zpqt5WHH2FOdHkb7TUrlZJPZMem009kehP5ggod2zGl8Ukqq109BIRrGRc0sI2Sw9vYlGTR+mqFL6Ry0PUHPdm1qqyzXms0qdD8tasloDOntLq5XI+fI3suZzuUqKbCi17H79DUuHH11gf0yHA62AF1s14NqR+RGNXUiNHNJy3W+NCfMzMGHVr5bt8pZtGV3a6DJUN2j0jY+qRLgw9yYRPutViBkGh6xGcaGHTHeYgm3aa8xSBU3C6vSG/S/4uILMrv/jMZVgVvKIJcT62JlOFjCvyJ5EbOInnupmUvF/3GBpnWH/HFadH3KzZvV7wCfHlmUCNze60dwMmXvzqbd0+bZ+fF58/Ss22lOTqZBsxO8755Mu102ZV0bwMrgvZ/SxppdrNPQaXdOm+3zZuf98PjMPzv2O++O2ufHf8FqK66Tccvtvi7ka2u73DzX1srVltgutrx2ZrfHqbRk5YnWs7Ft9AZ98ICywKVV++j4qA2bybYmTL2DBbZ3FKGzr8HbSKIyfWgDjmzjAIMs+mX1gjyjdI1YXMHbzu01d8oUMvhoWolg3DYGa3yZp/0I8rSH6hLmuR+eKPhzKhJ/BMvlhGn8pkSW0bF774/GHtwzxdmEyBpRa5oXeb6Ev3FhFz7bQ5u2gZC4SF1eb/RT6nVOoxcEmJha2XGljgfXt0PwYJL/6hXJkHQUozvRpw+UX5YUW2j2bAmCxbOUWqAPDpP+/gXMYKJ0 -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Testcases - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-testset-revisions.api.mdx b/docs/docs/reference/api/query-testset-revisions.api.mdx deleted file mode 100644 index e0d4b1c337..0000000000 --- a/docs/docs/reference/api/query-testset-revisions.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-testset-revisions -title: "Query Testset Revisions" -description: "Query Testset Revisions" -sidebar_label: "Query Testset Revisions" -hide_title: true -hide_table_of_contents: true -api: eJztWttu2zgQ/RVjnnYBOXbcXFo9rdu0qLeXZBO3C6xhBLRE2ezqVpJK6hr698WQkqybFdm1gW7hPqSJxDlDHg5nhjNagSRzAeYExlRIQaWAqQFBSDmRLPBHNpjwNaJ8eS/1+3tOH5hggS/AAE6/RlTIl4G9BHMFVuBL6kv8lYShyyyF0fsiAh+fCWtBPYK/hRw1SEYF/lVGVvL+8toBc1Ie67hqupsHLIhQU7WIoKWBchlSMGEWBC4lPsRG9siPXBfiqQGSSRcfvCWiM85QYkPDcmL9KKaGiGMjHRbMvlBLwnpYsg9v1EKreLEBHpWkOAti2wypJu5NgYzKPIXkzJ/nYZkv6ZzyoiZvVnySX169LrAYtyKX8N/eRK77pwj87sgPI/k7lFeKGExSr50Q4ZwsG2ktikKF2SbZD8gkSlSM6mdi9GPwngn5FKeb1liW3o6hsbZC8IlHW66/OgOUjQ2wqbA4C2XliLeHuspBxAaQSC4C3gRmgBNwj0gwIYqY3Qg+1GgZbmnDE6N9WkN72x0mepAcIhsJzqnBoV3JFKkNVCFgArz1SvIq2i/nSqlSHkoIMt/ZYD4k4i3c5G0SM/7CGFXvLtfhxdnEQzGEPFBeDUPtZ/85EY8NEG403xXmDmVjA5i9L/se2Y2M3lKHcupb2+15sg+dW2Q3x/YD4Yz4R9YPy/pnzXKF/TSVOtJ/YKPXNGf8M99yI5veE24t2AOtX0WbZHGkgTrDFCg24JH5dvCIBDTkvz59pELuNZJ81JCxAYFr7xv8WkNiikG/tYV+ctc/IlZsgMs8Vg9am6WVUN4raVw3t+kTaQb1Iw+vUURY1Lf1M0x4kj+mjRwoeGU+kvIH4u4841EKEBvAN2UU1Wy0gnOrkoeGc/N3Zos1MXfLsH2rb5EQoyBeKRnHkyN5RNUDEQZ+cpkb9Pv4XyGThLvIsqgQTuR2bpPBYOx6GbWCSAuVWF8v4ZUagbvrkMiVYPZrHK/C2uBqyyFyf86uHBZGym/sX08RP13P/teh8QmXzCHWPhUME8hUw4HuEQdL6veVYBvHgsr/p6ByHckdKioVqS1KKlr2F6+pNNHaoqiyC0c/d1XF4pRIat+T/WZ6rzRsZ6jIikL7EEo+adhEiU1degAlVxo2UZLSNVvuMUClZL1cJiEq5WuvWlK2Mi0pYXvVktKVafmV75oq6JOmgJoG03tmH77CmMbczsjOCgQ1kfyJTPVQmd1+se8y3KMHO3qwg3qwffuMmiy8dbZUkyqn3m+6VVaSZsjH1K1F6na8MxzgzlANnUdSdyb1Csl86mKMucBOCUWrO3da5tNT+ZFCYWWOm4vxIl+bm2yjRGTlw1jVIs8Gg2q18TNxma1qiZ3XnAd891KjTSVhbkOh0A2swtttjH66mbD3gZ6gcmNiXpdw1hSK9JDNQxUZnTG+raN8XdedqHVp1cm4QmkxpVezu3kZV5q+pv19Ox7fVAD13hY3VdWhO3WW5FG5CPArqDAQCB0SuQATeiFWeuljL0mRRS+r/PbU91KA2S3Hm47asIi7YMJCylCYvZ7lBpF9QubUl+SEsB4JmTpkgloRZ3KpRIY3o3d0+ZYS1XuYTPMD7tCktJEUh2X7Q0L2juIsdI0hKUqy73rnsdWA89FSyAca6+36c67X34gXunTT51lZvlKqDmLNvljbS6r4SbhcJxdZ9WNtScUtyR6nxVl45pDn587FWff88vSye3Z+MejOnjlWd2C9uHjmXFwQh1xA7uONSTuJaVqnhUF/cNbtX3YHL8an5+b5qTl4ftK/PP0Hsq8oJpvHTHNV2fXBLH19MMk1Wtcr1LfY9d+YXbabu/LMtR33Q2oqdZcPoaraSNWmVeiBpr3Opo1LW5ZNY3Tnsa19JT3FftYWLPT81i28ftqC68eqtecE6jSlTQJ1+DvDmxHkCiLQPzk96VfOQmEwRhtiqWiTnm31GoySl8n8C7YnPRVqQFLi/bF+gTNDx+YRP4e32RuWio2Jr5H0m+yFLmEqpKhJrBJHOYHEUUJmPvrD0TWmdpdTAxboYc0JrFYzIugn7sYxPtbvzck06WTNkL8JxrdF6htX8C9dqtacCsRdFYVwuBtpX1gKyhgwtcTQsmgoG8dOc0Hg5vpuDAbMkg9evcBGGU5wefjTBDQ5xY9yj+rZClzizyPtGTQm/vsPc2O/1A== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Testset Revisions - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-testset-variants.api.mdx b/docs/docs/reference/api/query-testset-variants.api.mdx deleted file mode 100644 index 68ee55a161..0000000000 --- a/docs/docs/reference/api/query-testset-variants.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: query-testset-variants -title: "Query Testset Variants" -description: "Query Testset Variants" -sidebar_label: "Query Testset Variants" -hide_title: true -hide_table_of_contents: true -api: eJztWW1v2zYQ/ivGfdoAOXbcvLT6NPcN9do1WeJ2wAwjoKWzzY56KUkl9Qz99+FISdaLrTqpA7RD88GxqLvnyId3xzt6DZotFLgTGKPSCrWCqQNRjJJpHoUjH1z4nKBc3Wj7/uaWSc5CrcABiZ8TVPp55K/AXYMXhRpDTV9ZHAvuGYjeJxWFNKa8JQaMvsWSDGiOip5qwEY9XF3MwZ3URefCTHa3wJIpM1GPKawJ6lWM4MIsigSyEFKnGAoTISCdOqC5FjTwhqnOuEBJHQsrmfetmBYiTZ1cLJp9Qk/DRizbhddmoU281IEANavOgvk+J6aZuKyQ0Zin0pKHizIsDzUuUFYtBbPqSHl5222Bx6WXCCZ/eZ0I8buKwu4ojBP9K9RXShhcY7CfEpOSrVpprapCg9k23T+ISdJoONX3xOj76B1X+muc7lpjXft+DI2tF0LIAtxz/c0ZkG7qgI/KkzympT4U6mUJYo8g+mgTyp+UvrbHUp56JM5r+5v5aD2/3KJU37CAj5l66oASyeKhMNekmzrA/TYEB+aRDJgGF5KE+62II7+V0Cuco8TQw5L7fD02s23oXBG7JbazRP+T9UdlPfP+gn0eeiLx8YZJb8lvcfsi9jnJRhaoM8yBUgfueOhHd7T+lsM5xDtUek/yfKaxq7nJHS3JxUKmDkTCPzT4hYWk/Idf9oX+6qa/J6zUAcEDvh106xFSQ3lntGnd0kfZPjcMk4AqPKY8DH07Rtk4e5i2cmDgjftolLdMPHjGoxwgdUAyvf08aR6VDZwr0m0Lm78KX9yS8+93alzZAhdS0qNql0sKHC0TNAMqjsKs0Bz0+/SvcsrBdeJ5qNQ8EZ2rTBich9bJXpRYpRrpmxW8MBK0uXOWCA1uv5l1DdSOPJuLHi7D5cloZLIEk5rPmXdIA8MMMrPws0H4YRqEi0Q/oENoaN2jRbC6//MeoY3WPZqEh3D0PXcJDngSmUb/hh22OHhhYTtDQ1YS+49h5IOFzYz4KPARjLy0sJmRnK7Z6oBZOifr+SrL0zlfB7WSs1VYyQk7qJWcrsLKD9VTVIucRmOxs41Q5bJico86ShWFT2qqqJPBoFknfWSC+6YK6rySMpIPL5J81IyLlhpHRF7l7X3S9XQ3Xe8iO0FiNFCLUplW7OHmSFGKLUpN3W5RQ0ZnTG+3Mb6pSCdmXdZ0JldugAt6Lbu7l/HS0te2vW/G48sGoN3b6qaaCrqzxY8C1MuILpbjSBFyzPQSXOjFEm853vWyMlT18pK1Z26gwQGFku4CzHYlUoALS61j5fZ6nogS/4gtMNTsiPEei7kJC4VeIrleGZXh5egtrt4gMy3TZFoWuCaHsi5SFSt2h8X8LdIs7DkHw0QvI8n/tftOHRLNx2oRG+SqV5sb8ldfWBAL3HHjXRSutQKVWo1qeZk1H1mVtylNigN440bV/Sgcu3btNSldsGx0bVbbPFOGgidz9vR0fnbSPT0/Pu+enJ4NurMnc6878J6dPZmfnbE5O7PZaOtVz2NYal5rWMoqNxL5zQMM+oOTbv+8O3g2Pj51T4/dwdOj/vnx37C5QGiTsfcA+02u6PD7RZNe6cA3DXU/b4j7qWm055FxkrzDMT7dGV6OwCnR1z86Puo39rgiTCmUeca9cpc1r8GpBU8RNnRZEJj8CRpZ8NvmBc2MwjVgYQlvZ4jXyrgsgjR+0b1YMG7SpJnDOov+CWTRD4XzEE7pxyabA6YOLClruBNYr2dM4Qcp0pSG7Xt3Ms20ZsTehFL2Mg/4NfyDK9Mnm7OlaxIriYvEBnjtnKEzwGoMPQ9j3So7LSW2y4vrMTgwy34YCyKfdCSj1dGnC+Rwhh4T9GZsDYKFi4SOBhcsJv39B0VPaYA= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Query Testset Variants - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/query-testsets.api.mdx b/docs/docs/reference/api/query-testsets.api.mdx index a2ff7c8ccc..58dae98d3e 100644 --- a/docs/docs/reference/api/query-testsets.api.mdx +++ b/docs/docs/reference/api/query-testsets.api.mdx @@ -5,67 +5,1141 @@ description: "Query Testsets" sidebar_label: "Query Testsets" hide_title: true hide_table_of_contents: true -api: eJztWdtuGzcQ/RVhnlpgZcmKL8k+Vbkhai52bSUFKggGtTuSmHIvIbl2VGH/vRhy7ytvFMUBkqJ+sCXuzOHwcDg8s96CZisF7gymqLRCrWDuQBSjZJpH4cQHFz4lKDc3On/ugMRPCSr9NPI34G7Bi0KNoaaPLI4F94zr4KOKQhpT3hoDRp9iScCao6JvGaBxCzcXS3BnTZOlMMHdb7BmygTmMYUNQ72JEVxYRJFAFkLqFENhIgSkcwc014IGXjHVmxYoqWNhJfO+FdNCpKmTm0WLj+hpKM0y1l+ahbbxUgcC1KweBfN9TgwzcVkjoxWn0pKHqyosDzWuUNZnChb1keryds8FHpdeIpj85WUixO8qCvuTME70r9BcKWFwjcF+TkxKtumkte4KLWa7fN8Sk+TRSqofidF30Ruu9Jc4vW+NTe+vY2hqsxBCFuCe629HQL6pAz4qT/KYlnoo1PMKxB6H6A+qU7sPUVZrbiQuGxubJWezsNyiVN8Q+YfMPXVAiWR1KMw1+aYOcL8LwYFlJAOmwYUk4X4n4sTvZPIKlygx9LCSN18+lBn/vStil8INPZH4eMOkt+a3uDv4fYroxAL1xjlQ6sAdD/3ojtbdcS+EeIdK70mazzT2NTdp25HXFjJ1IBL+Q4NfWEg6evh5X+gvbvY7wkodEDzgu0F3Vq8GyhvjTeuWPsru2DBMAhITTHkY+naMCkH2Zd7JgYE36aNR3jJxcMSTHCB1QDK9u5S1q3QL54p8u47Ln0Uu7qg6exasKyumICUHUlZc0onRMkEzoOIozMTNaDikP7XKCteJ56FSy0T0rjJjcA7VZF6UWKcG22Xoz4wF7eqSJUKDOyzLq4G4p6D+L+V+Gil3kegDtFzL6yvEnPX9j6u5Llr3kHOHcPQj6zkHPIlMo3/DHvYufWZhe2NDVhL732OS9xY2m8RHgd9hkucWNpskp2uxuXk4PZiT9XTTm/hVvh50lpytYpacsAedJaermOWnkt7Z9dES3i0LVb19Z/voDFUIg9SojJPRqK0jPjDBfaMSei+kjOThIsJHzbjo0AIi8mpPv6Ywz+/n501kAyQKA7WqyJhit8rLQym2qnQ595saMnpTerqL6lKxzcy67NSZXbUjLOi17N6/jOeWvq59fTWdXrYA7d7WN9UozF4lcQLU64he6sWRIsSY6TW4MIgl3nK8G+RKbmBe+oEDCiX1wmZ3EinAhbXWsXIHA09EiX/EVhhqdsT4gMXc5LtCL5Fcb4zL+HLyGjevkJnWYTavGlxT/tiMqJsVm8Fi/hopCnuBwTjR60jyf+w2U6dA8VgvWjxl5lX5cvLFZxbEAhsvGwsl2lCcpLjrejHT4JlsK7VGcaOW2VKnvcjfxouHWeXFQulry1T5nUoOPFqyx6fLs5P+6fnxef/k9GzUXzxaev2R9+Ts0fLsjC3ZmaG73WzbhdT65LwfhtFwdNIfnvdHT6bHp+7psTt6fDQ8P/4Lyra2y8Z2p/sFV/Sdw6J1rPWFZZs3zNu0YWrav2VktixL9rHJsN74cgJOhb7h0fHRsMV8zZjqF/PMpucJZB6D00jlIomphQ1M8QKNLPitfECR0ZkJWFjBa52vhkrK8ljjZz2IBeOmNpm5t9nRm0F29KDSRjn2nTvVjzWdU3cG2+2CKXwvRZrSsH3uzuYO3DLJ2YKomlFxXOdnbQt/48Z0bKaK900JI3OR2LPVqOhUba3H2PMw1p2280opuby4noIDi+zfAUHkk49ktCT67QJll+HEnDsztgXBwlVCRdgFi0k//wLGTFuQ +api: eJy1V0tv20YQ/ivCnFqAtlyjJ54q2wnipq1VW+lFEIwRdyRtsuQy+3DDEvzvxexSEilZsmI4OljG7sw3s988VYPDpYV0ChOyzpKzMEtAl2TQSV3cCkjhqydTPbr1fQKGvnqy7kqLCtIaMl04Khz/i2WpZBZUh5+tLvjMZivKMdwW1d0C0mkNrioJUtDzz5S5FlEaEuxITg4FOmRHnHSKBSe4tPfRKjTJRr/wSkHTkfuz1R1shJumYXhb6sKSZS8uLy74S5DNjCzZVUjhwWcZWbvwanDfCkNy+stKw5Q5GS1k2kel1k1ZOFqSga2f10GiSWDDalqDdJTbfbQCc3qWPeuMLJZH+fiLdZuk/9jXQd10IJoEMkPoSDyiOwaYwEKbnGVAoKMzJ4M/h61cR9jBKLDjS/EjjHyKsK0RQYp+gJGbCNsaWdM1rx6lONGO91KcRNZVNbgVXb7e1MqarY2VNWFvamVN18aKVX752lx9YN0mgbdzL/rE1Zph20f2YNEYrI6iTDb6TbLtcz0sFEJyjaEa97rACTSs20zPg3zeP5lrrQiLcPS8LcikybxC89N7r9TvVhdnd96V3v3MDazXuBmk7VqnaL1M0I5u4HzP4kvNH5o9tX4ILHWRo1d7EjzoBC3QKwfpdPYcZndqxZ4/24fZjJM4in69vNyfPv+gkiLMlsE7Y7R5/egR5FCqI9NE6ax3+z15NTtM2h86OhgS2y47w29TbNswWYtL2kbgsGggYzDh25f453dF061cJxRbeiO7h59xE+k7lkAfJpPxHmCMbT+of/PaNOhkU05upXmhKrVlxBLdClIYloaeJP07XO8Cw7BwQQKWzBMZG6LjjYIUVs6VNh0OM6W9OMclFQ7PUQ6xlLBrfxRuB9csGurEUuaNdFXAG41vP1L1gVCQCfndEXjg5Irp0hfbtrpSfiR2MS4nMPJupY38L+ZAApIdWEUtZobT9n67Nb77hnmpQug7XZAFZbHQwU7LdvuIK8y+UCEgASYkvu/i/Jfzi0OvbhUGo/FtW0yYue021YpBssPrhlFIgPJQSeAI89+2F+wlBzDHooO3F+ydjavlzdE3NywVylAowXbd5sEU2jyAzlaYxOWbk3nFSZNOoa7naOmTUU3Dx/E+nc4SeEIjcc60TblSV+vY1vCFqrB0hpZyFuqJxZWPsdxpL1z6UWOUZVS6o7KzTl6P7x4mkMC8/V2Qa8E6BvlJ/DcF4N8WrB2SK5zVoLBYeu4IKURM/vwPtqVO2g== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Testsets - - - - - - - - - - - - - - - + - \ No newline at end of file + + +
+ +

Body

+
+
+
    +
    + anyOf + + + +
    + + + metadata + object + + required + + +
    + +
    + + + property name* + FullJson-Input + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + testsets + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-traces.api.mdx b/docs/docs/reference/api/query-traces.api.mdx index 1b01a4e2f1..35bbbcb465 100644 --- a/docs/docs/reference/api/query-traces.api.mdx +++ b/docs/docs/reference/api/query-traces.api.mdx @@ -5,67 +5,4415 @@ description: "Query traces, with optional grouping, windowing, filtering, and pa sidebar_label: "Query traces, with optional grouping, windowing, filtering, and pagination." hide_title: true hide_table_of_contents: true -api: eJztnFFz4jgSgP8Kpae7Kl8yM3VPPB2XsLepZEgWyL5MpVLCbkATI3klORmG4r9vtWSDbcA4YbhkMv0UsOVudavV6v4KZ8EsnxjW/sKuRwb0Ix+JWNg5uwtYBCbUIrFCSdZmf6Sg5y2reQgmaD0JO20pd4/HrYlWaSLkBK/LSD25j2MRW9DuI5dRK+ETITk+cMICphLQ7stFxNrsL5R972WzgCVc8xlY0DivBZN8BqzNxkrPuGUBEzJ/hAVMw1+p0BCx9pjHBgJmwinMOGsvGMh0hoapBKSFGGZg3SN8AtJytNDOE5RsLE6TocVjnsaWtfMxAbPCxjjmN699uQwKEwpT84z5cDm/HjuLynpRZHZFpnHMlndFtaijqFXFEZjnuOElaq+9kqJeCU/H19vzSkpezsPo2J5e6SlqT/gEDlEspIUJ6FrNN6ijqNSI70dXOkAd5fX9dvzV/VZeW2NVcmSdA1SxxCsaTKKkAYOiPn34gH/KKW6QhiEYM07jVj8bzAIWKmlBWjeBJIlF6PLW6VeDzyy2Ti/RmN+s8LpClWaPv2ShztzTy4CZhEsnT1iYuQ9VNdKigzduuLx6LyL3uZLxci1DHNO6iHJFe4YPEi7d6OUqiarRVwhtaQG/rFWvpRazzBDiMz/r8+E1qvZxsVtvD+8vA/YgZOTXL0/Yg5tO7/7yond+f9sb3HTPLn676J6zzRSfHwq7xq+vX/SG3X6vc1W6OOj2/+z2S5fOri66vWHp0k3/+vz2rDruuje4/dztVz2AvrxEe9D1lmt7b8V2L2QnYJtF3MK/3KhioHNtW0PhHQQyepmYroxWQozlNjX3oYqg4uxhZ3g7uD+7Pu+i+7rDOkcXxl5fokcKF7r9/nW/cs0LrDrJTeUMZ7Ke2AyMwdz54tSAUlqfMynLgHFrtRil1u+btUweRcKXOjeFnWV1CtXwr9PXWUvHFXoEaSt6duzsprsCl9JYPktqd/pq0P/V4D2JwplYtKCy/l30VpYkMjlcaz6v1d/1Ll66ihKqOfhnTZJVe5cBi4V8aBZK7+GQeDNBmzuzMtsrIR+eG6pXbgWbKgzy/VI4Lwo5f8sBs20+5ZXar90XIBXhGBNCTs655auaCQ2tZDAVVVdrR4AeMw5xo4whnIcx1KWCUAO3EN3z7UVbg5PlzEtodVzhlibRgfJuvYSKvNE8M/wQkf+dZ65ZSz1c5NZQWoU6THg4v8pXYmdS00ptyVPbl3pV0qSpyyO5rgbZp5xt+kqtjhkN8CP05+p3O3VdLAn5qHx/gZxCSmXzL6l8kOpJFuc61ABDFLTFfc8yGgXlBXhW6x1udOOipbFzHJNhAXtS+mEcqyfszaZcoHcsNw/4R6kYH5iNIIr8w3lbGapZEkPmzHDKvUc0lw9FT/RUdIBLM6Mr8jLP7i9BjhzaN24CO7db3i2U5+QOmJf1Ilkb8pIOZP9R5BR4+cVAFrPc3b5F2FYARVvDMg+yvJ1xrYpvTzZahrwNObD/WDUee0/9CDYnkdkJ30LI+EVNcVvXGNQuRqlbyLfqznPZ75wf5he3iuGDKwkOaPJyCW+pdFyvSDau2LbkS7pzr0bc8mMYgFWcX0CrRXgUH33ORHstR7HiM3grNIyPYkIf5T6r69q1cQ499l9WjWiAPYVjVUSdN3A6jbo8vBdUzqQDWqWAKQtxXdbLIeFL0kYO5IgIvVMiRMjk/SKTUph8s5rvPEi3cIntLnkdcEjAgoAFAQsCFgQsCFgQsCBgQcCCgAUBCwIWBCwIWBCwIGDRCFiwUOgwjbn+R/ZDkH+yYBU7225WLLrbmHDtb3zdBF8QDln/nLWxWWOXVfmr6viuHHm5m+i3JIRmCM0QmiE0Q2iG0AyhGUIzhGYIzRCaITRDaIbQDKEZQjPwOmjm55hvx/2zh0J/1Thu/BQL/zjiC5r4Q174ronF9XxNzTtXaHzTd65+UTpR9zo9wUOChwQPCR4SPCR4SPCQ4CHBQ4KHBA8JHhI8JHhI8JDg4avDQwIWBCwIWBCwIGBBwIKABQELAhYELAhYELAgYEHAgoAFAYs3Byze/a+d6LckhGYIzRCaITRDaIbQDKEZQjOEZgjNEJohNENohtAMoRlCM6+GZn6O+da/iPb8Ca2UbtFS6I8bR+fQvVL2Oq+7Od01r7uhp5vlvrfAYOrfPPtFGQ29jkcIlRDqm92ehFAJoRJCJYS60V4TQiWESgiVECohVEKohFAJof6SCJWABQELAhYELAhYELAgYEHAgoAFAQsCFgQsCFgQsCBgQcDizQGLd/+bL/otCaEZQjOEZgjNEJohNENohtAMoRlCM4RmCM0QmiE0Q2iG0MyroZmfY75v4XW88iG4X0vBwi1aiuih6R7ouxfrXuelP6d7/dJfqUDyF1t/YPPdcjkQvYMy//3pE84sAhNqkTUu7E8ei8iVPK2u1kq7fl3avF9Oklj48uj0q/GdjgmnMOObOTkCy4WrCnZk81iFpbsNioOV0+52B8BVXr9hXWsmdTm+0N7sa6icM1q+2NsTW2iXV73ZUKzd672724xz7766xf99OLzZEOjXdgZ2qiLWZhPAJxJup6zNTtXIgH7kIxELOz99/HhqfUAEDK+DNs79qY5Zm02tTUz79DSMVRqdOOLDT7g45YlwIWYgTLWwc/dI5+biEua/A49Au9AvDBhggPglLw9beZsn4hLmObRps05qp0qL73npLTAyp/4ptE7IsfLNdHEXtDo3FyxgaIaP5Q8nH08+uC1ZjPDSYIxtHtp1IZfdxnq/5IWV/Q5qucBmFvjsP+sbOLNEGTvjsiDPbzzv56D1JOy0pRJ/qrUmWqWJkBO8LiP15D6ORWxBu49cRq2ET4R0jjipmrJYb80frCZbF6wPTpMYwd4yc8gii6UvrBRL6PePLqG6eLoL2FQZTIJssRhxA7c6Xi7xsoeAGDKRMHwU45YZ89hAwB5gztp5uxOwRx6nOAm3/3cODlPTcKyKIzBNBUt4aj545cqG4xPMOc2GGvG96VCJxVxDqVYlpaF3+EULHJsdXNN8Ky+yZzohopDCUxtnAUpZ5Z3/dYdsufwb7dKbEg== +api: eJy1Vk1z2zYQ/SucPXMk29MTT1XbtPGkjd1Y7cWj6UDkikICAgiwtK1o+N8zC5AUGMceubFOooC3+/YTu3sgUXsobuFq7dHdibVUknawyqFCXzppSRoNBfzdottl5ESJPs/uJW0zE+6EympnWit1zee6MvfhcyMVoQufQleZFbXUggVmkIOx6MKfywoK+My6/4u6IQcrnGiQ0LFde9CiQShgY1wjCHKQehCBHBx+bqXDCoqNUB5z8OUWGwHFHlC3DTtmLGpChQ1SEBE1ahLsIe0sa/bEZgJ7vBGtIigGTA4kSTHm98jedXliUNn6F9gj9O5qEzya8rLK/kS3SkG3SmmZI2U1qkL/kjD8H9qrSJLyarw/Pe/7SDKJ8lBGp470yJOyW1HjjxBLTVije5b5mjlSUi+/nJz0hjmm+X04fXYfprn1ZOyJOW+YouMTh94a7dGzqouzM/6ZPnE3bVmi95tWZR96MORQGk2oKRhgrZJleLfmHz3L7J8zz6w/YkkTn27hDp1nuhy8FdpD2nVLVEsnSqnrkT/x7Vl1iZpFeLvemwr9j6tZOnwNNR+MoURNcj8cZnHALOMQ6Lquy+Gni4vHWfpXKFmFHGRvnDPuJSmyjgcPyVgEFZKQir8kYeMfA5QpJ7dHFODYe6tunC/CObFLZsmfJhoIXQ6Nr1nzt5NogP6F3ofnYVD2NDQEI1vybXfg/m6a2K9I3eOSfBzCG6P7tBu/xfB9j2yAvF0urx8pjLltkLaGh3+NFGY+baGAuUm3kPnd+XzcCvh8WAlap6CALZH1xXxeKtNWsziyZ0LOhZXw7foSyzD7laGh/jyWreNNh/Utri/f4e4tigodFLerFHDD1RPrYQobUyGsfIccmf5ZW7S0NU5+iUnu37dtlGLXpd6YID5pkewXUX5CXUE+tlEBZ7Pz2dlTzvQC2eL6sm8CUYYmGOwYlphpuMZAQQ7YhA4AQtH8fLhgK63x1Aid6HvdFXDi0v7Qw69M0+eI8IHmVgkZui4EZN8X3S1Mio7jf86CsfBWOWyNJ4bt92vh8R+nuo6P48Ti8qmkF2uVzKxPuEs31juhWjYiPBRPguM2eQx23AGPAY+L21FWJNvWMfh+PzoG2m81x5n8cKzB/QpxgK74j5OMDZ2cD53HiYoyi7JEmxI8GhqsZXyg/nizhK77Ctk5eac= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Query traces, with optional grouping, windowing, filtering, and pagination. - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + + + + + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    +
    + anyOf + + + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + + spans + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + context + object + + required + + +
    + + +
    +
    +
    + + + + + + +
    + + status_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    + +
    + + events + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + parent + object + +
    +
    + anyOf + + + + + + +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + context + object + + required + + +
    + + +
    +
    +
    + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    + + +
    + + nodes + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + tree + object + + required + + +
    + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + node + object + + required + + +
    + + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`agent`, `workflow`, `chain`, `task`, + `tool`, `embedding`, `query`, `completion`, `chat`, `rerank`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + parent + object + +
    +
    + anyOf + + + + + +
    +
    +
    + +
    + + + time + object + + required + + +
    + + +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + exception + object + +
    +
    + anyOf + + + + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + stacktrace + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metrics + object + +
    +
    + anyOf +
    +
    +
    + +
    + + meta + object + +
    +
    + anyOf +
    +
    +
    + +
    + + refs + object + +
    +
    + anyOf +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + tree_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + otel + object + +
    +
    + anyOf + + + +
    + + kind + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + events + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + context + + object + + + required + + + +
    + + +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + nodes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    +
    + + +
    + + trees + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + tree + object + + required + + +
    + + +
    + + type + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + nodes + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + tree + object + + required + + +
    + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + node + object + + required + + +
    + + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`agent`, `workflow`, `chain`, + `task`, `tool`, `embedding`, `query`, `completion`, + `chat`, `rerank`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + parent + object + +
    +
    + anyOf + + + + + +
    +
    +
    + +
    + + + time + object + + required + + +
    + + +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + exception + object + +
    +
    + anyOf + + + + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + stacktrace + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metrics + object + +
    +
    + anyOf +
    +
    +
    + +
    + + meta + object + +
    +
    + anyOf +
    +
    +
    + +
    + + refs + object + +
    +
    + anyOf +
    +
    +
    + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + tree_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + otel + object + +
    +
    + anyOf + + + +
    + + kind + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + events + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + context + + + object + + + + required + + + +
    + + +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + nodes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    +
    + + +
    + + roots + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + trees + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + tree + object + + required + + +
    + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + nodes + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + + +
    + + lifecycle + + object + + +
    +
    + anyOf + + + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + root + object + + required + + +
    + +
    +
    +
    + +
    + + + tree + object + + required + + +
    + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`invocation`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + + node + object + + required + + +
    + + + +
    + + type + + object + + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`agent`, `workflow`, + `chain`, `task`, `tool`, `embedding`, `query`, + `completion`, `chat`, `rerank`] +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + parent + + object + + +
    +
    + anyOf + + + + + +
    +
    +
    + +
    + + + time + object + + required + + +
    + + +
    +
    +
    + +
    + + + status + object + + required + + +
    + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + exception + + object + + +
    +
    + anyOf + + + + + +
    + + message + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + stacktrace + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + data + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + metrics + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + meta + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + refs + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + tree_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + otel + + object + + +
    +
    + anyOf + + + +
    + + kind + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + anyOf +
    +
    +
    + +
    + + events + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + + object + + +
    +
    + + anyOf + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + links + + object + + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + context + + + object + + + + required + + + +
    + + +
    +
    +
    + +
    + + attributes + + object + + +
    +
    + + anyOf + +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + nodes + + object + + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + + +
    + + count + object + +
    +
    + anyOf + + +
    + integer +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-workflow-revisions.api.mdx b/docs/docs/reference/api/query-workflow-revisions.api.mdx index b49fecf28e..574fa117d8 100644 --- a/docs/docs/reference/api/query-workflow-revisions.api.mdx +++ b/docs/docs/reference/api/query-workflow-revisions.api.mdx @@ -5,67 +5,2058 @@ description: "Query Workflow Revisions" sidebar_label: "Query Workflow Revisions" hide_title: true hide_table_of_contents: true -api: eJzNWtty2zYQ/RXNPrUzjOVm+qSnunYycZPGbuy4Dx6NByJXEhLwElzsqB7+ewc3ipREiaQoW08ei7t7Dg6WWGDBZ5BkJmB0D/+m/PuUpU8CxgGkGXIiaZpcRjCCHwr54uHJGTxwfKSCpomAADLCSYwSuY7xDAmJEUZQmNIIAqCJjwEBcPyhKMcIRlPCBAYgwjnGBEbPQJLF1dSEkYtMhxGS02QGAUxTHhMJI1CKRpAHhUWiGIN8HICkkukf/CgGlxHk2nCdkdiHEuGcaB8qMRbaYgfVhlzFZrKCqVkPAjYicaOxalkcUrRmIt0YFhsJPhJOSSJfMdvuLIParFsyPL7sW3LfIe9LZqMnVZ+VZVavn51lvjUy+mXzFdP0i6NQm6cljseXqCX2uyR+yVQtaNXnaoXX6ydrhfEuKR+R678vruadw23E7og0vfOMysTNn8Mq+FlDlDEjFCGnmTz85F2UkMoMpozsl+0NsN8bjDKqPDzo7SpmjJIcGPNvDVHGpEnIVIQPhIdz+oh7FZVJmjIkyVYClxZvcObxKgmOP+ULV7XPGrLK4QlFzywiIvGNpPrV2krFIJfJpCx6JTJXFrlMhtGY7sWFJhJnyLfifjIgFQ14hLwTLCYq1odSIkJMIiuDXs/cPxq18YtzZVjk+ieOIksTgWaVf3t6qv+Ul8kR3KgwRCGmig2+OGMIIEwTiYk0HLOM0dCcjYffhPZ5Lo0g4/rkLKlFCFNlnVZUXHI7NxZ6bFOimITRaR6sVzkTrKhOVYxNh6BDnm4C6B+oGr/cPDhEVyAAwiWdkrDPIZy5kB5ByXnKewtuo+WBWQF6XSwudMA8gBiFILOtsbcXJ+ueB67oV+JUM5aKh1AJmcbdK5EYnNsIeaDD4SNhisgawRtGfFcEsUHnKibJPgE/mAB5XqxV6eQbhhLW09LtYdbCmXmRK0sjiSKqVx/CriuyNpi2jat4PKn+Uh7dZiwIKQ8VI/yX94qxv0SavLlSMlPyV1gdqw7iFq4mXnYnvnW7V/WFNXV3b6EC1/I8VlE/p5+okDtlrd2LrLq308hubQNXwvc5igTV0trD0SKAkCORGD0Q2esqeG7DDs6MWCqLDgHy1YZ1IBEyPADIhQ3rQLxck0WPpc6L9efCFTuvV68oXq0CxQvWK4qXq0Dx3Y6O6Vo0LQIwLaiOYWwnKYD+Buo0JKvVpFqa+xu94rRrlK+c2gisewSmI8yRROZiqt1KfyhJji8htmxNvuAUOSZhZbXxRMetKsoHNw25P+o1nZEjqslHudFpMQc3Tni9oyRZRpOmG6BVidvstjyQmXhdxDtnv/XOq9fNx7p/O8pcqXe+XkqqJwr5Iw2xibqSK2yVgy50bvopUzpT9hODQ2CdVwCanMF8//6CmDPC2lGsRYiS/v5qofa6QJSbP/etYETRoMpz7ff727fr/aw7wmhkVBi84zzl3ZtZEUpC2ZZOFEvDytM27964XrJPaUj89j8Ws02XiRu6ENak3tSIMbjVTzdpvmxS3ptxWWhnV+lceXmtuvXDuLDybZvgD7e312sB7dxWJ/Uf3UodbMylGOU81d/sZKnpPmdEzmEEw0z3EvFp6JtrYlg0F4e+M6vfff8hj9l9wVzKTIyGw5ClKjohM0wkOSF0SDJqXjeBoeJULozL2fXlR1zYam9yuWRg6o9Nk6rZ8hIuox9Rs3C9Y9vzov+R8v2V3dEZEWkyTY2775EZcoOz60so7eLh9OS3k1NYFbBirN8HEpr3wWObxxCsqFCMHwLA2LwMIJHEfywfaGZaedc6cvG2zNfKEdmJIfGnHGaM0KS0E7ZTeQ9uKmHZKRUmY5dB7YSOA5jrJBjdw/PzhAj8ylme65/tcz1nERVkwkrN+O+4WPt+SzfGNCvz5u72EG1d3GV9a5/WQJXvhDp6dgbtMsrVb1xaOVe/N+nq2h22y4DXPpTo5r38ZmEv/6YE3O1+E9PqpXwTD3+J3sRWNjd1N9ZNTDdcNDdSxV4JNzN1N7dNjIub1SbG/uazUWB3Xbm0HbvbrokuMffjoqdg1k7rdBaGmJUR1vZUOkpRlq+vbm4hz/8HL//mnw== +api: eJzNWNty2zYQ/RXOPrUziOV6+sSnKnYzcdLEbuy4D4pGsyKXEmLwEgCUq2r47x3caOouO3LTJ49F7NmzZxeLBRagcaIgHsBfpbzPRPmgYMigrEii5mVxmUIM32qS89GDXzCSNOOKl4UCBhVKzEmTNBgLKDAniGGGkmOhR5IyYMCLgAEMJH2ruaQU4gyFIgYqmVKOEC8Ai/lVZmH0vDIwSkteTKBh7S9FLQQ0QwYpqUTyylCEGN7dXH2M3OqozCJJGYvoZHISLb7APc2/QBzNUNTUAAPNtTBQd45j9IkyaJ4PaMj5qIMu/+uwP3mSLxF3ThpT1Pgjgg++n6DAh0B3nwz7sDdpkQmzr36AENbxE1R4Y4nuk2Anaid+XiSiTmmEMpnyGaXfo8C4LAVhsVGCEMal8xf1g7/GfJWkqrJQpAzu2emp+bMc3k2dJKRUVovok18MDJKy0FRoy6aqBE9sD+x9VcZm0eFaSdMhNXcekrJ2Rp4lLzRNSHbUPrcrGgaPvTNeANeUq3U4rPW0lLuKgkFWyhw1xFDXPN2pUN+hmQSjpgNRzdJXmue0E/rCADYMclIKJzuxd8F88OYN81X0PJiPaOkuJ/p5UBcdiIZBIgk1pSPUR5Xv3MFGfVsZdZW+hJPPDtY7SUnQCzi5cLDeSZBrPB/x9FhlHMR6PY8u065eR/US1Gq9BMGO6iXI1XqZkVTfUa533rxhoEQ9eS7MjbFtGBwvUBedOwo3QZbjr5ToTp8MQ2g4lFahbbPxp/YSIKYpN9sVxfVyL92vQ+jWS97y8fIv3bNosy9IuExqgfKnN7UQ71RZvLqqdVXrn018S/EaEN/7D7FCKXG+U+cVWyP6usft7bczBq0Juy9TF85yQ6JQap5hoo+4cfoe0m+b4OEwxsF4M9twZTke2XDB8Fvc/fc0cT3EJsZrKV63DiNepxxcKa1PgWZSTSnDWmiIBxvRHye3gR94httdqnaoahoD9uvZ2foMdoeCp3bCin6XspTPH8BS0sjFjpFKlMnS16e0heF2+f4oHUE7BKlJZwRs62XDkOOWbF9qxYhuzdd9iTBxOdd+3VL9BXmdutvDuHDy7aqpt7e312uALrfLSf3TDPpRqIeoW2A56Wlp3hOqUmn7dqCnEEOvMkMxPfTGqKgXXhlUrx2Ve+HyoEjOwktDLQXEMNW6UnGvl4iyTk9wQoXGE+Q9rDisMuvbr9G5WWo3qqKkllzPLV7/+vI9zd8SpiTtFugsuDFl5wppeVmbQ6z4ezIU/TXIDd38H1cd/g40dVZGM15kpTUPvclxe43JPRXm0tROBHB68svJ6bZgvEHUv770u8e3w8DDLgO2IlcrFDCg3G4d0IT5b48fDEuTpxyLDt6O7K6M3V4YTX/rXiWQ2z1iWSx84gfgEw8MTOqBQZt86N6UmL89DhlMTeXEA1gsjMVnKZrG/Oy+mzSmXOFYdO6XK7TaBvO0x5NNwdzTfO2py1pADLaR/OdcVh6gjkPmgIeVAxh1noaOQ2vfM8cBnMITzW5CzmjDu8aj2dAf72OzlwfmvJiGPrLw9v0koUp3rNaON4PSdsjrq5tbaJp/Ac1vXHs= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Workflow Revisions - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + revisions + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-workflow-variants.api.mdx b/docs/docs/reference/api/query-workflow-variants.api.mdx index 5a4cebfa85..37d8f158a6 100644 --- a/docs/docs/reference/api/query-workflow-variants.api.mdx +++ b/docs/docs/reference/api/query-workflow-variants.api.mdx @@ -5,67 +5,1088 @@ description: "Query Workflow Variants" sidebar_label: "Query Workflow Variants" hide_title: true hide_table_of_contents: true -api: eJzNWdty2zYQ/RXNPrUzjOV6+qSnqnYyduPGbu2kDxqNByJXEhKQYHCxo2j4750FQInUlbrFefJY2t1zcLDALlZTMGykodOD/6T6MhTyRUM/ApmjYobL7CaBDny1qCZPL8Hg6ZkpzjKjIYKcKZaiQUUhppCxFKEDM0ueQAQ8K0NABAq/Wq4wgc6QCY0R6HiMKYPOFFg2uRu6MGaSUxhtFM9GEMFQqpQZ6IC1PIEimllkVggo+hEYbgR9UC6idZNAQYbLjPQhlJhSjHy4wVSTxRaqDbnq1WS1sKMjCNiIxANhrWVxStGaifTgWKwkGPLxFbPtk2ewNuvmDH++7Jtz3yLvj8zGktT6rKyyev3srPKty+j+nFa1DwRRxUxQx4rndH+fGPqqglRlMBTssF1pgP3OYVRRzelBHxcxUzTsxJh/E0QVk2exsAk+MRWP+TMedO0NpBTIso0Ebjxeq1vi1RIcv5kffO9+IMg6hxfUR2aRMINvDKejtZGKQ66SkSJ5JTJ3HrlKRvCUH8SFZwZHqDbi3jqQmgYqQbUXLGY2pXaU6RizxMtA91n4h1AbH5w7x6KgjxTqXGYa3Q1/cX5Of6rXZAcebByj1kMrWv8GY4gglpnBzDiOeS547Lri9mdNPtPKCnJFPbPhHiGW1jstqDjnduksaG1DZoWBznkRLVU3F2tWmOoQ1Sb7FN1zBEwZPmSxOSJCN4QMCL5M1GLXF8n1U2y1ken+d5duXfoIRUTh8JkJy4xUh0R8Owvig45tyrJDAl67AEUxy245+IyxgeW9CVVvKVwR+VJUI8GShFO+MnFfk7VBFVp57tNB/ZPq6lZjQcxVbAVTv7yzQvylZfbmzprcml9hca0UJOR6Ey/ft21sEOq+sKTu9qIbhefxzyrqB3nLtdkq69rqtei+m0a+GYrCpX9I8xrVL+MjNKMRxAqZweSJmaMW2UsfttV1Ytk8OQXIRx82gCQo8AQgVz5sACnlGkyOeN+XYv05CTd+qddRUUq1ZiilYEdFKeWaobgH8Z656h+2ERyPnp89bK0f4aVaOejlA3jdo1ZXu5RefwcQPWukioLcfr+4WO67PjHBE9dVtd4qJdX+TVeChnGxoWUSMq59u8uN3V8v2K30BEnTVI9WDWbmVUVrNsK5+utNnRitR/p2leTzZrrn1uWhg10lLebyenXXL+PKy7dpf68fH++XAvq9rW/qP9Tyt1ZlUopmLGmonEv3SMqZGUMH2rnCZ44v7bKt1e2yB26X7weN6rmcNFsloANjY3LdabdjIW1yxkaYGXbGeJvl3J0NjbFV3EycS/f+5j1OrpHRo4ASuWLwQCnlk6RuNh8T5fw9EovwwulaM5aKf2fVKcvYe5EePBtK5152vo5cq3t/AxHQMrxQ52e/nZ3Donw1YzoNLHanocR2X0O0oMJs/RABpu4ogEGW/jH/gpiR8KFdDfHW79ZCVQ5aGPxm2rlg3KW8IzENG9mDsJEwf81QoMpvBn47+xGMKQM6PZhOB0zjRyWKgj7239OOJVyzgag8GL/gZOnnBWrFiZQ7tds99K4uYey5s8/OQLUx9p6ee4Pus8rFEWwT5zAObWJan2I28Sinjk1sTXPTMOJrYrpiMtdIFT9Da2YaRl1NjGejqCbG5aioUeAw35nb9sMZH9Bt16NqOS5v2mlw6sYx5lWEpeJOUWYF4v7u4RGK4n/c98CQ +api: eJzVWE1vGzcQ/SuLOTXARnKNnvZUxU4QJ23sRk56UASDImclxtzlhuTaVYX97wW/1qtv2ZFh9CRA5Lx582Y4Q+4CDJlqyEbwt1S3uZD3GsYpyAoVMVyWFwwy+FGjmt/chw03d0RxUhoNKVREkQINKguxgJIUCBm0OxXmkAIvIwakoPBHzRUyyHIiNKag6QwLAtkCSDm/zB2OmVcWRxvFyyk0aftPWQsBzTgFhpoqXlmKkMGH4eWnxO9OZJ4ozFFhSTFNsDftJYtvcIvzb5Ald0TU2EAKhhthAWPUyWfMoflZXMs0aBBE+h9I8NUzfTYFCjSEEUNeQobo+3AV/oxs90mxD3qDErmwZ+0FZHCOD9fgneO5T4CdoJ3oeUlFzfCGKDrjd8h+RoCJlAJJuVGBGMWF95cMor/GrirUlSw1aot7enJif5bDG9aUotZ5LZLPYTOkQGVpsDSOTVUJTl1b7H/X1mbR4Vop2zQN9x6orL1RYMlLg1NUHbHP3I4mhbadZgvgBgu9juaVfFxBRD+frO1qLp8Gdd6BaFKgColBdkPMLsAUcqkKuwcYMfjacMdnu5czD5sMnDp1xZ7DyRcPG5wwFPgMTs49bHAS5ZrMbzg70E9dc3aQWG/myQXr6nVUL1Gt1ksU7KheolytFy3q6VNrdWhtmxSOR89z8j18E6ScfEdqNtwtYjtdhW5SaGfjEiBhjNtDRsTVUhs4QIfYZ5a8FZPlf7pddLMvoFzRWhD1y7taiA9alq8va1PV5pWNbyleCxLa1iFWRCky36nziq0Vfd3jNuPu+CbK8JxQc8QSHQTIUKDRw+PqIYJsKom1YNfNw5Tu6OI1XZvj9qrBMCe1MJCNNmI/zN5RGFnjrQ51OxWbxmL9dnq6PkS/EsGZG5HJW6WkevoEZWgIFzuGopB0afUxp2O8Xbw/pCdo9S30tDPD23p5KDatyRQfMrF9qxMjubar+/Jg4/Kuw75xN7NRXq/u9jDOvXy7Cur99fXVGqDP7XJS/7I3taR9KnXKq0Azk/aJWElt3HvQzCCDfqXwjuN9f0I09uNzUPfjVacf734a1V18PNZKQAYzYyqd9ftUyJr1yBRLQ3qE90nFYZXXwK0mZ3arO6Yaaa24mTu8wdXFR5y/R8JQufrvbBjaovNltLytzSCp+Ee0FMMtdlCbmVT8X18b4Qo781ZWMV7m0pnHTuG5vSH0Fkt757VxetonvV97J9uCCQbJ4OoinJ3QXyIPtw3SFblaoSAFLNzBAYOk+P1hwbK0aSpI2cHbntuVC2PQxeA/pl8Jwt0BcSQWIe0jCGmHFGziIW2/BFi8zmcDn/5xCjNbNtkIFgtr8EWJprF/+3WbRMY1mYjO42CFVdtcnvIA3hTRLc7Xv2A4E8jA9ZIXorT8QeE4jA54Hu8n1HnfH4fVvtfqfkrxob2bj7fZ8Dx9MBuHsp3YMz2yU2MW+8ki2A8oxcp0rNaGnEVpG+XV5fAamuY/7/+j2A== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Workflow Variants - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + variants + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/query-workflows.api.mdx b/docs/docs/reference/api/query-workflows.api.mdx index bdde9cac84..0e7e52b155 100644 --- a/docs/docs/reference/api/query-workflows.api.mdx +++ b/docs/docs/reference/api/query-workflows.api.mdx @@ -5,67 +5,664 @@ description: "Query Workflows" sidebar_label: "Query Workflows" hide_title: true hide_table_of_contents: true -api: eJzNWE1v4zYQ/SvGnFqAG6dBTzrVTXaRdNMkbbLtITACWhrb3KVELT+S9Rr678WQ+rQdR4nttifD0sy8x8fRcDhLsHxmILqHv5X+MpXqycCYgcpRcytUdpFABF8d6sXDU23AIOeap2hRk+sSMp4iRFBZPIgEGIiscgUGGr86oTGBaMqlQQYmnmPKIVoCzxbXUx/GLnIKY6wW2QwYTJVOuYUInBMJFKy2yJyUUIwZWGElPajIDy4SKMhwnZHZhRLXmpOPsJgasniBak+uZjNZI91sDwL2InFLWM+yOKRo/US69SzaBP3PYdW5Iog2ZoIm1iKnL+LA0GctpDaDqeS77UYP7A8eo41qDw96t4qZouUHxvydINqYIoulS/CB63guHnGn8jVRSiLPthK4CHiDUYXXSXD8Zv/l+nlFkF0OT2j2zCLhFt9ZQZ/WVioeuU1GyeQ/InMdkNtkpEjFTlxEZnGGeivupQfpaKAT1G+CxcyldMBzE2OWBBmonpV/CLX3h3PtWRT0SKPJVWbQV/aT42P6aZfJCG5dHKMxUycHf5bGwCBWmcXMeo55LkXs+4zhZ0M+y9YKck1diBUBIVYuOK2o2HA79Ra0til30kJ0XDBompZo2RxE3dChtHY06xoI8xA7Y1X69u/dDE5DhIJROHzk0nGr9C4R39dBQtC5S3m2S8BzH6Ao6oxQk88YW1g/lsuTYi1cwUL57pDgSSJoj7m86cjao3Jv/FbSSfdJe3WbsSAWOnaS6x8+OCl/Myp7d+1s7uyPsLpWClLmSR+v0ONsPVS7vrCm7ssHFSub9P+rqFfqUhj7oqzPVvxV99dpFBoIVhbKXRo+1i1ge2jgGMQaucXkgdu9HkynIexg5MVyeXIIkE8hbAmSoMQDgJyFsCVIJddkQZfIPXU3lVi/Lvz9sNFrryiVWjVKJdheUSq5ahR/WXxjrobLH4P90Qv37xfPj9YXXt0SV01M+yi/H/eJauo2oyjI/ueTk/Wu5C8uReJ7jsF7rZV+e0uSoOVCbmkspIo7b19Tm8fPK3SpAkESMTWzTeOI5vwwhs+wkft5Uy/G4I7ebtK6aTXv/boCdGnXSoBG3qDu88s4C/Jt29jzu7ubtYBhb7ub+gc1xIN26qRo54qGV7nyV4ec2zlEMMw1Pgp8GtaN4bBqpg3qx2qg5bSECObW5iYaDmOpXHLEZ5hZfsTFkOfCJ73B2GlhF95ldHPxERfnyKlDpoRtGdxSBoWc6Jo1s5JcfERiUbb7I2fnSovvvD1ymAcvWr7Ipsq7l0qNPLnB6OYCGNAygi7HRz8dHcOqWh1jSn4e++SvsP1rYCsq1OsHBpj6zAeLPP2leUHMSO+yDy3jrW/OyjFbamDxmx3mkguf2R58We7bPZT7Bu2WnpUXoTGDOe1ydA/L5YQb/KRlUdDj8J62JxGGT2TrqvQFF2sjS2qoiYn/Il/2MK91KQd7r/bpC1SOxvqYdidafTyqCVQfW9vftBz39DHdMKXppUqYp/QzLccefYzrsUQf42ps0CtweddvbMf0Rwsy9rWFVbWAUjs4jeIY8zbC2lFGUeqyeHN9ewdF8Q9NJSOj +api: eJzFV01z2zYQ/SucPbUziOR6euKpit1MnLSxGzntwdF4IGIpIQYJBh92VA3/e2cBkqI+LbvO5OSxuPv27Vtgd7EEx2cW0hv4R5u7XOkHCxMGukLDndTlhYAUvno0i9uHzoBBxQ0v0KEh1yWUvEBIobW4NZgDA1m2vsDA4FcvDQpIc64sMrDZHAsO6RJ4ubjMA45bVIRjnZHlDGrW/VJ6paCeMBBoMyMrogYpvBtffkiidaLzxGDOEhzMBsnyM9zh4jOkyT1XHmtg4KRTBNXmmXzEHOrnIxK7zbxzRWL+gMxD4Cfk/iYQfSz7g6i78i/QccEd/xEStLGfoMKfLd3HhHgMu6eFLDPlBd5yk83lPYr/I8VUa4W83KlFm8xFjJeM2ng1fTVoK11atIR7enJCf9YzHPssQ2tzr5KPjTEwyHTpsHSBTVUpmYUmMPxiyWfZ41oZahFOxgiZ9tGpYSlLhzM0Pc3PgkXNYNVF0iVIh4XdhotSPu1stIE+kO9mPZ8Hdd6DqBlkBrlDccvdIUAGuTYF2YDgDl85Gfjsj3IWYZNRkMdX4nsE+RRhmyACFX6HIOcRtgnSyjVd3EpxZBzvpThKrNeL5EL09XrRKK1aXZRWsBeN0srVRbHKz557VsfkWzN4OXqRU5xouyD19AtmbkdbbWfLJnTNoJsPa4BcCEmXjKurtTZwhA5to1mLVkzXf+m30d2xIJMm84qbn954pd5ZXb669K7y7mfKby1fAmna1jFe3Bi+OKjzhi+Jvh1xn/Nqgm25bRdmZJzMedYPEeltm9ISIzDnXjlIbya70FeD7Kbp/5MdON1sqWsC+fX0dHsU/c2VFGHQJL8bo83z55BAx6U6MFmUzta+PuWITfbL9oeOBEnZws56k7C7eKuKWctnuKrBftMgRnJNXx8rAOUVQzd2vVqs5I3q7k/jPMp36Cy9vb6+2gKMtV0v6l+07yT981Sgm2t6TlTauvCGcHNIYVgZvJf4MJxyi8NuPRi2C5NFc9++M7xRkMLcucqmw2GmtBcDPsPS8QGXQ15J2KQxCl+TMzINN8di5o10i4A3urp4j4u3yAWacM57BmM6Y/HUrJt1BeOVfI9EsVn9Rt7NtZH/xqPQ7H3z6EUCyTLXwb3RsuH2mmd3WNKiSHlG2ieDXwYn+5JpHJLR1UVzVehSd3tTYwZsQ65OKGCARbgn4JAXv60+EEuqTsHLHt52KTeWq0YPh9/csFJchnsQgi+bKt9AU2VgQHWG/iLImuV4wmBORyO9geWSrD4ZVdf0c/xOFRPS8qnqrc8bVLrG8bS34a4E7nCx/aYNLpBC6BDPJvPYc+0IOu1T82UIHfF4OoJT7/l3mFb02/FUWrlN6B8jyS/cTNbeJDoF0X+UZVi5ntfWqCCUru1cXY6voa7/A4+BxtU= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Query Workflows - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + + workflows + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/read-secret.api.mdx b/docs/docs/reference/api/read-secret.api.mdx index 211f3d0419..fee9af32d6 100644 --- a/docs/docs/reference/api/read-secret.api.mdx +++ b/docs/docs/reference/api/read-secret.api.mdx @@ -5,67 +5,761 @@ description: "Read Secret" sidebar_label: "Read Secret" hide_title: true hide_table_of_contents: true -api: eJzNV01P40gQ/StRnXYliwDaU07LDmgWATsImLlEUVS4K3EP7Q+6yxGeyP99Vd12Yifggcxh95S4P15XvVddXbUGxqWDyRTuKbbEDmYR5AVZZJ1nlwomYAnV3PlZiKBAiykxWdm0hgxTggmE6blWEIHOYAIFcgIRWHoutSUFE7YlReDihFKEyRq4KvxGtjpbQgSs2chAMGN0qaCuZwLgijxz5GTP6fGx/ChysdWFGCgbyjgm5xalGd01iyGCOM+YMpblWBRGx96f8Xcne9YdOwor3rIOJzzpTL1mHWVlKiQVNl9pRXb+RJWcUjrO03k7Ktz1/bgSvDoChexPw6z6svDEfezcvKAMtfcrISsOYla5GI38VUSFzhYWZdhQkaApEvlY2vwZIki1Y4vG78eME5sXOhYpyRaGXjRXforzJXFCdu6/5ESbl0xWgCjVme65x5gptOq2cb11dEPFPrVUDel+RRXUddTO54/fKeZeBE09xIAN98Sss6U7f/jycyixt2PuAKyHiz6qWAgNYfxH6QV7JGXz+AkicLikFJ88syuyTC9byv9XIn/yPrxf4tKafpD3yRESm5GsNAbqzlFfrRHsFVmnwxU9BOVbs72O2nA7BMWHYgT0whZdHwSV0pJI0Nx2PA+5rR9uQwdcBOTXYvR16nuRHUGaKzLeMs2Uun0hnCmXg0lW5v8rF7vX0Bu6F3E34t+Ozw0KWotVx5ObQEUnLOet84dI3xI+ahnyVEu232FpQ/wudt/QobO86aMrgf5ottqEwJuX1bPWmT2XB6iOQKshaiJY5DZFhgmUpVaD5l/6ZJAQvpoKQl1wmAj/yF55NLvv/GFQ5x2Ioev2d3CjjsDoBcVVbGjouY4tIZOaIx9q2KeAMDqTawRloX4R72tA2MF7rObDgr8H8q9qFLTeov465KAa17TEuLpulWgf4D7qO++Mr7w2cbpXoLUlY6gZBPOP09P9IvMbGq18CTm6sDa3h1eYihi1GcjdJo97s+/gWWdMSwnf2duJ8joPBvqk5gZfhxtyUqJsk9nbSz0ZoweZ/Zke4lc4ulnXfbc39AZ233bjPNA3eJcfHm73AIO2fVHvCNXovm1sUuIkl35n2fQ5nMAExissDY9XJ+PQ4rjxetPr1FLLkV21vZAvfyBhLtxkPI5NXqojXFLGeIR6jIX2d8FRXFrNld9ydnt5RVWTfSbTWXfBvURQiIn+so0cWOgr34c0XdhZyUlu9Y8gdNOJNZEv7utskfvtDVNn3rjR2e0ldEovOD46OTqGXbZ6iyX4MeZtpm+mIdphYeO/lMapj3xgwvTP7YRYVuSOU8w6eH1xdp6Cxn+mFx4XBrWP6qb6DMJNwQsnfp14mUJzG8Fk26rOIkhyx7J4vX5ER1+tqWsZfi7JikCzCFZoNT4KXdM1KO3kv4LJAo2jPbs2OQF+u2tC//cRRK/b24qYiYIrNKV8QVO5djpqf6vbd3baNFJwFsdUcGfnXhKSWNoE9eeLB6jrfwEzb2/I +api: eJydVk1v20YQ/SvCnFpgYdpGTjxVjYNUcNMYtpqLIBhj7kjaeMlldodCVYL/vZjlSqJM2UlzEsWdjzfvzcyyBcZ1gHwBX7CxDEsFriaPbFw105CDJ9SPgQpPDApq9FgSkxeXFiosCXLojx+NBgWmghxq5A0o8PStMZ405OwbUhCKDZUIeQu8q6Mje1OtQQEbtvLiIUaazDR03VIChNpVgYL4XF9eyo+mUHhTC0BxaIqCQlg1dnKfjEFB4SqmisUc69qaItaTfQ3i0w5w1F6qZdNneDaVPoeOqqYUimrvtkaTf3ymnWRpArvycf9WuDut41bidQo0csyG1e7zKhKXMrinr1TwCVOLHoWCs2EZK41e36Wzm/ln6NT/C6egdJpsGMZ9Hys5iTo4vRH4nQKjzxZxoGnlfIkMOTSN0UNcVWPtScRZpGVDKIBGMvRd9XqmtyL/Jb5C+bBLfi7UzSBE16kRyXu7P/oyOgXWrKjYFfY8+pHjn3vzFzImJOdynhE2NteBzFEP7qci5ugk5rvr6/EcfUFrdJySyQfvnf/5IdLEaKw8GaYyjA2sK05Of0AbUzGthePlkRP0HndDNl0PUIQow/qtLfOJQsB17JPe5HXTSMZkLqff00Pq6lMnu4EWR3p7dl8v46an782Gm8/vRgF7bU9FvSfUk4f97i6JN05W+jqtct5ADtlW9n62vcr6LR6y9rDOO1AQyG/3677xFnLYMNchz7LCukZf4Joqxgs0GdYGXiKYxtPJezGNwxWoaLzhXYw3vZvd0i7NT75YDg0epL36hjk1O2iFtbmNezjdQtOGN86bf/suSDdRGgvhxlQrF90TjQnb71g8U5wkqbOHfXlxdXH5WjHJYTK9m6UpwYKPeyuZgXpB14EouVDKOCLAhOVvxwNBWbvAJVaDeKcqvlhsiQumfzirLZrY/jFxmxReQFRY6ruKekaVQUF+vLaXCjYusBi37RMG+tvbrpPX3xryItZSwRa9wSehbtGCNkGeNeQrtIFGuA7LA365TzPy6wTUebx7QStRc4u2kX+gQK7Z4ddFHP/9rbFo0/m0KKjmgedoW0lfHbr/44c5dN1/GvQKkw== sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Read Secret - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + data + object + + required + + +
    +
    + anyOf + + + + +
    + + + provider + object + + required + + +
    + +
    +
    +
    +
    + + + +
    + + + provider + object + + required + + +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    + +
    + + + models + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + provider_slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + model_keys + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + header + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/refresh-metrics-preview-evaluations-metrics-refresh-post.api.mdx b/docs/docs/reference/api/refresh-metrics-preview-evaluations-metrics-refresh-post.api.mdx deleted file mode 100644 index 62e5c3cd78..0000000000 --- a/docs/docs/reference/api/refresh-metrics-preview-evaluations-metrics-refresh-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: refresh-metrics-preview-evaluations-metrics-refresh-post -title: "Refresh Metrics" -description: "Refresh Metrics" -sidebar_label: "Refresh Metrics" -hide_title: true -hide_table_of_contents: true -api: eJztWEtz20YM/isanJIZxlI9PfFUNU4mapLaYyu5aDQeiISkTZdLeh9uVQ3/ewa7fEqyYjtyTz1ptATwYT8ABMAtWFwZiGfw7h6lQytyZWAeQV6Q9v8mKcSgaanJrG8zslok5rbQdC/o71tqlZpntWyRGwsRFKgxI0uaUbagMCM26NStSCECoSCGO0d6AxFounNCUwqx1Y4iMMmaMoR4C3ZTsJqxWqgVRLDMdYYWYnDOm7HCSha4dmowSaEsowbKJKRQi/wo3hKl6QGi2lwuvcfHoRmoklBOSijnrTM3FfKuR1ZkZCxmxWn9SdHSG7Z91KlpA951SShL+h7lz3jENlakj6JPapySTzWZIleGDNs7H434JyWTaFFwTjGFLknImKWTg+tKGCJIcmVJWe9FUUiR+BQcfjOss+34WGjOYysCQpK7oLTjcOveWy8RQUpLdNJCPCojqBKbFYWlzOwbXkpfRF1OME0FO4Xyqie6x9oizyWh6rJWhbacl1F9lC++UWKPUvveOxH8xWc6UyNHx4OaLfon3TscxoJE6MRJ1K/eOyn/MLl6c+ls4exrOHTHiufHaKHWuDlOTF8XnsTqZyaTNZ4f4f+A1D/zT8LYH9L60CX31J/G0bRKvEQTWkpv0Z70jfU2mB2MvVuuSF8C5EswW4GkJOkFQC6C2Qqkpmux4dZ0op5Tk/X7xnedlq+TotRsNSg1YSdFqelqUE5nOti7J21E6BmPqNo9I18r9TICY9G6o+UfASmX8aRVkErDyZ0jRzyVaKdUODKh4fFlUEinud2R1rnmowRVQlJSCh0v2sHtJjhxyOWmoTXoHDT8v1GcrFFcYGgUzST18yNS1JkUX2gEjHrj8UvMvVE96z9rit8JQHcgndWGD9bC52poK3fi3+vsXqJTHLP5IcgHjTcTaVmy3q/n5/sD7FeUIvVKg3dcxs+fXlOyKOSRKVTmSe/pU4p2/jBPn/LgoB8tzepQHFtKjcEVtaQ/LOrJGEz56Y/CzPcK0JVc9xXc0BvYffgaF4G+YwH+MJ1e7RkMse0H9TqsuIM2hTKy65w35WbrtWuIYVgtysPOojys9olhtSjzS5/0fb0gOy0hhrW1hYmHw0TmLj3DFSmLZyiGWAhfaoYSp4XdeJXx1eQjbT4QpqR9EncEbjibQn70xZrQYCE+EjNVrYJjZ9e5Fv+GoFf74Dpolf4Ft8y9esXa2Ds3GF9NoNNRYXT2y9kIdpnrCXMhYOILocb2jyHaYaG5PzfDzFcBWMLst/YBe8bcZ6g69vYD1XOn4cDSP3ZYSBQ+yz34torhDKoYMnbnG0m7F0b15xFOzDXHP57BdrtAQ1+0LEs+Dvs0BysVBheys1HveNS8HeDVdVUErwdtF+t7+hdtuh9T2D0W8iW+BxSE+59DHqPR/VzxGPnOt4RWfM5/tGB5n6JRnVLMSdAbJwkVtqO193ZkK02lXV3eTKEsvwPl8Gne -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Refresh Metrics - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/refresh-runs-admin-evaluations-runs-refresh-post.api.mdx b/docs/docs/reference/api/refresh-runs-admin-evaluations-runs-refresh-post.api.mdx deleted file mode 100644 index a8c9e1b29c..0000000000 --- a/docs/docs/reference/api/refresh-runs-admin-evaluations-runs-refresh-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: refresh-runs-admin-evaluations-runs-refresh-post -title: "Refresh Runs" -description: "Refresh Runs" -sidebar_label: "Refresh Runs" -hide_title: true -hide_table_of_contents: true -api: eJylVMtu2zAQ/BVjz6zlBEUPOtVAAsRIixiJ24thBBtpLTElKYWkgrgG/71YUvIzQVH0ZIvcx3BmZ7fgsXKQL+H6FVWHXjbGgYBpqaWBlYCmJRtPZyXkYGltydWPtjPuETnmkfZ56XiIaRvnQUCLFjV5stxlCwY1QQ7eyqoi+yiNJ/uKCgRIAzm8dGQ3IMDSSyctlZCvUTkS4IqaNEK+BTSbu3Ws5Tct1+IaFVkQoPFN6k5D/mUiQEuTPi6C2MWaTikIKwElrbFTHvILAV56xZeLBGo0G0AFzjxBXKInLzX9D2LnrTQVCFg3VqOHHLjqp1j2PbCnAK8GDIFvLbm2MY4c97qcTPinJFdY2bIskMNDVxTk3LpTo/s+GAQUjfFkfETYtkoWUcXs2XHOdo8/hBAEfL68PC/8E5UsY9ro2trG/kNVaC3PlpcJd0kepeJ/0pN25wGqKY5uPyL1gL9hMMIqiOEMrUWWa6D0W5MAQhCgXcWVT0UaQr+Tc1ixQn3Ix6GRjNGCb8O+d/P0TIU/mpVlfFdq3ccd6L2nN7H78TOuEn3vNRtCbhaL+VnBpO2xqPfJwKP7Lq4CTb5u2Pw7Q/sacsii/bMD+2ds/6y3PwhwZF8H23dWQQ61963Ls6xQTVeOsSLjcYwyw1bGOXdUdFb6TUyZzme3tLkhLMlCvlwdBjzwFKW5OA7bSYKtvCVmqLfvtPN1Y+XvJHbv3TplMQXSrJuY3rM1jeBG0/kMBPAzEjeT8cV4AqeMHQWzAbCIBhh6x2sQJyzs3g8CSMfpB0+ov+4vGBnTrtEc1DsR6AjLjgBPbz5rFco42rHzttduCVE7bnu09G2qNyi4ElCz5PkSttsndPTDqhD4OO08FqmUDp/Uwdb7RZv31zt3YlzRoH9JO9ix+7QVf1jJeXEcxCAf40j506Kg1h9knW0grrIb6PndwwJC+AMBkmey -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Refresh Runs - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/remove-app.api.mdx b/docs/docs/reference/api/remove-app.api.mdx index ee02ea8f79..3668164323 100644 --- a/docs/docs/reference/api/remove-app.api.mdx +++ b/docs/docs/reference/api/remove-app.api.mdx @@ -5,70 +5,292 @@ description: "Remove app, all its variant." sidebar_label: "Remove App" hide_title: true hide_table_of_contents: true -api: eJytVE1v2zAM/SsCTxugJlmxk08z0AAt2mFFm+2SBgVrM7E6W1IlOlhm6L8Pkp2vZi0wYKc4/NLj4yM7YFx5yOaQW+thIaEkXzhlWRkNGdxRY9Yk0FopsK6FYi/W6BRqHj3oB527VduQZp89aCFEDBRnZyK3VrARLmWDBGPJYSx5VUIGvfkRrQUJFh02xOQiig40NgQZoLWPqgQJKqKwyBVIcPTSKkclZOxakuCLihqErAPe2Jjl2Sm9AgmsuI6GiOOqhBAWMdtboz35mHA+mcSf42bv26Ig75dtLe6GYJBQGM2kOYajtbUqUiPjZx9zuj2IEEKQ8Pn8/LTwD6xVmdLE1Dnj/qEqWBfJY9XjLolR1fFLMTX+NKA2xZEX9ebbMjF7zFGQO4vSTCtyEBZBbm3oHG4OiLwxPUAIEhq/eo/zr+Q9rgh2xd4OTWSIWfSG/dvm6ZkKPpr3PPXVPz3ELfZl9vT27L7dxkVP398e24Zczma3JwX72TbElYkCLqkmpiReriCDMVrrx10v2gASPLn1VtGtqyGDitn6bDwuatOWI1yRZhyhGqNVENXpqWid4k1KyW+vrmlzSViSg2y+OAy4j8roZ30ctqMZrbqm2PWwS3nLlXHqdz/AYaWqPiu2pfTSpPTt0iRwIr+9AgmxjV7Ek9Gn0QReH4ij4ChqLJKot28nN8hXLOz6BwnUJEUDEzZf9o6IzBrPDeqDesM9ytPpOELS7Vfqf12tgU+mXzy2Naqk/tRIN0x+HpfXg4RsOFgLCZXxHD1d94Sevrs6hGh+acnF6S4kJChPket5B6Xy8buEbIm1p3e6+nA37MNH8Ra4rQJ0HP8a6zb+Awk/abM/qmnPq624usGZFwVZPkg7OUtRhbsVuJjeTGdTCOEPDUkdnw== +api: eJytVE1v2zAM/SsCTxugJlmxk0/z1gIN2mFF1+2SBgVrM7FaW1Ylulhm+L8PlJ2vZikwYKc44iP1+PTIFhiXAZIZpM4FmGvIKWTeODa1hQRuqKpfSKFzWmFZKsNBvaA3aHl0Z+9s6pdNRZZDcmeVUgJUJycqdU5xrXzMBg21I49ScppDAv3xPToHGhx6rIjJC4sWLFYECaBz9yYHDUZYOOQCNHh6boynHBL2DWkIWUEVQtICr5xkBfbGLkEDGy7lQHhMc+i6uWQHV9tAQRJOJxP52W/2e5NlFMKiKdXNAAYNWW2ZLAscnStNFhsZPwbJabckuq7rNHw8PT0s/BNLk8c0de597f+hKjgv4rHpeefEaEr5MkxVOASUdbYXRbv6tojK7mvU6c2JsUxL8tDNO70+Q+9xtSPkVd0ThE5DFZZvaf6VQsAlwabYcWgUQ91KtNveXT88UsZ77z2LffVXD7j5tsxW3l7d422c9fL97bI15OL29vqgYP+2FXFRi4FzKokpmpcLSGCMzoVx25u2Aw2B/Mva0Y0vIYGC2YVkPM7KuslHuCTLOEIzRmfg9dClMaq+CBTEuoGyxhtexXrp9fSSVheEOXlIZvNdwHexTW+EfdjmDdCZSxJJhkFLGy5qb373rzvMW9FnSc/GLuqYvp6onttnzJ7IyoBKnz3tyejDaHKsmSFBpdfTwf2YRfeveUQY6FdybYQCDVRF6wMTVp+2AWHp6sAV2p16w+JK447ZY9RuZ+9/rbdBW6ZfPHYlmjgmsZF2sMhMpjyAhmTYbHMNRR1YIm37gIF++LLr5Pi5IS8vPdcQqTyI7rMWchPkO4dkgWWgN7p6dzMMznt1jNzaDVas8IJlI/9AwxOttts3LoRibbR2CKZZRo530g72lzhyMytn51fnt+fQdX8AGEYsLg== sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Remove app, all its variant. Arguments: - app -- App to remove +app -- App to remove - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/remove-trace.api.mdx b/docs/docs/reference/api/remove-trace.api.mdx new file mode 100644 index 0000000000..09926b99b6 --- /dev/null +++ b/docs/docs/reference/api/remove-trace.api.mdx @@ -0,0 +1,324 @@ +--- +id: remove-trace +title: "Remove Trace" +description: "Remove Trace" +sidebar_label: "Remove Trace" +hide_title: true +hide_table_of_contents: true +api: eJydVU1v2zAM/SsGTxsgJF2xk0/L2gAN2qFFm/USBIUqM7FaWVYlOVtm+L8PlGXH+eiG7WRbfCSfHj9cg+drB+kC5pYLqdewZFAatNzLUs8ySMFiUW7wyVsuEBgYbnmBHi151aB5gZBCsD7JDBhIDSkY7nNgYPGtkhYzSL2tkIETORYc0hq43t6uQgS/NRTBeUvpG9afSO1xjRaaJQMvvaIzYonJLIOGTi06U2qHjiKen53TI0MnrDREH1J4qIRA51aVSu4jGBiIUnvUPvAwRkkRbjt+ceRTD1gaS1p42WbYoHWyheyT3vF7jJCGklRtioPr7MAXAdEwUFK/upOqcGv5diiKrpTaU+Qm+DYN6xDl8wsKvyf+oqfe0RoEuJ2jCkF6gZqGwn0+P6HnI1cyC2olU2tL+/9iZui5VPQmPRbuGKBKsWf9p47ZydEqONCrbAmS7oVb/6mY39A5vkbog70PDWIkc7L+rRR0rzZ1xA1qsZO3Vff9a1y28p1K1kGu5vO7o4BtbfeLeh8mPJnHCS/Q5yVNfoYKfTvzPocUxsbiRuKPsW93RXiiG9fd9DfAwKHddMuhsgpSyL03Lh2PhSqrbMTXqD0fcTnmRsIhlUmwJhcEDW3uUFRW+m2IN7mbXeP2CnmGFtLFcgh4oD5rO2cftpslI6+RNIw7a1L5vLTyV9sOcXHlrReJJPWqDO5Rz8jtKxevqGnT9fsAzkafRmfvXSY6JJO7WRwXLsK4dDwCDNiBXL1QwACLMCvgkRdfdgZiaUrnC64H8Q7KucepF8PjTz82isswCCFzHeu8gFhn6qX4V2jf0AGjVR53/ZJBXjpPHnX9zB1+t6pp6PitQkslWzLYcCv5Mwm4qCGTjt4zSFdcOTwi1+8S+HAfR+ZjAuw06a6smmq64aqiL2DwitvhHyksg7zrmTqaJ0Kg8QPHo91FzdWPwuX0ZjqfQtP8BqNPclE= +sidebar_class_name: "delete api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Remove Trace + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
    + + links + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + + +
    + + attributes + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/remove-user-from-workspace.api.mdx b/docs/docs/reference/api/remove-user-from-workspace.api.mdx index fb62afac86..80fad58a99 100644 --- a/docs/docs/reference/api/remove-user-from-workspace.api.mdx +++ b/docs/docs/reference/api/remove-user-from-workspace.api.mdx @@ -5,71 +5,321 @@ description: "Remove a user from a workspace." sidebar_label: "Remove User From Workspace" hide_title: true hide_table_of_contents: true -api: eJzNVE1v00AQ/SurOYG0SkrFySciNagRRVQlwKGNook9ibfYXrM7DgRr/zsaf8VpaSUQB06W1m/ezLyZNzUw7jxEt/DFuq++xJhgpSEhHztTsrEFRHBDud2TQlV5cmrrbK5Qfe/xk7virpi5nY/uCqWUohxNpl54di8jtUype8AkceS9slvFKbVUbNWGlGvokzZ6oF2bZEyyuOgjj4lBgy3JoZS5SCCClmkt3Gspcz1gQUOJDnNictJuDQXmBBGM84EGI/2WyClocPStMo4SiNhVpMHHKeUIUQ18KCXWszPFDjSw4UweBg3VIoEQ9JClkaCn/1aRO/wV/7yhCWElwb60hScv+POzM/mcTu1jFcfk/bbK1E0HBg2xLZgKFjiWZWbiRr3pvZeY+lhDCCFoeH1+/pj4M2YmacLU3Dnr/oAVSicTY9PWnRBLQ1ENhin3jwGZjU/+YnH4sG3GdyqRSN29mIJpRw7CKuj+DZ3Dw0jHK9sWCEFD7nfPSf6evMcdwUD2zHREDLWUv+GY227uKeaTcd82fbWpO9zqSHOUt1X36TYuWvl+l6yHXC6X148I29nmxKkV1ySUEbcO4RQimA6e8NN67I8wFWd50ODJ7XsjVS6DCFLm0kfTaZzZKpngjgrGCZoplgZkXz3FlTN8aEJm14t3dLgkTMhBdLsaAz7KrrTTP4UNwmNp3pHo0JlrVnFqnfnZjrQzWdpGSaOm2NomvNNk1hSnZtcL0CBttGt9Nnk1OYOHt+8ELGuOcbPmfe7mN+gHKgz9g+68HwET5m+OP6Sy0nrOsRjxdaf2k1zHt3Jov4wu2Ell9dF0//OB7mbG9IOnZYam8VwjVt3t2+3xBstqRQ8ucrtyKw2p9Szout6gp08uC0Ge22sqW5UYj5tMDLbFzNMzer246bz4Uj1V4lc6jO72HrNKMM0q79EZSfTvk/YLXhzGOftiToRpzlvaO6juILM4ppJHwY+usTQwOP9ifjVfziGEX3c8vLw= +api: eJzNVE1P20AQ/SurOYFkJSnqyaemJRURVEUQygEiNNiTeMH2mt1x2tTa/16Nv+JAQWrVQ0+W1m/ezLyZNxUwrh2EN3Bt7KMrMCJYBhCTi6wuWJscQrigzGxIoSodWbWyJlOovnf40W1+m0/t2oW3uVJKUYY6VQeO7WGoFgm1DxjHlpxTZqU4oYaKjbonZWv6uInuae90PCSZH3eRu8QQgCnIopQ5jyGEhulOuO+kzLseCwEUaDEjJivtVpBjRhDCMB8EoKXfAjmBACw9ldpSDCHbkgJwUUIZQlgBbwuJdWx1voYAWHMqD72Gah6D90GfpZago38qyW7/in9W03i/lGBXmNyRE/zRZCKf/aldllFEzq3KVF20YAggMjlTzgLHokh1VKs3fnASU+1q8N77AN4fHb0k/oapjuswNbPW2D9ghcLKxFg3dcfE0lBYgWbK3EtAaqK9v5hvv67q8e1LJFK3LzpnWpMFv/RB94bW4nag45lpCgQfQObWb0n+hZzDNUFP9sZ0RAy1kL9+l9vcP1DEe+O+qftqUre45Y5mJ2+j7uttHDfy/S5ZBzlZLM5fEDazzYgTI66JKSVuHMIJhDDuPeHG1dAffizOchCAI7vpjFTaFEJImAsXjsdRasp4hGvKGUeox1hoeH5PpvVf9UmgIMvsKCqt5m3NNz2fn9L2hDAmC+HNcgi4lEVqVmMf1k8FC31KIlLrvGnJibH6ZzPv1oFJEyUq6Hxl6vBWsLa2jxg9Ui4XQfpsyp6M3o0mrzXTBqjp+bz1A0a1H7o6ahgEz+TqhYKgPRIhMGH2YfdDqiyM4wzzAV97k6/kjH6Wi3w9OHV7FVY7d/7Pl7ydH9MPHhcp6tqctVhVu5g3u2MtOxg+O93Nbi4DSIxjQVfVPTq6sqn38tycXdmwWDu8T8WJK0wdvaHXwUVr2kP1WomPtB0c+A2mpWDqtd6g1ZLo3yftlj3fDnN2xewJU9/BpHNT1UKmUUQFD4JfnG1poD8Rx7Oz2WIG3v8CS2nLSw== sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Remove a user from a workspace. Args: - email (str): The email address of the user to be removed - workspace_id (str): The ID of the workspace. +email (str): The email address of the user to be removed +workspace_id (str): The ID of the workspace. - - - - - +> - - - - - +

+ Path Parameters +

+ +
+
    + +
+
+ +
- - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/resend-invitation.api.mdx b/docs/docs/reference/api/resend-invitation.api.mdx index 7d07068c69..bfd9be5d4e 100644 --- a/docs/docs/reference/api/resend-invitation.api.mdx +++ b/docs/docs/reference/api/resend-invitation.api.mdx @@ -5,75 +5,337 @@ description: "Resend an invitation to a user to an Organization." sidebar_label: "Resend User Invitation To Organization" hide_title: true hide_table_of_contents: true -api: eJztVlFv40QQ/iureQLJ1KE6XswLASpdOKBVmgOhNIom9iTeO3vXt7tuGyz/dzS7duwkbQAJeCJPsXf2m5lv5ptxAw53FpIl3JodKvk7OqkVrCLIyKZGVv4xgTlZUplAJaR6lM5bCacFitqS8f+UGENcPagHNUdpySYPSggh3i4WdzfPKXnIRKxHDtZfC+vQ1Xad6owS8dVk8uKd2eBbaSe2ulaZ0EbkaAU9V9JQdoL05hWk33QtsDCE2V5sqNBqxzm4XFqhR1m8hPag5uRqo/q8fri//XlOttLKUiI8Ue6EJeboBOp6MoEIdEXGW80ySMB4ktfDXYigQoMlOTJcpAYUlgQJjGNcywwikFylCl0OERj6VDMXkDhTUwQ2zalESBpw+4qvW2ek2kEETrqCX4wrJ2YZtG108PWkzUdbYUr/hKNfe7DgZRUwyLpvdbbni6eQqVaOlOMjrKpCpj7G+IPltmxGHivDZDpJlp+oRFlcCuTGG7Rt1FvozQdK3VFSyw5mNVwLOvB9SPMQObQtw5iuBbx7rm7SnGjovk5TsnZbF6LvF/jrCQYvb66vz4F/wUJmoXY3xmjzN1BPaMvIdbxJR6U9Nyh0enSKan+79Z15TDT3T/dGKkc7MtCuBrLRGNyPqvGjDgFCG0Fpd5cK9xNZizuCA9iFGjMZYsGnf1Zoziu47uxGNR/oDey+nsb3gb6XnPUmPIfOAENtS3K55jlQaeu89F0OCcRjsdu4OdF+Gx8EauNmLNY29pOE4jBXIAJL5rGfJLUpIIHcucomcZwWus6ucEfK4RXKGCsJrE5LaW2k2/sr07vZO9q/JczIQLJcjQ3uuaNCjxybHcqDlXxHzFY3V6a1y7XpN043WPJwi+ngXp0Pw+HmGcuqoJG4h14Dqbbau+pYnvpExPRuBhFwykEok6svr3jsHsvnyJiFg6kXTh+nP4bohLEDVxAdAnKE5TfDAWfBtSxRjfC6Vfqe9+ZooS300f48jbIZJP3/Mv53lnHXp46eXVwVKP008kVvOi0ujxavhQiS8008yJHPz7YnK9IPH6/JVQQ5qz1ZQtNs0NJ7U7Qtv/5Uk2HZrSJ4RCNxw429bCCTlv9nkGyxsHShTT6bdwPuc/Fadr00FevyEYuanyCCj7R/4SuDh/p/6P6IOr898n70NJ3Jd8HbF37GDxBnK48jDzemKbfdRdvVaBTf3d4vIIJN93VS6ozvGHziEuJTCFdXoR3484XfNVCg2tW8pRIImPz7A8Vm9Bw= +api: eJztVlFv40QQ/iureQLJ1KE6XswLvaPSlQNSpTkQSqNoYk/tvdq7vt1122D5v6PZtWMnbQNIwBN5itcz3+x8M9+MW3CYW0hWMDc5Kvk7OqkVrCPIyKZG1v4xgQVZUplAJaR6kM5bCacFisaS8f+UmEKc3apbtUBpySa3Sggh3i+X15dPKXnIRGwmATbfCuvQNXaT6owS8c1s9qLP1RhbaSfudKMyoY0o0Ap6qqWh7AjpzStIv+lGYGkIs53YUqlVzjm4QlqhJ1m8hHarFuQao4a8friZ/7wgW2tlKRGeKHfEEnN0BHU+m0EEuibjra4ySMB4kjejL0RQo8GKHBkuUgsKK4IEtMk3MoMIJBenRldABIY+N0wBJM40FIFNC6oQkhbcrmYv64xUOUTgpCv5YG5ycZVB10V75Edt7m2NKf0T+L8OYCHKOmCQdW91tmPHY8hUK0fK8Sus61Kmnob4k+UmbCcRa8PUOUmWn6hCWZ66yKU36LposNDbT5S6g6RWPcx6dAtd77uOFuHm0HUMY/qC+/Bcy6Q9UsxNk6Zk7V1TiqE74K8nGKK8OT9/DvwLljILrXVpjDZ/A/WItoxcz5t0VNnnBqVOD96i2s3vfB8eEs39059I5SgnA916JBuNwd2kGj/qcEHoIqhsfqpwP5G1mBPswU7UmMkQS377Z4XmvELo3m5S85HewO7raXwf6Hsp2GDCU+cZYKhtRa7QrPpaW+eF7gpIIJ6OHxu3QeldvNeljdupRrvYjwuKw/CACCyZh2FcNKaEBArnapvEcVrqJjvDnJTDM5Qx1hKOB/2FfyvesSmwYi2ljZFu5/Eurq8+0O49YUYGktV6anDDXRb65tBsXzKs5QdiBvtZc9G4Qpth5/TDpgheTBH372IcGJdPWNUlTQQ/9h9Idad9qJ75Po+3mN4HWpiTkOLs7Ouz2WuJ9w7i4vqqFxamXljDnb0ZREfU7kmFaH85R1h9N77gjLjWFaoJXr9YP/IWnay3pT7Ypse3bUfJ/7+a/53V3PesoycX1yVKP6180dteqys40CpEkOz38ihXPn62VFmxfiZ5za4jKHgIJCto2y1a+mjKruPjzw0ZVt46ggc0Erfc26sWMmn5fwbJHZaWTnTHF4t+7n0pXktqUKdiaT5g2fATRHBPu/FTg0f8fxj1gDG/S4ph6LS9ybsQ7Ss/8UeIZwuQbx48LlJuspO268lgvp7fLCGCbf+tUumMfQw+cuXwMVxX16H4/DHDZy2UqPKGd1YCAZN/fwBwe++q sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/organizations/{org_id}/workspaces/{workspace_id}/invite/resend"} +> Resend an invitation to a user to an Organization. Raises: - HTTPException: _description_; status_code: 500 - HTTPException: Invitation not found or has expired; status_code: 400 - HTTPException: You already belong to this organization; status_code: 400 +HTTPException: _description_; status_code: 500 +HTTPException: Invitation not found or has expired; status_code: 400 +HTTPException: You already belong to this organization; status_code: 400 Returns: - JSONResponse: Resent invitation to user; status_code: 200 +JSONResponse: Resent invitation to user; status_code: 200 - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/reset-user-password.api.mdx b/docs/docs/reference/api/reset-user-password.api.mdx index 01ef5973a3..fcf9eaa90c 100644 --- a/docs/docs/reference/api/reset-user-password.api.mdx +++ b/docs/docs/reference/api/reset-user-password.api.mdx @@ -5,36 +5,36 @@ description: "Reset User Password" sidebar_label: "Reset User Password" hide_title: true hide_table_of_contents: true -api: eJyVVEFu2zAQ/IqwpxZgLTfoSacaaIEYaREjcXoxjGAjrS2mlMiQVFpV4N+LpWTZipMCPUkgZ3eHM0N2oA1Z9FLXywIysOTI3zeO7L1B535pW4AAgxYr8mQdZJsOaqwIMogoyfuyhgyeGrItCLD01EhLBWTeNiTA5SVVCFkHvjVc57yV9R4EeOkVL9w5ssmygBC2XO6Mrh05rriYz/lTkMutNMwSMrht8pyc2zUquRnAICDXtafaMxyNUTKPh0ofHdd0RxYhhCDg08XFeeMfqGQRy5Kv1mr7H13BWBbSy553QR6l4j/pqXLnAKXzyS7W7fUuijsVKYhxRdae9mQhbIM4rKG12J4o+U33BCEIqNz+X6J/J+dwTzA2exsaxUjWvBuOs/XDI+V+YvgmnqsfPeC2xzZHeXt13z7Gl16+14YdIJfr9eqsYe/t1NQbTnQSI7Y6JroiX2oOvNHOx4T7EjJIjdU7qSiN9+DDyRVwZJ8P+W+sggxK743L0jRXuilmuKfa4wxlikYCB9lR3ljp21iyWC2vqL0kLMhCttmeAm45RH0sprDRETTyilig4eYtGl9qK//0Xg/3r+yrWAFZ73QsH8RaRHLJYrUEAXyMXpr57ONsDi8Fm4A5/5jH/B9mx20QL1QYzw8CqIrhB09YfT5uMDOWu8L6pN/r/kwojTp4+u1To1DGgEcC3WDdBgbrYiAn5m0FlOxytoGue0BHd1aFwMv9k8X+FNLhg+IM71A5OiMwvgPw7maI+/sExOvEflI7eR6fUTWMirF4Rit5VEyBOLjGHPqyRZ6T8SdVZ+8Odxnzu7q+XUMIfwEUCfk/ +api: eJyVVMFu2zAM/RWDpw3QkqzYyael24AG3dCgTXcJgoK1mVitbKmS3M0z9O8DZceJm3bATjbER+rx8VEtaEMWvdTVIocULDnyd7Uje2fQuV/a5iDAoMWSPFkH6bqFCkuCFCJKclxWkMJTTbYBAZaeamkph9TbmgS4rKASIW3BN4bznLey2oEAL73ig1tHNlnkEMKG053RlSPHGWezGX9ycpmVhllCCjd1lpFz21ol1z0YBGS68lR5hqMxSmaxqemD45z2wCKEEAR8Ojs7LfwTlcxjWvLNWm3/oyoYy0J62fHOyaNU/Cc9le4UoHQ2imLVXG2juGORghhOZOVpRxbCJoj9GVqLzZGS33VHEIKA0u3+JfoPcg53BEOxt6FRjGTF0XC4W98/UOZHA1/Hvrqre9zmUOYgb6fu22187eR77bI95GK1Wp4U7GY7Huo1OzqJFlseHF2SLzQb3mjno8N9ASlMjdVbqWga9+DD0Qo4ss97/9dWQQqF98al02mmdJ1PcEeVxwnKKRoJL0nMYzT5wlBglzvKait9E+vNl4tLai4Ic7KQrjfHgBt2WOeZMWwYFxp5Saxev5bz2hfayj+dEfrlLLoslkdWWx3TeyV7bueYPVLFrXKfHe3Z5ONk9lYzfUIyXy76RcEsLsqeR4SBeCHXIBQIoDJuCXjC8vMhwCx5LiVWR/VeH+SI2qCJp99+ahTKuAmRQNvPeA39jKNzR1PeCCjYDuka2vYeHd1aFQIfd28bzyqXDu8Vm32LytEJgeHBgHfX/V68T0C8TuyRmtE7+oyqZlS0yDNayVdFR4j9BJlDlzbPMjL+KOvkgeIqg9GXVzcrCOEvvJsH3Q== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Reset User Password @@ -43,29 +43,254 @@ Reset User Password as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/retrieve-application-revision.api.mdx b/docs/docs/reference/api/retrieve-application-revision.api.mdx deleted file mode 100644 index 683793d6bc..0000000000 --- a/docs/docs/reference/api/retrieve-application-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: retrieve-application-revision -title: "Retrieve Application Revision" -description: "Retrieve Application Revision" -sidebar_label: "Retrieve Application Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWW1v2zYQ/ivGfdoAOU7TNt30aWnSolm7NnDS7oNhBGfpZLOlRJWk0nqG/vvAF9mSYju2awPB1nxwZOruOfO5F5LHGWgcKwgHcJbnnEWomcgUDAMQOUn77TKGECRpyeiObnEhdivpjikmMghA0teClH4p4imEM4hEpinT5rGm0PusRGbGVDShFM1TLo0dzUi1ZG8lJXYom35IIBy0Re9IWtMNET3NCUJQWrJsDGUwH8kKzqEcBqCZ5mbgk1cvA1C8GO8Kc210ywBYvA4hgETIFDWEUBQsXot4GUNZBtVrMfpMkYbF6z4lJCmLaAlIGTQIvEPJMNM/ifxRIqsw/8nk9kyu0asVnL5nuO+rTN9VEyiNviktTFIMoZYF2QGVi0w50k+Oj82/mFQkWa4t/3BdRBEplRS80/fCEOxalCJROCU/EZZpGpOszeTcSgQQU4IF1xAer4igddGzLHX358Ma2Z1PDr1j/BrANyG/JFx8O4DRvz10y2J9poeZYWtmB5iRs7B/ylpMSc0SjPYaCB6yslDoiZB7A3doZQAxatoQ1Yh2NUuX1Y8F9IUBLANISSkcr8VeB/OXVy8DSLjd+azOSKZuo0JpkS41NhKCE2brK6fqnDsEU5DVLd0hL1CvIHxDxFdzEAc6KVJcvuhsCPjGAmxYql9b1paumSlpbP4OjGNmlJBfNWvdw56rqmzDUjpqjtQnuNwWRExGBUf5y+uC8z+VyLofCp0X+ldoT9eAME3phlooJU7XUtvShXsErw9UjVbjXpA+JlLfi3dM6QdpXTXJe+rbcXTjQhEyTHcuCO/RFp7mBmI3qIsaRBlAJAk1xbeo91oIzx1s58ySVeTxIYx8dLDeSEycDmDkwsF6IxVdo+keV7uKrJdTv95VfO3VSsXW3EpF2F6tVHTNrfyXzxt2B4HrVuf9zb6QbFeUj5I5BL47AjcIE8KY5NaV/ucBdNUBtPqhw61WlDfeDYYCexzc1COPaE1+lBudLXxw7Yk3O0rMc5ZtugFqU7zNbqsyZB1vFvGdo99plwHkKDElvUNW/89jZbXy1YJS4yiSdyyiTdg1naOtYtBDl7ZrlLBx4Xrhh7B13jCwZcfsAu0x4Qf7bvvo3Pk2W2l7ds9OTu535T4hZ7Fr0LySUsjdW3IxaWR2yfWx2RbgImq83Sa3aiuGC+fFxN+JCKvtfarG94vO0kaDE1ktasno3Ji3y1hf9D8Hdl7OtJdrtI4qeh27q6dx4ehb5+I3NzdX9wCdb5tOrVq2nXr/rb+4GEpJT4S5QcqFMgZy1BMIoZebnih963EaYzTt1byvelW71Dw5dHDZbmvpYOb2WzDROldhrxdxUcRHOKZM4xGyHubMJpiiqJBMT63K2dXlW5q69R3CwbAuYFccFzhNsbnPMGdvyVDojpq+0cX+cdEQADNUuD2cpdUEcH9xJfbqO6Y5pxVXXPNt2yI03P5r8d3speBpgr89T06fdZ+/ePKi++z56Ul39DSJuifR76dPk9NTTPC03V9tXQId0lT7mmS/tsyGMkuE9UlVhqzHO2dXl1A7DMHx0ZOjY2jHaUPYlB2MbNmpHGpfQ9AKrXlQQQCU2poDmjD9Y/HC/DIT274J5/EeSotWu8GHmabvupdzZFntVOEyZgA+YyAAlzPQoF/ZSuHzxj77zBkGMDGpFw5gNhuhoo+Sl6UZ/lqQNMkx9I3skWF1MJyfRmzefKGpW6NMne7aImXEeeHSolWzTT11GmdRRLleKzusVYerD9c3EMDI3x+nIjY6Es10zWcIYK6k3UzDmRubAcdsXNh2MDhM8/cvWHmQGA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Retrieve Application Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/retrieve-evaluator-revision.api.mdx b/docs/docs/reference/api/retrieve-evaluator-revision.api.mdx deleted file mode 100644 index 0abb16dbae..0000000000 --- a/docs/docs/reference/api/retrieve-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: retrieve-evaluator-revision -title: "Retrieve Evaluator Revision" -description: "Retrieve Evaluator Revision" -sidebar_label: "Retrieve Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWW1v20YM/isGP22AHKdpm276tDRp0axvgZN2HwwjoCXKvlbSqfeS1DP034d7kWXZjmY7NlBszYfEkciH5nMkj8ebgcKxhHAAr+4w1ai4kDAMgBckUDGeX8YQgiAlGN3RLVVCt4LumGQ8hwAEfdMk1UseTyGcQcRzRbkyH7EoUhZZnN4XyXPzTEYTytB8KoSxohhJ898idGKV8+nHBMLBsuAdCWu4IaKmBUEIUgmWj6EM5k9ynaZQDgNQTKXmwWevXgYgUz3eFeba6JYBsLgNIYCEiwwVhKA1i1sRL2Moy6B6zUdfKFJQv+5TQoLyiNaAlMECfXcoGObqJ42Po7EK8J88bs9ji968zPQ9v31fW/quikBptE1JYYJiCJXQZB/IgufSUX5yfGz+xCQjwQpl2YdrHUUkZaLTTt8LQ7BrMYq4dkreDZYrGpNY8OPcSgQQU4I6VRAer42etshZTdn9rd6c5s5nh90x6xnAPRdfk5TfH8DkXx56yWLt5SG8W/LqAN44C/unq8kSCsUSjPZp4MxDVha0mnCxN3CHVgYQo6INUY1oV7FsXc2ooS8MYBlARlLiuBW7Dea9Vy8DSFLb4zyciUzeRloqnq01NuI8Jczbq6XsnDsEU4Rl3Sg9BnEe5h50ojNcv9FsCPjGAmxUnl9bztbukRkpbH4LjGNm6iqmVw1eN1i3qrI2LGWj5pNF99bbgoiJSKcofnmt0/RPyfPuR60KrX6FZWcNCFOUbaiFQuC0ldglXVihtz1MFVqNlRD9kUj9wN8xqf6V1oecXFHfjqMbF4qQY7ZzOfiAtuw0m4bdoC4WIMoAIkGoKL5FtdcyeO5gO2eWLF3EhzDyycF6IzGldAAjFw7WG6noGk33uNdVZL2c+t2u4muvViq25lYqwvZqpaJrbuW/fMKw/QO27c37814LtivKJ8EcQro7QmoQJoQxia0r/c8j50NHzuqLDrfaUd74ZTAU2CPgpivyA+3JP2Sjs8UaXHviTUeJRcHyTRugZYq36bYqQ3bhzSa+c/Q77TKAAgVmpHbI6v95rDysfFVTahaKxB2LaBN2zbRoqxj00KWdFCVsrN3U+xC2zhsGtpqRXaA9JDxqzvb4OZ0fqpV2Qvfs5GR1BvcZUxZb/zqvhOBi9wFcTAqZ3Wx9VC4LpDxqvN0mqxb2ChfItdvveIRVY5/J8Wq5WTtgcCIPi1oyOjfm7TrO62nnwPrlTHu5xsiootex+7AbF46+tgV+c3NztQLo1ra5qNWAth5HdPr15U9GasLNHVHBpYEvUE0ghF5hJqB035sPQmSvmomaTw4SXHLb0jmYufYKJkoVMuz1opTr+AjHlCs8QtbDgtl8khRpwdTUqpxdXb6lqdvOIRwMFwXsBuOipSk2Xygs2FsyvLmTpZ9qsb9dCATAjP+uZbNcmqjt17ddr75jVqS09vZq3qPV0eCarfp/0zjB0wR/e56cPus+f/HkRffZ89OT7uhpEnVPot9Pnyanp5jgKbTd7xzO0PINyH4tmc4xT7hdjWqoaNe6c3Z1CQunHjg+enJ0DMth2RA2VQYjW2WqpbSvIVgKqnk4QQCU2RIDijD7o35hvpkJZj9r83jtWbA0VfDhpei76hUpsnzh8OASZAA+QWCBcWlrgU8S+9mnyTCAiUmvcACz2QglfRJpWZrH3zQJkwlDP6IeGSIHw/lJwybJV5q6/cdU4q4tQ0Y81S4HlqqyqZhO4yyKqFCtssOFCnD18foGAhj5e+CMx0ZHoPHR/A4BzMWyst6FM/dsBinmY20HveAwzc8/W5R5+Q== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Retrieve Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/retrieve-query-revision.api.mdx b/docs/docs/reference/api/retrieve-query-revision.api.mdx deleted file mode 100644 index ff18235350..0000000000 --- a/docs/docs/reference/api/retrieve-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: retrieve-query-revision -title: "Retrieve Query Revision" -description: "Retrieve Query Revision" -sidebar_label: "Retrieve Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWV9T2zgQ/yqZfbrOGEJpS+/ydLTQKXctcIFyD5kMo9jrRK0sG0kGchl/95uVbMeOHRPS9B5u2gfqyNJvV/t/1wswbKphMIK/UlQcNYw9iBNUzPBYngUwAIVGcbzH27sU1fxW4T3XPJbggcK7FLV5FwdzGCzAj6VBaeiRJYngvsXof9WxpDXtzzBi9JQoomCI2mABBWxoD8r5RQiD0eqme1SWaG2LmScIA9BGcTmFzCtXZCoEZGMPDDeCFm7y45kHWqTTbWGu6GzmAQ+6EDwIYxUxAwNIUx50Ip4FkGVe8TqefEXfwPL1EENUKH1sAcm8XHT3THEmzU8Rbi/Cwqh/yvD5Muw4RzFlPsxlO8zjyNBFDcjoJIUQrjCAgVEp2gWdxFI7cR8eHNB/AWpf8cRYycNV6vuodZiK3jDfDN62wcePU3covwKXBqeoKnd4b3d4EGDIUmFgcNCwmi6Lqbvo7jRmRdu7cbg90p8Hu6dSx3d32fUdHDZThofM3yXzxzlkQSE1s1jtDNyhZR4EzOCGqLR1z/CozY+W0CcEmHkQodZs2ondBfM5P555EAqb5Ks4LAg4eQgTlzV7bVCaxLFAJqukCuLjhut38fPBMmHvZdiWzDSvXThsjXI0qa9U79BOC3yu/FQw9cuHVIg/dCz3LlKTpOYFtN2RG4w2PMWUYvNuwdTPwrOk+pmESSe21/B/INTz+BPX5kmxrrtk4/jzZHSdG55k0dbedM6s19Zz0XZQJxWIzANfITMY3DKz0yjy3sH2jq2w0iT4EUS+ONicSIACfwCREwebEynENdllJiqE9a5IR4W8dkqlkFZJpRDYTqkU4iqp/J+LVpt+WVcB9sBlED8QdscmiQ9Uku7Sas8dZOZBLIJdg184SIpp+Lgp9JMCPSeszAPBI94O2poYVlA+2dN0bxXgE/UWyjSi4QPTPsrArVGEzX+MO2Vg4cmipEF1z8TWHJ8VANR/rKvmmgmwgTO0hVtHP/R3aYutvWjIhUH1hKm64YwrZMueBJgMlhm1KV77Nqa2RsbEkHQrMlZQ1Vw85T4TFwWFzLZVLrNb2nnZs565kKMIKu1UyUlZ69gNmQffcL5tJPkT567bEemm6fzZBU1x06yljmsvdqh/fU5RcmPZz7yaQp/2FK7BA65vSY/VBBZHCVNcx7KivfUoeEfat3+nZA/C2Ce0j/R3Yh5kFf88jVBxfyNwbZgy+oGbmV0Mikdq0RmXdIGIGX+G9CT4N6wSurJoG9Hh0tnzLa+xSqXiRudnjBiYsYYwT7i/GQI+cm10zkX+o4JzSis0NmkDa8azYlNl1kDqtiZSuuA6z/OZxluNUnPD79vdoqWTaxZCTGPvqoSpsBIyoWlAg4/UpVsFbk3llDB6ny1Gg0RH/LzGR3ORy4Lw6yJgoj0FbMLRsRDP4sQZ2ZKT9UrN97RgLWdfozxw1hw6D7w2CpdtZpEhXsB4NTS1nNXVO406R3Ul8veM+E6YbUa3Pv9948V8FpjZweLrw8Pm6PCGCR7YwWDvVCnralvODQM0jItaTqxvELG/JmM+naQ6VPspdgzaOYqedqXayvzHbVm/1Qqjd01vnzJUupcjne+rp7RcvE66669x4sTXpdyP19eXDUCn27pSi7lyz40Th8vvUxGaWUyfsJJYE3TCzAwG0E9ocIsP/Tv3yatfzHHpyWGBBxoVNU5WZakSMICZMYke9Pu+iNNgn01RGrbPeJ8l3Pq8Rj9V3MztkePLsz9x/hGZrYFH4+qGKzIqZyb1baWGWMKpyilGFvm0kf/jdE8lL/HjTpFEyFyHy69xp48sSgQ2vq6VneDSBFxLt/xN7Rm8Ctmvb8Kj13tv3r58u/f6zdHh3uRV6O8d+r8dvQqPjljIjmDd96cfQ2T1C81uqdguIoytBoqMYPXbO748g0oLDQf7L/cPYNUGa5ttnePbkFKoz74Gb8WQShOikiKy8QQMsuj35QvijKw3YrKCt97kV8ZTuTkZfDT9RDBu44ZlYpF7wwhybwAnaW6rstIj7HPuE2MPZuRIgxEsFhOm8YsSWUbLVkVk5fk3iAlJcERhbFY4wMJV/JSbKN7u2WBTFvHN2Etx0Z049n1MTOfeccXXLy+urqmAzT9KR3FAZxSjC9LfAUCtoLJrCxBMTlM7bQeHSf/+BRfslUw= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Retrieve Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/retrieve-testset-revision.api.mdx b/docs/docs/reference/api/retrieve-testset-revision.api.mdx deleted file mode 100644 index e01acddbdd..0000000000 --- a/docs/docs/reference/api/retrieve-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: retrieve-testset-revision -title: "Retrieve Testset Revision" -description: "Retrieve Testset Revision" -sidebar_label: "Retrieve Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWdtu4zYQ/RVjnlpAjrO5baunZje7SLqXBI43L4YRjKWRza1uS1Lpuob+vRiS8lV2HMcGisJ5SBSKc0Y8HB4Oh2PQOFDgd6FDSivSCnoeZDlJ1CJLb0LwQZKWgp7oUdsuj5KehBJZCh5I+lGQ0u+ycAT+GIIs1ZRqfsQ8j0VgUFrfVZZymwqGlCA/5ZJ9aEGK/5sCR8Y0Hd1G4HcXuz2RNG7nuuhRTuCD0lKkAyi9SUtaxDGUPQ+00DE3PDjz0gMVF4NtYe7ZtvRAhOsQPIgymaAGH4pChGsRb0IoS696nfW/U6Bh+rpNEUlKA6oBYTNH3hNKgemBxFeRWIX2gcWXs7jGzolL27HbdorStuoBJduylAhJIfhaFmQaVJ6lyhJ+cnzMf0JSgRS5NtzDfREEpFRUxI226wzetiIUZIU1coMQqaYByZlRvDc9PAgpwiLW4B/XRM66qFlcqrubN0dw48EiN3gePdi9n3n8ajy7H4fFR6lFhMEuHVw6yMpDoYeZ3Bm4RSs9CFHThqjctalFUremptBXDFh6kJBSOFiLvQ7mizMvPYhis/OvjtYhKrPlB+jW4JLDfpbFhOlaj9eoGp0JSulZWInBazEtxAaq89EMtFb2E9I4/xUYhoLlAuO7OTI2ILsSjDlPSX++ZXZ49b4gEDIoYpS/fCzi+E+Vpc3bQueF/hUWh8ogQlOyoRVKiaO1xC7YwhK562NLo7FYiqv/Eqlfs89C6WdpXTXIJfOXcdSxoQgpJluv4a9otGJ+L9wO6moGovQgkISawkfUO9Wu9xa2cWnIKvJwH06+WVjnJKSY9uDkysI6JxVd/dEON6iKrHcjt0VVfO3US8XWxEtF2E69VHRNvPyf02az6eNz6R9vg48iXJA/J+LPf8LmUl7tuY2bUFW5Ws1OPvFcn6nuK7PbLfb9BPegYAcF26uC7VozarLwjbOlmlS5Ur/ei7KSKkM+pG4bpG6HM8MezgzLW+eB1K1JvWIynzsYcy6wVUKx0Zm7qvTZT3lNrfC1lUZXFixNjfHs5GS5iviAsQhNjbDxQcpMbl9CDEmjiPlpRVoVZ8Hc25cEc29xsqaD/pzZDzTypAZ1iWRNAch2Wd3VkNHo8Ns6xqf12q4Zl3Xt+s2VDCt6Lburh3Fl6Vs3vdedzt0SoJ3b+UmtSsyNKu9sTy+tEtLDjG+28kwxeI56CD60cq7h0t8tl/yqVlXT5ScLB5y6Sj7GmFkrZAw+DLXOld9qBXFWhEc4oFTjEYoW5sKsIEVBIYUeGZPLu5tPNLomDEmC3+3NdrjnuLKRMt9tMkmYi0/EnNkCgqs4in/s9HsgeOxDa8WkcMS2p3d0H35iksdUc+c2OZlN48Aesab/c+oDpxH+dh5dnDXP37552zw7vzhp9k+joHkS/H5xGl1cYIQXsPpWal9uFu9tduuH8740ygxtVanXzHLj8u4GZo61cHz05ugYFoNxrjNrCwZGW6pJNK/BWwinSSCBB5QYYQFNmPwxfcFfxkGcYDqDty72F4pGLqw0/dStPEZhJMR8xtgtiy64ZQETtpVZ/W5pmGe3OHoeDHlJ+V0Yj/uo6JuMy5KbfxQkOf577lKizyR2WdKG1UoYw180MrcsRnubRni4e1zYyF/QYdZIa3EZBJTrtX17M6v+7va+Ax703Z11koVsI5FHyL99AL4C12Z0/ti2jSHGdFCY0jtYTP75F1m4qb0= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Retrieve Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/retrieve-workflow-revision.api.mdx b/docs/docs/reference/api/retrieve-workflow-revision.api.mdx deleted file mode 100644 index cedbe84963..0000000000 --- a/docs/docs/reference/api/retrieve-workflow-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: retrieve-workflow-revision -title: "Retrieve Workflow Revision" -description: "Retrieve Workflow Revision" -sidebar_label: "Retrieve Workflow Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWdtu20YQ/RVhnlqAshwncVo+1bGdxk2aGIrjPgiCMSKH0iZLLrMXJ6rAfy/2Qt3FSrIMBG38IFPLmTOaM7Ozu7MT0DhUEPfgLyE/Z1x8VdCPQJQkUTNRXKUQgyQtGd3T3dcgcyfpnikmCohA0hdDSr8U6RjiCSSi0FRo+4hlyVniYDqflCjsmEpGlKN9KqU1ohkp+20OOXO6xfh9BnFvWe6epLO7IKLHJUEMSktWDKGKpiOF4RyqfgSaaW4HboN6FYHiZrgvzAerW0XA0iaECDIhc9QQgzEsbUS8SqGqovq1GHyiRMPsdZcyklQktAakimbs3aNkWOgfLD6IxTq7f9C4O40NenWF6QZ6u6GsdH0Fgcoq23LCJKUQa2nIDahSFMozfnJ8bP+lpBLJSu3Ihw8mSUipzPBWNwhDtG8hSoTxSsELVmgakpxz49xJRJBShoZriI/X5U5T3qxM18OFrua4deuhWzaWERze0CL+1KNH8MRbQKlZhskhXTgLkLUFo0dCHgzco1URpKhpS1Qr2tYsXzezZtAXFrCKICelcNiI3QTzZ1CvIsi42wRszlim7hKjtMjXGhsIwQmL5pqiWucewZYqdUf3yA3qDYRviXg5BfGgI5Pj+nK8JeBrB7BNEXvlKFu7juSkcfFHYJoyW32QXy/QukXY6vqzYCkfLI7Me7feFiRMJoaj/OmV4fwPJYr2e6NLo3+GZV8tCNOUb6mFUuK4kdclXVhhtzlLNTqNlQz9nkh9J94ypf+V1k1OrqjvxtGNT0UoMN+7GrxDV3UWl9b9oC7mIKoIEkmoKb1DfdAqeO5hW2eOLFOmj2Hko4cNRlLi9AhGLjxsMFLTNRgfcKmryXo5DotdzddBrdRsTa3UhB3USk3X1Mp/eRvutg/YtDQfznsj2b4oHyXzCHx/BG4RRoQpyZ0r/Y9z2aZzWf1D+zutKK9DGCwF7qC0bUS+ozX5u9zo7BCDD4F4u6PEsmTFthugZYp32W3Vhlzg7SK+d/Z77SqCEiXmpPeY1f/zXNmsfD2j1AaK5D1LaBt2bU9lpxwM0JXrp2RsaHxb+DFsnS8Y2KWRdIHujPCQXtSDW1mh71S5Jtazk5PVNtUtcpY651qXUgq5f48qJY3MrbQhJZcFuEgW3u4ypeYWCp/FM6/figTrXX2uhqu1Zm1zwYtsFnVktG7s23WUzxqCPeeXNx3kFhpSNb2e3c1uXHj6muL7+ubmegXQx3YxqHUPszVtV3VnVyM56ZGwFyhDsuAl6hHE0Cltj5C+duqmmerUTUP75PHAT2tXNHsTv7GCkdalijudhAuTHuGQCo1HyDpYMjeTFCVGMj12KmfXV29o7BdyiHv9eQG3tPhUWRSbRglL9oYsaf5MGdpZ7G8f/wiYdd5v1hyRNmW7s5ugy2+Yl5zW3exMN2ezTPC7rNl3u2OCpxn+8jw7fdZ+/uLJi/az56cn7cHTLGmfJL+ePs1OTzHDU2i4+3g0O8u3A4c1ZDeMRSZcKOpWogt06+z6CuYOO3B89OToGJYTckHY1hdMXH2p4+heQ7SUUdNcgggod8UFNGH+2+yF/WWlUDp02AJeY/4v9RJCamn6pjslR1bMHRn83OhBmBsw41u5GhDmh3sOM6QfwUgobbUmkwEq+ih5VdnhL4aknQT90PgeWBp7/enxws2PzzT2i46twG1Xfqw4Nz79l6qxrZRe4yxJqNSNsv25qf/75Q1EMAi3o7lIrYpE66H9jAHsbat2zsUTPzYBjsXQuN4ueEj79w/32iiE -sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Retrieve Workflow Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/revert-deployment-revision.api.mdx b/docs/docs/reference/api/revert-deployment-revision.api.mdx index 67030f54d3..3f46e90baf 100644 --- a/docs/docs/reference/api/revert-deployment-revision.api.mdx +++ b/docs/docs/reference/api/revert-deployment-revision.api.mdx @@ -5,36 +5,36 @@ description: "Revert Deployment Revision" sidebar_label: "Revert Deployment Revision" hide_title: true hide_table_of_contents: true -api: eJyVVMGO2jAQ/ZXonVrJInTVU05F3UqLttUilvaC0MqbDMTbxPbaDiqN/O+VnRBggZV6ItgzzzPvzZsWjm8ssiW+KrkWG4sVg9JkuBNKTgtkMLQl454K0pXa1STdk6GtsEJJMGhueE2OTMBoIXlNyHAh9kkUYBASGTR3JRgMvTbCUIHMmYYYbF5SzZG1cDsdUKwzQm7A4ISrwsHtAJvMe9hkWsD7VUCzWklLNgDcjMfhpyCbG6FDJ8jw2OQ5WbtuqmTeB4MhV9KRdCGca12JPDaevtiQ0x6K8t57hs83N+fAv3glipiWfDNGmf9AhTaBbCe6ugtyXFThSziq7XlApfKTWy53D+vI/Clnng0nQjrakIFfebY/48bw3RGx31VXIDxDbTfvafCDrOUbwgB2PTSSkSzCrT+8rZ5fKHcn+i9jX93TfdzqAHOgt2P3ehu3HX2XHtuH3C0WszPATttTUedx6pMLIxcKJVeq4A2trIsucCUypHnnofQw/2l72Qs+7WwFBktmu/dPYypkKJ3TNkvTvFJNMeIbko6PuEi5FgizbilvjHC7mDKZTe9pd0e8IINsuToOeAxz1k3OadggGtfingKHvXMnjSuVEX+7cegNW3ZZgSQh1yqm93xOYnHJZDYFQ2ijY288+jQa4y2nJ8HBIjyPFtm/Ha/B3rAw9A8GqqM/4IjXXw4XobIgRc3lEd67Ep5UNtDh6I9LdcVFtEKso+3VXaJXNybvIcGQXd12vcQrhjLMSbZE2z5zSz9N5X04fm3IBBVXDFtuBH8OnC5bFMKG7wLZmleWzqod1gs+zHsXfUzALnexV1oGmbe8asI/MPym3fVVHbdFuR+qtg+e5DlpdwRzttzC9A3umD08LuD9P7GdNUc= +api: eJyVVNFu2jAU/ZXoPm2SRVi1pzyNtZOKuqmIdntBqHKTC3Gb2J59g8Yi//t0nRCgQKU9Eezj43PPvcctkFx7yBZwbfRKrT0sBRiLTpIyelpABg436OipQFuZbY2anhxulFdGgwArnayR0DFHC1rWCBmcwT6pAgQoDRlYSSUIcPi7UQ4LyMg1KMDnJdYSshZoa5nFk1N6DQJIUcULNwNtMu9pk2kBISyZzVujPXomuBqP+adAnztluRLI4KHJc/R+1VTJvAeDgNxoQk0Ml9ZWKo+Fpy+ez7R7USGEIODz1dUp8S9ZqSIeS745Z9x/sIJ1bDapTneBJFXFX4qw9qeAyuRHu1Jv71fR+WPPghhWlCZco4OwDGK3Jp2T2wNjv5tOIAQBtV+/14Mf6L1cIwxkl6HRjOSRd8P+bvP8gjkd9X8R6+qu7nHLPc3e3s7dy2XcdPadu2wHuX18nJ0Qdr09buo8Tn1yZuRYKFJpOBvWeIopoBIySPMuQ+l+/tP2fBZC2sUKBHh0m11+GldBBiWR9Vma5pVpipFcoyY5kiqVVsFbnZO4m1wzFDgIHvPGKdpGvslseofbW5QFOsgWy0PAAw9hN1bHsKGj0qo7ZIP7WE8aKo1Tf7tZ6dNcdqfYQaVXJh7vze61fZX5K2qOP9fZyR6PPo3Gl4rpDyST2bTPksxjlnY6IgzEG7sGo0AA1jFIQCjrL/sNVsk9q6U+4Hu310cKB2sI/1BqK6liZqKOth+DBfRjEA/vKEFAdvFZ7GdhKaDkgcoW0LbP0uNPV4XAy78bdNzRpYCNdEo+s7+LFgrl+buAbCUrjydqh3cIPsz7uH1MQJyvYtd1zS3fyKrhfyDgFbeX3/T4rJS7AWt78CTP0dIBzckryJM4xGh2//AIIfwDxTZD1g== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Revert Deployment Revision @@ -43,29 +43,254 @@ Revert Deployment Revision as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/sidebar.ts b/docs/docs/reference/api/sidebar.ts index 81c2a464b9..7e7a7c372e 100644 --- a/docs/docs/reference/api/sidebar.ts +++ b/docs/docs/reference/api/sidebar.ts @@ -4,7 +4,7 @@ const sidebar: SidebarsConfig = { apisidebar: [ { type: "doc", - id: "reference/api/agenta-api", + id: "reference/api/agenta-backend", }, { type: "category", @@ -128,339 +128,51 @@ const sidebar: SidebarsConfig = { }, { type: "doc", - id: "reference/api/fetch-evaluation-status", - label: "Fetch Evaluation Status", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/fetch-legacy-evaluation-results", - label: "Fetch Evaluation Results", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/fetch-legacy-evaluation-scenarios", - label: "Fetch Evaluation Scenarios", - className: "api-method get", + id: "reference/api/create-evaluation", + label: "Create Evaluation", + className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-legacy-evaluations", + id: "reference/api/fetch-list-evaluations-evaluations-get", label: "Fetch List Evaluations", className: "api-method get", }, { type: "doc", - id: "reference/api/delete-legacy-evaluations", + id: "reference/api/delete-evaluations", label: "Delete Evaluations", className: "api-method delete", }, { type: "doc", - id: "reference/api/fetch-legacy-evaluation", - label: "Fetch Evaluation", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/fetch-legacy-evaluation-scenarios-comparison-results", - label: "Fetch Evaluation Scenarios Comparison Results", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/start-evaluation", - label: "Start Evaluation", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/refresh-runs-admin-evaluations-runs-refresh-post", - label: "Refresh Runs", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-runs-preview-evaluations-runs-post", - label: "Create Runs", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/delete-runs-preview-evaluations-runs-delete", - label: "Delete Runs", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/edit-runs-preview-evaluations-runs-patch", - label: "Edit Runs", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/query-runs-preview-evaluations-runs-query-post", - label: "Query Runs", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/close-runs-preview-evaluations-runs-close-post", - label: "Close Runs", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/open-runs-preview-evaluations-runs-open-post", - label: "Open Runs", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-run-preview-evaluations-runs-run-id-get", - label: "Fetch Run", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-run-preview-evaluations-runs-run-id-patch", - label: "Edit Run", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/delete-run-preview-evaluations-runs-run-id-delete", - label: "Delete Run", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/close-run-preview-evaluations-runs-run-id-close-post", - label: "Close Run", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/open-run-preview-evaluations-runs-run-id-open-post", - label: "Open Run", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-scenarios-preview-evaluations-scenarios-post", - label: "Create Scenarios", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/delete-scenarios-preview-evaluations-scenarios-delete", - label: "Delete Scenarios", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/edit-scenarios-preview-evaluations-scenarios-patch", - label: "Edit Scenarios", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/query-scenarios-preview-evaluations-scenarios-query-post", - label: "Query Scenarios", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-scenario-preview-evaluations-scenarios-scenario-id-get", - label: "Fetch Scenario", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-scenario-preview-evaluations-scenarios-scenario-id-patch", - label: "Edit Scenario", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/delete-scenario-preview-evaluations-scenarios-scenario-id-delete", - label: "Delete Scenario", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/create-results-preview-evaluations-results-post", - label: "Create Results", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/delete-results-preview-evaluations-results-delete", - label: "Delete Results", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/edit-results-preview-evaluations-results-patch", - label: "Edit Results", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/query-results-preview-evaluations-results-query-post", - label: "Query Results", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-result-preview-evaluations-results-result-id-get", - label: "Fetch Result", + id: "reference/api/fetch-evaluation-status", + label: "Fetch Evaluation Status", className: "api-method get", }, { type: "doc", - id: "reference/api/edit-result-preview-evaluations-results-result-id-patch", - label: "Edit Result", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/delete-result-preview-evaluations-results-result-id-delete", - label: "Delete Result", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/refresh-metrics-preview-evaluations-metrics-refresh-post", - label: "Refresh Metrics", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-metrics-preview-evaluations-metrics-post", - label: "Create Metrics", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/delete-metrics-preview-evaluations-metrics-delete", - label: "Delete Metrics", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/edit-metrics-preview-evaluations-metrics-patch", - label: "Edit Metrics", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/query-metrics-preview-evaluations-metrics-query-post", - label: "Query Metrics", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-queues-preview-evaluations-queues-post", - label: "Create Queues", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/delete-queues-preview-evaluations-queues-delete", - label: "Delete Queues", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/edit-queues-preview-evaluations-queues-patch", - label: "Edit Queues", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/query-queues-preview-evaluations-queues-query-post", - label: "Query Queues", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-queue-preview-evaluations-queues-queue-id-get", - label: "Fetch Queue", + id: "reference/api/fetch-evaluation-results", + label: "Fetch Evaluation Results", className: "api-method get", }, { type: "doc", - id: "reference/api/edit-queue-preview-evaluations-queues-queue-id-patch", - label: "Edit Queue", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/delete-queue-preview-evaluations-queues-queue-id-delete", - label: "Delete Queue", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/fetch-queue-scenarios-preview-evaluations-queues-queue-id-scenarios-get", - label: "Fetch Queue Scenarios", + id: "reference/api/fetch-evaluation-scenarios", + label: "Fetch Evaluation Scenarios", className: "api-method get", }, { type: "doc", - id: "reference/api/create-evaluation-preview-simple-evaluations-post", - label: "Create Evaluation", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-evaluation-preview-simple-evaluations-evaluation-id-get", + id: "reference/api/fetch-evaluation", label: "Fetch Evaluation", className: "api-method get", }, { type: "doc", - id: "reference/api/edit-evaluation-preview-simple-evaluations-evaluation-id-patch", - label: "Edit Evaluation", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/delete-evaluation-preview-simple-evaluations-evaluation-id-delete", - label: "Delete Evaluation", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/query-evaluations-preview-simple-evaluations-query-post", - label: "Query Evaluations", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/start-evaluation-preview-simple-evaluations-evaluation-id-start-post", - label: "Start Evaluation", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/stop-evaluation-preview-simple-evaluations-evaluation-id-stop-post", - label: "Stop Evaluation", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/close-evaluation-preview-simple-evaluations-evaluation-id-close-post", - label: "Close Evaluation", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/open-evaluation-preview-simple-evaluations-evaluation-id-open-post", - label: "Open Evaluation", - className: "api-method post", + id: "reference/api/fetch-evaluation-scenarios-evaluations-evaluation-scenarios-comparison-results-get", + label: "Fetch Evaluation Scenarios", + className: "api-method get", }, ], }, @@ -472,180 +184,6 @@ const sidebar: SidebarsConfig = { id: "reference/api/evaluators", }, items: [ - { - type: "doc", - id: "reference/api/create-evaluator", - label: "Create Evaluator", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-evaluator", - label: "Fetch Evaluator", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-evaluator", - label: "Edit Evaluator", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-evaluator", - label: "Archive Evaluator", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/unarchive-evaluator", - label: "Unarchive Evaluator", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-evaluators", - label: "Query Evaluators", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-evaluator-variant", - label: "Create Evaluator Variant", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-evaluator-variant", - label: "Fetch Evaluator Variant", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-evaluator-variant", - label: "Edit Evaluator Variant", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-evaluator-variant", - label: "Archive Evaluator Variant", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/unarchive-evaluator-variant", - label: "Unarchive Evaluator Variant", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-evaluator-variants", - label: "Query Evaluator Variants", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fork-evaluator-variant", - label: "Fork Evaluator Variant", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/retrieve-evaluator-revision", - label: "Retrieve Evaluator Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-evaluator-revision", - label: "Create Evaluator Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-evaluator-revision", - label: "Fetch Evaluator Revision", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-evaluator-revision", - label: "Edit Evaluator Revision", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-evaluator-revision", - label: "Archive Evaluator Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/unarchive-evaluator-revision", - label: "Unarchive Evaluator Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-evaluator-revisions", - label: "Query Evaluator Revisions", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/commit-evaluator-revision", - label: "Commit Evaluator Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/log-evaluator-revisions", - label: "Log Evaluator Revisions", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-simple-evaluator", - label: "Create Simple Evaluator", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-simple-evaluator", - label: "Fetch Simple Evaluator", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-simple-evaluator", - label: "Edit Simple Evaluator", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-simple-evaluator", - label: "Archive Simple Evaluator", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/unarchive-simple-evaluator", - label: "Unarchive Simple Evaluator", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-simple-evaluators", - label: "Query Simple Evaluators", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/transfer-simple-evaluator", - label: "Transfer Simple Evaluator", - className: "api-method post", - }, { type: "doc", id: "reference/api/get-evaluators-endpoint-evaluators-get", @@ -728,12 +266,6 @@ const sidebar: SidebarsConfig = { label: "List Apps", className: "api-method get", }, - { - type: "doc", - id: "reference/api/create-app", - label: "Read App", - className: "api-method get", - }, { type: "doc", id: "reference/api/update-app", @@ -852,230 +384,110 @@ const sidebar: SidebarsConfig = { items: [ { type: "doc", - id: "reference/api/create-testset", - label: "Create Testset", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-testset", - label: "Fetch Testset", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-testset", - label: "Edit Testset", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-testset", - label: "Archive Testset", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/unarchive-testset", - label: "Unarchive Testset", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-testsets", - label: "Query Testsets", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-testset-variant", - label: "Create Testset Variant", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-testset-variant", - label: "Fetch Testset Variant", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-testset-variant", - label: "Edit Testset Variant", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-testset-variant", - label: "Archive Testset Variant", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/unarchive-testset-variant", - label: "Unarchive Testset Variant", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/query-testset-variants", - label: "Query Testset Variants", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/retrieve-testset-revision", - label: "Retrieve Testset Revision", + id: "reference/api/upload-file", + label: "Upload File", className: "api-method post", }, { type: "doc", - id: "reference/api/create-testset-revision", - label: "Create Testset Revision", + id: "reference/api/import-testset", + label: "Import Testset", className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-testset-revision", - label: "Fetch Testset Revision", + id: "reference/api/get-testsets", + label: "Get Testsets", className: "api-method get", }, { type: "doc", - id: "reference/api/edit-testset-revision", - label: "Edit Testset Revision", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/archive-testset-revision", - label: "Archive Testset Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/unarchive-testset-revision", - label: "Unarchive Testset Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-testset-revisions", - label: "Query Testset Revisions", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/commit-testset-revision", - label: "Commit Testset Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/log-testset-revisions", - label: "Log Testset Revisions", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-simple-testset", - label: "Create Simple Testset", + id: "reference/api/create-testset", + label: "Create Testset", className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-simple-testset", - label: "Fetch Simple Testset", - className: "api-method get", + id: "reference/api/delete-testsets", + label: "Delete Testsets", + className: "api-method delete", }, { type: "doc", - id: "reference/api/edit-simple-testset", - label: "Edit Simple Testset", + id: "reference/api/update-testset", + label: "Update Testset", className: "api-method put", }, { type: "doc", - id: "reference/api/archive-simple-testset", - label: "Archive Simple Testset", - className: "api-method post", + id: "reference/api/get-single-testset", + label: "Get Single Testset", + className: "api-method get", }, { type: "doc", - id: "reference/api/unarchive-simple-testset", - label: "Unarchive Simple Testset", - className: "api-method post", + id: "reference/api/list-testsets", + label: "Query Testsets", + className: "api-method get", }, { type: "doc", - id: "reference/api/query-simple-testsets", - label: "Query Simple Testsets", + id: "reference/api/create-testset", + label: "Create Testset", className: "api-method post", }, { type: "doc", - id: "reference/api/create-simple-testset-from-file", - label: "Create Simple Testset From File", - className: "api-method post", + id: "reference/api/fetch-testset", + label: "Fetch Testset", + className: "api-method get", }, { type: "doc", - id: "reference/api/edit-simple-testset-from-file", - label: "Edit Simple Testset From File", - className: "api-method post", + id: "reference/api/edit-testset", + label: "Edit Testset", + className: "api-method put", }, { type: "doc", - id: "reference/api/fetch-simple-testset-to-file", - label: "Fetch Simple Testset To File", + id: "reference/api/archive-testset", + label: "Archive Testset", className: "api-method post", }, { type: "doc", - id: "reference/api/transfer-simple-testset", - label: "Transfer Simple Testset", + id: "reference/api/unarchive-testset", + label: "Unarchive Testset", className: "api-method post", }, { type: "doc", - id: "reference/api/upload-file", - label: "Upload File", + id: "reference/api/query-testsets", + label: "Query Testsets", className: "api-method post", }, { type: "doc", - id: "reference/api/import-testset", - label: "Import Testset", + id: "reference/api/create-testset-from-file", + label: "Create Testset From File", className: "api-method post", }, { type: "doc", - id: "reference/api/get-testsets", - label: "Get Testsets", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/create-testset", - label: "Create Testset", + id: "reference/api/update-testset-from-file", + label: "Update Testset From File", className: "api-method post", }, { type: "doc", - id: "reference/api/delete-testsets", - label: "Delete Testsets", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/update-testset", - label: "Update Testset", - className: "api-method put", + id: "reference/api/fetch-testset-to-file", + label: "Fetch Testset To File", + className: "api-method post", }, { type: "doc", - id: "reference/api/get-single-testset", - label: "Get Single Testset", + id: "reference/api/fetch-testcase", + label: "Fetch Testcase", className: "api-method get", }, ], @@ -1141,7 +553,8 @@ const sidebar: SidebarsConfig = { { type: "doc", id: "reference/api/query-traces", - label: "Query traces, with optional grouping, windowing, filtering, and pagination.", + label: + "Query traces, with optional grouping, windowing, filtering, and pagination.", className: "api-method get", }, { @@ -1153,7 +566,8 @@ const sidebar: SidebarsConfig = { { type: "doc", id: "reference/api/query-analytics", - label: "Query analytics, with optional grouping, windowing, filtering.", + label: + "Query analytics, with optional grouping, windowing, filtering.", className: "api-method get", }, { @@ -1210,92 +624,20 @@ const sidebar: SidebarsConfig = { }, { type: "category", - label: "Billing", + label: "Admin", items: [ { type: "doc", - id: "reference/api/handle-events", - label: "Handle Events", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-portal", - label: "Create Portal User Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-checkout", - label: "Create Checkout User Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-plans", - label: "Fetch Plan User Route", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/switch-plans", - label: "Switch Plans User Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-subscription", - label: "Fetch Subscription User Route", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/cancel-plan", - label: "Cancel Subscription User Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-usage", - label: "Fetch Usage User Route", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/admin-create-portal", - label: "Create Portal Admin Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/admin-create-checkout", - label: "Create Checkout Admin Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/admin-switch-plans", - label: "Switch Plans Admin Route", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/admin-cancel-subscription", - label: "Cancel Subscription Admin Route", + id: "reference/api/create-accounts", + label: "Create Accounts", className: "api-method post", }, { type: "doc", - id: "reference/api/admin-report-usage", - label: "Report Usage", + id: "reference/api/create-account", + label: "Create Account", className: "api-method post", }, - ], - }, - { - type: "category", - label: "Admin", - items: [ { type: "doc", id: "reference/api/admin-create-portal", @@ -1326,24 +668,6 @@ const sidebar: SidebarsConfig = { label: "Report Usage", className: "api-method post", }, - { - type: "doc", - id: "reference/api/refresh-runs-admin-evaluations-runs-refresh-post", - label: "Refresh Runs", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-accounts", - label: "Create Accounts", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/create-account", - label: "Create Account", - className: "api-method post", - }, ], }, { @@ -1384,385 +708,283 @@ const sidebar: SidebarsConfig = { }, { type: "category", - label: "Secrets", - items: [ - { - type: "doc", - id: "reference/api/list-secrets", - label: "List Secrets", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/create-secret", - label: "Create Secret", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/read-secret", - label: "Read Secret", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/update-secret", - label: "Update Secret", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/delete-secret", - label: "Delete Secret", - className: "api-method delete", - }, - ], - }, - { - type: "category", - label: "Tracing", + label: "Billing", items: [ { type: "doc", - id: "reference/api/create-trace", - label: "Create Trace", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-trace", - label: "Fetch Trace", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-trace", - label: "Edit Trace", - className: "api-method put", - }, - { - type: "doc", - id: "reference/api/delete-trace", - label: "Delete Trace", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/ingest-spans", - label: "Ingest Spans", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/ingest-spans-rpc", - label: "Ingest Spans", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/query-spans-rpc", - label: "Query Spans", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-analytics", - label: "Fetch Legacy Analytics", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/fetch-new-analytics", - label: "Fetch Analytics", + id: "reference/api/handle-events", + label: "Handle Events", className: "api-method post", }, - ], - }, - { - type: "category", - label: "Invocations", - items: [ { type: "doc", - id: "reference/api/create-invocation", - label: "Create Invocation", + id: "reference/api/create-portal", + label: "Create Portal User Route", className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-invocation-by-trace-id", - label: "Fetch Invocation", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-invocation-by-trace-id", - label: "Edit Invocation", - className: "api-method patch", - }, - { - type: "doc", - id: "reference/api/delete-invocation-by-trace-id", - label: "Delete Invocation", - className: "api-method delete", - }, - { - type: "doc", - id: "reference/api/fetch-invocation", - label: "Fetch Invocation", - className: "api-method get", - }, - { - type: "doc", - id: "reference/api/edit-invocation", - label: "Edit Invocation", - className: "api-method patch", + id: "reference/api/create-checkout", + label: "Create Checkout User Route", + className: "api-method post", }, { type: "doc", - id: "reference/api/delete-invocation", - label: "Delete Invocation", - className: "api-method delete", + id: "reference/api/fetch-plans", + label: "Fetch Plan User Route", + className: "api-method get", }, { type: "doc", - id: "reference/api/query-invocations", - label: "Query Invocations", + id: "reference/api/switch-plans", + label: "Switch Plans User Route", className: "api-method post", }, - ], - }, - { - type: "category", - label: "Annotations", - items: [ { type: "doc", - id: "reference/api/create-annotation", - label: "Create Annotation", - className: "api-method post", + id: "reference/api/fetch-subscription", + label: "Fetch Subscription User Route", + className: "api-method get", }, { type: "doc", - id: "reference/api/fetch-annotation-by-trace-id", - label: "Fetch Annotation", - className: "api-method get", + id: "reference/api/cancel-plan", + label: "Cancel Subscription User Route", + className: "api-method post", }, { type: "doc", - id: "reference/api/edit-annotation-by-trace-id", - label: "Edit Annotation", - className: "api-method patch", + id: "reference/api/fetch-usage", + label: "Fetch Usage User Route", + className: "api-method get", }, { type: "doc", - id: "reference/api/delete-annotation-by-trace-id", - label: "Delete Annotation", - className: "api-method delete", + id: "reference/api/admin-create-portal", + label: "Create Portal Admin Route", + className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-annotation", - label: "Fetch Annotation", - className: "api-method get", + id: "reference/api/admin-create-checkout", + label: "Create Checkout Admin Route", + className: "api-method post", }, { type: "doc", - id: "reference/api/edit-annotation", - label: "Edit Annotation", - className: "api-method patch", + id: "reference/api/admin-switch-plans", + label: "Switch Plans Admin Route", + className: "api-method post", }, { type: "doc", - id: "reference/api/delete-annotation", - label: "Delete Annotation", - className: "api-method delete", + id: "reference/api/admin-cancel-subscription", + label: "Cancel Subscription Admin Route", + className: "api-method post", }, { type: "doc", - id: "reference/api/query-annotations", - label: "Query Annotations", + id: "reference/api/admin-report-usage", + label: "Report Usage", className: "api-method post", }, ], }, { type: "category", - label: "Testcases", + label: "Access Control", items: [ { type: "doc", - id: "reference/api/fetch-testcase-preview-testcases-testcase-id-get", - label: "Fetch Testcase", + id: "reference/api/verify-permissions", + label: "Verify Permissions", className: "api-method get", }, + ], + }, + { + type: "category", + label: "Scopes", + items: [ { type: "doc", - id: "reference/api/query-testcases-preview-testcases-query-post", - label: "Query Testcases", - className: "api-method post", + id: "reference/api/get-projects", + label: "Get Projects", + className: "api-method get", }, ], }, { type: "category", - label: "Queries", + label: "Api Keys", items: [ { type: "doc", - id: "reference/api/create-query", - label: "Create Query", - className: "api-method post", + id: "reference/api/list-api-keys", + label: "List Api Keys", + className: "api-method get", }, { type: "doc", - id: "reference/api/fetch-query", - label: "Fetch Query", - className: "api-method get", + id: "reference/api/create-api-key", + label: "Create Api Key", + className: "api-method post", }, { type: "doc", - id: "reference/api/edit-query", - label: "Edit Query", - className: "api-method put", + id: "reference/api/delete-api-key", + label: "Delete Api Key", + className: "api-method delete", }, + ], + }, + { + type: "category", + label: "Workspace", + items: [ { type: "doc", - id: "reference/api/archive-query", - label: "Archive Query", - className: "api-method post", + id: "reference/api/get-workspace", + label: "Get Workspace", + className: "api-method get", }, { type: "doc", - id: "reference/api/unarchive-query", - label: "Unarchive Query", - className: "api-method post", + id: "reference/api/get-all-workspace-roles", + label: "Get All Workspace Roles", + className: "api-method get", }, { type: "doc", - id: "reference/api/query-queries", - label: "Query Queries", - className: "api-method post", + id: "reference/api/remove-user-from-workspace", + label: "Remove User From Workspace", + className: "api-method delete", }, + ], + }, + { + type: "category", + label: "Tracing", + items: [ { type: "doc", - id: "reference/api/retrieve-query-revision", - label: "Retrieve Query Revision", - className: "api-method post", + id: "reference/api/edit-trace", + label: "Edit Trace", + className: "api-method put", }, { type: "doc", - id: "reference/api/create-query-revision", - label: "Create Query Revision", + id: "reference/api/add-trace", + label: "Add Trace", className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-query-revision", - label: "Fetch Query Revision", + id: "reference/api/fetch-trace", + label: "Fetch Trace", className: "api-method get", }, { type: "doc", - id: "reference/api/edit-query-revision", - label: "Edit Query Revision", - className: "api-method put", + id: "reference/api/remove-trace", + label: "Remove Trace", + className: "api-method delete", }, { type: "doc", - id: "reference/api/archive-query-revision", - label: "Archive Query Revision", + id: "reference/api/ingest-spans", + label: "Ingest Spans", className: "api-method post", }, { type: "doc", - id: "reference/api/unarchive-query-revision", - label: "Unarchive Query Revision", - className: "api-method post", + id: "reference/api/query-spans", + label: "Query Spans", + className: "api-method get", }, { type: "doc", - id: "reference/api/query-query-revisions", - label: "Query Query Revisions", + id: "reference/api/ingest-spans-rpc", + label: "Ingest Spans", className: "api-method post", }, { type: "doc", - id: "reference/api/commit-query-revision", - label: "Commit Query Revision", + id: "reference/api/query-spans-rpc", + label: "Query Spans", className: "api-method post", }, + ], + }, + { + type: "category", + label: "Evals", + items: [ { type: "doc", - id: "reference/api/log-query-revisions", - label: "Log Query Revisions", - className: "api-method post", + id: "reference/api/list-evaluators", + label: "Query Evaluators", + className: "api-method get", }, { type: "doc", - id: "reference/api/create-simple-query", - label: "Create Simple Query", + id: "reference/api/create-evaluator", + label: "Create Evaluator", className: "api-method post", }, { type: "doc", - id: "reference/api/fetch-simple-query", - label: "Fetch Simple Query", + id: "reference/api/fetch-evaluator", + label: "Fetch Evaluator", className: "api-method get", }, { type: "doc", - id: "reference/api/edit-simple-query", - label: "Edit Simple Query", + id: "reference/api/edit-evaluator", + label: "Edit Evaluator", className: "api-method put", }, { type: "doc", - id: "reference/api/archive-simple-query", - label: "Archive Simple Query", + id: "reference/api/archive-evaluator", + label: "Archive Evaluator", className: "api-method post", }, { type: "doc", - id: "reference/api/unarchive-simple-query", - label: "Unarchive Simple Query", + id: "reference/api/unarchive-evaluator", + label: "Unarchive Evaluator", className: "api-method post", }, { type: "doc", - id: "reference/api/query-simple-queries", - label: "Query Simple Queries", + id: "reference/api/query-evaluators", + label: "Query Evaluators", className: "api-method post", }, - ], - }, - { - type: "category", - label: "Applications", - items: [ { type: "doc", - id: "reference/api/retrieve-application-revision", - label: "Retrieve Application Revision", + id: "reference/api/create-annotation", + label: "Create Annotation", className: "api-method post", }, { type: "doc", - id: "reference/api/create-legacy-application", - label: "Create Application", - className: "api-method post", + id: "reference/api/fetch-annotation", + label: "Fetch Annotation", + className: "api-method get", }, { type: "doc", - id: "reference/api/fetch-legacy-application", - label: "Fetch Application", - className: "api-method get", + id: "reference/api/delete-annotation", + label: "Delete Annotation", + className: "api-method delete", }, { type: "doc", - id: "reference/api/edit-legacy-application", - label: "Update Application", - className: "api-method put", + id: "reference/api/query-annotations", + label: "Query Annotations", + className: "api-method post", }, ], }, @@ -1776,6 +998,12 @@ const sidebar: SidebarsConfig = { label: "Create Workflow", className: "api-method post", }, + { + type: "doc", + id: "reference/api/list-workflows", + label: "Query Workflows", + className: "api-method get", + }, { type: "doc", id: "reference/api/fetch-workflow", @@ -1812,6 +1040,12 @@ const sidebar: SidebarsConfig = { label: "Create Workflow Variant", className: "api-method post", }, + { + type: "doc", + id: "reference/api/list-workflow-variants", + label: "Query Workflow Variants", + className: "api-method get", + }, { type: "doc", id: "reference/api/fetch-workflow-variant", @@ -1844,15 +1078,15 @@ const sidebar: SidebarsConfig = { }, { type: "doc", - id: "reference/api/fork-workflow-variant", - label: "Fork Workflow Variant", + id: "reference/api/commit-workflow-revision-by-variant-id", + label: "Commit Workflow Revision", className: "api-method post", }, { type: "doc", - id: "reference/api/retrieve-workflow-revision", - label: "Retrieve Workflow Revision", - className: "api-method get", + id: "reference/api/fork-workflow-variant", + label: "Fork Workflow Variant", + className: "api-method post", }, { type: "doc", @@ -1860,6 +1094,12 @@ const sidebar: SidebarsConfig = { label: "Create Workflow Revision", className: "api-method post", }, + { + type: "doc", + id: "reference/api/list-workflow-revisions", + label: "Query Workflow Revisions", + className: "api-method get", + }, { type: "doc", id: "reference/api/fetch-workflow-revision", @@ -1892,98 +1132,56 @@ const sidebar: SidebarsConfig = { }, { type: "doc", - id: "reference/api/commit-workflow-revision", - label: "Commit Workflow Revision", - className: "api-method post", - }, - { - type: "doc", - id: "reference/api/log-workflow-revisions", - label: "Log Workflow Revisions", + id: "reference/api/fork-workflow-variant-by-revision-id", + label: "Fork Workflow Variant", className: "api-method post", }, { type: "doc", - id: "reference/api/invoke-workflow", - label: "Invoke Workflow", + id: "reference/api/commit-workflow-revision", + label: "Commit Workflow Revision", className: "api-method post", }, { type: "doc", - id: "reference/api/inspect-workflow", - label: "Inspect Workflow", + id: "reference/api/log-workflow-revisions", + label: "Log Workflow Revisions", className: "api-method post", }, ], }, { type: "category", - label: "Access Control", - items: [ - { - type: "doc", - id: "reference/api/verify-permissions", - label: "Verify Permissions", - className: "api-method get", - }, - ], - }, - { - type: "category", - label: "Scopes", - items: [ - { - type: "doc", - id: "reference/api/get-projects", - label: "Get Projects", - className: "api-method get", - }, - ], - }, - { - type: "category", - label: "Api Keys", + label: "Vault", items: [ { type: "doc", - id: "reference/api/list-api-keys", - label: "List Api Keys", + id: "reference/api/list-secrets", + label: "List Secrets", className: "api-method get", }, { type: "doc", - id: "reference/api/create-api-key", - label: "Create Api Key", + id: "reference/api/create-secret", + label: "Create Secret", className: "api-method post", }, { type: "doc", - id: "reference/api/delete-api-key", - label: "Delete Api Key", - className: "api-method delete", - }, - ], - }, - { - type: "category", - label: "Workspace", - items: [ - { - type: "doc", - id: "reference/api/get-workspace", - label: "Get Workspace", + id: "reference/api/read-secret", + label: "Read Secret", className: "api-method get", }, { type: "doc", - id: "reference/api/get-all-workspace-roles", - label: "Get All Workspace Roles", - className: "api-method get", + id: "reference/api/update-secret", + label: "Update Secret", + className: "api-method put", }, { type: "doc", - id: "reference/api/remove-user-from-workspace", - label: "Remove User From Workspace", + id: "reference/api/delete-secret", + label: "Delete Secret", className: "api-method delete", }, ], diff --git a/docs/docs/reference/api/start-evaluation-preview-simple-evaluations-evaluation-id-start-post.api.mdx b/docs/docs/reference/api/start-evaluation-preview-simple-evaluations-evaluation-id-start-post.api.mdx deleted file mode 100644 index 50eb4f7319..0000000000 --- a/docs/docs/reference/api/start-evaluation-preview-simple-evaluations-evaluation-id-start-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: start-evaluation-preview-simple-evaluations-evaluation-id-start-post -title: "Start Evaluation" -description: "Start Evaluation" -sidebar_label: "Start Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJzlWEtvG0cM/isCTwmwsVyjpz1VtR3Ejdu4lpKLIAjULiVNOvvwPNSqwv73gjO72pek2LEDFPDJ1i75kfzI5XC4A4MrDeEUrjcoLRqRpRpmAWQ5KffrJoYQtEFl5rQXmeeKNoL+nmuR5JIab/S8KSbi+dzr5pk2EECOChMypNjmDlJMCEJoaUAAIoUQcjRrCEDRgxWKYgiNshSAjtaUIIQ7MNucnG9KpCsIYJmpBA2EYK1DMcJIFqgjG9zEUBQzBtV5lmrSjHNxfs5/YtKREjnLQQhjG0Wk9dLKwX0pDAFEWWooNSyOeS5F5GCHXzXr7Bq+5YoJNMJbiDLrlUqXRWpoRarh46WTCCCmJVppIDwvggYtzmC6/bR0rLXBl9Jl8LiA0PNIZpopbAqVviyyTBKmUAT7R6mVEpimyrsbPbj0CEXAcFJs6Dlgt6zvoTAyzwQbeYSiCCqpbPGVInOwAu5t+t7x1QctAkjIYNsVjGPBeijvWpz2nC2rsAFbJbllKVm0nzRjPGwLIqEiK1G9eW+l/E1n6btP1uTWvIVuwAwiDCWP1EKlcHuS3Y4u9Cg+pfw7k8kavfL8P5H6R3YrtPkmrceC7Kk/jaOJL8WyDz6Kgb4LrFsE7f71fVBXDYgigEgRGornaE4BNhpvjIbeGeH8OW7l0sMORo4sm8c/wshnD1saiUnSDzBy5WFLIxVdiy2fYo+z446qx5D169YdXjVfL2qlYmtvpSLsRa1UdO2tvBy0x9uQ0s8o/y+lOseP3ZOgfaZqg8aebFoBUGoTnqxySmP/5MGSJR5NlE1T/0j7OYODRSGt4imDlMoUP4owjUhKimF26DAbeycOHmUPltR2rg3lHS/LA+LbZPePiWN9+1jgkdUmSyCAtU0whQDQmgzYu5LMLfcuP8QcMf6IHvonRzoYu0hZkbTRZF5F6BMfax18Yyh9FQSM6nhrEsqxOVOvgoLrKtqaAEU5oTncnQ4OUB3I+1L/1Eg9dhe/uhddoZv2ep3oCRDPVN9f04qC1X6+uOjf6r6gFLEvl2tust9/pYvJoJDuelVVVFtAZlHr7VOG21m3/Oqob7OoIgsSvTpUf/UArjWuqC6n46KOjMGE3x6ivL6DT11c3nQp1zxA9/R6do+HceXpO5XfD5PJXQ/Q57ZzVecFw6BRR+4it854cbFfO5g1hDAs1xZDv7YYNtYWw11rCVEM3dqCD2hSm2pdYZWEENbG5DocDiOZ2fgMV5QaPEMxxFy4z0hTZJUwW6cyurv5SNsPhDEpCKezpsCYa8tXS1tsnyjMxUdi3spFyciadabEv1WcblGy9lpMjEiXmVOv+qNzbjC6u4HGdATnZz+dnUOXx5YwfxYYuc+isu1eQ9BhYR8/d77EfRNgCJNf6hfsGSeCu2CNdyBtnStMSYKhf8wwlyhc0TvruzKjUygzyolyOYXm2oRnqLC7XPKJnQWw5toIp7DbLVDTZyWLgh+7yYlTFcAGlcAFMzndQSw0/x9DuESpqeftvpHAm/vye3k7qC+T7Siq/KacXHaQf0EAf9G2tw9z7WBdVdCulBlFEeWmod3rXlxq+w/h7tN4AkXxH7y/2xw= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Start Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/start-evaluation.api.mdx b/docs/docs/reference/api/start-evaluation.api.mdx deleted file mode 100644 index a97eeac985..0000000000 --- a/docs/docs/reference/api/start-evaluation.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: start-evaluation -title: "Start Evaluation" -description: "Start Evaluation" -sidebar_label: "Start Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJzNWUtv2zgQ/isCT7uAGrvBnnxa51HUm6QJ7LQXwxBoaWyzS5EqH0lcQ/99MaRkS7ItO64LbC9NqJlvyJmPw5nJihg616Q3JrcvlFtqmBSaTEIiM1Dut0FCekQbqkwEaxESEgU/LGhzJZMl6a1ILIUBYfBHmmWcxU6u811LgWs6XkBK8adMIbRhoPE3QVNwOmL5OCO98YqYZQbOomJiTvJwvSIs5ySfhMQww3HhC+rmuJMXpnHfEUscKDOQuh+aWOUCVYouyQZpWCIEg0SjXHFSqXQUSzFj89Nwb9cwwXUBg8KgjQYTsWQba6P77KWCQeLOSA1EnKXMbPtwSk28iDT7CRU8JgzMQVUAr1AsGKFYHpKUvkUKjCow9mo90LdgWMg5Xxu1jBLgdNmqhirL4MbJ5SFxCtEUzCuAiNyGD9h1qsGV1wiuCo1842s5/Q6xKYjIFCRI4oor6kes73zfhirkur9/GFoxpAbundfzkMRSKYhNRIV+BRXFkttUnEreaw8W9B1YcO3BDp2vTvWdPK3xq0ac6tWB1819J3meV80YZcEt6EwK7eN02e3ifwnoWLHMafXIyMYxaD2zPBgWwiQ8NRPE0nqlvZS4dhIYuxm13JBeF3dpRf1u1lFnnPq7u4lRXYDpKOZSQ7IzkFMpOVDRGsmBDq49Qh4iHGcvu1PakWD3qO+haGx+EazvEXbxqpGkmBRDKz45f22DYsYAQ+tboUnCUI/yp5pPj7gPZXRrltJpfaV6xt22SMxUbDlVf3yynP+jpfjwaE1mzZ+keWAEKUhyjJZP5W3ebeiSLRe3KT+gM1Fji57/J6d+kfdMm4Nu3ftAN9Xf56NnT8Wz1Ai1xHUa1E0FAl8DBdRAElHTBhiSmVQpypCEGvhgmNtPy7vgYYO+c5bNkt9h5KuHLYwkwOE3GLnxsIWR0l3TZVH3HGHHWpYc5ayrZVEmlf46q5XSW2srpcPOaqV019rK+aA93gso/Qv0/1ao5yF2A8a2JqWQgLApViwZiMSv/LBgwZUkVgi/pH0BgYehjFuF5QMoJRUuxVTEwDkk1cJl81iN/CZ2bXldIKytY9Bo8/mqFwLaQNY4056a4l+o1r5bhfsdLDd5br9jmMCEGBImXmRcNlVUCGn8L9VEiBB5SKRicybaQGOrjUxJSBY2pQ7QGlmFevQQrrybgQIRF6/LnlenfvIzUojb+akwI9Q9+wVpqZCGpau2368dQu7NctE9H50OtAUIsfOSDK24oYaODGQDUX+ADxc4A3+GY4wXEmuK1uh1aGfv2tTIXVPH3wxo08VthVADaFjoV9LFR9cXZxkTzaJsT+g2LWAjpEy09vZ3+L1S2eyT89XLIf8jWIHV5uoHf7Ky0wxdxjs1u2XULNrEnvD7ccxxUEds3FPlAGQRkeJwR6C+i3wPJTmO7qfQ0q526lj9tqEVdr4V9o6PR9Xrdj13vf9fl5fb3f03ylniNIJbfJNPb+0TMJTxli6dy7j29T29zmS/h+7LhxXvtZ638fUBtKZzaHu4155EZwT+TT7ARjyXN13IVR/DtXu9d/cf48a7ry26n5+fn7YAfWwbIxsc5Aa31UFuCmYhccibSW3K+9gjnc20V3cyHDzBa8fNgfF2gcJawIXIKk56ZGFMpnudTsylTS7oHIShF5R1aMbcFdIQW8XM0qn0nwZ3sPwMNAHliFsRGCGJPC3qYuuI0Izduczh0yfpW7OQiv0sD4QlEll4LfQA0nO4mVbfvtE047CZPm9C3Jgkj8svk90T4er36lC3Algb21YHtd3GCLbbmK129w5Nu/tHkZWJNBMz6XxWMKTvIhL0nwak0gqQ7sXHiy5psqQmjJeexqbiL/+ZhI3Qr4OOBWnqbjwxQNO/Nx8wHEgzLE43eDtI2ejXi8gbeDOdjFNfwTrrq4KvY1LhK7LYM9a9BMjZSUgWyO/emKxWU6rhq+J5jss/LCik5SQkL1QxOkV/jTGtLEqCFq8iufb578OzL3bQoCdkIxdinvIa/TiGzLTKTipX8Olx9ExCMi3+qJLKBHUUfXVceiU9gjVW5g/ZW/m1FeFUzC2mrx7xmPjvP3mE4JE= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Start Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/stop-evaluation-preview-simple-evaluations-evaluation-id-stop-post.api.mdx b/docs/docs/reference/api/stop-evaluation-preview-simple-evaluations-evaluation-id-stop-post.api.mdx deleted file mode 100644 index 1769729b39..0000000000 --- a/docs/docs/reference/api/stop-evaluation-preview-simple-evaluations-evaluation-id-stop-post.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: stop-evaluation-preview-simple-evaluations-evaluation-id-stop-post -title: "Stop Evaluation" -description: "Stop Evaluation" -sidebar_label: "Stop Evaluation" -hide_title: true -hide_table_of_contents: true -api: eJzlWN1v20YM/1cMPrWAGmfBnvQ0L0nRrNmaxW5fDMM4S7R93Ul3uQ9vnqH/feCdZH3ZbtKkwIA8JZbIH8kfKR6PO7BsZSCewvWGCccsl7mBWQRSofa/blKIwVip5riXmCuNG45/zw3PlMDGGzNvivF0PveqShoLESimWYYWNVncQc4yhBhaChABzyEGxewaItD44LjGFGKrHUZgkjVmDOId2K1C75nm+QoiWEqdMQsxOOdRLLeCBOq4BjcpFMWMQI2SuUFDOBfn5/QnRZNorkgOYhi7JEFjlk4M7kthiCCRucXckjhTSvDEww6/GtLZNXxTmuizPFhIpAtKpcs8t7hC3fDx0ktEkOKSOWEhPi+iBi3eYL79tPSstcGXwufvuAA380RIQxQ2hUpfFlIKZDkU0f5R7oQAoqny7sYMLgNCERGc4Bt8Dtgt6Qcolthngo0CQlFElZRcfMXEHqyAe5e/93z1QYsIMrSs7QpLU056TNy1OO05W1ZhA7ZKcstStmg/acZ42BYkXCdOMP3mvRPiNyPzd5+cVc6+hW7ABMItZo/UYlqz7Ul2O7rQo/iU8u9EJmn0yvP/ROof8pYb+01ajwXZU38aR5NQimUffBQDfRdIt4ja/ev7oK4aEEUEiUZmMZ0zewqw0XhTZvGd5d6f41YuA+xg5MlyKv0RRj4H2NJIigJ/gJGrAFsaqehabOkUe5wdf1Q9hqxft/7wqvl6USsVW3srFWEvaqWia2/l5aAD3ga1eUb5fynVKX7WPQnaZ6qxzLqTTSsCzF1Gc5XCPA1PHhw6pNFEuzwPj0yYMyhYxoXTNGWg1lLTo4TlCQqBKcwOHWbj4MTBo+zBod7OjUXV8bI8IL5Ndv+YONa3jwWeOGNlBhGsXcZyiIA5K4G8K8ncUu8KQ8wR44/ooX9SpIOxj5QU0ViD9lWEPgmx1sE3htJXQcCojrcmoRybpX4VFFxX0dYEaFTI7OHudHCA6kDel/qnRuqxv/fVveiK+Wmv14meAPFM9f01rShI7eeLi/6t7gsTPA3lck1N9vuvdClaxoW/XlUV1RYQMmm9fcpwO+uWXx31rUwqsiAzq0P1Vw/gxrAV1uV0XNSTMZjQ20OU13fwqY8rmC7lmgfont7A7vEwrgJ9p/L7YTK56wGG3Hau6laqQaOM/D1uLWlrsd862DXEMCyXFsOwtBg2lhbDXWsHUQxpaUHHM+pNtaxwWkAMa2uViYfDREiXnrEV5padMT5kivuPyGDiNLdbrzK6u/mI2w/IUtQQT2dNgTFVVqiVttg+TUzxj0islWuSkbNrqfm/VZh+TbIOWkQLz5fSq1fd0Ts3GN3dQGM2gvOzn87OoctiS5g+Cpb4j6Ky7V9D1GFhHz/1vcx/EWCRZb/UL8gzygP1wBqvn7TO/aXkwOI/dqgE477ivfFdmc8plPmkPPmMQnNnQgNU3N0s+bTOIlhTYcRT2O0WzOBnLYqCHvupiRIVwYZpzhbE43QHKTf0fwrxkgmDPWf3TQTe3JffyttBfZFsB1FlN6fUkn/0CyL4C7e9XZhvBeuqfnalzChJUNmGdq9zUaHtv4K7T+MJFMV/lc/YrA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Stop Evaluation - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/switch-plans.api.mdx b/docs/docs/reference/api/switch-plans.api.mdx index 27be9b4a6b..53b013edf2 100644 --- a/docs/docs/reference/api/switch-plans.api.mdx +++ b/docs/docs/reference/api/switch-plans.api.mdx @@ -5,36 +5,33 @@ description: "Switch Plans User Route" sidebar_label: "Switch Plans User Route" hide_title: true hide_table_of_contents: true -api: eJyVVMFu2zAM/RWDpw0QkqzYyadl2IAW3dCgTXcJgoC2mVidLKmSnDUL9O8DZcdJmvawUxyJpB7fe+QeAm485Av4KpWSegNLAcaSwyCNvqkgB/9HhrJeWYXagwCLDhsK5DhrDxobghz4FgRIDTk8t+R2IMDRcysdVZAH15IAX9bUIOR7CDvLST44flEA6bZhDKUybbXaTla1KQouMRxYZ07/Fq2Xmrw/PavbBrUMu5XC4uzi5eIEN6QDrlByt0EGxWhm3EKMSwburdGePGO9mkz4pyJfOmmZFcjhoS1L8n7dquy+D+b6RgfSgcPRWiXLROL4yXPO/th/jDEK+Hx1dVn4FypZpbTsu3PG/UdVsI6FC7LDXVFAqfhLBmr8ZYAy5dkt6t3dOml6Lk8Uw4nUgTbkIC6jOJyhc8hSHWj8YTqAEAU0fvOW3IfQn+Q9bgiGYu+HJjKyOd/G49umeKIynFltkfrqnu7jTjQ+0tux+34b3zr63nrsEHI9n88uCnbavnJLmqCMDeazR08uuzdtYMc0FGrDQ2aND2m4Qg05jItuGMdp6MbdBIIAT257GLzWKcihDsH6fDxO1h51vh6hHKOVwFb2VLZOhl1Kmc5ubml3TViRg3yxPA14YBt1xjgPGzRBK2+JKepHftqG2jj5t1O7n/26y2IOpF6blN7TNU3gsunsBgRwGx05k9Gn0QReU3YWzBOAZZqAw9vpGsQrFob+eac0yf4QCJsvxwtGxmQ3qE/qva/QGayBi0AvgcWRyeYJxL4XbwG9eCxnvzN7AZcCatY5X8B+X6CnR6di5ONuZbJGlfRYKHbyGpWnCwDDNoAP973pP2Yg3gb2m3bH3bxF1XJI8sUWneR3kg3EQTYG0OVMy5JsOMm6WD1cZbDv7O5hDjH+A+mQJqo= +api: eJyVVE1vGjEQ/SurObWSBTTqaU+lH1KitApKSC8IoWF3YJ147Y3tpaHI/70ae1kghENPLPZ8PM97b3bgce0gn8FXqZTUa5gLMA1Z9NLomxJycH+kL6pFo1A7ENCgxZo8Wc7agcaaIAe+BQFSQw4vLdktCLD00kpLJeTetiTAFRXVCPkO/LbhJOctdxRAuq0ZQ6FMWy42o0Vllksu0R801hz/rdoatfTbhcKlO754PTvBNWmPC5T8Mi+94s4ThhvCnEG6xmhHjnFdjUb8U5IrrGx4ApDDQ1sU5NyqVdl9F8z1jfakPYdj0yhZxIENnxzn7A5vDSEEAZ+vrs4L/0Yly5iW/bDW2P+oCo1lkrxMuEvyKBV/SU+1Ow9Qpji5Rb29W0X+TqkIoj+R2tOaLIR5EPsztBaZlv0Yf5oEEIKA2q3fo3Yf+oucwzVBX+xyaBxGNuXbcOhtlk9U+BNZzeK7Uusu7ojjw3jTdC8/43sa33vN9iHX0+nkrGDi9o1aolsyFpjLHh3Z7N60nhVTk68MG6oxzkcj+QpyGC6T8YbRYMPkNhDgyG72Jmutghwq7xuXD4dR2oOk6wHKITYS3sIYx9vsG4cC69xR0Vrpt7HeeHJzS9trwpIs5LP5ccADayyp5jSsJwwbeUs8v87749ZXxsq/SQrdEqhSFg9I6pWJ6d0sO2xfsXgmXYIAfmeCPRp8GowuPaZLyMaTm84qWESr7HHEMBBvxtUPihdNHX0CnrD+crhglMxKjfqo3mUqT+D1c/H06plFGf0QQew6lmfQscy8d4u0Y3ouoGJB5DPY7Zbo6NGqEPg47VHmq5QOl4olv0Ll6AxAvzbgw33njo8ZiPeBPdP2sLA3qFoOiRrZoJXcJ0pC7ClkAClnXBTU+KOssx3FVXqdT+4ephDCPyc0LeI= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Switch Plans User Route @@ -43,29 +40,264 @@ Switch Plans User Route as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/testsets.tag.mdx b/docs/docs/reference/api/testsets.tag.mdx index 3d904ab06b..e36855ca64 100644 --- a/docs/docs/reference/api/testsets.tag.mdx +++ b/docs/docs/reference/api/testsets.tag.mdx @@ -5,16 +5,9 @@ description: "Testsets" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/transfer-simple-evaluator.api.mdx b/docs/docs/reference/api/transfer-simple-evaluator.api.mdx deleted file mode 100644 index d10b738e8a..0000000000 --- a/docs/docs/reference/api/transfer-simple-evaluator.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: transfer-simple-evaluator -title: "Transfer Simple Evaluator" -description: "Transfer Simple Evaluator" -sidebar_label: "Transfer Simple Evaluator" -hide_title: true -hide_table_of_contents: true -api: eJzNWEtvGkkQ/iuoTonUMY61pzktayeyk+wa2TgXhKxipoDO9jzSD++yaP571I8ZZhjDArYlTnGYqq+qv6rueqxA41xBNIZPTygM6lwqmDDIC5KoeZ7dJBCBlpipGclHxdNC0CNVssCgQIkpaZIWZQUZpgQR1BKPPAEGPIMICtQLYCDpp+GSEoi0NMRAxQtKEaIV6GVhdZWWPJsDg1kuU9QQgTEORXMtrEDtau8mgbKcWExV5JkiZWEuzs/tPwmpWPLCHgIiuDdxTErNjOjdBWFgEOeZpkxbcSwKwWN35v4PZXVWDdcKaRnR3FuIc+OVgsc80zQn2XDx0kkwSGiGRmiIzku2JsXZy5a3M0dZG3smXEC2C3D1GBul87QtFFyZ5rkgzKBk9U+ZEQIsS5VzN6p36RFKZuG2+HUYYh2UALowKWYvAbx2AGXJKqF8+oNi3SD53mVjbfizY66LWjJISWPbF0wSbmONYthit+NtyMYGbBXtlqV02v6lecjnbUHMZWwEynefjRBfVJ59uDW6MPo9bB7ZgnBN6Z5aKCUud9K7oQsdkncp/2nJtBqdRD0lUv/Kv3Gl/5fWbYfsqB/G0cinYngO92Kg64LVLVn7ITsO6qoBUTKIJaGm5BH1LsDGA5ygpg+aO3+2W7n0sL2BI8sUyVsYefCwwUhCgt7AyJWHDUYquqZLW832s+NK1j5k/bF0VWzN16taqdiqrVSEvaqViq7aihJmfmyu3ltdW0Nezb1wctysAe26+kRSveCKfQ/qNpKSH4vyILlHEMcjCIuwIExcT3bY+/xWlJxeQuzoK+5oRpKyuPVGVI5ODqoD1yEMZdXn7huRE6qkJ9meHBCD+0C87QOxKHi2b9uySfEhPVJlyAXelt6js99rl+1J61S7rpPMle3KwzWlNlAkn3hM+7DrR9cDcjBAl27mnPG58eP1W9i6bBk4YIC6QtfYd+an/RFepl0P5mVptX67uOjO8d9R8MSdrPdJSreBOHKIT0gjd2U25OOmgMjj1tdD7lOjSvgUXh/6Wx5j1Yinav7c4mM9aSmFc1rn9HZRR0ZvZL8+x/h66TJ25/Kmg1yzZNf0ena3H+PK07crvNej0bAD6GPbDuoo7Jd6PiEauwQ3ui9yu4QqcqXdvkkvIIJ+IemJ0z99v5Lq1zsM1V81l09lv1pegb/g1aLKtViw0LpQUb8fi9wkZzinTOMZ8j4W3N0pRbGRXC+dymB485WWvqRDNJ40BVyR8XnTFqtDhgX/SpbBsCIbGL3IJf/PJ0PYkfm2zbHKs1nu1AObA+dcbzC8AbbuzOD87OPZOWwy2hK2FwRjd0Eq2+4zsA0W6vMDA0rd7QBNmP6+/mA9s5EIy52AtyuAG+NrYEPTv7pfCORZo9/1sR1DiK2NmMODxu5MAYNoY71Yh3jCYGHTJBrDajVFRQ9SlKX9+achaaM4YfCEkuPUcjpeQcKV/TuBaIZCUcfd+nGBd3fhDr3vretT+xhVpDMbZuui/R8w+JuWmztR90IsqlRaBZFBHFOhG8qdB83mXH0lhrf3IyjLX5NDe8s= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Transfer Simple Evaluator - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/transfer-simple-testset.api.mdx b/docs/docs/reference/api/transfer-simple-testset.api.mdx deleted file mode 100644 index e655dac986..0000000000 --- a/docs/docs/reference/api/transfer-simple-testset.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: transfer-simple-testset -title: "Transfer Simple Testset" -description: "Transfer Simple Testset" -sidebar_label: "Transfer Simple Testset" -hide_title: true -hide_table_of_contents: true -api: eJztWN9v20YM/lcMPrXANc6CPelpXrMiabsliN29GEZAS7R93elH707ZPEP/e8G7kyxZceKkDtCHPMWRyI/kRx6P4gYsLg1EU5iQsYasgZmAvCCNVubZZQIRWI2ZWZC+NTItFN1aLwkCCtSYkiXNCBvIMCWW9+9vZQICZAYRFGhXIEDTt1JqSiCyuiQBJl5RihBtwK4L1jRWy2wJAha5TtFCBGXpUKy0igWCk4PLBKpqxoimyDNDhkHOTk/5T0Im1rJg9yGCcRnHZMyiVIObIAwC4jyzlFkWx6JQMnbRDr8a1tm0HCs0c2GltxDnpVcK/srM0pJ0y8H3TkJAQgsslYXotBI1Ic5atr5aOLK6yAvl0rBfYIXGER9jiHYrGJyZ57kizKASzaOsVAqYp9q9CzSDSYNSCQ+rMf5RTA9RcbBeLJ9/pdj2U/fBBdrHqwSkZLHrBSaJ5MSguu6Q0fMzFE4Ltk5Nx1I67z5ph3e/LYiljkuF+s2HUqmPJs/eXZW2KO1b2A2VQaSl9EAt1BrXDxK7ows9ch9S/pPJZI1eXf1MpP6Vf5bGPkrrviB76k/jaOJLMfStgxjou8C6leh2nedBnbcgKgGxJrSU3KJ9CLDVKxO09M5K589+K+897GDkyCqL5CWMfPGwwUhCil7AyLmHDUZquuZrvngOs+Nul0PI+n3trpwtX0e1UrPVWKkJO6qVmq7GilHl8rm1OmbdSsDx3AuR4+4d0L0G6yvwViY7TSu03sddOLwB1zfl4DJxfWLP/dtY7rsaxqAjUdSefgQcF3vc4L72nde+86J959g9457Z+eAZ554Bt+5+syfNEvVc+zpwHTBwvU76LzDp96/OV1KfTeo5k/nY5yzPAs8aKA76Ur6hO2lknnlX+h/MDyCM3aIm4PyIbrMyqSrW+fXsrL9h+RuVTNz+ZPCH1rl+/nolIYtS8a89I5XK487bpxTybDdR25A/595B15rM8r4hcnvYjMFlK+v7RR0Zgwm/vY/v7TJs6uLypoNcq2a29Hp294dx7ul7KLkXk8l1D9DntpvUSdj5DXw5DCbNzi8lu8p5LVjkxu8A7QoiGBaa7iT9O/RLwmGYfs1ws52Dq2G9SgQeX/VdvTgstYIIVtYWJhoOY5WXyQkuKbN4gnKIhXSnyFBcamnXTmV0ffmJ1heECWmIprO2wJjry1dMV6xJFhbyEzF3YWU5Ku0q1/J/XwZha7nyWkyOzBa5Uw88jpxzg9H1JQjgMDxrpye/nJzCLpcdYT4aGLujUdt2r0HssNDEDwIodecCLGH62/YFe8ZZSDFr4e1P3c6OInBh6T87LBRKV//OiU3I6hRCVjlfDg2abaYBAVFn1dskdyZgxcURTWGzmaOhL1pVFT/+VpLm/M0E3KGWOGc2pxtIpOHfCUQLVIZ6rjYNBd7chHPzdrC9DLoh1DnOOMF3qEr+DwT8Q+vudtr1hFVdQpsgMIpjKmxLtdfCuNaaY3B9NZ5AVX0HIMT3rQ== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Transfer Simple Testset - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-evaluator-revision.api.mdx b/docs/docs/reference/api/unarchive-evaluator-revision.api.mdx deleted file mode 100644 index b1fc5111ee..0000000000 --- a/docs/docs/reference/api/unarchive-evaluator-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-evaluator-revision -title: "Unarchive Evaluator Revision" -description: "Unarchive Evaluator Revision" -sidebar_label: "Unarchive Evaluator Revision" -hide_title: true -hide_table_of_contents: true -api: eJzNWdty2kgQ/RWqn5IqxXhd+6Sn9dpJ2ZtsTPm2DxTlaqQGJhlplLk4y1L69625SCAEBDBU8WSMuk9Pn+6ZaR1moHGsIO7Dx1fkBrWQCgYRiIIkaiby2xRiMDnKZMJe6YUqqxdJr0wxkUMEBUrMSJO0QDPIMSOIoW36wlKIgOUQQ4F6AhFI+mGYpBRiLQ1FoJIJZQjxDPS0sCBKS5aPIYKRkBlquxbjUDTT3BrUy+7chyid2xTKcmDBVSFyRcriXZyf2z8pqUSywmYGMTyYJCGlRoZ37oMxRJCIXFOurTkWBWeJI6L7TVmf2cIaC2lp0sxHSITxTmHpLNc0Jrmw1itnEUFKIzRcQ3xeRitocoHz6d3IsdkMMrd+Rckw15bThv1m4sqotsgN52B5alP57LEdkxH8FPL7iIufRwj5T4BeijjP8hjZLWV1hGx8hMPT1WQJpWYjTA4Z4DJAVhGMngh5MHCPVkaQoqYtUa3pB80y2gh9bQHLCDJSCscbsTfB/B3cywhG3J2L63ciUy+JUVpkK4MNheCE+cZot6pz5RHKyMLVXf8WxLrNA+jEZJi/BfDGAZRlVBmJ4TdK9Koj+JPjrI3nCqOxuQpMU2bPVeS9Bq9b1K06WRuRsmHzm8X0VseChMnEcJTvPhnO/1Ii/3BndGH0e1hO1oIwTdmWXiglTjcSu+QLLXo3t6lG59Fq0VMi9av4wpT+Ja3rkmy578bRo2/FMIzsdxx8RXfsNIeG/aCuFyDKCBJJqCl9QX3QY/DKw3YuHVmmSI8R5MnDhiApcTpCkGsPG4JUdA2nB7zrKrL+nIbbruLroFEqtuooFWEHjVLRVUd5JdkeJbdv1+fgXkaguBnvC/Ngfe09dLBEA4e4fJs07+bDZW8k2xflSTKPwPdH4BZhQpi6d6vdTvpjUXJ6DbFhNrmnEUnKk8ZpUy10sNONchPKUFavqdtW5ITu5JMcdHaowUMg3k6UWBQs33YAWqZ4l2mrCuQKby/xvbvfe5dNxeRU57eT7JX1zr05pbZQJF9ZQtuw65WnHXowQJdOKRqxsfFK2TFiXTUCbPUSVslg1+heElrvYrtgvNW/FtXK0vr9fnHR1uCekbPU5df5KKWQ+wtwKWlk7rINXblswEXSeLrLrlq4K3wjz9P+IhKsBvtMjVeplysEBm+y3tSR0Xm0T1dxPldO+y4vHzrYNSSjil7P7vo0rj19mwp88/jYawH62jaL+lQJxp22PgtODZgIKywXQmknIOsJxNAtrARKP7u1EqK6lSiqurOVgnLZrcVp8Nu+kqHd4AUTrQsVd7sJFyY9wzHlGs+QdbFgbqcpSoxkeupcLnu3n2nqL3qI+4NFA3f1+D5qmtUlxIJ9JstoEMC93sX+880RhG8/zDmWWT4Szr3Sx9ziOpe9W1gY4OH87Lezc1hmuGFsNwwmbsNUsd1jiJZYqPOHCChzuwU0YfbH/IFdmS1LkI0C3i8KuvSGHAjR9K/uFhxZvjAI+1r3IdQaFtRe5fo61BsiiNf9hDAv+SCCie2huA+z2RAVPUlelvbrH4akreogCLFDy3F/BilT9nMK8Qi5otba68MH3t2HPfa+M7/FmjlVlc9t2e1i7X8QwXearv0FxB0lk6rHZsH2Mkmo0AsorZPPNmO9cXp3D49Qlv8DfPzbsg== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Evaluator Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-evaluator-variant.api.mdx b/docs/docs/reference/api/unarchive-evaluator-variant.api.mdx deleted file mode 100644 index 435509ae19..0000000000 --- a/docs/docs/reference/api/unarchive-evaluator-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-evaluator-variant -title: "Unarchive Evaluator Variant" -description: "Unarchive Evaluator Variant" -sidebar_label: "Unarchive Evaluator Variant" -hide_title: true -hide_table_of_contents: true -api: eJzNV01v2zgQ/SvGnFqAjd1gTzqtN2kRb7sbo3G6B8MwxtLYYkuJKj+SdQ399wUpSrYs25ukLtBTPjTz3sybITmzAYMrDdEU3j2gsGik0jBjIAtSaLjMRwlEYHNUccofaE611fwBFcfcAIMCFWZkSDmcDeSYEUTQsZzzBBjwHCIo0KTAQNE3yxUlEBlliYGOU8oQog2YdeEwtFE8XwGDpVQZGheJ9SiGG+EMmqB7nyuS3iiBspw5bF3IXJN2cJeDgfuRkI4VL1xaEMGdjWPSemlF71MwBgaxzA3lxpljUQgeexX6X7Tz2eyEWCinkeEVQyxt5RQi57mhFamdUK+8BYOElmiFgWhQsq5Injdf3y69lG2OrTFP2nan5SpZY5FbIcDJ0xXQCcfgUaqvSyEfz0jxT4AMDKgMX2JszsgwDJCBYSl8Sx8Xkut5bLWR2cEAFlIKwvwk40j3riqEkjm4pjQ/gtjUIoCmNsP8RwBvPEBZstpILr5QbA6dn/desy5eySAjg+0oMEm4OxUoxi1dj9VyB7Y+Fy2mbNH+z256h7kg5iq2AtWr91aIP7XM39xaU1jzGvaTdSDcUPZEL1QK1yeF3fOFjrynnP9yYjqPTov+SqL+LT9ybf5X1mNJdtyfp9GkasXwkDxJgW4Izrdk7Sv/ZVDXOxAlg1gRGkrmaJ54fSVo6I3hPp7jLFcVbG/oxbJF8jNI7ivYQJKQoJ9Acl3BBpJarsX6jBd+LdYf63Dl13qdlaVWq2GpBTsrSy1Xw6KFXb20V++cr3s9zhaen6ee8ICE+evQE/IM92YQK0vn9tvlZXdu+4yCJ34q671TSqqXD20JGeTCTwTVA7FvIGTc+vqcu3hW7r0p26w/yipAV6lMrw4NvNv3Qmtc0fYCPW7qxehN3NdDkm+H7anPq6IOdjsF38pbqXs8jetKvlP1vZlMxh3Aqrbtot7XG0avM9KDH0FS6RaRQupq4zApRNAvFD1weuw345fuhzla9zeHFpCy36wywECTeqi3FqsERJAaU+io34+FtMkFrig3eIG8jwX3p0JTbBU3a+8yHI8+0PqGMCEF0XS2a3DnWq5qorZZUz8s+AdycoZ9aWhNKhX/XnVGWJTSysvpxfOl9O710OuD6w3HI2Dg0qiEHFy8vRjAvrwtY3daMPanpeb2n4HtqdDkDwwo80cFDGH2+/aDi8wVJUyqAe90Nffe5KCHoX9NvxDI/bHwgWxCoacQCg07G5N2aYdiA4PoyL65rfeMQeraJ5rCZrNATfdKlKX79zdLypV0FhAXTuDpBhKu3e8JREsUmjqRN9cOvPoUTtfr3nZSamdUlz1f+8CFdX8Bg6+0PrYt+zskrftrE0yHcUyF2QHpXHmuEZsjM769m0BZ/gc/SHX+ -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Evaluator Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-evaluator.api.mdx b/docs/docs/reference/api/unarchive-evaluator.api.mdx index bac28c5f77..7ce3f5dd5a 100644 --- a/docs/docs/reference/api/unarchive-evaluator.api.mdx +++ b/docs/docs/reference/api/unarchive-evaluator.api.mdx @@ -5,67 +5,641 @@ description: "Unarchive Evaluator" sidebar_label: "Unarchive Evaluator" hide_title: true hide_table_of_contents: true -api: eJzNV9tu20YQ/RVhnhJgYylGn/hU1U5gNWltxHJfBMEYkSNx0+Ule1GrEvz3YpYXkaLkyo4D9MmyOHPm7JnhzlEBFjcGggV82KJyaDNtYCkgy0mjlVk6iyAAl6IOY7mlR2qiQECOGhOypDm/gBQTggDaiEcZgQCZQgA52hgEaPrmpKYIAqsdCTBhTAlCUIDd5ZxrrJbpBgSsM52g5crOo1hpFQe0JEezCMpyyZgmz1JDhmEuJxP+E5EJtcyZPgRw78KQjFk7NfpSB4OAMEstpZbDMc+VDP1px18N5xQdarlmLaysKoSZq5JqxjK1tCHdoXjlIwREtEanLASTUuxF8fXS3e3aS9bHXivfitMB0jyGztgs6QfVVFZZpghTKEX7VeqUAlapITczo6sKoRQMd4LX8xDbptSgsUsw/R7AGw9QlqIJylZfKbTH5uCj12yIVwpIyGKfBUaR5C6juuvpOuBZz2EHtulzr1Ky6n/TPd7xWhBKHTqF+s1Hp9SvJkvf3TqbO/sWDg/LINJScmYWao27J4U9yIWBvE8l/8ZicsZgRP9Pov6efZbG/qespw45SH+eRvNqFOuL8CwFhhQ4txT9K+xlUNcdiFJAqAktRY9onwLsXL0RWnpnpedzuspVBTuaerFcHv2IIg8VbF0kIkU/oMh1BVsXaeRa7XiPnVfHL6tzxPpl5/fXXq9XrdKo1VZpBHvVKo1cbRWj3Oals3rPubw9Xo2e9wdnLJBju+OcvNZKlCXH/3R5OXQef6CSkfcVow9ae8/0QtsRkUWpvAeoVsJhgMrC3tPn3L7L8mCL7I/7OasIcm8Sszlm1fYbwhjc0P7KPB3qxRjN+ekxrfc2ceHPVZWu4zot3stbqXv6GNeVfE819mY+vxsAVr3tN/Wh8cId3+PNRpyxVc4zY703tjEEMM41bSX9NW6NlhkXXYdcjltvDQIM6W1jp51WEEBsbW6C8ThUmYsucEOpxQuUY8ylH3dDodPS7nzK9G72iXY3hBFpCBbLbsA9T1Y1K/2wtk2Yy0/EqtVGfupsnGn5TzUAtZOPqyyWRabrzKfXCk49udH0bgYC+BiVXpOL9xcTOFSxF8wvBYb+pWhq+8cgDlRozw8CKPFvBFjC5Of9A2bGPagtaI13vGkHS7bWwdLfdpwrlH7qPYGi7ucC6n5Cx9IbEBAc/OrZN3UpIOaRCBZQFCs09KBVWfLX3xxp7ttSwBa1xBWruCggkoY/RxCsURka0GyvEHjzpX5T3o72PqdPv+ltyo1ljvwfCPiTdoe/1fw9EDfDU9Qh0zCk3HaSB9cWT1k7/ne393Moy38BoeTnoQ== +api: eJydVdtu2zAM/ZWATxsgxFmxJz8t6wI06IYGvewlCApWZmK1tqxKcrbM8L8PlC9xbhiwpzjWIXV4DklX4HHjIF7CbIuZg5WAwpBFrwo9TyCGUqOVqdrSM20xK9EXFgQYtJiTJ8uhFWjMCWLoEc8qAQFKQwwGfQoCLL2XylICsbclCXAypRwhrgD17m4dsvid4SzOW6U3IGBd2Bw9cyhVArU4RtQrAV75jF/NuqtH8wRqPrHkTKEdOb7kajLhn4SctMpwcRDDQyklObcus9F9CwYBstCetA/UjMmUDFpEr45jqgFxY1kpr5obZFE2QS1HpT1tiLXqKF4HRC32Mp0tv3h5JenhTGlDCXSZZVCv6lqcxO2lXraszunUV1zXnOTz1dWpQD8xU0kofzSzNhj/n+ok5FFl/KQ85e4UkBXy4PRSVwwk6BSuV3sR0FrcDbT7XjQEWfbcbQb+9F3WQX+Qc7gh6JNdhgYxRo98+i8DuK7m6hY38GIvb6Pu5TK+NfKdu6yD3Dw+Lk4SNt4emvrUDfRoNhjonHxa8Lybwvkw4D6FGCJjaavoV9T3rIuq4ZjXUb8gQIAju+12QmkziCH13rg4imRWlMkYN6Q9jlFFaBQcM5uG09E1Q8NwO5KlVX4X8k0X81va3RAmZCFeroaAB267ppEOYb2HaNQtsaTtqpqWPi2s+tN0R7ur0iaKNVN6XYTwVt6W21eUb6R5uXGdDe3J+NN4cqmYNmA0Xczb6UEZpqfjEWAgjuTqhQIBlIfRAU+Yf9kfMEs2K0c9yHfe3QNqvSaefvvIZKjCeAQCVWv8ElrjYbCuHAiIj3b83v2VgJR7J15CVb2goyeb1TW/fi/JsocrAVu0Cl9Y0WUFiXL8nEC8xszRCc1+18CH+3akPo5AnKff+azZZObI/0DAG+2Ov0xhYaRdI1UtZColGT8IPtlv3HH9nCzuHh6hrv8Cwzl9EQ== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Unarchive Evaluator - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + evaluator + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/unarchive-query-revision.api.mdx b/docs/docs/reference/api/unarchive-query-revision.api.mdx deleted file mode 100644 index 42e10ab045..0000000000 --- a/docs/docs/reference/api/unarchive-query-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-query-revision -title: "Unarchive Query Revision" -description: "Unarchive Query Revision" -sidebar_label: "Unarchive Query Revision" -hide_title: true -hide_table_of_contents: true -api: eJy9WVFz2zYM/is+PK13bJz19uSnZU17zdomWZJmDz6fj5Zgmy1FKSTlxPPpv+9AUopkyYrjuXtJZBn4AHwgCRDegOULA6Mx/JWjFmhgwiDNUHMrUnURwwhyxXW0FCucPuSo11ONK2FEqoBBxjVP0KImhA0oniCMoCk2FTEwEApGkHG7BAYaH3KhMYaR1TkyMNESEw6jDdh1RgDGaqEWwGCe6oRb8iF3KFZYSQLk63pwEywMLmIoigkBmyxVBg1hvTs9pX8xmkiLjKKBEdzmUYTGzHM5uAnCwCBKlUVlSZxnmRSRC3743ZDOpuZfpokaK7yFKM29UnBbKIsL1DU/3zsJBjHOeS4tjE4LtkWPM6rWV3PHYNOAl1xxLbiyxGNDtp+sglUSKpcSiJ8mffce17HH4PhWmvg+lmPH4LG5tmLOo2M6fxYgSwu5Xab6aOAerWAQc4t7opLoWysS7IU+J8CCQYLG8EUvdh/M16BeMJhLd0DUcXgcC9ohXF431mvL0ixNJXJVN1UanxSsfJXOvmNke/356JxwcVl+oDPtsMsN27CczJpv6jF024JI6CiXXP/yMZfyT5Oqt1e5zXL7BrpiFBaTPbW41nzdT0xTF17F6lcikzQOz/D/QOpl+kUY+yKtu4Jsqb+Oo7uw8HxtO2w3XXK3a5u16DCo8xpEwSDSyC3GU26Peoq897CDM0dWnsU/w8g3DxuMxCjxJxg597DBSEnX7JiVqCTrj7IclXwd1UrJVmWlJOyoVkq6Kisr1O0uZf/leh/UCwZG5otDYW5Jt2BwvEADh3y7mjQbsEeh4vSRsHuEFD6iOe6qvfSQBYNUxscGv/KQdKbh077QLxJ6SVgFAykS0Q3aWRi2UL44bYpbx/hCv4UqT+jiwk2EKvbv6IQNHya9HDh4WlHKol5xebDHFyVAwUDv6ubaBbCFc+Mat1Zpehb4u1qLbRhq04S0qF9Yqv5i5xvZ6k4CXMXPFbVNr/s2pWuNSskh5d+oVEM9c+lCRFxelRYKd63yld3ZDm3PbufmAmXcdQuseh0nUDD4getDT5LPuPa3HZnvW85f3dCUkRYdfVx3s+Pvwfs3JffO/YI1EvryThGGbuJmSnmsF7A0ybgWJlW17O1GwQfKvvu7oPUgrXtC90h/Z/ZR1fEv8wS1iPYCN5Zrax6FGxSgistHuqJzoSiAhNtoifQkxQ+sG7p1aHvZEcqv56louEqt4l76S04OLHmLzHMR7YeAT8JYE7wIH2o4H+gNqgi7wNrnWSlUmzVQut0Sqbbgrp0XcYNTg8oIK1bd26LjJtduhLjBwW0FU3NlzqXBggE+0S3dJfBgKx8IY/DVYbRM9Jyfd/hkrwIXhN+kgMvuErCPR2dSvsoTv8iePdmd1CDTgfU8QxuHg7OxocPB607h6ppZVog3MNk+mjp0TT2m8aQvoAq5qzT16LkZTjnFO+fuMnqw/n/RrWaBRUE6v7171x4d3nMpYjcYHHzQ2m21A+eGMVouZKMmNgVkGu2omC8XqZ7Ufkm9g26OYhZ9pbY2//Eiu0UdGYM7+valhUpxedNBrlnSAr2e3d1hnHv6+pL76e7uugXoc9tM6rdytj1ojpTBTZqWKc2/s9RYN+u2SxjBMKPJLT4OH/y8fFgOcs1w0xp8F8NqeA4MDOpVOSrPtYQRLK3NzGg4jGSaxyd8gcryEy6GPBPuJDAY5VrYtVM5u774jOtPyF1nPJ7UBW5pqfnF0xSr8sYzQb1POcgIM0jxj18RYUC/9FqFa4znqVMvDznn3ODs+gJqt0I4Pfn15BS2aW0Iu9IduV1S2nZfA9tioYqfqmTitghY5Mnvz1+QZ5SPhKsaXk8Wt0YugQyLT3aYSS7cXnBebEKCxxASDH5mLVynUSUZGIy6ft94zvOEwZJWzGgMm82MG/ymZVHQa6dHmQvT9hkRO95ALAw9x6F0tJyujhn45SbspjeD5469GUyZbkW5Dm0uQOiZO36acQfGslxUmyB3FkWY2RpC63yj1Vdtkeur2zsoin8BbdL6Pw== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Query Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-query.api.mdx b/docs/docs/reference/api/unarchive-query.api.mdx deleted file mode 100644 index 628cc88b6d..0000000000 --- a/docs/docs/reference/api/unarchive-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-query -title: "Unarchive Query" -description: "Unarchive Query" -sidebar_label: "Unarchive Query" -hide_title: true -hide_table_of_contents: true -api: eJy9V99z2zYM/ld8eGrv2NjN7UlP85r1mrVb3MbZi8+XgyXYYkf9CAlmc3X633ckJUuynTTxpX2yLAL4gA8gAFXAuDEQLeCzJS3JwFJAUZJGlkV+mUAENkcdp/Kebu8s6S0IKFFjRkzaKVaQY0YQgT+9lQkIkDlEUCKnIEDTnZWaEohYWxJg4pQyhKgC3pZOz7CW+QYErAudITtE662wZOUEnGfb0WUCdb109kxZ5IaMM3E+mbifhEysZelchgiubRyTMWurRl8aYRAQFzlTzk4cy1LJ2Ec4/mqcTtVzq9QufpYBIS5sUGq8lTnThnTPvXdeQkBCa7SKIZrUIpDhsfLt1drTNLS7Vp73vgAmiXQ+oZoNRDuJxodVUSjCHGqxT2K9rEX7qlh9pZj7QrlVChyHrevvvRO1gIwYT3SmRRYHFA2Qs9XwTT+G41gQSx1bhfrVe6vUH6bI31xZLi2/hmMxSqbsiVqoNW4fJ2aoC89i9U9HptM4PcM/gdS/ik/S8HdpfSjIA/XncTRvCi/0jicxcOiC063F8PafZuqiZ6IWEGtCpuQW+TGDvY6VINMblt6fh1HeBbOjqSfLlsmPALkJZhuQhBT9AJCLYLYBaela+fb/NBzf459C1m+h9Xd8vShKy9YOpSXsRVFaunYoRtnNqbV67XRrAS/nnh+t+7d3b/4eMfBdnd30rWsn+8v5+eGw/huVTPwoHv2udaFPn9QJMUrlnppRsC+ginhw+pyu25urYXp0oX4qgoN+jprNsc2mmwzG4Ia6VvmwqCdjNHenx3jutqqFjytAN3K91Hb0BnYfDuMi0PdYUj/M57MDgyG3w6TetCvj6HOzMmbEaeG2ybIw7FdITiGCcanpXtK/47uwfY6rdousx7u9EwQY0vftumm1gghS5tJE43GsCpuc4YZyxjOUYyylr21DsdWSt15lOrv8SNsPhAlpiBbLvsC1K6dQIEOxXW6wlB/JBdEsulPLaaHlt5D1ZttNg5bjQubrwqs3tE29c6Pp7BIEuDACSZOzt2cT2KduIOxuAsb+JrTY/hjEHgu7+EEAZf4aABNmv3YHzjNHfoZ5z95hpvamacMB0388LhVKX+YevGqSuIAmiRDWXnfbBES9z4Euk0sBqSuAaAFVtUJDN1rVtXvdLMyLpYB71BJXjrpFBYk07jmBaI3K0IF/u2YBr740d+L1qNtkhn63Cc1doPeorPsHAv6hbf8Dxt/2tK2WqjmexjGV3FM8aE6urHaFPru6nkNd/w8G65Br -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-simple-evaluator.api.mdx b/docs/docs/reference/api/unarchive-simple-evaluator.api.mdx deleted file mode 100644 index a206dffe31..0000000000 --- a/docs/docs/reference/api/unarchive-simple-evaluator.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-simple-evaluator -title: "Unarchive Simple Evaluator" -description: "Unarchive Simple Evaluator" -sidebar_label: "Unarchive Simple Evaluator" -hide_title: true -hide_table_of_contents: true -api: eJzNWFlvGzcQ/ivCPCUAYzlGn/apqp3ATtJa8JEXQTAo7kjLlHuEh1pV2P8e8NhLa6mSbAN6iqOd+Wb4zZBzrEHThYJoAp+WVBiqc6lgSiAvUFLN8+wmhghMRiVL+BKfFE8LgU9YCQOBgkqaokZpYdaQ0RQhglriicdAgGcQQUF1AgQk/jRcYgyRlgYJKJZgSiFag14VVldpybMFEJjnMqXaOmAciuZaWIHa18FNDGU5tZiqyDOFysJcnJ/bf2JUTPLCngIiuDeMoVJzIwZ3QRgIsDzTmGkrTotCcOYOPfyhrM665VohLSWaewssN14peMwzjQuULRcvnQSBGOfUCA3ReUkaUpy9bHU7d5R1sefCRWS7AFdPzCidp12h4MoszwXSDEpS/5QZIcCyVDl3owaXHqEkFm6LX4ch1kEJoIlJafYSwGsHUJakEspnP5DpFsn3Lhtrw58dc33UkkCKmnZ9oXHMbaypGHfY7XkbsrEFW0W7YymddX9pH/J5W8C4ZEZQ+e6zEeKLyrMPt0YXRr+HzSNbEK4x3VOLSklXO+nd0IUeybuU/7RkWo1eop4SqX/l37jS/0vrtkP21A/j6MGnYngO92Kg74LVLUn3ITsO6qoFURJgEqnG+InqXYCtBzimGj9o7vzZbuXSww5GjixTxG9h5NHDBiMxCnwDI1ceNhip6JqtbDXbz44rWfuQ9cfKVbGGr1e1UrFVW6kIe1UrFV21FSXM4thcvbe6toa8mnvh5HSzBnTr6hKlesEV+x7UbSQlPxblUXKPII5HEBYhQRq7nuyw9/mtKDm9hNjRV9zhHCVmrPNGVI5OD6oD1yEMZdXn7huRE6qkJ9meHBCD+0C87QNpUfBs37Zlk+JDeqTKkAu8Lb1HZ7/XLruT1ql2XSeZK9uVxw2lNlAol5zhPuz60fWAHAzQpZs553xh/Hz9FrYuOwYOGKCuqGvse/PT/ggv064H87K0Wr9dXPTn+O9U8NidbPBJSreBOHKIj1FT7spsyMdNAZGzztdD7lOrSvgUbg79LWe0asRTtXhu8dFMWkrRBTY5vV3UkTF4sF+fY7xZukzcubzpINcu2TW9nt3tx7jy9O0K7/XDw7gH6GPbDepjtWAa+IxoLRPc7J7kdg1V5Eq7hZNOIIJhIXHJ8Z+h30kN6yWGGq7b26dyWK+vwF/xalXlmixItC5UNBwykZv4jC4w0/SM8iEtuLtVCpmRXK+cymh88xVXvqhDNJm2BVyZ8ZnTFauDRgv+FS2HYUk2MjrJJf/Pp0PYkvnGzfHKs3nu1AOfI+fcYDS+AdL0ZnB+9vHsHDY57QjbK0KZuyKVbfcZyAYL9fmBAKbufoBGmv7efLCe2VCE9U7A2xnCjQk20KHxXz0sBOVZq+X10Z1AiK4NmcOD1vpMAYFoY8PYBHlKILGZEk1gvZ5RhY9SlKX9+adBaeM4JbCkktOZZXWyhpgr+3cM0ZwKhT1/6wcG3t2Fe/R+0NSo7jmqWGc20NZH+z8g8DeuNvei7pVIqmRaB5ERY1jolnLvUbNZV9+K8e39A5TlL/7Wfas= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Simple Evaluator - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-simple-query.api.mdx b/docs/docs/reference/api/unarchive-simple-query.api.mdx deleted file mode 100644 index 0b46ac1aa3..0000000000 --- a/docs/docs/reference/api/unarchive-simple-query.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-simple-query -title: "Unarchive Simple Query" -description: "Unarchive Simple Query" -sidebar_label: "Unarchive Simple Query" -hide_title: true -hide_table_of_contents: true -api: eJzNWFFv2zgM/isBnzbAa3rDPeXpeuuG9ba1XdPtHoIgUGwm1iZLriSnzQL/9wMl2bFrJ02DDriX1pHFj+RHiqK5AcuWBkYT+Fqg5mhgGoHKUTPLlbxIYASFZDpO+Qpnhme5wNldgXoNEeRMswwtapLfgGQZwgjc2xlPIAIuYQQ5sylEoPGu4BoTGFldYAQmTjFjMNqAXeckZ6zmcgkRLJTOmCXFhUOx3AraQAauBxcJlOWU8EyupEFDEG9PT+lfgibWPCfLYQTjIo7RmEUhBjdhM0QQK2lRWtrO8lzw2Dk6/GFIZtMwK9dEg+VeQ6wKLxSs5dLiEnXDvHduRwQJLlghLIxOy8iT4XTJ9dXC0dTG9aQ137fpKKN6RRZCALleabwk2TJqu30c1HkDoowg1sgsJjNm9wE2QpUwi28sd/bs1vLOww7OLCkp8uR3KPnmYYOSBAX+BiXnHjYoqeiau7w/TI9L7kPI+tvn/JavF9VSsVVrqQh7US0VXbUWI4rlsbk6Jtkygpczz9u0EK4SNiFZknA6E0xct05tR+lcKYFMNrVUnkzLqFpS8x8Y272mfHBGkMjxxnQ5rKpVS3M2b680fejXBTHXcSGYfnWpPnNj/zFKvrkqbF7Y1/AcLzvi8CySbgNHGVr2/+XoQyHEkwxxi9mBUkxrtt6fPG3Z55H6hcikAsAek9q+se65TNQ9kbfvWsN7NC9bci89ZBmBEslLg195yDICiQ+HQj9ZVy4Jq4xA8Iz3g/Ym3SOUz06a/NYJ6v22oSwyauaYiVEmfo3ag/BjupcDB0+FVVrUKyaOtviiAigj0Mz2Nzjdw9XBuSHZspPF2w3/1rnYhaGKzoVF/USq+mZXad9Aht4NmEy2J69Lr3urqP2TigySfkUqDc3IqSWPmbiqNJSu/fRVw+kOp3+3cQuOIulrkusj7zaUEfzE9bEX6ieksgIrJopDe9FnF8vK07KnnPUXUv+ZcHj9+u7ML6NWQJ8+KdzQh4qZURyb3ZfKcqa5UbIRvd0oeEfRd3+XlA/Cuid0j/R3bu9lE/+yyFDz+CBwY5m25p677yiUSfVInzKMS3IgYzZOkZ4E/4lNRWOHdpAeLn0+z3jLVLqqD5JPGRmQsg6Z5zw+DAEfuLEmWBF+NHDe0wrKGPvAuvWs2tT4JqNwuxSpj+CukxczgzOD0nDLV/3Hoqfp63bxzOBgXMM0TFkwYbCMAB9YbGcugEdreU8Ygy8Oo6NiT/28xQd7Fbgg/DYFTPRfAYdYdCbEsyzxSba1ZHdQw54erO2IYRIKZ+tAh8LrqnDdbVU3xGuYPi5NPbKm6dNkus+hGrnvatoj56YcN7jihit5zlxP9hz5sZvROJTjJet5SVmSxJ9v33bHK9+Z4Ikbngzea+2O2ZGzlQQt46J1H7Y3CBXvuC2fvqD2hPWz8ga6Twmz3HfNfkFj2BK3HfXurY6MwS29fSpJyS+vOuxrX2eBXs/ubjfOPX37Qvvx9va6A+hj2w7qt2rWN/DZMPgaZn0Z2lTRNDBXxrrZn01hBMNc44rj/dCPBod3fog43FRTwHJYjw8hAoN6VY0LCy1gBKm1uRkNh7FQRXLCligtO2F8yHLuzr3BuNDcrp3I2fXFJ1x/ROb64Mm0uWFMyeXTpb2tjhTLOXU6UTWoPCtsqjT/5XMgTCtTL1W6NnihnHhV0pxxg7PrC4iA3PCUnZ78cXIKj4lsbXYXdWy3877wGqJHLNT+052YuUMBFln21/YFWUYxyJhs4O2M26PZYKDC4oMd5oJxl/vOhk0I6QRCSClcDgv8GJO79mLUGO9uIzuNIKW8GE1gs5kzg9+0KEtaDgPQyZT6S83ZnKicbCDhhp6TcDV0DK1LCby6CSfm9WDbkbcdqAIsyePQxgKEnng7kHa1IK2yZxNen8Ux5rYh2CldlGZ1/l9fjW+hLP8DyqHqIA== -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Simple Query - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-simple-testset.api.mdx b/docs/docs/reference/api/unarchive-simple-testset.api.mdx deleted file mode 100644 index 05dd162ab1..0000000000 --- a/docs/docs/reference/api/unarchive-simple-testset.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-simple-testset -title: "Unarchive Simple Testset" -description: "Unarchive Simple Testset" -sidebar_label: "Unarchive Simple Testset" -hide_title: true -hide_table_of_contents: true -api: eJztWEtv40YM/isCT7vAbOwGPelUd9NF0t02Qez0YhgBLdHWbEePnRm5dQ3998U8JEuW7ThZB+ghpzgS+ZH8yOFQ3IDGpYJwChNSWpFWMGOQFyRR8zy7iSGEMkMZJXxFj4qnhaBH7USBQYESU9IkDcQGMkwJQvDvH3kMDHgGIRSoE2Ag6VvJJcUQalkSAxUllCKEG9DrwmgqLXm2BAaLXKaojfHSomiuhRHwXgY3MVTVzCCqIs8UKQNyORyaPzGpSPLC+A8hjMsoIqUWpQjuvTAwiPJMU6aNOBaF4JENd/BVGZ1Ny7FCGjI0dxaivHRK3l+eaVqSbDn40UowiGmBpdAQDitWE2KtZevbhSWri7wQNg+HBRJUlvgIfbRbQe/MPM8FYQYVax5lpRBgeKrdu0YVTBqUijlYidGPYjqIygTrxPL5V4p0P3WfbKB9vIpBShq7XmAcc5MYFHcdMnp++sJpwdap6VhK590n7fD224KIy6gUKN99KoX4XeXZh9tSF6V+D7uhGhCuKT1RC6XE9VFid3ShR+4x5T8MmUajV1f/J1L/zL9wpZ+k9VCQPfXncTRxpej71kkM9F0wuhXrdp2XQV21ICoGkSTUFD+iPgbY6pUxavqgufXnsJWPDjYYWbLKIn4NIw8O1huJSdArGLlysN5ITdd8bS6e0+zY2+UUsn5d2ytny9dZrdRsNVZqws5qpaarsaJEuXxprY6NbsXgfO75yHH3Duheg/UV+MjjnablW+/TLpzegOubMriJbZ84cP82lvuu+jHoTBS1px8G58UeN7hvfeet77xq3zl3z9gzO5884+wZcOvuN3vWLFHPtW8D1wkD19uk/wqTfv/qfCP1xaReGTKf+pw1s8CLBoqTvpTvacUVzzPnSv+D+QjC2C5qPM6P6DYrk6oyOj9fXvY3LH+h4LHdnwS/SZnLl69XYtLIhfl1YKQSedR5+5xCnu0mahvyl9w5aFuTWu4bIreHTSlctrJ+WNSSEUzM2318b5dhUxuXM+3lWjWzpdexeziMK0ffseReTyZ3PUCX225SH+qlX+DqIZg0S7+UdJKbxWCRK7cE1AmEMCgkrTj9M3BbwoEff9Vgsx2Eq0GzTAQzwMpVvTospYAQEq0LFQ4GkcjL+AKXlGm8QD7AgttzpCgqJddrqzK6u/lM62vCmCSE01lbYGwqzNVMV6xJFxb8Mxn2/NJyVOokl/w/Vwh+b5k4LUMPzxa5VfdMjqxzwejuBhiYMBxvw4ufLoawy2ZH2BwOjOzhqG3b18B2WGjiBwaU2pMBmjD9ZfvCeGbSkGLWwjuSvJ01hSdD0796UAjk9ghYLzY+r1PweTUJs2jQLDQVMAg7295temcMElMf4RQ2mzkqepCiqszjbyVJk8EZgxVKjnPD53QDMVfmdwzhAoWinq9NU4F39/7svA+2F0I3hjrLmUnxCkVp/gMGf9O6u6G2fSGpi2jjBUZRRIVuqfbamKm25iTc3Y4nUFXfAQ31+Y0= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Simple Testset - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-testset-revision.api.mdx b/docs/docs/reference/api/unarchive-testset-revision.api.mdx deleted file mode 100644 index ef68a09b58..0000000000 --- a/docs/docs/reference/api/unarchive-testset-revision.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-testset-revision -title: "Unarchive Testset Revision" -description: "Unarchive Testset Revision" -sidebar_label: "Unarchive Testset Revision" -hide_title: true -hide_table_of_contents: true -api: eJztWUtv20gM/isCTy0wjbPBnnTabLNFsu02QeLkYhgBLdH2dEePzoy86zX034t5KZZlO46rAHvIKY5FfiQ/cjgUvQKNMwXxCIaktCKtYMygKEmi5kV+lUIMVY4ymfMFPWon8yhpwRUvcmBQosSMNEkDsoIcM4IYNgUfeQoMeA4xlKjnwEDS94pLSiHWsiIGKplThhCvQC9LA6G05PkMGEwLmaE2flQWRXMtjIB3OLr1NqKrFOp6bKBVWeSKlEE7Oz01f1JSieSliQliuKuShJSaViK69cLAIClyTbk24liWgieWgsE3ZXRWax6W0hCkubOQFJVT8o7zXNOM5JqnH60Eg5SmWAkN8WnNOhRZs/nyemp5bJsIsguUHHNt2GxJ76esZo1EXgkBhqNNEh8csuWQQf922vghnv7jcPgoNZ9i0qeBcw8ZLFR6XsjewB1azSBFTQeiGtEPmme0F/rCANYMMlIKZ3ux98H85dVrBlNhO8buap2jsp0iQX8GOwYnRSEI870WL1FFwwalZg5WYvKzmA6iNmXoxIrJN0p0t7N8soF28SybGtteYJpy0y5Q3LTIOIDs0DBalrJJ+5v18LbbgoTLpBIo332qhPhTFfmH60qXlX4Pm6EaEK4pO1ALpcTlXmI3dKFD7v7a0mg1OnX1fyL1a/GFK/0srbuC7Ki/jKOhK0V/vx53hr+i7RXtu/A4qIs1iJpBIgk1pY+oe+1dHx1sdG7Jqsr0NYzcO1hvJCVBr2DkwsF6I4GuybLHCyqQ9fvSX1GBr16tBLYaK4GwXq0EuhorC5LdGenwcn3w6jUDJarZsTB3Rrdm0F+gnkPcvE2645+5Bh95utH+fBN/3oXDW3m4c6OrVIVZbctN3ljePqm+1mTXL/Zdg/vWwd462Kt2sL57xpYp/OBpacuoHLrf+EVTSZiQ30a3A0a3t3eGV3hn6F6db6QeTeqFIfO5F2MzCxw1UBz0zh2Wec6V7qv34Qg/p92sBevaaP16dtbdIj6g4KndEUZ/SFnI41eIKWnkwnzaMVaJImk9fUkxjzeT9RT0l8I5aNuTmm0bJLcsgJzIblFLRjQ0T7cx/rT5Hdm4nGkv11oZBnodu7vDuHD07Uvv5XB40wF0uW0n9T4su6PN/TLYFj4vzEq8LJS2y289hxgGpVni0j8DP/2qQVjqqsFqyyq8HjQrdTAjrVyE9XklBcQw17pU8WCQiKJKT3BGucYT5AMsuT1ZipJKcr20Kuc3V59peUmYkoR4NF4XuDP15iqoLdYkD0v+mQyXfnHvNpH8P1cWfmU/d1qGLJ5PC6seNpfWuej85grW3tLg9OSXk1PY5LYlbI4KJvaoBNv2MbANFpr4gQFl9pyAJsx+e3pgPDMpyTBfw9ubyo0liKdD0796UArk9khYP1Y+yyPwWYZmf61sNftMA4N4+88eT8keM5ibyolHsFpNUNG9FHVtvv5ekTT5HPvl+8SwO1pBypX5nEI8RaGo43fTcODdrT9X76OnC6MdT8h5bhK+QFGZ/4DB37Tc8ZuNbR7zUFsrL3meJFTqNYxOrzNF2ByWm+u7IdT1D1T4DRM= -sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Testset Revision - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-testset-variant.api.mdx b/docs/docs/reference/api/unarchive-testset-variant.api.mdx deleted file mode 100644 index 6113c76264..0000000000 --- a/docs/docs/reference/api/unarchive-testset-variant.api.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: unarchive-testset-variant -title: "Unarchive Testset Variant" -description: "Unarchive Testset Variant" -sidebar_label: "Unarchive Testset Variant" -hide_title: true -hide_table_of_contents: true -api: eJzNV01v20YQ/SvCnBJgYzlGTzxVjRvYTdoYsZyLIBgjciRtuvzI7qxbVeB/D/aDlEhKiuM4QE+iyJn3Zt7M7s5ugXFlIJnBlAwbYgNzAWVFGlmWxXUGCdgCdbqWD3TPweb+AbXEgkFAhRpzYtIOYwsF5gQJ9OzuZQYCZAEJVMhrEKDpi5WaMkhYWxJg0jXlCMkWeFM5BMNaFisQsCx1juyisB6FJStnEMMdfQoUo+sM6nrukE1VFoaMA7s4P3c/GZlUy8olBAnc2jQlY5ZWjT5GYxCQlgVTwc4cq0rJ1Oc//mycz3YvwEo7dVgGhrS0wSnGLQumFem9QN94CwEZLdEqhuS8Fn2BPGux+bD0InYZGlOZda1OC1WL1qKwSoGTpi+dk0wAapZLTJ+TYBIhI8NS+RY7nuIajW+tFGPdBkEsylIRFidZr9CMpi1KLQKsxvRHMQNE7coWzMrFZ0p52IxvfaJDvFpATozdKDDLpGsxVDcdMY4VYA+2abIOU77ovtlP7zAXpFKnVqF+8dYq9Ycpi1cfLFeWX0I/VQcimfJHeqHWuDkpbM8XBuKecv7Tiek8Bn31fxL1r/K9NPxNWY8lOXD/Po2moRXjjvwoBYYhON9adPfPp0Fd7kHUAlJNyJTdIz9yz8mQ6RVLH89xljcBdjTxYtkq+xkkdwE2kmSk6CeQXAbYSNLItdg84y7diPXbJu7TjV7PytKo1bI0gj0rSyNXy2KUXT21V2+dby3g+cLzw8k3j484yhw6QB7t3E40de2cfrm4GA5An1DJzI83o9+1LvXTp5+MGKVyT/Fw6BuoMu18/Z59eF73zpNdzu/LEKCrUm5Wh+bG3VlhDK5ot3keN/VijKbu6yHBdzPrzOcVqKPdXrF38gZ1j6dxGeQ7Vd2r6fRmABhq2y3qXTOkj3qTMfjhY126Sd6dIiLM4AmMK00Pkv4ZxwnTjOM0asbb4QBfj9trAAgwpB+amd9qBQmsmSuTjMepKm12hisqGM9QjrGSfikYSq2WvPEuk5vrd7S5IsxIQzKb7xvcul4L3dM1awuHlXxHTsd425hYXpda/hdaIl401sHLCSWLZendm/HUBzea3FyDAJdGUPD87PXZOfR17Ri7ZYKpXyYNt/8MoqdCmz8IoNyvEWDC/NfdBxdZVRrOsdjDO1XG3jEc1WD6l8eVQulXgw9jG0s8g1hiaG8cxqUcywwCkoM3tV2l5wLWpWEHtd0u0NCdVnXtXn+xpF0x5xFv4aSdbSGTxj1nkCxRGRpE3e408OJjXFAvR7vBqJtNU/Bi48NW1v0DAX/T5vAt028a66avttFwkqZU8R7EYI9zDdiukpu7KdT1V5xFLi4= -sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api -custom_edit_url: null ---- - -import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; -import OperationTabs from "@theme/OperationTabs"; -import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - - - - -Unarchive Testset Variant - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/docs/reference/api/unarchive-testset.api.mdx b/docs/docs/reference/api/unarchive-testset.api.mdx index da988934dc..b7e808abc0 100644 --- a/docs/docs/reference/api/unarchive-testset.api.mdx +++ b/docs/docs/reference/api/unarchive-testset.api.mdx @@ -5,67 +5,834 @@ description: "Unarchive Testset" sidebar_label: "Unarchive Testset" hide_title: true hide_table_of_contents: true -api: eJzNV9tu20YQ/RVhnhJgY6lGn/hUNW5gN2ktxHJfBMEYLUfipstL9qJWJfjvxS6XN1GyHdcB+iSJO3Nm5pzhzqgEgzsN0QqWpI0mo2HNIC9IoRF5dhNDBDZDxROxpwdT2wCDAhWmZEg53xIyTAkiCOcPIgYGIoMICjQJMFD01QpFMURGWWKgeUIpQlSCORTOUxslsh0w2OYqReOiWo9ihJHOIKQ3uYmhqtYOURd5pkk7kMvZzH3EpLkShUscIriznJPWWysnn4MxMOB5ZigzzhyLQgru65x+0c6n7CVWKMeCEXUEntvaKeQrMkM7Ur0E33sLBjFt0UoD0axiDSE+Wna43Xqyhshb6QU4b5Cg9sRzDNV2hiGZTZ5Lwgwq1j7KrJTgeGrSu0Y9WbYoFathFfL/illDVK7Y2izffCFuxtJ98IWO8SoGKRkcZoFxLJwwKBcDMkZ5hsbpwTbSDCKlm+GTfnmnYwEXiluJ6s0HK+WvOs/e3VpTWPMWjkt1IMJQ+kwvVAoPjxJ75Asjch9z/s2R6TxGffV/IvX3/JPQ5klazxU5cv82jpZ1K4Z761kMjFNwvhUb3jovg7rqQVQMuCI0FD+geQywd1fGaOidET6f81He17CTuSfLFvH3CHJfw4YgMUn6DkGuatgQpKFrc3CD53lx/HR5Dlk/H/zI6fh61SgNW22UhrBXjdLQ1UbR0u5e2qt3zrdi8Hrp+ZH+5Pg4NTme9monf1U56x8vL8eLwh8oRezXgMkvSuXq5VtCTAaFdN/CODg2kDkfnH7LzbuujiZIV+ynvE7Q6ZLq3am9qpsOWuOOuuvyvKknY7J0p6eY7na6la+rDh3sevJ29Nbsni/jqqbvMVmvl8vFCLDWdijqfbO0Tpbt0pqSSXK30Ra5rpdYk0AE00LRXtBf07Ct6WnZLbLVtF1/gYEmtW92XqskRJAYU+hoOuUyt/EF7igzeIFiioXwTa6JWyXMwbvMFzcf6XBNGJOCaLXuG9y5nqq7ZGjWCoSF+EiOr7Btz61JciX+qaUPC3dSezlCRLbNvXvgbu6Tm8wXN8DAlVEzNbv44WIGx/wNjN3rgNy/Dk1sfwzsiIW2fmBAqX8XwBCmP3UHLjPHf4pZD++UXEeDNbBg6G8zLSQK3+0+fBmUXEFQEtrNWwODaPC3pJNzzSBxjRCtoCw3qOleyapyj79aUk6xNYM9KoEbx9+qhFho9z2GaItS0yjF9tqAN5/D2/F20u01w9QbVTMn6R6ldb+AwZ90GP6V8m9+0jRNGQzmnFNheq6ji8p1V9vyi9u7JVTVv0olw3E= +api: eJydVcFu2zAM/RWDpw0Q4qzYyadl3YAG3dCgzXYJgkKVmVitLamSnC0z/O8DZdlxkgYDdopjPVKP75F0A55vHWQrWKLzDr2DNQNt0HIvtZrnkEGtuBWF3OGj7zDAwHDLK/RoKbYBxSuEDOL5o8yBgVSQgeG+AAYWX2tpMYfM2xoZOFFgxSFrgKv93Sbk8HtDOZy3Um2BwUbbinu6v5Y5tOwU0a4ZeOlLehXJJ/McWnpv0RmtHDq64mo6pZ8cnbDSUFmQwUMtBDq3qcvkPoKBgdDKo/KBmDGlFEGF9NlRTDOibSxp5GV3g9B1FxQZSuVxixYOBK8DomW9RG+Wrp+eUXg4K2tcvKrLEtp1S6lOog4iryKjc4WGWtuWUny8ujqX5icvZR4KT75aq+3/65Kj57KkJ+mxcueAUouj00vdMBKg17ZdHyTg1vL9SLdvuiNIglduO3Jm6K4e+h2d41uEIdllaBAjWdLpv+SnurqrI27kxEHeTt3LZXzp5Hvrsh5ys1wuzhJ23h6b+qMf4mQ5DHGFvtA04Ua7bqh9ARmkxuJO4q809qpLm8Ngt+mwDoCBQ7vrd0BtS8ig8N64LE1Fqet8wreoPJ9wmXIj4ZTTLJwm1wQN4+xQ1Fb6fcg3W8xvcX+DPEcL2Wo9BjxQw3UtdAwb3ONG3iKJGVfTrPaFtvJP1xdxOxVdFKkl1UaH8Chs5PaZixdUtM6ozo72dPJhMr1UTAxIZot5nBsuwtz0PAIM2Ilcg1DAAKswNOCRV58OB8SSjKq4GuV7y9cjYoMiHn/71JRchrEI1zfR8hVEy2FYUA4YZEf7/OD7mkFBHZOtoGmeuMMftmxbev1aoyX31gx23Er+RFquGsilo+ccsg0vHZ5RHPYLvLuPY/Q+AfY29d5hRfbueFnTP2Dwgvvjb1BYEUXfQE0EzIRA40ehZxuNOm2YjcXdwxLa9i/NUHRa sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Unarchive Testset - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/unarchive-workflow-revision-rpc.api.mdx b/docs/docs/reference/api/unarchive-workflow-revision-rpc.api.mdx index 92d1c5fa3d..129828ef6f 100644 --- a/docs/docs/reference/api/unarchive-workflow-revision-rpc.api.mdx +++ b/docs/docs/reference/api/unarchive-workflow-revision-rpc.api.mdx @@ -5,67 +5,1999 @@ description: "Unarchive Workflow Revision" sidebar_label: "Unarchive Workflow Revision" hide_title: true hide_table_of_contents: true -api: eJzNWdtuGkkQ/RVUT4k0MV5rn+ZpvXYie5ONkW/7gJBVzBTQSc8lfcFL0Pz7qm8DwwALBEs8YZiqU12nqrt6juegcCwh7sM/hfg+4sWrhEEERUkCFSvy2xRi0DmKZMKm9PLqjV4ETZlkRf4iygQiKFFgRoqEgZpDjhlBDG1rlkIELIcYSlQTiEDQD80EpRAroSkCmUwoQ4jnoGalwZBKsHwMEYwKkaEyq9EWRTHFjUFYd+feB+ncplBVA4MtyyKXJA3cxfm5+UhJJoKVJjWI4UEnCUk50rxz740hgqTIFeXKmGNZcpZYJrrfpPGZLy2xFIYnxVyEpNDOya+c5YrGJJaWemUtIkhphJoriM+rqE2SjZvP7kaWymaM2niKgmGuDKEN8+2sVVFtkWvOwbDU4vHZQVsaIzh+oCZ+ndEbZOIioFBshMkxU7j0kCGCVpNCHA3coVURpKhoR1Rj+kGxjLZCXxvAKoKMpMTxVuxtMH979yqCEbfHx+aOZfIl0VIV2dpgw6LghPnWaLeyc+UQqsjA0RS5RrWB8B0RP9YgDnSiM8x/BfDGAlRVFIyK4TdK1JqD6pOlrA1n66KwuQhMU2ZOH+S9Bq07lC2cP41I2bD5y3J262NBwkSiOYp3nzTnf8ki/3CnVanVe1jN1YAwRdmOXigEzrbyuuILLXa3d6lC69Hq0FMi9WvxhUn1v7RuSrLlvh9Hj64V/cA+7DT4ivbUaY7Ww6CulyCqCBJBqCh9QXXUU/DKwXYuLVm6TN8iyJOD9UFS4vQGQa4drA8S6BrOjjjqAll/zvywC3wdNUpgq44SCDtqlEBXHWVKon3j2r1dn717FYHkenwozIPxNWPoaIl6DnF1mjRH8/Gy14IdivIkmEPghyNwgzAhTO37x34n/VtRcnoNseVqck8jEpQnjdMmLHSw10S58WWowrvcrhU5oZl8khedPWrw4Ik3N0osS5bvegFapXif21YIZAtvhvjB3e+8q6aqcKr3t5Pslc3OvQWlplAkpiyhXdh18swePeihK6unjNhYO0HpLWJdNQLs8g4WtKJrtO8IrVexPSB+0b3WnarKuP1+cdGWqZ6Rs9Qm1/koRCEO16hSUsjspPUtuWrAi6TxdJ8ttTQoXBcvsv5SJBhu9Zkcr9P31ogLzmSzqSWj82ierqN8oS32bV4utLdrCFKBXsfu5jSuHX3b6nvz+NhrAbraNov6FETVTkvBBKsETAqjvZaFVFZgVROIoVsalZBeu0E2k90gG8rufJ3eWnVr9Rbchg8irb1ywUSpUsbdbsILnZ7hmHKFZ8i6WDK7xyQlWjA1sy6XvdvPNHMjHuL+YNnADh3XRE2zun5Yss9k6PTysBO62E/XGV4Xdtc4SzHLR4V1D8KYXVznsncLS1d3OD/77ewcVultGJvdgondLSG2fQzRCgt1/hABZXargCLM/lg8MCszRfF6kcfbXs2VV2PPh6J/VbfkyPKlG7ArdB98oWGhkErb0r7YEEG8QV5f1HsQwcS0T9yH+XyIkp4Eryrz8w9NwpR04AXeoSG4P4eUSfN3CvEIuaTWyutjB97d+931vrMYXs2MQtlzU3Ojt5lvEMF3mm3654A9Qyahv+be9DJJqFRLIK0jzzRivWV6dw+PUFX/AaoBjX0= +api: eJydVcFu2zAM/RWDpw0Q4qzYyadl3YAG3dCgTbdDEBSqzMRqbUmV5HSZ4X8fKMuO07QbsFOU6JF6fHxkGvB86yBbwU9tHzelfnawZqANWu6lVvMcMqgVt6KQO7x7jqA7izvppFZ31ghgYLjlFXq0lKoBxSuEDAaQzIGBVJCB4b4ABhafamkxh8zbGhk4UWDFIWvA7w2FOm+l2gKDjbYV90SiDlm89CUBrmPuZJ5D264ppTNaOXSU5Ww6pY8cnbDSUCGQwU0tBDq3qcvkOoKBgdDKo/IE58aUUoS60wdHMc2ImbGkipfdC0LXXVAkLJXHLdoRw/OAaNkgQ3hC7a82QaMYp+8fUPhRWN+HvkBo2QBWdVlCu25bdhJ+UHQVua3fzjmU37aU6+PZ2alaP3gp86BF8tVabf9fqhw9lyWdpMfKnQJKLY5uT0SKbhgp0cvdrg9acGv5fqTkN90RpB5Ubvuau3rod3SObxGGZG9DgxjJkm7/1Qeqq3s64kYtOcjbqft2GV86+V57rIdcLJeLk4Rdb4+bettPctJbIhl8xqBCX2gaeKOdD1PtC8ggNeRgfE7vucO0XwEu7X3t0mY06W06rAtg4NDu+q1Q2xIyKLw3LktTUeo6n/AtKs8nXKbcSHhJdxZuk3OCAg25Q1Fb6fch32wxv8T9BfIcLWSr9RhwQ17s3HUMGxrLjbxE0jkuq1ntC23l784ycV0VXRQJKdVGh/CoeeT2mYtHVLSZqM6O9nTyYTJ9q5gYkMwW8zhSXISR6nkEGLAXcg1CAQOswjyBR159OlwQS+pcxdUo399bfkRx0MbjL5+aksswO4FIE92wgugGYEB+AAaDI+Cw6+icHe//gy3WDApyWLaCpqEkt7ZsW/r5qUZLzV0z2HEr+T1JvWogl47OOWQbXjo84T1sJnh3HQfwfQLs9Xp6Ayjq/o6XNX0DBo+4f/GnFbZL0RusiYiZEGj8KPZkGZITh2FaXN0soW3/AFlgjuA= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Unarchive Workflow Revision - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + revision + object + +
    +
    + anyOf + + + +
    + + author + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + date + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + data + object + +
    +
    + anyOf + + + +
    + + service + object + +
    +
    + anyOf +
    +
    +
    + +
    + + configuration + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + variant_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + + object + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + + object + + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + + object + + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/unarchive-workflow-variant.api.mdx b/docs/docs/reference/api/unarchive-workflow-variant.api.mdx index e855606aae..78a04ea5c0 100644 --- a/docs/docs/reference/api/unarchive-workflow-variant.api.mdx +++ b/docs/docs/reference/api/unarchive-workflow-variant.api.mdx @@ -5,67 +5,1008 @@ description: "Unarchive Workflow Variant" sidebar_label: "Unarchive Workflow Variant" hide_title: true hide_table_of_contents: true -api: eJzNV01v20YQ/SvCnBJgY6lGTzxVtRNYTVoLsZweBEEYkSNxkyWX2Q+5qsD/XuxySYmipDiOAvTkD868N/NmdnZ2CwZXGqIp/C3Vl6WQTxpmDGRBCg2X+SiBCGyOKk75muZPwWi+RsUxN8CgQIUZGVIOZQs5ZgQRHBrOeQIMeA4RFGhSYKDoq+WKEoiMssRAxyllCNEWzKZwENoonq+AwVKqDI2Lw3oUw41wBnXEvU8VR2+UQFnOHLQuZK5JO7TrwcD9SEjHihcuJ4jgwcYxab20ovcxGAODWOaGcuPMsSgEj70E/c/a+Wz3IiyUE8jwiiGWtnIKgfPc0IrUXqQ33oJBQku0wkA0KFlHIk+bb+6XXsc2RWPLk7bZea1K1ljkVghw4nTUc6oxQGX4EmNzQYZhgAwMS+E77XSSXM9jq43MjgawkFIQ5mcZR7p3UyGUzMHRGoVFI9WPIL5tQCrQ1GaY/wjgnQcoS1YbycVnis2Rzn7nJevClQwyMtgOApOEu35FMW7JeqqUe7B1x7aYskX7P/vZHeeCmKvYClSv3lkh/tAyf3NvTWHNazjM1YFwQ9kzvVAp3JzV9cAXOuqec/7Tiek8Oh36fxL1L/mBa/NNWU8l2XH/Po0mVSuGAf8sBbohON+StYfxy6Bu9yBKBrEiNJTM0TxzeiVo6I3hPp7TLDcVbG/oxbJF8jNIHivYQJKQoJ9AclvBBpJarsXmgvO+Fuv3TZj4tV4XZanValhqwS7KUsvVsGhhVy/t1Qfn6y6Pi4XnN51v3x9hMTp2gzzfu1mQytJ5/Xp93d2nPqHgid+Wem+Vkurly1RCBrnw60B1PRwaCBm3vn7PJJ6VBzfKLukPsgrQ1SnTq2N76O620BpXtBufp029GL2J+3pM8d0OPPV5VdTBbq/cO3krdU+ncVvJd668d5PJuANY1bZd1Md67e8dbtrg949UusdBIXX1DDApRNAvFK05PfXrjVX3w3qr+9sjj4Ky3zwugIEmta4fElYJiCA1ptBRvx8LaZMrXFFu8Ap5HwvuD4Sm2CpuNt5lOB69p80dYUIKouls3+DB9VvVQW2zpnhY8PfktAxPmKE1qVT836otwuMlrbycWDxfSu9er7s+uN5wPAIGLo1KxcHVL1cDONS2ZeyOCsb+qNTc/jOwAxWa/IEBZf6cgCHMftt9cJG5koQdNeCdLeXBbRzkMPSP6RcCuT8SPo5tqPIUQpVh94rRLulQaWAQHX8A7oo9Y5C6zommsN0uUNOjEmXp/v3VknL1nAXAhVN3uoWEa/d7AtEShaZO3M3AgVcfw7l63dttSO186prnGx+3sO4vYPCFNider354pHVvbYPlMI6pMHsYnVnnmrA5LOP7hwmU5X9LvE7O +api: eJydVU1v2zAM/SsGTxsg1Fmxk0/LugELuqFBv3YIjEKVmVitLamS3C4z/N8HyrLjNM0G7BQleqQeHx+ZFjzfOMhW8FPbx3WlXxzkDLRBy73UalFABo3iVpTyGe9eIujumVvJlQcGhlteo0dLWVpQvEbIIN7fyQIYSAUZGO5LYGDxqZEWC8i8bZCBEyXWHLIW/NZQpPNWqg0wWGtbc0/PNyGLl74iwG2fOlkU0HU5ZXRGK4eOkpzOZvRRoBNWGqoAMrhqhEDn1k2VXEYwMBBaeVSe4NyYSopQcPrgKKadEDOW5PCyf0Hopg+KfKXyuEE7IXgWEB0bRAgvqO3FOggUw/T9Awo/iRr0j+VBx0asaqoKurzr2EH0Ts5VZJYfTTnW3nWU6uPp6aFUt7ySRRAi+Wqttv+vU4Gey4pO0mPtDgGVFnu3BxJFJ0yEGLTu8p0U3Fq+nej4XfcEqQG127zlrAH6A53jG4Qx2XFoECO5ptt/tYHq6p+OuHzq3UHeXt3jZXzp5XvrsQHy7fp6eZCw7+1+U2+G+U0GRyS34/zW6EtNU2606+fZl5BBaiw+S3xJ77nDdJh7l0ZPu7TdjXiXjhsCGDi0z8M2aGwFGZTeG5elqah0U5zwDSrPT7hMuZHwmus83CZnBAUab4eisdJvQ775cnGO22/IC7SQrfIp4IqM2FtrHzZ2lRt5jiRyXFLzxpfayt+9X+KeKvsoUlGqtQ7hUfDI7TMXj6hoJVGdPe3ZyYeT2bFiYkAyXy7iPHER5mngEWDAXsk1CgUMsA7DBB55/Wl3QSypbzVXk3x/7fcew1Eaj798aiouw9wEHm20wgqiFYABmQEYjHaAccnRMdvb+jtP5AxKMle2gralFDe26jr6+alBS53NY5570nnVQiEdnQvI1rxyeMB63Enw7jKO3vsE2NvVDN1X20C3augbMHjE7f4/VVgr5WCuNgLmQqDxk9CDLUguHMdoeXF1DV33B0hBhwo= sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Unarchive Workflow Variant - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + variant + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    + +
    + + artifact_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + artifact + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + + object + + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/unarchive-workflow.api.mdx b/docs/docs/reference/api/unarchive-workflow.api.mdx index c015a7c5ee..27a7b9151d 100644 --- a/docs/docs/reference/api/unarchive-workflow.api.mdx +++ b/docs/docs/reference/api/unarchive-workflow.api.mdx @@ -5,67 +5,598 @@ description: "Unarchive Workflow" sidebar_label: "Unarchive Workflow" hide_title: true hide_table_of_contents: true -api: eJzNV01v20YQ/SvCnBJgY6lGTzxVtRNYTVoLsdwcBMFYkSNxkyWX2Q+5KsH/XszyW5QcxXGAniRxZ97MvBnuPOVg+dZAsIRPSn/ZSPVoYMVAZai5FSqdRRCAS7kOY7HDh8fKCBhkXPMELWryziHlCUIAtcGDiICBSCGAjNsYGGj86oTGCAKrHTIwYYwJhyAHu8/I1Vgt0i0w2CidcEtxnUexwkoyqDMczSIoihVBmkylBg2hXE4m9BGhCbXIKHcI4M6FIRqzcXL0sTIGBqFKLaaWzHmWSRH6UsefDfnkncwyTURYUUYIlSudqoRFanGLupPhlbdgEOGGO2khmBSsocSHS/e3G89XH3ojfRdOGwjzEDpjVdI3qjJZKyWRp1Cw5lHqpAQiqc5tZkZXJULBCA53XDpulf4RxLcNSAkau4SnPwJ44wGKgtVGav0ZQ3tkCt55yoZwBYMELe8nwaNIUI+5nPdoHaRZDWEHtu5yL1Ky7j/pVnc8FoRCh05y/eqdk/IPo9I3t85mzr6Gw1oJRFhMzvTiWvP9k7we+MKA3aec/yQyyWMwof8nUv9SH4Sx36T1VJED9+/jaFGOYnUJnsXAMAXyLVj/Anse1HUHomAQauQWowdunwLs3LsRt/jGCp/P6ShXJexo6slyWfQzgtyXsFWQCCX+hCDXJWwVpKZrvacldl4cv6nOIev3vd9eLV8vGqVmq4lSE/aiUWq6mihGuu1zZ/WOfGl5vFh6Xh18e38cWx1nuDUyoijI/NfLy6Hq+JtLEXlNMXqrtdLPlxwRWi6kFwDlQjg0kCrsnX7P3bsqDnZIW+0HVSZInUnM9phKa/eDMXyL7YV52tSTMVrQ6TGqW4W49HWVoSu7ToNbekt2T5dxXdL3VF9vFov5ALDsbb+p97UIHn1qRXCCNlYkkTNlrBfFNoYAxpnGncDHca39zDjvKONi3ChqYGBQ72oV7bSEAGJrMxOMx6FULrrgW0wtv+BizDPhJ91g6LSwe+8ync/e4/4GeYQaguWqa3BHY1UOSt+s6RHPxHskyir9PnU2Vlr8W3a/UvBx6UWciHSjvHtF39QnN5rOZ8CAyijJmlz8cjGBQwp7xvRG8NC/EXVsfwzsgIWmfmCAiX8dwCJPfmsPKDPqQCU+K7yjHTtYrxUNFv+x40xy4Sfex8+rZi6haia0Ut4Ag6D/V6ft6IpBTNMQLCHP19zgvZZFQY+/OtTUtBWDHdeCr4nCZQ6RMPQ9gmDDpcFBks3lAa8+Vu/I61Grb/rJ141Nqaskz+kXMPiC+4P/Z/4CiOvBySuLaRhiZju+g/uKJqwZ/Pnt3QKK4j/5nOJ5 +api: eJydVU1v2zAM/SsGTxsgxFmxk0/LugENuqFBm66HIAhYmYnVypYryekyw/99oL/i1CkG7JQgeiQfH/mYEjzuHEQreDD2eavNq4O1AJOTRa9MNo8hgiJDKxO1p81rCwIBOVpMyZPl6BIyTAkiQOvVFqXfqBgEqAwieCnIHkCApZdCWYoh8rYgAU4mlCJEJfhDzrHOW5XtQMDW2BQ9Fy7qNF55zYBZmzyYx1BVa07pcpM5cpzlYjrlj5ictCpn8hDBXSElObctdHDbgkGANJmnzDMc81wrWfcaPjmOKQfMcstKeNVUkKZoglrCKvO0IztgeFkjKgG9UFwiO9xsa5HaOPP4RNIPwjrtuwahEj04K7SGal1VYhR+VHTVcluPc/ZtVxXn+HxxMVbpF2oV1xoE36019v8lismj0vxNeUrdGKCNPHkdidNuwUCBTuZqfdQArcXDQMEfpiHI2qdud26rOuhPcg53BH2y96G1GMGSX/+lP/fVlG5xg1Ec5W3Ufb+Nb41854p1kKvlcjFK2Mz2dKj3nWuDh6NrU/KJYU/nxvnaxT6BCMLc0l7Ra/iIjsJueV1Ydl83Kq7C/g6AAEd233m/sBoiSLzPXRSGUpsinuCOMo8TVCHmCt5ym9WvwSVDgZ3sSBZW+UOdb7aYX9PhijAmC9FqPQTc8eI1q3QK66eIubomFrU9SbPCJ8aqP81+tEcpaaJYNZVtTR3eXZmG21eUz5Tx+eE+G9rTyafJ9L1m2oBgtpi3/mEnR/1pbGAg3sjVCwUCKK3NA54w/XJ8YJY8rxSzQb6z8z1h1kvi6bcPc42q9kddv2xHv4J29CCAhw/H2+VAQDRYAKbeb8BaQMIrFK2gLDnw3uqq4p+be89zjJXDR83+2KJ2NGLX3xj4cNta6WMA4jzrZzqM/l/2qAtG1iu0R6u4XL0xopsw82hCZ1JS7gdRo7vGWXqDLG7ullBVfwELanMP sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Unarchive Workflow - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Query Parameters

+
+
+
    + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + workflow + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + flags + object + +
    +
    + anyOf + + + +
    + + is_custom + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_evaluator + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + is_human + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/unassign-role-from-user.api.mdx b/docs/docs/reference/api/unassign-role-from-user.api.mdx index c76f108f6f..7330953d5b 100644 --- a/docs/docs/reference/api/unassign-role-from-user.api.mdx +++ b/docs/docs/reference/api/unassign-role-from-user.api.mdx @@ -5,81 +5,349 @@ description: "Delete a role assignment from a user in a workspace." sidebar_label: "Unassign Role From User" hide_title: true hide_table_of_contents: true -api: eJztVt9v20YM/lcOfFkLCHYW7ElPMxAXNdqhQepsD4kRMBJtXSvdqcdTWk/Q/z7wTrLkeAm2dXnrk607kh/58cexhZw4c7r22hpI4YJK8qRQOVuSQma9MxUZr7bOVgpVw+SUNgrVV+s+c40ZzW7NrVm4Hae3Rik1XtzpXL1i716nal2QWl0ou1W+oCNV0aAKdTkVjQe9dID0Vjmq7AOFo+CceNQbsG6HRv+JEsSTqFOhXi/YmQiH7xEqxDy4MKjQl4bYq1dX8U+v+QbZLy5Xh2t7/4kyH6i5It84M7Bzb22ZqrVrSOntGMyE6a/IipssI+ZtU5Z7lYec5NEYaqbB1tv1+nL5LaOQvFStgj1HSrNCo8g5G3IVQAa/3MhpbomVsV4V+ECqJldpZm2NMFCT21oXo8dsQtk/xGzqHL02uwPaTxwC5RkkYGtyIQ2rHFJoTAz+Tu7vhPM7UYAEanRYkSfHkN60YLAiSGFaX5CAlrKt0ReQgESpHeWQetdQApwVVCGkLfh9LbrsnTY7SMBrX8rBH4Mxtcqh65IDSijBwfyXhtz+P9lfBjNTw49q9fshPkwMPo5CKP1+hCux0nUb0eXaGiYW8fOzM/k5HiAfD5WrrnphSCCzxpPxIo51XeoseDv/xKLTji50Xdcl8Mv5+anh37HUeQxyKVX2L6xC7aTkvI5+5+QlKWkL2lPFpwKlzY5u0ew/bEMJHjMkRPcn2njakYNu0yXDGTqH+wmN7210ELoEKt49x/hvxIw7goOxZyostNxabrsRO86fo2zfhLgidC+3Gc2M9EZ2nw7jItL3d2CDiAyJE4MxtxX5wkrbx6kWutwXkML80Nc8b6c93s3D4IAEmNzDMAwaV0IKhfc1p/N5Vtomn+GOjMcZ6jnWGqRembLGab8PKovL1TvavyXMyUF6s5kKfJRaidk/FjsQj7V+R8JD31qLxhfW9X039FgRtSRQbbY2qPecLIJzanG5ggQkjFjWZ7OfZ2eQPCr2I2Epc8xCmQ/Y4RqSRywc4oekn18peMLq1/FCPKst+wrNxN51P4KVdLp6I8/edRzBR261Y8f9WBR+LAovvyj0refpm5/XJeowOkPNt/3YuBnXAZkQ6aPlIE6OTQKFZS/SbXuPTNeu7Do5jm+iDIdcM96XMie3WDI9U/khoTJSX6unXPxM+8kK8YBlIzLhvXgBnNON4qUR+7VihNnIh9OC8/+zOQxgs59iDr4cZTw8v8Uw4dteZJFJGU6UT7YFCeDwMl0s3y/XS+i6vwDtNX7O +api: eJztVktv20YQ/iuLuTQBCMk1euKpaq0gQlLEcOT2YAvGmByRG5O7zM7SiUrwvxezfMqujbapbzlJ3J3nNzPfTgMpceJ05bU1EMMZFeRJoXK2IIXMOjMlGa/2zpYKVc3klDYK1Rfr7rjChBbX5tqsXMbxtVFKTRc3OlWv2LvXsdrmpDZnyu6Vz+lIVTSoRF3MRbuDXjq49FY5Ku09haMQnETUG7Aue9KZdRka/SdKgr14UJ8Jh+/JQ0h18Dyo0Oea2KtXF92fXvMNsl+db8Zre/uJEh8QuSBfOzOAcmttEautq0np/ZTDDOAvyIrrJCHmfV0UB5WGUqSdMdRMg6232+35+mtCoWax2gR7jpRmhUaRczaUKDgZ4nITlKklVsZ6leM9qYpcqZm1NYJARW5vXZc9JjPI/qHPukrRa5ON3n7gkCgvIAJbkQtl2KQQQ2265G/k/kYwvxEFiKBChyV5cgzxVQMGS4IY5m0FEWjp1gp9DhFIltpRCrF3NUXASU4lQtyAP1Siy95pk0EEXvtCDv4YjKlNCm0bjV5C5w3mP9fkDv/J/jqYmRvuWvTbLX9w2cOYBcBvN3whVtp2J7pcWcPEIn56ciI/xyzxcexTddELQwSJNZ6MF3GsqkInodjLTyw6zRRC27ZtBD+dnj42/DsWOg1qai099S+sQuWkwbzu4k7JSwniBrSnkh8LFDY5ukVz+LAPDXeMkADdn2jjKSMH7a6NhjN0Dg8zGN/bLkBoIyg5ew7x34gZM4LR2DP9FAZsK7ft5Ltjm6NqX4W8Ote93G4yM8Hboft0GmcdfH/nbBARSnhksKttST63MuQdh4WZ9jnEsBynmJfNfKLbZaAJiIDJ3Q+jX7sCYsi9rzheLpPC1ukCMzIeF6iXWGmIHjTQKtyqX0UUpJmZktppfwj2Vuebd3R4S5iSg/hqNxf4KI3Utcax2FgVrPQ7EpD6uVvVPreuf1qGAcw7LUFBm70N6j1gfWy/YHJHRqhA8uzCPln8uDh5KpleQa3ON/08YBLmYYgjiEH0AK4RKIh6WovBE5Y/TxcSZWXZl2hm9i57ZlZCCeqNvIaXHTMfhddMo/l9bfi+NrzY2tBPn6evflkVqAO1hlZvelq5mpYDYZD4warQMcsugtyyF+mmuUWmS1e0rRx3b6bwQ6oZbwvh0T0WTM80fCioUO5r9VSId3SYLRT3WNQiE96TF/Az7hcv7ajfNiY3O/lwWvz8/yAO1GsOc59DLEeFDq9yPnB704usEum+mfKjJUISGB+ss/X79XYNbfsXsWB6XA== sidebar_class_name: "delete api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Delete a role assignment from a user in a workspace. Args: - workspace_id (str): The ID of the workspace. - email (str): The email of the user to remove the role from. - organization_id (str): The ID of the organization. - role (str): The role to remove from the user. - request (Request): The FastAPI request object. +workspace_id (str): The ID of the workspace. +email (str): The email of the user to remove the role from. +org_id (str): The ID of the organization. +role (str): The role to remove from the user. +request (Request): The FastAPI request object. Returns: - bool: True if the role assignment was successfully deleted. +bool: True if the role assignment was successfully deleted. Raises: - HTTPException: If there is an error in the request or the user does not have permission to perform the action. - HTTPException: If there is an error in updating the user's roles. +HTTPException: If there is an error in the request or the user does not have permission to perform the action. +HTTPException: If there is an error in updating the user's roles. - - - - - +> - - - - - +

+ Path Parameters +

+ +
+
    + +
+
+ +
- - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + + +
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-app.api.mdx b/docs/docs/reference/api/update-app.api.mdx index 4a27ce4da7..0ba076482c 100644 --- a/docs/docs/reference/api/update-app.api.mdx +++ b/docs/docs/reference/api/update-app.api.mdx @@ -5,77 +5,355 @@ description: "Update an app for a user or organization." sidebar_label: "Update App" hide_title: true hide_table_of_contents: true -api: eJztVk1v4zYQ/SvEXJoFVDsNetKp6m6AGNt2g2y2l8QIJuJY4lYiuSSVxBX03xdDSpadNG7RFuilhgHTmu83M4/qIWDlIb+BwloP6wwk+dIpG5TRkMMnKzGQQC3QWrExTqDoPDlh+FuhVr8jqy5u9a0uXOXzWy2EYO07JcWJD+5NLq5rEqt3wmxEqIlli6RlcdsYlOIkhSmsHZUnQWl0QKWVriZLobGlGO2KQuf0FHDn4UMXbBeSGxPPz71oemy2onSEgST7/MZzdqjlnnNUnibfF9fXl+dPJUVQcrGKZTgSyjMw5Jxxyd1+nsbFYwRLGvJCmyBqfCBhybXKe2W0CEZgWZL3O2AgA2PJRVBXEnLoYmF3aC1kYNFhS4Ect6wHThdySGBDBopbZjHUkIGjL51yJCEPrqMMfFlTi5D3ELaWrXxwSleQQVCh4QeFtWIlYRjWyZp8+NHILZs8d8aIkg4sQmsbVcZ8l589D02/F8s6riYo8qPuXcr5eBa/sM4wZJOSuf9MZTgo6mZ2tp6Nd1MAw8D2jrw12qfoZ6en/HM44B+7iP+ma8TVqAz/qD4l/wrG2b+PRZyAo6Ck1Rih+f7s7CUav2KjZKxVnPNY/30oJAVUDZ9UoNa/VGhMeSBFvf2wiVN9iMaQ7Z4oHagiB8N6hgOdw+0eZD+ZlCBD3PrqGLo/k/dYEeycva4awRDXLP2zVnBdKfSot9eJGd6E7utlvEvw/VGwSYVZ6YXD1NuWQm1k4oKyjrwRashhidb6ZZ+mZYAMPLmHiUw610AOdQjW58tl2ZhOLrAiHXCBaolWARODp7JzKmyjSXG5ek/bC0JJDvKb9b7CRx6M1OpDtR3KaNV74qJHGiu6UBs3XigTm9XJiqvikbuaeen8CVvb0CGvzFMDSm9MjDYtU6xFFJcryICrTiN/uvhucQrP770D5Xh/lHEFplSjGLJnoO3gggyojfMPgbD9YRZwIdb40KLe8zdes0Uk+YNM+nkB/7+M/4PLeJzVQE9haRtUkVhi1/txqyL7esggH1l4nUFtfGBJ39+jp0+uGQZ+/KUjx5uzzuABncJ7HsybHqTyfJaQb7DxdGQETq5GqnkjXktu2i7Nq/WATcf/IIPfaDu/K0QKrafF7Ufh2xTn20h0s/EL3mdOThZFyZ04qrve46PL4vrtBWRwP75XtEaykcNHZlF8TJmaWHikjvishwZ11TFX55Cc8ucrw6GrnA== +api: eJztVk1v4zYQ/SvEXJoFVDsNetKp2myAGNt2g6y3l8QIJuJY4q5EckkqiSvovy+GlPyRNG7RFuilRgArmjdfjzOP7iFg5SG/gcJaD6sMJPnSKRuU0ZDDJysxkEAt0FqxNk6g6Dw5YfivQq1+R4bObvWtLlzl81sthGD0nZLixAf3JhfLmsTinTBrEWpi2yyhLG4ag1KcpDSFtSN4MpRGB1Ra6WryFBpbitmuKXROTwm3ET50wXYhhTHx+XkUTY/NRpSOMJDkmN95rg613AuOytMU+3K5vLp4KimSkotFbMORUJ6JIeeMS+H26zQuPkaypCEvtAmixgcSllyrvFdGi2AEliV5vyUGMjCWXCR1ISGHLjZ2h9ZCBhYdthTI8ZH1wOVCDolsyEDxkVkMNWTg6GunHEnIg+soA1/W1CLkPYSNZS8fnNIVZBBUaPhFYa1YSBiGVfImH94auWGX58GYUdKBTWhto8pY7/yz56Hp93JZx90ERX7E3qWaj1fxK2OGIZtA5v4zleGgqZtdsNXOeTsFMAzs78hbo33KfnZ6yl+HA/6xi/yvu0Zcj2D4R/0p+Vc4zv59LuIEHCUlrcZIzY9nZy/Z+A0bJWOv4oLH+u9TISmgavhJBWr9S0BjygMr6s2HdZzqQzaGbPtG6UAVORhWOzrQOdzsUfazSQUyxa2vjrH7C3mPFcE22OvQSIZYsvXPjoL7SqlH3N5J7OhN7L7exrtE3x8lmyCsSi8CprNtKdRGJi0o66gboYYc5mitn/dpWgbIwJN7mMSkcw3kUIdgfT6fl43p5Awr0gFnqOZoFTy/HIpoFecMBVYNT2XnVNjEeMXV4j1tLgklOchvVvuAjzw1aQ4OYdsjQKveEzMyalzRhdq48baZpK5OXtwyz+P1TrQunrC1DR2Kzm6kQOm1idmmTUutvMXyC2leJKYldXk6+2F2+lrvo4MorhbjrmAZd2UqO8Ige8bullfIgNq4KBAI2592Bm7KGh9a1Hvxxvu4iLfBQUX9blP/v7X/g1t7nNtAT2FuG1RRgeKp9+P6RZn2kEE+yvUqg9r4wJa+v0dPn1wzDPz6a0eOt2iVwQM6hfc8pDc9SOX5WUK+xsbTkRE4uR416Y14rbhp0zSv2QM2Hf8HGXyhze5HRdTaelrifjSepzzfR0XcOb+4IFi8k0dR8kkcxa72hOuqWJ5fQgb34w+Q1kh2cvjIcouPqVITG48yEt/10KCuOhb1HFJQ/nwDDBi6Kw== sidebar_class_name: "patch api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Update an app for a user or organization. Args: - app_id (str): The ID of the app. - payload (UpdateApp): The payload containing the app name. +app_id (str): The ID of the app. +payload (UpdateApp): The payload containing the app name. Returns: - UpdateAppOutput: The output containing the newly created app's ID and name. +UpdateAppOutput: The output containing the newly created app's ID and name. Raises: - HTTPException: If there is an error creating the app or the user does not have permission to access the app. +HTTPException: If there is an error creating the app or the user does not have permission to access the app. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-evaluation-scenario-router-human-evaluations-evaluation-id-evaluation-scenario-evaluation-scenario-id-evaluation-type-put.api.mdx b/docs/docs/reference/api/update-evaluation-scenario-router-human-evaluations-evaluation-id-evaluation-scenario-evaluation-scenario-id-evaluation-type-put.api.mdx index f6f00a0c9a..2669342041 100644 --- a/docs/docs/reference/api/update-evaluation-scenario-router-human-evaluations-evaluation-id-evaluation-scenario-evaluation-scenario-id-evaluation-type-put.api.mdx +++ b/docs/docs/reference/api/update-evaluation-scenario-router-human-evaluations-evaluation-id-evaluation-scenario-evaluation-scenario-id-evaluation-type-put.api.mdx @@ -5,73 +5,552 @@ description: "Updates an evaluation scenario's vote or score based on its type." sidebar_label: "Update Evaluation Scenario Router" hide_title: true hide_table_of_contents: true -api: eJzdV0tv4zYQ/ivEXNoCWjsN9qRT3W2AGNsmRuLk4hgCLY1tbiVSS1JJXEH/fTGkZD3sOMm2wALNJQk5L37zzUMlWL4xEC7gssi4/HDxyNOCW6GkgWUACZpYi5z+hxDu8oRbNIxLhns5ZmKUXAv1k2GPyiJTmplYaWQrbjBhSjJhDbO7HEcP8kHecGHQhA+SMcYu5/PZxXOMzkPIpmtWOB9szUVqyFQheWG3Sot/MPH6aAstGwNXSmLIzs8+sivFPilpUVpmLLeFYbFKkBU5hVjEMRqzLtLa/ggCUDlq94JpAiH486h9V9S8K9KqsKijLQHUETBRV1ok0VHlo4ck3L0gcKIoLywEkHPNM7SoKSslSJ4hhNDzBAEIykfO7RYC0Pi1EBoTCK0uMAATbzHjEJZAdiEEY7WQGwjACpvSQZtlNk2gqoJjfjrR/pcOb2uzJzw7K9/rEmWREZ99uni0iiwa6++MkJsUo0wlmLpj4vhhjHMyWVVL7xaN/V0lO/I1jCL2hKMrnuepiJ36+Iuhcik7Qeaa2GYFGvqPysTpyN312mW5/whCpT6RRZpC1YnynnQrAkDptxoR0uIG9Um7t85eRW/SGmMbcWmeUH9vmJ+8FTbxVqoAVGHzwpq+QWExM0cA4lpwaYl5J0h176UckYK9jvfzFr1rL1lVQSOqVl8wtj26LbrBHHjpvNj1z5ZDDc0bJ3sfXGu+O4nddY1URSXwZsycaOSL6eW3T0mKXZFUYz6imN+gdO/EXkOrE0bf/utQOTfvQmoq90CZKBdSYnKUsCulUuTytC3DZt5CFYD8FxV65Sr0CEyvPN9PV6gq0tVociWNT+352Rn96g/j23am3dTC8PaO5L18PD8/NHzPU5H4Xn2htdLvsDqgZIKWi9SR8zhnUxX3bt/Ty5ZDorQA/6l8gJTJzGxOUfsvNIZvsGXdiRlGYLB6NpwuAnqXd13LdRv4Hl6P7svP+MPDd5JK8/nswKDPbYZ2q2izadYKu4UQxm4sfuhsMeOyt1tU4yMrQE+msxdUvQsKsqIpi/qxWV8KnUIIW2tzE47HcaqKZMQ3KC0fcTHmuXClYzAutLA7pzKZTT/j7hJ5QuNnsewK3BLTPHf6Yvu08Vx8RkKxXism9fboCVEvFVuvRTARh2/aKX/xzLM8xXZKtzyoJ257MJyU7c1+1i36s6yVGE6rPdOXbdNf9Jt6q9xr2z3Ntgv6BUX23uA6/lo5tGoCTVwu2GQ2paBQG98Dzka/js5guP/3hKkn8Nj1hAZqdw3BIOn7dNNylrmGABZ59lt7QYnIlbEZlx17viGyY7vjjVvJhwGWbaP6n32r1OS2+GzHecqFa20O5rKu7Hrh7VY2BBAOvxuO1PFArL/2h8O1fBnAVhlLDsuSULvTaVXR8dcCNVXwsmb3igi2KCERhv5OIFzz1OCJnP18U/fQX9hLb26qXO5cEfkKgAD+xt3BVxJNjR/jvIvhj4vCCbo5uW2aaVlL1ez7MPdfWo2Vg+FOwXuNSUzMPym77Ayd2d0cAljV3030wQUhaP5Eg5I/+YBV7mlKH1Z0VkLK5aagcRyCN0k/3wD7w9F0 +api: eJzdVktv4zYQ/ivEXNoCWjsN9qRTvWmAGNtmjcTZi2MItDS2uSuRWj6SuIL+ezEkbcmPGPsosEBziUzOfDOcxzfTgOUrA+kMblzF5ZvrJ146boWSBuYJFGhyLWr6DSk81AW3aBiXDHdyzOQouRbqF8OelEWmNDO50sgW3GDBlGTCGmY3NQ4e5aO848KgSR8lY4zdTKeT65ccvYWUjZfMeRtsyUVpCMpJ7uxaafEPFkEfrdNyC3CrJKbs8uItu1XsSkmL0jJjuXWG5apA5mpy0eU5GrN0ZcQfQAKqRu1fMC4ghXCede/Ktu/KtHIWdbamAPUETNaXFkV2UvnkIQn3Lyg4WVY7CwnUXPMKLWrKSgOSVwgp7FmCBATlo+Z2DQlo/OKExgJSqx0mYPI1VhzSBggXUjBWC7mCBKywJR10WWbjAto2OWWn5+1/afA+wp6x7FG+1yRKV1E9h3TxbJFZNDbcGSFXJWaVKrD0x1Tjxz5OCbJt58EsGvtOFRuydehFHgqOrnhdlyL36sNPhtql6TlZa6o2K9DQL2oTryM3H5Y+y/uPoKjEE+nKEtqelx9Jt6UAKP21IEJaXKE+i3vv8Vp6k9aY24xL84z6e928CihsFFDaBJSztbPmJCDXmm/O4n2I2i2VxQ/gjOUOxmS1kJKSeQJpoVSJXJ7HMmwSENoE5A/k9NbntE22AmrxCXPbax/PzV19blso8DG0LelqNLWSJlTY5cUF/dun7/uOBe+iMHx9DQcrby8vj4E/8lIUobuvtVb6G1APOqNAy0VJX8JiZY4FSpXv3X5L9c+7CIdC6QL8lwoOUiYrszpHZX+jMXzlWyWInGE9CgaLbHKc3Y5NZv5dwXSU67f8Lrwhuq8/488QvrOlNJ1OjgBDbiu0a0WzcDuI7BpSGHoifdObe8Nmbxq1wxNDY0+mN0navQtysiVeRv20HXhOl5DC2trapMNhXipXDPgKpeUDLoa8FnC4loz8LbsiUd9XBnOnhd14vNFk/B43N8gLYrPZvC9wT2UYCmtfrGOUWrxHCnGcUqO4jIRqiTNqHbQohlTgd93QuH7hVV1iR/pdkUQC7w4Oibe72VHnrIEnrgWXloZyT2J7GiR7bTDv+HLWhM8sPmWnHE4pK3ig2VFkmHdy7w2ei5fKRytWV0zFO55/RklrA6U1ZOli8Pvg4rXcRQU2mowjefDck8c27F4MkoPq2NUFzf3KMwdY5NUf3QUlpVbGVlz28AJzslNryZ3f9g4dbTpG+5+twbHQLb7YYV1y4TnQh7mJFBB3qT4FQALp4Up6ouEPxPY3yvRw45snsFbGksGmoag96LJt6fiLQ03dPI+VvqBimzVQCEPfBaRLXho8k7Nf7yLZ/sZee/O24+XGN1ToBkjgM26OFnAaLz/HeD+GP88LL+gH6npLrE2UitX3ZhqW+C3K0RZAzgeNUU6Vf1Z23ptOk4cpJLCIKznt8pCC5s80UflzcFjVoUxpZ6ezBkouV47mdgoBkv7+BV6vPIg= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={ + "/human-evaluations/{evaluation_id}/evaluation_scenario/{evaluation_scenario_id}/{evaluation_type}" + } +> Updates an evaluation scenario's vote or score based on its type. Raises: - HTTPException: If update fails or unauthorized. +HTTPException: If update fails or unauthorized. Returns: - None: 204 No Content status code upon successful update. +None: 204 No Content status code upon successful update. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + vote + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + score + object + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
    +
    + +
    + + correct_answer + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + outputs + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + inputs + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + is_pinned + object + +
    +
    + anyOf + + +
    + boolean +
    +
    +
    +
    +
    +
    + +
    + + note + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-put.api.mdx b/docs/docs/reference/api/update-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-put.api.mdx index 0b747730b6..6191952abf 100644 --- a/docs/docs/reference/api/update-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-put.api.mdx +++ b/docs/docs/reference/api/update-evaluation-scenario-score-router-human-evaluations-evaluation-scenario-evaluation-scenario-id-score-put.api.mdx @@ -5,73 +5,326 @@ description: "Updates the score of an evaluation scenario." sidebar_label: "Update Evaluation Scenario Score Router" hide_title: true hide_table_of_contents: true -api: eJzdVU1v4zYQ/SvEnFpAsd1gTzo1bQMk2HYb2EkvjmGMpbHFrURy+ZGNK+i/F0PKtvyR7PZaX2yTw8eZN28eW/C4cZDP4S40qK5uX7AO6KVWDhYZlOQKKw3/hxyeTImenPAVCVdoS0KvBSpB+0PCFaTQSj16Vs9qitKRy5+VEELcPT4+3L4WFMFyMSP7QlaQtdoKuY6YA5wQrxJrlLVLWOSDVTuwT1pRLq4nH8QnLX7VypPywnn0wYlClySC4WRCUZBz61D3eCPIQBuy8Y77EnJI68vDzctdBctY4dLq4MkuK2ZnEOYuHrm4KMtlj2WChwwMWmzIk2XaW1DYEORw+SRkIJl5g76CDCx9CdJSCbm3gTJwRUUNQt6C3xpGcd5KtYEMvPQ1Lxz6KWY9rLgvoesWCY2c/0WXW4Y4BS8SrbyFxtSyiDDjz4610A7uNpY59ZJcWteWBimp0KzIDlKaxYCuy3YRevWZCn9U3ryHWVyqZFdIBEqahK5jQEvOaOVSIteTCX8dS3h2kMS0D4bvLzXd8uH6+hz4L6xlmYi+ZU3/B9QTAkvyKGv+JT017jyg1sXRLqrtn+uopWMVdNl+RSpPG7LQLQ60o7W4HfTld50ShC6Dxm3eU9Uf5BxuCPZg7wgwDvgj736r5VxXurqPG3T/QG9i9+0yfkv0XbpsF8JWdAaYetuQrzQbw25WfQU5jOP4Xw3Gf3xhXsft5SHuxknMGbhoemnug60hh8p74/LxuKh1KEe4IeVxhHKMRgLPqKMiWOm38cjNw/1H2t4RlmQhny+GATNWU9LHcdi+NWjkR2Kmese5Cb7SVv6Tmt4bTZVOMRWs0+nBIm5fsTE1DUZ80vGhtY539NTexArEzcM9ZMC1pumYjH4aTeD0PTkK5mnBIk7LLsG4DdkJVXuSIANq4qiAJ2x+Pmxw+kY736Aa4CWrEJcsMVqJmEavP02zPQzy/+MF7PXg6dWPTY0yTnzkuO0FP4czwTPZ5+qGDPI3X669hVfaeQZt2xU6erJ11/Hyl0CWhb3I4AWtxBUraN5CKR3/LiFfY+3onXb8MO3t40fxVl078StWPmfK/yCDv2n79qsbbbLazVnbB/csX0UzO4CdeTv7bjpxU3C3341dDDzn4ekRMlj173GjSz5i8Sv7JH5NeWuT2sEPNq+1UKPaBHbjHBIkf/4F55hy1w== +api: eJzdVU1v2zgQ/SvEnLaAYrtBTzqt2wZI0N1uYCe9OIYxlsYWW4lkSSqNV9B/L4aUbfkr3b3WF9vk8HHmzbzHBjyuHaQzuK0rVFc3z1jW6KVWDuYJ5OQyKw3/hxQeTY6enPAFCZdpS0KvBCpBu0PCZaTQSj14Uk9qgtKRS5+UEELcPjzc37xkFMBSMSX7TFaQtdoKuQqYPZw6XCVWKEsXscjXVm3BPmtFqbgevROftfiglSflhfPoaycynZOoDSdTZxk5t6rLDm8ACWhDNtxxl0MKcX2xv3mxrWARKlxYXXuyi4LZ6YW5s0fOLsp80WGZ2kMCBi1W5Mky7Q0orAhSOH8SEpDMvEFfQAKWvtfSUg6ptzUl4LKCKoS0Ab8xjOK8lWoNCXjpS17Y91NMO1hxl0PbziMaOf9e5xuGOAbPIq28hcaUMgsww6+OZ6Hp3W0sc+olubiuLfVSUnW1JNtLaRoC2jbZRujlV8r8QXmzDmZ+rpJtIQEoziS0LQNackYrFxO5Ho3463CEp/uRmHTB8N9Ljbe8u74+Bf6Cpcwj0Tc80/8D9YjAnDzKkn9JT5U7DSh1drCLavPPKszS4RS0yW5FKk9rstDO97Sjtbjp9eUvHROENoHKrV+bqr/JOVwT7MBeGcAg8Afe/VXLua54dRfX6/6e3sju5TI+RvrOXbYNYSs6AYy9rcgXmo1hq1VfQArDIP+rnvyHZ/Q6bM6LuB3GYU7ABdOLuq9tCSkU3huXDodZqet8gGtSHgcoh2gkHNvvOOyKDxwKLGBHWW2l3wS88f3dJ9rcEuZkIZ3N+wFTHrU4PIdhu76hkZ+IaezsaFz7Qlv5b5yIzoWKeIp54iGe7P3j5gUrU1JP/6OWD610uKPjvSvgPWbfSLG3MRmxttHg7WB0qeLugBjf33WywizIaptsCIPkiNMdm5AAVUFT4AmrP/cbXIrRzleoenjRU8Q57wyeIybhUThOt9kr/vd4KrvZ8PTih6ZEGawhcNx0ypjBiTKY7FMZQALpxSdu5/WFdp5Bm2aJjh5t2ba8/L0my0M+T+AZrcQlT9OsgVw6/p1DusLS0Svt+GPS+cwbcamurRAUq4Az5X+QwDfaXH6eg58WW801XXDH8lVwvT3YySPABh1PjDPu9qux85453T8+QALL7uGudM5HLP5gQ8UfMW9tYjv4Zee1BkpU65ptO4UIyZ+fGoWBZg== sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Updates the score of an evaluation scenario. Raises: - HTTPException: Server error if the evaluation update fails. +HTTPException: Server error if the evaluation update fails. Returns: - None: 204 No Content status code upon successful update. +None: 204 No Content status code upon successful update. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-evaluator-config-evaluators-configs-evaluator-config-id-put.api.mdx b/docs/docs/reference/api/update-evaluator-config-evaluators-configs-evaluator-config-id-put.api.mdx index 414b3175c8..c5c9ddba0d 100644 --- a/docs/docs/reference/api/update-evaluator-config-evaluators-configs-evaluator-config-id-put.api.mdx +++ b/docs/docs/reference/api/update-evaluator-config-evaluators-configs-evaluator-config-id-put.api.mdx @@ -5,70 +5,366 @@ description: "Endpoint to update evaluator configurations for a specific app." sidebar_label: "Update Evaluator Config" hide_title: true hide_table_of_contents: true -api: eJzNVktv2zgQ/ivEnLaAameDPelUNw3QIN1dI49eHMNgpLHNrkSy5CitV9B/L4aULcl2nCKX1hfb5Dy/+WaGNZBceUhncPkki0qScR7mCeToM6csKaMhhUudW6M0CTKisrkkFLgVF5nRS7WqnGRhL5bGCSm8xUwtVSaktaMH/aBvkCqnffqghRDik/I023m8CBY+vJ+nYiIK5UmY5XMOhHn8ghn5ESRgLMbDqxxSiIEtdnqLqNcd+PbELw6FVL5Y2IogASudLJHQMSo1aFkipHBEARJQDI6VtIYEHH6tlMMcUnIVJuCzNZYS0hpoY9mEJ6f0ChIgRQUf7PIXEQBxlUPTzKMp9PTe5BvW37ecGU2oia+ktYXKAgbjL55rVfccW8cIkULP/2ImNUi9+XcZchsG1iS7E10VBXAk21D/Yd0m6cHwH25ea6zL+xo3bNUjkdIrv+CLGGxnV+a54vxkMe2lE5FoPURKnPR527oQn6OLptnX7ldwdhBSz9R94NkeeaFp2KRDb432MYfzszP+GrbSbZVl6P2yKsRNKwyvLqnKT/GL6ZTsyv6c1La01hnGYXHa5jRKiWj7gA4vU/0XljyBzKEkzBeSTgV7EaXEhO23Y+UlnUiKqPMCtcLkCFUZgL6P5iDaQRjHWmnAwr/Ozw+J91kWKo8j9NI5417PuhxJqiLwj7D0hwKFyQa3PzEklCZcoYNm3qEnnZObHsafTAyQq1L61aly/I3ey1XgdRQ5QU0GQ9zx7UuV47yi61auV4kO3oju82l8iPAdc7YV+Xh3Nz0wGGtbIq0Nr7vttqI1pDDulty4XXLj+sjOaoBbzz1tt1vlCkhhTWR9Oh5nhanykVyhJjmSaiytCh3lMaucok1QmUyvrnHzEWWODtLZvC9wy4yJHBiK7eCXVl0Hcrd7dVLR2jj1fyxsu1HXUYvTZS7edOvw8rssbYHdOuvquTeLuovDUcOGlV6aEFcL+SRkLSbTK0iA8Yldczb6c3QG+++hgTB3kcyoF1O85qYdwLsDlqMtQwsBoSzfdRccmTWeSql79uJwEfvvhf2w6q6hf9cXW8sCwu80toVUoZcDSnVL5VlXSB/BZTJDAumxJ9g8gbXxxGp1/Sg93ruiafj4a4WOCTtP4Ek6JR+5yrMacuX5dw7pUhYeT0D4x03b+m/Ec5FvSa2Z0YFekAIkEBl4LOAw39bb5qlbyYvo9G2YQp2lg6HMAzNqTLIMLZ2UnfeGxfT+DhJ4bB+UpclZxclvPODktxi0CRiE5g1nNRRSryoeoylEk/z5ATGJP5A= +api: eJzNVktv4zYQ/ivEnFpAtdOgJ53qZANskG1r5LEXxzAYaWxzVyK55Ci7rqD/XgwpW5JfKXJpc0lCzovf982MaiC58pDO4OZVFpUk4zzME8jRZ05ZUkZDCjc6t0ZpEmREZXNJKHBrLjKjl2pVOcnGXiyNE1J4i5laqkxIa0fP+lnfI1VO+/RZCyHEJ+Vptst4HSJ8uJqnYiIK5UmY5akEwrx8wYz8CBIwFuPhbQ4pxMIWO79F9OsOfHviF4dGKl8sbEWQgJVOlkjoGJUatCwRUjjiAAkoBsdKWkMCDr9VymEOKbkKE/DZGksJaQ20sRzCk1N6BQmQooIPdu8XEQBxm0PTzGMo9HRl8g3770fOjCbUxFfS2kJlAYPxF89c1b3E1jFCpNDzf/ElNUi9+WsZ3jYsrEl2J7oqCuBKtqX+yb5N0oPhK27eG6x79x1uOKpHIqVXfsEXsdgursxzxe+TxbT3nIhEmyFK4mzOhzaF+BxTNM2+d5/B2UFJvVBPQWd74oWm4ZAOvTXaxzdcXlzwr2ErPVRZht4vq0Lct8bwbkpVfk5fLKdkR/spqy211hnGYXE+5jRaiRj7QA5vS/0/pDyBzKEkzBeSzhV7Ha3EhOO3Y+UtnyiK6POGtMLkCKwMQN9Hc1DtoIxjrTRQ4W+Xl4fC+ywLlccReuOcce9XXY4kVRH0R1j6Q4PCZIPbfzEklCZcoYNm3qEnnZObHsafTCyQWSn96hwdf6D3chV0HU3OSJPBEI98+xZz/K6YurXrMdHBG9E9/YwPEb5jybYmHx8fpwcBI7cl0trwuttuK1pDCuNuyY3bJTeuj+ysBrj13Ot2u1WugBTWRNan43FWmCofyRVqkiOpxtIq2P8UmIRbcc2mod08ZpVTtAnxJtPbO9x8RJmjg3Q27xs8sJyiQIZmO26kVXdB+e3SnVS0Nk79HVlv1+06ejEWLNT7blfe/JClLbDbdR3Ze4OquzicQxxY6aUJdbV8tI++ktlX1NyqDGDE42L06+jiFEqtg5hMb9t2kxn16otm3N0DHnYMcOVl6DUglOXv3QVXaY2nUupevDiFxP6HxX55ddf5/9dPu1YRhD9obAupQtMHlOpW87OOVB/BZdVDAumxb7V5Amvjid3q+kV6fHJF0/Dxtwodi3eewKt0Sr4w47MacuX57xzSpSw8noHwp/t2RvwsTlW+FbhmdQepQQqQQFTjsYLDIFxvG6luLa9j0l/CuOoiHUxvnqzRY5JlaOms7bw3VaZPj5DAS/vlWZqcXZz8zpNQfo9Fm4BBaORwVkMh9arieZtCDMk//wD3SU4f sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Endpoint to update evaluator configurations for a specific app. Returns: - List[EvaluatorConfigDB]: A list of evaluator configuration objects. - - - - - - - - - - - - - - - +List[EvaluatorConfigDB]: A list of evaluator configuration objects. + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + name + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + evaluator_key + object + +
    +
    + anyOf + + +
    string
    +
    +
    +
    +
    +
    + +
    + + settings_values + object + + required + + +
    +
    + anyOf +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
    + + settings_values + object + +
    +
    + anyOf +
    +
    +
    + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-human-evaluation.api.mdx b/docs/docs/reference/api/update-human-evaluation.api.mdx index d18c3e78e4..f9cdfce2dd 100644 --- a/docs/docs/reference/api/update-human-evaluation.api.mdx +++ b/docs/docs/reference/api/update-human-evaluation.api.mdx @@ -5,73 +5,346 @@ description: "Updates an evaluation's status." sidebar_label: "Update Human Evaluation" hide_title: true hide_table_of_contents: true -api: eJzlVt9vo0YQ/ldW89JWInYa3RNPpT03QZcmkU2uUh3L2sDE7BV2ud0hiQ/xv1ezYIPtS9Q+1y+G+bUz38x8SwMkNw7CJVzVpdRns2dZ1JKU0Q5WAWToUqsqfocQ7qtMEjohtcC93Q9OOJJUu8mDftBzqRy68EELIcRVktzNXlP0/qGInwTlKFJT1KV2Qmn/SuhIOCSRGaENiVJSmosXRblXK13VtDd+llZJTd1RSLXVu7NujMZQROLi/IO4MeI3owk19amJ1GQYCKUzlUpSeiMol+Qj1r4m8SKdcHWaonNPdTGBAEyF1hcYZxBCZ7bOGaT1UDwEUEkrSyS0jGIDWpYIIQwma5VBAIrxqyTlEIDFr7WymEFItsYAXJpjKSFsgLYVOzuySm8gAFJUsGDoiogzaNtVFwQd/WqyLXsex0y7+lklq6rwZRs9/eK4kc3oyMpyoaTQebmHy3vp7e2Tr+g4KdR1yQMz+xxd30dJfHuzjm/iJI6u479mHyEYKxZJNE+Ohb/HN/Hi6i3p+s84uVrP5vPb+eLIIoqvj72iy8v57PJAv/oebgtf2IxTb4N9TbouCmhXbRvsJObxC6Y0gt6vxRCnWwFoW/ax6CqjXQfdxfk5/x1uzGI/UmLeG8O/b053yoeLi9PAn2Whsm4iZtYa+x+iHrU8Q5Kq4CdFWLpTg8KkB9q3JmOEq9KEG7QM7R5Zaa3cjoC9Nl2C0AZQus174/8HOic3CPtg72wKgyES1n6vq8OaLH1d3dG93WhwBng7dN8u42MH37sjlCR3JwG73pZIuWF+qWryXEI5hDD1NHM2cIibNgeE0kIADu3zjnRqW0AIOVHlwuk0LUydTeQGNcmJVFNZKWDKcJjWVtHWu0R38SfcXqHM0EK4XI0NFjwqXfMPzfa4y0p9Qoahp7uoptxY9W1Hip7u8s6L6+QhnA+MNXuVZVXgmHHeopOWgz0Zf3aPZ+QrE9FdDAEwBt1KnE9+npzD8Z11YMwrIlO/IrvEvRqCIwj34DHflX4/gFCWvwwKLqsyjkqpR/E6fhCeNcRsfE8cpNUM2/r/ulX7+SF8pWlVSOXX32Pf9NO/hJPphwDCwwt1FUBuHLF10zxKh/e2aFsWf63R8oSvAvBlPfLILBvIlOPnDMInWTh8px8/znuS+Em8lfBuCzSvACfGbxDA37g9ufs9B+a7PWt6mx7JM89UQ4wT4mZS7TyilFv+ru1qRCh39wkE8Nh/HpQmYxcrX5gE5UuXrqk6ePn7gWUNFFJvaqbaELqQ/PsHaeR2tA== +api: eJzlVk1v20YQ/SuLubQFGMk1cuKpTKLaRFzbkOgUqC0Ia3IsbkLuMrtD2yrB/17MkhIpKTLac32xuPOx897MPLIBkmsH4T1c1qXU72bPsqglKaMdLAPI0KVWVfwMIdxVmSR0QmqBO7+fnHAkqXaTB/2g51I5dOGDFkKIyyS5nb2m6ONDET8JylGkpqhL7YTS/pHQkXBIIjNCGxKlpDQXL4pyb1a6qmnn/Cytkpq6q5Bqq7d3XRuNoYjE+dl7cW3ER6MJNfWlidRkGAilM5VKUnotKJfkM9Yek3iRTrg6TdG5p7qYQACmQusBxhmE0LmtciZpNYCHACppZYmElllsQMsSIYTBZaUyCEAxf5WkHAKw+L1WFjMIydYYgEtzLCWEDdCm4mBHVuk1BECKCj4YuiLiDNp22SVBRx9MtuHIw5xph59NsqoKD9vo6VfHjWxGV1aWgZJC5889XT5Kb26ePKLDolDXJQ/M7Et0dRcl8c31Kr6Okzi6iv+afYJgbFgk0Tw5PPw9vo4Xl6dOV3/GyeVqNp/fzBcHHlF8dRgVXVzMZxd79uWPeFt4YDMuvQ12mHRdFNAu2zbYnpjHr5jSiHq/FkOebgWgbTnGoquMdh1152dn/G9/Yxa7kRLz3hn+fXO6W96fnx8n/iILlXUTMbPW2P+Q9aDlGZJUBf9ShKU7dihMumc9NRkjXpUmXKNlanfMSmvlZkTslekKhDaA0q3fGv8/0Dm5Rtgle2NTmAyRsPVHXR3W5N7j6q7u/UaDM9DbsXsaxqeOvjdHKElujxJ2vS2RcsP6UtXktYRyCGHqZebdoCFu2uwJSgsBOLTPW9GpbQEh5ESVC6fTtDB1NpFr1CQnUk1lpeBQyiNvFR/ZFVhPHKa1VbTx+aLb+DNuLlFmaCG8X44dFjxH3WTsu+2aIiv1GZmjXgujmnJj1d9bxfRamHdRTAJP6HyQs9mrLKsCx3J0SmtaTvZk/N092T2wDzL9hpqVl0nqMJ9Nfp2cnWKiDxDRbdzvkkz9Lm1BeDcIDrjesczCWPpFAkJZ/jYYGGJlHJVSj/J1QiK8vIjZ+IWyV14zrPX/6/XbzxLhK02rQiqvE577pl+TezhaEwgg3H/zLgPIjSP2bppH6fDOFm3Lx99rtDztywA8rEcen/sGMuX4dwbhkywcvtGPn+e9mvwiThW83QjN68CF8RME8A03Rx8JXizz7c41vU/P5DsvaUOOI4Vn9e0iopRb/qbvcqQ8t3cJBPDYf0eUJuMQK19YLeVLV66pOnr5Q4PPGiikXtesySF0KfnvH7lMhUM= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Updates an evaluation's status. Raises: - HTTPException: If the columns in the test set do not match with the inputs in the variant. +HTTPException: If the columns in the test set do not match with the inputs in the variant. Returns: - None: A 204 No Content status code, indicating that the update was successful. +None: A 204 No Content status code, indicating that the update was successful. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + status + object + +
    +
    + anyOf + + +
    + string +
    + **Possible values:** [`EVALUATION_INITIALIZED`, + `EVALUATION_STARTED`, `EVALUATION_FINISHED`, + `EVALUATION_FINISHED_WITH_ERRORS`, `EVALUATION_FAILED`, + `EVALUATION_AGGREGATION_FAILED`] +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-organization.api.mdx b/docs/docs/reference/api/update-organization.api.mdx index bbc8e9bff5..ed24966e7b 100644 --- a/docs/docs/reference/api/update-organization.api.mdx +++ b/docs/docs/reference/api/update-organization.api.mdx @@ -5,36 +5,36 @@ description: "Update Organization" sidebar_label: "Update Organization" hide_title: true hide_table_of_contents: true -api: eJydVU1v2zAM/SsBTxugNV2xk0/L1gEr9tGia3cJgoK12VibLWkS3S0z/N8HSk5sJ22xLZckFPlEPpJPLVhHHllbc1ZABo0rkOnG+jUa/TvaQYFDjzUx+QDZsgWDNUEGY6cbXYACbSADh1yCAk8/Gu2pgIx9QwpCXlKNkLXAGyfhgb02a1DAmisxnI/wZmcFdN0qwVDgN7bYSOw+am4Nk2E5Qucqncfo+bdgjdiGS52XQllTkH+pghbQbM7vYk3TpDq1s5imqkAy2ab5WWI7BQWF3GsXKfpPqNMRRKd68osb5P8FvE4IswVD16mtm739Rjk/wnQKga6TAE/BWRMSSSfHx/I1qRO+NHlOIdw11eyyd4a/b0O65dXJySHwV6x0kXr/znvr/wF1r7kFMepKfmmmOhw6VDafnP4F09owrclDtxpoRe9xM2L1o00JSivrsH5q1D9RCLiOY5RcHneNZMyu5PShlg4LsYx1pat7v9FkDPQmdh8v4zTR99T8vL+6ujgATL2dNjUN1+x8Kic1cWlFbVzDUV24hAzmYz0J83ZPXjpQEMjfb0Wo8RVkUDK7kM3neWWb4gjXZBiPUM/R6bgYgfLGa97EkMXF2QfavCcsyEO2XI0dvsgwpfGYuu06g05/ICGql79Fw6X1Q1VR/MoUJUzImF4O6vXuF9auokF9hlZPOduZx3IwjCRoc2djWn0zFrHo2eLiDBQIPQnm+Ojl0fEB+MRZ9gtzHqWUjuXuCbs7XkEB1XG5gAnr18OBVOxs4BrNCO/h/u8pZ88v0y+euwp10kIfNzjNxnLy1gRQkO0/PisFpQ0svm17i4GufdV1Yv7RkJf+rxTco9d4K6wtWyh0kN8FZHdYBTpIa6c+8OyyX7LnM1APp7udESMDco9VI/9AwXfaPPBSRhUpt3PY9l5v04Uv4q4PKAfSJ7KUIhZ5To6f9F2N1u3i+goU3PZPaW0LCfH4U2QEf6aErUsUy1srthYqNOtGxCqDBCmfP/Bq1Hw= +api: eJydVU1v3DgM/SsGT7uANpMGe/Jppx9Ag+5ugjTZy2AQMDZjq7UlVaLTzhr+7wUlz9jOJEHbuYxNkTT5+PjUg3XkkbU15yXk0LkSmW6tr9Do/6MdFDj02BKTD5BvejDYEuRgfXWrS1CgDeTgkGtQ4OlLpz2VkLPvSEEoamoR8h545yQqsNemAgWsuRHDha+y8xKGYZuiKfBrW+4k5HGywhomw3KEzjW6iAWuPgVrxDZ9y3lpizUFeUv19oBmd3EfO1jWMqiDxXRNA1LJvrp/JXZQUFIovHYRkF9M9XaWYlAj1OUt8q8mvEkZsjXDMKi9m737RAUvAT4MM4XAMEiAp+CsCQmks9NT+Vv0CR+7oqAQ7rsmuxqd4cfHkL7y59nZceL/sNFlDMveeW/9T2R9NNySGHUjT5qpDccOjS0Wpz+AtDZMFXkYthOs6D3uZqj+bVOBMso2VC8x/B8KAatIo+TyvGsEI7uW06dGOi3EJvaVPj36zZgxwZvQfb6Ntwm+l/jz/vr68ihhmu1yqIlc2cVSPFri2oq2uI6jlnANOazmEhNWfRKTARQE8g97pel8AznUzC7kq1XR2K48wYoM4wnqFToNj2tYx9PsjbjGZQlUdF7zLuZbX55/oN17wpI85Jvt3OGjECxRZul2mBY6/YEEvFEA1x3X1k+dRh2sU5SgI9S9mhTt3TdsXUOTIk3jX/ZwMM8lYqIpaHNvY1njgMaeX2PxmYwIsuCXUp2evDo5fQ6kMSBbX56P+4cFz8pLblLHYgyHAYACauPyARO2f00H0r2zgVs0s3xP8+ORso5YM33jlWtQJ630ccMTdzaw4A4oyMeraKugtoHFpe/vMNCNb4ZBzF868kKBrYIH9BrvBLhND6UO8lxCfo9NoKNqDqIEv12Nu/d7BurpKvc0McKRB2w6eQMFn2k3XZdRU+o9A/vx8E36zh9x86fgIyEUkUoR66Igxy/6bmfLd3lzDQruxou1taWEePwqooJfU53WJUDl5hVbDw2aqhPpyiGllN934ATQCg== sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/organizations/{org_id}"} +> Update Organization @@ -43,29 +43,331 @@ Update Organization as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-secret.api.mdx b/docs/docs/reference/api/update-secret.api.mdx index 4d287b8ac9..54349eb444 100644 --- a/docs/docs/reference/api/update-secret.api.mdx +++ b/docs/docs/reference/api/update-secret.api.mdx @@ -5,67 +5,1199 @@ description: "Update Secret" sidebar_label: "Update Secret" hide_title: true hide_table_of_contents: true -api: eJztWUtv2zgQ/ivGnHYBbpwWe9Jp0yTABmm3QR69BIYxkcYWG0pUSMqNavi/L4bU007U1Dnsoogvtvj4ODPfcGY0XoPDpYXoFq4oNuQszAToggw6qfOzBCIoiwQdza2fBwEFGszIkeFta8gxI4ggTM9lAgJkDhEU6FIQYOihlIYSiJwpSYCNU8oQojW4qvAbnZH5EgQ46RQPBEEmZwlsNrMAQNZ90EnFu7bxYp07yh1PYVEoGXvBp1+tznmsO64wrJaTZPkpJUzI+F159XnhNRmuCHr154cCb0Q7kpdKAcvaqPAP790ISMjGRhYs0b5QJz2IzUY06/TdV4pdz2p/B4V2oTai5mZM2XuZJ09xQnmZsXMURq9kQmZ+TxUIiEvrdDZvRmG2zd4547EB0OFrztUF5Sj5RJ2SIRCMZGNU/DMhKmS+MMjDiooUVZHyw9LoBxCQSesMKr8fc5caXciYHZhMoehRuspPOb0kl5KZ+yc+0ejSkWEgymQuB+o5zBM0yUWteqNoa4odT2OLjXj7OVVP8tr5+a2HGJHhipyT+dKeXH/+MRTL2xN3BNbDiZ9lLLgGW/x76Qm7o8To+B4EWFxShvfesisyjh47k/+vSD72Oryc4tKofa/3jVGMvSJjXxEkvtTbN6Jxt31QvCsKoEdn0A5BMEkkhyBUFz3NQwQeutvYAacBeSyMDU0/8GwBmU5Iecmko8zuEmFVuRxNLTz/X6nYv4Ze0B2P+8T6belco6AxWPU0+RRM0XPLeaP8PtQ3Bp80FvKm5mi/ZaXW8NvYQ0HHzvKiT84Z+mejVesCz15Wb7V++uQE9MJjfLLaSWVNGNzKqiM+fOMLpt7uDa82ZAud2+Co7w8P+WtQH8BVGcdk7aJUk8t6Mexd4Lxl9LeM/pbR3zL6W0Z/y+i/YEYXIJMx0whYaJOh4/5FKZNR8c98MOg6Ar9GHwCUXFBcxYrG0nVsCB0lc3T7CnYcECZHfI3qZtFr8EL1tI13V83HCX8J5IdqErjuUF8POcrGR1piXH1smHh5Lflcedr66U6B1pSMXcX55/v3u0XmF1Qy8SXk5NQYbfavMBNyKNVI7FY6Hsy+wM4yd7Rk9509Hyg/6iCgD2p2NDt8IsslShfMnl/qjTG55tkf8cF6haPrdf283Zo3WPd5NU6C+Ubv8vX1xQ5g4HZIavDGyVXTos3IpZp7t0UZOrYuhQimKyyVm67eTUND0E7Xbdd2w9UcmVXT1fUFEKTOFTaaTmOly+QAl5Q7PEA5xUL622ApLo10ld9ydHF2TlUdf6LbWX/BFftQ8IrhspYQLOS5fxOp+8lHpUu1kd8D1XVPufZ9NgB752XXGj59xKwIoa4L5E1ruuF6aLQu0XX90VALb78cNe889Wxb3fbrR1+ltZieI5kvtNewpvPI229ydHEGvfoQDg/eHRzuSDdYzDcUY9fTKUyD2CKqpYjr98xfT3CE2V/dBEtWaOsyzHt42x60lbFqkhw9ummhUPrLVxfJwbtuwXsXa/YOGpNaEBB1/wzMBKTaOl68Xt+hpRujNhsefijJsBfNBKzQSLxjg92uIZGWfycQLVBZ2pGrDV3w22V9Q3+fgHha3sbTcuZ0harkJxANda2YPvg0XnTbUHscjvrDh4hu/07E5GgWdhzFMRVudO2sd1cvbq755ar+n4PLIojA4DeOPvgtiKq95v4e+bE1KMyXJce4CAIkf/4FnOPaIw== +api: eJydVk1vGzkM/SsGT1tgNk6CPc1p3aRAjbRbI3F6MYyAGdG2mhlJlTRuvcb894LSfPmzaXyxPSIp8j0+crbgcekgncFXLHMP8wS0IYteajUWkEJpBHp6cpRZ8pCAQYsFebLstAWFBUEK8fhJCkhAKkjBoF9BApa+l9KSgNTbkhJw2YoKhHQLfmOCo7dSLSEBL33ODx5CpMFYQFXNYwBy/r0WG/baj5dp5Ul5PkJjcpmFxIffnFb8rLvOWC7LS3L8b0UoyAYvtfmyCJXUCennb5T5XkIfo22VtCaqzHOo5lVSl30+TpfyDF6kYoQEemSkd2u+nX45dkuVnEztMXDT867Y2pIzWrlY6fXlJX8JcpmVhsHh+8osI+cWZT64r43hzViGmo4QSqosuGZj9VoKsk8vtOFbSud18dQ8PYThjuNVNUh/iuzRsB6VQCsm9dkezq8Kl0ChBeWuH/cmVLITtXd6y+lXCUhxtIgWpoW2BXoWWinFEf67iOMAS9e6uzREIZ6+6Vzk/9iXIe93ydtC3fZCnGvdVlWQywVlmyw/nv2B46fG/PVyOaXAFsyDHmxU0Ynqn+vrQx19xVyKoJLBB2u1fbuIBHmUOf+Sngp3aJDrbOf0FdxI5WnJGM87TNBa3PTR1DFBJqJwy3OD+TM5h8vQJ9HktGkAYzDl09/xwXXFq2u7HhcdvBHd02XcRvjONtx0OjkIGLndJTUO1cFDs/AK8ivNm9CUcf/5FaQwXPO6HK6vhnEHuOG23YEV8Gaw62ZHljaHFFbeG5cOh1muS3GBS1IeL1AO0UjYz2EUTgc3bBrk5SgrrfSbEG80Gd/RplZQOpv3DR64wWLL7Jq1bKGRd2ES16t7VPqVtvL/2Af1+q6Fwehw6953W/jDTyxMFGs3ipq3gKYRdqtpW7O3L+PW2F8OzcyvT7UhhbI/h/mMNr2YgUCpFjpUWHNdw/cesxcKcmcqYi6XF1cXl6fwrh0Go8m4ljJmvldfNINkj9GWS956RdAxeMLi3+6AszTa+QJVL95+q+3N35owTz/90OQog0rD1du6DWcQ2pArvIIGXgcJpN0L2TyBlXaejbfbZ3T0aPOq4sffS7LcUfME1mglPjN4sy0I6fi3gHSBuaODvNoZB3/d11J+N4DkeL5N1ynmd415yf8gaWhs0wxTqumoWUPzTbzq7zBLOv+D0cpjL3qMsoyMP2s774l68jiFBJ7r10te8pCCxR88pvBHTFWHyoOmwrMt5KiWJQ/DFGJI/vwCjzTX1A== sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - - + + Update Secret - - - - - - - - - - - - - - - + - \ No newline at end of file +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + +
    + + header + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + secret + object + +
    +
    + anyOf + + + + +
    + + data + object + + required + + +
    +
    + anyOf + + + + +
    + + + provider + object + + required + + +
    + +
    +
    +
    +
    + + + +
    + + + provider + object + + required + + +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    + +
    + + + models + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + provider_slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + model_keys + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + data + object + + required + + +
    +
    + anyOf + + + + +
    + + + provider + object + + required + + +
    + +
    +
    +
    +
    + + + +
    + + + provider + object + + required + + +
    + +
    + + url + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + version + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + key + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    + +
    + + + models + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + extras + object + +
    +
    + anyOf +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + +
    + + provider_slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + model_keys + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • +
    + string +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + + header + object + + required + + +
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + lifecycle + object + +
    +
    + anyOf + + + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-testset-from-file.api.mdx b/docs/docs/reference/api/update-testset-from-file.api.mdx new file mode 100644 index 0000000000..b638a05a52 --- /dev/null +++ b/docs/docs/reference/api/update-testset-from-file.api.mdx @@ -0,0 +1,867 @@ +--- +id: update-testset-from-file +title: "Update Testset From File" +description: "Update Testset From File" +sidebar_label: "Update Testset From File" +hide_title: true +hide_table_of_contents: true +api: eJydVU2P20YM/SsCTy0wWW0WPelUZ9tFNkm7i9jJxTAMWqLtSSTNZIba1jX03wvOSLbkj7TIybJEch4fH9/sgXHjIZvDjDx7Yg8LBcaSQ9amfiwgg8YWyLTkGLBcO1Mt17okUGDRYUVMTkrsocaKIIM+UhegQNeQgUXeggJH3xrtqICMXUMKfL6lCiHbA9a7p3WowTsrNTw7XW9Awdq4CllgNLqAVp1GtAsFrLmUV10PyWMBrbyX88jzG1Ps5JDT43NTM9Usn6qmZG3RcSrnvSqQA6wjQOuEFNbk5V9oP/sO2JWu0e3gCO1BMloVMpcx7Tyd6qaSWdxPP4OCd9OnP2ExLpHMJKVtVZ9rVl8o5xG38whvkCkELK+OsW2lniNvTe1jf3e3t/JTkM+dtqIEyGDa5Dl5v27K5GMXDCMS0dpS50E46RcvOdcZzE0Tk7o+dM20ITdg7D5ESKcR8UWZHNo/kcBQKHVTltAu/ou0iOhcTYdeI0+/3N2dU/MZS12ExpPfnTPux3kpiFGX8qSZKn8eUJp89PXa5gwI6LltF0cK0Dkc6vODiQCF8MpvLqmzD/2DvMdNUPM1IfehgYz/p1npKx7dxQ0mcaQ3snu9jd8ifZcO60PezmbPZwXjbMdD/RQWJulN5cGZKnmIvlcRb414ozWegw/yFjJIraMXTX+lnWR9uj96YZs2tjQonujJvfSe2bgSMtgyW5+laV6aprjBDdWMN6hTtBpOcU3C1+ReQoP9ecobp3kX6k2eH9/T7i1hQQ6y+WIYMBXRRRmNww4TRKvfkxDaWfmk4a1x+p+ojc7NtzFLGNP12oT0jtwO2xvMv1ItrUqfEfbtzeub22vNdAnJ5Pmx2x3Mw+70OEIYqBO6DkSJeVZhcYAJq1+PHwSlTKnCelDvO7Md4TsQw/Q3p7ZEHTYkoNh3Y59DN3Y4eJUHBdnoGuxmv1CwFclkc9jvV+jpkyvbVl5/a8jJBBcKXtBpXAmf8z0U2stzAdkaS09n+A4+Az997Nbp5wTUZdz9lGsZ8QuWjfwDBV9pN763g1VsexHtu4D7eNarsNDHApcuT7GfmDTJc7I8CD+zQ5HoYaOen6YzULDq7uzKFJIjhUNddXwUcbftv/zLAGw= +sidebar_class_name: "post api-method" +info_path: reference/api/agenta-backend +custom_edit_url: null +--- + +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; +import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; +import OperationTabs from "@theme/OperationTabs"; +import TabItem from "@theme/TabItem"; + + + + + +Update Testset From File + + + +
+ +

Path Parameters

+
+
+
    + +
+
+
+ + +
+ +

Body

+ required +
+
+
    + + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + +
    + + testset + object + +
    +
    + anyOf + + + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + created_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + deleted_by_id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + slug + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + id + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + testcases + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + property name* + FullJson-Output + + +
    +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    + +
    + number +
    +
    + +
    + boolean +
    +
    + +
  • +
    + Array [ +
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    + +
    + + metadata + object + +
    +
    + anyOf +
    +
    +
    +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + detail + object[] + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + loc + object[] + + required + + +
    +
  • +
    + Array [ +
    +
  • +
    + anyOf + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-testset.api.mdx b/docs/docs/reference/api/update-testset.api.mdx index fd669ceab9..11a5adda82 100644 --- a/docs/docs/reference/api/update-testset.api.mdx +++ b/docs/docs/reference/api/update-testset.api.mdx @@ -5,36 +5,33 @@ description: "Update a testset with given id, update the testset in Postgres." sidebar_label: "Update Testset" hide_title: true hide_table_of_contents: true -api: eJzlVU2P2zgM/SsCTzOAN5kOevJps90CHXQ7G0wze8kEhWIxtlpbciU6adbwfy9oKbGTaWa35+aSRCQfycevFkjmHtIlLNCTR/KwSkChz5yuSVsDKTzWShIKKSioiJ2mQuR6i0ZolYgmyKnAo4Y2Ym495Q795Mk8mZnLffpkoviTVuLKk7tOhVbCbo6mgm3JijVGUDV5MpnfKklSXN3jLgZ5nYp73In+maxwWJcyCxHYUh2i6D0/IDXOsHNPLhWLAn/k8+ANErA1OsmZ3ylIIQg+RURIoJZOVkjomLQWjKwQUhgSgwQ0k1ZLKiABh18b7VBBSq7BBHxWYCUhbYH2NVt6ctrkkABpKvkhpijuFHTdKiCgpz+s2rPZOWBmDaEhFsm6LnXWxz797Ll07chf7Tgz0uj5X4j7chT3LO8SiOSzqiaseluplGYnspyPMEM4Ec+uP2NGDBAfpHNyP8J/E3G77txmzNkyxDmEsRpFeOwG6DqGcehra3zI7/bmhr9OG/ljk2Xo/aYpxUNUhv/PYPDy+vb2OfA/stSqNxNvnbPuJ1DP6qKQpC5P6D5VKG12Wgyz/3vTt+JpKbvk+KINYY4OutXlevxlQ4BcssrnL7XGB/Re5jgU97JqT4ZYsPS/Cs15BddRb1Tqgd7A7uU0/gz0/cjZQeXdYjF/BhhqWyEVlqe+bsKoUwEpTONw+2k7jHkHCXh028MeaFwJKRREtU+n06y0jZrIHA3JidRTWWvgWfaYNU7TvjeZze/e4/4dSoUO0uVqrPCR2yMU/FTtyLWs9Xvk1OMGmjVUWKf/DVWMS6gIVpwbN97DsErefpNVXeKwCobiHUd+2fYdo83G9o4jgbM+LTGb30ECTECYgZvJq8kNnN+OE2WeCZnRyGkQQ3LG35E5SACrfiCAUFa/DwLOqbaeKmlGePFULY7r+iSadpjKX+yoxaYh/EbTupS6n/Oe8za2+fJwwzwkkI7u2SqBwnpijbZdS4+Pruw6fv7aoONWXiWwlU7LNbfHsgWlPf9WkG5k6fGFIlw9xA1wLS4FeWh3w72+lWXD/yCBL7g/vbt9rxaHaWqjwpvg67d+Bw0Az1Yyr8tgMcsyrOlF3dVoVcwfF5DAOl7nyio2cXLH603uQqy2T72f5v6thVKavOElmkKA5M93EkZMcw== +api: eJzlVVFv2zYQ/ivEPSWAZmfBnvQ0NyvQoFtmpM5eHKOgxbPEViJV8mTXE/TfixNpS3bqtHueX2yTd9/dfXf3sQWSuYd0CQv05JE8rBJQ6DOna9LWQApPtZKEQgoKJmKnqRC53qIRWiWiCfdU4NFCGzG3nnKHfvJsns3M5T59NvH6o1biypO7ToVWwm6OroJ9yYo1RlA1eTaZ3ypJUlw94C4meZ2KB9yJ/piscFiXMgsZ2FIdsugjPyI1znBwTy4ViwK/F/MQDRKwNTrJld8rSCFcfIyIkEAtnayQ0DFpLRhZIaQwFAYJaCatllRAAg6/NNqhgpRcgwn4rMBKQtoC7Wv29OS0ySEB0lTyQSxR3CvoulVAQE9vrNqz2zlgZg2hIb6SdV3qrM99+slz69pRvNpxZaTR87+Q9+UsHvi+SyCSz6aasOp9pVKag8hyPsIM6UQ8u/6EGTFAPJDOyf0I/y7idt25z5izZchzSGM1yvA4DdB1DOPQ19b4UN/tzQ1/nQ7yhybL0PtNU4rHaAw/z2CI8tvt7Uvgf2SpVe8m3jpn3X9APeuLQpK6PKH71KC02WkzzP7vTT+Kp63skuOJNoQ5OuhWl/vxpw0Jcssqn782Gn+h9zLHobmXTXsyxIJvf9RoriuEjnajVg/0BnYvl/FHoO97wQ4m7xaL+QvA0NsKqbC89XUTVp0KSGEal9tP22HNO0jAo9sedKBxJaRQENU+nU6z0jZqInM0JCdST2Wt4VxVZ/2tuGNT4EX3mDVO077Hm83v3+P+HUqFDtLlamzwgWcnTMOp2bERstbvkXmJ8jRrqLBO/xtaHBWqCF5cOE/l46Azb7/Kqi5x0Imhs0c9WLb9OGmzsX3gyG6s6o3MPqNhMWSGQsE3k18nN5doiA5iNr+PyyMzGiUQzCA5I/pIMSSAVb85QCir34cLrq+2nippRnjxTVscdf0kq3ZY3//Z6xcHiPArTetS6l4Qes7buA/Lw2PnIYF09PCtEiisJ7Zo27X0+OTKruPjLw06HutVAlvptFzzqCxbUNrzbwXpRpYeX2nC1WOUimtxKcnD6Bue+60sG/4HCXzG/ekD3c9tcdisNhrchVi/9GI1ALzQbtbV4DHLMqzpVdvVSFPmTwtIYB2f8coqdnFyxzoodyFX25feb3Z/1kIpTd6w2qYQIPnzDU5rWwI= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Update a testset with given id, update the testset in Postgres. @@ -50,29 +47,294 @@ str: The id of the test set updated. as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + + +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-variant-parameters.api.mdx b/docs/docs/reference/api/update-variant-parameters.api.mdx index d3d0f14354..9792a11377 100644 --- a/docs/docs/reference/api/update-variant-parameters.api.mdx +++ b/docs/docs/reference/api/update-variant-parameters.api.mdx @@ -5,77 +5,370 @@ description: "Updates the parameters for an app variant." sidebar_label: "Update Variant Parameters" hide_title: true hide_table_of_contents: true -api: eJztVk1v4zYQ/SvEnLKAaqdBTzrV+QDW3e6ukY+9OIbBSGOLW4nkklQSV9B/L4YULSneeIugQHtoLo7I4eO8mTczbMDxrYV0CV+4EVw6C6sEcrSZEdoJJSGFO51zh5a5Apnmhlfo0Fi2UYZxybjW7DGcndzLezkzW5veS8ZYXF6LnJ1YZ96l7LZANr9kauPBBkeZU6z290zCWc13peI5Owm3d94t4vWLsN1BRuNMSceFFHLr8QNgPnDae3jNhcXo4/vb28XVc4aebMrm3jODTFgih8Yow54KUSJzZueBo6MvKQRsdLWREfy3m8+frtFqJS2mbOa/mekWXvN2GJWB55CA0mg4+TnPIYVgv45B7k0hgcFHumxA8gohhT4fkICg1GruCkjA4LdaGMwhdabGBGxWYMUhbcDtNJ20zgi5hQSccCUtdPlg8xzadhUQ0Lpzle/o2EtAoorS0RbXuhSZpzH9aklgzeA+bYikE2j914BGAzzPBR3j5WJgFS7o/FQPXzFzAz8XPUJLblSVcOsKreVb9Jhy93njYzRm2ib7FVmXJRDHiHnhUdjHDqVtD6/v+S+HJAYgR2UNbUuoUSme/dnpKf2MS/OmzjK0dlOXLOoM3hxtkb81IqQCcvdRWBHu6CyFdLhFM0jIdTRqE6hULjYC8/XD7pjWPnZm7HwXkig3YnvoflhfB62/jnbhzdgnMmuTf1hiP5DC0MXVS5cuzz07g9QF1twdJRGs2Mz9a7LeZ3ucx31+RlQG18y07lTfS8Gr/Zezs0OBf+GlyL182RX14rerO0fHRel17rCyhwalyka7fyOGUd7tqg8WN4bvBqn6XQUHveDt9qjQY+gj2OumPhjslnZ/lCjiFa7u7FbDNh7DG6L7Oo3LEL7vXRZNaJQeAIbcVugKRUNL186PJ1dACtNuINlp04+mdjqaZBbNYxxjtSkhhcI5bdPpNCtVnU/4FqXjEy6mXAuvZ4tZbYTb+SOzxfwD7t4jz9FAulwNDW5IKSH3Y7N92LkWH5Ci0A3QWe0KZcSfIaHdDC3CKaJJGrzuJ+HVM690iQeT7Dsl24sLhNwo70MsGM+QzRZzSIBiESrjdPLz5BRevtVGxv6BkflKiQT8NiQvQrkPIiSAlS8TcMirX/sNoqeVdRWXA7wwxVh8DSyGmRs51vRl+/978r/ynuxU7vDZTXXJhe9RXhlNV6LL+GakhKaj9+P4WVMo68i8aR64xTtTti0tf6vRUCGukgD0QIpeNpALS//nkG54afGIWE6uu1b2jr3mcSxWSZX6yMuaviCBP3A3fvT6Nl3EXtB0Bhfhrp98M+0BDmYL9f1wYpZRfo/argY9b3F3Cwk8dE/jSuV0xPAn6tP8KfiqPHXfi/xaAyWX2zr0hgBJf38B1oTAMw== +api: eJztVk1z2zYQ/SuYPTkzrOR6euKpiuOZqGkbjS3nIms8a3IlIiEBBABtqxz+984CpElJkZvccqguIoHdh3378cAGPG4dpCv4hFai8g7WCeTkMiuNl1pBCrcmR09O+IKEQYsVebJObLQVqAQaIx6j7+RO3amZ3br0Tgkh+uV7mYsz5+2bVCwLEvN3Qm8C2MhVeC3qcM4k+hrclRpzcRZP76Jb9Mcv4nYH2RtnWnmUSqptwI+A+SjoEOE1Skd9jO+Xy8XVc0aBbCrmITJLQjomR9ZqK54KWZLwdheA+0APKURs8rVVPfgfNx//viZntHKUill4F7ZbOBXtOCujyCEBbcgixznPIYVof98neTCFBEYv6aoBhRVBCkM9IAHJpTXoC0jA0tdaWsoh9bamBFxWUIWQNuB3hj2dt1JtIQEvfckLXT3EPIe2XUcEcv6tznfsdgjIVEl53kJjSpkFGtPPjhusGZ1nLJP0klx4G9FoAPNcshuWi5FVPKCLUz98psyP4lwMCC2HUVXS31fkHG4pYKrdx03I0T7TNnlZUXVZAnPsMS8DivirQ2nb4+MH/qsxiRHIq20NbcuofacE9hfn5/y3P5o3dZaRc5u6FH2fwfdnO57y28XFMfAnLGUe3MQVz8APoB7UMCePsuQn6alyxwalzvZ2v6MkUnnakoV2PeQercXdqPJ/6hgg171y29ea+aWSPdhp05AMseTd/6o784pHd3br8fj06Y3ZPU3jXUzftw7rTVjCjgBjbSvyhWaxMLUPsuALSGHaCYGbNoMktNM9BXFkH3v5qG0JKRTeG5dOp1mp63yCW1IeJyinaCQcXhmzsCsu2TTMjqOsttLvAt5sMf9Au/eEOVlIV+uxwQ23UWyMfbOXmqCRH4hT1KnarPaFtvKfWO1O2IroxTngBr0e5OnqGStT0pG8fEMehs4DqTY6xNDlvCP4FrMvpFhOOVmR+/nk18n5qYx0DmK2mHcjhVkYqZ5MMIPkIOcv2YYEqArzBJ6w+n3YYKpGO1+hGuFFmRG9XC/GJd4LsBnm+/8L/2e58LuO9/Tsp6ZEGcQsdEbTzfKqv9S5oOneBb9/7xTaeTZvmgd0dGvLtuXlrzVZHsp1EoEeuLtXDeTS8XMO6QZLR680y9l1p3lvxKmI+8FVPLWPWNb8Bgl8od3+V0nQ86LXhaYzuIxn/RJUdwA4uoT4goges4zr+6rteiSOi9slJPDQfbtUOmcXi08s6PgUY9WBetClsNZAiWpbR52IkPz7F3A47+g= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Updates the parameters for an app variant. Args: - variant_id (str): The ID of the app variant to update. - payload (UpdateVariantParameterPayload): The payload containing the updated parameters. +variant_id (str): The ID of the app variant to update. +payload (UpdateVariantParameterPayload): The payload containing the updated parameters. Raises: - HTTPException: If there is an error while trying to update the app variant. +HTTPException: If there is an error while trying to update the app variant. Returns: - JSONResponse: A JSON response containing the updated app variant parameters. +JSONResponse: A JSON response containing the updated app variant parameters. - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + + + parameters + + object + + required + + +
    + +
    +
    +
    + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-variant-url.api.mdx b/docs/docs/reference/api/update-variant-url.api.mdx index 3044551fb2..c16d6c0266 100644 --- a/docs/docs/reference/api/update-variant-url.api.mdx +++ b/docs/docs/reference/api/update-variant-url.api.mdx @@ -5,77 +5,332 @@ description: "Updates the URL used in an app variant." sidebar_label: "Update Variant Url" hide_title: true hide_table_of_contents: true -api: eJztVlFv2zYQ/ivEPW2AZqfBnvQ0bw1Qt+lqOHZfHCNgpLPEViJV8lRHE/TfiyMlS3bWrAP2uLxEou4+Hu/77qNbIJk5iHfwUVolNTnYR5CiS6yqSBkNMWyrVBI6QTmK7fpW1A5TobSQWsiqEl9D4uxe3+uFzVx8r4UQw/KDSsVPjuzPsdjkKJavhTl4pEmqICNqv8ks5Na2mCbxptOQe72WyuGw05vNZnXzlKCvNxbLA1eG1horTJLU1oljrgoUZBulsxHpsoyAjFRbPUC/vfvw5xpdZbTDWCz8u7D9glA6VYkkBj3mSDlaD9mjH6UTrk4SdO5QF8JYoQ3NIAJToZVc6zKFGEL0w9Cu2hYQgcUvNTr63aQNxC0kRhNq4kdZVYXf1Oj5J8f8tOCSHEvJT5VlcFLo+I2x4haoqRBicGSVziACUlTwwtYW0EUwEvVScC8PsUw5JzFlqeihROdkhr4u3Xw4QLy7ROii04quiwK6/Yj5h0cR73uUrouGUPP4CRPqG6EspqzQ0JpJuROooNG+yO36diWbwsgUOgYdQcjW6BcCg75L11dX/O9c83cjcQP/EP0wD53f9tfr6+fAH2WhUp8mblii/wL1gt0USSpPsCIs3fOAwiRnX3+AIqUJM7TQ7UcupLWymSjh1oQCWQely14SzYnZAez7ob4ZYsNf/0kHfK6wdR+3n8p0aG/o7veP8Tq07+82G0LYWJ4BBm5LpNzw+FY1Z1SScohh3ovTzdtRpt3cof2qEhYQP6F1ngQ/nZATVS6ez5PC1OlMZqhJzqSay0r5WXGY1FZR41MWq+U7bN6gTNFCvNtPA+5YJoH487BTz2Wl3iG3QMuS3xc15caqvwKbESjWZx6y+IwswPVoRDdPsqwKPBnLyOHUQcbVS48Y5QZKH4wvrG/0wh9bLFZLRkPrwqxczV7NruDyOjoL5tmRiZ+d4VT+M0QX/T11FiLA0g8OEMryt/EDn7kyjkqpJ3jBWcTgf1tvQmcVTfz5/7vyP74re+kSPtG8KqTyrtPfa2HodoP8HEQQT6QYpo3nbh9BbhxxbNs+SodbW3QdL3+p0fJo7XsRP7Icd2x++TBkLXzGxl9WnuNfvEVxeFGHobpwbHbTkLFIuM8vxu4nTrLabiCCx/7KL03KKVYe2f3kEWLwPx042Q+5X2uhkDqrw3wFSP77Bi81Yjs= +api: eJztVsFu20YQ/ZXFnFqAlVyjJ56qJAaixm0E2cpFFowxORI3IXeZ3WFkVeC/F7NLirRcuynQY3URuZx5OzvvzSOPwLjzkK7hEzqNhj1sEsjJZ07XrK2BFFZ1jkxecUFqtbxWjadcaaPQKKxr9S0mTu7MnZm5nU/vjFKqX77XufrBs/sxVbcFqfk7ZbcBaZSq2KombDKJuY0rx0my6TjkzixRe+p3en97u7h6zCjUm6r5Vioj56xTNssa59W+0CUpdgdtdgPSeRkRmbhxpof+7ebjH0vytTWeUjUL98p1C0qbXGfIAroviAtyAbJD36NXvsky8n7blMo6ZSxPIAFbk0OpdZ5DCjH6vm9X40pIwNHXhjy/sfkB0iNk1jAZlkus6zJsas30sxd+juCzgiqUq9oJOGvycidY6RH4UBOk4Nlps4MEWHMpCytXQpvAQNRrwZ081DyXnMxWleb7irzHHYW6zOHjFtL1OUKbnFZMU5bQbgbMtwFF/d6htG3Sh9qHz5Rx1wjtKBeFxtaMyh1BRY12Ra6W1ws8lBZzaAV0AGHXUFiIDIYuXV5cyN9Tzd8MxPX8Q/LdPLRh218uL58Df8JS5yFNXYlE/wXqGbs5MepAsGaq/POA0mZPnn4HRdow7chBuxm4QOfwMFLCtY0Fig4qv3tNNCdme7CXQ0Mz1K08/ScdyLni1l3cZizTvr2xuy8f411s399t1oeIsTwDjNxWxIWV8a0byaiRC0hh2onTT4+DTNupJ/dNZyIguSLnAwlhOqFgrn06nWalbfIJ7sgwTlBPsdZwbsSz8FS9ldAwSJ6yxmk+BLzZYv6BDu8Jc3KQrjfjgBvRUFTF07ATIVjrDyT9MVjJ/azhwjr9Z6Q6AS0FFDFLGiDqXA4udfWIVV3SyXUGgsf2MqyeG8igRdBma0NhHQvdqd9g9oVMLojkfGzIxeTnycVLbeoS1Gwx74YMszBk/QlDGCRnRJwogASoChMGTFj9OjyQ89fWc4VmhBctSPVGuQpu9aSykZH//1L9j1+qnYyZHnlal6iDPXUvwDid616KHhJIR7KMYykDukmgsJ4l9nh8QE8rV7atLH9tyMmYbTpBP4g01+KSRT9wR/hCh/BWCxz/FLxMwssmDtiZtYvtxoxZJn1+NXYzspzF6hYSeOi+DSqbS4rDvdgk7iGF8I0hyWHgw9oRSjS7Js5ahJTfXzRScMo= sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - +> Updates the URL used in an app variant. Args: - variant_id (str): The ID of the app variant to update. - url (str): The URL to update. +variant_id (str): The ID of the app variant to update. +url (str): The URL to update. Raises: - HTTPException: If an error occurs while trying to update the app variant. +HTTPException: If an error occurs while trying to update the app variant. Returns: - JSONResponse: A JSON response indicating whether the update was successful or not. +JSONResponse: A JSON response indicating whether the update was successful or not. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + + +
    + + commit_message + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/update-workspace.api.mdx b/docs/docs/reference/api/update-workspace.api.mdx index ec43985ce5..12585acd71 100644 --- a/docs/docs/reference/api/update-workspace.api.mdx +++ b/docs/docs/reference/api/update-workspace.api.mdx @@ -5,36 +5,36 @@ description: "Update Workspace" sidebar_label: "Update Workspace" hide_title: true hide_table_of_contents: true -api: eJy9GGtv2zbwrxj3acOU+NFHWn1a1hZo0HU10nQFFhgCI51tthKpklRcz/B/H46kJEq23C7oli8xj/fivU87kCUqZrgUVxnEUJUZM5hspPqsS5YiRFAyxQo0qDTEtzsQrECIQaoVE/xvS5nwDCLgAmIomVlDBAq/VFxhBrFRFUag0zUWDOIdmG1J5NooLlYQgeEmJ8C7gN/oKoP9PmpkNdr8CEEfa2ZOysLxQG1+k9mWCPssUykMCkNXrCxznlodx5+0FARrJZaKbGk4ajo53XfAxPbd0lquqxG9z0NEledAmtQ6/kG0+wgy1KniJcl7KKuXAYt95P2bJcycYhjBUqqCcIDQzwy3+gxL+eDYji4NOa5Gk3efMDXQR2s8APs9YSvUpRTamW02mdC/zsvhfZWmqPWyykfXHhke7JhUYWCCoTB54bDoReSHJatyMsdsMntyNp2eTWaj6SyePY0fPz1/NH02fX7xy2QSTyaHNh4SEJjsOwTMHk1bATw7xZjCOmrCbwjrvwsxh/YwVjcE30ed6vK9VYPoCizubKEKxXODhT6Mg0qjsohZxome5fPg3uX+YCATLYWuzB2zARl0nwy5AkVVQHwLciNQQQT3HDf2B2bcSPvjnuUVc7/bIsiyggsbNGUutwUKkxRMsBUqWBypc9cyx1rX5Ae4m/iNej4vURVcay7FkO2HHq+QZYneaoOFN0ESJLP21ghhlPk2OQmY3DPFmXA5lOMBsJAZX25rQJJKseSrSjXMW6KafUCsKpFoVPfc9kEvVGOq0NS6NiffOJuzZ9zFJt1Q3HMlhXVb68HgncMYwbMHcawcg9pobJi2R8+hBXg1W4Cl93HnjE1WaAGNRzo4nm8H5ln3YKRqz5tWZDhxWP4hwLMPQZ57CPK+prxOXGJGlNyJwI0DGnkoplNpGrY9aJ9L71qhRpOUTOuNVFn9ojue5z7WSVB7bN67zOVGh++tAWTy8Bw6Raq+CxzE4nypUHFsENpjGBa6FxfNPRNCml7edUAWi4t72cvOLqgXQomqjkVNDe5j6xQFU1weIwnvDqSgrnJzVFBz06cp0CieHqNpb/o0Xyqs8BiJvwgq5bypim1fBKYU254ssPOgmB6bptoB9TZoMMdK/wkFuvX824Jst6wb3jFZb23rbcazf/Pgt75rf0sHO/3bx3q83qBwtPs1CtlZ8/Fsdjhe/slynrnN45VStts+cLbM0DCenxgIcpl2br+jAXNhkHr7fjHsw999+tkZSK9OjUxvUWu2wnBSG0K1xhi5mewbrqF3OdEeL/BFa15n3eFnvHTmO7VCvL65mR8wdL7tOtXN16OPYYNAs5a05ZaVsYutWUMM4zCG9HjX22z346Zn6PEuXEX3EAGNB/VmXKkcYlgbU+p4PE5zWWXnbIXCsHPGx6zkNug1ppXiZmtJLudXb3D7GllGs+jtIkR4TzHmoqaL1jiMlfwNbuuciOGyMmup2r5kF+W1oyIDUfRet8vuq6+sKHNsl9U2ArqmbMDhZkObyuOzycXZ7PnN9En8ZBrPnp1PLqZ/2Q1FLKVV1Hvt0pphdDm/ooqKSjvGk/Pp+eRAXAeZEpGlJlDSXZM2HXs3lqbSXNgsBIOs+LW9IBuUUpuCiYDfkUDpTcne3Aa/mnGZM+42aWXz3AXRbacQUXeIDz+QtHFE952PGosI1lIbYrTb3TGNH1S+3xOYWjjFyiICO5jekT1vd5BxTb8ziJcs13igc1PA4Kdrn6c/jyA6/pY6ngQFE3U0OkEEn3F75FMP1ab/UXzHULYIrut82XmUF07a2Y1rCjWLg8pNmjuKyzTF0pzEXQQFY/7hBiK481+ICpkRiWIbqoJs47SVpan3HwvbQc7EqqJaG4NjSX//AHA5zc4= +api: eJy9Vttu2zgQ/RVhnrYoY8uujaJ6qpsWaNB2G6TOFljDCGhpbLORRJakkrqC/r0YUVfftgh21y+2qcOZ4ZnDM8pBKtTcCpleRRBApiJu8e5R6nujeIjAQHHNE7SoDQSLHFKeIAQg9eZORMBApBCA4nYLDDR+z4TGCAKrM2Rgwi0mHIIc7E7RLmO1SDfAwAob08JnvfGuIigK1kRucv8b8b/WwVyWpYuBxr6R0Y427ocMZWoxtfSIKxWLsORm+M3IlNbajEoTc1agoX+u9hx4uvu8LnnqV0Tnq1bSLI6BKqlr/JP2FgwiNKEWivI9NdTbToiCVd2M7rg9F5DBWuqEMEDwCyvKek5nuXVhvZmlxtUwufqGoYV9WNMBKApCazRKpsbRNvZ9+uqdHL5kYYjGrLPYu6nA8OTGhBo7FJySyaVD0YmoD2uexUTH2B9PL/zpxWjq+S+DF9Ng4g/8V5OxP37u+4HvH3J8KkGHst9J8HLUJhDRucAka9bI7xTqv5OYgz0t1JzWC0ZewlPxk9dlnTGLFlcwSDBZlbZ0JD3Xmu/OZv9U7T4m4dYVFlC6UElwhdsreHnEbRrdOs1PxuNDmf/FYxGVIbx3Wkv9dI1HaLmI6ZewmJhDQCzD3tPfaJZILW5QQ7Fs6XGctsf9KMO2F2ZzrnWf0Bi+wa5iTkFLMjynjX9oDZ3Lpa5wnV609Dp2Tx/jraPvnJW9n8+vDwK63vab6u6597UzPxO0W0mzVWW2HKd2CwEMuxoyw9zN02LYTD8zzLuTsAAGBvVDPYYzHUMAW2uVCYbDMJZZNOAbTC0fcDHkSsB+abPyqXdJ0PIiGAwzLeyujDe7vvqAu/fII9QQLJZdwBfSnVNSH9beNiU+4K6+JwHMMruVur4h1RDful1EGin6ph3E737wRMXYDtJWFf0zNMtd1+246Hz0IvBHwXQy8Cejv0v3TNeyLLTqZMXCGx7eY0o3mxh1wf3BaOCfoq3a4M2ur6qLykPbKdjBqLJeY5qWAANMylsKFnnyun1AfChpbMLTTrwjQtoz74p6iz/sUMVcuImvSx9wIlv0jMoAg6B5bWt1Rsu9d64lg600lvbn+YobvNVxUdDy9ww1yWXJ4IFrwVdE6SKHSBj6HUGw5rHBg1IbX4M/bqrr+8wDdvwItaRS0tMDjzP6Bwzucde+d5JT/Y9Ze/yUlritb0peQS5dtou5GxF1iAMfp8rdjlkYorJnscuOfVzfzoHBqnpvTWREWzR/JE/kj65aqVyn6cWW1nKIebrJyHkDcCHp8wsVpAit sidebar_class_name: "put api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - +> - - - - + path={"/organizations/{org_id}/workspaces/{workspace_id}"} +> Update Workspace @@ -43,29 +43,810 @@ Update Workspace as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Path Parameters +

+
+
+
    + + +
+
+ + + +
+ +

+ Body +

+ required +
+
+
    + +
    + + name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + updated_at + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + + + +
    + + description + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + type + object + + required + + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    + + +
    + + members + object + +
    +
    + anyOf + + +
  • +
    + Array [ +
    +
  • + +
    + + + + user + + + object + + + + required + + + +
    + +
    +
    +
    + +
    + + + + roles + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • + + +
    + + role_description + + object + + +
    +
    + + anyOf + + + +
    + string +
    +
    +
    +
    +
    +
    + +
    + + permissions + + object + + +
    +
    + + anyOf + + + +
  • +
    + Array [ +
    +
  • +
    + string +
    + **Possible values:** + [`read_system`, + `view_application`, + `edit_application`, + `create_application`, + `delete_application`, + `create_app_variant`, + `delete_app_variant`, + `modify_variant_configurations`, + `delete_application_variant`, + `run_service`, + `create_secret`, + `view_secret`, + `update_secret`, + `delete_secret`, + `view_app_environment_deployment`, + `edit_app_environment_deployment`, + `create_app_environment_deployment`, + `view_testset`, + `edit_testset`, + `create_testset`, + `delete_testset`, + `view_evaluation`, + `run_evaluations`, + `edit_evaluation`, + `create_evaluation`, + `delete_evaluation`, + `deploy_application`, + `view_workspace`, + `edit_workspace`, + `create_workspace`, + `delete_workspace`, + `modify_user_roles`, + `add_new_user_to_workspace`, + `edit_organization`, + `delete_organization`, + `add_new_user_to_organization`, + `reset_password`, + `view_billing`, + `edit_billing`, + `view_workflows`, + `edit_workflows`, + `view_evaluators`, + `edit_evaluators`, + `view_testsets`, + `edit_testsets`, + `view_annotations`, + `edit_annotations`, + `delete_annotations`] +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/upload-file.api.mdx b/docs/docs/reference/api/upload-file.api.mdx index 7e1762784d..d98d2edb79 100644 --- a/docs/docs/reference/api/upload-file.api.mdx +++ b/docs/docs/reference/api/upload-file.api.mdx @@ -5,75 +5,363 @@ description: "Uploads a CSV or JSON file and saves its data to Postgres." sidebar_label: "Upload File" hide_title: true hide_table_of_contents: true -api: eJztVsGOGzcM/RWBpwSY2JtFT3OqmybINm3WiJ1cvMZCHtEepRpJkThGXWP+vaA0tsfrzW7Qc04jS+Qj+fgoeQ8kNxHKBcwxUkSKsCxAYayC9qSdhRI+e+OkikKKN7MvwgXxx+z2o1hrg0JaJaLcYhSaolCSpCAnpi7SJmAc3dk7OwmbWN7ZNoHc086jKMVbTTUGIcXX6CxDVnGbEEd3VgiRwV/kwO+0wZelmNd4GZ+cyMC9H+Ui7q1sULy4TRVI87IUVKNIm26d1r2h0Gvhg9tqhSpl+wmpDZYTZjilK8qRA8bW0ME7x2TPCmMcQQHOY5Ac7UZBCX2xnCIUEPBbi5F+c2oH5R4qZwkt8bJpDWkvA43XLjSvmD/ejlWNTVr5wMCkMfKvAYf8M38hUtB2AwWQJoPHfok5H3cFpCweMeeQkqCElbYy7AYAzDh7DtlkBGl3t2soFw+xuuK4Y1tjoFuesHpZiY+M0TFoNnSrr1hRz44OqFiDKdWBM1N2PySzY4STB4UW00b0zsZM0vXVFX/OJTxrK+7UujXiU28MxbAT0nujq9TBMWvyqTZo9RT7N4qpO1D2PatMRwFVQEmo7iU9Zf0mW4kJPUuhVtBHPwN/0JEZ0kw33uCRjS5R+8v19SV5X6TRKlEj3obgwv9nTiFJbRKHhE28NDCuOjv9AcVpS7jBAN3yxIwMQQ4F/afLCTLjTdw8RfVfGKPcZPk/M2eJjH7MnukK15VD93aDfpzozex+v4zfM32PBTuYvJ/PpxeAubcNUu34dvIusouXVEMJ437K4zgPGhQQMWwxxMR7GwyUUBP5WI7HlXGtGskNWpIjqcfS6zTtEas2aNoll8n05gPu3qNUGKBcLIcGM1ZG7vW52ZFm6fUH3B1EXMKkpdoF/W9uYAGaJVlnLy5L27VL7j0Dk5ScmExvoAAuI4v4avR6dAUPn7YzYxa1rJKoD7HTMRQPWDjWDwVgkxQNhLL59XTAmTHPjbQDvP5mfpffhbNUBu/Czwf3Bx7cXi2E/9DYG6nTbKc27XtlLw7vV+QGZm0vC6hZ/eUC9vuVjPg5mK7j7W8tBpbvsoCtDFquWEwLvlPqg5D38Dfu+DbOjXqVJp/NTcupPPaY8z2VnSZVhZ4G5hf3Jo/JcUant7M5FLDq/zM0TrEPAyfc4rTkJLvuPxo/V5k= +api: eJztVk2P20YM/SsDnhJAsbeLnnSqs02QbdqsETu5eI0FLdHWJKMZZYZa1DX03wvOyLa83o+g554kj8hH8vGR4x0wbgLkC5hT4EAcYJlBSaHwumHtLOTwpTEOy6BQXc2+KufVH7ObT2qtDSm0pQp4T0FpDqpERsVOTV3gjacwurW3duI3Ib+1bQS5421DKlfvNFfkFapvwVmBLMJ9RBzdWqVUAn+VAr/Xhl7nal7ReXx2KgH3fpyKuLNYk3p1EytA8zpXXJGKh24d33tDpdeq8e5el1TGbD8Tt95KwgJX6oJTZE+hNbz3TjHFs6AQRpCBa8ijRLsuIYe+WEkRMvD0o6XAb125hXwHhbNMluW1bg3rBj2P187Xb4Q/OQ5FRXV8a7wAs6YgvwYcys/0hMBe2w1kwJoNHfql5vK5yyBm8Yi5hESGHFbaot8OAIRx8RyyKQhotzdryBcPsbrscGJbY6BbHrF6WalPgtEJaDJ0q29UcM+O9lSKBmOqA2eh7G5IZicIRw/2LcWD0DgbEkmXFxfyOJXwrC2kU+vWqM+9MWTDTmDTGF3EDo5Fk8+1QZfPsX9dCnV7yp6ySnRkUHhCpvIO+Tnrq2SlJvwihbqEPvoJ+IOOzIhnum4MHdjoIrW/Xl6ek/cVjS4jNeqd987/d+ZKYtQmcshUh3MD44qTrz+hOG2ZNuShWx6ZQe9xKOg/XUpQGK/D5jmq/6IQcJPk/8KcRTL6MXuhK1JXCt3bDfpxpDex+3QZvyf6Hgu2N/kwn0/PAFNva+LKyXZqXBCXBrmCHMb9lIdxGjTIIJC/Jx8i7603kEPF3IR8PC6Ma8sRbsgyjlCPsdHw8LqYxK/qSkzjKghUtF7zNuJNptcfafuBsCQP+WI5NJiJbJIQTs0OPcBGf6TtXuE5TFqunNf/pO5moCWBKnlJzdquXXTv6elze4vFd7JSqtSZ0r4Y/TK6eKqY3kFNpte9+rGI6t/nEc0ge0DXgSjIgOoofWDC+rfjB8lSGlKjHeD1K/x9ukBOUhpcIP/fzD9xM/fKYfqbx41BHZdAbNOuH4HF/qIL0sA0BMsMKhmTfAG73QoDffGm6+T4R0tepLzM4B69xpUIayHLp9qLegffaStrOzXqTVwRYm5aSeWxW18WWnKaFAU1PDA/W7AyModhnt7M5pDBqv9zUbtSfAQ44mbHV0my6/4Fa4RmKA== sidebar_class_name: "post api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Uploads a CSV or JSON file and saves its data to Postgres. Args: upload_type : Either a json or csv file. - file (UploadFile): The CSV or JSON file to upload. - testset_name (Optional): the name of the testset if provided. +file (UploadFile): The CSV or JSON file to upload. +testset_name (Optional): the name of the testset if provided. Returns: - dict: The result of the upload process. +dict: The result of the upload process. - - - - - - - - - - - - - - +> - \ No newline at end of file + + +
+ +

+ Body +

+ required +
+
+
    + + + +
    + + testset_name + object + +
    +
    + anyOf + + +
    + string +
    +
    +
    +
    +
    +
    +
+
+
+
+
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    + + + +
+
+
+ + + +
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/api/variants.tag.mdx b/docs/docs/reference/api/variants.tag.mdx index eb7cd6c70f..e158173a13 100644 --- a/docs/docs/reference/api/variants.tag.mdx +++ b/docs/docs/reference/api/variants.tag.mdx @@ -5,16 +5,9 @@ description: "Variants" custom_edit_url: null --- - - - - - - ```mdx-code-block import DocCardList from '@theme/DocCardList'; import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; ``` - \ No newline at end of file diff --git a/docs/docs/reference/api/verify-permissions.api.mdx b/docs/docs/reference/api/verify-permissions.api.mdx index 6adc61c479..17f59cdddd 100644 --- a/docs/docs/reference/api/verify-permissions.api.mdx +++ b/docs/docs/reference/api/verify-permissions.api.mdx @@ -5,36 +5,33 @@ description: "Verify Permissions" sidebar_label: "Verify Permissions" hide_title: true hide_table_of_contents: true -api: eJy9Vk1v2zAM/SsBz0KcFTv5tGAb1qAbFrTZLkFQqDYTq5MlVaKLZYH/+0D5o3bSAimw9ZREeuSjHqmnHIDkLkC6hnmWYQiTj9aQtxo2AqxDL0lZs8ghhUf0aru/dehLFYKyJoAAJ70skdBzigMYWSKkIDOOAgHKQAoPFfo9CPD4UCmPOaRbqQMKCFmBpYT0ANLsv29jBto7zhDIK7ODWvQrptIa6o0AUqR5Yd6Q1IxpeUNmHd7GgP/LfcNEkxXvnvKr/B+wC9haX0qCFKpK5WdUs8hHtXgMtvLZm8hx3XKdKtJX8eai9DVFXTbMF5w1AQMzXMxm/JFjyLxycZBSuKniFdhWenLdgkFAZg2hoViXc1pl8Uok94FjDk9V13VdC3h/cXGa+KfUKo9hk8/eW/+KrOA8X0NSTd05klSavynCMpwCtM1Gu2e0UxnCHXqoN7Xo1qT3kpvUqfnVNgVCLaAMO8583JoO+g1DkDuEPtnL0ChGPzQdzN7dY0ajCVnHczXULW7Q6id5G3VfPsanRr7nyDrI5Wq1PEnY9PaoqdEPJ8uRH5ZIhWW33CFFe6QCUkgGppk0PgoCAvrHzjgrryGFgsiFNEkybat8KndoSE6lSqRTcbYDZpVXtI8h8+XiCveXKHP0kK43Q8ANj08zEGNY3wvp1BVyFe1FnVdUWK/+yKFzF00Un12ZrY3hnfvG4ibz5QIEPw2hEWU2fTedwbFUIzBPvszi5HfccRvEkQr9+UEAlnHsgVCWH542uDJnA5XSDPI925lRRb0MhL8pcVqqONmR/9B2bQ3jp67t20ZAYQPx/uFwJwP+8LquebkxNm5NroK80wNr+4X74bP4KHXF7PEWvgAevWXnB0SfPQd+/D68KuaIZcM/vOKQOImimxwWownlfxeOBlEnrsdZ+uvz5fMK6vov3Qntww== +api: eJy9Vk1vGjEQ/StozhbQqKc9laZRg9KqKKG9IBRNdgdw4rUd2xuVov3v1Xg/2IUgEanNCbDfzHt+4xmzg4BrD8kCJmlK3g8ujQ7OKFgKMJYcBmn0NIMEXsjJ1fbeksul99JoDwIsOswpkOMUO9CYEySAKUeBAKkhgeeC3BYEOHoupKMMkhUqTwJ8uqEcIdkB6u2PVcwQtpYz+OCkXkMp2hVdKAXlUkCQQfHCpCIpGVPz+tRYuo8B/5f7jokGc9495pfZP2AXsDIuxwAJFIXMzlAzzXpaHHlTuPRd7LituY4daVW8uymtpujLkvm8NdqTZ4aL8Zg/MvKpkzZepATuitgCq0INbmswCEiNDqRD1GWtkmlsidGj55jdXnVZlqWAjxcXx4l/oZJZDBtcOWfcG7KCddyGQVa6MwooFX+TgXJ/DFAm7e2eUU6pA63JQbksRbOGziEXqXHzm6kEQikg92vOfFiaBvqdvMc1QZvsNDSa0V6aBmYeHikNvRuyiOeqqGtcp9R7eyt3Tx/jS2Xfa2QN5Ho+nx0lrGp7UNQ4Dwez3jzMKWwMT8s1hTgewwYSGHWG5qiaoyDAk3tpBmfhFCSwCcH6ZDRKlSmyIa5JBxyiHKGVcEg/ibuDS4bGi+8pLZwM25hvMpve0PaaMCMHyWLZBdzx3apuSx/WFgqtvCGWWHfxpAgb4+Qf7I71TRXFxki9MjG8Gc2Vts+YPpHmxudzVrLHww/D8anD1AGDyWxatwimsUUaHREG4sCu1igQQHnsDwiE+af9Bqu0xoccdSffqyXsKWstCfQ7jKxCGVsg8u/q8i6g/ybWBV4K2BgfeH+3e0BPP50qS16uJiCXKZMeH1RnBj7Rtvt+vqAqmD226wlw79E7PyAO5HPghw/Jm2IOWJb8w0kOibdSNLeIzahC+W+IDZ2oo/HIWdo++3o1h7L8Cydh/FI= sidebar_class_name: "get api-method" -info_path: reference/api/agenta-api +info_path: reference/api/agenta-backend custom_edit_url: null --- +import ApiTabs from "@theme/ApiTabs"; +import DiscriminatorTabs from "@theme/DiscriminatorTabs"; import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint"; -import ParamsDetails from "@theme/ParamsDetails"; -import RequestSchema from "@theme/RequestSchema"; -import StatusCodes from "@theme/StatusCodes"; +import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes"; +import MimeTabs from "@theme/MimeTabs"; +import ParamsItem from "@theme/ParamsItem"; +import ResponseSamples from "@theme/ResponseSamples"; +import SchemaItem from "@theme/SchemaItem"; +import SchemaTabs from "@theme/SchemaTabs"; +import Markdown from "@theme/Markdown"; +import Heading from "@theme/Heading"; import OperationTabs from "@theme/OperationTabs"; import TabItem from "@theme/TabItem"; -import Heading from "@theme/Heading"; - - - - - - +> + Verify Permissions @@ -43,29 +40,305 @@ Verify Permissions as={"h2"} className={"openapi-tabs__heading"} children={"Request"} -> - +> - - - - - - - - - - - - - - \ No newline at end of file + +

+ Query Parameters +

+
+
+
    + + + + + +
+
+ +
+
+ + +
Successful Response
+
+ + + + +
+ + Schema + +
+
    any
+
+
+
+
+
+
+
+ +
Validation Error
+
+ + + + +
+ + Schema + +
+
    + +
    + + + + detail + + + object[] + + + +
    +
  • +
    + Array [ +
    +
  • + +
    + + + + loc + + + object[] + + + + required + + + +
    +
  • +
    + Array [ +
    +
  • +
    + + anyOf + + + +
    + string +
    +
    + +
    + integer +
    +
    +
    +
    +
  • +
    + ] +
    +
  • +
    +
    +
    + + +
  • +
    + ] +
    +
  • +
    +
    +
    +
+
+
+ + + +
+
+
+
+
+
+
+
diff --git a/docs/docs/reference/openapi.json b/docs/docs/reference/openapi.json index 768da55536..2ab9146c38 100644 --- a/docs/docs/reference/openapi.json +++ b/docs/docs/reference/openapi.json @@ -1 +1,18053 @@ -{"openapi":"3.1.0","info":{"title":"Agenta API","version":"0.1.0","description":"Agenta API","contact":{"name":"Agenta","url":"https://agenta.ai","email":"team@agenta.ai"}},"paths":{"/billing/stripe/events/":{"post":{"tags":["Billing"],"summary":"Handle Events","operationId":"handle_events","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/stripe/portals/":{"post":{"tags":["Billing"],"summary":"Create Portal User Route","operationId":"create_portal","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/stripe/checkouts/":{"post":{"tags":["Billing"],"summary":"Create Checkout User Route","operationId":"create_checkout","parameters":[{"name":"plan","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Plan"}},{"name":"success_url","in":"query","required":true,"schema":{"type":"string","title":"Success Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/plans":{"get":{"tags":["Billing"],"summary":"Fetch Plan User Route","operationId":"fetch_plans","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/plans/switch":{"post":{"tags":["Billing"],"summary":"Switch Plans User Route","operationId":"switch_plans","parameters":[{"name":"plan","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription":{"get":{"tags":["Billing"],"summary":"Fetch Subscription User Route","operationId":"fetch_subscription","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/subscription/cancel":{"post":{"tags":["Billing"],"summary":"Cancel Subscription User Route","operationId":"cancel_plan","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/usage":{"get":{"tags":["Billing"],"summary":"Fetch Usage User Route","operationId":"fetch_usage","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/billing/stripe/portals/":{"post":{"tags":["Admin","Billing"],"summary":"Create Portal Admin Route","operationId":"admin_create_portal","parameters":[{"name":"organization_id","in":"query","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/billing/stripe/checkouts/":{"post":{"tags":["Admin","Billing"],"summary":"Create Checkout Admin Route","operationId":"admin_create_checkout","parameters":[{"name":"organization_id","in":"query","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"plan","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Plan"}},{"name":"success_url","in":"query","required":true,"schema":{"type":"string","title":"Success Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/billing/plans/switch":{"post":{"tags":["Admin","Billing"],"summary":"Switch Plans Admin Route","operationId":"admin_switch_plans","parameters":[{"name":"organization_id","in":"query","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"plan","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/billing/subscription/cancel":{"post":{"tags":["Admin","Billing"],"summary":"Cancel Subscription Admin Route","operationId":"admin_cancel_subscription","parameters":[{"name":"organization_id","in":"query","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/billing/usage/report":{"post":{"tags":["Admin","Billing"],"summary":"Report Usage","operationId":"admin_report_usage","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/organizations/own":{"get":{"summary":"Get User Organization","operationId":"get_own_org","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationOutput"}}}}}}},"/organizations/{organization_id}":{"get":{"tags":["Organization"],"summary":"Fetch Organization Details","description":"Return the details of the organization.","operationId":"fetch_organization_details","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Organization","operationId":"update_organization","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{organization_id}/workspaces":{"post":{"summary":"Create Workspace","operationId":"create_workspace","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspace"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{organization_id}/workspaces/{workspace_id}":{"put":{"summary":"Update Workspace","operationId":"update_workspace","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspace"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspaces/permissions":{"get":{"summary":"Get All Workspace Permissions","description":"Get all workspace permissions.\n\nReturns a list of all available workspace permissions.\n\nReturns:\n List[Permission]: A list of Permission objects representing the available workspace permissions.\n\nRaises:\n HTTPException: If there is an error retrieving the workspace permissions.","operationId":"get_all_workspace_permissions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Permission"},"type":"array","title":"Response Get All Workspace Permissions"}}}}}}},"/workspaces/{workspace_id}/roles":{"post":{"summary":"Assign Role To User","description":"Assigns a role to a user in a workspace.\n\nArgs:\n payload (UserRole): The payload containing the organization id, user email, and role to assign.\n workspace_id (str): The ID of the workspace.\n request (Request): The FastAPI request object.\n\nReturns:\n bool: True if the role was successfully assigned, False otherwise.\n\nRaises:\n HTTPException: If the user does not have permission to perform this action.\n HTTPException: If there is an error assigning the role to the user.","operationId":"assign_role_to_user","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRole"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Unassign Role From User","description":"Delete a role assignment from a user in a workspace.\n\nArgs:\n workspace_id (str): The ID of the workspace.\n email (str): The email of the user to remove the role from.\n organization_id (str): The ID of the organization.\n role (str): The role to remove from the user.\n request (Request): The FastAPI request object.\n\nReturns:\n bool: True if the role assignment was successfully deleted.\n\nRaises:\n HTTPException: If there is an error in the request or the user does not have permission to perform the action.\n HTTPException: If there is an error in updating the user's roles.","operationId":"unassign_role_from_user","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"organization_id","in":"query","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"role","in":"query","required":true,"schema":{"type":"string","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/by_resource":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation Ids","description":"Fetches evaluation ids for a given resource type and id.\n\nArguments:\n app_id (str): The ID of the app for which to fetch evaluations.\n resource_type (str): The type of resource for which to fetch evaluations.\n resource_ids List[ObjectId]: The IDs of resource for which to fetch evaluations.\n\nRaises:\n HTTPException: If the resource_type is invalid or access is denied.\n\nReturns:\n List[str]: A list of evaluation ids.","operationId":"fetch_evaluation_ids_evaluations_by_resource_get","parameters":[{"name":"resource_type","in":"query","required":true,"schema":{"type":"string","title":"Resource Type"}},{"name":"resource_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Resource Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Fetch Evaluation Ids Evaluations By Resource Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/{evaluation_id}/status":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation Status","description":"Fetches the status of the evaluation.\n\nArgs:\n evaluation_id (str): the evaluation id\n request (Request): the request object\n\nReturns:\n (str): the evaluation status","operationId":"fetch_evaluation_status","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/{evaluation_id}/results":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation Results","description":"Fetches the results of the evaluation\n\nArgs:\n evaluation_id (str): the evaluation id\n request (Request): the request object\n\nReturns:\n _type_: _description_","operationId":"fetch_legacy_evaluation_results","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/{evaluation_id}/evaluation_scenarios":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation Scenarios","description":"Fetches evaluation scenarios for a given evaluation ID.\n\nArguments:\n evaluation_id (str): The ID of the evaluation for which to fetch scenarios.\n\nRaises:\n HTTPException: If the evaluation is not found or access is denied.\n\nReturns:\n List[EvaluationScenario]: A list of evaluation scenarios.","operationId":"fetch_legacy_evaluation_scenarios","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/oss__src__models__api__evaluation_model__EvaluationScenario"},"title":"Response Fetch Legacy Evaluation Scenarios"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations":{"get":{"tags":["Evaluations"],"summary":"Fetch List Evaluations","description":"Fetches a list of evaluations, optionally filtered by an app ID.\n\nArgs:\n app_id (Optional[str]): An optional app ID to filter the evaluations.\n\nReturns:\n List[Evaluation]: A list of evaluations.","operationId":"fetch_legacy_evaluations","parameters":[{"name":"app_id","in":"query","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Evaluation"},"title":"Response Fetch Legacy Evaluations"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Evaluations","description":"Delete specific comparison tables based on their unique IDs.\n\nArgs:\ndelete_evaluations (List[str]): The unique identifiers of the comparison tables to delete.\n\nReturns:\nA list of the deleted comparison tables' IDs.","operationId":"delete_legacy_evaluations","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteEvaluation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Delete Legacy Evaluations"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/{evaluation_id}":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation","description":"Fetches a single evaluation based on its ID.\n\nArgs:\n evaluation_id (str): The ID of the evaluation to fetch.\n\nReturns:\n Evaluation: The fetched evaluation.","operationId":"fetch_legacy_evaluation","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evaluation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/evaluation_scenarios/comparison-results":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation Scenarios Comparison Results","description":"Fetches evaluation scenarios for a given evaluation ID.\n\nArguments:\n evaluation_id (str): The ID of the evaluation for which to fetch scenarios.\n\nRaises:\n HTTPException: If the evaluation is not found or access is denied.\n\nReturns:\n List[EvaluationScenario]: A list of evaluation scenarios.","operationId":"fetch_legacy_evaluation_scenarios_comparison_results","parameters":[{"name":"evaluations_ids","in":"query","required":true,"schema":{"type":"string","title":"Evaluations Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Fetch Legacy Evaluation Scenarios Comparison Results"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluations/preview/start":{"post":{"tags":["Evaluations"],"summary":"Start Evaluation","operationId":"start_evaluation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewEvaluation"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/human-evaluations":{"post":{"tags":["Human-Evaluations"],"summary":"Create Human Evaluation","description":"Creates a new comparison table document\nRaises:\n HTTPException: _description_\nReturns:\n _description_","operationId":"create_human_evaluation","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewHumanEvaluation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Human-Evaluations"],"summary":"Fetch List Human Evaluations","description":"Fetches a list of evaluations, optionally filtered by an app ID.\n\nArgs:\n app_id (Optional[str]): An optional app ID to filter the evaluations.\n\nReturns:\n List[HumanEvaluation]: A list of evaluations.","operationId":"fetch_list_human_evaluations_human_evaluations_get","parameters":[{"name":"app_id","in":"query","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HumanEvaluation"},"title":"Response Fetch List Human Evaluations Human Evaluations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Human-Evaluations"],"summary":"Delete Evaluations","description":"Delete specific comparison tables based on their unique IDs.\n\nArgs:\n payload (List[str]): The unique identifiers of the comparison tables to delete.\n\nReturns:\nA list of the deleted comparison tables' IDs.","operationId":"delete_evaluations_human_evaluations_delete","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteEvaluation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Delete Evaluations Human Evaluations Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/human-evaluations/{evaluation_id}":{"get":{"tags":["Human-Evaluations"],"summary":"Fetch Human Evaluation","description":"Fetches a single evaluation based on its ID.\n\nArgs:\n evaluation_id (str): The ID of the evaluation to fetch.\n\nReturns:\n HumanEvaluation: The fetched evaluation.","operationId":"fetch_human_evaluation_human_evaluations__evaluation_id__get","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HumanEvaluation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Human-Evaluations"],"summary":"Update Human Evaluation","description":"Updates an evaluation's status.\n\nRaises:\n HTTPException: If the columns in the test set do not match with the inputs in the variant.\n\nReturns:\n None: A 204 No Content status code, indicating that the update was successful.","operationId":"update_human_evaluation","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HumanEvaluationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/human-evaluations/{evaluation_id}/evaluation_scenarios":{"get":{"tags":["Human-Evaluations"],"summary":"Fetch Human Evaluation Scenarios","description":"Fetches evaluation scenarios for a given evaluation ID.\n\nArguments:\n evaluation_id (str): The ID of the evaluation for which to fetch scenarios.\n\nRaises:\n HTTPException: If the evaluation is not found or access is denied.\n\nReturns:\n List[EvaluationScenario]: A list of evaluation scenarios.","operationId":"fetch_human_evaluation_scenarios","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HumanEvaluationScenario"},"title":"Response Fetch Human Evaluation Scenarios"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/human-evaluations/{evaluation_id}/evaluation_scenario/{evaluation_scenario_id}/{evaluation_type}":{"put":{"tags":["Human-Evaluations"],"summary":"Update Evaluation Scenario Router","description":"Updates an evaluation scenario's vote or score based on its type.\n\nRaises:\n HTTPException: If update fails or unauthorized.\n\nReturns:\n None: 204 No Content status code upon successful update.","operationId":"update_evaluation_scenario_router_human_evaluations__evaluation_id__evaluation_scenario__evaluation_scenario_id___evaluation_type__put","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}},{"name":"evaluation_scenario_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Scenario Id"}},{"name":"evaluation_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/EvaluationType"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HumanEvaluationScenarioUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/human-evaluations/evaluation_scenario/{evaluation_scenario_id}/score":{"get":{"tags":["Human-Evaluations"],"summary":"Get Evaluation Scenario Score Router","description":"Fetch the score of a specific evaluation scenario.\n\nArgs:\n evaluation_scenario_id: The ID of the evaluation scenario to fetch.\n\nReturns:\n Dictionary containing the scenario ID and its score.","operationId":"get_evaluation_scenario_score_router_human_evaluations_evaluation_scenario__evaluation_scenario_id__score_get","parameters":[{"name":"evaluation_scenario_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Get Evaluation Scenario Score Router Human Evaluations Evaluation Scenario Evaluation Scenario Id Score Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Human-Evaluations"],"summary":"Update Evaluation Scenario Score Router","description":"Updates the score of an evaluation scenario.\n\nRaises:\n HTTPException: Server error if the evaluation update fails.\n\nReturns:\n None: 204 No Content status code upon successful update.","operationId":"update_evaluation_scenario_score_router_human_evaluations_evaluation_scenario__evaluation_scenario_id__score_put","parameters":[{"name":"evaluation_scenario_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioScoreUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/human-evaluations/{evaluation_id}/results":{"get":{"tags":["Human-Evaluations"],"summary":"Fetch Results","description":"Fetch all the results for one the comparison table\n\nArguments:\n evaluation_id -- _description_\n\nReturns:\n _description_","operationId":"fetch_results","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vault/v1/secrets/":{"get":{"tags":["Secrets"],"summary":"List Secrets","operationId":"list_secrets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SecretResponseDTO"},"type":"array","title":"Response List Secrets"}}}}}},"post":{"tags":["Secrets"],"summary":"Create Secret","operationId":"create_secret","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretDTO"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vault/v1/secrets/{secret_id}":{"get":{"tags":["Secrets"],"summary":"Read Secret","operationId":"read_secret","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","title":"Secret Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Secrets"],"summary":"Update Secret","operationId":"update_secret","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","title":"Secret Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretDTO"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Secrets"],"summary":"Delete Secret","operationId":"delete_secret","parameters":[{"name":"secret_id","in":"path","required":true,"schema":{"type":"string","title":"Secret Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/otlp/v1/traces":{"post":{"tags":["Observability"],"summary":"Receive /v1/traces via OTLP","description":"Receive traces via OTLP.","operationId":"otlp_v1_traces","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectStatusResponse"}}}}}}},"/observability/v1/otlp/traces":{"get":{"tags":["Observability"],"summary":"Status of OTLP endpoint","description":"Status of OTLP endpoint.","operationId":"otlp_status","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectStatusResponse"}}}}}},"post":{"tags":["Observability"],"summary":"Receive traces via OTLP","description":"Receive traces via OTLP.","operationId":"otlp_receiver","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectStatusResponse"}}}}}}},"/observability/v1/traces":{"get":{"tags":["Observability"],"summary":"Query traces, with optional grouping, windowing, filtering, and pagination.","description":"Query traces, with optional grouping, windowing, filtering, and pagination.","operationId":"query_traces","parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["opentelemetry","agenta"],"type":"string","default":"agenta","title":"Format"}},{"name":"focus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Focus"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oldest"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Newest"}},{"name":"filtering","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filtering"}},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"stop","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stop"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/oss__src__apis__fastapi__observability__models__OTelTracingResponse"},{"$ref":"#/components/schemas/AgentaNodesResponse"},{"$ref":"#/components/schemas/AgentaTreesResponse"},{"$ref":"#/components/schemas/AgentaRootsResponse"}],"title":"Response Query Traces"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Observability"],"summary":"Delete traces","description":"Delete trace.","operationId":"delete_traces","parameters":[{"name":"node_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","title":"Node Id"}},{"name":"node_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"uuid"},"title":"Node Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/observability/v1/analytics":{"get":{"tags":["Observability"],"summary":"Query analytics, with optional grouping, windowing, filtering.","operationId":"query_analytics","parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["legacy","agenta"],"type":"string","default":"agenta","title":"Format"}},{"name":"focus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Focus"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oldest"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Newest"}},{"name":"interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"}},{"name":"filtering","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filtering"}},{"name":"timeRange","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timerange"}},{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment"}},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LegacyAnalyticsResponse"},{"$ref":"#/components/schemas/oss__src__apis__fastapi__observability__models__OldAnalyticsResponse"}],"title":"Response Query Analytics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/observability/v1/traces/{trace_id}":{"get":{"tags":["Observability"],"summary":"Fetch trace by ID.","description":"Fetch trace by ID.","operationId":"fetch_trace_by_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Trace Id"}},{"name":"format","in":"query","required":false,"schema":{"enum":["opentelemetry","agenta"],"type":"string","default":"openetelemetry","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/oss__src__apis__fastapi__observability__models__OTelTracingResponse"},{"$ref":"#/components/schemas/AgentaNodesResponse"},{"$ref":"#/components/schemas/AgentaTreesResponse"},{"$ref":"#/components/schemas/AgentaRootsResponse"}],"title":"Response Fetch Trace By Id"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/traces/":{"post":{"tags":["Tracing"],"summary":"Create Trace","operationId":"create_trace","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelTracingRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelLinksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/traces/{trace_id}":{"get":{"tags":["Tracing"],"summary":"Fetch Trace","operationId":"fetch_trace","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oss__src__apis__fastapi__tracing__models__OTelTracingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Tracing"],"summary":"Edit Trace","operationId":"edit_trace","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelTracingRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelLinksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tracing"],"summary":"Delete Trace","operationId":"delete_trace","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelLinksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/spans/":{"post":{"tags":["Tracing"],"summary":"Ingest Spans","operationId":"ingest_spans","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelTracingRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelLinksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/spans/ingest":{"post":{"tags":["Tracing"],"summary":"Ingest Spans","operationId":"ingest_spans_rpc","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelTracingRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OTelLinksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/spans/query":{"post":{"tags":["Tracing"],"summary":"Query Spans","operationId":"query_spans_rpc","parameters":[{"name":"focus","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Focus"},{"type":"null"}],"title":"Focus"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Format"},{"type":"null"}],"title":"Format"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Oldest"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Newest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"}},{"name":"rate","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"}},{"name":"filter","in":"query","required":false,"schema":{"title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oss__src__apis__fastapi__tracing__models__OTelTracingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/spans/analytics":{"post":{"tags":["Tracing"],"summary":"Fetch Legacy Analytics","operationId":"fetch_analytics","parameters":[{"name":"focus","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Focus"},{"type":"null"}],"title":"Focus"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Format"},{"type":"null"}],"title":"Format"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Oldest"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Newest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"}},{"name":"rate","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"}},{"name":"filter","in":"query","required":false,"schema":{"title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/oss__src__apis__fastapi__tracing__models__OldAnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tracing/analytics/query":{"post":{"tags":["Tracing"],"summary":"Fetch Analytics","operationId":"fetch_new_analytics","parameters":[{"name":"focus","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Focus"},{"type":"null"}],"title":"Focus"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Format"},{"type":"null"}],"title":"Format"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Oldest"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Newest"}},{"name":"interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"}},{"name":"rate","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"}},{"name":"filter","in":"query","required":false,"schema":{"title":"Filter"}},{"name":"specs","in":"query","required":false,"schema":{"title":"Specs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/invocations/":{"post":{"tags":["Invocations"],"summary":"Create Invocation","operationId":"create_invocation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/invocations/{trace_id}":{"get":{"tags":["Invocations"],"summary":"Fetch Invocation","operationId":"fetch_invocation_by_trace_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Invocations"],"summary":"Edit Invocation","operationId":"edit_invocation_by_trace_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Invocations"],"summary":"Delete Invocation","operationId":"delete_invocation_by_trace_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/invocations/{trace_id}/{span_id}":{"get":{"tags":["Invocations"],"summary":"Fetch Invocation","operationId":"fetch_invocation","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Invocations"],"summary":"Edit Invocation","operationId":"edit_invocation","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Invocations"],"summary":"Delete Invocation","operationId":"delete_invocation","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/invocations/query":{"post":{"tags":["Invocations"],"summary":"Query Invocations","operationId":"query_invocations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvocationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/annotations/":{"post":{"tags":["Annotations"],"summary":"Create Annotation","operationId":"create_annotation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/annotations/{trace_id}":{"get":{"tags":["Annotations"],"summary":"Fetch Annotation","operationId":"fetch_annotation_by_trace_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Annotations"],"summary":"Edit Annotation","operationId":"edit_annotation_by_trace_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Annotations"],"summary":"Delete Annotation","operationId":"delete_annotation_by_trace_id","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/annotations/{trace_id}/{span_id}":{"get":{"tags":["Annotations"],"summary":"Fetch Annotation","operationId":"fetch_annotation","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Annotations"],"summary":"Edit Annotation","operationId":"edit_annotation","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Annotations"],"summary":"Delete Annotation","operationId":"delete_annotation","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}},{"name":"span_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/annotations/query":{"post":{"tags":["Annotations"],"summary":"Query Annotations","operationId":"query_annotations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnotationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testcases/{testcase_id}":{"get":{"tags":["Testcases"],"summary":"Fetch Testcase","operationId":"fetch_testcase_preview_testcases__testcase_id__get","parameters":[{"name":"testcase_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testcase Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestcaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testcases/query":{"post":{"tags":["Testcases"],"summary":"Query Testcases","operationId":"query_testcases_preview_testcases_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestcasesQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestcasesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/":{"post":{"tags":["Testsets"],"summary":"Create Testset","operationId":"create_testset","parameters":[{"name":"testset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/{testset_id}":{"get":{"tags":["Testsets"],"summary":"Fetch Testset","operationId":"fetch_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Testsets"],"summary":"Edit Testset","operationId":"edit_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/{testset_id}/archive":{"post":{"tags":["Testsets"],"summary":"Archive Testset","operationId":"archive_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/{testset_id}/unarchive":{"post":{"tags":["Testsets"],"summary":"Unarchive Testset","operationId":"unarchive_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/query":{"post":{"tags":["Testsets"],"summary":"Query Testsets","operationId":"query_testsets","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/variants/":{"post":{"tags":["Testsets"],"summary":"Create Testset Variant","operationId":"create_testset_variant","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/variants/{testset_variant_id}":{"get":{"tags":["Testsets"],"summary":"Fetch Testset Variant","operationId":"fetch_testset_variant","parameters":[{"name":"testset_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Testsets"],"summary":"Edit Testset Variant","operationId":"edit_testset_variant","parameters":[{"name":"testset_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Variant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/variants/{testset_variant_id}/archive":{"put":{"tags":["Testsets"],"summary":"Archive Testset Variant","operationId":"archive_testset_variant","parameters":[{"name":"testset_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/variants/{testset_variant_id}/unarchive":{"put":{"tags":["Testsets"],"summary":"Unarchive Testset Variant","operationId":"unarchive_testset_variant","parameters":[{"name":"testset_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/variants/query":{"post":{"tags":["Testsets"],"summary":"Query Testset Variants","operationId":"query_testset_variants","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetVariantsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/retrieve":{"post":{"tags":["Testsets"],"summary":"Retrieve Testset Revision","operationId":"retrieve_testset_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionRetrieveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/":{"post":{"tags":["Testsets"],"summary":"Create Testset Revision","operationId":"create_testset_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/{testset_revision_id}":{"get":{"tags":["Testsets"],"summary":"Fetch Testset Revision","operationId":"fetch_testset_revision","parameters":[{"name":"testset_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Testsets"],"summary":"Edit Testset Revision","operationId":"edit_testset_revision","parameters":[{"name":"testset_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Revision Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/{testset_revision_id}/archive":{"post":{"tags":["Testsets"],"summary":"Archive Testset Revision","operationId":"archive_testset_revision","parameters":[{"name":"testset_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/{testset_revision_id}/unarchive":{"post":{"tags":["Testsets"],"summary":"Unarchive Testset Revision","operationId":"unarchive_testset_revision","parameters":[{"name":"testset_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/query":{"post":{"tags":["Testsets"],"summary":"Query Testset Revisions","operationId":"query_testset_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/commit":{"post":{"tags":["Testsets"],"summary":"Commit Testset Revision","operationId":"commit_testset_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionCommitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/testsets/revisions/log":{"post":{"tags":["Testsets"],"summary":"Log Testset Revisions","operationId":"log_testset_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetLogRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsetRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/":{"post":{"tags":["Testsets"],"summary":"Create Simple Testset","operationId":"create_simple_testset","parameters":[{"name":"testset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/{testset_id}":{"get":{"tags":["Testsets"],"summary":"Fetch Simple Testset","operationId":"fetch_simple_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Testsets"],"summary":"Edit Simple Testset","operationId":"edit_simple_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/{testset_id}/archive":{"post":{"tags":["Testsets"],"summary":"Archive Simple Testset","operationId":"archive_simple_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/{testset_id}/unarchive":{"post":{"tags":["Testsets"],"summary":"Unarchive Simple Testset","operationId":"unarchive_simple_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/query":{"post":{"tags":["Testsets"],"summary":"Query Simple Testsets","operationId":"query_simple_testsets","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/upload":{"post":{"tags":["Testsets"],"summary":"Create Simple Testset From File","operationId":"create_simple_testset_from_file","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_simple_testset_from_file"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/{testset_id}/upload":{"post":{"tags":["Testsets"],"summary":"Edit Simple Testset From File","operationId":"edit_simple_testset_from_file","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_edit_simple_testset_from_file"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/{testset_id}/download":{"post":{"tags":["Testsets"],"summary":"Fetch Simple Testset To File","operationId":"fetch_simple_testset_to_file","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}},{"name":"file_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["csv","json"],"type":"string"},{"type":"null"}],"title":"File Type"}},{"name":"file_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/testsets/{testset_id}/transfer":{"post":{"tags":["Testsets"],"summary":"Transfer Simple Testset","operationId":"transfer_simple_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleTestsetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/":{"post":{"tags":["Queries"],"summary":"Create Query","operationId":"create_query","parameters":[{"name":"query_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/{query_id}":{"get":{"tags":["Queries"],"summary":"Fetch Query","operationId":"fetch_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Queries"],"summary":"Edit Query","operationId":"edit_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/{query_id}/archive":{"post":{"tags":["Queries"],"summary":"Archive Query","operationId":"archive_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/{query_id}/unarchive":{"post":{"tags":["Queries"],"summary":"Unarchive Query","operationId":"unarchive_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/query":{"post":{"tags":["Queries"],"summary":"Query Queries","operationId":"query_queries","parameters":[{"name":"query_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"}},{"name":"query_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Query Ids"}},{"name":"query_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query Slug"}},{"name":"query_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Query Slugs"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"flags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flags"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},{"name":"meta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta"}},{"name":"include_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Newest"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"enum":["ascending","descending"],"type":"string"},{"type":"null"}],"title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/retrieve":{"post":{"tags":["Queries"],"summary":"Retrieve Query Revision","operationId":"retrieve_query_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionRetrieveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/":{"post":{"tags":["Queries"],"summary":"Create Query Revision","operationId":"create_query_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/{query_revision_id}":{"get":{"tags":["Queries"],"summary":"Fetch Query Revision","operationId":"fetch_query_revision","parameters":[{"name":"query_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Queries"],"summary":"Edit Query Revision","operationId":"edit_query_revision","parameters":[{"name":"query_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Revision Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/{query_revision_id}/archive":{"post":{"tags":["Queries"],"summary":"Archive Query Revision","operationId":"archive_query_revision","parameters":[{"name":"query_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/{query_revision_id}/unarchive":{"post":{"tags":["Queries"],"summary":"Unarchive Query Revision","operationId":"unarchive_query_revision","parameters":[{"name":"query_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/query":{"post":{"tags":["Queries"],"summary":"Query Query Revisions","operationId":"query_query_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/commit":{"post":{"tags":["Queries"],"summary":"Commit Query Revision","operationId":"commit_query_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionCommitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/queries/revisions/log":{"post":{"tags":["Queries"],"summary":"Log Query Revisions","operationId":"log_query_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionsLogRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/queries/":{"post":{"tags":["Queries"],"summary":"Create Simple Query","operationId":"create_simple_query","parameters":[{"name":"query_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/queries/{query_id}":{"get":{"tags":["Queries"],"summary":"Fetch Simple Query","operationId":"fetch_simple_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Queries"],"summary":"Edit Simple Query","operationId":"edit_simple_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/queries/{query_id}/archive":{"post":{"tags":["Queries"],"summary":"Archive Simple Query","operationId":"archive_simple_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/queries/{query_id}/unarchive":{"post":{"tags":["Queries"],"summary":"Unarchive Simple Query","operationId":"unarchive_simple_query","parameters":[{"name":"query_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Query Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/queries/query":{"post":{"tags":["Queries"],"summary":"Query Simple Queries","operationId":"query_simple_queries","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueryQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleQueriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/legacy/applications/revisions/retrieve":{"post":{"tags":["Applications"],"summary":"Retrieve Application Revision","operationId":"retrieve_application_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationRevisionRetrieveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/legacy/applications/":{"post":{"tags":["Applications"],"summary":"Create Application","description":"Create a new application using workflow data stored in legacy format","operationId":"create_legacy_application","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApplicationCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApplicationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/legacy/applications/{application_id}":{"get":{"tags":["Applications"],"summary":"Fetch Application","description":"Get an application using workflow data stored in legacy format","operationId":"fetch_legacy_application","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApplicationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Applications"],"summary":"Update Application","description":"Update an application using workflow data stored in legacy format","operationId":"edit_legacy_application","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApplicationEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApplicationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/":{"post":{"tags":["Workflows"],"summary":"Create Workflow","operationId":"create_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/{workflow_id}":{"get":{"tags":["Workflows"],"summary":"Fetch Workflow","operationId":"fetch_workflow","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflows"],"summary":"Edit Workflow","operationId":"edit_workflow","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/{workflow_id}/archive":{"post":{"tags":["Workflows"],"summary":"Archive Workflow","operationId":"archive_workflow","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/{workflow_id}/unarchive":{"post":{"tags":["Workflows"],"summary":"Unarchive Workflow","operationId":"unarchive_workflow","parameters":[{"name":"workflow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/query":{"post":{"tags":["Workflows"],"summary":"Query Workflows","operationId":"query_workflows","parameters":[{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"}},{"name":"workflow_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Workflow Ids"}},{"name":"workflow_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Slug"}},{"name":"workflow_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Slugs"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"flags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flags"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},{"name":"meta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta"}},{"name":"include_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Newest"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"enum":["ascending","descending"],"type":"string"},{"type":"null"}],"title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/variants/":{"post":{"tags":["Workflows"],"summary":"Create Workflow Variant","operationId":"create_workflow_variant","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/variants/{workflow_variant_id}":{"get":{"tags":["Workflows"],"summary":"Fetch Workflow Variant","operationId":"fetch_workflow_variant","parameters":[{"name":"workflow_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflows"],"summary":"Edit Workflow Variant","operationId":"edit_workflow_variant","parameters":[{"name":"workflow_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Variant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/variants/{workflow_variant_id}/archive":{"post":{"tags":["Workflows"],"summary":"Archive Workflow Variant","operationId":"archive_workflow_variant","parameters":[{"name":"workflow_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/variants/{workflow_variant_id}/unarchive":{"post":{"tags":["Workflows"],"summary":"Unarchive Workflow Variant","operationId":"unarchive_workflow_variant","parameters":[{"name":"workflow_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/variants/query":{"post":{"tags":["Workflows"],"summary":"Query Workflow Variants","operationId":"query_workflow_variants","parameters":[{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"}},{"name":"workflow_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Workflow Ids"}},{"name":"workflow_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Slug"}},{"name":"workflow_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Slugs"}},{"name":"workflow_variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"}},{"name":"workflow_variant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Workflow Variant Ids"}},{"name":"workflow_variant_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Variant Slug"}},{"name":"workflow_variant_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Variant Slugs"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"flags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flags"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},{"name":"meta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta"}},{"name":"include_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Newest"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"enum":["ascending","descending"],"type":"string"},{"type":"null"}],"title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/variants/fork":{"post":{"tags":["Workflows"],"summary":"Fork Workflow Variant","operationId":"fork_workflow_variant","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowForkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/retrieve":{"get":{"tags":["Workflows"],"summary":"Retrieve Workflow Revision","operationId":"retrieve_workflow_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionRetrieveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/":{"post":{"tags":["Workflows"],"summary":"Create Workflow Revision","operationId":"create_workflow_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/{workflow_revision_id}":{"get":{"tags":["Workflows"],"summary":"Fetch Workflow Revision","operationId":"fetch_workflow_revision","parameters":[{"name":"workflow_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflows"],"summary":"Edit Workflow Revision","operationId":"edit_workflow_revision","parameters":[{"name":"workflow_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Revision Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/{workflow_revision_id}/archive":{"post":{"tags":["Workflows"],"summary":"Archive Workflow Revision","operationId":"archive_workflow_revision_rpc","parameters":[{"name":"workflow_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/{workflow_revision_id}/unarchive":{"post":{"tags":["Workflows"],"summary":"Unarchive Workflow Revision","operationId":"unarchive_workflow_revision_rpc","parameters":[{"name":"workflow_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workflow Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/query":{"post":{"tags":["Workflows"],"summary":"Query Workflow Revisions","operationId":"query_workflow_revisions","parameters":[{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"}},{"name":"workflow_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Workflow Ids"}},{"name":"workflow_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Slug"}},{"name":"workflow_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Slugs"}},{"name":"workflow_variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"}},{"name":"workflow_variant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Workflow Variant Ids"}},{"name":"workflow_variant_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Variant Slug"}},{"name":"workflow_variant_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Variant Slugs"}},{"name":"workflow_revision_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Revision Id"}},{"name":"workflow_revision_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Workflow Revision Ids"}},{"name":"workflow_revision_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Revision Slug"}},{"name":"workflow_revision_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Revision Slugs"}},{"name":"workflow_revision_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Revision Version"}},{"name":"workflow_revision_versions","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Workflow Revision Versions"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"flags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flags"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},{"name":"meta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta"}},{"name":"include_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Newest"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"enum":["ascending","descending"],"type":"string"},{"type":"null"}],"title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/commit":{"post":{"tags":["Workflows"],"summary":"Commit Workflow Revision","operationId":"commit_workflow_revision","parameters":[{"name":"workflow_variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionCommitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/revisions/log":{"post":{"tags":["Workflows"],"summary":"Log Workflow Revisions","operationId":"log_workflow_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionsLogRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/invoke":{"post":{"tags":["Workflows"],"summary":"Invoke Workflow","operationId":"invoke_workflow","parameters":[{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"}},{"name":"workflow_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Slug"}},{"name":"workflow_variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"}},{"name":"workflow_variant_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Variant Slug"}},{"name":"workflow_revision_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Revision Id"}},{"name":"workflow_revision_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Revision Slug"}},{"name":"workflow_revision_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Revision Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_invoke_workflow"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowServiceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/workflows/inspect":{"post":{"tags":["Workflows"],"summary":"Inspect Workflow","operationId":"inspect_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowServiceInterface-Input"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowServiceInterface-Output"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/":{"post":{"tags":["Evaluators"],"summary":"Create Evaluator","operationId":"create_evaluator","parameters":[{"name":"evaluator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/{evaluator_id}":{"get":{"tags":["Evaluators"],"summary":"Fetch Evaluator","operationId":"fetch_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Evaluators"],"summary":"Edit Evaluator","operationId":"edit_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/{evaluator_id}/archive":{"post":{"tags":["Evaluators"],"summary":"Archive Evaluator","operationId":"archive_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/{evaluator_id}/unarchive":{"post":{"tags":["Evaluators"],"summary":"Unarchive Evaluator","operationId":"unarchive_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/query":{"post":{"tags":["Evaluators"],"summary":"Query Evaluators","operationId":"query_evaluators","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/variants/":{"post":{"tags":["Evaluators"],"summary":"Create Evaluator Variant","operationId":"create_evaluator_variant","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/variants/{evaluator_variant_id}":{"get":{"tags":["Evaluators"],"summary":"Fetch Evaluator Variant","operationId":"fetch_evaluator_variant","parameters":[{"name":"evaluator_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Evaluators"],"summary":"Edit Evaluator Variant","operationId":"edit_evaluator_variant","parameters":[{"name":"evaluator_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Variant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/variants/{evaluator_variant_id}/archive":{"post":{"tags":["Evaluators"],"summary":"Archive Evaluator Variant","operationId":"archive_evaluator_variant","parameters":[{"name":"evaluator_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/variants/{evaluator_variant_id}/unarchive":{"post":{"tags":["Evaluators"],"summary":"Unarchive Evaluator Variant","operationId":"unarchive_evaluator_variant","parameters":[{"name":"evaluator_variant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/variants/query":{"post":{"tags":["Evaluators"],"summary":"Query Evaluator Variants","operationId":"query_evaluator_variants","parameters":[{"name":"evaluator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"}},{"name":"evaluator_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Evaluator Ids"}},{"name":"evaluator_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluator Slug"}},{"name":"evaluator_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Evaluator Slugs"}},{"name":"evaluator_variant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Variant Id"}},{"name":"evaluator_variant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Evaluator Variant Ids"}},{"name":"evaluator_variant_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluator Variant Slug"}},{"name":"evaluator_variant_slugs","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Evaluator Variant Slugs"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"flags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flags"}},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"}},{"name":"meta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta"}},{"name":"include_archived","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next"}},{"name":"newest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Newest"}},{"name":"oldest","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"enum":["ascending","descending"],"type":"string"},{"type":"null"}],"title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/variants/fork":{"post":{"tags":["Evaluators"],"summary":"Fork Evaluator Variant","operationId":"fork_evaluator_variant","parameters":[{"name":"evaluator_variant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Variant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorForkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorVariantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/retrieve":{"post":{"tags":["Evaluators"],"summary":"Retrieve Evaluator Revision","operationId":"retrieve_evaluator_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionRetrieveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/":{"post":{"tags":["Evaluators"],"summary":"Create Evaluator Revision","operationId":"create_evaluator_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/{evaluator_revision_id}":{"get":{"tags":["Evaluators"],"summary":"Fetch Evaluator Revision","operationId":"fetch_evaluator_revision","parameters":[{"name":"evaluator_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Evaluators"],"summary":"Edit Evaluator Revision","operationId":"edit_evaluator_revision","parameters":[{"name":"evaluator_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Revision Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/{evaluator_revision_id}/archive":{"post":{"tags":["Evaluators"],"summary":"Archive Evaluator Revision","operationId":"archive_evaluator_revision","parameters":[{"name":"evaluator_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/{evaluator_revision_id}/unarchive":{"post":{"tags":["Evaluators"],"summary":"Unarchive Evaluator Revision","operationId":"unarchive_evaluator_revision","parameters":[{"name":"evaluator_revision_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/query":{"post":{"tags":["Evaluators"],"summary":"Query Evaluator Revisions","operationId":"query_evaluator_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/commit":{"post":{"tags":["Evaluators"],"summary":"Commit Evaluator Revision","operationId":"commit_evaluator_revision","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionCommitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluators/revisions/log":{"post":{"tags":["Evaluators"],"summary":"Log Evaluator Revisions","operationId":"log_evaluator_revisions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionsLogRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorRevisionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluators/":{"post":{"tags":["Evaluators"],"summary":"Create Simple Evaluator","operationId":"create_simple_evaluator","parameters":[{"name":"evaluator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluators/{evaluator_id}":{"get":{"tags":["Evaluators"],"summary":"Fetch Simple Evaluator","operationId":"fetch_simple_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Evaluators"],"summary":"Edit Simple Evaluator","operationId":"edit_simple_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluators/{evaluator_id}/archive":{"post":{"tags":["Evaluators"],"summary":"Archive Simple Evaluator","operationId":"archive_simple_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluators/{evaluator_id}/unarchive":{"post":{"tags":["Evaluators"],"summary":"Unarchive Simple Evaluator","operationId":"unarchive_simple_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluators/query":{"post":{"tags":["Evaluators"],"summary":"Query Simple Evaluators","operationId":"query_simple_evaluators","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluators/{evaluator_id}/transfer":{"post":{"tags":["Evaluators"],"summary":"Transfer Simple Evaluator","operationId":"transfer_simple_evaluator","parameters":[{"name":"evaluator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluatorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/evaluations/runs/refresh":{"post":{"tags":["Evaluations","Admin"],"summary":"Refresh Runs","operationId":"refresh_runs_admin_evaluations_runs_refresh_post","parameters":[{"name":"trigger_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":1},{"type":"null"}],"default":1,"title":"Trigger Interval"}},{"name":"trigger_datetime","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trigger Datetime"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/":{"post":{"tags":["Evaluations"],"summary":"Create Runs","operationId":"create_runs_preview_evaluations_runs__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Runs","operationId":"delete_runs_preview_evaluations_runs__delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunIdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Runs","operationId":"edit_runs_preview_evaluations_runs__patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/query":{"post":{"tags":["Evaluations"],"summary":"Query Runs","operationId":"query_runs_preview_evaluations_runs_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/close":{"post":{"tags":["Evaluations"],"summary":"Close Runs","operationId":"close_runs_preview_evaluations_runs_close_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/open":{"post":{"tags":["Evaluations"],"summary":"Open Runs","operationId":"open_runs_preview_evaluations_runs_open_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/{run_id}":{"get":{"tags":["Evaluations"],"summary":"Fetch Run","operationId":"fetch_run_preview_evaluations_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Run","operationId":"edit_run_preview_evaluations_runs__run_id__patch","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Run","operationId":"delete_run_preview_evaluations_runs__run_id__delete","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/{run_id}/close":{"post":{"tags":["Evaluations"],"summary":"Close Run","operationId":"close_run_preview_evaluations_runs__run_id__close_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/runs/{run_id}/open":{"post":{"tags":["Evaluations"],"summary":"Open Run","operationId":"open_run_preview_evaluations_runs__run_id__open_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/scenarios/":{"post":{"tags":["Evaluations"],"summary":"Create Scenarios","operationId":"create_scenarios_preview_evaluations_scenarios__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenariosCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenariosResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Scenarios","operationId":"delete_scenarios_preview_evaluations_scenarios__delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioIdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Scenarios","operationId":"edit_scenarios_preview_evaluations_scenarios__patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenariosEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenariosResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/scenarios/query":{"post":{"tags":["Evaluations"],"summary":"Query Scenarios","operationId":"query_scenarios_preview_evaluations_scenarios_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenariosResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/scenarios/{scenario_id}":{"get":{"tags":["Evaluations"],"summary":"Fetch Scenario","operationId":"fetch_scenario_preview_evaluations_scenarios__scenario_id__get","parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Scenario","operationId":"edit_scenario_preview_evaluations_scenarios__scenario_id__patch","parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scenario Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Scenario","operationId":"delete_scenario_preview_evaluations_scenarios__scenario_id__delete","parameters":[{"name":"scenario_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scenario Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationScenarioIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/results/":{"post":{"tags":["Evaluations"],"summary":"Create Results","operationId":"create_results_preview_evaluations_results__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultsCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Results","operationId":"delete_results_preview_evaluations_results__delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultIdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Results","operationId":"edit_results_preview_evaluations_results__patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultsEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/results/query":{"post":{"tags":["Evaluations"],"summary":"Query Results","operationId":"query_results_preview_evaluations_results_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/results/{result_id}":{"get":{"tags":["Evaluations"],"summary":"Fetch Result","operationId":"fetch_result_preview_evaluations_results__result_id__get","parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Result","operationId":"edit_result_preview_evaluations_results__result_id__patch","parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Result Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Result","operationId":"delete_result_preview_evaluations_results__result_id__delete","parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResultIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/metrics/refresh":{"post":{"tags":["Evaluations"],"summary":"Refresh Metrics","operationId":"refresh_metrics_preview_evaluations_metrics_refresh_post","parameters":[{"name":"run_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"scenario_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scenario Id"}},{"name":"timestamp","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"}},{"name":"interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/metrics/":{"post":{"tags":["Evaluations"],"summary":"Create Metrics","operationId":"create_metrics_preview_evaluations_metrics__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Metrics","operationId":"delete_metrics_preview_evaluations_metrics__delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsIdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Metrics","operationId":"edit_metrics_preview_evaluations_metrics__patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/metrics/query":{"post":{"tags":["Evaluations"],"summary":"Query Metrics","operationId":"query_metrics_preview_evaluations_metrics_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/queues/":{"post":{"tags":["Evaluations"],"summary":"Create Queues","operationId":"create_queues_preview_evaluations_queues__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueuesCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Queues","operationId":"delete_queues_preview_evaluations_queues__delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueIdsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueIdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Queues","operationId":"edit_queues_preview_evaluations_queues__patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueuesEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/queues/query":{"post":{"tags":["Evaluations"],"summary":"Query Queues","operationId":"query_queues_preview_evaluations_queues_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/queues/{queue_id}":{"get":{"tags":["Evaluations"],"summary":"Fetch Queue","operationId":"fetch_queue_preview_evaluations_queues__queue_id__get","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Queue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Queue","operationId":"edit_queue_preview_evaluations_queues__queue_id__patch","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Queue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Queue","operationId":"delete_queue_preview_evaluations_queues__queue_id__delete","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Queue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/evaluations/queues/{queue_id}/scenarios":{"get":{"tags":["Evaluations"],"summary":"Fetch Queue Scenarios","operationId":"fetch_queue_scenarios_preview_evaluations_queues__queue_id__scenarios_get","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Queue Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQueueScenarioIdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/":{"post":{"tags":["Evaluations"],"summary":"Create Evaluation","operationId":"create_evaluation_preview_simple_evaluations__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/{evaluation_id}":{"get":{"tags":["Evaluations"],"summary":"Fetch Evaluation","operationId":"fetch_evaluation_preview_simple_evaluations__evaluation_id__get","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Evaluations"],"summary":"Edit Evaluation","operationId":"edit_evaluation_preview_simple_evaluations__evaluation_id__patch","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluations"],"summary":"Delete Evaluation","operationId":"delete_evaluation_preview_simple_evaluations__evaluation_id__delete","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationIdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/query":{"post":{"tags":["Evaluations"],"summary":"Query Evaluations","operationId":"query_evaluations_preview_simple_evaluations_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationQueryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/{evaluation_id}/start":{"post":{"tags":["Evaluations"],"summary":"Start Evaluation","operationId":"start_evaluation_preview_simple_evaluations__evaluation_id__start_post","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/{evaluation_id}/stop":{"post":{"tags":["Evaluations"],"summary":"Stop Evaluation","operationId":"stop_evaluation_preview_simple_evaluations__evaluation_id__stop_post","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/{evaluation_id}/close":{"post":{"tags":["Evaluations"],"summary":"Close Evaluation","operationId":"close_evaluation_preview_simple_evaluations__evaluation_id__close_post","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/simple/evaluations/{evaluation_id}/open":{"post":{"tags":["Evaluations"],"summary":"Open Evaluation","operationId":"open_evaluation_preview_simple_evaluations__evaluation_id__open_post","parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleEvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/accounts":{"post":{"tags":["Admin"],"summary":"Create Accounts","operationId":"create_accounts","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntitiesRequestModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopesResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/account":{"post":{"tags":["Admin"],"summary":"Create Account","operationId":"create_account","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AccountRequest"},{"type":"null"}],"title":"Account"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/permissions/verify":{"get":{"tags":["Access Control"],"summary":"Verify Permissions","operationId":"verify_permissions","parameters":[{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"scope_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Type"}},{"name":"scope_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scope Id"}},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"}},{"name":"resource_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Resource Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects":{"get":{"tags":["Scopes"],"summary":"Get Projects","operationId":"get_projects","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProjectsResponse"},"type":"array","title":"Response Get Projects"}}}}}}},"/profile":{"get":{"summary":"User Profile","operationId":"fetch_user_profile","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/profile/reset-password":{"post":{"summary":"Reset User Password","operationId":"reset_user_password","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/variants":{"get":{"tags":["Apps"],"summary":"List App Variants","description":"Retrieve a list of app variants for a given app ID.\n\nArgs:\n app_id (str): The ID of the app to retrieve variants for.\n\nReturns:\n List[AppVariantResponse]: A list of app variants for the given app ID.","operationId":"list_app_variants","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AppVariantResponse_"},"title":"Response List App Variants"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/get_variant_by_env":{"get":{"tags":["Apps"],"summary":"Get Variant By Env","description":"Retrieve the app variant based on the provided app_id and environment.\n\nArgs:\n app_id (str): The ID of the app to retrieve the variant for.\n environment (str): The environment of the app variant to retrieve.\n\nRaises:\n HTTPException: If the app variant is not found (status_code=500), or if a ValueError is raised (status_code=400), or if any other exception is raised (status_code=500).\n\nReturns:\n AppVariantResponse: The retrieved app variant.","operationId":"get_variant_by_env","parameters":[{"name":"app_id","in":"query","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"environment","in":"query","required":true,"schema":{"type":"string","title":"Environment"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVariantResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps":{"post":{"tags":["Apps"],"summary":"Create App","description":"Create a new app for a user or organization.\n\nArgs:\n payload (CreateApp): The payload containing the app name and organization ID (optional).\n\nReturns:\n CreateAppOutput: The output containing the newly created app's ID and name.\n\nRaises:\n HTTPException: If there is an error creating the app or the user does not have permission to access the app.","operationId":"create_app","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApp_"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Apps"],"summary":"List Apps","description":"Retrieve a list of apps filtered by app_name.\n\nArgs:\n app_name (Optional[str]): The name of the app to filter by.\n\nReturns:\n List[App]: A list of apps filtered by app_name.\n\nRaises:\n HTTPException: If there was an error retrieving the list of apps.","operationId":"list_apps","parameters":[{"name":"app_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/App"},"title":"Response List Apps"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}":{"get":{"tags":["Apps"],"summary":"Read App","description":"Retrieve an app by its ID.\n\nArgs:\n app_id (str): The ID of the app to retrieve.\n\nReturns:\n ReadAppOutput: The output containing the app's ID and name.\n\nRaises:\n HTTPException: If there is an error retrieving the app or the user does not have permission to access the app.","operationId":"create_app","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadAppOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Apps"],"summary":"Update App","description":"Update an app for a user or organization.\n\nArgs:\n app_id (str): The ID of the app.\n payload (UpdateApp): The payload containing the app name.\n\nReturns:\n UpdateAppOutput: The output containing the newly created app's ID and name.\n\nRaises:\n HTTPException: If there is an error creating the app or the user does not have permission to access the app.","operationId":"update_app","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApp"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAppOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Apps"],"summary":"Remove App","description":"Remove app, all its variant.\n\nArguments:\n app -- App to remove","operationId":"remove_app","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/variant/from-service":{"post":{"tags":["Apps"],"summary":"Add Variant From Url Route","operationId":"add_variant_from_url","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddVariantFromURLPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/variant/from-template":{"post":{"tags":["Apps"],"summary":"Add Variant From Key Route","operationId":"add_variant_from_key","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddVariantFromKeyPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/environments":{"get":{"tags":["Apps"],"summary":"List Environments","description":"Retrieve a list of environments for a given app ID.\n\nArgs:\n app_id (str): The ID of the app to retrieve environments for.\n\nReturns:\n List[EnvironmentOutput]: A list of environment objects.","operationId":"list_environments","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EnvironmentOutput_"},"title":"Response List Environments"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/revisions/{environment_name}":{"get":{"tags":["Apps"],"summary":"List App Environment Revisions","operationId":"environment_revisions","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"environment_name","in":"path","required":true,"schema":{"title":"Environment Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentOutputExtended_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/from-base":{"post":{"tags":["Variants"],"summary":"Add Variant From Base And Config","description":"Add a new variant based on an existing one.\nSame as POST /config\n\nArgs:\n payload (AddVariantFromBasePayload): Payload containing base variant ID, new variant name, and parameters.\n\nRaises:\n HTTPException: Raised if the variant could not be added or accessed.\n\nReturns:\n Union[AppVariantResponse, Any]: New variant details or exception.","operationId":"add_variant_from_base_and_config","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddVariantFromBasePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AppVariantResponse_"},{}],"title":"Response Add Variant From Base And Config"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/{variant_id}":{"delete":{"tags":["Variants"],"summary":"Remove Variant","description":"Mark a variant as hidden from the UI.\n\nArguments:\n app_variant -- AppVariant to remove\n\nRaises:\n HTTPException: If there is a problem removing the app variant","operationId":"mark_variant_as_hidden","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"string","title":"Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Variants"],"summary":"Get Variant","operationId":"get_variant","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"string","title":"Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVariantResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/{variant_id}/parameters":{"put":{"tags":["Variants"],"summary":"Update Variant Parameters","description":"Updates the parameters for an app variant.\n\nArgs:\n variant_id (str): The ID of the app variant to update.\n payload (UpdateVariantParameterPayload): The payload containing the updated parameters.\n\nRaises:\n HTTPException: If there is an error while trying to update the app variant.\n\nReturns:\n JSONResponse: A JSON response containing the updated app variant parameters.","operationId":"update_variant_parameters","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"string","title":"Variant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVariantParameterPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVariantRevision"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/{variant_id}/service":{"put":{"tags":["Variants"],"summary":"Update Variant Url","description":"Updates the URL used in an app variant.\n\nArgs:\n variant_id (str): The ID of the app variant to update.\n url (str): The URL to update.\n\nRaises:\n HTTPException: If an error occurs while trying to update the app variant.\n\nReturns:\n JSONResponse: A JSON response indicating whether the update was successful or not.","operationId":"update_variant_url","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVariantURLPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/{variant_id}/revisions":{"get":{"tags":["Variants"],"summary":"Get Variant Revisions","operationId":"get_variant_revisions","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"string","title":"Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AppVariantRevision"},"title":"Response Get Variant Revisions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/{variant_id}/revisions/{revision_number}":{"get":{"tags":["Variants"],"summary":"Get Variant Revision","operationId":"get_variant_revision","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"string","title":"Variant Id"}},{"name":"revision_number","in":"path","required":true,"schema":{"type":"integer","title":"Revision Number"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVariantRevision"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/{variant_id}/revisions/{revision_id}":{"delete":{"tags":["Variants"],"summary":"Remove Variant Revision","description":"Mark a variant revision as hidden from the UI.\n\nArguments:\n app_variant -- AppVariant to remove\n revision_id -- Revision ID to remove\n\nRaises:\n HTTPException: If there is a problem removing the app variant","operationId":"mark_variant_revision_as_hidden","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"string","title":"Variant Id"}},{"name":"revision_id","in":"path","required":true,"schema":{"type":"string","title":"Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/add":{"post":{"tags":["Variants"],"summary":"Configs Add","operationId":"configs_add","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_configs_add"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/fetch":{"post":{"tags":["Variants"],"summary":"Configs Fetch","description":"Fetch configuration for a variant or environment.\n\nEither variant_ref OR environment_ref must be provided (if neither is provided,\na default environment_ref with slug=\"production\" will be used).\n\nFor each reference object (variant_ref, environment_ref, application_ref):\n- Provide either 'slug' or 'id' field\n- 'version' is optional and can be set to null\n- If 'id' is provided, it will be used directly to fetch the resource\n- Otherwise, 'slug' will be used along with application_ref\n\nReturns:\n ConfigResponseModel: The configuration for the requested variant or environment.\n\nRaises:\n HTTPException: If the configuration is not found.","operationId":"configs_fetch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_configs_fetch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/fork":{"post":{"tags":["Variants"],"summary":"Configs Fork","operationId":"configs_fork","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_configs_fork"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/commit":{"post":{"tags":["Variants"],"summary":"Configs Commit","operationId":"configs_commit","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/deploy":{"post":{"tags":["Variants"],"summary":"Configs Deploy","operationId":"configs_deploy","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_configs_deploy"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/delete":{"post":{"tags":["Variants"],"summary":"Configs Delete","operationId":"configs_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_configs_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"integer","title":"Response Configs Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/list":{"post":{"tags":["Variants"],"summary":"Configs List","operationId":"configs_list","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ConfigResponseModel"},"type":"array","title":"Response Configs List"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/variants/configs/history":{"post":{"tags":["Variants"],"summary":"Configs History","operationId":"configs_history","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_configs_history"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ConfigResponseModel"},"type":"array","title":"Response Configs History"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/containers/templates":{"get":{"tags":["Containers"],"summary":"Container Templates","description":"Returns a list of templates available for creating new containers.","operationId":"container_templates","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/evaluators":{"get":{"tags":["Evaluators"],"summary":"Get Evaluators Endpoint","description":"Endpoint to fetch a list of evaluators.\n\nReturns:\n List[Evaluator]: A list of evaluator objects.","operationId":"get_evaluators_endpoint_evaluators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LegacyEvaluator"},"type":"array","title":"Response Get Evaluators Endpoint Evaluators Get"}}}}}}},"/evaluators/map":{"post":{"tags":["Evaluators"],"summary":"Evaluator Data Map","description":"Endpoint to map the experiment data tree to evaluator interface.\n\nArgs:\n request (Request): The request object.\n payload (EvaluatorMappingInputInterface): The payload containing the request data.\n\nReturns:\n EvaluatorMappingOutputInterface: the evaluator mapping output object","operationId":"evaluator_data_map_evaluators_map_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorMappingInputInterface"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorMappingOutputInterface"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluators/{evaluator_key}/run":{"post":{"tags":["Evaluators"],"summary":"Evaluator Run","description":"Endpoint to evaluate LLM app run\n\nArgs:\n request (Request): The request object.\n evaluator_key (str): The key of the evaluator.\n payload (EvaluatorInputInterface): The payload containing the request data.\n\nReturns:\n result: EvaluatorOutputInterface object containing the outputs.","operationId":"evaluator_run_evaluators__evaluator_key__run_post","parameters":[{"name":"evaluator_key","in":"path","required":true,"schema":{"type":"string","title":"Evaluator Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorInputInterface"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorOutputInterface"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluators/configs":{"get":{"tags":["Evaluators"],"summary":"Get Evaluator Configs","description":"Endpoint to fetch evaluator configurations for a specific app.\n\nArgs:\n app_id (str): The ID of the app.\n\nReturns:\n List[EvaluatorConfigDB]: A list of evaluator configuration objects.","operationId":"get_evaluator_configs_evaluators_configs_get","parameters":[{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EvaluatorConfig"},"title":"Response Get Evaluator Configs Evaluators Configs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Evaluators"],"summary":"Create New Evaluator Config","description":"Endpoint to fetch evaluator configurations for a specific app.\n\nArgs:\n app_id (str): The ID of the app.\n\nReturns:\n EvaluatorConfigDB: Evaluator configuration api model.","operationId":"create_new_evaluator_config_evaluators_configs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewEvaluatorConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/evaluators/configs/{evaluator_config_id}":{"get":{"tags":["Evaluators"],"summary":"Get Evaluator Config","description":"Endpoint to fetch evaluator configurations for a specific app.\n\nReturns:\n List[EvaluatorConfigDB]: A list of evaluator configuration objects.","operationId":"get_evaluator_config_evaluators_configs__evaluator_config_id__get","parameters":[{"name":"evaluator_config_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluator Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Evaluators"],"summary":"Update Evaluator Config","description":"Endpoint to update evaluator configurations for a specific app.\n\nReturns:\n List[EvaluatorConfigDB]: A list of evaluator configuration objects.","operationId":"update_evaluator_config_evaluators_configs__evaluator_config_id__put","parameters":[{"name":"evaluator_config_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluator Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEvaluatorConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluators"],"summary":"Delete Evaluator Config","description":"Endpoint to delete a specific evaluator configuration.\n\nArgs:\n evaluator_config_id (str): The unique identifier of the evaluator configuration.\n\nReturns:\n bool: True if deletion was successful, False otherwise.","operationId":"delete_evaluator_config_evaluators_configs__evaluator_config_id__delete","parameters":[{"name":"evaluator_config_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluator Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Delete Evaluator Config Evaluators Configs Evaluator Config Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/testsets/upload":{"post":{"tags":["Testsets"],"summary":"Upload File","description":"Uploads a CSV or JSON file and saves its data to Postgres.\n\nArgs:\nupload_type : Either a json or csv file.\n file (UploadFile): The CSV or JSON file to upload.\n testset_name (Optional): the name of the testset if provided.\n\nReturns:\n dict: The result of the upload process.","operationId":"upload_file","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSetSimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/testsets/endpoint":{"post":{"tags":["Testsets"],"summary":"Import Testset","description":"Import JSON testset data from an endpoint and save it to Postgres.\n\nArgs:\n endpoint (str): An endpoint URL to import data from.\n testset_name (str): the name of the testset if provided.\n\nReturns:\n dict: The result of the import process.","operationId":"import_testset","parameters":[{"name":"authorization","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_import_testset"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSetSimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/testsets":{"get":{"tags":["Testsets"],"summary":"Get Testsets","description":"Get all testsets.\n\nReturns:\n- A list of testset objects.\n\nRaises:\n- `HTTPException` with status code 404 if no testsets are found.","operationId":"get_testsets","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TestSetOutputResponse"},"type":"array","title":"Response Get Testsets"}}}}}},"post":{"tags":["Testsets"],"summary":"Create Testset","description":"Create a testset with given name, save the testset to Postgres.\n\nArgs:\nname (str): name of the test set.\ntestset (Dict[str, str]): test set data.\n\nReturns:\nstr: The id of the test set created.","operationId":"create_testset","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewTestset"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSetSimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Testsets"],"summary":"Delete Testsets","description":"Delete specific testsets based on their unique IDs.\n\nArgs:\ntestset_ids (List[str]): The unique identifiers of the testsets to delete.\n\nReturns:\nA list of the deleted testsets' IDs.","operationId":"delete_testsets","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteTestsets"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Delete Testsets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/testsets/{testset_id}":{"put":{"tags":["Testsets"],"summary":"Update Testset","description":"Update a testset with given id, update the testset in Postgres.\n\nArgs:\ntestset_id (str): id of the test set to be updated.\ncsvdata (NewTestset): New data to replace the old testset.\n\nReturns:\nstr: The id of the test set updated.","operationId":"update_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","title":"Testset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewTestset"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Testsets"],"summary":"Get Single Testset","description":"Fetch a specific testset in Postgres.\n\nArgs:\n testset_id (str): The id of the testset to fetch.\n\nReturns:\n The requested testset if found, else an HTTPException.","operationId":"get_single_testset","parameters":[{"name":"testset_id","in":"path","required":true,"schema":{"type":"string","title":"Testset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/environments/deploy":{"post":{"tags":["Environments"],"summary":"Deploy To Environment","description":"Deploys a given variant to an environment\n\nArgs:\n environment_name: Name of the environment to deploy to.\n variant_id: variant id to deploy.\n\nRaises:\n HTTPException: If the deployment fails.","operationId":"deploy_to_environment","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployToEnvironmentPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bases":{"get":{"tags":["Bases"],"summary":"List Bases","description":"Retrieve a list of bases filtered by app_id and base_name.\n\nArgs:\n request (Request): The incoming request.\n app_id (str): The ID of the app to filter by.\n base_name (Optional[str], optional): The name of the base to filter by. Defaults to None.\n\nReturns:\n List[BaseOutput]: A list of BaseOutput objects representing the filtered bases.\n\nRaises:\n HTTPException: If there was an error retrieving the bases.","operationId":"list_bases","parameters":[{"name":"app_id","in":"query","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"base_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BaseOutput"},"title":"Response List Bases"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/configs":{"get":{"tags":["Configs"],"summary":"Get Config","operationId":"get_config","parameters":[{"name":"base_id","in":"query","required":true,"schema":{"type":"string","title":"Base Id"}},{"name":"config_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config Name"}},{"name":"environment_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/configs/deployment/{deployment_revision_id}":{"get":{"tags":["Configs"],"summary":"Get Config Deployment Revision","operationId":"get_config_deployment_revision","parameters":[{"name":"deployment_revision_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/configs/deployment/{deployment_revision_id}/revert":{"post":{"tags":["Configs"],"summary":"Revert Deployment Revision","operationId":"revert_deployment_revision","parameters":[{"name":"deployment_revision_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Revision Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keys":{"get":{"tags":["Api Keys"],"summary":"List Api Keys","description":"List all API keys associated with the authenticated user.\n\nArgs:\n request (Request): The incoming request object.\n\nReturns:\n List[ListAPIKeysResponse]: A list of API Keys associated with the user.","operationId":"list_api_keys","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ListAPIKeysResponse"},"type":"array","title":"Response List Api Keys"}}}}}},"post":{"tags":["Api Keys"],"summary":"Create Api Key","description":"Creates an API key for a user.\n\nArgs:\n request (Request): The request object containing the user ID in the request state.\n\nReturns:\n str: The created API key.","operationId":"create_api_key","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Create Api Key"}}}}}}},"/keys/{key_prefix}":{"delete":{"tags":["Api Keys"],"summary":"Delete Api Key","description":"Delete an API key with the given key prefix for the authenticated user.\n\nArgs:\n key_prefix (str): The prefix of the API key to be deleted.\n request (Request): The incoming request object.\n\nReturns:\n dict: A dictionary containing a success message upon successful deletion.\n\nRaises:\n HTTPException: If the API key is not found or does not belong to the user.","operationId":"delete_api_key","parameters":[{"name":"key_prefix","in":"path","required":true,"schema":{"type":"string","title":"Key Prefix"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Api Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations":{"get":{"tags":["Organization"],"summary":"List Organizations","description":"Returns a list of organizations associated with the user's session.\n\nReturns:\n list[Organization]: A list of organizations associated with the user's session.\n\nRaises:\n HTTPException: If there is an error retrieving the organizations from the database.","operationId":"list_organizations","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Organization"},"type":"array","title":"Response List Organizations"}}}}}}},"/organizations/{organization_id}/workspaces/{workspace_id}/invite":{"post":{"tags":["Organization"],"summary":"Invite User To Organization","description":"Assigns a role to a user in an organization.\n\nArgs:\n organization_id (str): The ID of the organization.\n payload (InviteRequest): The payload containing the organization id, user email, and role to assign.\n workspace_id (str): The ID of the workspace.\n\nReturns:\n bool: True if the role was successfully assigned, False otherwise.\n\nRaises:\n HTTPException: If the user does not have permission to perform this action.\n HTTPException: If there is an error assigning the role to the user.","operationId":"invite_user_to_workspace","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InviteRequest"},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{organization_id}/workspaces/{workspace_id}/invite/resend":{"post":{"tags":["Organization"],"summary":"Resend User Invitation To Organization","description":"Resend an invitation to a user to an Organization.\n\nRaises:\n HTTPException: _description_; status_code: 500\n HTTPException: Invitation not found or has expired; status_code: 400\n HTTPException: You already belong to this organization; status_code: 400\n\nReturns:\n JSONResponse: Resent invitation to user; status_code: 200","operationId":"resend_invitation","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendInviteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{organization_id}/workspaces/{workspace_id}/invite/accept":{"post":{"tags":["Organization"],"summary":"Accept Organization Invitation","description":"Accept an invitation to an organization.\n\nRaises:\n HTTPException: _description_; status_code: 500\n HTTPException: Invitation not found or has expired; status_code: 400\n HTTPException: You already belong to this organization; status_code: 400\n\nReturns:\n JSONResponse: Accepted invitation to workspace; status_code: 200","operationId":"accept_invitation","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"project_id","in":"query","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteToken"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspaces":{"get":{"tags":["Workspace"],"summary":"Get Workspace","description":"Get workspace details.\n\nReturns details about the workspace associated with the user's session.\n\nReturns:\n Workspace: The details of the workspace.\n\nRaises:\n HTTPException: If the user does not have permission to perform this action.","operationId":"get_workspace","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Workspace"},"type":"array","title":"Response Get Workspace"}}}}}}},"/workspaces/roles":{"get":{"tags":["Workspace"],"summary":"Get All Workspace Roles","description":"Get all workspace roles.\n\nReturns a list of all available workspace roles.\n\nReturns:\n List[WorkspaceRoleResponse]: A list of WorkspaceRole objects representing the available workspace roles.\n\nRaises:\n HTTPException: If an error occurs while retrieving the workspace roles.","operationId":"get_all_workspace_roles","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Response Get All Workspace Roles"}}}}}}},"/workspaces/{workspace_id}/users":{"delete":{"tags":["Workspace"],"summary":"Remove User From Workspace","description":"Remove a user from a workspace.\n\nArgs:\n email (str): The email address of the user to be removed\n workspace_id (str): The ID of the workspace.","operationId":"remove_user_from_workspace","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccountRequest":{"properties":{"user":{"anyOf":[{"$ref":"#/components/schemas/LegacyUserRequest"},{"type":"null"}]},"scope":{"anyOf":[{"$ref":"#/components/schemas/LegacyScopeRequest"},{"type":"null"}]},"subscription":{"anyOf":[{"$ref":"#/components/schemas/LegacySubscriptionRequest"},{"type":"null"}]}},"type":"object","title":"AccountRequest"},"AccountResponse":{"properties":{"user":{"anyOf":[{"$ref":"#/components/schemas/LegacyUserResponse"},{"type":"null"}]},"scopes":{"anyOf":[{"items":{"$ref":"#/components/schemas/LegacyScopesResponse"},"type":"array"},{"type":"null"}],"title":"Scopes"}},"type":"object","title":"AccountResponse"},"AddVariantFromBasePayload":{"properties":{"base_id":{"type":"string","title":"Base Id"},"new_variant_name":{"type":"string","title":"New Variant Name"},"new_config_name":{"type":"string","title":"New Config Name"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"}},"type":"object","required":["base_id","new_variant_name","new_config_name","parameters"],"title":"AddVariantFromBasePayload"},"AddVariantFromKeyPayload":{"properties":{"variant_name":{"type":"string","title":"Variant Name"},"key":{"type":"string","title":"Key"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"},"base_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Name"},"config_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config Name"}},"type":"object","required":["variant_name","key"],"title":"AddVariantFromKeyPayload"},"AddVariantFromURLPayload":{"properties":{"variant_name":{"type":"string","title":"Variant Name"},"url":{"type":"string","title":"Url"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"},"base_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Name"},"config_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config Name"}},"type":"object","required":["variant_name","url"],"title":"AddVariantFromURLPayload"},"AgentaNodeDTO-Input":{"properties":{"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"root":{"$ref":"#/components/schemas/RootDTO"},"tree":{"$ref":"#/components/schemas/TreeDTO"},"node":{"$ref":"#/components/schemas/NodeDTO"},"parent":{"anyOf":[{"$ref":"#/components/schemas/ParentDTO"},{"type":"null"}]},"time":{"$ref":"#/components/schemas/TimeDTO"},"status":{"$ref":"#/components/schemas/StatusDTO"},"exception":{"anyOf":[{"$ref":"#/components/schemas/ExceptionDTO"},{"type":"null"}]},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metrics"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"},"refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Refs"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"},"otel":{"anyOf":[{"$ref":"#/components/schemas/OTelExtraDTO-Input"},{"type":"null"}]},"nodes":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/SpanDTO-Input"},{"items":{"$ref":"#/components/schemas/SpanDTO-Input"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Nodes"}},"type":"object","required":["trace_id","span_id","root","tree","node","time","status"],"title":"AgentaNodeDTO"},"AgentaNodeDTO-Output":{"properties":{"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"root":{"$ref":"#/components/schemas/RootDTO"},"tree":{"$ref":"#/components/schemas/TreeDTO"},"node":{"$ref":"#/components/schemas/NodeDTO"},"parent":{"anyOf":[{"$ref":"#/components/schemas/ParentDTO"},{"type":"null"}]},"time":{"$ref":"#/components/schemas/TimeDTO"},"status":{"$ref":"#/components/schemas/StatusDTO"},"exception":{"anyOf":[{"$ref":"#/components/schemas/ExceptionDTO"},{"type":"null"}]},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metrics"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"},"refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Refs"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"},"otel":{"anyOf":[{"$ref":"#/components/schemas/OTelExtraDTO-Output"},{"type":"null"}]},"nodes":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/SpanDTO-Output"},{"items":{"$ref":"#/components/schemas/SpanDTO-Output"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Nodes"}},"type":"object","required":["trace_id","span_id","root","tree","node","time","status"],"title":"AgentaNodeDTO"},"AgentaNodesResponse":{"properties":{"nodes":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentaNodeDTO-Output"},"type":"array"},{"type":"null"}],"title":"Nodes","default":[]},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"}},"type":"object","title":"AgentaNodesResponse"},"AgentaRootDTO":{"properties":{"root":{"$ref":"#/components/schemas/RootDTO"},"trees":{"items":{"$ref":"#/components/schemas/AgentaTreeDTO"},"type":"array","title":"Trees"}},"type":"object","required":["root","trees"],"title":"AgentaRootDTO"},"AgentaRootsResponse":{"properties":{"roots":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentaRootDTO"},"type":"array"},{"type":"null"}],"title":"Roots","default":[]},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"}},"type":"object","title":"AgentaRootsResponse"},"AgentaTreeDTO":{"properties":{"tree":{"$ref":"#/components/schemas/TreeDTO"},"nodes":{"items":{"$ref":"#/components/schemas/AgentaNodeDTO-Output"},"type":"array","title":"Nodes"}},"type":"object","required":["tree","nodes"],"title":"AgentaTreeDTO"},"AgentaTreesResponse":{"properties":{"trees":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentaTreeDTO"},"type":"array"},{"type":"null"}],"title":"Trees","default":[]},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"}},"type":"object","title":"AgentaTreesResponse"},"AgentaVersionedTreeDTO-Input":{"properties":{"version":{"type":"string","title":"Version"},"nodes":{"items":{"$ref":"#/components/schemas/AgentaNodeDTO-Input"},"type":"array","title":"Nodes"}},"type":"object","required":["version","nodes"],"title":"AgentaVersionedTreeDTO"},"AgentaVersionedTreeDTO-Output":{"properties":{"version":{"type":"string","title":"Version"},"nodes":{"items":{"$ref":"#/components/schemas/AgentaNodeDTO-Output"},"type":"array","title":"Nodes"}},"type":"object","required":["version","nodes"],"title":"AgentaVersionedTreeDTO"},"AggregatedResult":{"properties":{"evaluator_config":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorConfig"},{"additionalProperties":true,"type":"object"}],"title":"Evaluator Config"},"result":{"$ref":"#/components/schemas/Result"}},"type":"object","required":["evaluator_config","result"],"title":"AggregatedResult"},"Analytics":{"properties":{"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","default":0},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","default":0.0},"costs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Costs","default":0.0},"tokens":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tokens","default":0.0}},"type":"object","title":"Analytics"},"AnalyticsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"buckets":{"items":{"$ref":"#/components/schemas/MetricsBucket"},"type":"array","title":"Buckets","default":[]},"query":{"$ref":"#/components/schemas/TracingQuery","default":{}},"specs":{"items":{"$ref":"#/components/schemas/MetricSpec"},"type":"array","title":"Specs","default":[]}},"type":"object","title":"AnalyticsResponse"},"Annotation":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"span_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"origin":{"$ref":"#/components/schemas/SimpleTraceOrigin","default":"custom"},"kind":{"$ref":"#/components/schemas/SimpleTraceKind","default":"adhoc"},"channel":{"$ref":"#/components/schemas/SimpleTraceChannel","default":"api"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object","title":"Data"},"references":{"$ref":"#/components/schemas/SimpleTraceReferences"},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"items":{"$ref":"#/components/schemas/Link"},"type":"array"}],"title":"Links"}},"type":"object","required":["data","references","links"],"title":"Annotation"},"AnnotationCreate":{"properties":{"origin":{"$ref":"#/components/schemas/SimpleTraceOrigin","default":"custom"},"kind":{"$ref":"#/components/schemas/SimpleTraceKind","default":"adhoc"},"channel":{"$ref":"#/components/schemas/SimpleTraceChannel","default":"api"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object","title":"Data"},"references":{"$ref":"#/components/schemas/SimpleTraceReferences"},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"items":{"$ref":"#/components/schemas/Link"},"type":"array"}],"title":"Links"}},"type":"object","required":["data","references","links"],"title":"AnnotationCreate"},"AnnotationCreateRequest":{"properties":{"annotation":{"$ref":"#/components/schemas/AnnotationCreate"}},"type":"object","required":["annotation"],"title":"AnnotationCreateRequest"},"AnnotationEdit":{"properties":{"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object","title":"Data"}},"type":"object","required":["data"],"title":"AnnotationEdit"},"AnnotationEditRequest":{"properties":{"annotation":{"$ref":"#/components/schemas/AnnotationEdit"}},"type":"object","required":["annotation"],"title":"AnnotationEditRequest"},"AnnotationLinkResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"annotation_link":{"anyOf":[{"$ref":"#/components/schemas/Link"},{"type":"null"}]}},"type":"object","title":"AnnotationLinkResponse"},"AnnotationQuery":{"properties":{"origin":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceOrigin"},{"type":"null"}]},"kind":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceKind"},{"type":"null"}]},"channel":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceChannel"},{"type":"null"}]},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"references":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceReferences"},{"type":"null"}]},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"items":{"$ref":"#/components/schemas/Link"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","title":"AnnotationQuery"},"AnnotationQueryRequest":{"properties":{"annotation":{"anyOf":[{"$ref":"#/components/schemas/AnnotationQuery"},{"type":"null"}]},"annotation_links":{"anyOf":[{"items":{"$ref":"#/components/schemas/Link"},"type":"array"},{"type":"null"}],"title":"Annotation Links"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"AnnotationQueryRequest"},"AnnotationResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"annotation":{"anyOf":[{"$ref":"#/components/schemas/Annotation"},{"type":"null"}]}},"type":"object","title":"AnnotationResponse"},"AnnotationsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"annotations":{"items":{"$ref":"#/components/schemas/Annotation"},"type":"array","title":"Annotations","default":[]}},"type":"object","title":"AnnotationsResponse"},"App":{"properties":{"app_id":{"type":"string","title":"App Id"},"app_name":{"type":"string","title":"App Name"},"app_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Type"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["app_id","app_name","updated_at"],"title":"App"},"AppVariantResponse_":{"properties":{"app_id":{"type":"string","title":"App Id"},"app_name":{"type":"string","title":"App Name"},"variant_id":{"type":"string","title":"Variant Id"},"variant_name":{"type":"string","title":"Variant Name"},"project_id":{"type":"string","title":"Project Id"},"base_name":{"type":"string","title":"Base Name"},"base_id":{"type":"string","title":"Base Id"},"config_name":{"type":"string","title":"Config Name"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"revision":{"type":"integer","title":"Revision"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"modified_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modified By Id"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["app_id","app_name","variant_id","variant_name","project_id","base_name","base_id","config_name","revision"],"title":"AppVariantResponse_"},"AppVariantRevision":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"revision":{"type":"integer","title":"Revision"},"modified_by":{"type":"string","title":"Modified By"},"config":{"$ref":"#/components/schemas/ConfigDB"},"created_at":{"type":"string","title":"Created At"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"}},"type":"object","required":["revision","modified_by","config","created_at"],"title":"AppVariantRevision"},"ApplicationFlags":{"properties":{"is_custom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom"},"is_evaluator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Evaluator"},"is_human":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Human"}},"type":"object","title":"ApplicationFlags"},"ApplicationRevision":{"properties":{"application_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Variant Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"application_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"flags":{"anyOf":[{"$ref":"#/components/schemas/ApplicationFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApplicationRevisionData"},{"type":"null"}]}},"type":"object","title":"ApplicationRevision"},"ApplicationRevisionData":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"ApplicationRevisionData"},"ApplicationRevisionResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"application_revision":{"anyOf":[{"$ref":"#/components/schemas/ApplicationRevision"},{"type":"null"}]}},"type":"object","title":"ApplicationRevisionResponse"},"ApplicationRevisionRetrieveRequest":{"properties":{"application_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"application_variant_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"application_revision_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]}},"type":"object","title":"ApplicationRevisionRetrieveRequest"},"BaseOutput":{"properties":{"base_id":{"type":"string","title":"Base Id"},"base_name":{"type":"string","title":"Base Name"}},"type":"object","required":["base_id","base_name"],"title":"BaseOutput"},"Body_configs_add":{"properties":{"variant_ref":{"$ref":"#/components/schemas/ReferenceRequestModel"},"application_ref":{"$ref":"#/components/schemas/ReferenceRequestModel"}},"type":"object","required":["variant_ref","application_ref"],"title":"Body_configs_add"},"Body_configs_delete":{"properties":{"variant_ref":{"$ref":"#/components/schemas/ReferenceRequestModel"},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]}},"type":"object","required":["variant_ref"],"title":"Body_configs_delete"},"Body_configs_deploy":{"properties":{"variant_ref":{"$ref":"#/components/schemas/ReferenceRequestModel"},"environment_ref":{"$ref":"#/components/schemas/ReferenceRequestModel"},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]}},"type":"object","required":["variant_ref","environment_ref"],"title":"Body_configs_deploy"},"Body_configs_fetch":{"properties":{"variant_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]},"environment_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]}},"type":"object","title":"Body_configs_fetch"},"Body_configs_fork":{"properties":{"variant_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]},"environment_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]}},"type":"object","title":"Body_configs_fork"},"Body_configs_history":{"properties":{"variant_ref":{"$ref":"#/components/schemas/ReferenceRequestModel"},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceRequestModel"},{"type":"null"}]}},"type":"object","required":["variant_ref"],"title":"Body_configs_history"},"Body_create_simple_testset_from_file":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"file_type":{"type":"string","enum":["csv","json"],"title":"File Type","default":"csv"},"testset_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Slug"},"testset_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Name"},"testset_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Description"},"testset_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Tags"},"testset_meta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Meta"}},"type":"object","required":["file"],"title":"Body_create_simple_testset_from_file"},"Body_edit_simple_testset_from_file":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"file_type":{"type":"string","enum":["csv","json"],"title":"File Type","default":"csv"},"testset_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Name"},"testset_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Description"},"testset_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Tags"},"testset_meta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Meta"}},"type":"object","required":["file"],"title":"Body_edit_simple_testset_from_file"},"Body_import_testset":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"testset_name":{"type":"string","title":"Testset Name"}},"type":"object","title":"Body_import_testset"},"Body_invoke_workflow":{"properties":{"workflow_service_request":{"$ref":"#/components/schemas/WorkflowServiceRequest"},"workflow_revision_data":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevisionData-Input"},{"type":"null"}]}},"type":"object","required":["workflow_service_request"],"title":"Body_invoke_workflow"},"Body_upload_file":{"properties":{"upload_type":{"type":"string","title":"Upload Type"},"file":{"type":"string","format":"binary","title":"File"},"testset_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Name"}},"type":"object","required":["file"],"title":"Body_upload_file"},"Bucket":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"interval":{"type":"integer","title":"Interval"},"total":{"$ref":"#/components/schemas/Analytics"},"errors":{"$ref":"#/components/schemas/Analytics"}},"type":"object","required":["timestamp","interval","total","errors"],"title":"Bucket"},"BucketDTO":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"interval":{"type":"integer","title":"Interval"},"total":{"$ref":"#/components/schemas/MetricsDTO"},"error":{"$ref":"#/components/schemas/MetricsDTO"}},"type":"object","required":["timestamp","interval","total","error"],"title":"BucketDTO"},"CollectStatusResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"CollectStatusResponse"},"ComparisonOperator":{"type":"string","enum":["is","is_not"],"title":"ComparisonOperator"},"Condition":{"properties":{"field":{"type":"string","title":"Field"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"value":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"items":{},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Value"},"operator":{"anyOf":[{"$ref":"#/components/schemas/ComparisonOperator"},{"$ref":"#/components/schemas/NumericOperator"},{"$ref":"#/components/schemas/StringOperator"},{"$ref":"#/components/schemas/ListOperator"},{"$ref":"#/components/schemas/DictOperator"},{"$ref":"#/components/schemas/ExistenceOperator"},{"type":"null"}],"title":"Operator","default":"is"},"options":{"anyOf":[{"$ref":"#/components/schemas/TextOptions"},{"$ref":"#/components/schemas/ListOptions"},{"type":"null"}],"title":"Options"}},"type":"object","required":["field"],"title":"Condition"},"ConfigDB":{"properties":{"config_name":{"type":"string","title":"Config Name"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"}},"type":"object","required":["config_name"],"title":"ConfigDB"},"ConfigDTO":{"properties":{"params":{"additionalProperties":true,"type":"object","title":"Params"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"service_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"variant_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"environment_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"application_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"service_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"variant_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"environment_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]}},"type":"object","required":["params"],"title":"ConfigDTO"},"ConfigRequest":{"properties":{"config":{"$ref":"#/components/schemas/ConfigDTO"}},"type":"object","required":["config"],"title":"ConfigRequest"},"ConfigResponseModel":{"properties":{"params":{"additionalProperties":true,"type":"object","title":"Params"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"application_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"service_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"variant_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"environment_ref":{"anyOf":[{"$ref":"#/components/schemas/ReferenceDTO"},{"type":"null"}]},"application_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"service_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"variant_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"environment_lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]}},"type":"object","required":["params"],"title":"ConfigResponseModel"},"CorrectAnswer":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"}},"type":"object","required":["key","value"],"title":"CorrectAnswer"},"CreateAppOutput":{"properties":{"app_id":{"type":"string","title":"App Id"},"app_name":{"type":"string","title":"App Name"}},"type":"object","required":["app_id","app_name"],"title":"CreateAppOutput"},"CreateApp_":{"properties":{"app_name":{"type":"string","title":"App Name"},"template_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Key"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}},"type":"object","required":["app_name"],"title":"CreateApp_"},"CreateSecretDTO":{"properties":{"header":{"$ref":"#/components/schemas/Header"},"secret":{"$ref":"#/components/schemas/SecretDTO"}},"type":"object","required":["header","secret"],"title":"CreateSecretDTO"},"CreateWorkspace":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},"type":"object","required":["name"],"title":"CreateWorkspace"},"CustomModelSettingsDTO":{"properties":{"slug":{"type":"string","title":"Slug"},"extras":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extras"}},"type":"object","required":["slug"],"title":"CustomModelSettingsDTO"},"CustomProviderDTO":{"properties":{"kind":{"$ref":"#/components/schemas/CustomProviderKind"},"provider":{"$ref":"#/components/schemas/CustomProviderSettingsDTO"},"models":{"items":{"$ref":"#/components/schemas/CustomModelSettingsDTO"},"type":"array","title":"Models"},"provider_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Slug"},"model_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Model Keys"}},"type":"object","required":["kind","provider","models"],"title":"CustomProviderDTO"},"CustomProviderKind":{"type":"string","enum":["custom","azure","bedrock","sagemaker","vertex_ai","openai","cohere","anyscale","deepinfra","alephalpha","groq","mistralai","anthropic","perplexityai","together_ai","openrouter","gemini"],"title":"CustomProviderKind"},"CustomProviderSettingsDTO":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"extras":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extras"}},"type":"object","title":"CustomProviderSettingsDTO"},"DeleteEvaluation":{"properties":{"evaluations_ids":{"items":{"type":"string"},"type":"array","title":"Evaluations Ids"}},"type":"object","required":["evaluations_ids"],"title":"DeleteEvaluation"},"DeleteTestsets":{"properties":{"testset_ids":{"items":{"type":"string"},"type":"array","title":"Testset Ids"}},"type":"object","required":["testset_ids"],"title":"DeleteTestsets"},"DeployToEnvironmentPayload":{"properties":{"environment_name":{"type":"string","title":"Environment Name"},"variant_id":{"type":"string","title":"Variant Id"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"}},"type":"object","required":["environment_name","variant_id"],"title":"DeployToEnvironmentPayload"},"DictOperator":{"type":"string","enum":["has","has_not"],"title":"DictOperator"},"EntitiesRequestModel":{"properties":{"users":{"additionalProperties":{"$ref":"#/components/schemas/UserRequest"},"type":"object","title":"Users"},"organizations":{"additionalProperties":{"$ref":"#/components/schemas/OrganizationRequest"},"type":"object","title":"Organizations"},"workspaces":{"additionalProperties":{"$ref":"#/components/schemas/WorkspaceRequest"},"type":"object","title":"Workspaces"},"projects":{"additionalProperties":{"$ref":"#/components/schemas/ProjectRequest"},"type":"object","title":"Projects"},"organization_memberships":{"additionalProperties":{"$ref":"#/components/schemas/OrganizationMembershipRequest"},"type":"object","title":"Organization Memberships"},"workspace_memberships":{"additionalProperties":{"$ref":"#/components/schemas/WorkspaceMembershipRequest"},"type":"object","title":"Workspace Memberships"},"project_memberships":{"additionalProperties":{"$ref":"#/components/schemas/ProjectMembershipRequest"},"type":"object","title":"Project Memberships"}},"type":"object","required":["users","organizations","workspaces","projects","organization_memberships","workspace_memberships","project_memberships"],"title":"EntitiesRequestModel"},"EnvironmentOutputExtended_":{"properties":{"name":{"type":"string","title":"Name"},"app_id":{"type":"string","title":"App Id"},"project_id":{"type":"string","title":"Project Id"},"deployed_app_variant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed App Variant Id"},"deployed_variant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed Variant Name"},"deployed_app_variant_revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed App Variant Revision Id"},"revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Revision"},"revisions":{"items":{"$ref":"#/components/schemas/EnvironmentRevision"},"type":"array","title":"Revisions"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["name","app_id","project_id","revisions"],"title":"EnvironmentOutputExtended_"},"EnvironmentOutput_":{"properties":{"name":{"type":"string","title":"Name"},"app_id":{"type":"string","title":"App Id"},"project_id":{"type":"string","title":"Project Id"},"deployed_app_variant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed App Variant Id"},"deployed_variant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed Variant Name"},"deployed_app_variant_revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed App Variant Revision Id"},"revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Revision"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["name","app_id","project_id"],"title":"EnvironmentOutput_"},"EnvironmentRevision":{"properties":{"id":{"type":"string","title":"Id"},"revision":{"type":"integer","title":"Revision"},"modified_by":{"type":"string","title":"Modified By"},"deployed_app_variant_revision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed App Variant Revision"},"deployment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"},"created_at":{"type":"string","title":"Created At"},"deployed_variant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed Variant Name"}},"type":"object","required":["id","revision","modified_by","created_at"],"title":"EnvironmentRevision"},"Error":{"properties":{"message":{"type":"string","title":"Message"},"stacktrace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stacktrace"}},"type":"object","required":["message"],"title":"Error"},"Evaluation":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"project_id":{"type":"string","title":"Project Id"},"variant_ids":{"items":{"type":"string"},"type":"array","title":"Variant Ids"},"variant_names":{"items":{"type":"string"},"type":"array","title":"Variant Names"},"variant_revision_ids":{"items":{"type":"string"},"type":"array","title":"Variant Revision Ids"},"revisions":{"items":{"type":"string"},"type":"array","title":"Revisions"},"testset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Id"},"testset_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Testset Name"},"status":{"$ref":"#/components/schemas/Result"},"aggregated_results":{"items":{"$ref":"#/components/schemas/AggregatedResult"},"type":"array","title":"Aggregated Results"},"average_cost":{"anyOf":[{"$ref":"#/components/schemas/Result"},{"type":"null"}]},"total_cost":{"anyOf":[{"$ref":"#/components/schemas/Result"},{"type":"null"}]},"average_latency":{"anyOf":[{"$ref":"#/components/schemas/Result"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","app_id","project_id","variant_ids","variant_names","variant_revision_ids","revisions","status","aggregated_results","created_at","updated_at"],"title":"Evaluation"},"EvaluationMetrics":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}],"default":"pending"},"data":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Data"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"scenario_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scenario Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["run_id"],"title":"EvaluationMetrics"},"EvaluationMetricsCreate":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"version":{"type":"string","title":"Version","default":"2025.07.14"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"data":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Data"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"scenario_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scenario Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["run_id"],"title":"EvaluationMetricsCreate"},"EvaluationMetricsCreateRequest":{"properties":{"metrics":{"items":{"$ref":"#/components/schemas/EvaluationMetricsCreate"},"type":"array","title":"Metrics"}},"type":"object","required":["metrics"],"title":"EvaluationMetricsCreateRequest"},"EvaluationMetricsEdit":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"data":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","title":"EvaluationMetricsEdit"},"EvaluationMetricsEditRequest":{"properties":{"metrics":{"items":{"$ref":"#/components/schemas/EvaluationMetricsEdit"},"type":"array","title":"Metrics"}},"type":"object","required":["metrics"],"title":"EvaluationMetricsEditRequest"},"EvaluationMetricsIdsRequest":{"properties":{"metrics_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Metrics Ids"}},"type":"object","required":["metrics_ids"],"title":"EvaluationMetricsIdsRequest"},"EvaluationMetricsIdsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"metrics_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Metrics Ids","default":[]}},"type":"object","title":"EvaluationMetricsIdsResponse"},"EvaluationMetricsQuery":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"statuses":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"intervals":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Intervals"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"timestamps":{"anyOf":[{"items":{"type":"string","format":"date-time"},"type":"array"},{"type":"null"}],"title":"Timestamps"},"scenario_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scenario Id"},"scenario_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Scenario Ids"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"run_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Run Ids"},"ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"EvaluationMetricsQuery"},"EvaluationMetricsQueryRequest":{"properties":{"metrics":{"anyOf":[{"$ref":"#/components/schemas/EvaluationMetricsQuery"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluationMetricsQueryRequest"},"EvaluationMetricsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"metrics":{"items":{"$ref":"#/components/schemas/EvaluationMetrics"},"type":"array","title":"Metrics","default":[]}},"type":"object","title":"EvaluationMetricsResponse"},"EvaluationQueue":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}],"default":"pending"},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueData"},{"type":"null"}]},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["run_id"],"title":"EvaluationQueue"},"EvaluationQueueCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"version":{"type":"string","title":"Version","default":"2025.07.14"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueData"},{"type":"null"}]},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["run_id"],"title":"EvaluationQueueCreate"},"EvaluationQueueData":{"properties":{"user_ids":{"anyOf":[{"items":{"items":{"type":"string","format":"uuid"},"type":"array"},"type":"array"},{"type":"null"}],"title":"User Ids"},"scenario_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Scenario Ids"},"step_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Step Keys"}},"type":"object","title":"EvaluationQueueData"},"EvaluationQueueEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueData"},{"type":"null"}]}},"type":"object","title":"EvaluationQueueEdit"},"EvaluationQueueEditRequest":{"properties":{"queue":{"$ref":"#/components/schemas/EvaluationQueueEdit"}},"type":"object","required":["queue"],"title":"EvaluationQueueEditRequest"},"EvaluationQueueFlags":{"properties":{"is_sequential":{"type":"boolean","title":"Is Sequential","default":false}},"type":"object","title":"EvaluationQueueFlags"},"EvaluationQueueIdResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"queue_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Queue Id"}},"type":"object","title":"EvaluationQueueIdResponse"},"EvaluationQueueIdsRequest":{"properties":{"queue_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Queue Ids"}},"type":"object","required":["queue_ids"],"title":"EvaluationQueueIdsRequest"},"EvaluationQueueIdsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"queue_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Queue Ids","default":[]}},"type":"object","title":"EvaluationQueueIdsResponse"},"EvaluationQueueQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"user_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"User Ids"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"run_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Run Ids"},"ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"EvaluationQueueQuery"},"EvaluationQueueQueryRequest":{"properties":{"queue":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueueQuery"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluationQueueQueryRequest"},"EvaluationQueueResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"queue":{"anyOf":[{"$ref":"#/components/schemas/EvaluationQueue"},{"type":"null"}]}},"type":"object","title":"EvaluationQueueResponse"},"EvaluationQueueScenarioIdsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"scenario_ids":{"items":{"items":{"type":"string","format":"uuid"},"type":"array"},"type":"array","title":"Scenario Ids","default":[]}},"type":"object","title":"EvaluationQueueScenarioIdsResponse"},"EvaluationQueuesCreateRequest":{"properties":{"queues":{"items":{"$ref":"#/components/schemas/EvaluationQueueCreate"},"type":"array","title":"Queues"}},"type":"object","required":["queues"],"title":"EvaluationQueuesCreateRequest"},"EvaluationQueuesEditRequest":{"properties":{"queues":{"items":{"$ref":"#/components/schemas/EvaluationQueueEdit"},"type":"array","title":"Queues"}},"type":"object","required":["queues"],"title":"EvaluationQueuesEditRequest"},"EvaluationQueuesResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"queues":{"items":{"$ref":"#/components/schemas/EvaluationQueue"},"type":"array","title":"Queues","default":[]}},"type":"object","title":"EvaluationQueuesResponse"},"EvaluationResult":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"hash_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hash Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"testcase_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testcase Id"},"error":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Error"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}],"default":"pending"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"repeat_idx":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repeat Idx","default":0},"step_key":{"type":"string","title":"Step Key"},"scenario_id":{"type":"string","format":"uuid","title":"Scenario Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["step_key","scenario_id","run_id"],"title":"EvaluationResult"},"EvaluationResultCreate":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"version":{"type":"string","title":"Version","default":"2025.07.14"},"hash_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hash Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"testcase_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testcase Id"},"error":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Error"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"repeat_idx":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repeat Idx","default":0},"step_key":{"type":"string","title":"Step Key"},"scenario_id":{"type":"string","format":"uuid","title":"Scenario Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["step_key","scenario_id","run_id"],"title":"EvaluationResultCreate"},"EvaluationResultEdit":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"hash_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hash Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"testcase_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testcase Id"},"error":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Error"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]}},"type":"object","title":"EvaluationResultEdit"},"EvaluationResultEditRequest":{"properties":{"result":{"$ref":"#/components/schemas/EvaluationResultEdit"}},"type":"object","required":["result"],"title":"EvaluationResultEditRequest"},"EvaluationResultIdResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"result_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Result Id"}},"type":"object","title":"EvaluationResultIdResponse"},"EvaluationResultIdsRequest":{"properties":{"result_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Result Ids"}},"type":"object","required":["result_ids"],"title":"EvaluationResultIdsRequest"},"EvaluationResultIdsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"result_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Result Ids","default":[]}},"type":"object","title":"EvaluationResultIdsResponse"},"EvaluationResultQuery":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"statuses":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"intervals":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Intervals"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"timestamps":{"anyOf":[{"items":{"type":"string","format":"date-time"},"type":"array"},{"type":"null"}],"title":"Timestamps"},"repeat_idx":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repeat Idx"},"repeat_idxs":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Repeat Idxs"},"step_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Key"},"step_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Step Keys"},"scenario_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scenario Id"},"scenario_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Scenario Ids"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"run_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Run Ids"},"ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"EvaluationResultQuery"},"EvaluationResultQueryRequest":{"properties":{"result":{"anyOf":[{"$ref":"#/components/schemas/EvaluationResultQuery"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluationResultQueryRequest"},"EvaluationResultResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"result":{"anyOf":[{"$ref":"#/components/schemas/EvaluationResult"},{"type":"null"}]}},"type":"object","title":"EvaluationResultResponse"},"EvaluationResultsCreateRequest":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EvaluationResultCreate"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"EvaluationResultsCreateRequest"},"EvaluationResultsEditRequest":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EvaluationResultEdit"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"EvaluationResultsEditRequest"},"EvaluationResultsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"results":{"items":{"$ref":"#/components/schemas/EvaluationResult"},"type":"array","title":"Results","default":[]}},"type":"object","title":"EvaluationResultsResponse"},"EvaluationRun":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}],"default":"pending"},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunData-Output"},{"type":"null"}]}},"type":"object","title":"EvaluationRun"},"EvaluationRunCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"version":{"type":"string","title":"Version","default":"2025.07.14"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunData-Input"},{"type":"null"}]}},"type":"object","title":"EvaluationRunCreate"},"EvaluationRunData-Input":{"properties":{"steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationRunDataStep"},"type":"array"},{"type":"null"}],"title":"Steps"},"repeats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repeats","default":1},"mappings":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationRunDataMapping"},"type":"array"},{"type":"null"}],"title":"Mappings"}},"type":"object","title":"EvaluationRunData"},"EvaluationRunData-Output":{"properties":{"steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationRunDataStep"},"type":"array"},{"type":"null"}],"title":"Steps"},"repeats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repeats","default":1},"mappings":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationRunDataMapping"},"type":"array"},{"type":"null"}],"title":"Mappings"}},"type":"object","title":"EvaluationRunData"},"EvaluationRunDataMapping":{"properties":{"column":{"$ref":"#/components/schemas/EvaluationRunDataMappingColumn"},"step":{"$ref":"#/components/schemas/EvaluationRunDataMappingStep"}},"type":"object","required":["column","step"],"title":"EvaluationRunDataMapping"},"EvaluationRunDataMappingColumn":{"properties":{"kind":{"type":"string","title":"Kind"},"name":{"type":"string","title":"Name"}},"type":"object","required":["kind","name"],"title":"EvaluationRunDataMappingColumn"},"EvaluationRunDataMappingStep":{"properties":{"key":{"type":"string","title":"Key"},"path":{"type":"string","title":"Path"}},"type":"object","required":["key","path"],"title":"EvaluationRunDataMappingStep"},"EvaluationRunDataStep":{"properties":{"key":{"type":"string","title":"Key"},"type":{"type":"string","enum":["input","invocation","annotation"],"title":"Type"},"origin":{"type":"string","enum":["custom","human","auto"],"title":"Origin"},"references":{"additionalProperties":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"object","title":"References"},"inputs":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationRunDataStepInput"},"type":"array"},{"type":"null"}],"title":"Inputs"}},"type":"object","required":["key","type","origin","references"],"title":"EvaluationRunDataStep"},"EvaluationRunDataStepInput":{"properties":{"key":{"type":"string","title":"Key"}},"type":"object","required":["key"],"title":"EvaluationRunDataStepInput"},"EvaluationRunEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunData-Input"},{"type":"null"}]}},"type":"object","title":"EvaluationRunEdit"},"EvaluationRunEditRequest":{"properties":{"run":{"$ref":"#/components/schemas/EvaluationRunEdit"}},"type":"object","required":["run"],"title":"EvaluationRunEditRequest"},"EvaluationRunFlags":{"properties":{"is_closed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Closed"},"is_live":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Live"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"EvaluationRunFlags"},"EvaluationRunIdResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"}},"type":"object","title":"EvaluationRunIdResponse"},"EvaluationRunIdsRequest":{"properties":{"run_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Run Ids"}},"type":"object","required":["run_ids"],"title":"EvaluationRunIdsRequest"},"EvaluationRunIdsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"run_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Run Ids","default":[]}},"type":"object","title":"EvaluationRunIdsResponse"},"EvaluationRunQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"statuses":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"},"references":{"anyOf":[{"items":{"additionalProperties":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"object"},"type":"array"},{"type":"null"}],"title":"References"},"ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"EvaluationRunQuery"},"EvaluationRunQueryRequest":{"properties":{"run":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunQuery"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluationRunQueryRequest"},"EvaluationRunResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"run":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRun"},{"type":"null"}]}},"type":"object","title":"EvaluationRunResponse"},"EvaluationRunsCreateRequest":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/EvaluationRunCreate"},"type":"array","title":"Runs"}},"type":"object","required":["runs"],"title":"EvaluationRunsCreateRequest"},"EvaluationRunsEditRequest":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/EvaluationRunEdit"},"type":"array","title":"Runs"}},"type":"object","required":["runs"],"title":"EvaluationRunsEditRequest"},"EvaluationRunsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"runs":{"items":{"$ref":"#/components/schemas/EvaluationRun"},"type":"array","title":"Runs","default":[]}},"type":"object","title":"EvaluationRunsResponse"},"EvaluationScenarioCreate":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"version":{"type":"string","title":"Version","default":"2025.07.14"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["run_id"],"title":"EvaluationScenarioCreate"},"EvaluationScenarioEdit":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]}},"type":"object","title":"EvaluationScenarioEdit"},"EvaluationScenarioEditRequest":{"properties":{"scenario":{"$ref":"#/components/schemas/EvaluationScenarioEdit"}},"type":"object","required":["scenario"],"title":"EvaluationScenarioEditRequest"},"EvaluationScenarioIdResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"scenario_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scenario Id"}},"type":"object","title":"EvaluationScenarioIdResponse"},"EvaluationScenarioIdsRequest":{"properties":{"scenario_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Scenario Ids"}},"type":"object","required":["scenario_ids"],"title":"EvaluationScenarioIdsRequest"},"EvaluationScenarioIdsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"scenario_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Scenario Ids","default":[]}},"type":"object","title":"EvaluationScenarioIdsResponse"},"EvaluationScenarioInput":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"value":{"title":"Value"}},"type":"object","required":["name","type","value"],"title":"EvaluationScenarioInput"},"EvaluationScenarioOutput":{"properties":{"result":{"$ref":"#/components/schemas/Result"},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost"},"latency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latency"}},"type":"object","required":["result"],"title":"EvaluationScenarioOutput"},"EvaluationScenarioQuery":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"statuses":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationStatus"},"type":"array"},{"type":"null"}],"title":"Statuses"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"intervals":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Intervals"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"timestamps":{"anyOf":[{"items":{"type":"string","format":"date-time"},"type":"array"},{"type":"null"}],"title":"Timestamps"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"run_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Run Ids"},"ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"EvaluationScenarioQuery"},"EvaluationScenarioQueryRequest":{"properties":{"scenario":{"anyOf":[{"$ref":"#/components/schemas/EvaluationScenarioQuery"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluationScenarioQueryRequest"},"EvaluationScenarioResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"scenario":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__evaluations__types__EvaluationScenario"},{"type":"null"}]}},"type":"object","title":"EvaluationScenarioResponse"},"EvaluationScenarioResult":{"properties":{"evaluator_config":{"type":"string","title":"Evaluator Config"},"result":{"$ref":"#/components/schemas/Result"}},"type":"object","required":["evaluator_config","result"],"title":"EvaluationScenarioResult"},"EvaluationScenarioScoreUpdate":{"properties":{"score":{"type":"number","title":"Score"}},"type":"object","required":["score"],"title":"EvaluationScenarioScoreUpdate"},"EvaluationScenariosCreateRequest":{"properties":{"scenarios":{"items":{"$ref":"#/components/schemas/EvaluationScenarioCreate"},"type":"array","title":"Scenarios"}},"type":"object","required":["scenarios"],"title":"EvaluationScenariosCreateRequest"},"EvaluationScenariosEditRequest":{"properties":{"scenarios":{"items":{"$ref":"#/components/schemas/EvaluationScenarioEdit"},"type":"array","title":"Scenarios"}},"type":"object","required":["scenarios"],"title":"EvaluationScenariosEditRequest"},"EvaluationScenariosResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"scenarios":{"items":{"$ref":"#/components/schemas/oss__src__core__evaluations__types__EvaluationScenario"},"type":"array","title":"Scenarios","default":[]}},"type":"object","title":"EvaluationScenariosResponse"},"EvaluationStatus":{"type":"string","enum":["pending","queued","running","success","failure","errors","cancelled"],"title":"EvaluationStatus"},"EvaluationStatusEnum":{"type":"string","enum":["EVALUATION_INITIALIZED","EVALUATION_STARTED","EVALUATION_FINISHED","EVALUATION_FINISHED_WITH_ERRORS","EVALUATION_FAILED","EVALUATION_AGGREGATION_FAILED"],"title":"EvaluationStatusEnum"},"EvaluationType":{"type":"string","enum":["human_a_b_testing","single_model_test"],"title":"EvaluationType"},"Evaluator":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"Evaluator"},"EvaluatorConfig":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"project_id":{"type":"string","title":"Project Id"},"evaluator_key":{"type":"string","title":"Evaluator Key"},"settings_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings Values"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","name","project_id","evaluator_key","created_at","updated_at"],"title":"EvaluatorConfig"},"EvaluatorCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"EvaluatorCreate"},"EvaluatorCreateRequest":{"properties":{"evaluator":{"$ref":"#/components/schemas/EvaluatorCreate"}},"type":"object","required":["evaluator"],"title":"EvaluatorCreateRequest"},"EvaluatorEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"EvaluatorEdit"},"EvaluatorEditRequest":{"properties":{"evaluator":{"$ref":"#/components/schemas/EvaluatorEdit"}},"type":"object","required":["evaluator"],"title":"EvaluatorEditRequest"},"EvaluatorFlags":{"properties":{"is_custom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom"},"is_evaluator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Evaluator"},"is_human":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Human"}},"type":"object","title":"EvaluatorFlags"},"EvaluatorFork":{"properties":{"evaluator_revision":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorRevisionFork"},{"type":"null"}]},"revision":{"anyOf":[{"$ref":"#/components/schemas/RevisionFork"},{"type":"null"}]},"evaluator_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Revision Id"},"workflow_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Revision Id"},"evaluator_variant":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorVariantFork"},{"type":"null"}]},"variant":{"anyOf":[{"$ref":"#/components/schemas/VariantFork"},{"type":"null"}]},"evaluator_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Variant Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"workflow_revision":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevisionFork"},{"type":"null"}]},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"workflow_variant":{"anyOf":[{"$ref":"#/components/schemas/WorkflowVariantFork"},{"type":"null"}]},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"}},"type":"object","title":"EvaluatorFork"},"EvaluatorForkRequest":{"properties":{"evaluator":{"$ref":"#/components/schemas/EvaluatorFork"}},"type":"object","required":["evaluator"],"title":"EvaluatorForkRequest"},"EvaluatorInputInterface":{"properties":{"inputs":{"additionalProperties":true,"type":"object","title":"Inputs"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"},"credentials":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Credentials"}},"type":"object","title":"EvaluatorInputInterface"},"EvaluatorMappingInputInterface":{"properties":{"inputs":{"additionalProperties":true,"type":"object","title":"Inputs"},"mapping":{"additionalProperties":true,"type":"object","title":"Mapping"}},"type":"object","required":["inputs","mapping"],"title":"EvaluatorMappingInputInterface"},"EvaluatorMappingOutputInterface":{"properties":{"outputs":{"additionalProperties":true,"type":"object","title":"Outputs"}},"type":"object","required":["outputs"],"title":"EvaluatorMappingOutputInterface"},"EvaluatorOutputInterface":{"properties":{"outputs":{"additionalProperties":true,"type":"object","title":"Outputs"}},"type":"object","required":["outputs"],"title":"EvaluatorOutputInterface"},"EvaluatorQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"EvaluatorQuery"},"EvaluatorQueryRequest":{"properties":{"evaluator":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorQuery"},{"type":"null"}]},"evaluator_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Evaluator Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluatorQueryRequest"},"EvaluatorResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluator":{"anyOf":[{"$ref":"#/components/schemas/Evaluator"},{"type":"null"}]}},"type":"object","title":"EvaluatorResponse"},"EvaluatorRevision":{"properties":{"evaluator_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Variant Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorRevisionData-Output"},{"type":"null"}]}},"type":"object","title":"EvaluatorRevision"},"EvaluatorRevisionCommit":{"properties":{"evaluator_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Variant Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorRevisionData-Input"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"EvaluatorRevisionCommit"},"EvaluatorRevisionCommitRequest":{"properties":{"evaluator_revision_commit":{"$ref":"#/components/schemas/EvaluatorRevisionCommit"}},"type":"object","required":["evaluator_revision_commit"],"title":"EvaluatorRevisionCommitRequest"},"EvaluatorRevisionCreate":{"properties":{"evaluator_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Variant Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"EvaluatorRevisionCreate"},"EvaluatorRevisionCreateRequest":{"properties":{"evaluator_revision":{"$ref":"#/components/schemas/EvaluatorRevisionCreate"}},"type":"object","required":["evaluator_revision"],"title":"EvaluatorRevisionCreateRequest"},"EvaluatorRevisionData-Input":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"EvaluatorRevisionData"},"EvaluatorRevisionData-Output":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"EvaluatorRevisionData"},"EvaluatorRevisionEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"EvaluatorRevisionEdit"},"EvaluatorRevisionEditRequest":{"properties":{"evaluator_revision":{"$ref":"#/components/schemas/EvaluatorRevisionEdit"}},"type":"object","required":["evaluator_revision"],"title":"EvaluatorRevisionEditRequest"},"EvaluatorRevisionFork":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorRevisionData-Input"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"EvaluatorRevisionFork"},"EvaluatorRevisionQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"authors":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Authors"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"dates":{"anyOf":[{"items":{"type":"string","format":"date-time"},"type":"array"},{"type":"null"}],"title":"Dates"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"EvaluatorRevisionQuery"},"EvaluatorRevisionQueryRequest":{"properties":{"evaluator_revision":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorRevisionQuery"},{"type":"null"}]},"evaluator_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Evaluator Refs"},"evaluator_variant_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Evaluator Variant Refs"},"evaluator_revision_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Evaluator Revision Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"EvaluatorRevisionQueryRequest"},"EvaluatorRevisionResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluator_revision":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorRevision"},{"type":"null"}]}},"type":"object","title":"EvaluatorRevisionResponse"},"EvaluatorRevisionRetrieveRequest":{"properties":{"evaluator_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"evaluator_variant_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"evaluator_revision_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]}},"type":"object","title":"EvaluatorRevisionRetrieveRequest"},"EvaluatorRevisionsLog":{"properties":{"evaluator_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Revision Id"},"workflow_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Revision Id"},"evaluator_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Variant Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"}},"type":"object","title":"EvaluatorRevisionsLog"},"EvaluatorRevisionsLogRequest":{"properties":{"evaluator":{"$ref":"#/components/schemas/EvaluatorRevisionsLog"}},"type":"object","required":["evaluator"],"title":"EvaluatorRevisionsLogRequest"},"EvaluatorRevisionsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluator_revisions":{"items":{"$ref":"#/components/schemas/EvaluatorRevision"},"type":"array","title":"Evaluator Revisions","default":[]}},"type":"object","title":"EvaluatorRevisionsResponse"},"EvaluatorVariant":{"properties":{"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"EvaluatorVariant"},"EvaluatorVariantCreate":{"properties":{"evaluator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluator Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"EvaluatorVariantCreate"},"EvaluatorVariantCreateRequest":{"properties":{"evaluator_variant":{"$ref":"#/components/schemas/EvaluatorVariantCreate"}},"type":"object","required":["evaluator_variant"],"title":"EvaluatorVariantCreateRequest"},"EvaluatorVariantEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"EvaluatorVariantEdit"},"EvaluatorVariantEditRequest":{"properties":{"evaluator_variant":{"$ref":"#/components/schemas/EvaluatorVariantEdit"}},"type":"object","required":["evaluator_variant"],"title":"EvaluatorVariantEditRequest"},"EvaluatorVariantFork":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"EvaluatorVariantFork"},"EvaluatorVariantResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluator_variant":{"anyOf":[{"$ref":"#/components/schemas/EvaluatorVariant"},{"type":"null"}]}},"type":"object","title":"EvaluatorVariantResponse"},"EvaluatorVariantsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluator_variants":{"items":{"$ref":"#/components/schemas/EvaluatorVariant"},"type":"array","title":"Evaluator Variants","default":[]}},"type":"object","title":"EvaluatorVariantsResponse"},"EvaluatorsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluators":{"items":{"$ref":"#/components/schemas/Evaluator"},"type":"array","title":"Evaluators","default":[]}},"type":"object","title":"EvaluatorsResponse"},"ExceptionDTO":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"type":{"type":"string","title":"Type"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"stacktrace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stacktrace"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["timestamp","type"],"title":"ExceptionDTO"},"ExistenceOperator":{"type":"string","enum":["exists","not_exists"],"title":"ExistenceOperator"},"Filtering-Input":{"properties":{"operator":{"$ref":"#/components/schemas/LogicalOperator","default":"and"},"conditions":{"items":{"anyOf":[{"$ref":"#/components/schemas/Condition"},{"$ref":"#/components/schemas/Filtering-Input"}]},"type":"array","title":"Conditions","default":[]}},"type":"object","title":"Filtering"},"Filtering-Output":{"properties":{"operator":{"$ref":"#/components/schemas/LogicalOperator","default":"and"},"conditions":{"items":{"anyOf":[{"$ref":"#/components/schemas/Condition"},{"$ref":"#/components/schemas/Filtering-Output"}]},"type":"array","title":"Conditions","default":[]}},"type":"object","title":"Filtering"},"Focus":{"type":"string","enum":["trace","span"],"title":"Focus"},"Format":{"type":"string","enum":["agenta","opentelemetry"],"title":"Format"},"Formatting":{"properties":{"focus":{"anyOf":[{"$ref":"#/components/schemas/Focus"},{"type":"null"}]},"format":{"anyOf":[{"$ref":"#/components/schemas/Format"},{"type":"null"}]}},"type":"object","title":"Formatting"},"FullJson-Input":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"items":{"$ref":"#/components/schemas/FullJson-Input"},"type":"array"},{"type":"null"}]},"FullJson-Output":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"items":{"$ref":"#/components/schemas/FullJson-Output"},"type":"array"},{"type":"null"}]},"GetConfigResponse":{"properties":{"config_name":{"type":"string","title":"Config Name"},"current_version":{"type":"integer","title":"Current Version"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"}},"type":"object","required":["config_name","current_version","parameters"],"title":"GetConfigResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Header":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"Header"},"HumanEvaluation":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"project_id":{"type":"string","title":"Project Id"},"evaluation_type":{"type":"string","title":"Evaluation Type"},"variant_ids":{"items":{"type":"string"},"type":"array","title":"Variant Ids"},"variant_names":{"items":{"type":"string"},"type":"array","title":"Variant Names"},"variants_revision_ids":{"items":{"type":"string"},"type":"array","title":"Variants Revision Ids"},"revisions":{"items":{"type":"string"},"type":"array","title":"Revisions"},"testset_id":{"type":"string","title":"Testset Id"},"testset_name":{"type":"string","title":"Testset Name"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","app_id","project_id","evaluation_type","variant_ids","variant_names","variants_revision_ids","revisions","testset_id","testset_name","status","created_at","updated_at"],"title":"HumanEvaluation"},"HumanEvaluationScenario":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"evaluation_id":{"type":"string","title":"Evaluation Id"},"inputs":{"items":{"$ref":"#/components/schemas/HumanEvaluationScenarioInput"},"type":"array","title":"Inputs"},"outputs":{"items":{"$ref":"#/components/schemas/HumanEvaluationScenarioOutput"},"type":"array","title":"Outputs"},"vote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote"},"score":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Score"},"correct_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correct Answer"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["evaluation_id","inputs","outputs"],"title":"HumanEvaluationScenario"},"HumanEvaluationScenarioInput":{"properties":{"input_name":{"type":"string","title":"Input Name"},"input_value":{"type":"string","title":"Input Value"}},"type":"object","required":["input_name","input_value"],"title":"HumanEvaluationScenarioInput"},"HumanEvaluationScenarioOutput":{"properties":{"variant_id":{"type":"string","title":"Variant Id"},"variant_output":{"type":"string","title":"Variant Output"}},"type":"object","required":["variant_id","variant_output"],"title":"HumanEvaluationScenarioOutput"},"HumanEvaluationScenarioUpdate":{"properties":{"vote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vote"},"score":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Score"},"correct_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correct Answer"},"outputs":{"anyOf":[{"items":{"$ref":"#/components/schemas/HumanEvaluationScenarioOutput"},"type":"array"},{"type":"null"}],"title":"Outputs"},"inputs":{"anyOf":[{"items":{"$ref":"#/components/schemas/HumanEvaluationScenarioInput"},"type":"array"},{"type":"null"}],"title":"Inputs"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"HumanEvaluationScenarioUpdate"},"HumanEvaluationUpdate":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatusEnum"},{"type":"null"}]}},"type":"object","title":"HumanEvaluationUpdate"},"InviteRequest":{"properties":{"email":{"type":"string","title":"Email"},"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"}},"type":"object","required":["email"],"title":"InviteRequest"},"InviteToken":{"properties":{"token":{"type":"string","title":"Token"},"email":{"type":"string","title":"Email"}},"type":"object","required":["token","email"],"title":"InviteToken"},"Invocation":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"span_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"origin":{"$ref":"#/components/schemas/SimpleTraceOrigin","default":"custom"},"kind":{"$ref":"#/components/schemas/SimpleTraceKind","default":"adhoc"},"channel":{"$ref":"#/components/schemas/SimpleTraceChannel","default":"api"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object","title":"Data"},"references":{"$ref":"#/components/schemas/SimpleTraceReferences"},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"items":{"$ref":"#/components/schemas/Link"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","required":["data","references","links"],"title":"Invocation"},"InvocationCreate":{"properties":{"origin":{"$ref":"#/components/schemas/SimpleTraceOrigin","default":"custom"},"kind":{"$ref":"#/components/schemas/SimpleTraceKind","default":"adhoc"},"channel":{"$ref":"#/components/schemas/SimpleTraceChannel","default":"api"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object","title":"Data"},"references":{"$ref":"#/components/schemas/SimpleTraceReferences"},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"items":{"$ref":"#/components/schemas/Link"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","required":["data","references","links"],"title":"InvocationCreate"},"InvocationCreateRequest":{"properties":{"invocation":{"$ref":"#/components/schemas/InvocationCreate"}},"type":"object","required":["invocation"],"title":"InvocationCreateRequest"},"InvocationEdit":{"properties":{"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object","title":"Data"}},"type":"object","required":["data"],"title":"InvocationEdit"},"InvocationEditRequest":{"properties":{"invocation":{"$ref":"#/components/schemas/InvocationEdit"}},"type":"object","required":["invocation"],"title":"InvocationEditRequest"},"InvocationLinkResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"invocation_link":{"anyOf":[{"$ref":"#/components/schemas/Link"},{"type":"null"}]}},"type":"object","title":"InvocationLinkResponse"},"InvocationQuery":{"properties":{"origin":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceOrigin"},{"type":"null"}]},"kind":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceKind"},{"type":"null"}]},"channel":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceChannel"},{"type":"null"}]},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"references":{"anyOf":[{"$ref":"#/components/schemas/SimpleTraceReferences"},{"type":"null"}]},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"items":{"$ref":"#/components/schemas/Link"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","title":"InvocationQuery"},"InvocationQueryRequest":{"properties":{"invocation":{"anyOf":[{"$ref":"#/components/schemas/InvocationQuery"},{"type":"null"}]},"invocation_links":{"anyOf":[{"items":{"$ref":"#/components/schemas/Link"},"type":"array"},{"type":"null"}],"title":"Invocation Links"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"InvocationQueryRequest"},"InvocationResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"invocation":{"anyOf":[{"$ref":"#/components/schemas/Invocation"},{"type":"null"}]}},"type":"object","title":"InvocationResponse"},"InvocationsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"invocations":{"items":{"$ref":"#/components/schemas/Invocation"},"type":"array","title":"Invocations","default":[]}},"type":"object","title":"InvocationsResponse"},"LLMRunRateLimit":{"properties":{"batch_size":{"type":"integer","title":"Batch Size"},"max_retries":{"type":"integer","title":"Max Retries"},"retry_delay":{"type":"integer","title":"Retry Delay"},"delay_between_batches":{"type":"integer","title":"Delay Between Batches"}},"type":"object","required":["batch_size","max_retries","retry_delay","delay_between_batches"],"title":"LLMRunRateLimit"},"LegacyAnalyticsResponse":{"properties":{"total_count":{"type":"integer","title":"Total Count"},"failure_rate":{"type":"number","title":"Failure Rate"},"total_cost":{"type":"number","title":"Total Cost"},"avg_cost":{"type":"number","title":"Avg Cost"},"avg_latency":{"type":"number","title":"Avg Latency"},"total_tokens":{"type":"integer","title":"Total Tokens"},"avg_tokens":{"type":"number","title":"Avg Tokens"},"data":{"items":{"$ref":"#/components/schemas/LegacyDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["total_count","failure_rate","total_cost","avg_cost","avg_latency","total_tokens","avg_tokens","data"],"title":"LegacyAnalyticsResponse"},"LegacyApplication":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplicationFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplicationData-Output"},{"type":"null"}]}},"type":"object","title":"LegacyApplication"},"LegacyApplicationCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplicationFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplicationData-Input"},{"type":"null"}]}},"type":"object","title":"LegacyApplicationCreate"},"LegacyApplicationCreateRequest":{"properties":{"application":{"$ref":"#/components/schemas/LegacyApplicationCreate"}},"type":"object","required":["application"],"title":"LegacyApplicationCreateRequest"},"LegacyApplicationData-Input":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"LegacyApplicationData"},"LegacyApplicationData-Output":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"LegacyApplicationData"},"LegacyApplicationEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplicationFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplicationData-Input"},{"type":"null"}]}},"type":"object","title":"LegacyApplicationEdit"},"LegacyApplicationEditRequest":{"properties":{"application":{"$ref":"#/components/schemas/LegacyApplicationEdit"}},"type":"object","required":["application"],"title":"LegacyApplicationEditRequest"},"LegacyApplicationFlags":{"properties":{"is_custom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom"},"is_evaluator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Evaluator"},"is_human":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Human"}},"type":"object","title":"LegacyApplicationFlags"},"LegacyApplicationResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"application":{"anyOf":[{"$ref":"#/components/schemas/LegacyApplication"},{"type":"null"}]}},"type":"object","title":"LegacyApplicationResponse"},"LegacyDataPoint":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"success_count":{"type":"integer","title":"Success Count"},"failure_count":{"type":"integer","title":"Failure Count"},"cost":{"type":"number","title":"Cost"},"latency":{"type":"number","title":"Latency"},"total_tokens":{"type":"integer","title":"Total Tokens"}},"type":"object","required":["timestamp","success_count","failure_count","cost","latency","total_tokens"],"title":"LegacyDataPoint"},"LegacyEvaluator":{"properties":{"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key"},"direct_use":{"type":"boolean","title":"Direct Use"},"settings_template":{"additionalProperties":true,"type":"object","title":"Settings Template"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"oss":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Oss","default":false},"requires_llm_api_keys":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requires Llm Api Keys","default":false},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["name","key","direct_use","settings_template","tags"],"title":"LegacyEvaluator"},"LegacyLifecycleDTO":{"properties":{"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"updated_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By Id"},"updated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By"}},"type":"object","title":"LegacyLifecycleDTO"},"LegacyScopeRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"LegacyScopeRequest"},"LegacyScopesResponse":{"properties":{"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"project_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Project Id"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"is_demo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Demo"},"user_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Role"},"credentials":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credentials"}},"type":"object","title":"LegacyScopesResponse"},"LegacySubscriptionRequest":{"properties":{"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},"type":"object","title":"LegacySubscriptionRequest"},"LegacyUserRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"LegacyUserRequest"},"LegacyUserResponse":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"LegacyUserResponse"},"Link":{"properties":{"span_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Id"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"}},"type":"object","title":"Link"},"LinkDTO":{"properties":{"type":{"$ref":"#/components/schemas/TreeType"},"id":{"type":"string","format":"uuid","title":"Id"},"tree_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tree Id"}},"type":"object","required":["type","id"],"title":"LinkDTO"},"ListAPIKeysResponse":{"properties":{"prefix":{"type":"string","title":"Prefix"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"expiration_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiration Date"}},"type":"object","required":["prefix","created_at"],"title":"ListAPIKeysResponse"},"ListOperator":{"type":"string","enum":["in","not_in"],"title":"ListOperator"},"ListOptions":{"properties":{"all":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"All","default":false}},"type":"object","title":"ListOptions"},"LogicalOperator":{"type":"string","enum":["and","or","not","nand","nor"],"title":"LogicalOperator"},"MetricSpec":{"properties":{"type":{"$ref":"#/components/schemas/MetricType","default":"none"},"path":{"type":"string","title":"Path","default":"*"},"bins":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bins"},"vmin":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vmin"},"vmax":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vmax"},"edge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Edge"}},"type":"object","title":"MetricSpec"},"MetricType":{"type":"string","enum":["numeric/continuous","numeric/discrete","binary","categorical/single","categorical/multiple","string","json","none","*"],"title":"MetricType"},"MetricsBucket":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"interval":{"type":"integer","title":"Interval"},"metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Metrics"}},"type":"object","required":["timestamp","interval"],"title":"MetricsBucket"},"MetricsDTO":{"properties":{"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","default":0},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","default":0.0},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost","default":0.0},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens","default":0}},"type":"object","title":"MetricsDTO"},"NewEvaluation":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"revisions_ids":{"items":{"type":"string"},"type":"array","title":"Revisions Ids"},"evaluators_configs":{"items":{"type":"string"},"type":"array","title":"Evaluators Configs"},"testset_id":{"type":"string","title":"Testset Id"},"rate_limit":{"$ref":"#/components/schemas/LLMRunRateLimit"},"correct_answer_column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correct Answer Column"}},"type":"object","required":["revisions_ids","evaluators_configs","testset_id","rate_limit"],"title":"NewEvaluation"},"NewEvaluatorConfig":{"properties":{"name":{"type":"string","title":"Name"},"evaluator_key":{"type":"string","title":"Evaluator Key"},"settings_values":{"additionalProperties":true,"type":"object","title":"Settings Values"}},"type":"object","required":["name","evaluator_key","settings_values"],"title":"NewEvaluatorConfig"},"NewHumanEvaluation":{"properties":{"app_id":{"type":"string","title":"App Id"},"variant_ids":{"items":{"type":"string"},"type":"array","title":"Variant Ids"},"evaluation_type":{"$ref":"#/components/schemas/EvaluationType"},"inputs":{"items":{"type":"string"},"type":"array","title":"Inputs"},"testset_id":{"type":"string","title":"Testset Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["app_id","variant_ids","evaluation_type","inputs","testset_id","status"],"title":"NewHumanEvaluation"},"NewTestset":{"properties":{"name":{"type":"string","title":"Name"},"csvdata":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Csvdata"}},"type":"object","required":["name","csvdata"],"title":"NewTestset"},"NoListJson-Input":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}]},"NoListJson-Output":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}]},"NodeDTO":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"anyOf":[{"$ref":"#/components/schemas/NodeType"},{"type":"null"}]}},"type":"object","required":["id","name"],"title":"NodeDTO"},"NodeType":{"type":"string","enum":["agent","workflow","chain","task","tool","embedding","query","completion","chat","rerank"],"title":"NodeType"},"NumericOperator":{"type":"string","enum":["eq","neq","gt","lt","gte","lte","btwn"],"title":"NumericOperator"},"OTelContextDTO":{"properties":{"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"}},"type":"object","required":["trace_id","span_id"],"title":"OTelContextDTO"},"OTelEvent-Input":{"properties":{"name":{"type":"string","title":"Name"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"}],"title":"Timestamp"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["name","timestamp"],"title":"OTelEvent"},"OTelEvent-Output":{"properties":{"name":{"type":"string","title":"Name"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"}],"title":"Timestamp"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["name","timestamp"],"title":"OTelEvent"},"OTelEventDTO":{"properties":{"name":{"type":"string","title":"Name"},"timestamp":{"type":"string","title":"Timestamp"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["name","timestamp"],"title":"OTelEventDTO"},"OTelExtraDTO-Input":{"properties":{"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEventDTO"},"type":"array"},{"type":"null"}],"title":"Events"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","title":"OTelExtraDTO"},"OTelExtraDTO-Output":{"properties":{"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEventDTO"},"type":"array"},{"type":"null"}],"title":"Events"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","title":"OTelExtraDTO"},"OTelFlatSpan-Input":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"trace_type":{"anyOf":[{"$ref":"#/components/schemas/TraceType"},{"type":"null"}]},"span_type":{"anyOf":[{"$ref":"#/components/schemas/SpanType"},{"type":"null"}]},"span_kind":{"anyOf":[{"$ref":"#/components/schemas/OTelSpanKind"},{"type":"null"}]},"span_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Name"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"End Time"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/OTelStatusCode-Input"},{"type":"null"}]},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Attributes"},"references":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelReference-Input"},"type":"array"},{"type":"null"}],"title":"References"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLink-Input"},"type":"array"},{"type":"null"}],"title":"Links"},"hashes":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelHash-Input"},"type":"array"},{"type":"null"}],"title":"Hashes"},"exception":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Exception"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEvent-Input"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","required":["trace_id","span_id"],"title":"OTelFlatSpan"},"OTelFlatSpan-Output":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"trace_type":{"anyOf":[{"$ref":"#/components/schemas/TraceType"},{"type":"null"}]},"span_type":{"anyOf":[{"$ref":"#/components/schemas/SpanType"},{"type":"null"}]},"span_kind":{"anyOf":[{"$ref":"#/components/schemas/OTelSpanKind"},{"type":"null"}]},"span_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Name"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"End Time"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__tracing__dtos__OTelStatusCode"},{"type":"null"}]},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Attributes"},"references":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelReference-Output"},"type":"array"},{"type":"null"}],"title":"References"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLink-Output"},"type":"array"},{"type":"null"}],"title":"Links"},"hashes":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelHash-Output"},"type":"array"},{"type":"null"}],"title":"Hashes"},"exception":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Exception"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEvent-Output"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","required":["trace_id","span_id"],"title":"OTelFlatSpan"},"OTelHash-Input":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","title":"OTelHash"},"OTelHash-Output":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","title":"OTelHash"},"OTelLink-Input":{"properties":{"span_id":{"type":"string","title":"Span Id"},"trace_id":{"type":"string","title":"Trace Id"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["span_id","trace_id"],"title":"OTelLink"},"OTelLink-Output":{"properties":{"span_id":{"type":"string","title":"Span Id"},"trace_id":{"type":"string","title":"Trace Id"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["span_id","trace_id"],"title":"OTelLink"},"OTelLinkDTO":{"properties":{"context":{"$ref":"#/components/schemas/OTelContextDTO"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["context"],"title":"OTelLinkDTO"},"OTelLinksResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLink-Output"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","title":"OTelLinksResponse"},"OTelReference-Input":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","title":"OTelReference"},"OTelReference-Output":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","title":"OTelReference"},"OTelSpan-Input":{"properties":{"spans":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/OTelSpan-Input"},{"items":{"$ref":"#/components/schemas/OTelSpan-Input"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Spans"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"trace_type":{"anyOf":[{"$ref":"#/components/schemas/TraceType"},{"type":"null"}]},"span_type":{"anyOf":[{"$ref":"#/components/schemas/SpanType"},{"type":"null"}]},"span_kind":{"anyOf":[{"$ref":"#/components/schemas/OTelSpanKind"},{"type":"null"}]},"span_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Name"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"End Time"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/OTelStatusCode-Input"},{"type":"null"}]},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Attributes"},"references":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelReference-Input"},"type":"array"},{"type":"null"}],"title":"References"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLink-Input"},"type":"array"},{"type":"null"}],"title":"Links"},"hashes":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelHash-Input"},"type":"array"},{"type":"null"}],"title":"Hashes"},"exception":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Exception"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEvent-Input"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","required":["trace_id","span_id"],"title":"OTelSpan"},"OTelSpan-Output":{"properties":{"spans":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/OTelSpan-Output"},{"items":{"$ref":"#/components/schemas/OTelSpan-Output"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Spans"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"trace_type":{"anyOf":[{"$ref":"#/components/schemas/TraceType"},{"type":"null"}]},"span_type":{"anyOf":[{"$ref":"#/components/schemas/SpanType"},{"type":"null"}]},"span_kind":{"anyOf":[{"$ref":"#/components/schemas/OTelSpanKind"},{"type":"null"}]},"span_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Span Name"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"integer"},{"type":"null"}],"title":"End Time"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__tracing__dtos__OTelStatusCode"},{"type":"null"}]},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"attributes":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Attributes"},"references":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelReference-Output"},"type":"array"},{"type":"null"}],"title":"References"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLink-Output"},"type":"array"},{"type":"null"}],"title":"Links"},"hashes":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelHash-Output"},"type":"array"},{"type":"null"}],"title":"Hashes"},"exception":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Exception"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEvent-Output"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","required":["trace_id","span_id"],"title":"OTelSpan"},"OTelSpanDTO":{"properties":{"context":{"$ref":"#/components/schemas/OTelContextDTO"},"name":{"type":"string","title":"Name"},"kind":{"$ref":"#/components/schemas/OTelSpanKind","default":"SPAN_KIND_UNSPECIFIED"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"status_code":{"$ref":"#/components/schemas/oss__src__core__observability__dtos__OTelStatusCode","default":"STATUS_CODE_UNSET"},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelEventDTO"},"type":"array"},{"type":"null"}],"title":"Events"},"parent":{"anyOf":[{"$ref":"#/components/schemas/OTelContextDTO"},{"type":"null"}]},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelLinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"}},"type":"object","required":["context","name","start_time","end_time"],"title":"OTelSpanDTO"},"OTelSpanKind":{"type":"string","enum":["SPAN_KIND_UNSPECIFIED","SPAN_KIND_INTERNAL","SPAN_KIND_SERVER","SPAN_KIND_CLIENT","SPAN_KIND_PRODUCER","SPAN_KIND_CONSUMER"],"title":"OTelSpanKind"},"OTelSpansTree-Input":{"properties":{"spans":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/OTelSpan-Input"},{"items":{"$ref":"#/components/schemas/OTelSpan-Input"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Spans"}},"type":"object","title":"OTelSpansTree"},"OTelSpansTree-Output":{"properties":{"spans":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/OTelSpan-Output"},{"items":{"$ref":"#/components/schemas/OTelSpan-Output"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Spans"}},"type":"object","title":"OTelSpansTree"},"OTelStatusCode-Input":{"type":"string","enum":["STATUS_CODE_UNSET","STATUS_CODE_OK","STATUS_CODE_ERROR"],"title":"OTelStatusCode"},"OTelTracingRequest":{"properties":{"spans":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelFlatSpan-Input"},"type":"array"},{"type":"null"}],"title":"Spans"},"traces":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/OTelSpansTree-Input"},"type":"object"},{"type":"null"}],"title":"Traces"}},"type":"object","title":"OTelTracingRequest"},"Organization":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"owner":{"type":"string","title":"Owner"},"description":{"type":"string","title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"workspaces":{"items":{"type":"string"},"type":"array","title":"Workspaces"}},"type":"object","required":["id","name","owner","description"],"title":"Organization"},"OrganizationDetails":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"owner":{"type":"string","title":"Owner"},"description":{"type":"string","title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"workspaces":{"items":{"type":"string"},"type":"array","title":"Workspaces"},"default_workspace":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Default Workspace"}},"type":"object","required":["id","name","owner","description"],"title":"OrganizationDetails"},"OrganizationMembershipRequest":{"properties":{"role":{"type":"string","enum":["owner","viewer","editor","evaluator","workspace_admin","deployment_manager"],"title":"Role"},"is_demo":{"type":"boolean","title":"Is Demo"},"user_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"organization_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"}},"type":"object","required":["role","is_demo","user_ref","organization_ref"],"title":"OrganizationMembershipRequest"},"OrganizationOutput":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"OrganizationOutput"},"OrganizationRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"is_paying":{"type":"boolean","title":"Is Paying"}},"type":"object","required":["name","description","is_paying"],"title":"OrganizationRequest"},"OrganizationUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"OrganizationUpdate"},"ParentDTO":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"}},"type":"object","required":["id"],"title":"ParentDTO"},"Permission":{"type":"string","enum":["read_system","view_applications","edit_application","create_app_variant","delete_app_variant","modify_variant_configurations","delete_application_variant","run_service","create_secret","view_secret","update_secret","delete_secret","view_app_environment_deployment","edit_app_environment_deployment","create_app_environment_deployment","view_testset","edit_testset","create_testset","delete_testset","view_evaluation","run_evaluations","edit_evaluation","create_evaluation","delete_evaluation","deploy_application","view_workspace","edit_workspace","create_workspace","delete_workspace","modify_user_roles","add_new_user_to_workspace","edit_organization","delete_organization","add_new_user_to_organization","reset_password","view_billing","edit_billing","view_workflows","edit_workflows","run_workflows","view_evaluators","edit_evaluators","view_queries","edit_queries","view_testsets","edit_testsets","view_annotations","edit_annotations","view_invocations","edit_invocations","view_evaluation_runs","edit_evaluation_runs","view_evaluation_scenarios","edit_evaluation_scenarios","view_evaluation_results","edit_evaluation_results","view_evaluation_metrics","edit_evaluation_metrics","view_evaluation_queues","edit_evaluation_queues"],"title":"Permission"},"Plan":{"type":"string","enum":["cloud_v0_hobby","cloud_v0_pro","cloud_v0_business","cloud_v0_humanity_labs","cloud_v0_x_labs","cloud_v0_agenta_ai"],"title":"Plan"},"ProjectMembershipRequest":{"properties":{"role":{"type":"string","enum":["owner","viewer","editor","evaluator","workspace_admin","deployment_manager"],"title":"Role"},"is_demo":{"type":"boolean","title":"Is Demo"},"user_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"project_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"}},"type":"object","required":["role","is_demo","user_ref","project_ref"],"title":"ProjectMembershipRequest"},"ProjectRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"is_default":{"type":"boolean","title":"Is Default"},"workspace_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"organization_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"}},"type":"object","required":["name","description","is_default","workspace_ref","organization_ref"],"title":"ProjectRequest"},"ProjectScope":{"properties":{"credentials":{"type":"string","title":"Credentials"},"role":{"type":"string","enum":["owner","viewer","editor","evaluator","workspace_admin","deployment_manager"],"title":"Role"},"tier":{"type":"string","title":"Tier"},"user":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"project":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"workspace":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"organization":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"}},"type":"object","required":["credentials","role","tier","user","project","workspace","organization"],"title":"ProjectScope"},"ProjectsResponse":{"properties":{"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"project_id":{"type":"string","format":"uuid","title":"Project Id"},"project_name":{"type":"string","title":"Project Name"},"user_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Role"},"is_demo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Demo"}},"type":"object","required":["project_id","project_name"],"title":"ProjectsResponse"},"QueriesResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"queries":{"items":{"$ref":"#/components/schemas/Query"},"type":"array","title":"Queries","default":[]}},"type":"object","title":"QueriesResponse"},"Query":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"Query"},"QueryCreate":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"QueryCreate"},"QueryCreateRequest":{"properties":{"query":{"$ref":"#/components/schemas/QueryCreate"}},"type":"object","required":["query"],"title":"QueryCreateRequest"},"QueryEdit":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"QueryEdit"},"QueryEditRequest":{"properties":{"query":{"$ref":"#/components/schemas/QueryEdit"}},"type":"object","required":["query"],"title":"QueryEditRequest"},"QueryResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"query":{"anyOf":[{"$ref":"#/components/schemas/Query"},{"type":"null"}]}},"type":"object","title":"QueryResponse"},"QueryRevision":{"properties":{"query_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"query_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/QueryRevisionData-Output"},{"type":"null"}]}},"type":"object","title":"QueryRevision"},"QueryRevisionCommit":{"properties":{"query_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"query_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/QueryRevisionData-Input"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"QueryRevisionCommit"},"QueryRevisionCommitRequest":{"properties":{"query_revision_commit":{"$ref":"#/components/schemas/QueryRevisionCommit"}},"type":"object","required":["query_revision_commit"],"title":"QueryRevisionCommitRequest"},"QueryRevisionCreate":{"properties":{"query_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"query_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"QueryRevisionCreate"},"QueryRevisionCreateRequest":{"properties":{"query_revision":{"$ref":"#/components/schemas/QueryRevisionCreate"}},"type":"object","required":["query_revision"],"title":"QueryRevisionCreateRequest"},"QueryRevisionData-Input":{"properties":{"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]},"filtering":{"anyOf":[{"$ref":"#/components/schemas/Filtering-Input"},{"type":"null"}]}},"type":"object","title":"QueryRevisionData"},"QueryRevisionData-Output":{"properties":{"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]},"filtering":{"anyOf":[{"$ref":"#/components/schemas/Filtering-Output"},{"type":"null"}]}},"type":"object","title":"QueryRevisionData"},"QueryRevisionEdit":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"QueryRevisionEdit"},"QueryRevisionEditRequest":{"properties":{"query_revision":{"$ref":"#/components/schemas/QueryRevisionEdit"}},"type":"object","required":["query_revision"],"title":"QueryRevisionEditRequest"},"QueryRevisionQuery":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"authors":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Authors"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"dates":{"anyOf":[{"items":{"type":"string","format":"date-time"},"type":"array"},{"type":"null"}],"title":"Dates"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"QueryRevisionQuery"},"QueryRevisionQueryRequest":{"properties":{"query_revision":{"anyOf":[{"$ref":"#/components/schemas/QueryRevisionQuery"},{"type":"null"}]},"query_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Query Refs"},"query_variant_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Query Variant Refs"},"query_revision_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Query Revision Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"QueryRevisionQueryRequest"},"QueryRevisionResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"query_revision":{"anyOf":[{"$ref":"#/components/schemas/QueryRevision"},{"type":"null"}]}},"type":"object","title":"QueryRevisionResponse"},"QueryRevisionRetrieveRequest":{"properties":{"query_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"query_variant_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"query_revision_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]}},"type":"object","title":"QueryRevisionRetrieveRequest"},"QueryRevisionsLog":{"properties":{"query_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Revision Id"},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"query_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"query_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Query Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"}},"type":"object","title":"QueryRevisionsLog"},"QueryRevisionsLogRequest":{"properties":{"query_revisions":{"$ref":"#/components/schemas/QueryRevisionsLog"}},"type":"object","required":["query_revisions"],"title":"QueryRevisionsLogRequest"},"QueryRevisionsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"query_revisions":{"items":{"$ref":"#/components/schemas/QueryRevision"},"type":"array","title":"Query Revisions","default":[]}},"type":"object","title":"QueryRevisionsResponse"},"ReadAppOutput":{"properties":{"app_id":{"type":"string","title":"App Id"},"app_name":{"type":"string","title":"App Name"}},"type":"object","required":["app_id","app_name"],"title":"ReadAppOutput"},"ReferenceDTO":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","required":["id"],"title":"ReferenceDTO"},"ReferenceRequest":{"properties":{"application_ref":{"$ref":"#/components/schemas/ReferenceDTO"}},"type":"object","required":["application_ref"],"title":"ReferenceRequest"},"ReferenceRequestModel":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"ReferenceRequestModel"},"ResendInviteRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ResendInviteRequest"},"Result":{"properties":{"type":{"type":"string","title":"Type"},"value":{"anyOf":[{},{"type":"null"}],"title":"Value"},"error":{"anyOf":[{"$ref":"#/components/schemas/Error"},{"type":"null"}]}},"type":"object","required":["type"],"title":"Result"},"RevisionFork":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"RevisionFork"},"RootDTO":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"}},"type":"object","required":["id"],"title":"RootDTO"},"ScopesResponseModel":{"properties":{"projects":{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/ProjectScope"},"type":"object"},"type":"object","title":"Projects","default":{}}},"type":"object","title":"ScopesResponseModel"},"SecretDTO":{"properties":{"kind":{"$ref":"#/components/schemas/SecretKind"},"data":{"anyOf":[{"$ref":"#/components/schemas/StandardProviderDTO"},{"$ref":"#/components/schemas/CustomProviderDTO"}],"title":"Data"}},"type":"object","required":["kind","data"],"title":"SecretDTO"},"SecretKind":{"type":"string","enum":["provider_key","custom_provider"],"title":"SecretKind"},"SecretResponseDTO":{"properties":{"kind":{"$ref":"#/components/schemas/SecretKind"},"data":{"anyOf":[{"$ref":"#/components/schemas/StandardProviderDTO"},{"$ref":"#/components/schemas/CustomProviderDTO"}],"title":"Data"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"header":{"$ref":"#/components/schemas/Header"},"lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]}},"type":"object","required":["kind","data","header"],"title":"SecretResponseDTO"},"SimpleEvaluation":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"data":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluationData"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluation"},"SimpleEvaluationCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"version":{"type":"string","title":"Version","default":"2025.07.14"},"data":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluationData"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluationCreate"},"SimpleEvaluationCreateRequest":{"properties":{"evaluation":{"$ref":"#/components/schemas/SimpleEvaluationCreate"}},"type":"object","required":["evaluation"],"title":"SimpleEvaluationCreateRequest"},"SimpleEvaluationData":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}]},"query_steps":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"additionalProperties":{"type":"string","enum":["custom","human","auto"]},"propertyNames":{"format":"uuid"},"type":"object"},{"type":"null"}],"title":"Query Steps"},"testset_steps":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"additionalProperties":{"type":"string","enum":["custom","human","auto"]},"propertyNames":{"format":"uuid"},"type":"object"},{"type":"null"}],"title":"Testset Steps"},"application_steps":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"additionalProperties":{"type":"string","enum":["custom","human","auto"]},"propertyNames":{"format":"uuid"},"type":"object"},{"type":"null"}],"title":"Application Steps"},"evaluator_steps":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"additionalProperties":{"type":"string","enum":["custom","human","auto"]},"propertyNames":{"format":"uuid"},"type":"object"},{"type":"null"}],"title":"Evaluator Steps"},"repeats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repeats"}},"type":"object","title":"SimpleEvaluationData"},"SimpleEvaluationEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"data":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluationData"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluationEdit"},"SimpleEvaluationEditRequest":{"properties":{"evaluation":{"$ref":"#/components/schemas/SimpleEvaluationEdit"}},"type":"object","required":["evaluation"],"title":"SimpleEvaluationEditRequest"},"SimpleEvaluationIdResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Evaluation Id"}},"type":"object","title":"SimpleEvaluationIdResponse"},"SimpleEvaluationOutput":{"properties":{"id":{"type":"string","title":"Id"},"variant_ids":{"items":{"type":"string"},"type":"array","title":"Variant Ids"},"app_id":{"type":"string","title":"App Id"},"status":{"type":"string","title":"Status"},"evaluation_type":{"$ref":"#/components/schemas/EvaluationType"}},"type":"object","required":["id","variant_ids","app_id","status","evaluation_type"],"title":"SimpleEvaluationOutput"},"SimpleEvaluationQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/EvaluationRunFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","title":"SimpleEvaluationQuery"},"SimpleEvaluationQueryRequest":{"properties":{"evaluation":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluationQuery"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluationQueryRequest"},"SimpleEvaluationResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluation":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluation"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluationResponse"},"SimpleEvaluationsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluations":{"items":{"$ref":"#/components/schemas/SimpleEvaluation"},"type":"array","title":"Evaluations","default":[]}},"type":"object","title":"SimpleEvaluationsResponse"},"SimpleEvaluator":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorData-Output"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluator"},"SimpleEvaluatorCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorData-Input"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluatorCreate"},"SimpleEvaluatorCreateRequest":{"properties":{"evaluator":{"$ref":"#/components/schemas/SimpleEvaluatorCreate"}},"type":"object","required":["evaluator"],"title":"SimpleEvaluatorCreateRequest"},"SimpleEvaluatorData-Input":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"SimpleEvaluatorData"},"SimpleEvaluatorData-Output":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"SimpleEvaluatorData"},"SimpleEvaluatorEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorData-Input"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluatorEdit"},"SimpleEvaluatorEditRequest":{"properties":{"evaluator":{"$ref":"#/components/schemas/SimpleEvaluatorEdit"}},"type":"object","required":["evaluator"],"title":"SimpleEvaluatorEditRequest"},"SimpleEvaluatorFlags":{"properties":{"is_custom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom"},"is_evaluator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Evaluator"},"is_human":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Human"}},"type":"object","title":"SimpleEvaluatorFlags"},"SimpleEvaluatorQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"SimpleEvaluatorQuery"},"SimpleEvaluatorQueryRequest":{"properties":{"evaluator":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluatorQuery"},{"type":"null"}]},"evaluator_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Evaluator Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived","default":false},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluatorQueryRequest"},"SimpleEvaluatorResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluator":{"anyOf":[{"$ref":"#/components/schemas/SimpleEvaluator"},{"type":"null"}]}},"type":"object","title":"SimpleEvaluatorResponse"},"SimpleEvaluatorsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"evaluators":{"items":{"$ref":"#/components/schemas/SimpleEvaluator"},"type":"array","title":"Evaluators","default":[]}},"type":"object","title":"SimpleEvaluatorsResponse"},"SimpleQueriesResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"queries":{"items":{"$ref":"#/components/schemas/SimpleQuery"},"type":"array","title":"Queries","default":[]}},"type":"object","title":"SimpleQueriesResponse"},"SimpleQuery":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"anyOf":[{"$ref":"#/components/schemas/QueryRevisionData-Output"},{"type":"null"}]}},"type":"object","title":"SimpleQuery"},"SimpleQueryCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"anyOf":[{"$ref":"#/components/schemas/QueryRevisionData-Input"},{"type":"null"}]}},"type":"object","title":"SimpleQueryCreate"},"SimpleQueryCreateRequest":{"properties":{"query":{"$ref":"#/components/schemas/SimpleQueryCreate"}},"type":"object","required":["query"],"title":"SimpleQueryCreateRequest"},"SimpleQueryEdit":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"anyOf":[{"$ref":"#/components/schemas/QueryRevisionData-Input"},{"type":"null"}]}},"type":"object","title":"SimpleQueryEdit"},"SimpleQueryEditRequest":{"properties":{"query":{"$ref":"#/components/schemas/SimpleQueryEdit"}},"type":"object","required":["query"],"title":"SimpleQueryEditRequest"},"SimpleQueryQuery":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","title":"SimpleQueryQuery"},"SimpleQueryQueryRequest":{"properties":{"query":{"anyOf":[{"$ref":"#/components/schemas/SimpleQueryQuery"},{"type":"null"}]},"query_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Query Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived","default":false},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"SimpleQueryQueryRequest"},"SimpleQueryResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"query":{"anyOf":[{"$ref":"#/components/schemas/SimpleQuery"},{"type":"null"}]}},"type":"object","title":"SimpleQueryResponse"},"SimpleTestset":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevisionData-Output"},{"type":"null"}]}},"type":"object","title":"SimpleTestset"},"SimpleTestsetCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevisionData-Input"},{"type":"null"}]}},"type":"object","title":"SimpleTestsetCreate"},"SimpleTestsetCreateRequest":{"properties":{"testset":{"$ref":"#/components/schemas/SimpleTestsetCreate"}},"type":"object","required":["testset"],"title":"SimpleTestsetCreateRequest"},"SimpleTestsetEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevisionData-Input"},{"type":"null"}]}},"type":"object","title":"SimpleTestsetEdit"},"SimpleTestsetEditRequest":{"properties":{"testset":{"$ref":"#/components/schemas/SimpleTestsetEdit"}},"type":"object","required":["testset"],"title":"SimpleTestsetEditRequest"},"SimpleTestsetQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"SimpleTestsetQuery"},"SimpleTestsetQueryRequest":{"properties":{"testset":{"anyOf":[{"$ref":"#/components/schemas/SimpleTestsetQuery"},{"type":"null"}]},"testset_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"SimpleTestsetQueryRequest"},"SimpleTestsetResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testset":{"anyOf":[{"$ref":"#/components/schemas/SimpleTestset"},{"type":"null"}]}},"type":"object","title":"SimpleTestsetResponse"},"SimpleTestsetsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testsets":{"items":{"$ref":"#/components/schemas/SimpleTestset"},"type":"array","title":"Testsets","default":[]}},"type":"object","title":"SimpleTestsetsResponse"},"SimpleTraceChannel":{"type":"string","enum":["otlp","web","sdk","api"],"title":"SimpleTraceChannel"},"SimpleTraceKind":{"type":"string","enum":["adhoc","eval","play"],"title":"SimpleTraceKind"},"SimpleTraceOrigin":{"type":"string","enum":["custom","human","auto"],"title":"SimpleTraceOrigin"},"SimpleTraceReferences":{"properties":{"query":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"query_variant":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"query_revision":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"testset":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"testset_variant":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"testset_revision":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"application":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"application_variant":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"application_revision":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"evaluator":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"evaluator_variant":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"evaluator_revision":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"testcase":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]}},"type":"object","title":"SimpleTraceReferences"},"SpanDTO-Input":{"properties":{"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"root":{"$ref":"#/components/schemas/RootDTO"},"tree":{"$ref":"#/components/schemas/TreeDTO"},"node":{"$ref":"#/components/schemas/NodeDTO"},"parent":{"anyOf":[{"$ref":"#/components/schemas/ParentDTO"},{"type":"null"}]},"time":{"$ref":"#/components/schemas/TimeDTO"},"status":{"$ref":"#/components/schemas/StatusDTO"},"exception":{"anyOf":[{"$ref":"#/components/schemas/ExceptionDTO"},{"type":"null"}]},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metrics"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"},"refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Refs"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"},"otel":{"anyOf":[{"$ref":"#/components/schemas/OTelExtraDTO-Input"},{"type":"null"}]},"nodes":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/SpanDTO-Input"},{"items":{"$ref":"#/components/schemas/SpanDTO-Input"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Nodes"}},"type":"object","required":["trace_id","span_id","root","tree","node","time","status"],"title":"SpanDTO"},"SpanDTO-Output":{"properties":{"trace_id":{"type":"string","title":"Trace Id"},"span_id":{"type":"string","title":"Span Id"},"lifecycle":{"anyOf":[{"$ref":"#/components/schemas/LegacyLifecycleDTO"},{"type":"null"}]},"root":{"$ref":"#/components/schemas/RootDTO"},"tree":{"$ref":"#/components/schemas/TreeDTO"},"node":{"$ref":"#/components/schemas/NodeDTO"},"parent":{"anyOf":[{"$ref":"#/components/schemas/ParentDTO"},{"type":"null"}]},"time":{"$ref":"#/components/schemas/TimeDTO"},"status":{"$ref":"#/components/schemas/StatusDTO"},"exception":{"anyOf":[{"$ref":"#/components/schemas/ExceptionDTO"},{"type":"null"}]},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metrics"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"},"refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Refs"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkDTO"},"type":"array"},{"type":"null"}],"title":"Links"},"otel":{"anyOf":[{"$ref":"#/components/schemas/OTelExtraDTO-Output"},{"type":"null"}]},"nodes":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/SpanDTO-Output"},{"items":{"$ref":"#/components/schemas/SpanDTO-Output"},"type":"array"}]},"type":"object"},{"type":"null"}],"title":"Nodes"}},"type":"object","required":["trace_id","span_id","root","tree","node","time","status"],"title":"SpanDTO"},"SpanType":{"type":"string","enum":["agent","chain","workflow","task","tool","embedding","query","llm","completion","chat","rerank","unknown"],"title":"SpanType"},"StandardProviderDTO":{"properties":{"kind":{"$ref":"#/components/schemas/StandardProviderKind"},"provider":{"$ref":"#/components/schemas/StandardProviderSettingsDTO"}},"type":"object","required":["kind","provider"],"title":"StandardProviderDTO"},"StandardProviderKind":{"type":"string","enum":["openai","cohere","anyscale","deepinfra","alephalpha","groq","mistralai","anthropic","perplexityai","together_ai","openrouter","gemini"],"title":"StandardProviderKind"},"StandardProviderSettingsDTO":{"properties":{"key":{"type":"string","title":"Key"}},"type":"object","required":["key"],"title":"StandardProviderSettingsDTO"},"Status":{"properties":{"code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Code","default":500},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","default":"An unexpected error occurred. Please try again later."},"stacktrace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stacktrace"}},"type":"object","title":"Status"},"StatusCode":{"type":"string","enum":["UNSET","OK","ERROR"],"title":"StatusCode"},"StatusDTO":{"properties":{"code":{"$ref":"#/components/schemas/StatusCode"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["code"],"title":"StatusDTO"},"StringOperator":{"type":"string","enum":["startswith","endswith","contains","matches","like"],"title":"StringOperator"},"TestSetOutputResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["_id","name","created_at","updated_at"],"title":"TestSetOutputResponse"},"TestSetSimpleResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","name","created_at"],"title":"TestSetSimpleResponse"},"Testcase-Input":{"properties":{"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"set_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Set Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","title":"Testcase"},"Testcase-Output":{"properties":{"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"set_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Set Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"data":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","title":"Testcase"},"TestcaseResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testcase":{"anyOf":[{"$ref":"#/components/schemas/Testcase-Output"},{"type":"null"}]}},"type":"object","title":"TestcaseResponse"},"TestcasesQueryRequest":{"properties":{"testcase_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Testcase Ids"},"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"TestcasesQueryRequest"},"TestcasesResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testcases":{"items":{"$ref":"#/components/schemas/Testcase-Output"},"type":"array","title":"Testcases","default":[]}},"type":"object","title":"TestcasesResponse"},"Testset":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"Testset"},"TestsetCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"TestsetCreate"},"TestsetCreateRequest":{"properties":{"testset":{"$ref":"#/components/schemas/TestsetCreate"}},"type":"object","required":["testset"],"title":"TestsetCreateRequest"},"TestsetEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"TestsetEdit"},"TestsetEditRequest":{"properties":{"testset":{"$ref":"#/components/schemas/TestsetEdit"}},"type":"object","required":["testset"],"title":"TestsetEditRequest"},"TestsetFlags":{"properties":{"has_testcases":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Testcases"},"has_traces":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Traces"}},"type":"object","title":"TestsetFlags"},"TestsetLog":{"properties":{"testset_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Revision Id"},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"testset_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"}},"type":"object","title":"TestsetLog"},"TestsetLogRequest":{"properties":{"testset":{"$ref":"#/components/schemas/TestsetLog"}},"type":"object","required":["testset"],"title":"TestsetLogRequest"},"TestsetQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"TestsetQuery"},"TestsetQueryRequest":{"properties":{"testset":{"anyOf":[{"$ref":"#/components/schemas/TestsetQuery"},{"type":"null"}]},"testset_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"TestsetQueryRequest"},"TestsetResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testset":{"anyOf":[{"$ref":"#/components/schemas/Testset"},{"type":"null"}]}},"type":"object","title":"TestsetResponse"},"TestsetRevision":{"properties":{"testset_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevisionData-Output"},{"type":"null"}]}},"type":"object","title":"TestsetRevision"},"TestsetRevisionCommit":{"properties":{"testset_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevisionData-Input"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"TestsetRevisionCommit"},"TestsetRevisionCommitRequest":{"properties":{"testset_revision_commit":{"$ref":"#/components/schemas/TestsetRevisionCommit"}},"type":"object","required":["testset_revision_commit"],"title":"TestsetRevisionCommitRequest"},"TestsetRevisionCreate":{"properties":{"testset_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"TestsetRevisionCreate"},"TestsetRevisionCreateRequest":{"properties":{"testset_revision":{"$ref":"#/components/schemas/TestsetRevisionCreate"}},"type":"object","required":["testset_revision"],"title":"TestsetRevisionCreateRequest"},"TestsetRevisionData-Input":{"properties":{"testcase_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Testcase Ids"},"testcases":{"anyOf":[{"items":{"$ref":"#/components/schemas/Testcase-Input"},"type":"array"},{"type":"null"}],"title":"Testcases"}},"type":"object","title":"TestsetRevisionData"},"TestsetRevisionData-Output":{"properties":{"testcase_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Testcase Ids"},"testcases":{"anyOf":[{"items":{"$ref":"#/components/schemas/Testcase-Output"},"type":"array"},{"type":"null"}],"title":"Testcases"}},"type":"object","title":"TestsetRevisionData"},"TestsetRevisionEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"TestsetRevisionEdit"},"TestsetRevisionEditRequest":{"properties":{"testset_revision":{"$ref":"#/components/schemas/TestsetRevisionEdit"}},"type":"object","required":["testset_revision"],"title":"TestsetRevisionEditRequest"},"TestsetRevisionQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"authors":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Authors"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"dates":{"anyOf":[{"items":{"type":"string","format":"date-time"},"type":"array"},{"type":"null"}],"title":"Dates"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"TestsetRevisionQuery"},"TestsetRevisionQueryRequest":{"properties":{"testset_revision":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevisionQuery"},{"type":"null"}]},"testset_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Refs"},"testset_variant_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Variant Refs"},"testset_revision_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Revision Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"TestsetRevisionQueryRequest"},"TestsetRevisionResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testset_revision":{"anyOf":[{"$ref":"#/components/schemas/TestsetRevision"},{"type":"null"}]}},"type":"object","title":"TestsetRevisionResponse"},"TestsetRevisionRetrieveRequest":{"properties":{"testset_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"testset_variant_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"testset_revision_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]}},"type":"object","title":"TestsetRevisionRetrieveRequest"},"TestsetRevisionsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testset_revisions":{"items":{"$ref":"#/components/schemas/TestsetRevision"},"type":"array","title":"Testset Revisions","default":[]}},"type":"object","title":"TestsetRevisionsResponse"},"TestsetVariant":{"properties":{"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"TestsetVariant"},"TestsetVariantCreate":{"properties":{"testset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Testset Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"TestsetVariantCreate"},"TestsetVariantCreateRequest":{"properties":{"testset_variant":{"$ref":"#/components/schemas/TestsetVariantCreate"}},"type":"object","required":["testset_variant"],"title":"TestsetVariantCreateRequest"},"TestsetVariantEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"TestsetVariantEdit"},"TestsetVariantEditRequest":{"properties":{"testset_variant":{"$ref":"#/components/schemas/TestsetVariantEdit"}},"type":"object","required":["testset_variant"],"title":"TestsetVariantEditRequest"},"TestsetVariantQuery":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/TestsetFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"TestsetVariantQuery"},"TestsetVariantQueryRequest":{"properties":{"testset_variant":{"anyOf":[{"$ref":"#/components/schemas/TestsetVariantQuery"},{"type":"null"}]},"testset_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Refs"},"testset_variant_refs":{"anyOf":[{"items":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"array"},{"type":"null"}],"title":"Testset Variant Refs"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Archived"},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]}},"type":"object","title":"TestsetVariantQueryRequest"},"TestsetVariantResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testset_variant":{"anyOf":[{"$ref":"#/components/schemas/TestsetVariant"},{"type":"null"}]}},"type":"object","title":"TestsetVariantResponse"},"TestsetVariantsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testset_variants":{"items":{"$ref":"#/components/schemas/TestsetVariant"},"type":"array","title":"Testset Variants","default":[]}},"type":"object","title":"TestsetVariantsResponse"},"TestsetsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"testsets":{"items":{"$ref":"#/components/schemas/Testset"},"type":"array","title":"Testsets","default":[]}},"type":"object","title":"TestsetsResponse"},"TextOptions":{"properties":{"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive","default":false},"exact_match":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exact Match","default":false}},"type":"object","title":"TextOptions"},"TimeDTO":{"properties":{"start":{"type":"string","format":"date-time","title":"Start"},"end":{"type":"string","format":"date-time","title":"End"}},"type":"object","required":["start","end"],"title":"TimeDTO"},"TraceType":{"type":"string","enum":["invocation","annotation","unknown"],"title":"TraceType"},"TracingQuery":{"properties":{"formatting":{"anyOf":[{"$ref":"#/components/schemas/Formatting"},{"type":"null"}]},"windowing":{"anyOf":[{"$ref":"#/components/schemas/Windowing"},{"type":"null"}]},"filtering":{"anyOf":[{"$ref":"#/components/schemas/Filtering-Output"},{"type":"null"}]}},"type":"object","title":"TracingQuery"},"TreeDTO":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"anyOf":[{"$ref":"#/components/schemas/TreeType"},{"type":"null"}]}},"type":"object","required":["id"],"title":"TreeDTO"},"TreeType":{"type":"string","enum":["invocation","annotation","unknown"],"title":"TreeType"},"UpdateApp":{"properties":{"app_name":{"type":"string","title":"App Name"}},"type":"object","required":["app_name"],"title":"UpdateApp"},"UpdateAppOutput":{"properties":{"app_id":{"type":"string","title":"App Id"},"app_name":{"type":"string","title":"App Name"}},"type":"object","required":["app_id","app_name"],"title":"UpdateAppOutput"},"UpdateEvaluatorConfig":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"evaluator_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluator Key"},"settings_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings Values"}},"type":"object","required":["settings_values"],"title":"UpdateEvaluatorConfig"},"UpdateSecretDTO":{"properties":{"header":{"anyOf":[{"$ref":"#/components/schemas/Header"},{"type":"null"}]},"secret":{"anyOf":[{"$ref":"#/components/schemas/SecretDTO"},{"type":"null"}]}},"type":"object","title":"UpdateSecretDTO"},"UpdateVariantParameterPayload":{"properties":{"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"}},"type":"object","required":["parameters"],"title":"UpdateVariantParameterPayload"},"UpdateVariantURLPayload":{"properties":{"url":{"type":"string","title":"Url"},"variant_id":{"type":"string","title":"Variant Id"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"}},"type":"object","required":["url","variant_id"],"title":"UpdateVariantURLPayload"},"UpdateWorkspace":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"UpdateWorkspace"},"UserRequest":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"}},"type":"object","required":["name","email"],"title":"UserRequest"},"UserRole":{"properties":{"email":{"type":"string","title":"Email"},"organization_id":{"type":"string","title":"Organization Id"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},"type":"object","required":["email","organization_id"],"title":"UserRole"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantFork":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"VariantFork"},"Windowing":{"properties":{"newest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Newest"},"oldest":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest"},"next":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"order":{"anyOf":[{"type":"string","enum":["ascending","descending"]},{"type":"null"}],"title":"Order"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"}},"type":"object","title":"Windowing"},"Workflow":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"Workflow"},"WorkflowCreate":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"WorkflowCreate"},"WorkflowCreateRequest":{"properties":{"workflow":{"$ref":"#/components/schemas/WorkflowCreate"}},"type":"object","required":["workflow"],"title":"WorkflowCreateRequest"},"WorkflowEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"WorkflowEdit"},"WorkflowEditRequest":{"properties":{"workflow":{"$ref":"#/components/schemas/WorkflowEdit"}},"type":"object","required":["workflow"],"title":"WorkflowEditRequest"},"WorkflowFlags":{"properties":{"is_custom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom"},"is_evaluator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Evaluator"},"is_human":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Human"}},"type":"object","title":"WorkflowFlags"},"WorkflowFork":{"properties":{"workflow_revision":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevisionFork"},{"type":"null"}]},"revision":{"anyOf":[{"$ref":"#/components/schemas/RevisionFork"},{"type":"null"}]},"workflow_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Revision Id"},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"workflow_variant":{"anyOf":[{"$ref":"#/components/schemas/WorkflowVariantFork"},{"type":"null"}]},"variant":{"anyOf":[{"$ref":"#/components/schemas/VariantFork"},{"type":"null"}]},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"}},"type":"object","title":"WorkflowFork"},"WorkflowForkRequest":{"properties":{"workflow":{"$ref":"#/components/schemas/WorkflowFork"}},"type":"object","required":["workflow"],"title":"WorkflowForkRequest"},"WorkflowResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"workflow":{"anyOf":[{"$ref":"#/components/schemas/Workflow"},{"type":"null"}]}},"type":"object","title":"WorkflowResponse"},"WorkflowRevision":{"properties":{"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"author":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author"},"date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevisionData-Output"},{"type":"null"}]}},"type":"object","title":"WorkflowRevision"},"WorkflowRevisionCommit":{"properties":{"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevisionData-Input"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"WorkflowRevisionCommit"},"WorkflowRevisionCommitRequest":{"properties":{"workflow_revision":{"$ref":"#/components/schemas/WorkflowRevisionCommit"}},"type":"object","required":["workflow_revision"],"title":"WorkflowRevisionCommitRequest"},"WorkflowRevisionCreate":{"properties":{"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"WorkflowRevisionCreate"},"WorkflowRevisionCreateRequest":{"properties":{"workflow_revision":{"$ref":"#/components/schemas/WorkflowRevisionCreate"}},"type":"object","required":["workflow_revision"],"title":"WorkflowRevisionCreateRequest"},"WorkflowRevisionData-Input":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"WorkflowRevisionData"},"WorkflowRevisionData-Output":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Parameters"},"service":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Service"},"configuration":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Configuration"}},"type":"object","title":"WorkflowRevisionData"},"WorkflowRevisionEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"WorkflowRevisionEdit"},"WorkflowRevisionEditRequest":{"properties":{"workflow_revision":{"$ref":"#/components/schemas/WorkflowRevisionEdit"}},"type":"object","required":["workflow_revision"],"title":"WorkflowRevisionEditRequest"},"WorkflowRevisionFork":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"data":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevisionData-Input"},{"type":"null"}]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"WorkflowRevisionFork"},"WorkflowRevisionResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"workflow_revision":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRevision"},{"type":"null"}]}},"type":"object","title":"WorkflowRevisionResponse"},"WorkflowRevisionRetrieveRequest":{"properties":{"workflow_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"workflow_variant_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]},"workflow_revision_ref":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"null"}]}},"type":"object","title":"WorkflowRevisionRetrieveRequest"},"WorkflowRevisionsLog":{"properties":{"workflow_revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Revision Id"},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"workflow_variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Variant Id"},"variant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Variant Id"},"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"}},"type":"object","title":"WorkflowRevisionsLog"},"WorkflowRevisionsLogRequest":{"properties":{"workflow":{"$ref":"#/components/schemas/WorkflowRevisionsLog"}},"type":"object","required":["workflow"],"title":"WorkflowRevisionsLogRequest"},"WorkflowRevisionsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"workflow_revisions":{"items":{"$ref":"#/components/schemas/WorkflowRevision"},"type":"array","title":"Workflow Revisions","default":[]}},"type":"object","title":"WorkflowRevisionsResponse"},"WorkflowServiceData-Input":{"properties":{"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Parameters"},"inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Inputs"},"outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"string"},{"type":"null"}],"title":"Outputs"},"trace_parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Trace Parameters"},"trace_inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Trace Inputs"},"trace_outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"string"},{"type":"null"}],"title":"Trace Outputs"},"trace":{"anyOf":[{"$ref":"#/components/schemas/OTelSpansTree-Input"},{"type":"null"}]},"tree":{"anyOf":[{"$ref":"#/components/schemas/AgentaVersionedTreeDTO-Input"},{"type":"null"}]}},"type":"object","title":"WorkflowServiceData"},"WorkflowServiceData-Output":{"properties":{"parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Parameters"},"inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Inputs"},"outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"string"},{"type":"null"}],"title":"Outputs"},"trace_parameters":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Trace Parameters"},"trace_inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Trace Inputs"},"trace_outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"string"},{"type":"null"}],"title":"Trace Outputs"},"trace":{"anyOf":[{"$ref":"#/components/schemas/OTelSpansTree-Output"},{"type":"null"}]},"tree":{"anyOf":[{"$ref":"#/components/schemas/AgentaVersionedTreeDTO-Output"},{"type":"null"}]}},"type":"object","title":"WorkflowServiceData"},"WorkflowServiceInterface-Input":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"}},"type":"object","title":"WorkflowServiceInterface"},"WorkflowServiceInterface-Output":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uri"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"schemas":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Schemas"},"mappings":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Mappings"}},"type":"object","title":"WorkflowServiceInterface"},"WorkflowServiceRequest":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"data":{"anyOf":[{"$ref":"#/components/schemas/WorkflowServiceData-Input"},{"type":"null"}]},"references":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/oss__src__core__shared__dtos__Reference"},"type":"object"},{"type":"null"}],"title":"References"},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"type":"null"}],"title":"Links"},"credentials":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credentials"},"secrets":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secrets"}},"type":"object","title":"WorkflowServiceRequest"},"WorkflowServiceResponse":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"data":{"anyOf":[{"$ref":"#/components/schemas/WorkflowServiceData-Output"},{"type":"null"}]},"links":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Link"},"type":"object"},{"type":"null"}],"title":"Links"},"status":{"$ref":"#/components/schemas/Status","default":{"code":500,"message":"An unexpected error occurred. Please try again later."}}},"type":"object","title":"WorkflowServiceResponse"},"WorkflowVariant":{"properties":{"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"WorkflowVariant"},"WorkflowVariantCreate":{"properties":{"workflow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workflow Id"},"artifact_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Artifact Id"},"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"WorkflowVariantCreate"},"WorkflowVariantCreateRequest":{"properties":{"workflow_variant":{"$ref":"#/components/schemas/WorkflowVariantCreate"}},"type":"object","required":["workflow_variant"],"title":"WorkflowVariantCreateRequest"},"WorkflowVariantEdit":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"WorkflowVariantEdit"},"WorkflowVariantEditRequest":{"properties":{"workflow_variant":{"$ref":"#/components/schemas/WorkflowVariantEdit"}},"type":"object","required":["workflow_variant"],"title":"WorkflowVariantEditRequest"},"WorkflowVariantFork":{"properties":{"flags":{"anyOf":[{"$ref":"#/components/schemas/WorkflowFlags"},{"type":"null"}]},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Input"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Input"},"type":"object"},{"type":"null"}],"title":"Tags"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"WorkflowVariantFork"},"WorkflowVariantResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"workflow_variant":{"anyOf":[{"$ref":"#/components/schemas/WorkflowVariant"},{"type":"null"}]}},"type":"object","title":"WorkflowVariantResponse"},"WorkflowVariantsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"workflow_variants":{"items":{"$ref":"#/components/schemas/WorkflowVariant"},"type":"array","title":"Workflow Variants","default":[]}},"type":"object","title":"WorkflowVariantsResponse"},"WorkflowsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"workflows":{"items":{"$ref":"#/components/schemas/Workflow"},"type":"array","title":"Workflows","default":[]}},"type":"object","title":"WorkflowsResponse"},"Workspace":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},"type":"object","required":["name","type"],"title":"Workspace"},"WorkspaceMemberResponse":{"properties":{"user":{"additionalProperties":true,"type":"object","title":"User"},"roles":{"items":{"$ref":"#/components/schemas/WorkspacePermission"},"type":"array","title":"Roles"}},"type":"object","required":["user","roles"],"title":"WorkspaceMemberResponse"},"WorkspaceMembershipRequest":{"properties":{"role":{"type":"string","enum":["owner","viewer","editor","evaluator","workspace_admin","deployment_manager"],"title":"Role"},"is_demo":{"type":"boolean","title":"Is Demo"},"user_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"},"workspace_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"}},"type":"object","required":["role","is_demo","user_ref","workspace_ref"],"title":"WorkspaceMembershipRequest"},"WorkspacePermission":{"properties":{"role_name":{"$ref":"#/components/schemas/WorkspaceRole"},"role_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Description"},"permissions":{"anyOf":[{"items":{"$ref":"#/components/schemas/Permission"},"type":"array"},{"type":"null"}],"title":"Permissions"}},"type":"object","required":["role_name"],"title":"WorkspacePermission"},"WorkspaceRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"is_default":{"type":"boolean","title":"Is Default"},"organization_ref":{"$ref":"#/components/schemas/ee__src__services__admin_manager__Reference"}},"type":"object","required":["name","description","is_default","organization_ref"],"title":"WorkspaceRequest"},"WorkspaceResponse":{"properties":{"created_at":{"type":"string","title":"Created At","default":"2025-11-02 12:26:46.318197+00:00"},"updated_at":{"type":"string","title":"Updated At","default":"2025-11-02 12:26:46.318231+00:00"},"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"organization":{"type":"string","title":"Organization"},"members":{"anyOf":[{"items":{"$ref":"#/components/schemas/WorkspaceMemberResponse"},"type":"array"},{"type":"null"}],"title":"Members"}},"type":"object","required":["id","name","type","organization"],"title":"WorkspaceResponse"},"WorkspaceRole":{"type":"string","enum":["owner","viewer","editor","evaluator","workspace_admin","deployment_manager"],"title":"WorkspaceRole"},"ee__src__services__admin_manager__Reference":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"Reference"},"oss__src__apis__fastapi__observability__models__OTelTracingResponse":{"properties":{"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"spans":{"items":{"$ref":"#/components/schemas/OTelSpanDTO"},"type":"array","title":"Spans"}},"type":"object","required":["spans"],"title":"OTelTracingDataResponse"},"oss__src__apis__fastapi__observability__models__OldAnalyticsResponse":{"properties":{"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"buckets":{"items":{"$ref":"#/components/schemas/BucketDTO"},"type":"array","title":"Buckets"}},"type":"object","required":["buckets"],"title":"OldAnalyticsResponse"},"oss__src__apis__fastapi__tracing__models__OTelTracingResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"spans":{"anyOf":[{"items":{"$ref":"#/components/schemas/OTelFlatSpan-Output"},"type":"array"},{"type":"null"}],"title":"Spans"},"traces":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/OTelSpansTree-Output"},"type":"object"},{"type":"null"}],"title":"Traces"}},"type":"object","title":"OTelTracingResponse"},"oss__src__apis__fastapi__tracing__models__OldAnalyticsResponse":{"properties":{"count":{"type":"integer","title":"Count","default":0},"buckets":{"items":{"$ref":"#/components/schemas/Bucket"},"type":"array","title":"Buckets","default":[]}},"type":"object","title":"OldAnalyticsResponse"},"oss__src__core__evaluations__types__EvaluationScenario":{"properties":{"flags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Flags"},"meta":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/FullJson-Output"},"type":"object"},{"type":"null"}],"title":"Meta"},"tags":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/NoListJson-Output"},"type":"object"},{"type":"null"}],"title":"Tags"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"updated_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Id"},"deleted_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deleted By Id"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"anyOf":[{"$ref":"#/components/schemas/EvaluationStatus"},{"type":"null"}],"default":"pending"},"interval":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"run_id":{"type":"string","format":"uuid","title":"Run Id"}},"type":"object","required":["run_id"],"title":"EvaluationScenario"},"oss__src__core__observability__dtos__OTelStatusCode":{"type":"string","enum":["STATUS_CODE_OK","STATUS_CODE_ERROR","STATUS_CODE_UNSET"],"title":"OTelStatusCode"},"oss__src__core__shared__dtos__Reference":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"}},"type":"object","title":"Reference"},"oss__src__core__tracing__dtos__OTelStatusCode":{"type":"string","enum":["STATUS_CODE_UNSET","STATUS_CODE_OK","STATUS_CODE_ERROR"],"title":"OTelStatusCode"},"oss__src__models__api__evaluation_model__EvaluationScenario":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"evaluation_id":{"type":"string","title":"Evaluation Id"},"inputs":{"items":{"$ref":"#/components/schemas/EvaluationScenarioInput"},"type":"array","title":"Inputs"},"outputs":{"items":{"$ref":"#/components/schemas/EvaluationScenarioOutput"},"type":"array","title":"Outputs"},"correct_answers":{"anyOf":[{"items":{"$ref":"#/components/schemas/CorrectAnswer"},"type":"array"},{"type":"null"}],"title":"Correct Answers"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"results":{"items":{"$ref":"#/components/schemas/EvaluationScenarioResult"},"type":"array","title":"Results"}},"type":"object","required":["evaluation_id","inputs","outputs","results"],"title":"LegacyEvaluationScenario"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","name":"Authorization","in":"header"}}},"tags":[{"name":"Variants"},{"name":"Evaluations"},{"name":"Evaluators"},{"name":"Apps"},{"name":"Human-Evaluations"},{"name":"Testsets"},{"name":"Containers"},{"name":"Environments"},{"name":"Observability"},{"name":"Organizations"},{"name":"Bases"},{"name":"Configs"}],"security":[{"APIKeyHeader":[]}],"servers":[{"url":"https://cloud.agenta.ai/api"}]} +{ + "openapi": "3.1.0", + "info": { + "title": "Agenta Backend", + "version": "0.1.0", + "description": "Agenta Backend API", + "contact": { + "name": "Agenta", + "url": "https://agenta.ai", + "email": "team@agenta.ai" + } + }, + "servers": [ + { + "url": "https://cloud.agenta.ai/api", + "description": "Agenta Cloud" + } + ], + "paths": { + "/admin/accounts": { + "post": { + "tags": ["Admin"], + "summary": "Create Accounts", + "operationId": "create_accounts", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntitiesRequestModel" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ScopesResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/account": { + "post": { + "tags": ["Admin"], + "summary": "Create Account", + "operationId": "create_account", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/AccountRequest" + }, + { + "type": "null" + } + ], + "title": "Account" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/organizations/own": { + "get": { + "summary": "Get User Organization", + "operationId": "get_own_org", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationOutput" + } + } + } + } + } + } + }, + "/organizations/{org_id}": { + "get": { + "tags": ["Organization"], + "summary": "Fetch Organization Details", + "description": "Return the details of the organization.", + "operationId": "fetch_organization_details", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationDetails" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "summary": "Update Organization", + "operationId": "update_organization", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/organizations/{org_id}/workspaces": { + "post": { + "summary": "Create Workspace", + "operationId": "create_workspace", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkspace" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/organizations/{org_id}/workspaces/{workspace_id}": { + "put": { + "summary": "Update Workspace", + "operationId": "update_workspace", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + }, + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkspace" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkspaceResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/workspaces/permissions": { + "get": { + "summary": "Get All Workspace Permissions", + "description": "Get all workspace permissions.\n\nReturns a list of all available workspace permissions.\n\nReturns:\n List[Permission]: A list of Permission objects representing the available workspace permissions.\n\nRaises:\n HTTPException: If there is an error retrieving the workspace permissions.", + "operationId": "get_all_workspace_permissions", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Permission" + }, + "type": "array", + "title": "Response Get All Workspace Permissions" + } + } + } + } + } + } + }, + "/workspaces/{workspace_id}/roles": { + "post": { + "summary": "Assign Role To User", + "description": "Assigns a role to a user in a workspace.\n\nArgs:\n payload (UserRole): The payload containing the organization id, user email, and role to assign.\n workspace_id (str): The ID of the workspace.\n request (Request): The FastAPI request object.\n\nReturns:\n bool: True if the role was successfully assigned, False otherwise.\n\nRaises:\n HTTPException: If the user does not have permission to perform this action.\n HTTPException: If there is an error assigning the role to the user.", + "operationId": "assign_role_to_user", + "parameters": [ + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserRole" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "summary": "Unassign Role From User", + "description": "Delete a role assignment from a user in a workspace.\n\nArgs:\n workspace_id (str): The ID of the workspace.\n email (str): The email of the user to remove the role from.\n org_id (str): The ID of the organization.\n role (str): The role to remove from the user.\n request (Request): The FastAPI request object.\n\nReturns:\n bool: True if the role assignment was successfully deleted.\n\nRaises:\n HTTPException: If there is an error in the request or the user does not have permission to perform the action.\n HTTPException: If there is an error in updating the user's roles.", + "operationId": "unassign_role_from_user", + "parameters": [ + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + }, + { + "name": "email", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Email" + } + }, + { + "name": "org_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + }, + { + "name": "role", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Role" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations/by_resource": { + "get": { + "tags": ["Evaluations"], + "summary": "Fetch Evaluation Ids", + "description": "Fetches evaluation ids for a given resource type and id.\n\nArguments:\n app_id (str): The ID of the app for which to fetch evaluations.\n resource_type (str): The type of resource for which to fetch evaluations.\n resource_ids List[ObjectId]: The IDs of resource for which to fetch evaluations.\n\nRaises:\n HTTPException: If the resource_type is invalid or access is denied.\n\nReturns:\n List[str]: A list of evaluation ids.", + "operationId": "fetch_evaluation_ids_evaluations_by_resource_get", + "parameters": [ + { + "name": "resource_type", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Resource Type" + } + }, + { + "name": "resource_ids", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Resource Ids" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Response Fetch Evaluation Ids Evaluations By Resource Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations": { + "post": { + "tags": ["Evaluations"], + "summary": "Create Evaluation", + "description": "Creates a new comparison table document\nRaises:\n HTTPException: _description_\nReturns:\n _description_", + "operationId": "create_evaluation", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewEvaluation" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Evaluation" + }, + "title": "Response Create Evaluation" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Evaluations"], + "summary": "Fetch List Evaluations", + "description": "Fetches a list of evaluations, optionally filtered by an app ID.\n\nArgs:\n app_id (Optional[str]): An optional app ID to filter the evaluations.\n\nReturns:\n List[Evaluation]: A list of evaluations.", + "operationId": "fetch_list_evaluations_evaluations_get", + "parameters": [ + { + "name": "app_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Evaluation" + }, + "title": "Response Fetch List Evaluations Evaluations Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Evaluations"], + "summary": "Delete Evaluations", + "description": "Delete specific comparison tables based on their unique IDs.\n\nArgs:\ndelete_evaluations (List[str]): The unique identifiers of the comparison tables to delete.\n\nReturns:\nA list of the deleted comparison tables' IDs.", + "operationId": "delete_evaluations", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteEvaluation" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Response Delete Evaluations" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations/{evaluation_id}/status": { + "get": { + "tags": ["Evaluations"], + "summary": "Fetch Evaluation Status", + "description": "Fetches the status of the evaluation.\n\nArgs:\n evaluation_id (str): the evaluation id\n request (Request): the request object\n\nReturns:\n (str): the evaluation status", + "operationId": "fetch_evaluation_status", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations/{evaluation_id}/results": { + "get": { + "tags": ["Evaluations"], + "summary": "Fetch Evaluation Results", + "description": "Fetches the results of the evaluation\n\nArgs:\n evaluation_id (str): the evaluation id\n request (Request): the request object\n\nReturns:\n _type_: _description_", + "operationId": "fetch_evaluation_results", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations/{evaluation_id}/evaluation_scenarios": { + "get": { + "tags": ["Evaluations"], + "summary": "Fetch Evaluation Scenarios", + "description": "Fetches evaluation scenarios for a given evaluation ID.\n\nArguments:\n evaluation_id (str): The ID of the evaluation for which to fetch scenarios.\n\nRaises:\n HTTPException: If the evaluation is not found or access is denied.\n\nReturns:\n List[EvaluationScenario]: A list of evaluation scenarios.", + "operationId": "fetch_evaluation_scenarios", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EvaluationScenario" + }, + "title": "Response Fetch Evaluation Scenarios" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations/{evaluation_id}": { + "get": { + "tags": ["Evaluations"], + "summary": "Fetch Evaluation", + "description": "Fetches a single evaluation based on its ID.\n\nArgs:\n evaluation_id (str): The ID of the evaluation to fetch.\n\nReturns:\n Evaluation: The fetched evaluation.", + "operationId": "fetch_evaluation", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Evaluation" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluations/evaluation_scenarios/comparison-results": { + "get": { + "tags": ["Evaluations"], + "summary": "Fetch Evaluation Scenarios Comparison Results", + "description": "Fetches evaluation scenarios for a given evaluation ID.\n\nArguments:\n evaluation_id (str): The ID of the evaluation for which to fetch scenarios.\n\nRaises:\n HTTPException: If the evaluation is not found or access is denied.\n\nReturns:\n List[EvaluationScenario]: A list of evaluation scenarios.", + "operationId": "fetch_evaluation_scenarios_comparison_results", + "parameters": [ + { + "name": "evaluations_ids", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Evaluations Ids" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Fetch Evaluation Scenarios Evaluations Evaluation Scenarios Comparison Results Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/human-evaluations": { + "post": { + "tags": ["Human-Evaluations"], + "summary": "Create Human Evaluation", + "description": "Creates a new comparison table document\nRaises:\n HTTPException: _description_\nReturns:\n _description_", + "operationId": "create_human_evaluation", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewHumanEvaluation" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimpleEvaluationOutput" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Human-Evaluations"], + "summary": "Fetch List Human Evaluations", + "description": "Fetches a list of evaluations, optionally filtered by an app ID.\n\nArgs:\n app_id (Optional[str]): An optional app ID to filter the evaluations.\n\nReturns:\n List[HumanEvaluation]: A list of evaluations.", + "operationId": "fetch_list_human_evaluations_human_evaluations_get", + "parameters": [ + { + "name": "app_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HumanEvaluation" + }, + "title": "Response Fetch List Human Evaluations Human Evaluations Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Human-Evaluations"], + "summary": "Delete Evaluations", + "description": "Delete specific comparison tables based on their unique IDs.\n\nArgs:\n payload (List[str]): The unique identifiers of the comparison tables to delete.\n\nReturns:\nA list of the deleted comparison tables' IDs.", + "operationId": "delete_evaluations_human_evaluations_delete", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteEvaluation" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Response Delete Evaluations Human Evaluations Delete" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/human-evaluations/{evaluation_id}": { + "get": { + "tags": ["Human-Evaluations"], + "summary": "Fetch Human Evaluation", + "description": "Fetches a single evaluation based on its ID.\n\nArgs:\n evaluation_id (str): The ID of the evaluation to fetch.\n\nReturns:\n HumanEvaluation: The fetched evaluation.", + "operationId": "fetch_human_evaluation_human_evaluations__evaluation_id__get", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HumanEvaluation" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Human-Evaluations"], + "summary": "Update Human Evaluation", + "description": "Updates an evaluation's status.\n\nRaises:\n HTTPException: If the columns in the test set do not match with the inputs in the variant.\n\nReturns:\n None: A 204 No Content status code, indicating that the update was successful.", + "operationId": "update_human_evaluation", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HumanEvaluationUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/human-evaluations/{evaluation_id}/evaluation_scenarios": { + "get": { + "tags": ["Human-Evaluations"], + "summary": "Fetch Human Evaluation Scenarios", + "description": "Fetches evaluation scenarios for a given evaluation ID.\n\nArguments:\n evaluation_id (str): The ID of the evaluation for which to fetch scenarios.\n\nRaises:\n HTTPException: If the evaluation is not found or access is denied.\n\nReturns:\n List[EvaluationScenario]: A list of evaluation scenarios.", + "operationId": "fetch_human_evaluation_scenarios", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HumanEvaluationScenario" + }, + "title": "Response Fetch Human Evaluation Scenarios" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/human-evaluations/{evaluation_id}/evaluation_scenario/{evaluation_scenario_id}/{evaluation_type}": { + "put": { + "tags": ["Human-Evaluations"], + "summary": "Update Evaluation Scenario Router", + "description": "Updates an evaluation scenario's vote or score based on its type.\n\nRaises:\n HTTPException: If update fails or unauthorized.\n\nReturns:\n None: 204 No Content status code upon successful update.", + "operationId": "update_evaluation_scenario_router_human_evaluations__evaluation_id__evaluation_scenario__evaluation_scenario_id___evaluation_type__put", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + }, + { + "name": "evaluation_scenario_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Scenario Id" + } + }, + { + "name": "evaluation_type", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/EvaluationType" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HumanEvaluationScenarioUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/human-evaluations/evaluation_scenario/{evaluation_scenario_id}/score": { + "get": { + "tags": ["Human-Evaluations"], + "summary": "Get Evaluation Scenario Score Router", + "description": "Fetch the score of a specific evaluation scenario.\n\nArgs:\n evaluation_scenario_id: The ID of the evaluation scenario to fetch.\n\nReturns:\n Dictionary containing the scenario ID and its score.", + "operationId": "get_evaluation_scenario_score_router_human_evaluations_evaluation_scenario__evaluation_scenario_id__score_get", + "parameters": [ + { + "name": "evaluation_scenario_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Scenario Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Response Get Evaluation Scenario Score Router Human Evaluations Evaluation Scenario Evaluation Scenario Id Score Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Human-Evaluations"], + "summary": "Update Evaluation Scenario Score Router", + "description": "Updates the score of an evaluation scenario.\n\nRaises:\n HTTPException: Server error if the evaluation update fails.\n\nReturns:\n None: 204 No Content status code upon successful update.", + "operationId": "update_evaluation_scenario_score_router_human_evaluations_evaluation_scenario__evaluation_scenario_id__score_put", + "parameters": [ + { + "name": "evaluation_scenario_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Scenario Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluationScenarioScoreUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/human-evaluations/{evaluation_id}/results": { + "get": { + "tags": ["Human-Evaluations"], + "summary": "Fetch Results", + "description": "Fetch all the results for one the comparison table\n\nArguments:\n evaluation_id -- _description_\n\nReturns:\n _description_", + "operationId": "fetch_results", + "parameters": [ + { + "name": "evaluation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/billing/stripe/events/": { + "post": { + "tags": ["Billing"], + "summary": "Handle Events", + "operationId": "handle_events", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/billing/stripe/portals/": { + "post": { + "tags": ["Billing"], + "summary": "Create Portal User Route", + "operationId": "create_portal", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/billing/stripe/checkouts/": { + "post": { + "tags": ["Billing"], + "summary": "Create Checkout User Route", + "operationId": "create_checkout", + "parameters": [ + { + "name": "plan", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Plan" + } + }, + { + "name": "success_url", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Success Url" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/billing/plans": { + "get": { + "tags": ["Billing"], + "summary": "Fetch Plan User Route", + "operationId": "fetch_plans", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/billing/plans/switch": { + "post": { + "tags": ["Billing"], + "summary": "Switch Plans User Route", + "operationId": "switch_plans", + "parameters": [ + { + "name": "plan", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Plan" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/billing/subscription": { + "get": { + "tags": ["Billing"], + "summary": "Fetch Subscription User Route", + "operationId": "fetch_subscription", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/billing/subscription/cancel": { + "post": { + "tags": ["Billing"], + "summary": "Cancel Subscription User Route", + "operationId": "cancel_plan", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/billing/usage": { + "get": { + "tags": ["Billing"], + "summary": "Fetch Usage User Route", + "operationId": "fetch_usage", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/admin/billing/stripe/portals/": { + "post": { + "tags": ["Admin", "Billing"], + "summary": "Create Portal Admin Route", + "operationId": "admin_create_portal", + "parameters": [ + { + "name": "organization_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Organization Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/billing/stripe/checkouts/": { + "post": { + "tags": ["Admin", "Billing"], + "summary": "Create Checkout Admin Route", + "operationId": "admin_create_checkout", + "parameters": [ + { + "name": "organization_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Organization Id" + } + }, + { + "name": "plan", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Plan" + } + }, + { + "name": "success_url", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Success Url" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/billing/plans/switch": { + "post": { + "tags": ["Admin", "Billing"], + "summary": "Switch Plans Admin Route", + "operationId": "admin_switch_plans", + "parameters": [ + { + "name": "organization_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Organization Id" + } + }, + { + "name": "plan", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Plan" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/billing/subscription/cancel": { + "post": { + "tags": ["Admin", "Billing"], + "summary": "Cancel Subscription Admin Route", + "operationId": "admin_cancel_subscription", + "parameters": [ + { + "name": "organization_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Organization Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/admin/billing/usage/report": { + "post": { + "tags": ["Admin", "Billing"], + "summary": "Report Usage", + "operationId": "admin_report_usage", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "Health Check", + "operationId": "health_check", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/permissions/verify": { + "get": { + "tags": ["Access Control"], + "summary": "Verify Permissions", + "operationId": "verify_permissions", + "parameters": [ + { + "name": "action", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Action" + } + }, + { + "name": "scope_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scope Type" + } + }, + { + "name": "scope_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Scope Id" + } + }, + { + "name": "resource_type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resource Type" + } + }, + { + "name": "resource_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Resource Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/projects": { + "get": { + "tags": ["Scopes"], + "summary": "Get Projects", + "operationId": "get_projects", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ProjectsResponse" + }, + "type": "array", + "title": "Response Get Projects" + } + } + } + } + } + } + }, + "/profile": { + "get": { + "summary": "User Profile", + "operationId": "fetch_user_profile", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/profile/reset-password": { + "post": { + "summary": "Reset User Password", + "operationId": "reset_user_password", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "User Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/{app_id}/variants": { + "get": { + "tags": ["Apps"], + "summary": "List App Variants", + "description": "Retrieve a list of app variants for a given app ID.\n\nArgs:\n app_id (str): The ID of the app to retrieve variants for.\n\nReturns:\n List[AppVariantResponse]: A list of app variants for the given app ID.", + "operationId": "list_app_variants", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppVariantResponse_" + }, + "title": "Response List App Variants" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/get_variant_by_env": { + "get": { + "tags": ["Apps"], + "summary": "Get Variant By Env", + "description": "Retrieve the app variant based on the provided app_id and environment.\n\nArgs:\n app_id (str): The ID of the app to retrieve the variant for.\n environment (str): The environment of the app variant to retrieve.\n\nRaises:\n HTTPException: If the app variant is not found (status_code=500), or if a ValueError is raised (status_code=400), or if any other exception is raised (status_code=500).\n\nReturns:\n AppVariantResponse: The retrieved app variant.", + "operationId": "get_variant_by_env", + "parameters": [ + { + "name": "app_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + }, + { + "name": "environment", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Environment" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppVariantResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps": { + "post": { + "tags": ["Apps"], + "summary": "Create App", + "description": "Create a new app for a user or organization.\n\nArgs:\n payload (CreateApp): The payload containing the app name and organization ID (optional).\n\nReturns:\n CreateAppOutput: The output containing the newly created app's ID and name.\n\nRaises:\n HTTPException: If there is an error creating the app or the user does not have permission to access the app.", + "operationId": "create_app", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateApp_" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAppOutput" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Apps"], + "summary": "List Apps", + "description": "Retrieve a list of apps filtered by app_name.\n\nArgs:\n app_name (Optional[str]): The name of the app to filter by.\n\nReturns:\n List[App]: A list of apps filtered by app_name.\n\nRaises:\n HTTPException: If there was an error retrieving the list of apps.", + "operationId": "list_apps", + "parameters": [ + { + "name": "app_name", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "App Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/App" + }, + "title": "Response List Apps" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/{app_id}": { + "patch": { + "tags": ["Apps"], + "summary": "Update App", + "description": "Update an app for a user or organization.\n\nArgs:\n app_id (str): The ID of the app.\n payload (UpdateApp): The payload containing the app name.\n\nReturns:\n UpdateAppOutput: The output containing the newly created app's ID and name.\n\nRaises:\n HTTPException: If there is an error creating the app or the user does not have permission to access the app.", + "operationId": "update_app", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateApp" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAppOutput" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Apps"], + "summary": "Remove App", + "description": "Remove app, all its variant.\n\nArguments:\n app -- App to remove", + "operationId": "remove_app", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/{app_id}/variant/from-service": { + "post": { + "tags": ["Apps"], + "summary": "Add Variant From Url Route", + "operationId": "add_variant_from_url", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddVariantFromURLPayload" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/{app_id}/variant/from-template": { + "post": { + "tags": ["Apps"], + "summary": "Add Variant From Key Route", + "operationId": "add_variant_from_key", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddVariantFromKeyPayload" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/{app_id}/environments": { + "get": { + "tags": ["Apps"], + "summary": "List Environments", + "description": "Retrieve a list of environments for a given app ID.\n\nArgs:\n app_id (str): The ID of the app to retrieve environments for.\n\nReturns:\n List[EnvironmentOutput]: A list of environment objects.", + "operationId": "list_environments", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentOutput_" + }, + "title": "Response List Environments" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/apps/{app_id}/revisions/{environment_name}": { + "get": { + "tags": ["Apps"], + "summary": "List App Environment Revisions", + "operationId": "environment_revisions", + "parameters": [ + { + "name": "app_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + }, + { + "name": "environment_name", + "in": "path", + "required": true, + "schema": { + "title": "Environment Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnvironmentOutputExtended_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/from-base": { + "post": { + "tags": ["Variants"], + "summary": "Add Variant From Base And Config", + "description": "Add a new variant based on an existing one.\nSame as POST /config\n\nArgs:\n payload (AddVariantFromBasePayload): Payload containing base variant ID, new variant name, and parameters.\n\nRaises:\n HTTPException: Raised if the variant could not be added or accessed.\n\nReturns:\n Union[AppVariantResponse, Any]: New variant details or exception.", + "operationId": "add_variant_from_base_and_config", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddVariantFromBasePayload" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/AppVariantResponse_" + }, + {} + ], + "title": "Response Add Variant From Base And Config" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/{variant_id}": { + "delete": { + "tags": ["Variants"], + "summary": "Remove Variant", + "description": "Mark a variant as hidden from the UI.\n\nArguments:\n app_variant -- AppVariant to remove\n\nRaises:\n HTTPException: If there is a problem removing the app variant", + "operationId": "mark_variant_as_hidden", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Variant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Variants"], + "summary": "Get Variant", + "operationId": "get_variant", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Variant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppVariantResponse_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/{variant_id}/parameters": { + "put": { + "tags": ["Variants"], + "summary": "Update Variant Parameters", + "description": "Updates the parameters for an app variant.\n\nArgs:\n variant_id (str): The ID of the app variant to update.\n payload (UpdateVariantParameterPayload): The payload containing the updated parameters.\n\nRaises:\n HTTPException: If there is an error while trying to update the app variant.\n\nReturns:\n JSONResponse: A JSON response containing the updated app variant parameters.", + "operationId": "update_variant_parameters", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Variant Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateVariantParameterPayload" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/{variant_id}/service": { + "put": { + "tags": ["Variants"], + "summary": "Update Variant Url", + "description": "Updates the URL used in an app variant.\n\nArgs:\n variant_id (str): The ID of the app variant to update.\n url (str): The URL to update.\n\nRaises:\n HTTPException: If an error occurs while trying to update the app variant.\n\nReturns:\n JSONResponse: A JSON response indicating whether the update was successful or not.", + "operationId": "update_variant_url", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateVariantURLPayload" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/{variant_id}/revisions": { + "get": { + "tags": ["Variants"], + "summary": "Get Variant Revisions", + "operationId": "get_variant_revisions", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Variant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppVariantRevision" + }, + "title": "Response Get Variant Revisions" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/{variant_id}/revisions/{revision_number}": { + "get": { + "tags": ["Variants"], + "summary": "Get Variant Revision", + "operationId": "get_variant_revision", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Variant Id" + } + }, + { + "name": "revision_number", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Revision Number" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppVariantRevision" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/{variant_id}/revisions/{revision_id}": { + "delete": { + "tags": ["Variants"], + "summary": "Remove Variant Revision", + "description": "Mark a variant revision as hidden from the UI.\n\nArguments:\n app_variant -- AppVariant to remove\n revision_id -- Revision ID to remove\n\nRaises:\n HTTPException: If there is a problem removing the app variant", + "operationId": "mark_variant_revision_as_hidden", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Variant Id" + } + }, + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Revision Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/add": { + "post": { + "tags": ["Variants"], + "summary": "Configs Add", + "operationId": "configs_add", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_configs_add" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/fetch": { + "post": { + "tags": ["Variants"], + "summary": "Configs Fetch", + "description": "Fetch configuration for a variant or environment.\n\nEither variant_ref OR environment_ref must be provided (if neither is provided,\na default environment_ref with slug=\"production\" will be used).\n\nFor each reference object (variant_ref, environment_ref, application_ref):\n- Provide either 'slug' or 'id' field\n- 'version' is optional and can be set to null\n- If 'id' is provided, it will be used directly to fetch the resource\n- Otherwise, 'slug' will be used along with application_ref\n\nReturns:\n ConfigResponseModel: The configuration for the requested variant or environment.\n\nRaises:\n HTTPException: If the configuration is not found.", + "operationId": "configs_fetch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_configs_fetch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/fork": { + "post": { + "tags": ["Variants"], + "summary": "Configs Fork", + "operationId": "configs_fork", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_configs_fork" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/commit": { + "post": { + "tags": ["Variants"], + "summary": "Configs Commit", + "operationId": "configs_commit", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/deploy": { + "post": { + "tags": ["Variants"], + "summary": "Configs Deploy", + "operationId": "configs_deploy", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_configs_deploy" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConfigResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/delete": { + "post": { + "tags": ["Variants"], + "summary": "Configs Delete", + "operationId": "configs_delete", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_configs_delete" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "integer", + "title": "Response Configs Delete" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/list": { + "post": { + "tags": ["Variants"], + "summary": "Configs List", + "operationId": "configs_list", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReferenceRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ConfigResponseModel" + }, + "type": "array", + "title": "Response Configs List" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/variants/configs/history": { + "post": { + "tags": ["Variants"], + "summary": "Configs History", + "operationId": "configs_history", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_configs_history" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ConfigResponseModel" + }, + "type": "array", + "title": "Response Configs History" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/containers/templates": { + "get": { + "tags": ["Containers"], + "summary": "Container Templates", + "description": "Returns a list of templates available for creating new containers.", + "operationId": "container_templates", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/evaluators": { + "get": { + "tags": ["Evaluators"], + "summary": "Get Evaluators Endpoint", + "description": "Endpoint to fetch a list of evaluators.\n\nReturns:\n List[Evaluator]: A list of evaluator objects.", + "operationId": "get_evaluators_endpoint_evaluators_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/oss__src__models__api__evaluation_model__Evaluator" + }, + "type": "array", + "title": "Response Get Evaluators Endpoint Evaluators Get" + } + } + } + } + } + } + }, + "/evaluators/map": { + "post": { + "tags": ["Evaluators"], + "summary": "Evaluator Data Map", + "description": "Endpoint to map the experiment data tree to evaluator interface.\n\nArgs:\n request (Request): The request object.\n payload (EvaluatorMappingInputInterface): The payload containing the request data.\n\nReturns:\n EvaluatorMappingOutputInterface: the evaluator mapping output object", + "operationId": "evaluator_data_map_evaluators_map_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorMappingInputInterface" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorMappingOutputInterface" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluators/{evaluator_key}/run": { + "post": { + "tags": ["Evaluators"], + "summary": "Evaluator Run", + "description": "Endpoint to evaluate LLM app run\n\nArgs:\n request (Request): The request object.\n evaluator_key (str): The key of the evaluator.\n payload (EvaluatorInputInterface): The payload containing the request data.\n\nReturns:\n result: EvaluatorOutputInterface object containing the outputs.", + "operationId": "evaluator_run_evaluators__evaluator_key__run_post", + "parameters": [ + { + "name": "evaluator_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluator Key" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorInputInterface" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorOutputInterface" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluators/configs": { + "get": { + "tags": ["Evaluators"], + "summary": "Get Evaluator Configs", + "description": "Endpoint to fetch evaluator configurations for a specific app.\n\nArgs:\n app_id (str): The ID of the app.\n\nReturns:\n List[EvaluatorConfigDB]: A list of evaluator configuration objects.", + "operationId": "get_evaluator_configs_evaluators_configs_get", + "parameters": [ + { + "name": "app_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EvaluatorConfig" + }, + "title": "Response Get Evaluator Configs Evaluators Configs Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": ["Evaluators"], + "summary": "Create New Evaluator Config", + "description": "Endpoint to fetch evaluator configurations for a specific app.\n\nArgs:\n app_id (str): The ID of the app.\n\nReturns:\n EvaluatorConfigDB: Evaluator configuration api model.", + "operationId": "create_new_evaluator_config_evaluators_configs_post", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewEvaluatorConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorConfig" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/evaluators/configs/{evaluator_config_id}": { + "get": { + "tags": ["Evaluators"], + "summary": "Get Evaluator Config", + "description": "Endpoint to fetch evaluator configurations for a specific app.\n\nReturns:\n List[EvaluatorConfigDB]: A list of evaluator configuration objects.", + "operationId": "get_evaluator_config_evaluators_configs__evaluator_config_id__get", + "parameters": [ + { + "name": "evaluator_config_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluator Config Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorConfig" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Evaluators"], + "summary": "Update Evaluator Config", + "description": "Endpoint to update evaluator configurations for a specific app.\n\nReturns:\n List[EvaluatorConfigDB]: A list of evaluator configuration objects.", + "operationId": "update_evaluator_config_evaluators_configs__evaluator_config_id__put", + "parameters": [ + { + "name": "evaluator_config_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluator Config Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEvaluatorConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorConfig" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Evaluators"], + "summary": "Delete Evaluator Config", + "description": "Endpoint to delete a specific evaluator configuration.\n\nArgs:\n evaluator_config_id (str): The unique identifier of the evaluator configuration.\n\nReturns:\n bool: True if deletion was successful, False otherwise.", + "operationId": "delete_evaluator_config_evaluators_configs__evaluator_config_id__delete", + "parameters": [ + { + "name": "evaluator_config_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Evaluator Config Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "boolean", + "title": "Response Delete Evaluator Config Evaluators Configs Evaluator Config Id Delete" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/testsets/upload": { + "post": { + "tags": ["Testsets"], + "summary": "Upload File", + "description": "Uploads a CSV or JSON file and saves its data to Postgres.\n\nArgs:\nupload_type : Either a json or csv file.\n file (UploadFile): The CSV or JSON file to upload.\n testset_name (Optional): the name of the testset if provided.\n\nReturns:\n dict: The result of the upload process.", + "operationId": "upload_file", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_file" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestSetSimpleResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/testsets/endpoint": { + "post": { + "tags": ["Testsets"], + "summary": "Import Testset", + "description": "Import JSON testset data from an endpoint and save it to Postgres.\n\nArgs:\n endpoint (str): An endpoint URL to import data from.\n testset_name (str): the name of the testset if provided.\n\nReturns:\n dict: The result of the import process.", + "operationId": "import_testset", + "parameters": [ + { + "name": "authorization", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Authorization" + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Body_import_testset" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestSetSimpleResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/testsets": { + "get": { + "tags": ["Testsets"], + "summary": "Get Testsets", + "description": "Get all testsets.\n\nReturns:\n- A list of testset objects.\n\nRaises:\n- `HTTPException` with status code 404 if no testsets are found.", + "operationId": "get_testsets", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/TestSetOutputResponse" + }, + "type": "array", + "title": "Response Get Testsets" + } + } + } + } + } + }, + "post": { + "tags": ["Testsets"], + "summary": "Create Testset", + "description": "Create a testset with given name, save the testset to Postgres.\n\nArgs:\nname (str): name of the test set.\ntestset (Dict[str, str]): test set data.\n\nReturns:\nstr: The id of the test set created.", + "operationId": "create_testset", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewTestset" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestSetSimpleResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Testsets"], + "summary": "Delete Testsets", + "description": "Delete specific testsets based on their unique IDs.\n\nArgs:\ntestset_ids (List[str]): The unique identifiers of the testsets to delete.\n\nReturns:\nA list of the deleted testsets' IDs.", + "operationId": "delete_testsets", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteTestsets" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Response Delete Testsets" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/testsets/{testset_id}": { + "put": { + "tags": ["Testsets"], + "summary": "Update Testset", + "description": "Update a testset with given id, update the testset in Postgres.\n\nArgs:\ntestset_id (str): id of the test set to be updated.\ncsvdata (NewTestset): New data to replace the old testset.\n\nReturns:\nstr: The id of the test set updated.", + "operationId": "update_testset", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Testset Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewTestset" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Testsets"], + "summary": "Get Single Testset", + "description": "Fetch a specific testset in Postgres.\n\nArgs:\n testset_id (str): The id of the testset to fetch.\n\nReturns:\n The requested testset if found, else an HTTPException.", + "operationId": "get_single_testset", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Testset Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/environments/deploy": { + "post": { + "tags": ["Environments"], + "summary": "Deploy To Environment", + "description": "Deploys a given variant to an environment\n\nArgs:\n environment_name: Name of the environment to deploy to.\n variant_id: variant id to deploy.\n\nRaises:\n HTTPException: If the deployment fails.", + "operationId": "deploy_to_environment", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeployToEnvironmentPayload" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/bases": { + "get": { + "tags": ["Bases"], + "summary": "List Bases", + "description": "Retrieve a list of bases filtered by app_id and base_name.\n\nArgs:\n request (Request): The incoming request.\n app_id (str): The ID of the app to filter by.\n base_name (Optional[str], optional): The name of the base to filter by. Defaults to None.\n\nReturns:\n List[BaseOutput]: A list of BaseOutput objects representing the filtered bases.\n\nRaises:\n HTTPException: If there was an error retrieving the bases.", + "operationId": "list_bases", + "parameters": [ + { + "name": "app_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "App Id" + } + }, + { + "name": "base_name", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Base Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BaseOutput" + }, + "title": "Response List Bases" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/configs": { + "get": { + "tags": ["Configs"], + "summary": "Get Config", + "operationId": "get_config", + "parameters": [ + { + "name": "base_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Base Id" + } + }, + { + "name": "config_name", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Name" + } + }, + { + "name": "environment_name", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Environment Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetConfigResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/configs/deployment/{deployment_revision_id}": { + "get": { + "tags": ["Configs"], + "summary": "Get Config Deployment Revision", + "operationId": "get_config_deployment_revision", + "parameters": [ + { + "name": "deployment_revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Deployment Revision Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/configs/deployment/{deployment_revision_id}/revert": { + "post": { + "tags": ["Configs"], + "summary": "Revert Deployment Revision", + "operationId": "revert_deployment_revision", + "parameters": [ + { + "name": "deployment_revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Deployment Revision Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/keys": { + "get": { + "tags": ["Api Keys"], + "summary": "List Api Keys", + "description": "List all API keys associated with the authenticated user.\n\nArgs:\n request (Request): The incoming request object.\n\nReturns:\n List[ListAPIKeysResponse]: A list of API Keys associated with the user.", + "operationId": "list_api_keys", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/ListAPIKeysResponse" + }, + "type": "array", + "title": "Response List Api Keys" + } + } + } + } + } + }, + "post": { + "tags": ["Api Keys"], + "summary": "Create Api Key", + "description": "Creates an API key for a user.\n\nArgs:\n request (Request): The request object containing the user ID in the request state.\n\nReturns:\n str: The created API key.", + "operationId": "create_api_key", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Create Api Key" + } + } + } + } + } + } + }, + "/keys/{key_prefix}": { + "delete": { + "tags": ["Api Keys"], + "summary": "Delete Api Key", + "description": "Delete an API key with the given key prefix for the authenticated user.\n\nArgs:\n key_prefix (str): The prefix of the API key to be deleted.\n request (Request): The incoming request object.\n\nReturns:\n dict: A dictionary containing a success message upon successful deletion.\n\nRaises:\n HTTPException: If the API key is not found or does not belong to the user.", + "operationId": "delete_api_key", + "parameters": [ + { + "name": "key_prefix", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Key Prefix" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true, + "title": "Response Delete Api Key" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/organizations": { + "get": { + "tags": ["Organization"], + "summary": "List Organizations", + "description": "Returns a list of organizations associated with the user's session.\n\nReturns:\n list[Organization]: A list of organizations associated with the user's session.\n\nRaises:\n HTTPException: If there is an error retrieving the organizations from the database.", + "operationId": "list_organizations", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Organization" + }, + "type": "array", + "title": "Response List Organizations" + } + } + } + } + } + } + }, + "/organizations/{org_id}/workspaces/{workspace_id}/invite": { + "post": { + "tags": ["Organization"], + "summary": "Invite User To Organization", + "description": "Assigns a role to a user in an organization.\n\nArgs:\n org_id (str): The ID of the organization.\n payload (InviteRequest): The payload containing the organization id, user email, and role to assign.\n workspace_id (str): The ID of the workspace.\n\nReturns:\n bool: True if the role was successfully assigned, False otherwise.\n\nRaises:\n HTTPException: If the user does not have permission to perform this action.\n HTTPException: If there is an error assigning the role to the user.", + "operationId": "invite_user_to_workspace", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + }, + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/InviteRequest" + }, + "title": "Payload" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/organizations/{org_id}/workspaces/{workspace_id}/invite/resend": { + "post": { + "tags": ["Organization"], + "summary": "Resend User Invitation To Organization", + "description": "Resend an invitation to a user to an Organization.\n\nRaises:\n HTTPException: _description_; status_code: 500\n HTTPException: Invitation not found or has expired; status_code: 400\n HTTPException: You already belong to this organization; status_code: 400\n\nReturns:\n JSONResponse: Resent invitation to user; status_code: 200", + "operationId": "resend_invitation", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + }, + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResendInviteRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/organizations/{org_id}/workspaces/{workspace_id}/invite/accept": { + "post": { + "tags": ["Organization"], + "summary": "Accept Organization Invitation", + "description": "Accept an invitation to an organization.\n\nRaises:\n HTTPException: _description_; status_code: 500\n HTTPException: Invitation not found or has expired; status_code: 400\n HTTPException: You already belong to this organization; status_code: 400\n\nReturns:\n JSONResponse: Accepted invitation to workspace; status_code: 200", + "operationId": "accept_invitation", + "parameters": [ + { + "name": "org_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Org Id" + } + }, + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + }, + { + "name": "project_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Project Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InviteToken" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/workspaces": { + "get": { + "tags": ["Workspace"], + "summary": "Get Workspace", + "description": "Get workspace details.\n\nReturns details about the workspace associated with the user's session.\n\nReturns:\n Workspace: The details of the workspace.\n\nRaises:\n HTTPException: If the user does not have permission to perform this action.", + "operationId": "get_workspace", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Workspace" + }, + "type": "array", + "title": "Response Get Workspace" + } + } + } + } + } + } + }, + "/workspaces/roles": { + "get": { + "tags": ["Workspace"], + "summary": "Get All Workspace Roles", + "description": "Get all workspace roles.\n\nReturns a list of all available workspace roles.\n\nReturns:\n List[WorkspaceRoleResponse]: A list of WorkspaceRole objects representing the available workspace roles.\n\nRaises:\n HTTPException: If an error occurs while retrieving the workspace roles.", + "operationId": "get_all_workspace_roles", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array", + "title": "Response Get All Workspace Roles" + } + } + } + } + } + } + }, + "/workspaces/{workspace_id}/users": { + "delete": { + "tags": ["Workspace"], + "summary": "Remove User From Workspace", + "description": "Remove a user from a workspace.\n\nArgs:\n email (str): The email address of the user to be removed\n workspace_id (str): The ID of the workspace.", + "operationId": "remove_user_from_workspace", + "parameters": [ + { + "name": "workspace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Workspace Id" + } + }, + { + "name": "email", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Email" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/tracing/traces/": { + "put": { + "tags": ["Tracing"], + "summary": "Edit Trace", + "operationId": "edit_trace", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelTracingRequest" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelLinksResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": ["Tracing"], + "summary": "Add Trace", + "operationId": "add_trace", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelTracingRequest" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelLinksResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/tracing/traces/{trace_id}": { + "get": { + "tags": ["Tracing"], + "summary": "Fetch Trace", + "operationId": "fetch_trace", + "parameters": [ + { + "name": "trace_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "title": "Trace Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/oss__src__apis__fastapi__tracing__models__OTelTracingResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Tracing"], + "summary": "Remove Trace", + "operationId": "remove_trace", + "parameters": [ + { + "name": "trace_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "title": "Trace Id" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelLinksResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/tracing/spans/": { + "post": { + "tags": ["Tracing"], + "summary": "Ingest Spans", + "operationId": "ingest_spans", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelTracingRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelLinksResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Tracing"], + "summary": "Query Spans", + "operationId": "query_spans", + "parameters": [ + { + "name": "focus", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/Focus" + }, + { + "type": "null" + } + ], + "title": "Focus" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/Format" + }, + { + "type": "null" + } + ], + "title": "Format" + } + }, + { + "name": "oldest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Oldest" + } + }, + { + "name": "newest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Newest" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Limit" + } + }, + { + "name": "filter", + "in": "query", + "required": false, + "schema": { + "title": "Filter" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/oss__src__apis__fastapi__tracing__models__OTelTracingResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/tracing/spans/ingest": { + "post": { + "tags": ["Tracing"], + "summary": "Ingest Spans", + "operationId": "ingest_spans_rpc", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelTracingRequest" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OTelLinksResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/tracing/spans/query": { + "post": { + "tags": ["Tracing"], + "summary": "Query Spans", + "operationId": "query_spans_rpc", + "parameters": [ + { + "name": "focus", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/Focus" + }, + { + "type": "null" + } + ], + "title": "Focus" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/Format" + }, + { + "type": "null" + } + ], + "title": "Format" + } + }, + { + "name": "oldest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Oldest" + } + }, + { + "name": "newest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Newest" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Limit" + } + }, + { + "name": "filter", + "in": "query", + "required": false, + "schema": { + "title": "Filter" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/oss__src__apis__fastapi__tracing__models__OTelTracingResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/evaluators/": { + "get": { + "tags": ["Evals"], + "summary": "Query Evaluators", + "operationId": "list_evaluators", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/EvaluatorQueryRequest" + }, + { + "type": "null" + } + ], + "title": "Evaluator Query Request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": ["Evals"], + "summary": "Create Evaluator", + "operationId": "create_evaluator", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/evaluators/{evaluator_id}": { + "get": { + "tags": ["Evals"], + "summary": "Fetch Evaluator", + "operationId": "fetch_evaluator", + "parameters": [ + { + "name": "evaluator_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Evaluator Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Evals"], + "summary": "Edit Evaluator", + "operationId": "edit_evaluator", + "parameters": [ + { + "name": "evaluator_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Evaluator Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/evaluators/{evaluator_id}/archive": { + "post": { + "tags": ["Evals"], + "summary": "Archive Evaluator", + "operationId": "archive_evaluator", + "parameters": [ + { + "name": "evaluator_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Evaluator Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/evaluators/{evaluator_id}/unarchive": { + "post": { + "tags": ["Evals"], + "summary": "Unarchive Evaluator", + "operationId": "unarchive_evaluator", + "parameters": [ + { + "name": "evaluator_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Evaluator Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/evaluators/query": { + "post": { + "tags": ["Evals"], + "summary": "Query Evaluators", + "operationId": "query_evaluators", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/EvaluatorQueryRequest" + }, + { + "type": "null" + } + ], + "title": "Evaluator Query Request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluatorsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/annotations/": { + "post": { + "tags": ["Evals"], + "summary": "Create Annotation", + "operationId": "create_annotation", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationCreateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/annotations/{trace_id}/{span_id}": { + "get": { + "tags": ["Evals"], + "summary": "Fetch Annotation", + "operationId": "fetch_annotation", + "parameters": [ + { + "name": "trace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Trace Id" + } + }, + { + "name": "span_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Span Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Evals"], + "summary": "Delete Annotation", + "operationId": "delete_annotation", + "parameters": [ + { + "name": "trace_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Trace Id" + } + }, + { + "name": "span_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Span Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationLinkResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/annotations/query": { + "post": { + "tags": ["Evals"], + "summary": "Query Annotations", + "operationId": "query_annotations", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationQueryRequest" + }, + { + "type": "null" + } + ], + "title": "Query Request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnnotationsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/": { + "post": { + "tags": ["Workflows"], + "summary": "Create Workflow", + "operationId": "create_workflow", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Workflows"], + "summary": "Query Workflows", + "operationId": "list_workflows", + "parameters": [ + { + "name": "workflow_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of ref, e.g. {\"key\": value}", + "title": "Workflow Ref" + }, + "description": "JSON string of ref, e.g. {\"key\": value}" + }, + { + "name": "workflow_flags", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of flags, e.g. {\"key\": value}", + "title": "Workflow Flags" + }, + "description": "JSON string of flags, e.g. {\"key\": value}" + }, + { + "name": "workflow_metadata", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of metadata, e.g. {\"key\": value}", + "title": "Workflow Metadata" + }, + "description": "JSON string of metadata, e.g. {\"key\": value}" + }, + { + "name": "include_archived", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Archived" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/{workflow_id}": { + "get": { + "tags": ["Workflows"], + "summary": "Fetch Workflow", + "operationId": "fetch_workflow", + "parameters": [ + { + "name": "artifact_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Artifact Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Workflows"], + "summary": "Edit Workflow", + "operationId": "edit_workflow", + "parameters": [ + { + "name": "workflow_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Workflow Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/{workflow_id}/archive": { + "post": { + "tags": ["Workflows"], + "summary": "Archive Workflow", + "operationId": "archive_workflow", + "parameters": [ + { + "name": "artifact_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Artifact Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/{workflow_id}/unarchive": { + "post": { + "tags": ["Workflows"], + "summary": "Unarchive Workflow", + "operationId": "unarchive_workflow", + "parameters": [ + { + "name": "artifact_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Artifact Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/query": { + "post": { + "tags": ["Workflows"], + "summary": "Query Workflows", + "operationId": "query_workflows", + "parameters": [ + { + "name": "workflow_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of ref, e.g. {\"key\": value}", + "title": "Workflow Ref" + }, + "description": "JSON string of ref, e.g. {\"key\": value}" + }, + { + "name": "workflow_flags", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of flags, e.g. {\"key\": value}", + "title": "Workflow Flags" + }, + "description": "JSON string of flags, e.g. {\"key\": value}" + }, + { + "name": "workflow_metadata", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of metadata, e.g. {\"key\": value}", + "title": "Workflow Metadata" + }, + "description": "JSON string of metadata, e.g. {\"key\": value}" + }, + { + "name": "include_archived", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Archived" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/": { + "post": { + "tags": ["Workflows"], + "summary": "Create Workflow Variant", + "operationId": "create_workflow_variant", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Workflows"], + "summary": "Query Workflow Variants", + "operationId": "list_workflow_variants", + "parameters": [ + { + "name": "workflow_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of reference, e.g. {\"key\": value}", + "title": "Workflow Ref" + }, + "description": "JSON string of reference, e.g. {\"key\": value}" + }, + { + "name": "variant_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of reference, e.g. {\"key\": value}", + "title": "Variant Ref" + }, + "description": "JSON string of reference, e.g. {\"key\": value}" + }, + { + "name": "variant_metadata", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of metadata, e.g. {\"key\": value}", + "title": "Variant Metadata" + }, + "description": "JSON string of metadata, e.g. {\"key\": value}" + }, + { + "name": "variant_flags", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of flags, e.g. {\"key\": value}", + "title": "Variant Flags" + }, + "description": "JSON string of flags, e.g. {\"key\": value}" + }, + { + "name": "include_archived", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Archived" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/{variant_id}": { + "get": { + "tags": ["Workflows"], + "summary": "Fetch Workflow Variant", + "operationId": "fetch_workflow_variant", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Variant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Workflows"], + "summary": "Edit Workflow Variant", + "operationId": "edit_workflow_variant", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Variant Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/{variant_id}/archive": { + "post": { + "tags": ["Workflows"], + "summary": "Archive Workflow Variant", + "operationId": "archive_workflow_variant", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Variant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/{variant_id}/unarchive": { + "post": { + "tags": ["Workflows"], + "summary": "Unarchive Workflow Variant", + "operationId": "unarchive_workflow_variant", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Variant Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/query": { + "post": { + "tags": ["Workflows"], + "summary": "Query Workflow Variants", + "operationId": "query_workflow_variants", + "parameters": [ + { + "name": "workflow_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of reference, e.g. {\"key\": value}", + "title": "Workflow Ref" + }, + "description": "JSON string of reference, e.g. {\"key\": value}" + }, + { + "name": "variant_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of reference, e.g. {\"key\": value}", + "title": "Variant Ref" + }, + "description": "JSON string of reference, e.g. {\"key\": value}" + }, + { + "name": "variant_metadata", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of metadata, e.g. {\"key\": value}", + "title": "Variant Metadata" + }, + "description": "JSON string of metadata, e.g. {\"key\": value}" + }, + { + "name": "variant_flags", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of flags, e.g. {\"key\": value}", + "title": "Variant Flags" + }, + "description": "JSON string of flags, e.g. {\"key\": value}" + }, + { + "name": "include_archived", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Archived" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/{variant_id}/commit": { + "post": { + "tags": ["Workflows"], + "summary": "Commit Workflow Revision", + "operationId": "commit_workflow_revision_by_variant_id", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Variant Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/variants/{variant_id}/fork": { + "post": { + "tags": ["Workflows"], + "summary": "Fork Workflow Variant", + "operationId": "fork_workflow_variant", + "parameters": [ + { + "name": "variant_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Variant Id" + } + }, + { + "name": "revision_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Revision Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/": { + "post": { + "tags": ["Workflows"], + "summary": "Create Workflow Revision", + "operationId": "create_workflow_revision", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": ["Workflows"], + "summary": "Query Workflow Revisions", + "operationId": "list_workflow_revisions", + "parameters": [ + { + "name": "variant_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of ref, e.g. {\"key\": value}", + "title": "Variant Ref" + }, + "description": "JSON string of ref, e.g. {\"key\": value}" + }, + { + "name": "revision_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of ref, e.g. {\"key\": value}", + "title": "Revision Ref" + }, + "description": "JSON string of ref, e.g. {\"key\": value}" + }, + { + "name": "revision_metadata", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of metadata, e.g. {\"key\": value}", + "title": "Revision Metadata" + }, + "description": "JSON string of metadata, e.g. {\"key\": value}" + }, + { + "name": "revision_flags", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of flags, e.g. {\"key\": value}", + "title": "Revision Flags" + }, + "description": "JSON string of flags, e.g. {\"key\": value}" + }, + { + "name": "include_archived", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Archived" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/{revision_id}": { + "get": { + "tags": ["Workflows"], + "summary": "Fetch Workflow Revision", + "operationId": "fetch_workflow_revision", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_fetch_workflow_revision" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Workflows"], + "summary": "Edit Workflow Revision", + "operationId": "edit_workflow_revision", + "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Revision Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/{revision_id}/archive": { + "post": { + "tags": ["Workflows"], + "summary": "Archive Workflow Revision", + "operationId": "archive_workflow_revision_rpc", + "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Revision Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/{revision_id}/unarchive": { + "post": { + "tags": ["Workflows"], + "summary": "Unarchive Workflow Revision", + "operationId": "unarchive_workflow_revision_rpc", + "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Revision Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/query": { + "post": { + "tags": ["Workflows"], + "summary": "Query Workflow Revisions", + "operationId": "query_workflow_revisions", + "parameters": [ + { + "name": "variant_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of ref, e.g. {\"key\": value}", + "title": "Variant Ref" + }, + "description": "JSON string of ref, e.g. {\"key\": value}" + }, + { + "name": "revision_ref", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of ref, e.g. {\"key\": value}", + "title": "Revision Ref" + }, + "description": "JSON string of ref, e.g. {\"key\": value}" + }, + { + "name": "revision_metadata", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of metadata, e.g. {\"key\": value}", + "title": "Revision Metadata" + }, + "description": "JSON string of metadata, e.g. {\"key\": value}" + }, + { + "name": "revision_flags", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON string of flags, e.g. {\"key\": value}", + "title": "Revision Flags" + }, + "description": "JSON string of flags, e.g. {\"key\": value}" + }, + { + "name": "include_archived", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Archived" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/{revision_id}/fork": { + "post": { + "tags": ["Workflows"], + "summary": "Fork Workflow Variant", + "operationId": "fork_workflow_variant_by_revision_id", + "parameters": [ + { + "name": "revision_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Revision Id" + } + }, + { + "name": "variant_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Variant Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowVariantResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/commit": { + "post": { + "tags": ["Workflows"], + "summary": "Commit Workflow Revision", + "operationId": "commit_workflow_revision", + "parameters": [ + { + "name": "variant_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Variant Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/base/workflows/revisions/log": { + "post": { + "tags": ["Workflows"], + "summary": "Log Workflow Revisions", + "operationId": "log_workflow_revisions", + "parameters": [ + { + "name": "depth", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Depth" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_log_workflow_revisions" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowRevisionsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/": { + "get": { + "tags": ["Testsets"], + "summary": "Query Testsets", + "operationId": "list_testsets", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/TagsRequest" + }, + { + "type": "null" + } + ], + "title": "Metadata Request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": ["Testsets"], + "summary": "Create Testset", + "operationId": "create_testset", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/{testset_id}": { + "get": { + "tags": ["Testsets"], + "summary": "Fetch Testset", + "operationId": "fetch_testset", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Testset Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Testsets"], + "summary": "Edit Testset", + "operationId": "edit_testset", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Testset Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/{testset_id}/archive": { + "post": { + "tags": ["Testsets"], + "summary": "Archive Testset", + "operationId": "archive_testset", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Testset Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/{testset_id}/unarchive": { + "post": { + "tags": ["Testsets"], + "summary": "Unarchive Testset", + "operationId": "unarchive_testset", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Testset Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/query": { + "post": { + "tags": ["Testsets"], + "summary": "Query Testsets", + "operationId": "query_testsets", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/TagsRequest" + }, + { + "type": "null" + } + ], + "title": "Metadata Request" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/upload": { + "post": { + "tags": ["Testsets"], + "summary": "Create Testset From File", + "operationId": "create_testset_from_file", + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_create_testset_from_file" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/{testset_id}/upload": { + "post": { + "tags": ["Testsets"], + "summary": "Update Testset From File", + "operationId": "update_testset_from_file", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Testset Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_update_testset_from_file" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/{testset_id}/download": { + "post": { + "tags": ["Testsets"], + "summary": "Fetch Testset To File", + "operationId": "fetch_testset_to_file", + "parameters": [ + { + "name": "testset_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "string" + } + ], + "title": "Testset Id" + } + }, + { + "name": "file_type", + "in": "query", + "required": false, + "schema": { + "enum": ["CSV", "JSON"], + "type": "string", + "title": "File Type" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestsetResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/preview/testsets/testcases/{testcase_id}": { + "get": { + "tags": ["Testsets"], + "summary": "Fetch Testcase", + "operationId": "fetch_testcase", + "parameters": [ + { + "name": "testcase_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Testcase Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestcaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/otlp/v1/traces": { + "post": { + "tags": ["Observability"], + "summary": "Receive /v1/traces via OTLP", + "description": "Receive traces via OTLP.", + "operationId": "otlp_v1_traces", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectStatusResponse" + } + } + } + } + } + } + }, + "/observability/v1/otlp/traces": { + "get": { + "tags": ["Observability"], + "summary": "Status of OTLP endpoint", + "description": "Status of OTLP endpoint.", + "operationId": "otlp_status", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectStatusResponse" + } + } + } + } + } + }, + "post": { + "tags": ["Observability"], + "summary": "Receive traces via OTLP", + "description": "Receive traces via OTLP.", + "operationId": "otlp_receiver", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectStatusResponse" + } + } + } + } + } + } + }, + "/observability/v1/traces": { + "get": { + "tags": ["Observability"], + "summary": "Query traces, with optional grouping, windowing, filtering, and pagination.", + "description": "Query traces, with optional grouping, windowing, filtering, and pagination.", + "operationId": "query_traces", + "parameters": [ + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "enum": ["opentelemetry", "agenta"], + "type": "string", + "default": "agenta", + "title": "Format" + } + }, + { + "name": "focus", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Focus" + } + }, + { + "name": "oldest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Oldest" + } + }, + { + "name": "newest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Newest" + } + }, + { + "name": "filtering", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filtering" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Page" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Size" + } + }, + { + "name": "next", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next" + } + }, + { + "name": "stop", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Stop" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__apis__fastapi__observability__models__OTelTracingResponse" + }, + { + "$ref": "#/components/schemas/AgentaNodesResponse" + }, + { + "$ref": "#/components/schemas/AgentaTreesResponse" + }, + { + "$ref": "#/components/schemas/AgentaRootsResponse" + } + ], + "title": "Response Query Traces" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Observability"], + "summary": "Delete traces", + "description": "Delete trace.", + "operationId": "delete_traces", + "parameters": [ + { + "name": "node_id", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Id" + } + }, + { + "name": "node_ids", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "title": "Node Ids" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CollectStatusResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/observability/v1/analytics": { + "get": { + "tags": ["Observability"], + "summary": "Query analytics, with optional grouping, windowing, filtering.", + "operationId": "query_analytics", + "parameters": [ + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "enum": ["legacy", "agenta"], + "type": "string", + "default": "agenta", + "title": "Format" + } + }, + { + "name": "focus", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Focus" + } + }, + { + "name": "oldest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Oldest" + } + }, + { + "name": "newest", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Newest" + } + }, + { + "name": "window", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Window" + } + }, + { + "name": "filtering", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filtering" + } + }, + { + "name": "timeRange", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Timerange" + } + }, + { + "name": "app_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "App Id" + } + }, + { + "name": "environment", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Environment" + } + }, + { + "name": "variant", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Variant" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/LegacyAnalyticsResponse" + }, + { + "$ref": "#/components/schemas/AnalyticsResponse" + } + ], + "title": "Response Query Analytics" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/observability/v1/traces/{trace_id}": { + "get": { + "tags": ["Observability"], + "summary": "Fetch trace by ID.", + "description": "Fetch trace by ID.", + "operationId": "fetch_trace_by_id", + "parameters": [ + { + "name": "trace_id", + "in": "path", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "title": "Trace Id" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "enum": ["opentelemetry", "agenta"], + "type": "string", + "default": "openetelemetry", + "title": "Format" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__apis__fastapi__observability__models__OTelTracingResponse" + }, + { + "$ref": "#/components/schemas/AgentaNodesResponse" + }, + { + "$ref": "#/components/schemas/AgentaTreesResponse" + }, + { + "$ref": "#/components/schemas/AgentaRootsResponse" + } + ], + "title": "Response Fetch Trace By Id" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vault/v1/secrets": { + "get": { + "tags": ["Vault"], + "summary": "List Secrets", + "operationId": "list_secrets", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/SecretResponseDTO" + }, + "type": "array", + "title": "Response List Secrets" + } + } + } + } + } + }, + "post": { + "tags": ["Vault"], + "summary": "Create Secret", + "operationId": "create_secret", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSecretDTO" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResponseDTO" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/vault/v1/secrets/{secret_id}": { + "get": { + "tags": ["Vault"], + "summary": "Read Secret", + "operationId": "read_secret", + "parameters": [ + { + "name": "secret_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Secret Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResponseDTO" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": ["Vault"], + "summary": "Update Secret", + "operationId": "update_secret", + "parameters": [ + { + "name": "secret_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Secret Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretDTO" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretResponseDTO" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": ["Vault"], + "summary": "Delete Secret", + "operationId": "delete_secret", + "parameters": [ + { + "name": "secret_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Secret Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AccountRequest": { + "properties": { + "user": { + "anyOf": [ + { + "$ref": "#/components/schemas/LegacyUserRequest" + }, + { + "type": "null" + } + ] + }, + "scope": { + "anyOf": [ + { + "$ref": "#/components/schemas/LegacyScopeRequest" + }, + { + "type": "null" + } + ] + }, + "subscription": { + "anyOf": [ + { + "$ref": "#/components/schemas/LegacySubscriptionRequest" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "AccountRequest" + }, + "AccountResponse": { + "properties": { + "user": { + "anyOf": [ + { + "$ref": "#/components/schemas/LegacyUserResponse" + }, + { + "type": "null" + } + ] + }, + "scopes": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/LegacyScopesResponse" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Scopes" + } + }, + "type": "object", + "title": "AccountResponse" + }, + "AddVariantFromBasePayload": { + "properties": { + "base_id": { + "type": "string", + "title": "Base Id" + }, + "new_variant_name": { + "type": "string", + "title": "New Variant Name" + }, + "new_config_name": { + "type": "string", + "title": "New Config Name" + }, + "parameters": { + "additionalProperties": true, + "type": "object", + "title": "Parameters" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + } + }, + "type": "object", + "required": ["base_id", "new_variant_name", "new_config_name", "parameters"], + "title": "AddVariantFromBasePayload" + }, + "AddVariantFromKeyPayload": { + "properties": { + "variant_name": { + "type": "string", + "title": "Variant Name" + }, + "key": { + "type": "string", + "title": "Key" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + }, + "base_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Base Name" + }, + "config_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Name" + } + }, + "type": "object", + "required": ["variant_name", "key"], + "title": "AddVariantFromKeyPayload" + }, + "AddVariantFromURLPayload": { + "properties": { + "variant_name": { + "type": "string", + "title": "Variant Name" + }, + "url": { + "type": "string", + "title": "Url" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + }, + "base_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Base Name" + }, + "config_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Name" + } + }, + "type": "object", + "required": ["variant_name", "url"], + "title": "AddVariantFromURLPayload" + }, + "AgentaNodeDTO": { + "properties": { + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__LifecycleDTO" + }, + { + "type": "null" + } + ] + }, + "root": { + "$ref": "#/components/schemas/RootDTO" + }, + "tree": { + "$ref": "#/components/schemas/TreeDTO" + }, + "node": { + "$ref": "#/components/schemas/NodeDTO" + }, + "parent": { + "anyOf": [ + { + "$ref": "#/components/schemas/ParentDTO" + }, + { + "type": "null" + } + ] + }, + "time": { + "$ref": "#/components/schemas/TimeDTO" + }, + "status": { + "$ref": "#/components/schemas/StatusDTO" + }, + "exception": { + "anyOf": [ + { + "$ref": "#/components/schemas/ExceptionDTO" + }, + { + "type": "null" + } + ] + }, + "data": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Data" + }, + "metrics": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metrics" + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "refs": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Refs" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/LinkDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + }, + "otel": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelExtraDTO" + }, + { + "type": "null" + } + ] + }, + "nodes": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/SpanDTO" + }, + { + "items": { + "$ref": "#/components/schemas/SpanDTO" + }, + "type": "array" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Nodes" + } + }, + "type": "object", + "required": ["trace_id", "span_id", "root", "tree", "node", "time", "status"], + "title": "AgentaNodeDTO" + }, + "AgentaNodesResponse": { + "properties": { + "nodes": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/AgentaNodeDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Nodes", + "default": [] + }, + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count" + } + }, + "type": "object", + "required": ["version"], + "title": "AgentaNodesResponse" + }, + "AgentaRootDTO": { + "properties": { + "root": { + "$ref": "#/components/schemas/RootDTO" + }, + "trees": { + "items": { + "$ref": "#/components/schemas/AgentaTreeDTO" + }, + "type": "array", + "title": "Trees" + } + }, + "type": "object", + "required": ["root", "trees"], + "title": "AgentaRootDTO" + }, + "AgentaRootsResponse": { + "properties": { + "roots": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/AgentaRootDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Roots", + "default": [] + }, + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count" + } + }, + "type": "object", + "required": ["version"], + "title": "AgentaRootsResponse" + }, + "AgentaTreeDTO": { + "properties": { + "tree": { + "$ref": "#/components/schemas/TreeDTO" + }, + "nodes": { + "items": { + "$ref": "#/components/schemas/AgentaNodeDTO" + }, + "type": "array", + "title": "Nodes" + } + }, + "type": "object", + "required": ["tree", "nodes"], + "title": "AgentaTreeDTO" + }, + "AgentaTreesResponse": { + "properties": { + "trees": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/AgentaTreeDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Trees", + "default": [] + }, + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count" + } + }, + "type": "object", + "required": ["version"], + "title": "AgentaTreesResponse" + }, + "AggregatedResult": { + "properties": { + "evaluator_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/EvaluatorConfig" + }, + { + "additionalProperties": true, + "type": "object" + } + ], + "title": "Evaluator Config" + }, + "result": { + "$ref": "#/components/schemas/Result" + } + }, + "type": "object", + "required": ["evaluator_config", "result"], + "title": "AggregatedResult" + }, + "AnalyticsResponse": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count" + }, + "buckets": { + "items": { + "$ref": "#/components/schemas/BucketDTO" + }, + "type": "array", + "title": "Buckets" + } + }, + "type": "object", + "required": ["version", "buckets"], + "title": "AnalyticsResponse" + }, + "Annotation": { + "properties": { + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "kind": { + "$ref": "#/components/schemas/AnnotationKind", + "default": "custom" + }, + "source": { + "$ref": "#/components/schemas/AnnotationSource", + "default": "api" + }, + "data": { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object", + "title": "Data" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "references": { + "$ref": "#/components/schemas/AnnotationReferences-Output" + }, + "links": { + "additionalProperties": { + "$ref": "#/components/schemas/AnnotationLink-Output" + }, + "type": "object", + "title": "Links" + } + }, + "type": "object", + "required": ["span_id", "trace_id", "data", "references", "links"], + "title": "Annotation" + }, + "AnnotationCreate": { + "properties": { + "kind": { + "$ref": "#/components/schemas/AnnotationKind", + "default": "custom" + }, + "source": { + "$ref": "#/components/schemas/AnnotationSource", + "default": "api" + }, + "data": { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object", + "title": "Data" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "references": { + "$ref": "#/components/schemas/AnnotationReferences-Input" + }, + "links": { + "additionalProperties": { + "$ref": "#/components/schemas/AnnotationLink-Input" + }, + "type": "object", + "title": "Links" + } + }, + "type": "object", + "required": ["data", "references", "links"], + "title": "AnnotationCreate" + }, + "AnnotationCreateRequest": { + "properties": { + "annotation": { + "$ref": "#/components/schemas/AnnotationCreate" + } + }, + "type": "object", + "required": ["annotation"], + "title": "AnnotationCreateRequest" + }, + "AnnotationKind": { + "type": "string", + "enum": ["custom", "human", "auto"], + "title": "AnnotationKind" + }, + "AnnotationLink-Input": { + "properties": { + "span_id": { + "type": "string", + "title": "Span Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "attributes": { + "additionalProperties": true, + "type": "object", + "title": "Attributes" + } + }, + "type": "object", + "required": ["span_id", "trace_id"], + "title": "AnnotationLink" + }, + "AnnotationLink-Output": { + "properties": { + "span_id": { + "type": "string", + "title": "Span Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + } + }, + "type": "object", + "required": ["span_id", "trace_id"], + "title": "AnnotationLink" + }, + "AnnotationLinkResponse": { + "properties": { + "annotation": { + "$ref": "#/components/schemas/AnnotationLink-Output" + } + }, + "type": "object", + "required": ["annotation"], + "title": "AnnotationLinkResponse" + }, + "AnnotationQuery": { + "properties": { + "trace_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Trace Id" + }, + "span_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Span Id" + }, + "kind": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationKind" + }, + { + "type": "null" + } + ], + "default": "custom" + }, + "source": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationSource" + }, + { + "type": "null" + } + ], + "default": "api" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "references": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationReferences-Input" + }, + { + "type": "null" + } + ] + }, + "links": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/AnnotationLink-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "title": "AnnotationQuery" + }, + "AnnotationQueryRequest": { + "properties": { + "annotation": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationQuery" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "AnnotationQueryRequest" + }, + "AnnotationReference-Input": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "attributes": { + "additionalProperties": true, + "type": "object", + "title": "Attributes" + } + }, + "type": "object", + "title": "AnnotationReference" + }, + "AnnotationReference-Output": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + } + }, + "type": "object", + "title": "AnnotationReference" + }, + "AnnotationReferences-Input": { + "properties": { + "evaluator": { + "$ref": "#/components/schemas/AnnotationReference-Input" + }, + "testset": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationReference-Input" + }, + { + "type": "null" + } + ] + }, + "testcase": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationReference-Input" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["evaluator"], + "title": "AnnotationReferences" + }, + "AnnotationReferences-Output": { + "properties": { + "evaluator": { + "$ref": "#/components/schemas/AnnotationReference-Output" + }, + "testset": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationReference-Output" + }, + { + "type": "null" + } + ] + }, + "testcase": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnnotationReference-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["evaluator"], + "title": "AnnotationReferences" + }, + "AnnotationResponse": { + "properties": { + "annotation": { + "anyOf": [ + { + "$ref": "#/components/schemas/Annotation" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "AnnotationResponse" + }, + "AnnotationSource": { + "type": "string", + "enum": ["web", "sdk", "api"], + "title": "AnnotationSource" + }, + "AnnotationsResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "oldest": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Oldest" + }, + "limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Limit" + }, + "annotations": { + "items": { + "$ref": "#/components/schemas/Annotation" + }, + "type": "array", + "title": "Annotations", + "default": [] + } + }, + "type": "object", + "required": ["count"], + "title": "AnnotationsResponse" + }, + "App": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "app_name": { + "type": "string", + "title": "App Name" + }, + "app_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "App Type" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + } + }, + "type": "object", + "required": ["app_id", "app_name", "updated_at"], + "title": "App" + }, + "AppVariantResponse_": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "app_name": { + "type": "string", + "title": "App Name" + }, + "variant_id": { + "type": "string", + "title": "Variant Id" + }, + "variant_name": { + "type": "string", + "title": "Variant Name" + }, + "project_id": { + "type": "string", + "title": "Project Id" + }, + "base_name": { + "type": "string", + "title": "Base Name" + }, + "base_id": { + "type": "string", + "title": "Base Id" + }, + "config_name": { + "type": "string", + "title": "Config Name" + }, + "uri": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Uri" + }, + "revision": { + "type": "integer", + "title": "Revision" + }, + "created_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "modified_by_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Modified By Id" + }, + "organization_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + }, + "workspace_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Workspace Id" + } + }, + "type": "object", + "required": [ + "app_id", + "app_name", + "variant_id", + "variant_name", + "project_id", + "base_name", + "base_id", + "config_name", + "revision" + ], + "title": "AppVariantResponse_" + }, + "AppVariantRevision": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "revision": { + "type": "integer", + "title": "Revision" + }, + "modified_by": { + "type": "string", + "title": "Modified By" + }, + "config": { + "$ref": "#/components/schemas/ConfigDB" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + } + }, + "type": "object", + "required": ["revision", "modified_by", "config", "created_at"], + "title": "AppVariantRevision" + }, + "Artifact-Input": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Flags" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "title": "Artifact" + }, + "Artifact-Output": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Flags" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "title": "Artifact" + }, + "BaseOutput": { + "properties": { + "base_id": { + "type": "string", + "title": "Base Id" + }, + "base_name": { + "type": "string", + "title": "Base Name" + } + }, + "type": "object", + "required": ["base_id", "base_name"], + "title": "BaseOutput" + }, + "Body_configs_add": { + "properties": { + "variant_ref": { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + "application_ref": { + "$ref": "#/components/schemas/ReferenceRequestModel" + } + }, + "type": "object", + "required": ["variant_ref", "application_ref"], + "title": "Body_configs_add" + }, + "Body_configs_delete": { + "properties": { + "variant_ref": { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["variant_ref"], + "title": "Body_configs_delete" + }, + "Body_configs_deploy": { + "properties": { + "variant_ref": { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + "environment_ref": { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["variant_ref", "environment_ref"], + "title": "Body_configs_deploy" + }, + "Body_configs_fetch": { + "properties": { + "variant_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + }, + "environment_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Body_configs_fetch" + }, + "Body_configs_fork": { + "properties": { + "variant_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + }, + "environment_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Body_configs_fork" + }, + "Body_configs_history": { + "properties": { + "variant_ref": { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceRequestModel" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["variant_ref"], + "title": "Body_configs_history" + }, + "Body_create_testset_from_file": { + "properties": { + "file": { + "type": "string", + "format": "binary", + "title": "File" + }, + "file_type": { + "type": "string", + "enum": ["CSV", "JSON"], + "title": "File Type" + }, + "testset_slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Testset Slug" + }, + "testset_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Testset Name" + }, + "testset_description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Testset Description" + }, + "testset_metadata": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Testset Metadata" + } + }, + "type": "object", + "required": ["file"], + "title": "Body_create_testset_from_file" + }, + "Body_fetch_workflow_revision": { + "properties": { + "variant_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__Reference" + }, + { + "type": "null" + } + ] + }, + "revision_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__Reference" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Body_fetch_workflow_revision" + }, + "Body_import_testset": { + "properties": { + "endpoint": { + "type": "string", + "title": "Endpoint" + }, + "testset_name": { + "type": "string", + "title": "Testset Name" + } + }, + "type": "object", + "title": "Body_import_testset" + }, + "Body_log_workflow_revisions": { + "properties": { + "variant_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__Reference" + }, + { + "type": "null" + } + ] + }, + "revision_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__Reference" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Body_log_workflow_revisions" + }, + "Body_update_testset_from_file": { + "properties": { + "file": { + "type": "string", + "format": "binary", + "title": "File" + }, + "file_type": { + "type": "string", + "enum": ["CSV", "JSON"], + "title": "File Type" + } + }, + "type": "object", + "required": ["file"], + "title": "Body_update_testset_from_file" + }, + "Body_upload_file": { + "properties": { + "upload_type": { + "type": "string", + "title": "Upload Type" + }, + "file": { + "type": "string", + "format": "binary", + "title": "File" + }, + "testset_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Testset Name" + } + }, + "type": "object", + "required": ["file"], + "title": "Body_upload_file" + }, + "BucketDTO": { + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp" + }, + "window": { + "type": "integer", + "title": "Window" + }, + "total": { + "$ref": "#/components/schemas/MetricsDTO" + }, + "error": { + "$ref": "#/components/schemas/MetricsDTO" + } + }, + "type": "object", + "required": ["timestamp", "window", "total", "error"], + "title": "BucketDTO" + }, + "CollectStatusResponse": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "status": { + "type": "string", + "title": "Status" + } + }, + "type": "object", + "required": ["version", "status"], + "title": "CollectStatusResponse" + }, + "ConfigDB": { + "properties": { + "config_name": { + "type": "string", + "title": "Config Name" + }, + "parameters": { + "additionalProperties": true, + "type": "object", + "title": "Parameters" + } + }, + "type": "object", + "required": ["config_name"], + "title": "ConfigDB" + }, + "ConfigDTO": { + "properties": { + "params": { + "additionalProperties": true, + "type": "object", + "title": "Params" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url" + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "service_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "variant_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "environment_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "application_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/LifecycleDTO-Input" + }, + { + "type": "null" + } + ] + }, + "service_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/LifecycleDTO-Input" + }, + { + "type": "null" + } + ] + }, + "variant_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/LifecycleDTO-Input" + }, + { + "type": "null" + } + ] + }, + "environment_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/LifecycleDTO-Input" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["params"], + "title": "ConfigDTO" + }, + "ConfigRequest": { + "properties": { + "config": { + "$ref": "#/components/schemas/ConfigDTO" + } + }, + "type": "object", + "required": ["config"], + "title": "ConfigRequest" + }, + "ConfigResponseModel": { + "properties": { + "params": { + "additionalProperties": true, + "type": "object", + "title": "Params" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url" + }, + "application_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "service_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "variant_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "environment_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceDTO" + }, + { + "type": "null" + } + ] + }, + "application_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__services__variants_manager__LifecycleDTO" + }, + { + "type": "null" + } + ] + }, + "service_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__services__variants_manager__LifecycleDTO" + }, + { + "type": "null" + } + ] + }, + "variant_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__services__variants_manager__LifecycleDTO" + }, + { + "type": "null" + } + ] + }, + "environment_lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__services__variants_manager__LifecycleDTO" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["params"], + "title": "ConfigResponseModel" + }, + "CorrectAnswer": { + "properties": { + "key": { + "type": "string", + "title": "Key" + }, + "value": { + "type": "string", + "title": "Value" + } + }, + "type": "object", + "required": ["key", "value"], + "title": "CorrectAnswer" + }, + "CreateAppOutput": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "app_name": { + "type": "string", + "title": "App Name" + } + }, + "type": "object", + "required": ["app_id", "app_name"], + "title": "CreateAppOutput" + }, + "CreateApp_": { + "properties": { + "app_name": { + "type": "string", + "title": "App Name" + }, + "template_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Template Key" + }, + "project_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Project Id" + }, + "workspace_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Workspace Id" + }, + "organization_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + } + }, + "type": "object", + "required": ["app_name"], + "title": "CreateApp_" + }, + "CreateSecretDTO": { + "properties": { + "header": { + "$ref": "#/components/schemas/Header" + }, + "secret": { + "$ref": "#/components/schemas/SecretDTO" + } + }, + "type": "object", + "required": ["header", "secret"], + "title": "CreateSecretDTO" + }, + "CreateWorkspace": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + } + }, + "type": "object", + "required": ["name"], + "title": "CreateWorkspace" + }, + "CustomModelSettingsDTO": { + "properties": { + "slug": { + "type": "string", + "title": "Slug" + }, + "extras": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Extras" + } + }, + "type": "object", + "required": ["slug"], + "title": "CustomModelSettingsDTO" + }, + "CustomProviderDTO": { + "properties": { + "kind": { + "$ref": "#/components/schemas/CustomProviderKind" + }, + "provider": { + "$ref": "#/components/schemas/CustomProviderSettingsDTO" + }, + "models": { + "items": { + "$ref": "#/components/schemas/CustomModelSettingsDTO" + }, + "type": "array", + "title": "Models" + }, + "provider_slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Provider Slug" + }, + "model_keys": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Model Keys" + } + }, + "type": "object", + "required": ["kind", "provider", "models"], + "title": "CustomProviderDTO" + }, + "CustomProviderKind": { + "type": "string", + "enum": [ + "custom", + "azure", + "bedrock", + "sagemaker", + "vertex", + "openai", + "cohere", + "anyscale", + "deepinfra", + "alephalpha", + "groq", + "mistralai", + "anthropic", + "perplexityai", + "togetherai", + "openrouter", + "gemini" + ], + "title": "CustomProviderKind" + }, + "CustomProviderSettingsDTO": { + "properties": { + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Key" + }, + "extras": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Extras" + } + }, + "type": "object", + "title": "CustomProviderSettingsDTO" + }, + "DeleteEvaluation": { + "properties": { + "evaluations_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Evaluations Ids" + } + }, + "type": "object", + "required": ["evaluations_ids"], + "title": "DeleteEvaluation" + }, + "DeleteTestsets": { + "properties": { + "testset_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Testset Ids" + } + }, + "type": "object", + "required": ["testset_ids"], + "title": "DeleteTestsets" + }, + "DeployToEnvironmentPayload": { + "properties": { + "environment_name": { + "type": "string", + "title": "Environment Name" + }, + "variant_id": { + "type": "string", + "title": "Variant Id" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + } + }, + "type": "object", + "required": ["environment_name", "variant_id"], + "title": "DeployToEnvironmentPayload" + }, + "EntitiesRequestModel": { + "properties": { + "users": { + "additionalProperties": { + "$ref": "#/components/schemas/UserRequest" + }, + "type": "object", + "title": "Users" + }, + "organizations": { + "additionalProperties": { + "$ref": "#/components/schemas/OrganizationRequest" + }, + "type": "object", + "title": "Organizations" + }, + "workspaces": { + "additionalProperties": { + "$ref": "#/components/schemas/WorkspaceRequest" + }, + "type": "object", + "title": "Workspaces" + }, + "projects": { + "additionalProperties": { + "$ref": "#/components/schemas/ProjectRequest" + }, + "type": "object", + "title": "Projects" + }, + "organization_memberships": { + "additionalProperties": { + "$ref": "#/components/schemas/OrganizationMembershipRequest" + }, + "type": "object", + "title": "Organization Memberships" + }, + "workspace_memberships": { + "additionalProperties": { + "$ref": "#/components/schemas/WorkspaceMembershipRequest" + }, + "type": "object", + "title": "Workspace Memberships" + }, + "project_memberships": { + "additionalProperties": { + "$ref": "#/components/schemas/ProjectMembershipRequest" + }, + "type": "object", + "title": "Project Memberships" + } + }, + "type": "object", + "required": [ + "users", + "organizations", + "workspaces", + "projects", + "organization_memberships", + "workspace_memberships", + "project_memberships" + ], + "title": "EntitiesRequestModel" + }, + "EnvironmentOutputExtended_": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "app_id": { + "type": "string", + "title": "App Id" + }, + "project_id": { + "type": "string", + "title": "Project Id" + }, + "deployed_app_variant_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed App Variant Id" + }, + "deployed_variant_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed Variant Name" + }, + "deployed_app_variant_revision_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed App Variant Revision Id" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + }, + "revisions": { + "items": { + "$ref": "#/components/schemas/EnvironmentRevision" + }, + "type": "array", + "title": "Revisions" + }, + "organization_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + }, + "workspace_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Workspace Id" + } + }, + "type": "object", + "required": [ + "name", + "app_id", + "project_id", + "deployed_app_variant_id", + "deployed_variant_name", + "deployed_app_variant_revision_id", + "revision", + "revisions" + ], + "title": "EnvironmentOutputExtended_" + }, + "EnvironmentOutput_": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "app_id": { + "type": "string", + "title": "App Id" + }, + "project_id": { + "type": "string", + "title": "Project Id" + }, + "deployed_app_variant_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed App Variant Id" + }, + "deployed_variant_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed Variant Name" + }, + "deployed_app_variant_revision_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed App Variant Revision Id" + }, + "revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Revision" + }, + "organization_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + }, + "workspace_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Workspace Id" + } + }, + "type": "object", + "required": [ + "name", + "app_id", + "project_id", + "deployed_app_variant_id", + "deployed_variant_name", + "deployed_app_variant_revision_id", + "revision" + ], + "title": "EnvironmentOutput_" + }, + "EnvironmentRevision": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "revision": { + "type": "integer", + "title": "Revision" + }, + "modified_by": { + "type": "string", + "title": "Modified By" + }, + "deployed_app_variant_revision": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed App Variant Revision" + }, + "deployment": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployment" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "deployed_variant_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Deployed Variant Name" + } + }, + "type": "object", + "required": ["id", "revision", "modified_by", "created_at"], + "title": "EnvironmentRevision" + }, + "Error": { + "properties": { + "message": { + "type": "string", + "title": "Message" + }, + "stacktrace": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Stacktrace" + } + }, + "type": "object", + "required": ["message"], + "title": "Error" + }, + "Evaluation": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "app_id": { + "type": "string", + "title": "App Id" + }, + "project_id": { + "type": "string", + "title": "Project Id" + }, + "variant_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Ids" + }, + "variant_names": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Names" + }, + "variant_revision_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Revision Ids" + }, + "revisions": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Revisions" + }, + "testset_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Testset Id" + }, + "testset_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Testset Name" + }, + "status": { + "$ref": "#/components/schemas/Result" + }, + "aggregated_results": { + "items": { + "$ref": "#/components/schemas/AggregatedResult" + }, + "type": "array", + "title": "Aggregated Results" + }, + "average_cost": { + "anyOf": [ + { + "$ref": "#/components/schemas/Result" + }, + { + "type": "null" + } + ] + }, + "total_cost": { + "anyOf": [ + { + "$ref": "#/components/schemas/Result" + }, + { + "type": "null" + } + ] + }, + "average_latency": { + "anyOf": [ + { + "$ref": "#/components/schemas/Result" + }, + { + "type": "null" + } + ] + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "app_id", + "project_id", + "variant_ids", + "variant_names", + "variant_revision_ids", + "revisions", + "status", + "aggregated_results", + "created_at", + "updated_at" + ], + "title": "Evaluation" + }, + "EvaluationScenario": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "evaluation_id": { + "type": "string", + "title": "Evaluation Id" + }, + "inputs": { + "items": { + "$ref": "#/components/schemas/EvaluationScenarioInput" + }, + "type": "array", + "title": "Inputs" + }, + "outputs": { + "items": { + "$ref": "#/components/schemas/EvaluationScenarioOutput" + }, + "type": "array", + "title": "Outputs" + }, + "correct_answers": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/CorrectAnswer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Correct Answers" + }, + "is_pinned": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Pinned" + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Note" + }, + "results": { + "items": { + "$ref": "#/components/schemas/EvaluationScenarioResult" + }, + "type": "array", + "title": "Results" + } + }, + "type": "object", + "required": ["evaluation_id", "inputs", "outputs", "results"], + "title": "EvaluationScenario" + }, + "EvaluationScenarioInput": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "type": "string", + "title": "Type" + }, + "value": { + "title": "Value" + } + }, + "type": "object", + "required": ["name", "type", "value"], + "title": "EvaluationScenarioInput" + }, + "EvaluationScenarioOutput": { + "properties": { + "result": { + "$ref": "#/components/schemas/Result" + }, + "cost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Cost" + }, + "latency": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Latency" + } + }, + "type": "object", + "required": ["result"], + "title": "EvaluationScenarioOutput" + }, + "EvaluationScenarioResult": { + "properties": { + "evaluator_config": { + "type": "string", + "title": "Evaluator Config" + }, + "result": { + "$ref": "#/components/schemas/Result" + } + }, + "type": "object", + "required": ["evaluator_config", "result"], + "title": "EvaluationScenarioResult" + }, + "EvaluationScenarioScoreUpdate": { + "properties": { + "score": { + "type": "number", + "title": "Score" + } + }, + "type": "object", + "required": ["score"], + "title": "EvaluationScenarioScoreUpdate" + }, + "EvaluationStatusEnum": { + "type": "string", + "enum": [ + "EVALUATION_INITIALIZED", + "EVALUATION_STARTED", + "EVALUATION_FINISHED", + "EVALUATION_FINISHED_WITH_ERRORS", + "EVALUATION_FAILED", + "EVALUATION_AGGREGATION_FAILED" + ], + "title": "EvaluationStatusEnum" + }, + "EvaluationType": { + "type": "string", + "enum": ["human_a_b_testing", "single_model_test"], + "title": "EvaluationType" + }, + "Evaluator-Input": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowData" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Evaluator" + }, + "EvaluatorConfig": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "project_id": { + "type": "string", + "title": "Project Id" + }, + "evaluator_key": { + "type": "string", + "title": "Evaluator Key" + }, + "settings_values": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Settings Values" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + } + }, + "type": "object", + "required": ["id", "name", "project_id", "evaluator_key", "created_at", "updated_at"], + "title": "EvaluatorConfig" + }, + "EvaluatorInputInterface": { + "properties": { + "inputs": { + "additionalProperties": true, + "type": "object", + "title": "Inputs" + }, + "settings": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Settings" + }, + "credentials": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Credentials" + } + }, + "type": "object", + "title": "EvaluatorInputInterface" + }, + "EvaluatorMappingInputInterface": { + "properties": { + "inputs": { + "additionalProperties": true, + "type": "object", + "title": "Inputs" + }, + "mapping": { + "additionalProperties": true, + "type": "object", + "title": "Mapping" + } + }, + "type": "object", + "required": ["inputs", "mapping"], + "title": "EvaluatorMappingInputInterface" + }, + "EvaluatorMappingOutputInterface": { + "properties": { + "outputs": { + "additionalProperties": true, + "type": "object", + "title": "Outputs" + } + }, + "type": "object", + "required": ["outputs"], + "title": "EvaluatorMappingOutputInterface" + }, + "EvaluatorOutputInterface": { + "properties": { + "outputs": { + "additionalProperties": true, + "type": "object", + "title": "Outputs" + } + }, + "type": "object", + "required": ["outputs"], + "title": "EvaluatorOutputInterface" + }, + "EvaluatorQueryRequest": { + "properties": { + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object", + "title": "Metadata" + } + }, + "type": "object", + "required": ["metadata"], + "title": "EvaluatorQueryRequest" + }, + "EvaluatorRequest": { + "properties": { + "evaluator": { + "$ref": "#/components/schemas/Evaluator-Input" + } + }, + "type": "object", + "required": ["evaluator"], + "title": "EvaluatorRequest" + }, + "EvaluatorResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "evaluator": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__apis__fastapi__evaluators__models__Evaluator-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["count"], + "title": "EvaluatorResponse" + }, + "EvaluatorsResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "evaluator": { + "items": { + "$ref": "#/components/schemas/oss__src__apis__fastapi__evaluators__models__Evaluator-Output" + }, + "type": "array", + "title": "Evaluator", + "default": [] + } + }, + "type": "object", + "required": ["count"], + "title": "EvaluatorsResponse" + }, + "ExceptionDTO": { + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp" + }, + "type": { + "type": "string", + "title": "Type" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "stacktrace": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Stacktrace" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["timestamp", "type"], + "title": "ExceptionDTO" + }, + "Focus": { + "type": "string", + "enum": ["trace", "span"], + "title": "Focus" + }, + "Format": { + "type": "string", + "enum": ["agenta", "opentelemetry"], + "title": "Format" + }, + "FullJson-Input": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "items": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "FullJson-Output": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "items": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "GetConfigResponse": { + "properties": { + "config_name": { + "type": "string", + "title": "Config Name" + }, + "current_version": { + "type": "integer", + "title": "Current Version" + }, + "parameters": { + "additionalProperties": true, + "type": "object", + "title": "Parameters" + } + }, + "type": "object", + "required": ["config_name", "current_version", "parameters"], + "title": "GetConfigResponse" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "Header": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + } + }, + "type": "object", + "title": "Header" + }, + "HumanEvaluation": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "app_id": { + "type": "string", + "title": "App Id" + }, + "project_id": { + "type": "string", + "title": "Project Id" + }, + "evaluation_type": { + "type": "string", + "title": "Evaluation Type" + }, + "variant_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Ids" + }, + "variant_names": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Names" + }, + "variants_revision_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variants Revision Ids" + }, + "revisions": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Revisions" + }, + "testset_id": { + "type": "string", + "title": "Testset Id" + }, + "testset_name": { + "type": "string", + "title": "Testset Name" + }, + "status": { + "type": "string", + "title": "Status" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "app_id", + "project_id", + "evaluation_type", + "variant_ids", + "variant_names", + "variants_revision_ids", + "revisions", + "testset_id", + "testset_name", + "status", + "created_at", + "updated_at" + ], + "title": "HumanEvaluation" + }, + "HumanEvaluationScenario": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "evaluation_id": { + "type": "string", + "title": "Evaluation Id" + }, + "inputs": { + "items": { + "$ref": "#/components/schemas/HumanEvaluationScenarioInput" + }, + "type": "array", + "title": "Inputs" + }, + "outputs": { + "items": { + "$ref": "#/components/schemas/HumanEvaluationScenarioOutput" + }, + "type": "array", + "title": "Outputs" + }, + "vote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vote" + }, + "score": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Score" + }, + "correct_answer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Correct Answer" + }, + "is_pinned": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Pinned" + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Note" + } + }, + "type": "object", + "required": ["evaluation_id", "inputs", "outputs"], + "title": "HumanEvaluationScenario" + }, + "HumanEvaluationScenarioInput": { + "properties": { + "input_name": { + "type": "string", + "title": "Input Name" + }, + "input_value": { + "type": "string", + "title": "Input Value" + } + }, + "type": "object", + "required": ["input_name", "input_value"], + "title": "HumanEvaluationScenarioInput" + }, + "HumanEvaluationScenarioOutput": { + "properties": { + "variant_id": { + "type": "string", + "title": "Variant Id" + }, + "variant_output": { + "type": "string", + "title": "Variant Output" + } + }, + "type": "object", + "required": ["variant_id", "variant_output"], + "title": "HumanEvaluationScenarioOutput" + }, + "HumanEvaluationScenarioUpdate": { + "properties": { + "vote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vote" + }, + "score": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Score" + }, + "correct_answer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Correct Answer" + }, + "outputs": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/HumanEvaluationScenarioOutput" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Outputs" + }, + "inputs": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/HumanEvaluationScenarioInput" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Inputs" + }, + "is_pinned": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Pinned" + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Note" + } + }, + "type": "object", + "title": "HumanEvaluationScenarioUpdate" + }, + "HumanEvaluationUpdate": { + "properties": { + "status": { + "anyOf": [ + { + "$ref": "#/components/schemas/EvaluationStatusEnum" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "HumanEvaluationUpdate" + }, + "InviteRequest": { + "properties": { + "email": { + "type": "string", + "title": "Email" + }, + "roles": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Roles" + } + }, + "type": "object", + "required": ["email"], + "title": "InviteRequest" + }, + "InviteToken": { + "properties": { + "token": { + "type": "string", + "title": "Token" + }, + "email": { + "type": "string", + "title": "Email" + } + }, + "type": "object", + "required": ["token", "email"], + "title": "InviteToken" + }, + "LLMRunRateLimit": { + "properties": { + "batch_size": { + "type": "integer", + "title": "Batch Size" + }, + "max_retries": { + "type": "integer", + "title": "Max Retries" + }, + "retry_delay": { + "type": "integer", + "title": "Retry Delay" + }, + "delay_between_batches": { + "type": "integer", + "title": "Delay Between Batches" + } + }, + "type": "object", + "required": ["batch_size", "max_retries", "retry_delay", "delay_between_batches"], + "title": "LLMRunRateLimit" + }, + "LegacyAnalyticsResponse": { + "properties": { + "total_count": { + "type": "integer", + "title": "Total Count" + }, + "failure_rate": { + "type": "number", + "title": "Failure Rate" + }, + "total_cost": { + "type": "number", + "title": "Total Cost" + }, + "avg_cost": { + "type": "number", + "title": "Avg Cost" + }, + "avg_latency": { + "type": "number", + "title": "Avg Latency" + }, + "total_tokens": { + "type": "integer", + "title": "Total Tokens" + }, + "avg_tokens": { + "type": "number", + "title": "Avg Tokens" + }, + "data": { + "items": { + "$ref": "#/components/schemas/LegacyDataPoint" + }, + "type": "array", + "title": "Data" + } + }, + "type": "object", + "required": [ + "total_count", + "failure_rate", + "total_cost", + "avg_cost", + "avg_latency", + "total_tokens", + "avg_tokens", + "data" + ], + "title": "LegacyAnalyticsResponse" + }, + "LegacyDataPoint": { + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp" + }, + "success_count": { + "type": "integer", + "title": "Success Count" + }, + "failure_count": { + "type": "integer", + "title": "Failure Count" + }, + "cost": { + "type": "number", + "title": "Cost" + }, + "latency": { + "type": "number", + "title": "Latency" + }, + "total_tokens": { + "type": "integer", + "title": "Total Tokens" + } + }, + "type": "object", + "required": ["timestamp", "success_count", "failure_count", "cost", "latency", "total_tokens"], + "title": "LegacyDataPoint" + }, + "LegacyScopeRequest": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + } + }, + "type": "object", + "title": "LegacyScopeRequest" + }, + "LegacyScopesResponse": { + "properties": { + "organization_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + }, + "organization_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Organization Name" + }, + "workspace_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Workspace Id" + }, + "workspace_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Workspace Name" + }, + "project_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Project Id" + }, + "project_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Project Name" + }, + "is_demo": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Demo" + }, + "user_role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Role" + }, + "credentials": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Credentials" + } + }, + "type": "object", + "title": "LegacyScopesResponse" + }, + "LegacySubscriptionRequest": { + "properties": { + "plan": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Plan" + } + }, + "type": "object", + "title": "LegacySubscriptionRequest" + }, + "LegacyUserRequest": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + } + }, + "type": "object", + "title": "LegacyUserRequest" + }, + "LegacyUserResponse": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + } + }, + "type": "object", + "title": "LegacyUserResponse" + }, + "LifecycleDTO-Input": { + "properties": { + "created_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "updated_by": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated By" + } + }, + "type": "object", + "title": "LifecycleDTO" + }, + "LinkDTO": { + "properties": { + "type": { + "$ref": "#/components/schemas/TreeType" + }, + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "tree_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Tree Id" + } + }, + "type": "object", + "required": ["type", "id"], + "title": "LinkDTO" + }, + "ListAPIKeysResponse": { + "properties": { + "prefix": { + "type": "string", + "title": "Prefix" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "last_used_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Used At" + }, + "expiration_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Expiration Date" + } + }, + "type": "object", + "required": ["prefix", "created_at"], + "title": "ListAPIKeysResponse" + }, + "MetricsDTO": { + "properties": { + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count", + "default": 0 + }, + "duration": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Duration", + "default": 0 + }, + "cost": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Cost", + "default": 0 + }, + "tokens": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Tokens", + "default": 0 + } + }, + "type": "object", + "title": "MetricsDTO" + }, + "NewEvaluation": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "revisions_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Revisions Ids" + }, + "evaluators_configs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Evaluators Configs" + }, + "testset_id": { + "type": "string", + "title": "Testset Id" + }, + "rate_limit": { + "$ref": "#/components/schemas/LLMRunRateLimit" + }, + "correct_answer_column": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Correct Answer Column" + } + }, + "type": "object", + "required": ["app_id", "revisions_ids", "evaluators_configs", "testset_id", "rate_limit"], + "title": "NewEvaluation" + }, + "NewEvaluatorConfig": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "evaluator_key": { + "type": "string", + "title": "Evaluator Key" + }, + "settings_values": { + "additionalProperties": true, + "type": "object", + "title": "Settings Values" + } + }, + "type": "object", + "required": ["app_id", "name", "evaluator_key", "settings_values"], + "title": "NewEvaluatorConfig" + }, + "NewHumanEvaluation": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "variant_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Ids" + }, + "evaluation_type": { + "$ref": "#/components/schemas/EvaluationType" + }, + "inputs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Inputs" + }, + "testset_id": { + "type": "string", + "title": "Testset Id" + }, + "status": { + "type": "string", + "title": "Status" + } + }, + "type": "object", + "required": ["app_id", "variant_ids", "evaluation_type", "inputs", "testset_id", "status"], + "title": "NewHumanEvaluation" + }, + "NewTestset": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "csvdata": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array", + "title": "Csvdata" + } + }, + "type": "object", + "required": ["name", "csvdata"], + "title": "NewTestset" + }, + "NodeDTO": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "anyOf": [ + { + "$ref": "#/components/schemas/NodeType" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["id", "name"], + "title": "NodeDTO" + }, + "NodeType": { + "type": "string", + "enum": ["agent", "workflow", "chain", "task", "tool", "embedding", "query", "completion", "chat", "rerank"], + "title": "NodeType" + }, + "OTelContextDTO": { + "properties": { + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + } + }, + "type": "object", + "required": ["trace_id", "span_id"], + "title": "OTelContextDTO" + }, + "OTelEvent-Input": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "timestamp": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + } + ], + "title": "Timestamp" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["name", "timestamp"], + "title": "OTelEvent" + }, + "OTelEvent-Output": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "timestamp": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + } + ], + "title": "Timestamp" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["name", "timestamp"], + "title": "OTelEvent" + }, + "OTelEventDTO": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "timestamp": { + "type": "string", + "title": "Timestamp" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["name", "timestamp"], + "title": "OTelEventDTO" + }, + "OTelExtraDTO": { + "properties": { + "kind": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Kind" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + }, + "events": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelEventDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Events" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLinkDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "title": "OTelExtraDTO" + }, + "OTelFlatSpan-Input": { + "properties": { + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "parent_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Id" + }, + "span_kind": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpanKind" + }, + { + "type": "null" + } + ] + }, + "span_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Span Name" + }, + "start_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Start Time" + }, + "end_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "End Time" + }, + "status_code": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelStatusCode-Input" + }, + { + "type": "null" + } + ] + }, + "status_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status Message" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + }, + "events": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelEvent-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Events" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLink-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "required": ["trace_id", "span_id"], + "title": "OTelFlatSpan" + }, + "OTelFlatSpan-Output": { + "properties": { + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "parent_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Id" + }, + "span_kind": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpanKind" + }, + { + "type": "null" + } + ] + }, + "span_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Span Name" + }, + "start_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Start Time" + }, + "end_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "End Time" + }, + "status_code": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__tracing__dtos__OTelStatusCode" + }, + { + "type": "null" + } + ] + }, + "status_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status Message" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + }, + "events": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelEvent-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Events" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLink-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "required": ["trace_id", "span_id"], + "title": "OTelFlatSpan" + }, + "OTelLink-Input": { + "properties": { + "span_id": { + "type": "string", + "title": "Span Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["span_id", "trace_id"], + "title": "OTelLink" + }, + "OTelLink-Output": { + "properties": { + "span_id": { + "type": "string", + "title": "Span Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["span_id", "trace_id"], + "title": "OTelLink" + }, + "OTelLinkDTO": { + "properties": { + "context": { + "$ref": "#/components/schemas/OTelContextDTO" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "required": ["context"], + "title": "OTelLinkDTO" + }, + "OTelLinksResponse": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLink-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "required": ["version", "count"], + "title": "OTelLinksResponse" + }, + "OTelSpan-Input": { + "properties": { + "spans": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpan-Input" + }, + { + "items": { + "$ref": "#/components/schemas/OTelSpan-Input" + }, + "type": "array" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Spans" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "parent_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Id" + }, + "span_kind": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpanKind" + }, + { + "type": "null" + } + ] + }, + "span_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Span Name" + }, + "start_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Start Time" + }, + "end_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "End Time" + }, + "status_code": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelStatusCode-Input" + }, + { + "type": "null" + } + ] + }, + "status_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status Message" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + }, + "events": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelEvent-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Events" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLink-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "required": ["trace_id", "span_id"], + "title": "OTelSpan" + }, + "OTelSpan-Output": { + "properties": { + "spans": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpan-Output" + }, + { + "items": { + "$ref": "#/components/schemas/OTelSpan-Output" + }, + "type": "array" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Spans" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "parent_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Id" + }, + "span_kind": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpanKind" + }, + { + "type": "null" + } + ] + }, + "span_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Span Name" + }, + "start_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Start Time" + }, + "end_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "End Time" + }, + "status_code": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__tracing__dtos__OTelStatusCode" + }, + { + "type": "null" + } + ] + }, + "status_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status Message" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + }, + "events": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelEvent-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Events" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLink-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "required": ["trace_id", "span_id"], + "title": "OTelSpan" + }, + "OTelSpanDTO": { + "properties": { + "context": { + "$ref": "#/components/schemas/OTelContextDTO" + }, + "name": { + "type": "string", + "title": "Name" + }, + "kind": { + "$ref": "#/components/schemas/OTelSpanKind", + "default": "SPAN_KIND_UNSPECIFIED" + }, + "start_time": { + "type": "string", + "format": "date-time", + "title": "Start Time" + }, + "end_time": { + "type": "string", + "format": "date-time", + "title": "End Time" + }, + "status_code": { + "$ref": "#/components/schemas/oss__src__core__observability__dtos__OTelStatusCode", + "default": "STATUS_CODE_UNSET" + }, + "status_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status Message" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + }, + "events": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelEventDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Events" + }, + "parent": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelContextDTO" + }, + { + "type": "null" + } + ] + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelLinkDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + } + }, + "type": "object", + "required": ["context", "name", "start_time", "end_time"], + "title": "OTelSpanDTO" + }, + "OTelSpanKind": { + "type": "string", + "enum": [ + "SPAN_KIND_UNSPECIFIED", + "SPAN_KIND_INTERNAL", + "SPAN_KIND_SERVER", + "SPAN_KIND_CLIENT", + "SPAN_KIND_PRODUCER", + "SPAN_KIND_CONSUMER" + ], + "title": "OTelSpanKind" + }, + "OTelSpansTree-Input": { + "properties": { + "spans": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpan-Input" + }, + { + "items": { + "$ref": "#/components/schemas/OTelSpan-Input" + }, + "type": "array" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Spans" + } + }, + "type": "object", + "title": "OTelSpansTree" + }, + "OTelSpansTree-Output": { + "properties": { + "spans": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelSpan-Output" + }, + { + "items": { + "$ref": "#/components/schemas/OTelSpan-Output" + }, + "type": "array" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Spans" + } + }, + "type": "object", + "title": "OTelSpansTree" + }, + "OTelStatusCode-Input": { + "type": "string", + "enum": ["STATUS_CODE_UNSET", "STATUS_CODE_OK", "STATUS_CODE_ERROR"], + "title": "OTelStatusCode" + }, + "OTelTracingRequest": { + "properties": { + "spans": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelFlatSpan-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Spans" + }, + "traces": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/OTelSpansTree-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Traces" + } + }, + "type": "object", + "title": "OTelTracingRequest" + }, + "Organization": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "owner": { + "type": "string", + "title": "Owner" + }, + "description": { + "type": "string", + "title": "Description" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + }, + "workspaces": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Workspaces" + } + }, + "type": "object", + "required": ["id", "name", "owner", "description"], + "title": "Organization" + }, + "OrganizationDetails": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "owner": { + "type": "string", + "title": "Owner" + }, + "description": { + "type": "string", + "title": "Description" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + }, + "workspaces": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Workspaces" + }, + "default_workspace": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Default Workspace" + } + }, + "type": "object", + "required": ["id", "name", "owner", "description"], + "title": "OrganizationDetails" + }, + "OrganizationMembershipRequest": { + "properties": { + "role": { + "type": "string", + "enum": ["owner", "viewer", "editor", "evaluator", "workspace_admin", "deployment_manager"], + "title": "Role" + }, + "is_demo": { + "type": "boolean", + "title": "Is Demo" + }, + "user_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + }, + "organization_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + } + }, + "type": "object", + "required": ["role", "is_demo", "user_ref", "organization_ref"], + "title": "OrganizationMembershipRequest" + }, + "OrganizationOutput": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": ["id", "name"], + "title": "OrganizationOutput" + }, + "OrganizationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "is_paying": { + "type": "boolean", + "title": "Is Paying" + } + }, + "type": "object", + "required": ["name", "description", "is_paying"], + "title": "OrganizationRequest" + }, + "OrganizationUpdate": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated At" + } + }, + "type": "object", + "title": "OrganizationUpdate" + }, + "ParentDTO": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + } + }, + "type": "object", + "required": ["id"], + "title": "ParentDTO" + }, + "Permission": { + "type": "string", + "enum": [ + "read_system", + "view_application", + "edit_application", + "create_application", + "delete_application", + "create_app_variant", + "delete_app_variant", + "modify_variant_configurations", + "delete_application_variant", + "run_service", + "create_secret", + "view_secret", + "update_secret", + "delete_secret", + "view_app_environment_deployment", + "edit_app_environment_deployment", + "create_app_environment_deployment", + "view_testset", + "edit_testset", + "create_testset", + "delete_testset", + "view_evaluation", + "run_evaluations", + "edit_evaluation", + "create_evaluation", + "delete_evaluation", + "deploy_application", + "view_workspace", + "edit_workspace", + "create_workspace", + "delete_workspace", + "modify_user_roles", + "add_new_user_to_workspace", + "edit_organization", + "delete_organization", + "add_new_user_to_organization", + "reset_password", + "view_billing", + "edit_billing", + "view_workflows", + "edit_workflows", + "view_evaluators", + "edit_evaluators", + "view_testsets", + "edit_testsets", + "view_annotations", + "edit_annotations", + "delete_annotations" + ], + "title": "Permission" + }, + "Plan": { + "type": "string", + "enum": ["cloud_v0_hobby", "cloud_v0_pro", "cloud_v0_humanity_labs", "cloud_v0_x_labs", "cloud_v0_agenta_ai"], + "title": "Plan" + }, + "ProjectMembershipRequest": { + "properties": { + "role": { + "type": "string", + "enum": ["owner", "viewer", "editor", "evaluator", "workspace_admin", "deployment_manager"], + "title": "Role" + }, + "is_demo": { + "type": "boolean", + "title": "Is Demo" + }, + "user_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + }, + "project_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + } + }, + "type": "object", + "required": ["role", "is_demo", "user_ref", "project_ref"], + "title": "ProjectMembershipRequest" + }, + "ProjectRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "is_default": { + "type": "boolean", + "title": "Is Default" + }, + "workspace_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + }, + "organization_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + } + }, + "type": "object", + "required": ["name", "description", "is_default", "workspace_ref", "organization_ref"], + "title": "ProjectRequest" + }, + "ProjectScope": { + "properties": { + "credentials": { + "type": "string", + "title": "Credentials" + }, + "role": { + "type": "string", + "enum": ["owner", "viewer", "editor", "evaluator", "workspace_admin", "deployment_manager"], + "title": "Role" + }, + "tier": { + "type": "string", + "title": "Tier" + }, + "user": { + "$ref": "#/components/schemas/Reference-Output" + }, + "project": { + "$ref": "#/components/schemas/Reference-Output" + }, + "workspace": { + "$ref": "#/components/schemas/Reference-Output" + }, + "organization": { + "$ref": "#/components/schemas/Reference-Output" + } + }, + "type": "object", + "required": ["credentials", "role", "tier", "user", "project", "workspace", "organization"], + "title": "ProjectScope" + }, + "ProjectsResponse": { + "properties": { + "organization_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + }, + "organization_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Organization Name" + }, + "workspace_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Workspace Id" + }, + "workspace_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Workspace Name" + }, + "project_id": { + "type": "string", + "format": "uuid", + "title": "Project Id" + }, + "project_name": { + "type": "string", + "title": "Project Name" + }, + "user_role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Role" + }, + "is_demo": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Demo" + } + }, + "type": "object", + "required": ["project_id", "project_name"], + "title": "ProjectsResponse" + }, + "Reference-Output": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + } + }, + "type": "object", + "title": "Reference" + }, + "ReferenceDTO": { + "properties": { + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "version": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + } + }, + "type": "object", + "required": ["id"], + "title": "ReferenceDTO" + }, + "ReferenceRequest": { + "properties": { + "application_ref": { + "$ref": "#/components/schemas/ReferenceDTO" + } + }, + "type": "object", + "required": ["application_ref"], + "title": "ReferenceRequest" + }, + "ReferenceRequestModel": { + "properties": { + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "version": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + } + }, + "type": "object", + "title": "ReferenceRequestModel" + }, + "ResendInviteRequest": { + "properties": { + "email": { + "type": "string", + "title": "Email" + } + }, + "type": "object", + "required": ["email"], + "title": "ResendInviteRequest" + }, + "Result": { + "properties": { + "type": { + "type": "string", + "title": "Type" + }, + "value": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Value" + }, + "error": { + "anyOf": [ + { + "$ref": "#/components/schemas/Error" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["type"], + "title": "Result" + }, + "RootDTO": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + } + }, + "type": "object", + "required": ["id"], + "title": "RootDTO" + }, + "ScopesResponseModel": { + "properties": { + "projects": { + "additionalProperties": { + "additionalProperties": { + "$ref": "#/components/schemas/ProjectScope" + }, + "type": "object" + }, + "type": "object", + "title": "Projects", + "default": {} + } + }, + "type": "object", + "title": "ScopesResponseModel" + }, + "SecretDTO": { + "properties": { + "kind": { + "$ref": "#/components/schemas/SecretKind" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/StandardProviderDTO" + }, + { + "$ref": "#/components/schemas/CustomProviderDTO" + } + ], + "title": "Data" + } + }, + "type": "object", + "required": ["kind", "data"], + "title": "SecretDTO" + }, + "SecretKind": { + "type": "string", + "enum": ["provider_key", "custom_provider"], + "title": "SecretKind" + }, + "SecretResponseDTO": { + "properties": { + "kind": { + "$ref": "#/components/schemas/SecretKind" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/StandardProviderDTO" + }, + { + "$ref": "#/components/schemas/CustomProviderDTO" + } + ], + "title": "Data" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "header": { + "$ref": "#/components/schemas/Header" + }, + "lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__LifecycleDTO" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["kind", "data", "header"], + "title": "SecretResponseDTO" + }, + "SimpleEvaluationOutput": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "variant_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Variant Ids" + }, + "app_id": { + "type": "string", + "title": "App Id" + }, + "status": { + "type": "string", + "title": "Status" + }, + "evaluation_type": { + "$ref": "#/components/schemas/EvaluationType" + } + }, + "type": "object", + "required": ["id", "variant_ids", "app_id", "status", "evaluation_type"], + "title": "SimpleEvaluationOutput" + }, + "SpanDTO": { + "properties": { + "trace_id": { + "type": "string", + "title": "Trace Id" + }, + "span_id": { + "type": "string", + "title": "Span Id" + }, + "lifecycle": { + "anyOf": [ + { + "$ref": "#/components/schemas/oss__src__core__shared__dtos__LifecycleDTO" + }, + { + "type": "null" + } + ] + }, + "root": { + "$ref": "#/components/schemas/RootDTO" + }, + "tree": { + "$ref": "#/components/schemas/TreeDTO" + }, + "node": { + "$ref": "#/components/schemas/NodeDTO" + }, + "parent": { + "anyOf": [ + { + "$ref": "#/components/schemas/ParentDTO" + }, + { + "type": "null" + } + ] + }, + "time": { + "$ref": "#/components/schemas/TimeDTO" + }, + "status": { + "$ref": "#/components/schemas/StatusDTO" + }, + "exception": { + "anyOf": [ + { + "$ref": "#/components/schemas/ExceptionDTO" + }, + { + "type": "null" + } + ] + }, + "data": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Data" + }, + "metrics": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metrics" + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "refs": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Refs" + }, + "links": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/LinkDTO" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Links" + }, + "otel": { + "anyOf": [ + { + "$ref": "#/components/schemas/OTelExtraDTO" + }, + { + "type": "null" + } + ] + }, + "nodes": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/SpanDTO" + }, + { + "items": { + "$ref": "#/components/schemas/SpanDTO" + }, + "type": "array" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Nodes" + } + }, + "type": "object", + "required": ["trace_id", "span_id", "root", "tree", "node", "time", "status"], + "title": "SpanDTO" + }, + "StandardProviderDTO": { + "properties": { + "kind": { + "$ref": "#/components/schemas/StandardProviderKind" + }, + "provider": { + "$ref": "#/components/schemas/StandardProviderSettingsDTO" + } + }, + "type": "object", + "required": ["kind", "provider"], + "title": "StandardProviderDTO" + }, + "StandardProviderKind": { + "type": "string", + "enum": [ + "openai", + "cohere", + "anyscale", + "deepinfra", + "alephalpha", + "groq", + "mistralai", + "anthropic", + "perplexityai", + "togetherai", + "openrouter", + "gemini" + ], + "title": "StandardProviderKind" + }, + "StandardProviderSettingsDTO": { + "properties": { + "key": { + "type": "string", + "title": "Key" + } + }, + "type": "object", + "required": ["key"], + "title": "StandardProviderSettingsDTO" + }, + "StatusCode": { + "type": "string", + "enum": ["UNSET", "OK", "ERROR"], + "title": "StatusCode" + }, + "StatusDTO": { + "properties": { + "code": { + "$ref": "#/components/schemas/StatusCode" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + } + }, + "type": "object", + "required": ["code"], + "title": "StatusDTO" + }, + "TagsRequest": { + "properties": { + "metadata": { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object", + "title": "Metadata" + } + }, + "type": "object", + "required": ["metadata"], + "title": "TagsRequest" + }, + "TestSetOutputResponse": { + "properties": { + "_id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + } + }, + "type": "object", + "required": ["_id", "name", "created_at", "updated_at"], + "title": "TestSetOutputResponse" + }, + "TestSetSimpleResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "created_at": { + "type": "string", + "title": "Created At" + } + }, + "type": "object", + "required": ["id", "name", "created_at"], + "title": "TestSetSimpleResponse" + }, + "TestcaseResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "testcase": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Testcase" + } + }, + "type": "object", + "required": ["count"], + "title": "TestcaseResponse" + }, + "Testset-Input": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "testcases": { + "anyOf": [ + { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Testcases" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "title": "Testset" + }, + "Testset-Output": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "testcases": { + "anyOf": [ + { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Testcases" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "title": "Testset" + }, + "TestsetRequest": { + "properties": { + "testset": { + "$ref": "#/components/schemas/Testset-Input" + } + }, + "type": "object", + "required": ["testset"], + "title": "TestsetRequest" + }, + "TestsetResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "testset": { + "anyOf": [ + { + "$ref": "#/components/schemas/Testset-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["count"], + "title": "TestsetResponse" + }, + "TestsetsResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "testsets": { + "items": { + "$ref": "#/components/schemas/Testset-Output" + }, + "type": "array", + "title": "Testsets", + "default": [] + } + }, + "type": "object", + "required": ["count"], + "title": "TestsetsResponse" + }, + "TimeDTO": { + "properties": { + "start": { + "type": "string", + "format": "date-time", + "title": "Start" + }, + "end": { + "type": "string", + "format": "date-time", + "title": "End" + } + }, + "type": "object", + "required": ["start", "end"], + "title": "TimeDTO" + }, + "TreeDTO": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "type": { + "anyOf": [ + { + "$ref": "#/components/schemas/TreeType" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["id"], + "title": "TreeDTO" + }, + "TreeType": { + "type": "string", + "enum": ["invocation"], + "title": "TreeType" + }, + "UpdateApp": { + "properties": { + "app_name": { + "type": "string", + "title": "App Name" + } + }, + "type": "object", + "required": ["app_name"], + "title": "UpdateApp" + }, + "UpdateAppOutput": { + "properties": { + "app_id": { + "type": "string", + "title": "App Id" + }, + "app_name": { + "type": "string", + "title": "App Name" + } + }, + "type": "object", + "required": ["app_id", "app_name"], + "title": "UpdateAppOutput" + }, + "UpdateEvaluatorConfig": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "evaluator_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Evaluator Key" + }, + "settings_values": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Settings Values" + } + }, + "type": "object", + "required": ["settings_values"], + "title": "UpdateEvaluatorConfig" + }, + "UpdateSecretDTO": { + "properties": { + "header": { + "anyOf": [ + { + "$ref": "#/components/schemas/Header" + }, + { + "type": "null" + } + ] + }, + "secret": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecretDTO" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "UpdateSecretDTO" + }, + "UpdateVariantParameterPayload": { + "properties": { + "parameters": { + "additionalProperties": true, + "type": "object", + "title": "Parameters" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + } + }, + "type": "object", + "required": ["parameters"], + "title": "UpdateVariantParameterPayload" + }, + "UpdateVariantURLPayload": { + "properties": { + "url": { + "type": "string", + "title": "Url" + }, + "variant_id": { + "type": "string", + "title": "Variant Id" + }, + "commit_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Commit Message" + } + }, + "type": "object", + "required": ["url", "variant_id"], + "title": "UpdateVariantURLPayload" + }, + "UpdateWorkspace": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + } + }, + "type": "object", + "title": "UpdateWorkspace" + }, + "UserRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "email": { + "type": "string", + "title": "Email" + } + }, + "type": "object", + "required": ["name", "email"], + "title": "UserRequest" + }, + "UserRole": { + "properties": { + "email": { + "type": "string", + "title": "Email" + }, + "organization_id": { + "type": "string", + "title": "Organization Id" + }, + "role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Role" + } + }, + "type": "object", + "required": ["email", "organization_id"], + "title": "UserRole" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError" + }, + "WorkflowArtifact-Input": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "title": "WorkflowArtifact" + }, + "WorkflowArtifact-Output": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "title": "WorkflowArtifact" + }, + "WorkflowData": { + "properties": { + "service": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Service" + }, + "configuration": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Configuration" + } + }, + "type": "object", + "title": "WorkflowData" + }, + "WorkflowFlags": { + "properties": { + "is_custom": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Custom", + "default": false + }, + "is_evaluator": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Evaluator", + "default": false + }, + "is_human": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Human", + "default": false + } + }, + "type": "object", + "title": "WorkflowFlags" + }, + "WorkflowRequest": { + "properties": { + "workflow": { + "$ref": "#/components/schemas/WorkflowArtifact-Input" + } + }, + "type": "object", + "required": ["workflow"], + "title": "WorkflowRequest" + }, + "WorkflowResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "workflow": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowArtifact-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["count"], + "title": "WorkflowResponse" + }, + "WorkflowRevision-Input": { + "properties": { + "author": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Author" + }, + "date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowData" + }, + { + "type": "null" + } + ] + }, + "artifact_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Artifact Id" + }, + "artifact": { + "anyOf": [ + { + "$ref": "#/components/schemas/Artifact-Input" + }, + { + "type": "null" + } + ] + }, + "variant_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Variant Id" + }, + "variant": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowVariant-Input" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "WorkflowRevision" + }, + "WorkflowRevision-Output": { + "properties": { + "author": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Author" + }, + "date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Date" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowData" + }, + { + "type": "null" + } + ] + }, + "artifact_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Artifact Id" + }, + "artifact": { + "anyOf": [ + { + "$ref": "#/components/schemas/Artifact-Output" + }, + { + "type": "null" + } + ] + }, + "variant_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Variant Id" + }, + "variant": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowVariant-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "WorkflowRevision" + }, + "WorkflowRevisionRequest": { + "properties": { + "revision": { + "$ref": "#/components/schemas/WorkflowRevision-Input" + } + }, + "type": "object", + "required": ["revision"], + "title": "WorkflowRevisionRequest" + }, + "WorkflowRevisionResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "revision": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowRevision-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["count"], + "title": "WorkflowRevisionResponse" + }, + "WorkflowRevisionsResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "revisions": { + "items": { + "$ref": "#/components/schemas/WorkflowRevision-Output" + }, + "type": "array", + "title": "Revisions", + "default": [] + } + }, + "type": "object", + "required": ["count"], + "title": "WorkflowRevisionsResponse" + }, + "WorkflowVariant-Input": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "artifact_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Artifact Id" + }, + "artifact": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowArtifact-Input" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "WorkflowVariant" + }, + "WorkflowVariant-Output": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "artifact_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Artifact Id" + }, + "artifact": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowArtifact-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "WorkflowVariant" + }, + "WorkflowVariantRequest": { + "properties": { + "variant": { + "$ref": "#/components/schemas/WorkflowVariant-Input" + } + }, + "type": "object", + "required": ["variant"], + "title": "WorkflowVariantRequest" + }, + "WorkflowVariantResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "variant": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowVariant-Output" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": ["count"], + "title": "WorkflowVariantResponse" + }, + "WorkflowVariantsResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "variants": { + "items": { + "$ref": "#/components/schemas/WorkflowVariant-Output" + }, + "type": "array", + "title": "Variants", + "default": [] + } + }, + "type": "object", + "required": ["count"], + "title": "WorkflowVariantsResponse" + }, + "WorkflowsResponse": { + "properties": { + "count": { + "type": "integer", + "title": "Count" + }, + "workflows": { + "items": { + "$ref": "#/components/schemas/WorkflowArtifact-Output" + }, + "type": "array", + "title": "Workflows", + "default": [] + } + }, + "type": "object", + "required": ["count"], + "title": "WorkflowsResponse" + }, + "Workspace": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + } + }, + "type": "object", + "required": ["name", "type"], + "title": "Workspace" + }, + "WorkspaceMemberResponse": { + "properties": { + "user": { + "additionalProperties": true, + "type": "object", + "title": "User" + }, + "roles": { + "items": { + "$ref": "#/components/schemas/WorkspacePermission" + }, + "type": "array", + "title": "Roles" + } + }, + "type": "object", + "required": ["user", "roles"], + "title": "WorkspaceMemberResponse" + }, + "WorkspaceMembershipRequest": { + "properties": { + "role": { + "type": "string", + "enum": ["owner", "viewer", "editor", "evaluator", "workspace_admin", "deployment_manager"], + "title": "Role" + }, + "is_demo": { + "type": "boolean", + "title": "Is Demo" + }, + "user_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + }, + "workspace_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + } + }, + "type": "object", + "required": ["role", "is_demo", "user_ref", "workspace_ref"], + "title": "WorkspaceMembershipRequest" + }, + "WorkspacePermission": { + "properties": { + "role_name": { + "$ref": "#/components/schemas/WorkspaceRole" + }, + "role_description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Role Description" + }, + "permissions": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Permission" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Permissions" + } + }, + "type": "object", + "required": ["role_name"], + "title": "WorkspacePermission" + }, + "WorkspaceRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "is_default": { + "type": "boolean", + "title": "Is Default" + }, + "organization_ref": { + "$ref": "#/components/schemas/ee__src__services__admin_manager__Reference" + } + }, + "type": "object", + "required": ["name", "description", "is_default", "organization_ref"], + "title": "WorkspaceRequest" + }, + "WorkspaceResponse": { + "properties": { + "created_at": { + "type": "string", + "title": "Created At", + "default": "2025-05-15 07:35:40.094202+00:00" + }, + "updated_at": { + "type": "string", + "title": "Updated At", + "default": "2025-05-15 07:35:40.094271+00:00" + }, + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type" + }, + "organization": { + "type": "string", + "title": "Organization" + }, + "members": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/WorkspaceMemberResponse" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Members" + } + }, + "type": "object", + "required": ["id", "name", "type", "organization"], + "title": "WorkspaceResponse" + }, + "WorkspaceRole": { + "type": "string", + "enum": ["owner", "viewer", "editor", "evaluator", "workspace_admin", "deployment_manager"], + "title": "WorkspaceRole" + }, + "ee__src__services__admin_manager__Reference": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + } + }, + "type": "object", + "title": "Reference" + }, + "oss__src__apis__fastapi__evaluators__models__Evaluator-Output": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "deleted_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deleted At" + }, + "created_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Created By Id" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "deleted_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Deleted By Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "flags": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowFlags" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/WorkflowData" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Evaluator" + }, + "oss__src__apis__fastapi__observability__models__OTelTracingResponse": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count" + }, + "spans": { + "items": { + "$ref": "#/components/schemas/OTelSpanDTO" + }, + "type": "array", + "title": "Spans" + } + }, + "type": "object", + "required": ["version", "spans"], + "title": "OTelTracingResponse" + }, + "oss__src__apis__fastapi__tracing__models__OTelTracingResponse": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "count": { + "type": "integer", + "title": "Count" + }, + "oldest": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Oldest" + }, + "newest": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Newest" + }, + "spans": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OTelFlatSpan-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Spans" + }, + "traces": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/OTelSpansTree-Output" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Traces" + } + }, + "type": "object", + "required": ["version", "count"], + "title": "OTelTracingResponse" + }, + "oss__src__core__observability__dtos__OTelStatusCode": { + "type": "string", + "enum": ["STATUS_CODE_OK", "STATUS_CODE_ERROR", "STATUS_CODE_UNSET"], + "title": "OTelStatusCode" + }, + "oss__src__core__shared__dtos__LifecycleDTO": { + "properties": { + "created_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + } + }, + "type": "object", + "title": "LifecycleDTO" + }, + "oss__src__core__shared__dtos__Reference": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + }, + "attributes": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/FullJson-Input" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Attributes" + } + }, + "type": "object", + "title": "Reference" + }, + "oss__src__core__tracing__dtos__OTelStatusCode": { + "type": "string", + "enum": ["STATUS_CODE_UNSET", "STATUS_CODE_OK", "STATUS_CODE_ERROR"], + "title": "OTelStatusCode" + }, + "oss__src__models__api__evaluation_model__Evaluator": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "key": { + "type": "string", + "title": "Key" + }, + "direct_use": { + "type": "boolean", + "title": "Direct Use" + }, + "settings_template": { + "additionalProperties": true, + "type": "object", + "title": "Settings Template" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "oss": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Oss", + "default": false + }, + "requires_llm_api_keys": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Requires Llm Api Keys", + "default": false + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Tags" + } + }, + "type": "object", + "required": ["name", "key", "direct_use", "settings_template", "tags"], + "title": "Evaluator" + }, + "oss__src__services__variants_manager__LifecycleDTO": { + "properties": { + "created_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "updated_by_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated By Id" + }, + "updated_by": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated By" + } + }, + "type": "object", + "title": "LifecycleDTO" + } + }, + "securitySchemes": { + "APIKeyHeader": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } + }, + "tags": [ + { + "name": "Variants" + }, + { + "name": "Evaluations" + }, + { + "name": "Evaluators" + }, + { + "name": "Apps" + }, + { + "name": "Human-Evaluations" + }, + { + "name": "Testsets" + }, + { + "name": "Containers" + }, + { + "name": "Environments" + }, + { + "name": "Observability" + }, + { + "name": "Organizations" + }, + { + "name": "Bases" + }, + { + "name": "Configs" + } + ], + "security": [ + { + "APIKeyHeader": [] + } + ] +} diff --git a/docs/docs/reference/sdk/01-configuration-management.mdx b/docs/docs/reference/sdk/01-configuration-management.mdx index 1fe59a2128..977e3963c6 100644 --- a/docs/docs/reference/sdk/01-configuration-management.mdx +++ b/docs/docs/reference/sdk/01-configuration-management.mdx @@ -325,7 +325,7 @@ All configuration data must be nested under the `prompt` key. ``` :::note -You can use the `PromptTemplate` class in the SDK to create and validate a prompt configuration. See [how to commit a variant](/prompt-engineering/managing-prompts-programatically/create-and-commit#create-a-new-variant). +You can use the `PromptTemplate` class in the SDK to create and validate a prompt configuration. See [how to commit a variant](/prompt-engineering/prompt-management/prompt-management-sdk#create-a-new-variant). ::: ## Available Environments diff --git a/docs/docs/self-host/02-configuration.mdx b/docs/docs/self-host/02-configuration.mdx index 5879d32f47..0ecbb284be 100644 --- a/docs/docs/self-host/02-configuration.mdx +++ b/docs/docs/self-host/02-configuration.mdx @@ -37,8 +37,6 @@ Configuration for Docker and database connections: | Variable | Description | Default | |----------|-------------|---------| -| `AGENTA_WEB_IMAGE_TAG` | Docker image tag for the web frontend | `latest` | -| `AGENTA_API_IMAGE_TAG` | Docker image tag for the API backend | `latest` | | `DOCKER_NETWORK_MODE` | Docker networking mode | `_(empty)_` (which falls back to `bridge`) | | `POSTGRES_PASSWORD` | PostgreSQL database password | `password` | | `POSTGRES_USERNAME` | PostgreSQL database username | `username` | @@ -57,7 +55,6 @@ Optional Agenta-specific configurations: | `AGENTA_SEND_EMAIL_FROM_ADDRESS` | From address for system emails | `mail@example.com` | | `AGENTA_API_INTERNAL_URL` | Internal API URL for services | _(empty)_ | | `AGENTA_SERVICE_MIDDLEWARE_CACHE_ENABLED` | Enable middleware caching in the chat and completion services | `true` | -| `AGENTA_ALLOWED_DOMAINS` | Comma-separated list of email domains allowed to authenticate; when set, all other domains are rejected | _(empty)_ | | `AGENTA_OTLP_MAX_BATCH_BYTES` | Max OTLP batch size before requests are rejected with 413 | `10485760` (10MB) | ### Third-party (Required) @@ -75,9 +72,7 @@ Essential third-party service configurations: #### Redis (Caching) | Variable | Description | Default | |----------|-------------|---------| -| `REDIS_URL` | Redis connection URL for task queue | `redis://redis:6379/0` | -| `REDIS_CACHE_HOST` | Redis cache hostname for application caching | `cache` | -| `REDIS_CACHE_PORT` | Redis cache port for application caching | `6378` | +| `REDIS_URL` | Redis connection URL | `redis://redis:6379/0` | #### RabbitMQ (Message Queue) | Variable | Description | Default | @@ -133,6 +128,7 @@ Optional port and service configurations: | `NGINX_PORT` | Nginx port (when using Nginx) | `80` | | `RABBITMQ_PORT` | RabbitMQ AMQP port | `5672` | | `RABBITMQ_UI_PORT` | RabbitMQ management UI port | `15672` | +| `REDIS_CACHE_PORT` | Redis cache port | `6378` | | `POSTGRES_PORT` | PostgreSQL port | `5432` | | `SUPERTOKENS_PORT` | SuperTokens port | `3567` | @@ -241,3 +237,4 @@ TRAEFIK_PORT=80 For configuration assistance: - Check the [GitHub issues](https://github.com/Agenta-AI/agenta/issues) - Join our [Slack community](https://join.slack.com/t/agenta-hq/shared_invite/zt-37pnbp5s6-mbBrPL863d_oLB61GSNFjw) +- Review the deployment documentation for your specific setup \ No newline at end of file diff --git a/docs/docs/self-host/99-faq.mdx b/docs/docs/self-host/99-faq.mdx deleted file mode 100644 index 42a8a52075..0000000000 --- a/docs/docs/self-host/99-faq.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Frequently Asked Questions -sidebar_label: FAQ -description: Self-hosting Agenta FAQ. Learn how to lock Agenta to a specific version, configure Docker images, and troubleshoot common deployment issues. ---- - -## How do I lock Agenta to a specific version? - -Use the `AGENTA_WEB_IMAGE_TAG` and `AGENTA_API_IMAGE_TAG` environment variables. - -```bash -AGENTA_WEB_IMAGE_TAG=v0.15.0 -AGENTA_API_IMAGE_TAG=v0.15.0 -``` - -These are set to `latest` by default. diff --git a/docs/docs/tutorials/cookbooks/01-capture-user-feedback.mdx b/docs/docs/tutorials/cookbooks/01-capture-user-feedback.mdx index 1633d97b31..40d80de901 100644 --- a/docs/docs/tutorials/cookbooks/01-capture-user-feedback.mdx +++ b/docs/docs/tutorials/cookbooks/01-capture-user-feedback.mdx @@ -1,15 +1,17 @@ --- -title: "Capture User Feedback with Trace Annotations" +title: "Capture user feedback" position: 1 sidebar_label: "Capture user feedback" +description: "Learn how to capture and store user feedback on LLM responses using Agenta to continuously improve your AI applications, find edge cases, and track performance over time" --- -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` +:::note + This guide is also available as a [Jupyter Notebook](https://github.com/Agenta-AI/agenta/blob/main/examples/jupyter/capture_user_feedback.ipynb). +::: + +# Capturing User Feedback with Annotations In this tutorial, we'll build a simple LLM application and learn how to capture user feedback using Agenta's annotation system. By the end, you'll be able to: @@ -17,11 +19,6 @@ In this tutorial, we'll build a simple LLM application and learn how to capture - Capture structured feedback about LLM responses - View this feedback in the Agenta UI - - - Open in Google Colaboratory - - This approach helps you collect valuable user insights and improve your LLM applications over time. diff --git a/docs/docs/tutorials/cookbooks/02-observability_langchain.mdx b/docs/docs/tutorials/cookbooks/02-observability_langchain.mdx index 5a0bc75291..da0694c776 100644 --- a/docs/docs/tutorials/cookbooks/02-observability_langchain.mdx +++ b/docs/docs/tutorials/cookbooks/02-observability_langchain.mdx @@ -1,15 +1,17 @@ --- -title: "Tracing and Observability for LangChain with Agenta" -sidebar_label: Tracing for LangChain -description: Learn how to instrument LangChain traces with Agenta for enhanced LLM observability. This guide covers setup, configuration, and best practices for monitoring LLM applications using LangChain and OpenAI models. +title: "Observability LangChain" --- ```mdx-code-block import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; + ``` +:::note +This guide is also available as a [Jupyter Notebook](https://github.com/Agenta-AI/agenta/blob/main/cookbook/observability_langchain.ipynb). +::: +# LLM Observability for LangChain with Agenta ## Introduction @@ -17,11 +19,6 @@ This guide shows you how to set up tracing for a RAG application in Langchain us Tracing allows us to debug effectively complex LLM applications. It allows us to view exact prompts sent and contexts retrieved. - - - Open in Google Colaboratory - - We'll build a simple Q&A RAG application that answers questions about Agenta's documentation. Then, we'll instrument the calls (i.e., trace them) and view the trace in Agenta. Playground for testing the RAG + +## Our stack + +- **Agenta** for playground, evaluation, observability, and deployment. +- **[LiteLLM](https://github.com/BerriAI/litellm)** for interacting with language models and embeddings. +- **[Qdrant](https://qdrant.tech/)** as our vector database for storing and querying document embeddings. + +## Ingestion pipeline + +The first step is to process our documentation and store it in a vector database for retrieval. Let's start by looking at how we ingest our documentation into Qdrant. + +```python title="ingest.py" + +OPENAI_EMBEDDING_DIM = 1536 # For text-embedding-ada-002 +COHERE_EMBEDDING_DIM = 1024 # For embed-english-v3.0 + +qdrant_client = QdrantClient( + url=os.getenv("QDRANT_URL"), api_key=os.getenv("QDRANT_API_KEY") +) + + +def chunk_text(text: str, max_chunk_size: int = 1500) -> List[str]: + """ + Split text into chunks based on paragraphs and size. + Tries to maintain context by keeping paragraphs together when possible. + """ + # Split by double newlines to preserve paragraph structure + paragraphs = [p.strip() for p in text.split("\n\n") if p.strip()] + + chunks = [] + current_chunk = [] + current_size = 0 + + for paragraph in paragraphs: + paragraph_size = len(paragraph) + + # If a single paragraph is too large, split it by sentences + if paragraph_size > max_chunk_size: + sentences = [s.strip() + "." for s in paragraph.split(".") if s.strip()] + for sentence in sentences: + if len(sentence) > max_chunk_size: + # If even a sentence is too long, split it by chunks + for i in range(0, len(sentence), max_chunk_size): + chunks.append(sentence[i : i + max_chunk_size]) + elif current_size + len(sentence) > max_chunk_size: + # Start new chunk + chunks.append(" ".join(current_chunk)) + current_chunk = [sentence] + current_size = len(sentence) + else: + current_chunk.append(sentence) + current_size += len(sentence) + # If adding this paragraph would exceed the limit, start a new chunk + elif current_size + paragraph_size > max_chunk_size: + chunks.append(" ".join(current_chunk)) + current_chunk = [paragraph] + current_size = paragraph_size + else: + current_chunk.append(paragraph) + current_size += paragraph_size + + # Add the last chunk if it exists + if current_chunk: + chunks.append(" ".join(current_chunk)) + + return chunks + + +def process_doc(file_path: str, docs_path: str, docs_base_url: str) -> List[Dict]: + """Process a single document into chunks with metadata.""" + with open(file_path, "r", encoding="utf-8") as f: + # Parse frontmatter and content + post = frontmatter.load(f) + content = post.content + + # Calculate document hash + doc_hash = calculate_doc_hash(content) + + # Get document URL + doc_url = get_doc_url(file_path, docs_path, docs_base_url) + + # Create base metadata + metadata = { + "title": post.get("title", ""), + "url": doc_url, + "file_path": file_path, + "last_updated": datetime.utcnow().isoformat(), + "doc_hash": doc_hash, + } + + # Chunk the content + chunks = chunk_text(content) + + return [ + {"content": chunk, "metadata": metadata, "doc_hash": doc_hash} + for chunk in chunks + ] + + +def get_embeddings(text: str) -> Dict[str, List[float]]: + """Get embeddings using both OpenAI and Cohere models via LiteLLM.""" + # Get OpenAI embedding + openai_response = embedding(model="text-embedding-ada-002", input=[text]) + openai_embedding = openai_response["data"][0]["embedding"] + + # Get Cohere embedding + cohere_response = embedding( + model="cohere/embed-english-v3.0", + input=[text], + input_type="search_document", # Specific to Cohere v3 models + ) + cohere_embedding = cohere_response["data"][0]["embedding"] + + return {"openai": openai_embedding, "cohere": cohere_embedding} + + +def setup_qdrant_collection(): + """Create or recreate the vector collection.""" + # Delete if exists + try: + qdrant_client.delete_collection(COLLECTION_NAME) + except Exception: + pass + + # Create collection with two vector types + qdrant_client.create_collection( + collection_name=COLLECTION_NAME, + vectors_config={ + "openai": models.VectorParams( + size=OPENAI_EMBEDDING_DIM, distance=models.Distance.COSINE + ), + "cohere": models.VectorParams( + size=COHERE_EMBEDDING_DIM, distance=models.Distance.COSINE + ), + }, + ) + + +def upsert_chunks(chunks: List[Dict]): + """Upsert document chunks to the vector store.""" + for i, chunk in enumerate(chunks): + # Get both embeddings using LiteLLM + embeddings = get_embeddings(chunk["content"]) + + # Create payload + payload = {**chunk["metadata"], "content": chunk["content"], "chunk_index": i} + + # Upsert to Qdrant + qdrant_client.upsert( + collection_name=COLLECTION_NAME, + points=[ + models.PointStruct( + id=f"{chunk['doc_hash']}", + payload=payload, + vector=embeddings, # Contains both 'openai' and 'cohere' embeddings + ) + ], + ) + + +def main(): + # Get environment variables + docs_path = os.getenv("DOCS_PATH") + docs_base_url = os.getenv("DOCS_BASE_URL") + + if not docs_path or not docs_base_url: + raise ValueError("DOCS_PATH and DOCS_BASE_URL must be set in .env file") + + # Create fresh collection + setup_qdrant_collection() + + # Process all documents + all_docs = get_all_docs(docs_path) + for doc_path in tqdm.tqdm(all_docs): + print(f"Processing {doc_path}") + chunks = process_doc(doc_path, docs_path, docs_base_url) + upsert_chunks(chunks) +``` + +This script performs the following steps: + +1. **Loads documentation files:** Reads all `.mdx` files from the documentation directory. +2. **Processes documents:** Chunks the text, adds metadata (e.g. the url where the page where to be found).. +3. **Generates embeddings:** Generate embeddings for each chunk using both OpenAI and Cohere models. We use both because we would like to compare them in the playground. +4. **Stores embeddings in Qdrant:** Upserts the embeddings into a Qdrant collection for later retrieval. We use named vectors to save multiple embeddings for the same document. + +To run the ingestion pipeline, you need first to create a collection in Qdrant and then set the following environment variables: + +- `QDRANT_URL`: The URL of your Qdrant instance. +- `QDRANT_API_KEY`: The API key for your Qdrant instance. +- `DOCS_PATH`: The folder containing the documentation (in our case it's under `agenta/docs/docs`). +- `DOCS_BASE_URL`: The base URL where the documentation can be found (in our case it's `https://docs.agenta.ai`). + +:::info +The complete ingestion script with a setup readme is [available in Github](https://github.com/Agenta-AI/agenta/tree/main/examples/custom_workflows/rag-docs-qa). +::: + +## The query RAG workflow + +Now that we have ingested the documentation into the Qdrant vector database, let's create the query logic for our assistant. Parts related to the Agenta integrations are highlighted. + +```python title="query.py" +#highlight-start +import agenta as ag +from pydantic import BaseModel, Field +from agenta.sdk.assets import supported_llm_models +from agenta.sdk.types import MCField +#highlight-end + +system_prompt = """ +You are a helpful assistant that answers questions based on the documentation. +""" +user_prompt = """ +Here is the query: {query} + +Here is the context: {context} +""" +#highlight-start +ag.init() +#highlight-end + +#highlight-start +litellm.callbacks = [ag.callbacks.litellm_handler()] +#highlight-end + +# Initialize Qdrant client +qdrant_client = QdrantClient( + url=os.getenv("QDRANT_URL"), api_key=os.getenv("QDRANT_API_KEY") +) + +#highlight-start +# We define here the configuration that will be used by the playground +class Config(BaseModel): + system_prompt: str = Field(default=system_prompt) + user_prompt: str = Field(default=user_prompt) + embedding_model: str = MCField(default="openai", choices=["openai", "cohere"]) + llm_model: str = MCField(default="gpt-3.5-turbo", choices=supported_llm_models) + top_k: int = Field(default=10, ge=1, le=25) + rerank_top_k: int = Field(default=3, ge=1, le=10) + use_rerank: bool = Field(default=True) +#highlight-end + + +def get_embeddings(text: str, model: str) -> Dict[str, List[float]]: + """Get embeddings using both OpenAI and Cohere models via LiteLLM.""" + if model == "openai": + return embedding(model="text-embedding-ada-002", input=[text])["data"][0]["embedding"] + elif model == "cohere": + return embedding( + model="cohere/embed-english-v3.0", + input=[text], + input_type="search_query", # Use search_query for queries + )["data"][0]["embedding"] + + raise ValueError(f"Unknown model: {model}") + +#highlight-next-line +@ag.instrument() +def search_docs( + query: str, collection_name: str = os.getenv("COLLECTION_NAME", "docs_collection") +) -> List[Dict]: + """ + Search the documentation using embeddings. + + Args: + query: The search query + collection_name: Name of the Qdrant collection to search + + Returns: + List of dictionaries containing matched documents and their metadata + """ + + #highlight-start + # Get embeddings for the query + config = ag.ConfigManager.get_from_route(Config) + #highlight-end + # Search using embeddings + results = qdrant_client.query_points( + collection_name=collection_name, + query=get_embeddings(query, config.embedding_model), + using=config.embedding_model, + limit=config.top_k, + ) + # Format results + formatted_results = [] + for result in results.points: + formatted_result = { + "content": result.payload["content"], + "metadata": { + "title": result.payload["title"], + "url": result.payload["url"], + "score": result.score, + }, + } + formatted_results.append(formatted_result) + + return formatted_results + +#highlight-next-line +@ag.instrument() +def llm(query: str, results: List[Dict]): + #highlight-next-line + config = ag.ConfigManager.get_from_route(Config) + context = [] + for i, result in enumerate(results, 1): + score = result["metadata"].get("rerank_score", result["metadata"]["score"]) + item = f"Result {i} (Score: {score:.3f})\n" + item += f"Title: {result['metadata']['title']}\n" + item += f"URL: {result['metadata']['url']}\n" + item += f"Content: {result['content']}\n" + item += "-" * 80 + "\n" + context.append(item) + #highlight-start + # We store the context in the trace so that it can be used for evaluation + ag.tracing.store_internals({"context": context}) + #highlight-end + response = completion( + model=config.llm_model, + messages=[ + {"role": "system", "content": config.system_prompt}, + { + "role": "user", + "content": config.user_prompt.format( + query=query, context="".join(context) + ), + }, + ], + ) + return response.choices[0].message.content + +#highlight-next-line +@ag.instrument() +def rerank_results(query: str, results: List[Dict]) -> List[Dict]: + """Rerank the search results using Cohere's reranker.""" + #highlight-start + config = ag.ConfigManager.get_from_route(Config) + #highlight-end + # Format documents for reranking + documents = [result["content"] for result in results] + + # Perform reranking + reranked = rerank( + model="cohere/rerank-english-v3.0", + query=query, + documents=documents, + top_n=config.rerank_top_k, + ) + # Reorder the original results based on reranking + reranked_results = [] + for item in reranked.results: + # The rerank function returns dictionaries with 'document' and 'index' keys + reranked_results.append(results[item["index"]]) + # Add rerank score to metadata + reranked_results[-1]["metadata"]["rerank_score"] = item["relevance_score"] + + return reranked_results + +#highlight-start +# We define here the route that will be used by the playground +@ag.route("/", config_schema=Config) +@ag.instrument() +#highlight-end +def generate(query: str): + #highlight-next-line + config = ag.ConfigManager.get_from_route(Config) + results = search_docs(query) + if config.use_rerank: + reranked_results = rerank_results(query, results) + return llm(query, reranked_results) + else: + return llm(query, results) +``` + +Our system uses a standard RAG workflow consisting of three main steps: + +1. **Searching the documentation:** Uses the query to retrieve relevant documents from Qdrant. +2. **Optionally reranking results:** Improves the relevance of results using Cohere's reranker. +3. **Generating the answer:** Constructs a prompt with the query and context, then calls the LLM to generate the final answer. + +To integrate this script with Agenta, we need to make two main adjustments: + +1. **Instrumentation:** Use `@ag.instrument()` decorator to trace inputs, outputs, and internal variables. +2. **Integration with the Playground:** Use `ag.route()` to define a route and later create a service that will be used to test the app in the playground. + +We'll discuss these in more detail in the next sections. + +## Instrumentation + +Tracing captures the inputs and outputs of all functions and LLM calls in our app. This helps us debug multi-step workflows (for example, determining whether an incorrect response stems from the LLM call or from incorrect context) and monitor usage over time. + +```python +@ag.instrument() +def generate(query: str): + ... +``` + +Instrumenting code in Agenta is straightforward. The `@ag.instrument()` decorator lets you capture function inputs and outputs to create a trace tree. + +Agenta also provides auto-instrumentation for most frameworks and libraries. Since we're using litellm, we'll use Agenta's callback function to automatically instrument its calls. + +For RAG evaluation of our applications, we need to evaluate the relevancy of retrieved context for each query. Since context isn't part of any function's input or output, we'll add it manually to a span using `ag.tracing.store_internals({"context": context})`, which stores internal variables in the ongoing span. + +Trace view of the RAG Q&A assistant + +## Playground integration + +Agenta provides a custom playground for testing application parameters. Here, we can experiment with different embeddings, top_k values, and LLM models. + +Using the Agenta SDK, we'll define a configuration schema for our application and create an endpoint to enable playground communication. Then, we'll deploy the application to Agenta Cloud using the Agenta CLI for testing. Agenta handles all infrastructure work needed to create our application service. + +### Defining the configuration + +Let's define the configuration schema for our application. This schema will determine what elements appear in the playground UI and what parameters we can experiment with. + +Our configuration includes: + +- **System prompt:** The system prompt template +- **User prompt:** The user prompt template +- **Embedding model:** Choice between OpenAI and Cohere +- **LLM model:** Selection from supported language models +- **Top_k value:** Number of document chunks to retrieve from the vector database +- **Use rerank:** Toggle for Cohere's reranking feature +- **Rerank top_k value:** Number of chunks the reranker should return (used for both reordering and filtering) + +```python +from pydantic import BaseModel, Field +import agenta as ag +from agenta.sdk.assets import supported_llm_models +from agenta.sdk.types import MCField + +class Config(BaseModel): + system_prompt: str = Field(default=system_prompt) + user_prompt: str = Field(default=user_prompt) + embedding_model: str = MCField(default="openai", choices=["openai", "cohere"]) + llm_model: str = MCField(default="gpt-3.5-turbo", choices=supported_llm_models) + top_k: int = Field(default=10, ge=1, le=25) + rerank_top_k: int = Field(default=3, ge=1, le=10) + use_rerank: bool = Field(default=True) +``` + +We implement this using a standard `Config` Pydantic class that inherits from BaseModel. The fields use simple types (str or int). Agenta requires each field to have a default value. For multiple-choice fields, we use `MCField` to specify the available options. + +:::info +`supported_llm_models` is a helper variable provided by Agenta that contains the list available in LiteLLM. +::: + +### Creating the endpoint and using the configuration + +Next, we'll create an endpoint to enable communication between the playground and our application. + +```python +@ag.route("/", config_schema=Config) +def generate(query: str): + config = ag.ConfigManager.get_from_route(Config) + ... +``` + +[The decorator `@ag.route("/", config_schema=Config)`](https://www.notion.so/reference/sdk/custom-workflow#agroute-decorator) registers the `generate` function as an endpoint and uses the `Config` class to define the configuration schema. This creates a `POST /playground/run` endpoint that accepts the configuration as a parameter and runs the workflow. The playground uses this endpoint to interact with the service. + +To get the configuration from the request, we use `ag.ConfigManager.get_from_route(Config)`, which returns a Config object containing the values provided by the playground. + +We can use these configuration values throughout our workflow. For instance, we can use `config.use_rerank` in the `generate` function to control the reranking feature. + +Note that `ag.ConfigManager.get_from_route(Config)` is accessible in any function called within the generate function's execution path, as the configuration is preserved in the context. + +### Adding the application to Agenta + +To connect your application to Agenta, you first need to create a Uvicorn server using the FastAPI app object provided by Agenta. + +Add the following snippet to your application: + +```python +if __name__ == "__main__": + import uvicorn + uvicorn.run(ag.sdk.decorators.routing.app, host="0.0.0.0", port=8000) +``` + +This starts a local server at `http://0.0.0.0:8000`. To make it accessible from the internet, use a tunneling service like ngrok. + +Run the following command to start ngrok: + +```bash +ngrok http 8000 +``` + +ngrok will generate a public URL. Navigate to the overview page in Agenta, create a new custom workflow, and enter this URL. + +Once complete, you can access the playground and begin testing your application. + +Playground for testing the RAG Q&A assistant + +## Evaluating the assistant + +To ensure our assistant provides accurate and relevant answers, we'll use evaluators to assess its performance. We will create two evaluators: + +1. RAG Relevancy Evaluator: Measures how relevant the assistant's answers are with respect to the retrieved context. +2. LLM-as-a-Judge Evaluator: Rates the quality of the assistant's responses. + +For the first, we use the RAG Relevancy evaluator as described in [Agenta's evaluation documentation](/evaluation/evaluators/rag-evaluators). + +**Configuration:** + +- **Question key:** `trace.generate.inputs.query` +- **Answer key:** `trace.generate.outputs` +- **Contexts key:** `trace.generate.llm.internals.context` + +This evaluator measures how relevant the assistant's answers are with respect to the retrieved context. Note that we use `trace.generate.llm.internals.context`, which we previously stored in the span, to get the context from the trace. + +You can use the evaluator playground to configure the evaluator and identify the correct trace data to use in your configuration (see image below). + +Configuration of the RAG Relevancy evaluator + +We set and test an LLM-as-a-Judge evaluator to rate the quality of the assistant's responses the same way. More details on setting up LLM-as-a-Judge evaluators can be found [here](/evaluation/evaluators/llm-as-a-judge). + +## Deploying the assistant + +After iterating through various prompts and parameters and evaluating their performance, we can deploy our satisfied solution as an API endpoint using Agenta. + +Simply click the `Deploy` button in the playground to accomplish this. + +Agenta provides us with [two endpoints](/prompt-engineering/prompt-management/how-to-integrate-with-agenta) to interact with our deployed application: + +- The first allows us to directly invoke the deployed application with the production configuration. +- The second allows us to fetch the deployed configuration as a JSON and use it in our self-deployed application. + +## Conclusion + +In this tutorial, we built a documentation Q&A system using RAG, but more importantly, we created a comprehensive LLMOps workflow that includes: + +- A **playground** for testing different embeddings, prompts, and retrieval parameters in real time +- **Observability tools** for debugging multi-step RAG workflows and monitoring production performance +- **Evaluation pipelines** for assessing both RAG relevancy and response quality +- **Deployment capabilities** for smoothly transitioning from experimentation to production + +This workflow shows how to evolve beyond a basic RAG implementation to build a production-ready system with robust testing, monitoring, and iteration capabilities. diff --git a/docs/docs/tutorials/cookbooks/_RAG-QA-docs.mdx b/docs/docs/tutorials/cookbooks/_RAG-QA-docs.mdx deleted file mode 100644 index 61ea9a179c..0000000000 --- a/docs/docs/tutorials/cookbooks/_RAG-QA-docs.mdx +++ /dev/null @@ -1,580 +0,0 @@ ---- -title: "RAG Q&A over Documentation" -description: "Build a Q&A system for your documentation using RAG with Agenta, Litellm and Qdrant. Evaluate it using Ragas Context relevancy and LLM-as-a-judge. Deploy it as an API endpoint." ---- - -:::info Open in Github -The code for this tutorial is available [here](https://github.com/Agenta-AI/agenta/tree/main/examples/custom_workflows/rag-docs-qa). -::: - -```mdx-code-block -import Image from "@theme/IdealImage"; -``` - -In this tutorial, we'll build a Q&A system for our documentation using RAG (Retrieval-Augmented Generation). Our AI assistant will answer user queries by retrieving relevant sections from our documentation and using them as context when calling an LLM. - -At the end, we will have: - -- A **playground** for testing different embeddings, adjusting top_k values (number of context chunks to include), and experimenting with various prompts and models -- **LLM-as-a-judge** and **RAG context relevancy** evaluations for our Q&A application -- **Observability** with Agenta to debug and monitor our application -- A **deployment** that we can either [directly invoke](/prompt-engineering/integrating-prompts/proxy-calls) **or** [fetch the configuration](/reference/sdk/configuration-management#get_from_registry) to run elsewhere - -You can try our playground by creating a free account at [https://cloud.agenta.ai](https://cloud.agenta.ai) and opening the demo. - -Playground for testing the RAG - -## Our stack - -- **Agenta** for playground, evaluation, observability, and deployment. -- **[LiteLLM](https://github.com/BerriAI/litellm)** for interacting with language models and embeddings. -- **[Qdrant](https://qdrant.tech/)** as our vector database for storing and querying document embeddings. - -## Ingestion pipeline - -The first step is to process our documentation and store it in a vector database for retrieval. Let's start by looking at how we ingest our documentation into Qdrant. - -```python title="ingest.py" - -OPENAI_EMBEDDING_DIM = 1536 # For text-embedding-ada-002 -COHERE_EMBEDDING_DIM = 1024 # For embed-english-v3.0 - -qdrant_client = QdrantClient( - url=os.getenv("QDRANT_URL"), api_key=os.getenv("QDRANT_API_KEY") -) - - -def chunk_text(text: str, max_chunk_size: int = 1500) -> List[str]: - """ - Split text into chunks based on paragraphs and size. - Tries to maintain context by keeping paragraphs together when possible. - """ - # Split by double newlines to preserve paragraph structure - paragraphs = [p.strip() for p in text.split("\n\n") if p.strip()] - - chunks = [] - current_chunk = [] - current_size = 0 - - for paragraph in paragraphs: - paragraph_size = len(paragraph) - - # If a single paragraph is too large, split it by sentences - if paragraph_size > max_chunk_size: - sentences = [s.strip() + "." for s in paragraph.split(".") if s.strip()] - for sentence in sentences: - if len(sentence) > max_chunk_size: - # If even a sentence is too long, split it by chunks - for i in range(0, len(sentence), max_chunk_size): - chunks.append(sentence[i : i + max_chunk_size]) - elif current_size + len(sentence) > max_chunk_size: - # Start new chunk - chunks.append(" ".join(current_chunk)) - current_chunk = [sentence] - current_size = len(sentence) - else: - current_chunk.append(sentence) - current_size += len(sentence) - # If adding this paragraph would exceed the limit, start a new chunk - elif current_size + paragraph_size > max_chunk_size: - chunks.append(" ".join(current_chunk)) - current_chunk = [paragraph] - current_size = paragraph_size - else: - current_chunk.append(paragraph) - current_size += paragraph_size - - # Add the last chunk if it exists - if current_chunk: - chunks.append(" ".join(current_chunk)) - - return chunks - - -def process_doc(file_path: str, docs_path: str, docs_base_url: str) -> List[Dict]: - """Process a single document into chunks with metadata.""" - with open(file_path, "r", encoding="utf-8") as f: - # Parse frontmatter and content - post = frontmatter.load(f) - content = post.content - - # Calculate document hash - doc_hash = calculate_doc_hash(content) - - # Get document URL - doc_url = get_doc_url(file_path, docs_path, docs_base_url) - - # Create base metadata - metadata = { - "title": post.get("title", ""), - "url": doc_url, - "file_path": file_path, - "last_updated": datetime.utcnow().isoformat(), - "doc_hash": doc_hash, - } - - # Chunk the content - chunks = chunk_text(content) - - return [ - {"content": chunk, "metadata": metadata, "doc_hash": doc_hash} - for chunk in chunks - ] - - -def get_embeddings(text: str) -> Dict[str, List[float]]: - """Get embeddings using both OpenAI and Cohere models via LiteLLM.""" - # Get OpenAI embedding - openai_response = embedding(model="text-embedding-ada-002", input=[text]) - openai_embedding = openai_response["data"][0]["embedding"] - - # Get Cohere embedding - cohere_response = embedding( - model="cohere/embed-english-v3.0", - input=[text], - input_type="search_document", # Specific to Cohere v3 models - ) - cohere_embedding = cohere_response["data"][0]["embedding"] - - return {"openai": openai_embedding, "cohere": cohere_embedding} - - -def setup_qdrant_collection(): - """Create or recreate the vector collection.""" - # Delete if exists - try: - qdrant_client.delete_collection(COLLECTION_NAME) - except Exception: - pass - - # Create collection with two vector types - qdrant_client.create_collection( - collection_name=COLLECTION_NAME, - vectors_config={ - "openai": models.VectorParams( - size=OPENAI_EMBEDDING_DIM, distance=models.Distance.COSINE - ), - "cohere": models.VectorParams( - size=COHERE_EMBEDDING_DIM, distance=models.Distance.COSINE - ), - }, - ) - - -def upsert_chunks(chunks: List[Dict]): - """Upsert document chunks to the vector store.""" - for i, chunk in enumerate(chunks): - # Get both embeddings using LiteLLM - embeddings = get_embeddings(chunk["content"]) - - # Create payload - payload = {**chunk["metadata"], "content": chunk["content"], "chunk_index": i} - - # Upsert to Qdrant - qdrant_client.upsert( - collection_name=COLLECTION_NAME, - points=[ - models.PointStruct( - id=f"{chunk['doc_hash']}", - payload=payload, - vector=embeddings, # Contains both 'openai' and 'cohere' embeddings - ) - ], - ) - - -def main(): - # Get environment variables - docs_path = os.getenv("DOCS_PATH") - docs_base_url = os.getenv("DOCS_BASE_URL") - - if not docs_path or not docs_base_url: - raise ValueError("DOCS_PATH and DOCS_BASE_URL must be set in .env file") - - # Create fresh collection - setup_qdrant_collection() - - # Process all documents - all_docs = get_all_docs(docs_path) - for doc_path in tqdm.tqdm(all_docs): - print(f"Processing {doc_path}") - chunks = process_doc(doc_path, docs_path, docs_base_url) - upsert_chunks(chunks) -``` - -This script performs the following steps: - -1. **Loads documentation files:** Reads all `.mdx` files from the documentation directory. -2. **Processes documents:** Chunks the text, adds metadata (e.g. the url where the page where to be found).. -3. **Generates embeddings:** Generate embeddings for each chunk using both OpenAI and Cohere models. We use both because we would like to compare them in the playground. -4. **Stores embeddings in Qdrant:** Upserts the embeddings into a Qdrant collection for later retrieval. We use named vectors to save multiple embeddings for the same document. - -To run the ingestion pipeline, you need first to create a collection in Qdrant and then set the following environment variables: - -- `QDRANT_URL`: The URL of your Qdrant instance. -- `QDRANT_API_KEY`: The API key for your Qdrant instance. -- `DOCS_PATH`: The folder containing the documentation (in our case it's under `agenta/docs/docs`). -- `DOCS_BASE_URL`: The base URL where the documentation can be found (in our case it's `https://docs.agenta.ai`). - -:::info -The complete ingestion script with a setup readme is [available in Github](https://github.com/Agenta-AI/agenta/tree/main/examples/custom_workflows/rag-docs-qa). -::: - -## The query RAG workflow - -Now that we have ingested the documentation into the Qdrant vector database, let's create the query logic for our assistant. Parts related to the Agenta integrations are highlighted. - -```python title="query.py" -#highlight-start -import agenta as ag -from pydantic import BaseModel, Field -from agenta.sdk.assets import supported_llm_models -from agenta.sdk.types import MCField -#highlight-end - -system_prompt = """ -You are a helpful assistant that answers questions based on the documentation. -""" -user_prompt = """ -Here is the query: {query} - -Here is the context: {context} -""" -#highlight-start -ag.init() -#highlight-end - -#highlight-start -litellm.callbacks = [ag.callbacks.litellm_handler()] -#highlight-end - -# Initialize Qdrant client -qdrant_client = QdrantClient( - url=os.getenv("QDRANT_URL"), api_key=os.getenv("QDRANT_API_KEY") -) - -#highlight-start -# We define here the configuration that will be used by the playground -class Config(BaseModel): - system_prompt: str = Field(default=system_prompt) - user_prompt: str = Field(default=user_prompt) - embedding_model: str = MCField(default="openai", choices=["openai", "cohere"]) - llm_model: str = MCField(default="gpt-3.5-turbo", choices=supported_llm_models) - top_k: int = Field(default=10, ge=1, le=25) - rerank_top_k: int = Field(default=3, ge=1, le=10) - use_rerank: bool = Field(default=True) -#highlight-end - - -def get_embeddings(text: str, model: str) -> Dict[str, List[float]]: - """Get embeddings using both OpenAI and Cohere models via LiteLLM.""" - if model == "openai": - return embedding(model="text-embedding-ada-002", input=[text])["data"][0]["embedding"] - elif model == "cohere": - return embedding( - model="cohere/embed-english-v3.0", - input=[text], - input_type="search_query", # Use search_query for queries - )["data"][0]["embedding"] - - raise ValueError(f"Unknown model: {model}") - -#highlight-next-line -@ag.instrument() -def search_docs( - query: str, collection_name: str = os.getenv("COLLECTION_NAME", "docs_collection") -) -> List[Dict]: - """ - Search the documentation using embeddings. - - Args: - query: The search query - collection_name: Name of the Qdrant collection to search - - Returns: - List of dictionaries containing matched documents and their metadata - """ - - #highlight-start - # Get embeddings for the query - config = ag.ConfigManager.get_from_route(Config) - #highlight-end - # Search using embeddings - results = qdrant_client.query_points( - collection_name=collection_name, - query=get_embeddings(query, config.embedding_model), - using=config.embedding_model, - limit=config.top_k, - ) - # Format results - formatted_results = [] - for result in results.points: - formatted_result = { - "content": result.payload["content"], - "metadata": { - "title": result.payload["title"], - "url": result.payload["url"], - "score": result.score, - }, - } - formatted_results.append(formatted_result) - - return formatted_results - -#highlight-next-line -@ag.instrument() -def llm(query: str, results: List[Dict]): - #highlight-next-line - config = ag.ConfigManager.get_from_route(Config) - context = [] - for i, result in enumerate(results, 1): - score = result["metadata"].get("rerank_score", result["metadata"]["score"]) - item = f"Result {i} (Score: {score:.3f})\n" - item += f"Title: {result['metadata']['title']}\n" - item += f"URL: {result['metadata']['url']}\n" - item += f"Content: {result['content']}\n" - item += "-" * 80 + "\n" - context.append(item) - #highlight-start - # We store the context in the trace so that it can be used for evaluation - ag.tracing.store_internals({"context": context}) - #highlight-end - response = completion( - model=config.llm_model, - messages=[ - {"role": "system", "content": config.system_prompt}, - { - "role": "user", - "content": config.user_prompt.format( - query=query, context="".join(context) - ), - }, - ], - ) - return response.choices[0].message.content - -#highlight-next-line -@ag.instrument() -def rerank_results(query: str, results: List[Dict]) -> List[Dict]: - """Rerank the search results using Cohere's reranker.""" - #highlight-start - config = ag.ConfigManager.get_from_route(Config) - #highlight-end - # Format documents for reranking - documents = [result["content"] for result in results] - - # Perform reranking - reranked = rerank( - model="cohere/rerank-english-v3.0", - query=query, - documents=documents, - top_n=config.rerank_top_k, - ) - # Reorder the original results based on reranking - reranked_results = [] - for item in reranked.results: - # The rerank function returns dictionaries with 'document' and 'index' keys - reranked_results.append(results[item["index"]]) - # Add rerank score to metadata - reranked_results[-1]["metadata"]["rerank_score"] = item["relevance_score"] - - return reranked_results - -#highlight-start -# We define here the route that will be used by the playground -@ag.route("/", config_schema=Config) -@ag.instrument() -#highlight-end -def generate(query: str): - #highlight-next-line - config = ag.ConfigManager.get_from_route(Config) - results = search_docs(query) - if config.use_rerank: - reranked_results = rerank_results(query, results) - return llm(query, reranked_results) - else: - return llm(query, results) -``` - -Our system uses a standard RAG workflow consisting of three main steps: - -1. **Searching the documentation:** Uses the query to retrieve relevant documents from Qdrant. -2. **Optionally reranking results:** Improves the relevance of results using Cohere's reranker. -3. **Generating the answer:** Constructs a prompt with the query and context, then calls the LLM to generate the final answer. - -To integrate this script with Agenta, we need to make two main adjustments: - -1. **Instrumentation:** Use `@ag.instrument()` decorator to trace inputs, outputs, and internal variables. -2. **Integration with the Playground:** Use `ag.route()` to define a route and later create a service that will be used to test the app in the playground. - -We'll discuss these in more detail in the next sections. - -## Instrumentation - -Tracing captures the inputs and outputs of all functions and LLM calls in our app. This helps us debug multi-step workflows (for example, determining whether an incorrect response stems from the LLM call or from incorrect context) and monitor usage over time. - -```python -@ag.instrument() -def generate(query: str): - ... -``` - -Instrumenting code in Agenta is straightforward. The `@ag.instrument()` decorator lets you capture function inputs and outputs to create a trace tree. - -Agenta also provides auto-instrumentation for most frameworks and libraries. Since we're using litellm, we'll use Agenta's callback function to automatically instrument its calls. - -For RAG evaluation of our applications, we need to evaluate the relevancy of retrieved context for each query. Since context isn't part of any function's input or output, we'll add it manually to a span using `ag.tracing.store_internals({"context": context})`, which stores internal variables in the ongoing span. - -Trace view of the RAG Q&A assistant - -## Playground integration - -Agenta provides a custom playground for testing application parameters. Here, we can experiment with different embeddings, top_k values, and LLM models. - -Using the Agenta SDK, we'll define a configuration schema for our application and create an endpoint to enable playground communication. Then, we'll deploy the application to Agenta Cloud using the Agenta CLI for testing. Agenta handles all infrastructure work needed to create our application service. - -### Defining the configuration - -Let's define the configuration schema for our application. This schema will determine what elements appear in the playground UI and what parameters we can experiment with. - -Our configuration includes: - -- **System prompt:** The system prompt template -- **User prompt:** The user prompt template -- **Embedding model:** Choice between OpenAI and Cohere -- **LLM model:** Selection from supported language models -- **Top_k value:** Number of document chunks to retrieve from the vector database -- **Use rerank:** Toggle for Cohere's reranking feature -- **Rerank top_k value:** Number of chunks the reranker should return (used for both reordering and filtering) - -```python -from pydantic import BaseModel, Field -import agenta as ag -from agenta.sdk.assets import supported_llm_models -from agenta.sdk.types import MCField - -class Config(BaseModel): - system_prompt: str = Field(default=system_prompt) - user_prompt: str = Field(default=user_prompt) - embedding_model: str = MCField(default="openai", choices=["openai", "cohere"]) - llm_model: str = MCField(default="gpt-3.5-turbo", choices=supported_llm_models) - top_k: int = Field(default=10, ge=1, le=25) - rerank_top_k: int = Field(default=3, ge=1, le=10) - use_rerank: bool = Field(default=True) -``` - -We implement this using a standard `Config` Pydantic class that inherits from BaseModel. The fields use simple types (str or int). Agenta requires each field to have a default value. For multiple-choice fields, we use `MCField` to specify the available options. - -:::info -`supported_llm_models` is a helper variable provided by Agenta that contains the list available in LiteLLM. -::: - -### Creating the endpoint and using the configuration - -Next, we'll create an endpoint to enable communication between the playground and our application. - -```python -@ag.route("/", config_schema=Config) -def generate(query: str): - config = ag.ConfigManager.get_from_route(Config) - ... -``` - -[The decorator `@ag.route("/", config_schema=Config)`](https://www.notion.so/reference/sdk/custom-workflow#agroute-decorator) registers the `generate` function as an endpoint and uses the `Config` class to define the configuration schema. This creates a `POST /playground/run` endpoint that accepts the configuration as a parameter and runs the workflow. The playground uses this endpoint to interact with the service. - -To get the configuration from the request, we use `ag.ConfigManager.get_from_route(Config)`, which returns a Config object containing the values provided by the playground. - -We can use these configuration values throughout our workflow. For instance, we can use `config.use_rerank` in the `generate` function to control the reranking feature. - -Note that `ag.ConfigManager.get_from_route(Config)` is accessible in any function called within the generate function's execution path, as the configuration is preserved in the context. - -### Adding the application to Agenta - -To connect your application to Agenta, you first need to create a Uvicorn server using the FastAPI app object provided by Agenta. - -Add the following snippet to your application: - -```python -if __name__ == "__main__": - import uvicorn - uvicorn.run(ag.sdk.decorators.routing.app, host="0.0.0.0", port=8000) -``` - -This starts a local server at `http://0.0.0.0:8000`. To make it accessible from the internet, use a tunneling service like ngrok. - -Run the following command to start ngrok: - -```bash -ngrok http 8000 -``` - -ngrok will generate a public URL. Navigate to the overview page in Agenta, create a new custom workflow, and enter this URL. - -Once complete, you can access the playground and begin testing your application. - -Playground for testing the RAG Q&A assistant - -## Evaluating the assistant - -To ensure our assistant provides accurate and relevant answers, we'll use evaluators to assess its performance. We will create two evaluators: - -1. RAG Relevancy Evaluator: Measures how relevant the assistant's answers are with respect to the retrieved context. -2. LLM-as-a-Judge Evaluator: Rates the quality of the assistant's responses. - -For the first, we use the RAG Relevancy evaluator as described in [Agenta's evaluation documentation](/evaluation/configure-evaluators/rag-evaluators). - -**Configuration:** - -- **Question key:** `trace.generate.inputs.query` -- **Answer key:** `trace.generate.outputs` -- **Contexts key:** `trace.generate.llm.internals.context` - -This evaluator measures how relevant the assistant's answers are with respect to the retrieved context. Note that we use `trace.generate.llm.internals.context`, which we previously stored in the span, to get the context from the trace. - -You can use the evaluator playground to configure the evaluator and identify the correct trace data to use in your configuration (see image below). - -Configuration of the RAG Relevancy evaluator - -We set and test an LLM-as-a-Judge evaluator to rate the quality of the assistant's responses the same way. More details on setting up LLM-as-a-Judge evaluators can be found [here](/evaluation/configure-evaluators/llm-as-a-judge). - -## Deploying the assistant - -After iterating through various prompts and parameters and evaluating their performance, we can deploy our satisfied solution as an API endpoint using Agenta. - -Simply click the `Deploy` button in the playground to accomplish this. - -Agenta provides us with [two endpoints](/prompt-engineering/integrating-prompts/integrating-with-agenta) to interact with our deployed application: - -- The first allows us to directly invoke the deployed application with the production configuration. -- The second allows us to fetch the deployed configuration as a JSON and use it in our self-deployed application. - -## Conclusion - -In this tutorial, we built a documentation Q&A system using RAG, but more importantly, we created a comprehensive LLMOps workflow that includes: - -- A **playground** for testing different embeddings, prompts, and retrieval parameters in real time -- **Observability tools** for debugging multi-step RAG workflows and monitoring production performance -- **Evaluation pipelines** for assessing both RAG relevancy and response quality -- **Deployment capabilities** for smoothly transitioning from experimentation to production - -This workflow shows how to evolve beyond a basic RAG implementation to build a production-ready system with robust testing, monitoring, and iteration capabilities. diff --git a/docs/docs/tutorials/sdk/_evaluate-with-SDK.mdx b/docs/docs/tutorials/sdk/_evaluate-with-SDK.mdx deleted file mode 100644 index d390b7962e..0000000000 --- a/docs/docs/tutorials/sdk/_evaluate-with-SDK.mdx +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: "Run LLM Evaluations with SDK" -sidebar_label: "Evaluate with SDK" -description: Learn how to run LLM app evaluations programmatically using the Agenta SDK. This guide covers creating test sets, configuring evaluators, running evaluations, and retrieving results. ---- - -```mdx-code-block -import GoogleColabButton from "@site/src/components/GoogleColabButton"; -``` - -In this cookbook we will show how to interact with evaluation in agenta programatically. Either using the SDK (or the raw API). - -We will do the following: - -- Create a test set -- Create and configure an evaluator -- Run an evaluation -- Retrieve the results of evaluations - -We assume that you have already created an LLM application and variants in agenta. - - - Open in Google Colaboratory - -### Architectural Overview: - -In this scenario, evaluations are executed on the Agenta backend. Specifically, Agenta invokes the LLM application for each row in the test set and subsequently processes the output using the designated evaluator. -This operation is managed through Celery tasks. The interactions with the LLM application are asynchronous, batched, and include retry mechanisms. Additionally, the batching configuration can be adjusted to avoid exceeding the rate limits imposed by the LLM provider. - -## Setup - -```python -! pip install -U agenta -``` - -## Configuration Setup - -```python -# Assuming an application has already been created through the user interface, you will need to obtain the application ID. -# In this example we will use the default template single_prompt which has the prompt "Determine the capital of {country}" - -# You can find the application ID in the URL. For example, in the URL https://cloud.agenta.ai/apps/666dde95962bbaffdb0072b5/playground?variant=app.default, the application ID is `666dde95962bbaffdb0072b5`. -from agenta.client.client import AgentaApi -# Let's list the applications -client.apps.list_apps() -``` - -```python - -app_id = "667d8cfad1812781f7e375d9" - -# You can create the API key under the settings page. If you are using the OSS version, you should keep this as an empty string -api_key = "EUqJGOUu.xxxx" - -# Host. -host = "https://cloud.agenta.ai" - -# Initialize the client - -client = AgentaApi(base_url=host + "/api", api_key=api_key) -``` - -## Create a test set - -```python -from agenta.client.types.new_testset import NewTestset - -csvdata = [ - {"country": "france", "capital": "Paris"}, - {"country": "Germany", "capital": "paris"} - ] - -response = client.testsets.create_testset(request=NewTestset(name="test set", csvdata=csvdata)) -test_set_id = response.id - -# let's now update it - -csvdata = [ - {"country": "france", "capital": "Paris"}, - {"country": "Germany", "capital": "Berlin"} - ] - -client.testsets.update_testset(testset_id=test_set_id, request=NewTestset(name="test set", csvdata=csvdata)) -``` - -# Create evaluators - -```python -# Create an evaluator that performs an exact match comparison on the 'capital' column -# You can find the list of evaluator keys and evaluators and their configurations in https://github.com/Agenta-AI/agenta/blob/main/agenta-backend/agenta_backend/resources/evaluators/evaluators.py -response = client.evaluators.create_new_evaluator_config(app_id=app_id, name="capital_evaluator", evaluator_key="auto_exact_match", settings_values={"correct_answer_key": "capital"}) -exact_match_eval_id = response.id - -code_snippet = """ -from typing import Dict - -def evaluate( - app_params: Dict[str, str], - inputs: Dict[str, str], - output: str, # output of the llm app - datapoint: Dict[str, str] # contains the testset row -) -> float: - if output and output[0].isupper(): - return 1.0 - else: - return 0.0 -""" - -response = client.evaluators.create_new_evaluator_config(app_id=app_id, name="capital_letter_evaluator", evaluator_key="auto_custom_code_run", settings_values={"code": code_snippet}) -letter_match_eval_id = response.id -``` - -```python -# get list of all evaluators -client.evaluators.get_evaluator_configs(app_id=app_id) -``` - -# Run an evaluation - -```python -response = client.apps.list_app_variants(app_id=app_id) -print(response) -myvariant_id = response[0].variant_id -``` - -```python -# Run an evaluation -from agenta.client.types.llm_run_rate_limit import LlmRunRateLimit -response = client.evaluations.create_evaluation(app_id=app_id, variant_ids=[myvariant_id], testset_id=test_set_id, evaluators_configs=[exact_match_eval_id, letter_match_eval_id], - rate_limit=LlmRunRateLimit( - batch_size=10, # number of rows to call in parallel - max_retries=3, # max number of time to retry a failed llm call - retry_delay=2, # delay before retrying a failed llm call - delay_between_batches=5, # delay between batches - ),) -print(response) -``` - -```python -# check the status -client.evaluations.fetch_evaluation_status('667d98fbd1812781f7e3761a') -``` - -```python -# fetch the overall results -response = client.evaluations.fetch_evaluation_results('667d98fbd1812781f7e3761a') - -results = [(evaluator["evaluator_config"]["name"], evaluator["result"]) for evaluator in response["results"]] -# End of Selection -``` - -```python -# fetch the detailed results -client.evaluations.fetch_evaluation_scenarios(evaluations_ids='667d98fbd1812781f7e3761a') -``` diff --git a/docs/docs/tutorials/sdk/evaluate-with-SDK.mdx b/docs/docs/tutorials/sdk/evaluate-with-SDK.mdx new file mode 100644 index 0000000000..82ff20c03d --- /dev/null +++ b/docs/docs/tutorials/sdk/evaluate-with-SDK.mdx @@ -0,0 +1,152 @@ +--- +title: "Evaluate with SDK" +--- + +:::note +This guide is also available as a [Jupyter Notebook](https://github.com/Agenta-AI/agenta/blob/main/cookbook/evaluations_with_sdk.ipynb). +::: + +# Using evaluations with the SDK + +In this cookbook we will show how to interact with evaluation in agenta programatically. Either using the SDK (or the raw API). + +We will do the following: + +- Create a test set +- Create and configure an evaluator +- Run an evaluation +- Retrieve the results of evaluations + +We assume that you have already created an LLM application and variants in agenta. + +### Architectural Overview: + +In this scenario, evaluations are executed on the Agenta backend. Specifically, Agenta invokes the LLM application for each row in the test set and subsequently processes the output using the designated evaluator. +This operation is managed through Celery tasks. The interactions with the LLM application are asynchronous, batched, and include retry mechanisms. Additionally, the batching configuration can be adjusted to avoid exceeding the rate limits imposed by the LLM provider. + +## Setup + +```python +! pip install -U agenta +``` + +## Configuration Setup + +```python +# Assuming an application has already been created through the user interface, you will need to obtain the application ID. +# In this example we will use the default template single_prompt which has the prompt "Determine the capital of {country}" + +# You can find the application ID in the URL. For example, in the URL https://cloud.agenta.ai/apps/666dde95962bbaffdb0072b5/playground?variant=app.default, the application ID is `666dde95962bbaffdb0072b5`. +from agenta.client.client import AgentaApi +# Let's list the applications +client.apps.list_apps() +``` + +```python + +app_id = "667d8cfad1812781f7e375d9" + +# You can create the API key under the settings page. If you are using the OSS version, you should keep this as an empty string +api_key = "EUqJGOUu.xxxx" + +# Host. +host = "https://cloud.agenta.ai" + +# Initialize the client + +client = AgentaApi(base_url=host + "/api", api_key=api_key) +``` + +## Create a test set + +```python +from agenta.client.types.new_testset import NewTestset + +csvdata = [ + {"country": "france", "capital": "Paris"}, + {"country": "Germany", "capital": "paris"} + ] + +response = client.testsets.create_testset(request=NewTestset(name="test set", csvdata=csvdata)) +test_set_id = response.id + +# let's now update it + +csvdata = [ + {"country": "france", "capital": "Paris"}, + {"country": "Germany", "capital": "Berlin"} + ] + +client.testsets.update_testset(testset_id=test_set_id, request=NewTestset(name="test set", csvdata=csvdata)) +``` + +# Create evaluators + +```python +# Create an evaluator that performs an exact match comparison on the 'capital' column +# You can find the list of evaluator keys and evaluators and their configurations in https://github.com/Agenta-AI/agenta/blob/main/agenta-backend/agenta_backend/resources/evaluators/evaluators.py +response = client.evaluators.create_new_evaluator_config(app_id=app_id, name="capital_evaluator", evaluator_key="auto_exact_match", settings_values={"correct_answer_key": "capital"}) +exact_match_eval_id = response.id + +code_snippet = """ +from typing import Dict + +def evaluate( + app_params: Dict[str, str], + inputs: Dict[str, str], + output: str, # output of the llm app + datapoint: Dict[str, str] # contains the testset row +) -> float: + if output and output[0].isupper(): + return 1.0 + else: + return 0.0 +""" + +response = client.evaluators.create_new_evaluator_config(app_id=app_id, name="capital_letter_evaluator", evaluator_key="auto_custom_code_run", settings_values={"code": code_snippet}) +letter_match_eval_id = response.id +``` + +```python +# get list of all evaluators +client.evaluators.get_evaluator_configs(app_id=app_id) +``` + +# Run an evaluation + +```python +response = client.apps.list_app_variants(app_id=app_id) +print(response) +myvariant_id = response[0].variant_id +``` + +```python +# Run an evaluation +from agenta.client.types.llm_run_rate_limit import LlmRunRateLimit +response = client.evaluations.create_evaluation(app_id=app_id, variant_ids=[myvariant_id], testset_id=test_set_id, evaluators_configs=[exact_match_eval_id, letter_match_eval_id], + rate_limit=LlmRunRateLimit( + batch_size=10, # number of rows to call in parallel + max_retries=3, # max number of time to retry a failed llm call + retry_delay=2, # delay before retrying a failed llm call + delay_between_batches=5, # delay between batches + ),) +print(response) +``` + +```python +# check the status +client.evaluations.fetch_evaluation_status('667d98fbd1812781f7e3761a') +``` + +```python +# fetch the overall results +response = client.evaluations.fetch_evaluation_results('667d98fbd1812781f7e3761a') + +results = [(evaluator["evaluator_config"]["name"], evaluator["result"]) for evaluator in response["results"]] +# End of Selection +``` + +```python +# fetch the detailed results +client.evaluations.fetch_evaluation_scenarios(evaluations_ids='667d98fbd1812781f7e3761a') +``` diff --git a/docs/docs/tutorials/sdk/manage-prompts-with-SDK.mdx b/docs/docs/tutorials/sdk/manage-prompts-with-SDK.mdx index b9316454b4..4532ae3852 100644 --- a/docs/docs/tutorials/sdk/manage-prompts-with-SDK.mdx +++ b/docs/docs/tutorials/sdk/manage-prompts-with-SDK.mdx @@ -3,22 +3,17 @@ title: "Manage Prompts with SDK" --- import Image from "@theme/IdealImage"; -import GoogleColabButton from "@site/src/components/GoogleColabButton"; You can manage prompts easily through Agenta's web UI. But sometimes you might want to do things programmatically instead of using the interface. In this tutorial, we'll use the Agenta SDK to create a new prompt, commit changes, deploy them to production, then fetch their configuration and use it to call the LLM. - - Open in Google Colaboratory - - ## Tutorial Overview Before we begin, let's quickly review how Agenta versions prompts: Agenta follows a structure similar to **git** for prompt versioning. Instead of having one commit history, it uses **multiple branches (called variants)** where changes can be committed, and **environments** where these changes can be deployed (and used in your application). (You can read more about why we chose this approach [here](/concepts/concepts#motivation)). -You can find more about how prompt versioning works in the [concepts page](/prompt-engineering/concepts). +You can find more about how prompt versioning works in the [concepts page](/concepts/concepts). The workflow for deploying a change to production that we'll follow in this tutorial is: @@ -44,22 +39,14 @@ ag.init() ## Creating a new prompt -We're going to create a new completion prompt called `topic-explainer`. - +Each prompt in Agenta is a unique application. Currently, creating a prompt is only available in the web UI. To create a new prompt, click on "Create a new prompt" and select whether it's a chat or completion prompt. The name of the prompt is the slug we'll use for all operations below. -```Python -# Creates an empty application -app = ag.AppManager.create( - app_slug="topic-explainer", - template_key="SERVICE:completion", # we define here the app type, choices are SERVICE:completion, SERVICE:chat, CUSTOM -) -``` -:::warning -The app created until now is empty. You cannot use it from the UI yet. You need to create a variant and commit changes to it to be able to use it (next section). -::: +We're going to create a new completion prompt called `topic-explainer`. ## Creating a new variant +[Todo: Image showing before and after. The new elements are added in different colors] + Variants are similar to branches in **git**. Any change to the prompt must first be committed to a variant. Here, we'll create a new variant and make our first commit to it using the `VariantManager.create` method: ```python diff --git a/docs/docs/tutorials/videos/creating-test-sets-from-production-data.md b/docs/docs/tutorials/videos/creating-test-sets-from-production-data.md index 3289570b7c..2c56ba11f7 100644 --- a/docs/docs/tutorials/videos/creating-test-sets-from-production-data.md +++ b/docs/docs/tutorials/videos/creating-test-sets-from-production-data.md @@ -82,7 +82,7 @@ Once you have a test set, you can use it in several ways: - Compare your application's output against ground truth answers - Measure performance across different variants -For more information on evaluations, see our [Evaluation documentation](/evaluation/concepts). +For more information on evaluations, see our [Evaluation documentation](/evaluation/overview). ## Test Set Best Practices @@ -102,8 +102,8 @@ For more information on evaluations, see our [Evaluation documentation](/evaluat Even with just inputs (no ground truth), you can evaluate your application using: -1. **[Human evaluation](/evaluation/human-evaluation/quick-start)**: Have people review the outputs for quality -2. **[LLM as a judge](/evaluation/configure-evaluators/llm-as-a-judge)**: Use a prompt that assesses outputs based on criteria like relevance or accuracy +1. **[Human evaluation](/evaluation/human_evaluation)**: Have people review the outputs for quality +2. **[LLM as a judge](/evaluation/evaluators/llm-as-a-judge)**: Use a prompt that assesses outputs based on criteria like relevance or accuracy Adding ground truth expands your evaluation options, allowing you to: - Compare outputs against expected answers @@ -112,6 +112,6 @@ Adding ground truth expands your evaluation options, allowing you to: ## Related Resources -- [Creating Test Sets](/evaluation/managing-test-sets/upload-csv) -- [Configuring Evaluators](/evaluation/configure-evaluators/overview) -- [Running Evaluations](/evaluation/evaluation-from-ui/running-evaluations) +- [Creating Test Sets](/evaluation/create-test-sets) +- [Configuring Evaluators](/evaluation/configure-evaluators) +- [Running Evaluations](/evaluation/no-code-evaluation) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 4d89dcdcfd..969f994f28 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -23,7 +23,7 @@ const config: Config = { titleDelimiter: "-", // Even if you don't use internationalization, you can use this field to set // useful metadata like html lang. For example, if your site is Chinese, you - // may want to replace "en" with "zh-Hans". + // may want to replace "en" with "zh-Hans". i18n: { defaultLocale: "en", locales: ["en"], @@ -84,8 +84,8 @@ const config: Config = { navbar: { logo: { alt: "agenta-ai", - src: "images/Agenta-logo-full-light.png", - srcDark: "images/Agenta-logo-full-dark-accent.png", + src: "images/light-complete-transparent-CROPPED.png", + srcDark: "images/dark-complete-transparent-CROPPED.png", }, hideOnScroll: false, items: [ @@ -95,64 +95,33 @@ const config: Config = { docId: "getting-started/introduction", position: "left", label: "Docs", - customProps: { - icon: { - name: "fileText", - }, - }, }, { type: "docSidebar", sidebarId: "guidesSidebar", position: "left", label: "Tutorials", - customProps: { - icon: { - name: "bookOpen", - }, - }, }, { type: "docSidebar", sidebarId: "refrenceSidebar", position: "left", label: "Reference", - customProps: { - icon: { - name: "code", - }, - }, }, { - to: "/roadmap", + to: "/changelog/main", position: "left", - label: "Roadmap", - customProps: { - icon: { - name: "route", - }, - }, + label: "Changelog", }, { - to: "/changelog/main", + to: "https://agenta.ai/pricing", position: "left", - label: "Changelog", - customProps: { - icon: { - name: "clock", - }, - }, + label: "Pricing", }, { - type: "docSidebar", - sidebarId: "selfHostSidebar", + to: "https://agenta.ai/blog", position: "left", - label: "Self-host", - customProps: { - icon: { - name: "server", - }, - }, + label: "Blog", }, // { @@ -258,7 +227,6 @@ const config: Config = { ], } satisfies Preset.ThemeConfig, algolia: { - askAi: 'I14hRlCxbWzW', appId: "0HZ4ONM2EC", apiKey: "18ab633e81d706cbda7c78d25d0fe763", indexName: "agenta", @@ -335,7 +303,7 @@ const config: Config = { }, { from: "/prompt-management/overview", - to: "/prompt-engineering/concepts", + to: "/prompt-engineering/overview", }, { from: "/prompt-management/quick-start", @@ -343,27 +311,27 @@ const config: Config = { }, { from: "/prompt-management/prompt-management-sdk", - to: "/prompt-engineering/managing-prompts-programatically/create-and-commit", + to: "/prompt-engineering/prompt-management/prompt-management-sdk", }, { from: "/prompt-management/adding-custom-providers", - to: "/prompt-engineering/playground/custom-providers", + to: "/prompt-engineering/playground/adding-custom-providers", }, { from: "/prompt-management/using-the-playground", - to: "/prompt-engineering/playground/using-playground", + to: "/prompt-engineering/playground/using-the-playground", }, { from: "/prompt-management/integration/how-to-integrate-with-agenta", - to: "/prompt-engineering/integrating-prompts/integrating-with-agenta", + to: "/prompt-engineering/prompt-management/how-to-integrate-with-agenta", }, { from: "/prompt-management/integration/fetch-prompts", - to: "/prompt-engineering/integrating-prompts/fetch-prompt-programatically", + to: "/prompt-engineering/prompt-management/how-to-integrate-with-agenta", }, { from: "/prompt-management/integration/proxy-calls", - to: "/prompt-engineering/integrating-prompts/proxy-calls", + to: "/prompt-engineering/prompt-management/proxy-calls", }, { from: "/self-host/host-locally", @@ -380,137 +348,6 @@ const config: Config = { { from: "/self-host/applying-schema-migration", to: "/self-host/upgrading", - }, - // Prompt Engineering restructure redirects - { - from: "/prompt-engineering/overview", - to: "/prompt-engineering/concepts", - }, - { - from: "/prompt-engineering/prompt-management/how-to-integrate-with-agenta", - to: "/prompt-engineering/integrating-prompts/integrating-with-agenta", - }, - { - from: "/prompt-engineering/prompt-management/prompt-management-sdk", - to: "/prompt-engineering/managing-prompts-programatically/create-and-commit", - }, - { - from: "/prompt-engineering/prompt-management/proxy-calls", - to: "/prompt-engineering/integrating-prompts/proxy-calls", - }, - { - from: "/prompt-engineering/playground/using-the-playground", - to: "/prompt-engineering/playground/using-playground", - }, - { - from: "/prompt-engineering/playground/adding-custom-providers", - to: "/prompt-engineering/playground/custom-providers", - }, - // Evaluation restructure redirects - { - from: "/evaluation/create-test-sets", - to: "/evaluation/managing-test-sets/upload-csv", - }, - { - from: "/evaluation/no-code-evaluation", - to: "/evaluation/evaluation-from-ui/running-evaluations", - }, - { - from: "/evaluation/sdk-evaluation", - to: "/evaluation/concepts", - }, - { - from: "/evaluation/configure-evaluators", - to: "/evaluation/configure-evaluators/overview", - }, - { - from: "/evaluation/human_evaluation", - to: "/evaluation/human-evaluation/quick-start", - }, - { - from: "/evaluation/annotate-api", - to: "/observability/trace-with-python-sdk/annotate-traces", - }, - { - from: "/evaluation/evaluators/classification-entiry-extraction", - to: "/evaluation/configure-evaluators/classification-entity-extraction", - }, - { - from: "/evaluation/evaluators/pattern-matching", - to: "/evaluation/configure-evaluators/regex-evaluator", - }, - { - from: "/evaluation/configure-evaluators/pattern-matching", - to: "/evaluation/configure-evaluators/regex-evaluator", - }, - { - from: "/evaluation/evaluators/semantic-similarity", - to: "/evaluation/configure-evaluators/semantic-similarity", - }, - { - from: "/evaluation/evaluators/llm-as-a-judge", - to: "/evaluation/configure-evaluators/llm-as-a-judge", - }, - { - from: "/evaluation/evaluators/rag-evaluators", - to: "/evaluation/configure-evaluators/rag-evaluators", - }, - { - from: "/evaluation/evaluators/custom-evaluator", - to: "/evaluation/configure-evaluators/custom-evaluator", - }, - { - from: "/evaluation/evaluators/webhook-evaluator", - to: "/evaluation/configure-evaluators/webhook-evaluator", - }, - { - from: "/evaluation/quick-start-ui", - to: "/evaluation/evaluation-from-ui/quick-start", - }, - { - from: "/evaluation/quick-start-sdk", - to: "/evaluation/concepts", - }, - { - from: "/evaluation/overview", - to: "/evaluation/concepts", - }, - // Observability restructure redirects - { - from: "/observability/observability-sdk", - to: "/observability/trace-with-python-sdk/setup-tracing", - }, - { - from: "/observability/opentelemetry", - to: "/observability/trace-with-opentelemetry/distributed-tracing", - }, - { - from: "/observability/otel-semconv", - to: "/observability/trace-with-opentelemetry/semantic-conventions", - }, - { - from: "/observability/overview", - to: "/observability/concepts", - }, - { - from: "/observability/quickstart", - to: "/observability/quickstart-python", - }, - { - from: "/observability/trace-with-opentelemetry/setup-tracing", - to: "/observability/trace-with-opentelemetry/getting-started", - }, - { - from: "/observability/using-the-ui/filtering-traces", - to: "/observability/concepts", - }, - { - from: "/observability/concepts/semantic-conventions", - to: "/observability/trace-with-opentelemetry/semantic-conventions", - }, - { - from: "/reference/api", - to: "/reference/api/category", } ], createRedirects(existingPath) { @@ -545,3 +382,4 @@ const config: Config = { export default async function createConfig() { return config; } + diff --git a/docs/package-lock.json b/docs/package-lock.json index 91fe047adb..ea5854d94a 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9,18 +9,17 @@ "version": "0.0.0", "dependencies": { "@cloudflare/stream-react": "1.9.1", - "@docsearch/react": "^4.2.0", - "@docusaurus/core": "^3.9.2", - "@docusaurus/plugin-client-redirects": "^3.9.2", - "@docusaurus/plugin-content-docs": "^3.9.2", - "@docusaurus/plugin-ideal-image": "^3.9.2", - "@docusaurus/preset-classic": "^3.9.2", - "@docusaurus/theme-search-algolia": "^3.9.2", + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-client-redirects": "^3.4.0", + "@docusaurus/plugin-content-docs": "^3.5.2", + "@docusaurus/plugin-ideal-image": "^3.4.0", + "@docusaurus/preset-classic": "3.4.0", + "@docusaurus/theme-search-algolia": "^3.5.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "docusaurus-plugin-image-zoom": "^2.0.0", - "docusaurus-plugin-openapi-docs": "^4.5.1", - "docusaurus-theme-openapi-docs": "^4.5.1", + "docusaurus-plugin-openapi-docs": "3.0.1", + "docusaurus-theme-openapi-docs": "3.0.1", "dotenv": "^16.4.5", "posthog-docusaurus": "^2.0.1", "prism-react-renderer": "^2.3.0", @@ -28,9 +27,9 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", + "@docusaurus/module-type-aliases": "^3.5.2", + "@docusaurus/tsconfig": "^3.5.2", + "@docusaurus/types": "^3.5.2", "tailwindcss": "^3.4.10", "typescript": "^5.5.4" }, @@ -38,117 +37,45 @@ "node": ">=18.0" } }, - "node_modules/@ai-sdk/gateway": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.5.tgz", - "integrity": "sha512-5TTDSl0USWY6YGnb4QmJGplFZhk+p9OT7hZevAaER6OGiZ17LB1GypsGYDpNo/MiVMklk8kX4gk6p1/R/EiJ8Q==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.15", - "@vercel/oidc": "3.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.15.tgz", - "integrity": "sha512-kOc6Pxb7CsRlNt+sLZKL7/VGQUd7ccl3/tIK+Bqf5/QhHR0Qm3qRBMz1IwU1RmjJEZA73x+KB5cUckbDl2WF7Q==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "2.0.86", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.86.tgz", - "integrity": "sha512-vqxbbMOKMpYFHZy0aYEO4jtDcKaFCHL/rEtTqAIDlH14GT0uusSjN99gkDHHG3EnbyJSQmk9gqtqbd1GDwlRRg==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider-utils": "3.0.15", - "ai": "5.0.86", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "zod": "^3.25.76 || ^4.1.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.8.0.tgz", - "integrity": "sha512-Hb4BkGNnvgCj3F9XzqjiFTpA5IGkjOXwGAOV13qtc27l2qNF8X9rzSp1H5hu8XewlC0DzYtQtZZIOYzRZDyuXg==", + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" - }, - "engines": { - "node": ">= 14.0.0" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" } }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" + "@algolia/autocomplete-shared": "1.17.9" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" } }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.19.2" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { - "search-insights": ">= 1 < 3" + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -160,7 +87,6 @@ "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/cache-common": "4.24.0" } @@ -169,29 +95,27 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@algolia/cache-in-memory": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/cache-common": "4.24.0" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.42.0.tgz", - "integrity": "sha512-JLyyG7bb7XOda+w/sp8ch7rEVy6LnWs3qtxr6VJJ2XIINqGsY6U+0L3aJ6QFliBRNUeEAr2QBDxSm8u9Sal5uA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.24.0.tgz", + "integrity": "sha512-pNTIB5YqVVwu6UogvdX8TqsRZENaflqMMjdY7/XIPMNGrBoNH9tewINLI7+qc9tIaOLcAp3ZldqoEwAihZZ3ig==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -202,7 +126,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/client-search": "4.24.0", @@ -214,7 +137,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -225,7 +147,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -237,7 +158,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/client-search": "4.24.0", @@ -250,7 +170,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -261,7 +180,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -269,24 +187,24 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.42.0.tgz", - "integrity": "sha512-6iiFbm2tRn6B2OqFv9XDTcw5LdWPudiJWIbRk+fsTX+hkPrPm4e1/SbU+lEYBciPoaTShLkDbRge4UePEyCPMQ==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.24.0.tgz", + "integrity": "sha512-p8K6tiXQTebRBxbrzWIfGCvfkT+Umml+2lzI92acZjHsvl6KYH6igOfVstKqXJRei9pvRzEEvVDNDLXDVleGTA==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.42.0.tgz", - "integrity": "sha512-iEokmw2k6FBa8g/TT7ClyEriaP/FUEmz3iczRoCklEHWSgoABMkaeYrxRXrA2yx76AN+gyZoC8FX0iCJ55dsOg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.24.0.tgz", + "integrity": "sha512-jOHF0+tixR3IZJMhZPquFNdCVPzwzzXoiqVsbTvfKojeaY6ZXybgUiTSB8JNX+YpsUT8Ebhu3UvRy4mw2PbEzw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -297,7 +215,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -309,37 +226,36 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.42.0.tgz", - "integrity": "sha512-9+BIw6rerUfA+eLMIS2lF4mgoeBGTCIHiqb35PLn3699Rm3CaJXz03hChdwAWcA6SwGw0haYXYJa7LF0xI6EpA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.24.0.tgz", + "integrity": "sha512-F8ypOedSMhz6W7zuT5O1SXXsdXSOVhY2U6GkRbYk/mzrhs3jWFR3uQIfeQVWmsJjUwIGZmPoAr9E+T/Zm2M4wA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.42.0.tgz", - "integrity": "sha512-NZR7yyHj2WzK6D5X8gn+/KOxPdzYEXOqVdSaK/biU8QfYUpUuEA0sCWg/XlO05tPVEcJelF/oLrrNY3UjRbOww==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.24.0.tgz", + "integrity": "sha512-k+nuciQuq7WERNNE+hsx3DX636zIy+9R4xdtvW3PANT2a2BDGOv3fv2mta8+QUMcVTVcGe/Mo3QCb4pc1HNoxA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -352,15 +268,15 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.42.0.tgz", - "integrity": "sha512-MBkjRymf4BT6VOvMpJlg6kq8K+PkH9q+N+K4YMNdzTXlL40YwOa1wIWQ5LxP/Jhlz64kW5g9/oaMWY06Sy9dcw==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.24.0.tgz", + "integrity": "sha512-/lqVxmrvwoA+OyVK4XLMdz/PJaCTW4qYchX1AZ+98fdnH3K6XM/kMydQLfP0bUNGBQbmVrF88MqhqZRnZEn/MA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -370,29 +286,27 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@algolia/logger-console": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/logger-common": "4.24.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.42.0.tgz", - "integrity": "sha512-kmLs7YfjT4cpr4FnhhRmnoSX4psh9KYZ9NAiWt/YcUV33m0B/Os5L4QId30zVXkOqAPAEpV5VbDPWep+/aoJdQ==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.24.0.tgz", + "integrity": "sha512-cRisDXQJhvfZCXL4hD22qca2CmW52TniOx6L7pvkaBDx0oQk1k9o+3w11fgfcCG+47OndMeNx5CMpu+K+COMzg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -403,7 +317,6 @@ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/cache-browser-local-storage": "4.24.0", "@algolia/cache-common": "4.24.0", @@ -423,7 +336,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/requester-common": "4.24.0", "@algolia/transporter": "4.24.0" @@ -434,7 +346,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "4.24.0", "@algolia/requester-common": "4.24.0", @@ -446,7 +357,6 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/requester-common": "4.24.0" } @@ -456,18 +366,17 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/requester-common": "4.24.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.42.0.tgz", - "integrity": "sha512-EbuxgteaYBlKgc2Fs3JzoPIKAIaevAIwmv1F+fakaEXeibG4pkmVNsyTUjpOZIgJ1kXeqNvDrcjRb6g3vYBJ9A==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.24.0.tgz", + "integrity": "sha512-B2Gc+iSxct1WSza5CF6AgfNgmLvVb61d5bqmIWUZixtJIhyAC6lSQZuF+nvt+lmKhQwuY2gYjGGClil8onQvKQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0" + "@algolia/client-common": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -477,28 +386,27 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@algolia/requester-fetch": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.42.0.tgz", - "integrity": "sha512-4vnFvY5Q8QZL9eDNkywFLsk/eQCRBXCBpE8HWs8iUsFNHYoamiOxAeYMin0W/nszQj6abc+jNxMChHmejO+ftQ==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.24.0.tgz", + "integrity": "sha512-6E5+hliqGc5w8ZbyTAQ+C3IGLZ/GiX623Jl2bgHA974RPyFWzVSj4rKqkboUAxQmrFY7Z02ybJWVZS5OhPQocA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0" + "@algolia/client-common": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.42.0.tgz", - "integrity": "sha512-gkLNpU+b1pCIwk1hKTJz2NWQPT8gsfGhQasnZ5QVv4jd79fKRL/1ikd86P0AzuIQs9tbbhlMwxsSTyJmlq502w==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.24.0.tgz", + "integrity": "sha512-zM+nnqZpiQj20PyAh6uvgdSz+hD7Rj7UfAZwizqNP+bLvcbGXZwABERobuilkCQqyDBBH4uv0yqIcPRl8dSBEg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0" + "@algolia/client-common": "5.24.0" }, "engines": { "node": ">= 14.0.0" @@ -509,7 +417,6 @@ "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/cache-common": "4.24.0", "@algolia/logger-common": "4.24.0", @@ -2254,9 +2161,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", "funding": [ { "type": "github", @@ -2272,14 +2179,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "funding": [ { "type": "github", @@ -2296,9 +2203,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", "funding": [ { "type": "github", @@ -2314,14 +2221,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", "funding": [ { "type": "github", @@ -2334,21 +2241,21 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "funding": [ { "type": "github", @@ -2364,13 +2271,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "funding": [ { "type": "github", @@ -2387,9 +2294,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", "funding": [ { "type": "github", @@ -2405,43 +2312,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-alpha-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", "funding": [ { "type": "github", @@ -2500,38 +2378,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.9.tgz", + "integrity": "sha512-2UeQCGMO5+EeQsPQK2DqXp0dad+P6nIz6G2dI06APpBuYBKxZEq7CTH+UiztFQ8cB1f89dnO9+D/Kfr+JfI2hw==", "funding": [ { "type": "github", @@ -2544,10 +2393,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2558,38 +2407,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.9.tgz", + "integrity": "sha512-Enj7ZIIkLD7zkGCN31SZFx4H1gKiCs2Y4taBo/v/cqaHN7p1qGrf5UTMNSjQFZ7MgClGufHx4pddwFTGL+ipug==", "funding": [ { "type": "github", @@ -2602,10 +2422,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2616,37 +2436,9 @@ } }, "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.5.tgz", + "integrity": "sha512-9BOS535v6YmyOYk32jAHXeddRV+iyd4vRcbrEekpwxmueAXX5J8WgbceFnE4E4Pmw/ysnB9v+n/vSWoFmcLMcA==", "funding": [ { "type": "github", @@ -2659,10 +2451,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2673,9 +2464,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.8.tgz", + "integrity": "sha512-vHgDXtGIBPpFQnFNDftMQg4MOuXcWnK91L/7REjBNYzQ/p2Fa/6RcnehTqCRrNtQ46PNIolbRsiDdDuxiHolwQ==", "funding": [ { "type": "github", @@ -2688,9 +2479,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { "node": ">=18" @@ -2726,9 +2517,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.9.tgz", + "integrity": "sha512-quksIsFm3DGsf8Qbr9KiSGBF2w3RwxSfOfma5wbORDB1AFF15r4EVW7sUuWw3s5IAEGMqzel/dE2rQsI7Yb8mA==", "funding": [ { "type": "github", @@ -2741,9 +2532,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { "node": ">=18" @@ -2753,9 +2544,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.9.tgz", + "integrity": "sha512-duqTeUHF4ambUybAmhX9KonkicLM/WNp2JjMUbegRD4O8A/tb6fdZ7jUNdp/UUiO1FIdDkMwmNw6856bT0XF8Q==", "funding": [ { "type": "github", @@ -2768,10 +2559,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2782,9 +2573,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.9.tgz", + "integrity": "sha512-sDpdPsoGAhYl/PMSYfu5Ez82wXb2bVkg1Cb8vsRLhpXhAk4OSlsJN+GodAql6tqc1B2G/WToxsFU6G74vkhPvA==", "funding": [ { "type": "github", @@ -2797,10 +2588,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2811,9 +2602,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.1.tgz", + "integrity": "sha512-lECc38i1w3qU9nhrUhP6F8y4BfcQJkR1cb8N6tZNf2llM6zPkxnqt04jRCwsUgNcB3UGKDy+zLenhOYGHqCV+Q==", "funding": [ { "type": "github", @@ -2826,7 +2617,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2860,9 +2651,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", "funding": [ { "type": "github", @@ -2921,9 +2712,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.8.tgz", + "integrity": "sha512-v8VU5WtrZIyEtk88WB4fkG22TGd8HyAfSFfZZQ1uNN0+arMJdZc++H3KYTfbYDpJRGy8GwADYH8ySXiILn+OyA==", "funding": [ { "type": "github", @@ -2936,9 +2727,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3040,9 +2831,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", "funding": [ { "type": "github", @@ -3055,7 +2846,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3066,9 +2857,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.8.tgz", + "integrity": "sha512-Skum5wIXw2+NyCQWUyfstN3c1mfSh39DRAo+Uh2zzXOglBG8xB9hnArhYFScuMZkzeM+THVa//mrByKAfumc7w==", "funding": [ { "type": "github", @@ -3081,10 +2872,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { "node": ">=18" @@ -3094,9 +2885,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", "funding": [ { "type": "github", @@ -3109,9 +2900,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { "node": ">=18" @@ -3172,9 +2963,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.9.tgz", + "integrity": "sha512-UHrnujimwtdDw8BYDcWJtBXuJ13uc/BjAddPdfMc/RsWxhg8gG8UbvTF0tnMtHrZ4i7lwy85fPEzK1AiykMyRA==", "funding": [ { "type": "github", @@ -3187,10 +2978,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3201,9 +2992,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.1.tgz", + "integrity": "sha512-Ofz81HaY8mmbP8/Qr3PZlUzjsyV5WuxWmvtYn+jhYGvvjFazTmN9R2io5W5znY1tyk2CA9uM0IPWyY4ygDytCw==", "funding": [ { "type": "github", @@ -3226,9 +3017,9 @@ } }, "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.0.tgz", + "integrity": "sha512-MYZKxSr4AKfjECL8vg49BbfNNzK+t3p2OWX+Xf7rXgMaTP44oy/e8VGWu4MLnJ3NUd9tFVkisLO/sg+5wMTNsg==", "funding": [ { "type": "github", @@ -3241,9 +3032,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { "node": ">=18" @@ -3253,9 +3044,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.9.tgz", + "integrity": "sha512-+AGOcLF5PmMnTRPnOdCvY7AwvD5veIOhTWbJV6vC3hB1tt0ii/k6QOwhWfsGGg1ZPQ0JY15u+wqLR4ZTtB0luA==", "funding": [ { "type": "github", @@ -3268,10 +3059,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3320,9 +3111,9 @@ } }, "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.3.tgz", + "integrity": "sha512-4F4GRhj8xNkBtLZ+3ycIhReaDfKJByXI+cQGIps3AzCO8/CJOeoDPxpMnL5vqZrWKOceSATHEQJUO/Q/r2y7OQ==", "funding": [ { "type": "github", @@ -3335,9 +3126,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { "node": ">=18" @@ -3347,9 +3138,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.8.tgz", + "integrity": "sha512-6Y4yhL4fNhgzbZ/wUMQ4EjFUfoNNMpEXZnDw1JrlcEBHUT15gplchtFsZGk7FNi8PhLHJfCUwVKrEHzhfhKK+g==", "funding": [ { "type": "github", @@ -3362,9 +3153,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { "node": ">=18" @@ -3374,9 +3165,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", "funding": [ { "type": "github", @@ -3389,7 +3180,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/color-helpers": "^5.1.0", + "@csstools/color-helpers": "^5.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -3400,9 +3191,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.8.tgz", + "integrity": "sha512-YcDvYTRu7f78/91B6bX+mE1WoAO91Su7/8KSRpuWbIGUB8hmaNSRu9wziaWSLJ1lOB1aQe+bvo9BIaLKqPOo/g==", "funding": [ { "type": "github", @@ -3415,9 +3206,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-calc": "^2.1.3", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" }, "engines": { "node": ">=18" @@ -3480,24 +3271,21 @@ } }, "node_modules/@docsearch/css": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.2.0.tgz", - "integrity": "sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.2.0.tgz", - "integrity": "sha512-zSN/KblmtBcerf7Z87yuKIHZQmxuXvYc6/m0+qnjyNu+Ir67AVOagTa1zBqcxkVUVkmBqUExdcyrdo9hbGbqTw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", "license": "MIT", "dependencies": { - "@ai-sdk/react": "^2.0.30", - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/css": "4.2.0", - "ai": "^5.0.30", - "algoliasearch": "^5.28.0", - "marked": "^16.3.0", - "zod": "^4.1.8" + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", + "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3521,187 +3309,183 @@ } }, "node_modules/@docsearch/react/node_modules/@algolia/client-analytics": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.42.0.tgz", - "integrity": "sha512-SkCrvtZpdSWjNq9NGu/TtOg4TbzRuUToXlQqV6lLePa2s/WQlEyFw7QYjrz4itprWG9ASuH+StDlq7n49F2sBA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.24.0.tgz", + "integrity": "sha512-IF+r9RRQsIf0ylIBNFxo7c6hDxxuhIfIbffhBXEF1HD13rjhP5AVfiaea9RzbsAZoySkm318plDpH/nlGIjbRA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@docsearch/react/node_modules/@algolia/client-personalization": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.42.0.tgz", - "integrity": "sha512-ivVniRqX2ARd+jGvRHTxpWeOtO9VT+rK+OmiuRgkSunoTyxk0vjeDO7QkU7+lzBOXiYgakNjkZrBtIpW9c+muw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.24.0.tgz", + "integrity": "sha512-Fx/Fp6d8UmDBHecTt0XYF8C9TAaA3qeCQortfGSZzWp4gVmtrUCFNZ1SUwb8ULREnO9DanVrM5hGE8R8C4zZTQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@docsearch/react/node_modules/@algolia/recommend": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.42.0.tgz", - "integrity": "sha512-U5yZ8+Jj+A4ZC0IMfElpPcddQ9NCoawD1dKyWmjHP49nzN2Z4284IFVMAJWR6fq/0ddGf4OMjjYO9cnF8L+5tw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.24.0.tgz", + "integrity": "sha512-JTMz0JqN2gidvKa2QCF/rMe8LNtdHaght03px2cluZaZfBRYy8TgHgkCeBspKKvV/abWJwl7J0FzWThCshqT3w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@docsearch/react/node_modules/algoliasearch": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.42.0.tgz", - "integrity": "sha512-X5+PtWc9EJIPafT/cj8ZG+6IU3cjRRnlHGtqMHK/9gsiupQbAyYlH5y7qt/FtsAhfX5AICHffZy69ZAsVrxWkQ==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.8.0", - "@algolia/client-abtesting": "5.42.0", - "@algolia/client-analytics": "5.42.0", - "@algolia/client-common": "5.42.0", - "@algolia/client-insights": "5.42.0", - "@algolia/client-personalization": "5.42.0", - "@algolia/client-query-suggestions": "5.42.0", - "@algolia/client-search": "5.42.0", - "@algolia/ingestion": "1.42.0", - "@algolia/monitoring": "1.42.0", - "@algolia/recommend": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.24.0.tgz", + "integrity": "sha512-CkaUygzZ91Xbw11s0CsHMawrK3tl+Ue57725HGRgRzKgt2Z4wvXVXRCtQfvzh8K7Tp4Zp7f1pyHAtMROtTJHxg==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.24.0", + "@algolia/client-analytics": "5.24.0", + "@algolia/client-common": "5.24.0", + "@algolia/client-insights": "5.24.0", + "@algolia/client-personalization": "5.24.0", + "@algolia/client-query-suggestions": "5.24.0", + "@algolia/client-search": "5.24.0", + "@algolia/ingestion": "1.24.0", + "@algolia/monitoring": "1.24.0", + "@algolia/recommend": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/@docusaurus/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.9.2", - "@docusaurus/bundler": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "5.1.1", + "node_modules/@docusaurus/babel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.7.0.tgz", + "integrity": "sha512-0H5uoJLm14S/oKV3Keihxvh8RV+vrid+6Gv+2qhuzbqHanawga8tYnsdpjEyt36ucJjqlby2/Md2ObWjA02UXQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.6", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" + "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/babel/node_modules/@docusaurus/logger": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "engines": { + "node": ">=18.0" } }, - "node_modules/@docusaurus/core/node_modules/@docusaurus/babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", + "node_modules/@docusaurus/babel/node_modules/@docusaurus/utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "license": "MIT", "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/runtime-corejs3": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-plugin-dynamic-import-node": "^2.3.3", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/babel/node_modules/@docusaurus/utils-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.7.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" } }, - "node_modules/@docusaurus/core/node_modules/@docusaurus/bundler": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", + "node_modules/@docusaurus/bundler": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.7.0.tgz", + "integrity": "sha512-CUUT9VlSGukrCU5ctZucykvgCISivct+cby28wJwCC/fkQFgAHRp/GKv2tx38ZmXb7nacrKzFTcp++f9txUYGg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.9.2", - "@docusaurus/cssnano-preset": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", + "@docusaurus/babel": "3.7.0", + "@docusaurus/cssnano-preset": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", + "clean-css": "^5.3.2", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", + "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", "cssnano": "^6.1.2", "file-loader": "^6.2.0", "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", + "mini-css-extract-plugin": "^2.9.1", "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "postcss-preset-env": "^10.1.0", + "react-dev-utils": "^12.0.1", "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "url-loader": "^4.1.1", @@ -3709,7 +3493,7 @@ "webpackbar": "^6.0.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "@docusaurus/faster": "*" @@ -3720,291 +3504,389 @@ } } }, - "node_modules/@docusaurus/core/node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "node_modules/@docusaurus/bundler/node_modules/@docusaurus/cssnano-preset": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.7.0.tgz", + "integrity": "sha512-X9GYgruZBSOozg4w4dzv9uOz8oK/EpPVQXkp0MM6Tsgp/nRIU9hJzJ0Pxg1aRa3xCeEQTOimZHcocQFlLwYajQ==", "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@docusaurus/core/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/@docusaurus/core/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18.0" } }, - "node_modules/@docusaurus/core/node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "node_modules/@docusaurus/bundler/node_modules/@docusaurus/logger": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } + "node": ">=18.0" } }, - "node_modules/@docusaurus/core/node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "node_modules/@docusaurus/bundler/node_modules/@docusaurus/utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18.0" } }, - "node_modules/@docusaurus/core/node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "node_modules/@docusaurus/bundler/node_modules/@docusaurus/utils-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" + "@docusaurus/types": "3.7.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0" } }, - "node_modules/@docusaurus/core/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "node_modules/@docusaurus/bundler/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", + "node_modules/@docusaurus/bundler/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@docusaurus/bundler/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "license": "MIT", "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" + "repeat-string": "^1.0.0" }, - "engines": { - "node": ">=20.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@docusaurus/logger": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", + "node_modules/@docusaurus/bundler/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=20.0" + "node": ">=8" } }, - "node_modules/@docusaurus/lqip-loader": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/lqip-loader/-/lqip-loader-3.9.2.tgz", - "integrity": "sha512-Q9QO0E+HLKhcpKVOIXRVBdJ1bbxxpfSwBll5NsmGxcx1fArH0fFi68cpEztqBg7WwbFRb976MTlqlBuGrMLpuw==", + "node_modules/@docusaurus/bundler/node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.9.2", - "file-loader": "^6.2.0", - "lodash": "^4.17.21", - "sharp": "^0.32.3", - "tslib": "^2.6.0" + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=20.0" + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" } }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", + "node_modules/@docusaurus/bundler/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=20.0" + "node": ">=10" }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", + "node_modules/@docusaurus/core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", + "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", + "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", + "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/lqip-loader": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/lqip-loader/-/lqip-loader-3.4.0.tgz", + "integrity": "sha512-F//Gjqcz925zLL1l3Y3XOtQvn927GBIr9ZouvzWF4jHNKuuHBqzOPSADF5O/cT3Vq1ucPWooyhPBxYcvSGF4SA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "file-loader": "^6.2.0", + "lodash": "^4.17.21", + "sharp": "^0.32.3", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", + "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.7.0.tgz", + "integrity": "sha512-g7WdPqDNaqA60CmBrr0cORTrsOit77hbsTj7xE2l71YhBn79sxdm7WMK7wfhcaafkbpIh7jv5ef5TOpf1Xv9Lg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.7.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", "react-dom": "*" } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.9.2.tgz", - "integrity": "sha512-lUgMArI9vyOYMzLRBUILcg9vcPTCyyI2aiuXq/4npcMVqOr6GfmwtmBYWSbNMlIUM0147smm4WhpXD0KFboffw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.4.0.tgz", + "integrity": "sha512-Pr8kyh/+OsmYCvdZhc60jy/FnrY6flD2TEAhl4rJxeVFxnvvRgEhoaIVX8q9MuJmaQoh6frPk94pjs7/6YgBDQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "cheerio": "1.0.0-rc.12", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", + "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", "lodash": "^4.17.21", - "schema-dts": "^1.1.2", + "reading-time": "^1.5.0", "srcset": "^4.0.0", "tslib": "^2.6.0", "unist-util-visit": "^5.0.0", @@ -4012,3369 +3894,3627 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.7.0.tgz", + "integrity": "sha512-GXg5V7kC9FZE4FkUZA8oo/NrlRb06UwuICzI6tcbzj0+TVgjq/mpUXXzSgKzMS82YByi4dY2Q808njcBCyy6tQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "schema-dts": "^1.1.2", "tslib": "^2.6.0", "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/core": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.7.0.tgz", + "integrity": "sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", + "@docusaurus/babel": "3.7.0", + "@docusaurus/bundler": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "shelljs": "^0.8.5", "tslib": "^2.6.0", - "webpack": "^5.88.1" + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { + "@mdx-js/react": "^3.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/logger": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", + "chalk": "^4.1.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" } }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/mdx-loader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz", + "integrity": "sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/theme-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.7.0.tgz", + "integrity": "sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "node": ">=18.0" } }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/utils-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", + "@docusaurus/types": "3.7.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "node": ">=18.0" } }, - "node_modules/@docusaurus/plugin-ideal-image": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-ideal-image/-/plugin-ideal-image-3.9.2.tgz", - "integrity": "sha512-YYYbmC2wSYFd7o4//5rPXt9+DkZwfwjCUmyGi5OIVqEbwELK80o3COXs2Xd0BtVIpuRvG7pKCYrMQwVo32Y9qw==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/utils-validation": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz", + "integrity": "sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/lqip-loader": "3.9.2", - "@docusaurus/responsive-loader": "^1.7.0", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "sharp": "^0.32.3", - "tslib": "^2.6.0", - "webpack": "^5.88.1" + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "jimp": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "jimp": { - "optional": true - } + "node": ">=18.0" } }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "node": ">=18.0.0" } }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz", + "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", + "@docusaurus/core": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", + "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/plugin-css-cascade-layers": "3.9.2", - "@docusaurus/plugin-debug": "3.9.2", - "@docusaurus/plugin-google-analytics": "3.9.2", - "@docusaurus/plugin-google-gtag": "3.9.2", - "@docusaurus/plugin-google-tag-manager": "3.9.2", - "@docusaurus/plugin-sitemap": "3.9.2", - "@docusaurus/plugin-svgr": "3.9.2", - "@docusaurus/theme-classic": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-search-algolia": "3.9.2", - "@docusaurus/types": "3.9.2" - }, - "engines": { - "node": ">=20.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/responsive-loader": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@docusaurus/responsive-loader/-/responsive-loader-1.7.1.tgz", - "integrity": "sha512-jAebZ43f8GVpZSrijLGHVVp7Y0OMIPRaL+HhiIWQ+f/b72lTsKLkSkOVHEzvd2psNJ9lsoiM3gt6akpak6508w==", - "license": "BSD-3-Clause", + "node_modules/@docusaurus/plugin-debug": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", + "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", + "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "jimp": "*", - "sharp": "*" - }, - "peerDependenciesMeta": { - "jimp": { - "optional": true - }, - "sharp": { - "optional": true - } - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/theme-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", + "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.9.0 || ^4.1.0", - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", + "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/theme-search-algolia/node_modules/@algolia/client-analytics": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.42.0.tgz", - "integrity": "sha512-SkCrvtZpdSWjNq9NGu/TtOg4TbzRuUToXlQqV6lLePa2s/WQlEyFw7QYjrz4itprWG9ASuH+StDlq7n49F2sBA==", + "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, - "engines": { - "node": ">= 14.0.0" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/theme-search-algolia/node_modules/@algolia/client-personalization": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.42.0.tgz", - "integrity": "sha512-ivVniRqX2ARd+jGvRHTxpWeOtO9VT+rK+OmiuRgkSunoTyxk0vjeDO7QkU7+lzBOXiYgakNjkZrBtIpW9c+muw==", + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", + "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" }, "engines": { - "node": ">= 14.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/theme-search-algolia/node_modules/@algolia/recommend": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.42.0.tgz", - "integrity": "sha512-U5yZ8+Jj+A4ZC0IMfElpPcddQ9NCoawD1dKyWmjHP49nzN2Z4284IFVMAJWR6fq/0ddGf4OMjjYO9cnF8L+5tw==", + "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia/node_modules/algoliasearch": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.42.0.tgz", - "integrity": "sha512-X5+PtWc9EJIPafT/cj8ZG+6IU3cjRRnlHGtqMHK/9gsiupQbAyYlH5y7qt/FtsAhfX5AICHffZy69ZAsVrxWkQ==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.8.0", - "@algolia/client-abtesting": "5.42.0", - "@algolia/client-analytics": "5.42.0", - "@algolia/client-common": "5.42.0", - "@algolia/client-insights": "5.42.0", - "@algolia/client-personalization": "5.42.0", - "@algolia/client-query-suggestions": "5.42.0", - "@algolia/client-search": "5.42.0", - "@algolia/ingestion": "1.42.0", - "@algolia/monitoring": "1.42.0", - "@algolia/recommend": "5.42.0", - "@algolia/requester-browser-xhr": "5.42.0", - "@algolia/requester-fetch": "5.42.0", - "@algolia/requester-node-http": "5.42.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, - "engines": { - "node": ">= 14.0.0" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", + "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", "license": "MIT", "dependencies": { - "fs-extra": "^11.1.1", + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", - "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/types": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", "@types/react": "*", "commander": "^5.1.0", "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.95.0", + "webpack": "^5.88.1", "webpack-merge": "^5.9.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/utils": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", + "node_modules/@docusaurus/plugin-ideal-image": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-ideal-image/-/plugin-ideal-image-3.4.0.tgz", + "integrity": "sha512-s8N/PRiv1R66UY+WX/2E9a+GjkRooXVcf0VJNEYA3yZ6c24Path15ivjmdMtKaSo/6OXYbejGlA4DJZ5TPLkCQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "escape-string-regexp": "^4.0.0", - "execa": "5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", + "@docusaurus/core": "3.4.0", + "@docusaurus/lqip-loader": "3.4.0", + "@docusaurus/responsive-loader": "^1.7.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@slorber/react-ideal-image": "^0.0.12", + "react-waypoint": "^10.3.0", + "sharp": "^0.32.3", "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" + }, + "peerDependencies": { + "jimp": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + } } }, - "node_modules/@docusaurus/utils-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", + "node_modules/@docusaurus/plugin-ideal-image/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.9.2", - "tslib": "^2.6.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, - "engines": { - "node": ">=20.0" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", + "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=20.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@exodus/schemasafe": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", - "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", - "license": "MIT" - }, - "node_modules/@faker-js/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", - "deprecated": "Please update to a newer version.", - "license": "MIT" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@hookform/error-message": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hookform/error-message/-/error-message-2.0.1.tgz", - "integrity": "sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==", + "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0", - "react-hook-form": "^7.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "node_modules/@docusaurus/preset-classic": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", + "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/plugin-debug": "3.4.0", + "@docusaurus/plugin-google-analytics": "3.4.0", + "@docusaurus/plugin-google-gtag": "3.4.0", + "@docusaurus/plugin-google-tag-manager": "3.4.0", + "@docusaurus/plugin-sitemap": "3.4.0", + "@docusaurus/theme-classic": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-search-algolia": "3.4.0", + "@docusaurus/types": "3.4.0" }, "engines": { - "node": ">=12" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/module-type-aliases": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", + "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@docusaurus/types": "3.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/plugin-content-docs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", + "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=12" + "node": ">=18.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/theme-classic": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", + "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/theme-search-algolia": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", + "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@docusaurus/preset-classic/node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "license": "MIT", "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", + "node_modules/@docusaurus/responsive-loader": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@docusaurus/responsive-loader/-/responsive-loader-1.7.1.tgz", + "integrity": "sha512-jAebZ43f8GVpZSrijLGHVVp7Y0OMIPRaL+HhiIWQ+f/b72lTsKLkSkOVHEzvd2psNJ9lsoiM3gt6akpak6508w==", + "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "loader-utils": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">=12" }, "peerDependencies": { - "tslib": "2" + "jimp": "*", + "sharp": "*" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + }, + "sharp": { + "optional": true + } } }, - "node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "node_modules/@docusaurus/theme-classic": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.7.0.tgz", + "integrity": "sha512-MnLxG39WcvLCl4eUzHr0gNcpHQfWoGqzADCly54aqCofQX6UozOS9Th4RK3ARbM9m7zIRv3qbhggI53dQtx/hQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/plugin-content-blog": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/plugin-content-pages": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-translations": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "tslib": "2" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/core": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.7.0.tgz", + "integrity": "sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/babel": "3.7.0", + "@docusaurus/bundler": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "tslib": "2" + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "license": "Apache-2.0", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/logger": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", + "license": "MIT", + "peer": true, "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node": ">=18.0" } }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "license": "Apache-2.0", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/mdx-loader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz", + "integrity": "sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA==", + "license": "MIT", + "peer": true, "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" }, "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "node": ">=18.0" }, "peerDependencies": { - "tslib": "2" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "license": "Apache-2.0", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/plugin-content-blog": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.7.0.tgz", + "integrity": "sha512-EFLgEz6tGHYWdPU0rK8tSscZwx+AsyuBW/r+tNig2kbccHYGUJmZtYN38GjAa3Fda4NU+6wqUO5kTXQSRBQD3g==", + "license": "MIT", + "peer": true, "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "node": ">=18.0" }, "peerDependencies": { - "tslib": "2" + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", - "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/plugin-content-pages": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.7.0.tgz", + "integrity": "sha512-YJSU3tjIJf032/Aeao8SZjFOrXJbz/FACMveSMjLyMH4itQyZ2XgUIzt4y+1ISvvk5zrW4DABVT2awTCqBkx0Q==", "license": "MIT", + "peer": true, "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@docusaurus/core": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@mdx-js/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", - "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/theme-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.7.0.tgz", + "integrity": "sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A==", "license": "MIT", + "peer": true, "dependencies": { - "@types/mdx": "^2.0.0" + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/theme-translations": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.7.0.tgz", + "integrity": "sha512-Ewq3bEraWDmienM6eaNK7fx+/lHMtGDHQyd1O+4+3EsDxxUmrzPkV7Ct3nBWTuE0MsoZr3yNwQVKjllzCMuU3g==", "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, "engines": { - "node": ">= 8" + "node": ">=18.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">= 8" + "node": ">=18.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/utils-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@docusaurus/types": "3.7.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">= 8" + "node": ">=18.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/utils-validation": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz", + "integrity": "sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, + "node_modules/@docusaurus/theme-classic/node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">= 10.0.0" + "node": ">= 6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" + "node_modules/@docusaurus/theme-classic/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } ], "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], + "node_modules/@docusaurus/theme-classic/node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "peer": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", + "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", + "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@docusaurus/types": "3.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/plugin-content-docs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", + "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", + "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.7.0.tgz", + "integrity": "sha512-Al/j5OdzwRU1m3falm+sYy9AaB93S1XF1Lgk9Yc6amp80dNxJVplQdQTR4cYdzkGtuQqbzUA8+kaoYYO0RbK6g==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.8.1", + "@docusaurus/core": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/plugin-content-docs": "3.7.0", + "@docusaurus/theme-common": "3.7.0", + "@docusaurus/theme-translations": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "algoliasearch": "^5.17.1", + "algoliasearch-helper": "^3.22.6", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@algolia/client-analytics": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.24.0.tgz", + "integrity": "sha512-IF+r9RRQsIf0ylIBNFxo7c6hDxxuhIfIbffhBXEF1HD13rjhP5AVfiaea9RzbsAZoySkm318plDpH/nlGIjbRA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@algolia/client-personalization": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.24.0.tgz", + "integrity": "sha512-Fx/Fp6d8UmDBHecTt0XYF8C9TAaA3qeCQortfGSZzWp4gVmtrUCFNZ1SUwb8ULREnO9DanVrM5hGE8R8C4zZTQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">= 14.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia/node_modules/@algolia/recommend": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.24.0.tgz", + "integrity": "sha512-JTMz0JqN2gidvKa2QCF/rMe8LNtdHaght03px2cluZaZfBRYy8TgHgkCeBspKKvV/abWJwl7J0FzWThCshqT3w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/core": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.7.0.tgz", + "integrity": "sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@docusaurus/babel": "3.7.0", + "@docusaurus/bundler": "3.7.0", + "@docusaurus/logger": "3.7.0", + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/logger": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz", + "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=18.0" } }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/mdx-loader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz", + "integrity": "sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-validation": "3.7.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/theme-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.7.0.tgz", + "integrity": "sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@docusaurus/mdx-loader": "3.7.0", + "@docusaurus/module-type-aliases": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/theme-translations": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.7.0.tgz", + "integrity": "sha512-Ewq3bEraWDmienM6eaNK7fx+/lHMtGDHQyd1O+4+3EsDxxUmrzPkV7Ct3nBWTuE0MsoZr3yNwQVKjllzCMuU3g==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=18.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==", "license": "MIT", - "optional": true, + "dependencies": { + "@docusaurus/logger": "3.7.0", + "@docusaurus/types": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">=14" + "node": ">=18.0" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/utils-common": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz", + "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==", "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.7.0", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=12.22.0" + "node": ">=18.0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@docusaurus/theme-search-algolia/node_modules/@docusaurus/utils-validation": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz", + "integrity": "sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA==", "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@docusaurus/logger": "3.7.0", + "@docusaurus/utils": "3.7.0", + "@docusaurus/utils-common": "3.7.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" }, "engines": { - "node": ">=12.22.0" + "node": ">=18.0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" + "node_modules/@docusaurus/theme-search-algolia/node_modules/algoliasearch": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.24.0.tgz", + "integrity": "sha512-CkaUygzZ91Xbw11s0CsHMawrK3tl+Ue57725HGRgRzKgt2Z4wvXVXRCtQfvzh8K7Tp4Zp7f1pyHAtMROtTJHxg==", + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.24.0", + "@algolia/client-analytics": "5.24.0", + "@algolia/client-common": "5.24.0", + "@algolia/client-insights": "5.24.0", + "@algolia/client-personalization": "5.24.0", + "@algolia/client-query-suggestions": "5.24.0", + "@algolia/client-search": "5.24.0", + "@algolia/ingestion": "1.24.0", + "@algolia/monitoring": "1.24.0", + "@algolia/recommend": "5.24.0", + "@algolia/requester-browser-xhr": "5.24.0", + "@algolia/requester-fetch": "5.24.0", + "@algolia/requester-node-http": "5.24.0" + }, + "engines": { + "node": ">= 14.0.0" + } }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "node_modules/@docusaurus/theme-search-algolia/node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "license": "MIT", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=18.0.0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" - }, - "node_modules/@redocly/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "node_modules/@docusaurus/theme-translations": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", + "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js-replace": "^1.0.1" + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0" } }, - "node_modules/@redocly/config": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", - "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "node_modules/@docusaurus/tsconfig": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.7.0.tgz", + "integrity": "sha512-vRsyj3yUZCjscgfgcFYjIsTcAru/4h4YH2/XAE8Rs7wWdnng98PgWKvP5ovVc4rmRpRg2WChVW0uOy2xHDvDBQ==", + "dev": true, "license": "MIT" }, - "node_modules/@redocly/openapi-core": { - "version": "1.34.2", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.2.tgz", - "integrity": "sha512-glfkQFJizLdq2fBkNvc2FJW0sxDb5exd0wIXhFk+WHaFLMREBC3CxRo2Zq7uJIdfV9U3YTceMbXJklpDfmmwFQ==", + "node_modules/@docusaurus/types": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.7.0.tgz", + "integrity": "sha512-kOmZg5RRqJfH31m+6ZpnwVbkqMJrPOG5t0IOl4i/+3ruXyNfWzZ0lVtVrD0u4ONc/0NOsS9sWYaxxWNkH1LdLQ==", "license": "MIT", "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.22.0", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", - "js-levenshtein": "^1.1.6", + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", + "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@svgr/webpack": "^8.1.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, - "node_modules/@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "node_modules/@docusaurus/utils-common": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", + "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", "license": "MIT", "dependencies": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" }, "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.0.2" + "@docusaurus/types": "*" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { + "@docusaurus/types": { "optional": true } } }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", + "node_modules/@docusaurus/utils-validation": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", + "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "license": "MIT" }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "deprecated": "Please update to a newer version.", "license": "MIT" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "license": "MIT", + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "node_modules/@hookform/error-message": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hookform/error-message/-/error-message-2.0.1.tgz", + "integrity": "sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "react-hook-form": "^7.0.0" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=12" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "license": "MIT", - "engines": { - "node": ">=14" + "dependencies": { + "@sinclair/typebox": "^0.27.8" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "node_modules/@mdx-js/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "license": "MIT", "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" + "@types/mdx": "^2.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/unified" }, "peerDependencies": { - "@svgr/core": "*" + "@types/react": ">=16", + "react": ">=16" } }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">= 8" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, "engines": { - "node": ">=14.16" + "node": ">= 8" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">= 8" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/ms": "*" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/estree": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "*" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "license": "MIT", "dependencies": { - "@types/unist": "*" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "license": "MIT" }, - "node_modules/@types/node": { - "version": "22.15.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.14.tgz", - "integrity": "sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==", + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "license": "MIT" - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "node_modules/@redocly/config": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", + "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", "license": "MIT" }, - "node_modules/@types/react": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz", - "integrity": "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==", + "node_modules/@redocly/openapi-core": { + "version": "1.34.2", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.2.tgz", + "integrity": "sha512-glfkQFJizLdq2fBkNvc2FJW0sxDb5exd0wIXhFk+WHaFLMREBC3CxRo2Zq7uJIdfV9U3YTceMbXJklpDfmmwFQ==", "license": "MIT", "dependencies": { - "csstype": "^3.0.2" + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" } }, - "node_modules/@types/react-redux": { - "version": "7.1.34", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", - "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", "license": "MIT", "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } } }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "license": "MIT" }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "node_modules/@slorber/react-ideal-image": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@slorber/react-ideal-image/-/react-ideal-image-0.0.12.tgz", + "integrity": "sha512-u8KiDTEkMA7/KAeA5ywg/P7YG4zuKhWtswfVZDH8R8HXgQsFcHIYU2WaQnGuK/Du7Wdj90I+SdFmajSGFRvoKA==", "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "engines": { + "node": ">= 8.9.0", + "npm": "> 3" + }, + "peerDependencies": { + "prop-types": ">=15", + "react": ">=0.14.x", + "react-waypoint": ">=9.0.2" } }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", "license": "MIT", "dependencies": { - "@types/express": "*" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" } }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@vercel/oidc": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.3.tgz", - "integrity": "sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==", - "license": "Apache-2.0", + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", "engines": { - "node": ">= 20" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=14.16" } }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": ">=10.13.0" } }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "@types/node": "*" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" + "@types/node": "*" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", - "engines": { - "node": ">= 14" + "dependencies": { + "@types/ms": "*" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/ai": { - "version": "5.0.86", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.86.tgz", - "integrity": "sha512-ooHwNTkLdedFf98iQhtSc5btc/P4UuXuOpYneoifq0190vqosLunNdW8Hs6CiE0Am7YOGNplDK56JIPlHZIL4w==", - "license": "Apache-2.0", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", "dependencies": { - "@ai-sdk/gateway": "2.0.5", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.15", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "@types/estree": "*" } }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "license": "MIT", - "peer": true, "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "@types/unist": "*" } }, - "node_modules/algoliasearch-helper": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", - "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" }, - "node_modules/algoliasearch/node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", "license": "MIT", - "peer": true, "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/algoliasearch/node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "license": "MIT", - "peer": true, "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@types/node": "*" } }, - "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "license": "MIT", - "peer": true, "dependencies": { - "@algolia/requester-common": "4.24.0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", - "peer": true, "dependencies": { - "@algolia/requester-common": "4.24.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/allof-merge": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/allof-merge/-/allof-merge-0.6.7.tgz", - "integrity": "sha512-slvjkM56OdeVkm1tllrnaumtSHwqyHrepXkAe6Am+CW4WdbHkNqdOKPF6cvY3/IouzvXk1BoLICT5LY7sCoFGw==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "license": "MIT", "dependencies": { - "json-crawl": "^0.5.3" + "@types/unist": "*" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.14.tgz", + "integrity": "sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "undici-types": "~6.21.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "license": "MIT" }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz", + "integrity": "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "csstype": "^3.0.2" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "@types/history": "^4.7.11", + "@types/react": "*" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" } }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "license": "MIT", - "bin": { - "astring": "bin/astring" + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" } }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "license": "MIT" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "license": "MIT", "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" + "@types/express": "*" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "dependencies": { - "object.assign": "^4.1.0" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@types/node": "*" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@types/node": "*" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@types/yargs-parser": "*" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "license": "MIT" }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, - "node_modules/bare-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.4.tgz", - "integrity": "sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==", - "license": "Apache-2.0", - "optional": true, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { - "bare-os": "^3.0.1" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", - "optional": true, "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } + "@xtuc/long": "4.2.2" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "license": "MIT" }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.23", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", - "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6.5" } }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.6" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": ">= 0.6" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "acorn": "^8.11.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.4.0" } }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" + "peerDependencies": { + "ajv": "^8.5.0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "ajv": "^8.0.0" }, - "bin": { - "browserslist": "cli.js" + "peerDependencies": { + "ajv": "^8.0.0" }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" + "node_modules/algoliasearch": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", + "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/algoliasearch-helper": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.25.0.tgz", + "integrity": "sha512-vQoK43U6HXA9/euCqLjvyNdM4G2Fiu/VFp4ae0Gau9sZeIKBPvUPnXfLYAe65Bg7PFuw03coeu5K6lTPSXRObw==", "license": "MIT", "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" + "@algolia/events": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", "license": "MIT", - "engines": { - "node": ">=14.16" + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" } }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" + "@algolia/requester-common": "4.24.0" } }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@algolia/requester-common": "4.24.0" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "string-width": "^4.1.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7382,503 +7522,489 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001753", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", - "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" ], - "license": "CC-BY-4.0" + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=8" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" }, - "node_modules/character-reference-invalid": { + "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, - "node_modules/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "license": "MIT", "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/cheerio-select": { + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/assert": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "bin": { + "astring": "bin/astring" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "license": "MIT" }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", "engines": { - "node": ">=6.0" + "node": ">= 4.0.0" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, { "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", "dependencies": { - "source-map": "~0.6.0" + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "license": "MIT", "dependencies": { - "string-width": "^4.2.0" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">= 14.15.0" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "object.assign": "^4.1.0" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@babel/helper-define-polyfill-provider": "^0.6.4" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.4.tgz", + "integrity": "sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" }, "engines": { - "node": ">=12.5.0" + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, "engines": { - "node": ">=7.0.0" + "bare": ">=1.14.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "license": "MIT" }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", + "engines": { + "node": ">=8" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "engines": { - "node": ">= 6" - } + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "license": "ISC" + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", - "compressible": "~2.0.18", + "content-type": "~1.0.5", "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/compression/node_modules/bytes": { + "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", @@ -7887,7 +8013,7 @@ "node": ">= 0.8" } }, - "node_modules/compression/node_modules/debug": { + "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", @@ -7896,1186 +8022,1162 @@ "ms": "2.0.0" } }, - "node_modules/compression/node_modules/ms": { + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/compute-gcd": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", - "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/compute-lcm": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", - "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", "dependencies": { - "compute-gcd": "^1.2.1", - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", "license": "MIT", "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "engines": { - "node": ">=0.8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": ">=8" } }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.10" } }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.12" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/core-js": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", - "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", - "hasInstallScript": true, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "dependencies": { + "pako": "~1.0.5" } }, - "node_modules/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/core-js-pure": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", - "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", - "hasInstallScript": true, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/core-util-is": { + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=14.16" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/crypto-random-string": { + "node_modules/cacheable-request/node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">= 0.4" } }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "license": "ISC", + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">=6" } }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/csstools" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } + "license": "CC-BY-4.0" }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, "engines": { - "node": ">= 14.15.0" - }, + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=4.0.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, - "peerDependencies": { - "postcss": "^8.4" + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", + "css-select": "^5.1.0", "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">=6.0" } }, - "node_modules/cssdb": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", - "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, { "type": "github", - "url": "https://github.com/sponsors/csstools" + "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT-0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "license": "MIT", "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 0.10" } }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "license": "MIT", "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" + "source-map": "~0.6.0" }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">= 10.0" } }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=6" } }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "license": "MIT", "dependencies": { - "css-tree": "~2.2.0" + "string-width": "^4.2.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=8" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { - "ms": "^2.1.3" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=12" } }, - "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "character-entities": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=8" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "mimic-response": "^3.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=12.5.0" } }, - "node_modules/defer-to-connect": { + "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/define-data-property": { + "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 6" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" + "dependencies": { + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=0.10" + "node": ">= 0.6" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-package-manager": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", - "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { - "execa": "^5.1.1" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.8" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "ms": "2.0.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "license": "MIT", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/docusaurus-plugin-image-zoom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-image-zoom/-/docusaurus-plugin-image-zoom-2.0.0.tgz", - "integrity": "sha512-TWHQZeoiged+95CESlZk++lihzl3pqw34n0/fbexx2AocmFhbo9K2scYDgYB8amki4/X6mUCLTPZE1pQvT+00Q==", - "license": "MIT", + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", "dependencies": { - "medium-zoom": "^1.0.8", - "validate-peer-dependencies": "^2.2.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, - "peerDependencies": { - "@docusaurus/theme-classic": ">=3.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/docusaurus-plugin-openapi-docs": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-4.5.1.tgz", - "integrity": "sha512-3I6Sjz19D/eM86a24/nVkYfqNkl/zuXSP04XVo7qm/vlPeCpHVM4li2DLj7PzElr6dlS9RbaS4HVIQhEOPGBRQ==", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.4", - "@redocly/openapi-core": "^1.10.5", - "allof-merge": "^0.6.6", - "chalk": "^4.1.2", - "clsx": "^1.1.1", - "fs-extra": "^9.0.1", - "json-pointer": "^0.6.2", - "json5": "^2.2.3", - "lodash": "^4.17.20", - "mustache": "^4.2.0", - "openapi-to-postmanv2": "^4.21.0", - "postman-collection": "^4.4.0", - "slugify": "^1.6.5", - "swagger2openapi": "^7.0.8", - "xml-formatter": "^2.6.1" - }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "^3.5.0", - "@docusaurus/utils": "^3.5.0", - "@docusaurus/utils-validation": "^3.5.0", - "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">=0.8" } }, - "node_modules/docusaurus-plugin-openapi-docs/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/consolidated-events": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz", + "integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ==", + "license": "MIT" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/docusaurus-plugin-openapi-docs/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/docusaurus-plugin-sass": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz", - "integrity": "sha512-2hKQQDkrufMong9upKoG/kSHJhuwd+FA3iAe/qzS/BmWpbIpe7XKmq5wlz4J5CJaOPu4x+iDJbgAxZqcoQf0kg==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", - "peer": true, - "dependencies": { - "sass-loader": "^16.0.2" - }, - "peerDependencies": { - "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha", - "sass": "^1.30.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/docusaurus-theme-openapi-docs": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-4.5.1.tgz", - "integrity": "sha512-C7mYh9JC3l9jjRtqJVu0EIyOgxHB08jE0Tp5NSkNkrrBak4A13SrXCisNjvt1eaNjS+tsz7qD0bT3aI5hsRvWA==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", "license": "MIT", - "dependencies": { - "@hookform/error-message": "^2.0.1", - "@reduxjs/toolkit": "^1.7.1", - "allof-merge": "^0.6.6", - "buffer": "^6.0.3", - "clsx": "^1.1.1", - "copy-text-to-clipboard": "^3.1.0", - "crypto-js": "^4.1.1", - "file-saver": "^2.0.5", - "lodash": "^4.17.20", - "pako": "^2.1.0", - "postman-code-generators": "^1.10.1", - "postman-collection": "^4.4.0", - "prism-react-renderer": "^2.3.0", - "process": "^0.11.10", - "react-hook-form": "^7.43.8", - "react-live": "^4.0.0", - "react-magic-dropzone": "^1.0.1", - "react-markdown": "^8.0.1", - "react-modal": "^3.15.1", - "react-redux": "^7.2.0", - "rehype-raw": "^6.1.1", - "remark-gfm": "3.0.1", - "sass": "^1.80.4", - "sass-loader": "^16.0.2", - "unist-util-visit": "^5.0.0", - "url": "^0.11.1", - "xml-formatter": "^2.6.1" - }, "engines": { - "node": ">=14" + "node": ">=12" }, - "peerDependencies": { - "@docusaurus/theme-common": "^3.5.0", - "docusaurus-plugin-openapi-docs": "^4.0.0", - "docusaurus-plugin-sass": "^0.2.3", - "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "license": "MIT", "dependencies": { - "@types/unist": "^2" + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { - "@types/unist": "^2" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "license": "MIT", "engines": { "node": ">=12" @@ -9084,793 +9186,1242 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "node_modules/core-js": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", + "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/core-js" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "node_modules/core-js-compat": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/core-js" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "node_modules/core-js-pure": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", + "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/core-js" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 8" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" + "engines": { + "node": ">= 0.10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" + "type-fest": "^1.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "license": "MIT", + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "postcss-selector-parser": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" + "engines": { + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "node_modules/css-has-pseudo": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "github", + "url": "https://github.com/sponsors/csstools" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT", + "license": "MIT-0", "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "github", + "url": "https://github.com/sponsors/csstools" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "license": "MIT", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "license": "MIT", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", "dependencies": { - "micromark-util-types": "^1.0.0" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "node_modules/cssdb": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.5.tgz", + "integrity": "sha512-leAt8/hdTCtzql9ZZi86uYAmCLzVKpJMMdjbvOGVnXFXz/BWFpBmM1MHEHU/RqtPyRYmabVmEW1DtX3YGLuuLA==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/csstools" } ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-package-manager": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", + "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", + "license": "MIT", + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-image-zoom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-image-zoom/-/docusaurus-plugin-image-zoom-2.0.0.tgz", + "integrity": "sha512-TWHQZeoiged+95CESlZk++lihzl3pqw34n0/fbexx2AocmFhbo9K2scYDgYB8amki4/X6mUCLTPZE1pQvT+00Q==", + "license": "MIT", + "dependencies": { + "medium-zoom": "^1.0.8", + "validate-peer-dependencies": "^2.2.0" + }, + "peerDependencies": { + "@docusaurus/theme-classic": ">=3.0.0" + } + }, + "node_modules/docusaurus-plugin-openapi-docs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-3.0.1.tgz", + "integrity": "sha512-6SRqwey/TXMNu2G02mbWgxrifhpjGOjDr30N+58AR0Ytgc+HXMqlPAUIvTe+e7sOBfAtBbiNlmOWv5KSYIjf3w==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "@docusaurus/plugin-content-docs": "^3.0.1", + "@docusaurus/utils": "^3.0.1", + "@docusaurus/utils-validation": "^3.0.1", + "@redocly/openapi-core": "^1.10.5", + "chalk": "^4.1.2", + "clsx": "^1.1.1", + "fs-extra": "^9.0.1", + "json-pointer": "^0.6.2", + "json-schema-merge-allof": "^0.8.1", + "json5": "^2.2.3", + "lodash": "^4.17.20", + "mustache": "^4.2.0", + "openapi-to-postmanv2": "^4.21.0", + "postman-collection": "^4.4.0", + "slugify": "^1.6.5", + "swagger2openapi": "^7.0.8", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/docusaurus-plugin-openapi-docs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-plugin-openapi-docs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/docusaurus-plugin-sass": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz", + "integrity": "sha512-2hKQQDkrufMong9upKoG/kSHJhuwd+FA3iAe/qzS/BmWpbIpe7XKmq5wlz4J5CJaOPu4x+iDJbgAxZqcoQf0kg==", + "license": "MIT", + "dependencies": { + "sass-loader": "^16.0.2" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha", + "sass": "^1.30.0" + } + }, + "node_modules/docusaurus-plugin-sass/node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "webpack": { + "optional": true } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-3.0.1.tgz", + "integrity": "sha512-tqypV91tC3wuWj9O+4n0M/e5AgHOeMT2nvPj1tjlPkC7/dLinZvpwQStT4YDUPYSoHRseqxd7lhivFQHcmlryg==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "@docusaurus/theme-common": "^3.0.1", + "@hookform/error-message": "^2.0.1", + "@reduxjs/toolkit": "^1.7.1", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.1.0", + "crypto-js": "^4.1.1", + "docusaurus-plugin-openapi-docs": "^3.0.1", + "docusaurus-plugin-sass": "^0.2.3", + "file-saver": "^2.0.5", + "lodash": "^4.17.20", + "node-polyfill-webpack-plugin": "^2.0.1", + "postman-code-generators": "^1.10.1", + "postman-collection": "^4.4.0", + "prism-react-renderer": "^2.3.0", + "react-hook-form": "^7.43.8", + "react-live": "^4.0.0", + "react-magic-dropzone": "^1.0.1", + "react-markdown": "^8.0.1", + "react-modal": "^3.15.1", + "react-redux": "^7.2.0", + "rehype-raw": "^6.1.1", + "sass": "^1.58.1", + "sass-loader": "^13.3.2", + "webpack": "^5.61.0", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@types/unist": "^2" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } + "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", "license": "MIT", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", "license": "MIT", "dependencies": { - "micromark-util-types": "^1.0.0" + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/docusaurus-theme-openapi-docs/node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/docusaurus-theme-openapi-docs/node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/parse5": { "version": "6.0.1", @@ -9903,22 +10454,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", @@ -10073,6 +10608,18 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "license": "Artistic-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -10193,11 +10740,32 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", - "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "version": "1.5.150", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz", + "integrity": "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==", "license": "ISC" }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -10238,6 +10806,19 @@ "node": ">= 0.8" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -10595,6 +11176,15 @@ "node": ">= 0.8" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -10610,13 +11200,14 @@ "node": ">=0.8.x" } }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "license": "MIT", - "engines": { - "node": ">=18.0.0" + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "node_modules/execa": { @@ -10966,6 +11557,15 @@ "node": ">=0.10.0" } }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -10978,6 +11578,15 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -11017,93 +11626,258 @@ "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "license": "MIT", "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "license": "MIT", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "node": ">=8" } }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "license": "MIT", - "engines": { - "node": ">=4.0" + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, "engines": { - "node": ">=14" + "node": ">= 8.9.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/form-data-encoder": { @@ -11174,6 +11948,12 @@ "node": ">=14.14" } }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -11321,22 +12101,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -11389,6 +12153,44 @@ "node": ">=10" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -11573,6 +12375,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-yarn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", @@ -11585,6 +12402,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -11792,6 +12632,17 @@ "value-equal": "^1.0.1" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -11843,6 +12694,22 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -11964,9 +12831,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -11978,8 +12845,8 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/http-cache-semantics": { @@ -12091,6 +12958,12 @@ "node": ">=10.19.0" } }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "license": "MIT" + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -12113,15 +12986,6 @@ "node": ">=10.17.0" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -12176,10 +13040,13 @@ } }, "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, "bin": { "image-size": "bin/image-size.js" }, @@ -12251,6 +13118,7 @@ "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" } @@ -12335,6 +13203,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -12376,6 +13260,18 @@ "node": ">=4" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -12455,6 +13351,24 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -12470,44 +13384,11 @@ "node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-installed-globally": { @@ -12526,16 +13407,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-npm": { @@ -12568,6 +13453,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -12601,6 +13495,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -12610,6 +13522,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -12622,6 +13543,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -12799,15 +13735,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, - "node_modules/json-crawl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/json-crawl/-/json-crawl-0.5.3.tgz", - "integrity": "sha512-BEjjCw8c7SxzNK4orhlWD5cXQh8vCk2LqDr4WgQq4CV+5dvopeYwt1Tskg67SuSLKvoFH5g0yuYtg7rcfKV6YA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -12823,12 +13750,6 @@ "foreach": "^2.0.4" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-compare": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", @@ -13106,18 +14027,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.1.tgz", - "integrity": "sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -13127,6 +14036,17 @@ "node": ">= 0.4" } }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -13623,21 +14543,15 @@ "license": "MIT" }, "node_modules/memfs": { - "version": "4.50.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.50.0.tgz", - "integrity": "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==", - "license": "Apache-2.0", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", "dependencies": { - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" + "fs-monkey": "^1.0.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">= 4.0.0" } }, "node_modules/merge-descriptors": { @@ -15470,6 +16384,25 @@ "node": ">=8.6" } }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -15559,6 +16492,12 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC" }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, "node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -15785,6 +16724,45 @@ "node": ">= 6.13.0" } }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "license": "MIT", + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.22.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^4.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, "node_modules/node-readfiles": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", @@ -15795,9 +16773,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT" }, "node_modules/normalize-path": { @@ -16049,6 +17027,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -16192,6 +17186,12 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "license": "MIT" + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -16201,15 +17201,6 @@ "node": ">=12.20" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", @@ -16255,49 +17246,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "license": "MIT", "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/package-json": { @@ -16325,9 +17293,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/param-case": { @@ -16352,6 +17320,23 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -16426,6 +17411,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parse5/node_modules/entities": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", @@ -16585,6 +17582,54 @@ "inherits": "2.0.3" } }, + "node_modules/pbkdf2": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "license": "MIT", + "dependencies": { + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", + "license": "MIT", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -16637,6 +17682,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -16646,10 +17764,19 @@ "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -16666,7 +17793,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -16744,9 +17871,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.9.tgz", + "integrity": "sha512-WScwD3pSsIz+QP97sPkGCeJm7xUH0J18k6zV5o8O2a4cQJyv15vLUx/WFQajuJVgZhmJL5awDu8zHnqzAzm4lw==", "funding": [ { "type": "github", @@ -16759,10 +17886,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -16859,9 +17986,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", "funding": [ { "type": "github", @@ -16874,10 +18001,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { "node": ">=18" @@ -16887,9 +18014,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", "funding": [ { "type": "github", @@ -16902,9 +18029,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -16916,9 +18043,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", "funding": [ { "type": "github", @@ -16931,9 +18058,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", "postcss-selector-parser": "^7.0.0" }, "engines": { @@ -17058,9 +18185,9 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.1.tgz", + "integrity": "sha512-ZitCwmvOR4JzXmKw6sZblTgwV1dcfLvClcyjADuqZ5hU0Uk4SVNpvSN9w8NcJ7XuxhRYxVA8m8AB3gy+HNBQOA==", "funding": [ { "type": "github", @@ -17073,7 +18200,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -17256,9 +18383,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.9.tgz", + "integrity": "sha512-IGbsIXbqMDusymJAKYX+f9oakPo89wL9Pzd/qRBQOVf3EIQWT9hgvqC4Me6Dkzxp3KPuIBf6LPkjrLHe/6ZMIQ==", "funding": [ { "type": "github", @@ -17271,10 +18398,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -17606,9 +18733,9 @@ } }, "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", "funding": [ { "type": "github", @@ -17621,7 +18748,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-resolve-nested": "^3.0.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, @@ -17633,9 +18760,9 @@ } }, "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", "funding": [ { "type": "github", @@ -17920,9 +19047,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", - "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.6.tgz", + "integrity": "sha512-1jRD7vttKLJ7o0mcmmYWKRLm7W14rI8K1I7Y41OeXUPEVc/CAzfTssNUeJ0zKbR+zMk4boqct/gwS/poIFF5Lg==", "funding": [ { "type": "github", @@ -17935,66 +19062,62 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.9", + "@csstools/postcss-color-mix-function": "^3.0.9", + "@csstools/postcss-content-alt-text": "^2.0.5", + "@csstools/postcss-exponential-functions": "^2.0.8", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-gamut-mapping": "^2.0.9", + "@csstools/postcss-gradients-interpolation-method": "^5.0.9", + "@csstools/postcss-hwb-function": "^4.0.9", + "@csstools/postcss-ic-unit": "^4.0.1", "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.8", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.8", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-oklab-function": "^4.0.9", + "@csstools/postcss-progressive-custom-properties": "^4.0.1", + "@csstools/postcss-random-function": "^2.0.0", + "@csstools/postcss-relative-color-syntax": "^3.0.9", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-sign-functions": "^1.1.3", + "@csstools/postcss-stepped-value-functions": "^4.0.8", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.8", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.21", - "browserslist": "^4.26.0", + "browserslist": "^4.24.4", "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", + "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.4.2", + "cssdb": "^8.2.5", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", + "postcss-color-functional-notation": "^7.0.9", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", + "postcss-double-position-gradients": "^6.0.1", "postcss-focus-visible": "^10.0.1", "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", + "postcss-lab-function": "^7.0.9", "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", + "postcss-nesting": "^13.0.1", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", @@ -18347,9 +19470,9 @@ } }, "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -18492,6 +19615,26 @@ "node": ">= 0.10" } }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -18541,6 +19684,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -18582,6 +19742,16 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -18663,6 +19833,132 @@ "node": ">=0.10.0" } }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -18676,6 +19972,12 @@ "react": "^18.3.1" } }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + "license": "MIT" + }, "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", @@ -18722,15 +20024,15 @@ "license": "MIT" }, "node_modules/react-json-view-lite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", + "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-lifecycles-compat": { @@ -19563,6 +20865,27 @@ "react": ">=15" } }, + "node_modules/react-waypoint": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.3.0.tgz", + "integrity": "sha512-iF1y2c1BsoXuEGz08NoahaLFIGI9gTUAAOKip96HUmylRT6DUtpgoBPjk/Y8dfcFVmfVDvUzWjNXpZyKTOV0SQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "consolidated-events": "^1.1.0 || ^2.0.0", + "prop-types": "^15.0.0", + "react-is": "^17.0.1 || ^18.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-waypoint/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -19573,6 +20896,22 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -19585,6 +20924,12 @@ "node": ">=8.10.0" } }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", + "license": "MIT" + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -19660,6 +21005,40 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", @@ -20180,6 +21559,38 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", + "license": "BSD-3-Clause" + }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -20198,18 +21609,6 @@ "node": ">=12.0.0" } }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -20265,6 +21664,23 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -20292,29 +21708,29 @@ } }, "node_modules/sass-loader": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.6.tgz", - "integrity": "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", + "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "@rspack/core": { + "fibers": { "optional": true }, "node-sass": { @@ -20325,9 +21741,6 @@ }, "sass-embedded": { "optional": true - }, - "webpack": { - "optional": true } } }, @@ -20374,12 +21787,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0" - }, "node_modules/schema-utils": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", @@ -20699,12 +22106,31 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -21227,11 +22653,61 @@ } }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "license": "MIT" }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/streamx": { "version": "2.22.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", @@ -21608,19 +23084,6 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, - "node_modules/swr": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", - "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", @@ -21682,9 +23145,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.10.tgz", + "integrity": "sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA==", "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -21802,6 +23265,12 @@ "b4a": "^1.6.4" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -21823,40 +23292,24 @@ "node": ">=0.8" } }, - "node_modules/thingies": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -21869,15 +23322,26 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">= 0.4" } }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -21914,22 +23378,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -21962,6 +23410,12 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "license": "MIT" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -21999,6 +23453,20 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -22012,7 +23480,6 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -22022,6 +23489,15 @@ "node": ">=14.17" } }, + "node_modules/undici": { + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", + "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -22221,9 +23697,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -22443,13 +23919,17 @@ "react": ">= 16.8.0" } }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "node_modules/util-deprecate": { @@ -22621,6 +24101,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "license": "MIT" + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -22751,32 +24237,26 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 18.12.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } + "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/webpack-dev-middleware/node_modules/colorette": { @@ -22785,34 +24265,99 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 0.6" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/webpack-merge": { @@ -22839,77 +24384,23 @@ } }, "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", "license": "MIT", "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", + "chalk": "^4.1.0", + "consola": "^2.15.3", "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" + "std-env": "^3.0.1" }, "engines": { - "node": ">=14.21.3" + "node": ">=12" }, "peerDependencies": { "webpack": "3 || 4 || 5" } }, - "node_modules/webpackbar/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpackbar/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpackbar/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -22933,6 +24424,27 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -22958,6 +24470,27 @@ "node": ">= 8" } }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -23112,36 +24645,6 @@ } } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", @@ -23187,6 +24690,15 @@ "node": ">= 10" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -23276,15 +24788,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/docs/package.json b/docs/package.json index efc2de4bf3..58d713fb80 100644 --- a/docs/package.json +++ b/docs/package.json @@ -19,18 +19,17 @@ }, "dependencies": { "@cloudflare/stream-react": "1.9.1", - "@docsearch/react": "^4.2.0", - "@docusaurus/core": "^3.9.2", - "@docusaurus/plugin-client-redirects": "^3.9.2", - "@docusaurus/plugin-content-docs": "^3.9.2", - "@docusaurus/plugin-ideal-image": "^3.9.2", - "@docusaurus/preset-classic": "^3.9.2", - "@docusaurus/theme-search-algolia": "^3.9.2", + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-client-redirects": "^3.4.0", + "@docusaurus/plugin-content-docs": "^3.5.2", + "@docusaurus/plugin-ideal-image": "^3.4.0", + "@docusaurus/preset-classic": "3.4.0", + "@docusaurus/theme-search-algolia": "^3.5.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "docusaurus-plugin-image-zoom": "^2.0.0", - "docusaurus-plugin-openapi-docs": "^4.5.1", - "docusaurus-theme-openapi-docs": "^4.5.1", + "docusaurus-plugin-openapi-docs": "3.0.1", + "docusaurus-theme-openapi-docs": "3.0.1", "dotenv": "^16.4.5", "posthog-docusaurus": "^2.0.1", "prism-react-renderer": "^2.3.0", @@ -38,9 +37,9 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.9.2", - "@docusaurus/tsconfig": "^3.9.2", - "@docusaurus/types": "^3.9.2", + "@docusaurus/module-type-aliases": "^3.5.2", + "@docusaurus/tsconfig": "^3.5.2", + "@docusaurus/types": "^3.5.2", "tailwindcss": "^3.4.10", "typescript": "^5.5.4" }, diff --git a/docs/sidebars.ts b/docs/sidebars.ts index 229a6d9e31..8d345d8e31 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -19,45 +19,40 @@ const sidebars: SidebarsConfig = { label: "Prompt Engineering", ...CATEGORY_UTILITIES, items: [{ type: "autogenerated", dirName: "prompt-engineering" }, - { - type: "category", - collapsed: true, - collapsible: true, - label: "Tutorials", - items: ["tutorials/sdk/manage-prompts-with-SDK"] - }], + {type: "category", + collapsed: true, + collapsible: true, + label: "Tutorials", + items: [ "tutorials/sdk/manage-prompts-with-SDK"]}], }, { label: "Evaluation", ...CATEGORY_UTILITIES, items: [{ type: "autogenerated", dirName: "evaluation" }, - { - type: "category", - collapsed: true, - collapsible: true, - label: "Tutorials", - items: ["tutorials/cookbooks/capture-user-feedback"] - }], + {type: "category", + collapsed: false, + collapsible: true, + label: "Tutorials", + items: [ "tutorials/cookbooks/capture-user-feedback", + "tutorials/sdk/evaluate-with-SDK"]}], }, { label: "Observability", ...CATEGORY_UTILITIES, items: [{ type: "autogenerated", dirName: "observability" }, - { - type: "category", - collapsed: true, - collapsible: true, - label: "Tutorials", - items: ["tutorials/cookbooks/capture-user-feedback", - "tutorials/cookbooks/observability_langchain"] - }], + {type: "category", + collapsed: true, + collapsible: true, + label: "Tutorials", + items: [ "tutorials/cookbooks/capture-user-feedback", + "tutorials/cookbooks/observability_langchain"]}], }, { label: "Custom Workflows", ...CATEGORY_UTILITIES, items: [{ type: "autogenerated", dirName: "custom-workflows" } - ], + ], }, { label: "Concepts", @@ -69,6 +64,11 @@ const sidebars: SidebarsConfig = { ...CATEGORY_UTILITIES, items: [{ type: "autogenerated", dirName: "misc" }], }, + { + label: "Self-host", + ...CATEGORY_UTILITIES, + items: [{ type: "autogenerated", dirName: "self-host" }], + }, ], guidesSidebar: [ @@ -107,13 +107,6 @@ const sidebars: SidebarsConfig = { items: require("./docs/reference/api/sidebar.js"), }, ], - selfHostSidebar: [ - { - label: "Self-host", - ...CATEGORY_UTILITIES, - items: [{ type: "autogenerated", dirName: "self-host" }], - }, - ], }; export default sidebars; diff --git a/docs/src/components/CARD_ICON_USAGE.md b/docs/src/components/CARD_ICON_USAGE.md deleted file mode 100644 index fa42c216e0..0000000000 --- a/docs/src/components/CARD_ICON_USAGE.md +++ /dev/null @@ -1,156 +0,0 @@ -# Custom Card Icon Usage Guide - -This guide explains how to use custom icons with DocCard components in the documentation. - -## Quick Start - -Import the CustomDocCard component in your MDX files: - -```mdx -import CustomDocCard from '@site/src/components/CustomDocCard'; -``` - -## Usage Examples - -### 1. Default Card (Standard Arrow Icon) -```mdx -import DocCard from '@theme/DocCard'; - - -``` - -### 2. Card with Emoji Icon -```mdx -import CustomDocCard from '@site/src/components/CustomDocCard'; - - -``` - -### 3. Card with Image/SVG Icon -```mdx -import CustomDocCard from '@site/src/components/CustomDocCard'; - - -``` - -### 4. Card Without Icon -```mdx -import CustomDocCard from '@site/src/components/CustomDocCard'; - - -``` - -## Using with DocCardList - -For auto-generated card lists, you'll need to use a custom wrapper: - -```mdx -import { useCurrentSidebarCategory } from '@docusaurus/theme-common'; -import CustomDocCard from '@site/src/components/CustomDocCard'; - -export function CustomCardList({ icons = {} }) { - const category = useCurrentSidebarCategory(); - - return ( -
- {category.items.map((item, index) => ( -
- -
- ))} -
- ); -} - - -``` - -## Direct HTML Approach (Alternative) - -If you prefer not to use the component, you can add custom classes directly to regular DocCard: - -### Using data attribute for emoji: -```mdx -
- -
-``` - -### Using className for no icon: -```mdx -
- -
-``` - -## Supported Icon Types - -| Type | Method | Example | -|------|--------|---------| -| Emoji | `icon` prop | `icon="🚀"` | -| Unicode | `icon` prop | `icon="★"` | -| SVG File | `imagePath` prop | `imagePath="/img/icon.svg"` | -| PNG/JPG | `imagePath` prop | `imagePath="/img/icon.png"` | -| None | `noIcon` prop | `noIcon={true}` | - -## Icon Best Practices - -1. **Emoji Size**: Emojis are automatically sized at 24px -2. **Image Icons**: Should be square (24x24px recommended) for best results -3. **SVG Icons**: Preferred for crisp rendering at any resolution -4. **Consistency**: Use similar icon styles across related cards -5. **Accessibility**: Icons are decorative - ensure card titles are descriptive - -## CSS Classes Reference - -- `.custom-icon` - Applied when using emoji/text icons -- `.icon-img` - Applied when using image/SVG icons -- `.no-icon` - Applied when hiding the default icon -- `[data-card-icon]` - Attribute used to pass emoji/text content - -## Troubleshooting - -**Icons not showing?** -- Clear browser cache (Ctrl+Shift+R / Cmd+Shift+R) -- Verify image paths are correct (relative to /static folder) -- Check that CSS custom.css has been updated - -**Default arrow still showing?** -- Ensure you're using `CustomDocCard` component or proper class names -- Verify the `noIcon` prop is set to `true` diff --git a/docs/src/components/CustomCardExample.mdx b/docs/src/components/CustomCardExample.mdx deleted file mode 100644 index fc696bb2e7..0000000000 --- a/docs/src/components/CustomCardExample.mdx +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Custom Card Icons Example -description: Example page showing different card icon options ---- - -import CustomDocCard from '@site/src/components/CustomDocCard'; -import DocCard from '@theme/DocCard'; - -# Custom Card Icons Example - -This page demonstrates the different ways to use custom icons with DocCard components. - -## Default Card (Standard Arrow) - - - -## Card with Emoji Icon - - - -## Card with Different Emoji - -
-
- -
-
- -
-
- -## Card Without Icon - - - -## More Examples - -
-
- -
-
- -
-
- -
-
diff --git a/docs/src/components/CustomDocCard.tsx b/docs/src/components/CustomDocCard.tsx deleted file mode 100644 index a03abbf428..0000000000 --- a/docs/src/components/CustomDocCard.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react'; -import DocCard from '@theme/DocCard'; -import type { PropSidebarItem } from '@docusaurus/plugin-content-docs'; - -interface CustomDocCardProps { - item: PropSidebarItem; - icon?: string; // Emoji or text icon - imagePath?: string; // Path to SVG/image icon - noIcon?: boolean; // Set to true to hide the default icon -} - -/** - * CustomDocCard - A wrapper around Docusaurus DocCard with custom icon support - * - * Usage examples: - * - * 1. With emoji icon: - * - * - * 2. With image/SVG icon: - * - * - * 3. Without icon: - * - * - * 4. Default (standard arrow): - * - */ -export default function CustomDocCard({ - item, - icon, - imagePath, - noIcon -}: CustomDocCardProps) { - const getClassName = () => { - if (noIcon) return 'no-icon'; - if (imagePath) return 'icon-img'; - if (icon) return 'custom-icon'; - return ''; - }; - - const getStyle = () => { - if (imagePath) { - return { - '--card-icon-image': `url(${imagePath})`, - } as React.CSSProperties; - } - return {}; - }; - - // For image icons, we need to apply the background via inline style - const cardProps: any = { - item, - }; - - return ( -
- -
- ); -} diff --git a/docs/src/components/GitHubExampleButton.module.css b/docs/src/components/GitHubExampleButton.module.css deleted file mode 100644 index 8ffab5fa25..0000000000 --- a/docs/src/components/GitHubExampleButton.module.css +++ /dev/null @@ -1,72 +0,0 @@ -.githubButton { - display: table !important; - width: 100% !important; - height: 48px !important; - background-color: var(--ifm-background-surface-color) !important; - color: var(--ifm-color-content) !important; - text-decoration: none !important; - border-radius: 8px !important; - border: 1px solid var(--ifm-color-emphasis-300) !important; - font-weight: 500 !important; - font-size: 16px !important; - cursor: pointer !important; - transition: all 0.2s ease !important; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04) !important; - box-sizing: border-box !important; - position: relative !important; -} - -.githubButton:hover { - border-color: var(--ifm-color-primary) !important; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important; - transform: translateY(-1px) !important; - text-decoration: none !important; -} - -.githubButton:visited { - color: var(--ifm-color-content) !important; - text-decoration: none !important; -} - -.githubButton:active { - text-decoration: none !important; -} - -.logo { - position: absolute !important; - left: 16px !important; - top: 50% !important; - transform: translateY(-50%) !important; - width: 24px !important; - height: 24px !important; - display: block !important; -} - -.text { - display: block !important; - text-align: center !important; - text-decoration: none !important; - line-height: 48px !important; - margin: 0 !important; - padding: 0 !important; - white-space: nowrap !important; - font-family: inherit !important; - font-size: 16px !important; - font-weight: 500 !important; - color: inherit !important; - width: 100% !important; - height: 48px !important; - position: absolute !important; - top: 0 !important; - left: 0 !important; -} - -.arrow { - position: absolute !important; - right: 16px !important; - top: 50% !important; - transform: translateY(-50%) !important; - width: 16px !important; - height: 16px !important; - display: block !important; -} \ No newline at end of file diff --git a/docs/src/components/GitHubExampleButton.tsx b/docs/src/components/GitHubExampleButton.tsx deleted file mode 100644 index 11e70ca8f0..0000000000 --- a/docs/src/components/GitHubExampleButton.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; -import styles from './GitHubExampleButton.module.css'; - -interface GitHubExampleButtonProps { - examplePath: string; - children?: React.ReactNode; -} - -const GitHubExampleButton: React.FC = ({ examplePath, children }) => { - const baseUrl = 'https://github.com/Agenta-AI/agenta/tree/main'; - const githubUrl = `${baseUrl}/${examplePath}`; - - return ( - - ); -}; - -export default GitHubExampleButton; - diff --git a/docs/src/components/GoogleColabButton.module.css b/docs/src/components/GoogleColabButton.module.css deleted file mode 100644 index 82dc3acaac..0000000000 --- a/docs/src/components/GoogleColabButton.module.css +++ /dev/null @@ -1,73 +0,0 @@ -.colabButton { - display: table !important; - width: 100% !important; - height: 48px !important; - background-color: var(--ifm-background-surface-color) !important; - color: var(--ifm-color-content) !important; - text-decoration: none !important; - border-radius: 8px !important; - border: 1px solid var(--ifm-color-emphasis-300) !important; - font-weight: 500 !important; - font-size: 16px !important; - cursor: pointer !important; - transition: all 0.2s ease !important; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04) !important; - box-sizing: border-box !important; - position: relative !important; -} - -.colabButton:hover { - border-color: var(--ifm-color-primary) !important; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important; - transform: translateY(-1px) !important; - text-decoration: none !important; -} - -.colabButton:visited { - color: var(--ifm-color-content) !important; - text-decoration: none !important; -} - -.colabButton:active { - text-decoration: none !important; -} - -.logo { - position: absolute !important; - left: 16px !important; - top: 50% !important; - transform: translateY(-50%) !important; - width: 24px !important; - height: 24px !important; - object-fit: contain !important; - display: block !important; -} - -.text { - display: block !important; - text-align: center !important; - text-decoration: none !important; - line-height: 48px !important; - margin: 0 !important; - padding: 0 !important; - white-space: nowrap !important; - font-family: inherit !important; - font-size: 16px !important; - font-weight: 500 !important; - color: inherit !important; - width: 100% !important; - height: 48px !important; - position: absolute !important; - top: 0 !important; - left: 0 !important; -} - -.arrow { - position: absolute !important; - right: 16px !important; - top: 50% !important; - transform: translateY(-50%) !important; - width: 16px !important; - height: 16px !important; - display: block !important; -} \ No newline at end of file diff --git a/docs/src/components/GoogleColabButton.tsx b/docs/src/components/GoogleColabButton.tsx deleted file mode 100644 index 5ace0fbb4c..0000000000 --- a/docs/src/components/GoogleColabButton.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import styles from './GoogleColabButton.module.css'; - -interface GoogleColabButtonProps { - notebookPath: string; - children?: React.ReactNode; -} - -const GoogleColabButton: React.FC = ({ notebookPath, children }) => { - const baseUrl = 'https://colab.research.google.com/github/Agenta-AI/agenta/blob/main'; - const colabUrl = `${baseUrl}/${notebookPath}`; - - return ( - - ); -}; - -export default GoogleColabButton; \ No newline at end of file diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index ac810733c1..c0a8f9b363 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -7,409 +7,74 @@ /* You can override the default Infima variables here. */ :root { - /* Brand colors - Light mode */ - --brand-main-black: #000; - --brand-heading-black: #242424; - --brand-secondary-text: #676771; - --brand-border-grey: #DCD5D1; - --brand-grey-bg: #413F40; - --brand-white-bg: #FFF; - - /* Primary color mapping */ - --ifm-color-primary: #676771; - --ifm-color-primary-dark: #676771; - --ifm-color-primary-darker: #242424; - --ifm-color-primary-darkest: #242424; - --ifm-color-primary-light: #676771; - --ifm-color-primary-lighter: #DCD5D1; - --ifm-color-primary-lightest: #DCD5D1; - - /* Background colors */ - --ifm-background-color: #FFF; - --ifm-navbar-background-color: #FFF; - - /* Border colors */ - --ifm-toc-border-color: #DCD5D1; - --ifm-color-emphasis-200: #DCD5D1; - - /* Text colors */ - --ifm-font-color-base: #000; - --ifm-heading-color: #242424; - --ifm-link-color: #242424; - - /* Code highlighting */ - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.05); - - /* Typography */ + --ifm-color-primary: #6b7280; + --ifm-color-primary-dark: hsl(209, 13%, 40%); + --ifm-color-primary-darker: hsl(210, 21%, 28%); + --ifm-color-primary-darkest: hsl(211, 37%, 17%); + --ifm-color-primary-light: hsl(209, 14%, 55%); + --ifm-color-primary-lighter: hsl(210, 18%, 78%); + --ifm-color-primary-lightest: hsl(210, 24%, 87%); + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.274); --ifm-font-weight-normal: 400; - --ifm-font-weight-semibold: 500; - --ifm-font-weight-bold: 600; - --ifm-heading-font-weight: 600; - --ifm-h1-font-weight: 600; - --ifm-h2-font-weight: 500; - --ifm-h3-font-weight: 500; - --ifm-h4-font-weight: 500; - --ifm-navbar-height: 6.5rem; + --ifm-navbar-height: 3.9rem; --ifm-link-color: var(--ifm-color-primary-darker); --ifm-heading-color: var(--ifm-color-primary-darkest); --ifm-heading-h1-font-size: 32px; --ifm-heading-h2-font-size: 26px; --ifm-heading-h3-font-size: 20px; --ifm-heading-h4-font-size: 16px; - - /* Spacing scale */ - --spacing-xs: 4px; - --spacing-sm: 8px; - --spacing-md: 16px; - --spacing-lg: 24px; - --spacing-xl: 40px; - - /* Border radius scale */ - --border-radius-sm: 4px; - --border-radius-md: 6px; - --border-radius-lg: 8px; - - /* UI element colors - Light mode */ - --navbar-link-color: var(--brand-secondary-text); - --navbar-link-active-color: var(--brand-heading-black); - --sidebar-link-color: var(--brand-secondary-text); - --sidebar-link-active-color: var(--brand-heading-black); - --toc-link-color: var(--brand-secondary-text); } /* For readability concerns, you should choose a lighter palette in dark mode. */ [data-theme="dark"] { - /* Brand colors - Dark mode */ - --brand-black-bg: #1E1C1D; - --brand-main-text-dark: #FFF; - --brand-secondary-text-dark: #787777; - - /* Primary color mapping for dark mode */ - --ifm-color-primary: #787777; - --ifm-color-primary-dark: #787777; - --ifm-color-primary-darker: #FFF; - --ifm-color-primary-darkest: #FFF; - --ifm-color-primary-light: #787777; - --ifm-color-primary-lighter: #413F40; - --ifm-color-primary-lightest: #2A2A2A; - - /* Background colors */ - --ifm-background-color: #1E1C1D; - --ifm-navbar-background-color: #1E1C1D; - --ifm-background-surface-color: #1E1C1D; - - /* Border colors */ - --ifm-toc-border-color: #413F40; - --ifm-color-emphasis-200: #413F40; - - /* Text colors */ - --ifm-font-color-base: #D0D0D0; - --ifm-heading-color: #FFF; - --ifm-link-color: #FFF; - - /* Code highlighting */ - --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.05); - - /* UI element colors - Dark mode */ - --navbar-link-color: #C0C0C0; - --navbar-link-active-color: var(--brand-main-text-dark); - --sidebar-link-color: #C0C0C0; - --sidebar-link-active-color: var(--brand-main-text-dark); - --toc-link-color: #C0C0C0; + --ifm-color-primary: #758391; + --ifm-color-primary-dark: #bdc7d1; + --ifm-color-primary-darker: #d6dee6; + --ifm-color-primary-darkest: #eaeff5; + --ifm-color-primary-light: #758391; + --ifm-color-primary-lighter: #586673; + --ifm-color-primary-lightest: #394857; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } *:not(code *):not(pre) { font-family: "Inter", sans-serif !important; } - body { - color: var(--ifm-font-color-base); + color: var(--ifm-color-primary-darker); font-size: 16px; - line-height: 1.6; -} - -/* Lighter bold text weight for better readability */ -strong, -b { - font-weight: var(--ifm-font-weight-bold) !important; } - code *, pre { font-family: "IBM Plex Mono", monospace !important; } - -/* Code block typography improvements */ -pre { - font-size: 14px; - line-height: 1.7; - padding: 1.25rem; -} - -pre code { - font-size: 14px; - letter-spacing: -0.01em; -} - -/* Inline code */ -code:not(pre code) { - font-size: 0.9em; - font-weight: 500; - letter-spacing: -0.02em; - padding: 0.2em 0.4em; - background-color: rgba(0, 0, 0, 0.05); - border-radius: 3px; -} - -[data-theme="dark"] code:not(pre code) { - background-color: rgba(255, 255, 255, 0.1); -} - -/* Clean 2D code block styling - remove shadows, add border */ -pre, -div[class*="codeBlock"], -div[class*="prism"] { - box-shadow: none !important; - border: 0.5px solid rgba(203, 203, 203, 0.3) !important; - border-radius: var(--border-radius-md); - background-color: #FAFAFA !important; -} - -[data-theme="dark"] pre, -[data-theme="dark"] div[class*="codeBlock"], -[data-theme="dark"] div[class*="prism"] { - border: 0.5px solid rgba(255, 255, 255, 0.1) !important; - background-color: #1A1A1A !important; -} - -/* Custom refined syntax highlighting - Light mode */ -[data-theme="light"] .token.comment, -[data-theme="light"] .token.prolog, -[data-theme="light"] .token.doctype, -[data-theme="light"] .token.cdata { - color: #6A737D; - font-style: italic; -} - -[data-theme="light"] .token.punctuation { - color: #5E6687; -} - -[data-theme="light"] .token.property, -[data-theme="light"] .token.tag, -[data-theme="light"] .token.boolean, -[data-theme="light"] .token.number, -[data-theme="light"] .token.constant, -[data-theme="light"] .token.symbol, -[data-theme="light"] .token.deleted { - color: #0184BC; -} - -[data-theme="light"] .token.selector, -[data-theme="light"] .token.attr-name, -[data-theme="light"] .token.string, -[data-theme="light"] .token.char, -[data-theme="light"] .token.builtin, -[data-theme="light"] .token.inserted { - color: #0C7C59; -} - -[data-theme="light"] .token.operator, -[data-theme="light"] .token.entity, -[data-theme="light"] .token.url, -[data-theme="light"] .language-css .token.string, -[data-theme="light"] .style .token.string { - color: #A626A4; -} - -[data-theme="light"] .token.atrule, -[data-theme="light"] .token.attr-value, -[data-theme="light"] .token.keyword { - color: #D73A49; -} - -[data-theme="light"] .token.function, -[data-theme="light"] .token.class-name { - color: #6F42C1; -} - -[data-theme="light"] .token.regex, -[data-theme="light"] .token.important, -[data-theme="light"] .token.variable { - color: #E36209; -} - -/* Custom refined syntax highlighting - Dark mode */ -[data-theme="dark"] .token.comment, -[data-theme="dark"] .token.prolog, -[data-theme="dark"] .token.doctype, -[data-theme="dark"] .token.cdata { - color: #8B949E; - font-style: italic; -} - -[data-theme="dark"] .token.punctuation { - color: #C9D1D9; -} - -[data-theme="dark"] .token.property, -[data-theme="dark"] .token.tag, -[data-theme="dark"] .token.boolean, -[data-theme="dark"] .token.number, -[data-theme="dark"] .token.constant, -[data-theme="dark"] .token.symbol, -[data-theme="dark"] .token.deleted { - color: #79C0FF; -} - -[data-theme="dark"] .token.selector, -[data-theme="dark"] .token.attr-name, -[data-theme="dark"] .token.string, -[data-theme="dark"] .token.char, -[data-theme="dark"] .token.builtin, -[data-theme="dark"] .token.inserted { - color: #7EE787; -} - -[data-theme="dark"] .token.operator, -[data-theme="dark"] .token.entity, -[data-theme="dark"] .token.url, -[data-theme="dark"] .language-css .token.string, -[data-theme="dark"] .style .token.string { - color: #D2A8FF; -} - -[data-theme="dark"] .token.atrule, -[data-theme="dark"] .token.attr-value, -[data-theme="dark"] .token.keyword { - color: #FF7B72; -} - -[data-theme="dark"] .token.function, -[data-theme="dark"] .token.class-name { - color: #D2A8FF; -} - -[data-theme="dark"] .token.regex, -[data-theme="dark"] .token.important, -[data-theme="dark"] .token.variable { - color: #FFA657; -} - -/* Clean 2D admonition/callout styling - remove left accent and shadows */ -.theme-admonition, -div[class*="admonition"] { - box-shadow: none !important; - border-left: none !important; - border-radius: var(--border-radius-md); -} - -/* Note admonition - blue */ -.theme-admonition.alert--secondary, -.theme-admonition-note { - border: 1px solid rgba(84, 104, 255, 0.4) !important; -} - -[data-theme="dark"] .theme-admonition.alert--secondary, -[data-theme="dark"] .theme-admonition-note { - border: 1px solid rgba(84, 104, 255, 0.5) !important; -} - -/* Info admonition - cyan */ -.theme-admonition.alert--info, -.theme-admonition-info { - border: 1px solid rgba(84, 199, 236, 0.5) !important; -} - -[data-theme="dark"] .theme-admonition.alert--info, -[data-theme="dark"] .theme-admonition-info { - border: 1px solid rgba(84, 199, 236, 0.6) !important; -} - -/* Tip admonition - green */ -.theme-admonition.alert--success, -.theme-admonition-tip { - border: 1px solid rgba(0, 184, 148, 0.5) !important; -} - -[data-theme="dark"] .theme-admonition.alert--success, -[data-theme="dark"] .theme-admonition-tip { - border: 1px solid rgba(0, 184, 148, 0.6) !important; -} - -/* Caution/Warning admonition - orange */ -.theme-admonition.alert--warning, -.theme-admonition-caution, -.theme-admonition-warning { - border: 1px solid rgba(255, 165, 0, 0.6) !important; -} - -[data-theme="dark"] .theme-admonition.alert--warning, -[data-theme="dark"] .theme-admonition-caution, -[data-theme="dark"] .theme-admonition-warning { - border: 1px solid rgba(255, 165, 0, 0.7) !important; -} - -/* Danger admonition - red */ -.theme-admonition.alert--danger, -.theme-admonition-danger { - border: 1px solid rgba(220, 38, 38, 0.6) !important; -} - -[data-theme="dark"] .theme-admonition.alert--danger, -[data-theme="dark"] .theme-admonition-danger { - border: 1px solid rgba(239, 68, 68, 0.7) !important; -} - -h1:not([class*="openapi"]) { +h1 { font-size: var(--ifm-heading-h1-font-size) !important; - line-height: 1.25; - font-weight: var(--ifm-h1-font-weight) !important; - letter-spacing: -0.01em; + line-height: 40px; } - -h2:not([class*="openapi"]) { +h2 { font-size: var(--ifm-heading-h2-font-size) !important; - line-height: 1.3; - font-weight: var(--ifm-h2-font-weight) !important; - letter-spacing: -0.01em; + line-height: 34px; } - - -h3:not([class*="openapi"]) { +h3 { font-size: var(--ifm-heading-h3-font-size) !important; - line-height: 1.35; - font-weight: var(--ifm-h3-font-weight) !important; + line-height: 28px; } - -h4:not([class*="openapi"]) { +h4 { font-size: var(--ifm-heading-h4-font-size) !important; - line-height: 1.5; - font-weight: var(--ifm-h4-font-weight) !important; + line-height: 28px; } - /* link underline style */ article a { text-decoration: underline !important; - text-underline-offset: 3px !important; - text-decoration-thickness: 1px !important; - text-decoration-color: rgba(0, 0, 0, 0.22) !important; - transition: text-decoration-color 200ms ease, text-underline-offset 200ms ease !important; + text-underline-offset: 4px; + text-decoration-thickness: 1px; + text-decoration-color: var(--ifm-color-primary); } - -[data-theme="dark"] article a { - text-decoration-color: rgba(255, 255, 255, 0.25) !important; -} - article a:hover { - text-decoration-color: rgba(0, 0, 0, 0.45) !important; - text-underline-offset: 4px !important; -} - -[data-theme="dark"] article a:hover { - text-decoration-color: rgba(255, 255, 255, 0.55) !important; + text-decoration-thickness: 2px !important; + transition-duration: 400ms; } - .cardContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocCard-styles-module, .title_node_modules-\@docusaurus-theme-classic-lib-theme-BlogPostItem-Header-Title-styles-module a, .cardContainer_fWXF, @@ -418,62 +83,29 @@ article a:hover { text-decoration: none !important; } -/* Remove underline from card container links */ -a[class*="cardContainer"], -a[class*="cardContainer"]:hover { - text-decoration: none !important; -} - /** Navbar **/ - -/* Two-row navbar layout */ -.two-row-navbar { - --ifm-navbar-height: 6.5rem; - padding: 0 !important; -} - -.two-row-navbar .navbar__inner { - flex-direction: column; - align-items: stretch; - padding: 0 !important; -} - -/* Hide mobile toggle on desktop for bottom row */ -@media (min-width: 997px) { - .two-row-navbar .navbar__toggle { - display: none; - } -} - @media (min-width: 1851px) { - .main-wrapper, .navbar__inner { width: 1550px; margin: auto; } } - @media (min-width: 1350px) and (max-width: 1850px) { - .main-wrapper, .navbar__inner { width: 95%; margin: auto; } } - @media (min-width: 1024px) and (max-width: 1350px) { - .main-wrapper, .navbar__inner { width: 95%; margin: auto; } } - @media (max-width: 1024px) { - .main-wrapper, .navbar__inner { width: 100%; @@ -481,119 +113,80 @@ a[class*="cardContainer"]:hover { } } -/* Target CSS module classes properly - these override the module's own styles */ -.two-row-navbar :global(.navbarTopRow) { - padding: 10px 0 0 0 !important; -} - -.two-row-navbar :global(.navbarBottomRow) { - padding: 0 !important; - margin-top: 17px !important; -} - -/* Add left margin to logo in desktop two-row mode */ -@media (min-width: 997px) { - .two-row-navbar .navbar__logo { - margin-left: 8px; - } -} - -/* Mobile: reset to single row with normal navbar height */ -@media (max-width: 996px) { - .two-row-navbar { - --ifm-navbar-height: 3.5rem; - padding: 8px 16px !important; - } - - .two-row-navbar :global(.navbarTopRow) { - padding: 0 !important; - } -} - .navbar__link { font-size: 14px; padding: 0px 8px; - color: var(--navbar-link-color); - font-weight: var(--ifm-font-weight-normal); - letter-spacing: 0.01em; + color: var(--ifm-color-primary); + font-weight: 400; +} +[data-theme="dark"] .navbar__link { + color: var(--ifm-color-primary-darker); } - .navbar__link--active { - color: var(--navbar-link-active-color); - font-weight: var(--ifm-font-weight-semibold); + color: var(--ifm-color-primary-darkest); + font-weight: 500; +} +[data-theme="dark"] .navbar__link--active { + color: var(--ifm-color-primary-darkest); } - .nav_github_icons, .nav_slack_icons { width: 22px; height: 22px; } - .navbar__item:has(.nav_github_icons), .navbar__item:has(.nav_slack_icons) { display: flex; justify-content: center; align-items: center; } - .theme-icon { color: var(--ifm-color-primary-darkest); } - .navbar__item:has(.nav_slack_icons) { margin-right: 3px; } - .nav_primary_button { background-color: var(--ifm-color-primary-darkest); color: var(--ifm-color-primary-lightest); margin-right: 25px; padding: 8px 16px; } - [data-theme="dark"] .nav_primary_button { background-color: var(--ifm-color-primary-lightest); color: var(--ifm-color-primary-darkest); } - .nav_secondary_button { background-color: transparent; color: var(--ifm-color-primary); margin-left: 10px; padding: 8px 12px; } - [data-theme="dark"] .nav_secondary_button { - color: var(--navbar-link-color); + color: var(--ifm-color-primary-dark); } - .nav_primary_button, .nav_secondary_button { font-size: 14px; - border-radius: var(--border-radius-md); + border-radius: 6px; outline: none; border: none; cursor: pointer; } - @media (max-width: 995px) { - .navbar__item:has(.nav_github_icons), .navbar__item:has(.nav_slack_icons) { display: none; } - .navbar-sidebar .menu__link:has(.nav_github_icons), .navbar-sidebar .menu__link:has(.nav_slack_icons) { position: absolute; top: -48px; left: 172px; } - .navbar-sidebar .menu__link:has(.nav_slack_icons) { left: 215px; } - .navbar-sidebar .menu__link:has(.nav_secondary_button), .navbar-sidebar .menu__link:has(.nav_primary_button) { padding: 0px; @@ -603,18 +196,15 @@ a[class*="cardContainer"]:hover { left: 50%; transform: translateX(-50%); } - .navbar-sidebar .menu__link:has(.nav_secondary_button) { bottom: 65px; } - .navbar-sidebar .menu__link:has(.nav_secondary_button):hover, .navbar-sidebar .menu__link:has(.nav_primary_button):hover, .navbar-sidebar .menu__link:has(.nav_github_icons):hover, .navbar-sidebar .menu__link:has(.nav_slack_icons):hover { background: transparent; } - .nav_primary_button, .nav_secondary_button { width: 100%; @@ -627,61 +217,41 @@ a[class*="cardContainer"]:hover { [data-theme="dark"] .DocSearch-Button { background-color: #181818; } - [data-theme="dark"] .DocSearch-Button:hover { background-color: #1b1b1d; } - [data-theme="dark"] .DocSearch-Modal { background-color: #1b1b1d; } - [data-theme="dark"] .DocSearch-Footer { background-color: #242526; opacity: 0.9; } - [data-theme="dark"] .DocSearch-Form { background-color: #181818; box-shadow: none; border: 2px solid #3d4144; } - .DocSearch-Button { - border-radius: var(--border-radius-md) !important; + border-radius: 6px !important; padding: 0 2px 0px 8px !important; } - -/* Search bar in two-row navbar should be wider */ -.two-row-navbar .navbar__search { - width: auto !important; - flex: 1 1 auto !important; -} - -.two-row-navbar .DocSearch { - width: 100% !important; -} - -.two-row-navbar .DocSearch-Button { - min-width: 400px !important; - max-width: 740px !important; - width: 100% !important; +@media (min-width: 1350px) { + .DocSearch-Button { + width: 250px; + } } - @media (max-width: 768px) { .DocSearch-Button { padding: 0 8px 0px 8px !important; } } - .DocSearch-Search-Icon { color: var(--ifm-color-primary) !important; } - .DocSearch-Button-Placeholder { font-size: 14px !important; } - .DocSearch-Button-Key { box-shadow: none !important; background: transparent !important; @@ -690,137 +260,73 @@ a[class*="cardContainer"]:hover { } /*************************** Sidebar ***************************/ - @media (min-width: 1350px) { .theme-doc-sidebar-container { margin-right: 40px; } } - @media (min-width: 1024px) and (max-width: 1350px) { .theme-doc-sidebar-container { margin-right: 20px; } } - -li.sidebar-section-title>div.menu__list-item-collapsible:hover { +li.sidebar-section-title > div.menu__list-item-collapsible:hover { background-color: transparent !important; } - -li.sidebar-section-title>div.menu__list-item-collapsible { +li.sidebar-section-title > div.menu__list-item-collapsible { margin-top: 25px !important; } - -li.sidebar-section-title>div.menu__list-item-collapsible a { - font-weight: var(--ifm-font-weight-bold) !important; +li.sidebar-section-title > div.menu__list-item-collapsible a { + font-weight: 600 !important; } - .menu__link { font-size: 14px; line-height: 22px; - font-weight: var(--ifm-font-weight-normal); - color: var(--sidebar-link-color); + font-weight: 400; + color: var(--ifm-color-primary); padding: 4px; - letter-spacing: 0.01em; } - .menu__link--active { - font-weight: var(--ifm-font-weight-semibold); - color: var(--sidebar-link-active-color); -} - -/* Flexbox layout for all collapsible items */ -.menu__list-item-collapsible { - display: flex !important; - align-items: center !important; - width: 100% !important; - padding: 0 !important; -} - -/* Make links take available space */ -.menu__list-item-collapsible>.menu__link { - flex: 1 !important; - min-width: 0 !important; - padding-right: 0 !important; + font-weight: 500; + color: var(--ifm-color-primary-darkest); } - -/* Position separate caret buttons at the right - adjusted to match built-in carets */ -.menu__list-item-collapsible>.menu__caret { - margin-left: auto !important; - margin-right: 0px !important; - flex-shrink: 0 !important; - padding: 0 !important; +[data-theme="dark"] .menu__link { + color: var(--ifm-color-primary-darker); } - -/* For links with built-in caret (using ::after) */ -.menu__link--sublist-caret { - display: flex !important; - justify-content: space-between !important; - align-items: center !important; - padding-right: 4px !important; +[data-theme="dark"] .menu__link--active { + color: var(--ifm-color-primary-darkest); } - .menu__link--sublist-caret:after, .menu__caret:before { - margin-left: auto !important; + margin: 0 10px; background: var(--ifm-menu-link-sublist-icon) 50% / 1.4rem 1.4rem; height: 10px; opacity: 0.8; - flex-shrink: 0 !important; } - .menu__list { padding-right: 5px; - padding-left: 4px; } - -.menu { - padding-left: 0px !important; -} - -/* Sidebar container - always hide border */ .docSidebarContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocRoot-Layout-Sidebar-styles-module, -.docSidebarContainer_YfHR, -.theme-doc-sidebar-container, -div[class*="docSidebarContainer"] { +.docSidebarContainer_YfHR { border-right: none !important; } /**************************** Article section ****************************/ -.container>.row { +.container > .row { justify-content: space-between; } - .markdown img { margin-bottom: 24px; } - -/* Ensure IdealImage wrapper divs get bottom margin */ -.markdown div:has(img.medium-zoom-image) { - margin-bottom: 24px; -} - -/* Target IdealImage wrapper divs - they have background-size in their inline styles */ -.markdown div[style*="background-size"] { - margin-bottom: 24px !important; -} - -/* Override the negative margin on IdealImage img tags */ -.markdown img.medium-zoom-image { - margin-bottom: 0 !important; -} - .theme-doc-markdown h1:first-child, .title_node_modules-\@docusaurus-theme-classic-lib-theme-DocCategoryGeneratedIndexPage-styles-module, .title_kItE { padding-top: 40px; } - .docItemCol_node_modules-docusaurus-theme-openapi-docs-lib-theme-ApiItem-Layout-styles-module { line-height: 24px; } - -.breadcrumbs__item--active>span { +.breadcrumbs__item--active > span { padding: 3px 15px; } @@ -828,23 +334,21 @@ div[class*="docSidebarContainer"] { .col--3 { --ifm-col-width: calc(2.8 / 12 * 100%); } - @media (max-width: 995px) { - .tocCollapsibleButton_node_modules-\@docusaurus-theme-classic-lib-theme-TOCCollapsible-CollapseButton-styles-module, .tocCollapsibleButtonExpanded_MG3E { color: var(--ifm-color-primary); } } - .table-of-contents__link { font-size: 14px; line-height: 20px; - font-weight: var(--ifm-font-weight-normal); - color: var(--toc-link-color); - letter-spacing: 0.01em; + font-weight: 400; + color: var(--ifm-color-primary-light); +} +[data-theme="dark"] .table-of-contents__link { + color: var(--ifm-color-primary-dark); } - .table-of-contents__left-border { border: none !important; } @@ -853,55 +357,49 @@ div[class*="docSidebarContainer"] { [href="/reference/api/agenta-backend"], .list_node_modules-\@docusaurus-theme-classic-lib-theme-DocCategoryGeneratedIndexPage-styles-module article:first-child, .list_eTzJ article:first-child, -.generatedIndexPage_node_modules-\@docusaurus-theme-classic-lib-theme-DocCategoryGeneratedIndexPage-styles-module header p, +.generatedIndexPage_node_modules-\@docusaurus-theme-classic-lib-theme-DocCategoryGeneratedIndexPage-styles-module + header + p, .generatedIndexPage_vN6x header p { display: none; } - -.api-method>.menu__link { +.api-method > .menu__link { align-items: center; justify-content: start; } - -.api-method>.menu__link::before { +.api-method > .menu__link::before { width: 35px; height: 18px; font-size: 10px; line-height: 18px; text-transform: uppercase; font-weight: 600; - border-radius: var(--border-radius-sm); + border-radius: 0.25rem; margin-right: var(--ifm-spacing-horizontal); text-align: center; flex-shrink: 0; color: white; } - -.get>.menu__link::before { +.get > .menu__link::before { content: "get"; background-color: var(--ifm-color-primary); } - -.put>.menu__link::before { +.put > .menu__link::before { content: "put"; background-color: var(--openapi-code-blue); } - -.post>.menu__link::before { +.post > .menu__link::before { content: "post"; background-color: var(--openapi-code-green); } - -.delete>.menu__link::before { +.delete > .menu__link::before { content: "del"; background-color: var(--openapi-code-red); } - -.patch>.menu__link::before { +.patch > .menu__link::before { content: "patch"; background-color: var(--openapi-code-orange); } - .openapi__method-endpoint-path, .openapi-markdown__details-summary-header-params, .openapi-markdown__details-summary-header-body { @@ -922,7 +420,6 @@ div[class*="docSidebarContainer"] { margin-right: auto; margin-left: auto; } - .title_node_modules-\@docusaurus-theme-classic-lib-theme-BlogPostItem-Header-Title-styles-module, .title_f1Hy { margin-top: 40px; @@ -931,25 +428,20 @@ div[class*="docSidebarContainer"] { margin-right: auto; margin-left: auto; } - /* center the changelog main header and hide its date */ .changelog-main header .margin-vert--md { display: none; } - .changelog-main header h1 { text-align: center; } - .blog-post-page .col[class*="col--"] { flex: 0 !important; position: relative; } - .blog-post-page .col--2 { display: none !important; } - .blog-post-page .col { --ifm-col-width: 100% !important; flex: 0 0; @@ -960,79 +452,64 @@ div[class*="docSidebarContainer"] { margin-right: auto; margin-left: auto; } - .blog-post-page .row { display: block; } - .changelog { width: 80%; margin-left: auto; } - .changelog em { font-style: normal; - font-weight: var(--ifm-font-weight-semibold); + font-weight: 500; position: absolute; left: 15px; margin-top: -42px; - color: var(--sidebar-link-active-color); + color: var(--ifm-color-primary-darker); +} +[data-theme="dark"] .changelog em { + color: var(--ifm-color-primary-light); } - .changelog hr { margin-top: 70px; width: 97%; position: absolute; left: 50%; transform: translateX(-50%); - background-color: var(--brand-border-grey); -} - -[data-theme="dark"] .changelog hr { - background-color: var(--brand-grey-bg); + background-color: var(--ifm-color-primary-lightest); } - .changelog h3 { margin-top: 160px; } - .changelog h3:first-child { margin-top: 60px; } - @media (max-width: 995px) { - .title_node_modules-\@docusaurus-theme-classic-lib-theme-BlogPostItem-Header-Title-styles-module, .title_f1Hy { padding-left: 0px; } - .changelog { width: 100%; margin-left: auto; } - .changelog hr { margin-top: 50px; width: 96%; } - .changelog em { font-weight: 500; position: absolute; left: auto; margin-top: -100px !important; } - .changelog h3 { margin-top: 195px; } - .changelog h3:first-child { margin-top: 110px; } } - @media (max-width: 520px) { .changelog hr { margin: 50px auto 28%; @@ -1041,14 +518,12 @@ div[class*="docSidebarContainer"] { left: 0; transform: translateX(0); } - .changelog em { font-weight: 500; position: absolute; left: auto; margin-top: -105px !important; } - .changelog h3 { margin-top: 0px; height: auto; @@ -1070,16 +545,13 @@ div[class*="docSidebarContainer"] { .medium-zoom-overlay { background-color: #0000009f !important; } - [data-theme="dark"] .medium-zoom-overlay { background-color: #000000b4 !important; } - .medium-zoom-image--opened, .medium-zoom-overlay { z-index: 9999999; } - [data-theme="dark"] .medium-zoom-image--opened { border: 1px solid rgba(255, 255, 255, 0.096); } @@ -1140,90 +612,28 @@ div[class*='scrollbar'] { } [class*="cardTitle"] { - font-size: var(--ifm-heading-h4-font-size) !important; - font-weight: var(--ifm-font-weight-normal) !important; - margin-bottom: 8px; - font-variant-emoji: no-emoji !important; + font-size: var(--ifm-heading-h4-font-size) !important; + font-weight: var(--ifm-font-weight-normal) !important; + margin-bottom: 8px; + font-variant-emoji: no-emoji !important; } [class*="cardDescription"] { font-size: 14px !important; -} - +} a[class*="cardContainer"] { /* --ifm-link-color: var(--ifm-color-emphasis-100); */ /* --ifm-link-hover-color: var(--ifm-color-emphasis-100); */ --ifm-link-hover-decoration: none; box-shadow: 0 0 0 1px rgba(50, 50, 93, 0.01); - border: 1px solid var(--brand-border-grey); - border-radius: var(--border-radius-sm); + border: 1px solid var(--ifm-color-emphasis-200); + border-radius: 4px; transition: all var(--ifm-transition-fast) ease-in-out; transition-property: border, box-shadow; padding: 18px; font-variant-emoji: no-emoji !important; - position: relative; -} - -[data-theme="dark"] a[class*="cardContainer"] { - border: 1px solid var(--brand-grey-bg); -} - -/* Custom icon support for cards using CSS custom properties */ -/* Usage: */ -/* Or for no icon: */ - -/* First, hide the text content of the title that contains the emoji */ -.custom-icon [class*="cardTitle"], -.no-icon [class*="cardTitle"], -.icon-img [class*="cardTitle"] { - font-size: 0 !important; -} - -/* Then restore the text size for actual title text */ -.custom-icon [class*="cardTitle"]::after, -.no-icon [class*="cardTitle"]::after, -.icon-img [class*="cardTitle"]::after { - content: attr(title) !important; - font-size: var(--ifm-heading-h4-font-size) !important; - display: inline !important; -} - -/* Replace the default document emoji with custom icon */ -.custom-icon [class*="cardTitle"]::before { - content: var(--card-icon) !important; - font-size: 18px !important; - margin-right: 8px !important; - display: inline-block !important; - line-height: 1 !important; - flex-shrink: 0 !important; - vertical-align: text-bottom !important; - position: relative !important; - top: 2px !important; -} - -/* For no-icon cards, hide the emoji completely by not showing before pseudo */ -.no-icon [class*="cardTitle"]::before { - content: '' !important; - display: none !important; -} - -/* For SVG/image icons - replace the default emoji with background image */ -.icon-img [class*="cardTitle"]::before { - content: '' !important; - width: 18px !important; - height: 18px !important; - margin-right: 8px !important; - display: inline-block !important; - background-size: contain !important; - background-repeat: no-repeat !important; - background-position: center !important; - background-image: var(--card-icon-bg) !important; - flex-shrink: 0 !important; - vertical-align: text-bottom !important; - position: relative !important; - top: 2px !important; } @@ -1232,7 +642,7 @@ a[class*="cardContainer"] { padding: 18px !important; } -details:not([class*="openapi"]) { +details { background-color: var(--background-color) !important; border: 1px solid var(--ifm-color-emphasis-200) !important; --docusaurus-details-decoration-color: grey !important; diff --git a/docs/src/data/roadmap.ts b/docs/src/data/roadmap.ts deleted file mode 100644 index 5d4d37a7bc..0000000000 --- a/docs/src/data/roadmap.ts +++ /dev/null @@ -1,440 +0,0 @@ -export type Label = { - name: string; - color?: string; // hex without '#' -}; - -export type ShippedFeature = { - id: string; - title: string; - description?: string; - changelogPath: string; // e.g. "/changelog/2025-06-18-feature-name" - shippedAt: string; // ISO date string or any displayable date - labels?: Label[]; -}; - -export type PlannedFeature = { - id: string; - title: string; - description: string; - githubUrl: string; // issue or discussion URL - labels?: Label[]; -}; - -export const shippedFeatures: ShippedFeature[] = [ - // Playground: BCFF78 - // Observability: DE74FF - // Evaluation: 86B7FF - // Integration: FFA500 - { - id: "vertex-ai-provider-support", - title: "Vertex AI Provider Support", - description: - "Use Google Cloud's Vertex AI models including Gemini and partner models in the playground, Model Hub, and through Gateway endpoints.", - changelogPath: "/changelog/vertex-ai-provider-support", - shippedAt: "2025-10-24", - labels: [ - { - name: "Integration", - color: "FFA500", - }, - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "filtering-by-annotation", - title: "Filtering Traces by Annotation", - description: - "Filter and search for traces based on their annotations. Find traces with low scores or feedback quickly using the rebuilt filtering system.", - changelogPath: "/changelog/filtering-traces-by-annotation", - shippedAt: "2025-10-14", - labels: [ - { - name: "Observability", - color: "DE74FF", - }, - ], - }, - { - id: "evaluation-results-dashboard", - title: "New Evaluation Results Dashboard", - description: - "Completely redesigned evaluation results dashboard with performance plots, side-by-side comparison, improved testcases view, focused detail view, configuration visibility, and run naming.", - changelogPath: "/changelog/new-evaluation-results-dashboard", - shippedAt: "2025-09-26", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "deep-url-support", - title: "Deep URL Support for Sharable Links", - description: - "URLs now include workspace context, making them shareable between team members. Fixed workspace bugs with page refresh and workspace selection.", - changelogPath: "/changelog/deep-url-support-for-sharable-links", - shippedAt: "2025-09-24", - labels: [ - { - name: "Misc", - color: "000000", - }, - ], - }, - { - id: "speed-improvements-playground", - title: "Speed Improvements in the Playground", - description: - "We improved the speed of the playground (creation of prompts, navigation, etc.) especially with hundreds of revisions.", - changelogPath: "/changelog/speed-improvements-in-the-playground", - shippedAt: "2025-09-19", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "markdown-support", - title: "Markdown support ", - description: - "You can view prompt and messages in markdown both in the playground and in the observability drawer.", - changelogPath: "/changelog/major-playground-improvements-and-enhancements", - shippedAt: "2025-08-07", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - { - name: "Observability", - color: "DE74FF", - }, - ], - }, - { - id: "images-in-playground", - title: "Image Support in playground", - description: - "You can now upload images to the playground and use them in your prompts.", - changelogPath: "/changelog/support-for-images-in-playground", - shippedAt: "2025-07-29", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "llamaindex-integration", - title: "LLamaIndex Integration", - description: "You can trace your calls from LlamaIndex in one line.", - changelogPath: "/changelog/llamaindex-integration", - shippedAt: "2025-06-17", - labels: [ - { - name: "Observability", - color: "DE74FF", - }, - ], - }, - { - id: "annotate-llm-response", - title: "Endpoint to Capture User Feedback for Traces", - description: - "You can now use the annotation API to add annotations (e.g. scores, feedback) to LLM responses traced in Agenta.", - changelogPath: "/changelog/annotate-your-llm-response-preview", - shippedAt: "2025-05-15", - labels: [ - { - name: "Observability", - color: "DE74FF", - }, - ], - }, - { - id: "tool-support-playground", - title: "Tool Support in the Playground", - description: - "You can now define and test tools in the playground. You can save tool definitions as part of your prompts.", - changelogPath: "/changelog/tool-support-in-the-playground", - shippedAt: "2025-05-10", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "structured-output-playground", - title: "Structured Output Support in the Playground", - description: - "We support now structured output in the playground. You can now define and validate structured output formats and save them as part of your prompt.", - changelogPath: "/changelog/structured-output-support-in-the-playground", - shippedAt: "2025-04-15", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, -]; -export const inProgressFeatures: PlannedFeature[] = [ - { - id: "llm-judge-structured-output", - title: - "Structured Output and Multiple Outputs in LLM-as-a-Judge Evaluators", - description: - "Use structured output formats and generate multiple output fields (explanation, confidence, suggestions, issue categories) in LLM-as-a-judge evaluators.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2855", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "jinja2-playground", - title: "Jinja2 Template Support in the Playground", - description: - "Add Jinja2 template support to enable conditional logic, filters, and template blocks in prompts. The prompt type will be stored in the schema, and the SDK will handle rendering.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2856", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "pdf-support-playground", - title: "PDF Support in the Playground", - description: - "Add PDF support for models that support it (OpenAI, Gemini, etc.) through base64 encoding, URLs, or file IDs. Support extends to human evaluation for reviewing model responses on PDF inputs.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2857", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "prompt-snippets", - title: "Prompt Snippets", - description: - "Create reusable prompt snippets that can be referenced across multiple prompts. Reference specific versions or always use the latest version to maintain consistency across prompt variants.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2858", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "online-evaluation", - title: "Online Evaluation", - description: - "Adding the ability to configure evaluators (llm-as-a-judge or custom) and run them automatically on new traces.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2721", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "evaluation-sdk", - title: "Programmatic Evaluation through the SDK", - description: - "Until now evaluations were only available as managed by Agenta. We are now adding the ability to run evaluations programmatically through the SDK.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2725", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "date-range-filtering", - title: "Date Range Filtering in Metrics Dashboard", - description: - "We are adding the ability to filter traces by date range in the metrics dashboard.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2774", - labels: [ - { - name: "Observability", - color: "DE74FF", - }, - ], - }, -]; - -export const plannedFeatures: PlannedFeature[] = [ - { - id: "prompt-folders", - title: "Folders for Prompt Organization", - description: - "Create folders and subfolders to organize prompts in the playground. Move prompts between folders and search within specific folders to structure prompt libraries.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2859", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "projects-workspaces", - title: "Projects and Workspaces", - description: - "Improve organization structure by adding projects and workspaces. Create projects for different products, set up workspaces for different environments or teams, and scope resources to specific workspaces.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2860", - labels: [ - { - name: "Misc", - color: "000000", - }, - ], - }, - { - id: "ai-prompt-refinement", - title: "AI-Powered Prompt Refinement in the Playground", - description: - "Analyze prompts and suggest improvements based on best practices. Identify issues, propose refined versions, and allow users to accept, modify, or reject suggestions.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2861", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "open-spans-playground", - title: "Open Observability Spans Directly in the Playground", - description: - "Add a button in observability to open any chat span directly in the playground. Creates a stateless playground session pre-filled with the exact prompt, configuration, and inputs for immediate iteration.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2862", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - { - name: "Observability", - color: "DE74FF", - }, - ], - }, - { - id: "navigation-in-the-playground", - title: "Improving Navigation between Testsets in the Playground", - description: - "We are making it easy to use and navigate in the playground with large testsets .", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2731", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "appending-single-test-cases", - title: "Appending Single Testcases in the Playground", - description: - "Using testcases from different testsets is not possible right now in the Playground. We are adding the ability to append a single testcase to a testset.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2732", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - { - id: "test-set-view", - title: "Improving Testset View", - description: - "We are reworking the testset view to make it easier to visualize and edit testsets.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2733", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "prompt-caching-sdk", - title: "Prompt Caching in the SDK", - description: "We are adding the ability to cache prompts in the SDK.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2734", - labels: [ - { - name: "SDK", - color: "DE74FF", - }, - ], - }, - { - id: "test-set-versioning", - title: "Testset Versioning", - description: - "We are adding the ability to version testsets. This is useful for correctly comparing evaluation results.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2735", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "tagging", - title: "Tagging Traces, Testsets, Evaluations and Prompts", - description: - "We are adding the ability to tag traces, testsets, evaluations and prompts. This is useful for organizing and filtering your data.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2736", - labels: [ - { - name: "Evaluation", - color: "86B7FF", - }, - ], - }, - { - id: "tools-playground", - title: "Support for built-in LLM Tools (e.g. web search) in the Playground", - description: - "We are adding the ability to use built-in LLM tools (e.g. web search) in the playground.", - githubUrl: "https://github.com/Agenta-AI/agenta/discussions/2577", - labels: [ - { - name: "Playground", - color: "BCFF78", - }, - ], - }, - - // Example: - // { - // id: "plg-cost-dashboard", - // title: "Cost Dashboard", - // description: "Track token usage and cost across environments and models.", - // githubUrl: "https://github.com/Agenta-AI/agenta/discussions/5678", - // }, -]; diff --git a/docs/src/icons/library.tsx b/docs/src/icons/library.tsx deleted file mode 100644 index 9713461ae3..0000000000 --- a/docs/src/icons/library.tsx +++ /dev/null @@ -1,253 +0,0 @@ -import React from "react"; -import clsx from "clsx"; -import {useColorMode} from '@docusaurus/theme-common'; - -type IconComponent = React.ComponentType>; - -export type IconDescriptor = { - name: string; - library?: string; -}; - -type IconLibrary = Record; - -// Base props for stroke-based icons (light mode) -const strokeSvgProps: React.SVGProps = { - viewBox: "0 0 24 24", - fill: "none", - stroke: "currentColor", - strokeWidth: 2, - strokeLinecap: "square", - xmlns: "http://www.w3.org/2000/svg", -}; - -// Base props for filled icons (dark mode) -const filledSvgProps: React.SVGProps = { - viewBox: "0 0 24 24", - fill: "currentColor", - xmlns: "http://www.w3.org/2000/svg", -}; - -const FileTextIcon: IconComponent = (props) => { - const {colorMode} = useColorMode(); - const isDark = colorMode === 'dark'; - - return isDark ? ( - // Dark mode - filled - - - - ) : ( - // Light mode - stroke - - - - ); -}; - -const LayersIcon: IconComponent = (props) => ( - - - - - -); - -const CodeIcon: IconComponent = (props) => { - const {colorMode} = useColorMode(); - const isDark = colorMode === 'dark'; - - return isDark ? ( - // Dark mode - filled - - - - ) : ( - // Light mode - stroke - - - - ); -}; - -const BookOpenIcon: IconComponent = (props) => { - const {colorMode} = useColorMode(); - const isDark = colorMode === 'dark'; - - return isDark ? ( - // Dark mode - filled - - - - - ) : ( - // Light mode - stroke - - - - ); -}; - -const RouteIcon: IconComponent = (props) => { - const {colorMode} = useColorMode(); - const isDark = colorMode === 'dark'; - - return isDark ? ( - // Dark mode - filled - - - - ) : ( - // Light mode - stroke - - - - ); -}; - -const HistoryIcon: IconComponent = (props) => ( - - - - - -); - -const ClockIcon: IconComponent = (props) => { - const {colorMode} = useColorMode(); - const isDark = colorMode === 'dark'; - - return isDark ? ( - // Dark mode - filled - - - - ) : ( - // Light mode - stroke - - - - ); -}; - -const CookbookIcon: IconComponent = (props) => ( - - - - - - - - -); - -const SettingsIcon: IconComponent = (props) => ( - - - - -); - -const ServerIcon: IconComponent = (props) => { - const {colorMode} = useColorMode(); - const isDark = colorMode === 'dark'; - - return isDark ? ( - // Dark mode - filled - - - - - ) : ( - // Light mode - stroke - - - - - ); -}; - -const SunIcon: IconComponent = (props) => ( - - - - - - - - - - - -); - -const MoonIcon: IconComponent = (props) => ( - - - -); - -const ICON_LIBRARIES: Record = { - lucide: { - fileText: FileTextIcon, - layers: LayersIcon, - code: CodeIcon, - bookOpen: BookOpenIcon, - route: RouteIcon, - history: HistoryIcon, - clock: ClockIcon, - cookbook: CookbookIcon, - settings: SettingsIcon, - server: ServerIcon, - sun: SunIcon, - moon: MoonIcon, - }, -}; - -const DEFAULT_LIBRARY = "lucide"; -const DEFAULT_SIZE = 18; - -export type NavIconProps = IconDescriptor & { - className?: string; - size?: number; -}; - -function resolveIcon(descriptor: IconDescriptor): IconComponent | null { - const libraryName = descriptor.library ?? DEFAULT_LIBRARY; - const library = ICON_LIBRARIES[libraryName]; - - if (!library) { - return null; - } - - return library[descriptor.name] ?? null; -} - -export function NavIcon({ - className, - size = DEFAULT_SIZE, - ...descriptor -}: NavIconProps) { - const Icon = resolveIcon(descriptor); - - if (!Icon) { - return null; - } - - return ( -
+ + + + ) +} + +export default memo(EvalRunScenarioNavigator) diff --git a/web/ee/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets/index.tsx b/web/ee/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets/index.tsx new file mode 100644 index 0000000000..076eac2d36 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets/index.tsx @@ -0,0 +1,15 @@ +export const STATUS_COLOR: Record = { + success: "text-green-600", + done: "text-green-600", + failure: "text-red-500", + failed: "text-red-500", + EVALUATION_FAILED: "text-red-500", + EVALUATION_FINISHED_WITH_ERRORS: "text-orange-500", + cancelled: "text-yellow-500", + EVALUATION_AGGREGATION_FAILED: "text-orange-500", + pending: "text-gray-400", + EVALUATION_INITIALIZED: "text-gray-400", + running: "text-blue-500", + EVALUATION_STARTED: "text-blue-500", + revalidating: "text-purple-500", +} diff --git a/web/ee/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/index.tsx b/web/ee/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/index.tsx new file mode 100644 index 0000000000..5d24aa41b5 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/index.tsx @@ -0,0 +1,57 @@ +import {memo, useMemo} from "react" + +import {Tag, Typography} from "antd" +import clsx from "clsx" +import {useAtomValue} from "jotai" +import {loadable} from "jotai/utils" + +import {getStatusLabel} from "@/oss/lib/constants/statusLabels" +import {scenarioStatusFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" + +import {STATUS_COLOR} from "./assets" +/** + * Component to display the status of an evaluation scenario as a Tag. + * + * Retrieves the optimistic scenario overrides for the given scenarioId, + * and uses them to show transient UI-only states like "annotating" or + * "revalidating" if the backend has not yet been updated. + * + * @param scenarioId The ID of the scenario to display the status for. + * @returns A Tag component displaying the status of the scenario. + */ +const EvalRunScenarioStatusTag = ({ + scenarioId, + className, + showAsTag = true, +}: { + scenarioId: string + className?: string + showAsTag?: boolean +}) => { + /** + * Loadable atom wrapping scenarioStatusFamily, which provides the most + * up-to-date status for the given scenarioId. This can be either a status + * that is being optimistically updated, or the latest status update from + * the backend. + * + * @type {import("jotai/utils").Loadable} + */ + const statusLoadable = useAtomValue( + useMemo(() => loadable(scenarioStatusFamily(scenarioId)), [scenarioId]), + ) + const scenarioStatus = statusLoadable.state === "hasData" ? statusLoadable.data : undefined + const status = (scenarioStatus?.status as string) || "pending" + const label = getStatusLabel(status) + + return showAsTag ? ( + + + {label} + + + ) : ( + {label} + ) +} + +export default memo(EvalRunScenarioStatusTag) diff --git a/web/ee/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/assets/constants.ts b/web/ee/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/assets/constants.ts new file mode 100644 index 0000000000..f638a32ccb --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/assets/constants.ts @@ -0,0 +1,14 @@ +// Feature flag to toggle prototype card (list) view +export const ENABLE_CARD_VIEW = process.env.NEXT_PUBLIC_ENABLE_EVAL_CARD_VIEW === "true" + +export const VIEW_OPTIONS = (() => { + const base = [ + {label: "Focus view", value: "focus"}, + {label: "Table view", value: "table"}, + {label: "Results view", value: "results"}, + ] + if (ENABLE_CARD_VIEW) { + base.splice(1, 0, {label: "Card view", value: "list"}) + } + return base +})() diff --git a/web/ee/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/index.tsx b/web/ee/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/index.tsx new file mode 100644 index 0000000000..33bd981247 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/index.tsx @@ -0,0 +1,47 @@ +import {memo, useEffect, useTransition} from "react" + +import {Radio} from "antd" +import {useAtom, useAtomValue, useSetAtom} from "jotai" + +import {runViewTypeAtom} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" + +import {setUrlStateAtom, urlStateAtom} from "../../state/urlState" + +import {ENABLE_CARD_VIEW, VIEW_OPTIONS} from "./assets/constants" + +const EvalRunScenariosViewSelector = () => { + const [viewType, setViewType] = useAtom(runViewTypeAtom) + const [_isPending, startTransition] = useTransition() + const urlState = useAtomValue(urlStateAtom) + const setUrlState = useSetAtom(setUrlStateAtom) + + // Sync local atom from urlStateAtom changes + useEffect(() => { + if (urlState.view && urlState.view !== viewType) { + setViewType(urlState.view as "focus" | "list" | "table") + } + }, [urlState.view, viewType, setViewType]) + + return ( +
+ { + const v = e.target.value as "focus" | "list" | "table" + startTransition(() => { + setUrlState({view: v}) + }) + }} + defaultValue={"focus"} + value={ENABLE_CARD_VIEW ? viewType : viewType === "list" ? "focus" : viewType} + > + {VIEW_OPTIONS.map((option) => ( + + {option.label} + + ))} + +
+ ) +} + +export default memo(EvalRunScenariosViewSelector) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/InstructionModal/assets/InstructionButton.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/InstructionModal/assets/InstructionButton.tsx similarity index 90% rename from web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/InstructionModal/assets/InstructionButton.tsx rename to web/ee/src/components/EvalRunDetails/components/Modals/InstructionModal/assets/InstructionButton.tsx index 6b7698d0dd..614a281614 100644 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/InstructionModal/assets/InstructionButton.tsx +++ b/web/ee/src/components/EvalRunDetails/components/Modals/InstructionModal/assets/InstructionButton.tsx @@ -1,11 +1,11 @@ -import {cloneElement, isValidElement, useState} from "react" +import {cloneElement, isValidElement, memo, useState} from "react" import {Question} from "@phosphor-icons/react" import dynamic from "next/dynamic" import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" -const InstructionModal = dynamic(() => import("../index"), {ssr: false}) +const InstructionModal = dynamic(() => import(".."), {ssr: false}) const InstructionButton = ({ icon = true, diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/InstructionModal/index.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/InstructionModal/index.tsx similarity index 100% rename from web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/InstructionModal/index.tsx rename to web/ee/src/components/EvalRunDetails/components/Modals/InstructionModal/index.tsx diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalButton.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/assets/RenameEvalButton.tsx similarity index 97% rename from web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalButton.tsx rename to web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/assets/RenameEvalButton.tsx index 2db2a20630..122e47fe60 100644 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalButton.tsx +++ b/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/assets/RenameEvalButton.tsx @@ -1,11 +1,10 @@ import {cloneElement, isValidElement, memo, useState} from "react" -import {EditOutlined} from "@ant-design/icons" import dynamic from "next/dynamic" import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" - import {RenameEvalButtonProps} from "../../types" +import {EditOutlined} from "@ant-design/icons" const RenameEvalModal = dynamic(() => import(".."), {ssr: false}) @@ -13,7 +12,6 @@ const RenameEvalButton = ({ id, name, description, - runId, icon = true, children, label, @@ -49,7 +47,6 @@ const RenameEvalButton = ({ id={id} name={name} description={description} - runId={runId} open={isModalOpen} onCancel={() => setIsModalOpen(false)} /> diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalModalContent.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/assets/RenameEvalModalContent.tsx similarity index 99% rename from web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalModalContent.tsx rename to web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/assets/RenameEvalModalContent.tsx index 2b7a9b5eac..cec628e7a6 100644 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalModalContent.tsx +++ b/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/assets/RenameEvalModalContent.tsx @@ -1,5 +1,4 @@ import {Input, Typography} from "antd" - import {RenameEvalModalContentProps} from "../../types" const RenameEvalModalContent = ({ diff --git a/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/index.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/index.tsx new file mode 100644 index 0000000000..c241adada6 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/Modals/RenameEvalModal/index.tsx @@ -0,0 +1,88 @@ +import {useCallback, useMemo, useState} from "react" + +import {message} from "antd" +import {useSWRConfig} from "swr" + +import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" +import axios from "@/oss/lib/api/assets/axiosConfig" +import { + evalAtomStore, + evaluationRunStateAtom, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" + +import {RenameEvalModalProps} from "../types" + +import RenameEvalModalContent from "./assets/RenameEvalModalContent" + +const RenameEvalModal = ({id, name, description, ...props}: RenameEvalModalProps) => { + const {mutate} = useSWRConfig() + const [editName, setEditName] = useState(name) + const [editDescription, setEditDescription] = useState(description || "") + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const onAfterClose = useCallback(() => { + setEditName(name) + setEditDescription(description || "") + setError(null) + props.afterClose?.() + }, [name, description]) + + const handleSave = useCallback(async () => { + setLoading(true) + setError(null) + const state = evalAtomStore().get(evaluationRunStateAtom) + if (process.env.NODE_ENV !== "production") { + console.debug("state.rawRun", state.rawRun) + } + try { + await axios.patch(`/preview/evaluations/runs/${id}`, { + run: { + ...state.rawRun, + id, + name: editName, + description: editDescription, + }, + }) + await mutate( + (key: string) => key.includes("/preview/evaluations/runs/") || key.includes(id), + undefined, + true, + ) + + message.success("Evaluation run updated") + props.onCancel?.({} as any) + } catch (err: any) { + setError(err?.message || "Failed to update run") + } finally { + setLoading(false) + } + }, [id, editName, editDescription, mutate]) + + const isDisabled = useMemo(() => { + return editName.trim() === name.trim() && editDescription.trim() === description?.trim() + }, [editName, editDescription, name, description]) + + return ( + + + + ) +} + +export default RenameEvalModal diff --git a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/SaveDataButton.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/SaveDataButton.tsx similarity index 97% rename from web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/SaveDataButton.tsx rename to web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/SaveDataButton.tsx index d7b20242eb..23bb84d9ff 100644 --- a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/SaveDataButton.tsx +++ b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/SaveDataButton.tsx @@ -1,10 +1,9 @@ import {cloneElement, isValidElement, memo, MouseEvent, useState} from "react" -import {ArrowSquareOut, Database} from "@phosphor-icons/react" import dynamic from "next/dynamic" import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" - +import {ArrowSquareOut, Database} from "@phosphor-icons/react" import {SaveDataButtonProps} from "./types" const SaveDataModal = dynamic(() => import(".."), {ssr: false}) @@ -55,7 +54,7 @@ const SaveDataButton = ({ name={name} rows={rows} exportDataset={exportDataset} - open={isModalOpen && !!rows.length} + open={isModalOpen} onCancel={() => setIsModalOpen(false)} /> diff --git a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/SaveDataModalContent.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/SaveDataModalContent.tsx similarity index 90% rename from web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/SaveDataModalContent.tsx rename to web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/SaveDataModalContent.tsx index c3d8d8730c..cde9882b74 100644 --- a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/SaveDataModalContent.tsx +++ b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/SaveDataModalContent.tsx @@ -1,11 +1,9 @@ import {useMemo} from "react" -import {Input, Select, Typography} from "antd" - -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import useFocusInput from "@/oss/hooks/useFocusInput" +import {Input, Select, Table, Typography} from "antd" import {SaveDataModalContentProps} from "./types" +import useFocusInput from "@/oss/hooks/useFocusInput" const SaveDataModalContent = ({ rows, @@ -39,7 +37,7 @@ const SaveDataModalContent = ({
- {exportDataset ? "File name" : "Testset name"} + {exportDataset ? "File name" : "Test set name"} Preview - 3 ? 3 : rows.length)} columns={columns} size="small" bordered pagination={false} scroll={{x: "max-content"}} - virtualized />
diff --git a/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/types.d.ts b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/types.d.ts new file mode 100644 index 0000000000..ffef2ed9d5 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/assets/types.d.ts @@ -0,0 +1,33 @@ +import {ModalProps} from "antd" +import {EvaluationFlow, EvaluationScenario} from "@/oss/lib/Types" +import {TooltipButtonProps} from "@/oss/components/Playground/assets/EnhancedButton" + +export interface EvaluationRow extends EvaluationScenario, Record { + evaluationFlow: EvaluationFlow +} + +export interface SaveDataModalProps extends ModalProps { + rows: EvaluationRow[] + exportDataset?: boolean + name?: string +} + +export interface SaveDataModalContentProps { + rows: EvaluationRow[] + rowKeys: string[] + exportDataset?: boolean + name: string + setName: React.Dispatch> + isOpen: boolean + selectedColumns: string[] + setSelectedColumns: React.Dispatch> +} + +export interface SaveDataButtonProps extends TooltipButtonProps { + rows: EvaluationRow[] + exportDataset?: boolean + name?: string + icon?: boolean + children?: React.ReactNode + label?: string +} diff --git a/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/index.tsx b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/index.tsx new file mode 100644 index 0000000000..25bc0caedf --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/Modals/SaveDataModal/index.tsx @@ -0,0 +1,119 @@ +import {useCallback, useEffect, useState} from "react" +import dynamic from "next/dynamic" + +import {message} from "antd" + +import {createNewTestset} from "@/oss/services/testsets/api" + +import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" +import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" +import {SaveDataModalProps} from "./assets/types" + +const SaveDataModalContent = dynamic(() => import("./assets/SaveDataModalContent"), {ssr: false}) + +const SaveDataModal = ({rows, exportDataset = false, name, ...props}: SaveDataModalProps) => { + const [submitLoading, setSubmitLoading] = useState(false) + const [_name, setName] = useState(name || "") + const [selectedColumns, setSelectedColumns] = useState([]) + + const getKeys = useCallback(() => { + const keys = new Set() + rows.forEach((row) => { + Object.keys(row).forEach((key) => keys.add(key)) + }) + return Array.from(keys) + }, [rows]) + + useEffect(() => { + setName(name || "") + setSelectedColumns(getKeys()) + }, [rows, name]) + + const reset = useCallback(() => { + setName("") + setSelectedColumns([]) + setSubmitLoading(false) + }, []) + + const onClose = useCallback(() => { + reset() + props.onCancel?.({} as any) + }, [props]) + + const onSaveTestset = useCallback(async () => { + try { + setSubmitLoading(true) + + const filteredRows = rows.map((row) => { + const filteredRow: any = {} + Object.keys(row).forEach((key) => { + if (selectedColumns.includes(key)) { + filteredRow[key] = row[key] + } + }) + return filteredRow + }) + + await createNewTestset(_name, filteredRows) + + message.success("Testset created successfully!") + onClose() + } catch (error) { + console.error("Error creating testset:", error) + message.error("Failed to create testset. Please try again!") + } finally { + setSubmitLoading(false) + } + }, [rows, _name, selectedColumns, onClose]) + + const onExportResults = useCallback(async () => { + try { + setSubmitLoading(true) + const filteredRows = rows.map((row) => { + const filteredRow: any = {} + Object.keys(row).forEach((key) => { + if (selectedColumns.includes(key)) { + filteredRow[key] = row[key] + } + }) + return filteredRow + }) + + const csvData = convertToCsv(filteredRows, selectedColumns) + downloadCsv(csvData, _name) + message.success("Results exported successfully!") + onClose() + } catch (error) { + console.error("Error exporting results:", error) + message.error("Error exporting results") + } finally { + setSubmitLoading(false) + } + }, [rows, selectedColumns, onClose, _name]) + + return ( + + + + ) +} + +export default SaveDataModal diff --git a/web/ee/src/components/EvalRunDetails/components/Modals/types.d.ts b/web/ee/src/components/EvalRunDetails/components/Modals/types.d.ts new file mode 100644 index 0000000000..052b2b7f83 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/Modals/types.d.ts @@ -0,0 +1,29 @@ +import {ModalProps, ButtonProps} from "antd" +import React from "react" + +export interface InstructionModalProps extends ModalProps {} + +export interface RenameEvalModalProps extends ModalProps { + id: string + name: string + description?: string +} + +export interface RenameEvalModalContentProps { + loading?: boolean + error: string | null + editName: string + setEditName: React.Dispatch> + editDescription: string + setEditDescription: React.Dispatch> +} + +export interface RenameEvalButtonProps extends ButtonProps { + id: string + name: string + description?: string + icon?: boolean + children?: React.ReactNode + label?: string +} + diff --git a/web/ee/src/components/EvalRunDetails/components/RunEvalScenarioButton/index.tsx b/web/ee/src/components/EvalRunDetails/components/RunEvalScenarioButton/index.tsx new file mode 100644 index 0000000000..d852b25c4d --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/RunEvalScenarioButton/index.tsx @@ -0,0 +1,85 @@ +import {memo, useMemo, useCallback} from "react" + +import {Tooltip} from "antd" +import {useAtomValue} from "jotai" +import {loadable} from "jotai/utils" + +import {useEvalScenarioQueue} from "@/oss/lib/hooks/useEvalScenarioQueue" +import { + scenarioStatusAtomFamily, + scenarioStepFamily, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" + +import RunButton from "@agenta/oss/src/components/Playground/assets/RunButton" + +import {RunEvalScenarioButtonProps} from "./types" + +const RunEvalScenarioButton = memo( + ({scenarioId, stepKey, label = "Run Scenario"}: RunEvalScenarioButtonProps) => { + const {enqueueScenario} = useEvalScenarioQueue({concurrency: 5}) + + // derive running flag directly from per-scenario status atom + const scenarioStatus = useAtomValue( + useMemo(() => scenarioStatusAtomFamily(scenarioId), [scenarioId]), + ) as any + const isRunning = scenarioStatus?.status === "running" + + // Derive invocationParameters via scenario step loadable + const stepLoadable = useAtomValue(loadable(scenarioStepFamily(scenarioId))) + + // Extract invocation steps (if any) + const invocationSteps = + stepLoadable.state === "hasData" ? stepLoadable.data?.invocationSteps || [] : [] + + // Determine target step + const targetStep = stepKey + ? invocationSteps.find((s) => s.key === stepKey) + : invocationSteps.find((s) => s.invocationParameters) + + const autoStepKey = targetStep?.key + const invocationParameters = targetStep?.invocationParameters + const invocationStepStatus = targetStep?.status + + const handleClick = useCallback(() => { + if (invocationParameters) { + enqueueScenario(scenarioId, autoStepKey) + } + }, [enqueueScenario, scenarioId, autoStepKey, invocationParameters]) + + const button = useMemo( + () => ( + + ), + [handleClick, isRunning, invocationStepStatus, invocationParameters, label], + ) + + return ( +
+ {invocationParameters ? ( + + {JSON.stringify(invocationParameters, null, 2)} +
+ } + > + {button} + + ) : ( + button + )} + + ) + }, +) + +export default RunEvalScenarioButton diff --git a/web/ee/src/components/EvalRunDetails/components/RunEvalScenarioButton/types.ts b/web/ee/src/components/EvalRunDetails/components/RunEvalScenarioButton/types.ts new file mode 100644 index 0000000000..068130ab68 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/RunEvalScenarioButton/types.ts @@ -0,0 +1,5 @@ +export interface RunEvalScenarioButtonProps { + scenarioId: string + label?: string + stepKey?: string +} diff --git a/web/ee/src/components/EvalRunDetails/components/ScenarioAnnotationPanel/index.tsx b/web/ee/src/components/EvalRunDetails/components/ScenarioAnnotationPanel/index.tsx new file mode 100644 index 0000000000..e85a9bdab0 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/ScenarioAnnotationPanel/index.tsx @@ -0,0 +1,265 @@ +import {FC, memo, useCallback, useMemo, useRef, useState} from "react" + +import {Card, Typography} from "antd" +import clsx from "clsx" +import deepEqual from "fast-deep-equal" +import {useAtomValue} from "jotai" +import {selectAtom, loadable} from "jotai/utils" +import dynamic from "next/dynamic" + +import { + getInitialMetricsFromAnnotations, + getInitialSelectedEvalMetrics, +} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" +import {UpdatedMetricsType} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/types" +import {isAnnotationCreatedByCurrentUser} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/utils" +import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" +import { + evaluationEvaluatorsAtom, + scenarioStepFamily, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" +import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" +import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" + +import AnnotateScenarioButton from "../AnnotateScenarioButton" +import RunEvalScenarioButton from "../RunEvalScenarioButton" + +import {ScenarioAnnotationPanelProps} from "./types" + +const Annotate = dynamic( + () => import("@agenta/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/Annotate"), + {ssr: false}, +) + +const EmptyArray: any[] = [] + +const ScenarioAnnotationPanelAnnotation = memo( + ({ + onAnnotate, + runId, + scenarioId, + buttonClassName, + invStep, + annotationsByStep, + evaluators, + }: ScenarioAnnotationPanelProps) => { + const [errorMessages, setErrorMessages] = useState(EmptyArray as string[]) + + // TODO: move this to a shared utils file + const formatErrorMessages = useCallback((requiredMetrics: Record) => { + const errorMessages: string[] = [] + + for (const [key, data] of Object.entries(requiredMetrics || {})) { + errorMessages.push( + `Value ${data?.value === "" ? "empty string" : data?.value} is not assignable to type ${data?.type} in ${key}`, + ) + } + setErrorMessages(errorMessages) + }, []) + + const [updatedMetrics, setUpdatedMetrics] = useState({}) + + // helper to compute per-step annotation & evaluator lists + const buildAnnotateData = useCallback( + (stepKey: string) => { + const _steps = annotationsByStep[stepKey] || [] + const _annotations = _steps + .map((s) => s.annotation) + .filter(Boolean) as AnnotationDto[] + const annotationEvaluatorSlugs = _annotations + .map((annotation) => annotation?.references?.evaluator?.slug) + .filter(Boolean) + + return { + annotations: _annotations, + evaluatorSlugs: evaluators + .map((e) => e.slug) + .filter((slug) => !annotationEvaluatorSlugs.includes(slug)), + evaluators: evaluators.filter( + (e) => !annotationEvaluatorSlugs.includes(e.slug), + ), + } + }, + [annotationsByStep, evaluators], + ) + + const {_annotations, isAnnotated, isCreatedByCurrentUser, selectedEvaluators} = + useMemo(() => { + const annotateData = buildAnnotateData(invStep.key) + + const _annotations = annotateData.annotations + const selectedEvaluators = annotateData.evaluatorSlugs + + const isAnnotated = _annotations.length > 0 + const isCreatedByCurrentUser = _annotations.length + ? _annotations.some((ann) => isAnnotationCreatedByCurrentUser(ann)) + : true + + return { + isAnnotated, + isCreatedByCurrentUser, + selectedEvaluators, + _annotations, + } + }, [invStep.key, buildAnnotateData, evaluators]) + + const isChangedMetricData = useMemo(() => { + const annotateData = buildAnnotateData(invStep.key) + + const initialAnnotationMetrics = getInitialMetricsFromAnnotations({ + annotations: annotateData.annotations, + evaluators, + }) + const annotationSlugs = annotateData.annotations + .map((ann) => ann.references?.evaluator?.slug) + .filter(Boolean) + + // Filter updatedMetrics to only include user existing annotations + const filteredUpdatedMetrics = Object.fromEntries( + Object.entries(updatedMetrics).filter(([slug]) => annotationSlugs.includes(slug)), + ) + return deepEqual(filteredUpdatedMetrics, initialAnnotationMetrics) + }, [updatedMetrics, evaluators, invStep.key]) + + const isChangedSelectedEvalMetrics = useMemo(() => { + const annotateData = buildAnnotateData(invStep.key) + const selectedEvaluators = annotateData.evaluatorSlugs + + const initialSelectedEvalMetrics = getInitialSelectedEvalMetrics({ + evaluators: annotateData.evaluators, + selectedEvaluators, + }) + + const filteredUpdatedMetrics = Object.fromEntries( + Object.entries(updatedMetrics).filter(([slug]) => + selectedEvaluators.includes(slug), + ), + ) + + return deepEqual(filteredUpdatedMetrics, initialSelectedEvalMetrics) + }, [updatedMetrics, updatedMetrics, evaluators, invStep.key]) + + return ( +
+ + +
+ ) + }, +) + +const ScenarioAnnotationPanel: FC = ({ + runId, + scenarioId, + className, + classNames, + buttonClassName, + onAnnotate, +}) => { + const evaluatorsSelector = useCallback((atom: EvaluatorDto[]) => { + return atom.map((evaluator) => evaluator) + }, []) + + const evaluatorsAtom = useMemo( + () => selectAtom(evaluationEvaluatorsAtom, evaluatorsSelector, deepEqual), + [evaluatorsSelector], + ) + const evaluators = useAtomValue(evaluatorsAtom) + + // Loadable step data for this scenario (always eager) + const stepDataLoadable = useAtomValue(loadable(scenarioStepFamily(scenarioId))) + + // Preserve last known data so we can still show tool-tips / fields while revalidating + const prevDataRef = useRef(undefined) + + let stepData: UseEvaluationRunScenarioStepsFetcherResult | undefined = undefined + if (stepDataLoadable.state === "hasData") { + stepData = stepDataLoadable.data + prevDataRef.current = stepDataLoadable.data + } else if (stepDataLoadable.state === "loading") { + stepData = prevDataRef.current + } + + // Memoize field slices for best performance (multi-step) + const _invocationSteps = useMemo(() => stepData?.invocationSteps ?? [], [stepData]) + // Build annotations per step key + const annotationsByStep = useMemo(() => { + if (!stepData) return {} + + type AnnStep = (typeof stepData.steps)[number] + const map: Record = {} + if (!stepData?.steps || !_invocationSteps.length) return map + + // Pre-compute all annotation steps once (annotation step = has invocation key prefix) + const allAnnSteps = (stepData.steps || []).filter((s) => + _invocationSteps.some((invStep) => (s.key ?? "").startsWith(`${invStep.key}.`)), + ) + _invocationSteps.forEach(({key}) => { + const anns = allAnnSteps.filter((s) => (s.key ?? "").startsWith(`${key}.`)) + map[key] = anns + }) + return map + }, [stepData?.steps, _invocationSteps]) + + const hasAnyTrace = useMemo(() => _invocationSteps.some((s) => s.traceId), [_invocationSteps]) + + return ( + +
+ {_invocationSteps.map((invStep) => { + return ( + + ) + })} +
+ {!hasAnyTrace ? ( +
+ To annotate, please generate output + +
+ ) : null} +
+ ) +} + +export default ScenarioAnnotationPanel diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioAnnotationPanel/types.ts b/web/ee/src/components/EvalRunDetails/components/ScenarioAnnotationPanel/types.ts similarity index 100% rename from web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioAnnotationPanel/types.ts rename to web/ee/src/components/EvalRunDetails/components/ScenarioAnnotationPanel/types.ts diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioLoadingIndicator/ScenarioLoadingIndicator.tsx b/web/ee/src/components/EvalRunDetails/components/ScenarioLoadingIndicator/ScenarioLoadingIndicator.tsx similarity index 75% rename from web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioLoadingIndicator/ScenarioLoadingIndicator.tsx rename to web/ee/src/components/EvalRunDetails/components/ScenarioLoadingIndicator/ScenarioLoadingIndicator.tsx index 395d7e4fee..0f99ebb336 100644 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioLoadingIndicator/ScenarioLoadingIndicator.tsx +++ b/web/ee/src/components/EvalRunDetails/components/ScenarioLoadingIndicator/ScenarioLoadingIndicator.tsx @@ -3,12 +3,12 @@ import {memo} from "react" import {Progress} from "antd" import {useAtomValue} from "jotai" -import {scenarioStepProgressFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" +import {scenarioStepProgressAtom} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" import {conicColors} from "./assets/constants" -const ScenarioLoadingIndicator = ({runId}: {runId: string}) => { - const scenarioStepProgress = useAtomValue(scenarioStepProgressFamily(runId)) +const ScenarioLoadingIndicator = () => { + const scenarioStepProgress = useAtomValue(scenarioStepProgressAtom) return scenarioStepProgress.loadingStep === "scenario-steps" ? ( { + // Reset global evaluationRunState when runId changes to prevent stale scenarios leakage + const scenariosLoadable = useAtomValue(loadable(evaluationScenariosDisplayAtom)) + const scenarioIds = useAtomValue(displayedScenarioIds) + const scenarioStepProgress = useAtomValue(scenarioStepProgressAtom) + + // Access URL state atom + const router = useRouter() + const urlState = useAtomValue(urlStateAtom) + const setUrlState = useSetAtom(setUrlStateAtom) + + // Prefer URL query first, then atom, then fallback + const activeId = + (router.query.scenarioId as string | undefined) ?? urlState.scenarioId ?? scenarioIds[0] + + // Ensure URL/atom always reference a scenario visible in current list + // Ensure URL/atom correctness + useEffect(() => { + if (scenarioIds.length === 0) return + + const currentScenarioId = + (router.query.scenarioId as string | undefined) ?? urlState.scenarioId + + if (!currentScenarioId || !scenarioIds.includes(currentScenarioId)) { + // Default to the first scenario for this run when no valid selection/deep-link. + setUrlState({scenarioId: scenarioIds[0]}) + return + } + }, [scenarioIds, router.query.scenarioId, urlState.scenarioId, setUrlState]) + + if (scenariosLoadable.state !== "hasData") { + const step = scenarioStepProgress.loadingStep as string | undefined + if (step === "eval-run" || step === "scenarios") { + return ( + + + + ) +} + +export default memo(ActionCell) diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents.tsx new file mode 100644 index 0000000000..652466fcb9 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents.tsx @@ -0,0 +1,314 @@ +import {forwardRef, HTMLProps, memo, useCallback, useMemo, useState} from "react" + +import {ArrowsIn, ArrowsOut} from "@phosphor-icons/react" +import {Skeleton} from "antd" +import clsx from "clsx" +import deepEqual from "fast-deep-equal" +import {atom, useAtom, useAtomValue} from "jotai" +import {atomFamily, loadable, selectAtom} from "jotai/utils" +import dynamic from "next/dynamic" + +import TooltipButton from "@/oss/components/Playground/assets/EnhancedButton" +import useResizeObserver from "@/oss/hooks/useResizeObserver" +import {resolvePath} from "@/oss/lib/helpers/traceUtils" +import { + loadableScenarioStepFamily, + scenarioStepFamily, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" +import {useInvocationResult} from "@/oss/lib/hooks/useInvocationResult" + +import {renderChatMessages} from "../../common/renderChatMessages" + +const SharedEditor = dynamic(() => import("@/oss/components/Playground/Components/SharedEditor"), { + ssr: false, + loading: () =>
, +}) +const GenerationResultUtils = dynamic( + () => + import( + "@agenta/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils" + ), + {ssr: false, loading: (props) =>
}, +) + +// Global jotai store that keeps the expanded/collapsed state for each individual cell. +// The key must be STABLE between mounts (e.g. scenarioId + stepKey + path) so that when +// a row is unmounted/remounted by react-window, the UI preserves its previous state. +export const expandedCellStateAtom = atom>({}) +interface ExpandableProps { + /** + * Stable identifier for the cell. If omitted, the component falls back to local state. + */ + expandKey?: string + className?: string + children: React.ReactNode +} + +export const Expandable = forwardRef( + ({children, className, expandKey, ...props}: ExpandableProps, forwardedRef) => { + // Local overflow calculation is still component-local because it depends on DOM size. + const [hasOverflow, setHasOverflow] = useState(false) + + // Global or local expanded state depending on expandKey presence + const [expandedMap, setExpandedMap] = useAtom(expandedCellStateAtom) + const expandedLocalState = useState(false) + const expanded = expandKey ? (expandedMap[expandKey] ?? false) : expandedLocalState[0] + const setExpanded = useCallback( + (value: boolean | ((prev: boolean) => boolean)) => { + if (expandKey) { + setExpandedMap((prev) => { + const nextVal = + typeof value === "function" ? value(prev[expandKey] ?? false) : value + return {...prev, [expandKey]: nextVal} + }) + } else { + // @ts-expect-error – tuple type + expandedLocalState[1](value) + } + }, + [expandKey, setExpandedMap, expandedLocalState], + ) + + const ref = useResizeObserver( + useCallback((rect, element) => { + setHasOverflow((prev) => { + const next = + element.scrollHeight > rect.height || + (element.children && element.children?.[0]?.offsetHeight > rect.height) + if (next !== prev) { + return next + } + + return prev + }) + }, []), + ) + + const toggleExpanded = useCallback( + (e: React.MouseEvent) => { + e.preventDefault() + e.stopPropagation() + setExpanded((prev: boolean) => !prev) + }, + [setExpanded], + ) + + return ( +
+ {/* Content container */} +
+ {children} +
+ {/* Gradient overlay to hint overflow */} + {/* {hasOverflow && !expanded && ( +
+ )} */} + {(hasOverflow || expanded) && ( + + ) : ( + + ) + } + tooltipProps={{title: expanded ? "Collapse" : "Expand"}} + /> + )} +
+ ) + }, +) + +export const CellWrapper = memo(({children, className}: HTMLProps) => { + return ( +
+ {children} +
+ ) +}) + +export const InputCell = memo( + ({scenarioId, inputKey, stepKey}: {scenarioId: string; inputKey: string; stepKey?: string}) => { + const stepLoadable = useAtomValue(loadable(scenarioStepFamily(scenarioId))) + if (stepLoadable.state !== "hasData" || !stepLoadable.data) + return ( + + + + ) + const enrichedArr = stepLoadable.data?.inputSteps ?? [] + let targetStep = stepKey ? enrichedArr.find((s) => s.key === stepKey) : undefined + if (!targetStep) targetStep = stepLoadable.data?.inputStep ?? enrichedArr[0] + let val: any + if (targetStep && (targetStep as any).inputs) { + const inputs = (targetStep as any).inputs ?? {} + const groundTruth = (targetStep as any).groundTruth ?? {} + // Merge like InvocationInputs: groundTruth first, then inputs override duplicates + const merged = {...groundTruth, ...inputs} + const path = inputKey.startsWith("data.") ? inputKey.slice(5) : inputKey + val = resolvePath(merged, path) + } + + // Use shared util for complex chat messages, otherwise primitive display + let isChat = false + let reactNodes: React.ReactNode[] | undefined + if (typeof val === "string") { + try { + const parsed = JSON.parse(val) + isChat = + Array.isArray(parsed) && parsed.every((m: any) => "role" in m && "content" in m) + } catch { + /* ignore */ + } + } + if (isChat) { + reactNodes = renderChatMessages(`${scenarioId}-${inputKey}`, val as string) + } + + return ( + + + {reactNodes ? ( +
{reactNodes}
+ ) : val != null && val !== "" ? ( + {}} + initialValue={String(val)} + editorType="borderless" + placeholder="Click the 'Run' icon to get variant output" + disabled + editorClassName="!text-xs" + editorProps={{enableResize: true}} + /> + ) : ( + N/A + )} +
+
+ ) + }, +) + +// Dynamic invocation result cell for run-index driven columns +export const InvocationResultCellSkeleton = memo(() => { + return ( + + ) +}) + +export const InvocationResultCell = memo( + ({ + scenarioId, + stepKey, + path, + isSkeleton, + }: { + isSkeleton: boolean + scenarioId: string + stepKey: string + path: string + }) => { + const {trace, value, messageNodes} = useInvocationResult({scenarioId, stepKey}) + + return ( + + {isSkeleton ? ( + <> +
+
+ + ) : messageNodes ? ( + +
{messageNodes}
+
+ ) : ( + +
+ {}} + initialValue={value} + editorProps={{ + codeOnly: !!value && typeof value !== "string", + }} + editorType="borderless" + disabled + editorClassName="!text-xs" + error={!!trace?.exception} + /> +
+
+ )} + {trace ? ( + + ) : ( +
+ )} + + ) + }, +) + +export const SkeletonCell = () => { + return ( + + + + ) +} diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedAnnotationValueCell.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedAnnotationValueCell.tsx new file mode 100644 index 0000000000..e90178a797 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedAnnotationValueCell.tsx @@ -0,0 +1,108 @@ +import {memo, useMemo} from "react" + +import deepEqual from "fast-deep-equal" +import {useAtomValue} from "jotai" +import {atomFamily, selectAtom} from "jotai/utils" + +import LabelValuePill from "@/oss/components/ui/LabelValuePill" +import {loadableScenarioStepFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/scenarios" + +import {CellWrapper} from "../CellComponents" + +import {CollapsedAnnotationValueCellProps} from "./types" + +// function deepGet(obj: any, path: string): any { +// if (!obj || typeof obj !== "object") return undefined +// return path.split(".").reduce((acc: any, key: string) => (acc ? acc[key] : undefined), obj) +// } + +function buildCollapsedValues(data: any, keys: string[]) { + const annotations: any[] = [] + + if (Array.isArray(data?.annotationSteps) && data.annotationSteps.length) { + annotations.push(...data.annotationSteps.map((st: any) => st.annotation).filter(Boolean)) + } + if (data?.annotations?.length) { + annotations.push(...data.annotations) + } + if (data?.annotation) { + annotations.push(data.annotation) + } + + // Deduplicate by span_id+trace_id to avoid duplicates if same ann appears in multiple arrays + const unique = new Map() + annotations.forEach((ann) => { + if (!ann) return + const key = `${ann.trace_id || ""}_${ann.span_id || Math.random()}` + if (!unique.has(key)) unique.set(key, ann) + }) + + const out: Record = {} + keys.forEach((fieldPath) => { + for (const ann of unique.values()) { + let val = fieldPath + .split(".") + .reduce((acc: any, k: string) => (acc ? acc[k] : undefined), ann) + + if (val === undefined && fieldPath.startsWith("data.outputs.")) { + const suffix = fieldPath.slice("data.outputs.".length) + val = ann?.data?.outputs?.metrics?.[suffix] ?? ann?.data?.outputs?.extra?.[suffix] + } + if (val !== undefined) { + out[fieldPath] = val + break // stop at first found value + } + } + }) + return out +} + +export const collapsedAnnotationValuesFamily = atomFamily( + ({scenarioId, keys}: {scenarioId: string; keys: string[]}) => + selectAtom( + loadableScenarioStepFamily(scenarioId), + (loadableData) => + buildCollapsedValues( + loadableData.state === "hasData" ? loadableData.data : undefined, + keys, + ), + deepEqual, + ), +) + +const CollapsedAnnotationValueCell = memo( + ({scenarioId, childrenDefs}) => { + const keyPaths = useMemo( + () => childrenDefs.map((c) => c.path || c.dataIndex || c.key) as string[], + [childrenDefs], + ) + const familyParam = useMemo(() => ({scenarioId, keys: keyPaths}), [scenarioId, keyPaths]) + + const out = useAtomValue(collapsedAnnotationValuesFamily(familyParam)) + + if (!Object.keys(out).length) { + return ( + + + + ) + } + + return ( + +
+ {Object.entries(out).map(([name, val]) => ( + + ))} +
+
+ ) + }, +) + +export default CollapsedAnnotationValueCell diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricValueCell.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricValueCell.tsx new file mode 100644 index 0000000000..b4b06a899b --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricValueCell.tsx @@ -0,0 +1,70 @@ +import {memo} from "react" + +import {useAtomValue} from "jotai" + +import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" +import LabelValuePill from "@/oss/components/ui/LabelValuePill" +import {scenarioMetricMapFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache" + +import {CellWrapper} from "../CellComponents" + +export interface CollapsedMetricValueCellProps { + scenarioId: string + evaluatorSlug?: string // undefined → include all evaluators +} + +const CollapsedMetricValueCell = memo( + ({scenarioId, evaluatorSlug}) => { + const rowMetrics = useAtomValue(scenarioMetricMapFamily(scenarioId)) || {} + + const filtered: Record = {} + Object.entries(rowMetrics).forEach(([k, v]) => { + if (evaluatorSlug) { + if (k.startsWith(`${evaluatorSlug}.`)) { + filtered[k.slice(evaluatorSlug.length + 1)] = v + } + } else { + if (!k.includes(".")) { + filtered[k] = v + } + } + }) + + if (!Object.keys(filtered).length) { + return ( + + + + ) + } + + const grouped: Record> = {} + Object.entries(filtered).forEach(([k, v]) => { + const [slug, metricName] = evaluatorSlug ? ["", k] : k.split(".", 2) + const keySlug = evaluatorSlug || slug || "unknown" + if (!grouped[keySlug]) grouped[keySlug] = {} + grouped[keySlug][metricName || k] = v + }) + + return ( + +
+ {Object.entries(grouped).map(([slug, metrics], idx) => ( + <> + {Object.entries(metrics).map(([name, val]) => ( + + ))} + + ))} +
+
+ ) + }, +) + +export default CollapsedMetricValueCell diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricsCell.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricsCell.tsx similarity index 81% rename from web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricsCell.tsx rename to web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricsCell.tsx index ceb5dd2df9..4fed7146e0 100644 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricsCell.tsx +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricsCell.tsx @@ -2,7 +2,8 @@ import {memo} from "react" import {useAtomValue} from "jotai" -import {scenarioMetricsMapFamily} from "../../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" +import {scenarioMetricMapFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache" + import {CellWrapper} from "../CellComponents" export interface CollapsedMetricsCellProps { @@ -11,7 +12,7 @@ export interface CollapsedMetricsCellProps { } const CollapsedMetricsCell = memo(({scenarioId, evaluatorSlug}) => { - const rowMetrics = useAtomValue(scenarioMetricsMapFamily(scenarioId)) || {} + const rowMetrics = useAtomValue(scenarioMetricMapFamily(scenarioId)) || {} const filtered: Record = {} Object.entries(rowMetrics).forEach(([k, v]) => { diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/MetricCell.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/MetricCell.tsx new file mode 100644 index 0000000000..b12042c299 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/MetricCell.tsx @@ -0,0 +1,195 @@ +import {memo, useMemo} from "react" +// import {useMemo} from "react" + +import {Tag} from "antd" +import {useAtomValue} from "jotai" + +import MetricDetailsPopover from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover" // adjust path if necessary +import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" // same util used elsewhere +import {metricDataFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache" + +import {CellWrapper, Expandable} from "../CellComponents" // CellWrapper is default export? need to check. + +import {AnnotationValueCellProps, MetricCellProps, MetricValueCellProps} from "./types" + +/* + * MetricCell – common renderer for metric columns (scenario-level or evaluator-level). + * Props: + * - metricKey: base metric name (without evaluator slug) + * - fullKey: full metric path as used in maps (e.g. "evaluator.slug.score") + * - value: value for current scenario row + * - distInfo: pre-computed distribution / stats for popover (optional) + * - metricType: primitive type from evaluator schema ("number", "boolean", "array", etc.) + */ + +const MetricCell = memo( + ({hidePrimitiveTable = true, scenarioId, metricKey, fullKey, value, distInfo, metricType}) => { + if (value === undefined || value === null) { + return ( + + N/A + + ) + } + + // Non-numeric arrays rendered as Tag list + let formatted: React.ReactNode = formatMetricValue(metricKey, value) + + if (metricType === "boolean" && Array.isArray(value as any)) { + const trueEntry = (distInfo as any).frequency.find((f: any) => f.value === true) + const total = (distInfo as any).count ?? 0 + if (total) { + return ( +
+
+
+
+ true + false +
+
+
+
+
+
+
+
+
+
+ {(((trueEntry?.count ?? 0) / total) * 100).toFixed(2)} +
+
+ ) + } + } + + if (metricType === "array" || Array.isArray(value)) { + const values = Array.isArray(value) ? value : [value] + // const Component = metricType === "string" ? "span" : Tag + formatted = + metricType === "string" ? ( +
+ {values.map((it: any) => ( +
  • + {String(it)} +
  • + ))} +
    + ) : ( +
    + {values.map((it: any) => ( + + {String(it)} + + ))} +
    + ) + } else if (typeof value === "object") { + // Extract primitive when wrapped in an object (e.g. { score, value, ... }) + if ("score" in value) value = (value as any).score + else { + const prim = Object.values(value).find( + (v) => typeof v === "number" || typeof v === "string", + ) + value = prim !== undefined ? prim : JSON.stringify(value) + } + } + + // Boolean metrics – show raw value + if (metricType === "boolean") { + formatted = String(value) + } + + // Wrap in popover when distInfo present + if (distInfo && metricType !== "string") { + return ( + + + + {formatted} + + + + ) + } + + return ( + + + {formatted} + + + ) + }, +) + +// --- Wrapper cell that fetches the value from atoms ---------------------- + +export const MetricValueCell = memo( + ({scenarioId, metricKey, fullKey, metricType}) => { + const param = useMemo(() => ({scenarioId, metricKey}), [scenarioId, metricKey]) + const {value, distInfo} = useAtomValue(metricDataFamily(param as any)) + + return ( + + ) + }, +) + +// --- Annotation value cell ----------------------------------------------- + +export const AnnotationValueCell = memo( + ({ + scenarioId, + stepKey, + name, + fieldPath, + metricKey, + metricType, + fullKey, + distInfo: propsDistInfo, + }) => { + const stepSlug = stepKey?.includes(".") ? stepKey.split(".")[1] : undefined + const param = useMemo( + () => ({scenarioId, stepSlug, metricKey: metricKey || ""}), + [scenarioId, stepSlug, metricKey], + ) + const {value: metricVal, distInfo} = useAtomValue(metricDataFamily(param)) + + return ( + + ) + }, +) + +export default MetricCell diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/types.ts b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/types.ts new file mode 100644 index 0000000000..2c7ca423d1 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/types.ts @@ -0,0 +1,32 @@ +export interface MetricCellProps { + scenarioId: string + metricKey: string + fullKey?: string + value: any + distInfo?: any + metricType?: string +} + +export interface MetricValueCellProps { + scenarioId: string + metricKey: string + fullKey?: string + distInfo?: any + metricType?: string +} + +export interface AnnotationValueCellProps { + scenarioId: string + fieldPath: string // e.g. "data.outputs.isGood" + metricKey: string + fullKey?: string + distInfo?: any + metricType?: string + stepKey?: string + name?: string +} + +export interface CollapsedAnnotationValueCellProps { + scenarioId: string + childrenDefs: any[] +} diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/StatusCell.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/StatusCell.tsx new file mode 100644 index 0000000000..da186176e9 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/StatusCell.tsx @@ -0,0 +1,24 @@ +import {memo} from "react" + +import EvalRunScenarioStatusTag from "../../EvalRunScenarioStatusTag" + +import {CellWrapper} from "./CellComponents" + +interface Props { + scenarioId: string + result?: string +} + +/** + * Lightweight status cell for Scenario rows. + * Displays coloured status tag and optional result snippet. + */ +const StatusCell = ({scenarioId}: Props) => { + return ( + + + + ) +} + +export default memo(StatusCell) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/VirtualizedScenarioTableAnnotateDrawer.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/VirtualizedScenarioTableAnnotateDrawer.tsx similarity index 86% rename from web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/VirtualizedScenarioTableAnnotateDrawer.tsx rename to web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/VirtualizedScenarioTableAnnotateDrawer.tsx index caac5fb614..4408418def 100644 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/VirtualizedScenarioTableAnnotateDrawer.tsx +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/VirtualizedScenarioTableAnnotateDrawer.tsx @@ -2,30 +2,26 @@ import {memo, useCallback} from "react" import {DrawerProps} from "antd" import clsx from "clsx" -import {getDefaultStore, useAtomValue} from "jotai" +import {useAtomValue} from "jotai" import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer" import {virtualScenarioTableAnnotateDrawerAtom} from "@/oss/lib/atoms/virtualTable" +import {evalAtomStore} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import ScenarioAnnotationPanel from "../../../HumanEvalRun/components/ScenarioAnnotationPanel" +import ScenarioAnnotationPanel from "../../ScenarioAnnotationPanel" interface VirtualizedScenarioTableAnnotateDrawerProps extends DrawerProps { runId?: string } const VirtualizedScenarioTableAnnotateDrawer = ({ - runId: propRunId, + runId, ...props }: VirtualizedScenarioTableAnnotateDrawerProps) => { - const store = getDefaultStore() - // Annotate drawer state (global, per-run) const annotateDrawer = useAtomValue(virtualScenarioTableAnnotateDrawerAtom) - const setAnnotateDrawer = store.set + const setAnnotateDrawer = evalAtomStore().set const scenarioId = annotateDrawer.scenarioId - // Use runId from atom state if available, fallback to prop - const runId = annotateDrawer.runId || propRunId - const closeDrawer = useCallback(() => { setAnnotateDrawer( virtualScenarioTableAnnotateDrawerAtom, diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants.ts b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants.ts new file mode 100644 index 0000000000..c6eeb0c31c --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants.ts @@ -0,0 +1,61 @@ +// Centralized column widths for easy reuse +export const COLUMN_WIDTHS = { + input: 400, + groundTruth: 460, + response: 400, + action: 140, + metric: 100, + padding: 100, +} as const + +// Table layout constants +export const TABLE_LAYOUT = { + rowHeight: 54, // approximate height of one table row (px) +} as const + +export const SKELETON_ROW_COUNT = 5 + +export const GeneralMetricColumns = [ + { + name: "totalCost", + kind: "metric", + path: "totalCost", + stepKey: "metric", + metricType: "number", + }, + { + name: "Total Duration", + kind: "metric", + path: "duration.total", + stepKey: "metric", + metricType: "number", + }, + { + name: "totalTokens", + kind: "metric", + path: "totalTokens", + stepKey: "metric", + metricType: "number", + }, + { + name: "promptTokens", + kind: "metric", + path: "promptTokens", + stepKey: "metric", + metricType: "number", + }, + { + name: "completionTokens", + kind: "metric", + path: "completionTokens", + stepKey: "metric", + metricType: "number", + }, + { + name: "errors", + kind: "metric", + path: "errors", + stepKey: "metric", + metricType: "number", + }, +] diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/dataSourceBuilder.ts b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/dataSourceBuilder.ts new file mode 100644 index 0000000000..e5ee10f390 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/dataSourceBuilder.ts @@ -0,0 +1,115 @@ +import groupBy from "lodash/groupBy" + +import type { + RunIndex, + ColumnDef, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" +import {buildSkeletonRows} from "@/oss/lib/tableUtils" +import {EvaluationStatus} from "@/oss/lib/Types" + +import {TableRow} from "../types" + +import {GeneralMetricColumns} from "./constants" + +/** + * Build the data source (rows) for the virtualised scenario table. + * This logic was previously inline inside the table component; moving it here means + * the component can stay tidy while we have a single canonical place that knows: + * • which scenarios belong to the run + * • what their execution / annotation status is + * • how to present skeleton rows while data is still loading + */ + +export function buildScenarioTableRows({ + scenarioIds, + /** map scenarioId -> {status: EvaluationStatus; result?: any} */ + allScenariosLoaded, + skeletonCount = 20, +}: { + scenarioIds: string[] + // statusMap: Record + allScenariosLoaded: boolean + skeletonCount?: number +}): TableRow[] { + if (!allScenariosLoaded) { + // Render placeholder skeleton rows (fixed count) so the table height is stable + return buildSkeletonRows(skeletonCount).map((r, idx) => ({ + ...r, + scenarioIndex: idx + 1, + })) + } + + return scenarioIds.map((id, idx) => { + return { + key: id, + scenarioIndex: idx + 1, + } + }) +} + +/** + * Build raw ColumnDef list for scenario table. + */ +export function buildScenarioTableData({ + runIndex, + metricsFromEvaluators, +}: { + runIndex: RunIndex | null | undefined + metricsFromEvaluators: Record> +}): (ColumnDef & {values?: Record})[] { + const baseColumnDefs: ColumnDef[] = runIndex ? Object.values(runIndex.columnsByStep).flat() : [] + + // Augment columns with per-scenario values (currently only for input columns) + let columnsInput = baseColumnDefs.filter((col) => col.kind !== "annotation") + + // Further group metrics by evaluator when evaluators info present + const evaluatorMetricGroups: any[] = [] + + // Evaluator Metric Columns + if (metricsFromEvaluators) { + const annotationData = baseColumnDefs.filter((def) => def.kind === "annotation") + const groupedAnnotationData = groupBy(annotationData, (data) => { + return data.name.split(".")[0] + }) + + for (const [k, v] of Object.entries(groupedAnnotationData)) { + evaluatorMetricGroups.push({ + title: k, + key: `metrics_${k}`, + children: v.map((data) => { + const [evaluatorSlug, metricName] = data.name.split(".") + return { + ...data, + name: metricName, + kind: "metric", + path: data.name, + stepKey: "metric", + metricType: metricsFromEvaluators[evaluatorSlug].find( + (x) => metricName in x, + )[metricName]?.metricType, + } + }), + }) + } + } + + const genericMetricsGroup = { + title: "Metrics", + key: "__metrics_group__", + children: GeneralMetricColumns, + } + + const metaStart: ColumnDef[] = [ + {name: "#", kind: "meta" as any, path: "scenarioIndex", stepKey: "meta"}, + {name: "Status", kind: "meta" as any, path: "status", stepKey: "meta"}, + ] + const metaEnd: ColumnDef[] = [ + {name: "Action", kind: "meta" as any, path: "action", stepKey: "meta"}, + ] + + const columnsCore = [...columnsInput, ...evaluatorMetricGroups] + if (genericMetricsGroup) columnsCore.push(genericMetricsGroup as any) + const columns = [...metaStart, ...columnsCore, ...metaEnd] + + return columns +} diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder.ts b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder.ts new file mode 100644 index 0000000000..b18e0297e5 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder.ts @@ -0,0 +1,375 @@ +import React from "react" + +import {readInvocationResponse} from "@/oss/lib/helpers/traceUtils" +import { + evalAtomStore, + loadableScenarioStepFamily, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" +import type { + RunIndex, + ColumnDef, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" +import {EvaluationStatus} from "@/oss/lib/Types" + +import type {TableRow} from "../types" + +import ActionCell from "./ActionCell" +import {CellWrapper} from "./CellComponents" +import {COLUMN_WIDTHS} from "./constants" +import StatusCell from "./StatusCell" +/** + * Convert input/metric/etc key parts to a flat column key we can feed to AntD's dataIndex. + */ +function makeColKey(kind: string, key: string): string { + return `${kind}.${key}` +} + +// ---------------- Helpers ------------------ +export const titleCase = (str: string) => + String(str || "") + .replace(/([a-z0-9])([A-Z])/g, "$1 $2") + .replace(/_/g, " ") + .replace(/\s+/g, " ") + .trim() + .replace(/^[a-z]|\s[a-z]/g, (m) => m.toUpperCase()) + +// --------------------- Main Builder --------------------- + +export interface BuildFlatArgs { + scenarioIds: string[] + statusMap: Record + allScenariosLoaded: boolean + runIndex: RunIndex | null | undefined + evaluators: any[] + metricValuesMap: Record> + skeletonCount?: number +} + +/** + * Build a *flat* data source where each row already contains every cell value. + * Columns are generated alongside with minimal metadata. + */ +// -------------------------------------------------- +// Ant Design column helper for flat data rows +// -------------------------------------------------- + +type ExtendedColumnDef = Omit & {kind: string; path: string} + +export function buildFlatAntdColumns(columns: ExtendedColumnDef[]): any[] { + const metricCols: ExtendedColumnDef[] = [] + const _annotationGroups: Record = {} + const normalCols: ExtendedColumnDef[] = [] + for (const c of columns) { + // Skip generic "outputs" invocation placeholder; keep default-guid columns + if (c.kind === "invocation" && c.name === "outputs") { + continue + } + if (c.kind === "invocation" && /^default-[a-f0-9]+$/i.test(c.name)) { + const renamed: ExtendedColumnDef = {...c, name: "outputs", key: c.key} + normalCols.push(renamed) + continue + } + if (c.kind === "metric") metricCols.push(c) + else if (c.kind === "annotation") { + const m = c.key.match(/^annotation\.([^.]+)\.(.+)$/) + if (m) { + const [, evaluator, metricName] = m + const childDef: ExtendedColumnDef = {...c, name: metricName} + ;(_annotationGroups[evaluator] ||= []).push(childDef) + } else { + ;(_annotationGroups[c.name] ||= []).push(c) + } + } else { + normalCols.push(c) + } + } + const toAnt = (c: ExtendedColumnDef): any => { + const common: any = { + title: + c.kind === "input" + ? `Input [${c.name}]` + : c.kind === "invocation" + ? titleCase(c.name) + : c.kind === "metric" + ? c.name + : c.kind === "annotation" + ? titleCase(c.name) + : c.name, + key: c.key, + dataIndex: c.key, + width: + c.kind === "meta" + ? 80 + : c.kind === "input" + ? COLUMN_WIDTHS.input + : c.kind === "metric" || c.kind === "annotation" + ? COLUMN_WIDTHS.metric + : c.kind === "invocation" + ? COLUMN_WIDTHS.response + : 120, + } + if (c.kind === "meta") { + switch (c.path) { + case "scenarioIndex": + return { + ...common, + fixed: "left", + width: 50, + render: (_: any, record: any) => + React.createElement(CellWrapper, null, record.scenarioIndex), + } + case "status": + return { + ...common, + width: 100, + render: (_: any, record: any) => + React.createElement(StatusCell, { + scenarioId: record.key as string, + result: record.result, + }), + } + case "action": + return { + ...common, + fixed: "right", + width: 120, + render: (_: any, record: any) => + React.createElement(ActionCell, {scenarioId: record.key}), + } + default: + return common + } + } + if (c.kind === "invocation") { + return { + ...common, + render: (_: any, record: any) => { + const cell = record[c.key] + const val = cell && typeof cell === "object" ? cell.value : cell + const content = + val != null && val !== "" + ? String(val) + : React.createElement("i", null, "N/A") + return React.createElement(CellWrapper, {className: "text-wrap"}, content) + }, + } + } + if (c.kind === "metric") { + return { + ...common, + sorter: (a: any, b: any) => { + const v1 = a[c.key] + const v2 = b[c.key] + const n1 = Number(v1) + const n2 = Number(v2) + if (!isNaN(n1) && !isNaN(n2)) return n1 - n2 + return String(v1).localeCompare(String(v2)) + }, + } + } + return common + } + + // Separate action column if present so we can always push it to the very end + const actionIndex = normalCols.findIndex((c) => c.key === "meta.action") + const actionColDef = actionIndex >= 0 ? normalCols.splice(actionIndex, 1)[0] : undefined + + const antInitial = normalCols.map(toAnt) + + // Build annotation groups per evaluator + const antAnnotationGroups = Object.entries(_annotationGroups).map(([evaluator, cols]) => ({ + title: evaluator, + key: `annotation-${evaluator}`, + children: cols.map(toAnt), + })) + + // Build metric group if any + const antMetricGroup = metricCols.length + ? { + title: "Metrics", + key: "metrics-group", + children: metricCols.map(toAnt), + } + : null + + // Combine in correct display order: annotations (rank 4) before metrics (rank 5) + let antColumnsOrdered = [...antInitial, ...antAnnotationGroups] + if (antMetricGroup) antColumnsOrdered.push(antMetricGroup) + + if (actionColDef) { + antColumnsOrdered.push(toAnt(actionColDef)) + } + + return antColumnsOrdered +} + +export function buildFlatScenarioTableData({ + scenarioIds, + statusMap, + allScenariosLoaded, + runIndex, + evaluators = [], + metricValuesMap = {}, + skeletonCount = 20, +}: BuildFlatArgs): {rows: TableRow[]; columns: ColumnDef[]} { + // 1. Fast-path skeleton rows until data is ready + if (!allScenariosLoaded) { + const rows: TableRow[] = Array.from({length: skeletonCount}, (_, idx) => ({ + key: `skeleton-${idx}`, + scenarioIndex: idx + 1, + isSkeleton: true, + })) + return {rows, columns: []} + } + + const rows: TableRow[] = [] + const columnSet = new Set() // Collect dynamic column keys + + const store = evalAtomStore() + + scenarioIds.forEach((scenarioId, idx) => { + const row: any = { + key: scenarioId, + scenarioIndex: idx + 1, + } + columnSet.add("meta.scenarioIndex") + columnSet.add("meta.action") + + // ---- Status / result meta ---- + const st = statusMap[scenarioId] + const uiStatus = (st as any)?.uiStatus as string | undefined + row.status = uiStatus ?? st?.status ?? "pending" + columnSet.add("meta.status") + if (st?.result !== undefined) { + const r = typeof st.result === "string" ? st.result : JSON.stringify(st.result) + row.result = r.length > 120 ? `${r.slice(0, 117)}…` : r + columnSet.add("meta.result") + } + + // Override status using step data to detect INCOMPLETE after invocation success but annotation pending + // INCOMPLETE: at least one invocation success and at least one annotation not success + // SUCCESS: all annotations success + + const deriveStatusFromSteps = (data: any, current: string): string => { + if (!data) return current + const invArr: any[] = data.invocationSteps || [] + const annArr: any[] = data.annotationSteps || [] + if (invArr.length === 0) return current + const allInvOk = invArr.every((s) => s.status === "success") + if (!allInvOk) return current + if (annArr.length === 0) return current + const allAnnOk = annArr.every((s) => s.status === "success") + if (allAnnOk) return "success" + const anyAnnPending = annArr.some((s) => + ["pending", "running", "queued"].includes(s.status), + ) + if (anyAnnPending) return "incomplete" + return current + } + + // ---- Step data ---- + const stepLoadable = store.get(loadableScenarioStepFamily(scenarioId)) + const stepData = stepLoadable.state === "hasData" ? stepLoadable.data : undefined + row.status = deriveStatusFromSteps(stepData, row.status) + if (stepData) { + // Inputs + stepData.inputSteps?.forEach((step: any) => { + Object.entries(step.inputs || {}).forEach(([k, v]: [string, any]) => { + const colKey = makeColKey("input", k) + row[colKey] = v + columnSet.add(colKey) + }) + }) + + // Invocation outputs + stepData.invocationSteps?.forEach((inv: any) => { + const {value, trace} = readInvocationResponse({ + scenarioData: stepData, + stepKey: inv.key, + }) + const colKey = makeColKey("invocation", inv.key) + row[colKey] = {value, trace} + columnSet.add(colKey) + }) + + // Annotation values (flatten first available annotation) + const ann = + stepData.annotation || (stepData.annotations ? stepData.annotations[0] : undefined) + if (ann) { + const flatten = (obj: any, prefix = "") => { + Object.entries(obj).forEach(([k, v]) => { + const p = prefix ? `${prefix}.${k}` : k + if (v && typeof v === "object" && !Array.isArray(v)) { + flatten(v, p) + } else { + const colKey = makeColKey("annotation", p) + row[colKey] = v + columnSet.add(colKey) + } + }) + } + flatten(ann) + } + } + + // ---- Metrics ---- + const metricVals = metricValuesMap[scenarioId] || {} + const collectMetric = (obj: any, prefix = "") => { + Object.entries(obj).forEach(([k, v]) => { + const p = prefix ? `${prefix}.${k}` : k + if (v && typeof v === "object" && !Array.isArray(v)) { + collectMetric(v, p) + } else { + const kind = p.includes(".") ? "evaluator" : "metric" + const colKey = makeColKey(kind, p) + row[colKey] = v + columnSet.add(colKey) + } + }) + } + collectMetric(metricVals) + + rows.push(row) + }) + + // Add columns from runIndex even if no data yet (e.g., evaluator annotation metrics) + if (runIndex) { + Object.values(runIndex.columnsByStep) + .flat() + .forEach((c) => { + const inferredKey = makeColKey(c.kind, c.name) + columnSet.add(inferredKey) + }) + } + + // ------------- Build ColumnDef list ------------- + const makeDef = (key: string): ColumnDef => { + const [kind, rest] = key.split(".", 2) + return { + key, + name: rest, + kind: kind as any, + path: rest, + stepKey: rest, // not strictly right but unused in flat mode + } + } + const orderRank = (def: ColumnDef): number => { + if (def.key === "meta.scenarioIndex") return 0 + if (def.key === "meta.status") return 1 + if (def.kind === "input") return 2 + if (def.kind === "invocation") return 3 + if (def.kind === "annotation") return 4 + if (def.kind === "metric") return 5 + return 6 + } + + const columns: ColumnDef[] = Array.from(columnSet) + .map(makeDef) + .sort((a, b) => { + const r = orderRank(a) - orderRank(b) + if (r !== 0) return r + return a.name.localeCompare(b.name) + }) + + return {rows, columns} +} diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/utils.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/utils.tsx new file mode 100644 index 0000000000..7495470a5a --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/utils.tsx @@ -0,0 +1,296 @@ +import {DownOutlined, RightOutlined} from "@ant-design/icons" +import {ColumnsType} from "antd/es/table" + +import {evalAtomStore} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" +import { + scenarioMetricValueFamily, + metricDataFamily, + runMetricsStatsAtom, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache" +import {buildMetricSorter} from "@/oss/lib/metricSorter" +import {extractPrimitive, isSortableMetricType, maxChildWidth} from "@/oss/lib/metricUtils" + +import type {TableRow} from "../types" + +import ActionCell from "./ActionCell" +import { + InputCell, + InvocationResultCell, + SkeletonCell, + CellWrapper, + InvocationResultCellSkeleton, +} from "./CellComponents" +import {COLUMN_WIDTHS} from "./constants" +import {titleCase} from "./flatDataSourceBuilder" +/* SKELETON_ROW_COUNT reserved for future dynamic skeleton sizing */ +import CollapsedAnnotationValueCell from "./MetricCell/CollapsedAnnotationValueCell" +import CollapsedMetricValueCell from "./MetricCell/CollapsedMetricValueCell" +import {MetricValueCell, AnnotationValueCell} from "./MetricCell/MetricCell" +import StatusCell from "./StatusCell" + +// Helper to compare metric/annotation primitives across scenarios +function scenarioMetricPrimitive(recordKey: string, column: any) { + const st = evalAtomStore() + let raw: any = column.values?.[recordKey] + if (raw === undefined) { + if (column.kind === "metric") { + raw = st.get(scenarioMetricValueFamily({scenarioId: recordKey, metricKey: column.path})) + } else { + const stepSlug = + column.stepKey && column.stepKey.includes(".") + ? column.stepKey.split(".")[1] + : undefined + raw = st.get( + metricDataFamily({ + scenarioId: recordKey, + stepSlug, + metricKey: column.name || "", + }) as any, + )?.value + } + } + return extractPrimitive(raw) +} + +function scenarioMetricSorter(column: any) { + return buildMetricSorter((row) => scenarioMetricPrimitive(row.key as string, column)) +} + +// Local table types & components + +/** + * Transforms a list of scenario metrics into a map of scenarioId -> metrics, merging + * nested metrics under `outputs` into the same level. + * + * @param {{scenarioMetrics: any[]}} props - The props object containing the metrics. + * @returns {Record>} - A map of scenarioId -> metrics. + */ +export const getScenarioMetricsMap = ({scenarioMetrics}: {scenarioMetrics: any[]}) => { + const map: Record> = {} + const _metrics = scenarioMetrics || [] + + _metrics.forEach((m: any) => { + const sid = m.scenarioId + if (!sid) return + + // Clone the data object to avoid accidental mutations + const data: Record = + m && typeof m === "object" && m.data && typeof m.data === "object" ? {...m.data} : {} + + // If metrics are nested under `outputs`, merge them into the same level + if (data.outputs && typeof data.outputs === "object") { + Object.assign(data, data.outputs) + delete data.outputs + } + + if (!map[sid]) map[sid] = {} + Object.assign(map[sid], data) + }) + + return map +} + +// ---------------- Column adapter ------------------ + +export function buildAntdColumns( + cols: any[], + // _distMap: Record, + collapsed: Record, + toggle: (k: string) => void, +): ColumnsType { + const distMap = evalAtomStore().get(runMetricsStatsAtom) + return cols.map((c: any) => { + if (c.children) { + // drop empty wrapper groups + if ((!c.title && !c.name) || c.kind === "metrics_group") { + return buildAntdColumns(c.children, distMap, collapsed, toggle) + } + if (c.key === "__metrics_group__" || c.key?.startsWith("metrics_")) { + const isCollapsed = collapsed[c.key] + return { + fixed: "left", + title: ( + { + e.stopPropagation() + toggle(c.key) + }} + > + {isCollapsed ? : }{" "} + {c.key === "__metrics_group__" ? "Metrics" : titleCase(c.title ?? "")} + + ), + key: c.key, + ...(isCollapsed + ? { + // Render single cell with aggregated values when collapsed + ...(() => { + const childMax = maxChildWidth(c.children || [], distMap, 160) + return {width: childMax, minWidth: childMax} + })(), + render: (_: any, record: TableRow) => { + const hasAnnotation = + Array.isArray(c.children) && + c.children.some((ch: any) => ch.kind === "annotation") + const evaluatorSlug = + c.key === "__metrics_group__" + ? undefined + : c.name || c.key.replace(/^metrics_/, "") + if (hasAnnotation) { + return ( + + ) + } + return ( + + ) + }, + } + : { + children: buildAntdColumns(c.children, distMap, collapsed, toggle), + }), + } + } + return { + title: titleCase(c.title ?? c.name), + key: c.key ?? c.name, + children: buildAntdColumns(c.children, distMap, collapsed, toggle), + } + } + const common = { + metricType: c.metricType ?? c.kind, + title: + c.kind === "input" + ? `Input [${titleCase(c.name)}]` + : c.kind === "invocation" + ? titleCase(c.name) + : c.kind === "metric" || c.kind === "annotation" + ? titleCase(c.name) + : titleCase(c.title ?? c.name), + key: c.key ?? c.name, + minWidth: + c.kind === "meta" + ? 80 + : c.kind === "input" + ? COLUMN_WIDTHS.input + : c.kind === "metric" + ? COLUMN_WIDTHS.metric + : c.kind === "annotation" + ? COLUMN_WIDTHS.metric + : c.kind === "invocation" + ? COLUMN_WIDTHS.response + : 20, + width: + c.kind === "meta" + ? 80 + : c.kind === "input" + ? COLUMN_WIDTHS.input + : c.kind === "metric" + ? COLUMN_WIDTHS.metric + : c.kind === "annotation" + ? COLUMN_WIDTHS.metric + : c.kind === "invocation" + ? COLUMN_WIDTHS.response + : 20, + } + if (c.kind === "meta") { + switch (c.path) { + case "scenarioIndex": + return { + ...common, + fixed: "left", + width: 50, + minWidth: 50, + render: (_: any, record: TableRow) => ( + {record.scenarioIndex} + ), + } + case "status": + return { + ...common, + width: 100, + minWidth: 100, + render: (_: any, record: TableRow) => ( + + ), + } + case "action": + return { + ...common, + fixed: "right", + width: 120, + minWidth: 120, + render: (_: any, record: TableRow) => ( + + ), + } + default: + return {...common, dataIndex: c.path} + } + } + + const sortable = + (c.kind === "metric" || c.kind === "annotation") && isSortableMetricType(c.metricType) + + const sorter = sortable ? scenarioMetricSorter(c) : undefined + + return { + ...common, + sorter, + render: (_unused: any, record: TableRow) => { + // if (record.isSkeleton) return + switch (c.kind) { + case "input": + return ( + + ) + case "invocation": + return ( + + ) + case "annotation": + return ( + + ) + case "metric": + return ( + + ) + default: + return record.isSkeleton ? : (c.values?.[record.key] ?? "") + } + }, + } + }) as ColumnsType +} diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource.ts b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource.ts new file mode 100644 index 0000000000..b8f124fd67 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource.ts @@ -0,0 +1,180 @@ +import {useCallback, useMemo, useState} from "react" + +import deepEqual from "fast-deep-equal" +import {atom, useAtomValue} from "jotai" +import {selectAtom} from "jotai/utils" +import groupBy from "lodash/groupBy" + +import { + displayedScenarioIds, + evaluationEvaluatorsAtom, + evaluationRunStateAtom, + runIndexAtom, +} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" +import {ColumnDef} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" + +import {buildScenarioTableData, buildScenarioTableRows} from "../assets/dataSourceBuilder" +import {buildAntdColumns} from "../assets/utils" + +const EMPTY_SCENARIOS: any[] = [] + +export const allScenariosLoadedAtom = atom( + (get) => + (get(evaluationRunStateAtom).scenarios || EMPTY_SCENARIOS).map((s: any) => s.id)?.length > + 0, +) + +const metricsFromEvaluatorsAtom = selectAtom( + evaluationEvaluatorsAtom, + (evs) => { + return groupBy( + evs.reduce((acc, ev) => { + return [ + ...acc, + ...Object.entries(ev.metrics).map(([metricName, metricInfo]) => { + return { + [metricName]: { + metricType: metricInfo.type, + }, + evaluatorSlug: ev.slug, + } + }), + ] + }, []), + (def) => { + return def.evaluatorSlug + }, + ) + }, + deepEqual, +) + +const useTableDataSource = () => { + const [collapsedGroups, setCollapsedGroups] = useState>({}) + const toggleGroup = useCallback( + (key: string) => setCollapsedGroups((prev) => ({...prev, [key]: !prev[key]})), + [], + ) + + const scenarioIds = useAtomValue(displayedScenarioIds) || EMPTY_SCENARIOS + const allScenariosLoaded = useAtomValue(allScenariosLoadedAtom) + + const [columnWidths, setColumnWidths] = useState>({}) + + // const metricDistributions = useAtomValue(runMetricsStatsAtom) + const runIndex = useAtomValue(runIndexAtom) + const metricsFromEvaluators = useAtomValue(metricsFromEvaluatorsAtom) || EMPTY_SCENARIOS + + // console.log("statusMap?", statusMap) + const rows = useMemo(() => { + return buildScenarioTableRows({ + scenarioIds, + allScenariosLoaded, + }) + }, [scenarioIds, allScenariosLoaded]) + // New alternative data source built via shared helper + const builtColumns: ColumnDef[] = useMemo( + () => + buildScenarioTableData({ + runIndex, + metricsFromEvaluators, + }), + [runIndex, metricsFromEvaluators], + ) + + // Handle column resize updates + const handleResize = useCallback( + (colKey: string) => + (_: any, {size}: {size: {width: number}}) => { + setColumnWidths((widths) => ({...widths, [colKey]: size.width})) + }, + [], + ) + + const makeColumnsResizable = useCallback( + (cols: any): any => { + return cols.map((col: any) => { + const colKey = + col.key || col.dataIndex || col.title || Math.random().toString(36).slice(2) + + // If this column has children, treat it as a pure group header: keep all original + // props (title, fixed, etc.) and recurse into children. We intentionally avoid + // attaching resize handlers to the header cell itself so that the resize handles + // appear only on the leaf columns. + if (Array.isArray(col.children) && col.children.length) { + return { + ...col, + key: colKey, + width: columnWidths[colKey] || col.width || 240, + // minWidth: col.minWidth || 120, + onHeaderCell: () => ({ + width: columnWidths[colKey] || col.width || 240, + minWidth: col.minWidth ?? 120, + style: {textAlign: "center"}, + }), + // Preserve explicit width if author supplied one, otherwise let AntD auto size + // width: col.width, + children: makeColumnsResizable(col.children), + } + } + + // Leaf columns – optional auto-width handling + if (col.autoWidth) { + return { + ...col, + key: colKey, + // width: columnWidths[colKey] ?? col.width, + width: columnWidths[colKey] || Math.max(col.width || 160, 80), + onHeaderCell: () => ({ + width: columnWidths[colKey] || Math.max(col.width ?? 160, 80), + minWidth: 80, + onResize: handleResize(colKey), + }), + } + } + + return { + ...col, + key: colKey, + width: columnWidths[colKey] ?? col.width ?? 160, + onHeaderCell: () => ({ + width: columnWidths[colKey] ?? col.width ?? 160, + minWidth: col.minWidth ?? 80, + onResize: handleResize(colKey), + }), + } + }) + }, + [columnWidths, handleResize], + ) + + // Build Ant Design columns and make them resizable + const antColumns = useMemo(() => { + const base = buildAntdColumns( + builtColumns, + // metricDistributions, + collapsedGroups, + toggleGroup, + ) + return makeColumnsResizable(base) + }, [makeColumnsResizable, builtColumns, collapsedGroups, toggleGroup]) + + const totalColumnWidth = useMemo(() => { + const calc = (cols: any[]): number => + cols.reduce((sum, col) => { + if (col.children && col.children.length) { + return sum + calc(col.children) + } + return sum + (columnWidths[col.key] ?? col.width ?? col.minWidth ?? 100) + }, 0) + return calc(antColumns) + }, [antColumns, columnWidths]) + + return { + antColumns, + rows, + totalColumnWidth, + } +} + +export default useTableDataSource diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/index.tsx b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/index.tsx new file mode 100644 index 0000000000..447326b0c0 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/index.tsx @@ -0,0 +1,75 @@ +import {memo, RefObject, useRef} from "react" + +import {Table} from "antd" +import {useAtomValue} from "jotai" +import dynamic from "next/dynamic" +import {useResizeObserver} from "usehooks-ts" + +import "react-resizable/css/styles.css" +import "@/oss/assets/custom-resize-handle.css" + +import {evaluationRunIdAtom} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" + +import ResizableTitle from "@agenta/oss/src/components/ResizableTitle" + +/* SKELETON_ROW_COUNT reserved for future dynamic skeleton sizing */ +import useTableDataSource from "./hooks/useTableDataSource" + +const VirtualizedScenarioTableAnnotateDrawer = dynamic( + () => import("./assets/VirtualizedScenarioTableAnnotateDrawer"), + {ssr: false}, +) + +const VirtualizedScenarioTable = () => { + // Data sources + const runId = useAtomValue(evaluationRunIdAtom) + const tableContainerRef = useRef(null) + + // Measure container height only; horizontal scroll is derived from column widths + const {height: scrollY} = useResizeObserver({ + ref: tableContainerRef as RefObject, + box: "border-box", + }) + + const {antColumns, rows, totalColumnWidth} = useTableDataSource() + + return ( +
    +
    +
    + {scrollY ? ( + record.key} + components={{ + header: { + cell: ResizableTitle, + }, + }} + pagination={false} + scroll={{ + y: + scrollY - + (tableContainerRef.current?.querySelector(".ant-table-thead") + ?.offsetHeight || 0), + x: totalColumnWidth, + }} + size="small" + sticky + virtual + bordered + tableLayout="fixed" + /> + ) : null} + + + + + + ) +} + +export default memo(VirtualizedScenarioTable) diff --git a/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/types.ts b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/types.ts new file mode 100644 index 0000000000..baa9fc8fa2 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/VirtualizedScenarioTable/types.ts @@ -0,0 +1,10 @@ +export interface TableRow { + key: string // scenarioId + scenarioIndex: number + status?: string + result?: string + /** + * For skeleton rows shown while data is loading. + */ + isSkeleton?: boolean +} diff --git a/web/ee/src/components/EvalRunDetails/components/common/renderChatMessages.tsx b/web/ee/src/components/EvalRunDetails/components/common/renderChatMessages.tsx new file mode 100644 index 0000000000..49e1e6d1ce --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/components/common/renderChatMessages.tsx @@ -0,0 +1,67 @@ +import {ReactNode} from "react" + +import ImagePreview from "@/oss/components/Common/ImagePreview" +import SimpleDropdownSelect from "@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect" +import SharedEditor from "@/oss/components/Playground/Components/SharedEditor" + +/** + * Renders an array of chat messages (OpenAI format) as readonly SharedEditor blocks. + * Returns an array of
    nodes so callers can embed them directly in their JSX. + */ +export function renderChatMessages(keyPrefix: string, rawJson: string): ReactNode[] { + let messages: {role: string; content: any}[] = [] + try { + messages = JSON.parse(rawJson) + if (!Array.isArray(messages)) + return [{String(rawJson)}] + } catch { + return [{String(rawJson)}] + } + + return messages.map((msg, i) => { + const textContent = Array.isArray(msg.content) + ? msg.content.find((content) => content.type === "text")?.text + : msg.content + const images = Array.isArray(msg.content) + ? msg.content.filter((content) => content.type === "image_url") + : [] + return ( +
    + + {}} + disabled + /> + + } + initialValue={textContent} + editorClassName="!text-xs" + disabled + footer={ +
    + {images.map((imageContent: any, index: number) => ( + + ))} +
    + } + /> +
    + ) + }) +} diff --git a/web/ee/src/components/EvalRunDetails/index.tsx b/web/ee/src/components/EvalRunDetails/index.tsx new file mode 100644 index 0000000000..ade9697699 --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/index.tsx @@ -0,0 +1,52 @@ +import {memo} from "react" + +import {useAtomValue} from "jotai" +import dynamic from "next/dynamic" + +import {runViewTypeAtom} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" + +import {EvalRunProps} from "./assets/types" +import EvalRunBatchActions from "./components/EvalRunBatchActions" +import EvalRunName from "./components/EvalRunName" +import EvalRunScenarioCards from "./components/EvalRunScenarioCards/EvalRunScenarioCards" +import EvalRunScenarioFilters from "./components/EvalRunScenarioFilters" +import EvalRunScenariosViewSelector from "./components/EvalRunScenariosViewSelector" +import SingleScenarioViewer from "./components/SingleScenarioViewer" +import VirtualizedScenarioTable from "./components/VirtualizedScenarioTable" +import UrlSync from "./UrlSync" + +const EvalResultsView = dynamic(() => import("./components/EvalResultsView"), {ssr: false}) + +const EvalRunDetails = ({name, description, id}: EvalRunProps) => { + const viewType = useAtomValue(runViewTypeAtom) + return ( +
    + +
    +
    + + +
    +
    + +
    + + +
    + +
    + {viewType === "focus" ? ( + + ) : viewType === "table" ? ( + + ) : viewType === "results" ? ( + + ) : ( + + )} +
    +
    + ) +} + +export default memo(EvalRunDetails) diff --git a/web/ee/src/components/EvalRunDetails/state/urlState.ts b/web/ee/src/components/EvalRunDetails/state/urlState.ts new file mode 100644 index 0000000000..8d35e8b77c --- /dev/null +++ b/web/ee/src/components/EvalRunDetails/state/urlState.ts @@ -0,0 +1,14 @@ +import {atom} from "jotai" + +export interface EvalRunUrlState { + view?: "list" | "table" | "focus" + scenarioId?: string +} + +// Holds the subset of query params we care about for EvalRunDetails page +export const urlStateAtom = atom({}) + +// Write-only helper: merge partial state +export const setUrlStateAtom = atom(null, (get, set, update: Partial) => { + set(urlStateAtom, {...get(urlStateAtom), ...update}) +}) diff --git a/web/ee/src/components/EvaluationTable/ABTestingEvaluationTable.tsx b/web/ee/src/components/EvaluationTable/ABTestingEvaluationTable.tsx new file mode 100644 index 0000000000..02cd28256c --- /dev/null +++ b/web/ee/src/components/EvaluationTable/ABTestingEvaluationTable.tsx @@ -0,0 +1,625 @@ +// @ts-nocheck +import {useState, useEffect, useCallback, useMemo} from "react" + +import SecondaryButton from "@agenta/oss/src/components/SecondaryButton/SecondaryButton" +import { + Button, + Card, + Col, + Input, + Radio, + Row, + Space, + Statistic, + Table, + Typography, + message, +} from "antd" +import type {ColumnType} from "antd/es/table" +import debounce from "lodash/debounce" +import {useRouter} from "next/router" + +import {useAppsData} from "@/oss/contexts/app.context" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {EvaluationFlow} from "@/oss/lib/enums" +import {exportABTestingEvaluationData} from "@/oss/lib/helpers/evaluate" +import {isBaseResponse, isFuncResponse} from "@/oss/lib/helpers/playgroundResp" +import {testsetRowToChatMessages} from "@/oss/lib/helpers/testset" +import { + EvaluationTypeLabels, + batchExecute, + camelToSnake, + getStringOrJson, +} from "@/oss/lib/helpers/utils" +import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" +import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" +import type {BaseResponse, EvaluationScenario, KeyValuePair, Variant} from "@/oss/lib/Types" +import {callVariant} from "@/oss/services/api" +import {updateEvaluationScenario, updateEvaluation} from "@/oss/services/human-evaluations/api" +import {useEvaluationResults} from "@/oss/services/human-evaluations/hooks/useEvaluationResults" + +import EvaluationCardView from "../Evaluations/EvaluationCardView" +import {VARIANT_COLORS} from "../Evaluations/EvaluationCardView/assets/styles" +import EvaluationVotePanel from "../Evaluations/EvaluationCardView/EvaluationVotePanel" +import VariantAlphabet from "../Evaluations/EvaluationCardView/VariantAlphabet" + +import {useABTestingEvaluationTableStyles} from "./assets/styles" +import ParamsFormWithRun from "./components/ParamsFormWithRun" +import type {ABTestingEvaluationTableProps, ABTestingEvaluationTableRow} from "./types" + +const {Title} = Typography + +/** + * + * @param evaluation - Evaluation object + * @param evaluationScenarios - Evaluation rows + * @param columnsCount - Number of variants to compare face to face (per default 2) + * @returns + */ +const ABTestingEvaluationTable: React.FC = ({ + evaluation, + evaluationScenarios, + isLoading, +}) => { + const classes = useABTestingEvaluationTableStyles() + const router = useRouter() + const appId = router.query.app_id as string + const evalVariants = [...evaluation.variants] + const {currentApp} = useAppsData() + + const {data, isLoading: isVariantsLoading} = useVariants(currentApp)( + { + appId: appId, + }, + evalVariants, + ) + + // Select the correct variant revisions for this evaluation + const variantData = useMemo(() => { + const allVariantData = data?.variants || [] + if (!allVariantData.length) return [] + + return evaluation.variants.map((evVariant, idx) => { + const revisionId = evaluation.variant_revision_ids?.[idx] + const revisionNumber = evaluation.revisions?.[idx] + + // 1. Try to find by exact revision id + let selected = allVariantData.find((v) => v.id === revisionId) + + // 2. Try by variantId & revision number + if (!selected && revisionNumber !== undefined) { + selected = allVariantData.find( + (v) => v.variantId === evVariant.variantId && v.revision === revisionNumber, + ) + } + + // 3. Fallback – latest revision for that variant + if (!selected) { + selected = allVariantData.find( + (v) => v.variantId === evVariant.variantId && v.isLatestRevision, + ) + } + + return selected || evVariant + }) + }, [data?.variants, evaluation.variants, evaluation.variant_revision_ids, evaluation.revisions]) + + const [rows, setRows] = useState([]) + const [, setEvaluationStatus] = useState(evaluation.status) + const [viewMode, setViewMode] = useQueryParam("viewMode", "card") + const {data: evaluationResults, mutate} = useEvaluationResults({ + evaluationId: evaluation.id, + onSuccess: () => { + updateEvaluation(evaluation.id, {status: EvaluationFlow.EVALUATION_FINISHED}) + }, + onError: (err) => { + console.error("Failed to fetch results:", err) + }, + }) + + const {numOfRows, flagVotes, positiveVotes, appVariant1Votes, appVariant2Votes} = + useMemo(() => { + const votesData = evaluationResults?.votes_data || {} + const variantsVotesData = votesData.variants_votes_data || {} + + const [variant1, variant2] = evaluation.variants || [] + + return { + numOfRows: votesData.nb_of_rows || 0, + flagVotes: votesData.flag_votes?.number_of_votes || 0, + positiveVotes: votesData.positive_votes?.number_of_votes || 0, + appVariant1Votes: variantsVotesData?.[variant1?.variantId]?.number_of_votes || 0, + appVariant2Votes: variantsVotesData?.[variant2?.variantId]?.number_of_votes || 0, + } + }, [evaluationResults, evaluation.variants]) + + const depouncedUpdateEvaluationScenario = useCallback( + debounce((data: Partial, scenarioId) => { + updateEvaluationScenarioData(scenarioId, data) + }, 800), + [evaluationScenarios], + ) + + useEffect(() => { + if (evaluationScenarios) { + setRows((prevRows) => { + const obj = [...evaluationScenarios] + obj.forEach((item) => + item.outputs.forEach((op) => (item[op.variant_id] = op.variant_output)), + ) + return obj + }) + } + }, [evaluationScenarios]) + + const handleInputChange = useCallback( + (e: React.ChangeEvent, id: string, inputIndex: number) => { + setRows((oldRows) => { + const rowIndex = oldRows.findIndex((row) => row.id === id) + const newRows = [...rows] + newRows[rowIndex].inputs[inputIndex].input_value = e.target.value + return newRows + }) + }, + [], + ) + + const setRowValue = useCallback( + (rowIndex: number, columnKey: keyof ABTestingEvaluationTableRow, value: any) => { + setRows((oldRows) => { + const newRows = [...oldRows] + newRows[rowIndex][columnKey] = value as never + return newRows + }) + }, + [], + ) + + const updateEvaluationScenarioData = useCallback( + async (id: string, data: Partial, showNotification = true) => { + await updateEvaluationScenario( + evaluation.id, + id, + Object.keys(data).reduce( + (acc, key) => ({ + ...acc, + [camelToSnake(key)]: data[key as keyof EvaluationScenario], + }), + {}, + ), + evaluation.evaluationType, + ) + .then(() => { + Object.keys(data).forEach((key) => { + setRowValue( + evaluationScenarios.findIndex((item) => item.id === id), + key, + data[key as keyof EvaluationScenario], + ) + }) + if (showNotification) message.success("Evaluation Updated!") + }) + .catch(console.error) + }, + [evaluation.evaluationType, evaluation.id, evaluationScenarios, setRowValue], + ) + + const handleVoteClick = useCallback( + async (id: string, vote: string) => { + const rowIndex = rows.findIndex((row) => row.id === id) + const evaluation_scenario_id = rows[rowIndex]?.id + + if (evaluation_scenario_id) { + setRowValue(rowIndex, "vote", "loading") + const data = { + vote: vote, + outputs: evalVariants.map((v: Variant) => ({ + variant_id: v.variantId, + variant_output: rows[rowIndex][v.variantId], + })), + inputs: rows[rowIndex].inputs, + } + await updateEvaluationScenarioData(evaluation_scenario_id, data) + await mutate() + } + }, + [rows, setRowValue, updateEvaluationScenarioData, evalVariants], + ) + + const runEvaluation = useCallback( + async (id: string, count = 1, showNotification = true) => { + const _variantData = variantData + const rowIndex = rows.findIndex((row) => row.id === id) + const inputParamsDict = rows[rowIndex].inputs.reduce( + (acc: Record, item) => { + acc[item.input_name] = item.input_value + return acc + }, + {}, + ) + + const outputs = rows[rowIndex].outputs.reduce( + (acc, op) => ({...acc, [op.variant_id]: op.variant_output}), + {}, + ) + + await Promise.all( + evalVariants.map(async (variant: Variant, idx: number) => { + setRowValue(rowIndex, variant.variantId, "loading...") + + const rawMessages = variantData[idx].isChatVariant + ? testsetRowToChatMessages(evaluation.testset.csvdata[rowIndex], false) + : [] + + const sanitizedMessages = rawMessages.map((msg) => { + if (!Array.isArray(msg.content)) return msg + return { + ...msg, + content: msg.content.filter((part) => { + return part.type !== "image_url" || part.image_url.url.trim() !== "" + }), + } + }) + + try { + const result = await callVariant( + inputParamsDict, + variantData[idx].inputParams!, + variantData[idx].parameters + ? transformToRequestBody({ + variant: variantData[idx], + allMetadata: getAllMetadata(), + }) + : variantData[idx].promptOptParams!, + appId || "", + variantData[idx].baseId || "", + sanitizedMessages, + undefined, + true, + !!variantData[idx].parameters, // isNewVariant + variantData[idx].isCustom, + variantData[idx].uriObject, + ) + + let res: BaseResponse | undefined + + if (typeof result === "string") { + res = {version: "2.0", data: result} as BaseResponse + } else if (isFuncResponse(result)) { + res = {version: "2.0", data: result.message} as BaseResponse + } else if (isBaseResponse(result)) { + res = result as BaseResponse + } else if (result.data) { + res = {version: "2.0", data: result.data} as BaseResponse + } else { + res = {version: "2.0", data: ""} as BaseResponse + } + + const _result = getStringOrJson(res.data) + + setRowValue(rowIndex, variant.variantId, _result) + ;(outputs as KeyValuePair)[variant.variantId] = _result + setRowValue( + rowIndex, + "evaluationFlow", + EvaluationFlow.COMPARISON_RUN_STARTED, + ) + if (idx === evalVariants.length - 1) { + if (count === 1 || count === rowIndex) { + setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) + } + } + + updateEvaluationScenarioData( + id, + { + outputs: Object.keys(outputs).map((key) => ({ + variant_id: key, + variant_output: outputs[key as keyof typeof outputs], + })), + inputs: rows[rowIndex].inputs, + }, + showNotification, + ) + } catch (err) { + console.error("Error running evaluation:", err) + setEvaluationStatus(EvaluationFlow.EVALUATION_FAILED) + setRowValue( + rowIndex, + variant.variantId, + err?.response?.data?.detail?.message || "Failed to run evaluation!", + ) + } + }), + ) + }, + [ + variantData, + rows, + evalVariants, + updateEvaluationScenarioData, + setRowValue, + appId, + evaluation.testset.csvdata, + ], + ) + + const runAllEvaluations = useCallback(async () => { + setEvaluationStatus(EvaluationFlow.EVALUATION_STARTED) + batchExecute(rows.map((row) => () => runEvaluation(row.id!, rows.length - 1, false))) + .then(() => { + setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) + mutate() + message.success("Evaluations Updated!") + }) + .catch((err) => console.error("An error occurred:", err)) + }, [runEvaluation, rows]) + + const dynamicColumns: ColumnType[] = useMemo( + () => + evalVariants.map((variant: Variant, ix) => { + const columnKey = variant.variantId + + return { + title: ( +
    + Variant: + + + {evalVariants + ? variantNameWithRev({ + variant_name: variant.variantName, + revision: evaluation.revisions[ix], + }) + : ""} + +
    + ), + dataIndex: columnKey, + key: columnKey, + width: "20%", + render: (text: any, record: ABTestingEvaluationTableRow, rowIndex: number) => { + let outputText = text + if (text) + return ( +
    + {text} +
    + ) + if (record.outputs && record.outputs.length > 0) { + const outputValue = record.outputs.find( + (output: any) => output.variant_id === columnKey, + )?.variant_output + return ( +
    + {outputValue} +
    + ) + } + return "" + }, + } + }), + [evalVariants], + ) + + const columns = useMemo(() => { + return [ + { + key: "1", + title: ( +
    +
    + Inputs (Test set: + {evaluation.testset.name} + ) +
    +
    + ), + width: 300, + dataIndex: "inputs", + render: (_: any, record: ABTestingEvaluationTableRow, rowIndex: number) => { + return ( + runEvaluation(record.id!)} + onParamChange={(name, value) => + handleInputChange( + {target: {value}} as any, + record.id, + record?.inputs.findIndex((ip) => ip.input_name === name), + ) + } + variantData={variantData} + isLoading={isVariantsLoading} + /> + ) + }, + }, + { + title: "Expected Output", + dataIndex: "expectedOutput", + key: "expectedOutput", + width: "25%", + render: (text: any, record: any, rowIndex: number) => { + const correctAnswer = + record.correctAnswer || evaluation.testset.csvdata[rowIndex].correct_answer + + return ( + <> + + depouncedUpdateEvaluationScenario( + { + correctAnswer: e.target.value, + }, + record.id, + ) + } + key={record.id} + /> + + ) + }, + }, + ...dynamicColumns, + { + title: "Score", + dataIndex: "score", + key: "score", + render: (text: any, record: any, rowIndex: number) => { + return ( + <> + { + handleVoteClick(record.id, vote)} + loading={record.vote === "loading"} + vertical + key={record.id} + outputs={record.outputs} + /> + } + + ) + }, + }, + { + title: "Additional Note", + dataIndex: "additionalNote", + key: "additionalNote", + render: (text: any, record: any, rowIndex: number) => { + return ( + <> + + depouncedUpdateEvaluationScenario( + {note: e.target.value}, + record.id, + ) + } + key={record.id} + /> + + ) + }, + }, + ] + }, [runEvaluation, isVariantsLoading, rows]) + + return ( +
    + {EvaluationTypeLabels.human_a_b_testing} +
    + +
    + + + + exportABTestingEvaluationData( + evaluation, + evaluationScenarios, + rows, + ) + } + disabled={false} + > + Export Results + + + + + + + + + + + + + + + + + + + + + + + + + +
    + setViewMode(e.target.value)} + value={viewMode} + optionType="button" + /> +
    + + {viewMode === "tabular" ? ( +
    record.id!} + /> + ) : ( + handleVoteClick(id, vote as string)} + onInputChange={handleInputChange} + updateEvaluationScenarioData={updateEvaluationScenarioData} + evaluation={evaluation} + variantData={variantData} + isLoading={isLoading || isVariantsLoading} + /> + )} + + ) +} + +export default ABTestingEvaluationTable diff --git a/web/ee/src/components/EvaluationTable/SingleModelEvaluationTable.tsx b/web/ee/src/components/EvaluationTable/SingleModelEvaluationTable.tsx new file mode 100644 index 0000000000..fb789bc7ad --- /dev/null +++ b/web/ee/src/components/EvaluationTable/SingleModelEvaluationTable.tsx @@ -0,0 +1,582 @@ +// @ts-nocheck +import {useCallback, useEffect, useState, useMemo} from "react" + +import { + Button, + Card, + Col, + Input, + Radio, + Row, + Space, + Statistic, + Table, + Typography, + message, +} from "antd" +import type {ColumnType} from "antd/es/table" +import debounce from "lodash/debounce" +import {useRouter} from "next/router" + +import SecondaryButton from "@/oss/components/SecondaryButton/SecondaryButton" +import {useAppsData} from "@/oss/contexts/app.context" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {EvaluationFlow} from "@/oss/lib/enums" +import {exportSingleModelEvaluationData} from "@/oss/lib/helpers/evaluate" +import {isBaseResponse, isFuncResponse} from "@/oss/lib/helpers/playgroundResp" +import {testsetRowToChatMessages} from "@/oss/lib/helpers/testset" +import { + EvaluationTypeLabels, + batchExecute, + camelToSnake, + getStringOrJson, +} from "@/oss/lib/helpers/utils" +import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" +import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" +import type {BaseResponse, EvaluationScenario, KeyValuePair, Variant} from "@/oss/lib/Types" +import {callVariant} from "@/oss/services/api" +import {updateEvaluation, updateEvaluationScenario} from "@/oss/services/human-evaluations/api" + +import EvaluationCardView from "../Evaluations/EvaluationCardView" +import EvaluationVotePanel from "../Evaluations/EvaluationCardView/EvaluationVotePanel" +import SaveTestsetModal from "../SaveTestsetModal/SaveTestsetModal" + +import {useSingleModelEvaluationTableStyles} from "./assets/styles" +import ParamsFormWithRun from "./components/ParamsFormWithRun" +import type {EvaluationTableProps, SingleModelEvaluationRow} from "./types" + +const {Title} = Typography + +/** + * + * @param evaluation - Evaluation object + * @param evaluationScenarios - Evaluation rows + * @param columnsCount - Number of variants to compare face to face (per default 2) + * @returns + */ +const SingleModelEvaluationTable: React.FC = ({ + evaluation, + evaluationScenarios, + isLoading, +}) => { + const classes = useSingleModelEvaluationTableStyles() + const router = useRouter() + const appId = router.query.app_id as string + const variants = evaluation.variants + const {currentApp} = useAppsData() + + const {data, isLoading: isVariantsLoading} = useVariants(currentApp)( + { + appId: appId, + }, + variants, + ) + + // Select the correct variant revisions for this evaluation + const variantData = useMemo(() => { + const allVariantData = data?.variants || [] + if (!allVariantData.length) return [] + + return evaluation.variants.map((evVariant, idx) => { + const revisionId = evaluation.variant_revision_ids?.[idx] + const revisionNumber = evaluation.revisions?.[idx] + + // 1. Try to find by exact revision id + let selected = allVariantData.find((v) => v.id === revisionId) + + // 2. Try by variantId & revision number + if (!selected && revisionNumber !== undefined) { + selected = allVariantData.find( + (v) => v.variantId === evVariant.variantId && v.revision === revisionNumber, + ) + } + + // 3. Fallback – latest revision for that variant + if (!selected) { + selected = allVariantData.find( + (v) => v.variantId === evVariant.variantId && v.isLatestRevision, + ) + } + + return selected || evVariant + }) + }, [data?.variants, evaluation.variants, evaluation.variant_revision_ids, evaluation.revisions]) + + const [rows, setRows] = useState([]) + const [evaluationStatus, setEvaluationStatus] = useState(evaluation.status) + const [viewMode, setViewMode] = useQueryParam("viewMode", "card") + const [accuracy, setAccuracy] = useState(0) + const [isTestsetModalOpen, setIsTestsetModalOpen] = useState(false) + + const depouncedUpdateEvaluationScenario = useCallback( + debounce((data: Partial, scenarioId) => { + updateEvaluationScenarioData(scenarioId, data) + }, 800), + [rows], + ) + + useEffect(() => { + if (evaluationScenarios) { + const obj = [...evaluationScenarios] + obj.forEach((item) => + item.outputs.forEach((op) => (item[op.variant_id] = op.variant_output)), + ) + setRows(obj) + } + }, [evaluationScenarios]) + + useEffect(() => { + const filtered = rows.filter((row) => typeof row.score === "number" && !isNaN(row.score)) + + if (filtered.length > 0) { + const avg = filtered.reduce((acc, val) => acc + Number(val.score), 0) / filtered.length + setAccuracy(avg) + } else { + setAccuracy(0) + } + }, [rows]) + + useEffect(() => { + if (evaluationStatus === EvaluationFlow.EVALUATION_FINISHED) { + updateEvaluation(evaluation.id, {status: EvaluationFlow.EVALUATION_FINISHED}).catch( + (err) => console.error("Failed to fetch results:", err), + ) + } + }, [evaluationStatus, evaluation.id]) + + const handleInputChange = ( + e: React.ChangeEvent, + id: string, + inputIndex: number, + ) => { + const rowIndex = rows.findIndex((row) => row.id === id) + const newRows = [...rows] + newRows[rowIndex].inputs[inputIndex].input_value = e.target.value + setRows(newRows) + } + + const handleScoreChange = (id: string, score: number) => { + const rowIndex = rows.findIndex((row) => row.id === id) + const evaluation_scenario_id = rows[rowIndex].id + + if (evaluation_scenario_id) { + setRowValue(rowIndex, "score", "loading") + const data = { + score: score ?? "", + outputs: variants.map((v: Variant) => ({ + variant_id: v.variantId, + variant_output: rows[rowIndex][v.variantId], + })), + inputs: rows[rowIndex].inputs, + } + + updateEvaluationScenarioData(evaluation_scenario_id, data) + } + } + + const depouncedHandleScoreChange = useCallback( + debounce((...args: Parameters) => { + handleScoreChange(...args) + }, 800), + [handleScoreChange], + ) + + const updateEvaluationScenarioData = async ( + id: string, + data: Partial, + showNotification = true, + ) => { + await updateEvaluationScenario( + evaluation.id, + id, + Object.keys(data).reduce( + (acc, key) => ({ + ...acc, + [camelToSnake(key)]: data[key as keyof EvaluationScenario], + }), + {}, + ), + evaluation.evaluationType, + ) + .then(() => { + Object.keys(data).forEach((key) => { + setRowValue( + rows.findIndex((item) => item.id === id), + key, + data[key as keyof EvaluationScenario], + ) + }) + if (showNotification) message.success("Evaluation Updated!") + }) + .catch(console.error) + } + + const runAllEvaluations = async () => { + setEvaluationStatus(EvaluationFlow.EVALUATION_STARTED) + batchExecute(rows.map((row) => () => runEvaluation(row.id!, rows.length - 1, false))) + .then(() => { + setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) + message.success("Evaluations Updated!") + }) + .catch((err) => console.error("An error occurred:", err)) + } + + const runEvaluation = async (id: string, count = 1, showNotification = true) => { + const rowIndex = rows.findIndex((row) => row.id === id) + const inputParamsDict = rows[rowIndex].inputs.reduce((acc: Record, item) => { + acc[item.input_name] = item.input_value + return acc + }, {}) + + const outputs = rows[rowIndex].outputs.reduce( + (acc, op) => ({...acc, [op.variant_id]: op.variant_output}), + {}, + ) + await Promise.all( + variants.map(async (variant: Variant, idx: number) => { + setRowValue(rowIndex, variant.variantId, "loading...") + + const rawMessages = variantData[idx].isChatVariant + ? testsetRowToChatMessages(evaluation.testset.csvdata[rowIndex], false) + : [] + + const sanitizedMessages = rawMessages.map((msg) => { + if (!Array.isArray(msg.content)) return msg + return { + ...msg, + content: msg.content.filter((part) => { + return part.type !== "image_url" || part.image_url.url.trim() !== "" + }), + } + }) + + try { + const result = await callVariant( + inputParamsDict, + variantData[idx].inputParams!, + variantData[idx].parameters + ? transformToRequestBody({ + variant: variantData[idx], + allMetadata: getAllMetadata(), + }) + : variantData[idx].promptOptParams!, + appId || "", + variantData[idx].baseId || "", + sanitizedMessages, + undefined, + true, + !!variantData[idx]._parentVariant, // isNewVariant + variantData[idx].isCustom, + variantData[idx].uriObject, + ) + + let res: BaseResponse | undefined + + if (typeof result === "string") { + res = {version: "2.0", data: result} as BaseResponse + } else if (isFuncResponse(result)) { + res = {version: "2.0", data: result.message} as BaseResponse + } else if (isBaseResponse(result)) { + res = result as BaseResponse + } else if (result.data) { + res = {version: "2.0", data: result.data} as BaseResponse + } else { + res = {version: "2.0", data: ""} as BaseResponse + console.error("Unknown response type:", result) + } + + const _result = getStringOrJson(res.data) + + setRowValue(rowIndex, variant.variantId, _result) + ;(outputs as KeyValuePair)[variant.variantId] = _result + setRowValue(rowIndex, "evaluationFlow", EvaluationFlow.COMPARISON_RUN_STARTED) + if (idx === variants.length - 1) { + if (count === 1 || count === rowIndex) { + setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) + } + } + + updateEvaluationScenarioData( + id, + { + outputs: Object.keys(outputs).map((key) => ({ + variant_id: key, + variant_output: outputs[key as keyof typeof outputs], + })), + inputs: rows[rowIndex].inputs, + }, + showNotification, + ) + } catch (err) { + console.error("Error running evaluation:", err) + setEvaluationStatus(EvaluationFlow.EVALUATION_FAILED) + setRowValue( + rowIndex, + variant.variantId, + err?.response?.data?.detail?.message || "Failed to run evaluation!", + ) + } + }), + ) + } + + const setRowValue = ( + rowIndex: number, + columnKey: keyof SingleModelEvaluationRow, + value: any, + ) => { + const newRows = [...rows] + newRows[rowIndex][columnKey] = value as never + setRows(newRows) + } + + const dynamicColumns: ColumnType[] = variants.map( + (variant: Variant) => { + const columnKey = variant.variantId + + return { + title: ( +
    + App Variant: + + {variants + ? variantNameWithRev({ + variant_name: variant.variantName, + revision: evaluation.revisions[0], + }) + : ""} + +
    + ), + dataIndex: columnKey, + key: columnKey, + width: "25%", + render: (text: any, record: SingleModelEvaluationRow, rowIndex: number) => { + let outputValue = text + if (!outputValue && record.outputs && record.outputs.length > 0) { + outputValue = record.outputs.find( + (output: any) => output.variant_id === columnKey, + )?.variant_output + } + return ( +
    + {outputValue} +
    + ) + }, + } + }, + ) + + const columns = [ + { + key: "1", + title: ( +
    +
    + Inputs (Test set: + {evaluation.testset.name} + ) +
    +
    + ), + width: 300, + dataIndex: "inputs", + render: (_: any, record: SingleModelEvaluationRow, rowIndex: number) => { + return ( + runEvaluation(record.id!)} + onParamChange={(name, value) => + handleInputChange( + {target: {value}} as any, + record.id, + record?.inputs.findIndex((ip) => ip.input_name === name), + ) + } + variantData={variantData} + isLoading={isVariantsLoading} + /> + ) + }, + }, + { + title: "Expected Output", + dataIndex: "expectedOutput", + key: "expectedOutput", + width: "25%", + render: (text: any, record: any, rowIndex: number) => { + const correctAnswer = + record.correctAnswer || evaluation.testset.csvdata[rowIndex].correct_answer + + return ( + <> + + depouncedUpdateEvaluationScenario( + { + correctAnswer: e.target.value, + }, + record.id, + ) + } + key={record.id} + /> + + ) + }, + }, + ...dynamicColumns, + { + title: "Score", + dataIndex: "score", + key: "score", + render: (text: any, record: any, rowIndex: number) => { + return ( + <> + { + + depouncedHandleScoreChange(record.id, val[0].score as number) + } + loading={record.score === "loading"} + showVariantName={false} + key={record.id} + outputs={record.outputs} + /> + } + + ) + }, + }, + { + title: "Additional Note", + dataIndex: "additionalNote", + key: "additionalNote", + render: (text: any, record: any, rowIndex: number) => { + return ( + <> + + depouncedUpdateEvaluationScenario({note: e.target.value}, record.id) + } + key={record.id} + /> + + ) + }, + }, + ] + + return ( +
    + {EvaluationTypeLabels.single_model_test} +
    + +
    + + + + exportSingleModelEvaluationData( + evaluation, + evaluationScenarios, + rows, + ) + } + disabled={false} + > + Export Results + + + + + + + + + + + + + + + +
    + setViewMode(e.target.value)} + value={viewMode} + optionType="button" + /> +
    + + setIsTestsetModalOpen(false)} + onSuccess={(testsetName: string) => { + message.success(`Row added to the "${testsetName}" test set!`) + setIsTestsetModalOpen(false) + }} + rows={rows} + evaluation={evaluation} + /> + + {viewMode === "tabular" ? ( +
    record.id!} + /> + ) : ( + depouncedHandleScoreChange(id, score as number)} + onInputChange={handleInputChange} + updateEvaluationScenarioData={updateEvaluationScenarioData} + evaluation={evaluation} + variantData={variantData} + isLoading={isLoading || isVariantsLoading} + /> + )} + + ) +} + +export default SingleModelEvaluationTable diff --git a/web/oss/src/components/EvaluationTable/assets/styles.ts b/web/ee/src/components/EvaluationTable/assets/styles.ts similarity index 100% rename from web/oss/src/components/EvaluationTable/assets/styles.ts rename to web/ee/src/components/EvaluationTable/assets/styles.ts diff --git a/web/ee/src/components/EvaluationTable/components/ParamsFormWithRun.tsx b/web/ee/src/components/EvaluationTable/components/ParamsFormWithRun.tsx new file mode 100644 index 0000000000..d1f371f824 --- /dev/null +++ b/web/ee/src/components/EvaluationTable/components/ParamsFormWithRun.tsx @@ -0,0 +1,74 @@ +// @ts-nocheck +import {CaretRightOutlined} from "@ant-design/icons" +import {Button, Form} from "antd" + +import ParamsForm from "@/oss/components/ParamsForm" +import {useLegacyVariants} from "@/oss/lib/hooks/useLegacyVariant" +import type {Evaluation} from "@/oss/lib/Types" + +import {useSingleModelEvaluationTableStyles} from "../assets/styles" +import type {SingleModelEvaluationRow} from "../types" + +/** + * + * @param evaluation - Evaluation object + * @param evaluationScenarios - Evaluation rows + * @param columnsCount - Number of variants to compare face to face (per default 2) + * @returns + */ +const ParamsFormWithRun = ({ + evaluation, + record, + rowIndex, + onRun, + onParamChange, + variantData = [], + isLoading, +}: { + record: SingleModelEvaluationRow + rowIndex: number + evaluation: Evaluation + onRun: () => void + onParamChange: (name: string, value: any) => void + variantData: ReturnType + isLoading: boolean +}) => { + const classes = useSingleModelEvaluationTableStyles() + const [form] = Form.useForm() + const inputParams = variantData[0]?.inputParams + + return isLoading ? null : ( +
    +
    + {evaluation.testset.testsetChatColumn ? ( + evaluation.testset.csvdata[rowIndex][evaluation.testset.testsetChatColumn] || + " - " + ) : inputParams ? ( + ({ + ...item, + value: record.inputs.find((ip) => ip.input_name === item.name) + ?.input_value, + })) || [] + } + onFinish={onRun} + form={form} + /> + ) : null} +
    +
    + +
    +
    + ) +} + +export default ParamsFormWithRun diff --git a/web/oss/src/components/EvaluationTable/types.d.ts b/web/ee/src/components/EvaluationTable/types.d.ts similarity index 100% rename from web/oss/src/components/EvaluationTable/types.d.ts rename to web/ee/src/components/EvaluationTable/types.d.ts diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationCard.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationCard.tsx similarity index 92% rename from web/oss/src/components/Evaluations/EvaluationCardView/EvaluationCard.tsx rename to web/ee/src/components/Evaluations/EvaluationCardView/EvaluationCard.tsx index 4b825fc75f..cb25c28ebd 100644 --- a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationCard.tsx +++ b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationCard.tsx @@ -1,5 +1,3 @@ -import {memo} from "react" - import {createUseStyles} from "react-jss" import type {ABTestingEvaluationTableRow} from "@/oss/components/EvaluationTable/types" @@ -41,7 +39,7 @@ const EvaluationCard: React.FC = ({ {variants.map((variant, ix) => isChat ? ( = ({ /> ) : ( = ({ ) } -export default memo(EvaluationCard) +export default EvaluationCard diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationChatResponse.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationChatResponse.tsx similarity index 86% rename from web/oss/src/components/Evaluations/EvaluationCardView/EvaluationChatResponse.tsx rename to web/ee/src/components/Evaluations/EvaluationCardView/EvaluationChatResponse.tsx index 8e66303bd6..5e76890a8e 100644 --- a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationChatResponse.tsx +++ b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationChatResponse.tsx @@ -1,5 +1,3 @@ -import {memo, useMemo} from "react" - import {Space, Typography} from "antd" import {createUseStyles} from "react-jss" import {v4 as uuidv4} from "uuid" @@ -41,11 +39,6 @@ const EvaluationChatResponse: React.FC = ({ ? parsedOutput.content : outputText || "" - const chatValue = useMemo( - () => [{role: ChatRole.Assistant, content: messageContent, id: uuidv4()}], - [messageContent], - ) - return ( {showVariantName && ( @@ -61,9 +54,12 @@ const EvaluationChatResponse: React.FC = ({ )} - + ) } -export default memo(EvaluationChatResponse) +export default EvaluationChatResponse diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationInputs.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationInputs.tsx similarity index 100% rename from web/oss/src/components/Evaluations/EvaluationCardView/EvaluationInputs.tsx rename to web/ee/src/components/Evaluations/EvaluationCardView/EvaluationInputs.tsx diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationVariantCard.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationVariantCard.tsx similarity index 100% rename from web/oss/src/components/Evaluations/EvaluationCardView/EvaluationVariantCard.tsx rename to web/ee/src/components/Evaluations/EvaluationCardView/EvaluationVariantCard.tsx diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationVotePanel.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationVotePanel.tsx similarity index 97% rename from web/oss/src/components/Evaluations/EvaluationCardView/EvaluationVotePanel.tsx rename to web/ee/src/components/Evaluations/EvaluationCardView/EvaluationVotePanel.tsx index 8f309454d7..60ff6ecf37 100644 --- a/web/oss/src/components/Evaluations/EvaluationCardView/EvaluationVotePanel.tsx +++ b/web/ee/src/components/Evaluations/EvaluationCardView/EvaluationVotePanel.tsx @@ -95,7 +95,7 @@ const ComparisonVote: React.FC = ({
    {variants.map((variant, ix) => ( = ({ return (
    - {variants.map((variant, ix) => ( -
    + {variants.map((variant) => ( +
    {variant.variantName} @@ -252,8 +252,8 @@ const NumericScoreVote: React.FC = ({ return (
    - {variants.map((variant, ix) => ( -
    + {variants.map((variant) => ( +
    {showVariantName && ( {variant.variantName} @@ -307,12 +307,12 @@ const RatingVote: React.FC = ({ return (
    - {variants.map((variant, ix) => { + {variants.map((variant) => { const score = value.find((item) => item.variantId === variant.variantId)?.score const finalValue = typeof score !== "number" ? null : score / 25 + 1 return ( -
    +
    {showVariantName && ( {variant.variantName} diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/VariantAlphabet.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/VariantAlphabet.tsx similarity index 100% rename from web/oss/src/components/Evaluations/EvaluationCardView/VariantAlphabet.tsx rename to web/ee/src/components/Evaluations/EvaluationCardView/VariantAlphabet.tsx diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/assets/styles.ts b/web/ee/src/components/Evaluations/EvaluationCardView/assets/styles.ts similarity index 100% rename from web/oss/src/components/Evaluations/EvaluationCardView/assets/styles.ts rename to web/ee/src/components/Evaluations/EvaluationCardView/assets/styles.ts diff --git a/web/ee/src/components/Evaluations/EvaluationCardView/index.tsx b/web/ee/src/components/Evaluations/EvaluationCardView/index.tsx new file mode 100644 index 0000000000..9bd36e9674 --- /dev/null +++ b/web/ee/src/components/Evaluations/EvaluationCardView/index.tsx @@ -0,0 +1,411 @@ +// @ts-nocheck +import {useCallback, useEffect, useMemo, useRef} from "react" + +import { + LeftOutlined, + LoadingOutlined, + PlayCircleOutlined, + QuestionCircleOutlined, + RightOutlined, +} from "@ant-design/icons" +import {Button, Empty, Form, Input, Result, Space, Tooltip, Typography, theme} from "antd" +import debounce from "lodash/debounce" +import {useLocalStorage} from "usehooks-ts" + +import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" +import ParamsForm from "@/oss/components/ParamsForm" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {EvaluationType} from "@/oss/lib/enums" +import {testsetRowToChatMessages} from "@/oss/lib/helpers/testset" +import type {ChatMessage, EvaluationScenario} from "@/oss/lib/Types" + +import {useStyles} from "./assets/styles" +import EvaluationCard from "./EvaluationCard" +import EvaluationVotePanel from "./EvaluationVotePanel" +import type {EvaluationCardViewProps} from "./types" + +const EvaluationCardView: React.FC = ({ + variants, + evaluationScenarios, + onRun, + onVote, + onInputChange, + updateEvaluationScenarioData, + evaluation, + variantData = [], + isLoading, +}) => { + const classes = useStyles() + const {token} = theme.useToken() + const [evaluationsState, setEvaluationsState] = useLocalStorage< + Record + >("evaluationsState", {}) + + const [scenarioId, setScenarioId] = useQueryParam( + "evaluationScenario", + evaluationsState[evaluation.id]?.lastVisitedScenario || evaluationScenarios[0]?.id || "", + ) + const [instructionsShown, setInstructionsShown] = useLocalStorage( + "evalInstructionsShown", + false, + ) + const {scenario, scenarioIndex} = useMemo(() => { + const scenarioIndex = evaluationScenarios.findIndex( + (scenario) => scenario.id === scenarioId, + ) + return {scenario: evaluationScenarios[scenarioIndex], scenarioIndex} + }, [scenarioId, evaluationScenarios]) + + useEffect(() => { + setEvaluationsState((prevEvaluationsState) => ({ + ...prevEvaluationsState, + [evaluation.id]: { + ...(prevEvaluationsState[evaluation.id] || {}), + lastVisitedScenario: scenarioId, + }, + })) + }, [scenarioId]) + + const rootRef = useRef(null) + const opened = useRef(false) + const callbacks = useRef({ + onVote, + onRun, + onInputChange, + }) + const isChat = !!evaluation.testset.testsetChatColumn + const testsetRow = evaluation.testset.csvdata[scenarioIndex] + const isAbTesting = evaluation.evaluationType === EvaluationType.human_a_b_testing + const [form] = Form.useForm() + + const loadPrevious = () => { + if (scenarioIndex === 0) return + setScenarioId(evaluationScenarios[scenarioIndex - 1].id) + } + + const loadNext = () => { + if (scenarioIndex === evaluationScenarios.length - 1) return + setScenarioId(evaluationScenarios[scenarioIndex + 1].id) + } + + const showInstructions = useCallback(() => { + if (opened.current) return + + opened.current = true + AlertPopup({ + title: "Instructions", + type: "info", + message: ( +
      +
    1. + Use the buttons Next and Prev or the arrow keys{" "} + {`Left (<)`} and {`Right (>)`} to navigate between + evaluations. +
    2. +
    3. + Click the Run{" "} + button on + right or press {`Enter (↵)`} key to generate the variants' + outputs. +
    4. + {isAbTesting && ( +
    5. + Vote by either clicking the evaluation buttons at the right + sidebar or pressing the key a for 1st Variant,{" "} + b for 2nd Variant and x if both are bad. +
    6. + )} +
    7. + Add a note to an evaluation from the Additional Notes input section{" "} + in the right sidebar. +
    8. +
    + ), + okText: Ok, + cancelText: null, + width: 500, + onCancel: () => (opened.current = false), + onOk: () => (opened.current = false), + }) + }, []) + + const depouncedUpdateEvaluationScenario = useCallback( + debounce((data: Partial) => { + updateEvaluationScenarioData(scenarioId, data) + }, 800), + [scenarioId], + ) + + const onChatChange = (chat: ChatMessage[]) => { + const stringified = JSON.stringify(chat) + testsetRow[evaluation.testset.testsetChatColumn] = stringified + + depouncedUpdateEvaluationScenario({ + inputs: [ + {input_name: "chat", input_value: stringified}, + ...scenario.inputs.filter( + (ip: {input_name: string; input_value: string}) => ip.input_name !== "chat", + ), + ], + [evaluation.testset.testsetChatColumn]: stringified, + }) + } + + //hack to always get the latest callbacks using ref + useEffect(() => { + callbacks.current = {onVote, onRun, onInputChange} + }, [onVote, onRun, onInputChange]) + + // focus the root element on mount + useEffect(() => { + if (rootRef.current) { + rootRef.current.focus() + } + }, []) + + useEffect(() => { + if (!instructionsShown) { + showInstructions() + setInstructionsShown(true) + } + }, [instructionsShown]) + + useEffect(() => { + if (typeof window === "undefined") return () => {} + + const listener = (e: KeyboardEvent) => { + if (document.activeElement !== rootRef.current) return + if (e.key === "ArrowLeft") loadPrevious() + else if (e.key === "ArrowRight") loadNext() + else if (e.key === "Enter") callbacks.current.onRun(scenarioId) + + if (isAbTesting) { + if (e.key === "a") callbacks.current.onVote(scenarioId, variants[0].variantId) + else if (e.key === "b") callbacks.current.onVote(scenarioId, variants[1].variantId) + else if (e.key === "x") callbacks.current.onVote(scenarioId, "0") + } + } + + document.addEventListener("keydown", listener) + return () => document.removeEventListener("keydown", listener) + }, [scenarioIndex]) + + useEffect(() => { + if (scenario) { + const chatStr = scenario?.inputs.find( + (ip: {input_name: string; input_value: string}) => ip.input_name === "chat", + )?.input_value + if (chatStr) testsetRow[evaluation.testset.testsetChatColumn] = chatStr + } + }, [scenario]) + + const correctAnswer = useMemo(() => { + if (scenario?.correctAnswer) return scenario.correctAnswer + const res = testsetRow?.correct_answer + return res || "" + }, [testsetRow?.correct_answer, scenario?.correctAnswer]) + + const chat = useMemo(() => { + const fromInput = scenario?.inputs.find( + (ip: {input_name: string; input_value: string}) => ip.input_name === "chat", + )?.input_value + if (!isChat) return [] + + return testsetRowToChatMessages( + fromInput + ? {chat: fromInput, correct_answer: testsetRow?.correct_answer} + : testsetRow || {}, + false, + ) + }, [scenarioIndex]) + + return ( +
    + {isLoading ? ( + } /> + ) : scenario ? ( + <> +
    +
    + + + Evaluation: {scenarioIndex + 1}/{evaluationScenarios.length} + + +
    + +
    + Inputs + {variantData[0] ? ( + + isChat + ? onChatChange(value) + : onInputChange( + {target: {value}} as any, + scenarioId, + scenario.inputs.findIndex( + (ip) => ip.input_name === name, + ), + ) + } + inputParams={ + isChat + ? [ + ...(( + (variantData || [])[0]?.inputParams || [] + ).map((item) => ({ + ...item, + value: scenario.inputs.find( + (ip) => ip.input_name === item.name, + )?.input_value, + })) || []), + {name: "chat", value: chat} as any, + ] + : ((variantData || [])[0]?.inputParams || []).map( + (item) => ({ + ...item, + value: scenario.inputs.find( + (ip) => ip.input_name === item.name, + )?.input_value, + }), + ) || [] + } + key={scenarioId} + useChatDefaultValue + form={form} + onFinish={() => onRun(scenarioId)} + imageSize="large" + /> + ) : null} +
    + +
    + + + + + onRun(scenarioId) : form.submit} + /> + +
    + +
    +
    + {!isAbTesting ? ( + + Model Response + + ) : ( + + Outputs + + )} +
    + + +
    +
    + +
    + Submit your feedback + {scenario.outputs.length > 0 && + scenario.outputs.every((item) => !!item.variant_output) && ( + + + {isAbTesting + ? "Which response is better?" + : "Rate the response"} + + {isAbTesting ? ( + onVote(scenarioId, vote)} + loading={scenario.vote === "loading"} + vertical + key={scenarioId} + outputs={scenario.outputs} + /> + ) : ( + onVote(scenarioId, val[0].score)} + loading={scenario.score === "loading"} + showVariantName={false} + key={scenarioId} + outputs={scenario.outputs} + /> + )} + + )} + + + Expected Answer + + depouncedUpdateEvaluationScenario({ + correctAnswer: e.target.value, + }) + } + key={scenarioId} + /> + + + + Additional Notes + + depouncedUpdateEvaluationScenario({note: e.target.value}) + } + key={scenarioId} + /> + +
    + + ) : ( + + )} +
    + ) +} + +export default EvaluationCardView diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/types.d.ts b/web/ee/src/components/Evaluations/EvaluationCardView/types.d.ts similarity index 100% rename from web/oss/src/components/Evaluations/EvaluationCardView/types.d.ts rename to web/ee/src/components/Evaluations/EvaluationCardView/types.d.ts diff --git a/web/oss/src/components/Evaluations/EvaluationErrorModal.tsx b/web/ee/src/components/Evaluations/EvaluationErrorModal.tsx similarity index 100% rename from web/oss/src/components/Evaluations/EvaluationErrorModal.tsx rename to web/ee/src/components/Evaluations/EvaluationErrorModal.tsx diff --git a/web/oss/src/components/Evaluations/HumanEvaluationResult.tsx b/web/ee/src/components/Evaluations/HumanEvaluationResult.tsx similarity index 100% rename from web/oss/src/components/Evaluations/HumanEvaluationResult.tsx rename to web/ee/src/components/Evaluations/HumanEvaluationResult.tsx diff --git a/web/oss/src/components/Evaluations/ShareEvaluationModal.tsx b/web/ee/src/components/Evaluations/ShareEvaluationModal.tsx similarity index 96% rename from web/oss/src/components/Evaluations/ShareEvaluationModal.tsx rename to web/ee/src/components/Evaluations/ShareEvaluationModal.tsx index 4f6a1f647d..4286030791 100644 --- a/web/oss/src/components/Evaluations/ShareEvaluationModal.tsx +++ b/web/ee/src/components/Evaluations/ShareEvaluationModal.tsx @@ -5,8 +5,8 @@ import {useRouter} from "next/router" import {createUseStyles} from "react-jss" import CopyButton from "@/oss/components/CopyButton/CopyButton" +import {useOrgData} from "@/oss/contexts/org.context" import {EvaluationType} from "@/oss/lib/enums" -import {useOrgData} from "@/oss/state/org" const useStyles = createUseStyles({ row: { diff --git a/web/oss/src/components/HumanEvaluationModal/HumanEvaluationModal.tsx b/web/ee/src/components/HumanEvaluationModal/HumanEvaluationModal.tsx similarity index 83% rename from web/oss/src/components/HumanEvaluationModal/HumanEvaluationModal.tsx rename to web/ee/src/components/HumanEvaluationModal/HumanEvaluationModal.tsx index 4487a67cf7..a410a02731 100644 --- a/web/oss/src/components/HumanEvaluationModal/HumanEvaluationModal.tsx +++ b/web/ee/src/components/HumanEvaluationModal/HumanEvaluationModal.tsx @@ -4,25 +4,22 @@ import {useEffect, useMemo, useState} from "react" import VariantDetailsWithStatus from "@agenta/oss/src/components/VariantDetailsWithStatus" import {CaretDown, Play} from "@phosphor-icons/react" import {Button, Col, Dropdown, MenuProps, Modal, Row, Spin, message} from "antd" -import {getDefaultStore} from "jotai" import isEqual from "lodash/isEqual" import dynamic from "next/dynamic" import {useRouter} from "next/router" import EvaluationErrorModal from "@/oss/components/Evaluations/EvaluationErrorModal" import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" -import useURL from "@/oss/hooks/useURL" +import {useAppsData} from "@/oss/contexts/app.context" import {PERMISSION_ERR_MSG} from "@/oss/lib/api/assets/axiosConfig" import {EvaluationType} from "@/oss/lib/enums" import {getErrorMessage} from "@/oss/lib/helpers/errorHandler" import {isDemo} from "@/oss/lib/helpers/utils" import {getAllVariantParameters, groupVariantsByParent} from "@/oss/lib/helpers/variantHelper" -import useStatelessVariants from "@/oss/lib/hooks/useStatelessVariants" -import type {GenericObject, Parameter, StyleProps, Variant} from "@/oss/lib/Types" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import type {GenericObject, Parameter, Variant, StyleProps} from "@/oss/lib/Types" import {createNewEvaluation} from "@/oss/services/human-evaluations/api" -// import {currentAppAtom} from "@/oss/state/app" -import {promptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {useTestsetsData} from "@/oss/state/testset" +import {useLoadTestsetsList} from "@/oss/services/testsets/api" import {useStyles} from "./assets/styles" import type {HumanEvaluationModalProps} from "./types" @@ -32,23 +29,21 @@ const ShareEvaluationModal = dynamic( {ssr: false}, ) -const store = getDefaultStore() - const HumanEvaluationModal = ({ isEvalModalOpen, setIsEvalModalOpen, evaluationType, }: HumanEvaluationModalProps) => { const router = useRouter() - const {appURL} = useURL() const {appTheme} = useAppTheme() + const {currentApp} = useAppsData() const [isError, setIsError] = useState(false) const classes = useStyles({themeMode: appTheme} as StyleProps) - const {projectURL} = useURL() + const [selectedTestset, setSelectedTestset] = useState<{ _id?: string name: string - }>({name: "Select a Testset"}) + }>({name: "Select a Test set"}) const [testsetsList, setTestsetsList] = useState([]) const [selectedVariants, setSelectedVariants] = useState( @@ -59,7 +54,7 @@ const HumanEvaluationModal = ({ const appId = router.query.app_id?.toString() || "" - const {testsets, isError: isTestsetsLoadingError} = useTestsetsData() + const {testsets, isTestsetsLoadingError} = useLoadTestsetsList() const [variantsInputs, setVariantsInputs] = useState>({}) @@ -67,38 +62,48 @@ const HumanEvaluationModal = ({ const [shareModalOpen, setShareModalOpen] = useState(false) - const { - variants: data, - isLoading: areAppVariantsLoading, - specMap, - uriMap, - } = useStatelessVariants() + const {data, isLoading: areAppVariantsLoading} = useVariants(currentApp)({ + appId: currentApp?.app_id, + }) - const variants = useMemo(() => groupVariantsByParent(data || [], true), [data]) + const variants = useMemo(() => groupVariantsByParent(data?.variants || [], true), [data]) useEffect(() => { if (variants.length > 0) { const fetchAndSetSchema = async () => { try { + const isNewVariant = true let results: { variantName: string inputs: string[] }[] - // Prefer deriving inputs from OpenAPI schema exposed by useStatelessVariants - results = variants.map((_variant) => { - const variant = _variant.revisions.sort( - (a, b) => b.updatedAtTimestamp - a.updatedAtTimestamp, - )[0] - const vId = variant.variantId || variant.id - const inputs = store.get(promptVariablesAtomFamily(vId)) - return { - variantName: variant.variantName, - inputs, - } - }) - - // Fallback: if some variants have no inputs from schema, try server-side parameters API - if (results.some((r) => (r.inputs || []).length === 0)) { + + const isCustom = variants.some((v) => v.isCustom) + + if (isCustom) { + results = variants.map((_variant) => { + const variant = _variant.revisions.sort( + (a, b) => b.updatedAtTimestamp - a.updatedAtTimestamp, + )[0] + return { + variantName: variant.variantName, + inputs: (variant.inputParams || []).map( + (ip) => ip.name || ip.title, + ), + } + }) + } else if (isNewVariant) { + results = variants.map((_variant) => { + const variant = _variant.revisions.sort( + (a, b) => b.updatedAtTimestamp - a.updatedAtTimestamp, + )[0] + return { + variantName: variant.variantName, + inputs: (variant.inputParams || []).map((input) => input.name), + } + }) + } else { + // Map the variants to an array of promises const promises = variants.map((variant) => getAllVariantParameters(appId, variant).then((data) => ({ variantName: variant.variantName, @@ -107,18 +112,9 @@ const HumanEvaluationModal = ({ [], })), ) - const fallback = await Promise.all(promises) - // Merge fallback only where empty - const map = Object.fromEntries( - fallback.map((f) => [f.variantName, f.inputs]), - ) as Record - results = results.map((r) => ({ - variantName: r.variantName, - inputs: - r.inputs && r.inputs.length > 0 - ? r.inputs - : map[r.variantName] || [], - })) + + // Wait for all promises to complete and collect results + results = await Promise.all(promises) } // Reduce the results into the desired newVariantsInputs object structure @@ -214,6 +210,8 @@ const HumanEvaluationModal = ({ const label = variant.variantName if (!selectedVariantsNames.includes(label)) { + const isLatest = variant.revisions.some((revision) => revision.isLatestRevision) + variant.isLatestRevision = isLatest filteredVariants.push({ label: ( <> @@ -254,7 +252,7 @@ const HumanEvaluationModal = ({ const onStartEvaluation = async () => { const selectedVariant = selectedVariants[0] // 1. We check all data is provided - if (selectedTestset === undefined || selectedTestset.name === "Select a Testset") { + if (selectedTestset === undefined || selectedTestset.name === "Select a Test set") { message.error("Please select a Testset") return } else if (selectedVariant?.variantName === "Select a variant") { @@ -268,15 +266,11 @@ const HumanEvaluationModal = ({ return } - const inputs = store.get( - promptVariablesAtomFamily(selectedVariant.variantId || selectedVariant.id), - ) - // 2. We create a new app evaluation const evaluationTableId = await createNewEvaluation({ variant_ids: selectedVariants.map((variant) => variant.variantId || variant.id), appId, - inputs, + inputs: variantsInputs[selectedVariant.variantName], evaluationType: EvaluationType[evaluationType as keyof typeof EvaluationType], evaluationTypeSettings: {}, llmAppPromptTemplate: "", @@ -286,8 +280,8 @@ const HumanEvaluationModal = ({ if (err.message !== PERMISSION_ERR_MSG) { setError({ message: getErrorMessage(err), - btnText: "Go to Testsets", - endpoint: `${projectURL}/testsets`, + btnText: "Go to Test sets", + endpoint: `/testsets`, }) } }) @@ -300,9 +294,9 @@ const HumanEvaluationModal = ({ // setVariants(selectedVariants) if (evaluationType === EvaluationType.human_a_b_testing) { - router.push(`${appURL}/evaluations/human_a_b_testing/${evaluationTableId}`) + router.push(`/apps/${appId}/evaluations/human_a_b_testing/${evaluationTableId}`) } else if (evaluationType === EvaluationType.single_model_test) { - router.push(`${appURL}/evaluations/single_model_test/${evaluationTableId}`) + router.push(`/apps/${appId}/evaluations/single_model_test/${evaluationTableId}`) } } @@ -313,7 +307,7 @@ const HumanEvaluationModal = ({ onCancel={() => { setIsEvalModalOpen(false) - setSelectedTestset({name: "Select a Testset"}) + setSelectedTestset({name: "Select a Test set"}) setSelectedVariants(new Array(1).fill({variantName: "Select a variant"})) }} title="New Evaluation" diff --git a/web/oss/src/components/HumanEvaluationModal/assets/styles.ts b/web/ee/src/components/HumanEvaluationModal/assets/styles.ts similarity index 100% rename from web/oss/src/components/HumanEvaluationModal/assets/styles.ts rename to web/ee/src/components/HumanEvaluationModal/assets/styles.ts diff --git a/web/oss/src/components/HumanEvaluationModal/types.d.ts b/web/ee/src/components/HumanEvaluationModal/types.d.ts similarity index 100% rename from web/oss/src/components/HumanEvaluationModal/types.d.ts rename to web/ee/src/components/HumanEvaluationModal/types.d.ts diff --git a/web/oss/src/components/HumanEvaluations/AbTestingEvaluation.tsx b/web/ee/src/components/HumanEvaluations/AbTestingEvaluation.tsx similarity index 93% rename from web/oss/src/components/HumanEvaluations/AbTestingEvaluation.tsx rename to web/ee/src/components/HumanEvaluations/AbTestingEvaluation.tsx index 8b24acf870..18dc8e3ec8 100644 --- a/web/oss/src/components/HumanEvaluations/AbTestingEvaluation.tsx +++ b/web/ee/src/components/HumanEvaluations/AbTestingEvaluation.tsx @@ -1,23 +1,19 @@ import {type Key, useEffect, useState} from "react" -import VariantDetailsWithStatus from "@agenta/oss/src/components/VariantDetailsWithStatus" import {MoreOutlined, PlusOutlined} from "@ant-design/icons" import {Database, Export, GearSix, Note, Plus, Rocket, Trash} from "@phosphor-icons/react" import {Button, Dropdown, message, Space, Spin, Statistic, Table, Typography} from "antd" import {ColumnsType} from "antd/es/table" -import {useAtomValue} from "jotai" -import Link from "next/link" import {useRouter} from "next/router" import {createUseStyles} from "react-jss" import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" import HumanEvaluationModal from "@/oss/components/HumanEvaluationModal/HumanEvaluationModal" -import useURL from "@/oss/hooks/useURL" +import {getAppValues} from "@/oss/contexts/app.context" import {EvaluationType} from "@/oss/lib/enums" import {formatDate24} from "@/oss/lib/helpers/dateTimeHelper" import {getVotesPercentage} from "@/oss/lib/helpers/evaluate" import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" import {abTestingEvaluationTransformer} from "@/oss/lib/transformers" import {HumanEvaluationListTableDataType, JSSTheme} from "@/oss/lib/Types" @@ -26,8 +22,8 @@ import { fetchAllLoadEvaluations, fetchEvaluationResults, } from "@/oss/services/human-evaluations/api" -import {getAppValues, selectedAppIdAtom} from "@/oss/state/app" -import {projectIdAtom} from "@/oss/state/project" + +import VariantDetailsWithStatus from "@agenta/oss/src/components/VariantDetailsWithStatus" const {Title} = Typography @@ -82,9 +78,7 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) => { const classes = useStyles() const router = useRouter() - const {appURL, projectURL} = useURL() - const projectId = useAtomValue(projectIdAtom) - const appId = useAtomValue(selectedAppIdAtom) + const appId = router.query.app_id as string const [evaluationsList, setEvaluationsList] = useState([]) const [fetchingEvaluations, setFetchingEvaluations] = useState(false) @@ -95,12 +89,12 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) const [selectedRowKeys, setSelectedRowKeys] = useState([]) useEffect(() => { - if (!appId || !projectId) return + if (!appId) return const fetchEvaluations = async () => { try { setFetchingEvaluations(true) - const evals = await fetchAllLoadEvaluations(appId, projectId) + const evals = await fetchAllLoadEvaluations(appId) const fetchPromises = evals.map(async (item: any) => { return fetchEvaluationResults(item.id) @@ -131,13 +125,13 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) } fetchEvaluations() - }, [appId, projectId]) + }, [appId]) const handleNavigation = (variantRevisionId: string) => { router.push({ - pathname: `${appURL}/playground`, + pathname: `/apps/${appId}/playground`, query: { - revisions: buildRevisionsQueryParam([variantRevisionId]), + revisions: JSON.stringify([variantRevisionId]), }, }) } @@ -216,7 +210,7 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) }, }, { - title: "Testset", + title: "Test set", dataIndex: "testsetName", key: "testsetName", onHeaderCell: () => ({ @@ -329,7 +323,7 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) onClick: (e) => { e.domEvent.stopPropagation() router.push( - `${appURL}/evaluations/human_a_b_testing/${record.key}`, + `/apps/${appId}/evaluations/human_a_b_testing/${record.key}`, ) }, }, @@ -353,13 +347,11 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) }, { key: "view_testset", - label: "View testset", + label: "View test set", icon: , onClick: (e) => { e.domEvent.stopPropagation() - router.push( - `${projectURL}/testsets/${record.testset._id}`, - ) + router.push(`/testsets/${record.testset._id}`) }, }, {type: "divider"}, @@ -410,7 +402,7 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) variant_name: item.variantNames[1] ?? "", revision: item.revisions[1], }), - Testset: item.testset.name, + "Test set": item.testset.name, "Result 1": `${getVotesPercentage(item, 0) || 0}%`, "Result 2": `${getVotesPercentage(item, 1) || 0}%`, "Both are good": `${item.votesData.positive_votes.percentage}%`, @@ -440,12 +432,10 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"})
    Human A/B Testing - @@ -503,14 +493,15 @@ const AbTestingEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) className="ph-no-capture" columns={columns} dataSource={evaluationsList} - loading={fetchingEvaluations} scroll={{x: true}} bordered pagination={false} onRow={(record) => ({ style: {cursor: "pointer"}, onClick: () => - router.push(`${appURL}/evaluations/human_a_b_testing/${record.key}`), + router.push( + `/apps/${appId}/evaluations/human_a_b_testing/${record.key}`, + ), })} /> diff --git a/web/ee/src/components/HumanEvaluations/SingleModelEvaluation.tsx b/web/ee/src/components/HumanEvaluations/SingleModelEvaluation.tsx new file mode 100644 index 0000000000..742ee782a9 --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/SingleModelEvaluation.tsx @@ -0,0 +1,262 @@ +import {memo, useMemo, useCallback, useState, type Key, useRef, RefObject} from "react" + +import {Table} from "antd" +import {ColumnsType} from "antd/es/table" +import clsx from "clsx" +import {useRouter} from "next/router" +import {Resizable} from "react-resizable" +import {useResizeObserver} from "usehooks-ts" + +import {EvaluationType} from "@/oss/lib/enums" +import useEvaluationRunMetrics from "@/oss/lib/hooks/useEvaluationRunMetrics" +import useEvaluations from "@/oss/lib/hooks/useEvaluations" +import useRunMetricsMap from "@/oss/lib/hooks/useRunMetricsMap" + +import SingleModelEvaluationHeader from "./assets/SingleModelEvaluationHeader" +import {useStyles} from "./assets/styles" +import {getColumns} from "./assets/utils" +import {EvaluationRow} from "./types" + +import "react-resizable/css/styles.css" +import "@/oss/assets/custom-resize-handle.css" + +export const ResizableTitle = (props: any) => { + const {onResize, width, ...restProps} = props + if (!width) { + return
    + + ) +} + +const SingleModelEvaluation = ({viewType}: {viewType: "evaluation" | "overview"}) => { + const classes = useStyles() + const router = useRouter() + const appId = router.query.app_id as string + + const [selectedEvalRecord, setSelectedEvalRecord] = useState() + const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + + const {mergedEvaluations, isLoadingPreview, isLoadingLegacy} = useEvaluations({ + withPreview: true, + types: [EvaluationType.single_model_test], + }) + + const runIds = useMemo( + () => mergedEvaluations.map((e) => ("id" in e ? e.id : e.key)), + [mergedEvaluations], + ) + const {data: runMetricsMap} = useRunMetricsMap(runIds) + const {swrData} = useEvaluationRunMetrics(runIds) + + const [collapsedGroups, setCollapsedGroups] = useState>({}) + const toggleGroup = useCallback((key: string) => { + setCollapsedGroups((prev) => ({...prev, [key]: !prev[key]})) + }, []) + + const rowSelection = useMemo(() => { + return { + onChange: (selectedRowKeys: Key[]) => { + setSelectedRowKeys(selectedRowKeys) + }, + } + }, []) + + const handleNavigation = useCallback( + (revisionId: string) => { + router.push({ + pathname: `/apps/${appId}/playground`, + query: { + revisions: JSON.stringify([revisionId]), + }, + }) + }, + [router, appId], + ) + + // --- Robust resizable grouped columns: width map by key --- + const [columnWidths, setColumnWidths] = useState>({}) + + // New handleResize: update width by column key + const handleResize = useCallback( + (colKey: string) => + (e: any, {size}: any) => { + setColumnWidths((widths) => ({ + ...widths, + [colKey]: size.width, + })) + }, + [], + ) + + // Utility to recursively make columns resizable using width map and column keys + const makeColumnsResizable = useCallback( + (cols: any, widths: any, handleResize: any) => { + return cols.map((col: any) => { + // Ensure every column has a unique key + const colKey = + col.key || col.dataIndex || col.title || Math.random().toString(36).slice(2) + if (col.children && col.children.length > 0) { + // Group column: recurse, but do not add onResize + return { + ...col, + key: colKey, + width: widths[colKey] || col.width || 240, + minWidth: col.minWidth || 120, + onHeaderCell: () => ({ + width: widths[colKey] || col.width || 240, + minWidth: col.minWidth || 120, + style: {textAlign: "center"}, + }), + children: makeColumnsResizable(col.children, widths, handleResize), + } + } else { + // Leaf column: make resizable + return { + ...col, + key: colKey, + width: widths[colKey] || Math.max(col.width || 160, 80), + onHeaderCell: () => ({ + width: widths[colKey] || Math.max(col.width ?? 160, 80), + minWidth: 80, + onResize: handleResize(colKey), + }), + } + } + }) + }, + [columnWidths, handleResize], + ) + + const columns: ColumnsType = useMemo(() => { + const baseCols = getColumns( + mergedEvaluations, + router, + handleNavigation, + setSelectedEvalRecord, + setIsDeleteEvalModalOpen, + runMetricsMap, + collapsedGroups, + toggleGroup, + classes, + ) + // Always create resizable columns from widths map + return makeColumnsResizable(baseCols, columnWidths, handleResize) + }, [ + mergedEvaluations, + router, + handleNavigation, + setSelectedEvalRecord, + setIsDeleteEvalModalOpen, + runMetricsMap, + collapsedGroups, + toggleGroup, + columnWidths, + ]) + + const containerRef = useRef(null) + const {height} = useResizeObserver({ + ref: containerRef as RefObject, + }) + + const dataSource = useMemo(() => { + return viewType === "overview" ? mergedEvaluations.slice(0, 5) : mergedEvaluations + }, [viewType, mergedEvaluations]) + + return ( +
    + + +
    +
    + } + // Debug: log when ResizableTitle renders and what props it gets + return ( + { + e.stopPropagation() + console.log("[ResizableTitle] Handle clicked", {width, ...restProps}) + }} + /> + } + onResize={(...args) => { + console.log("[ResizableTitle] onResize triggered", ...args) + if (onResize) onResize(...args) + }} + draggableOpts={{enableUserSelectHack: false}} + > + +
    + {restProps.children} + {/* The handle will be absolutely positioned by CSS */} +
    +
    { + return record.id || record.key + }} + className={clsx("ph-no-capture", "grow min-h-0", "eval-runs-table")} + columns={columns} + dataSource={dataSource} + scroll={{x: "max-content", y: height}} + sticky + tableLayout="fixed" + bordered + pagination={false} + loading={isLoadingPreview || isLoadingLegacy} + onRow={(record) => ({ + style: {cursor: "pointer"}, + onClick: () => + router.push( + `/apps/${appId}/evaluations/single_model_test/${"id" in record ? record.id : record.key}`, + ), + })} + /> + +
    +
    + ) +} + +export default memo(SingleModelEvaluation) diff --git a/web/ee/src/components/HumanEvaluations/assets/EvaluationStatusCell.tsx b/web/ee/src/components/HumanEvaluations/assets/EvaluationStatusCell.tsx new file mode 100644 index 0000000000..e88a3dd1ec --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/EvaluationStatusCell.tsx @@ -0,0 +1,51 @@ +import {memo, useEffect, useMemo} from "react" + +import {Tag, theme} from "antd" +import {mutate} from "swr" + +import useEvaluationRunScenarios, { + getEvaluationRunScenariosKey, +} from "@/oss/lib/hooks/useEvaluationRunScenarios" +import {EvaluationStatus} from "@/oss/lib/Types" + +import {statusMapper} from "../../pages/evaluations/cellRenderers/cellRenderers" + +import {extractEvaluationStatus} from "./utils" + +const EvaluationStatusCell = ({runId, status}: {runId: string; status?: EvaluationStatus}) => { + const swrData = useEvaluationRunScenarios(runId, undefined, { + syncAtom: false, + }) + const {token} = theme.useToken() + + // Force refetch once when component mounts (useful when returning from details page) + useEffect(() => { + const key = `${getEvaluationRunScenariosKey(runId)}-false` + mutate(key) + }, [runId]) + + const {runStatus, scenarios} = useMemo(() => { + return extractEvaluationStatus(swrData.data?.scenarios || [], status) + }, [status, token, swrData.data?.scenarios]) + + const completedStatuses = [EvaluationStatus.SUCCESS] + const {completedCount, totalCount} = useMemo(() => { + return { + completedCount: scenarios.filter((s) => + completedStatuses.includes(s.status as EvaluationStatus), + ).length, + totalCount: scenarios.length, + } + }, [scenarios]) + + return ( +
    + + {statusMapper(token)(runStatus).label} + +
    {`${completedCount} / ${totalCount}`}
    +
    + ) +} + +export default memo(EvaluationStatusCell) diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartAxis.tsx b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartAxis.tsx similarity index 100% rename from web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartAxis.tsx rename to web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartAxis.tsx diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartFrame.tsx b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartFrame.tsx similarity index 100% rename from web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartFrame.tsx rename to web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ChartFrame.tsx diff --git a/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveFrequencyChart.tsx b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveFrequencyChart.tsx new file mode 100644 index 0000000000..fe6b941fe0 --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveFrequencyChart.tsx @@ -0,0 +1,266 @@ +import {type FC, memo, useState} from "react" + +import {ChartAxis} from "./ChartAxis" +import ChartFrame from "./ChartFrame" +import {getYTicks} from "./chartUtils" + +interface FrequencyDatum { + label: string | number + count: number +} + +interface ResponsiveFrequencyChartProps { + data: FrequencyDatum[] + highlightValues?: (string | number)[] + labelWidth?: number +} + +/** + * ResponsiveFrequencyChart renders a vertical bar chart for categorical/frequency data. + * Bars to highlight are inferred automatically from highlightValues (if provided). + */ +const ResponsiveFrequencyChart: FC = memo( + ({data, highlightValues = [], labelWidth}) => { + const xMax = Math.max(...data.map((d) => d.count), 1) + const yCount = data.length + const xTicks = getYTicks(xMax) + const yLabels = data.map((d) => d.label) + + // Tooltip state + const [hoveredBar, setHoveredBar] = useState(null) + const [mousePos, setMousePos] = useState<{x: number; y: number} | null>(null) + + // Dynamically calculate left margin for long y-labels + const longestLabelLength = yLabels.reduce( + (max: number, label) => Math.max(max, String(label).length), + 0, + ) + // Estimate width: 7px per character + 16px buffer + const dynamicLeftMargin = Math.max(40, Math.min(120, longestLabelLength * 7 + 16)) + // Use local default margin as base + const defaultMargin = {top: 16, right: 16, bottom: 32, left: 40} + const dynamicMargin = {...defaultMargin, left: dynamicLeftMargin} + + // Calculate maxCount and maxCountOccurrences once + const countMap = data.map((d) => d.count) + const maxCount = Math.max(...countMap) + const maxCountOccurrences = countMap.filter((count) => count === maxCount).length + // Store maxCount for later use in rendering + const uniqueMaxCount = maxCountOccurrences === 1 ? maxCount : null + + // Compute highlighted bar indices from highlightValues + const computedHighlightBarIndices = + highlightValues.length > 0 + ? data + .map((d, i) => + highlightValues.some((hv) => String(hv) === String(d.label)) ? i : -1, + ) + .filter((i) => i !== -1) + : [] + + return ( + + {({svgWidth, svgHeight, plotWidth, plotHeight, margin}) => { + // Scales for vertical bar chart + const yLabelScale = (idx: number) => (idx + 0.5) * (plotHeight / yCount) + const barHeight = plotHeight / yCount - 6 + const xScale = (count: number) => (count / xMax) * plotWidth + return ( + <> + + {/* Bar gradient */} + + {/* Gradient for true state */} + + + + + + {/* Gradient for false state */} + + + + + {/* Gradient for most count state */} + + + + + + {/* X Grid lines */} + + {xTicks.map((tick) => ( + + ))} + + {/* Highlighted value lines */} + + {highlightValues.map((val, i) => { + // Find closest bar index for value (if label is numeric) + const idx = data.findIndex( + (d) => typeof d.label === "number" && d.label === val, + ) + if (idx === -1) return null + return ( + + ) + })} + + {/* Bars */} + + {data.map((d, idx) => { + const isHighlighted = + computedHighlightBarIndices.includes(idx) + const isMaxUnique = + uniqueMaxCount !== null && d.count === uniqueMaxCount + + return ( + { + setHoveredBar(idx) + const svgRect = ( + e.target as SVGRectElement + ).ownerSVGElement?.getBoundingClientRect() + setMousePos({ + x: e.clientX - (svgRect?.left ?? 0), + y: e.clientY - (svgRect?.top ?? 0), + }) + }} + onMouseMove={(e) => { + const svgRect = ( + e.target as SVGRectElement + ).ownerSVGElement?.getBoundingClientRect() + setMousePos({ + x: e.clientX - (svgRect?.left ?? 0), + y: e.clientY - (svgRect?.top ?? 0), + }) + }} + onMouseLeave={() => { + setHoveredBar(null) + setMousePos(null) + }} + /> + ) + })} + + {/* Axes */} + xScale(xTicks[_idx])} + yScale={() => 0} // not used for categorical y + /> + + {/* Tooltip rendered outside SVG, absolutely positioned */} + {hoveredBar !== null && data[hoveredBar] && mousePos && ( +
    + {/* Caret */} +
    +
    + Label: + {String(data[hoveredBar].label)} +
    +
    + Count: + {data[hoveredBar].count} +
    +
    + )} + + ) + }} + + ) + }, +) + +export default ResponsiveFrequencyChart diff --git a/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart.tsx b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart.tsx new file mode 100644 index 0000000000..a6846ec7d6 --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart.tsx @@ -0,0 +1,383 @@ +import {type FC, memo, useState} from "react" + +import type {ChartDatum} from "../types" + +import {ChartAxis} from "./ChartAxis" +import ChartFrame from "./ChartFrame" +import {format3Sig} from "./utils" + +interface ResponsiveMetricChartProps { + chartData: ChartDatum[] + extraDimensions: Record + highlightValue?: number + labelWidth?: number +} + +/** + * ResponsiveMetricChart is a functional component that renders a responsive histogram + * visualization using SVG. This chart displays data as bars with optional highlighted + * bins, reference lines, and tooltips for detailed information. The chart adapts to + * its container's size and provides scale functions for accurately positioning elements. + */ +/** + * ResponsiveMetricChart is a functional component that renders a responsive histogram + * visualization using SVG. This chart displays data as bars with optional highlighted + * bins, reference lines, and tooltips for detailed information. The chart adapts to + * its container's size and provides scale functions for accurately positioning elements. + * + * The highlighted bin is automatically inferred from highlightValue (if provided). + */ +const ResponsiveMetricChart: FC = memo( + ({chartData, extraDimensions, highlightValue, labelWidth}) => { + const binSize = extraDimensions.binSize || 1 + const yMin = Math.min(...(chartData.map((d) => d.edge) as number[])) + const yMax = Math.max(...(chartData.map((d) => d.edge) as number[])) + binSize + const xMax = Math.max(...chartData.map((d) => d.value)) + + // Y axis: bin midpoints + const yTicks: number[] = chartData.map((d) => (d.edge ?? 0) + binSize / 2) + // X axis: value ticks + const xTicks: number[] = [] + const xTickCount = Math.min(4, xMax) + for (let i = 0; i <= xTickCount; i++) { + xTicks.push((i / xTickCount) * xMax) + } + + const clipPathId = `clip-histogram-${Math.random().toString(36).substr(2, 9)}` + // Tooltip state + const [hoveredBin, setHoveredBin] = useState(null) + const [mousePos, setMousePos] = useState<{x: number; y: number} | null>(null) + + // Compute highlighted bin index from highlightValue + let computedHighlightBinIndex: number | null = null + if (typeof highlightValue === "number" && chartData.length > 0) { + const roundTo = (n: number, digits: number) => { + const factor = Math.pow(10, digits) + return Math.round(n * factor) / factor + } + const DECIMALS = 6 + computedHighlightBinIndex = chartData.findIndex((d, i) => { + const binStart = d.edge ?? 0 + const binEnd = (d.edge ?? 0) + binSize + if (i === chartData.length - 1) { + // Last bin: inclusive of upper edge, round both values for robust comparison + const closeEnough = Math.abs(highlightValue - binEnd) < Math.pow(10, -DECIMALS) + return ( + roundTo(highlightValue, DECIMALS) >= roundTo(binStart, DECIMALS) && + (roundTo(highlightValue, DECIMALS) <= roundTo(binEnd, DECIMALS) || + closeEnough) + ) + } + // Other bins: upper edge exclusive, round for robust comparison + return ( + roundTo(highlightValue, DECIMALS) >= roundTo(binStart, DECIMALS) && + roundTo(highlightValue, DECIMALS) < roundTo(binEnd, DECIMALS) + ) + }) + if (computedHighlightBinIndex === -1) computedHighlightBinIndex = null + } + + // Dynamically calculate left margin for long y-labels + const yLabelsFormatted = yTicks.map(format3Sig) + const longestLabelLength = yLabelsFormatted.reduce( + (max, label) => Math.max(max, String(label).length), + 0, + ) + // Estimate width: 7px per character + 16px buffer + const dynamicLeftMargin = Math.max(40, Math.min(120, longestLabelLength * 7 + 16)) + const defaultMargin = {top: 16, right: 16, bottom: 32, left: 40} + const dynamicMargin = {...defaultMargin, left: dynamicLeftMargin} + + return ( +
    + + {({svgWidth, svgHeight, plotWidth, plotHeight, margin}) => { + // Scales + const xScale = (value: number) => (value / xMax) * plotWidth + const yScale = (value: number) => + ((yMax - value) / (yMax - yMin)) * plotHeight + return ( + <> + + {/* Bar gradient */} + + + + + + + {/* Bin size overlay */} + {typeof extraDimensions.binSize === "number" && ( + + bin {format3Sig(extraDimensions.binSize)} + + )} + {/* Grid lines */} + + {yTicks.map((tick) => ( + + ))} + + {/* Histogram bars */} + + {chartData.map((d, idx) => { + const barTop = margin.top + yScale(d.edge + binSize) + const barBottom = margin.top + yScale(d.edge as number) + const barHeight = Math.abs(barBottom - barTop) + const rawBarWidth = xScale(d.value) + const barWidth = Math.min(rawBarWidth, plotWidth) + const isHighlighted = idx === computedHighlightBinIndex + return ( + + + {/* Tooltip trigger area - spans full width for easier hovering */} + { + setHoveredBin(idx) + // SVG event coordinates to container-relative + const svgRect = ( + e.target as SVGRectElement + ).ownerSVGElement?.getBoundingClientRect() + setMousePos({ + x: e.clientX - (svgRect?.left ?? 0), + y: e.clientY - (svgRect?.top ?? 0), + }) + }} + onMouseMove={(e) => { + const svgRect = ( + e.target as SVGRectElement + ).ownerSVGElement?.getBoundingClientRect() + setMousePos({ + x: e.clientX - (svgRect?.left ?? 0), + y: e.clientY - (svgRect?.top ?? 0), + }) + }} + onMouseLeave={() => { + setHoveredBin(null) + setMousePos(null) + }} + /> + + ) + })} + + {/* Reference lines */} + {typeof extraDimensions.mean === "number" && ( + + + + {`μ=${format3Sig(extraDimensions.mean)}`} + + + )} + {typeof highlightValue === "number" && + highlightValue !== extraDimensions.mean && ( + + + {/* White outline for label */} + + {format3Sig(highlightValue)} + + {/* Foreground green label */} + + {format3Sig(highlightValue)} + + + )} + {/* Y-axis */} + + + + {/* X/Y Axes */} + {/* + y-axis: categorical labels (formatted bin midpoints) + const yLabels = yTicks.map(format3Sig) + const yLabelScale = (idx: number) => ((yTicks.length - idx - 0.5) * (plotHeight / yTicks.length)) + */} + + (yTicks.length - idx - 0.5) * + (plotHeight / yTicks.length) + } + /> + + {/* Tooltip rendered outside SVG, absolutely positioned */} + {hoveredBin !== null && + chartData[hoveredBin] && + mousePos && + (() => { + const total = chartData.reduce((sum, d) => sum + d.value, 0) + const count = chartData[hoveredBin].value + const percent = total > 0 ? (count / total) * 100 : 0 + const isHighlighted = + hoveredBin === computedHighlightBinIndex + return ( +
    + {/* Caret */} +
    +
    + Range: + + {format3Sig( + chartData[hoveredBin].edge as number, + )} + – + {format3Sig( + chartData[hoveredBin].edge + binSize, + )} + + {isHighlighted && ( + + Highlighted + + )} +
    +
    + Count:{" "} + {count} + + ({percent.toFixed(1)}%) + +
    +
    + ) + })()} + + ) + }} + +
    + ) + }, +) + +export default ResponsiveMetricChart diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/chartUtils.ts b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/chartUtils.ts similarity index 100% rename from web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/chartUtils.ts rename to web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/chartUtils.ts diff --git a/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils.ts b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils.ts new file mode 100644 index 0000000000..606079614e --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils.ts @@ -0,0 +1,165 @@ +import {ChartDatum, MetricFormatter} from "../types" + +/** + * Transforms the input data into an array of ChartDatum objects for chart rendering. + * - If `extra.distribution` is an array of numbers, returns them as ChartDatum with indices as names. + * - If `extra.distribution` is an array of objects, filters and maps them to ChartDatum based on `count` or `value`. + * - If `extra.percentiles` is an object, converts its entries to ChartDatum. + * - If `extra.iqrs` is an object, converts its entries to ChartDatum. + * + * @param {Record} extra - The input data containing distribution, percentiles, or iqrs. + * @returns {ChartDatum[]} An array of ChartDatum objects for use in charts. + */ +export const buildChartData = (extra: Record): ChartDatum[] => { + // distribution could be array of objects or numbers + // 1️⃣ Numeric histogram or object counts ------------------------------------ + if (Array.isArray(extra.distribution)) { + let data: ChartDatum[] = [] + if (extra.distribution.every((d) => typeof d === "number")) { + // If binSize & min are provided, label bins as ranges e.g. "0–0.1" + if (typeof extra.binSize === "number" && typeof extra.min === "number") { + data = extra.distribution.map((v: number, idx: number) => { + const minNum = Number(extra.min) + const start = minNum + idx * extra.binSize + const end = start + extra.binSize + return { + name: `${format3Sig(start)}–${format3Sig(end)}`, + value: v, + edge: start, // Changed from end to start + } + }) + } else { + data = extra.distribution.map((v: number, idx: number) => ({ + name: String(idx), + value: v, + })) + } + } else if (extra.distribution.every((d) => typeof d === "object" && d != null)) { + if (extra.distribution.every((d: any) => typeof d.value === "number")) { + // If binSize & min are provided, label bins as ranges e.g. "0–0.1" + if (typeof extra.binSize === "number" && typeof extra.min === "number") { + data = extra.distribution.map((d: any, idx: number) => { + const minNum = Number(extra.min) + const start = minNum + idx * extra.binSize + const end = start + extra.binSize + + return { + name: `${format3Sig(start)}–${format3Sig(end)}`, + value: d.count ?? d.value ?? 0, + edge: start, + } + }) + } else { + data = extra.distribution.map((d: any) => ({ + name: String(d.value), + value: d.count ?? d.value ?? 0, + })) + } + } else { + data = extra.distribution + .filter((d: any) => (d.count ?? d.value ?? 0) > 0) + .map((d: any, idx: number) => ({ + name: + typeof d.value === "number" + ? Number(d.value).toPrecision(3) + : String(idx), + value: Number(d.count ?? d.value ?? 0), + })) + } + } + // If we only have a single point, add a zero baseline to avoid Recharts/decimal.js errors + if (data.length === 1) { + data = [{name: "", value: 0}, ...data] + } + return data + } + + // 2️⃣ Categorical metrics: use frequency (all labels) falling back to rank --- + const catArray = Array.isArray(extra.frequency) + ? extra.frequency + : Array.isArray(extra.rank) + ? extra.rank + : null + if (Array.isArray(catArray)) { + const sorted = [...catArray].sort((a: any, b: any) => (b.count ?? 0) - (a.count ?? 0)) + return sorted.map((d: any) => ({name: String(d.value), value: Number(d.count ?? 0)})) + } + + // 3️⃣ Percentiles / IQRs ---------------------------------------------------- + if (extra.percentiles && typeof extra.percentiles === "object") { + return Object.entries(extra.percentiles).map(([k, v]) => ({name: k, value: Number(v)})) + } + if (extra.iqrs && typeof extra.iqrs === "object") { + return Object.entries(extra.iqrs).map(([k, v]) => ({name: k, value: Number(v)})) + } + return [] +} + +/** + * Registry mapping metric keys (full string match or RegExp string) to a formatter. + * Extend this map according to your metric naming conventions. + */ +export const METRIC_FORMATTERS: Record = { + // currency-like costs + cost: {prefix: "$", decimals: 6}, + price: {prefix: "$", decimals: 4}, + totalCost: {prefix: "$", decimals: 4}, + // latency + latency: {decimals: 2, suffix: "s", multiplier: 0.001}, + duration: {decimals: 2, suffix: "s", multiplier: 0.001}, + "duration.total": {decimals: 2, suffix: "s", multiplier: 0.001}, + + // percentages + accuracy: {suffix: "%", decimals: 2}, + recall: {suffix: "%", decimals: 2}, + precision: {suffix: "%", decimals: 2}, +} + +export const format3Sig = (num: number | string): string => { + if (typeof num !== "number") return String(num) + if (!Number.isFinite(num)) return String(num) + + const abs = Math.abs(num) + if (abs === 0) return "0" + + const exponent = Math.floor(Math.log10(abs)) + + // Use scientific notation if exponent >= 10 or <= -10 + if (exponent >= 10 || exponent <= -10) { + return num.toExponential(2) + } + + // Use fixed-point notation with 3 significant digits + const decimals = Math.max(0, 2 - exponent) + const fixed = num.toFixed(decimals) + + // Strip trailing zeros and possible trailing decimal point + return fixed.replace(/\.?0+$/, "") +} + +/** + * Format a metric value using the mapping above. + * Falls back to the raw value when the metric has no formatter or value is non-numeric. + */ +export function formatMetricValue(metricKey: string, value: number | string): string { + const fmt = METRIC_FORMATTERS[metricKey] || { + decimals: 2, + } + + if (Array.isArray(value)) { + return value.map((v) => { + return formatMetricValue(metricKey, v) + }) + } + if (!fmt) return String(value) + + if (fmt.format) { + return fmt.format(value) + } + + let num = typeof value === "number" ? value : Number(value) + num = fmt.multiplier ? num * fmt.multiplier : num + const rounded = + Number.isFinite(num) && fmt.decimals !== undefined ? format3Sig(num) : format3Sig(value) + return `${fmt.prefix ?? ""}${rounded}${fmt.suffix ?? ""}` +} diff --git a/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/index.tsx b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/index.tsx new file mode 100644 index 0000000000..46f9cf6729 --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/index.tsx @@ -0,0 +1,391 @@ +import {memo, useCallback, useMemo, useState, type FC} from "react" + +import {Popover, Tag, Space} from "antd" +import clsx from "clsx" +import deepEqual from "fast-deep-equal" +import {useAtomValue} from "jotai" +import {selectAtom} from "jotai/utils" + +import {Expandable} from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents" +import {runMetricsStatsCacheAtom} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache" +import {extractPrimitive, inferMetricType, SchemaMetricType} from "@/oss/lib/metricUtils" + +import ResponsiveFrequencyChart from "./assets/ResponsiveFrequencyChart" +import ResponsiveMetricChart from "./assets/ResponsiveMetricChart" +import {buildChartData, format3Sig, formatMetricValue} from "./assets/utils" +import {MetricDetailsPopoverProps} from "./types" + +/** + * MetricDetailsPopover is a React functional component that provides a detailed view + * of metric information within a popover. It displays both a tabular representation + * of primitive metric entries and a chart visualization based on the provided metric + * data. The component determines the appropriate chart type dynamically and supports + * categorical and continuous data representations. + * + * Props: + * - metricKey: The key associated with the metric being displayed. + * - extraDimensions: Additional dimensions or metadata for the metric. + * - highlightValue: Optional value for highlighting in the chart. + * - hidePrimitiveTable: Boolean flag to toggle the visibility of the primitive table. + * - children: ReactNode elements to be rendered inside the popover trigger. + */ +const MetricDetailsPopover: FC = memo( + ({ + metricKey, + metricType, + extraDimensions, + highlightValue, + hidePrimitiveTable, + children, + className, + }) => { + const [open, setOpen] = useState(false) + const handleOpenChange = useCallback((v: boolean) => setOpen(v), []) + + const extraEntries = useMemo(() => Object.entries(extraDimensions), [extraDimensions]) + + const chartData = useMemo( + () => (open ? buildChartData(extraDimensions) : []), + [open, extraDimensions], + ) + + // Dynamically compute the pixel width required for Y-axis labels + const labelWidth = useMemo(() => { + if (!chartData.length) return 0 + const canvas = document.createElement("canvas") + const ctx = canvas.getContext("2d") + if (!ctx) return 0 + ctx.font = "10px Inter, sans-serif" // must match tick font + const max = Math.max(...chartData.map((d) => ctx.measureText(String(d.name)).width)) + return Math.ceil(max) + 8 // + padding + }, [chartData]) + + const primitiveEntries = useMemo(() => { + if (!open || hidePrimitiveTable) return [] + // const order = ["mean", "std", "min", "max", "count", "total", "binSize"] + const order = ["mean", "std", "min", "max", "count", "sum", "binSize", "unique", "rank"] + const allowed = new Set(order) + const _primitiveEntries = extraEntries + .filter(([k]) => allowed.has(k as string)) + .sort(([a], [b]) => { + const ia = order.indexOf(a as string) + const ib = order.indexOf(b as string) + const sa = ia === -1 ? Number.POSITIVE_INFINITY : ia + const sb = ib === -1 ? Number.POSITIVE_INFINITY : ib + + return sa - sb || (a as string).localeCompare(b as string) + }) + return _primitiveEntries + }, [open, hidePrimitiveTable, extraEntries]) + + const tableNode = useMemo(() => { + if (!primitiveEntries.length) return null + + return ( +
    + + {primitiveEntries.map(([k, v]) => ( + + + + + ))} + +
    {k} + {(() => { + if (Array.isArray(v)) { + const limit = 5 + if (k === "unique") { + const items = (v as any[]).slice(0, limit) + return ( +
    + {items.map((itm, idx) => ( + + {String(itm)} + + ))} + {v.length > limit && ( + + … + + )} +
    + ) + } + if ((k === "rank" || k === "frequency") && v.length) { + const items = (v as any[]).slice(0, limit) + return ( +
    + {items.map((o: any, idx) => ( + {`${o.value} (${o.count})`} + ))} + {v.length > limit && ( + + … + + )} +
    + ) + } + } + return formatMetricValue(metricKey, v as any) + })()} +
    + ) + }, [primitiveEntries, metricKey]) + + // Chart type logic + const isCategoricalChart = + Array.isArray(extraDimensions.distribution) || + Array.isArray(extraDimensions.rank) || + Array.isArray(extraDimensions.frequency) + const hasEdge = + chartData.length > 0 && Object.prototype.hasOwnProperty.call(chartData[0], "edge") + + const frequencyData = useMemo(() => { + // Only build for categorical/frequency charts without edge + if (isCategoricalChart && !hasEdge) { + // buildChartData returns [{ name, value }] but ResponsiveFrequencyChart expects [{ label, count }] + return buildChartData(extraDimensions).map((d) => ({ + label: d.name, + count: d.value, + })) + } + return [] + }, [extraDimensions, isCategoricalChart, hasEdge]) + + const chartNode = useMemo(() => { + if (!open) return null + // Histogram (hasEdge): use ResponsiveMetricChart + if (chartData.length > 0 && isCategoricalChart && hasEdge) { + return ( + + ) + } + // Frequency/categorical: use ResponsiveFrequencyChart + if (frequencyData.length > 0 && isCategoricalChart && !hasEdge) { + return ( + + ) + } + // No valid chart type available + return null + }, [chartData, isCategoricalChart, hasEdge, labelWidth, highlightValue, extraDimensions]) + + const content = useMemo( + () => ( +
    + {tableNode} + {chartNode} +
    + ), + [tableNode, chartNode], + ) + if (!extraEntries.length || metricType === "string") { + return <>{children} + } + + return ( +
    + + {children} + +
    + ) + }, +) + +MetricDetailsPopover.displayName = "MetricDetailsPopover" + +/** + * A wrapper component around MetricDetailsPopover that: + * - fetches run metrics using useEvaluationRunMetrics + * - computes a summary of the metric + * - passes the extra dimensions to the MetricDetailsPopover + * - conditionally renders the MetricDetailsPopover if the metric is not null + * + * @param scenarioId - the scenario ID + * @param runId - the run ID + * @param evaluatorSlug - the evaluator slug + * @param evaluatorMetricKey - the metric key + * @param hidePrimitiveTable - whether to hide the primitive table + * @param metricType - the type of the metric (optional) + */ +export const MetricDetailsPopoverWrapper = memo( + ({ + scenarioId, + runId, + evaluatorSlug, + evaluatorMetricKey, + hidePrimitiveTable = false, + metricType, + className, + statsOverride, + debug, + evaluator, + }: { + scenarioId?: string | null + runId: string + evaluatorSlug: string + evaluatorMetricKey: string + hidePrimitiveTable?: boolean + metricType?: string + evaluator?: EvaluatorDto + className?: string + statsOverride?: Record + debug?: boolean + }) => { + const metricKey = useMemo( + () => `${evaluatorSlug}.${evaluatorMetricKey}`, + [evaluatorSlug, evaluatorMetricKey], + ) + + const statsAtom = useMemo( + () => + selectAtom( + runMetricsStatsCacheAtom, + (map) => map.get(runId)?.[metricKey], + deepEqual, + ), + [metricKey, runId], + ) + const statsFromAtom = useAtomValue(statsAtom) as Record | undefined + const stats = statsOverride ?? statsFromAtom + + const rawPrimitive = useMemo(() => extractPrimitive(stats), [stats]) + + const explicitTypeFromEvaluator = useMemo(() => { + return ( + evaluator?.metrics?.[evaluatorMetricKey]?.type || + evaluator?.metrics?.[evaluatorMetricKey]?.anyOf + ) + // as SchemaMetricType | undefined + }, [evaluator, evaluatorMetricKey]) + const resolvedMetricType = useMemo( + () => explicitTypeFromEvaluator ?? inferMetricType(rawPrimitive, metricType), + [explicitTypeFromEvaluator, rawPrimitive, metricType], + ) + + const summary = useMemo(() => { + if (!stats) return "N/A" + // Numeric metrics → mean + if (typeof (stats as any).mean === "number") { + return format3Sig(Number((stats as any).mean)) + } + // Boolean metrics → proportion of `true` + if (resolvedMetricType === "boolean" && Array.isArray((stats as any).frequency)) { + const trueEntry = (stats as any).frequency.find((f: any) => f.value === true) + const total = (stats as any).count ?? 0 + if (total) { + return ( +
    +
    +
    +
    + true + false +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + {(((trueEntry?.count ?? 0) / total) * 100).toFixed(2)} +
    +
    + ) + } + } + // Array metrics → show top 3 items + if (resolvedMetricType === "array" || resolvedMetricType === undefined) { + const items = + Array.isArray((stats as any).rank) && (stats as any).rank.length + ? (stats as any).rank + : Array.isArray((stats as any).unique) + ? (stats as any).unique.map((v: any) => ({value: v, count: undefined})) + : [] + const topItems = items.slice(0, 3) + return ( + + {topItems.map((it: any) => ( + + {String(it.value)} + {it.count !== undefined ? ` (${it.count})` : ""} + + ))} + + ) + } + // Categorical metrics → top rank + if (Array.isArray((stats as any).rank) && (stats as any).rank.length) { + const top = (stats as any).rank[0] + return `${top.value} (${top.count})` + } + if (Array.isArray((stats as any).unique) && (stats as any).unique.length) { + return `${(stats as any).unique.length} unique` + } + if (typeof (stats as any).count === "number") { + return (stats as any).count + } + return "–" + }, [stats, resolvedMetricType]) + + return stats ? ( + + {summary} + + ) : ( + "N/A" + ) + }, +) + +export default MetricDetailsPopover diff --git a/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/types.ts b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/types.ts new file mode 100644 index 0000000000..1d06b45a69 --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/MetricDetailsPopover/types.ts @@ -0,0 +1,36 @@ +import type {ReactNode} from "react" + +export interface MetricDetailsPopoverProps { + metricKey: string + primaryLabel?: string + primaryValue?: number | string + extraDimensions: Record + /** Value to highlight (bin/bar will be inferred from this value) */ + highlightValue?: number | string + /** Hide primitives key‒value table; useful for lightweight popovers */ + hidePrimitiveTable?: boolean + /** Force using edge-axis (for debugging) */ + hasEdge?: boolean + className?: string + children: ReactNode +} + +// helper to transform objects to chart data +export interface ChartDatum { + name: string | number + value: number + edge?: number +} + +export interface MetricFormatter { + /** String to prepend before the numeric value, e.g. "$" */ + prefix?: string + /** String to append after the numeric value, e.g. "%" */ + suffix?: string + /** Number of decimal places to round to. If undefined, value is not rounded */ + decimals?: number + /** Multiplier to apply before formatting */ + multiplier?: number + /** Optional custom formatter receives numeric value and returns formatted string */ + format?: (value: number | string) => string +} diff --git a/web/ee/src/components/HumanEvaluations/assets/SingleModelEvaluationHeader/index.tsx b/web/ee/src/components/HumanEvaluations/assets/SingleModelEvaluationHeader/index.tsx new file mode 100644 index 0000000000..155a4d95bf --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/SingleModelEvaluationHeader/index.tsx @@ -0,0 +1,292 @@ +import {useCallback, useEffect, useMemo, useState} from "react" + +import {Export, Plus, Trash} from "@phosphor-icons/react" +import {Button, message, Space, Typography} from "antd" +import clsx from "clsx" +import dynamic from "next/dynamic" +import {useSWRConfig} from "swr" + +import {statusMapper} from "@/oss/components/pages/evaluations/cellRenderers/cellRenderers" +import {getAppValues} from "@/oss/contexts/app.context" +import {useAppId} from "@/oss/hooks/useAppId" +import {EvaluationType} from "@/oss/lib/enums" +import {calculateAvgScore} from "@/oss/lib/helpers/evaluate" +import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" +import {getEvaluationRunScenariosKey} from "@/oss/lib/hooks/useEvaluationRunScenarios" +import useEvaluations from "@/oss/lib/hooks/useEvaluations" +import {summarizeMetric} from "@/oss/lib/metricUtils" +import {EvaluationStatus} from "@/oss/lib/Types" + +import {SingleModelEvaluationHeaderProps} from "../../types" +import {useStyles} from "../styles" +import {extractEvaluationStatus, getMetricSummaryValue} from "../utils" + +const NewEvaluationModal = dynamic(() => import("../../../pages/evaluations/NewEvaluation"), { + ssr: false, +}) +const DeleteEvaluationModal = dynamic( + () => import("@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal"), + { + ssr: false, + }, +) + +const SingleModelEvaluationHeader = ({ + viewType, + selectedRowKeys, + mergedEvaluations, + runMetricsMap, + setSelectedRowKeys, + isDeleteEvalModalOpen, + setIsDeleteEvalModalOpen, + selectedEvalRecord, +}: SingleModelEvaluationHeaderProps) => { + const classes = useStyles() + const appId = useAppId() + const {cache} = useSWRConfig() + const {refetch, handleDeleteEvaluations: deleteEvaluations} = useEvaluations({ + withPreview: true, + types: [EvaluationType.single_model_test], + }) + + const [isEvalModalOpen, setIsEvalModalOpen] = useState(false) + const [isDeletingEvaluations, setIsDeletingEvaluations] = useState(false) + const [isScrolled, setIsScrolled] = useState(false) + + useEffect(() => { + if (viewType === "overview") return + + const handleScroll = () => { + setIsScrolled(window.scrollY > 180) + } + + window.addEventListener("scroll", handleScroll) + + return () => { + window.removeEventListener("scroll", handleScroll) + } + }, [viewType]) + + const selectedEvaluations = useMemo(() => { + return selectedEvalRecord + ? (() => { + const found = mergedEvaluations.find( + (e) => ("id" in e ? e.id : e.key) === selectedEvalRecord?.id, + ) + return found && "name" in found ? found.name : (found?.key ?? "") + })() + : mergedEvaluations + .filter((e) => selectedRowKeys.includes("id" in e ? e.id : e.key)) + .map((e) => ("name" in e ? e.name : e.key)) + .join(" | ") + }, [selectedEvalRecord, selectedRowKeys]) + + const handleDelete = useCallback( + async (ids: string[]) => { + setIsDeletingEvaluations(true) + try { + await deleteEvaluations(ids) + message.success( + ids.length > 1 ? `${ids.length} Evaluations Deleted` : "Evaluation Deleted", + ) + } catch (err) { + message.error("Failed to delete evaluations") + console.error(err) + } finally { + setIsDeletingEvaluations(false) + setIsDeleteEvalModalOpen(false) + setSelectedRowKeys([]) + } + }, + [deleteEvaluations], + ) + + const runStatus = useCallback( + (runId: string, status: EvaluationStatus, isLegacyEval: boolean) => { + if (isLegacyEval) { + const statusLabel = statusMapper({} as any)(status as EvaluationStatus) + .label as EvaluationStatus + return statusLabel + } + + const key = `${getEvaluationRunScenariosKey(runId)}-false` + const cachedData = cache.get(key) + const scenarios = cachedData?.data?.scenarios + + const {runStatus: _status} = extractEvaluationStatus(scenarios, status) + return _status == "success" ? "completed" : _status + }, + [cache], + ) + + const onExport = useCallback(() => { + const exportEvals = mergedEvaluations.filter((e) => + selectedRowKeys.some((selected) => selected === ("id" in e ? e.id : e.key)), + ) + + try { + if (exportEvals.length) { + const {currentApp} = getAppValues() + const filename = `${currentApp?.app_name}_human_annotation.csv` + + const rows = exportEvals.map((item) => { + const id = "id" in item ? item.id : item.key + const metrics = runMetricsMap?.[id] + + // Note: all the 'in' conditions here are for legacy eval + const row: Record = { + Name: "name" in item ? item.name : item.key, + Variant: `${item.variants?.[0]?.variantName} v${"revisions" in item ? item.revisions?.[0] : item.variants?.[0]?.revision}`, + "Test set": + "testset" in item + ? item.testset.name + : (item.testsets?.[0]?.name ?? ""), + Status: + runStatus(id, item.status, item.status.includes("EVALUATION")) || "", + // legacy eval + ...("resultsData" in item + ? {"Average score": `${calculateAvgScore(item) || 0}%`} + : {}), + ...((item as any).createdBy?.user?.username + ? {"Created by": (item as any).createdBy?.user?.username} + : {}), + "Created on": item.createdAt, + } + + // Track metric keys consumed by evaluator loop so we don't duplicate + const consumedKeys = new Set() + + if ("evaluators" in item && Array.isArray(item.evaluators)) { + item.evaluators.forEach((ev: any) => { + const metricDefs = + ev.data?.service?.format?.properties?.outputs?.properties || {} + Object.entries(metricDefs).forEach( + ([metricKey, def]: [string, any]) => { + const fullKey = `${ev.slug}.${metricKey}` + consumedKeys.add(fullKey) + const stat = metrics?.[fullKey] + const value = summarizeMetric(stat, def?.type) + row[`${ev.name} ${metricKey}`] = + value !== undefined && value !== null ? value : "N/A" + }, + ) + }) + } + + if (metrics) { + Object.entries(metrics).forEach(([metricKey, stat]) => { + if (consumedKeys.has(metricKey)) return + const value = summarizeMetric(stat as any) + row[metricKey] = value !== undefined && value !== null ? value : "N/A" + }) + } + + return row + }) + + const headerSet = new Set() + rows.forEach((r) => Object.keys(r).forEach((h) => headerSet.add(h))) + const headers = Array.from(headerSet) + + const csvData = convertToCsv(rows, headers) + downloadCsv(csvData, filename) + setSelectedRowKeys([]) + } + } catch (error) { + message.error("Failed to export results. Please try again later") + } + }, [mergedEvaluations, selectedRowKeys, runMetricsMap]) + + return ( + <> + {viewType === "overview" ? ( +
    + + Human Annotation + + + + + +
    + ) : ( +
    + + + + + + +
    + )} + + { + setIsEvalModalOpen(false) + }} + onSuccess={() => { + setIsEvalModalOpen(false) + refetch() + }} + preview={true} + evaluationType={"human"} + /> + + setIsDeleteEvalModalOpen(false)} + onOk={async () => { + const idsToDelete = selectedEvalRecord + ? [selectedEvalRecord.id] + : selectedRowKeys.map((key) => key?.toString()) + await handleDelete(idsToDelete.filter(Boolean)) + }} + evaluationType={selectedEvaluations} + isMultiple={!selectedEvalRecord && selectedRowKeys.length > 0} + /> + + ) +} + +export default SingleModelEvaluationHeader diff --git a/web/oss/src/components/HumanEvaluations/assets/styles.ts b/web/ee/src/components/HumanEvaluations/assets/styles.ts similarity index 100% rename from web/oss/src/components/HumanEvaluations/assets/styles.ts rename to web/ee/src/components/HumanEvaluations/assets/styles.ts diff --git a/web/ee/src/components/HumanEvaluations/assets/utils.tsx b/web/ee/src/components/HumanEvaluations/assets/utils.tsx new file mode 100644 index 0000000000..6373b91325 --- /dev/null +++ b/web/ee/src/components/HumanEvaluations/assets/utils.tsx @@ -0,0 +1,502 @@ +import type {Dispatch, SetStateAction} from "react" + +import {MoreOutlined, RightOutlined, DownOutlined} from "@ant-design/icons" +import {Database, GearSix, Note, Rocket, Trash} from "@phosphor-icons/react" +import {Button, Dropdown, Statistic} from "antd" +import {ColumnsType} from "antd/es/table" +import uniqBy from "lodash/uniqBy" +import {NextRouter} from "next/router" + +import {getAppValues} from "@/oss/contexts/app.context" +import {calculateAvgScore} from "@/oss/lib/helpers/evaluate" +import {IScenario} from "@/oss/lib/hooks/useEvaluationRunScenarios/types" +import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" +import {buildEvaluatorMetricColumns} from "@/oss/lib/metricColumnFactory" +import {getMetricConfig, metricPriority} from "@/oss/lib/metrics/utils" +import {summarizeMetric} from "@/oss/lib/metricUtils" +import {EvaluationStatus} from "@/oss/lib/Types" +import {BasicStats} from "@/oss/services/runMetrics/api/types" + +import UserAvatarTag from "@agenta/oss/src/components/ui/UserAvatarTag" +import VariantDetailsWithStatus from "@agenta/oss/src/components/VariantDetailsWithStatus" +import {EvaluationRow} from "../types" + +import EvaluationStatusCell from "./EvaluationStatusCell" +import MetricDetailsPopover from "./MetricDetailsPopover" +import {formatMetricValue} from "./MetricDetailsPopover/assets/utils" + +export const extractEvaluationStatus = (scenarios: IScenario[], status?: EvaluationStatus) => { + // Derive overall run status if not provided + let derived: EvaluationStatus = EvaluationStatus.PENDING + if (scenarios.length) { + if (scenarios.some((s) => s.status === EvaluationStatus.FAILURE)) { + derived = EvaluationStatus.FAILURE + } else if (scenarios.some((s) => s.status === EvaluationStatus.CANCELLED)) { + derived = EvaluationStatus.CANCELLED + } else if ( + scenarios.some((s) => + [EvaluationStatus.INCOMPLETE].includes(s.status as EvaluationStatus), + ) + ) { + derived = EvaluationStatus.RUNNING + } else if (scenarios.every((s) => s.status === EvaluationStatus.SUCCESS)) { + derived = EvaluationStatus.SUCCESS + } else { + derived = EvaluationStatus.PENDING + } + } + const finalStatus = scenarios.length ? derived : (status ?? derived) + + return {runStatus: finalStatus as EvaluationStatus, scenarios} +} + +/** + * Builds columns configuration for a table based on evaluator metrics. + * + * @param {Object} params - The parameters for configuring the columns. + * @param {EvaluatorDto[]} params.evaluators - Evaluators data for building evaluator metric columns. + * @param {Record} params.collapsedGroups - State of collapsed groups for metric columns. + * @param {Function} params.toggleGroup - Function to toggle the collapsed state of metric groups. + * + * @returns {Object} An object containing the configured columns and all metric columns. + */ + +export const getEvaluatorMetricColumns = ({ + evaluations, + runMetricsMap, + collapsedGroups, + toggleGroup, +}: { + evaluations: EvaluationRow[] + runMetricsMap?: Record> + collapsedGroups: Record + toggleGroup: (key: string) => void +}) => { + // Calculate how many evaluations include each evaluator so we can order + // the columns by their popularity across runs (descending). + const evaluatorCounts: Record = {} + evaluations.forEach((evaluation) => { + evaluation.evaluators?.forEach((ev: EvaluatorDto) => { + evaluatorCounts[ev.slug] = (evaluatorCounts[ev.slug] ?? 0) + 1 + }) + }) + + // Build a unique list of evaluators and sort it by frequency. If two + // evaluators have the same frequency, fall back to their names for a + // deterministic ordering. + const evaluators = uniqBy( + evaluations.flatMap((evaluation) => evaluation.evaluators), + "slug", + ) + .filter(Boolean) + .map((evaluator: EvaluatorDto) => ({ + name: evaluator.name, + slug: evaluator.slug, + metrics: evaluator.data.service.format.properties.outputs.properties, + })) + .sort((a, b) => { + const diff = (evaluatorCounts[b.slug] ?? 0) - (evaluatorCounts[a.slug] ?? 0) + return diff !== 0 ? diff : a.name.localeCompare(b.name) + }) + + const evaluatorColumns = evaluators + .flatMap((ev) => { + const keys = Object.keys(ev.metrics || {}) + if (!keys.length) return [] + return [ + { + key: ev.slug, + title: ev.name ?? ev.slug, + children: buildEvaluatorMetricColumns({ + evaluator: ev, + runMetricsMap, + }), + }, + ] + }) + .flat() + + return evaluatorColumns +} + +export const getRunMetricColumns = ({ + runMetricsMap, + runMetricKeys, + evaluatorSlugs, + collapsedGroups, + toggleGroup, +}: { + runMetricsMap: Record + runMetricKeys: Set + evaluatorSlugs: Set + collapsedGroups: Record + toggleGroup: (key: string) => void +}) => { + const filteredRunMetricKeys = Array.from(runMetricKeys).filter((key) => { + const dotIdx = key.indexOf(".") + if (dotIdx === -1) return true + const slug = key.slice(0, dotIdx) + return !evaluatorSlugs.has(slug) + }) + + // Sort keys with shared priority helper + filteredRunMetricKeys.sort((a, b) => { + const [pa, sa] = metricPriority(a) + const [pb, sb] = metricPriority(b) + if (pa !== pb) return pa - pb + if (sa !== sb) return sa - sb + return a.localeCompare(b) + }) + + const runMetricChildren: ColumnsType = filteredRunMetricKeys.map((metricKey) => { + const {primary: primaryKey, label} = getMetricConfig(metricKey) + return { + title: () => {label}, + key: `run__${metricKey}`, + dataIndex: metricKey, + onHeaderCell: () => ({style: {minWidth: 160}}), + sorter: { + compare: (a, b) => { + const aId = "id" in a ? a.id : a.key + const bId = "id" in b ? b.id : b.key + const av = runMetricsMap?.[aId]?.[metricKey]?.[primaryKey] + const bv = runMetricsMap?.[bId]?.[metricKey]?.[primaryKey] + return Number(av ?? 0) - Number(bv ?? 0) + }, + }, + render: (_: any, record: EvaluationRow) => { + const id = "id" in record ? record.id : record.key + const metric = runMetricsMap?.[id]?.[metricKey] as any + + if (!metric) return "N/A" + + const displayValue = metric?.[primaryKey] + if (displayValue == null) return "N/A" + + if (typeof metric === "object") { + const {[primaryKey]: _omit, ...rest} = metric + if (Object.keys(rest).length) { + return ( + + + {formatMetricValue(metricKey, displayValue)} + + + ) + } + } + return String(displayValue) + }, + } + }) + + const runMetricsGroup = runMetricChildren.length + ? [ + { + title: ( +
    + { + e.stopPropagation() + toggleGroup?.("run") + }} + > + {collapsedGroups?.["run"] ? : } + Invocation Metrics + +
    + ), + children: collapsedGroups?.["run"] ? [] : runMetricChildren, + }, + ] + : [] + + return runMetricsGroup +} + +export const getColumns = ( + mergedEvaluations: EvaluationRow[], + router: NextRouter, + handleNavigation: (revisionId: string) => void, + setSelectedEvalRecord: Dispatch>, + setIsDeleteEvalModalOpen: Dispatch>, + runMetricsMap?: Record>, + collapsedGroups?: Record, + toggleGroup?: (key: string) => void, + classes?, +): ColumnsType => { + const appId = getAppValues().currentApp?.app_id + + const baseColumns: ColumnsType = [ + { + title: "Name", + dataIndex: "name", + key: "name", + fixed: "left", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_: any, record: EvaluationRow) => { + return "name" in record ? record.name : record.key + }, + }, + { + title: "Variant", + dataIndex: "variants", + key: "variants", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_: any, record: EvaluationRow) => { + if ("variants" in record && Array.isArray(record.variants)) { + return ( + + ) + } + return null + }, + }, + { + title: "Test set", + dataIndex: "testsetName", + key: "testsetName", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_, record) => { + return record.testset ? ( +
    {record.testset.name}
    + ) : ( +
    + {record.testsets?.map((ts) => ( + {ts.name} + ))} +
    + ) + }, + }, + { + title: "Status", + dataIndex: "status", + key: "status", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (value, record) => { + const isLegacy = !record?.data?.steps + return !isLegacy ? ( + + ) : ( +
    + ) + }, + }, + // Evaluator metric columns will be injected here dynamically below + { + title: "Created by", + dataIndex: "createdBy", + key: "createdBy", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (value, record) => { + const isLegacy = !record?.data?.steps + return isLegacy ? ( +
    + ) : ( + + ) + }, + }, + { + title: "Created on", + dataIndex: "createdAt", + key: "createdAt", + sorter: (a, b) => { + return (a?.createdAtTimestamp ?? 0) - (b?.createdAtTimestamp ?? 0) + }, + defaultSortOrder: "descend", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + }, + { + title: , + key: "key", + width: 56, + fixed: "right", + align: "center", + render: (_, record) => { + return ( + , + onClick: (e) => { + e.domEvent.stopPropagation() + router.push( + `/apps/${appId}/evaluations/single_model_test/${"id" in record ? record.id : record.key}`, + ) + }, + }, + { + key: "variant", + label: "View variant", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + handleNavigation(record.variants[0].id) + }, + }, + { + key: "view_testset", + label: "View test set", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + router.push(`/testsets/${record.testsets?.[0]?.id}`) + }, + }, + {type: "divider"}, + { + key: "delete_eval", + label: "Delete", + icon: , + danger: true, + onClick: (e) => { + e.domEvent.stopPropagation() + setSelectedEvalRecord(record) + setIsDeleteEvalModalOpen(true) + }, + }, + ], + }} + > + + - - {showSurveyForm ? steps[currentStep]?.content : null} - + {steps[currentStep]?.content} ) } diff --git a/web/oss/src/components/SaveTestsetModal/SaveTestsetModal.tsx b/web/ee/src/components/SaveTestsetModal/SaveTestsetModal.tsx similarity index 97% rename from web/oss/src/components/SaveTestsetModal/SaveTestsetModal.tsx rename to web/ee/src/components/SaveTestsetModal/SaveTestsetModal.tsx index 9182bd8bb7..6cba0bc8fe 100644 --- a/web/oss/src/components/SaveTestsetModal/SaveTestsetModal.tsx +++ b/web/ee/src/components/SaveTestsetModal/SaveTestsetModal.tsx @@ -59,7 +59,7 @@ const SaveTestsetModal: React.FC = ({ return ( = ({ > setTestsetName(e.target.value)} value={testsetName} className="my-3" diff --git a/web/ee/src/components/SaveTestsetModal/types.d.ts b/web/ee/src/components/SaveTestsetModal/types.d.ts new file mode 100644 index 0000000000..bcb7e6d3c6 --- /dev/null +++ b/web/ee/src/components/SaveTestsetModal/types.d.ts @@ -0,0 +1,12 @@ +import {ModalProps} from "antd" +import {Evaluation, EvaluationFlow, EvaluationScenario} from "@/oss/lib/Types" + +export interface EvaluationRow extends EvaluationScenario, Record { + evaluationFlow: EvaluationFlow +} + +export interface SaveTestsetModalProps extends ModalProps { + evaluation: Evaluation + rows: EvaluationRow[] + onSuccess: (testsetName: string) => void +} diff --git a/web/ee/src/components/SidePanel/Subscription.tsx b/web/ee/src/components/SidePanel/Subscription.tsx index c05efdca56..688c6b8dd2 100644 --- a/web/ee/src/components/SidePanel/Subscription.tsx +++ b/web/ee/src/components/SidePanel/Subscription.tsx @@ -6,16 +6,26 @@ import {isDemo} from "@/oss/lib/helpers/utils" import {Plan} from "@/oss/lib/Types" import {useSubscriptionData} from "@/oss/services/billing" -const SidePanelSubscription = () => { +const SidePanelSubscription = ({ + collapsed, + isHovered, +}: { + collapsed: boolean + isHovered: boolean +}) => { const {subscription} = useSubscriptionData() const isShowFreePlanBannerVisible = useMemo( - () => isDemo() && !subscription?.free_trial && subscription?.plan === Plan.Hobby, - [subscription], + () => + isDemo() && + (!collapsed || (collapsed && isHovered)) && + !subscription?.free_trial && + subscription?.plan === Plan.Hobby, + [subscription, collapsed, isHovered], ) const isShowFreeTrialBannerVisible = useMemo( - () => isDemo() && subscription?.free_trial, - [subscription], + () => isDemo() && (!collapsed || (collapsed && isHovered)) && subscription?.free_trial, + [isHovered, subscription, collapsed], ) return ( diff --git a/web/ee/src/components/pages/app-management/components/ApiKeyInput.tsx b/web/ee/src/components/pages/app-management/components/ApiKeyInput.tsx index ad44cdb4ea..005734ad81 100644 --- a/web/ee/src/components/pages/app-management/components/ApiKeyInput.tsx +++ b/web/ee/src/components/pages/app-management/components/ApiKeyInput.tsx @@ -2,9 +2,9 @@ import {useMemo, useState} from "react" import {Button, Input, Space, Typography, message} from "antd" +import {useOrgData} from "@/oss/contexts/org.context" import {isDemo} from "@/oss/lib/helpers/utils" import {createApiKey} from "@/oss/services/apiKeys/api" -import {useOrgData} from "@/oss/state/org" const {Text} = Typography diff --git a/web/ee/src/components/pages/app-management/components/DemoApplicationsSection.tsx b/web/ee/src/components/pages/app-management/components/DemoApplicationsSection.tsx index 605ef9a773..d4ae3ae59b 100644 --- a/web/ee/src/components/pages/app-management/components/DemoApplicationsSection.tsx +++ b/web/ee/src/components/pages/app-management/components/DemoApplicationsSection.tsx @@ -2,9 +2,9 @@ import {Button, Card, Flex, Space, Typography} from "antd" import Image from "next/image" import {createUseStyles} from "react-jss" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProjectData} from "@/oss/contexts/project.context" import {JSSTheme} from "@/oss/lib/Types" -import {useOrgData} from "@/oss/state/org" -import {useProjectData} from "@/oss/state/project" const useStyles = createUseStyles((theme: JSSTheme) => ({ demoAppCard: { diff --git a/web/ee/src/components/pages/app-management/components/ObservabilityDashboardSection.tsx b/web/ee/src/components/pages/app-management/components/ObservabilityDashboardSection.tsx index d41ea8d433..ef32cf2eca 100644 --- a/web/ee/src/components/pages/app-management/components/ObservabilityDashboardSection.tsx +++ b/web/ee/src/components/pages/app-management/components/ObservabilityDashboardSection.tsx @@ -1,14 +1,16 @@ -import {useMemo, type ComponentProps} from "react" +import {useEffect, useState, type ComponentProps} from "react" import {AreaChart} from "@tremor/react" import {Spin, Typography} from "antd" import round from "lodash/round" import {createUseStyles} from "react-jss" -import {formatCurrency, formatLatency, formatNumber} from "@/oss/lib/helpers/formatters" +import {useAppId} from "@/oss/hooks/useAppId" +import {formatCurrency, formatNumber} from "@/oss/lib/helpers/formatters" import {JSSTheme} from "@/oss/lib/Types" +import {GenerationDashboardData} from "@/oss/lib/types_ee" +import {fetchGenerationsDashboardData} from "@/oss/services/observability/api" -import {useObservabilityDashboard} from "../../../../state/observability" import WidgetCard from "../../observability/dashboard/widgetCard" const useStyles = createUseStyles((theme: JSSTheme) => ({ @@ -45,29 +47,36 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ const ObservabilityDashboardSection = () => { const classes = useStyles() - const {data, loading, isFetching} = useObservabilityDashboard() + const appId = useAppId() + const [loading, setLoading] = useState(false) + const [data, setData] = useState() - const chartData = useMemo(() => (data?.data?.length ? data.data : [{}]), [data]) + const defaultGraphProps: ComponentProps = { + className: "h-[168px] p-0", + colors: ["cyan", "red"], + connectNulls: true, + tickGap: 15, + curveType: "monotone", + showGridLines: false, + showLegend: false, + index: "timestamp", + data: data?.data?.length ? data.data : [{}], + categories: [], + } - const defaultGraphProps = useMemo>( - () => ({ - className: "h-[168px] p-0", - colors: ["cyan", "red"], - connectNulls: true, - tickGap: 15, - curveType: "monotone", - showGridLines: false, - showLegend: false, - index: "timestamp", - data: chartData, - categories: [], - }), - [chartData], - ) + useEffect(() => { + setLoading(true) + fetchGenerationsDashboardData(appId, {range: "30_days"}) + .then((data) => { + setData(data) + }) + .catch(console.error) + .finally(() => setLoading(false)) + }, [appId]) return (
    - +
    { Avg:{" "} {data?.avg_latency - ? `${formatNumber(data.avg_latency)}ms` + ? `${round(data?.avg_latency ?? 0, 2)}s` : "-"}
    diff --git a/web/oss/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorModal.tsx b/web/ee/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorModal.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorModal.tsx rename to web/ee/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorModal.tsx diff --git a/web/oss/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorPopover.tsx b/web/ee/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorPopover.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorPopover.tsx rename to web/ee/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorPopover.tsx diff --git a/web/oss/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorText.tsx b/web/ee/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorText.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorText.tsx rename to web/ee/src/components/pages/evaluations/EvaluationErrorProps/EvaluationErrorText.tsx diff --git a/web/oss/src/components/pages/evaluations/FilterColumns/FilterColumns.tsx b/web/ee/src/components/pages/evaluations/FilterColumns/FilterColumns.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/FilterColumns/FilterColumns.tsx rename to web/ee/src/components/pages/evaluations/FilterColumns/FilterColumns.tsx diff --git a/web/ee/src/components/pages/evaluations/NewEvaluation/Components/AdvancedSettingsPopover.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/AdvancedSettingsPopover.tsx new file mode 100644 index 0000000000..c749107b95 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/AdvancedSettingsPopover.tsx @@ -0,0 +1,154 @@ +import {memo, useState} from "react" + +import {QuestionCircleOutlined} from "@ant-design/icons" +import {CaretDown, SlidersHorizontal} from "@phosphor-icons/react" +import {Button, Col, Flex, Form, Input, InputNumber, Popover, Row, Tooltip, Typography} from "antd" + +import {useStyles} from "../assets/styles" +import {AdvancedSettingsPopoverProps} from "../types" + +const AdvancedSettingsPopover = ({ + setRateLimitValues, + rateLimitValues, + setCorrectAnswerColumn, + correctAnswerColumn, +}: AdvancedSettingsPopoverProps) => { + const classes = useStyles() + + const [openAdvancedConfigPopover, setOpenAdvancedConfigPopover] = useState(false) + const [tempRateLimitValues, setTempRateLimitValues] = useState(rateLimitValues) + const [tempCorrectAnswerColumn, setTempCorrectAnswerColumn] = useState(correctAnswerColumn) + + const handleSave = () => { + setRateLimitValues(tempRateLimitValues) + setCorrectAnswerColumn(tempCorrectAnswerColumn) + setOpenAdvancedConfigPopover(false) + } + + const handleCancel = () => { + setTempRateLimitValues(rateLimitValues) + setTempCorrectAnswerColumn(correctAnswerColumn) + setOpenAdvancedConfigPopover(false) + } + + const handleResetDefaults = () => { + const defaultValues = { + batch_size: 10, + max_retries: 3, + retry_delay: 3, + delay_between_batches: 5, + } + setRateLimitValues(defaultValues) + setTempRateLimitValues(defaultValues) + setCorrectAnswerColumn("correct_answer") + setTempCorrectAnswerColumn("correct_answer") + } + + return ( + setOpenAdvancedConfigPopover(false)} + trigger={["click"]} + arrow={false} + overlayClassName={classes.container} + title={ + + Advanced settings + + + } + content={ + +
    + + Rate Limit Configuration + + } + style={{marginBottom: 0}} + > + + {Object.entries(tempRateLimitValues).map(([key, value]) => ( + + + {key + .replace(/_/g, " ") + .replace(/\b\w/g, (c) => c.toUpperCase())} +   + + + + + } + rules={[ + { + validator: (_, value) => { + if (value !== null) { + return Promise.resolve() + } + return Promise.reject( + "This field is required", + ) + }, + }, + ]} + > + + newValue !== null && + setTempRateLimitValues((prev) => ({ + ...prev, + [key]: newValue, + })) + } + style={{width: "100%"}} + /> + + + ))} + + + + Correct Answer Column  + + + + + } + > + setTempCorrectAnswerColumn(e.target.value)} + style={{width: "50%"}} + /> + +
    + + + + + +
    + } + > + +
    + ) +} + +export default memo(AdvancedSettingsPopover) diff --git a/web/ee/src/components/pages/evaluations/NewEvaluation/Components/NewEvaluationModalContent.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/NewEvaluationModalContent.tsx new file mode 100644 index 0000000000..03a7786a66 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/NewEvaluationModalContent.tsx @@ -0,0 +1,208 @@ +// @ts-nocheck +import {type FC, memo, useMemo} from "react" + +import {CloseCircleOutlined} from "@ant-design/icons" +import {Input, Typography, Tabs, Tag, Space} from "antd" +import clsx from "clsx" +import dynamic from "next/dynamic" + +import useFocusInput from "@/oss/hooks/useFocusInput" + +import {useStyles} from "../assets/styles" +import TabLabel from "../assets/TabLabel" +import {NewEvaluationModalContentProps} from "../types" + +const SelectEvaluatorSection = dynamic( + () => import("./SelectEvaluatorSection/SelectEvaluatorSection"), + { + ssr: false, + }, +) + +const SelectTestsetSection = dynamic(() => import("./SelectTestsetSection"), { + ssr: false, +}) + +const SelectVariantSection = dynamic(() => import("./SelectVariantSection"), { + ssr: false, +}) + +const NewEvaluationModalContent: FC = ({ + onSuccess, + handlePanelChange, + activePanel, + selectedTestsetId, + setSelectedTestsetId, + selectedVariantRevisionIds, + setSelectedVariantRevisionIds, + selectedEvalConfigs, + setSelectedEvalConfigs, + evaluationName, + setEvaluationName, + preview, + evaluationType, + testSets, + variants, + evaluators, + evaluatorConfigs, + ...props +}) => { + const classes = useStyles() + const {inputRef} = useFocusInput({isOpen: props.isOpen || false}) + + const selectedTestset = useMemo( + () => testSets.find((ts) => ts._id === selectedTestsetId) || null, + [testSets, selectedTestsetId], + ) + + const selectedVariants = useMemo( + () => variants?.filter((v) => selectedVariantRevisionIds.includes(v.id)) || [], + [variants, selectedVariantRevisionIds], + ) + + const selectedEvalConfig = useMemo(() => { + const source = preview ? (evaluators as any[]) : (evaluatorConfigs as any[]) + return source.filter((cfg) => selectedEvalConfigs.includes(cfg.id)) + }, [preview, evaluators, evaluatorConfigs, selectedEvalConfigs]) + + const items = useMemo(() => { + return [ + { + key: "testsetPanel", + label: ( + + {selectedTestset ? ( + } + onClose={() => { + setSelectedTestsetId(null) + }} + > + {selectedTestset.name} + + ) : null} + + ), + children: ( + + ), + }, + { + key: "variantPanel", + label: ( + 0}> + {selectedVariants.map((v) => ( + } + onClose={() => { + setSelectedVariantRevisionIds( + selectedVariantRevisionIds.filter((id) => id !== v.id), + ) + }} + > + {`${v.variantName} - v${v.revision}`} + + ))} + + ), + children: ( + + ), + }, + { + key: "evaluatorPanel", + label: ( + 0}> + {selectedEvalConfig.map((cfg: any) => { + return ( + } + color={cfg.color} + onClose={() => { + setSelectedEvalConfigs( + selectedEvalConfigs.filter((id) => id !== cfg.id), + ) + }} + > + {cfg.name} + + ) + })} + + ), + children: ( + + ), + }, + ] + }, [ + selectedTestset, + selectedVariants, + selectedEvalConfig, + handlePanelChange, + selectedTestsetId, + selectedVariantRevisionIds, + selectedEvalConfigs, + preview, + evaluationType, + testSets, + variants, + evaluators, + evaluatorConfigs, + ]) + + return ( +
    + {evaluationType === "human" ? ( +
    + Evaluation name + { + setEvaluationName(e.target.value) + }} + /> +
    + ) : null} + + +
    + ) +} + +export default memo(NewEvaluationModalContent) diff --git a/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectEvaluatorSection/SelectEvaluatorSection.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectEvaluatorSection/SelectEvaluatorSection.tsx new file mode 100644 index 0000000000..c17aaa43d1 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectEvaluatorSection/SelectEvaluatorSection.tsx @@ -0,0 +1,360 @@ +import {memo, useEffect, useMemo, useRef, useState} from "react" + +import {PlusOutlined} from "@ant-design/icons" +import {Button, Input, Table, Tag, Space} from "antd" +import {ColumnsType} from "antd/es/table" +import clsx from "clsx" +import dynamic from "next/dynamic" + +import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer" +import AnnotateDrawerTitle from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/AnnotateDrawerTitle" +import CreateEvaluator from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/CreateEvaluator" +import {AnnotateDrawerSteps} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/enum" +import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" +import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" +import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" +import {Evaluator, EvaluatorConfig} from "@/oss/lib/Types" + +import type {SelectEvaluatorSectionProps} from "../../types" + +const EvaluatorsModal = dynamic( + () => import("../../../autoEvaluation/EvaluatorsModal/EvaluatorsModal"), + { + ssr: false, + loading: () => null, // Prevent flash by not rendering until loaded + }, +) +const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { + ssr: false, +}) + +const EvaluatorMetrics = memo(({evaluator}: {evaluator: EvaluatorDto<"response">}) => { + const metrics = getMetricsFromEvaluator(evaluator) + return ( +
    + {Object.entries(metrics).map(([key, value]) => { + return ( + + {key} + + ) + })} +
    + ) +}) + +// Use a generic type variable Preview and conditionally type filteredEvalConfigs +const SelectEvaluatorSection = ({ + selectedEvalConfigs, + setSelectedEvalConfigs, + className, + handlePanelChange, + preview, + evaluators: propsEvaluators, + evaluatorConfigs: propsEvaluatorConfigs, + ...props +}: SelectEvaluatorSectionProps & {preview?: Preview}) => { + const fetchData = useFetchEvaluatorsData({ + preview: preview as boolean, + queries: {is_human: preview}, + }) + + const evaluationData = useMemo(() => { + if (preview) { + const evaluators = (propsEvaluators || + fetchData.evaluatorsSwr.data || + []) as EvaluatorDto<"response">[] + const evaluatorConfigs = evaluators + const isLoadingEvaluators = fetchData.isLoadingEvaluators + const isLoadingEvaluatorConfigs = fetchData.isLoadingEvaluatorConfigs + return {evaluators, evaluatorConfigs, isLoadingEvaluators, isLoadingEvaluatorConfigs} + } else { + const evaluators = propsEvaluators?.length + ? propsEvaluators + : ((fetchData.evaluatorsSwr.data || []) as Evaluator[]) + const evaluatorConfigs = (propsEvaluatorConfigs || + fetchData.evaluatorConfigsSwr.data || + []) as EvaluatorConfig[] + const isLoadingEvaluators = fetchData.isLoadingEvaluators + const isLoadingEvaluatorConfigs = fetchData.isLoadingEvaluatorConfigs + return {evaluators, evaluatorConfigs, isLoadingEvaluators, isLoadingEvaluatorConfigs} + } + }, [fetchData, preview, propsEvaluators, propsEvaluatorConfigs]) + + const {evaluators, evaluatorConfigs, isLoadingEvaluators, isLoadingEvaluatorConfigs} = + evaluationData + + const [searchTerm, setSearchTerm] = useState("") + const [isEvaluatorsModalOpen, setIsEvaluatorsModalOpen] = useState(false) + const [current, setCurrent] = useState(0) + const prevEvaluatorConfigsRef = useRef[] | EvaluatorConfig[]>( + evaluationData.evaluatorConfigs, + ) + + useEffect(() => { + if (isLoadingEvaluators || isLoadingEvaluatorConfigs) return + + if (preview) { + const prevConfigs = prevEvaluatorConfigsRef.current as EvaluatorDto<"response">[] + const dataSource = evaluators as EvaluatorDto<"response">[] + const newConfigs = dataSource.filter( + (config) => !prevConfigs.some((prevConfig) => prevConfig.id === config.id), + ) + if (newConfigs.length > 0) { + setSelectedEvalConfigs((prevSelected) => [ + ...prevSelected, + ...newConfigs.map((config) => config.id), + ]) + } + prevEvaluatorConfigsRef.current = dataSource + } else { + const prevConfigs = prevEvaluatorConfigsRef.current as EvaluatorConfig[] + const dataSource = evaluatorConfigs as EvaluatorConfig[] + const newConfigs = dataSource.filter( + (config) => !prevConfigs.some((prevConfig) => prevConfig.id === config.id), + ) + if (newConfigs.length > 0) { + setSelectedEvalConfigs((prevSelected) => [ + ...prevSelected, + ...newConfigs.map((config) => config.id), + ]) + } + prevEvaluatorConfigsRef.current = dataSource + } + }, [ + preview, + evaluatorConfigs, + evaluators, + setSelectedEvalConfigs, + isLoadingEvaluators, + isLoadingEvaluatorConfigs, + ]) + + const columnsPreview: ColumnsType> = useMemo( + () => [ + { + title: "Name", + dataIndex: "name", + key: "name", + render: (_, record: EvaluatorDto<"response">) => { + return
    {record.name}
    + }, + }, + { + title: "Slug", + dataIndex: "slug", + key: "slug", + render: (_, record: EvaluatorDto<"response">) => { + return
    {record.slug}
    + }, + }, + { + title: "Metrics", + dataIndex: "data", + key: "data", + render: (_, record: EvaluatorDto<"response">) => ( + + ), + }, + ], + [], + ) + + const columnsConfig: ColumnsType = useMemo( + () => [ + { + title: "Name", + dataIndex: "name", + key: "name", + render: (_, record: EvaluatorConfig) => { + return
    {record.name}
    + }, + }, + { + title: "Type", + dataIndex: "type", + key: "type", + render: (x, record: EvaluatorConfig) => { + // Find the evaluator by key to display its name + const evaluator = (evaluators as Evaluator[]).find( + (item) => item.key === record.evaluator_key, + ) + return {evaluator?.name} + }, + }, + ], + [evaluators], + ) + + // Conditionally type filteredEvalConfigs based on Preview + const filteredEvalConfigs: Preview extends true + ? EvaluatorDto<"response">[] + : EvaluatorConfig[] = useMemo(() => { + if (preview) { + // Explicitly narrow types for Preview = true + const data = evaluators as EvaluatorDto<"response">[] + if (!searchTerm) return data + return data.filter((item) => + item.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) as any + } else { + // Explicitly narrow types for Preview = false + const data = evaluatorConfigs as EvaluatorConfig[] + if (!searchTerm) return data + return data.filter((item) => + item.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) as any + } + }, [searchTerm, evaluatorConfigs, preview, evaluators]) + + const selectedEvalConfig = useMemo( + () => evaluatorConfigs.filter((config) => selectedEvalConfigs.includes(config.id)), + [evaluatorConfigs, selectedEvalConfigs], + ) + + const onSelectEvalConfig = (selectedRowKeys: React.Key[]) => { + const currentSelected = new Set(selectedEvalConfigs) + const configs = filteredEvalConfigs as EvaluatorDto<"response">[] + configs.forEach((item) => { + if (selectedRowKeys.includes(item.id)) { + currentSelected.add(item.id) + } else { + currentSelected.delete(item.id) + } + }) + setSelectedEvalConfigs(Array.from(currentSelected)) + } + + return ( + <> +
    +
    + setSearchTerm(e.target.value)} + /> + + + +
    + + {filteredEvalConfigs.length === 0 ? ( + { + setCurrent(1) + setIsEvaluatorsModalOpen(true) + }} + /> + ) : preview ? ( + > + rowSelection={{ + type: "checkbox", + columnWidth: 48, + selectedRowKeys: selectedEvalConfigs, + onChange: (selectedRowKeys) => { + onSelectEvalConfig(selectedRowKeys) + }, + }} + onRow={(record) => ({ + style: {cursor: "pointer"}, + onClick: () => { + if (selectedEvalConfigs.includes(record.id)) { + onSelectEvalConfig( + selectedEvalConfigs.filter((id) => id !== record.id), + ) + } else { + onSelectEvalConfig([...selectedEvalConfigs, record.id]) + } + }, + })} + className="ph-no-capture" + columns={columnsPreview} + rowKey={"id"} + dataSource={filteredEvalConfigs as EvaluatorDto<"response">[]} + scroll={{x: true}} + bordered + pagination={false} + /> + ) : ( + + rowSelection={{ + type: "checkbox", + columnWidth: 48, + selectedRowKeys: selectedEvalConfigs, + onChange: (selectedRowKeys) => { + onSelectEvalConfig(selectedRowKeys) + }, + }} + onRow={(record) => ({ + style: {cursor: "pointer"}, + onClick: () => { + if (selectedEvalConfigs.includes(record.id)) { + onSelectEvalConfig( + selectedEvalConfigs.filter((id) => id !== record.id), + ) + } else { + onSelectEvalConfig([...selectedEvalConfigs, record.id]) + } + }, + })} + className="ph-no-capture" + columns={columnsConfig} + rowKey={"id"} + dataSource={filteredEvalConfigs as EvaluatorConfig[]} + scroll={{x: true, y: 455}} + bordered + pagination={false} + /> + )} +
    + + {preview ? ( + setIsEvaluatorsModalOpen(false)} + onClose={() => setIsEvaluatorsModalOpen(false)} + /> + } + closeIcon={null} + width={400} + onClose={() => setIsEvaluatorsModalOpen(false)} + classNames={{body: "!p-0", header: "!p-4"}} + > + { + setSelectedEvalConfigs(updater) + setIsEvaluatorsModalOpen(false) + }} + /> + + ) : ( + setIsEvaluatorsModalOpen(false)} + current={current} + setCurrent={setCurrent} + openedFromNewEvaluation={true} + /> + )} + + ) +} + +export default memo(SelectEvaluatorSection) diff --git a/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectTestsetSection.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectTestsetSection.tsx new file mode 100644 index 0000000000..76c2692324 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectTestsetSection.tsx @@ -0,0 +1,137 @@ +import {memo, useMemo, useState} from "react" +import dynamic from "next/dynamic" + +import {Input} from "antd" +import Table, {ColumnsType} from "antd/es/table" +import clsx from "clsx" +import dayjs from "dayjs" + +import {formatDate, formatDay} from "@/oss/lib/helpers/dateTimeHelper" +import {testset} from "@/oss/lib/Types" +import {useTestsets} from "@/oss/services/testsets/api" + +import type {SelectTestsetSectionProps} from "../types" + +const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { + ssr: false, +}) + +const SelectTestsetSection = ({ + testSets: propsTestsets, + selectedTestsetId, + setSelectedTestsetId, + handlePanelChange, + className, + ...props +}: SelectTestsetSectionProps) => { + const [searchTerm, setSearchTerm] = useState("") + const {data: fetchedTestSets} = useTestsets() + const testSets = useMemo(() => { + return propsTestsets && propsTestsets.length > 0 ? propsTestsets : fetchedTestSets || [] + }, [propsTestsets, fetchedTestSets]) + + const columns: ColumnsType = useMemo(() => { + return [ + { + title: "Name", + dataIndex: "name", + key: "name", + onHeaderCell: () => ({ + style: {minWidth: 220}, + }), + }, + { + title: "Date Modified", + dataIndex: "updated_at", + key: "updated_at", + onHeaderCell: () => ({ + style: {minWidth: 220}, + }), + render: (date: string) => { + return formatDay({date, outputFormat: "DD MMM YYYY | h:mm a"}) + }, + }, + { + title: "Date created", + dataIndex: "created_at", + key: "created_at", + render: (date: string) => { + return formatDate(date) + }, + onHeaderCell: () => ({ + style: {minWidth: 220}, + }), + }, + ] + }, []) + + const filteredTestset = useMemo(() => { + let allTestsets = testSets.sort( + (a: testset, b: testset) => + dayjs(b.updated_at).valueOf() - dayjs(a.updated_at).valueOf(), + ) + if (searchTerm) { + allTestsets = testSets.filter((item: testset) => + item.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) + } + return allTestsets + }, [searchTerm, testSets]) + + const selectedTestset = useMemo( + () => testSets.find((testset) => testset._id === selectedTestsetId) || null, + [selectedTestsetId, testSets], + ) + + return ( +
    +
    + setSearchTerm(e.target.value)} + /> +
    + { + setSelectedTestsetId(selectedRowKeys[0] as string) + handlePanelChange("variantPanel") + }, + }} + className={`ph-no-capture`} + columns={columns} + dataSource={filteredTestset} + rowKey="_id" + scroll={{x: true, y: 455}} + bordered + pagination={false} + locale={{ + emptyText: ( + + ), + }} + onRow={(record) => ({ + style: {cursor: "pointer"}, + onClick: () => { + if (selectedTestset?._id === record._id) { + setSelectedTestsetId("") + } else { + setSelectedTestsetId(record._id) + handlePanelChange("variantPanel") + } + }, + })} + /> + + ) +} + +export default memo(SelectTestsetSection) diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectVariantSection.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectVariantSection.tsx similarity index 78% rename from web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectVariantSection.tsx rename to web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectVariantSection.tsx index b189372b76..43fed4d9ed 100644 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectVariantSection.tsx +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/Components/SelectVariantSection.tsx @@ -2,12 +2,12 @@ import {memo, useCallback, useMemo, useState} from "react" import {Input} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" import dynamic from "next/dynamic" +import {useAppsData} from "@/oss/contexts/app.context" +import {useAppId} from "@/oss/hooks/useAppId" import {useVariants} from "@/oss/lib/hooks/useVariants" import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {currentAppAtom} from "@/oss/state/app" import type {SelectVariantSectionProps} from "../types" @@ -20,26 +20,23 @@ const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoR const SelectVariantSection = ({ selectedVariantRevisionIds, - selectedTestsetId, className, setSelectedVariantRevisionIds, handlePanelChange, evaluationType, variants: propsVariants, - isVariantLoading: propsVariantLoading, ...props }: SelectVariantSectionProps) => { - const currentApp = useAtomValue(currentAppAtom) - - const {data, isLoading: fallbackLoading} = useVariants(currentApp) - const variants = useMemo(() => propsVariants || data, [propsVariants, data]) - const isVariantLoading = propsVariantLoading ?? fallbackLoading + const {currentApp} = useAppsData() + const appId = useAppId() + const {data, isLoading: isVariantLoading} = useVariants(currentApp)({appId}) + const variants = useMemo(() => propsVariants || data?.variants, [propsVariants, data?.variants]) const [searchTerm, setSearchTerm] = useState("") const filteredVariant = useMemo(() => { if (!searchTerm) return variants - return variants?.filter((item: EnhancedVariant) => + return variants?.filter((item) => item.variantName.toLowerCase().includes(searchTerm.toLowerCase()), ) }, [searchTerm, variants]) @@ -49,10 +46,11 @@ const SelectVariantSection = ({ const selectedId = selectedRowKeys[0] as string | undefined if (selectedId) { setSelectedVariantRevisionIds([selectedId]) - handlePanelChange("testsetPanel") + handlePanelChange("evaluatorPanel") } else { setSelectedVariantRevisionIds([]) } + }, [setSelectedVariantRevisionIds, handlePanelChange], ) @@ -67,11 +65,9 @@ const SelectVariantSection = ({ [selectedVariantRevisionIds, onSelectVariant], ) - const variantsNonNull = (filteredVariant || []) as EnhancedVariant[] - return (
    -
    +
    { return { style: {cursor: "pointer"}, - onClick: () => { - onRowClick(record as EnhancedVariant) - }, + onClick: () => onRowClick(record as EnhancedVariant), } }} showActionsDropdown={false} scroll={{x: "max-content", y: 455}} isLoading={isVariantLoading} - variants={variantsNonNull} + variants={filteredVariant} onRowClick={() => {}} className="ph-no-capture" rowKey={"id"} diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/index.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/index.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/index.tsx rename to web/ee/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/index.tsx diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/types.ts b/web/ee/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/types.ts similarity index 100% rename from web/oss/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/types.ts rename to web/ee/src/components/pages/evaluations/NewEvaluation/assets/TabLabel/types.ts diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/assets/styles.ts b/web/ee/src/components/pages/evaluations/NewEvaluation/assets/styles.ts similarity index 100% rename from web/oss/src/components/pages/evaluations/NewEvaluation/assets/styles.ts rename to web/ee/src/components/pages/evaluations/NewEvaluation/assets/styles.ts diff --git a/web/ee/src/components/pages/evaluations/NewEvaluation/index.tsx b/web/ee/src/components/pages/evaluations/NewEvaluation/index.tsx new file mode 100644 index 0000000000..37241a9792 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/index.tsx @@ -0,0 +1,395 @@ +import {useCallback, memo, useEffect, useState, useMemo, useRef} from "react" + +import {CloseOutlined, PlusOutlined} from "@ant-design/icons" +import {Button} from "antd" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" + +import {message} from "@/oss/components/AppMessageContext" +import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" +import {useAppId} from "@/oss/hooks/useAppId" +import {useVaultSecret} from "@/oss/hooks/useVaultSecret" +import {redirectIfNoLLMKeys} from "@/oss/lib/helpers/utils" +import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" +import usePreviewEvaluations from "@/oss/lib/hooks/usePreviewEvaluations" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import {LLMRunRateLimit} from "@/oss/lib/Types" +import {createEvaluation} from "@/oss/services/evaluations/api" +import {fetchTestset, useTestsets} from "@/oss/services/testsets/api" + +import {useStyles} from "./assets/styles" +import type {NewEvaluationModalGenericProps} from "./types" + +const NewEvaluationModalContent = dynamic(() => import("./Components/NewEvaluationModalContent"), { + ssr: false, +}) + +const AdvancedSettingsPopover = dynamic(() => import("./Components/AdvancedSettingsPopover"), { + ssr: false, +}) + +const NewEvaluationModal = ({ + onSuccess, + preview = false as Preview, + evaluationType, + ...props +}: NewEvaluationModalGenericProps) => { + const classes = useStyles() + const appId = useAppId() + const router = useRouter() + + // Fetch evaluation data + const evaluationData = useFetchEvaluatorsData({preview}) + + // Use useMemo to derive evaluators, evaluatorConfigs, and loading flags based on preview flag + const {evaluators, evaluatorConfigs, loadingEvaluators, loadingEvaluatorConfigs} = + useMemo(() => { + if (preview) { + return { + evaluators: evaluationData.evaluatorsSwr?.data || [], + evaluatorConfigs: [], + loadingEvaluators: evaluationData.evaluatorsSwr?.isLoading ?? false, + loadingEvaluatorConfigs: false, + } + } else { + return { + evaluators: [], + evaluatorConfigs: evaluationData.evaluatorConfigsSwr?.data || [], + loadingEvaluators: false, + loadingEvaluatorConfigs: evaluationData.evaluatorConfigsSwr?.isLoading ?? false, + } + } + }, [ + preview, + evaluationData.evaluatorsSwr?.data, + evaluationData.evaluatorsSwr?.isLoading, + evaluationData.evaluatorConfigsSwr?.data, + evaluationData.evaluatorConfigsSwr?.isLoading, + ]) + + const [submitLoading, setSubmitLoading] = useState(false) + const [selectedTestsetId, setSelectedTestsetId] = useState("") + const [selectedVariantRevisionIds, setSelectedVariantRevisionIds] = useState([]) + const [selectedEvalConfigs, setSelectedEvalConfigs] = useState([]) + + //@ts-ignore + const {data} = useVariants()() + + const {createNewRun: createPreviewEvaluationRun} = usePreviewEvaluations() + const {data: testsets} = useTestsets() + + const {secrets} = useVaultSecret() + + const [activePanel, setActivePanel] = useState("testsetPanel") + const [evaluationName, setEvaluationName] = useState("") + const [nameFocused, setNameFocused] = useState(false) + + const handlePanelChange = useCallback((key: string | string[]) => { + setActivePanel(key as string) + }, []) + + useEffect(() => { + if (props.open) { + setEvaluationName("") + setSelectedEvalConfigs([]) + setSelectedTestsetId("") + setSelectedVariantRevisionIds([]) + setActivePanel("testsetPanel") + } + }, [props.open, appId]) + + // Track focus on any input within modal to avoid overriding user typing + useEffect(() => { + function handleFocusIn(e: FocusEvent) { + if ((e.target as HTMLElement).tagName === "INPUT") { + setNameFocused(true) + } + } + function handleFocusOut(e: FocusEvent) { + if ((e.target as HTMLElement).tagName === "INPUT") { + setNameFocused(false) + } + } + document.addEventListener("focusin", handleFocusIn) + document.addEventListener("focusout", handleFocusOut) + return () => { + document.removeEventListener("focusin", handleFocusIn) + document.removeEventListener("focusout", handleFocusOut) + } + }, []) + + // Memoised base (deterministic) part of generated name (without random suffix) + const generatedNameBase = useMemo(() => { + if (!selectedVariantRevisionIds.length || !selectedTestsetId) return "" + const variant = data?.variants?.find((v) => selectedVariantRevisionIds.includes(v.id)) + const testset = testsets?.find((ts) => ts._id === selectedTestsetId) + if (!variant || !testset) return "" + return `${variant.variantName}-v${variant.revision}-${testset.name}` + }, [selectedVariantRevisionIds, selectedTestsetId, data?.variants, testsets]) + + // Auto-generate / update evaluation name intelligently to avoid loops + const lastAutoNameRef = useRef("") + const lastBaseRef = useRef("") + useEffect(() => { + if (evaluationType !== "human") return + if (!generatedNameBase) return + if (nameFocused) return // user typing + + // When base (variant/testset) changed → generate new suggestion + if (generatedNameBase !== lastBaseRef.current) { + const randomWord = Math.random().toString(36).substring(2, 7) + const newName = `${generatedNameBase}-${randomWord}` + const shouldUpdate = !evaluationName || evaluationName === lastAutoNameRef.current + lastBaseRef.current = generatedNameBase + lastAutoNameRef.current = newName + if (shouldUpdate) { + setEvaluationName(newName) + } + return + } + + // If user cleared the field (blur) -> restore auto-name + if (!evaluationName) { + setEvaluationName(lastAutoNameRef.current) + } + }, [generatedNameBase, evaluationName, nameFocused, evaluationType]) + + const [rateLimitValues, setRateLimitValues] = useState({ + batch_size: 10, + max_retries: 3, + retry_delay: 3, + delay_between_batches: 5, + }) + const [correctAnswerColumn, setCorrectAnswerColumn] = useState("correct_answer") + + const validateSubmission = useCallback(async () => { + if (evaluationType === "human" && !evaluationName) { + message.error("Please enter evaluation name") + return false + } + if (!selectedTestsetId) { + message.error("Please select a test set") + return false + } + if (selectedVariantRevisionIds.length === 0) { + message.error("Please select app variant") + return false + } + if (selectedEvalConfigs.length === 0) { + message.error("Please select evaluator configuration") + return false + } + if ( + !preview && + selectedEvalConfigs.some( + (id) => + evaluatorConfigs.find((config) => config.id === id)?.evaluator_key === + "auto_ai_critique", + ) && + (await redirectIfNoLLMKeys({secrets})) + ) { + message.error("LLM keys are required for AI Critique configuration") + return false + } + + // Validate variant + if (selectedVariantRevisionIds.length > 0) { + const revisions = data?.variants?.filter((rev) => + selectedVariantRevisionIds.includes(rev.id), + ) + if (!revisions?.length) { + message.error("Please select variant") + return false + } + const variantInputs = revisions.map((rev) => ({ + inputParams: rev.inputParams, + variantName: rev.variantName, + })) + + const testset = await fetchTestset(selectedTestsetId) + if (!testset) { + message.error("Please select a test set") + return false + } + const testsetColumns = Object.keys(testset?.csvdata[0] || {}) + + if (!testsetColumns.length) { + message.error("Please select a correct testset which has test cases") + return false + } + const isInputParamsAndTestsetColumnsMatch = variantInputs.every((input) => { + const inputParams = input.inputParams + return inputParams.some((param) => testsetColumns.includes(param.name)) + }) + + if (!isInputParamsAndTestsetColumnsMatch) { + message.error( + "The testset columns do not match the selected variant input parameters", + ) + return false + } + } + return true + }, [ + selectedTestsetId, + selectedVariantRevisionIds, + selectedEvalConfigs, + evaluatorConfigs, + secrets, + preview, + evaluationName, + ]) + + const onSubmit = useCallback(async () => { + setSubmitLoading(true) + try { + if (!(await validateSubmission())) return + + const revisions = data?.variants + + // Narrow evalDataSource with runtime guards for correct typing + let evalDataSource: typeof evaluatorConfigs | typeof evaluators + if (preview) { + evalDataSource = evaluators + + const selectionData = { + name: evaluationName, + revisions: revisions + ?.filter((rev) => selectedVariantRevisionIds.includes(rev.id)) + .filter(Boolean), + testset: testsets?.find((testset) => testset._id === selectedTestsetId), + evaluators: selectedEvalConfigs + .map((id) => + (evalDataSource || []).find((config) => { + return config.id === id + }), + ) + .filter(Boolean), + rate_limit: rateLimitValues, + correctAnswerColumn, + } + + if ( + !selectionData.revisions?.length || + !selectionData.testset || + !selectionData.evaluators?.length || + (evaluationType === "human" && !evaluationName) + ) { + message.error( + `Please select a test set, app variant, ${evaluationType === "human" ? "evaluation name, and" : " and"} evaluator configuration. Missing: ${ + !selectionData.revisions?.length ? "app revision" : "" + } ${!selectionData.testset ? "test set" : ""} ${ + !selectionData.evaluators?.length + ? "evaluators" + : evaluationType === "human" && !evaluationName + ? "evaluation name" + : "" + }`, + ) + setSubmitLoading(false) + return + } else { + const data = await createPreviewEvaluationRun(structuredClone(selectionData)) + + const runId = data.run.runs[0].id + router.push(`/apps/${appId}/evaluations/single_model_test/${runId}`) + } + } else { + createEvaluation(appId, { + testset_id: selectedTestsetId, + revisions_ids: selectedVariantRevisionIds, + evaluators_configs: selectedEvalConfigs, + rate_limit: rateLimitValues, + correct_answer_column: correctAnswerColumn, + }) + .then(onSuccess) + .catch(console.error) + .finally(() => setSubmitLoading(false)) + } + } catch (error) { + console.error(error) + setSubmitLoading(false) + } finally { + setSubmitLoading(false) + } + + return + }, [ + appId, + selectedTestsetId, + selectedVariantRevisionIds, + selectedEvalConfigs, + rateLimitValues, + evaluatorConfigs, + correctAnswerColumn, + evaluationName, + data?.variants, + testsets, + evaluators, + evaluatorConfigs, + preview, + validateSubmission, + ]) + + return ( + +
    + New {evaluationType === "auto" ? "Auto" : "Human"} Evaluation +
    +
    + {evaluationType === "auto" ? ( + + ) : null} + +
    +
    + } + onOk={onSubmit} + okText="Create" + centered + closeIcon={null} + destroyOnHidden + maskClosable={false} + width={1200} + className={classes.modalContainer} + okButtonProps={{icon: , loading: submitLoading}} + {...props} + > + + + ) +} + +export default memo(NewEvaluationModal) diff --git a/web/ee/src/components/pages/evaluations/NewEvaluation/types.ts b/web/ee/src/components/pages/evaluations/NewEvaluation/types.ts new file mode 100644 index 0000000000..7957691e1b --- /dev/null +++ b/web/ee/src/components/pages/evaluations/NewEvaluation/types.ts @@ -0,0 +1,74 @@ +import type {Dispatch, HTMLProps, SetStateAction} from "react" + +import {ModalProps} from "antd" + +import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" +import {LLMRunRateLimit, Evaluator, EvaluatorConfig, testset} from "@/oss/lib/Types" +import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" + +export interface NewEvaluationModalProps extends ModalProps { + onSuccess?: () => void + evaluationType: "auto" | "human" + preview?: boolean +} + +export interface NewEvaluationModalContentProps extends HTMLProps { + evaluationType: "auto" | "human" + activePanel: string | null + selectedTestsetId: string + selectedVariantRevisionIds: string[] + selectedEvalConfigs: string[] + evaluationName: string + preview?: boolean + isLoading?: boolean + setSelectedTestsetId: Dispatch> + onSuccess?: () => void + handlePanelChange: (key: string | string[]) => void + setSelectedVariantRevisionIds: Dispatch> + setSelectedEvalConfigs: Dispatch> + setEvaluationName: Dispatch> + isOpen?: boolean + testSets: testset[] + variants?: EnhancedVariant[] + evaluators: Evaluator[] | EvaluatorDto<"response">[] + evaluatorConfigs: EvaluatorConfig[] +} + +export interface SelectVariantSectionProps extends HTMLProps { + isVariantLoading: boolean + variants?: EnhancedVariant[] + selectedVariantRevisionIds: string[] + setSelectedVariantRevisionIds: Dispatch> + handlePanelChange: (key: string | string[]) => void + evaluationType: "auto" | "human" +} + +export interface SelectTestsetSectionProps extends HTMLProps { + testSets: testset[] + selectedTestsetId: string + setSelectedTestsetId: Dispatch> + handlePanelChange: (key: string | string[]) => void + preview?: boolean +} + +export interface SelectEvaluatorSectionProps extends HTMLProps { + evaluatorConfigs: EvaluatorConfig[] + evaluators: Evaluator[] + selectedEvalConfigs: string[] + setSelectedEvalConfigs: Dispatch> + handlePanelChange: (key: string | string[]) => void + preview?: boolean +} + +export interface AdvancedSettingsPopoverProps { + setRateLimitValues: Dispatch> + rateLimitValues: LLMRunRateLimit + setCorrectAnswerColumn: Dispatch> + correctAnswerColumn: string + preview?: boolean +} + +export interface NewEvaluationModalGenericProps + extends Omit { + preview?: Preview +} diff --git a/web/ee/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx new file mode 100644 index 0000000000..3f8dd980ad --- /dev/null +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx @@ -0,0 +1,673 @@ +// @ts-nocheck +import {useEffect, useMemo, useRef, useState} from "react" + +import {MoreOutlined} from "@ant-design/icons" +import { + ArrowsLeftRight, + Database, + Export, + Gauge, + GearSix, + Note, + Plus, + Rocket, + Trash, +} from "@phosphor-icons/react" +import {Button, Dropdown, DropdownProps, message, Space, Table, Tag, theme, Typography} from "antd" +import {ColumnsType} from "antd/es/table" +import dayjs from "dayjs" +import {useAtom} from "jotai" +import uniqBy from "lodash/uniqBy" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" + +import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" +import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" +import {getAppValues} from "@/oss/contexts/app.context" +import {useAppId} from "@/oss/hooks/useAppId" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {evaluatorsAtom} from "@/oss/lib/atoms/evaluation" +import {formatDate24, formatDay} from "@/oss/lib/helpers/dateTimeHelper" +import {calcEvalDuration, getTypedValue} from "@/oss/lib/helpers/evaluate" +import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" +import {shortPoll} from "@/oss/lib/helpers/utils" +import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" +import {_Evaluation, EvaluationStatus, GenericObject} from "@/oss/lib/Types" +import { + deleteEvaluations, + fetchAllEvaluations, + fetchEvaluationStatus, +} from "@/oss/services/evaluations/api" + +import {runningStatuses, statusMapper} from "../cellRenderers/cellRenderers" +import StatusRenderer from "../cellRenderers/StatusRenderer" +import EvaluationErrorPopover from "../EvaluationErrorProps/EvaluationErrorPopover" + +import {useStyles} from "./assets/styles" +import EvaluatorsModal from "./EvaluatorsModal/EvaluatorsModal" +import EditColumns, {generateEditItems} from "./Filters/EditColumns" +import {getFilterParams} from "./Filters/SearchFilter" + +const NewEvaluationModal = dynamic(() => import("../NewEvaluation"), { + ssr: false, +}) + +const AutoEvaluation = () => { + const classes = useStyles() + const appId = useAppId() + const router = useRouter() + const {token} = theme.useToken() + + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + const [evaluationList, setEvaluationList] = useState<_Evaluation[]>([]) + const [newEvalModalOpen, setNewEvalModalOpen] = useState(false) + const [isEvalLoading, setIsEvalLoading] = useState(false) + const [evaluators] = useAtom(evaluatorsAtom) + const [selectedEvalRecord, setSelectedEvalRecord] = useState<_Evaluation>() + const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) + const [isDeleteEvalMultipleModalOpen, setIsDeleteEvalMultipleModalOpen] = useState(false) + const [editColumns, setEditColumns] = useState([]) + const [isFilterColsDropdownOpen, setIsFilterColsDropdownOpen] = useState(false) + const [isConfigEvaluatorModalOpen, setIsConfigEvaluatorModalOpen] = useQueryParam( + "configureEvaluatorModal", + "", + ) + const stoppers = useRef() + const [current, setCurrent] = useState(0) + + const runningEvaluationIds = useMemo( + () => + evaluationList + .filter((item) => runningStatuses.includes(item.status.value)) + .map((item) => item.id), + [evaluationList, runningStatuses], + ) + + useEffect(() => { + stoppers.current?.() + + if (runningEvaluationIds.length) { + stoppers.current = shortPoll( + () => + Promise.all(runningEvaluationIds.map((id) => fetchEvaluationStatus(id))) + .then((res) => { + setEvaluationList((prev) => { + const newEvals = [...prev] + runningEvaluationIds.forEach((id, ix) => { + const index = newEvals.findIndex((e) => e.id === id) + if (index !== -1) { + newEvals[index].status = res[ix].status + newEvals[index].duration = calcEvalDuration(newEvals[index]) + } + }) + if ( + res.some((item) => !runningStatuses.includes(item.status.value)) + ) { + fetchEvaluations() + } + return newEvals + }) + }) + .catch(console.error), + {delayMs: 5000, timeoutMs: Infinity}, + ).stopper + } + + return () => { + stoppers.current?.() + } + }, [JSON.stringify(runningEvaluationIds)]) + + useEffect(() => { + if (!appId) return + + fetchEvaluations() + }, [appId]) + + useEffect(() => { + const defaultColumnNames = columns.flatMap((col) => + "children" in col ? [col.key, ...col.children.map((child) => child.key)] : [col.key], + ) + setEditColumns(defaultColumnNames as string[]) + }, [isEvalLoading]) + + const fetchEvaluations = async () => { + try { + setIsEvalLoading(true) + const [allEvaluations] = await Promise.all([fetchAllEvaluations(appId)]) + const result = allEvaluations.sort( + (a, b) => + new Date(b.created_at || 0).getTime() - new Date(a.created_at || 0).getTime(), + ) + setEvaluationList(result) + } catch (error) { + console.error(error) + } finally { + setIsEvalLoading(false) + } + } + + const handleDeleteMultipleEvaluations = async () => { + const evaluationsIds = selectedRowKeys.map((key) => key.toString()) + try { + setIsEvalLoading(true) + await deleteEvaluations(evaluationsIds) + setEvaluationList((prevEvaluationsList) => + prevEvaluationsList.filter((evaluation) => !evaluationsIds.includes(evaluation.id)), + ) + setSelectedRowKeys([]) + message.success("Evaluations Deleted") + } catch (error) { + console.error(error) + } finally { + setIsEvalLoading(false) + } + } + + const handleDeleteEvaluation = async (record: _Evaluation) => { + try { + setIsEvalLoading(true) + await deleteEvaluations([record.id]) + setEvaluationList((prevEvaluationsList) => + prevEvaluationsList.filter((evaluation) => ![record.id].includes(evaluation.id)), + ) + message.success("Evaluation Deleted") + } catch (error) { + console.error(error) + } finally { + setIsEvalLoading(false) + } + } + + const compareDisabled = useMemo(() => { + const evalList = evaluationList.filter((e) => selectedRowKeys.includes(e.id)) + + return ( + evalList.length < 2 || + evalList.some( + (item) => + item.status.value === EvaluationStatus.STARTED || + item.status.value === EvaluationStatus.INITIALIZED || + item.testset.id !== evalList[0].testset.id, + ) + ) + }, [selectedRowKeys]) + + const onToggleEvaluatorVisibility = (evalConfigId: string) => { + if (!editColumns.includes(evalConfigId)) { + setEditColumns([...editColumns, evalConfigId]) + } else { + setEditColumns(editColumns.filter((item) => item !== evalConfigId)) + } + } + + const handleOpenChangeEditCols: DropdownProps["onOpenChange"] = (nextOpen, info) => { + if (info.source === "trigger" || nextOpen) { + setIsFilterColsDropdownOpen(nextOpen) + } + } + + const handleNavigation = (variantRevisionId: string) => { + router.push({ + pathname: `/apps/${appId}/playground`, + query: { + revisions: JSON.stringify([variantRevisionId]), + }, + }) + } + + const evaluatorConfigs = useMemo( + () => + uniqBy( + evaluationList + .map((item) => + item.aggregated_results.map((item) => ({ + ...item.evaluator_config, + evaluator: evaluators.find( + (e) => e.key === item.evaluator_config.evaluator_key, + ), + })), + ) + .flat(), + "id", + ), + [evaluationList], + ) + + const columns: ColumnsType<_Evaluation> = [ + { + title: "Variant", + dataIndex: "variants", + key: "variants", + fixed: "left", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (value, record) => { + return ( + + ) + }, + ...getFilterParams("variants", "text"), + }, + { + title: "Testset", + dataIndex: "testsetName", + key: "testsetName", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_, record) => { + return {record.testset.name} + }, + ...getFilterParams("testset", "text"), + }, + { + title: "Status", + dataIndex: "status", + key: "status", + onHeaderCell: () => ({ + style: {minWidth: 240}, + }), + render: (_, record) => { + return + }, + ...getFilterParams("status", "text"), + }, + { + title: "Results", + key: "results", + onHeaderCell: () => ({style: {minWidth: 240}}), + children: evaluatorConfigs.map((evaluator) => ({ + title: () => { + return ( +
    + {evaluator.name} + + {evaluator.evaluator?.name} + +
    + ) + }, + key: evaluator.name, + onHeaderCell: () => ({style: {minWidth: 240}}), + sortDirections: ["descend", "ascend"], + sorter: { + compare: (a, b) => { + const getSortValue = (item: _Evaluation, evaluatorId: string) => { + const matchingResult = item.aggregated_results.find( + (result) => result.evaluator_config.id === evaluatorId, + ) + + if (matchingResult && typeof matchingResult.result.value === "number") { + return matchingResult.result.value + } + + return 0 + } + + return getSortValue(a, evaluator.id) - getSortValue(b, evaluator.id) + }, + }, + render: (_, record) => { + if (!evaluators?.length) return + + const matchingResults = record.aggregated_results.filter( + (result) => result.evaluator_config.id === evaluator.id, + ) + + if (matchingResults.length === 0) { + return - + } + + return ( + + {matchingResults.map((result, index) => + result.result.error ? ( + + ) : ( + + {getTypedValue(result.result)} + + ), + )} + + ) + }, + })), + }, + { + title: "Created on", + dataIndex: "created_at", + key: "createdAt", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + sorter: { + compare: (a, b) => dayjs(a.created_at).valueOf() - dayjs(b.created_at).valueOf(), + }, + render: (_, record) => { + return formatDay({date: record.created_at}) + }, + ...getFilterParams("created_at", "date"), + }, + { + title: "Avg. Latency", + dataIndex: "average_latency", + key: "average_latency", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + sorter: { + compare: (a, b) => + Number(a.average_latency?.value) - Number(b.average_latency?.value), + }, + render: (_, record) => { + return getTypedValue(record.average_latency) + }, + ...getFilterParams("average_latency", "number"), + }, + { + title: "Total Cost", + dataIndex: "average_cost", + key: "average_cost", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + sorter: { + compare: (a, b) => Number(a.average_cost?.value) - Number(b.average_cost?.value), + }, + render: (_, record) => { + return getTypedValue(record.average_cost) + }, + ...getFilterParams("total_cost", "number"), + }, + { + title: , + key: "key", + width: 56, + fixed: "right", + align: "center", + render: (_, record) => { + return ( + , + onClick: (e) => { + e.domEvent.stopPropagation() + if ( + record.status.value === EvaluationStatus.FINISHED || + record.status.value === + EvaluationStatus.FINISHED_WITH_ERRORS + ) { + router.push( + `/apps/${appId}/evaluations/results/${record.id}`, + ) + } + }, + }, + { + key: "variant", + label: "View variant", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + handleNavigation(record.variant_revision_ids[0]) + }, + }, + { + key: "view_testset", + label: "View test set", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + router.push(`/testsets/${record.testset.id}`) + }, + }, + {type: "divider"}, + { + key: "delete_eval", + label: "Delete", + icon: , + danger: true, + onClick: (e) => { + e.domEvent.stopPropagation() + setSelectedEvalRecord(record) + setIsDeleteEvalModalOpen(true) + }, + }, + ], + }} + > + + + + + + + + { + onToggleEvaluatorVisibility(key) + setIsFilterColsDropdownOpen(true) + }} + /> + +
    + +
    { + setSelectedRowKeys(selectedRowKeys) + }, + }} + className="ph-no-capture" + columns={editedColumns} + rowKey={"id"} + dataSource={evaluationList} + scroll={{x: true}} + bordered + pagination={false} + onRow={(record) => ({ + style: { + cursor: [ + EvaluationStatus.FINISHED_WITH_ERRORS, + EvaluationStatus.FINISHED, + ].includes(record.status.value) + ? "pointer" + : "not-allowed", + }, + onClick: () => { + if ( + record.status.value === EvaluationStatus.FINISHED || + record.status.value === EvaluationStatus.FINISHED_WITH_ERRORS + ) { + router.push(`/apps/${appId}/evaluations/results/${record.id}`) + } + }, + })} + /> + + { + setNewEvalModalOpen(false) + }} + onSuccess={() => { + setNewEvalModalOpen(false) + fetchEvaluations() + }} + evaluationType="auto" + /> + + {isConfigEvaluatorModalOpen === "open" && ( + setIsConfigEvaluatorModalOpen("")} + current={current} + setCurrent={setCurrent} + /> + )} + + {selectedEvalRecord && ( + setIsDeleteEvalModalOpen(false)} + onOk={async () => { + await handleDeleteEvaluation(selectedEvalRecord) + setIsDeleteEvalModalOpen(false) + }} + evaluationType={"automatic evaluation"} + /> + )} + {isDeleteEvalMultipleModalOpen && ( + setIsDeleteEvalMultipleModalOpen(false)} + onOk={async () => { + await handleDeleteMultipleEvaluations() + setIsDeleteEvalMultipleModalOpen(false) + }} + evaluationType={"single model evaluation"} + /> + )} + + ) +} + +export default AutoEvaluation diff --git a/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/AdvancedSettings.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/AdvancedSettings.tsx new file mode 100644 index 0000000000..39cf95e20d --- /dev/null +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/AdvancedSettings.tsx @@ -0,0 +1,125 @@ +import {CaretRightOutlined, InfoCircleOutlined} from "@ant-design/icons" +import Editor from "@monaco-editor/react" +import { + Form, + Input, + InputNumber, + Switch, + Tooltip, + Collapse, + theme, + AutoComplete, + Select, +} from "antd" +import {createUseStyles} from "react-jss" + +import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" +import {generatePaths} from "@/oss/lib/transformers" + +const useStyles = createUseStyles((theme: any) => ({ + label: { + display: "flex", + alignItems: "center", + gap: "0.5rem", + }, + editor: { + border: `1px solid ${theme.colorBorder}`, + borderRadius: theme.borderRadius, + overflow: "hidden", + }, +})) + +interface AdvancedSettingsProps { + settings: Record[] + selectedTestcase: { + testcase: Record | null + } +} + +const AdvancedSettings: React.FC = ({settings, selectedTestcase}) => { + const classes = useStyles() + const {appTheme} = useAppTheme() + const {token} = theme.useToken() + + return ( + } + > + + {settings.map((field) => { + const rules = [ + {required: field.required ?? true, message: "This field is required"}, + ] + + return ( + + {field.label} + {field.description && ( + + + + )} + + } + initialValue={field.default} + rules={rules} + > + {(field.type === "string" || field.type === "regex") && + selectedTestcase.testcase ? ( + + option!.value + .toUpperCase() + .indexOf(inputValue.toUpperCase()) !== -1 + } + /> + ) : field.type === "string" || field.type === "regex" ? ( + + ) : field.type === "number" ? ( + + ) : field.type === "boolean" || field.type === "bool" ? ( + + ) : field.type === "text" ? ( + + ) : field.type === "code" ? ( + + ) : field.type === "multiple_choice" ? ( + + ) : type === "hidden" ? ( + + ) : type === "messages" ? ( + + ) : type === "number" ? ( + + ) : type === "boolean" || type === "bool" ? ( + + ) : type === "text" ? ( + + ) : type === "code" ? ( + + ) : type === "object" ? ( + + ) : null} + + )} + + {ExternalHelpInfo} + + ) +} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorTestcaseModal.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorTestcaseModal.tsx similarity index 93% rename from web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorTestcaseModal.tsx rename to web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorTestcaseModal.tsx index 67f511a914..1f7904602d 100644 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorTestcaseModal.tsx +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorTestcaseModal.tsx @@ -5,7 +5,7 @@ import {Play} from "@phosphor-icons/react" import {Button, Divider, Input, Menu, Modal, Table, Typography} from "antd" import {ColumnsType} from "antd/es/table" -import {Testset} from "@/oss/lib/Types" +import {TestSet} from "@/oss/lib/Types" import {fetchTestset} from "@/oss/services/testsets/api" import {useEvaluatorTestcaseModalStyles as useStyles} from "./assets/styles" @@ -20,7 +20,7 @@ const EvaluatorTestcaseModal = ({ }: EvaluatorTestcaseModalProps) => { const classes = useStyles() const [isLoadingTestset, setIsLoadingTestset] = useState(false) - const [testsetCsvData, setTestsetCsvData] = useState([]) + const [testsetCsvData, setTestsetCsvData] = useState([]) const [selectedRowKeys, setSelectedRowKeys] = useState([]) const [searchTerm, setSearchTerm] = useState("") @@ -80,11 +80,11 @@ const EvaluatorTestcaseModal = ({ }, } - const loadTestcase = () => { - const selectedTestcase = testsetCsvData.find((_, index) => index === selectedRowKeys[0]) + const loadTestCase = () => { + const selectedTestCase = testsetCsvData.find((_, index) => index === selectedRowKeys[0]) - if (selectedTestcase) { - setSelectedTestcase({testcase: selectedTestcase}) + if (selectedTestCase) { + setSelectedTestcase({testcase: selectedTestCase}) props.onCancel?.({} as any) } } @@ -94,12 +94,12 @@ const EvaluatorTestcaseModal = ({ centered width={1150} closeIcon={null} - okText="Load testcase" + okText="Load test case" okButtonProps={{ icon: , iconPosition: "end", disabled: !selectedRowKeys.length, - onClick: loadTestcase, + onClick: loadTestCase, loading: isLoadingTestset, }} className={classes.container} diff --git a/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorVariantModal.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorVariantModal.tsx new file mode 100644 index 0000000000..822db23a83 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorVariantModal.tsx @@ -0,0 +1,142 @@ +import { + useCallback, + useMemo, + useState, + useEffect, + type ComponentProps, + type Dispatch, + type SetStateAction, + type Key, +} from "react" + +import {CloseOutlined} from "@ant-design/icons" +import {Play} from "@phosphor-icons/react" +import {Button, Input, Modal, Typography} from "antd" +import {createUseStyles} from "react-jss" + +import VariantsTable from "@/oss/components/VariantsComponents/Table" +import {JSSTheme, Variant as BaseVariant} from "@/oss/lib/Types" + +type Variant = BaseVariant & {id?: string} +type EvaluatorVariantModalProps = { + variants: Variant[] | null + setSelectedVariant: Dispatch> + selectedVariant: Variant | null +} & ComponentProps + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + title: { + fontSize: theme.fontSizeHeading4, + lineHeight: theme.lineHeightLG, + fontWeight: theme.fontWeightStrong, + }, + container: { + "& .ant-modal-body": { + height: 600, + }, + }, + table: { + "& .ant-table-thead > tr > th": { + height: 32, + padding: "0 16px", + }, + "& .ant-table-tbody > tr > td": { + height: 48, + padding: "0 16px", + }, + }, +})) + +const EvaluatorVariantModal = ({ + variants, + setSelectedVariant, + selectedVariant, + ...props +}: EvaluatorVariantModalProps) => { + const classes = useStyles() + const [searchTerm, setSearchTerm] = useState("") + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + + // Clear selection when modal is opened + useEffect(() => { + if (props.open) { + const newKey = selectedVariant?.variantId ?? null + setSelectedRowKeys(newKey ? [newKey] : []) + } + }, [props.open, selectedVariant]) + + const filtered = useMemo(() => { + if (!searchTerm) return variants + if (variants) { + return variants.filter((item) => + item.variantName.toLowerCase().includes(searchTerm.toLowerCase()), + ) + } + }, [searchTerm, variants]) + + const loadVariant = useCallback(() => { + const selectedVariant = filtered?.find( + (variant) => variant.variantId === selectedRowKeys[0], + ) + + if (selectedVariant) { + setSelectedVariant(selectedVariant) + props.onCancel?.({} as any) + } + }, [filtered, selectedRowKeys, setSelectedVariant, props]) + + return ( + , + iconPosition: "end", + disabled: !selectedRowKeys.length, + onClick: loadVariant, + }} + title={ +
    + + Select variant to run + +
    + } + centered + {...props} + > +
    + setSearchTerm(e.target.value)} + placeholder="Search" + allowClear + className="w-[240px]" + /> + + setSelectedRowKeys(value), + type: "radio", + }} + isLoading={false} + onRowClick={() => {}} + rowKey={"variantId"} + className={classes.table} + showActionsDropdown={false} + /> +
    +
    + ) +} + +export default EvaluatorVariantModal diff --git a/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/Messages.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/Messages.tsx new file mode 100644 index 0000000000..0d61c1762a --- /dev/null +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/Messages.tsx @@ -0,0 +1,177 @@ +import {useEffect} from "react" + +import {MinusCircleOutlined, PlusOutlined} from "@ant-design/icons" +import Editor from "@monaco-editor/react" +import {Button, Col, Form, Row, Select} from "antd" +import isEqual from "lodash/isEqual" +import {createUseStyles} from "react-jss" + +const useStyles = createUseStyles((theme: any) => ({ + editor: { + border: `1px solid ${theme.colorBorder}`, + borderRadius: theme.borderRadius, + overflow: "hidden", + width: "98% !important", + }, + messageContainer: { + overflowX: "hidden", + }, +})) + +interface Message { + role: string + content: string +} + +interface MessagesProps { + value?: Message[] + onChange?: (messages: Message[]) => void +} + +const roleOptions = [ + {label: "System", value: "system"}, + {label: "User", value: "user"}, + {label: "Assistant", value: "assistant"}, +] + +export const Messages: React.FC = ({value = [], onChange}) => { + const classes = useStyles() + const form = Form.useFormInstance() + + useEffect(() => { + const currentMessages = form.getFieldValue("messages") + if (!isEqual(currentMessages, value)) { + if (typeof value === "string") { + form.setFieldsValue({messages: [{role: "system", content: value}]}) + } else { + form.setFieldsValue({messages: value}) + } + } + }, [value]) + + return ( + + {(fields, {add, remove}) => ( + <> + {fields.map(({key, name, ...restField}, index) => ( + +
    + + + + + + + {basicSettingsFields.length ? ( + + + Parameters + + {basicSettingsFields.map((field) => ( + + ))} + + ) : ( + "" + )} + + {advancedSettingsFields.length > 0 && ( + + )} + + + + + + + + + + + + + ) +} + +export default ConfigureEvaluator diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/types.ts b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/types.ts similarity index 100% rename from web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/types.ts rename to web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/types.ts diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/DeleteModal.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/DeleteModal.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/DeleteModal.tsx rename to web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/DeleteModal.tsx diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/EvaluatorCard.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/EvaluatorCard.tsx similarity index 99% rename from web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/EvaluatorCard.tsx rename to web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/EvaluatorCard.tsx index 4b83b35d1b..18c4196392 100644 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/EvaluatorCard.tsx +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/Evaluators/EvaluatorCard.tsx @@ -115,7 +115,7 @@ const EvaluatorCard = ({ extra={ > openedFromNewEvaluation?: boolean - appId?: string | null } const EvaluatorsModal = ({ current, setCurrent, openedFromNewEvaluation = false, - appId: appIdOverride, - ...modalProps + ...props }: EvaluatorsModalProps) => { - const routeAppId = useAppId() - const appId = appIdOverride ?? routeAppId + const appId = useAppId() const [debugEvaluator, setDebugEvaluator] = useLocalStorage("isDebugSelectionOpen", false) const [evaluators] = useAtom(evaluatorsAtom) const [evaluatorConfigs] = useAtom(evaluatorConfigsAtom) const [selectedEvaluator, setSelectedEvaluator] = useState(null) const {refetchEvaluatorConfigs, isLoadingEvaluatorConfigs: fetchingEvalConfigs} = - useFetchEvaluatorsData({appId: appId ?? ""}) + useFetchEvaluatorsData() const [selectedTestcase, setSelectedTestcase] = useState<{ testcase: Record | null }>({ testcase: null, }) - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() const [selectedVariant, setSelectedVariant] = useState(null) const [editMode, setEditMode] = useState(false) const [cloneConfig, setCloneConfig] = useState(false) @@ -58,7 +54,7 @@ const EvaluatorsModal = ({ "list", ) const [selectedTestset, setSelectedTestset] = useState("") - const {testsets} = useTestsetsData() + const {data: testsets} = useTestsets() useEffect(() => { if (testsets?.length) { @@ -66,9 +62,9 @@ const EvaluatorsModal = ({ } }, [testsets]) - const {variants: data} = useStatelessVariants() + const {data} = useVariants(currentApp)({appId}) - const variants = useMemo(() => groupVariantsByParent(data, true), [data]) + const variants = useMemo(() => groupVariantsByParent(data?.variants, true), [data?.variants]) useEffect(() => { if (variants?.length) { @@ -82,7 +78,7 @@ const EvaluatorsModal = ({ content: ( modalProps.onCancel?.({} as any)} + handleOnCancel={() => props.onCancel?.({} as any)} setCurrent={setCurrent} setSelectedEvaluator={setSelectedEvaluator} fetchingEvalConfigs={fetchingEvalConfigs} @@ -100,7 +96,7 @@ const EvaluatorsModal = ({ modalProps.onCancel?.({} as any)} + handleOnCancel={() => props.onCancel?.({} as any)} setSelectedEvaluator={setSelectedEvaluator} setEvaluatorsDisplay={setEvaluatorsDisplay} evaluatorsDisplay={evaluatorsDisplay} @@ -113,7 +109,7 @@ const EvaluatorsModal = ({ fetchingEvalConfigs, evaluatorsDisplay, evaluators, - modalProps.onCancel, + props.onCancel, setCurrent, setSelectedEvaluator, debugEvaluator, @@ -134,7 +130,7 @@ const EvaluatorsModal = ({ selectedEvaluator={selectedEvaluator} setCurrent={setCurrent} handleOnCancel={() => { - modalProps.onCancel?.({} as any) + props.onCancel?.({} as any) setEditMode(false) setCloneConfig(false) setEditEvalEditValues(null) @@ -145,7 +141,7 @@ const EvaluatorsModal = ({ refetchEvaluatorConfigs() setEditMode(false) if (openedFromNewEvaluation) { - modalProps.onCancel?.({} as any) + props.onCancel?.({} as any) } else { setCurrent(0) } @@ -164,7 +160,6 @@ const EvaluatorsModal = ({ debugEvaluator={debugEvaluator} selectedTestset={selectedTestset} setSelectedTestset={setSelectedTestset} - appId={appId} /> ), }) @@ -175,20 +170,20 @@ const EvaluatorsModal = ({ footer={null} closeIcon={null} title={null} - height="85vh" - width="90vw" - className="[&_>_div]:!h-full [&_.ant-modal-content]:!h-full !overflow-y-hidden min-w-[600px] max-w-[95vw] min-h-[600px]" + height={800} + width="min-content" + className="[&_>_div]:!h-full [&_.ant-modal-content]:!h-full !overflow-y-hidden min-w-[600px] max-w-[1800px]" classNames={{body: "!h-full !overflow-auto"}} maskClosable={false} - {...modalProps} + {...props} >
    _div]:!h-full", { - "max-w-[600px]": current === 2 && !debugEvaluator, - "max-w-[95vw]": current !== 2 || debugEvaluator, + "w-[600px]": current === 2 && !debugEvaluator, + "w-[90vw]": current !== 2 || debugEvaluator, }, ])} > diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorCard.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorCard.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorCard.tsx rename to web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorCard.tsx diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorList.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorList.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorList.tsx rename to web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/NewEvaluatorList.tsx diff --git a/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/index.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/index.tsx new file mode 100644 index 0000000000..6a6366d809 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/index.tsx @@ -0,0 +1,142 @@ +import {useMemo, useState} from "react" + +import {CloseOutlined} from "@ant-design/icons" +import {ArrowLeft} from "@phosphor-icons/react" +import {Button, Divider, Flex, Input, Radio, Space, Typography} from "antd" +import {createUseStyles} from "react-jss" + +import {getEvaluatorTags} from "@/oss/lib/helpers/evaluate" +import {Evaluator, JSSTheme} from "@/oss/lib/Types" + +import NewEvaluatorList from "./NewEvaluatorList" + +interface NewEvaluatorProps { + setCurrent: React.Dispatch> + handleOnCancel: () => void + evaluators: Evaluator[] + setSelectedEvaluator: React.Dispatch> + setEvaluatorsDisplay: any + evaluatorsDisplay: string +} + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + title: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + "& .ant-typography": { + fontSize: theme.fontSizeHeading4, + fontWeight: theme.fontWeightStrong, + lineHeight: theme.lineHeightLG, + }, + }, + subTitle: { + fontSize: theme.fontSizeLG, + lineHeight: theme.lineHeightLG, + fontWeight: theme.fontWeightMedium, + }, + radioBtnContainer: { + display: "flex", + alignItems: "center", + gap: theme.marginXS, + "& .ant-radio-button-wrapper": { + borderRadius: theme.borderRadius, + borderInlineStartWidth: "1px", + "&:before": { + width: 0, + }, + "&:not(.ant-radio-button-wrapper-checked)": { + border: "none", + "&:hover": { + backgroundColor: theme.colorBgTextHover, + }, + }, + }, + }, +})) + +const NewEvaluator = ({ + evaluators, + setCurrent, + handleOnCancel, + setSelectedEvaluator, + setEvaluatorsDisplay, + evaluatorsDisplay, +}: NewEvaluatorProps) => { + const classes = useStyles() + const [searchTerm, setSearchTerm] = useState("") + const evaluatorTags = getEvaluatorTags() + const [selectedEvaluatorCategory, setSelectedEvaluatorCategory] = useState("view_all") + + const filteredEvaluators = useMemo(() => { + let filtered = evaluators + + if (selectedEvaluatorCategory !== "view_all") { + filtered = filtered.filter((item) => item.tags.includes(selectedEvaluatorCategory)) + } + + if (searchTerm) { + filtered = filtered.filter((item) => + item.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) + } + + return filtered + }, [searchTerm, selectedEvaluatorCategory, evaluators]) + + return ( +
    +
    +
    + +
    +
    +
    + setSelectedEvaluatorCategory(e.target.value)} + > + View all + + {evaluatorTags.map((val, idx) => ( + + {val.label} + + ))} + + + + setSearchTerm(e.target.value)} + placeholder="Search" + allowClear + /> + +
    +
    + +
    + +
    + +
    +
    + ) +} + +export default NewEvaluator diff --git a/web/ee/src/components/pages/evaluations/autoEvaluation/Filters/EditColumns.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/Filters/EditColumns.tsx new file mode 100644 index 0000000000..c509b7ddda --- /dev/null +++ b/web/ee/src/components/pages/evaluations/autoEvaluation/Filters/EditColumns.tsx @@ -0,0 +1,104 @@ +import {Columns} from "@phosphor-icons/react" +import {Button, Dropdown, Space, Checkbox} from "antd" +import {ColumnsType} from "antd/es/table" +import {createUseStyles} from "react-jss" + +const useStyles = createUseStyles(() => ({ + dropdownMenu: { + "&>.ant-dropdown-menu-item": { + "& .anticon-check": { + display: "none", + }, + }, + "&>.ant-dropdown-menu-item-selected": { + "&:not(:hover)": { + backgroundColor: "transparent !important", + }, + "& .anticon-check": { + display: "inline-flex !important", + }, + }, + }, + button: { + display: "flex", + alignItems: "center", + }, +})) + +export const generateEditItems = (columns: ColumnsType, editColumns: string[]) => { + return columns + .filter((col) => col.key !== "key") + .flatMap((col) => [ + { + key: col.key, + label: ( + + + {col.title as string} + + ), + }, + ...(("children" in col && + col.children?.map((child) => ({ + key: child.key, + label: ( + + + {child.key as string} + + ), + }))) || + []), + ]) +} + +interface EditColumnsProps { + isOpen: boolean + handleOpenChange: ( + open: boolean, + info: { + source: "trigger" | "menu" + }, + ) => void + shownCols: string[] + items: any + onClick: ({key}: {key: string}) => void + buttonText?: string +} + +const EditColumns = ({ + isOpen, + handleOpenChange, + shownCols, + items, + onClick, + buttonText, +}: EditColumnsProps) => { + const classes = useStyles() + + return ( + + + + ) +} + +export default EditColumns diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/Filters/SearchFilter.tsx b/web/ee/src/components/pages/evaluations/autoEvaluation/Filters/SearchFilter.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/autoEvaluation/Filters/SearchFilter.tsx rename to web/ee/src/components/pages/evaluations/autoEvaluation/Filters/SearchFilter.tsx diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/assets/styles.ts b/web/ee/src/components/pages/evaluations/autoEvaluation/assets/styles.ts similarity index 100% rename from web/oss/src/components/pages/evaluations/autoEvaluation/assets/styles.ts rename to web/ee/src/components/pages/evaluations/autoEvaluation/assets/styles.ts diff --git a/web/oss/src/components/pages/evaluations/cellRenderers/StatusRenderer.tsx b/web/ee/src/components/pages/evaluations/cellRenderers/StatusRenderer.tsx similarity index 100% rename from web/oss/src/components/pages/evaluations/cellRenderers/StatusRenderer.tsx rename to web/ee/src/components/pages/evaluations/cellRenderers/StatusRenderer.tsx diff --git a/web/ee/src/components/pages/evaluations/cellRenderers/cellRenderers.tsx b/web/ee/src/components/pages/evaluations/cellRenderers/cellRenderers.tsx new file mode 100644 index 0000000000..b43e0eb670 --- /dev/null +++ b/web/ee/src/components/pages/evaluations/cellRenderers/cellRenderers.tsx @@ -0,0 +1,262 @@ +import {memo, useCallback, useEffect, useState} from "react" + +import {type ICellRendererParams} from "@ag-grid-community/core" +import { + CopyOutlined, + FullscreenExitOutlined, + FullscreenOutlined, + InfoCircleOutlined, +} from "@ant-design/icons" +import {GlobalToken, Space, Tooltip, Typography, message, theme} from "antd" +import dayjs from "dayjs" +import duration from "dayjs/plugin/duration" +import relativeTime from "dayjs/plugin/relativeTime" +import Link from "next/link" +import {createUseStyles} from "react-jss" + +import {useDurationCounter} from "@/oss/hooks/useDurationCounter" +import {getTypedValue} from "@/oss/lib/helpers/evaluate" +import { + EvaluationStatus, + EvaluatorConfig, + JSSTheme, + _Evaluation, + _EvaluationScenario, +} from "@/oss/lib/Types" +dayjs.extend(relativeTime) +dayjs.extend(duration) + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + statusCell: { + display: "flex", + alignItems: "center", + gap: "0.25rem", + height: "100%", + marginBottom: 0, + + "& > div:nth-of-type(1)": { + height: 6, + aspectRatio: 1 / 1, + borderRadius: "50%", + }, + }, + dot: { + height: 3, + aspectRatio: 1 / 1, + borderRadius: "50%", + backgroundColor: "#8c8c8c", + marginTop: 2, + }, + date: { + color: "#8c8c8c", + }, + longCell: { + height: "100%", + position: "relative", + overflow: "hidden", + textOverflow: "ellipsis", + whiteSpace: "nowrap", + "& .ant-space": { + position: "absolute", + bottom: 2, + right: 0, + height: 35, + backgroundColor: theme.colorBgContainer, + padding: "0.5rem", + borderRadius: theme.borderRadius, + border: `1px solid ${theme.colorBorder}`, + display: "none", + }, + "&:hover .ant-space": { + display: "inline-flex", + }, + }, +})) + +export function LongTextCellRenderer(params: ICellRendererParams, output?: any) { + const {value, api, node} = params + const [expanded, setExpanded] = useState( + node.rowHeight !== api.getSizesForCurrentTheme().rowHeight, + ) + const classes = useStyles() + + const onCopy = useCallback(() => { + navigator.clipboard + .writeText(value as string) + .then(() => { + message.success("Copied to clipboard") + }) + .catch(console.error) + }, [value]) + + const onExpand = useCallback(() => { + const cells = document.querySelectorAll(`[row-id='${node.id}'] .ag-cell > *`) + const cellsArr = Array.from(cells || []) + const defaultHeight = api.getSizesForCurrentTheme().rowHeight + if (!expanded) { + cellsArr.forEach((cell) => { + cell.setAttribute( + "style", + "overflow: visible; white-space: pre-wrap; text-overflow: unset;", + ) + }) + const height = Math.max(...cellsArr.map((cell) => cell.scrollHeight)) + node.setRowHeight(height <= defaultHeight ? defaultHeight * 2 : height + 10) + } else { + cellsArr.forEach((cell) => { + cell.setAttribute( + "style", + "overflow: hidden; white-space: nowrap; text-overflow: ellipsis;", + ) + }) + node.setRowHeight(defaultHeight) + } + api.onRowHeightChanged() + }, [expanded, api, node]) + + useEffect(() => { + node.addEventListener("heightChanged", () => { + setExpanded(node.rowHeight !== api.getSizesForCurrentTheme().rowHeight) + }) + }, [api, node]) + + return ( +
    + {output ? output : value} + + {expanded ? ( + + ) : ( + + )} + + +
    + ) +} + +export const ResultRenderer = memo( + ( + params: ICellRendererParams<_EvaluationScenario> & { + config: EvaluatorConfig + }, + ) => { + const result = params.data?.results.find( + (item) => item.evaluator_config === params.config.id, + )?.result + + return {getTypedValue(result)} + }, + (prev, next) => prev.value === next.value, +) + +export const runningStatuses = [EvaluationStatus.INITIALIZED, EvaluationStatus.STARTED] +export const statusMapper = (token: GlobalToken) => (status: EvaluationStatus) => { + const statusMap = { + [EvaluationStatus.PENDING]: { + label: "Pending", + color: token.colorTextSecondary, + }, + [EvaluationStatus.INCOMPLETE]: { + label: "Incomplete", + color: token.colorTextSecondary, + }, + [EvaluationStatus.INITIALIZED]: { + label: "Queued", + color: token.colorTextSecondary, + }, + [EvaluationStatus.STARTED]: { + label: "Running", + color: token.colorWarning, + }, + [EvaluationStatus.FINISHED]: { + label: "Completed", + color: token.colorSuccess, + }, + [EvaluationStatus.SUCCESS]: { + label: "Completed", + color: token.colorSuccess, + }, + [EvaluationStatus.ERROR]: { + label: "Failed", + color: token.colorError, + }, + [EvaluationStatus.FAILURE]: { + label: "Failed", + color: token.colorError, + }, + [EvaluationStatus.FINISHED_WITH_ERRORS]: { + label: "Completed with Errors", + color: token.colorWarning, + }, + [EvaluationStatus.AGGREGATION_FAILED]: { + label: "Result Aggregation Failed", + color: token.colorWarning, + }, + } + + return ( + statusMap[status] || { + label: "Unknown", + color: "purple", + } + ) +} + +export const StatusRenderer = memo( + (params: ICellRendererParams<_Evaluation>) => { + const classes = useStyles() + const {token} = theme.useToken() + const duration = useDurationCounter( + params.data?.duration || 0, + runningStatuses.includes(params.value), + ) + const {label, color} = statusMapper(token)(params.data?.status.value as EvaluationStatus) + const errorMsg = params.data?.status.error?.message + const errorStacktrace = params.data?.status.error?.stacktrace + + return ( + +
    + {label} + {errorMsg && ( + + + + + + )} + + {duration} + + ) + }, + (prev, next) => prev.value === next.value && prev.data?.duration === next.data?.duration, +) + +export const LinkCellRenderer = memo( + (params: ICellRendererParams & {href: string}) => { + const {value, href} = params + return {value} + }, + (prev, next) => prev.value === next.value && prev.href === next.href, +) + +export const DateFromNowRenderer = memo( + (params: ICellRendererParams) => { + const [date, setDate] = useState(params.value) + + useEffect(() => { + const interval = setInterval(() => { + setDate((date: any) => dayjs(date).add(1, "second").valueOf()) + }, 60000) + return () => clearInterval(interval) + }, []) + + return {dayjs(date).fromNow()} + }, + (prev, next) => prev.value === next.value, +) diff --git a/web/oss/src/components/pages/evaluations/evaluationCompare/EvaluationCompare.tsx b/web/ee/src/components/pages/evaluations/evaluationCompare/EvaluationCompare.tsx similarity index 93% rename from web/oss/src/components/pages/evaluations/evaluationCompare/EvaluationCompare.tsx rename to web/ee/src/components/pages/evaluations/evaluationCompare/EvaluationCompare.tsx index 61b43a505d..f019678dbb 100644 --- a/web/oss/src/components/pages/evaluations/evaluationCompare/EvaluationCompare.tsx +++ b/web/ee/src/components/pages/evaluations/evaluationCompare/EvaluationCompare.tsx @@ -6,28 +6,24 @@ import {Button, DropdownProps, Space, Spin, Tag, Tooltip, Typography} from "antd import {useAtom} from "jotai" import uniqBy from "lodash/uniqBy" import Link from "next/link" -import {useRouter} from "next/router" import {createUseStyles} from "react-jss" import AgCustomHeader from "@/oss/components/AgCustomHeader/AgCustomHeader" import CompareOutputDiff from "@/oss/components/CompareOutputDiff/CompareOutputDiff" import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" +import {getAppValues} from "@/oss/contexts/app.context" import {useAppId} from "@/oss/hooks/useAppId" import {useQueryParam} from "@/oss/hooks/useQuery" -import useURL from "@/oss/hooks/useURL" import {evaluatorsAtom} from "@/oss/lib/atoms/evaluation" import AgGridReact, {type AgGridReactType} from "@/oss/lib/helpers/agGrid" import {getColorPairFromStr, getRandomColors} from "@/oss/lib/helpers/colors" import {getFilterParams, getTypedValue, removeCorrectAnswerPrefix} from "@/oss/lib/helpers/evaluate" import {escapeNewlines} from "@/oss/lib/helpers/fileManipulations" import {formatCurrency, formatLatency} from "@/oss/lib/helpers/formatters" -import {isValidId} from "@/oss/lib/helpers/serviceValidations" import {getStringOrJson} from "@/oss/lib/helpers/utils" import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" -import {ComparisonResultRow, EvaluatorConfig, JSSTheme, Testset, _Evaluation} from "@/oss/lib/Types" +import {ComparisonResultRow, EvaluatorConfig, JSSTheme, TestSet, _Evaluation} from "@/oss/lib/Types" import {fetchAllComparisonResults} from "@/oss/services/evaluations/api" -import {getAppValues} from "@/oss/state/app" import {LongTextCellRenderer} from "../cellRenderers/cellRenderers" import EvaluationErrorModal from "../EvaluationErrorProps/EvaluationErrorModal" @@ -75,20 +71,17 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ interface Props {} const EvaluationCompareMode: FC = () => { - const router = useRouter() const appId = useAppId() const classes = useStyles() const {appTheme} = useAppTheme() const [evaluationIdsStr = ""] = useQueryParam("evaluations") - const evaluationIdsArray = evaluationIdsStr - .split(",") - .filter((item) => !!item && isValidId(item)) + const evaluationIdsArray = evaluationIdsStr.split(",").filter((item) => !!item) const [evalIds, setEvalIds] = useState(evaluationIdsArray) const [hiddenVariants, setHiddenVariants] = useState([]) const [fetching, setFetching] = useState(false) const [scenarios, setScenarios] = useState<_Evaluation[]>([]) const [rows, setRows] = useState([]) - const [testset, setTestset] = useState() + const [testset, setTestset] = useState() const [evaluators] = useAtom(evaluatorsAtom) const [gridRef, setGridRef] = useState>() const [isFilterColsDropdownOpen, setIsFilterColsDropdownOpen] = useState(false) @@ -100,31 +93,6 @@ const EvaluationCompareMode: FC = () => { errorType: "invoke" as "invoke" | "evaluation", }) const [isErrorModalOpen, setIsErrorModalOpen] = useState(false) - const {baseAppURL, projectURL} = useURL() - // breadcrumbs - const isAppScope = router.asPath.includes("/apps/") - const evaluationsHref = - isAppScope && appId - ? `${baseAppURL}/${appId}/evaluations?selectedEvaluation=auto_evaluation` - : `${projectURL}/evaluations?selectedEvaluation=auto_evaluation` - const breadcrumbKey = isAppScope && appId ? "appPage" : "projectPage" - - useBreadcrumbsEffect( - { - breadcrumbs: { - [breadcrumbKey]: { - label: "auto evaluation", - href: evaluationsHref, - }, - "eval-compare": { - label: "compare", - }, - }, - type: "append", - condition: evaluationIdsArray.length > 0, - }, - [evaluationIdsArray, evaluationsHref, breadcrumbKey], - ) const handleOpenChangeDiff: DropdownProps["onOpenChange"] = (nextOpen, info) => { if (info.source === "trigger" || nextOpen) { @@ -154,7 +122,7 @@ const EvaluationCompareMode: FC = () => { }, [variants]) const evaluationIds = useMemo( - () => evaluationIdsStr.split(",").filter((item) => !!item && isValidId(item)), + () => evaluationIdsStr.split(",").filter((item) => !!item), [evaluationIdsStr], ) @@ -493,8 +461,7 @@ const EvaluationCompareMode: FC = () => { Testset: - // TODO: REPLACE WITH NEXT/LINK - + {testset?.name || ""} @@ -532,7 +499,7 @@ const EvaluationCompareMode: FC = () => { } > {variantNameWithRev({ variant_name: v.variants[0].variantName ?? "", diff --git a/web/oss/src/components/pages/evaluations/evaluationScenarios/EvaluationScenarios.tsx b/web/ee/src/components/pages/evaluations/evaluationScenarios/EvaluationScenarios.tsx similarity index 89% rename from web/oss/src/components/pages/evaluations/evaluationScenarios/EvaluationScenarios.tsx rename to web/ee/src/components/pages/evaluations/evaluationScenarios/EvaluationScenarios.tsx index d627f7c75c..6c42f8e88f 100644 --- a/web/oss/src/components/pages/evaluations/evaluationScenarios/EvaluationScenarios.tsx +++ b/web/ee/src/components/pages/evaluations/evaluationScenarios/EvaluationScenarios.tsx @@ -3,7 +3,7 @@ import {type FC, useEffect, useMemo, useState} from "react" import {type ColDef, type ICellRendererParams} from "@ag-grid-community/core" import {CheckOutlined, DeleteOutlined, DownloadOutlined} from "@ant-design/icons" import {DropdownProps, Space, Spin, Tag, Tooltip, Typography} from "antd" -import {useAtom, useAtomValue} from "jotai" +import {useAtom} from "jotai" import uniqBy from "lodash/uniqBy" import {useRouter} from "next/router" import {createUseStyles} from "react-jss" @@ -13,8 +13,8 @@ import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" import CompareOutputDiff from "@/oss/components/CompareOutputDiff/CompareOutputDiff" import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" +import {useAppsData} from "@/oss/contexts/app.context" import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" import {evaluatorsAtom} from "@/oss/lib/atoms/evaluation" import AgGridReact, {type AgGridReactType} from "@/oss/lib/helpers/agGrid" import {formatDate} from "@/oss/lib/helpers/dateTimeHelper" @@ -23,11 +23,9 @@ import {escapeNewlines} from "@/oss/lib/helpers/fileManipulations" import {formatCurrency, formatLatency} from "@/oss/lib/helpers/formatters" import {getStringOrJson} from "@/oss/lib/helpers/utils" import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" import {CorrectAnswer, EvaluatorConfig, JSSTheme, _EvaluationScenario} from "@/oss/lib/Types" -import {deleteEvaluations} from "@/oss/services/evaluations/api" +import {deleteEvaluations, fetchAllEvaluationScenarios} from "@/oss/services/evaluations/api" import {fetchAllEvaluators} from "@/oss/services/evaluators" -import {currentAppAtom} from "@/oss/state/app" import {LongTextCellRenderer, ResultRenderer} from "../cellRenderers/cellRenderers" import EvaluationErrorModal from "../EvaluationErrorProps/EvaluationErrorModal" @@ -52,14 +50,12 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ }, })) -interface Props { - scenarios: _EvaluationScenario[] -} +interface Props {} -const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { +const EvaluationScenarios: FC = () => { const router = useRouter() const appId = useAppId() - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() const classes = useStyles() const {appTheme} = useAppTheme() const evaluationId = router.query.evaluation_id as string @@ -67,31 +63,11 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { const [fetching, setFetching] = useState(false) const [evaluators, setEvaluators] = useAtom(evaluatorsAtom) const [gridRef, setGridRef] = useState>() - const evalaution = scenarios?.[0]?.evaluation + const evalaution = scenarios[0]?.evaluation const [selectedCorrectAnswer, setSelectedCorrectAnswer] = useState(["noDiffColumnIsSelected"]) const [isFilterColsDropdownOpen, setIsFilterColsDropdownOpen] = useState(false) const [isDiffDropdownOpen, setIsDiffDropdownOpen] = useState(false) const [hiddenCols, setHiddenCols] = useState([]) - const {baseAppURL, projectURL} = useURL() - - // breadcrumbs - useBreadcrumbsEffect( - { - breadcrumbs: { - appPage: { - label: "auto evaluation", - href: `${baseAppURL}/${appId}/evaluations?selectedEvaluation=auto_evaluation`, - }, - "eval-detail": { - label: evaluationId, - value: evaluationId, - }, - }, - type: "append", - condition: !!evaluationId, - }, - [evaluationId, baseAppURL], - ) const handleOpenChangeFilterCols: DropdownProps["onOpenChange"] = (nextOpen, info) => { if (info.source === "trigger" || nextOpen) { @@ -105,10 +81,7 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { } } - const uniqueCorrectAnswers: CorrectAnswer[] = uniqBy( - scenarios?.[0]?.correct_answers || [], - "key", - ) + const uniqueCorrectAnswers: CorrectAnswer[] = uniqBy(scenarios[0]?.correct_answers || [], "key") const [modalErrorMsg, setModalErrorMsg] = useState({ message: "", stackTrace: "", @@ -120,7 +93,7 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { const colDefs: ColDef<_EvaluationScenario>[] = [] if (!scenarios.length || !evalaution) return colDefs - scenarios?.[0]?.inputs?.forEach((input, index) => { + scenarios[0]?.inputs.forEach((input, index) => { colDefs.push({ flex: 1, minWidth: 240, @@ -166,10 +139,7 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { cellRenderer: (params: any) => LongTextCellRenderer(params), }) }) - - const evalVariants = evalaution?.variants || [] - - evalVariants.forEach((_, index) => { + evalaution?.variants.forEach((_, index) => { colDefs.push({ flex: 1, minWidth: 300, @@ -214,10 +184,7 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { }, }) }) - - const evaluatorConfigs = scenarios?.[0]?.evaluators_configs || [] - - evaluatorConfigs.forEach((config, index) => { + scenarios[0]?.evaluators_configs.forEach((config, index) => { colDefs.push({ headerName: config?.name, hide: hiddenCols.includes(config.name), @@ -314,9 +281,12 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { const fetcher = () => { setFetching(true) - Promise.all([evaluators.length ? Promise.resolve(evaluators) : fetchAllEvaluators()]) - .then(([evaluators]) => { - setScenarios(_scenarios) + Promise.all([ + evaluators.length ? Promise.resolve(evaluators) : fetchAllEvaluators(), + fetchAllEvaluationScenarios(evaluationId), + ]) + .then(([evaluators, scenarios]) => { + setScenarios(scenarios) setEvaluators(evaluators) setTimeout(() => { if (!gridRef) return @@ -363,13 +333,13 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { message: "Are you sure you want to delete this evaluation?", onOk: () => deleteEvaluations([evaluationId]) - .then(() => router.push(`${baseAppURL}/${appId}/evaluations`)) + .then(() => router.push(`/apps/${appId}/evaluations`)) .catch(console.error), }) } return ( -
    +
    Evaluation Results
    @@ -378,19 +348,18 @@ const EvaluationScenarios: FC = ({scenarios: _scenarios}) => { Testset: - // TODO: REPLACE WITH NEXT/LINK - + {evalaution?.testset.name || ""} Variant: diff --git a/web/ee/src/components/pages/overview/automaticEvaluation/AutomaticEvalOverview.tsx b/web/ee/src/components/pages/overview/automaticEvaluation/AutomaticEvalOverview.tsx new file mode 100644 index 0000000000..aa00b5c857 --- /dev/null +++ b/web/ee/src/components/pages/overview/automaticEvaluation/AutomaticEvalOverview.tsx @@ -0,0 +1,474 @@ +// @ts-nocheck +import {useEffect, useMemo, useRef, useState} from "react" + +import {EditOutlined, MoreOutlined, PlusOutlined, SwapOutlined} from "@ant-design/icons" +import {Database, GearSix, Note, Rocket, Trash} from "@phosphor-icons/react" +import {Button, Dropdown, message, Popover, Space, Spin, Table, Tag, Typography} from "antd" +import {ColumnsType} from "antd/es/table" +import {useAtom} from "jotai" +import {useRouter} from "next/router" +import {createUseStyles} from "react-jss" + +import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" +import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" +import {evaluatorsAtom} from "@/oss/lib/atoms/evaluation" +import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" +import {calcEvalDuration, getTypedValue} from "@/oss/lib/helpers/evaluate" +import {shortPoll} from "@/oss/lib/helpers/utils" +import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" +import {_Evaluation, EvaluationStatus, EvaluatorConfig, JSSTheme} from "@/oss/lib/Types" +import { + deleteEvaluations, + fetchAllEvaluations, + fetchEvaluationStatus, +} from "@/oss/services/evaluations/api" + +import {runningStatuses} from "../../evaluations/cellRenderers/cellRenderers" +import StatusRenderer from "../../evaluations/cellRenderers/StatusRenderer" +import EvaluationErrorPopover from "../../evaluations/EvaluationErrorProps/EvaluationErrorPopover" +import NewEvaluationModal from "../../evaluations/NewEvaluation" + +const {Title} = Typography + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + container: { + display: "flex", + flexDirection: "column", + gap: theme.paddingXS, + "& > div h1.ant-typography": { + fontSize: theme.fontSize, + }, + }, + resultTag: { + minWidth: 150, + display: "flex", + cursor: "pointer", + alignItems: "stretch", + borderRadius: theme.borderRadiusSM, + border: `1px solid ${theme.colorBorder}`, + textAlign: "center", + "& > div:nth-child(1)": { + backgroundColor: "rgba(0, 0, 0, 0.02)", + lineHeight: theme.lineHeight, + flex: 1, + borderRight: `1px solid ${theme.colorBorder}`, + padding: "0 7px", + }, + "& > div:nth-child(2)": { + padding: "0 7px", + }, + }, +})) + +const AutomaticEvalOverview = () => { + const classes = useStyles() + const router = useRouter() + const appId = router.query.app_id as string + const [evaluationList, setEvaluationList] = useState<_Evaluation[]>([]) + const [evaluators] = useAtom(evaluatorsAtom) + const [isEvalLoading, setIsEvalLoading] = useState(false) + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + const [newEvalModalOpen, setNewEvalModalOpen] = useState(false) + const [_selectedConfigEdit, _setSelectedConfigEdit] = useState() + const [_isEditEvalConfigOpen, _setIsEditEvalConfigOpen] = useState(false) + const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) + const [selectedEvalRecord, setSelectedEvalRecord] = useState<_Evaluation>() + const stoppers = useRef() + + const {refetchAll} = useFetchEvaluatorsData() + + const runningEvaluationIds = useMemo( + () => + evaluationList + .filter((item) => runningStatuses.includes(item.status.value)) + .map((item) => item.id), + [evaluationList, runningStatuses], + ) + + useEffect(() => { + stoppers.current?.() + + if (runningEvaluationIds.length) { + stoppers.current = shortPoll( + () => + Promise.all(runningEvaluationIds.map((id) => fetchEvaluationStatus(id))) + .then((res) => { + setEvaluationList((prev) => { + const newEvals = [...prev] + runningEvaluationIds.forEach((id, ix) => { + const index = newEvals.findIndex((e) => e.id === id) + if (index !== -1) { + newEvals[index].status = res[ix].status + newEvals[index].duration = calcEvalDuration(newEvals[index]) + } + }) + if ( + res.some((item) => !runningStatuses.includes(item.status.value)) + ) + fetchEvaluations() + return newEvals + }) + }) + .catch(console.error), + {delayMs: 5000, timeoutMs: Infinity}, + ).stopper + } + + return () => { + stoppers.current?.() + } + }, [JSON.stringify(runningEvaluationIds)]) + + const rowSelection = { + onChange: (selectedRowKeys: React.Key[]) => { + setSelectedRowKeys(selectedRowKeys) + }, + } + + const compareDisabled = useMemo(() => { + const evalList = evaluationList.filter((e) => selectedRowKeys.includes(e.id)) + return ( + evalList.length < 2 || + evalList.some( + (item) => + item.status.value === EvaluationStatus.STARTED || + item.status.value === EvaluationStatus.INITIALIZED || + item.testset.id !== evalList[0].testset.id, + ) + ) + }, [selectedRowKeys]) + + const fetchEvaluations = async () => { + try { + setIsEvalLoading(true) + const [allEvaluations] = await Promise.all([fetchAllEvaluations(appId), refetchAll]) + const result = allEvaluations + .sort( + (a, b) => + new Date(b.created_at || 0).getTime() - + new Date(a.created_at || 0).getTime(), + ) + .slice(0, 5) + setEvaluationList(result) + } catch (error) { + console.error(error) + } finally { + setIsEvalLoading(false) + } + } + + useEffect(() => { + if (!appId) return + + fetchEvaluations() + }, [appId]) + + const handleNavigation = (variantRevisionId: string) => { + router.push({ + pathname: `/apps/${appId}/playground`, + query: { + revisions: JSON.stringify([variantRevisionId]), + }, + }) + } + + const handleDeleteEvaluation = async (record: _Evaluation) => { + try { + setIsEvalLoading(true) + await deleteEvaluations([record.id]) + setEvaluationList((prevEvaluationsList) => + prevEvaluationsList.filter((evaluation) => ![record.id].includes(evaluation.id)), + ) + message.success("Evaluation Deleted") + } catch (error) { + console.error(error) + } finally { + setIsEvalLoading(false) + } + } + + const columns: ColumnsType<_Evaluation> = [ + { + title: "Variant", + dataIndex: "variants", + key: "variants", + fixed: "left", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (value, record) => { + return ( + + ) + }, + }, + { + title: "Test set", + dataIndex: "testsetName", + key: "testsetName", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_, record) => { + return {record.testset.name} + }, + }, + { + title: "Status", + dataIndex: "status", + key: "status", + onHeaderCell: () => ({ + style: {minWidth: 240}, + }), + render: (_, record) => { + return + }, + }, + { + title: "Results", + dataIndex: "aggregated_results", + key: "results", + onHeaderCell: () => ({ + style: {minWidth: 240}, + }), + render: (_, record) => { + if (!evaluators?.length) return + return ( + + {record.aggregated_results.map((result, index) => { + const evaluator = evaluators.find( + (item) => item.key === result.evaluator_config.evaluator_key, + ) + + return result.result.error ? ( + + ) : ( + e.stopPropagation()} + > +
    + {result.evaluator_config.name} +
    +
    {getTypedValue(result.result)}
    +
    + } + title={ +
    e.stopPropagation()} + > + {evaluator?.name} + +
    + } + > +
    e.stopPropagation()} + className={classes.resultTag} + > +
    {result.evaluator_config.name}
    +
    {getTypedValue(result.result)}
    +
    + + ) + })} + + ) + }, + }, + { + title: "Created on", + dataIndex: "created_at", + key: "createdAt", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_, record) => { + return formatDay({date: record.created_at}) + }, + }, + { + title: "Avg. Latency", + dataIndex: "average_latency", + key: "average_latency", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_, record) => { + return getTypedValue(record.average_latency) + }, + }, + { + title: "Total Cost", + dataIndex: "average_cost", + key: "average_cost", + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_, record) => { + return getTypedValue(record.average_cost) + }, + }, + { + title: , + key: "key", + width: 56, + fixed: "right", + align: "center", + render: (_, record) => { + return ( + , + onClick: (e) => { + e.domEvent.stopPropagation() + router.push( + `/apps/${appId}/evaluations/results/${record.id}`, + ) + }, + }, + { + key: "variant", + label: "View variant", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + handleNavigation(record.variant_revision_ids[0]) + }, + }, + { + key: "view_testset", + label: "View test set", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + router.push(`/testsets/${record.testset.id}`) + }, + }, + {type: "divider"}, + { + key: "delete_eval", + label: "Delete", + icon: , + danger: true, + onClick: (e) => { + e.domEvent.stopPropagation() + setSelectedEvalRecord(record) + setIsDeleteEvalModalOpen(true) + }, + }, + ], + }} + > + + + + + + + +
    + + +
    ({ + style: {cursor: "pointer"}, + onClick: () => + router.push(`/apps/${appId}/evaluations/results/${record.id}`), + })} + /> + + + { + setNewEvalModalOpen(false) + }} + onSuccess={() => { + setNewEvalModalOpen(false) + fetchEvaluations() + }} + /> + + {selectedEvalRecord && ( + setIsDeleteEvalModalOpen(false)} + onOk={async () => { + await handleDeleteEvaluation(selectedEvalRecord) + setIsDeleteEvalModalOpen(false) + }} + evaluationType={"automatic evaluation"} + /> + )} + + ) +} + +export default AutomaticEvalOverview diff --git a/web/ee/src/components/pages/overview/deployments/HistoryConfig.tsx b/web/ee/src/components/pages/overview/deployments/HistoryConfig.tsx index 5c915177a2..17476ee54b 100644 --- a/web/ee/src/components/pages/overview/deployments/HistoryConfig.tsx +++ b/web/ee/src/components/pages/overview/deployments/HistoryConfig.tsx @@ -1,15 +1,14 @@ import {useMemo} from "react" import {Typography} from "antd" -import {useAtomValue} from "jotai" import {createUseStyles} from "react-jss" import {NewVariantParametersView} from "@/oss/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters" +import {useAppsData} from "@/oss/contexts/app.context" import {filterVariantParameters} from "@/oss/lib/helpers/utils" import {useVariants} from "@/oss/lib/hooks/useVariants" import {JSSTheme, Variant} from "@/oss/lib/Types" import {DeploymentRevisionConfig} from "@/oss/lib/types_ee" -import {currentAppAtom} from "@/oss/state/app" const useStyles = createUseStyles((theme: JSSTheme) => ({ title: { @@ -61,9 +60,14 @@ interface HistoryConfigProps { const HistoryConfig = ({depRevisionConfig, variant: propsVariant}: HistoryConfigProps) => { const classes = useStyles() - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() // @ts-ignore - const {data, isLoading} = useVariants(currentApp, [propsVariant]) + const {data, isLoading} = useVariants(currentApp)( + { + appId: currentApp?.app_id, + }, + [propsVariant], + ) const variant = useMemo( // @ts-ignore () => data?.variants.find((v) => v.id === propsVariant.id), diff --git a/web/ee/src/components/pages/overview/observability/ObservabilityOverview.tsx b/web/ee/src/components/pages/overview/observability/ObservabilityOverview.tsx index 34ffe5bf56..2a81cbb457 100644 --- a/web/ee/src/components/pages/overview/observability/ObservabilityOverview.tsx +++ b/web/ee/src/components/pages/overview/observability/ObservabilityOverview.tsx @@ -1,14 +1,16 @@ -import {useMemo} from "react" +import {useEffect, useState} from "react" import {AreaChart} from "@tremor/react" import {Col, Row, Spin, Typography} from "antd" import round from "lodash/round" import {createUseStyles} from "react-jss" -import {formatCurrency, formatLatency, formatNumber} from "@/oss/lib/helpers/formatters" +import {useAppId} from "@/oss/hooks/useAppId" +import {formatCurrency, formatNumber} from "@/oss/lib/helpers/formatters" import {JSSTheme} from "@/oss/lib/Types" +import {GenerationDashboardData} from "@/oss/lib/types_ee" +import {fetchGenerationsDashboardData} from "@/oss/services/observability/api" -import {useObservabilityDashboard} from "../../../../state/observability" import WidgetCard from "../../observability/dashboard/widgetCard" const useStyles = createUseStyles((theme: JSSTheme) => ({ @@ -19,29 +21,36 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ const ObservabilityOverview = () => { const classes = useStyles() - const {data, loading, isFetching} = useObservabilityDashboard() + const appId = useAppId() + const [loading, setLoading] = useState(false) + const [data, setData] = useState() - const chartData = useMemo(() => (data?.data?.length ? data.data : [{}]), [data]) + const defaultGraphProps: React.ComponentProps = { + className: "h-[168px] p-0", + colors: ["cyan", "red"], + connectNulls: true, + tickGap: 15, + curveType: "monotone", + showGridLines: false, + showLegend: false, + index: "timestamp", + data: data?.data?.length ? data.data : [{}], + categories: [], + } - const defaultGraphProps = useMemo>( - () => ({ - className: "h-[168px] p-0", - colors: ["cyan", "red"], - connectNulls: true, - tickGap: 15, - curveType: "monotone", - showGridLines: false, - showLegend: false, - index: "timestamp", - data: chartData, - categories: [], - }), - [chartData], - ) + useEffect(() => { + setLoading(true) + fetchGenerationsDashboardData(appId, {range: "30_days"}) + .then((data) => { + setData(data) + }) + .catch(console.error) + .finally(() => setLoading(false)) + }, [appId]) return (
    - +
    { Avg:{" "} {data?.avg_latency - ? `${formatNumber(data.avg_latency)}ms` + ? `${round(data?.avg_latency ?? 0, 2)}s` : "-"} } diff --git a/web/ee/src/components/pages/settings/Billing/Modals/PricingModal/assets/PricingCard/index.tsx b/web/ee/src/components/pages/settings/Billing/Modals/PricingModal/assets/PricingCard/index.tsx index 0c9f98ba30..980e9c9b53 100644 --- a/web/ee/src/components/pages/settings/Billing/Modals/PricingModal/assets/PricingCard/index.tsx +++ b/web/ee/src/components/pages/settings/Billing/Modals/PricingModal/assets/PricingCard/index.tsx @@ -8,31 +8,20 @@ import {PricingCardProps} from "../types" const PricingCard = ({plan, currentPlan, onOptionClick, isLoading}: PricingCardProps) => { const _isLoading = isLoading === plan.plan - const isDisabled = useMemo(() => { - if (isLoading !== null && isLoading !== plan.plan) { - return true - } - - if (currentPlan?.plan === plan.plan) { - return true - } - - if (currentPlan?.plan === Plan.Enterprise) { - return true - } - - if (currentPlan?.plan === Plan.Business && plan.plan === Plan.Pro) { - return true - } - - return false - }, [isLoading, currentPlan?.plan, plan.plan]) + const isDisabled = useMemo( + () => + (isLoading !== null && isLoading !== plan.plan) || + currentPlan?.plan == plan.plan || + currentPlan?.plan == Plan.Business || + currentPlan?.plan == Plan.Enterprise, + [isLoading, currentPlan, plan], + ) return ( window.open("https://cal.com/mahmoud-mabrouk-ogzgey/demo", "_blank") } > - {currentPlan?.plan == Plan.Enterprise ? "Current plan" : "Talk to us"} + {currentPlan?.plan == Plan.Business || currentPlan?.plan == Plan.Enterprise + ? "Current plan" + : "Talk to us"} ) : ( - - - - ) + const {currentApp} = useAppsData() + const [isDown, setIsDown] = useState(false) + const controllerRef = useRef(null) + const pollingRef = useRef(null) + const [isRetryUrlHealthLoading, setIsRetryUrlHealthLoading] = useState(false) + const [countdown, setCountdown] = useState(5) + const [isConnectionRestored, setIsConnectionRestored] = useState(false) + + const checkWorkflowUrlHealth = useCallback( + async (shouldThrow = false) => { + if (controllerRef.current) { + controllerRef.current.abort() + } + + const controller = new AbortController() + controllerRef.current = controller + + try { + const {status} = (await findCustomWorkflowPath(variant?.uri || "", "/health")) || {} + if (!status) throw new Error("Unable to establish connection") + setIsConnectionRestored(true) + } catch (error: any) { + if (error.name !== "AbortError") { + setIsDown(true) + setIsConnectionRestored(false) + if (shouldThrow) { + throw error + } + } + } + }, + [variant?.uri], + ) + + const startPollingWorkflowUrl = useCallback(() => { + if (pollingRef.current) clearInterval(pollingRef.current) + + pollingRef.current = setInterval(() => { + checkWorkflowUrlHealth() + }, 60000) + }, [checkWorkflowUrlHealth]) + + useEffect(() => { + if (currentApp?.app_type !== "custom") return + + checkWorkflowUrlHealth() + startPollingWorkflowUrl() + + return () => { + if (pollingRef.current) clearInterval(pollingRef.current) + if (controllerRef.current) controllerRef.current.abort() + } + }, [currentApp?.app_type, checkWorkflowUrlHealth, startPollingWorkflowUrl]) + + useEffect(() => { + if (isConnectionRestored) { + setCountdown(5) + const timer = setInterval(() => { + setCountdown((prevCountdown) => { + if (prevCountdown <= 1) { + clearInterval(timer) + setIsDown(false) + return 0 + } + return prevCountdown - 1 + }) + }, 1000) + + return () => clearInterval(timer) + } + }, [isConnectionRestored]) + + const retryWorkflowStatus = async () => { + try { + setIsRetryUrlHealthLoading(true) + await checkWorkflowUrlHealth(true) + startPollingWorkflowUrl() + } catch (error) { + message.error("Failed to restore connection") + } finally { + setIsRetryUrlHealthLoading(false) } + } + if (currentApp?.app_type === "custom" && isDown) { return ( - - + ) : ( + + + + + ) } /> ) diff --git a/web/oss/src/components/CustomWorkflowBanner/types.d.ts b/web/oss/src/components/CustomWorkflowBanner/types.d.ts index c4da59a20c..cd42e1c61d 100644 --- a/web/oss/src/components/CustomWorkflowBanner/types.d.ts +++ b/web/oss/src/components/CustomWorkflowBanner/types.d.ts @@ -1,4 +1,8 @@ +import {Dispatch, SetStateAction} from "react" + +import {Variant} from "@/oss/lib/Types" + export interface CustomWorkflowBannerProps { - showInPlayground?: boolean - layout?: "banner" | "card" + setIsCustomWorkflowModalOpen: Dispatch> + variant: Variant | undefined } diff --git a/web/oss/src/components/DeleteEvaluationModal/DeleteEvaluationModalWrapper.tsx b/web/oss/src/components/DeleteEvaluationModal/DeleteEvaluationModalWrapper.tsx deleted file mode 100644 index 24461b4330..0000000000 --- a/web/oss/src/components/DeleteEvaluationModal/DeleteEvaluationModalWrapper.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" - -import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" - -import { - closeDeleteEvaluationModalAtom, - deleteEvaluationModalAtom, -} from "./store/deleteEvaluationModalStore" - -const DeleteEvaluationModalWrapper = () => { - const state = useAtomValue(deleteEvaluationModalAtom) - const close = useSetAtom(closeDeleteEvaluationModalAtom) - - if (!state.open) return null - - return ( - close()} - onOk={() => state.onOk?.()} - evaluationType={state.evaluationType || "-"} - /> - ) -} - -export default DeleteEvaluationModalWrapper diff --git a/web/oss/src/components/DeleteEvaluationModal/store/deleteEvaluationModalStore.ts b/web/oss/src/components/DeleteEvaluationModal/store/deleteEvaluationModalStore.ts deleted file mode 100644 index be6640fd53..0000000000 --- a/web/oss/src/components/DeleteEvaluationModal/store/deleteEvaluationModalStore.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {atom} from "jotai" - -interface DeleteEvaluationModalState { - open: boolean - evaluationType?: string - onOk?: () => void -} - -export const deleteEvaluationModalAtom = atom({ - open: false, -}) - -export const openDeleteEvaluationModalAtom = atom( - null, - (get, set, params: {evaluationType: string; onOk: () => void}) => { - set(deleteEvaluationModalAtom, { - open: true, - evaluationType: params.evaluationType, - onOk: params.onOk, - }) - }, -) - -export const closeDeleteEvaluationModalAtom = atom(null, (get, set) => { - set(deleteEvaluationModalAtom, {open: false}) -}) diff --git a/web/oss/src/components/DeploymentCard/EnvironmentCardRow.tsx b/web/oss/src/components/DeploymentCard/EnvironmentCardRow.tsx deleted file mode 100644 index 2119599b07..0000000000 --- a/web/oss/src/components/DeploymentCard/EnvironmentCardRow.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import clsx from "clsx" - -import type {Environment} from "@/oss/lib/Types" - -import DeploymentCardSkeleton, {DEPLOYMENT_SKELETON_ENVIRONMENTS} from "./skeleton" - -import DeploymentCard from "./index" - -interface EnvironmentCardRowProps { - environments?: Environment[] - isLoading: boolean - selectedEnvName?: string - onCardClick?: (environment: Environment) => void - className?: string -} - -const EnvironmentCardRow = ({ - environments, - isLoading, - selectedEnvName, - onCardClick, - className, -}: EnvironmentCardRowProps) => { - const dataset = environments ?? [] - - return ( -
    - {isLoading - ? DEPLOYMENT_SKELETON_ENVIRONMENTS.map((envName) => ( - - )) - : dataset.map((env, index) => ( - onCardClick?.(env)} - /> - ))} -
    - ) -} - -export default EnvironmentCardRow diff --git a/web/oss/src/components/DeploymentCard/index.tsx b/web/oss/src/components/DeploymentCard/index.tsx index 57320a6ae3..3a14fb93a0 100644 --- a/web/oss/src/components/DeploymentCard/index.tsx +++ b/web/oss/src/components/DeploymentCard/index.tsx @@ -1,47 +1,56 @@ import type {ComponentProps} from "react" -import {useMemo} from "react" import {Card, Space, Tag, Typography} from "antd" -import {useAtomValue} from "jotai" +import {createUseStyles} from "react-jss" -import VariantNameCell from "@/oss/components/VariantNameCell" -import {Environment} from "@/oss/lib/Types" -import {deployedRevisionByEnvironmentAtomFamily} from "@/oss/state/variant/atoms/fetcher" +import {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" +import {AgentaConfigPrompt, EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" +import {Environment, JSSTheme} from "@/oss/lib/Types" import EnvironmentTagLabel, {deploymentStatusColors} from "../EnvironmentTagLabel" +import Version from "../Playground/assets/Version" -import {useDeploymentCardStyles} from "./styles" +const useStyles = createUseStyles((theme: JSSTheme) => ({ + deploymentCard: { + cursor: "pointer", + width: "100%", + transition: "all 0.25s ease-in", + position: "relative", + "& .ant-card-body": { + padding: theme.paddingSM, + display: "flex", + flexDirection: "column", + gap: theme.paddingXS, + "&:before": { + display: "none", + }, + "& > span.ant-typography:first-of-type": { + textTransform: "capitalize", + }, + }, + "&:hover": { + boxShadow: theme.boxShadowTertiary, + borderColor: "var(--hover-border-color)", + }, + }, +})) type DeploymentCardProps = { + selectedDeployedVariant: EnhancedVariant> | undefined env: Environment selectedEnv?: string } & ComponentProps -const DeploymentCard = ({env, selectedEnv, ...props}: DeploymentCardProps) => { - const classes = useDeploymentCardStyles() +const DeploymentCard = ({ + selectedDeployedVariant, + env, + selectedEnv, + ...props +}: DeploymentCardProps) => { + const classes = useStyles() const getBorderColor = (envName: string) => - deploymentStatusColors[envName.toLowerCase()]?.textColor - - const envName = env?.name ?? "" - const revisionAtom = useMemo(() => deployedRevisionByEnvironmentAtomFamily(envName), [envName]) - const revision = useAtomValue(revisionAtom) - - const revisionId = revision?.id - - let lastModifiedText = "-" - if (revision) { - const ts = (revision as any)?.updatedAtTimestamp ?? (revision as any)?.createdAtTimestamp - if (typeof ts === "number") { - try { - lastModifiedText = new Date(ts).toLocaleString() - } catch { - lastModifiedText = String(ts) - } - } else { - lastModifiedText = (revision as any)?.updatedAt ?? (revision as any)?.createdAt ?? "-" - } - } + deploymentStatusColors[envName.toLowerCase()].textColor return ( { Variant - {revisionId ? ( - + {env.deployed_variant_name ? ( + + {env.deployed_variant_name} + + ) : ( e.stopPropagation()}>No deployment )} Last modified - {lastModifiedText} + {selectedDeployedVariant?.updatedAt || "-"} ) } export default DeploymentCard - -export {default as DeploymentCardSkeleton, DEPLOYMENT_SKELETON_ENVIRONMENTS} from "./skeleton" diff --git a/web/oss/src/components/DeploymentCard/skeleton.tsx b/web/oss/src/components/DeploymentCard/skeleton.tsx deleted file mode 100644 index f3fd17be24..0000000000 --- a/web/oss/src/components/DeploymentCard/skeleton.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import {Card, Skeleton, Space, Typography} from "antd" - -import EnvironmentTagLabel, {deploymentStatusColors} from "@/oss/components/EnvironmentTagLabel" - -import {useDeploymentCardStyles} from "./styles" - -export const DEPLOYMENT_SKELETON_ENVIRONMENTS = ["Development", "Staging", "Production"] - -interface DeploymentCardSkeletonProps { - envName: string - isSelected?: boolean -} - -const DeploymentCardSkeleton = ({envName, isSelected}: DeploymentCardSkeletonProps) => { - const classes = useDeploymentCardStyles() - const borderColor = deploymentStatusColors[envName.toLowerCase()]?.textColor - - return ( - - - - - Variant - - - - - Last modified - - - - ) -} - -export default DeploymentCardSkeleton diff --git a/web/oss/src/components/DeploymentCard/styles.ts b/web/oss/src/components/DeploymentCard/styles.ts deleted file mode 100644 index 52a0a5d802..0000000000 --- a/web/oss/src/components/DeploymentCard/styles.ts +++ /dev/null @@ -1,28 +0,0 @@ -import {createUseStyles} from "react-jss" - -import {JSSTheme} from "@/oss/lib/Types" - -export const useDeploymentCardStyles = createUseStyles((theme: JSSTheme) => ({ - deploymentCard: { - cursor: "pointer", - width: "100%", - transition: "all 0.25s ease-in", - position: "relative", - "& .ant-card-body": { - padding: theme.paddingSM, - display: "flex", - flexDirection: "column", - gap: theme.paddingXS, - "&:before": { - display: "none", - }, - "& > span.ant-typography:first-of-type": { - textTransform: "capitalize", - }, - }, - "&:hover": { - boxShadow: theme.boxShadowTertiary, - borderColor: "var(--hover-border-color)", - }, - }, -})) diff --git a/web/oss/src/components/DeploymentsDashboard/assets/DeploymentDetails.tsx b/web/oss/src/components/DeploymentsDashboard/assets/DeploymentDetails.tsx index ee7c5fc120..e0b53dda44 100644 --- a/web/oss/src/components/DeploymentsDashboard/assets/DeploymentDetails.tsx +++ b/web/oss/src/components/DeploymentsDashboard/assets/DeploymentDetails.tsx @@ -13,7 +13,7 @@ interface DeploymentDetailsProps { const DeploymentDetails = ({revisionConfig, variant}: DeploymentDetailsProps) => { return ( import("@/oss/components/pages/app-management/components/ApiKeyInput"), @@ -29,156 +27,124 @@ const ApiKeyInput = dynamic( interface UseApiContentProps { variants: EnhancedVariant[] selectedEnvironment: DeploymentRevisions - revisionId?: string - handleOpenSelectDeployVariantModal: () => void } -const UseApiContent = ({ - selectedEnvironment, - revisionId, - handleOpenSelectDeployVariantModal, -}: UseApiContentProps) => { +const UseApiContent = ({selectedEnvironment, variants}: UseApiContentProps) => { const appId = useAppId() - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() const [selectedLang, setSelectedLang] = useState("python") const [apiKeyValue, setApiKeyValue] = useState("") - const hasDeployment = Boolean(selectedEnvironment?.deployed_app_variant_id) - const variantId = hasDeployment ? selectedEnvironment.deployed_app_variant_id : undefined - const {data: uri, isLoading: isUriQueryLoading} = useURI(appId, variantId) - const isLoading = Boolean(variantId) && isUriQueryLoading - - const latestRevisionForVariant = useAtomValue( - deployedRevisionByEnvironmentAtomFamily(selectedEnvironment.name), - ) as any - const variableNames = useAtomValue( - stablePromptVariablesAtomFamily(revisionId || latestRevisionForVariant?.id || ""), - ) as string[] + const {data: uri} = useURI(appId, selectedEnvironment.deployed_app_variant_id || "") const params = useMemo(() => { - const synthesized = variableNames.map((name) => ({name, input: name === "messages"})) + const _variant: any = (variants || []).find( + (item) => + (item?.id || item?.variantId) === + selectedEnvironment?.deployed_app_variant_revision_id, + ) + const {inputParams, isChatVariant} = _variant || {} - return createParams( - synthesized, + const params = createParams( + inputParams, selectedEnvironment?.name || "none", "add_a_value", + isChatVariant, currentApp, ) - }, [variableNames, selectedEnvironment?.name, currentApp]) - - const invokeLlmUrl = uri ?? "" - - const invokeLlmAppCodeSnippet = useMemo( - () => ({ - python: invokeLlmApppythonCode(invokeLlmUrl, params, apiKeyValue || "x.xxxxxxxx"), - bash: invokeLlmAppcURLCode(invokeLlmUrl, params, apiKeyValue || "x.xxxxxxxx"), - typescript: invokeLlmApptsCode(invokeLlmUrl, params, apiKeyValue || "x.xxxxxxxx"), - }), - [apiKeyValue, invokeLlmUrl, params], - ) - const fetchConfigCodeSnippet = useMemo( - () => ({ - python: fetchConfigpythonCode( - currentApp?.app_name!, - selectedEnvironment?.name!, - apiKeyValue || "x.xxxxxxxx", - ), - bash: fetchConfigcURLCode( - currentApp?.app_name!, - selectedEnvironment?.name!, - apiKeyValue || "x.xxxxxxxx", - ), - typescript: fetchConfigtsCode( - currentApp?.app_name!, - selectedEnvironment?.name!, - apiKeyValue || "x.xxxxxxxx", - ), - }), - [apiKeyValue, currentApp?.app_name, selectedEnvironment?.name], - ) - - const renderTabChildren = useCallback(() => { - if (!hasDeployment) { - return ( -
    -
    - -
    -
    - - No deployment yet - - - Deploy a variant to generate API credentials and client snippets for - this environment. - -
    - -
    - ) - } - - return ( -
    - - - - -
    - ) + return params }, [ - apiKeyValue, - fetchConfigCodeSnippet, - handleOpenSelectDeployVariantModal, - hasDeployment, - invokeLlmAppCodeSnippet, - invokeLlmUrl, - isLoading, - selectedLang, + variants, + currentApp, + selectedEnvironment?.deployed_app_variant_revision_id, + selectedEnvironment?.name, ]) - const tabItems = useMemo( - () => [ - { - key: "python", - label: "Python", - children: renderTabChildren(), - icon: , - }, - { - key: "typescript", - label: "TypeScript", - children: renderTabChildren(), - icon: , - }, - { - key: "bash", - label: "cURL", - children: renderTabChildren(), - icon: , - }, - ], - [renderTabChildren], - ) + const invokeLlmAppCodeSnippet: Record = { + python: invokeLlmApppythonCode(uri!, params, apiKeyValue || "x.xxxxxxxx"), + bash: invokeLlmAppcURLCode(uri!, params, apiKeyValue || "x.xxxxxxxx"), + typescript: invokeLlmApptsCode(uri!, params, apiKeyValue || "x.xxxxxxxx"), + } + + const fetchConfigCodeSnippet: Record = { + python: fetchConfigpythonCode( + currentApp?.app_name!, + selectedEnvironment?.name!, + apiKeyValue || "x.xxxxxxxx", + ), + bash: fetchConfigcURLCode( + currentApp?.app_name!, + selectedEnvironment?.name!, + apiKeyValue || "x.xxxxxxxx", + ), + typescript: fetchConfigtsCode( + currentApp?.app_name!, + selectedEnvironment?.name!, + apiKeyValue || "x.xxxxxxxx", + ), + } return ( + + + + ), + icon: , + }, + { + key: "typescript", + label: "TypeScript", + children: ( +
    + + +
    + ), + icon: , + }, + { + key: "bash", + label: "cURL", + children: ( +
    + + +
    + ), + icon: , + }, + ]} onChange={setSelectedLang} /> ) diff --git a/web/oss/src/components/DeploymentsDashboard/assets/VariantDetailsRenderer.tsx b/web/oss/src/components/DeploymentsDashboard/assets/VariantDetailsRenderer.tsx index 51bacd3612..c5bc436619 100644 --- a/web/oss/src/components/DeploymentsDashboard/assets/VariantDetailsRenderer.tsx +++ b/web/oss/src/components/DeploymentsDashboard/assets/VariantDetailsRenderer.tsx @@ -1,28 +1,15 @@ -import {Skeleton, Typography} from "antd" +import {Typography} from "antd" +import {DeploymentRevisionWithVariant} from ".." import VariantDetailsWithStatus from "../../VariantDetailsWithStatus" -import {DeploymentRevisionWithVariant} from "../atoms" -interface VariantDetailsRendererProps { - record: DeploymentRevisionWithVariant - isLoading?: boolean - showStable?: boolean -} - -const VariantDetailsRenderer = ({ - record, - isLoading = false, - ...props -}: VariantDetailsRendererProps) => { +const VariantDetailsRenderer = ({record}: {record: DeploymentRevisionWithVariant}) => { return record.variant ? ( - ) : isLoading ? ( - ) : ( This variant could not be found ) diff --git a/web/oss/src/components/DeploymentsDashboard/atoms/index.ts b/web/oss/src/components/DeploymentsDashboard/atoms/index.ts deleted file mode 100644 index 6a652a7e03..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/atoms/index.ts +++ /dev/null @@ -1,162 +0,0 @@ -import {type Key} from "react" - -import {atom} from "jotai" - -import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" -import {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {AgentaConfigPrompt} from "@/oss/lib/shared/variant/transformer/types" -import {DeploymentRevision, DeploymentRevisions} from "@/oss/lib/Types" - -import {revisionListAtom} from "../../Playground/state/atoms" - -export type DeploymentRevisionWithVariant = DeploymentRevision & { - variant: EnhancedVariant> | undefined - environment_revision: number -} - -// ============================================================================ -// BASE STATE ATOMS -// ============================================================================ - -/** - * Search term for filtering deployment revisions - */ -export const deploymentSearchAtom = atom("") - -/** - * Selected row keys in the deployment table - */ -export const selectedDeploymentRowKeysAtom = atom([]) - -/** - * Deployment note for publish operations - */ -export const deploymentNoteAtom = atom("") - -/** - * Selected revision row for details and operations - */ -export const selectedRevisionRowAtom = atom(undefined) - -/** - * Selected variant revision ID for revert operations - */ -export const selectedVariantRevisionIdToRevertAtom = atom("") - -/** - * Environment revisions data (synced from props) - */ -export const envRevisionsAtom = atom(undefined) - -// ============================================================================ -// UI STATE ATOMS -// ============================================================================ - -/** - * Modal states for deployment dashboard - */ -export const deploymentModalsAtom = atom({ - isDeployVariantModalOpen: false, - isSelectDeployVariantModalOpen: false, - isRevertModalOpen: false, - isUseApiDrawerOpen: false, - isRevisionsDetailsDrawerOpen: false, -}) - -// ============================================================================ -// SELECTOR ATOMS (DERIVED STATE) -// ============================================================================ - -/** - * Processed deployment revisions with variants and formatting - */ -export const processedDeploymentRevisionsAtom = atom((get) => { - const variants = get(revisionListAtom) || [] - const envRevisions = get(envRevisionsAtom) - - if (!envRevisions?.revisions) { - return [] - } - - return envRevisions.revisions - .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()) - .map((rev, index) => ({ - ...rev, - created_at: formatDay({date: rev.created_at}), - variant: variants.find((variant) => variant.id === rev.deployed_app_variant_revision), - environment_revision: envRevisions.revisions?.length - ? envRevisions.revisions.length - index - : 0, - })) -}) - -/** - * Filtered deployment revisions based on search term - */ -export const filteredDeploymentRevisionsAtom = atom((get) => { - const revisions = get(processedDeploymentRevisionsAtom) - const searchTerm = get(deploymentSearchAtom) - - if (!searchTerm) { - return revisions - } - - return revisions.filter( - (item) => - `v${item.revision}`.toLowerCase().includes(searchTerm.toLowerCase()) || - item.commit_message?.toLowerCase().includes(searchTerm.toLowerCase()), - ) -}) - -/** - * Selected variant for deployment (derived from selected row keys) - */ -export const selectedVariantToDeployAtom = atom((get) => { - const variants = get(revisionListAtom) || [] - const selectedKeys = get(selectedDeploymentRowKeysAtom) - return variants.find((variant) => variant.id === selectedKeys[0]) -}) - -/** - * Selected variant for revert (derived from revert selection) - */ -export const selectedVariantToRevertAtom = atom((get) => { - const variants = get(revisionListAtom) || [] - const selectedVariantRevisionId = get(selectedVariantRevisionIdToRevertAtom) - return variants.find((variant) => variant.id === selectedVariantRevisionId) -}) - -// ============================================================================ -// WRITE ATOMS (ACTIONS) -// ============================================================================ - -/** - * Action to update a specific modal state - */ -export const updateModalStateAtom = atom( - null, - (get, set, update: {modal: keyof typeof deploymentModalsAtom.init; isOpen: boolean}) => { - const currentState = get(deploymentModalsAtom) - set(deploymentModalsAtom, { - ...currentState, - [update.modal]: update.isOpen, - }) - }, -) - -/** - * Action to reset all UI state (useful after successful operations) - */ -export const resetDeploymentUIStateAtom = atom(null, (get, set) => { - set(deploymentNoteAtom, "") - set(selectedDeploymentRowKeysAtom, []) - set(selectedVariantRevisionIdToRevertAtom, "") - set(deploymentModalsAtom, { - isDeployVariantModalOpen: false, - isSelectDeployVariantModalOpen: false, - isRevertModalOpen: false, - isUseApiDrawerOpen: false, - isRevisionsDetailsDrawerOpen: false, - }) -}) diff --git a/web/oss/src/components/DeploymentsDashboard/components/Drawer/assets/DrawerDetails.tsx b/web/oss/src/components/DeploymentsDashboard/components/Drawer/assets/DrawerDetails.tsx deleted file mode 100644 index c4400953b6..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/components/Drawer/assets/DrawerDetails.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import {ArrowSquareOut} from "@phosphor-icons/react" -import {Button, Space, Tag, Typography} from "antd" -import {useAtomValue} from "jotai" -import {useRouter} from "next/router" -import {createUseStyles} from "react-jss" - -import { - filteredDeploymentRevisionsAtom, - selectedRevisionRowAtom, -} from "@/oss/components/DeploymentsDashboard/atoms" -import {useAppId} from "@/oss/hooks/useAppId" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" -import {JSSTheme} from "@/oss/lib/Types" -import {variantsLoadingAtom} from "@/oss/state/variant/atoms/fetcher" - -import VariantDetailsRenderer from "../../../assets/VariantDetailsRenderer" - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - title: { - fontSize: theme.fontSizeHeading5, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeightHeading5, - }, - subTitle: { - fontSize: theme.fontSize, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeight, - }, -})) - -interface DrawerDetailsProps { - revisionId?: string -} - -const DrawerDetails = ({revisionId}: DrawerDetailsProps) => { - const classes = useStyles() - const router = useRouter() - const appId = useAppId() - const revisions = useAtomValue(filteredDeploymentRevisionsAtom) || [] - const selectedRevisionRow = useAtomValue(selectedRevisionRowAtom) - const variantsLoading = useAtomValue(variantsLoadingAtom) - const effectiveId = - revisionId || - selectedRevisionRow?.deployed_app_variant_revision || - selectedRevisionRow?.variant?.id - const record = revisions.find( - (r) => r.deployed_app_variant_revision === effectiveId || r.variant?.id === effectiveId, - ) - - if (!record) return null - - return ( -
    - Details - -
    - Variant - - - - - {record.variant && ( -
    - -
    - Date modified - - {record?.created_at} - -
    - -
    - Modified by - - {record?.modified_by} - -
    - - {record?.commit_message && ( -
    - Notes - - {record?.commit_message} - -
    - )} -
    - ) -} - -export default DrawerDetails diff --git a/web/oss/src/components/DeploymentsDashboard/components/Drawer/assets/DrawerTitle.tsx b/web/oss/src/components/DeploymentsDashboard/components/Drawer/assets/DrawerTitle.tsx deleted file mode 100644 index b05d6d8fef..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/components/Drawer/assets/DrawerTitle.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {useAtomValue} from "jotai" -import {createUseStyles} from "react-jss" - -import {envRevisionsAtom} from "@/oss/components/DeploymentsDashboard/atoms" -import {JSSTheme} from "@/oss/lib/Types" - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - title: { - fontSize: theme.fontSizeHeading5, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeightHeading5, - }, -})) - -const DrawerTitle = () => { - const classes = useStyles() - const env = useAtomValue(envRevisionsAtom) - return
    {env?.name || ""}
    -} - -export default DrawerTitle diff --git a/web/oss/src/components/DeploymentsDashboard/components/Drawer/index.tsx b/web/oss/src/components/DeploymentsDashboard/components/Drawer/index.tsx index 6d7a8fe3d1..a23f1a6fbb 100644 --- a/web/oss/src/components/DeploymentsDashboard/components/Drawer/index.tsx +++ b/web/oss/src/components/DeploymentsDashboard/components/Drawer/index.tsx @@ -1,37 +1,39 @@ import {ComponentProps, ReactNode, useState} from "react" import {CloseOutlined, FullscreenExitOutlined, FullscreenOutlined} from "@ant-design/icons" -import {Button, Divider, Drawer} from "antd" +import {ArrowSquareOut} from "@phosphor-icons/react" +import {Button, Divider, Drawer, Space, Tag, Typography} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" +import {useRouter} from "next/router" import {createUseStyles} from "react-jss" -import {envRevisionsAtom} from "@/oss/components/DeploymentsDashboard/atoms" import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" +import {useAppId} from "@/oss/hooks/useAppId" import {JSSTheme} from "@/oss/lib/Types" -import {revisionListAtom} from "@/oss/state/variant/selectors/variant" -import UseApiContent from "../../assets/UseApiContent" - -import DrawerDetails from "./assets/DrawerDetails" -import DrawerTitle from "./assets/DrawerTitle" +import {DeploymentRevisionWithVariant} from "../.." +import VariantDetailsRenderer from "../../assets/VariantDetailsRenderer" type DeploymentsDrawerProps = { mainContent: ReactNode - // Prefer passing envName to render title efficiently; headerContent kept for backward-compat - envName?: string headerContent?: ReactNode - // Optional: pass a revision id to render details lazily - selectedRevisionId?: string expandable?: boolean initialWidth?: number mainContentClassName?: string - drawerVariantId?: string + selectedRevisionRow?: DeploymentRevisionWithVariant } & ComponentProps const useStyles = createUseStyles((theme: JSSTheme) => ({ - // Title and subtitle styles moved to DrawerTitle/DrawerDetails components + title: { + fontSize: theme.fontSizeHeading5, + fontWeight: theme.fontWeightMedium, + lineHeight: theme.lineHeightHeading5, + }, + subTitle: { + fontSize: theme.fontSize, + fontWeight: theme.fontWeightMedium, + lineHeight: theme.lineHeight, + }, drawerContainer: { "& .ant-drawer-body": { padding: 0, @@ -39,123 +41,19 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ }, })) -interface DeploymentsDrawerTitleProps - extends Pick< - DeploymentsDrawerProps, - "onClose" | "expandable" | "initialWidth" | "selectedRevisionId" - > { - drawerWidth: number - setDrawerWidth: (width: number) => void - envName?: string - headerContent?: ReactNode - initialWidth?: number - mainContentClassName?: string - selectedRevisionId?: string - onClose?: (e: any) => void -} - -const DeploymentsDrawerTitle = ({ - drawerWidth, - initialWidth, - setDrawerWidth, - expandable, - onClose, -}: DeploymentsDrawerTitleProps) => { - return ( -
    -
    - ) -} - -const DeploymentsDrawerContent = ({ - mainContentClassName, - selectedRevisionId, - drawerVariantId, -}: DeploymentsDrawerProps) => { - const variants = useAtomValue(revisionListAtom) || [] - const envRevisions = useAtomValue(envRevisionsAtom) - return ( -
    -
    -
    - {envRevisions ? ( - close()} - variants={variants} - revisionId={drawerVariantId} - selectedEnvironment={envRevisions} - /> - ) : ( -
    -
    -
    -
    -
    - )} -
    -
    - {drawerVariantId && ( - <> - - - - )} -
    - ) -} - const DeploymentsDrawer = ({ mainContent, headerContent, expandable = true, initialWidth = 1200, mainContentClassName = "", - selectedRevisionId, - drawerVariantId, + selectedRevisionRow, ...props }: DeploymentsDrawerProps) => { + const appId = useAppId() + const router = useRouter() const classes = useStyles() const [drawerWidth, setDrawerWidth] = useState(initialWidth) - const {goToPlayground} = usePlaygroundNavigation() return ( +
    +
    } {...props} > - - {mainContent} - +
    +
    +
    + {mainContent} +
    +
    + {selectedRevisionRow && ( + <> + +
    + Details + +
    + + Variant + + + + + + {selectedRevisionRow.variant && ( +
    + +
    + + Date modified + + + + {selectedRevisionRow?.created_at} + +
    + +
    + + Modified by + + + + {selectedRevisionRow?.modified_by} + +
    + + {selectedRevisionRow?.commit_message && ( +
    + + Notes + + + + {selectedRevisionRow?.commit_message} + +
    + )} +
    + + )} +
    ) } diff --git a/web/oss/src/components/DeploymentsDashboard/components/Modal/DeploymentConfirmationModal.tsx b/web/oss/src/components/DeploymentsDashboard/components/Modal/DeploymentConfirmationModal.tsx index 0785df64de..89a7bdd647 100644 --- a/web/oss/src/components/DeploymentsDashboard/components/Modal/DeploymentConfirmationModal.tsx +++ b/web/oss/src/components/DeploymentsDashboard/components/Modal/DeploymentConfirmationModal.tsx @@ -28,44 +28,6 @@ type DeploymentConfirmationModalProps = { actionType?: "deploy" | "revert" } & ComponentProps -const DeploymentConfirmationModalContent = ({ - variant, - note, - setNote, - isDeploy, - displayNote = true, - envName, - actionType = "deploy", -}: DeploymentConfirmationModalProps) => { - const confirmationText = - actionType === "deploy" - ? "Are you sure you want to deploy" - : "Are you sure you want to revert?" - return ( - - - {confirmationText} - - {variant && ( - - )} - - {displayNote && ( - {})} - text={`${isDeploy ? "Deploy" : "Revert"} message`} - /> - )} - - ) -} - const DeploymentConfirmationModal = ({ variant, note, @@ -78,6 +40,9 @@ const DeploymentConfirmationModal = ({ const classes = useStyles() const isDeploy = actionType === "deploy" const actionText = isDeploy ? "Deploy" : "Revert" + const confirmationText = isDeploy + ? "Are you sure you want to deploy" + : "Are you sure you want to revert?" return ( - + + + {confirmationText} + + {variant && ( + + )} + + {displayNote && ( + {})} + text={`${actionText} message`} + /> + )} + ) } diff --git a/web/oss/src/components/DeploymentsDashboard/components/Table/assets/getDeploymentColumns.tsx b/web/oss/src/components/DeploymentsDashboard/components/Table/assets/getDeploymentColumns.tsx index 00c485603a..d1a2981b36 100644 --- a/web/oss/src/components/DeploymentsDashboard/components/Table/assets/getDeploymentColumns.tsx +++ b/web/oss/src/components/DeploymentsDashboard/components/Table/assets/getDeploymentColumns.tsx @@ -2,23 +2,25 @@ import {MoreOutlined} from "@ant-design/icons" import {ArrowCounterClockwise, GearSix, Lightning, Note} from "@phosphor-icons/react" import {Dropdown, Button} from "antd" import {ColumnsType} from "antd/es/table" +import {NextRouter} from "next/router" import TruncatedTooltipTag from "@/oss/components/TruncatedTooltipTag" import {DeploymentRevisions} from "@/oss/lib/Types" +import {DeploymentRevisionWithVariant} from "../../.." import VariantDetailsRenderer from "../../../assets/VariantDetailsRenderer" -import {DeploymentRevisionWithVariant} from "../../../atoms" export const getColumns = ({ + handleFetchRevisionConfig, setSelectedRevisionRow, setIsRevertModalOpen, setSelectedVariantRevisionIdToRevert, handleAssignRevisionId, envRevisions, - onOpenInPlayground, - onOpenUseApi, - isVariantLoading, + router, + appId, }: { + handleFetchRevisionConfig: (revisionId: string) => Promise setSelectedRevisionRow: React.Dispatch< React.SetStateAction > @@ -26,9 +28,8 @@ export const getColumns = ({ setSelectedVariantRevisionIdToRevert: React.Dispatch> handleAssignRevisionId: (record: DeploymentRevisionWithVariant) => void envRevisions: DeploymentRevisions | undefined - onOpenInPlayground: (revisionId?: string | null) => void - onOpenUseApi: () => void - isVariantLoading?: boolean + router: NextRouter + appId: string }): ColumnsType => { const columns: ColumnsType = [ { @@ -54,13 +55,7 @@ export const getColumns = ({ style: {minWidth: 280}, }), render: (_, record) => { - return ( - - ) + return }, }, { @@ -126,29 +121,23 @@ export const getColumns = ({ icon: , onClick: (e) => { e.domEvent.stopPropagation() + handleFetchRevisionConfig(record.id) setSelectedRevisionRow(record) handleAssignRevisionId(record) }, }, - { - key: "use_api", - label: "Use API", - icon: , - onClick: (e) => { - e.domEvent.stopPropagation() - onOpenUseApi({ - revisionId: record?.deployed_app_variant_revision, - deploymentRevisionId: record?.id, - }) - }, - }, { key: "view_variant", label: "Open in playground", icon: , onClick: (e) => { e.domEvent.stopPropagation() - onOpenInPlayground(record.variant?.id) + router.push({ + pathname: `/apps/${appId}/playground`, + query: { + revisions: JSON.stringify([record.variant?.id]), + }, + }) }, disabled: !record.variant, }, diff --git a/web/oss/src/components/DeploymentsDashboard/components/Table/index.tsx b/web/oss/src/components/DeploymentsDashboard/components/Table/index.tsx index 46f6de2d68..c674de8aef 100644 --- a/web/oss/src/components/DeploymentsDashboard/components/Table/index.tsx +++ b/web/oss/src/components/DeploymentsDashboard/components/Table/index.tsx @@ -2,20 +2,20 @@ import {useCallback, useMemo} from "react" import {CloudArrowUp} from "@phosphor-icons/react" import {Table, Typography} from "antd" -import {useAtomValue} from "jotai" import Image from "next/image" +import {useRouter} from "next/router" import EmptyComponent from "@/oss/components/EmptyComponent" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" -import {useQuery, useQueryParam} from "@/oss/hooks/useQuery" +import {useAppId} from "@/oss/hooks/useAppId" +import {useQueryParam} from "@/oss/hooks/useQuery" import {DeploymentRevisions} from "@/oss/lib/Types" -import {variantsLoadingAtom} from "@/oss/state/variant/atoms/fetcher" -import {DeploymentRevisionWithVariant} from "../../atoms" +import {DeploymentRevisionWithVariant} from "../.." import {getColumns} from "./assets/getDeploymentColumns" interface DeploymentTableProps { + handleFetchRevisionConfig: (revisionId: string) => Promise setSelectedRevisionRow: React.Dispatch< React.SetStateAction > @@ -24,58 +24,48 @@ interface DeploymentTableProps { setSelectedVariantRevisionIdToRevert: React.Dispatch> envRevisions: DeploymentRevisions | undefined setIsSelectDeployVariantModalOpen: (value: React.SetStateAction) => void - onOpenUseApi: () => void - isLoading?: boolean } const DeploymentTable = ({ - revisions, - envRevisions, - isLoading, + handleFetchRevisionConfig, setSelectedRevisionRow, setIsRevertModalOpen, + revisions, setSelectedVariantRevisionIdToRevert, + envRevisions, setIsSelectDeployVariantModalOpen, - onOpenUseApi, }: DeploymentTableProps) => { - const [, updateQuery] = useQuery() - const {goToPlayground} = usePlaygroundNavigation() - const variantsLoading = useAtomValue(variantsLoadingAtom) + const [_, setQueryRevision] = useQueryParam("revisions") + const router = useRouter() + const appId = useAppId() - const handleAssignRevisionId = useCallback( - (record: DeploymentRevisionWithVariant) => { - const targetId = record.deployed_app_variant_revision ?? record.variant.id - if (targetId) { - updateQuery({revisionId: targetId, drawerType: "deployment"}) - } else { - updateQuery({revisionId: undefined, drawerType: undefined}) - } - }, - [updateQuery], - ) + const handleAssignRevisionId = useCallback((record: DeploymentRevisionWithVariant) => { + setQueryRevision( + JSON.stringify([record.deployed_app_variant_revision ?? record.variant.id]), + ) + }, []) const initialColumns = useMemo( () => getColumns({ + handleFetchRevisionConfig, setSelectedRevisionRow, setIsRevertModalOpen, setSelectedVariantRevisionIdToRevert, handleAssignRevisionId, envRevisions, - onOpenInPlayground: goToPlayground, - onOpenUseApi, - isVariantLoading: isLoading || variantsLoading, + router, + appId, }), [ + handleFetchRevisionConfig, setSelectedRevisionRow, setIsRevertModalOpen, setSelectedVariantRevisionIdToRevert, revisions, envRevisions, - goToPlayground, - onOpenUseApi, - isLoading, - variantsLoading, + router, + appId, ], ) @@ -91,11 +81,11 @@ const DeploymentTable = ({ pageSize: 15, showSizeChanger: true, }} - loading={isLoading} onRow={(record) => ({ className: "variant-table-row", style: {cursor: "pointer"}, onClick: () => { + handleFetchRevisionConfig(record.id) setSelectedRevisionRow(record) setSelectedVariantRevisionIdToRevert(record.deployed_app_variant_revision) handleAssignRevisionId(record) diff --git a/web/oss/src/components/DeploymentsDashboard/index.tsx b/web/oss/src/components/DeploymentsDashboard/index.tsx index 2412f306c5..3743b9ccf4 100644 --- a/web/oss/src/components/DeploymentsDashboard/index.tsx +++ b/web/oss/src/components/DeploymentsDashboard/index.tsx @@ -1,29 +1,26 @@ -import {type FC, useEffect} from "react" +import {type FC, type Key, useMemo, useState} from "react" import {CloudArrowUp} from "@phosphor-icons/react" -import {Button, Flex, Input, Space, Typography} from "antd" -import {useAtom, useAtomValue, useSetAtom} from "jotai" +import {Button, Flex, Input, Space, Typography, message} from "antd" +import posthog from "posthog-js" import {createUseStyles} from "react-jss" -import {openDeploymentsDrawerAtom} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentDrawerStore" -import { - openDeploymentConfirmationModalAtom, - openSelectDeployVariantModalAtom, -} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentModalsStore" -import {DeploymentRevisions} from "@/oss/lib/Types" +import {useAppId} from "@/oss/hooks/useAppId" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" +import {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" +import {AgentaConfigPrompt, EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" +import {DeploymentRevision, DeploymentRevisionConfig, DeploymentRevisions} from "@/oss/lib/Types" import {JSSTheme} from "@/oss/lib/Types" -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" - -import {revisionListAtom} from "../Playground/state/atoms" - -import { - deploymentSearchAtom, - selectedRevisionRowAtom, - selectedVariantRevisionIdToRevertAtom, - envRevisionsAtom, - filteredDeploymentRevisionsAtom, - selectedVariantToRevertAtom, -} from "./atoms" +import {createPublishRevision} from "@/oss/services/deployment/api" +import {fetchAllDeploymentRevisionConfig} from "@/oss/services/deploymentVersioning/api" + +import VariantDrawer from "../VariantsComponents/Drawers/VariantDrawer" + +import UseApiContent from "./assets/UseApiContent" +import DeploymentsDrawer from "./components/Drawer" +import DeploymentConfirmationModal from "./components/Modal/DeploymentConfirmationModal" +import SelectDeployVariantModal from "./components/Modal/SelectDeployVariantModal" import DeploymentTable from "./components/Table" const useStyles = createUseStyles((theme: JSSTheme) => ({ @@ -42,113 +39,266 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ interface DeploymentsDashboardProps { envRevisions: DeploymentRevisions | undefined - isLoading: boolean + variants: EnhancedVariant[] + deployedVariant: EnhancedVariant + handleFetchAllDeploymentRevisions: (envName: string) => Promise +} + +export type DeploymentRevisionWithVariant = DeploymentRevision & { + variant: EnhancedVariant> | undefined + environment_revision: number } const DeploymentsDashboard: FC = ({ envRevisions, - selectedEnvName, - isLoading, + variants, + deployedVariant, + handleFetchAllDeploymentRevisions, }) => { - const {mutateAsync: publish} = useAtomValue(publishMutationAtom) + const appId = useAppId() const classes = useStyles() - // Sync envRevisions prop with atom - const setEnvRevisions = useSetAtom(envRevisionsAtom) - useEffect(() => { - setEnvRevisions(envRevisions) - }, [envRevisions, setEnvRevisions]) + const [searchTerm, setSearchTerm] = useState("") + const [queryVariant, setQueryVariant] = useQueryParam("revisions") + + const [isUseApiDrawerOpen, setIsUseApiDrawerOpen] = useState(false) + const [_isRevisionsDetailsDrawerOpen, setIsRevisionsDetailsDrawerOpen] = useState(false) + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + const [note, setNote] = useState("") + const [isDeployVariantModalOpen, setIsDeployVariantModalOpen] = useState(false) + const [isDeployVariantLoading, setIsDeployVariantLoading] = useState(false) + const [_revisionConfig, setRevisionConfig] = useState(null) + const [isSelectDeployVariantModalOpen, setIsSelectDeployVariantModalOpen] = useState(false) + const [selectedRevisionRow, setSelectedRevisionRow] = useState() - const variants = useAtomValue(revisionListAtom) || [] + const [isRevertModalOpen, setIsRevertModalOpen] = useState(false) + const [isRevertModalLoading, setIsRevertModalLoading] = useState(false) + const [selectedVariantRevisionIdToRevert, setSelectedVariantRevisionIdToRevert] = + useState("") - // Optimized state management with atoms - const [searchTerm, setSearchTerm] = useAtom(deploymentSearchAtom) - // Keep some local state for now to avoid breaking existing functionality - const [selectedRevisionRow, setSelectedRevisionRow] = useAtom(selectedRevisionRowAtom) - const [selectedVariantRevisionIdToRevert, setSelectedVariantRevisionIdToRevert] = useAtom( - selectedVariantRevisionIdToRevertAtom, + const selectedVariantToDeploy = useMemo( + () => variants.find((variant) => variant.id === selectedRowKeys[0]), + [variants, selectedRowKeys], + ) + const selectedVariantToRevert = useMemo( + () => variants.find((variant) => variant.id === selectedVariantRevisionIdToRevert), + [variants, selectedVariantRevisionIdToRevert], ) - // Global modal openers - const openSelectDeployVariantModal = useSetAtom(openSelectDeployVariantModalAtom) - const openDeploymentConfirmationModal = useSetAtom(openDeploymentConfirmationModalAtom) - const openDeploymentsDrawer = useSetAtom(openDeploymentsDrawerAtom) + const revisions = useMemo( + () => + (envRevisions?.revisions || []) + .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()) + .map((rev, index) => ({ + ...rev, + created_at: formatDay({date: rev.created_at}), + variant: variants.find( + (variant) => variant.id === rev.deployed_app_variant_revision, + ), + environment_revision: envRevisions?.revisions?.length + ? envRevisions?.revisions?.length - index + : 0, + })), + [envRevisions, variants], + ) + + const filteredRevisions = useMemo(() => { + if (!searchTerm) return revisions + + return revisions.filter( + (item) => + `v${item.revision}`.toLowerCase().includes(searchTerm.toLowerCase()) || + item.commit_message?.toLowerCase().includes(searchTerm.toLowerCase()), + ) + }, [searchTerm, revisions]) + + const handleFetchRevisionConfig = async (revisionId: string) => { + try { + const data = await fetchAllDeploymentRevisionConfig(revisionId) + setRevisionConfig(data) + setIsRevisionsDetailsDrawerOpen(true) + } catch (error) { + console.error("Failed to fetch revision config:", error) + } + } + + const handleDeployVariant = async () => { + const revisionId = selectedRowKeys[0] as string + try { + setIsDeployVariantLoading(true) + await createPublishRevision({ + note, + revision_id: revisionId, + environment_ref: envRevisions?.name || "", + }) + await handleFetchAllDeploymentRevisions(envRevisions?.name || "") - // Atom-based computed values - const selectedVariantToRevert = useAtomValue(selectedVariantToRevertAtom) - const revisions = useAtomValue(filteredDeploymentRevisionsAtom) + message.success(`Published ${deployedVariant?.variantName} to ${envRevisions?.name}`) + posthog?.capture?.("app_deployed", {app_id: appId, environment: envRevisions?.name}) + } catch (error) { + console.error("Error deploying variant:", error) + } finally { + setNote("") + setIsDeployVariantModalOpen(false) + setSelectedRowKeys([]) + setIsSelectDeployVariantModalOpen(false) + setIsDeployVariantLoading(false) + } + } - // Deep-link handling moved to DeploymentsDrawerWrapper + const handleRevertDeployment = async () => { + try { + setIsRevertModalLoading(true) + await createPublishRevision({ + note, + revision_id: selectedVariantRevisionIdToRevert, + environment_ref: envRevisions?.name || "", + }) + await handleFetchAllDeploymentRevisions(envRevisions?.name || "") + + posthog?.capture?.("app_deployment_reverted", { + app_id: appId, + environment: envRevisions?.name, + }) + message.success( + `Published ${selectedVariantToRevert?.variantName} to ${envRevisions?.name}`, + ) + } catch (error) { + console.error("Error reverting deployment:", error) + } finally { + setNote("") + setIsRevertModalOpen(false) + setIsRevertModalLoading(false) + setSelectedVariantRevisionIdToRevert("") + setIsRevisionsDetailsDrawerOpen(false) + } + } return ( - - - - {envRevisions?.name || selectedEnvName} - - - - - - - -
    -
    - setSearchTerm(e.target.value)} - placeholder="Search" - allowClear - className="w-[400px]" + <> + + + + {envRevisions?.name} + + + + + + + +
    +
    + setSearchTerm(e.target.value)} + placeholder="Search" + allowClear + className="w-[400px]" + /> +
    + +
    +
    - { - if (!isOpen) return - const envName = envRevisions?.name || "" - openDeploymentConfirmationModal({ - envName, - actionType: "revert", - variant: selectedVariantToRevert || undefined, - onConfirm: async (noteValue) => { - await publish({ - type: "revision", - note: noteValue, - revision_id: selectedVariantRevisionIdToRevert, - environment_ref: envName, - }) - }, - }) - }} - setSelectedVariantRevisionIdToRevert={setSelectedVariantRevisionIdToRevert} - envRevisions={envRevisions} - setIsSelectDeployVariantModalOpen={() => - openSelectDeployVariantModal({variants, envRevisions: envRevisions}) + {/* Use API Drawer */} + {envRevisions && ( + + } + headerContent={ + + How to use API + } - onOpenUseApi={({revisionId} = {}) => { - if (envRevisions) { - openDeploymentsDrawer({initialWidth: 720, revisionId}) - } + open={isUseApiDrawerOpen} + onClose={() => setIsUseApiDrawerOpen(false)} + initialWidth={720} + /> + )} + + {/* Revisions Details Drawer */} + setQueryVariant("")} + revert={{ + isDisabled: + selectedRevisionRow?.deployed_app_variant_revision === + envRevisions?.deployed_app_variant_revision_id, + onClick: () => setIsRevertModalOpen(true), + isLoading: isRevertModalLoading, + }} + /> + + {/* Select Deploy Variant Modal */} + { + setSelectedRowKeys([]) + setIsSelectDeployVariantModalOpen(false) + }} + setSelectedRowKeys={setSelectedRowKeys} + selectedRowKeys={selectedRowKeys} + /> + + {/* Deploy Variant Modal */} + {selectedVariantToDeploy && ( + { + setNote("") + setIsDeployVariantModalOpen(false) }} - isLoading={isLoading} + okButtonProps={{loading: isDeployVariantLoading}} + onOk={handleDeployVariant} + note={note} + setNote={setNote} + variant={selectedVariantToDeploy} + envName={envRevisions?.name || ""} /> -
    - + )} + + {/* Revert Deployment Modal */} + { + setNote("") + setIsRevertModalOpen(false) + setSelectedVariantRevisionIdToRevert("") + }} + onOk={handleRevertDeployment} + okButtonProps={{loading: isRevertModalLoading}} + note={note} + setNote={setNote} + envName={envRevisions?.name || ""} + displayNote={false} + variant={selectedVariantToRevert} + actionType="revert" + /> + ) } diff --git a/web/oss/src/components/DeploymentsDashboard/modals/DeploymentConfirmationModalWrapper.tsx b/web/oss/src/components/DeploymentsDashboard/modals/DeploymentConfirmationModalWrapper.tsx deleted file mode 100644 index 0163908a19..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/modals/DeploymentConfirmationModalWrapper.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" - -import DeploymentConfirmationModal from "@/oss/components/DeploymentsDashboard/components/Modal/DeploymentConfirmationModal" -import { - closeDeploymentConfirmationModalAtom, - confirmDeploymentAtom, - deploymentConfirmationStateAtom, - setDeploymentNoteAtom, -} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentModalsStore" - -const DeploymentConfirmationModalWrapper = () => { - const state = useAtomValue(deploymentConfirmationStateAtom) - const close = useSetAtom(closeDeploymentConfirmationModalAtom) - const confirm = useSetAtom(confirmDeploymentAtom) - const setNote = useSetAtom(setDeploymentNoteAtom) - - return ( - close()} - envName={state.envName} - actionType={state.actionType} - variant={state.variant} - note={state.note} - setNote={(n) => setNote(n)} - okButtonProps={{loading: state.okLoading}} - onOk={() => confirm()} - /> - ) -} - -export default DeploymentConfirmationModalWrapper diff --git a/web/oss/src/components/DeploymentsDashboard/modals/DeploymentsDrawerWrapper.tsx b/web/oss/src/components/DeploymentsDashboard/modals/DeploymentsDrawerWrapper.tsx deleted file mode 100644 index 96b1f34cb6..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/modals/DeploymentsDrawerWrapper.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import {useAtom, useSetAtom} from "jotai" -import dynamic from "next/dynamic" - -import DeploymentsDrawer from "@/oss/components/DeploymentsDashboard/components/Drawer" -import { - closeDeploymentsDrawerAtom, - deploymentsDrawerStateAtom, -} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentDrawerStore" - -const DeploymentsDrawerWrapper = () => { - const [state] = useAtom(deploymentsDrawerStateAtom) - const close = useSetAtom(closeDeploymentsDrawerAtom) - - return ( - close()} - initialWidth={state.initialWidth} - drawerVariantId={state.revisionId} - selectedRevisionId={state.deploymentRevisionId} - envName={state.envName} - /> - ) -} - -export default dynamic(() => Promise.resolve(DeploymentsDrawerWrapper), {ssr: false}) diff --git a/web/oss/src/components/DeploymentsDashboard/modals/SelectDeployVariantModalWrapper.tsx b/web/oss/src/components/DeploymentsDashboard/modals/SelectDeployVariantModalWrapper.tsx deleted file mode 100644 index 2ac851fb69..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/modals/SelectDeployVariantModalWrapper.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" - -import SelectDeployVariantModal from "@/oss/components/DeploymentsDashboard/components/Modal/SelectDeployVariantModal" -import { - closeSelectDeployVariantModalAtom, - selectDeployVariantStateAtom, - setSelectedRowKeysAtom, -} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentModalsStore" -import {openDeploymentConfirmationModalAtom} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentModalsStore" -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" - -const SelectDeployVariantModalWrapper = () => { - const state = useAtomValue(selectDeployVariantStateAtom) - const close = useSetAtom(closeSelectDeployVariantModalAtom) - const setKeys = useSetAtom(setSelectedRowKeysAtom) - const openConfirm = useSetAtom(openDeploymentConfirmationModalAtom) - const publishMutation = useAtomValue(publishMutationAtom) - - return ( - close()} - variants={state.variants} - envRevisions={state.envRevisions} - setIsDeployVariantModalOpen={() => { - const selectedId = state.selectedRowKeys[0] - const variant = state.variants.find((v: any) => v.id === selectedId) - const envName = state.envRevisions?.name || "" - // Close selector and open confirmation modal - close() - openConfirm({ - variant, - envName, - actionType: "deploy", - onConfirm: async (noteValue) => { - const revisionId = selectedId as string - await publishMutation.mutateAsync({ - type: "revision", - revision_id: revisionId, - environment_ref: envName, - note: noteValue, - }) - }, - onSuccess: () => { - // no-op for now; publish mutation invalidates queries globally - }, - successMessage: `Deployment started for ${envName}`, - }) - }} - setSelectedRowKeys={(keys) => setKeys(keys as (string | number)[])} - selectedRowKeys={state.selectedRowKeys} - /> - ) -} - -export default SelectDeployVariantModalWrapper diff --git a/web/oss/src/components/DeploymentsDashboard/modals/store/deploymentDrawerStore.ts b/web/oss/src/components/DeploymentsDashboard/modals/store/deploymentDrawerStore.ts deleted file mode 100644 index 84d110418c..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/modals/store/deploymentDrawerStore.ts +++ /dev/null @@ -1,40 +0,0 @@ -import {atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -// Drawer state is intentionally minimal; data is derived in the wrapper - -export interface DeploymentsDrawerState { - open: boolean - initialWidth: number - revisionId: string -} - -export const deploymentsDrawerStateAtom = atomWithImmer({ - open: false, - revisionId: "", - initialWidth: 720, -}) - -export const openDeploymentsDrawerAtom = atom( - null, - ( - get, - set, - payload?: { - initialWidth?: number - revisionId?: string - }, - ) => { - set(deploymentsDrawerStateAtom, (draft) => { - draft.open = true - if (payload?.initialWidth) draft.initialWidth = payload.initialWidth - if (payload?.revisionId) draft.revisionId = payload.revisionId - }) - }, -) - -export const closeDeploymentsDrawerAtom = atom(null, (get, set) => { - set(deploymentsDrawerStateAtom, (draft) => { - draft.open = false - }) -}) diff --git a/web/oss/src/components/DeploymentsDashboard/modals/store/deploymentModalsStore.ts b/web/oss/src/components/DeploymentsDashboard/modals/store/deploymentModalsStore.ts deleted file mode 100644 index 90de423bb9..0000000000 --- a/web/oss/src/components/DeploymentsDashboard/modals/store/deploymentModalsStore.ts +++ /dev/null @@ -1,143 +0,0 @@ -import {message} from "antd" -import {atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {DeploymentRevisions} from "@/oss/lib/Types" - -import {deploymentNoteAtom} from "../../atoms" - -// Select Deploy Variant Modal State -export interface SelectDeployVariantState { - open: boolean - variants: EnhancedVariant[] - envRevisions?: DeploymentRevisions - selectedRowKeys: (string | number)[] -} - -export const selectDeployVariantStateAtom = atomWithImmer({ - open: false, - variants: [], - envRevisions: undefined, - selectedRowKeys: [], -}) - -export const openSelectDeployVariantModalAtom = atom( - null, - (get, set, payload: {variants: EnhancedVariant[]; envRevisions?: DeploymentRevisions}) => { - set(selectDeployVariantStateAtom, (draft) => { - draft.open = true - draft.variants = payload.variants - draft.envRevisions = payload.envRevisions - draft.selectedRowKeys = [] - }) - }, -) - -export const closeSelectDeployVariantModalAtom = atom(null, (get, set) => { - set(selectDeployVariantStateAtom, (draft) => { - draft.open = false - }) -}) - -export const setSelectedRowKeysAtom = atom(null, (get, set, keys: (string | number)[]) => { - set(selectDeployVariantStateAtom, (draft) => { - draft.selectedRowKeys = keys - }) -}) - -// Deployment Confirmation Modal State -export interface DeploymentConfirmationState { - open: boolean - actionType: "deploy" | "revert" - variant?: EnhancedVariant - envName: string - note: string - onConfirm?: (note: string) => Promise | void - onSuccess?: () => void - successMessage?: string - okLoading?: boolean -} - -export const deploymentConfirmationStateAtom = atomWithImmer({ - open: false, - actionType: "deploy", - envName: "", - note: "", - okLoading: false, -}) - -export const openDeploymentConfirmationModalAtom = atom( - null, - ( - get, - set, - payload: { - variant?: EnhancedVariant - envName: string - actionType?: "deploy" | "revert" - onConfirm?: (note: string) => Promise | void - onSuccess?: () => void - successMessage?: string - }, - ) => { - set(deploymentConfirmationStateAtom, (draft) => { - draft.open = true - draft.variant = payload.variant - draft.envName = payload.envName - draft.actionType = payload.actionType ?? "deploy" - draft.onConfirm = payload.onConfirm - draft.onSuccess = payload.onSuccess - draft.successMessage = payload.successMessage - draft.note = get(deploymentNoteAtom) - }) - }, -) - -export const closeDeploymentConfirmationModalAtom = atom(null, (get, set) => { - set(deploymentConfirmationStateAtom, (draft) => { - draft.open = false - draft.okLoading = false - draft.note = "" - }) - set(deploymentNoteAtom, "") -}) - -export const setDeploymentNoteAtom = atom( - (get) => get(deploymentConfirmationStateAtom).note, - (get, set, note: string) => { - set(deploymentConfirmationStateAtom, (draft) => { - draft.note = note - }) - set(deploymentNoteAtom, note) - }, -) - -export const confirmDeploymentAtom = atom(null, async (get, set) => { - const state = get(deploymentConfirmationStateAtom) - if (!state.onConfirm) { - set(deploymentConfirmationStateAtom, (draft) => { - draft.open = false - }) - return - } - try { - set(deploymentConfirmationStateAtom, (draft) => { - draft.okLoading = true - }) - await state.onConfirm(state.note) - const actionText = state.actionType === "revert" ? "Reverted" : "Deployed" - const envText = state.envName ? ` in ${state.envName}` : "" - message.success(state.successMessage || `${actionText}${envText} successfully`) - state.onSuccess?.() - set(deploymentConfirmationStateAtom, (draft) => { - draft.open = false - draft.note = "" - }) - set(deploymentNoteAtom, "") - } finally { - set(deploymentConfirmationStateAtom, (draft) => { - draft.okLoading = false - }) - } -}) diff --git a/web/oss/src/components/DynamicCodeBlock/CodeBlock.tsx b/web/oss/src/components/DynamicCodeBlock/CodeBlock.tsx index f6ad149f8e..ea9d078329 100644 --- a/web/oss/src/components/DynamicCodeBlock/CodeBlock.tsx +++ b/web/oss/src/components/DynamicCodeBlock/CodeBlock.tsx @@ -1,20 +1,11 @@ -import {FC, useEffect, useMemo} from "react" +import {FC} from "react" -import {CodeNode, CodeHighlightNode, $createCodeNode} from "@lexical/code" -import { - ShikiTokenizer, - registerCodeHighlighting, - loadCodeLanguage, - loadCodeTheme, - normalizeCodeLanguage, -} from "@lexical/code-shiki" -import {LexicalComposer} from "@lexical/react/LexicalComposer" -import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" -import {ContentEditable} from "@lexical/react/LexicalContentEditable" -import {LexicalErrorBoundary} from "@lexical/react/LexicalErrorBoundary" -import {RichTextPlugin} from "@lexical/react/LexicalRichTextPlugin" -import {EditorThemeClasses, $createTextNode, $getRoot} from "lexical" +import {Typography} from "antd" import {createUseStyles} from "react-jss" +import {Prism as SyntaxHighlighter} from "react-syntax-highlighter" +import {coy, darcula} from "react-syntax-highlighter/dist/cjs/styles/prism" + +import {useAppTheme} from "../Layout/ThemeContextProvider" interface CodeBlockProps { language: string @@ -22,118 +13,28 @@ interface CodeBlockProps { } const useStyles = createUseStyles({ - container: {margin: 0}, - editor: { - fontFamily: - "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", - fontSize: 13, - lineHeight: 1.55, - padding: 12, - borderRadius: 6, - overflowX: "auto", - background: "#FAFAFA", - outline: "none", - whiteSpace: "pre", + container: { + margin: 0, }, }) -const onError = (error: Error) => { - console.error(error) -} - -const theme: EditorThemeClasses = { - code: "agenta-dynamic-code-block", -} - -// Normalize language ids using Lexical's helper -const LANGUAGE_FALLBACKS: Record = { - code: "python", -} - -const resolveLexicalLanguage = (language: string): string => { - const normalized = (language || "").toLowerCase() - const fallback = LANGUAGE_FALLBACKS[normalized] ?? normalized - const resolved = normalizeCodeLanguage(fallback) - return resolved || "plaintext" -} - -const ShikiHighlightPlugin: FC<{langs: string[]; themeName: string}> = ({langs, themeName}) => { - const [editor] = useLexicalComposerContext() - - useEffect(() => { - let unregister = () => {} - let cancelled = false - - ;(async () => { - try { - // Ensure theme and language are loaded into the Shiki tokenizer - await loadCodeTheme(themeName, editor) - for (const l of langs) { - await loadCodeLanguage(l, editor) - } - if (cancelled) return - unregister = registerCodeHighlighting(editor, ShikiTokenizer) - } catch (e) { - console.error("Failed to initialize Shiki highlighter", e) - } - })() - - return () => { - cancelled = true - unregister() - } - }, [editor, langs, themeName]) - - return null -} - -const InitializeContentPlugin: FC<{language: string; value: string}> = ({language, value}) => { - const [editor] = useLexicalComposerContext() - - useEffect(() => { - editor.update(() => { - const root = $getRoot() - root.clear() - const codeNode = $createCodeNode(language) - codeNode.append($createTextNode(value)) - root.append(codeNode) - }) - }, [editor, language, value]) - - return null -} - const CodeBlock: FC = ({language, value}) => { - const classes = useStyles() - - const lexicalLanguage = useMemo(() => resolveLexicalLanguage(language), [language]) - - const editorConfig = useMemo( - () => ({ - namespace: "AgentaCodeBlock", - onError, - editable: false, // read-only to match previous behavior - theme, - nodes: [CodeNode, CodeHighlightNode], - }), - [], - ) - - const shikiTheme = "github-light" - const shikiLang = lexicalLanguage - const langs = useMemo(() => [shikiLang], [shikiLang]) + const {Paragraph} = Typography + const {appTheme} = useAppTheme() + const classes = useStyles() return (
    - - } - placeholder={null} - ErrorBoundary={LexicalErrorBoundary} - /> - - - + + + {value} + +
    ) } diff --git a/web/oss/src/components/Editor/DiffView.tsx b/web/oss/src/components/Editor/DiffView.tsx index 60bd32c50d..6a38eafa4f 100644 --- a/web/oss/src/components/Editor/DiffView.tsx +++ b/web/oss/src/components/Editor/DiffView.tsx @@ -4,103 +4,23 @@ * This component provides a complete solution for comparing JSON and YAML content * with real-time diff computation, syntax highlighting, and error handling. * - * ## Features: - * - Supports both JSON and YAML diff visualization + * Features: + * - Supports both JSON and YAML formats * - Real-time diff computation with debouncing - * - Error handling for invalid syntax + * - Intelligent incomplete content detection + * - GitHub-style diff visualization * - Customizable styling and behavior - * - Flexible input handling (strings or objects) * - * ## Input Format Flexibility: - * The DiffView component accepts both strings and objects with automatic format handling: - * - * ### 1. String Input (JSON or YAML) - * Pass pre-formatted strings - language will be auto-detected if not specified: - * - * **Explicit Language:** - * ```tsx - * - * ``` - * - * **Auto-Detection:** + * Usage: * ```tsx - * - * ``` - * - * ### 2. Object Input - * Pass JavaScript objects directly - they'll be converted to the target format: - * - * ```tsx - * const originalObj = {name: "old-service", version: "1.0.0"} - * const modifiedObj = {name: "new-service", version: "1.1.0"} - * - * - * ``` - * - * ### 3. Mixed Input Types - * You can even mix strings and objects: - * - * ```tsx - * - * ``` - * - * ## Internal Processing: - * 1. Content is passed as strings to the DiffHighlightPlugin - * 2. Plugin parses strings back to objects for consistent formatting - * 3. Objects are re-serialized to target format (JSON/YAML) with proper indentation - * 4. Line-by-line diff is computed and highlighted - * - * ## Language Switching: - * When switching between JSON and YAML, ensure content is converted: - * - * ```tsx - * const convertContent = (content: string, fromLang: string, toLang: string) => { - * if (fromLang === toLang) return content - * - * try { - * if (fromLang === "json" && toLang === "yaml") { - * const parsed = JSON.parse(content) - * return yaml.dump(parsed, {indent: 2}) - * } else if (fromLang === "yaml" && toLang === "json") { - * const parsed = yaml.load(content) - * return JSON.stringify(parsed, null, 2) - * } - * } catch (error) { - * console.warn(`Conversion failed:`, error) - * return toLang === "json" ? "{}" : "" - * } - * return content - * } - * ``` + * import DiffView from "@/oss/components/Editor/DiffView" * - * ## Error Handling: - * - Invalid JSON/YAML syntax shows error messages - * - Parsing errors are caught and displayed to users - * - Graceful fallback to empty content on conversion errors - * - * @example Basic Usage - * ```tsx * * ``` @@ -108,145 +28,25 @@ import React, {useState, useEffect} from "react" -import yaml from "js-yaml" - import EditorWrapper from "./Editor" -import DiffHighlightPlugin from "./plugins/code/plugins/DiffHighlightPlugin" - -/** - * Detect the language of a string content - */ -function detectLanguage(content: string): "json" | "yaml" { - const trimmed = content.trim() - - // Try JSON first (more strict) - try { - JSON.parse(trimmed) - return "json" - } catch { - // Not valid JSON, check for YAML indicators - if (trimmed.includes(":") && !trimmed.startsWith("{") && !trimmed.startsWith("[")) { - return "yaml" - } - // Default to JSON for ambiguous cases - return "json" - } -} - -/** - * Normalize content to string format - */ -function normalizeContent(content: string | any, targetLanguage: "json" | "yaml"): string { - // If already a string, return as-is - if (typeof content === "string") { - return content - } - - // Convert object to target format - if (targetLanguage === "yaml") { - return yaml.dump(content, {indent: 2}) - } else { - return JSON.stringify(content, null, 2) - } -} - -/** - * Convert content between formats when language changes - */ -function convertContent( - content: string, - fromLanguage: "json" | "yaml", - toLanguage: "json" | "yaml", -): string { - if (fromLanguage === toLanguage) { - return content - } - - try { - if (fromLanguage === "json" && toLanguage === "yaml") { - const parsed = JSON.parse(content) - return yaml.dump(parsed, {indent: 2}) - } else if (fromLanguage === "yaml" && toLanguage === "json") { - const parsed = yaml.load(content) - return JSON.stringify(parsed, null, 2) - } - } catch (error) { - console.warn(`Failed to convert content from ${fromLanguage} to ${toLanguage}:`, error) - // Return empty content of target format on conversion error - return toLanguage === "json" ? "{}" : "" - } - - return content -} +import {DiffHighlightPlugin} from "./plugins/code/plugins/DiffHighlightPlugin" /** * Reusable DiffView component that handles diff computation and display */ export interface DiffViewProps { - /** Language for diff display - if not provided, will be inferred from content */ - language?: "json" | "yaml" - /** Original content - can be string (JSON/YAML) or JavaScript object */ - original: string | any - /** Modified content - can be string (JSON/YAML) or JavaScript object */ - modified: string | any - /** Additional CSS classes */ + /** The programming language for syntax highlighting */ + language: "json" | "yaml" + /** Original content as string */ + original: string + /** Modified content as string */ + modified: string + /** Optional className for styling */ className?: string - /** Debounce delay for diff computation in milliseconds */ + /** Debounce timeout in milliseconds (default: 1000) */ debounceMs?: number - /** Whether to show error messages */ + /** Show error messages when parsing fails */ showErrors?: boolean - /** Enable folding of large unchanged sections */ - enableFolding?: boolean - /** Minimum number of consecutive context lines before folding */ - foldThreshold?: number - /** Show count of folded lines in fold indicators */ - showFoldedLineCount?: boolean - /** If true, compute diff only once on mount and never debounce or recompute */ - computeOnMountOnly?: boolean -} - -function computeProcessed( - languageProp: DiffViewProps["language"], - originalProp: DiffViewProps["original"], - modifiedProp: DiffViewProps["modified"], -) { - // Normalize content to strings - const originalStr = normalizeContent(originalProp, languageProp || "json") - const modifiedStr = normalizeContent(modifiedProp, languageProp || "json") - - // Determine final language - let finalLanguage: "json" | "yaml" - if (languageProp) { - finalLanguage = languageProp - } else { - const originalLang = detectLanguage(originalStr) - const modifiedLang = detectLanguage(modifiedStr) - finalLanguage = originalLang === "yaml" || modifiedLang === "yaml" ? "yaml" : "json" - } - - // Convert content to target language if needed - let processedOriginal = originalStr - let processedModified = modifiedStr - - if (typeof originalProp === "string" && languageProp) { - const detectedOriginal = detectLanguage(originalStr) - if (detectedOriginal !== finalLanguage) { - processedOriginal = convertContent(originalStr, detectedOriginal, finalLanguage) - } - } - - if (typeof modifiedProp === "string" && languageProp) { - const detectedModified = detectLanguage(modifiedStr) - if (detectedModified !== finalLanguage) { - processedModified = convertContent(modifiedStr, detectedModified, finalLanguage) - } - } - - return { - original: processedOriginal, - modified: processedModified, - language: finalLanguage, - } } const DiffView: React.FC = ({ @@ -254,62 +54,28 @@ const DiffView: React.FC = ({ original, modified, className = "", - debounceMs = 300, + debounceMs = 1000, showErrors = true, - enableFolding = false, - foldThreshold = 5, - showFoldedLineCount = true, - computeOnMountOnly = false, }) => { const [diffKey, setDiffKey] = useState(0) const [error, setError] = useState(null) - const [processedContent, setProcessedContent] = useState<{ - original: string - modified: string - language: "json" | "yaml" - }>(() => computeProcessed(language, original, modified)) - // Process content and determine language + // Trigger diff computation with debouncing useEffect(() => { - if (computeOnMountOnly) return - try { - setError(null) - const next = computeProcessed(language, original, modified) - setProcessedContent(next) - } catch (parseError) { - if (showErrors) { - setError(`Failed to process content. Please check your syntax.`) - } - } - }, [ - original, - modified, - language, - showErrors, - enableFolding, - foldThreshold, - showFoldedLineCount, - computeOnMountOnly, - ]) - - // Trigger diff computation with debouncing for content, immediate for folding - useEffect(() => { - if (computeOnMountOnly) return - if (debounceMs && debounceMs > 0) { - const timeout = setTimeout(() => { + const timeout = setTimeout(() => { + try { + setError(null) + // Increment key to trigger editor re-render with new diff data setDiffKey((prev) => prev + 1) - }, debounceMs) - return () => clearTimeout(timeout) - } - // No debounce: update immediately without timeouts - setDiffKey((prev) => prev + 1) - }, [processedContent, debounceMs, computeOnMountOnly]) + } catch (parseError) { + if (showErrors) { + setError(`Invalid ${language.toUpperCase()} format. Please check your syntax.`) + } + } + }, debounceMs) - // Trigger immediate diff computation when folding options change - useEffect(() => { - if (computeOnMountOnly) return - setDiffKey((prev) => prev + 1) - }, [enableFolding, foldThreshold, showFoldedLineCount, computeOnMountOnly]) + return () => clearTimeout(timeout) + }, [original, modified, language, debounceMs, showErrors]) return (
    @@ -321,17 +87,13 @@ const DiffView: React.FC = ({ , ]} className="w-full" diff --git a/web/oss/src/components/Editor/Editor.tsx b/web/oss/src/components/Editor/Editor.tsx index 1e4d8548f1..f2f434a34a 100644 --- a/web/oss/src/components/Editor/Editor.tsx +++ b/web/oss/src/components/Editor/Editor.tsx @@ -1,6 +1,5 @@ import {forwardRef, useCallback, useEffect, useRef, ReactNode, memo, useState} from "react" -import {$isCodeNode} from "@lexical/code" import {$convertFromMarkdownString, TRANSFORMERS} from "@lexical/markdown" import {LexicalComposer} from "@lexical/react/LexicalComposer" import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" @@ -25,9 +24,10 @@ import EditorPlugins from "./plugins" import {createHighlightedNodes, TOGGLE_FORM_VIEW} from "./plugins/code" import {$isCodeBlockNode} from "./plugins/code/nodes/CodeBlockNode" import {$getEditorCodeAsString} from "./plugins/code/plugins/RealTimeValidationPlugin" -import {$convertToMarkdownStringCustom} from "./plugins/markdown/assets/transformers" -import {ON_CHANGE_COMMAND} from "./plugins/markdown/commands" import type {EditorProps} from "./types" +import {ON_CHANGE_COMMAND} from "./plugins/markdown/commands" +import {$isCodeNode} from "@lexical/code" +import {$convertToMarkdownStringCustom} from "./plugins/markdown/assets/transformers" export const ON_HYDRATE_FROM_REMOTE_CONTENT = createCommand<{ hydrateWithRemoteContent: string @@ -67,7 +67,6 @@ const EditorInner = forwardRef( singleLine = false, codeOnly = false, language, - templateFormat, customRender, showToolbar = true, enableTokens = false, @@ -291,15 +290,10 @@ const EditorInner = forwardRef( ) }, [editor]) - const lastHydratedRef = useRef("") - useEffect(() => { if (codeOnly) return - const next = initialValue || "" - if (lastHydratedRef.current === next) return - lastHydratedRef.current = next editor.dispatchCommand(ON_HYDRATE_FROM_REMOTE_CONTENT, { - hydrateWithRemoteContent: next, + hydrateWithRemoteContent: initialValue || "", parentId: "", }) }, [initialValue]) @@ -323,7 +317,6 @@ const EditorInner = forwardRef( > {view === "code" ? ( ( enableTokens={enableTokens} debug={debug} language={language} - templateFormat={templateFormat} placeholder={placeholder} handleUpdate={handleUpdate} initialValue={initialValue} @@ -448,7 +440,6 @@ const Editor = ({ singleLine = false, codeOnly = false, language, - templateFormat, customRender, showToolbar = true, enableTokens = false, @@ -473,7 +464,12 @@ const Editor = ({ }) return ( -
    +
    { + setContainerElm(el) + }} + > {noProvider ? ( void /** Whether default handling has been prevented */ diff --git a/web/oss/src/components/Editor/form/FormView.module.css b/web/oss/src/components/Editor/form/FormView.module.css index af54cdc52a..14f92b5829 100644 --- a/web/oss/src/components/Editor/form/FormView.module.css +++ b/web/oss/src/components/Editor/form/FormView.module.css @@ -1,44 +1,44 @@ .form-view { - :global(.ant-typography-edit-content) { - width: auto !important; - position: static !important; - display: inline-block !important; - vertical-align: baseline !important; - margin: 0px !important; - } - - /* editable textarea styling */ - :global(.ant-typography-edit-content input), - :global(.ant-typography-edit-content textarea) { - display: inline !important; - min-width: 0px !important; - width: fit-content !important; - position: static !important; - padding: 0 !important; - margin: 0 !important; - border: none !important; - outline: none !important; - box-shadow: none !important; - background: transparent !important; - font-size: 12px !important; - min-height: 0px !important; - font-weight: 600; - line-height: 20px !important; - height: auto !important; - resize: none; - field-sizing: content; - display: none; - } + :global(.ant-typography-edit-content) { + width: auto !important; + position: static !important; + display: inline-block !important; + vertical-align: baseline !important; + margin: 0px !important; + } + + /* editable textarea styling */ + :global(.ant-typography-edit-content input), + :global(.ant-typography-edit-content textarea) { + display: inline !important; + min-width: 0px !important; + width: fit-content !important; + position: static !important; + padding: 0 !important; + margin: 0 !important; + border: none !important; + outline: none !important; + box-shadow: none !important; + background: transparent !important; + font-size: 12px !important; + min-height: 0px !important; + font-weight: 600; + line-height: 20px !important; + height: auto !important; + resize: none; + field-sizing: content; + display: none; + } } /* horizontal connector for each tree row */ .tree-row { - position: relative; + position: relative; } .tree-row { &::before { - content: ""; + content: ''; position: absolute; left: -10px; top: 50%; @@ -60,7 +60,7 @@ /* &::before { display: none; } */ - /* border-left: none; */ + /* border-left: none; */ } } @@ -80,7 +80,7 @@ span { margin: 0px; } - + &:global(.no-line) { &::before { display: none; @@ -88,239 +88,117 @@ /* border-left: none; */ } - &:global(.primitive):before, - &:global(.object-key):before, - &:global(.array-key):before, - &:global(.array-item-wrapper):before { - left: 0px; - width: 8px; - border-top: 1px dotted red; - } - - .tree-row { - &::before { - content: ""; - position: absolute; - left: -10px; - top: 50%; - transform: translateY(-50%); - width: 8px; - border-top: 1px dotted #c4c4c4; - } - - &:global(.array-item) { - border-left: none; - } - border-left: 1px dashed #e5e5e5; - - :global(.object-node) { - /* > .tree-row { + &:global(.primitive):before, + &:global(.object-key):before, + &:global(.array-key):before, + &:global(.array-item-wrapper):before { + left: 0px; + width: 8px; + border-top: 1px dotted red; + } + + .tree-row { + &::before { + content: ''; + position: absolute; + left: -10px; + top: 50%; + transform: translateY(-50%); + width: 8px; + border-top: 1px dotted #c4c4c4; + } + + &:global(.array-item) { + border-left: none; + } + border-left: 1px dashed #e5e5e5; + + :global(.object-node) { + /* > .tree-row { border-left: none; } */ - > .tree-row:last-of-type { - /* &::before { + > .tree-row:last-of-type { + /* &::before { display: none; } */ - /* border-left: none; */ - } - } - - span:only-of-type { - margin-left: 4px !important; - } - - &:global(.array-item) { - margin-left: 0px !important; - padding-left: 0px !important; - - > span:first-of-type { - display: none; - } - } - - span { - margin: 0px; - } - - &:global(.no-line) { - &::before { - display: none; - } - /* border-left: none; */ - } - - &:global(.primitive):before, - &:global(.object-key):before, - &:global(.array-key):before, - &:global(.array-item-wrapper):before { - left: 0px; - width: 8px; - border-top: 1px dotted red; - } - &:global(.object-node):before, - &:global(.object-item-wrapper):before, - &:global(.array-node):before, - &:global(.array-item):before { - display: none; - } - - .node-header, - &:global(.array-key) { - min-height: 34px; - - margin-left: 10px; - - span:nth-child(2), - input { - margin-left: 4px; - } - } - } - - .row-wrapper { - position: relative; - } - - .row-wrapper:hover .add-inline, - .between-hover:hover .add-between, - .on-hover:hover .add-between { - opacity: 1; - } - - .add-inline { - position: relative; - cursor: pointer; - opacity: 0; - transition: opacity 0.15s; - pointer-events: auto; - } - - /* New class for inline header buttons */ - .add-inline-btn { - position: relative; - display: inline-flex; - align-items: center; - justify-content: center; - width: 14px; - height: 14px; - margin-left: 4px; - cursor: pointer; - opacity: 0; - transition: opacity 0.15s; - pointer-events: auto; - } - - /* .row-wrapper:hover .add-inline-btn, */ - .node-header:hover .add-inline-btn { - opacity: 1; - } - - /* existing class retains */ - .add-inline { - position: relative; - cursor: pointer; - opacity: 0; - transition: opacity 0.15s; - pointer-events: auto; - } - - .add-between { - position: relative; - display: flex; - align-items: center; - justify-content: center; - - width: 14px; - height: 14px; - left: -3px; - top: 0; - cursor: pointer; - opacity: 0; - transition: opacity 0.15s; - pointer-events: auto; - - span { - margin-left: 0 !important; - &:only-of-type { - margin-left: 0 !important; - } - } - } - - .on-hover { - pointer-events: none; - position: absolute; - top: 8px; - /* calc(50% - 8px); */ - width: 14px; - height: 14px; - /* left: 0px; */ - } - .between-hover { - pointer-events: none; - position: absolute; - top: -7px; - width: 14px; - height: 14px; - /* left: 0px; */ + /* border-left: none; */ + } + } + + span:only-of-type { + margin-left: 4px !important; + } + + &:global(.array-item) { + margin-left: 0px !important; + padding-left: 0px !important; + + > span:first-of-type { + display: none; + } + } + + span { + margin: 0px; + } + + &:global(.no-line) { + &::before { + display: none; + } + /* border-left: none; */ + } + + &:global(.primitive):before, + &:global(.object-key):before, + &:global(.array-key):before, + &:global(.array-item-wrapper):before { + left: 0px; + width: 8px; + border-top: 1px dotted red; } - - /* editable textarea styling */ - :global(.ant-typography-edit-content input), - :global(.ant-typography-edit-content textarea) { - display: inline !important; - min-width: 0px !important; - width: fit-content !important; - position: static !important; - padding: 0 !important; - margin: 0 !important; - border: none !important; - outline: none !important; - box-shadow: none !important; - background: transparent !important; - font-size: 12px !important; - min-height: 0px !important; - font-weight: 600; - line-height: 20px !important; - height: auto !important; - resize: none; - field-sizing: content; - display: none; + &:global(.object-node):before, + &:global(.object-item-wrapper):before, + &:global(.array-node):before, + &:global(.array-item):before { + display: none; } - + .node-header, &:global(.array-key) { - min-height: 34px; - - margin-left: 10px; - - span:nth-child(2), - input { - margin-left: 4px; - } + min-height: 34px; + + margin-left: 10px; + + span:nth-child(2), + input { + margin-left: 4px; + } } -} - -.row-wrapper { + } + + + + .row-wrapper { position: relative; -} - -.row-wrapper:hover .add-inline, -.between-hover:hover .add-between, -.on-hover:hover .add-between { + } + + .row-wrapper:hover .add-inline, + .between-hover:hover .add-between, + .on-hover:hover .add-between { opacity: 1; -} - -.add-inline { + } + + .add-inline { position: relative; cursor: pointer; opacity: 0; transition: opacity 0.15s; pointer-events: auto; -} - -/* New class for inline header buttons */ -.add-inline-btn { + } + + /* New class for inline header buttons */ + .add-inline-btn { position: relative; display: inline-flex; align-items: center; @@ -332,28 +210,28 @@ opacity: 0; transition: opacity 0.15s; pointer-events: auto; -} - -/* .row-wrapper:hover .add-inline-btn, */ -.node-header:hover .add-inline-btn { + } + + /* .row-wrapper:hover .add-inline-btn, */ + .node-header:hover .add-inline-btn { opacity: 1; -} - -/* existing class retains */ -.add-inline { + } + + /* existing class retains */ + .add-inline { position: relative; cursor: pointer; opacity: 0; transition: opacity 0.15s; pointer-events: auto; -} - -.add-between { + } + + .add-between { position: relative; display: flex; align-items: center; justify-content: center; - + width: 14px; height: 14px; left: -3px; @@ -361,17 +239,17 @@ cursor: pointer; opacity: 0; transition: opacity 0.15s; - pointer-events: auto; - + pointer-events: auto; + span { + margin-left: 0 !important; + &:only-of-type { margin-left: 0 !important; - &:only-of-type { - margin-left: 0 !important; - } + } } -} - -.on-hover { + } + + .on-hover { pointer-events: none; position: absolute; top: 8px; @@ -379,12 +257,140 @@ width: 14px; height: 14px; /* left: 0px; */ -} -.between-hover { + } + .between-hover { pointer-events: none; position: absolute; top: -7px; width: 14px; height: 14px; /* left: 0px; */ + } + + /* editable textarea styling */ + :global(.ant-typography-edit-content input), + :global(.ant-typography-edit-content textarea) { + display: inline !important; + min-width: 0px !important; + width: fit-content !important; + position: static !important; + padding: 0 !important; + margin: 0 !important; + border: none !important; + outline: none !important; + box-shadow: none !important; + background: transparent !important; + font-size: 12px !important; + min-height: 0px !important; + font-weight: 600; + line-height: 20px !important; + height: auto !important; + resize: none; + field-sizing: content; + display: none; + } + + .node-header, + &:global(.array-key) { + min-height: 34px; + + margin-left: 10px; + + span:nth-child(2), + input { + margin-left: 4px; + } + } +} + + +.row-wrapper { + position: relative; +} + +.row-wrapper:hover .add-inline, +.between-hover:hover .add-between, +.on-hover:hover .add-between { + opacity: 1; +} + +.add-inline { + position: relative; + cursor: pointer; + opacity: 0; + transition: opacity 0.15s; + pointer-events: auto; } + +/* New class for inline header buttons */ +.add-inline-btn { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + width: 14px; + height: 14px; + margin-left: 4px; + cursor: pointer; + opacity: 0; + transition: opacity 0.15s; + pointer-events: auto; +} + +/* .row-wrapper:hover .add-inline-btn, */ +.node-header:hover .add-inline-btn { + opacity: 1; +} + +/* existing class retains */ +.add-inline { + position: relative; + cursor: pointer; + opacity: 0; + transition: opacity 0.15s; + pointer-events: auto; +} + +.add-between { + position: relative; + display: flex; + align-items: center; + justify-content: center; + + width: 14px; + height: 14px; + left: -3px; + top: 0; + cursor: pointer; + opacity: 0; + transition: opacity 0.15s; + pointer-events: auto; + + span { + margin-left: 0 !important; + &:only-of-type { + margin-left: 0 !important; + } + } +} + +.on-hover { + pointer-events: none; + position: absolute; + top: 8px; + /* calc(50% - 8px); */ + width: 14px; + height: 14px; + /* left: 0px; */ +} +.between-hover { + pointer-events: none; + position: absolute; + top: -7px; + width: 14px; + height: 14px; + /* left: 0px; */ +} + + + diff --git a/web/oss/src/components/Editor/form/FormView.tsx b/web/oss/src/components/Editor/form/FormView.tsx index 0d29fb37d5..6a3d67c9ed 100644 --- a/web/oss/src/components/Editor/form/FormView.tsx +++ b/web/oss/src/components/Editor/form/FormView.tsx @@ -47,6 +47,7 @@ const renameKey = ( ): Record => { if (path.length === 0) return root const cloned = deepClone(root) + console.log("[renameKey] before", root, path.join("."), Object.keys(root), newKey) let cursor: any = cloned for (let i = 0; i < path.length - 1; i++) { const seg = path[i] @@ -56,6 +57,7 @@ const renameKey = ( const last = path[path.length - 1] as string if (typeof last !== "string") return cloned // arrays not renamable const prevKeys = Object.keys(cursor) + console.log("[renameKey] cursor before", cursor) const reordered: Record = {} Object.entries(cursor).forEach(([key, val]) => { if (key === last) { @@ -64,6 +66,20 @@ const renameKey = ( reordered[key] = val } }) + console.log( + "[renameKey] path", + path.join("."), + "oldKey", + last, + "newKey", + newKey, + "\n prevKeys", + prevKeys, + "\n nextKeys", + Object.keys(reordered), + "\n reordered object", + reordered, + ) // replace object with reordered keys Object.keys(cursor).forEach((k) => delete cursor[k]) Object.assign(cursor, reordered) @@ -139,6 +155,7 @@ const FormView: FC = ({value, onChange, customRender}) => { const boundHandleValuesChange = useCallback( (path: (string | number)[], newValue: any) => { + console.log("boundHandleValuesChange", path, newValue) const updatedRoot = structuredClone(formValuesRef) // walk to parent diff --git a/web/oss/src/components/Editor/hooks/useEditorConfig/index.ts b/web/oss/src/components/Editor/hooks/useEditorConfig/index.ts index cadaef76a4..b155148e6c 100644 --- a/web/oss/src/components/Editor/hooks/useEditorConfig/index.ts +++ b/web/oss/src/components/Editor/hooks/useEditorConfig/index.ts @@ -48,7 +48,6 @@ const useEditorConfig = ({ import("../../plugins/code/nodes/CodeHighlightNode"), import("../../plugins/code/nodes/CodeLineNode"), import("../../plugins/code/nodes/CodeBlockErrorIndicatorNode"), - import("../../plugins/code/nodes/CodeTabNode"), ]) initialNodes.push( @@ -57,7 +56,6 @@ const useEditorConfig = ({ initialNodesPromises[1].CodeHighlightNode, initialNodesPromises[2].CodeLineNode, initialNodesPromises[3].CodeBlockErrorIndicatorNode, - initialNodesPromises[4].CodeTabNode, ], ) } else { diff --git a/web/oss/src/components/Editor/hooks/useEditorResize.ts b/web/oss/src/components/Editor/hooks/useEditorResize.ts index 5cc9c13e20..75d6db8da8 100644 --- a/web/oss/src/components/Editor/hooks/useEditorResize.ts +++ b/web/oss/src/components/Editor/hooks/useEditorResize.ts @@ -1,4 +1,4 @@ -import {useCallback, useEffect, useRef, useState} from "react" +import {useEffect, useRef, useState} from "react" import type {EditorProps} from "../types" @@ -14,20 +14,14 @@ export function useEditorResize({ const containerRef = useRef(null) const isResizing = useRef(false) const [dimensions, setDimensions] = useState({width: 0, height: 0}) - const containerElmRef = useRef(null) - - // Use useCallback to prevent unnecessary re-renders and useRef to avoid state updates - const setContainerElmCallback = useCallback((el: HTMLDivElement | null) => { - containerElmRef.current = el - }, []) - + const [containerElm, setContainerElm] = useState(null) useEffect(() => { - if ((!containerRef.current && !containerElmRef.current) || singleLine || !enableResize) { + if ((!containerRef.current && !containerElm) || singleLine || !enableResize) { return } - const container = containerRef.current || containerElmRef.current - const handle = container.querySelector(".resize-handle") as HTMLElement + const container = containerRef.current || containerElm + const handle = container?.querySelector(".resize-handle") as HTMLElement if (!skipHandle && !handle) { return } @@ -80,7 +74,15 @@ export function useEditorResize({ document.removeEventListener("mousemove", throttledResize) document.removeEventListener("mouseup", stopResize) } - }, [skipHandle, singleLine, enableResize, boundWidth, boundHeight]) - - return {containerRef, dimensions, setContainerElm: setContainerElmCallback} + }, [ + containerElm, + skipHandle, + singleLine, + enableResize, + boundWidth, + boundHeight, + containerRef.current, + ]) + + return {containerRef, dimensions, setContainerElm} } diff --git a/web/oss/src/components/Editor/plugins/code/components/assets/CodeBlockErrorIndicator.module.css b/web/oss/src/components/Editor/plugins/code/components/assets/CodeBlockErrorIndicator.module.css index 917cdadf45..4880ccd131 100644 --- a/web/oss/src/components/Editor/plugins/code/components/assets/CodeBlockErrorIndicator.module.css +++ b/web/oss/src/components/Editor/plugins/code/components/assets/CodeBlockErrorIndicator.module.css @@ -38,9 +38,7 @@ white-space: pre-wrap; max-width: 320px; min-width: 200px; - box-shadow: - 0 8px 24px rgba(0, 0, 0, 0.15), - 0 4px 8px rgba(0, 0, 0, 0.1); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15), 0 4px 8px rgba(0, 0, 0, 0.1); z-index: 9999; backdrop-filter: blur(8px); border: 1px solid rgba(220, 38, 38, 0.2); @@ -59,30 +57,34 @@ /* Validation error highlighting for individual tokens */ &:global(.validation-error) { /* Subtle background with gradient */ - background: linear-gradient( - 135deg, - rgba(220, 38, 38, 0.08) 0%, - rgba(220, 38, 38, 0.12) 100% - ); - + background: linear-gradient(135deg, + rgba(220, 38, 38, 0.08) 0%, + rgba(220, 38, 38, 0.12) 100%); + /* Enhanced wavy underline */ border-bottom: 2px wavy #dc2626; - + /* Subtle text color adjustment */ color: #b91c1c; - + /* Positioning for pseudo-elements */ position: relative; - + + /* Smooth transitions */ + transition: all 0.2s ease; + /* Subtle border radius for modern look */ border-radius: 2px; + + /* Optional: subtle box shadow for depth */ + /* box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.1); */ } } + /* Subtle pulsing animation for unclosed blocks */ @keyframes unclosed-block-pulse { - 0%, - 100% { + 0%, 100% { opacity: 1; } 50% { diff --git a/web/oss/src/components/Editor/plugins/code/components/assets/DiffCodeBlock.module.css b/web/oss/src/components/Editor/plugins/code/components/assets/DiffCodeBlock.module.css index d10a0f333c..00103b20c9 100644 --- a/web/oss/src/components/Editor/plugins/code/components/assets/DiffCodeBlock.module.css +++ b/web/oss/src/components/Editor/plugins/code/components/assets/DiffCodeBlock.module.css @@ -6,9 +6,9 @@ padding-left: 8px; position: relative; } - + &:global(.diff-added::before) { - content: "+"; + content: '+'; color: #22c55e; font-weight: bold; margin-right: 8px; @@ -19,16 +19,16 @@ /* top: 0; */ line-height: inherit; } - + &:global(.diff-removed) { background-color: rgba(239, 68, 68, 0.1); border-left: 3px solid #ef4444; padding-left: 8px; position: relative; } - + &:global(.diff-removed::before) { - content: "-"; + content: '-'; color: #ef4444; font-weight: bold; margin-right: 8px; @@ -39,48 +39,11 @@ /* top: 0; */ line-height: inherit; } - + &:global(.diff-context) { - background-color: #f9f9fa; + background-color: rgba(156, 163, 175, 0.05); border-left: 3px solid var(--editor-bg); padding-left: 8px; position: relative; } - - &:global(.diff-fold) { - background-color: rgba(99, 102, 241, 0.08); - border-left: 3px solid #6366f1; - padding-left: 8px; - position: relative; - font-style: italic; - color: #6366f1; - text-align: center; - cursor: pointer; - user-select: none; - } - - /* Fold lines don't show line numbers - the fold message is self-explanatory */ - &:global(.diff-fold)::before { - content: "" !important; - display: none !important; - } - - /* Ensure no line number display for fold lines */ - &:global(.diff-fold[data-old-line-number])::before, - &:global(.diff-fold[data-new-line-number])::before { - content: "" !important; - display: none !important; - } - - /* Fold symbol - use ::after for the ellipsis */ - &:global(.diff-fold)::after { - content: "⋯" !important; - color: #6366f1; - font-weight: bold; - margin-right: 8px; - display: inline-block; - position: absolute; - left: 8px; - line-height: inherit; - } } diff --git a/web/oss/src/components/Editor/plugins/code/index.tsx b/web/oss/src/components/Editor/plugins/code/index.tsx index ba7f7e1725..babc880a19 100644 --- a/web/oss/src/components/Editor/plugins/code/index.tsx +++ b/web/oss/src/components/Editor/plugins/code/index.tsx @@ -9,16 +9,16 @@ import yaml from "js-yaml" import JSON5 from "json5" import { $getRoot, + $createTabNode, COMMAND_PRIORITY_LOW, createCommand, BLUR_COMMAND, FOCUS_COMMAND, $setSelection, + $isTabNode, LexicalNode, } from "lexical" -import {safeJson5Parse} from "@/oss/lib/helpers/utils" - import {INITIAL_CONTENT_COMMAND, InitialContentPayload} from "../../commands/InitialContentCommand" export const store = createStore() @@ -26,7 +26,6 @@ export const store = createStore() import {$createCodeBlockNode, $isCodeBlockNode} from "./nodes/CodeBlockNode" import {$createCodeHighlightNode} from "./nodes/CodeHighlightNode" import {$createCodeLineNode, CodeLineNode, $isCodeLineNode} from "./nodes/CodeLineNode" -import {$createCodeTabNode, $isCodeTabNode} from "./nodes/CodeTabNode" import {AutoCloseBracketsPlugin} from "./plugins/AutoCloseBracketsPlugin" import {AutoFormatAndValidateOnPastePlugin} from "./plugins/AutoFormatAndValidateOnPastePlugin" import {ClosingBracketIndentationPlugin} from "./plugins/ClosingBracketIndentationPlugin" @@ -38,6 +37,7 @@ import VerticalNavigationPlugin from "./plugins/VerticalNavigationPlugin" import {tryParsePartialJson} from "./tryParsePartialJson" import {createLogger} from "./utils/createLogger" import {tokenizeCodeLine} from "./utils/tokenizer" +import {validateAll} from "./utils/validationUtils" export const TOGGLE_FORM_VIEW = createCommand("TOGGLE_FORM_VIEW") @@ -84,12 +84,11 @@ function getTokenValidation( /** * Applies validation errors to code line nodes during initial content creation. - * Uses the unified ValidationManager for consistent validation. * * @param codeLineNodes The array of code line nodes to apply validation to. * @param text The original text content. * @param validationSchema The schema to validate against. - * @param editor The Lexical editor instance. + * @param editor The Lexical editor instance to store global errors. */ function applyValidationToNodes( codeLineNodes: CodeLineNode[], @@ -97,9 +96,57 @@ function applyValidationToNodes( validationSchema: any, editor?: any, ): void { - // Note: Validation is now handled automatically by the GlobalErrorIndicatorPlugin - // which listens to content changes and applies validation styling per editor instance. - // No need to manually trigger validation during initial content creation. + try { + // Run validation on the text content + const validationResult = validateAll(text, validationSchema) + + // Create a map of errors by line number + const errorsByLine = new Map() + + // Add all types of errors to the map + ;[...validationResult.structuralErrors, ...validationResult.schemaErrors].forEach( + (error) => { + const lineNumber = error.line + if (lineNumber && !errorsByLine.has(lineNumber)) { + errorsByLine.set(lineNumber, []) + } + if (lineNumber) { + errorsByLine.get(lineNumber)!.push(error) + } + }, + ) + + // Apply errors to the corresponding code line nodes + codeLineNodes.forEach((lineNode, index) => { + const lineNumber = index + 1 // Lines are 1-indexed + const lineErrors = errorsByLine.get(lineNumber) || [] + + if (lineErrors.length > 0) { + // Set validation errors on the line node + const writableLine = lineNode.getWritable() + writableLine.setValidationErrors(lineErrors) + } + }) + + // Store errors in editor state for GlobalErrorIndicatorPlugin + if (editor) { + ;(editor as any)._structuralErrors = validationResult.structuralErrors + ;(editor as any)._schemaErrors = validationResult.schemaErrors + ;(editor as any)._bracketErrors = validationResult.bracketErrors || [] + + console.log(`🎯 [applyValidationToNodes] Stored errors in editor state:`, { + structural: validationResult.structuralErrors.length, + schema: validationResult.schemaErrors.length, + bracket: (validationResult.bracketErrors || []).length, + }) + } + } catch (error) { + // Silently ignore validation errors during initial content creation + console.warn( + "[createHighlightedNodes] Validation failed during initial content creation:", + error, + ) + } } /** @@ -136,7 +183,7 @@ export function createHighlightedNodes( const codeLine = $createCodeLineNode() let content = line while (content.startsWith(" ")) { - codeLine.append($createCodeTabNode()) + codeLine.append($createTabNode()) content = content.substring(2) } const tokens = tokenizeCodeLine(content, language) @@ -172,7 +219,7 @@ export function createHighlightedNodes( const codeLine = $createCodeLineNode() let content = line while (content.startsWith(" ")) { - codeLine.append($createCodeTabNode()) + codeLine.append($createTabNode()) content = content.substring(2) } const tokens = tokenizeCodeLine(content, language) @@ -209,19 +256,17 @@ export function createHighlightedNodes( * 3. Ensures the editor always has a valid code block to edit */ function InsertInitialCodeBlockPlugin({ - debug = false, + debug, initialValue, language = "json", validationSchema, additionalCodePlugins = [], - editorId, }: { debug?: boolean initialValue: string language?: "json" | "yaml" validationSchema: any additionalCodePlugins?: React.ReactNode[] - editorId: string }) { const [editor] = useLexicalComposerContext() @@ -317,29 +362,14 @@ function InsertInitialCodeBlockPlugin({ try { // For JSON/YAML content, parse and format const objectValue = - payload.language === "json" + typeof payload.content === "string" ? JSON5.parse(payload.content) : payload.content let value: string if (payload.language === "json") { value = JSON.stringify(objectValue, null, 2) } else { - try { - const obj = yaml.load(objectValue) - if (obj !== undefined) { - value = yaml.dump(obj as any, {indent: 2}) - } else { - value = objectValue - } - } catch { - // Try JSON as a fallback and then dump to YAML for consistent highlighting - try { - const obj = JSON5.parse(objectValue) - value = yaml.dump(obj as any, {indent: 2}) - } catch { - value = objectValue - } - } + value = yaml.dump(objectValue, {indent: 2}) } log(" Reconstructing code block due to prop change", { language: payload.language, @@ -409,7 +439,7 @@ function InsertInitialCodeBlockPlugin({ return line .getChildren() .map((child: LexicalNode) => - $isCodeTabNode(child) ? " " : child.getTextContent(), + $isTabNode(child) ? " " : child.getTextContent(), ) .join("") }) @@ -503,15 +533,17 @@ function InsertInitialCodeBlockPlugin({ useEffect(() => { // For JSON/YAML content, use semantic comparison - if (prevInitialRef.current) { - if ( - isEqual( - safeJson5Parse(prevInitialRef.current as string), - safeJson5Parse(initialValue), - ) - ) { - return // no semantic change - } + if (prevInitialRef.current !== undefined) { + try { + if ( + isEqual( + JSON5.parse(prevInitialRef.current as string), + JSON5.parse(initialValue), + ) + ) { + return // no semantic change + } + } catch {} } prevInitialRef.current = initialValue @@ -537,8 +569,8 @@ function InsertInitialCodeBlockPlugin({ - - + + {additionalCodePlugins?.map((plugin, index) => ( {plugin} ))} diff --git a/web/oss/src/components/Editor/plugins/code/nodes/CodeBlockNode.ts b/web/oss/src/components/Editor/plugins/code/nodes/CodeBlockNode.ts index 21e08654a4..0cd3ac6dd3 100644 --- a/web/oss/src/components/Editor/plugins/code/nodes/CodeBlockNode.ts +++ b/web/oss/src/components/Editor/plugins/code/nodes/CodeBlockNode.ts @@ -11,15 +11,13 @@ import {ElementNode, LexicalNode, SerializedElementNode, Spread, EditorConfig} from "lexical" -import type {CodeLanguage} from "../types" - /** * Represents the serialized form of a CodeBlockNode. * Extends SerializedElementNode with a language property. */ export type SerializedCodeBlockNode = Spread< { - language: CodeLanguage + language: "json" | "yaml" hasValidationError: boolean }, SerializedElementNode @@ -31,7 +29,7 @@ export type SerializedCodeBlockNode = Spread< */ export class CodeBlockNode extends ElementNode { /** The programming language for syntax highlighting */ - __language: CodeLanguage + __language: "json" | "yaml" __hasValidationError: boolean /** @@ -56,7 +54,7 @@ export class CodeBlockNode extends ElementNode { * @param language - The programming language for the code block (defaults to "json") * @param key - Optional unique identifier for the node */ - constructor(language: CodeLanguage = "json", hasValidationError?: boolean, key?: string) { + constructor(language: "json" | "yaml" = "json", hasValidationError?: boolean, key?: string) { super(key) this.__language = language this.__hasValidationError = hasValidationError ?? false @@ -113,11 +111,11 @@ export class CodeBlockNode extends ElementNode { return false } - getLanguage(): CodeLanguage { + getLanguage(): "json" | "yaml" { return this.getLatest().__language } - setLanguage(language: CodeLanguage) { + setLanguage(language: "json" | "yaml") { const writable = this.getWritable() writable.__language = language } @@ -141,7 +139,7 @@ export class CodeBlockNode extends ElementNode { * @returns A new CodeBlockNode instance */ export function $createCodeBlockNode( - language: CodeLanguage, + language: "json" | "yaml", hasValidationError?: boolean, ): CodeBlockNode { return new CodeBlockNode(language, hasValidationError) diff --git a/web/oss/src/components/Editor/plugins/code/nodes/CodeHighlightNode.ts b/web/oss/src/components/Editor/plugins/code/nodes/CodeHighlightNode.ts index c1451eadfb..5cb5da98be 100644 --- a/web/oss/src/components/Editor/plugins/code/nodes/CodeHighlightNode.ts +++ b/web/oss/src/components/Editor/plugins/code/nodes/CodeHighlightNode.ts @@ -7,7 +7,15 @@ * * @module CodeHighlightNode */ -import {TextNode, EditorConfig, LexicalNode, SerializedTextNode, Spread} from "lexical" +import { + TextNode, + EditorConfig, + LexicalNode, + DOMExportOutput, + SerializedTextNode, + Spread, + LexicalEditor, +} from "lexical" import styles from "../components/assets/CodeBlockErrorIndicator.module.css" /** @@ -56,13 +64,6 @@ export class CodeHighlightNode extends TextNode { ) } - /** - * Instance-level clone used by paste utilities. - */ - clone(): CodeHighlightNode { - return CodeHighlightNode.clone(this) - } - /** * Creates a new CodeHighlightNode instance. * @param text - The text content of the node @@ -146,6 +147,15 @@ export class CodeHighlightNode extends TextNode { return super.updateDOM(prevNode as this, dom, config) } + /** + * Exports the node to a DOM representation for external use. + * @param editor - The Lexical editor instance + * @returns DOM export output + */ + exportDOM(editor: LexicalEditor): DOMExportOutput { + return super.exportDOM(editor) + } + exportJSON(): SerializedCodeHighlightNode { return { ...super.exportJSON(), diff --git a/web/oss/src/components/Editor/plugins/code/nodes/CodeLineNode.ts b/web/oss/src/components/Editor/plugins/code/nodes/CodeLineNode.ts index 320bb974de..5566519d1c 100644 --- a/web/oss/src/components/Editor/plugins/code/nodes/CodeLineNode.ts +++ b/web/oss/src/components/Editor/plugins/code/nodes/CodeLineNode.ts @@ -8,17 +8,16 @@ * * @module CodeLineNode */ -import {ElementNode, LexicalNode, SerializedElementNode, Spread} from "lexical" +import {ElementNode, LexicalNode, SerializedElementNode, Spread, DOMExportOutput} from "lexical" import styles from "../components/assets/CodeBlockErrorIndicator.module.css" import diffStyles from "../components/assets/DiffCodeBlock.module.css" -import {ErrorInfo, getValidationManager} from "../plugins/GlobalErrorIndicatorPlugin" -import {getCurrentEditorId} from "../plugins/SyntaxHighlightPlugin" +import {ErrorInfo} from "../plugins/GlobalErrorIndicatorPlugin" /** * Diff line types for code diff display */ -export type DiffType = "added" | "removed" | "context" | "fold" | null +export type DiffType = "added" | "removed" | "context" | null /** * Represents the serialized form of a CodeLineNode. @@ -188,33 +187,10 @@ export class CodeLineNode extends ElementNode { /** * Gets the validation errors for this line. - * Uses the unified ValidationManager as single source of truth. * @returns Array of validation errors for this line */ getValidationErrors(): ErrorInfo[] { - try { - const editorId = getCurrentEditorId() - if (!editorId) { - // No active editor context; fall back to stored errors - return this.getLatest().__validationErrors - } - - const manager = getValidationManager(editorId) - if (!manager) { - // Manager not registered yet for this editor; fall back - return this.getLatest().__validationErrors - } - - const lineNumber = this.calculateActualLineNumber() - return manager.getErrorsForLine(lineNumber) - } catch (error) { - // Fallback to stored validation errors (for backward compatibility) - console.warn( - "Failed to retrieve ValidationManager from registry; using stored errors:", - error, - ) - return this.getLatest().__validationErrors - } + return this.getLatest().__validationErrors } /** @@ -255,6 +231,7 @@ export class CodeLineNode extends ElementNode { for (const child of children) { if (child === this) { + // console.log(`📍 Node ${this.__key} calculated line: ${lineNumber}`) return lineNumber } if (child.getType() === "code-line") { @@ -296,8 +273,8 @@ export class CodeLineNode extends ElementNode { element.classList.add("folded") } - // Set line numbers for GitHub-style diff display (but not for fold lines) - if ((latest.__oldLineNumber || latest.__newLineNumber) && latest.__diffType !== "fold") { + // Set line numbers for GitHub-style diff display + if (latest.__oldLineNumber || latest.__newLineNumber) { const oldNum = latest.__oldLineNumber ? latest.__oldLineNumber.toString() : "" const newNum = latest.__newLineNumber ? latest.__newLineNumber.toString() : "" element.setAttribute("data-old-line-number", oldNum) @@ -322,6 +299,8 @@ export class CodeLineNode extends ElementNode { const lineNumber = this.calculateActualLineNumber() element.setAttribute("data-line-number", lineNumber.toString()) + // console.log(`🏠 DOM created: Node ${latest.__key} -> Line ${lineNumber}`) + return element } @@ -393,6 +372,9 @@ export class CodeLineNode extends ElementNode { const prevLineNumber = parseInt(dom.getAttribute("data-line-number") || "1") if (currentLineNumber !== prevLineNumber) { dom.setAttribute("data-line-number", currentLineNumber.toString()) + // console.log( + // `🔄 Updated line number: ${prevLineNumber} → ${currentLineNumber} (node key: ${latest.__key})`, + // ) } // Check for validation errors changes @@ -417,6 +399,11 @@ export class CodeLineNode extends ElementNode { // Apply new validation error styling if errors exist if (currentValidationErrors.length > 0) { + // console.log( + // `🔴 Applying validation errors to line ${currentLineNumber}:`, + // currentValidationErrors.map((e) => `[${e.type}] ${e.message}`), + // `(node key: ${latest.__key})`, + // ) const primaryError = currentValidationErrors[0] dom.classList.add("validation-error") dom.setAttribute("data-validation-error", primaryError.message) @@ -523,25 +510,18 @@ export class CodeLineNode extends ElementNode { return this.getLatest().__isCollapsed } - // /** - // * Exports this node to a DOM representation. - // * Creates a new DOM element with current folding state - // * and styling for external use. - // * - // * @returns Object containing the DOM element - // */ - // exportDOM(): DOMExportOutput { - // return { - // element: this.createDOM(), - // } - // } - - // importDOM(): void { - // this.setDiffType(null) - // this.setOldLineNumber(undefined) - // this.setNewLineNumber(undefined) - // this.setValidationErrors([]) - // } + /** + * Exports this node to a DOM representation. + * Creates a new DOM element with current folding state + * and styling for external use. + * + * @returns Object containing the DOM element + */ + exportDOM(): DOMExportOutput { + return { + element: this.createDOM(), + } + } /** * Serializes this node to JSON format. diff --git a/web/oss/src/components/Editor/plugins/code/nodes/CodeTabNode.ts b/web/oss/src/components/Editor/plugins/code/nodes/CodeTabNode.ts deleted file mode 100644 index 7b3824af72..0000000000 --- a/web/oss/src/components/Editor/plugins/code/nodes/CodeTabNode.ts +++ /dev/null @@ -1,118 +0,0 @@ -/** - * CodeTabNode.ts - * - * This module defines a custom Lexical node type for code blocks in the editor. - * CodeTabNode represents a container for code content with specific language - * highlighting (JSON or YAML). It extends ElementNode from Lexical and provides - * DOM manipulation and serialization capabilities. - * - * @module CodeTabNode - */ - -import {LexicalNode, SerializedTextNode, Spread, EditorConfig, TabNode} from "lexical" - -/** - * Represents the serialized form of a CodeTabNode. - * Extends SerializedTextNode since CodeTabNode extends TabNode which extends TextNode. - */ -export type SerializedCodeTabNode = Spread<{}, SerializedTextNode> - -/** - * CodeTabNode class represents a code block in the editor. - * It manages the rendering and behavior of code content with specific language highlighting. - */ -export class CodeTabNode extends TabNode { - /** - * Returns the node type identifier. - * @returns The string identifier for this node type - */ - static getType(): string { - return "code-tab-block" - } - - /** - * Creates a copy of an existing CodeTabNode. - * @param node - The node to clone - * @returns A new CodeTabNode with the same properties - */ - static clone(node: CodeTabNode): CodeTabNode { - return new CodeTabNode(node.__key) - } - - /** - * Instance-level clone used by paste utilities. - */ - clone(): CodeTabNode { - return CodeTabNode.clone(this) - } - - /** - * Creates a new CodeTabNode instance. - * @param language - The programming language for the code block (defaults to "json") - * @param key - Optional unique identifier for the node - */ - constructor(key?: string) { - super(key) - } - - /** - * Creates the DOM element for this node. - * Sets up a code element with appropriate classes and attributes for syntax highlighting. - * @param config - Editor configuration - * @returns HTMLElement representing the code block - */ - createDOM(config: EditorConfig): HTMLElement { - // const code = document.createElement("code") - // code.classList.add("editor-code", `language-${this.__language}`, 'dark-theme') - // code.classList.add("editor-code", `language-${this.__language}`) - // code.setAttribute("data-language", this.__language) - // code.setAttribute("tabindex", "0") - // code.setAttribute("data-lexical-editor", "true") - - const dom = super.createDOM(config) - dom.classList.add("editor-code-tab") - return dom - } - - /** - * Determines if the DOM needs to be updated. - * Always returns false as the node is replaced entirely when changed. - * @returns false to indicate no incremental DOM updates - */ - updateDOM(prevNode: CodeTabNode, dom: HTMLElement, config: EditorConfig): boolean { - return super.updateDOM(prevNode as any, dom, config) - } - - /** - * Serializes the node for persistence. - * @returns Serialized representation of the code block - */ - exportJSON(): SerializedCodeTabNode { - return super.exportJSON() - } - - static importJSON(json: SerializedCodeTabNode): CodeTabNode { - return new CodeTabNode() - } - - isInline(): true { - return true - } -} - -/** - * Helper function to create a new CodeTabNode. - * @returns A new CodeTabNode instance - */ -export function $createCodeTabNode(): CodeTabNode { - return new CodeTabNode() -} - -/** - * Type guard to check if a node is a CodeTabNode. - * @param node - The node to check - * @returns True if the node is a CodeTabNode - */ -export function $isCodeTabNode(node: LexicalNode | null | undefined): node is CodeTabNode { - return node instanceof CodeTabNode -} diff --git a/web/oss/src/components/Editor/plugins/code/plugins/AutoCloseBracketsPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/AutoCloseBracketsPlugin.tsx index b3145563a8..8562c349a2 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/AutoCloseBracketsPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/AutoCloseBracketsPlugin.tsx @@ -12,7 +12,7 @@ * * @module AutoCloseBracketsPlugin */ -import {useEffect, useRef} from "react" +import {useEffect} from "react" import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" import { @@ -22,14 +22,13 @@ import { $getNodeByKey, $setSelection, $createRangeSelection, + $isTabNode, COMMAND_PRIORITY_HIGH, - SELECTION_CHANGE_COMMAND, } from "lexical" import {$isCodeBlockNode} from "../nodes/CodeBlockNode" import {$isCodeHighlightNode, $createCodeHighlightNode} from "../nodes/CodeHighlightNode" import {$isCodeLineNode} from "../nodes/CodeLineNode" -import {$isCodeTabNode} from "../nodes/CodeTabNode" import {createLogger} from "../utils/createLogger" /** Mapping of opening characters to their corresponding closing characters */ @@ -84,23 +83,12 @@ const log = createLogger("AutoCloseBracketsPlugin", { disabled: true, }) -/** - * Interface for tracking auto-completion context - */ -interface AutoCloseContext { - nodeKey: string - offset: number - closingChar: string - openingChar: string -} - /** * React component that implements auto-closing behavior for brackets and quotes. * Integrates with Lexical editor to provide real-time bracket matching and indentation. * * Key features: * - Auto-closes matching characters - * - State-based tracking of auto-completion context * - Handles multiple cursor positions * - Prevents unwanted closings inside strings * - Maintains proper indentation @@ -111,24 +99,8 @@ interface AutoCloseContext { export function AutoCloseBracketsPlugin() { const [editor] = useLexicalComposerContext() - // Track the current auto-completion context - const autoCloseContextRef = useRef(null) - useEffect(() => { - // Clear auto-close context when selection changes - const unregisterSelectionChange = editor.registerCommand( - SELECTION_CHANGE_COMMAND, - () => { - // Clear context when selection changes (user moves cursor) - if (autoCloseContextRef.current) { - autoCloseContextRef.current = null - } - return false - }, - COMMAND_PRIORITY_HIGH, - ) - - const unregisterKeyDown = editor.registerCommand( + return editor.registerCommand( KEY_DOWN_COMMAND, (event: KeyboardEvent) => { log("KEY_DOWN_COMMAND 1", event.key) @@ -178,7 +150,7 @@ export function AutoCloseBracketsPlugin() { log("Active selection detected 5", anchorNode) if ( !$isCodeHighlightNode(anchorNode) && - !$isCodeTabNode(anchorNode) && + !$isTabNode(anchorNode) && !$isCodeLineNode(anchorNode) ) return false @@ -234,7 +206,7 @@ export function AutoCloseBracketsPlugin() { "text", ) $setSelection(sel) - } else if ($isCodeTabNode(anchorNode)) { + } else if ($isTabNode(anchorNode)) { newText = newText.trim() const highlightNode = $createCodeHighlightNode( newText, @@ -270,7 +242,7 @@ export function AutoCloseBracketsPlugin() { let anchorNode = selection.anchor.getNode() let offset = selection.anchor.offset - if ($isCodeTabNode(anchorNode)) { + if ($isTabNode(anchorNode)) { const nextSibling = anchorNode.getNextSibling() if (!nextSibling) { $setSelection(null) @@ -293,7 +265,7 @@ export function AutoCloseBracketsPlugin() { // Ensure we're only handling text nodes or empty line nodes // This prevents auto-closing in non-code contexts if ( - !$isCodeTabNode(anchorNode) && + !$isTabNode(anchorNode) && !$isCodeHighlightNode(anchorNode) && !$isCodeLineNode(anchorNode) ) { @@ -326,6 +298,7 @@ export function AutoCloseBracketsPlugin() { log("KEY_DOWN_COMMAND 5") const language = blockNode.getLanguage() const text = anchorNode.getTextContent() + const charBefore = text[offset - 1] || "" const charAfter = text[offset] || "" const isStringQuote = key === '"' || key === "'" || key === "`" @@ -344,87 +317,29 @@ export function AutoCloseBracketsPlugin() { } /** - * VSCode-like smart quote handling: - * 1. If next char is same quote -> move cursor past it (skip over) - * 2. If we're at the end of a string -> move cursor past closing quote - * 3. If we're starting a new string -> auto-complete with pair - * 4. Prevent bracket auto-closing inside strings + * Handle string quotes with special cases: + * 1. Skip if next char is same quote (just move cursor) + * 2. Check quote balance to maintain valid string state + * 3. Prevent bracket auto-closing inside strings */ - // Check if we should skip over a closing character based on auto-close context - const context = autoCloseContextRef.current - if ( - context && - // context.nodeKey === anchorNode.getKey() && - // context.offset === offset && - context.closingChar === key - ) { - // We're in auto-close context and typing the closing character - // Skip over it instead of inserting - event.preventDefault() - const sel = $createRangeSelection() - sel.anchor.set(anchorNode.getKey(), offset + 1, "text") - sel.focus.set(anchorNode.getKey(), offset + 1, "text") - $setSelection(sel) - - // Clear the context since we've used it - autoCloseContextRef.current = null - log("[AutoClose] Skipped over closing character:", key) - return true - } else { - if ($isCodeHighlightNode(anchorNode)) { - // if this is a text bracket, and the node already is a text block with valid string opening - // and closing, do not autoclose this new bracket - const text = anchorNode.getTextContent() - const textFirst = text[0] - const textLast = text[text.length - 1] - if ( - isStringQuote && - ((textFirst === "'" && textLast === "'") || - (textFirst === '"' && textLast === '"')) - ) { - return false - } - } - } - - // Clear context on any other key press (breaks the auto-close chain) - if (context) { - log("[AutoClose] Key press broke auto-close context") - autoCloseContextRef.current = null - } - if (isStringQuote) { - // Check if we're inside a string context - const isCurrentlyInsideString = isInsideString(text, offset) - - // If we're inside a string and typing the same quote type, - // we might be trying to close the string - if (isCurrentlyInsideString) { - // Count unmatched quotes of this type before cursor - let quoteCount = 0 - let escaped = false - for (let i = 0; i < offset; i++) { - const char = text[i] - if (char === "\\" && !escaped) { - escaped = true - continue - } - if (char === key && !escaped) { - quoteCount++ - } - escaped = false - } - - // If odd number of quotes, we're likely closing a string - // Don't auto-complete, just insert the closing quote - if (quoteCount % 2 === 1) { - // Let the default behavior handle this (just insert the quote) - return false - } + // If next char is same quote, just move cursor past it + if (charAfter === key && charBefore !== key) { + event.preventDefault() + anchorNode.select(offset) + return true } - // Starting a new string - auto-complete with pair - // (This will be handled by the auto-close logic below) + // Count quotes before and after cursor + const quoteCountBefore = ( + text.slice(0, offset).match(new RegExp(`\\${key}`, "g")) || [] + ).length + const quoteCountAfter = ( + text.slice(offset).match(new RegExp(`\\${key}`, "g")) || [] + ).length + + // Don't auto-close if it would create invalid string state + if ((quoteCountBefore + quoteCountAfter) % 2 !== 0) return false } else if (BRACKETS.includes(key) && insideString) { // Don't auto-close brackets inside strings return false @@ -478,19 +393,7 @@ export function AutoCloseBracketsPlugin() { sel.anchor.set(updated.getKey(), offset + 1, "text") sel.focus.set(updated.getKey(), offset + 1, "text") $setSelection(sel) - - // Set auto-close context for the inserted pair - autoCloseContextRef.current = { - nodeKey: updated.getKey(), - offset: offset + 1, // Position after opening char, before closing char - closingChar: close, - openingChar: key, - } - - log("[AutoCloseBrackets] Set collapsed selection and auto-close context", { - offset: offset + 1, - closingChar: close, - }) + log("[AutoCloseBrackets] Set collapsed selection at offset +1") } else { log("[AutoCloseBrackets] Could not find updated node to select") } @@ -498,12 +401,6 @@ export function AutoCloseBracketsPlugin() { }, COMMAND_PRIORITY_HIGH, ) - - // Return cleanup function that unregisters both listeners - return () => { - unregisterSelectionChange() - unregisterKeyDown() - } }, [editor]) return null diff --git a/web/oss/src/components/Editor/plugins/code/plugins/ClosingBracketIndentationPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/ClosingBracketIndentationPlugin.tsx index 335bd63efd..11eb245bfa 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/ClosingBracketIndentationPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/ClosingBracketIndentationPlugin.tsx @@ -2,11 +2,17 @@ import {useEffect} from "react" import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" -import {$getSelection, $isRangeSelection, COMMAND_PRIORITY_HIGH, KEY_DOWN_COMMAND} from "lexical" +import { + $createTabNode, + $getSelection, + $isRangeSelection, + $isTabNode, + COMMAND_PRIORITY_HIGH, + KEY_DOWN_COMMAND, +} from "lexical" import {$isCodeBlockNode} from "../nodes/CodeBlockNode" import {$isCodeLineNode} from "../nodes/CodeLineNode" -import {$createCodeTabNode, $isCodeTabNode} from "../nodes/CodeTabNode" import {createLogger} from "../utils/createLogger" const log = createLogger("ClosingBracketIndentationPlugin", { @@ -155,7 +161,7 @@ export function ClosingBracketIndentationPlugin() { const leadingTabs = [] for (const child of lineChildren) { - if ($isCodeTabNode(child)) { + if ($isTabNode(child)) { leadingTabs.push(child) } else { break @@ -184,11 +190,11 @@ export function ClosingBracketIndentationPlugin() { // Add missing tabs const tabsToAdd = matchingIndentLevel - currentIndentLevel const firstNonTabChild = currentLineChildren.find( - (child) => !$isCodeTabNode(child), + (child) => !$isTabNode(child), ) for (let i = 0; i < tabsToAdd; i++) { - const tabNode = $createCodeTabNode() + const tabNode = $createTabNode() if (firstNonTabChild) { firstNonTabChild.insertBefore(tabNode) } else { diff --git a/web/oss/src/components/Editor/plugins/code/plugins/CodeFoldingPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/CodeFoldingPlugin.tsx index 1e5d46162f..a4fb428072 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/CodeFoldingPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/CodeFoldingPlugin.tsx @@ -13,7 +13,6 @@ const log = createLogger("CodeFoldingPlugin", {disabled: true}) interface LineInfo { key: string top: number - height: number collapsed: boolean foldable: boolean } @@ -92,7 +91,6 @@ export function CodeFoldingPlugin() { if (!$isCodeLineNode(node)) return const rect = el.getBoundingClientRect() const top = rect.top + domRoot.scrollTop - domRoot.getBoundingClientRect().top - const height = rect.height const language = ($isCodeBlockNode(node.getParent()) && (node.getParent() as any).getLanguage?.()) || @@ -102,7 +100,6 @@ export function CodeFoldingPlugin() { next.push({ key, top, - height, collapsed: node.isCollapsed(), foldable, }) @@ -135,35 +132,29 @@ export function CodeFoldingPlugin() { return (
    - {lines.map((line) => { - return ( - - ) - })} + {lines.map((line) => ( + + ))}
    ) } diff --git a/web/oss/src/components/Editor/plugins/code/plugins/DiffHighlightPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/DiffHighlightPlugin.tsx index eea97df2b3..a77a8adba2 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/DiffHighlightPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/DiffHighlightPlugin.tsx @@ -1,91 +1,15 @@ /** * DiffHighlightPlugin.tsx * - * This plugin provides diff highlighting functionality for code blocks with support - * for both JSON and YAML content. It processes original and modified content to - * generate and display unified diff format with proper syntax highlighting. + * This plugin provides diff highlighting functionality for code blocks. + * It detects diff markers (+ and - prefixes) in code lines and applies + * appropriate styling to show added, removed, and context lines. * - * ## Features: + * Features: * - Automatic detection of diff format lines * - Support for unified diff format - * - JSON and YAML language support * - Integration with existing syntax highlighting * - Line-by-line diff state management - * - Real-time diff computation - * - * ## How It Works: - * - * ### 1. Content Processing - * When `originalContent` and `modifiedContent` are provided: - * - Content is parsed based on the `language` parameter ("json" | "yaml") - * - Objects are normalized and re-serialized for consistent formatting - * - Line-by-line diff is computed using the `computeDiff` utility - * - * ### 2. Diff Format - * The plugin generates GitHub-style diff format: - * ``` - * oldLineNum|newLineNum|type|content - * ``` - * Where: - * - `oldLineNum`: Line number in original content (empty for added lines) - * - `newLineNum`: Line number in modified content (empty for removed lines) - * - `type`: "added" | "removed" | "context" - * - `content`: The actual line content - * - * ### 3. Language Support - * **JSON Mode (`language="json"`):** - * - Parses content as JSON objects - * - Re-serializes with consistent 2-space indentation - * - Handles JSON syntax errors gracefully - * - * **YAML Mode (`language="yaml"`):** - * - Parses content as YAML objects using `js-yaml` - * - Re-serializes with consistent 2-space indentation - * - Handles YAML syntax errors gracefully - * - * ### 4. Visual Highlighting - * - Added lines: Green background with "+" indicator - * - Removed lines: Red background with "-" indicator - * - Context lines: Normal styling - * - Line numbers displayed for both old and new versions - * - * ## Usage Examples: - * - * ### Basic Usage - * ```tsx - * - * ``` - * - * ### YAML Diff - * ```tsx - * - * ``` - * - * ### Integration with EditorWrapper - * ```tsx - * - * ]} - * /> - * ``` - * - * ## Error Handling: - * - Invalid JSON/YAML content is handled gracefully - * - Parsing errors don't crash the diff computation - * - Fallback to string-based diff for unparseable content * * @module DiffHighlightPlugin */ @@ -118,47 +42,27 @@ function parseDiffLine(lineContent: string): { diffType: DiffType content: string } | null { - // Check if this is our new format: "oldLineNum|newLineNum|type|content" or fold format + // Check if this is our new format: "oldLineNum|newLineNum|type|content" const parts = lineContent.split("|") // Parse diff line format if (parts.length >= 4) { const [oldNumStr, newNumStr, type, ...contentParts] = parts + const content = contentParts.join("|") // Rejoin in case content had pipes - if (type === "fold") { - // Special handling for fold lines: "startLine-endLine|startLine-endLine|fold|content|foldedLineCount" - const content = contentParts.slice(0, -1).join("|") // All but last part is content - const _foldedLineCount = parseInt(contentParts[contentParts.length - 1] || "0", 10) - - // For fold lines, we want to display the range as-is - // The oldNumStr and newNumStr are both "startLine-endLine" format - // We'll store the start and end as separate numbers for CSS display - const lineRange = oldNumStr.split("-") - const startLine = lineRange[0] ? parseInt(lineRange[0], 10) : undefined - const endLine = lineRange[1] ? parseInt(lineRange[1], 10) : undefined - - return { - oldLineNumber: startLine, - newLineNumber: endLine, - diffType: "fold" as DiffType, - content, - } - } else { - // Regular diff lines - const content = contentParts.join("|") // Rejoin in case content had pipes - - const oldLineNumber = - oldNumStr && oldNumStr.trim() !== "" ? parseInt(oldNumStr, 10) : undefined - const newLineNumber = - newNumStr && newNumStr.trim() !== "" ? parseInt(newNumStr, 10) : undefined - const diffType = type as DiffType - - return { - oldLineNumber, - newLineNumber, - diffType, - content, - } + const oldLineNumber = + oldNumStr && oldNumStr.trim() !== "" ? parseInt(oldNumStr, 10) : undefined + const newLineNumber = + newNumStr && newNumStr.trim() !== "" ? parseInt(newNumStr, 10) : undefined + const diffType = type as DiffType + + // Return parsed result + + return { + oldLineNumber, + newLineNumber, + diffType, + content, } } @@ -211,20 +115,12 @@ function isDiffContent(blockText: string): boolean { * DiffHighlightPlugin component * Automatically detects and highlights diff content in code blocks */ -export default function DiffHighlightPlugin({ +export function DiffHighlightPlugin({ originalContent, modifiedContent, - language = "json", - enableFolding = false, - foldThreshold = 5, - showFoldedLineCount = true, }: { originalContent?: string modifiedContent?: string - language?: "json" | "yaml" - enableFolding?: boolean - foldThreshold?: number - showFoldedLineCount?: boolean } = {}): null { const [editor] = useLexicalComposerContext() @@ -268,9 +164,6 @@ export default function DiffHighlightPlugin({ const diffContent = computeDiff(originalData, modifiedData, { language: payload.language, - enableFolding, - foldThreshold, - showFoldedLineCount, }) // Check if diff contains only context lines (no actual changes) @@ -308,6 +201,21 @@ export default function DiffHighlightPlugin({ return true // Command handled } + // Check if this is pre-computed diff content + else if (isDiffContent(payload.content)) { + // Prevent default handling by the InsertInitialCodeBlockPlugin + payload.preventDefault() + + // Handle diff content processing here + editor.update(() => { + // The diff content will be processed by the existing transform + // when the content is inserted into the editor + }) + + return true // Command handled + } else { + return true + } return false // Let other plugins handle it }, COMMAND_PRIORITY_CRITICAL, @@ -383,7 +291,7 @@ export default function DiffHighlightPlugin({ if (originalContent && modifiedContent) { const payload: InitialContentPayload = { content: "test", // Not used for diff requests - language: language, // Use the language parameter + language: "json", // Will be determined by the editor preventDefault: () => {}, isDefaultPrevented: () => false, originalContent, diff --git a/web/oss/src/components/Editor/plugins/code/plugins/GlobalErrorIndicatorPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/GlobalErrorIndicatorPlugin.tsx index 9efb57a58b..f9955ab849 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/GlobalErrorIndicatorPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/GlobalErrorIndicatorPlugin.tsx @@ -1,213 +1,127 @@ -import React, {useEffect, useRef, useState} from "react" +import React, {useEffect, useState, useRef} from "react" -import {useFloating, autoUpdate, offset, flip, shift} from "@floating-ui/react" import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" import {createPortal} from "react-dom" -import {$getActiveLanguage} from "../utils/language" -import type {CodeLanguage} from "../types" -import {validateAll} from "../utils/validationUtils" +import {CodeHighlightNode} from "../nodes/CodeHighlightNode" +import {createLogger} from "../utils/createLogger" import {$getEditorCodeAsString} from "./RealTimeValidationPlugin" -import {getValidationContext, setCurrentEditorId} from "./SyntaxHighlightPlugin" -// Error info type for consistency +const PLUGIN_NAME = "GlobalErrorIndicatorPlugin" +const log = createLogger(PLUGIN_NAME, {disabled: true}) // Disabled for cleaner debugging + export interface ErrorInfo { id: string message: string - type: "syntax" | "validation" | "schema" | "bracket" | "structural" line?: number column?: number - severity?: "error" | "warning" | "info" -} - -// Registry of ValidationManager instances keyed by editorId -const validationManagerRegistry = new Map() - -export function registerValidationManager(editorId: string, manager: ValidationManager) { - if (!editorId) return - validationManagerRegistry.set(editorId, manager) -} - -export function getValidationManager(editorId: string): ValidationManager | null { - return validationManagerRegistry.get(editorId) ?? null -} - -export function unregisterValidationManager(editorId: string) { - if (!editorId) return - validationManagerRegistry.delete(editorId) + type: "syntax" | "bracket" | "validation" | "structural" | "schema" + severity: "error" | "warning" } -// Global validation state - single source of truth -interface ValidationState { +interface GlobalErrorState { errors: ErrorInfo[] - errorsByLine: Map - lastValidatedContent: string - timestamp: number + hasErrors: boolean } -// Editor-specific validation manager - no longer singleton -class ValidationManager { - private state: ValidationState = { - errors: [], - errorsByLine: new Map(), - lastValidatedContent: "", - timestamp: 0, - } - private listeners = new Set<() => void>() - private editorContainerRef: React.RefObject - - constructor(editorContainerRef: React.RefObject) { - this.editorContainerRef = editorContainerRef - } - - // Run validation and update state - single source of truth - validateContent( - content: string, - schema?: any, - language: CodeLanguage = "json", - ): ValidationState { - // Skip if content hasn't changed - if (content === this.state.lastValidatedContent) { - return this.state - } - - // Run unified validation using validateAll with language support - const result = validateAll(content, schema, language) - - // Update state with new validation results - this.state = { - errors: result.allErrors, - errorsByLine: result.errorsByLine, - lastValidatedContent: content, - timestamp: Date.now(), - } +// Global error state that can be accessed by other plugins +let globalErrorState: GlobalErrorState = { + errors: [], + hasErrors: false, +} - // Notify all listeners of the validation state change - this.listeners.forEach((listener) => listener()) +// Subscribers to error state changes +const errorStateSubscribers = new Set<(state: GlobalErrorState) => void>() - return this.state +/** + * Add an error to the global error state + */ +export function addGlobalError(error: ErrorInfo) { + const existingIndex = globalErrorState.errors.findIndex((e) => e.id === error.id) + + if (existingIndex >= 0) { + // Update existing error + globalErrorState.errors[existingIndex] = error + } else { + // Add new error + globalErrorState.errors.push(error) } - // Get current validation state - getState(): ValidationState { - return this.state - } + globalErrorState.hasErrors = globalErrorState.errors.length > 0 - // Subscribe to validation changes - subscribe(listener: () => void): () => void { - this.listeners.add(listener) - return () => this.listeners.delete(listener) - } - - private notifyListeners(): void { - this.listeners.forEach((listener) => listener()) - } + log(`➕ Added/Updated error: ${error.id} - ${error.message}`) + notifyErrorStateSubscribers() +} - // Get errors for a specific line - used by CodeLineNode - getErrorsForLine(lineNumber: number): ErrorInfo[] { - return this.state.errorsByLine.get(lineNumber) || [] +/** + * Remove an error from the global error state + */ +export function removeGlobalError(errorId: string) { + const initialLength = globalErrorState.errors.length + globalErrorState.errors = globalErrorState.errors.filter((e) => e.id !== errorId) + globalErrorState.hasErrors = globalErrorState.errors.length > 0 + + if (globalErrorState.errors.length !== initialLength) { + log(`➖ Removed error: ${errorId}`) + notifyErrorStateSubscribers() } +} - // Apply validation styling to DOM elements - scoped to this editor instance - applyDOMStyling(): void { - const attemptStyling = (attempt = 1): void => { - // Get editor element scoped to this specific editor instance - const editorContainer = this.editorContainerRef.current - if (!editorContainer) { - return - } - - const editorElement = editorContainer.querySelector(".editor-code") as HTMLElement - if (!editorElement) { - return - } - - // Get all line elements - const allLines = editorElement.querySelectorAll(".editor-code-line") - // If no elements found and this is first attempt, retry after DOM is ready - if (allLines.length === 0 && attempt === 1) { - setTimeout(() => attemptStyling(2), 100) - return - } - - // CRITICAL FIX: Clear all existing validation styles first - this.clearAllValidationStyling() - - // Apply styling to lines that need it - this.state.errorsByLine.forEach((errors, lineNumber) => { - if (errors.length === 0) return - - // Try multiple selectors to find the line element - let lineElement = editorElement.querySelector(`[data-line-number="${lineNumber}"]`) - if (!lineElement) { - lineElement = editorElement.querySelector( - `.editor-code-line:nth-child(${lineNumber})`, - ) - } - - if (lineElement) { - const htmlElement = lineElement as HTMLElement - const primaryError = errors[0] - const currentErrorMessage = htmlElement.getAttribute("data-validation-error") - - // Only update if error message changed or element wasn't styled - if (currentErrorMessage !== primaryError.message) { - htmlElement.classList.add("validation-error") - htmlElement.setAttribute("data-validation-error", primaryError.message) - htmlElement.setAttribute( - "title", - `🔴 [${primaryError.type}] ${primaryError.message}`, - ) - // Add inline styles for immediate visual feedback - htmlElement.style.backgroundColor = "rgba(255, 165, 0, 0.15)" - htmlElement.style.borderRight = "4px solid #ff8c00" - htmlElement.style.position = "relative" - } - } - }) - } - - attemptStyling() +/** + * Clear all errors from the global error state + */ +export function clearGlobalErrors() { + if (globalErrorState.errors.length > 0) { + globalErrorState.errors = [] + globalErrorState.hasErrors = false + log(`🧹 Cleared all errors`) + notifyErrorStateSubscribers() } +} - // Clear all existing validation styling from DOM elements - clearAllValidationStyling(): void { - // Clear all validation styling from DOM - scoped to this editor only - const editorContainer = this.editorContainerRef.current - if (!editorContainer) return - - const allLines = editorContainer.querySelectorAll(".editor-code-line.validation-error") - allLines.forEach((lineElement) => { - const htmlElement = lineElement as HTMLElement - htmlElement.classList.remove("validation-error") - htmlElement.removeAttribute("data-validation-error") - htmlElement.removeAttribute("title") - // Reset inline styles - htmlElement.style.backgroundColor = "" - htmlElement.style.borderRight = "" - htmlElement.style.position = "" - }) +/** + * Clear all errors of a specific type from the global error state + */ +export function clearGlobalErrorsByType(type: ErrorInfo["type"]) { + const initialLength = globalErrorState.errors.length + globalErrorState.errors = globalErrorState.errors.filter((e) => e.type !== type) + globalErrorState.hasErrors = globalErrorState.errors.length > 0 + + if (globalErrorState.errors.length !== initialLength) { + log(`🧹 Cleared ${initialLength - globalErrorState.errors.length} errors of type: ${type}`) + notifyErrorStateSubscribers() } +} - // Force refresh of data-line-number attributes to match visual positions - refreshLineNumberAttributes(editorElement: HTMLElement): void { - const allLines = editorElement.querySelectorAll(".editor-code-line") +/** + * Get current global error state + */ +export function getGlobalErrorState(): GlobalErrorState { + return {...globalErrorState, errors: [...globalErrorState.errors]} +} - allLines.forEach((lineElement, index) => { - const htmlElement = lineElement as HTMLElement - const visualLineNumber = index + 1 - const currentDataLineNumber = htmlElement.getAttribute("data-line-number") +/** + * Subscribe to global error state changes + */ +export function subscribeToErrorState(callback: (state: GlobalErrorState) => void) { + errorStateSubscribers.add(callback) + return () => errorStateSubscribers.delete(callback) +} - if (currentDataLineNumber !== visualLineNumber.toString()) { - htmlElement.setAttribute("data-line-number", visualLineNumber.toString()) - } - }) - } +/** + * Notify all subscribers of error state changes + */ +function notifyErrorStateSubscribers() { + // TEMPORARILY DISABLED: Notifications were causing plugin re-instantiation + // const state = getGlobalErrorState() + // errorStateSubscribers.forEach((callback) => callback(state)) } -// Error indicator tooltip component -function ErrorTooltip({errors}: {errors: ErrorInfo[]}) { +/** + * Error indicator tooltip component + */ +function ErrorTooltip({errors, position}: {errors: ErrorInfo[]; position: {x: number; y: number}}) { // Group errors by message to avoid duplicates const groupedErrors = errors.reduce( (groups, error) => { @@ -229,9 +143,17 @@ function ErrorTooltip({errors}: {errors: ErrorInfo[]}) { const uniqueErrors = Object.values(groupedErrors) return ( -
    +
    - {uniqueErrors.length} Error{uniqueErrors.length !== 1 ? "s" : ""} + {errors.length} Error{errors.length !== 1 ? "s" : ""} Found ({uniqueErrors.length}{" "} + unique)
    {uniqueErrors.map((error, index) => { @@ -248,12 +170,18 @@ function ErrorTooltip({errors}: {errors: ErrorInfo[]}) { key={`${error.type}-${index}`} className="border-l-2 border-red-400 pl-2" > -
    - +
    + {error.type} {lineDisplay && ( - {lineDisplay} + {lineDisplay} )}
    {error.message}
    @@ -265,7 +193,9 @@ function ErrorTooltip({errors}: {errors: ErrorInfo[]}) { ) } -// Error indicator icon component +/** + * Error indicator icon component + */ function ErrorIndicator({ errorCount, onMouseEnter, @@ -283,7 +213,7 @@ function ErrorIndicator({ >
    - ! + ⚠
    {errorCount > 1 && (
    @@ -298,168 +228,227 @@ function ErrorIndicator({ /** * Global Error Indicator Plugin * - * This plugin provides a unified validation system that: - * - Uses ValidationManager as single source of truth - * - Runs validateAll once per content change - * - Provides both global indicator and line highlighting - * - Maintains consistency between all validation displays + * This plugin provides a global error indicator that: + * - Collects errors from various sources (syntax, brackets, validation) + * - Shows an error icon when there are errors + * - Displays a tooltip with all errors on hover + * - Positions itself in the top-right corner of the editor */ -export function GlobalErrorIndicatorPlugin({editorId}: {editorId: string}) { +export function GlobalErrorIndicatorPlugin() { const [editor] = useLexicalComposerContext() const [showTooltip, setShowTooltip] = useState(false) - const [validationState, setValidationState] = useState({ - errors: [], - errorsByLine: new Map(), - lastValidatedContent: "", - timestamp: 0, - }) - + const [tooltipPosition, setTooltipPosition] = useState({x: 0, y: 0}) const editorContainerRef = useRef(null) - const validationManager = useRef(null) - - // Floating UI for tooltip positioning - const {refs, floatingStyles} = useFloating({ - middleware: [offset(10), flip(), shift()], - whileElementsMounted: autoUpdate, - }) - - // Get validation context (schema) from global validation context - // This is set by SyntaxHighlightPlugin when it receives the schema prop + const currentErrorsRef = useRef([]) + // Find the editor container element useEffect(() => { - // Find editor container const editorElement = editor.getRootElement() - if (editorElement) { - // Try multiple container selectors - const possibleContainers = [ - ".agenta-editor-wrapper", - ".editor-container", - ".lexical-editor", - "[data-lexical-editor]", - ] - - let foundContainer = null - for (const selector of possibleContainers) { - foundContainer = editorElement.closest(selector) as HTMLElement - if (foundContainer) { - break - } - } - - if (!foundContainer) { - // Fallback: use the editor element's parent or the editor element itself - foundContainer = editorElement.parentElement || editorElement - } - - editorContainerRef.current = foundContainer - - // Initialize validation manager now that we have the container ref - if (!validationManager.current) { - validationManager.current = new ValidationManager(editorContainerRef) - // Set this editor as the current one for validation context - setCurrentEditorId(editorId) - // Register this manager so nodes can query it by editorId - registerValidationManager(editorId, validationManager.current) - } + // Find the closest editor wrapper + const container = editorElement.closest(".agenta-editor-wrapper") as HTMLElement + editorContainerRef.current = container || editorElement.parentElement } + }, [editor]) - // Run initial validation on plugin load - const runInitialValidation = () => { - editor.read(() => { - const content = $getEditorCodeAsString(editor) - const language = $getActiveLanguage(editor) - - // Get validation context for this specific editor - const validationContext = getValidationContext(editorId) - - // Set current editor ID for validation context - setCurrentEditorId(editorId) + // Function to collect syntax errors from CodeHighlightNodes + const collectSyntaxErrors = (): ErrorInfo[] => { + const syntaxErrors: ErrorInfo[] = [] + + editor.read(() => { + const root = editor.getEditorState()._nodeMap + + for (const [nodeKey, node] of root) { + if (node instanceof CodeHighlightNode && node.hasValidationError()) { + const message = node.getValidationMessage() + if (message) { + // Try to find line number + const parent = node.getParent() + let lineNumber: number | undefined + + if (parent) { + // Find line number by counting previous siblings + const grandParent = parent.getParent() + if (grandParent) { + const lines = grandParent.getChildren() + lineNumber = lines.indexOf(parent) + 1 + } + } + + syntaxErrors.push({ + id: `syntax-${nodeKey}`, + message, + line: lineNumber, + type: "syntax", + severity: "error", + }) + } + } + } + }) - // Use ValidationManager for unified validation - if (validationManager.current && validationContext.schema) { - const result = validationManager.current.validateContent( - content, - validationContext.schema, - language, - ) + return syntaxErrors + } - // Update validation state - setValidationState(result) + // Function to collect all errors from editor state + const collectAllErrors = (): ErrorInfo[] => { + const structuralErrors = (editor as any)._structuralErrors || [] + const bracketErrors = (editor as any)._bracketErrors || [] + const schemaErrors = (editor as any)._schemaErrors || [] + const syntaxErrors = collectSyntaxErrors() + + // log(`🔍 Collecting errors:`, { + // structural: structuralErrors.length, + // bracket: bracketErrors.length, + // schema: schemaErrors.length, + // syntax: syntaxErrors.length, + // bracketErrorsDetail: bracketErrors, + // schemaErrorsDetail: schemaErrors, + // }) + + const allErrors = [...structuralErrors, ...bracketErrors, ...schemaErrors, ...syntaxErrors] + // log(`📊 Total errors collected: ${allErrors.length}`, allErrors) + + return allErrors + } - // Apply DOM styling after validation - validationManager.current.applyDOMStyling() - } - }) + // Helper function to compare error arrays for equality + const areErrorsEqual = (errors1: ErrorInfo[], errors2: ErrorInfo[]): boolean => { + if (errors1.length !== errors2.length) { + return false } + return errors1.every((error, index) => { + const otherError = errors2[index] + return ( + otherError && + error.id === otherError.id && + error.message === otherError.message && + error.type === otherError.type && + error.line === otherError.line + ) + }) + } - // Run initial validation after a longer delay to ensure editor and schema are ready - const initialValidationTimeout = setTimeout(runInitialValidation, 500) + // Store validation errors in a global map to avoid separate editor updates + const validationErrorsMapRef = useRef>(new Map()) - // Also run validation when schema becomes available - const schemaCheckInterval = setInterval(() => { - const validationContext = getValidationContext() - if (validationContext.schema && validationManager.current) { - clearInterval(schemaCheckInterval) - runInitialValidation() - } - }, 100) + // Register update listener to collect errors and store them globally + useEffect(() => { + log("🚀 GlobalErrorIndicatorPlugin initialized") - // Register editor update listener for content changes const unregisterUpdateListener = editor.registerUpdateListener( ({editorState, prevEditorState, tags}) => { - // Skip if this update was triggered by validation or DOM updates - if (tags.has("validation-update") || tags.has("history-merge")) { + // Skip if this update was triggered by validation error changes + if (tags.has("validation-update")) { return } - // Skip if editor state hasn't changed + // Skip if editor state hasn't changed (focus, selection, etc.) if (editorState === prevEditorState) { return } - // Get current content - const currentContent = editorState.read(() => $getEditorCodeAsString(editor)) - const language = editorState.read(() => $getActiveLanguage(editor)) + // Additional check: Skip if this is just a focus/selection change + // by comparing the actual text content + let textContentChanged = false + try { + const currentText = editorState.read(() => $getEditorCodeAsString(editor)) + const prevText = prevEditorState.read(() => $getEditorCodeAsString(editor)) + textContentChanged = currentText !== prevText + } catch (error) { + // If we can't read text content, assume it changed to be safe + textContentChanged = true + } + + // Only proceed if text content actually changed + if (!textContentChanged) { + return + } - // Get validation context for this specific editor - const validationContext = getValidationContext(editorId) + // console.log(`🔄 Text content changed - collecting validation errors`) // Disabled for cleaner debugging + + // Collect all errors from different sources + const allErrors = collectAllErrors() + + // Check if errors have changed + const errorsChanged = !areErrorsEqual(currentErrorsRef.current, allErrors) + + log(`🔍 Collecting errors:`, { + structural: allErrors.filter((e) => e.type === "structural").length, + bracket: allErrors.filter((e) => e.type === "bracket").length, + schema: allErrors.filter((e) => e.type === "schema").length, + syntax: allErrors.filter((e) => e.type === "syntax").length, + schemaErrorsDetail: allErrors.filter((e) => e.type === "schema"), + }) + + if (errorsChanged) { + log(`🔄 Errors changed:`, { + previous: currentErrorsRef.current.length, + current: allErrors.length, + errors: allErrors, + }) + + currentErrorsRef.current = allErrors + + // Store syntax errors in editor state for consistency + const syntaxErrors = allErrors.filter((e) => e.type === "syntax") + ;(editor as any)._syntaxErrors = syntaxErrors + + // Update validation errors map for use by CodeLineNode + const validationErrors = allErrors.filter( + (error) => + error.type === "validation" || + error.type === "schema" || + error.type === "bracket" || + error.type === "structural", + ) - // Run validation immediately like the original implementation - if (validationManager.current && validationContext.schema) { - validationManager.current.validateContent( - currentContent, - validationContext.schema, - language, + // Clear previous validation errors + validationErrorsMapRef.current.clear() + + // Store new validation errors by line number + validationErrors.forEach((error) => { + if (error.line) { + validationErrorsMapRef.current.set(`line-${error.line}`, error) + log(`📍 Stored error for line ${error.line}: ${error.message}`) + } + }) + + // Store the validation errors map globally so CodeLineNode can access it + ;(window as any).__lexicalValidationErrorsMap = validationErrorsMapRef.current + + // Trigger DOM updates by dispatching a custom event that CodeLineNodes can listen to + const event = new CustomEvent("lexical-validation-errors-changed", { + detail: {validationErrors}, + }) + window.dispatchEvent(event) + + log(`✅ Updated validation errors map with ${validationErrors.length} errors`) + log( + `🔍 Global indicator will show ${allErrors.length} total errors:`, + allErrors.map((e) => `${e.type}:${e.line}:${e.message.substring(0, 30)}`), + ) + log( + `🎨 Validation map contains ${validationErrors.length} errors for highlighting:`, + validationErrors.map( + (e) => `${e.type}:${e.line}:${e.message.substring(0, 30)}`, + ), ) - // Apply DOM styling after validation - validationManager.current.applyDOMStyling() } }, ) - // Subscribe to validation state changes if manager is available - let unsubscribe: (() => void) | null = null - if (validationManager.current) { - unsubscribe = validationManager.current.subscribe(() => { - setValidationState({...validationManager.current!.getState()}) - }) - } - return () => { - clearTimeout(initialValidationTimeout) - clearInterval(schemaCheckInterval) unregisterUpdateListener() - if (unsubscribe) { - unsubscribe() - } - // Unregister manager on cleanup - unregisterValidationManager(editorId) } }, [editor]) const handleMouseEnter = (e: React.MouseEvent) => { - refs.setReference(e.currentTarget as HTMLElement) + const rect = e.currentTarget.getBoundingClientRect() + setTooltipPosition({ + x: rect.left + rect.width / 2, + y: rect.top, + }) setShowTooltip(true) } @@ -468,37 +457,21 @@ export function GlobalErrorIndicatorPlugin({editorId}: {editorId: string}) { } // Don't render if no errors or no container - if (validationState.errors.length === 0 || !editorContainerRef.current) { + if (currentErrorsRef.current.length === 0 || !editorContainerRef.current) { return null } - // Calculate unique errors count (group by type and message to avoid duplicates) - const uniqueErrorsCount = Object.keys( - validationState.errors.reduce( - (groups, error) => { - const key = `${error.type}:${error.message}` - groups[key] = true - return groups - }, - {} as Record, - ), - ).length - return createPortal( <> {showTooltip && ( -
    - -
    + )} , editorContainerRef.current, ) } - -export {ValidationManager} diff --git a/web/oss/src/components/Editor/plugins/code/plugins/IndentationPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/IndentationPlugin.tsx index aced5b30e2..6c99ab2499 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/IndentationPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/IndentationPlugin.tsx @@ -16,22 +16,22 @@ import {useEffect} from "react" import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" -import {$findMatchingParent, mergeRegister} from "@lexical/utils" +import {$findMatchingParent} from "@lexical/utils" import { $createRangeSelection, + $createTabNode, $getSelection, $isRangeSelection, + $isTabNode, $setSelection, COMMAND_PRIORITY_HIGH, KEY_DOWN_COMMAND, - KEY_TAB_COMMAND, LexicalNode, } from "lexical" import {$isCodeBlockNode} from "../nodes/CodeBlockNode" import {$isCodeHighlightNode, $createCodeHighlightNode} from "../nodes/CodeHighlightNode" import {$isCodeLineNode, $createCodeLineNode, CodeLineNode} from "../nodes/CodeLineNode" -import {$createCodeTabNode, $isCodeTabNode} from "../nodes/CodeTabNode" import {createLogger} from "../utils/createLogger" import {getIndentCount} from "../utils/indent" @@ -56,349 +56,315 @@ export function IndentationPlugin() { const [editor] = useLexicalComposerContext() useEffect(() => { - return mergeRegister( - editor.registerCommand( - KEY_DOWN_COMMAND, - (event: KeyboardEvent) => { - if (event.key !== "Enter") return false - log("ENTER pressed", event.key) + return editor.registerCommand( + KEY_DOWN_COMMAND, + (event: KeyboardEvent) => { + if (event.key !== "Enter") return false + log("ENTER pressed", event.key) - const selection = $getSelection() - if (!$isRangeSelection(selection)) return false + const selection = $getSelection() + if (!$isRangeSelection(selection)) return false - event.preventDefault() + event.preventDefault() - const anchor = selection.anchor - const anchorOffset = anchor.offset + const anchor = selection.anchor + const anchorOffset = anchor.offset - const anchorNode = anchor.getNode() + const anchorNode = anchor.getNode() - const lineNode = $findMatchingParent(anchorNode, $isCodeLineNode) - if (!lineNode) return false + const lineNode = $findMatchingParent(anchorNode, $isCodeLineNode) + if (!lineNode) return false - // Determine language from parent code block (json, yaml, etc.) - const blockNode = lineNode.getParent() - const language = $isCodeBlockNode(blockNode) - ? blockNode.getLanguage() - : undefined - if (!lineNode) return false + // Determine language from parent code block (json, yaml, etc.) + const blockNode = lineNode.getParent() + const language = $isCodeBlockNode(blockNode) ? blockNode.getLanguage() : undefined + if (!lineNode) return false - const children = lineNode.getChildren() - const caretKey = anchorNode.getKey() + const children = lineNode.getChildren() + const caretKey = anchorNode.getKey() - const beforeNodes: LexicalNode[] = [] - const afterNodes: LexicalNode[] = [] + const beforeNodes: LexicalNode[] = [] + const afterNodes: LexicalNode[] = [] - let seenCaret = false + let seenCaret = false - for (const node of children) { - if (!$isCodeHighlightNode(node)) { - beforeNodes.push(node) - continue - } - - const text = node.getTextContent() - const length = text.length - const isCaretNode = node.getKey() === caretKey - - // Before cursor: collect nodes as-is - if (!seenCaret && !isCaretNode) { - beforeNodes.push(node) - continue - } - - // At cursor node: split content based on cursor position - if (isCaretNode) { - seenCaret = true - const type = node.getHighlightType() - - // Handle edge cases: - if (anchorOffset === 0) { - // Cursor at start: entire node goes after - afterNodes.push(node) - } else if (anchorOffset === length) { - // Cursor at end: entire node goes before - beforeNodes.push(node) - } else { - // Cursor in middle: split node content - // Preserve validation state from original node - const hasValidationError = node.hasValidationError() - const validationMessage = node.getValidationMessage() - - const before = $createCodeHighlightNode( - text.slice(0, anchorOffset), - type, - hasValidationError, - validationMessage, - ) - const after = $createCodeHighlightNode( - text.slice(anchorOffset), - type, - hasValidationError, - validationMessage, - ) - beforeNodes.push(before) - afterNodes.push(after) - log("✂️ Split highlight node", {before, after}) - } - continue - } - - // After cursor: collect remaining nodes - afterNodes.push(node) + for (const node of children) { + if (!$isCodeHighlightNode(node)) { + beforeNodes.push(node) + continue } - /** - * Analyze line content and structure: - * 1. Extract current indentation level - * 2. Join content before/after cursor - * 3. Detect if we're inside a brace pair - */ - // Get base indentation from the start of the line - const textLine = lineNode.getTextContent() - const indentCount = getIndentCount(textLine) - // const baseIndent = "\t".repeat(indentCount) - - // Join node content for analysis - const beforeText = beforeNodes.map((n) => n.getTextContent()).join("") - const afterText = afterNodes.map((n) => n.getTextContent()).join("") - - // Check if cursor is between opening and closing braces - const isBraced = - /[\[{(]\s*$/.test(beforeText.trim()) && /^[\]})]/.test(afterText.trim()) - - // Check if line ends with an opening brace - const endsWithOpeningBrace = - /[\[{(]\s*$/.test(beforeText.trim()) || - (language === "yaml" && - (/:\s*$/.test(beforeText.trim()) || /-\s*$/.test(beforeText.trim()))) - - log("🔎 Full highlight content", { - fullText: beforeText + afterText, - }) - log("🔪 Split parts", { - before: beforeText, - after: afterText, - }) - log("Line analysis", { - before: beforeText, - after: afterText, - indentCount, - isBraced, - }) + const text = node.getTextContent() + const length = text.length + const isCaretNode = node.getKey() === caretKey - // Update current line with beforeNodes - const writableLine = lineNode.getWritable() - // Remove all non-toggle children, keep existing decorator (fold toggle) - writableLine.getChildren().forEach((child) => { - child.remove() - }) - beforeNodes.forEach((n) => writableLine.append(n)) - - // Array to store new lines that will be inserted after the current line - // This includes the middle line for braced content and the trailing line - const linesToInsert: CodeLineNode[] = [] - - /** - * Creates a new line with proper indentation based on the current context - * - * @param extra - Additional indentation level to add (e.g. 1 for content inside braces) - * @returns A new CodeLineNode with the correct number of tab nodes - * - * The function: - * 1. Creates a new empty line - * 2. Adds base indentation from the current line - * 3. Adds any extra indentation for nested content - * 4. Uses CodeHighlightNode for tabs to maintain consistency - */ - const createIndentedLine = (extra: number) => { - const line = $createCodeLineNode() - // add fold toggle decorator - for (let i = 0; i < indentCount + extra; i++) { - const tabNode = $createCodeTabNode() - line.append(tabNode) - } - line.selectEnd() - return line - } - - // Handle special case for content inside braces (e.g. if, for, function blocks) - // When we detect content is braced: - // 1. Create an empty line with +1 indentation level - // 2. Add a zero-width space to ensure line is selectable - // 3. Insert this line before the trailing content - if (isBraced) { - const middle = createIndentedLine(1) - linesToInsert.push(middle) + // Before cursor: collect nodes as-is + if (!seenCaret && !isCaretNode) { + beforeNodes.push(node) + continue } - // Handle case where line ends with an opening brace but there's no matching closing brace - // This ensures proper indentation for JSON objects, arrays, and code blocks - else if (endsWithOpeningBrace) { - // Add extra indentation to the trailing line - const trailing = createIndentedLine(1) - - // If there was content after the cursor, move it to the new line - if (afterNodes.length > 0) { - afterNodes.forEach((n) => trailing.append(n)) - log("📎 Inserted trailing content with extra indent", { - trailingContent: trailing.getTextContent(), - }) - } - - // Insert all new lines after the current line - lineNode.insertAfter(trailing) - - // Find the empty CodeHighlightNode that was created in the trailing line - const emptyHighlightNode = trailing - .getChildren() - .find( - (node) => - $isCodeHighlightNode(node) && node.getTextContent() === "", - ) - - // Set selection to the empty CodeHighlightNode in the new line - if (emptyHighlightNode) { - $setSelection(emptyHighlightNode.selectStart()) - log("🎯 Set selection to empty highlight node", { - lineKey: trailing.getKey(), - nodeKey: emptyHighlightNode.getKey(), - }) + // At cursor node: split content based on cursor position + if (isCaretNode) { + seenCaret = true + const type = node.getHighlightType() + + // Handle edge cases: + if (anchorOffset === 0) { + // Cursor at start: entire node goes after + afterNodes.push(node) + } else if (anchorOffset === length) { + // Cursor at end: entire node goes before + beforeNodes.push(node) } else { - // Fallback: position after the last tab - const tabNodes = trailing.getChildren().filter($isCodeTabNode) - if (tabNodes.length > 0) { - const lastTab = tabNodes[tabNodes.length - 1] - $setSelection(lastTab.selectEnd()) - } else { - $setSelection(trailing.selectStart()) - } - log("🎯 Set selection to fallback position", { - lineKey: trailing.getKey(), - }) + // Cursor in middle: split node content + // Preserve validation state from original node + const hasValidationError = node.hasValidationError() + const validationMessage = node.getValidationMessage() + + const before = $createCodeHighlightNode( + text.slice(0, anchorOffset), + type, + hasValidationError, + validationMessage, + ) + const after = $createCodeHighlightNode( + text.slice(anchorOffset), + type, + hasValidationError, + validationMessage, + ) + beforeNodes.push(before) + afterNodes.push(after) + log("✂️ Split highlight node", {before, after}) } - - return true + continue } - // Create the trailing line that will contain any content that was after the cursor - // This line maintains the same indentation level as the original line - const trailing = createIndentedLine(0) + // After cursor: collect remaining nodes + afterNodes.push(node) + } + + /** + * Analyze line content and structure: + * 1. Extract current indentation level + * 2. Join content before/after cursor + * 3. Detect if we're inside a brace pair + */ + // Get base indentation from the start of the line + const textLine = lineNode.getTextContent() + const indentCount = getIndentCount(textLine) + // const baseIndent = "\t".repeat(indentCount) + + // Join node content for analysis + const beforeText = beforeNodes.map((n) => n.getTextContent()).join("") + const afterText = afterNodes.map((n) => n.getTextContent()).join("") + + // Check if cursor is between opening and closing braces + const isBraced = + /[\[{(]\s*$/.test(beforeText.trim()) && /^[\]})]/.test(afterText.trim()) + + // Check if line ends with an opening brace + const endsWithOpeningBrace = + /[\[{(]\s*$/.test(beforeText.trim()) || + (language === "yaml" && + (/:\s*$/.test(beforeText.trim()) || /-\s*$/.test(beforeText.trim()))) + + log("🔎 Full highlight content", { + fullText: beforeText + afterText, + }) + log("🔪 Split parts", { + before: beforeText, + after: afterText, + }) + log("Line analysis", { + before: beforeText, + after: afterText, + indentCount, + isBraced, + }) + + // Update current line with beforeNodes + const writableLine = lineNode.getWritable() + // Remove all non-toggle children, keep existing decorator (fold toggle) + writableLine.getChildren().forEach((child) => { + child.remove() + }) + beforeNodes.forEach((n) => writableLine.append(n)) + + // Array to store new lines that will be inserted after the current line + // This includes the middle line for braced content and the trailing line + const linesToInsert: CodeLineNode[] = [] + + /** + * Creates a new line with proper indentation based on the current context + * + * @param extra - Additional indentation level to add (e.g. 1 for content inside braces) + * @returns A new CodeLineNode with the correct number of tab nodes + * + * The function: + * 1. Creates a new empty line + * 2. Adds base indentation from the current line + * 3. Adds any extra indentation for nested content + * 4. Uses CodeHighlightNode for tabs to maintain consistency + */ + const createIndentedLine = (extra: number) => { + const line = $createCodeLineNode() + // add fold toggle decorator + for (let i = 0; i < indentCount + extra; i++) { + const tabNode = $createTabNode() + line.append(tabNode) + } + line.selectEnd() + return line + } + + // Handle special case for content inside braces (e.g. if, for, function blocks) + // When we detect content is braced: + // 1. Create an empty line with +1 indentation level + // 2. Add a zero-width space to ensure line is selectable + // 3. Insert this line before the trailing content + if (isBraced) { + const middle = createIndentedLine(1) + linesToInsert.push(middle) + } + + // Handle case where line ends with an opening brace but there's no matching closing brace + // This ensures proper indentation for JSON objects, arrays, and code blocks + else if (endsWithOpeningBrace) { + // Add extra indentation to the trailing line + const trailing = createIndentedLine(1) // If there was content after the cursor, move it to the new line if (afterNodes.length > 0) { afterNodes.forEach((n) => trailing.append(n)) - log("📎 Inserted trailing content", { - trailingContent: trailing.getTextContent(), - }) - } else { - // If no content, add an empty CodeHighlightNode to ensure line is selectable - // This will be properly styled by the CodeHighlightNode.createDOM method - // trailing.append($createCodeHighlightNode("arda", "plain", false, null)) - log("📎 Inserted new line content", { + log("📎 Inserted trailing content with extra indent", { trailingContent: trailing.getTextContent(), }) } - linesToInsert.push(trailing) // Insert all new lines after the current line - // We maintain a reference to the last inserted line to chain them correctly: - // currentLine -> middleLine (if braced) -> trailingLine - let insertAfter = lineNode - for (const line of linesToInsert) { - insertAfter.insertAfter(line) - insertAfter = line + lineNode.insertAfter(trailing) + + // Find the empty CodeHighlightNode that was created in the trailing line + const emptyHighlightNode = trailing + .getChildren() + .find((node) => $isCodeHighlightNode(node) && node.getTextContent() === "") + + // Set selection to the empty CodeHighlightNode in the new line + if (emptyHighlightNode) { + $setSelection(emptyHighlightNode.selectStart()) + log("🎯 Set selection to empty highlight node", { + lineKey: trailing.getKey(), + nodeKey: emptyHighlightNode.getKey(), + }) + } else { + // Fallback: position after the last tab + const tabNodes = trailing.getChildren().filter($isTabNode) + if (tabNodes.length > 0) { + const lastTab = tabNodes[tabNodes.length - 1] + $setSelection(lastTab.selectEnd()) + } else { + $setSelection(trailing.selectStart()) + } + log("🎯 Set selection to fallback position", { + lineKey: trailing.getKey(), + }) } - // Place the cursor in the appropriate position: - // - For braced content: on the empty middle line - // - Otherwise: on the trailing line with the moved content - const selectionTarget = isBraced ? linesToInsert[0] : trailing - - const targetChildren = selectionTarget.getChildren() - const firstContentNode = targetChildren.find((node) => !$isCodeTabNode(node)) - const lastTabNode = targetChildren.filter($isCodeTabNode).pop() - - log("Selection target analysis:", { - targetKey: selectionTarget.getKey(), - childrenCount: targetChildren.length, - hasContentNode: !!firstContentNode, - hasTabNodes: !!lastTabNode, - childTypes: targetChildren.map((c) => c.getType()), - }) + return true + } - // Create a new selection at the appropriate position - const sel = $createRangeSelection() + // Create the trailing line that will contain any content that was after the cursor + // This line maintains the same indentation level as the original line + const trailing = createIndentedLine(0) - if (firstContentNode) { - // Position at start of first content node - log("SELECTION CASE 1", { - firstContentNode, - selectionTarget, - nextSibling: firstContentNode.getNextSibling(), - }) - if (!firstContentNode.getNextSibling()) { - if ( - selection.anchor.offset + selection.focus.offset < - firstContentNode.getTextContentSize() - ) { - log("SELECTION CASE 1a") - $setSelection(firstContentNode.selectStart()) - } else { - log("SELECTION CASE 1b") - $setSelection(firstContentNode.selectEnd()) - } - } else { + // If there was content after the cursor, move it to the new line + if (afterNodes.length > 0) { + afterNodes.forEach((n) => trailing.append(n)) + log("📎 Inserted trailing content", { + trailingContent: trailing.getTextContent(), + }) + } else { + // If no content, add an empty CodeHighlightNode to ensure line is selectable + // This will be properly styled by the CodeHighlightNode.createDOM method + // trailing.append($createCodeHighlightNode("arda", "plain", false, null)) + log("📎 Inserted new line content", { + trailingContent: trailing.getTextContent(), + }) + } + linesToInsert.push(trailing) + + // Insert all new lines after the current line + // We maintain a reference to the last inserted line to chain them correctly: + // currentLine -> middleLine (if braced) -> trailingLine + let insertAfter = lineNode + for (const line of linesToInsert) { + insertAfter.insertAfter(line) + insertAfter = line + } + + // Place the cursor in the appropriate position: + // - For braced content: on the empty middle line + // - Otherwise: on the trailing line with the moved content + const selectionTarget = isBraced ? linesToInsert[0] : trailing + + const targetChildren = selectionTarget.getChildren() + const firstContentNode = targetChildren.find((node) => !$isTabNode(node)) + const lastTabNode = targetChildren.filter($isTabNode).pop() + + log("Selection target analysis:", { + targetKey: selectionTarget.getKey(), + childrenCount: targetChildren.length, + hasContentNode: !!firstContentNode, + hasTabNodes: !!lastTabNode, + childTypes: targetChildren.map((c) => c.getType()), + }) + + // Create a new selection at the appropriate position + const sel = $createRangeSelection() + + if (firstContentNode) { + // Position at start of first content node + log("SELECTION CASE 1", { + firstContentNode, + selectionTarget, + nextSibling: firstContentNode.getNextSibling(), + }) + if (!firstContentNode.getNextSibling()) { + if ( + selection.anchor.offset + selection.focus.offset < + firstContentNode.getTextContentSize() + ) { + log("SELECTION CASE 1a") $setSelection(firstContentNode.selectStart()) + } else { + log("SELECTION CASE 1b") + $setSelection(firstContentNode.selectEnd()) } - } else if (lastTabNode) { - // Position after last tab node - $setSelection(lastTabNode.selectEnd()) } else { - // Position at start of line if no content or tabs - $setSelection(selectionTarget.selectStart()) - // $setSelection(sel) + $setSelection(firstContentNode.selectStart()) } - - // Set the selection explicitly + } else if (lastTabNode) { + // Position after last tab node + $setSelection(lastTabNode.selectEnd()) + } else { + // Position at start of line if no content or tabs + $setSelection(selectionTarget.selectStart()) // $setSelection(sel) + } - log("🎯 Set explicit selection to new line", { - lineKey: selectionTarget.getKey(), - selection: sel, - }) - - return true - }, - COMMAND_PRIORITY_HIGH, - ), - editor.registerCommand( - KEY_TAB_COMMAND, - () => { - const selection = $getSelection() - if (!$isRangeSelection(selection)) return false - const anchor = selection.anchor - const anchorNode = anchor.getNode() - - const lineNode = $findMatchingParent(anchorNode, $isCodeLineNode) - if (!lineNode) return false - - const selectionNodes = selection.getNodes() - - if (selectionNodes.length > 0 && $isCodeHighlightNode(selectionNodes[0])) { - // Insert spaces instead of tab character to maintain valid JSON format - // Use 2 spaces to match typical JSON formatting - selection.insertText(" ") - } else { - const newTab = $createCodeTabNode() + // Set the selection explicitly + // $setSelection(sel) - selection.insertNodes([newTab]) - } + log("🎯 Set explicit selection to new line", { + lineKey: selectionTarget.getKey(), + selection: sel, + }) - return true - }, - COMMAND_PRIORITY_HIGH, - ), + return true + }, + COMMAND_PRIORITY_HIGH, ) }, [editor]) diff --git a/web/oss/src/components/Editor/plugins/code/plugins/SyntaxHighlightPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/SyntaxHighlightPlugin.tsx index 6b5eee19bd..bf985b0f75 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/SyntaxHighlightPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/SyntaxHighlightPlugin.tsx @@ -8,6 +8,7 @@ import { $isRangeSelection, $createRangeSelection, $setSelection, + $isTabNode, $isTextNode, TextNode, NodeKey, @@ -26,72 +27,206 @@ import { CodeHighlightNode, } from "../nodes/CodeHighlightNode" import {$isCodeLineNode, CodeLineNode} from "../nodes/CodeLineNode" -import {$isCodeTabNode} from "../nodes/CodeTabNode" import {createLogger} from "../utils/createLogger" +import {getEnhancedValidationContext} from "../utils/enhancedValidationContext" import {getDiffRange} from "../utils/getDiffRange" import {isPluginLocked, lockPlugin, unlockPlugin} from "../utils/pluginLocks" import {tokenizeCodeLine} from "../utils/tokenizer" +import {validateAll} from "../utils/validationUtils" type ValidationError = ErrorObject, unknown> -// Editor-specific validation contexts - keyed by editor ID -const editorValidationContexts = new Map< - string, - { - editorId?: string - schema?: any - ajv?: Ajv - errorTexts?: Set - errorList?: ValidationError[] - } ->() - -// Current active editor ID for validation context -let currentEditorId: string | null = null +// Global validation state - will be set by RealTimeValidationPlugin +let globalValidationContext: { + schema?: any + ajv?: Ajv + errorTexts?: Set + errorList?: ValidationError[] +} = {} /** - * Get the current editor ID used for validation context + * Get the current global validation context */ -export function getCurrentEditorId(): string | null { - return currentEditorId +export function getValidationContext() { + return globalValidationContext } /** - * Set the current editor ID for validation context + * Function to set validation context from RealTimeValidationPlugin */ -export function setCurrentEditorId(editorId: string) { - currentEditorId = editorId +export function setValidationContext(context: typeof globalValidationContext) { + log("🔄 setValidationContext called", { + oldErrorTextsSize: globalValidationContext.errorTexts?.size ?? 0, + newErrorTextsSize: context.errorTexts?.size ?? 0, + oldErrorListLength: globalValidationContext.errorList?.length ?? 0, + newErrorListLength: context.errorList?.length ?? 0, + newErrorTextsArray: context.errorTexts ? Array.from(context.errorTexts) : [], + }) + globalValidationContext = context } /** - * Get validation context for a specific editor or the current editor + * Check if unquoted text is likely a property name based on context */ -export function getValidationContext(editorId?: string) { - const targetEditorId = editorId || currentEditorId - if (!targetEditorId) { - return {} +function checkIfLikelyPropertyName(text: string, lineNode: CodeLineNode): boolean { + // Get the line text to analyze context + const lineText = lineNode.getTextContent() + const textIndex = lineText.indexOf(text) + + if (textIndex === -1) return false + + // Check if there's a colon after this text (indicating property name) + const afterText = lineText.substring(textIndex + text.length).trim() + if (afterText.startsWith(":")) { + return true + } + + // Check if this text appears at the beginning of the line (more likely property name) + const beforeText = lineText.substring(0, textIndex).trim() + if (beforeText === "" || beforeText.endsWith("{") || beforeText.endsWith(",")) { + // If there's a colon somewhere after this text on the same line + if (afterText.includes(":")) { + return true + } } - return editorValidationContexts.get(targetEditorId) || {} + + return false } /** - * Function to set validation context for a specific editor + * Get validation state for a specific token during syntax highlighting */ -export function setValidationContext( - editorId: string, - context: { - schema?: any - ajv?: Ajv - errorTexts?: Set - errorList?: ValidationError[] - }, -) { - if (!editorId) { - console.warn("⚠️ [SyntaxHighlightPlugin] No editor ID available for validation context") - return +function getValidationForToken( + text: string, + highlightType: string, + language: string, + lineNode?: CodeLineNode, +): {shouldHaveError: boolean; expectedMessage: string | null} { + // Skip validation for certain token types (check first) + const isPunctuation = highlightType === "punctuation" + const isOperator = highlightType === "operator" + + // Skip punctuation and operators entirely + if (isPunctuation || isOperator) { + return {shouldHaveError: false, expectedMessage: null} + } + + // JSON syntax validation for unquoted text (independent of schema validation) + if (language === "json" && highlightType === "plain") { + // Check if this looks like unquoted text that should be quoted + if ( + text !== "" && + isNaN(Number(text)) && + text !== "true" && + text !== "false" && + text !== "null" + ) { + // Try to determine context: is this a property name or a value? + // This is a heuristic - we need to check the surrounding context + const isLikelyPropertyName = lineNode + ? checkIfLikelyPropertyName(text, lineNode) + : false + + const errorMessage = isLikelyPropertyName + ? "Property names must be wrapped in double quotes" + : "String values must be wrapped in double quotes" + + // Add to enhanced validation context for consistency + // Use a context-specific token key to avoid conflicts between quoted/unquoted versions + const enhancedContext = getEnhancedValidationContext() + enhancedContext.addError({ + token: `unquoted:${text}`, // Prefix to distinguish from quoted versions + message: errorMessage, + level: "syntax", + type: "unquoted_property", + severity: "error", + timestamp: Date.now(), + line: 0, // Will be updated by the calling context + }) + + return { + shouldHaveError: true, + expectedMessage: errorMessage, + } + } + } + + // Try enhanced validation context + const enhancedContext = getEnhancedValidationContext() + const primaryError = enhancedContext.getPrimaryErrorForToken(text) + + if (primaryError) { + return { + shouldHaveError: true, + expectedMessage: primaryError.message, + } + } + + // Fall back to legacy validation context + const {errorTexts, errorList} = globalValidationContext + + // If no validation context is available, skip schema validation but allow syntax highlighting + if (!errorTexts || !errorList) { + return {shouldHaveError: false, expectedMessage: null} + } + + // If validation context exists but no errors, skip schema validation + if (errorTexts.size === 0) { + return {shouldHaveError: false, expectedMessage: null} + } + + // Schema validation for tokens that should be validated + if (text !== "" && !Number(text) && text !== "true" && text !== "false" && text !== "null") { + let shouldHaveError = errorTexts.has(text) + let expectedMessage: string | null = null + + if (shouldHaveError) { + // Find the actual error message that matches this text + const matchingError = errorList.find((e) => e.message?.includes(text)) + + if (matchingError) { + expectedMessage = matchingError.message ?? "Invalid" + } else { + // If errorTexts has the text but errorList doesn't have a matching error, + // the validation context is stale - don't show error + shouldHaveError = false + expectedMessage = null + } + } + + // Also check for quoted version + if (!shouldHaveError && text.startsWith('"') && text.endsWith('"')) { + const unquoted = text.slice(1, -1) + const hasUnquotedError = errorTexts.has(unquoted) + + if (hasUnquotedError) { + const matchingError = errorList.find((e) => e.message?.includes(unquoted)) + + if (matchingError) { + // Special case: Don't highlight property names for "missing property" errors + // when the text is a quoted string (meaning the property is actually present) + const isQuotedPropertyName = text.startsWith('"') && text.endsWith('"') + const isMissingPropertyError = + matchingError.keyword === "required" && + matchingError.message?.includes("must have required property") + + if (isQuotedPropertyName && isMissingPropertyError) { + // Don't highlight - the property is present, just the validation context is stale + } else { + shouldHaveError = true + expectedMessage = matchingError.message ?? "Invalid" + } + } else { + // Same stale context check for unquoted version - don't highlight + } + } + } + + return {shouldHaveError, expectedMessage} } - editorValidationContexts.set(editorId, context) + log("⏭️ Skipped validation (punctuation/operator/special)", {text, highlightType}) + return {shouldHaveError: false, expectedMessage: null} } const PLUGIN_NAME = "SyntaxHighlightPlugin" @@ -104,6 +239,188 @@ const log = createLogger(PLUGIN_NAME, {disabled: true}) * * @param lineNode - The code line node that was just highlighted */ +// Track last validation to avoid redundant calls +let lastValidationContent = "" +let lastValidationTime = 0 +const VALIDATION_DEBOUNCE_MS = 100 + +function $runValidationAfterHighlighting(lineNode: CodeLineNode, editor: any) { + const lineKey = lineNode.getKey() + + if (!editor.isEditable()) { + log(`⏭️ [SyntaxHighlightPlugin] Skipped validation - editor not editable (line ${lineKey})`) + return + } + + // Get the full editor content for validation + const codeBlockNode = lineNode.getParent() + + if (!$isCodeBlockNode(codeBlockNode)) { + return + } + + const textContent = codeBlockNode.getTextContent() + const now = Date.now() + + // Skip validation if content hasn't changed and it's within debounce period + if ( + textContent === lastValidationContent && + now - lastValidationTime < VALIDATION_DEBOUNCE_MS + ) { + log(`⏭️ [SyntaxHighlightPlugin] Skipped validation - content unchanged (line ${lineKey})`) + return + } + + // Skip validation for very short content (likely initial load) + if (textContent.length < 3) { + log(`⏭️ [SyntaxHighlightPlugin] Skipped validation - content too short (line ${lineKey})`) + return + } + + log(`🔍 [SyntaxHighlightPlugin] Running validation after highlighting for line node ${lineKey}`) + + lastValidationContent = textContent + lastValidationTime = now + + // Clean the text content by removing empty lines for validation + // This prevents JSON5 line number mismatches and improves validation accuracy + const originalLines = textContent.split("\n") + const cleanedLines: string[] = [] + const cleanedToOriginalLineMap = new Map() + + originalLines.forEach((line, originalIndex) => { + if (line.trim() !== "") { + cleanedLines.push(line) + const cleanedLineNumber = cleanedLines.length + const originalLineNumber = originalIndex + 1 + cleanedToOriginalLineMap.set(cleanedLineNumber, originalLineNumber) + } + }) + + const cleanedTextContent = cleanedLines.join("\n") + + // Get the specific line that was just edited for active typing detection + const editedLineNode = $getNodeByKey(lineKey) + const editedLineContent = editedLineNode?.getTextContent()?.trim() || "" + + const validationResult = validateAll( + cleanedTextContent, + globalValidationContext.schema, + editedLineContent, + cleanedToOriginalLineMap, + ) + + // Debug schema errors specifically + if (validationResult.schemaErrors.length > 0) { + log(`🔍 [SyntaxHighlightPlugin] Schema errors detail:`, validationResult.schemaErrors) + } + + // Create mapping from text content lines to visual lines (skipping empty lines) + const textLines = textContent.split("\n") + const visualLineMapping = new Map() + let visualLineNumber = 1 + + textLines.forEach((textLine, textLineIndex) => { + const textLineNumber = textLineIndex + 1 + if (textLine.trim() !== "") { + visualLineMapping.set(textLineNumber, visualLineNumber) + visualLineNumber++ + } + }) + + log(`🗺️ [SyntaxHighlightPlugin] Line mapping:`, { + textLines: textLines.length, + visualLines: visualLineNumber - 1, + mapping: Array.from(visualLineMapping.entries()).slice(0, 10), // Show first 10 mappings + }) + + log(`🗺️ [SyntaxHighlightPlugin] Full line mapping details:`) + textLines.forEach((textLine, textLineIndex) => { + const textLineNumber = textLineIndex + 1 + const visualLine = visualLineMapping.get(textLineNumber) + log( + ` Text line ${textLineNumber}: "${textLine.trim()}" → Visual line ${visualLine || "SKIPPED"}`, + ) + }) + + // Group errors by VISUAL line number (not text content line number) + const errorsByLine = new Map() + + validationResult.allErrors.forEach((error) => { + // Map text content line number to visual line number + const visualLine = visualLineMapping.get(error.line) || error.line + const lineErrors = errorsByLine.get(visualLine) || [] + + // Create a new error object with corrected line number + const correctedError = {...error, line: visualLine} + lineErrors.push(correctedError) + errorsByLine.set(visualLine, lineErrors) + + log( + `🔄 [SyntaxHighlightPlugin] Mapped error from text line ${error.line} to visual line ${visualLine}:`, + error.message, + ) + }) + + // Apply validation errors to all code lines in the block + const codeLines = codeBlockNode.getChildren().filter($isCodeLineNode) + + log( + `🗺️ [SyntaxHighlightPlugin] ErrorsByLine map contents:`, + Array.from(errorsByLine.entries()).map( + ([line, errors]) => `Line ${line}: ${errors.length} errors`, + ), + ) + + codeLines.forEach((line, index) => { + const lineNumber = index + 1 + const lineErrors = errorsByLine.get(lineNumber) || [] + + log( + `🔍 [SyntaxHighlightPlugin] Checking visual line ${lineNumber}: found ${lineErrors.length} errors`, + ) + + // Set validation errors on the line node + const writableLine = line.getWritable() + writableLine.setValidationErrors(lineErrors) + + log( + `🔴 Applied ${lineErrors.length} validation errors to line ${lineNumber}:`, + lineErrors.map((e) => `[${e.type}] ${e.message}`), + ) + }) + + // Store validation results directly in editor state for GlobalErrorIndicatorPlugin + if (editor) { + // Store mapped validation errors in editor state (with corrected visual line numbers) + const mappedStructuralErrors = validationResult.structuralErrors.map((error) => { + const visualLine = visualLineMapping.get(error.line) || error.line + return {...error, line: visualLine} + }) + const mappedBracketErrors = validationResult.bracketErrors.map((error) => { + const visualLine = visualLineMapping.get(error.line) || error.line + return {...error, line: visualLine} + }) + const mappedSchemaErrors = validationResult.schemaErrors.map((error) => { + const visualLine = visualLineMapping.get(error.line) || error.line + return {...error, line: visualLine} + }) + + ;(editor as any)._structuralErrors = mappedStructuralErrors + ;(editor as any)._bracketErrors = mappedBracketErrors + ;(editor as any)._schemaErrors = mappedSchemaErrors + + log(`📊 [SyntaxHighlightPlugin] Stored validation results in editor state:`, { + structural: mappedStructuralErrors.length, + bracket: mappedBracketErrors.length, + schema: mappedSchemaErrors.length, + totalErrors: + mappedStructuralErrors.length + + mappedBracketErrors.length + + mappedSchemaErrors.length, + }) + } +} /** * Updates a code line while preserving cursor position. @@ -190,29 +507,17 @@ function $updateAndRetainSelection( * and maintains a smooth editing experience. */ interface SyntaxHighlightPluginProps { - editorId: string schema?: any debug?: boolean } -export function SyntaxHighlightPlugin({ - editorId, - schema, - debug = false, -}: SyntaxHighlightPluginProps) { +export function SyntaxHighlightPlugin({schema, debug = false}: SyntaxHighlightPluginProps = {}) { const [editor] = useLexicalComposerContext() + // Update global validation context with schema useEffect(() => { - // Set this editor as the current one for validation context - setCurrentEditorId(editorId) - if (schema) { - // Set schema for this specific editor - setValidationContext(editorId, { - schema, - errorTexts: new Set(), - errorList: [], - }) + globalValidationContext.schema = schema } }, [schema]) @@ -269,7 +574,7 @@ export function SyntaxHighlightPlugin({ // Extract pure text content, ignoring tab nodes // This ensures we only tokenize actual code content const text = children - .filter((child) => !$isCodeTabNode(child)) + .filter((child) => !$isTabNode(child)) .map((child) => child.getTextContent()) .join("") @@ -294,7 +599,20 @@ export function SyntaxHighlightPlugin({ const existing = existingTokens[i] if (!existing) return false - return t.content === existing.content && t.type === existing.type + // Get validation for this token based on current context + const {shouldHaveError, expectedMessage} = getValidationForToken( + t.content.trim(), + t.type, + language, + lineNode, + ) + + return ( + t.content === existing.content && + t.type === existing.type && + shouldHaveError === existing.hasValidationError && + expectedMessage === existing.validationMessage + ) }) log(`🔍 [SyntaxHighlightPlugin] Token comparison:`, { lineKey, @@ -319,6 +637,8 @@ export function SyntaxHighlightPlugin({ lockPlugin(PLUGIN_NAME) log("transforming line", lineNode) + + // Start a mutable editor transaction to update highlighting editor.update( () => { const selection = $getSelection() @@ -327,22 +647,40 @@ export function SyntaxHighlightPlugin({ // Separate tabs from highlight nodes // Tabs need to be preserved in their positions const current = lineNode.getChildren() - const tabs = current.filter($isCodeTabNode) + const tabs = current.filter($isTabNode) const highlights = current.filter($isCodeHighlightNode) - // Create new highlight nodes from tokens (pure syntax highlighting) + // Create new highlight nodes from tokens with validation const newHighlights = tokens.map(({content, type}) => { + // Apply validation logic during syntax highlighting + const {shouldHaveError, expectedMessage} = getValidationForToken( + content.trim(), + type, + language, + lineNode, + ) + const node = $createCodeHighlightNode( content, type, - false, // No token-level validation - "", // No validation message + shouldHaveError, + expectedMessage, ) + // Log validation errors for debugging + if (shouldHaveError && content.trim()) { + log("✅ Syntax error detected", { + token: content.trim(), + type, + message: expectedMessage, + }) + } + return node }) // Always run validation first, regardless of highlighting changes + $runValidationAfterHighlighting(lineNode, editor) // Skip highlighting updates if tokens are identical if (tokenMatch) { @@ -400,22 +738,6 @@ export function SyntaxHighlightPlugin({ }) if ($isCodeLineNode(parent)) { - // check if there's a tab node right after this node - const nextSibling = node.getNextSibling() - if ($isCodeTabNode(nextSibling)) { - const allTrailingTabs = node.getNextSiblings().filter($isCodeTabNode) - const allTrailingTabsContent = allTrailingTabs.map((tab) => - tab.getTextContent(), - ) - const newNode = $createCodeHighlightNode( - nodeText + allTrailingTabsContent.join(""), - "text", - false, - "", - ) - node.replace(newNode) - allTrailingTabs.forEach((tab) => tab.remove()) - } $transformLine(parent) } }) @@ -471,23 +793,23 @@ export function SyntaxHighlightPlugin({ } // Trigger bracket analysis if needed - CONSERVATIVE approach - // if (shouldAnalyzeBrackets) { - // log("🔄 Scheduling conservative bracket re-analysis") - // // Just run validation directly - no need for full transform cycle - // editor.update(() => { - // // Find any code line and run validation only - // const root = $getRoot() - // const descendants = root.getAllTextNodes() - // for (const textNode of descendants) { - // const parent = textNode.getParent() - // if ($isCodeLineNode(parent)) { - // // Run validation directly - this will refresh bracket detection - - // return // Only validate one line to refresh cache - // } - // } - // }) - // } + if (shouldAnalyzeBrackets) { + log("🔄 Scheduling conservative bracket re-analysis") + // Just run validation directly - no need for full transform cycle + editor.update(() => { + // Find any code line and run validation only + const root = $getRoot() + const descendants = root.getAllTextNodes() + for (const textNode of descendants) { + const parent = textNode.getParent() + if ($isCodeLineNode(parent)) { + // Run validation directly - this will refresh bracket detection + $runValidationAfterHighlighting(parent, editor) + return // Only validate one line to refresh cache + } + } + }) + } }, {skipInitialization: true}, // Don't trigger on initial load ) @@ -508,14 +830,30 @@ export function SyntaxHighlightPlugin({ log(`🚀 [SyntaxHighlightPlugin] Initial content loaded, running validation`) + // Schedule validation after initial content is processed + setTimeout(() => { + editor.update(() => { + const root = $getRoot() + const codeBlock = root.getChildren().find($isCodeBlockNode) + + if (codeBlock) { + const codeLines = codeBlock.getChildren().filter($isCodeLineNode) + if (codeLines.length > 0) { + // Run validation on the first line to trigger full validation + log( + `🚀 [SyntaxHighlightPlugin] Running initial validation on ${codeLines.length} lines`, + ) + $runValidationAfterHighlighting(codeLines[0], editor) + } + } + }) + }, 100) // Small delay to ensure content is fully processed + return false // Don't prevent other handlers }, COMMAND_PRIORITY_LOW, ) - // Note: We don't need to listen to validation errors changes here - // The validation errors will be applied during the normal highlighting process - return () => { unregisterText() unregisterHighlight() diff --git a/web/oss/src/components/Editor/plugins/code/plugins/VerticalNavigationPlugin.tsx b/web/oss/src/components/Editor/plugins/code/plugins/VerticalNavigationPlugin.tsx index 336e3bc56e..05db2b7020 100644 --- a/web/oss/src/components/Editor/plugins/code/plugins/VerticalNavigationPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/code/plugins/VerticalNavigationPlugin.tsx @@ -4,9 +4,7 @@ * This plugin improves vertical navigation in code blocks by: * 1. Maintaining cursor horizontal position when moving between lines * 2. Handling Alt+Up/Down for line movement - * 3. Handling Cmd+Up/Down (macOS) for document navigation (jump to top/bottom) - * 4. Preventing selection from moving out of code blocks - * 5. Supporting Shift+Cmd+Up/Down for selection extension to document boundaries + * 3. Preventing selection from moving out of code blocks */ import {useEffect} from "react" @@ -200,30 +198,6 @@ function $handleShiftLines( // Log indentation after fix logIndentationState("Indentation AFTER auto-fix", parent) - // Trigger validation after line movement to update error indicators - // This ensures that validation errors are repositioned to match the moved lines - const textContent = parent.getTextContent() - - if (textContent.length > 3) { - // Clean the text content by removing empty lines for validation - const originalLines = textContent.split("\n") - const cleanedLines: string[] = [] - const cleanedToOriginalLineMap = new Map() - - originalLines.forEach((line: string, originalIndex: number) => { - if (line.trim() !== "") { - cleanedLines.push(line) - const cleanedLineNumber = cleanedLines.length - const originalLineNumber = originalIndex + 1 - cleanedToOriginalLineMap.set(cleanedLineNumber, originalLineNumber) - } - }) - - log( - `🔄 [VerticalNavigationPlugin] Line movement completed - validation will be handled automatically`, - ) - } - return shouldHandle } @@ -288,61 +262,6 @@ export function VerticalNavigationPlugin() { if (!targetLine || !$isCodeLineNode(targetLine)) return false - // Handle Cmd+Arrow (metaKey) for document navigation (VSCode-like) - if (event.metaKey) { - log("🎮 Cmd+Arrow detected, handling document navigation") - event.preventDefault() - - // Find the code block containing the current line - const codeBlock = currentLine.getParents().find($isCodeBlockNode) - if (!codeBlock) return false - - // Get all lines in the code block - const allLines = codeBlock.getChildren().filter($isCodeLineNode) - if (allLines.length === 0) return false - - // Determine target line (first or last) - const targetLine = isArrowUp ? allLines[0] : allLines[allLines.length - 1] - if (!targetLine) return false - - // Position cursor at beginning or end of target line - const targetNodes = targetLine.getChildren() - if (targetNodes.length === 0) return false - - let targetNode, targetOffset - if (isArrowUp) { - // Go to beginning of first line - targetNode = targetNodes[0] - targetOffset = 0 - } else { - // Go to end of last line - const lastNode = targetNodes[targetNodes.length - 1] - targetNode = lastNode - targetOffset = lastNode.getTextContentSize() - } - - // Create and set the selection - const newSelection = $createRangeSelection() - if (event.shiftKey) { - // Extend selection from current position to target - newSelection.anchor.set(anchor.getNode().getKey(), anchor.offset, "text") - newSelection.focus.set(targetNode.getKey(), targetOffset, "text") - } else { - // Move cursor to target position - newSelection.anchor.set(targetNode.getKey(), targetOffset, "text") - newSelection.focus.set(targetNode.getKey(), targetOffset, "text") - } - - $setSelection(newSelection) - log("🎮 Document navigation completed", { - direction: isArrowUp ? "top" : "bottom", - targetNodeKey: targetNode.getKey(), - targetOffset, - shiftKey: event.shiftKey, - }) - return true - } - // Handle Alt+Arrow for line movement if (event.altKey) { log("🎮 Alt+Arrow detected, handling line movement") @@ -383,9 +302,9 @@ export function VerticalNavigationPlugin() { // Get target line information // const isTargetLineFolded = targetLine?.isCollapsed() - + // console.log("TARGET LINE!", targetLine) // if (isTargetLineFolded) { - + // console.log("🎮 Target line is folded, skipping") // // editor.dispatchCommand(KEY_DOWN_COMMAND, event) // // return true // } diff --git a/web/oss/src/components/Editor/plugins/code/tryParsePartialJson.ts b/web/oss/src/components/Editor/plugins/code/tryParsePartialJson.ts index 10854aea87..8400ec76d8 100644 --- a/web/oss/src/components/Editor/plugins/code/tryParsePartialJson.ts +++ b/web/oss/src/components/Editor/plugins/code/tryParsePartialJson.ts @@ -1,7 +1,5 @@ // Pure utility version for robust partial JSON parsing -import {jsonrepair} from "jsonrepair" - import {createLogger} from "./utils/createLogger" /** @@ -15,7 +13,7 @@ import {createLogger} from "./utils/createLogger" * - Ignores incomplete key-value pairs, missing colons, or values. * - Handles nested objects and arrays. * - Recovers from missing commas and trailing pairs. - * - Returns an object containing only valid pairs, or null if none found or input is invalid. + * - Returns an object containing only valid pairs, or null if none found. * * @param input - The JSON string or object to parse. If an object is given, it is returned as-is. * @returns An object containing all valid key-value pairs, or null if none are found or input is invalid. @@ -37,10 +35,12 @@ export function tryParsePartialJson(input: any): any | null { return null } - // Clean invisibles only. Use jsonrepair for tolerant fixes (quote delimiters, - // trailing commas, etc.) while preserving Unicode inside string contents. - const removeInvisibles = (str: string) => str.replace(/[\u200B-\u200D\uFEFF\u00A0]/g, "") - const cleanedInput = removeInvisibles(input) + // Clean invisible characters and normalize curly quotes to standard quotes + const cleanedInput = input + // Remove zero-width spaces, BOM, NBSP, etc. + .replace(/[\u200B-\u200D\uFEFF\u00A0]/g, "") + // Replace curly quotes with standard quotes + .replace(/[\u201C\u201D]/g, '"') // FIRST: Try standard JSON.parse to preserve original key ordering try { @@ -53,16 +53,6 @@ export function tryParsePartialJson(input: any): any | null { log("[tryParsePartialJson] Standard JSON.parse failed, trying common fixes:", e.message) } - // Try jsonrepair to broadly fix malformed JSON while preserving content - try { - const repaired = jsonrepair(cleanedInput.trim()) - const parsed = JSON.parse(repaired) - log("[tryParsePartialJson] Successfully parsed after jsonrepair") - return parsed - } catch (e) { - log("[tryParsePartialJson] jsonrepair parse failed, falling back to heuristics:", e.message) - } - // SECOND: Try fixing common JSON issues before falling back to manual parsing const commonFixes = [ // Remove trailing commas (most common issue) diff --git a/web/oss/src/components/Editor/plugins/code/types.ts b/web/oss/src/components/Editor/plugins/code/types.ts deleted file mode 100644 index 9163c23460..0000000000 --- a/web/oss/src/components/Editor/plugins/code/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type CodeLanguage = "json" | "yaml" | "code" - -export const DEFAULT_CODE_LANGUAGE: CodeLanguage = "json" diff --git a/web/oss/src/components/Editor/plugins/code/utils/indent.ts b/web/oss/src/components/Editor/plugins/code/utils/indent.ts index 3818ec994c..35c16bb883 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/indent.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/indent.ts @@ -24,7 +24,7 @@ export function calculateLineIndentation( lineText: string, previousLineText: string, baseIndentLevel: number, - language: "json" | "yaml" | "code", + language: "json" | "yaml", ): number { const trimmedLine = lineText.trim() const trimmedPrevious = previousLineText.trim() @@ -65,7 +65,7 @@ export function calculateLineIndentation( export function calculateMultiLineIndentation( lines: string[], baseIndentLevel: number, - language: "json" | "yaml" | "code", + language: "json" | "yaml", ): number[] { const indentLevels: number[] = [] @@ -93,7 +93,7 @@ export function calculateMultiLineIndentation( */ export function isFoldableLine(text: string, language: string): boolean { const trimmed = text.trim() - if (language === "json" || language === "code") { + if (language === "json") { return trimmed.endsWith("{") } if (language === "yaml") { diff --git a/web/oss/src/components/Editor/plugins/code/utils/indentationUtils.ts b/web/oss/src/components/Editor/plugins/code/utils/indentationUtils.ts index b042f8055e..d009e964b2 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/indentationUtils.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/indentationUtils.ts @@ -1,6 +1,7 @@ +import {$createTabNode} from "lexical" + import {$isCodeBlockNode} from "../nodes/CodeBlockNode" import {$isCodeLineNode, CodeLineNode} from "../nodes/CodeLineNode" -import {$createCodeTabNode, $isCodeTabNode} from "../nodes/CodeTabNode" /** * Analyzes and corrects the indentation of all lines in a code block node. @@ -22,7 +23,8 @@ export function $fixCodeBlockIndentation(codeBlock: any) { // Count current leading tab nodes let currentTabs = 0 for (const child of children) { - if ((child.getType && child.getType() === "tab") || $isCodeTabNode(child)) { + // $isTabNode is from lexical, but not always imported. Use type or class check if needed. + if (child.getType && child.getType() === "tab") { currentTabs++ } else { break @@ -40,7 +42,7 @@ export function $fixCodeBlockIndentation(codeBlock: any) { if (currentTabs < indentLevel) { // Add missing tabs at the start for (let t = 0; t < indentLevel - currentTabs; t++) { - const tabNode = $createCodeTabNode() + const tabNode = $createTabNode() // Always add as a child of the line const updatedChildren = line.getChildren() if (updatedChildren.length > 0) { diff --git a/web/oss/src/components/Editor/plugins/code/utils/language.ts b/web/oss/src/components/Editor/plugins/code/utils/language.ts index 927438986b..9a136c2062 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/language.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/language.ts @@ -1,8 +1,6 @@ import {$getRoot, LexicalEditor} from "lexical" import {$isCodeBlockNode} from "../nodes/CodeBlockNode" -import type {CodeLanguage} from "../types" -import {DEFAULT_CODE_LANGUAGE} from "../types" /** * Determines the active language mode of the code editor. @@ -14,12 +12,12 @@ import {DEFAULT_CODE_LANGUAGE} from "../types" * @param editor - The Lexical editor instance to check * @returns The current language mode, defaults to 'json' if no code block found */ -export function $getActiveLanguage(editor: LexicalEditor): CodeLanguage { +export function $getActiveLanguage(editor: LexicalEditor): "json" | "yaml" { const root = $getRoot() for (const block of root.getChildren()) { if ($isCodeBlockNode(block)) { - return block.getLanguage() + return block.getLanguage() as "json" | "yaml" } } - return DEFAULT_CODE_LANGUAGE + return "json" } diff --git a/web/oss/src/components/Editor/plugins/code/utils/pasteUtils.ts b/web/oss/src/components/Editor/plugins/code/utils/pasteUtils.ts index 0ef838e064..97bfa95221 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/pasteUtils.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/pasteUtils.ts @@ -1,9 +1,7 @@ -import {$createRangeSelection, $setSelection} from "lexical" +import {$createRangeSelection, $setSelection, $createTabNode} from "lexical" import {$createCodeHighlightNode} from "../nodes/CodeHighlightNode" import {$createCodeLineNode, CodeLineNode} from "../nodes/CodeLineNode" -import {$createCodeTabNode} from "../nodes/CodeTabNode" -import type {CodeLanguage} from "../types" import {normalizePastedLinesIndentation} from "./indentationUtils" import {tokenizeCodeLine} from "./tokenizer" @@ -208,7 +206,7 @@ export function $insertLinesWithSelectionAndIndent({ } } -export function $createNodeForLineWithTabs(line: string, language: CodeLanguage) { +export function $createNodeForLineWithTabs(line: string, language: "json" | "yaml") { const codeLine = $createCodeLineNode() // Extract leading spaces/tabs const indentMatch = line.match(/^[ \t]+/) @@ -221,7 +219,7 @@ export function $createNodeForLineWithTabs(line: string, language: CodeLanguage) let i = 0 while (i < indent.length) { if (indent[i] === "\t") { - codeLine.append($createCodeTabNode()) + codeLine.append($createTabNode()) i += 1 } else if (indent[i] === " ") { // Count consecutive spaces @@ -229,12 +227,12 @@ export function $createNodeForLineWithTabs(line: string, language: CodeLanguage) while (indent[i + spaceCount] === " ") spaceCount++ const tabs = Math.floor(spaceCount / tabSize) for (let t = 0; t < tabs; t++) { - codeLine.append($createCodeTabNode()) + codeLine.append($createTabNode()) } i += tabs * tabSize // If any leftover spaces, append as plain for (; i < indent.length && indent[i] === " "; i++) { - codeLine.append($createCodeTabNode()) + codeLine.append($createTabNode()) } } } diff --git a/web/oss/src/components/Editor/plugins/code/utils/structuralValidators.ts b/web/oss/src/components/Editor/plugins/code/utils/structuralValidators.ts index a25c40ebf4..d5e641efd2 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/structuralValidators.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/structuralValidators.ts @@ -1,13 +1,10 @@ /** * Check if content appears to be incomplete (user is still typing) */ -export function isContentIncomplete( - text: string, - language: "json" | "yaml" | "code" = "json", -): boolean { +export function isContentIncomplete(text: string, language: "json" | "yaml" = "json"): boolean { const trimmed = text.trim() - if (language === "json" || language === "code") { + if (language === "json") { // JSON incomplete patterns return ( trimmed.endsWith(":") || // "key": diff --git a/web/oss/src/components/Editor/plugins/code/utils/tokenizer.ts b/web/oss/src/components/Editor/plugins/code/utils/tokenizer.ts index c5426b6de6..9ee2a21075 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/tokenizer.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/tokenizer.ts @@ -2,12 +2,8 @@ import Prism from "prismjs" import "prismjs/components/prism-json" import "prismjs/components/prism-yaml" -import "prismjs/components/prism-python" -import "prismjs/components/prism-javascript" import type {Token as PrismToken} from "prismjs" -import type {CodeLanguage} from "../types" - /** * Represents a syntax token with content and type. * Used for syntax highlighting in the code editor. @@ -30,19 +26,8 @@ export interface Token { * @param language - The language to use for tokenization ('json' or 'yaml') * @returns Array of tokens with content and type */ -const LANGUAGE_GRAMMAR_MAP: Record = { - json: "json", - yaml: "yaml", - code: "python", -} - -export function tokenizeCodeLine(line: string, language: CodeLanguage): Token[] { - const targetGrammar = LANGUAGE_GRAMMAR_MAP[language] - const grammar = - Prism.languages[targetGrammar] ?? - Prism.languages.javascript ?? - Prism.languages.clike ?? - null +export function tokenizeCodeLine(line: string, language: "json" | "yaml"): Token[] { + const grammar = Prism.languages[language] if (!grammar) return [{content: line, type: "plain"}] const rawTokens = Prism.tokenize(line, grammar) diff --git a/web/oss/src/components/Editor/plugins/code/utils/validationUtils.ts b/web/oss/src/components/Editor/plugins/code/utils/validationUtils.ts index 81abe0a99e..465e194482 100644 --- a/web/oss/src/components/Editor/plugins/code/utils/validationUtils.ts +++ b/web/oss/src/components/Editor/plugins/code/utils/validationUtils.ts @@ -1,1222 +1,755 @@ -import yaml from "js-yaml" -import JSON5 from "json5" - -import type {CodeLanguage} from "../types" - -// Enhanced validation functions for irregular and chaotic input detection - -/** - * Detect text that appears before or after the main JSON block - */ -function detectTextOutsideJSON(textContent: string, lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - const trimmed = textContent.trim() - - if (!trimmed) return errors - - // Find the start and end of the main JSON structure - const jsonStart = Math.min( - trimmed.indexOf("{") === -1 ? Infinity : trimmed.indexOf("{"), - trimmed.indexOf("[") === -1 ? Infinity : trimmed.indexOf("["), - ) - const jsonEnd = Math.max(trimmed.lastIndexOf("}"), trimmed.lastIndexOf("]")) - - if (jsonStart === Infinity || jsonEnd === -1) { - return errors // No clear JSON structure found - } - - // Check for text before JSON - const beforeJSON = trimmed.substring(0, jsonStart).trim() - if (beforeJSON) { - errors.push({ - id: "text-before-json", - line: 1, - message: "Text found before JSON structure", - type: "structural", - severity: "error", - }) - } - - // Check for text after JSON - const afterJSON = trimmed.substring(jsonEnd + 1).trim() - if (afterJSON) { - // Find the line where the text after JSON appears - const afterJSONLine = lines.findIndex((line, index) => { - const cumulativeLength = lines.slice(0, index + 1).join("\n").length - return cumulativeLength > jsonEnd - }) - - errors.push({ - id: "text-after-json", - line: afterJSONLine > 0 ? afterJSONLine + 1 : lines.length, - message: "Text found after JSON structure", - type: "structural", - severity: "error", - }) - } - - return errors -} - -/** - * Detect content that doesn't appear to be JSON at all - */ -function detectNonJSONText(textContent: string, lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - const trimmed = textContent.trim() - - if (!trimmed) return errors - - // Check if content has any JSON-like structure - const hasJSONStructure = /[{}\[\]]/.test(trimmed) || /"[^"]*"\s*:/.test(trimmed) - - if (!hasJSONStructure) { - errors.push({ - id: "non-json-content", - line: 1, - message: "Content does not appear to be JSON", - type: "structural", - severity: "error", - }) - } - - return errors -} - /** - * Detect multiple top-level JSON objects or arrays + * Pure validation utility functions for the unified validation system. + * These functions take text content and return validation errors without side effects. */ -function detectMultipleJSONObjects(textContent: string): ErrorInfo[] { - const errors: ErrorInfo[] = [] - const trimmed = textContent.trim() - - if (!trimmed) return errors - - // Try to detect multiple JSON objects by looking for patterns like }\s*{ - const multipleObjectPattern = /}\s*{/g - const multipleArrayPattern = /]\s*\[/g - const objectThenArray = /}\s*\[/g - const arrayThenObject = /]\s*{/g - - if ( - multipleObjectPattern.test(trimmed) || - multipleArrayPattern.test(trimmed) || - objectThenArray.test(trimmed) || - arrayThenObject.test(trimmed) - ) { - errors.push({ - id: "multiple-json-objects", - line: 1, - message: "Multiple top-level JSON objects/arrays are not allowed", - type: "structural", - severity: "error", - }) - } - - return errors -} - -/** - * Detect invalid tokens that shouldn't appear in JSON - */ -function detectInvalidTokens(lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - - for (let i = 0; i < lines.length; i++) { - const line = lines[i] - const lineNumber = i + 1 - - // Skip empty lines - if (!line.trim()) continue - // Check for HTML tags - if (/<[^>]+>/.test(line)) { - errors.push({ - id: `html-tags-${lineNumber}`, - line: lineNumber, - message: "HTML tags are not valid in JSON", - type: "syntax", - severity: "error", - }) - } - - // Check for JavaScript keywords - const jsKeywords = - /\b(function|var|let|const|if|else|for|while|return|class|extends|import|export)\b/ - if (jsKeywords.test(line)) { - errors.push({ - id: `js-keywords-${lineNumber}`, - line: lineNumber, - message: "JavaScript keywords are not valid in JSON", - type: "syntax", - severity: "error", - }) - } - - // Check for mathematical expressions - if (/\b\d+\s*[+\-*/=]\s*\d+/.test(line)) { - errors.push({ - id: `math-expressions-${lineNumber}`, - line: lineNumber, - message: "Mathematical expressions are not valid in JSON", - type: "syntax", - severity: "error", - }) - } - - // Check for binary/hex numbers - if (/\b0[bx][0-9a-fA-F]+\b/.test(line)) { - errors.push({ - id: `binary-hex-${lineNumber}`, - line: lineNumber, - message: "Binary/hex numbers are not valid in JSON", - type: "syntax", - severity: "error", - }) - } - - // Check for unquoted emojis/unicode (outside of strings) - const emojiRegex = - /[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/u - - // Split line by quotes to separate quoted and unquoted parts - const parts = line.split('"') - for (let j = 0; j < parts.length; j += 2) { - // Even indices are outside quotes - const unquotedPart = parts[j] - if (emojiRegex.test(unquotedPart)) { - errors.push({ - id: `unquoted-emoji-${lineNumber}`, - line: lineNumber, - message: "Unquoted emoji/unicode characters are not valid in JSON", - type: "syntax", - severity: "error", - }) - break - } - } - } - - return errors -} - -/** - * Detect standalone values that should be part of an object or array - */ -function detectStandaloneValues(lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim() - const lineNumber = i + 1 - - // Skip empty lines, comments, and lines with structural characters - if (!line || line.startsWith("//") || /[{}\[\],:]/.test(line)) { - continue - } - - // Check if this looks like a standalone value (string, number, boolean) - if (/^("[^"]*"|\d+|true|false|null)\s*$/.test(line)) { - errors.push({ - id: `standalone-value-${lineNumber}`, - line: lineNumber, - message: "Standalone values must be part of an object or array", - type: "syntax", - severity: "error", - }) - } - } - - return errors -} +import JSON5 from "json5" -export interface ErrorInfo { - id: string - line: number - message: string - type: "syntax" | "schema" | "bracket" | "structural" - severity: "error" | "warning" -} +import {ErrorInfo} from "../plugins/GlobalErrorIndicatorPlugin" /** - * Main validation function - validates both JSON/YAML syntax and schema - * @param textContent - The content to validate - * @param schema - Optional schema for validation - * @param language - The language format ('json' or 'yaml') - * @param _editedLineContent - Unused parameter for compatibility - * @param cleanedToOriginalLineMap - Unused parameter for compatibility + * JSON5-based validation that provides clean, UX-focused error messages. + * Instead of multiple confusing bracket errors, gives one clear error per issue. + * @param textContent - The JSON text to validate + * @returns Array of validation errors */ -export function validateAll( - textContent: string, - schema?: any, - language: CodeLanguage = "json", - _editedLineContent?: string, - cleanedToOriginalLineMap?: Map, -): { - allErrors: ErrorInfo[] - errorsByLine: Map - structuralErrors: ErrorInfo[] - bracketErrors: ErrorInfo[] - schemaErrors: ErrorInfo[] -} { - const lines = textContent.split("\n") +function validateWithJSON5(textContent: string, editedLineContent?: string): ErrorInfo[] { const errors: ErrorInfo[] = [] - // Handle empty input - if (!textContent || textContent.trim() === "") { - return { - allErrors: [], - errorsByLine: new Map(), - structuralErrors: [], - bracketErrors: [], - schemaErrors: [], - } - } - - if (language === "code") { - return { - allErrors: [], - errorsByLine: new Map(), - structuralErrors: [], - bracketErrors: [], - schemaErrors: [], - } - } - - // 1. Try native parsing first (fast path for valid content) - try { - if (language === "json") { - JSON.parse(textContent) - } else { - yaml.load(textContent) - } - // If we reach here, it's valid content - only run schema validation if needed - const schemaErrors = schema ? validateSchema(textContent, schema, lines, language) : [] - const errorsByLine = new Map() - for (const error of schemaErrors) { - const lineErrors = errorsByLine.get(error.line) || [] - lineErrors.push(error) - errorsByLine.set(error.line, lineErrors) - } - return { - allErrors: schemaErrors, - errorsByLine, - structuralErrors: [], - bracketErrors: [], - schemaErrors, - } - } catch (nativeError) { - // Continue with detailed validation - } - - // 2. Language-specific validation for invalid content - let structuralErrors: ErrorInfo[] = [] - let bracketErrors: ErrorInfo[] = [] - - if (language === "json") { - // JSON-specific validation - - // Try JSON5 parsing to detect non-strict JSON - try { - JSON5.parse(textContent) - errors.push({ - id: "non-strict-json", - line: 1, - message: "Invalid JSON syntax - use strict JSON format", - type: "syntax", - severity: "error", - }) - } catch (json5Error) { - // Continue with enhanced validation for irregular input + // Quick heuristic: If the edited line looks like active typing, skip validation + // This prevents validation from interfering with undo/redo history + if (editedLineContent) { + // console.log(`🔧 [validateWithJSON5] Active typing check on edited line:`, { + // editedLineContent: `"${editedLineContent}"`, + // matchesColonSpace: !!editedLineContent.match(/^"[^"]*":\s*$/), + // matchesColon: !!editedLineContent.match(/^"[^"]*":$/), + // matchesKey: !!editedLineContent.match(/^"[^"]*"$/), + // matchesIncomplete: !!editedLineContent.match(/^"[^"]*$/), + // }) + + // Skip validation if the edited line looks like incomplete typing + if ( + editedLineContent.match(/^"[^"]*":\s*$/) || // "key": + editedLineContent.match(/^"[^"]*":$/) || // "key": + editedLineContent.match(/^"[^"]*"$/) || // "key" + editedLineContent.match(/^"[^"]*$/) + ) { + // console.log( + // `🔧 [validateWithJSON5] Skipping validation - edited line looks like active typing: "${editedLineContent}"`, + // ) + return [] } - - // Enhanced validation for irregular and chaotic input - errors.push(...detectTextOutsideJSON(textContent, lines)) - errors.push(...detectNonJSONText(textContent, lines)) - errors.push(...detectMultipleJSONObjects(textContent)) - errors.push(...detectInvalidTokens(lines)) - - // Original line-by-line validation for traditional JSON errors - errors.push(...detectStandaloneValues(lines)) - errors.push(...detectTrailingCommas(lines)) - errors.push(...detectUnclosedStrings(lines)) - - // Check for structural errors (malformed JSON5) - structuralErrors = validateStructure(textContent, lines) - errors.push(...structuralErrors) - - // Check for bracket/brace errors - bracketErrors = validateBrackets(textContent, lines) - errors.push(...bracketErrors) - } else { - // YAML-specific validation - errors.push(...detectYAMLSyntaxErrors(textContent, lines)) - } - - // 5. Check for schema errors (only if we have a schema) - const schemaErrors = schema ? validateSchema(textContent, schema, lines, language) : [] - errors.push(...schemaErrors) - - // Group errors by line - const errorsByLine = new Map() - for (const error of errors) { - const lineErrors = errorsByLine.get(error.line) || [] - lineErrors.push(error) - errorsByLine.set(error.line, lineErrors) - } - - return { - allErrors: errors, - errorsByLine, - structuralErrors, - bracketErrors, - schemaErrors, } -} - -/** - * Validate JSON5 structure - check for malformed key:value pairs - */ -function validateStructure(textContent: string, lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - // Always run structural validation for strict JSON compliance - // (even if JSON5 parsing succeeds, we want to enforce stricter rules) - let contextStack: string[] = [] // Track nesting context: 'object' or 'array' - let _hasParseError = false - - // Check if JSON5 parsing fails try { JSON5.parse(textContent) - } catch (parseError: any) { - _hasParseError = true - } - - // Analyze line by line for specific issues with context tracking - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim() - const lineNumber = i + 1 - const nextLine = i + 1 < lines.length ? lines[i + 1].trim() : null - - // Skip empty lines and comments - if (!line || line.startsWith("//")) continue - - // Get context BEFORE updating the stack for this line - const currentContext = contextStack[contextStack.length - 1] || "object" - - // Check for malformed key:value patterns (context-aware) - - // Update context stack based on brackets AFTER getting the context - for (const char of line) { - if (char === "{") { - contextStack.push("object") - } else if (char === "[") { - contextStack.push("array") - } else if (char === "}" || char === "]") { - contextStack.pop() - } - } - const malformedResult = isMalformedPropertyInContext(line, currentContext) - if (malformedResult) { - if (typeof malformedResult === "object" && malformedResult.isWarning) { - // Handle warning case - - errors.push({ - id: `structural-warning-${lineNumber}`, - line: lineNumber, - message: malformedResult.message, - type: "syntax", - severity: "warning", - }) - } else { - // Handle error case (boolean true) - - errors.push({ - id: `structural-error-${lineNumber}`, - line: lineNumber, - message: getStructuralErrorMessage(line), - type: "syntax", - severity: "error", - }) + // If parsing succeeds, no errors + return [] + } catch (error: any) { + // console.log(`🔧 [validateWithJSON5] JSON5 parsing failed:`, { + // error: error.message, + // lineNumber: error.lineNumber, + // columnNumber: error.columnNumber, + // }) + + // Extract line number from JSON5 error and map to actual text lines + let lineNumber = 1 + if (error.lineNumber) { + lineNumber = error.lineNumber + } else { + // Fallback: try to extract line number from error message + const lineMatch = error.message.match(/line (\d+)/) + if (lineMatch) { + lineNumber = parseInt(lineMatch[1], 10) } } - // Check for missing comma: property ending followed by another property at the same level - if ( - (isCompleteProperty(line) || isPropertyEnding(line)) && - nextLine && - isPropertyStart(nextLine) && - !line.endsWith(",") && - !line.endsWith("{") && - !line.endsWith("[") - ) { - errors.push({ - id: `comma-error-${lineNumber}`, - line: lineNumber, - message: "Missing comma after property", - type: "syntax", - severity: "error", - }) - } - - // Check for missing comma: array element followed by another array element - if ( - isArrayElement(line) && - nextLine && - isArrayElement(nextLine) && - !line.endsWith(",") && - !line.endsWith("{") && - !line.endsWith("[") - ) { - errors.push({ - id: `comma-error-${lineNumber}`, - line: lineNumber, - message: "Missing comma after array element", - type: "syntax", - severity: "error", - }) - } - } - - return errors -} - -/** - * Detect trailing commas by looking ahead to see if there's another property after a comma - */ -function detectTrailingCommas(lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim() - const lineNumber = i + 1 - - // Check if this line ends with a comma - if (line.endsWith(",")) { - // Look ahead to find the next non-empty, non-comment line - let nextContentLine = "" - let nextLineIndex = i + 1 - - while (nextLineIndex < lines.length) { - const nextLine = lines[nextLineIndex].trim() - if (nextLine && !nextLine.startsWith("//")) { - nextContentLine = nextLine + // console.log(`🔧 [validateWithJSON5] Raw JSON5 line number: ${lineNumber}`) + + // JSON5 line numbers include empty lines, but we need to map to actual text structure + // Let's find the actual line in textContent that corresponds to the JSON5 line + const lines = textContent.split("\n") + let actualErrorLine = lineNumber + + // Verify the line number makes sense with our text content + if (lineNumber > lines.length) { + // JSON5 line number is beyond our text - use last line + actualErrorLine = lines.length + } + + // console.log( + // `🔧 [validateWithJSON5] Mapped to actual line: ${actualErrorLine} (total lines: ${lines.length})`, + // ) + // console.log( + // `🔧 [validateWithJSON5] Line content at ${actualErrorLine}: "${lines[actualErrorLine - 1]?.trim() || ""}"`, + // ) + + // // Debug: Show all lines to understand the structure + // console.log( + // `🔧 [validateWithJSON5] All lines:`, + // lines.map((line, i) => `${i + 1}: "${line.trim()}"`).filter((_, i) => i < 10), + // ) + + // Create a clean, user-friendly error message + let cleanMessage = error.message + + // Transform common JSON5 errors into UX-friendly messages with better context + if (error.message.includes("Unexpected end of JSON input")) { + cleanMessage = "Incomplete JSON structure - missing closing brackets or braces" + } else if (error.message.includes("invalid character")) { + const lines = textContent.split("\n") + + // JSON5 reports error at line where it fails to parse, but the actual problem might be earlier + // Look backwards from the error line to find the actual problematic syntax + let problemLine = actualErrorLine + let problemContent = lines[actualErrorLine - 1]?.trim() || "" + + // Search backwards for lines that match invalid syntax patterns + for (let i = actualErrorLine - 1; i >= 0; i--) { + const lineContent = lines[i]?.trim() || "" + if (lineContent === '""' || lineContent.match(/^"[^"]*"\s*$/)) { + problemLine = i + 1 + problemContent = lineContent break } - nextLineIndex++ } - // If the next content line is a closing brace/bracket, this is a trailing comma - if (nextContentLine.startsWith("}") || nextContentLine.startsWith("]")) { + // console.log( + // `🔧 [validateWithJSON5] Found problem at line ${problemLine}: "${problemContent}"`, + // ) + + // Check if we found a problematic syntax line + if (problemContent === '""' || problemContent.match(/^"[^"]*"\s*$/)) { + cleanMessage = "Invalid property syntax - expected 'key': value format" + // console.log(`🔧 [validateWithJSON5] Detected syntax error on line ${problemLine}`) errors.push({ - id: `trailing-comma-${lineNumber}`, - line: lineNumber, - message: "Invalid JSON syntax - trailing comma not allowed", + id: `json5-syntax-error-${problemLine}`, + line: problemLine, + message: cleanMessage, type: "syntax", severity: "error", }) - } - } - } + return errors + } else { + // Check if this is a missing comma error + // Look for a complete key:value pair followed by another key + // Find the actual previous non-empty line + let prevLineIndex = -1 + let prevLineContent = "" + for (let i = actualErrorLine - 2; i >= 0; i--) { + const lineContent = lines[i]?.trim() || "" + if (lineContent !== "") { + prevLineIndex = i + 1 + prevLineContent = lineContent + break + } + } - return errors -} + // console.log( + // `🔧 [validateWithJSON5] Checking missing comma: prev line ${prevLineIndex}: "${prevLineContent}", current line ${actualErrorLine}: "${problemContent}"`, + // ) + + if (prevLineContent.match(/^"[^"]*":\s*.+$/) && problemContent.match(/^"[^"]*":/)) { + // Previous line has complete key:value, current line starts new key - missing comma + cleanMessage = `Missing comma after property on line ${prevLineIndex}` + // console.log( + // `🔧 [validateWithJSON5] Detected missing comma after line ${prevLineIndex}`, + // ) + // Return single error for the line that should have the comma + errors.push({ + id: `json5-missing-comma-${prevLineIndex}`, + line: prevLineIndex, + message: cleanMessage, + type: "syntax", + severity: "error", + }) + return errors + } + // Look backwards to find unclosed structures + let foundUnclosedArray = false + let foundUnclosedObject = false + let unclosedLine = actualErrorLine + + for (let i = actualErrorLine - 2; i >= 0; i--) { + const line = lines[i].trim() + if (line.includes("[") && !line.includes("]")) { + foundUnclosedArray = true + unclosedLine = i + 1 + break + } else if (line.includes("{") && !line.includes("}")) { + foundUnclosedObject = true + unclosedLine = i + 1 + break + } + } -/** - * Validate a line using JSON5 parser with strategic wrapping - * This replaces the custom tokenizer with a proper parser-based approach - */ -function validateLineWithParser( - line: string, - context: string, -): {valid: boolean; error?: string; warning?: string} { - // Skip empty lines and structural characters - const trimmedLine = line.trim() - if (!trimmedLine || /^[{}\[\],]*$/.test(trimmedLine)) { - return {valid: true} - } + if (foundUnclosedArray) { + cleanMessage = `Unclosed array starting at line ${unclosedLine} - missing closing bracket ']'` - // Special handling for incomplete object/array properties - if (context === "object" && /^"[^"]+"\s*:\s*[{\[]\s*$/.test(trimmedLine)) { - return {valid: true} - } + // Create errors for the entire incomplete array block + const blockErrors: ErrorInfo[] = [] - // Special handling for incomplete array elements that start objects/arrays - if (context === "array" && /^[{\[]\s*$/.test(trimmedLine)) { - return {valid: true} - } + // Start from the unclosed array line + for (let i = unclosedLine - 1; i < actualErrorLine - 1; i++) { + const lineContent = lines[i]?.trim() || "" - // Try different JSON wrapping strategies to validate the line - const testcases = [] - - if (context === "array") { - // For array elements, test as array items first - testcases.push( - {test: `[${trimmedLine}]`, description: "wrapped as array"}, - { - test: `[${trimmedLine.replace(/,\s*$/, "")}]`, - description: "wrapped as array without comma", - }, - {test: trimmedLine, description: "as-is"}, - ) - } else { - // For object context, test as object properties - testcases.push( - // Test as-is (for complete JSON fragments) - {test: trimmedLine, description: "as-is"}, - // Test as object property - {test: `{${trimmedLine}}`, description: "wrapped as object"}, - // Test as property value - {test: `{"key": ${trimmedLine}}`, description: "as property value"}, - // Test with trailing comma removed - {test: `{${trimmedLine.replace(/,\s*$/, "")}}`, description: "without trailing comma"}, - ) - } + if (lines[i] && lineContent !== "") { + blockErrors.push({ + id: `json5-array-block-${unclosedLine}-${i + 1}`, + line: i + 1, + message: cleanMessage, + type: "structural", + severity: "error", + }) + } + } - let lastError = "" + return blockErrors + } else if (foundUnclosedObject) { + cleanMessage = `Unclosed object starting at line ${unclosedLine} - missing closing brace '}'` + + // Create errors for the entire incomplete object block + const blockErrors: ErrorInfo[] = [] + + // Start from the unclosed object line + for (let i = unclosedLine - 1; i < actualErrorLine - 1; i++) { + if (lines[i] && lines[i].trim() !== "") { + blockErrors.push({ + id: `json5-object-block-${unclosedLine}-${i + 1}`, + line: i + 1, + message: cleanMessage, + type: "structural", + severity: "error", + }) + } + } - for (const testcase of testcases) { - try { - // Use native JSON.parse for strict JSON validation - JSON.parse(testcase.test) - - // If we get here, the JSON is valid - // But we need to check for JSON5-specific issues that JSON.parse allows - const validationResult = validateStrictJSON(trimmedLine, context) - if (!validationResult.valid) { - return validationResult + return blockErrors + } else { + cleanMessage = "Invalid JSON syntax - check for missing commas or brackets" + } } - - // If there's a warning, return it - if (validationResult.warning) { - return validationResult + } else if (error.message.includes("Unexpected token")) { + const tokenMatch = error.message.match(/Unexpected token (.+?) in JSON/) + if (tokenMatch) { + const token = tokenMatch[1] + if (token === "}") { + cleanMessage = + "Unexpected closing brace - check for missing comma or incomplete array" + } else if (token === "]") { + cleanMessage = + "Unexpected closing bracket - check for missing comma or incomplete object" + } else { + cleanMessage = `Unexpected character '${token}' - check JSON syntax` + } } - - return {valid: true} - } catch (error: any) { - lastError = error.message - continue + } else if (error.message.includes("Expected")) { + cleanMessage = error.message.replace(/JSON5?/, "JSON") } - } - // If all testcases failed, analyze the error for better messaging - const enhancedError = enhanceErrorMessage(trimmedLine, lastError, context) + errors.push({ + id: `json5-error-${actualErrorLine}`, + line: actualErrorLine, + message: cleanMessage, + type: "structural", + severity: "error", + }) - return {valid: false, error: enhancedError} + return errors + } } /** - * Validate strict JSON compliance (catch JSON5 features that JSON.parse might miss) + * Validates bracket matching and returns bracket errors. + * Uses improved logic from UnclosedBracketPlugin for better error detection. + * @param textContent - The text content to validate + * @returns Array of bracket validation errors */ -function validateStrictJSON( - line: string, - context: string, -): {valid: boolean; error?: string; warning?: string} { - // Check for single quotes (invalid in JSON) - if (line.includes("'")) { - const singleQuoteMatch = line.match(/'([^']*)'/) - if (singleQuoteMatch) { - return { - valid: false, - error: `Invalid single-quoted string '${singleQuoteMatch[1]}' - JSON requires double quotes`, - } - } - } +export function validateBrackets(textContent: string): ErrorInfo[] { + const errors: ErrorInfo[] = [] + const stack: {type: string; line: number; position: number}[] = [] + const lines = textContent.split("\n") - // Check for unquoted keys - const unquotedKeyMatch = line.match(/^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*:/) - if (unquotedKeyMatch) { - return { - valid: false, - error: `Unquoted key "${unquotedKeyMatch[1]}" - keys must be quoted strings`, - } - } + // console.log(`🔧 [validateBrackets] Starting bracket validation:`, { + // textLength: textContent.length, + // lines: lines.length, + // }) - // Check for incomplete object properties (key without value) - if (context === "object" && /^\s*"[^"]*"\s*$/.test(line)) { - return { - valid: false, - error: "Incomplete property - missing colon and value", - } - } + // Process each character to find brackets + for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) { + const line = lines[lineIndex] + const lineNumber = lineIndex + 1 - // Check for trailing commas in objects/arrays - if (/,\s*[}\]]/.test(line)) { - return { - valid: false, - error: "Trailing comma not allowed in JSON", - } - } + for (let charIndex = 0; charIndex < line.length; charIndex++) { + const char = line[charIndex] - // Check for empty string keys (warning) - if (/""\s*:/.test(line)) { - return { - valid: true, - warning: "Empty key name - consider using a meaningful key", - } - } + if (char === "{" || char === "[" || char === "(") { + stack.push({ + type: char, + line: lineNumber, + position: charIndex, + }) + } else if (char === "}" || char === "]" || char === ")") { + const expected = char === "}" ? "{" : char === "]" ? "[" : "(" - // Check for standalone values in object context (invalid) - if (context === "object") { - const trimmed = line.trim() - // Check if it's a standalone value (number, string, boolean) without key:value format - if (/^(\d+|"[^"]*"|true|false|null)\s*,?$/.test(trimmed) && !/"[^"]*"\s*:/.test(trimmed)) { - return { - valid: false, - error: 'Standalone value in object - expected "key": value format', - } - } - } + if (stack.length === 0) { + errors.push({ + id: `unmatched-closing-${lineNumber}-${charIndex}`, + message: `Unmatched closing bracket '${char}'`, + line: lineNumber, + column: charIndex + 1, + type: "bracket", + severity: "error", + }) + } else { + const last = stack.pop()! + if (last.type !== expected) { + stack.push(last) + + const neededClosing = + last.type === "{" ? "}" : last.type === "[" ? "]" : ")" + const lastContext = + last.type === "{" + ? "object" + : last.type === "[" + ? "array" + : "parentheses" + const currentContext = + char === "}" ? "object" : char === "]" ? "array" : "parentheses" - // Check for invalid JSON values - const invalidValues = ["undefined", "NaN", "Infinity", "-Infinity"] - for (const invalidValue of invalidValues) { - if (new RegExp(`\\b${invalidValue}\\b`).test(line)) { - return { - valid: false, - error: `Invalid JSON value "${invalidValue}" - not supported in JSON`, + errors.push({ + id: `mismatched-bracket-${lineNumber}-${charIndex}`, + message: `Mismatched bracket: expected '${neededClosing}' to close ${lastContext} from line ${last.line}, but found '${char}' (${currentContext} closing)`, + line: lineNumber, + column: charIndex + 1, + type: "bracket", + severity: "error", + }) + } + } } } } - return {valid: true} -} + // Check for unclosed brackets and create block-level errors + // console.log(`🔍 [validateBrackets] Unclosed brackets in stack:`, { + // stackSize: stack.length, + // unclosedBrackets: stack.map((item) => `${item.type} at line ${item.line}`), + // }) -/** - * Enhance error messages to be more user-friendly and specific - */ -function enhanceErrorMessage(line: string, originalError: string, context: string): string { - // Common error patterns and their enhanced messages - if (originalError.includes("Unexpected token")) { - if (line.includes("'")) { - return "Invalid single quotes - JSON requires double quotes for strings" - } - if (/^"[^"]*"\s*:/.test(line)) { - return "Unquoted key detected - keys must be quoted strings in JSON" - } - if (line.includes("undefined")) { - return 'Invalid value "undefined" - use null or a quoted string instead' - } - } + for (const unclosed of stack) { + const closingChar = unclosed.type === "{" ? "}" : unclosed.type === "[" ? "]" : ")" + const contextType = + unclosed.type === "{" ? "object" : unclosed.type === "[" ? "array" : "parentheses" - if (originalError.includes("Unexpected end")) { - return "Incomplete JSON syntax - missing closing quote, bracket, or brace" - } + // console.log(`⚠️ [validateBrackets] Found unclosed bracket:`, { + // type: unclosed.type, + // line: unclosed.line, + // expectedClosing: closingChar, + // context: contextType, + // }) - if (originalError.includes("Expected")) { - if (context === "object") { - return 'Invalid object property syntax - expected "key": value format' + // Create more specific error messages based on bracket type + let message: string + if (unclosed.type === "[") { + message = `Missing closing bracket ']' for array started on line ${unclosed.line}` + } else if (unclosed.type === "{") { + message = `Missing closing bracket '}' for object started on line ${unclosed.line}` } else { - return "Invalid array element syntax" + message = `Missing closing bracket '${closingChar}' for '${unclosed.type}' started on line ${unclosed.line}` } - } - // Return a cleaned up version of the original error - return originalError - .replace(/^SyntaxError: /, "") - .replace(/in JSON at position \d+/, "") - .replace(/^\s+/, "") // Remove leading whitespace - .trim() -} + // Create smart block-level errors for better highlighting + // For arrays and objects, highlight only the logical unclosed block + if (unclosed.type === "[" || unclosed.type === "{") { + const startLine = unclosed.line -/** - * Check if a line contains a malformed property (using parser-based validation) - */ -function isMalformedPropertyInContext( - line: string, - context: string, -): boolean | {isWarning: true; message: string} { - // Use the new parser-based validation - const result = validateLineWithParser(line, context) - - if (!result.valid) { - return true - } + // Find the logical end of this block by looking for the next sibling property + // or the next closing bracket at the same nesting level + let endLine = startLine + let nestingLevel = 1 // Start at 1 since we're inside the opening bracket + let foundLogicalEnd = false - if (result.warning) { - return {isWarning: true, message: result.warning} - } - - return false -} - -/** - * Check if a line contains a malformed property (legacy - kept for compatibility) - */ -function _isMalformedProperty(line: string): boolean { - // Skip structural characters - if (line.match(/^[{}\[\],]*$/)) return false - - // Pattern 1: Missing comma (property followed by another property) - if (line.match(/^"[^"]*":\s*"[^"]*"$/) || line.match(/^"[^"]*":\s*\d+$/)) { - // This looks like a complete property, check if it needs a comma - // (This will be handled by comma detection logic) - return false - } + for (let lineIndex = startLine; lineIndex < lines.length; lineIndex++) { + const currentLine = lines[lineIndex].trim() + const currentLineNum = lineIndex + 1 - // Pattern 2: Incomplete property - just a key without value - if (line.match(/^"[^"]*"$/)) { - return true - } - - // Pattern 3: Bare identifier (unquoted key) - if (line.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) { - return true - } - - // Pattern 4: Key with colon but no value (like "a":) - if (line.match(/^"[^"]*":\s*$/)) { - return true - } - - // Pattern 5: Key with empty value - if (line.match(/^"[^"]*":\s*""$/)) { - return true - } - - // Pattern 6: Key without colon or value - if (line.match(/^"[^"]*"\s*$/)) { - return true - } - - // Pattern 7: Standalone value at object level (not a property) - // This catches cases like "4", "4,", "hello", "hello," that appear outside arrays - if (line.match(/^\s*(\d+|"[^"]*"|true|false|null)\s*,?\s*$/)) { - return true - } - - return false -} - -/** - * Get appropriate error message for structural issues - */ -function getStructuralErrorMessage(line: string): string { - if (line.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) { - return "Invalid JSON syntax - keys must be quoted" - } - if (line.match(/^[a-zA-Z_][a-zA-Z0-9_]*\s*:\s*.+$/)) { - return "Invalid JSON syntax - keys must be quoted" - } - if (line.match(/^[a-zA-Z_][a-zA-Z0-9_]*\s*:\s*$/)) { - return "Invalid JSON syntax - keys must be quoted" - } - if (line.match(/^\d+\s*:.*$/)) { - return "Invalid JSON syntax - keys must be quoted" - } - if (line.match(/^"[^"]*":\s*$/)) { - return "Incomplete property - missing value after colon" - } - if (line.match(/^"[^"]*":\s*""$/)) { - return "Property has empty value - provide a valid value" - } - if (line.match(/^"[^"]*"$/)) { - return "Incomplete property - missing value" - } - if (line.match(/^\s*(\d+|"[^"]*"|true|false|null)\s*,?\s*$/)) { - return "Unexpected value - values must be part of a property or array" - } - if (line.match(/^\s*,\s*$/) || line.match(/^\s*[}\]]\s*,\s*$/)) { - return "Invalid JSON syntax - trailing comma not allowed" - } - return "Invalid JSON syntax - check property format" -} - -/** - * Check if a line contains a complete property (key: value) - */ -function isCompleteProperty(line: string): boolean { - // Match patterns like "key": "value", "key": 123, "key": true, etc. - return /^"[^"]*":\s*(.+)$/.test(line) -} - -/** - * Check if a line starts a new property (begins with a quoted key) - */ -function isPropertyStart(line: string): boolean { - return /^"[^"]*"/.test(line) -} - -/** - * Check if a line ends a property (closing bracket/brace from multi-line structure) - */ -function isPropertyEnding(line: string): boolean { - // Match lines that are just closing brackets/braces (possibly with whitespace) - return /^\s*[}\]]\s*$/.test(line) -} + // Skip the opening line itself + if (currentLineNum === startLine) { + endLine = currentLineNum + continue + } -/** - * Check if a line contains an array element (number, string, boolean, etc.) - */ -function isArrayElement(line: string): boolean { - // Match lines that contain array elements: numbers, strings, booleans, null - // But exclude lines that start object properties or are just brackets - const trimmed = line.trim() - if (!trimmed || trimmed.startsWith("//")) return false - if (/^[{}\[\]]$/.test(trimmed)) return false // Just brackets - if (/^"[^"]*"\s*:/.test(trimmed)) return false // Object property - - // Match common array element patterns - return /^\s*(\d+|"[^"]*"|true|false|null|\{|\[)/.test(line) -} + // Count nesting level changes + for (const char of currentLine) { + if (char === unclosed.type) { + nestingLevel++ + } else if ( + (unclosed.type === "[" && char === "]") || + (unclosed.type === "{" && char === "}") + ) { + nestingLevel-- + if (nestingLevel === 0) { + // Found the closing bracket for this block + foundLogicalEnd = true + endLine = currentLineNum + break + } + } + } -/** - * Validate bracket/brace matching - highlight entire unclosed block spans - */ -function validateBrackets(textContent: string, lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - const stack: {char: string; line: number}[] = [] - const openBrackets = ["{", "["] as const - const closeBrackets = ["}", "]"] as const - const pairs: Record = {"{": "}", "[": "]"} - - for (let i = 0; i < lines.length; i++) { - const line = lines[i] - const lineNumber = i + 1 - - for (const char of line) { - if (openBrackets.includes(char as "{" | "[")) { - stack.push({char, line: lineNumber}) - } else if (closeBrackets.includes(char as "}" | "]")) { - if (stack.length === 0) { - errors.push({ - id: `bracket-error-${lineNumber}`, - line: lineNumber, - message: `Unexpected closing ${char}`, - type: "bracket", - severity: "error", - }) - } else { - const last = stack.pop()! - const expectedChar = pairs[last.char] - if (expectedChar && expectedChar !== char) { - // Check if this closing bracket has a matching opening bracket in the stack - const hasMatchingOpen = stack.some((item) => pairs[item.char] === char) - - if (hasMatchingOpen) { - // This is a mismatch - push the bracket back for unclosed detection - stack.push(last) - } else { - // This is an unexpected closing bracket - don't add individual errors - // as they'll be covered by unclosed block highlighting - // errors.push({ - // id: `bracket-error-${lineNumber}`, - // line: lineNumber, - // message: `Unexpected closing ${char}`, - // type: "bracket", - // severity: "error", - // }) - stack.push(last) + if (foundLogicalEnd) break + + // If we're back at nesting level 1 and see a property, this is the logical end + if (nestingLevel === 1 && currentLineNum > startLine) { + const propertyMatch = currentLine.match(/^"[^"]*"\s*:/) + // console.log(`🔍 [validateBrackets] Line ${currentLineNum} check:`, { + // line: currentLine, + // nestingLevel, + // propertyMatch: !!propertyMatch, + // shouldEnd: !!propertyMatch, + // }) + if (propertyMatch) { + // Found next property at same level - end the block before this line + // But exclude trailing empty lines + let actualEndLine = currentLineNum - 1 + while ( + actualEndLine > startLine && + lines[actualEndLine - 1].trim() === "" + ) { + actualEndLine-- } + endLine = actualEndLine + foundLogicalEnd = true + // console.log( + // `🎯 [validateBrackets] Found logical end at line ${currentLineNum}, ending block at ${endLine} (excluding empty lines)`, + // ) + break } } + + endLine = currentLineNum + } + + // Limit the block size to avoid overwhelming errors + const maxBlockSize = 10 + if (endLine - startLine > maxBlockSize) { + endLine = startLine + maxBlockSize } - } - } - // Handle unclosed brackets - only highlight the innermost unclosed block - if (stack.length > 0) { - // Only report the last (innermost) unclosed bracket - const unclosed = stack[stack.length - 1] + // console.log(`🎯 [validateBrackets] Smart block detection for ${unclosed.type}:`, { + // startLine, + // endLine, + // blockSize: endLine - startLine + 1, + // foundLogicalEnd, + // }) - const startLine = unclosed.line - const endLine = findBlockEnd(lines, startLine - 1, unclosed.char) + // Create targeted errors: opening line + logical end line only + // This reduces noise while still highlighting the unclosed block - // Highlight only the lines that belong to the innermost unclosed block - for (let lineNum = startLine; lineNum <= endLine; lineNum++) { + // Always create error for the opening bracket line errors.push({ - id: `unclosed-block-${lineNum}`, - line: lineNum, - message: `Unclosed ${unclosed.char} block started on line ${startLine}`, + id: `unclosed-block-${unclosed.line}-start`, + message: `${message} (opening ${contextType})`, + line: startLine, + column: unclosed.position + 1, + type: "bracket", + severity: "error", + }) + + // Create error for the logical end line if it's different from start + if (endLine > startLine && lines[endLine - 1] && lines[endLine - 1].trim() !== "") { + errors.push({ + id: `unclosed-block-${unclosed.line}-end`, + message: `${message} (last content of unclosed ${contextType})`, + line: endLine, + column: 1, + type: "bracket", + severity: "error", + }) + } + } else { + // For parentheses, just highlight the opening line + errors.push({ + id: `unclosed-bracket-${unclosed.line}-${unclosed.position}`, + message, + line: unclosed.line, + column: unclosed.position + 1, type: "bracket", severity: "error", }) } } + // console.log(`🔧 [validateBrackets] Bracket validation complete:`, { + // totalErrors: errors.length, + // errorTypes: errors.map((e) => `${e.type}:${e.line}:${e.message.substring(0, 30)}`), + // }) + return errors } /** - * Detect YAML-specific syntax errors + * Validates content against a JSON schema and returns schema errors. + * @param textContent - The text content to validate + * @param schema - The JSON schema to validate against (optional) + * @returns Array of schema validation errors */ -function detectYAMLSyntaxErrors(textContent: string, lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - +export function validateSchema(textContent: string, schema?: any): ErrorInfo[] { try { - // Try to parse with js-yaml to get detailed error information - yaml.load(textContent) - } catch (yamlError: any) { - // Extract line number from YAML error if available - let lineNumber = 1 - if (yamlError.mark && yamlError.mark.line !== undefined) { - lineNumber = yamlError.mark.line + 1 // js-yaml uses 0-based line numbers - } + // console.log(`🔍 [validateSchema] Schema validation called:`, { + // hasSchema: !!schema, + // schemaType: schema?.type, + // schemaRequired: schema?.required, + // textLength: textContent.length, + // }) - // Create a more user-friendly error message - let message = "Invalid YAML syntax" - if (yamlError.message) { - // Clean up the error message to be more user-friendly - message = yamlError.message - .replace(/at line \d+, column \d+:/, "") // Remove position info since we show it separately - .replace(/^\s+/, "") // Remove leading whitespace - .trim() - - // Make the message more user-friendly - if (message.includes("duplicated mapping key")) { - message = "Duplicate key found - YAML keys must be unique" - } else if (message.includes("bad indentation")) { - message = "Incorrect indentation - YAML requires consistent spacing" - } else if (message.includes("expected")) { - message = "Invalid YAML structure - check syntax and indentation" - } + // Skip schema validation if no schema provided or if JSON is invalid + if (!schema) { + // console.log(`⚠️ [validateSchema] No schema provided, skipping validation`) + return [] } - errors.push({ - id: `yaml-syntax-error-${lineNumber}`, - line: lineNumber, - message, - type: "syntax", - severity: "error", - }) - } + let parsedContent: any - return errors -} - -/** - * Detect unclosed strings in JSON content - */ -function detectUnclosedStrings(lines: string[]): ErrorInfo[] { - const errors: ErrorInfo[] = [] - - for (let i = 0; i < lines.length; i++) { - const line = lines[i] - const lineNumber = i + 1 - - // Check for unclosed string (improved detection) - if (line.includes('"')) { - // Count unescaped quotes - let quoteCount = 0 - let j = 0 + try { + // First try to parse the original JSON + const parsedContent = JSON5.parse(textContent) + // console.log(`🧪 [validateSchema] Parsed JSON successfully:`, parsedContent) + return validateParsedContent(parsedContent, schema, textContent) + } catch (originalError: any) { + // console.log(`🔧 [validateSchema] Original JSON parse failed, trying completion:`, { + // error: originalError.message, + // textPreview: textContent.substring(0, 100), + // }) + + // Try to complete the JSON for schema validation + try { + let completedJson = textContent.trim() + // console.log(`🔧 [validateSchema] Starting completion with:`, { + // original: completedJson.substring(0, 100), + // }) + + // console.log(`🔧 [validateSchema] Before completion:`, { + // text: completedJson + // .substring(0, 100) + // .replace(/\n/g, "\\n") + // .replace(/\t/g, "\\t"), + // }) + + // 1. Fix incomplete keys (including empty strings) like "" or "key" -> "key": "placeholder" + completedJson = completedJson.replace( + /"([^"]*)"\s*(?=\n\s*")/g, + '"$1": "placeholder"', + ) + + // 2. Fix incomplete key:value pairs like "key": -> "key": "placeholder" + completedJson = completedJson.replace( + /"([^"]+)":\s*(?=\n|$)/g, + '"$1": "placeholder"', + ) + + // 3. Fix missing commas: "value" (newline) "key" -> "value", (newline) "key" + // Also handle arrays and objects: ] (newline) "key" -> ], (newline) "key" + completedJson = completedJson.replace( + /("[^"]*"|\d+|true|false|null|\]|\})\s*\n\s*(?=")/g, + "$1,\n\t", + ) + + // Count and balance braces/brackets + const openBraces = (completedJson.match(/{/g) || []).length + const closeBraces = (completedJson.match(/}/g) || []).length + const openBrackets = (completedJson.match(/\[/g) || []).length + const closeBrackets = (completedJson.match(/\]/g) || []).length + + // Add missing closing braces + for (let i = 0; i < openBraces - closeBraces; i++) { + completedJson += "}" + } - while (j < line.length) { - if (line[j] === '"' && (j === 0 || line[j - 1] !== "\\")) { - quoteCount++ + // Add missing closing brackets + for (let i = 0; i < openBrackets - closeBrackets; i++) { + completedJson += "]" } - j++ - } - // If we have an odd number of quotes, string is unclosed - if (quoteCount % 2 === 1) { - errors.push({ - id: `unclosed-string-${lineNumber}`, - line: lineNumber, - message: "Unclosed string - missing closing quote", - type: "syntax", - severity: "error", - }) + // console.log(`🔧 [validateSchema] After completion:`, { + // original: textContent.substring(0, 50), + // completed: completedJson.substring(0, 50), + // changes: completedJson !== textContent.trim(), + // }) + + parsedContent = JSON5.parse(completedJson) + // console.log(`🔧 [validateSchema] Parsed completed JSON for schema validation:`, { + // original: textContent.substring(0, 50), + // completed: completedJson.substring(0, 50), + // }) + } catch (completionError) { + // If even completion fails, skip schema validation + // console.log( + // `⚠️ [validateSchema] Could not parse JSON for schema validation, skipping`, + // ) + return [] } } - } - return errors + return validateParsedContent(parsedContent, schema, textContent) + } catch (error) { + console.error(`🚨 [validateSchema] Unexpected error:`, error) + return [] + } } -/** - * Validate against JSON/YAML schema - */ -function validateSchema( - textContent: string, - schema: any, - lines: string[], - language: CodeLanguage = "json", -): ErrorInfo[] { +function validateParsedContent(parsedContent: any, schema: any, textContent: string): ErrorInfo[] { const errors: ErrorInfo[] = [] - if (language === "code") { - return errors - } + // console.log(`🧪 [validateSchema] Ready for schema validation:`, { + // contentType: typeof parsedContent, + // schemaType: schema.type, + // isObject: typeof parsedContent === "object", + // }) - try { - // For schema validation, we'll use a simple approach: - // Always check for missing required properties regardless of JSON validity - - // Check for missing required properties - must be at root level - if (schema.required) { - try { - let parsedContent: any - if (language === "json") { - parsedContent = JSON5.parse(textContent) - } else { - parsedContent = yaml.load(textContent) - } - for (const requiredProp of schema.required) { - // Check if the required property exists at the root level - if (!(requiredProp in parsedContent)) { - errors.push({ - id: `schema-missing-${requiredProp}`, - line: 1, // Always highlight the opening brace - message: `Missing required property: "${requiredProp}"`, - type: "schema", - severity: "error", - }) - } else { - } - } - } catch (parseError) { - // When content is malformed, fall back to text-based validation - // This checks if the property exists anywhere in the text (less precise but more forgiving) - for (const requiredProp of schema.required) { - let propRegex: RegExp - if (language === "json") { - propRegex = new RegExp(`"${requiredProp}"\\s*:`, "i") - } else { - // YAML can use both quoted and unquoted keys - propRegex = new RegExp(`(^|\\s)${requiredProp}\\s*:`, "im") - } + // Basic schema validation (can be enhanced with a proper JSON schema validator) + if (schema.type === "object" && typeof parsedContent !== "object") { + // console.log(`❌ [validateSchema] Type mismatch detected`) + errors.push({ + id: "schema-type-mismatch", + message: `Expected object but got ${typeof parsedContent}`, + line: 1, + type: "schema", + severity: "error", + }) + } - if (!propRegex.test(textContent)) { - errors.push({ - id: `schema-missing-${requiredProp}`, - line: 1, - message: `Missing required property: "${requiredProp}"`, - type: "schema", - severity: "error", - }) - } else { - } - } + // Check for missing required properties + if (schema.required && Array.isArray(schema.required)) { + // console.log(`🔍 [validateSchema] Checking required properties:`, schema.required) + for (const requiredProp of schema.required) { + if (!(requiredProp in parsedContent)) { + // console.log(`❌ [validateSchema] Missing required property: ${requiredProp}`) + errors.push({ + id: `schema-missing-${requiredProp}`, + message: `Missing required property: "${requiredProp}"`, + line: 1, // Could be improved to find the best insertion point + type: "schema", + severity: "warning", // Use warning instead of error to be less intrusive + }) } } + } - // Check for wrong value types by trying to parse the content - try { - let parsedContent: any - if (language === "json") { - parsedContent = JSON5.parse(textContent) - } else { - parsedContent = yaml.load(textContent) - } + // Check property types + if (schema.properties && typeof schema.properties === "object") { + for (const [propName, propSchema] of Object.entries(schema.properties)) { + if (propName in parsedContent) { + const propValue = parsedContent[propName] + const propType = typeof propValue + const expectedType = (propSchema as any)?.type - if (schema.properties) { - for (const [propName, propSchema] of Object.entries(schema.properties)) { - if (propName in parsedContent) { - const actualValue = parsedContent[propName] - const actualType = Array.isArray(actualValue) ? "array" : typeof actualValue - - // Handle different schema formats - let expectedTypes: string[] = [] - let isValidType = false - - if ((propSchema as any).type) { - // Direct type specification - expectedTypes = [(propSchema as any).type] - isValidType = expectedTypes.includes(actualType) - } else if ((propSchema as any).anyOf) { - // anyOf specification - check if actualType matches any of the allowed types - expectedTypes = (propSchema as any).anyOf - .filter((item: any) => item.type) - .map((item: any) => item.type) - isValidType = expectedTypes.includes(actualType) - } + if (expectedType && propType !== expectedType) { + // Find the actual line number of this property in the text + const lines = textContent.split("\n") + let propertyLine = 1 - if (expectedTypes.length > 0 && !isValidType) { - const propertyLine = findPropertyLine(lines, propName, language) - const expectedTypesStr = - expectedTypes.length === 1 - ? expectedTypes[0] - : expectedTypes.join(" or ") - errors.push({ - id: `schema-type-${propName}`, - line: propertyLine > 0 ? propertyLine : 1, - message: `Property "${propName}" has wrong type: expected ${expectedTypesStr}, got ${actualType}`, - type: "schema", - severity: "error", - }) + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + // Look for the property name in quotes + if (line.includes(`"${propName}"`)) { + propertyLine = i + 1 + break } } + + // console.log(`❌ [validateSchema] Type mismatch for property "${propName}":`, { + // expected: expectedType, + // actual: propType, + // value: propValue, + // foundOnLine: propertyLine, + // }) + + errors.push({ + id: `schema-type-${propName}`, + message: `Property "${propName}" should be ${expectedType} but got ${propType}`, + line: propertyLine, + type: "schema", + severity: "error", + }) } } - } catch (parseError) { - // Skip type validation if content is malformed } - - return errors - } catch (error) { - console.error("Schema validation error:", error) - return [] } + + // Additional schema validation logic can be added here + + return errors } /** - * Find the line number where a property is defined + * Combines all validation functions and returns a unified error result. + * @param textContent - The text content to validate + * @param schema - Optional JSON schema for validation + * @returns Combined validation results */ -function findPropertyLine( - lines: string[], - propertyName: string, - language: CodeLanguage = "json", -): number { - for (let i = 0; i < lines.length; i++) { - const line = lines[i] - if (language === "json") { - // JSON uses quoted property names - if (line.includes(`"${propertyName}"`)) { - return i + 1 - } - } else if (language === "yaml") { - // YAML can use both quoted and unquoted property names - if (line.includes(`"${propertyName}"`) || line.includes(`${propertyName}:`)) { - return i + 1 - } - } +export function validateAll( + textContent: string, + schema?: any, + editedLineContent?: string, + cleanedToOriginalLineMap?: Map, +): { + allErrors: ErrorInfo[] + errorsByLine: Map + structuralErrors: ErrorInfo[] + bracketErrors: ErrorInfo[] + schemaErrors: ErrorInfo[] +} { + // console.log(`🚀 [validateAll] Starting validation with:`, { + // textLength: textContent.length, + // hasSchema: !!schema, + // }) + + // Use JSON5 for clean, UX-focused validation instead of complex bracket tracking + // Only skip structural validation during active typing, not schema validation + const json5Errors = validateWithJSON5(textContent, editedLineContent) + // console.log(`📊 [validateAll] JSON5 errors:`, json5Errors.length) + + // Schema validation always runs - it's independent of typing state + const schemaErrors = validateSchema(textContent, schema) + // console.log(`📊 [validateAll] Schema errors:`, schemaErrors.length) + + // Convert cleaned line numbers to original line numbers if mapping is provided + const convertLineNumbers = (errors: ErrorInfo[]): ErrorInfo[] => { + if (!cleanedToOriginalLineMap) return errors + + return errors.map((error) => { + const originalLineNumber = cleanedToOriginalLineMap.get(error.line) || error.line + // console.log(`🔄 [validateAll] Converting line ${error.line} → ${originalLineNumber}`) + return {...error, line: originalLineNumber} + }) } - return 0 -} -/** - * Find the end line of an unclosed block by looking for the next property at the same level - */ -function findBlockEnd(lines: string[], startIndex: number, openChar: string): number { - let depth = 1 - const closeChar = openChar === "{" ? "}" : "]" - - for (let i = startIndex + 1; i < lines.length; i++) { - const line = lines[i] - - // Count nested brackets to track depth - for (const char of line) { - if (char === openChar) { - depth++ - } else if (char === closeChar) { - depth-- - if (depth === 0) { - // Found the matching closing bracket - return i + 1 - } - } - } + const convertedJson5Errors = convertLineNumbers(json5Errors) + const convertedSchemaErrors = convertLineNumbers(schemaErrors) - // If we encounter a property at the same level as the unclosed block, - // that's where the block should have ended - if (depth === 1 && /^\s*"[^"]*"\s*:/.test(line)) { - return i // End just before the next property - } + // For backward compatibility, map JSON5 errors to expected structure + const structuralErrors = convertedJson5Errors + const bracketErrors: ErrorInfo[] = [] // No longer needed with JSON5 - // If we encounter a closing brace at depth 1 (same level as unclosed block), - // the unclosed block should end at the last non-empty line before this - if (depth === 1 && line.trim() === "}") { - // Find the last non-empty line before this closing brace - for (let j = i - 1; j >= startIndex; j--) { - if (lines[j].trim() !== "") { - return j + 1 - } - } - return i + const allErrors = [...structuralErrors, ...bracketErrors, ...convertedSchemaErrors] + const errorsByLine = new Map() + + // Group errors by line number + for (const error of allErrors) { + if (error.line) { + const lineErrors = errorsByLine.get(error.line) || [] + lineErrors.push(error) + errorsByLine.set(error.line, lineErrors) } } - // If no clear end found, highlight to the end of content - return lines.length + return { + allErrors, + errorsByLine, + structuralErrors, + bracketErrors, + schemaErrors: convertedSchemaErrors, + } } diff --git a/web/oss/src/components/Editor/plugins/index.tsx b/web/oss/src/components/Editor/plugins/index.tsx index 1bd7fd013c..cdf52007b9 100644 --- a/web/oss/src/components/Editor/plugins/index.tsx +++ b/web/oss/src/components/Editor/plugins/index.tsx @@ -8,11 +8,8 @@ import {OnChangePlugin} from "@lexical/react/LexicalOnChangePlugin" import {RichTextPlugin} from "@lexical/react/LexicalRichTextPlugin" import {Skeleton} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" -import {markdownViewAtom} from "../state/assets/atoms" import type {EditorPluginsProps} from "../types" - import MarkdownPlugin from "./markdown/markdownPlugin" const CodeFoldingPlugin = lazy(() => @@ -59,7 +56,6 @@ const TokenTypeaheadPlugin = lazy(() => ) const EditorPlugins = ({ - id, showToolbar, singleLine, codeOnly, @@ -72,11 +68,8 @@ const EditorPlugins = ({ initialValue, validationSchema, tokens, - templateFormat, additionalCodePlugins = [], }: EditorPluginsProps) => { - const markdown = useAtomValue(markdownViewAtom(id)) - return ( } placeholder={ -
    +
    {placeholder}
    } @@ -113,7 +101,7 @@ const EditorPlugins = ({ {showToolbar && !singleLine && !codeOnly && } {enableTokens && ( <> - + @@ -123,7 +111,6 @@ const EditorPlugins = ({ <> )} {debug && } - {singleLine || codeOnly ? null : } + {singleLine || codeOnly ? null : } ) } diff --git a/web/oss/src/components/Editor/plugins/markdown/assets/transformers.ts b/web/oss/src/components/Editor/plugins/markdown/assets/transformers.ts index a9c4a7f2a4..9d1712a7d8 100644 --- a/web/oss/src/components/Editor/plugins/markdown/assets/transformers.ts +++ b/web/oss/src/components/Editor/plugins/markdown/assets/transformers.ts @@ -8,7 +8,6 @@ import { ElementTransformer, $convertFromMarkdownString, } from "@lexical/markdown" -import {$convertToMarkdownString as originalConvert} from "@lexical/markdown" import { $createHorizontalRuleNode, $isHorizontalRuleNode, @@ -27,6 +26,7 @@ import { TableRowNode, } from "@lexical/table" import {$isParagraphNode, $isTextNode, LexicalNode} from "lexical" +import {$convertToMarkdownString as originalConvert} from "@lexical/markdown" export function $convertToMarkdownStringCustom( transformers: Transformer[], @@ -206,7 +206,7 @@ const $createTableCell = (textContent: string): TableCellNode => { return cell } -const mapToTableCells = (textContent: string): TableCellNode[] | null => { +const mapToTableCells = (textContent: string): Array | null => { const match = textContent.match(TABLE_ROW_REG_EXP) if (!match || !match[1]) { return null @@ -214,7 +214,7 @@ const mapToTableCells = (textContent: string): TableCellNode[] | null => { return match[1].split("|").map((text) => $createTableCell(text)) } -export const PLAYGROUND_TRANSFORMERS: Transformer[] = [ +export const PLAYGROUND_TRANSFORMERS: Array = [ HR, TABLE, CHECK_LIST, diff --git a/web/oss/src/components/Editor/plugins/markdown/markdownPlugin.tsx b/web/oss/src/components/Editor/plugins/markdown/markdownPlugin.tsx index be97f0d3f8..1c217b9a2a 100644 --- a/web/oss/src/components/Editor/plugins/markdown/markdownPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/markdown/markdownPlugin.tsx @@ -1,20 +1,7 @@ -import {useEffect, useCallback} from "react" -import * as React from "react" -import type {JSX} from "react" - -import {$createCodeNode, $isCodeNode} from "@lexical/code" -import {$convertFromMarkdownString} from "@lexical/markdown" -import {AutoLinkPlugin, createLinkMatcherWithRegExp} from "@lexical/react/LexicalAutoLinkPlugin" -import {CheckListPlugin} from "@lexical/react/LexicalCheckListPlugin" -import {ClickableLinkPlugin} from "@lexical/react/LexicalClickableLinkPlugin" import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" -import {HorizontalRulePlugin} from "@lexical/react/LexicalHorizontalRulePlugin" -import {LinkPlugin} from "@lexical/react/LexicalLinkPlugin" -import {ListPlugin} from "@lexical/react/LexicalListPlugin" import {MarkdownShortcutPlugin} from "@lexical/react/LexicalMarkdownShortcutPlugin" -import {TabIndentationPlugin} from "@lexical/react/LexicalTabIndentationPlugin" -import {TablePlugin} from "@lexical/react/LexicalTablePlugin" -import {useAtom} from "jotai" +import {$convertToMarkdownStringCustom, PLAYGROUND_TRANSFORMERS} from "./assets/transformers" +import {useEffect, useCallback} from "react" import { $getRoot, $createTextNode, @@ -23,62 +10,14 @@ import { $isRangeSelection, COMMAND_PRIORITY_HIGH, } from "lexical" - +import {$createCodeNode, $isCodeNode} from "@lexical/code" +import {$convertFromMarkdownString} from "@lexical/markdown" import {markdownViewAtom} from "@/oss/components/Editor/state/assets/atoms" - -import {$convertToMarkdownStringCustom, PLAYGROUND_TRANSFORMERS} from "./assets/transformers" +import {useAtom} from "jotai" import {TOGGLE_MARKDOWN_VIEW} from "./commands" -const URL_REGEX = - /((https?:\/\/(www\.)?)|(www\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)(?()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/ - -const MATCHERS = [ - createLinkMatcherWithRegExp(URL_REGEX, (text) => { - return text.startsWith("http") ? text : `https://${text}` - }), - createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => { - return `mailto:${text}` - }), -] - -function LexicalAutoLinkPlugin(): JSX.Element { - return -} - -interface Props { - hasLinkAttributes?: boolean -} - -const urlRegExp = new RegExp( - /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/, -) -export function validateUrl(url: string): boolean { - // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://. - // Maybe show a dialog where they user can type the URL before inserting it. - return url === "https://" || urlRegExp.test(url) -} - -function LexicalLinkPlugin({hasLinkAttributes = false}: Props): JSX.Element { - return ( - - ) -} - -const MarkdownPlugin = ({id}: {id: string}) => { - const [, setMarkdownView] = useAtom(markdownViewAtom(id)) +const markdownPlugin = () => { + const [, setMarkdownView] = useAtom(markdownViewAtom) const [editor] = useLexicalComposerContext() const handleMarkdownToggle = useCallback(() => { @@ -102,7 +41,11 @@ const MarkdownPlugin = ({id}: {id: string}) => { const codeNode = $createCodeNode("markdown") codeNode.append($createTextNode(markdown)) root.clear().append(codeNode) - codeNode.selectStart() + if (markdown.length === 0) { + codeNode.select() + } else { + codeNode.selectEnd() + } setMarkdownView(true) } }) @@ -169,19 +112,7 @@ const MarkdownPlugin = ({id}: {id: string}) => { }) }, [editor]) - return ( - <> - - - - - - - - - - - ) + return } -export default MarkdownPlugin +export default markdownPlugin diff --git a/web/oss/src/components/Editor/plugins/token/AutoCloseTokenBracesPlugin.tsx b/web/oss/src/components/Editor/plugins/token/AutoCloseTokenBracesPlugin.tsx index 85c4262b49..184c8df310 100644 --- a/web/oss/src/components/Editor/plugins/token/AutoCloseTokenBracesPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/token/AutoCloseTokenBracesPlugin.tsx @@ -1,5 +1,4 @@ import {useEffect} from "react" - import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" import { $getSelection, @@ -12,10 +11,9 @@ import { $createTextNode, $isElementNode, } from "lexical" - -import {navigateCursor} from "./assets/selectionUtils" -import {$isTokenInputNode} from "./TokenInputNode" import {$isTokenNode} from "./TokenNode" +import {$isTokenInputNode} from "./TokenInputNode" +import {navigateCursor} from "./assets/selectionUtils" /** * Plugin that auto inserts and removes curly brace pairs. diff --git a/web/oss/src/components/Editor/plugins/token/TokenNode.ts b/web/oss/src/components/Editor/plugins/token/TokenNode.ts index 94083cee6f..50c42f318e 100644 --- a/web/oss/src/components/Editor/plugins/token/TokenNode.ts +++ b/web/oss/src/components/Editor/plugins/token/TokenNode.ts @@ -21,23 +21,11 @@ export class TokenNode extends TextNode { createDOM(): HTMLElement { const dom = document.createElement("span") dom.classList.add("token-node") - const text = this.__text - dom.textContent = text - // Base styles + dom.textContent = this.__text + dom.style.backgroundColor = "#e2e8f0" + dom.style.color = "#1677FF" dom.style.padding = "0 4px" dom.style.borderRadius = "4px" - dom.style.backgroundColor = "#e2e8f0" - // Color by token type - if (text.startsWith("{#")) { - // Jinja comment -> grey - dom.style.color = "#6b7280" // gray-500 - } else if (text.startsWith("{%")) { - // Jinja block -> distinct color (purple) - dom.style.color = "#a855f7" // purple-500 - } else { - // Default variable token {{ }} - dom.style.color = "#1677FF" - } return dom } @@ -69,10 +57,7 @@ export class TokenNode extends TextNode { // Convert to regular text node if no longer valid token isValid(): boolean { - // Accept curly tokens and Jinja2 block/comment/variable tokens - return /^(\{\{[\s\S]*?\}\}|\{%-?[\s\S]*?-?%\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\})$/.test( - this.__text, - ) + return /^\{\{[^{}]*\}\}$/.test(this.__text) } remove(): void { diff --git a/web/oss/src/components/Editor/plugins/token/TokenPlugin.tsx b/web/oss/src/components/Editor/plugins/token/TokenPlugin.tsx index c7ab778882..0353238a77 100644 --- a/web/oss/src/components/Editor/plugins/token/TokenPlugin.tsx +++ b/web/oss/src/components/Editor/plugins/token/TokenPlugin.tsx @@ -4,32 +4,15 @@ import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" import {useLexicalTextEntity} from "@lexical/react/useLexicalTextEntity" import {TextNode, $createTextNode, LexicalNode, $isRangeSelection, $getSelection} from "lexical" -import {navigateCursor} from "./assets/selectionUtils" import {TokenInputNode, $createTokenInputNode, $isTokenInputNode} from "./TokenInputNode" import {TokenNode, $createTokenNode, $isTokenNode} from "./TokenNode" +import {navigateCursor} from "./assets/selectionUtils" -type TemplateFormat = "curly" | "fstring" | "jinja2" - -function buildRegexes(templateFormat: TemplateFormat) { - if (templateFormat === "jinja2") { - // Match complete Jinja2 tokens: variables {{ }}, blocks {% %} (with optional - trim markers), comments {# #} - const full = /(\{\{[\s\S]*?\}\}|\{%-?[\s\S]*?-?%\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\})/ - // Match incomplete tokens at end of string: starts of any of the three - const input = /(\{\{[\s\S]*$|\{%-?[\s\S]*$|\{%[\s\S]*$|\{#[\s\S]*$)/ - // Exact match validator for token nodes (entire text content is one token) - const exact = /^(\{\{[\s\S]*?\}\}|\{%-?[\s\S]*?-?%\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\})$/ - return {FULL_TOKEN_REGEX: full, TOKEN_INPUT_REGEX: input, EXACT_TOKEN_REGEX: exact} - } - // Default: curly variable tokens only - const full = /\{\{[^{}]*\}\}/ - const input = /\{\{[^{}]*$/ - const exact = /^\{\{[^{}]*\}\}$/ - return {FULL_TOKEN_REGEX: full, TOKEN_INPUT_REGEX: input, EXACT_TOKEN_REGEX: exact} -} +const FULL_TOKEN_REGEX = /\{\{[^{}]*\}\}/ +const TOKEN_INPUT_REGEX = /\{\{[^{}]*$/ -export function TokenPlugin({templateFormat = "curly"}: {templateFormat?: TemplateFormat}): null { +export function TokenPlugin(): null { const [editor] = useLexicalComposerContext() - const {FULL_TOKEN_REGEX, TOKEN_INPUT_REGEX, EXACT_TOKEN_REGEX} = buildRegexes(templateFormat) useEffect(() => { if (!editor.hasNodes([TokenNode, TokenInputNode])) { @@ -43,7 +26,7 @@ export function TokenPlugin({templateFormat = "curly"}: {templateFormat?: Templa if ($isTokenNode(textNode)) { // Handle existing token nodes - if (!text || !EXACT_TOKEN_REGEX.test(text)) { + if (!text?.match(/^\{\{[^{}]*\}\}$/)) { const parent = textNode.getParent() if (!parent) return @@ -55,7 +38,7 @@ export function TokenPlugin({templateFormat = "curly"}: {templateFormat?: Templa if ($isTokenInputNode(textNode)) { // Handle existing token input nodes - if (text && EXACT_TOKEN_REGEX.test(text)) { + if (text?.match(/^\{\{[^{}]*\}\}$/)) { const tokenNode = $createTokenNode(text) textNode.replace(tokenNode) const spaceNode = $createTextNode(" ") @@ -147,45 +130,39 @@ export function TokenPlugin({templateFormat = "curly"}: {templateFormat?: Templa unregisterTextNodeTransform() unregisterTokenInputNodeTransform() } - }, [editor, templateFormat]) + }, [editor]) - const getTokenMatch = useCallback( - (text: string) => { - const fullTokenMatch = FULL_TOKEN_REGEX.exec(text) + const getTokenMatch = useCallback((text: string) => { + const fullTokenMatch = FULL_TOKEN_REGEX.exec(text) - if (fullTokenMatch) { - const startOffset = fullTokenMatch.index - const endOffset = startOffset + fullTokenMatch[0].length + if (fullTokenMatch) { + const startOffset = fullTokenMatch.index + const endOffset = startOffset + fullTokenMatch[0].length - return { - end: endOffset, - start: startOffset, - } + return { + end: endOffset, + start: startOffset, } + } - return null - }, - [templateFormat], - ) + return null + }, []) - const getTokenInputMatch = useCallback( - (text: string) => { - const matchArr = TOKEN_INPUT_REGEX.exec(text) + const getTokenInputMatch = useCallback((text: string) => { + const matchArr = TOKEN_INPUT_REGEX.exec(text) - if (matchArr) { - const startOffset = matchArr.index - const endOffset = startOffset + matchArr[0].length + if (matchArr) { + const startOffset = matchArr.index + const endOffset = startOffset + matchArr[0].length - return { - end: endOffset, - start: startOffset, - } + return { + end: endOffset, + start: startOffset, } + } - return null - }, - [templateFormat], - ) + return null + }, []) const $createTokenNode_ = useCallback((textNode: TextNode) => { return $createTokenNode(textNode.getTextContent()) diff --git a/web/oss/src/components/Editor/plugins/token/assets/selectionUtils.ts b/web/oss/src/components/Editor/plugins/token/assets/selectionUtils.ts index de29cba263..dfb4281f6a 100644 --- a/web/oss/src/components/Editor/plugins/token/assets/selectionUtils.ts +++ b/web/oss/src/components/Editor/plugins/token/assets/selectionUtils.ts @@ -1,6 +1,6 @@ import {$createRangeSelection, $setSelection, NodeKey} from "lexical" -export const $navigateCursor = ({ +export const navigateCursor = ({ nodeKey, offset, type, @@ -14,5 +14,3 @@ export const $navigateCursor = ({ newSelection.focus.set(nodeKey, offset, type ?? "text") $setSelection(newSelection) } -/** @deprecated renamed to {@link $navigateCursor} by @lexical/eslint-plugin rules-of-lexical */ -export const navigateCursor = $navigateCursor diff --git a/web/oss/src/components/Editor/state/assets/atoms.ts b/web/oss/src/components/Editor/state/assets/atoms.ts index db5c2fc9d8..21724ffcdf 100644 --- a/web/oss/src/components/Editor/state/assets/atoms.ts +++ b/web/oss/src/components/Editor/state/assets/atoms.ts @@ -1,8 +1,6 @@ -import {atomFamily, atomWithStorage} from "jotai/utils" +import {atomWithStorage} from "jotai/utils" // Single atom instance that will be scoped by the provider export const editorStateAtom = atomWithStorage("editor-state", "") -export const markdownViewAtom = atomFamily((id: string) => - atomWithStorage(`markdown-view-${id}`, false), -) +export const markdownViewAtom = atomWithStorage("markdown-view", false) diff --git a/web/oss/src/components/Editor/types.d.ts b/web/oss/src/components/Editor/types.d.ts index 73f55399a6..2df1d40276 100644 --- a/web/oss/src/components/Editor/types.d.ts +++ b/web/oss/src/components/Editor/types.d.ts @@ -26,12 +26,10 @@ export interface EditorProps extends React.HTMLProps { singleLine?: boolean autoFocus?: boolean codeOnly?: boolean - language?: "json" | "yaml" | "code" + language?: "json" | "yaml" showToolbar?: boolean enableTokens?: boolean tokens?: string[] - /** Template format for prompt variable/tag highlighting */ - templateFormat?: "curly" | "fstring" | "jinja2" noProvider?: boolean /** Custom render function to override node rendering in Form view */ customRender?: CustomRenderFn @@ -51,20 +49,18 @@ export interface EditorProps extends React.HTMLProps { } export interface EditorPluginsProps { - id: string showToolbar: boolean singleLine: boolean codeOnly: boolean autoFocus?: boolean enableTokens: boolean debug: boolean - language?: "json" | "yaml" | "code" + language?: "json" | "yaml" placeholder?: string /** Initial text value for the editor */ initialValue: string validationSchema?: unknown tokens?: string[] - templateFormat?: "curly" | "fstring" | "jinja2" handleUpdate: (editorState: EditorState, editor: LexicalEditor) => void /** Additional plugins to include in code editor */ additionalCodePlugins?: React.ReactNode[] diff --git a/web/oss/src/components/Editor/utils/diffUtils.ts b/web/oss/src/components/Editor/utils/diffUtils.ts index 682520be98..84d484c8ce 100644 --- a/web/oss/src/components/Editor/utils/diffUtils.ts +++ b/web/oss/src/components/Editor/utils/diffUtils.ts @@ -3,7 +3,16 @@ import yaml from "js-yaml" /** * Compute line-by-line diff using LCS-based algorithm */ -function computeLineDiff(oldLines: string[], newLines: string[], contextLines: number): DiffLine[] { +function computeLineDiff( + oldLines: string[], + newLines: string[], + contextLines: number, +): { + type: "context" | "added" | "removed" + content: string + oldLineNumber?: number + newLineNumber?: number +}[] { const result: { type: "context" | "added" | "removed" content: string @@ -61,271 +70,15 @@ function computeLineDiff(oldLines: string[], newLines: string[], contextLines: n return result } -/** - * Basic diff line type - */ -interface DiffLine { - type: "context" | "added" | "removed" - content: string - oldLineNumber?: number - newLineNumber?: number -} - -/** - * Extended diff line type with folding support - */ -interface ExtendedDiffLine { - type: "context" | "added" | "removed" | "fold" - content: string - oldLineNumber?: number - newLineNumber?: number - foldedLineCount?: number - startLine?: number - endLine?: number -} - -/** - * Apply folding logic to diff lines to focus on changes - * Large sections of unchanged content are collapsed into fold indicators - */ -function applyFolding( - diffLines: DiffLine[], - options: { - contextLines?: number - foldThreshold?: number - showFoldedLineCount?: boolean - } = {}, -): ExtendedDiffLine[] { - const {contextLines = 3, foldThreshold = 5, showFoldedLineCount = true} = options - const result: ExtendedDiffLine[] = [] - - let i = 0 - while (i < diffLines.length) { - const line = diffLines[i] - - if (line.type !== "context") { - // Non-context line (added/removed) - always show - result.push(line) - i++ - continue - } - - // Find consecutive context lines - let contextStart = i - let contextEnd = i - while (contextEnd < diffLines.length && diffLines[contextEnd].type === "context") { - contextEnd++ - } - - const contextLength = contextEnd - contextStart - - if (contextLength <= foldThreshold) { - // Short context block - show all lines - for (let j = contextStart; j < contextEnd; j++) { - result.push(diffLines[j]) - } - } else { - // Long context section - apply folding - const isAtStart = contextStart === 0 - const isAtEnd = contextEnd === diffLines.length - - if (isAtStart) { - // At the beginning - show last few lines before changes - const keepLines = Math.min(contextLines, contextLength) - const foldEnd = contextEnd - keepLines - - if (foldEnd > contextStart) { - // Add fold indicator - calculate actual folded line range - const firstFoldedLine = diffLines[contextStart] - const lastFoldedLine = diffLines[foldEnd - 1] - const startLineNum = - firstFoldedLine.oldLineNumber || firstFoldedLine.newLineNumber || 1 - const endLineNum = - lastFoldedLine.oldLineNumber || lastFoldedLine.newLineNumber || 1 - - // Debug: fold range calculation is working correctly - - result.push({ - type: "fold", - content: showFoldedLineCount - ? `... ${foldEnd - contextStart} unchanged lines ...` - : "...", - startLine: startLineNum, - endLine: endLineNum, - foldedLineCount: foldEnd - contextStart, - }) - } - - // Add remaining context lines - for (let j = foldEnd; j < contextEnd; j++) { - result.push(diffLines[j]) - } - } else if (isAtEnd) { - // At the end - show first few lines after changes - const keepLines = Math.min(contextLines, contextLength) - const foldStart = contextStart + keepLines - - // Add initial context lines - for (let j = contextStart; j < foldStart; j++) { - result.push(diffLines[j]) - } - - if (foldStart < contextEnd) { - // Add fold indicator - calculate actual folded line range - const firstFoldedLine = diffLines[foldStart] - const lastFoldedLine = diffLines[contextEnd - 1] - const startLineNum = - firstFoldedLine.oldLineNumber || firstFoldedLine.newLineNumber || 1 - const endLineNum = - lastFoldedLine.oldLineNumber || lastFoldedLine.newLineNumber || 1 - - // Debug: fold range calculation is working correctly - - result.push({ - type: "fold", - content: showFoldedLineCount - ? `... ${contextEnd - foldStart} unchanged lines ...` - : "...", - startLine: startLineNum, - endLine: endLineNum, - foldedLineCount: contextEnd - foldStart, - }) - } - } else { - // In the middle - show context around changes - // Only fold if we can actually save significant lines - const totalKeep = contextLines * 2 // Keep context lines before and after - if (contextLength <= totalKeep + 2) { - // Not enough lines to make folding worthwhile, keep all - for (let j = contextStart; j < contextEnd; j++) { - result.push(diffLines[j]) - } - } else { - // Enough lines to fold meaningfully - const keepBefore = contextLines - const keepAfter = contextLines - const foldStart = contextStart + keepBefore - const foldEnd = contextEnd - keepAfter - - // Add initial context lines - for (let j = contextStart; j < foldStart; j++) { - result.push(diffLines[j]) - } - - // Add fold indicator - calculate actual folded line range - const firstFoldedLine = diffLines[foldStart] - const lastFoldedLine = diffLines[foldEnd - 1] - const startLineNum = - firstFoldedLine.oldLineNumber || firstFoldedLine.newLineNumber || 1 - const endLineNum = - lastFoldedLine.oldLineNumber || lastFoldedLine.newLineNumber || 1 - - result.push({ - type: "fold", - content: showFoldedLineCount - ? `... ${foldEnd - foldStart} unchanged lines ...` - : "...", - startLine: startLineNum, - endLine: endLineNum, - foldedLineCount: foldEnd - foldStart, - }) - - // Add final context lines - for (let j = foldEnd; j < contextEnd; j++) { - result.push(diffLines[j]) - } - } - } - } - - i = contextEnd - } - - return result -} - /** * Compute diff between two objects and return GitHub-style diff format - * - * This function takes two JavaScript objects and computes a line-by-line diff - * in the specified format (JSON or YAML). The result is a unified diff format - * that can be parsed and displayed by the DiffHighlightPlugin. - * - * ## Input Handling: - * - Accepts any JavaScript objects/values as input - * - Serializes objects to strings based on the specified language - * - Handles nested objects, arrays, and primitive values - * - * ## Language Support: - * **JSON Mode:** - * - Uses `JSON.stringify(obj, null, 2)` for consistent formatting - * - 2-space indentation for readability - * - Proper JSON syntax with quotes and brackets - * - * **YAML Mode:** - * - Uses `yaml.dump(obj, {indent: 2})` for consistent formatting - * - 2-space indentation following YAML conventions - * - Clean YAML syntax without unnecessary quotes - * - * ## Output Format: - * Returns a string where each line follows the pattern: - * ``` - * oldLineNum|newLineNum|type|content - * ``` - * - `oldLineNum`: Line number in original (empty for added lines) - * - `newLineNum`: Line number in modified (empty for removed lines) - * - `type`: "added" | "removed" | "context" - * - `content`: The actual line content - * - * ## Usage Examples: - * - * ### JSON Diff - * ```typescript - * const original = {name: "old-service", version: "1.0.0"} - * const modified = {name: "new-service", version: "1.1.0"} - * - * const diff = computeDiff(original, modified, { - * language: "json", - * contextLines: 3 - * }) - * ``` - * - * ### YAML Diff - * ```typescript - * const original = {name: "old-service", config: {port: 8080}} - * const modified = {name: "new-service", config: {port: 9000}} - * - * const diff = computeDiff(original, modified, { - * language: "yaml", - * contextLines: 2 - * }) - * ``` - * - * @param original - The original object to compare from - * @param modified - The modified object to compare to - * @param options - Configuration options for diff computation - * @param options.language - Output format: "json" or "yaml" - * @param options.contextLines - Number of context lines around changes (default: 3) - * @returns Unified diff string in the specified format */ export function computeDiff( original: any, modified: any, - options: { - language: "json" | "yaml" - contextLines?: number - enableFolding?: boolean - foldThreshold?: number - showFoldedLineCount?: boolean - } = {language: "json"}, + options: {language: "json" | "yaml"; contextLines?: number} = {language: "json"}, ): string { - const { - language, - contextLines = 3, - enableFolding = false, - foldThreshold = 10, - showFoldedLineCount = true, - } = options + const {language, contextLines = 3} = options const oldStr = language === "json" ? JSON.stringify(original, null, 2) : yaml.dump(original, {indent: 2}) @@ -336,42 +89,19 @@ export function computeDiff( const newLines = newStr.split("\n") // Compute line-by-line diff - let diffLines: DiffLine[] | ExtendedDiffLine[] = computeLineDiff( - oldLines, - newLines, - contextLines, - ) - - // Apply folding if enabled - if (enableFolding) { - diffLines = applyFolding(diffLines as DiffLine[], { - contextLines, - foldThreshold, - showFoldedLineCount, - }) - } + const diffLines = computeLineDiff(oldLines, newLines, contextLines) // Convert to GitHub-style diff format with dual line numbers - const result = diffLines + return diffLines .map((line) => { - if (line.type === "fold") { - // Special handling for fold lines - const foldLine = line as ExtendedDiffLine - const startLine = foldLine.startLine || "" - const endLine = foldLine.endLine || "" - // Format: "startLine-endLine|startLine-endLine|fold|content|foldedLineCount" - return `${startLine}-${endLine}|${startLine}-${endLine}|fold|${line.content}|${foldLine.foldedLineCount || 0}` - } else { - // Regular diff lines - const oldNum = line.oldLineNumber ? line.oldLineNumber.toString() : "" - const newNum = line.newLineNumber ? line.newLineNumber.toString() : "" - // Format: "oldLineNum|newLineNum|type|content" - return `${oldNum}|${newNum}|${line.type}|${line.content}` - } + const oldNum = line.oldLineNumber ? line.oldLineNumber.toString() : "" + const newNum = line.newLineNumber ? line.newLineNumber.toString() : "" + + // Format: "oldLineNum|newLineNum|type|content" + // This will be parsed by the DiffHighlightPlugin + return `${oldNum}|${newNum}|${line.type}|${line.content}` }) .join("\n") - - return result } /** diff --git a/web/oss/src/components/EditorViews/SimpleSharedEditor/index.tsx b/web/oss/src/components/EditorViews/SimpleSharedEditor/index.tsx deleted file mode 100644 index 96daf023e8..0000000000 --- a/web/oss/src/components/EditorViews/SimpleSharedEditor/index.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import {useCallback, useEffect, useMemo, useState} from "react" - -import {mergeRegister} from "@lexical/utils" -import { - BracketsCurly, - CaretDown, - CaretUp, - CaretUpDown, - Check, - Code, - Copy, - MarkdownLogo, - TextAa, -} from "@phosphor-icons/react" -import {Button, MenuProps} from "antd" -import clsx from "clsx" -import {$getRoot} from "lexical" -import dynamic from "next/dynamic" - -import {EditorProvider, useLexicalComposerContext} from "@/oss/components/Editor/Editor" -import {ON_CHANGE_LANGUAGE} from "@/oss/components/Editor/plugins/code" -import {$isCodeBlockNode} from "@/oss/components/Editor/plugins/code/nodes/CodeBlockNode" -import {TOGGLE_MARKDOWN_VIEW} from "@/oss/components/Editor/plugins/markdown/commands" -import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" -import SharedEditor from "@/oss/components/Playground/Components/SharedEditor" - -import {checkIsHTML, checkIsJSON, checkIsYAML, getDisplayedContent} from "../assets/helper" - -import {Format, SimpleSharedEditorProps} from "./types" - -const Dropdown = dynamic(() => import("antd").then((mod) => mod.Dropdown), {ssr: false}) - -const SimpleSharedEditorContent = ({ - headerClassName, - headerName, - isJSON, - isYAML, - isHTML, - isMinimizeVisible = true, - isFormatVisible = true, - isCopyVisible = true, - formatDropdownProps, - copyButtonProps, - minimizeButtonProps, - disableFormatItems, - showTextToMdOutside = false, - minimizedHeight = 68, - defaultMinimized = false, - ...props -}: SimpleSharedEditorProps) => { - const [minimized, setMinimized] = useState(() => Boolean(defaultMinimized)) - const [isCopied, setIsCopied] = useState(false) - const [language, setLanguage] = useState(() => - isJSON ? "json" : isYAML ? "yaml" : "text", - ) - - const [editor] = useLexicalComposerContext() - - useEffect(() => { - const unregister = mergeRegister( - editor.registerUpdateListener(({editorState}) => { - editorState.read(() => { - const codeBlock = $getRoot().getChildren().find($isCodeBlockNode) - if (codeBlock) { - const _language = codeBlock.getLanguage() - setLanguage((cur) => (cur === _language ? cur : _language)) - } - }) - }), - ) - return unregister - }, [editor]) - - // keep dropdown in sync with actual view - useEffect(() => { - if (isJSON) { - setLanguage("json") - editor.dispatchCommand(ON_CHANGE_LANGUAGE, {language: "json"}) - } else if (isYAML) { - setLanguage("yaml") - editor.dispatchCommand(ON_CHANGE_LANGUAGE, {language: "yaml"}) - } else if (isHTML) { - setLanguage("html") - editor.dispatchCommand(ON_CHANGE_LANGUAGE, {language: "html"}) - } else { - setLanguage("markdown") - } - }, [isJSON, isYAML, isHTML, editor]) - - const toText = useCallback(() => { - if (language === "text") return - editor.dispatchCommand(TOGGLE_MARKDOWN_VIEW, undefined) - setLanguage("text") - }, [editor, language]) - - const toMarkdown = useCallback(() => { - if (language === "markdown") return - editor.dispatchCommand(TOGGLE_MARKDOWN_VIEW, undefined) - setLanguage("markdown") - }, [editor, language]) - - const toJson = useCallback(() => { - if (language === "json") return - editor.dispatchCommand(ON_CHANGE_LANGUAGE, {language: "json"}) - setLanguage("json") - }, [editor, language]) - - const toYaml = useCallback(() => { - if (language === "yaml") return - editor.dispatchCommand(ON_CHANGE_LANGUAGE, {language: "yaml"}) - setLanguage("yaml") - }, [editor, language]) - - const onCopyText = useCallback(async () => { - const text = props.value || props.initialValue - let formattedText - try { - formattedText = getDisplayedContent(editor, language) - } catch (e) { - formattedText = text - console.log(e) - } - - if (text) { - setIsCopied(true) - - await navigator.clipboard.writeText(formattedText) - - setTimeout(() => { - setIsCopied(false) - }, 1000) - } - }, [props.value, props.initialValue, language, editor]) - - const menuItems: MenuProps["items"] = useMemo( - () => [ - { - key: "text", - icon: , - label: "Text", - onClick: toText, - disabled: isJSON || isYAML || isHTML || disableFormatItems?.text, - }, - { - key: "markdown", - icon: , - label: "Markdown", - onClick: toMarkdown, - disabled: isJSON || isYAML || isHTML || disableFormatItems?.markdown, - }, - { - key: "json", - icon: , - label: "JSON", - onClick: toJson, - disabled: (!isJSON && !isYAML) || isHTML || disableFormatItems?.json, - }, - { - key: "yaml", - icon: , - label: "YAML", - onClick: toYaml, - disabled: (!isYAML && !isJSON) || isHTML || disableFormatItems?.yaml, - }, - ...(isHTML - ? [ - { - key: "html", - icon: , - label: "HTML", - disabled: (!isHTML && !isJSON && !isYAML) || disableFormatItems?.html, - }, - ] - : []), - ], - [isJSON, toText, toJson, toYaml, toMarkdown, disableFormatItems, isYAML, isHTML], - ) - - return ( - - {headerName} -
    - {isFormatVisible && ( - - - - )} - - {showTextToMdOutside && ( - - ) : ( - - ) - } - type="text" - size="small" - onClick={() => (language === "text" ? toMarkdown() : toText())} - tooltipProps={{ - title: - language === "text" ? "Preview markdown" : "Preview text", - }} - /> - )} - - {isCopyVisible && ( - : } - type="text" - size="small" - onClick={onCopyText} - tooltipProps={{title: isCopied ? "Copied" : "Copy"}} - /> - )} - - {isMinimizeVisible && ( - : } - type="text" - size="small" - onClick={() => setMinimized((c) => !c)} - tooltipProps={{title: minimized ? "Maximize" : "Minimize"}} - /> - )} -
    -
    - } - /> - ) -} - -const SimpleSharedEditor = (props: SimpleSharedEditorProps) => { - const isJSON = useMemo(() => { - const value = props.initialValue || props.value - if (!value) return false - return checkIsJSON(typeof value === "string" ? value : JSON.stringify(value)) - }, [props.value, props.initialValue]) - - const isYAML = useMemo(() => { - const value = props.initialValue || props.value - if (!value) return false - return checkIsYAML(typeof value === "string" ? value : JSON.stringify(value)) - }, [props.value, props.initialValue]) - - const isHTML = useMemo(() => { - const value = props.initialValue || props.value - if (!value) return false - return checkIsHTML(typeof value === "string" ? value : JSON.stringify(value)) - }, [props.value, props.initialValue]) - - return ( - - - - ) -} -export default SimpleSharedEditor diff --git a/web/oss/src/components/EditorViews/SimpleSharedEditor/types.ts b/web/oss/src/components/EditorViews/SimpleSharedEditor/types.ts deleted file mode 100644 index fc354e4bdd..0000000000 --- a/web/oss/src/components/EditorViews/SimpleSharedEditor/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {DropdownProps} from "antd" - -import {SharedEditorProps} from "@/oss/components/Playground/Components/SharedEditor/types" - -import {TooltipButtonProps} from "../../Playground/assets/EnhancedButton" - -export interface SimpleSharedEditorProps extends SharedEditorProps { - headerClassName?: string - headerName?: string | React.ReactNode - isJSON?: boolean - isYAML?: boolean - isHTML?: boolean - isMinimizeVisible?: boolean - isFormatVisible?: boolean - isCopyVisible?: boolean - formatDropdownProps?: DropdownProps - copyButtonProps?: TooltipButtonProps - minimizeButtonProps?: TooltipButtonProps - disableFormatItems?: {text?: boolean; markdown?: boolean; json?: boolean; yaml?: boolean} - minimizedHeight?: number - showTextToMdOutside?: boolean - defaultMinimized?: boolean -} -export type Format = "text" | "json" | "yaml" | "markdown" | "html" diff --git a/web/oss/src/components/EditorViews/VirtualizedSharedEditors/index.tsx b/web/oss/src/components/EditorViews/VirtualizedSharedEditors/index.tsx deleted file mode 100644 index 3b154a574f..0000000000 --- a/web/oss/src/components/EditorViews/VirtualizedSharedEditors/index.tsx +++ /dev/null @@ -1,165 +0,0 @@ -// VirtualizedSharedEditors.tsx -import React, {memo, useCallback, useLayoutEffect, useRef, useState, useEffect} from "react" - -import {VariableSizeList as List} from "react-window" -import {useResizeObserver} from "usehooks-ts" - -interface Entry { - k: string - v: unknown -} - -interface Props { - entries: Entry[] - overscanCount?: number - estimatedRowHeight?: number - className?: string - renderRow: (entry: Entry) => React.ReactNode - /** Max viewport height you'd like to use; list will shrink if content is shorter */ - listHeight?: number -} - -const VirtualizedSharedEditors: React.FC = memo( - ({ - entries, - overscanCount = 2, - estimatedRowHeight = 120, - className, - renderRow, - listHeight = 500, - }) => { - const sizeMap = useRef(new Map()) - const measuredTotalRef = useRef(0) // sum of measured rows - const measuredCountRef = useRef(0) // how many rows are measured - const listRef = useRef(null) - - const getItemSize = useCallback( - (index: number) => sizeMap.current.get(index) ?? estimatedRowHeight, - [estimatedRowHeight], - ) - - const setItemSize = useCallback((index: number, size: number) => { - const prev = sizeMap.current.get(index) - if (prev === undefined) { - measuredCountRef.current += 1 - measuredTotalRef.current += size - } else if (prev !== size) { - measuredTotalRef.current += size - prev - } - if (prev !== size) { - sizeMap.current.set(index, size) - listRef.current?.resetAfterIndex(index) - } - }, []) - - // container width (and optional height if parent gives one) - const containerRef = useRef(null) - const [containerSize, setContainerSize] = useState({width: 0, height: 0}) - useResizeObserver({ - ref: containerRef, - onResize: (entry) => { - const {width, height} = entry.contentRect || {} - setContainerSize({width, height}) - }, - box: "content-box", - }) - - useLayoutEffect(() => { - listRef.current?.resetAfterIndex(0, true) - }, [containerSize.width, containerSize.height]) - - // reset caches if data length changes a lot - useEffect(() => { - sizeMap.current.clear() - measuredTotalRef.current = 0 - measuredCountRef.current = 0 - listRef.current?.resetAfterIndex(0, true) - }, [entries]) - - // callback-ref observer for each row (robust inside react-window) - const observersRef = useRef>(new Map()) - const attachMeasuredRef = useCallback( - (index: number) => (el: HTMLDivElement | null) => { - const prev = observersRef.current.get(index) - if (prev) { - prev.disconnect() - observersRef.current.delete(index) - } - if (!el) return - - const measure = () => { - const h = Math.max(0, Math.ceil(el.getBoundingClientRect().height)) + 1 - setItemSize(index, h) - } - measure() - - const ro = new ResizeObserver(measure) - ro.observe(el) - observersRef.current.set(index, ro) - }, - [setItemSize], - ) - useEffect( - () => () => { - observersRef.current.forEach((ro) => ro.disconnect()) - observersRef.current.clear() - }, - [], - ) - - const Row = useCallback( - ({index, style}: {index: number; style: React.CSSProperties}) => ( -
    -
    - {renderRow(entries[index])} -
    -
    - ), - [entries, renderRow, attachMeasuredRef], - ) - - // ----- “max-height” behavior ----- - // Approx total content height = measured + estimate for unmeasured - const approxTotalHeight = - measuredTotalRef.current + - (entries.length - measuredCountRef.current) * estimatedRowHeight - - // viewport cap (never 0 to ensure rendering on first paint) - const viewportCap = Math.max(200, Number.isFinite(listHeight) ? (listHeight as number) : 0) - - // If content fits under the cap, skip virtualization: render plain stack that auto-sizes. - const fitsWithoutScroll = approxTotalHeight <= viewportCap + 1 - - if (fitsWithoutScroll) { - return ( -
    - {entries.map((e, i) => ( -
    - {renderRow(e)} -
    - ))} -
    - ) - } - - // Otherwise, virtualize with a fixed viewport height (the “max”) - return ( -
    - entries[i]?.k ?? i} - > - {Row as any} - -
    - ) - }, -) - -export default VirtualizedSharedEditors diff --git a/web/oss/src/components/EditorViews/assets/helper.ts b/web/oss/src/components/EditorViews/assets/helper.ts deleted file mode 100644 index 58cc9e35b1..0000000000 --- a/web/oss/src/components/EditorViews/assets/helper.ts +++ /dev/null @@ -1,197 +0,0 @@ -import {$isCodeNode} from "@lexical/code" -import {load as yamlLoad, dump as yamlDump, type DumpOptions} from "js-yaml" -import JSON5 from "json5" -import {$getRoot, LexicalEditor} from "lexical" - -import {$isCodeBlockNode} from "../../Editor/plugins/code/nodes/CodeBlockNode" -import { - $convertToMarkdownStringCustom, - PLAYGROUND_TRANSFORMERS, -} from "../../Editor/plugins/markdown/assets/transformers" -import {Format} from "../SimpleSharedEditor/types" - -/** Strip one pair of matching outer quotes if present */ -function stripOuterQuotes(s: string): string { - if (s.length >= 2) { - const q = s[0] - if ((q === '"' || q === "'") && s[s.length - 1] === q) return s.slice(1, -1) - } - return s -} - -/** Convert literal escapes like "\n" into real newlines if needed */ -function unescapeCommonEscapes(s: string): string { - // Only unescape if there are no real newlines but there ARE literal \n (common LLM output) - if (!/[\r\n]/.test(s) && /\\n/.test(s)) { - s = s.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n") - } - // Optional: tabs and quotes - s = s.replace(/\\t/g, "\t").replace(/\\"/g, '"').replace(/\\'/g, "'") - return s -} - -/** Unwrap a single fenced code block (```lang ... ``` or ~~~lang ... ~~~) */ -function unwrapFence(s: string): {lang?: string; text: string} | null { - const t = s.trim() - const re = /^(?:```|~~~)\s*([A-Za-z0-9+_.-]*)\s*\r?\n([\s\S]*?)\r?\n(?:```|~~~)\s*$/ - const m = t.match(re) - if (!m) return null - return {lang: m[1]?.toLowerCase() || undefined, text: m[2]} -} - -/** Optional: support YAML front-matter style --- ... --- */ -function unwrapFrontMatter(s: string): string | null { - const m = s.match(/^\s*---\s*\r?\n([\s\S]*?)\r?\n---\s*$/) - return m ? m[1] : null -} - -export function checkIsJSON(input: any): boolean { - if (!input || input === "{}" || input === "[]") return false - if (typeof input !== "string") return false - try { - const parsed = JSON5.parse(input) - return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) - } catch { - return false - } -} - -export function checkIsYAML(input: any): boolean { - if (!input || typeof input !== "string") return false - - // 1) Normalize - let s = stripOuterQuotes(input).trim() - s = unescapeCommonEscapes(s) - - // 2) If it cleanly parses as JSON object, treat as JSON (YAML is a superset) - try { - const asJson = JSON5.parse(s) - if (asJson && typeof asJson === "object") return false - } catch { - // not JSON → continue - } - - // 3) Unwrap fence or front-matter if present - const fenced = unwrapFence(s) - if (fenced) { - if (fenced.lang === "json") return false // explicitly JSON - s = fenced.text - } else { - const fm = unwrapFrontMatter(s) - if (fm) s = fm - } - - // 4) Guard for raw JSON-looking start - const c0 = s.trim()[0] - if (c0 === "{" || c0 === "[") return false - - // 5) Try YAML parse - try { - const parsed = yamlLoad(s) - - // Only count YAML *mappings* (plain objects) as "YAML" - const isPlainObject = - parsed !== null && - typeof parsed === "object" && - !Array.isArray(parsed) && - Object.prototype.toString.call(parsed) === "[object Object]" - - return isPlainObject && Object.keys(parsed).length > 0 // require at least one key - } catch { - return false - } -} - -/** Minimal check: does the string look like real HTML (not JSON/YAML/markdown)? */ -export function checkIsHTML(input: any): boolean { - if (typeof input !== "string") return false - - const s = input.trim() - if (!s || s.startsWith("{") || s.startsWith("[") || s.startsWith("---")) return false // quick guards - if (s.startsWith("```") || s.startsWith("~~~")) return false // fenced code blocks - - // Must contain angle brackets at all - if (s.indexOf("<") === -1 || s.indexOf(">") === -1) return false - - // Matches: ... OR self-closing/void tags like
    , , - const HTML_RE = - /<([a-z][a-z0-9-]*)\b[^>]*>([\s\S]*?)<\/\1\s*>|<(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr|li|div|body)\b[^>]*\/?>/i - - return HTML_RE.test(s) -} - -/** - * Parse a YAML-ish string (handles LLM-escaped newlines and fences) and - * return a formatted YAML string. If parsing fails, it throws. - */ -export function formatYAML(input: string, opts?: DumpOptions): string { - if (typeof input !== "string") return input - - // 1) normalize - let s = stripOuterQuotes(input).trim() - s = unescapeCommonEscapes(s) - - // 2) unwrap fences/front-matter if present - const fenced = unwrapFence(s) - if (fenced) s = fenced.text - else { - const fm = unwrapFrontMatter(s) - if (fm) s = fm - } - - // 3) parse as YAML (will also parse JSON since YAML is a superset) - const value = yamlLoad(s) - - // 4) dump back to nicely formatted YAML - return yamlDump(value, { - lineWidth: -1, // no hard wrapping - noRefs: true, // inline duplicates instead of anchors - ...(opts || {}), - }) -} - -export function getDisplayedContent(editor: LexicalEditor, language: Format): string { - return editor.getEditorState().read(() => { - const root = $getRoot() - - // JSON/YAML modes use a top-level CodeBlockNode - if (language === "json" || language === "yaml") { - const codeBlock = root.getChildren().find($isCodeBlockNode) - const text = codeBlock ? codeBlock.getTextContent() : "" - - if (language === "yaml") { - try { - return formatYAML(text) - } catch { - return text - } - } - - try { - // round-trip to stable JSON string - const obj = JSON.parse(text) - return JSON.stringify(obj, null, 2) - } catch { - return text - } - } - - // Markdown view: if the document is represented by a top-level Markdown CodeNode, - // return its raw text content (no ```markdown fences). Otherwise, fall back to - // converting the rich document to markdown. - if (language === "markdown") { - const markdownCodeNode = root - .getChildren() - .find((n) => $isCodeNode(n) && n.getLanguage && n.getLanguage() === "markdown") - - if (markdownCodeNode) { - return markdownCodeNode.getTextContent() - } - - return $convertToMarkdownStringCustom(PLAYGROUND_TRANSFORMERS, undefined, true) - } - - // Plain text: rich text content as text - return root.getTextContent() - }) -} diff --git a/web/oss/src/components/EnhancedUIs/Drawer/index.tsx b/web/oss/src/components/EnhancedUIs/Drawer/index.tsx index 8d199c648a..36efdb0243 100644 --- a/web/oss/src/components/EnhancedUIs/Drawer/index.tsx +++ b/web/oss/src/components/EnhancedUIs/Drawer/index.tsx @@ -1,12 +1,14 @@ import {useState, useEffect} from "react" -import {Drawer} from "antd" +import dynamic from "next/dynamic" import {EnhancedDrawerProps} from "./types" -const EnhancedDrawer = ({children, closeOnLayoutClick = true, ...props}: EnhancedDrawerProps) => { +const Drawer = dynamic(() => import("antd").then((mod) => mod.Drawer), {ssr: false}) + +const EnhancedDrawer = ({children, ...props}: EnhancedDrawerProps) => { const [shouldRender, setShouldRender] = useState(false) - const {open: isVisible, onClose} = props + const {open: isVisible} = props useEffect(() => { if (isVisible) { @@ -21,8 +23,8 @@ const EnhancedDrawer = ({children, closeOnLayoutClick = true, ...props}: Enhance function handleClickOutside(event: MouseEvent) { if ((event.target as HTMLElement).closest(".variant-table-row")) { return - } else if (closeOnLayoutClick && (event.target as HTMLElement).closest(".ant-layout")) { - onClose?.({} as any) + } else if ((event.target as HTMLElement).closest(".ant-layout")) { + props.onClose?.({} as any) } } @@ -30,7 +32,7 @@ const EnhancedDrawer = ({children, closeOnLayoutClick = true, ...props}: Enhance return () => { document.removeEventListener("click", handleClickOutside) } - }, [shouldRender, closeOnLayoutClick, onClose]) + }, [shouldRender]) const handleAfterClose = (open: boolean) => { props.afterOpenChange?.(open) diff --git a/web/oss/src/components/EnhancedUIs/Drawer/types.d.ts b/web/oss/src/components/EnhancedUIs/Drawer/types.d.ts index 6db8c85c64..d369f4dda1 100644 --- a/web/oss/src/components/EnhancedUIs/Drawer/types.d.ts +++ b/web/oss/src/components/EnhancedUIs/Drawer/types.d.ts @@ -2,5 +2,4 @@ import {DrawerProps} from "antd" export interface EnhancedDrawerProps extends DrawerProps { children: React.ReactNode - closeOnLayoutClick?: boolean } diff --git a/web/oss/src/components/EnhancedUIs/Table/README.md b/web/oss/src/components/EnhancedUIs/Table/README.md deleted file mode 100644 index 172077cd5d..0000000000 --- a/web/oss/src/components/EnhancedUIs/Table/README.md +++ /dev/null @@ -1,61 +0,0 @@ -## EnhancedTable - -A powerful table component extending Ant Design's Table with enhanced features like resizable columns, collapsible groups, and virtualization. - -## Props - -- `columns`: Array of `EnhancedColumnType` (required) -- `skeletonRowCount`: Number of skeleton rows to show when loading (default: 5) -- `addNotAvailableCell`: Show not available cell for empty values (default: true) -- `virtualized`: Enable virtualized rendering (default: false) -- `uniqueKey`: Unique identifier for persisting table state (required) -- All other Ant Design Table props are supported - -## Features - -- **Resizable Columns**: Drag to resize column widths -- **Collapsible Groups**: Collapse/expand column groups -- **Aggregated Data on Collapse**: Optionally render aggregated content when columns are collapsed -- **Skeleton Loading**: Built-in loading states -- **Virtualization**: Optimized rendering for large datasets -- **Persistent State**: Saves column widths and collapse on local-storage -- **Responsive**: Adapts to container size - -## Usage - -```tsx -import {EnhancedTable} from "./EnhancedUIs/Table" - -const columns = [ - { - title: "Name", - dataIndex: "name", - width: 200, - isSkeleton: false, - // Disable not-available cell just for this column (overrides table default) - addNotAvailableCell: false, - }, - { - title: "Details", - collapsible: true, - // Enable not-available cell for the group when collapsed (inherits table default otherwise) - addNotAvailableCell: true, - // Render a summary when collapsed - renderAggregatedData: ({record}) => `Age: ${record.age}, Address: ${record.address}`, - children: [ - {title: "Age", dataIndex: "age"}, - {title: "Address", dataIndex: "address"}, - ], - }, -] - -return ( - -) -``` diff --git a/web/oss/src/components/EnhancedUIs/Table/assets/CustomCells.tsx b/web/oss/src/components/EnhancedUIs/Table/assets/CustomCells.tsx deleted file mode 100644 index 970d78731f..0000000000 --- a/web/oss/src/components/EnhancedUIs/Table/assets/CustomCells.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import {memo, useEffect, useState} from "react" - -import {Skeleton} from "antd" -import clsx from "clsx" -import {Resizable} from "react-resizable" - -export const ResizableTitle = memo((props: any) => { - const {onResize, width, minWidth, ...restProps} = props - - // Local live width to avoid forcing parent re-renders on every drag frame - const [liveWidth, setLiveWidth] = useState(width) - - useEffect(() => { - setLiveWidth(width) - }, [width]) - - if (!width) { - return
    - - ) -}) - -export const SkeletonCell = memo(() => ( -
    - -
    -)) diff --git a/web/oss/src/components/EnhancedUIs/Table/index.tsx b/web/oss/src/components/EnhancedUIs/Table/index.tsx deleted file mode 100644 index 821f61183c..0000000000 --- a/web/oss/src/components/EnhancedUIs/Table/index.tsx +++ /dev/null @@ -1,300 +0,0 @@ -import {useMemo, useCallback, useRef, type RefObject, forwardRef, JSX} from "react" -import {DownOutlined} from "@ant-design/icons" -import {Table} from "antd" -import {ColumnsType} from "antd/es/table" -import clsx from "clsx" -import {useLocalStorage, useResizeObserver} from "usehooks-ts" - -import {ResizableTitle, SkeletonCell} from "./assets/CustomCells" -import {EnhancedTableProps, EnhancedColumnType} from "./types" - -const EnhancedTableInner = ( - { - columns, - dataSource, - loading, - skeletonRowCount = 5, - addNotAvailableCell = true, - virtualized = false, - showHorizontalScrollBar = false, - uniqueKey, - ...rest - }: EnhancedTableProps, - ref: React.ForwardedRef, -) => { - const [columnWidths, setColumnWidths] = useLocalStorage>( - `${uniqueKey}-tableColumnWidths`, - {}, - ) - const [collapsed, setCollapsed] = useLocalStorage>( - `${uniqueKey}-tableColumnsCollapsed`, - {}, - ) - - // Container ref used to measure available space for optional virtualization - const containerRef = useRef(null) - const {height: containerHeight, width: containerWidth} = useResizeObserver({ - // Always pass the ref object; the hook handles `current` being null - ref: containerRef as RefObject, - box: "border-box", - }) - - // Toggle the collapse state for a column group - const toggleCollapse = useCallback((key: string) => { - setCollapsed((prev) => ({...prev, [key]: !prev[key]})) - }, []) - - // Resize handler for resizable columns - const handleResize = useCallback( - (colKey: string) => - (_: any, {size}: {size: {width: number}}) => { - // Enforce minimum width of 50px - const minWidth = 50 - const newWidth = Math.max(size.width, minWidth) - setColumnWidths((widths) => ({...widths, [colKey]: newWidth})) - }, - [], - ) - - // Recursively enhance the provided columns with resizable headers, collapsible - // groups and custom cell rendering logic - const applyFeatures = useCallback( - (cols: EnhancedColumnType[], path: string[] = []): ColumnsType => { - return cols.map((col, index) => { - const key = String(col.key ?? col.dataIndex ?? [...path, index].join("-")) - - const isCollapsed = !!col.collapsible && collapsed[key] - let children = col.children?.filter(Boolean) - - let width = columnWidths[key] ?? Math.max((col.width as number) ?? 160, 80) - - const baseRender = col.render - - // Enhanced cell renderer handling skeleton rows, not available. - const render = (value: any, record: RecordType, rowIndex: number) => { - if (record.isSkeleton) { - return - } - const content = baseRender ? baseRender(value, record, rowIndex) : value - if (addNotAvailableCell && !content) { - return
    - } - - if (col.collapsible) { - return ( -
    - {content} -
    - ) - } - - return content - } - - const rawTitle = typeof col.title === "function" ? col.title({}) : col.title - - const titleContent = {rawTitle} - - const title = col.collapsible ? ( - { - e.stopPropagation() - toggleCollapse(key) - }} - > - - - {titleContent} - - - ) : ( - titleContent - ) - - if (children && children.length > 0) { - children = applyFeatures(children, [...path, String(index)]) - return { - ...col, - key, - title, - children: - col.collapsible && isCollapsed - ? [] - : children.map((child) => ({ - ...child, - width, - onHeaderCell: () => ({ - ...child.onHeaderCell, - width, - onResize: handleResize(key), - }), - })), - width, - ellipsis: true, - onHeaderCell: () => ({ - ...col.onHeaderCell, - width, - onResize: handleResize(key), - }), - render: (value: any, record: RecordType, index: number) => { - if (isCollapsed) { - if (record.isSkeleton) return - return col.renderAggregatedData?.({ - isSkeleton: record.isSkeleton, - isCollapsed, - record, - }) - } - return render(value, record, index) - }, - } - } - - if (col.collapsible) { - const collapsedLeaf = collapsed[key] - return { - ...col, - key, - title, - width, - ellipsis: true, - onHeaderCell: () => ({ - ...col.onHeaderCell, - width, - onResize: handleResize(key), - }), - render: (value: any, record: RecordType, index: number) => { - if (collapsedLeaf) { - if (record.isSkeleton) return - return col.renderAggregatedData?.({ - isSkeleton: record.isSkeleton, - isCollapsed: true, - record, - }) - } - return render(value, record, index) - }, - onCell: (record: RecordType, rowIndex: number) => { - const base = col.onCell?.(record, rowIndex) || {} - return { - ...base, - style: {...base.style, minWidth: 0, width}, - } - }, - } - } - - return { - ...col, - key, - title, - width, - ellipsis: true, - onHeaderCell: () => ({ - ...col.onHeaderCell, - width, - onResize: handleResize(key), - }), - onCell: (record: RecordType, rowIndex: number) => { - const base = col.onCell?.(record, rowIndex) || {} - return { - ...base, - style: {...base.style, minWidth: 0, width}, - } - }, - render, - } - }) as unknown as ColumnsType - }, - [collapsed, columnWidths, handleResize, toggleCollapse, addNotAvailableCell], - ) - - const finalColumns = useMemo(() => applyFeatures(columns, []), [columns, applyFeatures]) - - // Temporary rows shown while loading - const skeletonData = useMemo( - () => - Array.from({length: skeletonRowCount}, (_, idx) => ({ - key: `skeleton-${idx}`, - isSkeleton: true, - })) as RecordType[], - [skeletonRowCount], - ) - const data = useMemo(() => { - if (loading) { - return skeletonData - } - return dataSource - }, [loading, dataSource, skeletonData]) - - const tableLoading = useMemo(() => { - if (data === skeletonData) return false - return loading - }, [loading, data, skeletonData]) - - const virtualizationActive = virtualized - - const table = ( -
    - } - return ( - e.stopPropagation()} - /> - } - onResize={(e: any, data: any) => { - setLiveWidth(data.size.width) - onResize && onResize(e, data) - }} - draggableOpts={{enableUserSelectHack: false}} - > - -
    - {restProps.children} -
    -
    - ) - - if (virtualized) { - return ( -
    - {table} -
    - ) - } - - return table -} - -const EnhancedTable = forwardRef(EnhancedTableInner) as < - RecordType extends { - key?: React.Key - isSkeleton?: boolean - }, ->( - props: EnhancedTableProps & {ref?: React.Ref}, -) => JSX.Element - -export default EnhancedTable diff --git a/web/oss/src/components/EnhancedUIs/Table/types.ts b/web/oss/src/components/EnhancedUIs/Table/types.ts deleted file mode 100644 index f59a4d7bee..0000000000 --- a/web/oss/src/components/EnhancedUIs/Table/types.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {TableProps, ColumnType, ColumnGroupType} from "antd/es/table" -import {ReactNode} from "react" - -/** - * Props for the renderAggregatedData function - */ -export interface RenderAggregatedDataParams { - isSkeleton: boolean - isCollapsed: boolean - record: RecordType -} - -/** - * Enhanced column type that extends Ant Design's ColumnType with additional features - */ -export type EnhancedColumnType = Omit, "children"> & { - /** Nested columns for grouped headers */ - children?: EnhancedColumnType[] - - /** If true, this column group can be collapsed */ - collapsible?: boolean - - /** - * Whether to show the not-available cell for empty values on this column. - * Defaults to inheriting from table-level `addNotAvailableCell` (which defaults to true). - */ - addNotAvailableCell?: boolean - - /** Minimum width used when resizing */ - minWidth?: number - - /** Whether the column should be hidden by default in `EditColumns` */ - defaultHidden?: boolean - - key?: string - - /** - * Function to render aggregated data for the column. - * This will work when the column is collapsed. - */ - renderAggregatedData?: (params: RenderAggregatedDataParams) => ReactNode -} - -/** - * Type guard to check if a column is a column group - */ -export function isColumnGroup( - column: EnhancedColumnType, -): column is EnhancedColumnType & {children: EnhancedColumnType[]} { - return !!(column as any).children -} - -// Props for the `EnhancedTable` component -export interface EnhancedTableProps extends Omit, "columns"> { - columns: EnhancedColumnType[] - /** Number of skeleton rows to show when loading and no data */ - skeletonRowCount?: number - /** Show not available cell for empty values. Defaults to true */ - addNotAvailableCell?: boolean - /** Enable virtualized rendering. Defaults to false */ - virtualized?: boolean - /** Unique key for the table */ - uniqueKey: string - /** Whether to show horizontal scrollbar */ - showHorizontalScrollBar?: boolean -} diff --git a/web/oss/src/components/ErrorState/index.tsx b/web/oss/src/components/ErrorState/index.tsx deleted file mode 100644 index 9c5b115455..0000000000 --- a/web/oss/src/components/ErrorState/index.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import {Result, Button} from "antd" -import type {FC} from "react" - -interface ErrorStateProps { - title?: string - subtitle?: string - status?: "error" | "warning" | "info" | "500" - onRetry?: () => void -} - -const ErrorState: FC = ({ - title = "Something went wrong", - subtitle = "Please try again", - status = "error", - onRetry, -}) => { - return ( - - Retry - - ) : null - } - /> - ) -} - -export default ErrorState diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/AutoEvalRunSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/AutoEvalRunSkeleton.tsx deleted file mode 100644 index 06f82f0a14..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/AutoEvalRunSkeleton.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import {memo} from "react" - -import {useRouter} from "next/router" - -import EvalRunOverviewViewerSkeleton from "../../components/EvalRunOverviewViewer/assets/EvalRunOverviewViewerSkeleton" -import EvalRunHeaderSkeleton from "../components/EvalRunHeader/assets/EvalRunHeaderSkeleton" -import EvalRunPromptConfigViewerSkeleton from "../components/EvalRunPromptConfigViewer/assets/EvalRunPromptConfigViewerSkeleton" -import EvalRunTestcaseViewerSkeleton from "../components/EvalRunTestcaseViewer/assets/EvalRunTestcaseViewerSkeleton" - -const AutoEvalRunSkeleton = () => { - const router = useRouter() - const viewType = router.query.view as string - - return ( -
    - - {viewType === "testcases" ? ( - - ) : viewType === "prompt" ? ( - - ) : ( - - )} -
    - ) -} - -export default memo(AutoEvalRunSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/EvalNameTag.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/EvalNameTag.tsx deleted file mode 100644 index 9c964e467b..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/EvalNameTag.tsx +++ /dev/null @@ -1,298 +0,0 @@ -import {useCallback, useMemo} from "react" - -import {Star, XCircle} from "@phosphor-icons/react" -import {Button, Popover, PopoverProps, Tag, TagProps, Tooltip} from "antd" -import clsx from "clsx" -import {useAtom} from "jotai" -import {useRouter} from "next/router" - -import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" -import UserAvatarTag from "@/oss/components/ui/UserAvatarTag" -import {EnrichedEvaluationRun} from "@/oss/lib/hooks/usePreviewEvaluations/types" - -import {urlStateAtom} from "../../state/urlState" - -import TagWithLink from "./TagWithLink" -import VariantTag from "./VariantTag" -import { - combineAppNameWithLabel, - deriveVariantAppName, - deriveVariantLabelParts, - getVariantDisplayMetadata, - normalizeId, - prettifyVariantLabel, -} from "./variantUtils" - -interface EvalNameTagProps extends TagProps { - run: EnrichedEvaluationRun - showClose?: boolean - showPin?: boolean - isBaseEval?: boolean - onlyShowBasePin?: boolean - popoverProps?: PopoverProps - allowVariantNavigation?: boolean - appContext?: { - appId?: string - appName?: string - variantName?: string - revisionLabel?: string - isOnlineEval?: boolean - } -} -const EvalNameTag = ({ - run, - showClose = false, - showPin = false, - isBaseEval = false, - onlyShowBasePin = false, - className, - popoverProps, - allowVariantNavigation = true, - appContext, - ...props -}: EvalNameTagProps) => { - const router = useRouter() - const normalizedRouteAppId = useMemo( - () => normalizeId(router.query.app_id as string | undefined), - [router.query.app_id], - ) - const [urlState, setUrlState] = useAtom(urlStateAtom) - - const onClose = useCallback( - async (runId: string) => { - const compareRunIds = urlState.compare || [] - const updatedRuns = compareRunIds.filter((id) => id !== runId) - - await router.replace( - { - pathname: router.pathname, - query: {...router.query, compare: updatedRuns}, - }, - undefined, - {shallow: true}, - ) - - setUrlState((draft) => { - draft.compare = updatedRuns.length > 0 ? updatedRuns : undefined - }) - }, - [urlState, router, setUrlState], - ) - - const onPin = useCallback(async () => { - const currentBaseId = router.query.evaluation_id?.toString() - const compareRunIds = urlState.compare || [] - const targetId = run.id - - if (!currentBaseId || targetId === currentBaseId) return - const targetIndex = compareRunIds.indexOf(targetId) - if (targetIndex === -1) return - - const updatedCompare = [...compareRunIds] - updatedCompare[targetIndex] = currentBaseId - - await router.replace( - { - pathname: router.pathname, - query: { - ...router.query, - evaluation_id: targetId, - compare: updatedCompare, - }, - }, - undefined, - {shallow: true}, - ) - setUrlState((draft) => { - draft.compare = updatedCompare - }) - }, [urlState, router, run?.id, setUrlState]) - - return ( - -
    - {run?.name} -
    - {showPin && ( - -
    -
    -
    -
    - ID - - - {run?.id - ? run?.id.split("-")[run?.id.split("-").length - 1] - : ""} - - -
    - {appContext?.isOnlineEval ? null : ( -
    - Testset - -
    - )} - {appContext && appContext.appId ? ( -
    - Application - - - {appContext.appName || appContext.appId} - - -
    - ) : null} - {run?.variants?.length || appContext?.variantName ? ( -
    - Variant - {run?.variants && run?.variants.length > 0 ? ( - (() => { - const variant: any = run?.variants[0] - const summary = getVariantDisplayMetadata(variant) - const {label: formattedLabel, revision: labelRevision} = - deriveVariantLabelParts({ - variant, - displayLabel: summary.label, - }) - const resolvedAppName = - deriveVariantAppName({ - variant, - fallbackAppName: - run?.appName || - (run as any)?.app_name || - (run as any)?.app?.name, - }) ?? run?.appName - - const prettyLabel = combineAppNameWithLabel( - resolvedAppName, - prettifyVariantLabel(formattedLabel) ?? formattedLabel, - ) - - const candidateRevisionId = - summary.revisionId || - normalizeId(variant?.id) || - normalizeId(variant?.variantId) - const candidateAppId = normalizeId( - variant?.appId || - (variant as any)?.app_id || - run?.appId || - (run as any)?.app_id, - ) - - const resolvedAppId = candidateAppId || normalizedRouteAppId - const blockedByRuntime = - Boolean(normalizedRouteAppId) && - resolvedAppId === normalizedRouteAppId && - summary.hasRuntime === false - - const canNavigate = - allowVariantNavigation && - Boolean(candidateRevisionId && resolvedAppId) && - summary.isHealthy !== false && - !blockedByRuntime - - return ( - - ) - })() - ) : ( - - {appContext?.variantName} - {appContext?.revisionLabel - ? ` v${appContext.revisionLabel}` - : ""} - - )} -
    - ) : null} -
    - Created on - {run?.createdAt} -
    - {!!run?.createdBy?.user?.username && ( -
    - Created by - -
    - )} -
    - - } - > - - {showPin && ( - - - - )} - {run?.name} - {showClose && !isBaseEval && ( - - onClose(run.id)} - /> - - )} - -
    - ) -} - -export default EvalNameTag diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/TagWithLink.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/TagWithLink.tsx deleted file mode 100644 index 254c78476f..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/TagWithLink.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import {ArrowSquareOut} from "@phosphor-icons/react" -import {Tag, TagProps} from "antd" -import clsx from "clsx" -import {useRouter} from "next/router" - -interface TagWithLinkProps extends TagProps { - name: string - href: string - showIcon?: boolean -} -const TagWithLink = ({name, href, className, showIcon = true, ...props}: TagWithLinkProps) => { - const router = useRouter() - return ( - router.push(href)} - {...props} - > - {name} - {showIcon && ( - - )} - - ) -} - -export default TagWithLink diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/VariantTag.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/VariantTag.tsx deleted file mode 100644 index 8d750d6527..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/VariantTag.tsx +++ /dev/null @@ -1,274 +0,0 @@ -import {useMemo} from "react" - -import {ArrowSquareOut} from "@phosphor-icons/react" -import {useQueryClient} from "@tanstack/react-query" -import {Skeleton, Tag} from "antd" -import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" -import {useRouter} from "next/router" - -import useURL from "@/oss/hooks/useURL" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" -import {runIndexFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import type {EnrichedEvaluationRun} from "@/oss/lib/hooks/usePreviewEvaluations/types" -import { - appDetailQueryAtomFamily, - currentAppContextAtom, - recentAppIdAtom, - routerAppIdAtom, -} from "@/oss/state/app" - -import { - combineAppNameWithLabel, - deriveVariantAppName, - deriveVariantLabelParts, - getVariantDisplayMetadata, - normalizeId, - normalizeLabel, -} from "./variantUtils" - -interface VariantTagProps { - variantName?: string - revision?: number | string - id?: string | null - className?: string - isLoading?: boolean - disabled?: boolean - isDeleted?: boolean - enrichedRun?: EnrichedEvaluationRun - variant?: any -} - -const VariantTag = ({ - variantName, - revision, - id, - className, - isLoading, - disabled = false, - isDeleted = false, - enrichedRun, - variant, -}: VariantTagProps) => { - const router = useRouter() - const queryClient = useQueryClient() - const setRouterAppId = useSetAtom(routerAppIdAtom) - const setRecentAppId = useSetAtom(recentAppIdAtom) - const routeAppId = normalizeId(router.query.app_id as string | undefined) - const {baseAppURL} = useURL() - const app = useAtomValue(appDetailQueryAtomFamily(enrichedRun?.appId || null)) - const variantsFromRun = useMemo(() => { - if (enrichedRun?.variants && Array.isArray(enrichedRun.variants)) { - return enrichedRun.variants as any[] - } - return [] - }, [enrichedRun]) - - const normalizedTargetId = useMemo(() => normalizeId(id), [id]) - const normalizedTargetName = useMemo(() => normalizeLabel(variantName), [variantName]) - - const variantFromRun = useMemo(() => { - if (!variantsFromRun.length) return undefined - - const match = variantsFromRun.find((candidate: any) => { - const candidateIds = [ - normalizeId(candidate?._revisionId), - normalizeId(candidate?.id), - normalizeId(candidate?.variantId), - normalizeId(candidate?.revisionId), - ].filter(Boolean) as string[] - - if (normalizedTargetId && candidateIds.includes(normalizedTargetId)) { - return true - } - - if (normalizedTargetName) { - const candidateNames = [ - normalizeLabel(candidate?.variantName), - normalizeLabel(candidate?.configName), - normalizeLabel(candidate?.name), - normalizeLabel(candidate?.variantId), - ].filter(Boolean) as string[] - if (candidateNames.includes(normalizedTargetName)) { - return true - } - } - - return false - }) - - return match ?? variantsFromRun[0] - }, [variantsFromRun, normalizedTargetId, normalizedTargetName]) - - const resolvedVariant = useMemo(() => { - if (variant) { - if (variantFromRun) { - return { - ...variantFromRun, - ...variant, - } - } - return variant - } - return variantFromRun - }, [variant, variantFromRun]) - - const baseLabel = - normalizeLabel(variantName) ?? - normalizeLabel(resolvedVariant?.variantName) ?? - normalizeLabel(resolvedVariant?.name) ?? - "Variant unavailable" - - const display = useMemo( - () => - getVariantDisplayMetadata(resolvedVariant, { - fallbackLabel: normalizedTargetName ?? baseLabel, - fallbackRevisionId: normalizedTargetId, - requireRuntime: false, - }), - [resolvedVariant, normalizedTargetName, baseLabel, normalizedTargetId], - ) - - const {label: preferredLabel, revision: labelRevision} = useMemo( - () => - deriveVariantLabelParts({ - variant: resolvedVariant, - displayLabel: display.label ?? baseLabel, - }), - [resolvedVariant, display.label, baseLabel], - ) - - const variantAppName = useMemo( - () => - deriveVariantAppName({ - variant: resolvedVariant, - fallbackAppName: - (resolvedVariant as any)?.appName ?? - (resolvedVariant as any)?.application?.name ?? - (resolvedVariant as any)?.baseName ?? - enrichedRun?.appName ?? - (enrichedRun as any)?.app_name ?? - (enrichedRun as any)?.app?.name, - }), - [resolvedVariant, enrichedRun], - ) - - const variantAppId = useMemo( - () => - normalizeId( - (resolvedVariant as any)?.appId ?? - (resolvedVariant as any)?.app_id ?? - (resolvedVariant as any)?.application?.id ?? - (resolvedVariant as any)?.application_id ?? - (resolvedVariant as any)?.application_ref?.id ?? - (resolvedVariant as any)?.applicationRef?.id, - ), - [resolvedVariant], - ) - - const runAppId = useMemo( - () => - normalizeId( - (enrichedRun as any)?.appId ?? - (enrichedRun as any)?.app_id ?? - (enrichedRun as any)?.app?.id ?? - (enrichedRun as any)?.application?.id, - ), - [enrichedRun], - ) - - const targetAppId = variantAppId || runAppId || routeAppId - const resolvedLabel = isDeleted - ? "Variant deleted" - : combineAppNameWithLabel(variantAppName, preferredLabel) - - const derivedRevisionId = display.revisionId - const selectedRevisionId = derivedRevisionId || normalizedTargetId - - const derivedRevision = useMemo(() => { - if (revision !== undefined && revision !== null && revision !== "") { - return revision - } - const candidate: any = resolvedVariant - const fromVariant = - candidate?.revision ?? - candidate?.revisionLabel ?? - candidate?.version ?? - candidate?._revision ?? - undefined - if ( - fromVariant !== undefined && - fromVariant !== null && - String(fromVariant).toString().trim() !== "" - ) { - return fromVariant - } - return labelRevision ?? "" - }, [resolvedVariant, revision, labelRevision]) - - const hasValidRevision = Boolean(selectedRevisionId || labelRevision) - const isRouteAppContext = Boolean(routeAppId) && targetAppId === routeAppId - const blockedByRuntime = isRouteAppContext && display.hasRuntime === false - - const canNavigate = - app?.data?.app_type !== "custom (sdk)" && - !isDeleted && - Boolean(targetAppId) && - hasValidRevision && - display.isHealthy !== false && - !blockedByRuntime - const effectiveDisabled = Boolean(disabled) || isDeleted || !canNavigate - - const hasRevision = - derivedRevision !== undefined && - derivedRevision !== null && - String(derivedRevision).toString().trim() !== "" - - return ( - { - if (effectiveDisabled || !selectedRevisionId || !targetAppId) return - setRouterAppId(targetAppId) - setRecentAppId(targetAppId) - - queryClient.removeQueries({queryKey: ["variants"]}) - queryClient.removeQueries({queryKey: ["appSpec"]}) - queryClient.removeQueries({queryKey: ["variantRevisions"]}) - - await router.push({ - pathname: `${baseAppURL}/${targetAppId}/playground`, - query: { - revisions: buildRevisionsQueryParam([selectedRevisionId]), - }, - }) - }} - > - - {resolvedLabel} - {hasRevision ? ` v${derivedRevision}` : ""} - - {!effectiveDisabled && ( - - )} - - ) -} - -const VariantTagRouter = ({isLoading, ...props}: VariantTagProps) => { - if (isLoading) { - return - } else { - return - } -} - -export default VariantTagRouter diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/types.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/types.ts deleted file mode 100644 index 4ea6eca05b..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface AutoEvalRunDetailsProps { - name: string - description: string - id: string - isLoading: boolean -} -export type ViewOptionsType = "overview" | "testcases" diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/utils.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/utils.ts deleted file mode 100644 index 4808772970..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/utils.ts +++ /dev/null @@ -1,52 +0,0 @@ -import {canonicalizeMetricKey, getMetricDisplayName} from "@/oss/lib/metricUtils" - -export const formatMetricName = (name: string) => { - const canonical = canonicalizeMetricKey(name) - - // Prefer rich labels for well-known invocation metrics - if (canonical.startsWith("attributes.ag.metrics.")) { - return getMetricDisplayName(canonical) - } - - if (canonical.startsWith("attributes.ag.")) { - const tail = canonical.split(".").pop() ?? canonical - return tail - .replace(/[_.-]/g, " ") - .replace(/\s+/g, " ") - .trim() - .replace(/\b\w/g, (c) => c.toUpperCase()) - } - - const formattedName = canonical - .replace(/[_.]/g, " ") - .replace(/([A-Z])/g, " $1") - .trim() - .toLocaleLowerCase() - - if (formattedName === "duration") return "Latency" - if (formattedName.includes("cost")) return "Cost" - return formattedName -} - -export const EVAL_TAG_COLOR = { - 1: "blue", - 2: "orange", - 3: "purple", - 4: "cyan", - 5: "lime", -} -export const EVAL_BG_COLOR = { - 1: "rgba(230, 244, 255, 0.5)", - 2: "rgba(255, 242, 232, 0.5)", - 3: "rgba(249, 240, 255, 0.5)", - 4: "rgba(230, 255, 251, 0.5)", - 5: "rgba(255, 255, 230, 0.5)", -} - -export const EVAL_COLOR = { - 1: "rgba(145, 202, 255, 1)", - 2: "rgba(255, 187, 150, 1)", - 3: "rgba(211, 173, 247, 1)", - 4: "rgba(135, 232, 222, 1)", - 5: "rgba(200, 240, 150, 1)", -} diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/variantUtils.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/variantUtils.ts deleted file mode 100644 index 4531649740..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/assets/variantUtils.ts +++ /dev/null @@ -1,170 +0,0 @@ -export const normalizeId = (value: unknown): string | undefined => { - if (value === undefined || value === null) return undefined - const stringValue = String(value) - if ( - stringValue.trim() === "" || - stringValue === "undefined" || - stringValue === "null" || - stringValue === "[object Object]" || - stringValue === "NaN" - ) { - return undefined - } - return stringValue -} - -export const normalizeLabel = (value: unknown): string | undefined => { - if (typeof value !== "string") return undefined - const trimmed = value.trim() - return trimmed.length > 0 ? trimmed : undefined -} - -export interface VariantDisplayOptions { - fallbackLabel?: string - fallbackRevisionId?: string - /** When true (default), navigation requires a runtime endpoint */ - requireRuntime?: boolean -} - -export interface VariantDisplayMetadata { - label: string - revisionId: string - isHealthy: boolean - hasRuntime: boolean - canNavigate: boolean -} - -export const getVariantDisplayMetadata = ( - variant: any, - {fallbackLabel, fallbackRevisionId, requireRuntime = true}: VariantDisplayOptions = {}, -): VariantDisplayMetadata => { - const label = - normalizeLabel(variant?.variantName) ?? - normalizeLabel(variant?.configName) ?? - normalizeLabel(variant?.name) ?? - normalizeLabel(variant?.variantId) ?? - normalizeLabel(fallbackLabel) ?? - "Variant unavailable" - - const revisionId = - normalizeId(variant?._revisionId) ?? - normalizeId(variant?.id) ?? - normalizeId(variant?.variantId) ?? - normalizeId(variant?.revisionId) ?? - normalizeId(fallbackRevisionId) ?? - "" - - const hasRuntime = Boolean( - variant?.uri || - variant?.uriObject?.runtimePrefix || - variant?.runtime?.uri || - variant?.runtime?.runtimePrefix, - ) - const isHealthy = variant?.appStatus !== false - - const canNavigate = Boolean(revisionId) && isHealthy && (requireRuntime ? hasRuntime : true) - - return { - label, - revisionId, - isHealthy, - hasRuntime, - canNavigate, - } -} - -const HEX_SEGMENT_REGEX = /^[0-9a-f]{8,}$/i - -export const prettifyVariantLabel = (label?: string): string | undefined => { - if (!label) return label - const parts = label.split("-") - if (parts.length <= 1) { - return label - } - - const last = parts[parts.length - 1] - if (HEX_SEGMENT_REGEX.test(last)) { - return parts.slice(0, -1).join("-") - } - - return label -} - -export const deriveVariantLabelParts = ({ - variant, - displayLabel, -}: { - variant?: any - displayLabel?: string -}): {label: string; revision?: string} => { - const normalizedVariantLabel = - normalizeLabel(variant?.variantName) ?? - normalizeLabel(variant?.configName) ?? - normalizeLabel(variant?.name) ?? - undefined - - const normalizedVariantId = normalizeLabel(variant?.variantId) - - const rawLabel = normalizedVariantLabel ?? normalizedVariantId ?? displayLabel ?? "Variant" - const trimmed = prettifyVariantLabel(rawLabel) ?? rawLabel - - const primaryRevision = - variant?.revision ?? - variant?.revisionLabel ?? - variant?.version ?? - variant?._revision ?? - undefined - - if ( - primaryRevision !== undefined && - primaryRevision !== null && - String(primaryRevision).toString().trim() !== "" - ) { - return {label: trimmed, revision: String(primaryRevision)} - } - - const segments = trimmed.split("-") - if (segments.length > 1) { - const last = segments[segments.length - 1] - if (/^\d+$/.test(last)) { - const base = segments.slice(0, -1).join("-") || segments.join("-") - return {label: base, revision: last} - } - } - - return {label: trimmed, revision: undefined} -} - -export const deriveVariantAppName = ({ - variant, - fallbackAppName, -}: { - variant?: any - fallbackAppName?: string -}): string | undefined => { - return ( - normalizeLabel(variant?.appName) ?? - normalizeLabel(variant?.application?.name) ?? - normalizeLabel(variant?.application?.appName) ?? - normalizeLabel(variant?.application_ref?.name) ?? - normalizeLabel(variant?.applicationRef?.name) ?? - normalizeLabel(fallbackAppName) - ) -} - -export const combineAppNameWithLabel = (appName: string | undefined, label?: string): string => { - const normalizedLabel = label?.trim() - const normalizedApp = normalizeLabel(appName) - - if (!normalizedLabel || normalizedLabel.length === 0) { - return normalizedApp ?? "Variant unavailable" - } - - if (!normalizedApp) { - return normalizedLabel - } - - return normalizedLabel.toLowerCase().startsWith(normalizedApp.toLowerCase()) - ? normalizedLabel - : `${normalizedApp} ${normalizedLabel}` -} diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunCompareMenu/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunCompareMenu/index.tsx deleted file mode 100644 index 0c85b4c5dd..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunCompareMenu/index.tsx +++ /dev/null @@ -1,272 +0,0 @@ -import {memo, useCallback, useEffect, useMemo, useRef, useState} from "react" - -import {Check, Plus} from "@phosphor-icons/react" -import {Button, ButtonProps, Input, Popover, PopoverProps, Typography, Tag, message} from "antd" -import clsx from "clsx" -import {useAtom, useAtomValue} from "jotai" -import {useRouter} from "next/router" -import {useLocalStorage} from "usehooks-ts" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import useFocusInput from "@/oss/hooks/useFocusInput" -import {EvaluationType} from "@/oss/lib/enums" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import usePreviewEvaluations from "@/oss/lib/hooks/usePreviewEvaluations" -import {EnrichedEvaluationRun} from "@/oss/lib/hooks/usePreviewEvaluations/types" - -import {urlStateAtom} from "../../../state/urlState" - -const filters = ["all", "success", "failed"] -const failedFilters = ["errors", "error", "failed", "failure"] - -const EvalRunCompareMenu = ({ - popoverProps, - buttonProps, - disabled = false, -}: { - popoverProps?: PopoverProps - buttonProps?: ButtonProps - disabled?: boolean -}) => { - const [isMenuOpen, setIsMenuOpen] = useState(false) - const [searchTerm, setSearchTerm] = useState("") - const [filter, setFilter] = useLocalStorage("eval-compare-popup-filter", "") - const {inputRef} = useFocusInput({isOpen: isMenuOpen}) - const router = useRouter() - const runId = useRunId() - // Use ref to track previous compareRunIds to avoid infinite loops - const prevCompareRunIdsRef = useRef([]) - - // atoms - const evaluation = useAtomValue(evaluationRunStateFamily(runId!)) - const [urlState, setUrlState] = useAtom(urlStateAtom) - const enrichedRun = evaluation?.enrichedRun - const compareRunIds = urlState.compare || [] - - const derivedAppId = useMemo(() => { - return enrichedRun?.appId ?? enrichedRun?.variants?.[0]?.appId ?? undefined - }, [enrichedRun]) - - const {runs: projectRuns} = usePreviewEvaluations({ - skip: false, - types: [EvaluationType.auto_exact_match], - appId: "", - }) - - const {runs: appRuns} = usePreviewEvaluations({ - skip: false, - types: [EvaluationType.auto_exact_match], - appId: derivedAppId, - }) - - const runs = (projectRuns.length ? projectRuns : appRuns) as EnrichedEvaluationRun[] - - // Track compare ids locally to avoid redundant work; do not overwrite urlState - useEffect(() => { - const prevIds = prevCompareRunIdsRef.current - const currentIds = compareRunIds - const isDifferent = - prevIds.length !== currentIds.length || - prevIds.some((id, index) => id !== currentIds[index]) - - if (isDifferent) { - prevCompareRunIdsRef.current = [...compareRunIds] - } - }, [compareRunIds]) - - const resolveTestsetIds = useCallback((run?: EnrichedEvaluationRun | null) => { - if (!run) return new Set() - const ids = new Set() - ;(run.testsets ?? []).forEach((testset) => { - if (testset?.id) ids.add(testset.id) - }) - ;(run.data?.steps ?? []).forEach((step) => { - const id = step?.references?.testset?.id - if (id) ids.add(id) - }) - return ids - }, []) - - const evaluations = useMemo(() => { - const baseIds = resolveTestsetIds(enrichedRun) - const baseIdList = Array.from(baseIds) - - const matchedTestsetEvals = runs.filter((run) => { - if (!baseIds.size) return false - const runIds = resolveTestsetIds(run) - return baseIdList.some((id) => runIds.has(id)) - }) - - const evals = matchedTestsetEvals.filter((run) => run?.id !== enrichedRun?.id) - - const autoEvals = evals?.filter( - (run) => - run?.data?.steps.every( - (step) => step?.type !== "annotation" || step?.origin === "auto", - ) && !run?.flags?.is_live, - ) - - return autoEvals - }, [runs, enrichedRun, resolveTestsetIds]) - - const filteredEvals = useMemo(() => { - if (searchTerm.trim().length > 0) { - return evaluations.filter((e) => - e?.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) - } - - if (filter === "success") { - return evaluations.filter((e) => e.status === filter) - } - - if (filter === "failed") { - return evaluations.filter((e) => failedFilters.includes(e.status)) - } - - return evaluations - }, [searchTerm, evaluations, filter]) - - const onMutateRun = useCallback( - async (runId: string) => { - if (compareRunIds.includes(runId)) { - const updatedRuns = compareRunIds.filter((id) => id !== runId) - await router.replace( - { - pathname: router.pathname, - query: {...router.query, compare: updatedRuns}, - }, - undefined, - {shallow: true}, - ) - setUrlState((draft) => { - draft.compare = updatedRuns.length > 0 ? updatedRuns : undefined - }) - } else { - if (compareRunIds.length === 4) { - message.info("You can only compare up to 5 runs") - return - } - await router.replace( - { - pathname: router.pathname, - query: {...router.query, compare: [...compareRunIds, runId]}, - }, - undefined, - {shallow: true}, - ) - setUrlState((draft) => { - draft.compare = [...compareRunIds, runId] - }) - } - }, - [compareRunIds], - ) - - return ( - -
    -
    - - Add evaluations using testset: - - - {enrichedRun?.testsets?.[0]?.name} - -
    - - setSearchTerm(e.target.value)} - /> -
    - -
    - Filters: - - {filters.map((f) => ( - - ))} -
    - - {filteredEvals?.length > 0 ? ( -
    - {filteredEvals?.map((evaluation) => ( -
    onMutateRun(evaluation.id)} - > -
    - - {evaluation.name} - - -
    - - {evaluation.variants?.[0]?.variantName || "-"} - - v{evaluation.variants?.[0]?.revision || "0"} - - - {compareRunIds?.includes(evaluation.id) ? ( - - ) : null} -
    -
    -
    - - {evaluation.description || "No description"} - - - {evaluation.createdAt} - -
    -
    - ))} -
    - ) : ( -
    - No evaluations found -
    - )} - - } - {...popoverProps} - > - -
    - ) -} - -export default memo(EvalRunCompareMenu) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/assets/RunOutput.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/assets/RunOutput.tsx deleted file mode 100644 index e315d4b6ab..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/assets/RunOutput.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import {useMemo} from "react" - -import clsx from "clsx" -import {useAtomValue} from "jotai" - -import SimpleSharedEditor from "@/oss/components/EditorViews/SimpleSharedEditor" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {useInvocationResult} from "@/oss/lib/hooks/useInvocationResult" - -const parseMaybeJson = (value: unknown): any => { - if (typeof value !== "string") return value - try { - return JSON.parse(value) - } catch { - return value - } -} - -const isPlainObject = (value: unknown): value is Record => { - return typeof value === "object" && value !== null && !Array.isArray(value) -} - -const KNOWN_OUTPUT_KEYS = [ - "outputs", - "output", - "response", - "choices", - "message", - "content", - "text", - "value", - "result", - "payload", - "data", -] - -const IGNORED_KEYS = ["inputs", "input", "prompt", "request", "parameter"] - -const extractString = (value: unknown, depth = 0): string | null => { - if (value == null || depth > 10) return null - - const parsed = parseMaybeJson(value) - - if (typeof parsed === "string") { - const trimmed = parsed.trim() - return trimmed.length ? trimmed : null - } - - if (Array.isArray(parsed)) { - for (const item of parsed) { - const candidate = extractString(item, depth + 1) - if (candidate) return candidate - } - return null - } - - if (!isPlainObject(parsed)) return null - - for (const key of KNOWN_OUTPUT_KEYS) { - if (Object.prototype.hasOwnProperty.call(parsed, key)) { - const candidate = extractString(parsed[key], depth + 1) - if (candidate) return candidate - } - } - - for (const [key, nested] of Object.entries(parsed)) { - if (IGNORED_KEYS.some((ignored) => key.toLowerCase().includes(ignored))) continue - const candidate = extractString(nested, depth + 1) - if (candidate) return candidate - } - - try { - const serialised = JSON.stringify(parsed, null, 2) - return serialised.trim().length ? serialised : null - } catch { - return null - } -} - -export const fallbackPrimitive = (value: unknown): string | null => { - if (value == null) return null - if (typeof value === "string") return value - try { - return JSON.stringify(value, null, 2) - } catch { - return String(value) - } -} - -export const resolveOnlineOutput = (sources: unknown[]): string | null => { - for (const source of sources) { - const candidate = extractString(source) - if (candidate && candidate.trim().length > 0) return candidate - } - return null -} - -const RunOutput = ({ - runId, - scenarioId, - stepKey, - showComparisons, -}: { - runId: string - scenarioId?: string - stepKey?: string - showComparisons?: boolean -}) => { - const evalType = useAtomValue(evalTypeAtom) - const { - value, - rawValue, - messageNodes: nodes, - hasError: err, - trace, - } = useInvocationResult({ - scenarioId, - stepKey, - editorType: "simple", - viewType: evalType === "online" ? "table" : "single", - runId, - }) - - const displayValue = useMemo(() => { - if (nodes) return undefined - - if (evalType === "online") { - const sources: unknown[] = [ - rawValue, - value, - trace?.data?.outputs, - trace?.data, - trace?.outputs, - trace?.response, - trace?.tree?.nodes, - trace?.nodes, - ] - - const extracted = resolveOnlineOutput(sources) - const fallback = fallbackPrimitive(value) ?? "N/A" - const result = extracted ?? fallback - - return result - } - - return fallbackPrimitive(value) ?? "N/A" - }, [evalType, nodes, rawValue, value, trace, runId, scenarioId, stepKey]) - - return ( -
    - {nodes ? ( - nodes - ) : ( - {}} - initialValue={displayValue} - syncWithInitialValueChanges - headerName="Output" - editorType="borderless" - state="readOnly" - disabled - readOnly - editorClassName="!text-xs" - error={err} - placeholder="N/A" - className="!w-[97.5%]" - /> - )} -
    - ) -} - -export default RunOutput diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/assets/RunTraceHeader.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/assets/RunTraceHeader.tsx deleted file mode 100644 index fa1d76e0af..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/assets/RunTraceHeader.tsx +++ /dev/null @@ -1,317 +0,0 @@ -import {memo, useMemo} from "react" - -import {Typography, Tooltip} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" -import Link from "next/link" - -import EvalNameTag from "@/oss/components/EvalRunDetails/AutoEvalRun/assets/EvalNameTag" -import {EVAL_TAG_COLOR} from "@/oss/components/EvalRunDetails/AutoEvalRun/assets/utils" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {useRunId} from "@/oss/contexts/RunIdContext" -import useURL from "@/oss/hooks/useURL" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {useInvocationResult} from "@/oss/lib/hooks/useInvocationResult" - -const {Text} = Typography - -const GenerationResultUtils = dynamic( - () => - import( - "@/oss/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils" - ), - {ssr: false}, -) - -const RunTraceHeader = ({ - runId: rId, - scenarioId: scId, - stepKey, - anchorId, - showComparisons, -}: { - runId: string - scenarioId?: string - stepKey?: string - anchorId?: string - showComparisons?: boolean -}) => { - const baseRunId = useRunId() - const state = useAtomValue(evaluationRunStateFamily(rId)) - const enriched = state?.enrichedRun - const {buildUrl} = useURL() - const {trace: runTrace} = useInvocationResult({ - scenarioId: scId, - stepKey: stepKey, - editorType: "simple", - viewType: "single", - runId: rId, - }) - const evaluationType = useAtomValue(evalTypeAtom) - const isOnlineEval = evaluationType === "online" - - const {appSummary, appTooltip, appHref, context} = useMemo(() => { - const toStr = (value: unknown) => { - if (typeof value !== "string") return undefined - const trimmed = value.trim() - return trimmed.length ? trimmed : undefined - } - - const pickFirst = (...values: unknown[]) => { - for (const value of values) { - const str = toStr(value) - if (str) return str - } - return undefined - } - const computeFromRunIndex = () => { - const stepMeta = stepKey ? state?.runIndex?.steps?.[stepKey] : undefined - const refs = (stepMeta as any)?.refs || {} - const revisionRef = - refs?.applicationRevision || refs?.application_revision || refs?.revision || {} - const applicationRef = - refs?.application || - refs?.applicationRef || - refs?.application_ref || - (revisionRef as any)?.application || - {} - - const revisionId = pickFirst( - revisionRef?.id, - revisionRef?.variantId, - revisionRef?.revisionId, - ) - const variants = Array.isArray(enriched?.variants) - ? (enriched?.variants as unknown[] as Record[]) - : [] - const matchedVariant = - (revisionId - ? variants.find((variant: Record) => { - const candidates = [ - toStr(variant?.id), - toStr(variant?.variantId), - toStr(variant?._revisionId), - toStr(variant?.revisionId), - ].filter(Boolean) - return candidates.includes(revisionId) - }) - : undefined) || variants[0] - - const appName = pickFirst( - applicationRef?.name, - applicationRef?.slug, - matchedVariant?.appName, - matchedVariant?.application?.name, - enriched?.appName, - (enriched as any)?.app_name, - (enriched as any)?.app?.name, - ) - - const appId = pickFirst( - applicationRef?.id, - revisionRef?.applicationId, - matchedVariant?.appId, - matchedVariant?.application?.id, - enriched?.appId, - (enriched as any)?.app_id, - (enriched as any)?.app?.id, - ) - - const variantName = pickFirst( - revisionRef?.variantName, - revisionRef?.name, - matchedVariant?.variantName, - matchedVariant?.name, - ) - - const revisionLabel = pickFirst( - revisionRef?.revisionLabel, - revisionRef?.revision, - revisionRef?.version, - matchedVariant?.revision, - matchedVariant?.version, - ) - - return {appId, appName, variantName, revisionLabel} - } - - const computeFromTrace = () => { - if (!runTrace) return {} - - const collectedRefs: any[] = [] - const addRef = (ref: any, keyHint?: string) => { - if (!ref || typeof ref !== "object") return - const normalized = {...ref} - if (keyHint && !normalized.key) normalized.key = keyHint - if (keyHint && normalized.attributes && !normalized.attributes.key) { - normalized.attributes = {...normalized.attributes, key: keyHint} - } - collectedRefs.push(normalized) - } - - const pushRefs = (node: any) => { - if (!node || typeof node !== "object") return - - if (Array.isArray(node.references)) { - node.references.forEach((ref: any) => addRef(ref)) - } - - if (node.refs && typeof node.refs === "object") { - Object.entries(node.refs).forEach(([key, value]) => { - if (Array.isArray(value)) { - value.forEach((entry) => addRef(entry, key)) - } else { - addRef(value, key) - } - }) - } - - if (Array.isArray(node.nodes)) { - node.nodes.forEach(pushRefs) - } else if (node.nodes && typeof node.nodes === "object") { - Object.values(node.nodes).forEach(pushRefs) - } - - if (Array.isArray(node.children)) { - node.children.forEach(pushRefs) - } - } - - pushRefs(runTrace) - if (runTrace?.tree) pushRefs(runTrace.tree) - - const findRef = (...keys: string[]) => - collectedRefs.find((ref: any) => { - const refKey = pickFirst(ref?.attributes?.key, ref?.key) - return refKey ? keys.includes(refKey) : false - }) - - const appRef = findRef("application", "app") - const variantRef = findRef( - "application_revision", - "application_variant", - "variant", - "revision", - ) - - const appId = pickFirst( - appRef?.id, - appRef?.attributes?.id, - appRef?.attributes?.applicationId, - appRef?.attributes?.appId, - ) - const appName = pickFirst( - appRef?.attributes?.name, - appRef?.attributes?.label, - appRef?.attributes?.application?.name, - appRef?.slug, - appRef?.name, - ) - const variantName = pickFirst( - variantRef?.attributes?.name, - variantRef?.attributes?.variantName, - variantRef?.slug, - variantRef?.name, - ) - const revisionLabel = pickFirst( - variantRef?.attributes?.revision, - variantRef?.attributes?.version, - variantRef?.attributes?.label, - ) - - return {appId, appName, variantName, revisionLabel} - } - - const runIndexContext = computeFromRunIndex() - const traceContext = isOnlineEval ? computeFromTrace() : {} - const context = isOnlineEval - ? { - appId: traceContext.appId || runIndexContext.appId, - appName: traceContext.appName || runIndexContext.appName, - variantName: traceContext.variantName || runIndexContext.variantName, - revisionLabel: traceContext.revisionLabel || runIndexContext.revisionLabel, - } - : runIndexContext - - const resolvedAppId = context.appId - const resolvedAppName = context.appName - const resolvedVariantName = context.variantName - const resolvedRevisionLabel = context.revisionLabel - - const variantSummary = resolvedVariantName - ? `${resolvedVariantName}${resolvedRevisionLabel ? ` v${resolvedRevisionLabel}` : ""}` - : undefined - - const summaryBase = [resolvedAppName, variantSummary].filter(Boolean).join(" • ") - const display = - summaryBase || - resolvedAppName || - (resolvedAppId ? `App ${resolvedAppId.slice(-6)}` : "Application unavailable") - - const tooltipParts = [ - resolvedAppName ? `App: ${resolvedAppName}` : null, - resolvedAppId ? `ID: ${resolvedAppId}` : null, - resolvedVariantName ? `Variant: ${resolvedVariantName}` : null, - resolvedRevisionLabel ? `Revision: ${resolvedRevisionLabel}` : null, - ].filter(Boolean) as string[] - - const href = resolvedAppId ? buildUrl({appId: resolvedAppId, isAppUrl: true}) : undefined - - return { - appSummary: display, - appTooltip: tooltipParts.length ? tooltipParts.join(" · ") : undefined, - appHref: href, - context, - } - }, [buildUrl, enriched, isOnlineEval, runTrace, state?.runIndex?.steps, stepKey]) - - return ( -
    -
    - {enriched ? ( - - ) : ( -
    - )} -
    - {runTrace ? ( - - ) : ( -
    - )} -
    - ) -} - -export default memo(RunTraceHeader) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/index.tsx deleted file mode 100644 index d274272ee9..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/index.tsx +++ /dev/null @@ -1,2319 +0,0 @@ -import {useCallback, useEffect, useMemo, useRef, useState} from "react" - -import SimpleSharedEditor from "@agenta/oss/src/components/EditorViews/SimpleSharedEditor" -import VirtualizedSharedEditors from "@agenta/oss/src/components/EditorViews/VirtualizedSharedEditors" -import {Collapse, CollapseProps, Tag, Tooltip} from "antd" -import clsx from "clsx" -import {atom, getDefaultStore, useAtomValue} from "jotai" -import {useRouter} from "next/router" - -import {renderChatMessages} from "@/oss/components/EvalRunDetails/assets/renderChatMessages" -import {STATUS_COLOR} from "@/oss/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets" -import { - GeneralAutoEvalMetricColumns, - GeneralHumanEvalMetricColumns, -} from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants" -import {titleCase} from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder" -import ScenarioTraceSummary from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ScenarioTraceSummary" -import {comparisonRunsStepsAtom} from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useExpandableComparisonDataSource" -import {useCachedScenarioSteps} from "@/oss/components/EvalRunDetails/hooks/useCachedScenarioSteps" -import {useMetricStepError} from "@/oss/components/EvalRunDetails/hooks/useMetricStepError" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {focusScenarioAtom} from "@/oss/components/EvalRunDetails/state/focusScenarioAtom" -import {urlStateAtom} from "@/oss/components/EvalRunDetails/state/urlState" -import MetricDetailsPopover from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover" -import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" -import {getStatusLabel} from "@/oss/lib/constants/statusLabels" -import { - evaluationRunStateFamily, - runMetricsStatsCacheFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {runScopedMetricDataFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {scenarioMetricSelectorFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import {useInvocationResult} from "@/oss/lib/hooks/useInvocationResult" -import { - canonicalizeMetricKey, - getMetricValueWithAliases, - inferMetricType, -} from "@/oss/lib/metricUtils" -import {EvaluationStatus} from "@/oss/lib/Types" -import {useAppState} from "@/oss/state/appState" - -import FocusDrawerContentSkeleton from "../Skeletons/FocusDrawerContentSkeleton" - -import RunOutput, {fallbackPrimitive, resolveOnlineOutput} from "./assets/RunOutput" -import RunTraceHeader from "./assets/RunTraceHeader" -import { - getFromAnnotationOutputs, - resolveEvaluatorMetricsMap, - SCENARIO_METRIC_ALIASES, - asEvaluatorArray, - extractEvaluatorSlug, - extractEvaluatorName, - findAnnotationStepKey, - collectSlugCandidates, - collectEvaluatorIdentifiers, - pickString, - buildDrawerMetricDefinition, -} from "./lib/helpers" - -const EMPTY_COMPARISON_RUN_IDS: string[] = [] - -type EvaluatorFailure = {status?: string; error?: string} | null - -const FOCUS_DRAWER_DEBUG = true - -const emptyScenarioMetricsAtom = atom | undefined>(undefined) -const emptyStatsAtom = atom | undefined>(undefined) -const emptyMetricDataAtom = atom<{value: any; distInfo?: any}>({ - value: undefined, - distInfo: undefined, -}) - -export interface DrawerMetricValueCellProps { - runId: string - scenarioId?: string - evaluatorSlug: string - metricName: string - metricKey?: string - fallbackKeys?: string[] - invocationStepKey?: string - scenarioStepsResult?: { - data?: UseEvaluationRunScenarioStepsFetcherResult - state?: ReturnType["state"] - hasResolved?: boolean - error?: unknown - } - context?: EvaluatorContext - suppressFailure?: boolean -} - -interface EvaluatorContext { - slugCandidates: string[] - annotationStepKey?: string - errorStep?: EvaluatorFailure -} - -export interface DrawerEvaluatorMetric { - id: string - displayName: string - metricKey?: string - fallbackKeys?: string[] -} - -const normalizeMetricPrimaryKey = (slug: string | undefined, rawKey: string): string => { - const normalizedSlug = slug && slug.trim().length > 0 ? slug.trim() : undefined - const trimmed = rawKey.trim() - if (!trimmed) return normalizedSlug ?? "" - if (normalizedSlug) { - const prefix = `${normalizedSlug}.` - if (trimmed.startsWith(prefix)) return trimmed - } - if (trimmed.includes(".")) return trimmed - return normalizedSlug ? `${normalizedSlug}.${trimmed}` : trimmed -} - -const INVOCATION_METRIC_PREFIX = "attributes.ag.metrics" -const INVOCATION_METRIC_SIGNATURE = `.attributes.ag.metrics` - -const isInvocationMetricKey = (key?: string): boolean => { - if (!key) return false - return key.startsWith(INVOCATION_METRIC_PREFIX) || key.includes(INVOCATION_METRIC_SIGNATURE) -} - -const filterInvocationMetricDefinitions = ( - metrics: DrawerEvaluatorMetric[], -): DrawerEvaluatorMetric[] => metrics.filter((metric) => !isInvocationMetricKey(metric.metricKey)) - -const stripOutputsPrefixes = (key: string): string => { - let result = key - const OUTPUT_PREFIX = "attributes.ag.data.outputs." - const METRIC_PREFIX = "attributes.ag.metrics." - while (result.startsWith(OUTPUT_PREFIX)) { - result = result.slice(OUTPUT_PREFIX.length) - } - while (result.startsWith(METRIC_PREFIX)) { - result = result.slice(METRIC_PREFIX.length) - } - return result -} - -const normalizeMetricKeyForSlug = (key: string | undefined, slug?: string): string => { - if (!key) return "" - let result = key.trim() - if (!result) return "" - if (slug && result.startsWith(`${slug}.`)) { - result = result.slice(slug.length + 1) - } - result = stripOutputsPrefixes(result) - return result -} - -const dedupeEvaluatorMetricDefinitions = ( - metrics: DrawerEvaluatorMetric[], - slug?: string, -): DrawerEvaluatorMetric[] => { - const map = new Map() - metrics.forEach((metric) => { - const normalizedKey = normalizeMetricKeyForSlug(metric.metricKey ?? metric.id, slug) - const existing = map.get(normalizedKey) - if (!existing) { - map.set(normalizedKey, metric) - return - } - const fallbackKeys = new Set([ - ...(existing.fallbackKeys || []), - ...(metric.fallbackKeys || []), - ]) - const preferred = - isInvocationMetricKey(existing.metricKey) && !isInvocationMetricKey(metric.metricKey) - ? metric - : existing - map.set(normalizedKey, { - ...preferred, - fallbackKeys: fallbackKeys.size ? Array.from(fallbackKeys) : preferred.fallbackKeys, - }) - }) - return Array.from(map.values()) -} - -const collectMetricFallbackKeys = ( - slug: string | undefined, - rawKey: string, - primaryKey: string, - meta: any, -): string[] => { - const set = new Set() - const normalizedSlug = slug && slug.trim().length > 0 ? slug.trim() : undefined - const push = (value?: string) => { - if (!value) return - const trimmed = String(value).trim() - if (!trimmed) return - if (trimmed.includes(".") || !normalizedSlug) { - set.add(trimmed) - } else { - set.add(`${normalizedSlug}.${trimmed}`) - } - } - - push(rawKey) - - const aliases = Array.isArray(meta?.aliases) - ? meta?.aliases - : meta?.aliases - ? [meta.aliases] - : meta?.alias - ? [meta.alias] - : [] - aliases.forEach(push) - - const extraKeys = [ - meta?.metricKey, - meta?.metric_key, - meta?.key, - meta?.path, - meta?.fullKey, - meta?.full_key, - meta?.canonicalKey, - meta?.canonical_key, - meta?.statsKey, - meta?.stats_key, - meta?.metric, - ] - extraKeys.forEach(push) - - const fallbackKeys = Array.from(set).filter((value) => value !== rawKey && value !== primaryKey) - return fallbackKeys -} - -// const buildDrawerMetricDefinition = ( -// slug: string | undefined, -// rawKey: string, -// meta: any, -// ): DrawerEvaluatorMetric => { -// const normalizedSlug = slug && slug.trim().length > 0 ? slug.trim() : undefined -// const normalizedDisplayBase = -// normalizedSlug && rawKey.startsWith(`${normalizedSlug}.`) -// ? rawKey.slice(normalizedSlug.length + 1) -// : rawKey -// const normalizedDisplay = stripOutputsPrefixes(normalizedDisplayBase) -// const primaryKey = normalizeMetricPrimaryKey(slug, rawKey) -// const fallbackKeys = collectMetricFallbackKeys(slug, rawKey, primaryKey, meta) -// const id = canonicalizeMetricKey(primaryKey) || primaryKey - -// return { -// id, -// displayName: normalizedDisplay || primaryKey, -// metricKey: primaryKey, -// fallbackKeys: fallbackKeys.length ? fallbackKeys : undefined, -// } -// } - -const collectCandidateSteps = (data?: UseEvaluationRunScenarioStepsFetcherResult): any[] => { - if (!data) return [] - const buckets: any[] = [] - if (Array.isArray(data.annotationSteps)) buckets.push(...(data.annotationSteps as any[])) - if (Array.isArray(data.steps)) buckets.push(...(data.steps as any[])) - if (Array.isArray(data.invocationSteps)) buckets.push(...(data.invocationSteps as any[])) - return buckets -} - -// const collectSlugCandidates = ( -// data: UseEvaluationRunScenarioStepsFetcherResult | undefined, -// evaluatorSlug: string, -// ): string[] => { -// const set = new Set() -// const push = (value?: string | null) => { -// if (!value) return -// const normalized = String(value).trim() -// if (!normalized) return -// set.add(normalized) -// } - -// push(evaluatorSlug) - -// const steps = collectCandidateSteps(data) -// steps.forEach((step) => { -// if (!step) return -// const ref: any = step?.references?.evaluator -// push(step?.stepKey as any) -// push(step?.stepkey as any) -// push(step?.step_key as any) -// push(ref?.slug) -// push(ref?.key) -// push(ref?.id) -// }) - -// return Array.from(set) -// } - -// const findAnnotationStepKey = ( -// data: UseEvaluationRunScenarioStepsFetcherResult | undefined, -// slugCandidates: string[], -// ): string | undefined => { -// if (!data) return undefined - -// const steps = collectCandidateSteps(data) -// if (!steps.length) return undefined - -// const loweredCandidates = slugCandidates -// .map((slug) => String(slug).toLowerCase()) -// .filter((slug) => slug.length > 0) - -// const matched = steps.find((step) => { -// if (!step) return false -// const possible: string[] = [ -// (step as any)?.stepKey, -// (step as any)?.stepkey, -// (step as any)?.step_key, -// (step as any)?.references?.evaluator?.slug, -// (step as any)?.references?.evaluator?.key, -// (step as any)?.references?.evaluator?.id, -// ] - -// return possible -// .filter(Boolean) -// .map((value) => String(value).toLowerCase()) -// .some((candidate) => loweredCandidates.includes(candidate)) -// }) - -// return ( -// (matched as any)?.stepKey ?? -// (matched as any)?.stepkey ?? -// (matched as any)?.step_key ?? -// undefined -// ) -// } - -const EvaluatorFailureDisplay = ({ - status, - error, - editorKey, -}: { - status?: string - error?: string - editorKey: string -}) => { - const tooltipContent = - typeof error === "string" && error.length - ? error - : "Evaluator returned an error for this metric." - - const tagColor = - status && Object.prototype.hasOwnProperty.call(STATUS_COLOR, status) - ? (STATUS_COLOR as Record)[status] - : STATUS_COLOR[EvaluationStatus.ERROR] - - const isLongError = tooltipContent.length > 200 || /\n/.test(tooltipContent) - - return ( -
    - {tooltipContent}} - classNames={{body: "max-w-[320px] max-h-[320px] overflow-y-auto"}} - > - - {getStatusLabel(status || EvaluationStatus.ERROR)} - - - {isLongError ? ( - {}} - initialValue={tooltipContent} - editorType="borderless" - state="readOnly" - disabled - readOnly - editorClassName="!text-xs" - placeholder="N/A" - className="!w-[97.5%]" - /> - ) : ( -
    - {tooltipContent} -
    - )} -
    - ) -} - -const DrawerMetricValueCell = ({ - runId, - scenarioId, - evaluatorSlug, - metricName, - metricKey, - fallbackKeys, - invocationStepKey, - scenarioStepsResult, - context, - suppressFailure, -}: DrawerMetricValueCellProps) => { - const fallbackSlugCandidates = useMemo( - () => collectSlugCandidates(scenarioStepsResult?.data, evaluatorSlug), - [scenarioStepsResult?.data, evaluatorSlug], - ) - - const slugCandidates = context?.slugCandidates ?? fallbackSlugCandidates - - const fallbackAnnotationStepKey = useMemo(() => { - if (context?.annotationStepKey !== undefined) return undefined - return findAnnotationStepKey(scenarioStepsResult?.data, slugCandidates) - }, [context?.annotationStepKey, scenarioStepsResult?.data, slugCandidates]) - - const annotationStepKey = context?.annotationStepKey ?? fallbackAnnotationStepKey - - const stepSlug = invocationStepKey ?? undefined - - const normalizedPrimaryKey = useMemo(() => { - const trimmedMetricKey = typeof metricKey === "string" ? metricKey.trim() : "" - if (trimmedMetricKey.length > 0) { - return trimmedMetricKey.includes(".") - ? trimmedMetricKey - : `${evaluatorSlug}.${trimmedMetricKey}` - } - const trimmedMetricName = typeof metricName === "string" ? metricName.trim() : "" - if (trimmedMetricName.length === 0) { - return evaluatorSlug - } - if (trimmedMetricName.includes(".")) { - return trimmedMetricName - } - return `${evaluatorSlug}.${trimmedMetricName}` - }, [metricKey, metricName, evaluatorSlug]) - - const normalizedFallbackKeys = useMemo(() => { - if (!fallbackKeys || fallbackKeys.length === 0) return [] - return fallbackKeys - .map((key) => { - if (!key) return undefined - const trimmed = String(key).trim() - if (!trimmed) return undefined - return trimmed.includes(".") ? trimmed : `${evaluatorSlug}.${trimmed}` - }) - .filter(Boolean) as string[] - }, [fallbackKeys, evaluatorSlug]) - - const barePrimaryKey = useMemo(() => { - const prefix = `${evaluatorSlug}.` - return normalizedPrimaryKey.startsWith(prefix) - ? normalizedPrimaryKey.slice(prefix.length) - : normalizedPrimaryKey - }, [normalizedPrimaryKey, evaluatorSlug]) - - const canonicalPrimaryKey = useMemo( - () => canonicalizeMetricKey(normalizedPrimaryKey), - [normalizedPrimaryKey], - ) - const canonicalBareKey = useMemo(() => canonicalizeMetricKey(barePrimaryKey), [barePrimaryKey]) - - const hasScenarioId = - typeof scenarioId === "string" && - scenarioId.trim().length > 0 && - scenarioId !== "__missing__" - const safeScenarioId = hasScenarioId ? scenarioId : (`__missing__::${runId}` as string) - - const runScopedAtoms = useMemo(() => { - if (!hasScenarioId || !runId) { - return { - primary: emptyMetricDataAtom, - canonical: emptyMetricDataAtom, - bare: emptyMetricDataAtom, - canonicalBare: emptyMetricDataAtom, - } - } - - const args = { - runId, - scenarioId: scenarioId as string, - stepSlug, - } - - return { - primary: runScopedMetricDataFamily({...args, metricKey: normalizedPrimaryKey}), - canonical: runScopedMetricDataFamily({...args, metricKey: canonicalPrimaryKey}), - bare: runScopedMetricDataFamily({...args, metricKey: barePrimaryKey}), - canonicalBare: runScopedMetricDataFamily({...args, metricKey: canonicalBareKey}), - } - }, [ - barePrimaryKey, - canonicalBareKey, - canonicalPrimaryKey, - hasScenarioId, - normalizedPrimaryKey, - runId, - scenarioId, - stepSlug, - ]) - - const primaryMetricData = useAtomValue(runScopedAtoms.primary) - const canonicalMetricData = useAtomValue(runScopedAtoms.canonical) - const bareMetricData = useAtomValue(runScopedAtoms.bare) - const canonicalBareMetricData = useAtomValue(runScopedAtoms.canonicalBare) - - const runScopedStats = useAtomValue(runMetricsStatsCacheFamily(runId)) - - const runScopedResult = useMemo(() => { - const candidates = [ - {key: normalizedPrimaryKey, data: primaryMetricData}, - {key: canonicalPrimaryKey, data: canonicalMetricData}, - {key: barePrimaryKey, data: bareMetricData}, - {key: canonicalBareKey, data: canonicalBareMetricData}, - ] - - const resolved = candidates.find((entry) => entry.data?.value !== undefined) - if (resolved) { - return { - value: resolved.data?.value, - distInfo: resolved.data?.distInfo, - key: resolved.key, - } - } - return {value: undefined, distInfo: undefined, key: undefined} - }, [ - bareMetricData, - barePrimaryKey, - canonicalBareKey, - canonicalBareMetricData, - canonicalMetricData, - canonicalPrimaryKey, - normalizedPrimaryKey, - primaryMetricData, - ]) - - const providedErrorStep = context?.errorStep - - const {errorStep: computedErrorStep} = useMetricStepError({ - runId, - scenarioId, - metricKey: normalizedPrimaryKey, - slugCandidates, - stepKey: annotationStepKey, - scenarioStepsResult, - }) - - const errorStep = providedErrorStep ?? computedErrorStep - - const hasFailure = Boolean(errorStep?.status || errorStep?.error) - - const scenarioMetricsAtom = useMemo(() => { - if (!runId || !hasScenarioId) return emptyScenarioMetricsAtom - return scenarioMetricSelectorFamily({runId, scenarioId: safeScenarioId}) - }, [hasScenarioId, runId, safeScenarioId]) - const scenarioMetrics = useAtomValue(scenarioMetricsAtom) as Record | undefined - - const runMetricsStatsAtom = useMemo(() => { - if (!runId) return emptyStatsAtom - return runMetricsStatsCacheFamily(runId) - }, [runId]) - const runMetricsStatsMap = useAtomValue(runMetricsStatsAtom) - - const buildCandidateKeys = useCallback( - (base: string): string[] => { - const candidates: string[] = [] - const push = (candidate?: string) => { - if (!candidate) return - if (candidates.includes(candidate)) return - candidates.push(candidate) - } - - push(base) - - const slug = stepSlug || base.split(".")[0] - const withoutSlug = - slug && base.startsWith(`${slug}.`) ? base.slice(slug.length + 1) : base - - if (slug) { - push(`${slug}.${withoutSlug}`) - push(`${slug}.attributes.ag.data.outputs.${withoutSlug}`) - push(`${slug}.attributes.ag.metrics.${withoutSlug}`) - push(`attributes.ag.data.outputs.${slug}.${withoutSlug}`) - push(`attributes.ag.metrics.${slug}.${withoutSlug}`) - } - - push(`attributes.ag.data.outputs.${withoutSlug}`) - push(`attributes.ag.metrics.${withoutSlug}`) - push(`attributes.ag.data.outputs.${base}`) - push(`attributes.ag.metrics.${base}`) - - return candidates - }, - [stepSlug], - ) - - const expandCandidateKeys = useCallback( - (base: string): string[] => { - const set = new Set() - buildCandidateKeys(base).forEach((candidate) => set.add(candidate)) - if (stepSlug && !base.startsWith(`${stepSlug}.`)) { - buildCandidateKeys(`${stepSlug}.${base}`).forEach((candidate) => set.add(candidate)) - } - if (annotationStepKey && !base.startsWith(`${annotationStepKey}.`)) { - buildCandidateKeys(`${annotationStepKey}.${base}`).forEach((candidate) => - set.add(candidate), - ) - } - return Array.from(set) - }, - [annotationStepKey, buildCandidateKeys, stepSlug], - ) - - const baseCandidates = useMemo(() => { - const set = new Set() - const push = (value?: string) => { - if (!value) return - const trimmed = String(value).trim() - if (!trimmed) return - set.add(trimmed) - } - - push(normalizedPrimaryKey) - push(canonicalPrimaryKey) - push(barePrimaryKey) - push(canonicalBareKey) - push(metricName) - if (metricName && metricName !== barePrimaryKey) { - push(canonicalizeMetricKey(metricName)) - } - normalizedFallbackKeys.forEach((key) => { - push(key) - push(canonicalizeMetricKey(key)) - const withoutSlug = key.startsWith(`${evaluatorSlug}.`) - ? key.slice(evaluatorSlug.length + 1) - : key - push(withoutSlug) - push(canonicalizeMetricKey(withoutSlug)) - }) - - return Array.from(set) - }, [ - normalizedPrimaryKey, - canonicalPrimaryKey, - barePrimaryKey, - canonicalBareKey, - metricName, - normalizedFallbackKeys, - evaluatorSlug, - ]) - - const expandedCandidates = useMemo(() => { - const set = new Set() - baseCandidates.forEach((candidate) => { - expandCandidateKeys(candidate).forEach((expanded) => set.add(expanded)) - }) - return Array.from(set) - }, [baseCandidates, expandCandidateKeys]) - - const resolution = useMemo(() => { - if (runScopedResult.value !== undefined) { - return { - rawValue: runScopedResult.value as any, - matchedKey: runScopedResult.key, - distInfo: runScopedResult.distInfo, - } - } - - if (!scenarioMetrics || !expandedCandidates.length) { - return { - rawValue: undefined as any, - matchedKey: undefined as string | undefined, - distInfo: undefined, - } - } - - for (const candidate of expandedCandidates) { - const resolved = getMetricValueWithAliases(scenarioMetrics, candidate) - if (resolved !== undefined) { - return {rawValue: resolved, matchedKey: candidate, distInfo: undefined} - } - } - - const looseMatchKey = Object.keys(scenarioMetrics).find((key) => { - if (!key) return false - if (key === normalizedPrimaryKey) return true - if (key === canonicalPrimaryKey) return true - if (key.endsWith(`.${barePrimaryKey}`)) return true - if (metricName && key.endsWith(`.${metricName}`)) return true - if (metricName && key.includes(`${metricName}.`)) return true - if (evaluatorSlug && key.includes(`${evaluatorSlug}.${metricName}`)) return true - if (evaluatorSlug && key.includes(`${evaluatorSlug}.${barePrimaryKey}`)) return true - return false - }) - - if (looseMatchKey) { - const resolved = scenarioMetrics[looseMatchKey] - if (resolved !== undefined) { - return {rawValue: resolved, matchedKey: looseMatchKey, distInfo: undefined} - } - } - - return { - rawValue: undefined as any, - matchedKey: undefined as string | undefined, - distInfo: undefined, - } - }, [ - expandedCandidates, - normalizedPrimaryKey, - runId, - runScopedResult, - scenarioId, - scenarioMetrics, - evaluatorSlug, - ]) - - // Prefer run-scoped/metrics-map value; if it is missing or schema-like, fallback to annotation outputs - const annotationFallback = useMemo(() => { - const v = resolution.rawValue - const isSchemaLike = - v && - typeof v === "object" && - !Array.isArray(v) && - Object.keys(v as any).length <= 2 && - "type" in (v as any) - - const unusable = - v === undefined || - v === null || - (typeof v === "string" && !v.trim()) || - (typeof v === "number" && Number.isNaN(v)) || - isSchemaLike - - if (!unusable) return undefined - - return getFromAnnotationOutputs({ - scenarioStepsResult, - slugCandidates, - evaluatorSlug, - expandedCandidates, - }) - }, [ - resolution.rawValue, - scenarioStepsResult, - slugCandidates, - evaluatorSlug, - expandedCandidates, - ]) - - const rawValue = annotationFallback?.value ?? resolution.rawValue - const matchedKey = annotationFallback?.matchedKey ?? resolution.matchedKey - - const distInfo = useMemo(() => { - if (resolution.distInfo !== undefined) return resolution.distInfo - if (!runMetricsStatsMap) return undefined - - if (matchedKey) { - const direct = runMetricsStatsMap[matchedKey] - if (direct !== undefined) return direct - const canonical = canonicalizeMetricKey(matchedKey) - if (runMetricsStatsMap[canonical] !== undefined) return runMetricsStatsMap[canonical] - } - - for (const candidate of expandedCandidates) { - const direct = runMetricsStatsMap[candidate] - if (direct !== undefined) return direct - const canonical = canonicalizeMetricKey(candidate) - if (runMetricsStatsMap[canonical] !== undefined) return runMetricsStatsMap[canonical] - } - - return undefined - }, [expandedCandidates, matchedKey, resolution.distInfo, runMetricsStatsMap]) - - if (!hasScenarioId || !runId) { - return ( - - N/A - - ) - } - - if (hasFailure) { - const tooltipContent = - typeof errorStep?.error === "string" && errorStep.error.length - ? errorStep.error - : "Evaluator returned an error for this metric." - - const tagColor = - errorStep?.status && - Object.prototype.hasOwnProperty.call(STATUS_COLOR, errorStep.status) - ? (STATUS_COLOR as Record)[errorStep.status] - : STATUS_COLOR[EvaluationStatus.ERROR] - - const statusLabel = getStatusLabel(errorStep?.status || EvaluationStatus.ERROR) - - const statusTag = ( - {tooltipContent}} - classNames={{body: "max-w-[320px] max-h-[320px] overflow-y-auto"}} - > - - {statusLabel} - - - ) - - if (suppressFailure) { - return statusTag - } - - return ( - - ) - } - - let normalizedValue: any = rawValue - - if ( - normalizedValue !== null && - typeof normalizedValue === "object" && - !Array.isArray(normalizedValue) - ) { - const normalizedObject = normalizedValue as Record - if (Array.isArray(normalizedObject.frequency) && normalizedObject.frequency.length > 0) { - const entry = normalizedObject.frequency.reduce((max: any, current: any) => - (current?.count ?? 0) > (max?.count ?? 0) ? current : max, - ) - normalizedValue = entry?.value ?? entry - } else if (typeof normalizedObject.mean === "number") { - normalizedValue = normalizedObject.mean - } else if (typeof normalizedObject.score === "number") { - normalizedValue = normalizedObject.score - } else { - const primitive = Object.values(normalizedObject).find( - (v) => typeof v === "number" || typeof v === "string" || typeof v === "boolean", - ) - normalizedValue = primitive !== undefined ? primitive : JSON.stringify(normalizedObject) - } - } - - if ( - normalizedValue === undefined || - normalizedValue === null || - (typeof normalizedValue === "number" && Number.isNaN(normalizedValue)) || - (typeof normalizedValue === "string" && normalizedValue.trim() === "") - ) { - return ( - - N/A - - ) - } - - const highlightValue = normalizedValue - - let display: string - if (typeof normalizedValue === "boolean") { - display = normalizedValue ? "true" : "false" - } else if (Array.isArray(normalizedValue)) { - display = JSON.stringify(normalizedValue) - } else if (typeof normalizedValue === "object") { - display = JSON.stringify(normalizedValue) - } else { - display = String(formatMetricValue(metricName, normalizedValue)) - } - - const isLongText = display.length > 180 || /\n/.test(display) - if (isLongText) { - const editorKey = `${runId}-${scenarioId}-${evaluatorSlug}-${metricName}` - return ( - {}} - initialValue={display} - editorType="borderless" - state="readOnly" - disabled - readOnly - editorClassName="!text-xs" - placeholder="N/A" - className="!w-[97.5%]" - /> - ) - } - - const hasDistribution = - distInfo && - typeof distInfo === "object" && - !Array.isArray(distInfo) && - Object.keys(distInfo).length > 0 - - const tagNode = ( - - {display} - - ) - - if (hasDistribution) { - const inferredType = inferMetricType(highlightValue) - return ( - - {tagNode} - - ) - } - - return tagNode -} - -interface EvaluatorContextOptions { - runId: string - scenarioId?: string - evaluatorSlug: string - scenarioStepsResult?: DrawerMetricValueCellProps["scenarioStepsResult"] -} - -const useEvaluatorContext = ({ - runId, - scenarioId, - evaluatorSlug, - scenarioStepsResult, -}: EvaluatorContextOptions): EvaluatorContext => { - const slugCandidates = useMemo( - () => collectSlugCandidates(scenarioStepsResult?.data, evaluatorSlug), - [scenarioStepsResult?.data, evaluatorSlug], - ) - - const annotationStepKey = useMemo( - () => findAnnotationStepKey(scenarioStepsResult?.data, slugCandidates), - [scenarioStepsResult?.data, slugCandidates], - ) - - const derivedMetricKey = - evaluatorSlug && evaluatorSlug.length > 0 ? `${evaluatorSlug}.__drawer__` : "__drawer__" - - const {errorStep} = useMetricStepError({ - runId, - scenarioId, - metricKey: derivedMetricKey, - slugCandidates, - stepKey: annotationStepKey, - scenarioStepsResult, - }) - - return useMemo( - () => ({ - slugCandidates, - annotationStepKey, - errorStep, - }), - [slugCandidates, annotationStepKey, errorStep], - ) -} - -interface EvaluatorRunMetricsProps { - runId: string - scenarioId?: string - evaluatorSlug: string - metrics: DrawerEvaluatorMetric[] - invocationStepKey?: string - scenarioStepsResult?: DrawerMetricValueCellProps["scenarioStepsResult"] - sectionId?: string - metricRowClassName?: string -} - -const EvaluatorRunMetrics = ({ - runId, - scenarioId, - evaluatorSlug, - metrics, - invocationStepKey, - scenarioStepsResult, - sectionId, - metricRowClassName = "flex flex-col items-start gap-2 mb-3", -}: EvaluatorRunMetricsProps) => { - const context = useEvaluatorContext({ - runId, - scenarioId, - evaluatorSlug, - scenarioStepsResult, - }) - - const hasFailure = Boolean(context.errorStep?.status || context.errorStep?.error) - - if (!metrics.length) { - return ( -
    - {hasFailure ? ( - - ) : null} - - N/A - -
    - ) - } - - return ( -
    - {hasFailure ? ( - - ) : null} - {metrics.map((metric) => ( -
    - {metric.displayName} - -
    - ))} -
    - ) -} - -interface ScenarioRunMetricsProps { - runId: string - scenarioId?: string - metrics: DrawerEvaluatorMetric[] - sectionId?: string - metricRowClassName?: string -} - -const ScenarioRunMetrics = ({ - runId, - scenarioId, - metrics, - sectionId, - metricRowClassName = "flex flex-col items-start gap-2 mb-3", -}: ScenarioRunMetricsProps) => { - if (!metrics.length) { - return ( -
    - - N/A - -
    - ) - } - - return ( -
    - {metrics.map((metric) => ( -
    - {metric.displayName} - -
    - ))} -
    - ) -} - -const FocusDrawerContent = () => { - const router = useRouter() - const appState = useAppState() - const evalType = useAtomValue(evalTypeAtom) - const isOnlineEval = evalType === "online" - - const [windowHight, setWindowHight] = useState(0) - const [activeKeys, setActiveKeys] = useState<(string | number)[]>([ - "input", - "output", - "evaluators", - ]) - - const {data: previewEvaluators} = useEvaluators({preview: true}) - const {data: projectEvaluators} = useEvaluators() - - // atoms - const focus = useAtomValue(focusScenarioAtom) - const urlState = useAtomValue(urlStateAtom) - const scenarioId = focus?.focusScenarioId as string - const runId = focus?.focusRunId as string - const rawCompareRunIds = Array.isArray(urlState?.compare) ? urlState.compare : [] - const compareRunIdsKey = rawCompareRunIds.join("|") - const evaluationRunData = useAtomValue(evaluationRunStateFamily(runId!)) - const comparisonRunIds = useMemo(() => { - if (!rawCompareRunIds.length) return EMPTY_COMPARISON_RUN_IDS - return rawCompareRunIds.slice() - }, [compareRunIdsKey]) - const rawBaseRunId = useMemo(() => { - const routerValue = router.query?.evaluation_id - if (Array.isArray(routerValue)) { - const firstRouterId = routerValue[0] - if (firstRouterId) return firstRouterId - } else if (typeof routerValue === "string" && routerValue.length > 0) { - return routerValue - } - - const appStateValue = appState.query?.evaluation_id - if (Array.isArray(appStateValue)) { - return appStateValue[0] ?? null - } - - return typeof appStateValue === "string" && appStateValue.length > 0 ? appStateValue : null - }, [appState.query?.evaluation_id, router.query?.evaluation_id]) - - const isBaseRun = useMemo(() => { - if (evaluationRunData?.isBase !== undefined) { - return Boolean(evaluationRunData.isBase) - } - return rawBaseRunId ? runId === rawBaseRunId : false - }, [evaluationRunData?.isBase, rawBaseRunId, runId]) - - const baseRunId = useMemo(() => { - if (evaluationRunData?.isBase) return runId - if (rawBaseRunId && typeof rawBaseRunId === "string") return rawBaseRunId - return runId - }, [evaluationRunData?.isBase, rawBaseRunId, runId]) - - const comparisonRunsStepsAtomInstance = useMemo( - () => comparisonRunsStepsAtom(comparisonRunIds), - [comparisonRunIds], - ) - const comparisonRunsSteps = useAtomValue(comparisonRunsStepsAtomInstance) - // // Derive whether to show comparison mode - const showComparisons = useMemo( - () => Boolean(isBaseRun && comparisonRunIds.length > 0), - [isBaseRun, comparisonRunIds], - ) - const { - data: scenarioStepsData, - state: stepState, - hasResolved: hasResolvedSteps, - error: scenarioStepsError, - } = useCachedScenarioSteps(runId, scenarioId) - - const hasScenarioSteps = - scenarioStepsData && typeof scenarioStepsData === "object" - ? Object.keys(scenarioStepsData).length > 0 - : false - - const enricedRun = evaluationRunData?.enrichedRun - - const annotationSteps = useMemo(() => { - const steps = (enricedRun?.data?.steps || []) as any[] - if (!Array.isArray(steps)) return [] - return steps.filter((step) => step?.type === "annotation") - }, [enricedRun?.data?.steps]) - const runIndex = evaluationRunData?.runIndex - const invocationStep = useMemo( - () => scenarioStepsData?.invocationSteps?.[0], - [scenarioStepsData], - ) - const rawInvocationStepKey = useMemo(() => { - if (!invocationStep) return undefined - return ( - invocationStep?.stepKey || - (invocationStep as any)?.stepkey || - (invocationStep as any)?.step_key || - undefined - ) - }, [invocationStep]) - const firstInvocationKey = useMemo(() => { - if (!runIndex?.invocationKeys || runIndex.invocationKeys.size === 0) return undefined - for (const key of runIndex.invocationKeys) { - if (typeof key === "string" && key.length > 0) return key - } - return undefined - }, [runIndex]) - const invocationStepKey = rawInvocationStepKey ?? firstInvocationKey - const resolvedScenarioId = invocationStep?.scenarioId ?? scenarioId - const { - trace, - value: outputValue, - rawValue: rawOutputValue, - messageNodes, - hasError, - } = useInvocationResult({ - scenarioId: resolvedScenarioId, - stepKey: invocationStepKey, - editorType: "simple", - viewType: "single", - runId, - }) - - const displayOutputValue = useMemo(() => { - if (messageNodes) return undefined - - if (evalType === "online") { - const sources: unknown[] = [ - rawOutputValue, - outputValue, - trace?.data?.outputs, - trace?.data, - trace?.outputs, - trace?.response, - trace?.tree?.nodes, - trace?.nodes, - ] - - const extracted = resolveOnlineOutput(sources) - const fallback = fallbackPrimitive(outputValue) ?? "N/A" - return extracted ?? fallback - } - - return fallbackPrimitive(outputValue) ?? "N/A" - }, [messageNodes, evalType, rawOutputValue, outputValue, trace]) - - const entries = useMemo(() => { - const normalizeValue = (value: unknown): string => { - if (value === null || value === undefined) return "" - if (typeof value === "string") return value - if (typeof value === "number" || typeof value === "boolean") return String(value) - try { - return JSON.stringify(value, null, 2) - } catch { - return String(value) - } - } - - const map = new Map() - const pushRecord = (record?: Record | null) => { - if (!record || typeof record !== "object") return - Object.entries(record).forEach(([key, value]) => { - if (!key || key === "testcase_dedup_id" || key === "testcaseId") return - const normalizedKey = titleCase(key) - if (map.has(normalizedKey)) return - map.set(normalizedKey, normalizeValue(value)) - }) - } - - const pushInputsFrom = (source: any, depth = 0) => { - if (!source || typeof source !== "object" || depth > 4) return - if (Array.isArray(source)) { - source.forEach((item) => pushInputsFrom(item, depth + 1)) - return - } - - Object.entries(source).forEach(([key, value]) => { - if (!value) return - const lower = key.toLowerCase() - if (lower.includes("input")) { - if (typeof value === "object") { - pushRecord(value as Record) - } else if (lower === "inputs") { - map.set(titleCase(key), normalizeValue(value)) - } - return - } - if ( - lower.includes("request") || - lower.includes("parameter") || - lower.includes("payload") || - lower === "data" || - lower === "attributes" || - lower === "body" - ) { - pushInputsFrom(value, depth + 1) - } - }) - } - - const inputSteps = scenarioStepsData?.inputSteps - if (Array.isArray(inputSteps) && inputSteps.length > 0) { - inputSteps.forEach((inputCol) => { - const testcaseData = - inputCol?.testcase && typeof inputCol.testcase.data === "object" - ? (inputCol.testcase.data as Record) - : null - if (testcaseData) { - pushRecord(testcaseData) - } else { - pushRecord(((inputCol as any)?.inputs ?? null) as Record) - } - }) - } - - if (map.size === 0) { - if (invocationStep && typeof invocationStep === "object") { - pushInputsFrom(invocationStep) - const invocationParams = (invocationStep as any)?.invocationParameters - if (invocationParams && typeof invocationParams === "object") { - Object.values(invocationParams as Record).forEach((param) => { - pushInputsFrom(param) - }) - } - const inlineParameters = (invocationStep as any)?.parameters - if (inlineParameters && typeof inlineParameters === "object") { - pushInputsFrom(inlineParameters) - } - } - - const traceSources: any[] = [] - if (invocationStep?.trace) traceSources.push(invocationStep.trace) - if (trace) traceSources.push(trace) - traceSources.forEach((source) => { - pushInputsFrom(source) - if (Array.isArray(source?.nodes)) - source.nodes.forEach((node: any) => pushInputsFrom(node)) - if (Array.isArray(source?.tree?.nodes)) - source.tree.nodes.forEach((node: any) => pushInputsFrom(node)) - }) - } - - if (map.size === 0 && trace) { - const fallback = - normalizeValue( - trace?.attributes?.ag?.data?.requestBody?.inputs ?? - trace?.attributes?.ag?.data?.inputs ?? - trace?.attributes?.inputs ?? - trace?.inputs ?? - trace?.data?.inputs, - ) || "" - if (fallback) { - map.set("Inputs", fallback) - } - } - - if (map.size === 0 && invocationStep) { - const fallback = - normalizeValue( - (invocationStep as any)?.inputs ?? - (invocationStep as any)?.parameters?.inputs ?? - (invocationStep as any)?.data ?? - (invocationStep as any)?.result, - ) || "" - if (fallback) { - map.set("Inputs", fallback) - } - } - - return Array.from(map.entries()).map(([k, v]) => ({k, v})) - }, [scenarioStepsData, invocationStep, trace]) - - const inputListHeight = useMemo(() => Math.max(windowHight - 120, 240), [windowHight]) - const hasEntryData = entries.length > 0 - const shouldShowTraceSummary = - isOnlineEval && Boolean(resolvedScenarioId) && Boolean(invocationStepKey) - const traceJson = useMemo(() => { - if (!trace) return null - try { - return JSON.stringify(trace, null, 2) - } catch { - return String(trace) - } - }, [trace]) - - const traceEditorKey = useMemo(() => { - const normalize = (value: unknown) => - typeof value === "string" && value.trim().length > 0 ? value : undefined - - const fromSource = (source: any): string | undefined => { - if (!source || typeof source !== "object") return undefined - return ( - normalize((source as any).trace_id) ?? - normalize((source as any).traceId) ?? - normalize((source as any).id) ?? - (typeof (source as any).span === "object" - ? (normalize((source as any).span?.trace_id) ?? - normalize((source as any).span?.traceId) ?? - normalize((source as any).span?.id)) - : undefined) - ) - } - - return ( - fromSource(trace) ?? - fromSource((invocationStep as any)?.trace) ?? - (scenarioId ? String(scenarioId) : undefined) ?? - "trace" - ) - }, [trace, invocationStep, scenarioId]) - - // Base testcase id to match comparison scenarios by content - const baseTestcaseId = useMemo(() => { - const inputSteps = scenarioStepsData?.inputSteps - const id = inputSteps?.[0]?.testcaseId - return id - }, [scenarioStepsData]) - - // Map of comparison runId -> matched scenarioId (by testcaseId) - const matchedComparisonScenarios = useMemo(() => { - if (!showComparisons || !baseTestcaseId) return [] as {runId: string; scenarioId?: string}[] - return comparisonRunIds.map((compRunId) => { - const compMap = - comparisonRunsSteps && typeof comparisonRunsSteps === "object" - ? ((comparisonRunsSteps as Record)[compRunId] as any) || {} - : {} - let matchedScenarioId: string | undefined - for (const [scId, testcaseIds] of Object.entries(compMap)) { - const first = Array.isArray(testcaseIds) ? testcaseIds[0] : undefined - if (first && first === baseTestcaseId) { - matchedScenarioId = scId - break - } - } - return {runId: compRunId, scenarioId: matchedScenarioId} - }) - }, [showComparisons, baseTestcaseId, comparisonRunsSteps, comparisonRunIds]) - - const evaluatorLookupByIdentifier = useMemo(() => { - const map = new Map() - const register = (entry: any) => { - const identifiers = collectEvaluatorIdentifiers(entry) - if (!identifiers.length) return - identifiers.forEach((identifier) => { - if (!map.has(identifier)) { - map.set(identifier, entry) - } - }) - } - - asEvaluatorArray(previewEvaluators).forEach(register) - asEvaluatorArray(projectEvaluators).forEach(register) - return map - }, [previewEvaluators, projectEvaluators]) - - const evaluatorMetrics = useMemo(() => { - const rawEvaluators = enricedRun?.evaluators - const list = asEvaluatorArray(rawEvaluators) - return list.map((entry: any, idx: number) => { - const identifierSet = new Set() - collectEvaluatorIdentifiers(entry).forEach((identifier) => - identifierSet.add(identifier), - ) - - let matchedFallback: any - for (const identifier of identifierSet) { - const candidate = evaluatorLookupByIdentifier.get(identifier) - if (candidate) { - matchedFallback = candidate - break - } - } - - if (matchedFallback) { - collectEvaluatorIdentifiers(matchedFallback).forEach((identifier) => - identifierSet.add(identifier), - ) - } - - const slug = extractEvaluatorSlug(entry) ?? extractEvaluatorSlug(matchedFallback) - const resolvedSlug = slug ?? `evaluator-${idx}` - if (resolvedSlug) identifierSet.add(resolvedSlug) - - const displayName = - extractEvaluatorName(entry) ?? - extractEvaluatorName(matchedFallback) ?? - resolvedSlug ?? - `Evaluator ${idx + 1}` - - const metrics = - resolveEvaluatorMetricsMap(entry) ?? - resolveEvaluatorMetricsMap(matchedFallback) ?? - {} - - const aliasSet = new Set(identifierSet) - annotationSteps.forEach((step) => { - const stepEvaluatorSlug = pickString(step?.references?.evaluator?.slug) - const stepEvaluatorId = pickString(step?.references?.evaluator?.id) - const matches = - (stepEvaluatorSlug && identifierSet.has(stepEvaluatorSlug)) || - (stepEvaluatorId && identifierSet.has(stepEvaluatorId)) - if (!matches) return - const stepKey = pickString(step?.key) - if (stepKey) { - aliasSet.add(stepKey) - if (step.origin === "human") { - const parts = stepKey.split(".") - if (parts.length > 1) aliasSet.add(parts[1]) - } - } - if (stepEvaluatorSlug) aliasSet.add(stepEvaluatorSlug) - }) - - return { - name: displayName, - metrics, - slug: resolvedSlug, - aliases: Array.from(aliasSet), - } - }) - }, [annotationSteps, enricedRun?.evaluators, evaluatorLookupByIdentifier]) - - const focusRunMetricsStatsAtom = useMemo(() => { - if (!runId) return emptyStatsAtom - return runMetricsStatsCacheFamily(runId) - }, [runId]) - const focusRunMetricsStatsMap = useAtomValue(focusRunMetricsStatsAtom) - - const scenarioMetricDefinitions = useMemo(() => { - const columns = - evalType === "human" || evalType === "online" - ? GeneralHumanEvalMetricColumns - : GeneralAutoEvalMetricColumns - - const seen = new Set() - - return columns - .map((column) => { - const rawKey = String(column.path || column.name || "").trim() - if (!rawKey) return undefined - const definition = buildDrawerMetricDefinition(undefined, rawKey, column) - if (isInvocationMetricKey(definition.metricKey)) { - return undefined - } - const fallback = new Set(definition.fallbackKeys || []) - fallback.add(rawKey) - const canonical = canonicalizeMetricKey(rawKey) - if (canonical) fallback.add(canonical) - const aliasList = SCENARIO_METRIC_ALIASES[rawKey] || [] - aliasList.forEach((alias) => fallback.add(alias)) - if (canonical && SCENARIO_METRIC_ALIASES[canonical]) { - SCENARIO_METRIC_ALIASES[canonical].forEach((alias) => fallback.add(alias)) - } - if (typeof column.name === "string") { - fallback.add(column.name) - fallback.add(column.name.toLowerCase()) - fallback.add(column.name.replace(/\s+/g, "")) - } - - return { - ...definition, - displayName: column.name ?? definition.displayName, - metricKey: rawKey, - fallbackKeys: Array.from(fallback).filter(Boolean), - } - }) - .filter((metric): metric is DrawerEvaluatorMetric => { - if (!metric) return false - if (seen.has(metric.id)) return false - seen.add(metric.id) - return true - }) - }, [evalType]) - - const evaluatorAliasToSlug = useMemo(() => { - const map = new Map() - evaluatorMetrics.forEach((entry) => { - const slug = entry?.slug - if (!slug) return - const aliases = new Set(entry?.aliases || []) - aliases.add(slug) - aliases.forEach((alias) => { - const normalized = pickString(alias) - if (!normalized) return - if (!map.has(normalized)) { - map.set(normalized, slug) - } - }) - }) - return map - }, [evaluatorMetrics]) - - const aggregatedMetricKeys = useMemo(() => { - const sources = new Set() - if (focusRunMetricsStatsMap && typeof focusRunMetricsStatsMap === "object") { - Object.keys(focusRunMetricsStatsMap).forEach((key) => { - const normalized = pickString(key) - if (normalized) sources.add(normalized) - }) - } - return sources - }, [focusRunMetricsStatsMap]) - - const inferredEvaluatorMetricDefinitions = useMemo(() => { - const map = new Map() - if (!aggregatedMetricKeys.size || !evaluatorAliasToSlug.size) return map - - const recordDefinition = (slug: string, definition: DrawerEvaluatorMetric) => { - const existing = map.get(slug) - if (!existing) { - map.set(slug, [definition]) - return - } - if (!existing.some((entry) => entry.id === definition.id)) { - existing.push(definition) - } - } - - aggregatedMetricKeys.forEach((rawKey) => { - const canonical = canonicalizeMetricKey(rawKey) - if (!canonical || !canonical.includes(".")) return - if (canonical.startsWith("attributes.ag.metrics")) return - - const segments = canonical.split(".").filter(Boolean) - for (let idx = 0; idx < segments.length; idx += 1) { - const prefix = segments.slice(0, idx + 1).join(".") - const slug = evaluatorAliasToSlug.get(prefix) - if (!slug) continue - const metricSegments = segments.slice(idx + 1) - const metricName = metricSegments.join(".") - const baseKey = metricName && metricName.length ? `${slug}.${metricName}` : slug - const aliasCandidates = [canonical, rawKey].filter( - (candidate): candidate is string => Boolean(candidate && candidate !== baseKey), - ) - const definition = buildDrawerMetricDefinition(slug, baseKey, { - aliases: aliasCandidates.length ? aliasCandidates : undefined, - }) - recordDefinition(slug, definition) - break - } - }) - - return map - }, [aggregatedMetricKeys, evaluatorAliasToSlug]) - - const openAndScrollTo = useCallback((key: string) => { - // Ensure the related section is expanded when navigating via hash - setActiveKeys((prev) => { - const next = new Set(prev) - next.add(key) - if (key === "output" || key.startsWith("output-")) next.add("output") - return Array.from(next) - }) - - // wait for Collapse to render/expand, then scroll - const tryScroll = (attempt = 0) => { - const el = document.getElementById(`section-${key}`) - // element is visible when offsetParent is not null (after expand) - if (el && el.offsetParent !== null) { - el.scrollIntoView({behavior: "smooth", block: "start", inline: "nearest"}) - } else if (attempt < 10) { - requestAnimationFrame(() => tryScroll(attempt + 1)) - } - } - requestAnimationFrame(() => tryScroll()) - }, []) - - const handleCollapseChange = useCallback((keys: string[]) => { - // Check if any dropdown is open by looking for the dropdown menu with the 'open' class - // This is for improving micro interactions - const openSelects = document.querySelectorAll( - ".ant-select-dropdown:not(.ant-select-dropdown-hidden)", - ) - const openDropdowns = document.querySelectorAll(".ant-dropdown:not(.ant-dropdown-hidden)") - if (openSelects.length > 0 || openDropdowns.length > 0) { - return - } - setActiveKeys(keys) - }, []) - - useEffect(() => { - setWindowHight(window.innerHeight) - }, [scenarioStepsData]) - - useEffect(() => { - const evaluatorSlugs = evaluatorMetrics - .map((evaluator) => pickString(evaluator.slug)) - .filter(Boolean) as string[] - if (!evaluatorSlugs.length) return - - setActiveKeys((prev) => { - const next = new Set(prev) - let changed = false - - evaluatorSlugs.forEach((slug) => { - if (!next.has(slug)) { - next.add(slug) - changed = true - } - }) - - return changed ? Array.from(next) : prev - }) - }, [evaluatorMetrics]) - - useEffect(() => { - const hash = appState.asPath?.split("#")[1]?.trim() - if (!hash) return - openAndScrollTo(hash) - }, [appState.asPath, openAndScrollTo]) - - // Sync horizontal scroll between the Collapse header (trace) and content box (output) - const isSyncingScroll = useRef(false) - useEffect(() => { - if (!showComparisons) return - - const traceEl = document.querySelector( - ".trace-scroll-container .ant-collapse-header", - ) as HTMLDivElement | null - const outputEl = document.querySelector( - ".output-scroll-container .ant-collapse-content-box", - ) as HTMLDivElement | null - const evalEl = document.querySelector( - ".evaluator-scroll-container .ant-collapse-content-box", - ) as HTMLDivElement | null - - if (!traceEl || !outputEl) return - - const sync = (from: HTMLDivElement) => { - const left = from.scrollLeft - if (outputEl && from !== outputEl) outputEl.scrollLeft = left - if (traceEl && from !== traceEl) traceEl.scrollLeft = left - if (evalEl && from !== evalEl) evalEl.scrollLeft = left - } - - const onTraceScroll = (e: any) => { - if (isSyncingScroll.current) return - isSyncingScroll.current = true - sync(e.currentTarget as HTMLDivElement) - requestAnimationFrame(() => (isSyncingScroll.current = false)) - } - const onOutputScroll = (e: any) => { - if (isSyncingScroll.current) return - isSyncingScroll.current = true - sync(e.currentTarget as HTMLDivElement) - requestAnimationFrame(() => (isSyncingScroll.current = false)) - } - const onEvalScroll = (e: any) => { - if (isSyncingScroll.current) return - isSyncingScroll.current = true - sync(e.currentTarget as HTMLDivElement) - requestAnimationFrame(() => (isSyncingScroll.current = false)) - } - - traceEl.addEventListener("scroll", onTraceScroll) - outputEl.addEventListener("scroll", onOutputScroll) - evalEl?.addEventListener("scroll", onEvalScroll) - - return () => { - traceEl.removeEventListener("scroll", onTraceScroll) - outputEl.removeEventListener("scroll", onOutputScroll) - evalEl?.removeEventListener("scroll", onEvalScroll) - } - }, [showComparisons, activeKeys]) - - const items: CollapseProps["items"] = useMemo(() => { - if (!scenarioStepsData || !scenarioId) return [] - - return [ - { - key: "input", - className: "!rounded-none [&_.ant-collapse-header]:!py-2", - label: ( - - Inputs - - ), - children: ( -
    - {hasEntryData ? ( -
    - { - // Detect chat-shaped JSON like in CellComponents.tsx - let isChat = false - if (typeof entry.v === "string") { - try { - const parsed = JSON.parse(entry.v) - isChat = - Array.isArray(parsed) && - parsed.every( - (m: any) => "role" in m && "content" in m, - ) - } catch { - /* ignore */ - } - } - - if (isChat) { - const nodes = renderChatMessages({ - keyPrefix: `${scenarioId}-${entry.k}`, - rawJson: entry.v as string, - view: "single", - editorType: "simple", - }) - return ( -
    - {nodes} -
    - ) - } - - return ( - {}} - headerName={entry.k} - initialValue={String(entry.v)} - editorType="borderless" - state="readOnly" - placeholder="N/A" - disabled - readOnly - editorClassName="!text-xs" - className="!w-[97.5%]" - editorProps={{enableResize: true}} - /> - ) - }} - /> -
    - ) : !shouldShowTraceSummary ? ( - No inputs available - ) : null} -
    - ), - }, - { - key: "trace", - className: - "trace-scroll-container !rounded-none !px-0 [&_.ant-collapse-header]:!px-0 [&_.ant-collapse-header]:overflow-x-auto [&_.ant-collapse-header]:scroll-mr-2 sticky -top-[13px] z-10 bg-white [&_.ant-collapse-header::-webkit-scrollbar]:!w-0 [&_.ant-collapse-header::-webkit-scrollbar]:!h-0", - collapsible: "disabled", - disabled: true, - showArrow: false, - label: ( -
    - {showComparisons ? ( - <> - - {matchedComparisonScenarios.map( - ({runId: rId, scenarioId: scId}) => ( - - ), - )} - - ) : ( - - )} -
    - ), - }, - { - key: "output", - label: Outputs, - className: clsx([ - "output-scroll-container", - "!rounded-none !px-0 [&_.ant-collapse-header]:!py-2 [&_.ant-collapse-content-box]:overflow-x-auto [&_.ant-collapse-content-box]:scroll-mr-2 [&_.ant-collapse-content-box::-webkit-scrollbar]:!w-0 [&_.ant-collapse-content-box::-webkit-scrollbar]:!h-0", - {"[&_.ant-collapse-content-box]:!px-1": showComparisons}, - ]), - children: showComparisons ? ( -
    - - {matchedComparisonScenarios.map(({runId: rId, scenarioId: scId}) => ( - - ))} -
    - ) : ( -
    - {messageNodes ? ( - messageNodes - ) : ( - {}} - initialValue={displayOutputValue} - headerName="Output" - editorType="borderless" - state="readOnly" - disabled - readOnly - editorClassName="!text-xs" - error={hasError} - placeholder="N/A" - className="!w-[97.5%]" - /> - )} -
    - ), - }, - ...(!showComparisons && scenarioMetricDefinitions.length && runId - ? [ - { - key: "metrics", - label: Metrics, - className: - "!rounded-none [&_.ant-collapse-header]:!py-2 [&_.ant-collapse-content-box]:!px-2", - children: ( - - ), - }, - ] - : []), - ...(showComparisons - ? [ - { - key: "evaluators", - label: null, - disabled: true, - showArrow: false, - className: - "evaluator-scroll-container !rounded-none [&_.ant-collapse-header]:!hidden [&_.ant-collapse-content-box]:overflow-x-auto [&_.ant-collapse-content-box]:!px-0 [&_.ant-collapse-content-box::-webkit-scrollbar]:!w-0 [&_.ant-collapse-content-box::-webkit-scrollbar]:!h-0", - children: (() => { - const runs = [ - {runId: baseRunId, scenarioId}, - ...matchedComparisonScenarios.map((m) => ({ - runId: m.runId, - scenarioId: m.scenarioId, - })), - ] - - // Helper: collect evaluator list for a run - const getRunEvaluators = (rId?: string | null) => { - if (!rId) { - return [] - } - const rState = getDefaultStore().get( - evaluationRunStateFamily(rId), - ) - const evaluators = rState?.enrichedRun?.evaluators || [] - return Array.isArray(evaluators) - ? evaluators - : (Object.values(evaluators) as any[]) - } - - // Build ordered set of evaluator slugs (base run first, then others) - const slugOrder = new Set() - const slugName: Record = {} - runs.forEach(({runId: rId}) => { - const list = getRunEvaluators(rId) - list.forEach((ev: any) => { - slugOrder.add(ev.slug) - if (!slugName[ev.slug]) slugName[ev.slug] = ev.name || ev.slug - }) - }) - - const baseScenarioStepsResult = { - data: scenarioStepsData, - state: stepState, - hasResolved: hasResolvedSteps, - error: scenarioStepsError, - } - - // Build the vertical list of evaluators with per-run metric columns - const orderedSlugs = Array.from(slugOrder) - - return ( -
    - {scenarioMetricDefinitions.length ? ( -
    -
    -
    - Scenario metrics -
    - {runs.slice(1).map((_, idx) => ( -
    - ))} -
    -
    -
    - {runs.map(({runId: rId, scenarioId: scId}) => ( -
    - -
    - ))} -
    -
    - ) : null} - {orderedSlugs.map((slug) => { - // Figure out which runs used this evaluator - const usedBy = new Set( - runs - .filter(({runId: rId, scenarioId: scId}) => { - if (!scId) return false - const list = getRunEvaluators(rId) - return list.some((e: any) => e.slug === slug) - }) - .map((r) => r.runId), - ) - - if (usedBy.size === 0) return null - - // Union of metric keys across participating runs only - const metricKeyOrder = new Map< - string, - DrawerEvaluatorMetric - >() - runs.forEach(({runId: rId}) => { - if (!usedBy.has(rId)) return - const list = getRunEvaluators(rId) - const ev = list.find((e: any) => e.slug === slug) - const metricsMeta = (ev?.metrics || {}) as Record< - string, - any - > - - Object.entries(metricsMeta).forEach( - ([rawKey, meta]) => { - const keyString = String(rawKey) - if (isInvocationMetricKey(keyString)) return - const definition = - buildDrawerMetricDefinition( - slug, - keyString, - meta, - ) - const mapKey = `${slug}::${definition.id}` - const existing = metricKeyOrder.get(mapKey) - if (!existing) { - metricKeyOrder.set(mapKey, definition) - } else { - const mergedFallback = new Set([ - ...(existing.fallbackKeys || []), - ...(definition.fallbackKeys || []), - ]) - metricKeyOrder.set(mapKey, { - ...existing, - metricKey: - existing.metricKey ?? - definition.metricKey, - fallbackKeys: mergedFallback.size - ? Array.from(mergedFallback) - : undefined, - }) - } - }, - ) - }) - - const inferredDefs = - inferredEvaluatorMetricDefinitions.get(slug) || [] - inferredDefs.forEach((definition) => { - const mapKey = `${slug}::${definition.id}` - if (!metricKeyOrder.has(mapKey)) { - metricKeyOrder.set(mapKey, definition) - } - }) - - const metricDefs = dedupeEvaluatorMetricDefinitions( - filterInvocationMetricDefinitions( - Array.from(metricKeyOrder.values()), - ), - slug, - ) - if (!metricDefs.length) return null - const displayName = slugName[slug] || slug - - return ( -
    -
    -
    - {displayName} -
    - {runs.slice(1).map((_, idx) => ( -
    - ))} -
    -
    -
    - {runs.map( - ({runId: rId, scenarioId: scId}) => { - const hasThis = usedBy.has(rId) - return ( -
    - {hasThis ? ( - - ) : ( - // Support structure to preserve column spacing -
    - )} -
    - ) - }, - )} -
    -
    - ) - })} -
    - ) - })(), - }, - ] - : (evaluatorMetrics || []).map((evaluator, idx) => { - const metrics = evaluator.metrics - const isFirst = idx === 0 - const prevSlug = evaluatorMetrics?.[idx - 1]?.slug - const isPrevOpen = !!(prevSlug && activeKeys.includes(prevSlug)) - - const metricMap = new Map() - Object.entries(metrics || {}).forEach(([rawKey, meta]) => { - const keyString = String(rawKey) - if (isInvocationMetricKey(keyString)) return - const definition = buildDrawerMetricDefinition( - evaluator.slug, - keyString, - meta, - ) - const mapKey = `${evaluator.slug}::${definition.id}` - const existing = metricMap.get(mapKey) - if (!existing) { - metricMap.set(mapKey, definition) - } else { - const mergedFallback = new Set([ - ...(existing.fallbackKeys || []), - ...(definition.fallbackKeys || []), - ]) - metricMap.set(mapKey, { - ...existing, - metricKey: existing.metricKey ?? definition.metricKey, - fallbackKeys: mergedFallback.size - ? Array.from(mergedFallback) - : undefined, - }) - } - }) - - // Object.entries(metrics || {}).forEach(([rawKey, meta]) => { - // if (meta.properties) { - // Object.entries(meta.properties).forEach(([propKey, propMeta]) => { - // metricHelper(propMeta, `${rawKey}.${propKey}`) - // }) - // } else { - // metricHelper(meta, rawKey) - // } - // }) - const inferredDefs = - inferredEvaluatorMetricDefinitions.get(evaluator.slug) || [] - inferredDefs.forEach((definition) => { - const mapKey = `${evaluator.slug}::${definition.id}` - if (!metricMap.has(mapKey)) { - metricMap.set(mapKey, definition) - } - }) - const metricDefs = dedupeEvaluatorMetricDefinitions( - filterInvocationMetricDefinitions(Array.from(metricMap.values())), - evaluator.slug, - ) - if (!metricDefs.length) return null - - if (!evaluator) return null - return { - key: evaluator.slug, - label: ( - - {evaluator.name} - - ), - className: clsx( - "[&_.ant-collapse-header]:border-0 [&_.ant-collapse-header]:border-solid [&_.ant-collapse-header]:border-gray-200", - "[&_.ant-collapse-header]:!rounded-none [&_.ant-collapse-header]:!py-[9px]", - "[&_.ant-collapse-header]:border-b", - { - // Top border for first item or when previous evaluator is open - "[&_.ant-collapse-header]:border-t": isFirst || isPrevOpen, - }, - ), - children: ( - - ), - } - })), - ] - }, [ - entries, - stepState, - windowHight, - rawOutputValue, - trace, - enricedRun?.name, - scenarioId, - activeKeys, - messageNodes, - hasError, - displayOutputValue, - comparisonRunIds, - showComparisons, - matchedComparisonScenarios, - baseRunId, - invocationStepKey, - invocationStep?.stepkey, - evaluatorMetrics, - inferredEvaluatorMetricDefinitions, - ]) - - if ((!scenarioStepsData && !hasResolvedSteps) || !enricedRun || !runId) { - return - } - - return ( -
    - -
    - ) -} - -export default FocusDrawerContent diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/lib/helpers.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/lib/helpers.ts deleted file mode 100644 index e043510fe5..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerContent/lib/helpers.ts +++ /dev/null @@ -1,415 +0,0 @@ -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import {DrawerEvaluatorMetric, DrawerMetricValueCellProps} from ".." -import {canonicalizeMetricKey} from "@/oss/lib/metricUtils" -import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" - -export const SCENARIO_METRIC_ALIASES: Record = { - "attributes.ag.metrics.costs.cumulative.total": ["totalCost", "costs.total", "cost"], - "attributes.ag.metrics.duration.cumulative": ["duration.total", "duration"], - "attributes.ag.metrics.tokens.cumulative.total": ["totalTokens", "tokens.total", "tokens"], - "attributes.ag.metrics.errors.cumulative": ["errors"], - totalCost: ["attributes.ag.metrics.costs.cumulative.total", "costs.total", "cost"], - "duration.total": ["attributes.ag.metrics.duration.cumulative", "duration"], - totalTokens: ["attributes.ag.metrics.tokens.cumulative.total", "tokens.total", "tokens"], - promptTokens: ["attributes.ag.metrics.tokens.cumulative.total", "tokens", "tokens.prompt"], - completionTokens: [ - "attributes.ag.metrics.tokens.cumulative.total", - "tokens", - "tokens.completion", - ], - errors: ["attributes.ag.metrics.errors.cumulative"], -} - -export const asEvaluatorArray = (input: any): any[] => { - if (!input) return [] - if (Array.isArray(input)) return input - if (typeof input === "object") return Object.values(input) - return [] -} - -export const pickString = (candidate: unknown): string | undefined => { - if (typeof candidate === "string") { - const trimmed = candidate.trim() - if (trimmed.length > 0) return trimmed - } - return undefined -} - -export const collectEvaluatorIdentifiers = (entry: any): string[] => { - if (!entry || typeof entry !== "object") return [] - const ids = new Set() - ;[ - entry.slug, - entry.id, - entry.key, - entry.uid, - entry.evaluator_key, - entry?.data?.slug, - entry?.data?.id, - entry?.data?.key, - entry?.data?.evaluator_key, - entry?.meta?.slug, - entry?.meta?.id, - entry?.meta?.key, - entry?.flags?.slug, - entry?.flags?.id, - entry?.flags?.key, - entry?.flags?.evaluator_key, - entry?.references?.slug, - entry?.references?.id, - entry?.references?.key, - ].forEach((candidate) => { - const value = pickString(candidate) - if (value) ids.add(value) - }) - return Array.from(ids) -} - -export const extractEvaluatorSlug = (entry: any): string | undefined => { - if (!entry || typeof entry !== "object") return undefined - const candidates = collectEvaluatorIdentifiers(entry) - if (candidates.length) return candidates[0] - return undefined -} - -export const extractEvaluatorName = (entry: any): string | undefined => { - if (!entry || typeof entry !== "object") return undefined - const candidates = [ - entry?.name, - entry?.displayName, - entry?.display_name, - entry?.title, - entry?.label, - entry?.meta?.displayName, - entry?.meta?.display_name, - entry?.meta?.name, - entry?.flags?.display_name, - entry?.flags?.name, - entry?.data?.display_name, - entry?.data?.name, - ] - for (const candidate of candidates) { - const value = pickString(candidate) - if (value) return value - } - return undefined -} - -export const asRecord = (value: any): Record | undefined => { - if (!value || typeof value !== "object" || Array.isArray(value)) return undefined - const entries = Object.entries(value) - if (!entries.length) return undefined - return value as Record -} - -export const extractSchemaProperties = (entry: any): Record | undefined => { - if (!entry || typeof entry !== "object") return undefined - const candidates = [ - entry?.data?.schemas?.outputs?.properties, - entry?.data?.schemas?.output?.properties, - entry?.data?.service?.format?.properties?.outputs?.properties, - entry?.data?.service?.properties?.outputs?.properties, - entry?.data?.output_schema?.properties, - entry?.data?.outputs_schema?.properties, - entry?.output_schema?.properties, - entry?.schema?.properties, - ] - for (const candidate of candidates) { - const record = asRecord(candidate) - if (record) return record - } - return undefined -} - -export const resolveEvaluatorMetricsMap = (entry: any): Record | undefined => { - if (!entry || typeof entry !== "object") return undefined - const direct = asRecord(entry.metrics) - if (direct) return direct - - const schemaProps = extractSchemaProperties(entry) - if (schemaProps) return schemaProps - - const derived = asRecord(getMetricsFromEvaluator(entry as any)) - if (derived) return derived - - return undefined -} - -export const normalizeMetricPrimaryKey = (slug: string | undefined, rawKey: string): string => { - const normalizedSlug = slug && slug.trim().length > 0 ? slug.trim() : undefined - const trimmed = rawKey.trim() - if (!trimmed) return normalizedSlug ?? "" - if (normalizedSlug) { - const prefix = `${normalizedSlug}.` - if (trimmed.startsWith(prefix)) return trimmed - } - if (trimmed.includes(".")) return trimmed - return normalizedSlug ? `${normalizedSlug}.${trimmed}` : trimmed -} - -export const collectMetricFallbackKeys = ( - slug: string | undefined, - rawKey: string, - primaryKey: string, - meta: any, -): string[] => { - const set = new Set() - const normalizedSlug = slug && slug.trim().length > 0 ? slug.trim() : undefined - const push = (value?: string) => { - if (!value) return - const trimmed = String(value).trim() - if (!trimmed) return - if (trimmed.includes(".") || !normalizedSlug) { - set.add(trimmed) - } else { - set.add(`${normalizedSlug}.${trimmed}`) - } - } - - push(rawKey) - - const aliases = Array.isArray(meta?.aliases) - ? meta?.aliases - : meta?.aliases - ? [meta.aliases] - : meta?.alias - ? [meta.alias] - : [] - aliases.forEach(push) - - const extraKeys = [ - meta?.metricKey, - meta?.metric_key, - meta?.key, - meta?.path, - meta?.fullKey, - meta?.full_key, - meta?.canonicalKey, - meta?.canonical_key, - meta?.statsKey, - meta?.stats_key, - meta?.metric, - ] - extraKeys.forEach(push) - - const fallbackKeys = Array.from(set).filter((value) => value !== rawKey && value !== primaryKey) - return fallbackKeys -} - -export const stripOutputsPrefixes = (key: string): string => { - let result = key - const OUTPUT_PREFIX = "attributes.ag.data.outputs." - const METRIC_PREFIX = "attributes.ag.metrics." - while (result.startsWith(OUTPUT_PREFIX)) { - result = result.slice(OUTPUT_PREFIX.length) - } - while (result.startsWith(METRIC_PREFIX)) { - result = result.slice(METRIC_PREFIX.length) - } - return result -} - -export const buildDrawerMetricDefinition = ( - slug: string | undefined, - rawKey: string, - meta: any, -): DrawerEvaluatorMetric => { - const normalizedSlug = slug && slug.trim().length > 0 ? slug.trim() : undefined - const normalizedDisplayBase = - normalizedSlug && rawKey.startsWith(`${normalizedSlug}.`) - ? rawKey.slice(normalizedSlug.length + 1) - : rawKey - const normalizedDisplay = stripOutputsPrefixes(normalizedDisplayBase) - const primaryKey = normalizeMetricPrimaryKey(slug, rawKey) - const fallbackKeys = collectMetricFallbackKeys(slug, rawKey, primaryKey, meta) - const id = canonicalizeMetricKey(primaryKey) || primaryKey - - return { - id, - displayName: normalizedDisplay || primaryKey, - metricKey: primaryKey, - fallbackKeys: fallbackKeys.length ? fallbackKeys : undefined, - } -} - -export const collectCandidateSteps = (data?: UseEvaluationRunScenarioStepsFetcherResult): any[] => { - if (!data) return [] - const buckets: any[] = [] - if (Array.isArray(data.annotationSteps)) buckets.push(...(data.annotationSteps as any[])) - if (Array.isArray(data.steps)) buckets.push(...(data.steps as any[])) - if (Array.isArray(data.invocationSteps)) buckets.push(...(data.invocationSteps as any[])) - return buckets -} - -export const collectSlugCandidates = ( - data: UseEvaluationRunScenarioStepsFetcherResult | undefined, - evaluatorSlug: string, -): string[] => { - const set = new Set() - const push = (value?: string | null) => { - if (!value) return - const normalized = String(value).trim() - if (!normalized) return - set.add(normalized) - } - - push(evaluatorSlug) - - const steps = collectCandidateSteps(data) - steps.forEach((step) => { - if (!step) return - const ref: any = step?.references?.evaluator - push(step?.stepKey as any) - push(step?.stepkey as any) - push(step?.step_key as any) - push(ref?.slug) - push(ref?.key) - push(ref?.id) - }) - - return Array.from(set) -} - -export const findAnnotationStepKey = ( - data: UseEvaluationRunScenarioStepsFetcherResult | undefined, - slugCandidates: string[], -): string | undefined => { - if (!data) return undefined - - const steps = collectCandidateSteps(data) - if (!steps.length) return undefined - - const loweredCandidates = slugCandidates - .map((slug) => String(slug).toLowerCase()) - .filter((slug) => slug.length > 0) - - const matched = steps.find((step) => { - if (!step) return false - const possible: string[] = [ - (step as any)?.stepKey, - (step as any)?.stepkey, - (step as any)?.step_key, - (step as any)?.references?.evaluator?.slug, - (step as any)?.references?.evaluator?.key, - (step as any)?.references?.evaluator?.id, - ] - - return possible - .filter(Boolean) - .map((value) => String(value).toLowerCase()) - .some((candidate) => loweredCandidates.includes(candidate)) - }) - - return ( - (matched as any)?.stepKey ?? - (matched as any)?.stepkey ?? - (matched as any)?.step_key ?? - undefined - ) -} - -/** Return the best primitive/array value from annotationSteps[].annotation.data.outputs */ -export const getFromAnnotationOutputs = ({ - scenarioStepsResult, - slugCandidates, - evaluatorSlug, - expandedCandidates, -}: { - scenarioStepsResult?: DrawerMetricValueCellProps["scenarioStepsResult"] - slugCandidates: string[] - evaluatorSlug: string - expandedCandidates: string[] -}): {value: any; matchedKey?: string} | undefined => { - const data = scenarioStepsResult?.data - if (!data || !Array.isArray(data.annotationSteps)) return undefined - - // choose only annotation steps that belong to any of our slug candidates - const pool = new Set(slugCandidates.map((s) => String(s).toLowerCase())) - const steps = (data.annotationSteps as any[]).filter((s) => { - const sk = s?.stepKey ?? s?.stepkey ?? s?.step_key - const ref = s?.references?.evaluator - const ids = [sk, ref?.slug, ref?.key, ref?.id] - .filter(Boolean) - .map((x) => String(x).toLowerCase()) - return ids.some((id) => pool.has(id)) - }) - - if (!steps.length) return undefined - - // outputs pockets we’re allowed to read as fallback - const outputsOf = (s: any) => - [s?.annotation?.data?.outputs, s?.data?.outputs, s?.outputs].filter( - (o) => o && typeof o === "object", - ) as Record[] - - const isPrimitive = (v: unknown) => - v === null || ["string", "number", "boolean"].includes(typeof v) - - const stripPfx = (k: string) => { - const PFX = [ - "attributes.ag.data.outputs.", - "ag.data.outputs.", - "outputs.", - `${evaluatorSlug}.`, - ] - for (const p of PFX) if (k.startsWith(p)) return k.slice(p.length) - return k - } - - const pathGet = (obj: any, path: string) => - path.split(".").reduce((acc, k) => (acc == null ? acc : acc[k]), obj) - - // 1) exact/bare path tries inside outputs - for (const s of steps) { - for (const outs of outputsOf(s)) { - for (const cand of expandedCandidates) { - const bare = stripPfx(cand) - for (const v of new Set([stripPfx(cand), bare, `extra.${bare}`])) { - const val = pathGet(outs, v) - if (val !== undefined && (isPrimitive(val) || Array.isArray(val))) { - return {value: val, matchedKey: v} - } - } - } - } - } - - // 2) fuzzy DFS through outputs (skip schema objects like { type: ... }) - const canonical = (s?: string) => - typeof s === "string" ? s.toLowerCase().replace(/[^a-z0-9]+/g, "") : "" - - const terminals = new Set( - expandedCandidates.map((k) => stripPfx(k).split(".").pop()!).map(canonical), - ) - - const looksLikeSchema = (o: any) => - o && - typeof o === "object" && - !Array.isArray(o) && - Object.keys(o).length <= 2 && - "type" in o && - (Object.keys(o).length === 1 || "description" in o) - - const dfs = (obj: any, path: string[] = []): {value: any; matchedKey: string} | undefined => { - if (!obj || typeof obj !== "object") return - for (const [k, v] of Object.entries(obj)) { - const p = [...path, k] - if (isPrimitive(v) || Array.isArray(v)) { - const hit = terminals.has(canonical(k)) || terminals.has(canonical(p[p.length - 1])) - if (hit) return {value: v, matchedKey: p.join(".")} - } else if (!looksLikeSchema(v)) { - const h = dfs(v, p) - if (h) return h - } - } - } - - for (const s of steps) { - for (const outs of outputsOf(s)) { - const hit = dfs(outs) - if (hit) return hit - } - } - - return undefined -} diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerHeader/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerHeader/index.tsx deleted file mode 100644 index 5893c3b37b..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerHeader/index.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import {useCallback, useMemo, useState} from "react" - -import {CaretDown, CaretUp, Check, Copy} from "@phosphor-icons/react" -import {Button, Tag} from "antd" -import {atom, useAtomValue} from "jotai" - -import EvalRunScenarioNavigator from "@/oss/components/EvalRunDetails/components/EvalRunScenarioNavigator" -import {useCachedScenarioSteps} from "@/oss/components/EvalRunDetails/hooks/useCachedScenarioSteps" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {focusScenarioAtom} from "@/oss/components/EvalRunDetails/state/focusScenarioAtom" -import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" -import {scenariosFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {useAppNavigation} from "@/oss/state/appState" - -import FocusDrawerHeaderSkeleton from "../Skeletons/FocusDrawerHeaderSkeleton" - -const FocusDrawerHeader = () => { - const [isCopy, setIsCopy] = useState(false) - const focus = useAtomValue(focusScenarioAtom) - const evalType = useAtomValue(evalTypeAtom) - const navigation = useAppNavigation() - - const runId = focus?.focusRunId as string - const focusScenarioId = focus?.focusScenarioId as string - const isOnlineEval = evalType === "online" - const scenarioLabel = isOnlineEval ? "scenario" : "testcase" - - const handleScenarioChange = useCallback( - (nextScenarioId: string) => { - navigation.patchQuery( - { - focusScenarioId: nextScenarioId, - focusRunId: runId, - }, - {shallow: true}, - ) - }, - [navigation, runId], - ) - - const { - data: scenarioSteps, - state: stepState, - hasResolved, - } = useCachedScenarioSteps(runId, focusScenarioId) - - const emptyScenarioListAtom = useMemo(() => atom([]), []) - const scenariosAtom = useMemo(() => { - if (!runId) return emptyScenarioListAtom - return scenariosFamily(runId) - }, [runId, emptyScenarioListAtom]) - const scenarios = useAtomValue(scenariosAtom) ?? [] - - const selectedScenario = useMemo( - () => scenarios.find((s) => s.id === focusScenarioId), - [scenarios, focusScenarioId], - ) - - const selectedScenarioIndex = useMemo(() => { - if (!selectedScenario) return null - if (typeof selectedScenario.scenarioIndex === "number") { - return selectedScenario.scenarioIndex - } - const derivedIndex = scenarios.findIndex((s) => s.id === selectedScenario.id) - return derivedIndex === -1 ? null : derivedIndex + 1 - }, [selectedScenario, scenarios]) - - const loadPrevVariant = useCallback(() => { - if (!selectedScenario) return - const currentIndex = (selectedScenarioIndex || 1) - 1 - const prevIndex = currentIndex - 1 - if (prevIndex < 0) return - const prevScenario = scenarios[prevIndex] - if (!prevScenario) return - handleScenarioChange(prevScenario.id) - }, [handleScenarioChange, selectedScenario, selectedScenarioIndex, scenarios]) - - const loadNextVariant = useCallback(() => { - if (!selectedScenario) return - const currentIndex = (selectedScenarioIndex || 1) - 1 - const nextIndex = currentIndex + 1 - const nextScenario = scenarios[nextIndex] - if (!nextScenario) return - handleScenarioChange(nextScenario.id) - }, [handleScenarioChange, selectedScenario, selectedScenarioIndex, scenarios]) - - const isDisablePrev = useMemo( - () => !selectedScenario || selectedScenarioIndex === 1, - [selectedScenario, selectedScenarioIndex], - ) - const isDisableNext = useMemo( - () => !selectedScenario || selectedScenarioIndex === scenarios.length, - [selectedScenario, selectedScenarioIndex, scenarios], - ) - - if (!hasResolved && stepState === "loading") { - return - } - - return ( -
    -
    -
    -
    - {runId ? ( - handleScenarioChange(id), - classNames: {popup: {root: "!p-0 !min-w-[180px]"}}, - }} - showOnlySelect - /> - ) : null} - {scenarioSteps?.inputSteps?.map((input) => { - const rawIdentifier = - input?.testcaseId ?? (input as any)?.scenarioId ?? undefined - const identifier = - rawIdentifier === undefined || rawIdentifier === null - ? undefined - : String(rawIdentifier) - if (!identifier) return null - - return ( - - { - setIsCopy(true) - setTimeout(() => { - setIsCopy(false) - }, 1500) - }} - > - {identifier} {isCopy ? : } - - - ) - })} -
    -
    - ) -} - -export default FocusDrawerHeader diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerSidePanel/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerSidePanel/index.tsx deleted file mode 100644 index e440c43f9e..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/FocusDrawerSidePanel/index.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import {Key, useCallback, useMemo} from "react" - -import {TreeStructure, Download, Sparkle, Speedometer} from "@phosphor-icons/react" -import {Tree, TreeDataNode} from "antd" -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" -import {useRouter} from "next/router" - -import {focusScenarioAtom} from "@/oss/components/EvalRunDetails/state/focusScenarioAtom" -import {urlStateAtom} from "@/oss/components/EvalRunDetails/state/urlState" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import FocusDrawerSidePanelSkeleton from "../Skeletons/FocusDrawerSidePanelSkeleton" - -// Helper atom to read multiple run states given a list of runIds -const evaluationsRunFamily = atomFamily( - (runIds: string[]) => - atom((get) => { - return runIds.map((runId) => get(evaluationRunStateFamily(runId))) - }), - deepEqual, -) - -const FocusDrawerSidePanel = () => { - const router = useRouter() - const urlState = useAtomValue(urlStateAtom) - const focus = useAtomValue(focusScenarioAtom) - const compareRunIds = (urlState?.compare || []) as string[] - const focusRunId = focus?.focusRunId! - const focusRunState = useAtomValue(evaluationRunStateFamily(focusRunId)) - const baseRunId = useMemo(() => { - if (focusRunState?.isBase) return focusRunId - const routerValue = router.query?.evaluation_id - if (Array.isArray(routerValue)) { - return routerValue[0] ?? focusRunId - } - if (typeof routerValue === "string" && routerValue.length > 0) { - return routerValue - } - return focusRunId - }, [focusRunId, focusRunState?.isBase, router.query?.evaluation_id]) - const isComparison = Array.isArray(compareRunIds) && compareRunIds.length > 0 - const isBaseRun = focusRunState?.isBase ?? focusRunId === baseRunId - - // Read base run and all comparison run states - const runIds = useMemo(() => { - if (!isComparison) return [baseRunId] - if (!isBaseRun && isComparison) return [focusRunId] - - return [baseRunId, ...compareRunIds] - }, [baseRunId, compareRunIds, focusRunId, isBaseRun, isComparison]) - - const runs = useAtomValue(evaluationsRunFamily(runIds)) - - const baseEvaluation = useMemo( - () => runs.find((r) => r?.enrichedRun?.id === baseRunId), - [runs, baseRunId], - ) - const baseEvaluators = useMemo( - () => baseEvaluation?.enrichedRun?.evaluators || [], - [baseEvaluation], - ) - - // Build deduped evaluator list across all runs when in comparison mode - const dedupedEvaluators = useMemo(() => { - if (isBaseRun && !isComparison) return baseEvaluators - - const map = new Map() - runs?.forEach((r) => { - r?.enrichedRun?.evaluators?.forEach((e) => { - if (!map.has(e.slug)) map.set(e.slug, {slug: e.slug, name: e.name}) - }) - }) - return Array.from(map.values()) - }, [isComparison, runs, baseEvaluators, isBaseRun]) - - // Output children: evaluation names (base + comparisons) when in comparison mode - const outputChildren: TreeDataNode[] = useMemo(() => { - if (!isComparison || (!isBaseRun && isComparison)) return [] - return runs - .map((r) => r?.enrichedRun) - .filter(Boolean) - .map((enriched) => ({ - title: enriched!.name, - key: `output-${enriched!.id}`, - icon: , - })) as TreeDataNode[] - }, [isComparison, runs, isBaseRun]) - - const treeData: TreeDataNode[] = useMemo(() => { - if (!focusRunId) return [] - return [ - { - title: "Evaluation", - key: "evaluation", - icon: , - children: [ - { - title: "Input", - key: "input", - icon: , - }, - { - title: "Output", - key: "output", - icon: , - children: outputChildren, - }, - { - title: "Evaluator", - key: "evaluator", - icon: , - children: - dedupedEvaluators?.map((e) => ({ - title: e.name ?? e.slug, - key: e.slug, - icon: , - })) || [], - }, - ], - }, - ] - }, [dedupedEvaluators, outputChildren, focusRunId]) - - const onSelect = useCallback( - async (selectedKeys: Key[]) => { - try { - if (selectedKeys.length > 0) { - const key = selectedKeys[0].toString() - const currentHash = router.asPath.split("#")[1] - if (currentHash == key) return - await router.replace( - { - pathname: router.pathname, - query: router.query, - hash: key, - }, - undefined, - {scroll: false, shallow: true}, - ) - } - } catch (error) { - return "" - } - }, - [router], - ) - - if (!runs.length) { - return - } - - return ( -
    - -
    - ) -} - -export default FocusDrawerSidePanel diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerContentSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerContentSkeleton.tsx deleted file mode 100644 index e79155bbc1..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerContentSkeleton.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" - -const FocusDrawerContentSkeleton = () => { - return ( -
    -
    - - -
    - - - - -
    - -
    - - - -
    -
    -
    - - -
    - -
    - ) -} - -export default memo(FocusDrawerContentSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerHeaderSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerHeaderSkeleton.tsx deleted file mode 100644 index 20912d5e76..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerHeaderSkeleton.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" - -const FocusDrawerHeaderSkeleton = () => { - return ( -
    - - - - -
    - ) -} - -export default memo(FocusDrawerHeaderSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerSidePanelSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerSidePanelSkeleton.tsx deleted file mode 100644 index 1c813e50aa..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/assets/Skeletons/FocusDrawerSidePanelSkeleton.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" - -const FocusDrawerSidePanelSkeleton = () => { - return ( -
    - {Array.from({length: 8}).map((_, idx) => ( - - ))} -
    - ) -} - -export default memo(FocusDrawerSidePanelSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/index.tsx deleted file mode 100644 index 187de30274..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunFocusDrawer/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import {memo, useCallback, useMemo} from "react" - -import {useAtomValue, useSetAtom} from "jotai" -import dynamic from "next/dynamic" - -import { - closeFocusDrawerAtom, - focusScenarioAtom, - isFocusDrawerOpenAtom, - resetFocusDrawerAtom, -} from "@/oss/components/EvalRunDetails/state/focusScenarioAtom" -import GenericDrawer from "@/oss/components/GenericDrawer" -import {RunIdProvider} from "@/oss/contexts/RunIdContext" -import {clearFocusDrawerQueryParams} from "@/oss/state/url/focusDrawer" - -const FocusDrawerHeader = dynamic(() => import("./assets/FocusDrawerHeader"), {ssr: false}) -const FocusDrawerContent = dynamic(() => import("./assets/FocusDrawerContent"), {ssr: false}) -const FocusDrawerSidePanel = dynamic(() => import("./assets/FocusDrawerSidePanel"), {ssr: false}) - -const EvalRunFocusDrawer = () => { - const isOpen = useAtomValue(isFocusDrawerOpenAtom) - const focus = useAtomValue(focusScenarioAtom) - const closeDrawer = useSetAtom(closeFocusDrawerAtom) - const resetDrawer = useSetAtom(resetFocusDrawerAtom) - - const focusRunId = focus?.focusRunId ?? null - - const handleClose = useCallback(() => { - closeDrawer(null) - }, [closeDrawer]) - - const handleAfterOpenChange = useCallback( - (nextOpen: boolean) => { - if (!nextOpen) { - resetDrawer(null) - clearFocusDrawerQueryParams() - } - }, - [resetDrawer], - ) - - const shouldRenderContent = useMemo( - () => Boolean(focusRunId && focus?.focusScenarioId), - [focusRunId, focus?.focusScenarioId], - ) - - if (!focusRunId) { - return null - } - - return ( - - : null} - mainContent={shouldRenderContent ? : null} - sideContent={shouldRenderContent ? : null} - className="[&_.ant-drawer-body]:p-0" - sideContentDefaultSize={200} - /> - - ) -} - -export default memo(EvalRunFocusDrawer) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunHeader/assets/EvalRunHeaderSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunHeader/assets/EvalRunHeaderSkeleton.tsx deleted file mode 100644 index 1ae2c1dea1..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunHeader/assets/EvalRunHeaderSkeleton.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" -import clsx from "clsx" - -const EvalRunHeaderSkeleton = ({className}: {className?: string}) => { - return ( -
    - - -
    - ) -} - -export default memo(EvalRunHeaderSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunHeader/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunHeader/index.tsx deleted file mode 100644 index ec6227e62e..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunHeader/index.tsx +++ /dev/null @@ -1,297 +0,0 @@ -import {memo, useCallback, useEffect, useState} from "react" - -import {ReloadOutlined} from "@ant-design/icons" -import {Button, Tooltip} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" - -import {message} from "@/oss/components/AppMessageContext" -import {useRunId} from "@/oss/contexts/RunIdContext" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import useEvaluationRunData from "@/oss/lib/hooks/useEvaluationRunData" -import { - evalAtomStore, - evaluationRunStateFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {progressFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/progress" -import refreshLiveEvaluationRun from "@/oss/lib/hooks/useEvaluationRunData/refreshLiveRun" -import {startSimpleEvaluation, stopSimpleEvaluation} from "@/oss/services/onlineEvaluations/api" - -import EvalRunScenariosViewSelector from "../../../components/EvalRunScenariosViewSelector" -import {evalTypeAtom} from "../../../state/evalType" -import {runViewTypeAtom, urlStateAtom} from "../../../state/urlState" -import EvalRunCompareMenu from "../EvalRunCompareMenu" -import EvalRunSelectedEvaluations from "../EvalRunSelectedEvaluations" - -const AUTO_REFRESH_INTERVAL_MS = 120_000 - -const EvalRunHeader = ({className, name, id}: {className?: string; name: string; id: string}) => { - const store = evalAtomStore() - const viewType = useAtomValue(runViewTypeAtom, {store}) - const urlState = useAtomValue(urlStateAtom, {store}) - const evalType = useAtomValue(evalTypeAtom) - const baseRunId = useRunId() - const progress = useAtomValue(progressFamily(baseRunId!), {store}) - const state = useAtomValue(evaluationRunStateFamily(baseRunId!), {store}) as any - const enrichedRun = state?.enrichedRun - const updatedTs = - (enrichedRun as any)?.updatedAtTimestamp || (enrichedRun as any)?.createdAtTimestamp - const updatedMoment = updatedTs ? dayjs(updatedTs) : null - const lastUpdated = updatedMoment?.isValid() ? updatedMoment.fromNow() : undefined - const flags = ((enrichedRun as any)?.flags || {}) as { - isActive?: boolean - isClosed?: boolean - } - const runStatus = ((state?.rawRun as any)?.status || - (enrichedRun as any)?.status || - (enrichedRun as any)?.data?.status) as string | undefined - const normalizedRunStatus = runStatus - ? runStatus - .split("_") - .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) - .join(" ") - : undefined - const isActiveFlag = (flags as any).isActive ?? (flags as any).is_active - const isClosedFlag = (flags as any).isClosed ?? (flags as any).is_closed - const isActive = Boolean(isActiveFlag) - const isClosed = Boolean(isClosedFlag) - const baseStatusLabel = (() => { - if (!progress || progress.total === 0) return "Running" - if (progress.completed >= progress.total) return "Completed" - if (progress.inProgress > 0 || progress.pending > 0) return "Running" - return "Pending" - })() - const activeStatusLabel = (() => { - if (!normalizedRunStatus) return "Running" - const lower = normalizedRunStatus.toLowerCase() - const looksActive = ["run", "progress", "active"].some((token) => lower.includes(token)) - return looksActive ? normalizedRunStatus : "Running" - })() - - const statusLabel = - evalType === "online" - ? isClosed - ? "Closed" - : isActive - ? activeStatusLabel - : normalizedRunStatus && normalizedRunStatus !== "Running" - ? normalizedRunStatus - : progress?.completed - ? "Completed" - : "Stopped" - : baseStatusLabel - const {refetchEvaluation} = useEvaluationRunData( - baseRunId || null, - false, - baseRunId || undefined, - ) - const [action, setAction] = useState<"start" | "stop" | null>(null) - const [isRefreshing, setIsRefreshing] = useState(false) - const isProcessing = action !== null - const canStart = !isActive && !isClosed - const canStop = isActive - const onStop = useCallback(async () => { - if (!baseRunId) return - try { - setAction("stop") - await stopSimpleEvaluation(baseRunId) - message.success("Evaluation stopped") - refetchEvaluation?.() - } catch (e) { - message.error("Failed to stop evaluation") - } finally { - setAction(null) - } - }, [baseRunId, refetchEvaluation]) - const onStart = useCallback(async () => { - if (!baseRunId) return - try { - setAction("start") - await startSimpleEvaluation(baseRunId) - message.success("Evaluation started") - refetchEvaluation?.() - } catch (e) { - message.error("Failed to start evaluation") - } finally { - setAction(null) - } - }, [baseRunId, refetchEvaluation]) - const onRefresh = useCallback(async () => { - if (!baseRunId || !refetchEvaluation) return - const key = `live-run-refresh-${baseRunId}` - try { - setIsRefreshing(true) - message.loading({key, content: "Refreshing evaluation...", duration: 0}) - await refetchEvaluation({background: true}) - const {scenarioCount} = await refreshLiveEvaluationRun(baseRunId) - const suffix = - typeof scenarioCount === "number" && scenarioCount >= 0 - ? ` (${scenarioCount} scenarios)` - : "" - message.success({key, content: `Evaluation refreshed${suffix}`}) - } catch (error) { - console.error("[EvalRunHeader] Failed to refresh live evaluation run", error) - message.error({key, content: "Failed to refresh evaluation"}) - } finally { - setIsRefreshing(false) - } - }, [baseRunId, refetchEvaluation]) - - useEffect(() => { - if (evalType !== "online") return - if (!baseRunId || !refetchEvaluation) return - if (typeof window === "undefined") return - if (isClosed) return - - let cancelled = false - let timeoutId: number | null = null - let inFlight = false - - const shouldDefer = () => - typeof document !== "undefined" && document.visibilityState === "hidden" - - function schedule() { - if (cancelled) return - if (timeoutId) { - window.clearTimeout(timeoutId) - } - timeoutId = window.setTimeout(() => { - void runRefresh() - }, AUTO_REFRESH_INTERVAL_MS) - } - - async function runRefresh() { - if (cancelled) return - if (inFlight || isRefreshing || isProcessing) { - schedule() - return - } - if (shouldDefer()) { - schedule() - return - } - inFlight = true - try { - await refetchEvaluation({background: true}) - await refreshLiveEvaluationRun(baseRunId) - } catch (error) { - console.error("[EvalRunHeader] Auto refresh failed", error) - } finally { - inFlight = false - schedule() - } - } - - const handleVisibilityChange = () => { - if (cancelled) return - if (!shouldDefer()) { - if (timeoutId) { - window.clearTimeout(timeoutId) - } - void runRefresh() - } - } - - schedule() - - if (typeof document !== "undefined") { - document.addEventListener("visibilitychange", handleVisibilityChange) - } - - return () => { - cancelled = true - if (timeoutId) { - window.clearTimeout(timeoutId) - } - if (typeof document !== "undefined") { - document.removeEventListener("visibilitychange", handleVisibilityChange) - } - } - }, [baseRunId, evalType, isClosed, isProcessing, isRefreshing, refetchEvaluation]) - return ( -
    - - {evalType !== "online" ? ( -
    -
    - {urlState.compare?.length > 0 && ( - - )} -
    - - -
    - ) : null} - {evalType === "online" ? ( -
    -
    -
    - - {statusLabel} -
    -
    - {lastUpdated ? ( - - Updated {lastUpdated} - - ) : null} -
    -
    - - {canStop ? ( - - ) : ( - - )} -
    - ) : null} -
    - ) -} - -export default memo(EvalRunHeader) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/assets/EvalRunPromptConfigViewerSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/assets/EvalRunPromptConfigViewerSkeleton.tsx deleted file mode 100644 index 02f6b9f69a..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/assets/EvalRunPromptConfigViewerSkeleton.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" -import clsx from "clsx" - -const EvalRunPromptConfigViewerSkeleton = ({className}: {className?: string}) => { - return ( -
    -
    -
    -
    - - -
    - -
    - - -
    -
    - ) -} - -export default memo(EvalRunPromptConfigViewerSkeleton) - -export const PromptConfigCardSkeleton = memo(() => { - return ( -
    - {/* Header */} -
    - - -
    - - {/* Prompt section */} -
    - - -
    -
    - ) -}) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/assets/PromptConfigCard.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/assets/PromptConfigCard.tsx deleted file mode 100644 index 198d2542f6..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/assets/PromptConfigCard.tsx +++ /dev/null @@ -1,616 +0,0 @@ -import {memo, useEffect, useMemo, useRef, useState} from "react" - -import {Empty, Skeleton, Tag, Typography} from "antd" -import clsx from "clsx" -import {atom, getDefaultStore, useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" - -import {PromptsSourceProvider} from "@/oss/components/Playground/context/PromptsSource" -import {EnrichedEvaluationRun} from "@/oss/lib/hooks/usePreviewEvaluations/types" -import type {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" -import {fetchOpenApiSchemaJson} from "@/oss/lib/shared/variant/transformer" -import { - deriveCustomPropertiesFromSpec, - derivePromptsFromSpec, -} from "@/oss/lib/shared/variant/transformer/transformer" -import type {AgentaConfigPrompt} from "@/oss/lib/shared/variant/transformer/types" -import {projectScopedVariantsAtom} from "@/oss/state/projectVariantConfig" -import { - appSchemaAtom, - appUriInfoAtom, - getEnhancedRevisionById, -} from "@/oss/state/variant/atoms/fetcher" - -import EvalNameTag from "../../../assets/EvalNameTag" -import {EVAL_TAG_COLOR} from "../../../assets/utils" -import VariantTag from "../../../assets/VariantTag" -import { - combineAppNameWithLabel, - deriveVariantAppName, - deriveVariantLabelParts, - getVariantDisplayMetadata, - normalizeId, - prettifyVariantLabel, -} from "../../../assets/variantUtils" - -import {PromptConfigCardSkeleton} from "./EvalRunPromptConfigViewerSkeleton" - -const PlaygroundVariantConfigPrompt = dynamic( - () => import("@/oss/components/Playground/Components/PlaygroundVariantConfigPrompt"), - {ssr: false, loading: () => }, -) -const PlaygroundVariantCustomProperties = dynamic( - () => import("@/oss/components/Playground/Components/PlaygroundVariantCustomProperties"), - {ssr: false, loading: () => }, -) - -type ParametersShape = Record | null | undefined - -type PromptNode = EnhancedObjectConfig - -const deriveFromParametersSnapshot = (parameters: ParametersShape) => { - const ag = (parameters as any)?.ag_config ?? (parameters as any) ?? {} - const fallbackPrompts = Object.entries(ag) - .map(([name, cfg]: [string, any]) => { - if (!cfg || typeof cfg !== "object") return null - const messages = (cfg as any).messages - const llm_config = (cfg as any).llm_config || (cfg as any).llmConfig - if (!messages && !llm_config) return null - return { - __name: name, - messages, - llm_config, - } - }) - .filter(Boolean) as PromptNode[] - - return {prompts: fallbackPrompts, customProps: {}} -} - -const mergeParametersWithSnapshot = ( - baseParameters: ParametersShape, - snapshot: ParametersShape, -): ParametersShape => { - if (!snapshot || typeof snapshot !== "object") { - return baseParameters ?? undefined - } - - const base = baseParameters && typeof baseParameters === "object" ? baseParameters : {} - const merged: Record = { - ...base, - ...snapshot, - } - - const baseAgConfig = - (base as any)?.ag_config ?? (base as any)?.agConfig ?? (base as any)?.parameters?.ag_config - const snapshotAgConfig = (snapshot as any)?.ag_config ?? (snapshot as any)?.agConfig - - if (snapshotAgConfig && typeof snapshotAgConfig === "object") { - const mergedAg = { - ...(baseAgConfig && typeof baseAgConfig === "object" ? baseAgConfig : {}), - ...snapshotAgConfig, - } - merged.ag_config = mergedAg - merged.agConfig = mergedAg - } else if (baseAgConfig && typeof baseAgConfig === "object") { - merged.ag_config = baseAgConfig - merged.agConfig = baseAgConfig - } - - return merged -} - -interface DeriveParams { - variantId: string - parameters: ParametersShape -} - -// Single source atom family that derives prompts and custom props -const derivedPromptsAtomFamily = atomFamily(({variantId, parameters}: DeriveParams) => - atom((get) => { - const normalizedVariantId = typeof variantId === "string" ? variantId.trim() : "" - - if (!normalizedVariantId) { - return deriveFromParametersSnapshot(parameters) - } - - const rev = getEnhancedRevisionById(get.bind(get) as any, normalizedVariantId) - - if (rev) { - try { - const spec = get(appSchemaAtom) - const routePath = get(appUriInfoAtom)?.routePath - - if (spec) { - const mergedParameters = mergeParametersWithSnapshot( - (rev as any).parameters, - parameters, - ) - const mergedVariant = { - ...(rev as any), - parameters: mergedParameters ?? (rev as any).parameters, - } - - const derivedPrompts = derivePromptsFromSpec( - mergedVariant as any, - spec as any, - routePath, - ) as PromptNode[] - const derivedCustomProps = deriveCustomPropertiesFromSpec( - mergedVariant as any, - spec as any, - routePath, - ) as Record - - if (Array.isArray(derivedPrompts)) { - return {prompts: derivedPrompts, customProps: derivedCustomProps} - } - } - } catch (error) { - if (process.env.NODE_ENV !== "production") { - console.warn("[PromptConfig] Failed to derive prompts from spec", error) - } - } - } - - return deriveFromParametersSnapshot(parameters) - }), -) - -const PromptContentSkeleton = memo(({description}: {description: string}) => { - return ( -
    - - -
    - {description} -
    -
    - ) -}) - -const PromptConfigCard = ({ - variantId, - evaluation, - isComparison, - colorIndex, - isFirstPrompt, - isMiddlePrompt, - isLastPrompt, - totalRuns, -}: { - variantId: string - evaluation: EnrichedEvaluationRun - isComparison: boolean - colorIndex: number - isFirstPrompt: boolean - isMiddlePrompt: boolean - isLastPrompt: boolean - totalRuns: number -}) => { - const router = useRouter() - const normalizedVariantId = useMemo(() => (variantId ? String(variantId) : ""), [variantId]) - const jotaiStore = useMemo(() => getDefaultStore(), []) - const projectScopedVariants = useAtomValue(projectScopedVariantsAtom) - - const [fallbackPrompts, setFallbackPrompts] = useState([]) - const [fallbackCustomProps, setFallbackCustomProps] = useState>({}) - const [fallbackTrigger, setFallbackTrigger] = useState(0) - const fallbackAttemptsRef = useRef(0) - - const variants = evaluation?.variants ?? [] - const selectedVariant = useMemo(() => { - if (!variants.length) return undefined - if (!normalizedVariantId) return variants[0] - - return ( - variants.find((variant) => { - const candidateIds = [ - (variant as any)?._revisionId, - (variant as any)?.id, - variant?.variantId, - ] - return candidateIds.some( - (candidate) => - candidate !== undefined && String(candidate) === normalizedVariantId, - ) - }) || undefined - ) - }, [variants, normalizedVariantId]) - - const projectScopedVariant = useMemo(() => { - if (!normalizedVariantId) return undefined - const scoped = projectScopedVariants?.revisionMap?.[normalizedVariantId] - return scoped && scoped.length > 0 ? scoped[0] : undefined - }, [normalizedVariantId, projectScopedVariants]) - - useEffect(() => { - setFallbackPrompts([]) - setFallbackCustomProps({}) - fallbackAttemptsRef.current = 0 - setFallbackTrigger(0) - }, [normalizedVariantId]) - - const variantForDisplay = selectedVariant ?? projectScopedVariant - - const fallbackVariantSource = useMemo(() => { - if (projectScopedVariant?.uri) return projectScopedVariant - if (selectedVariant?.uri) return selectedVariant - return projectScopedVariant ?? selectedVariant ?? null - }, [projectScopedVariant, selectedVariant]) - - const variantDisplay = useMemo( - () => - getVariantDisplayMetadata(variantForDisplay, { - fallbackLabel: normalizedVariantId || undefined, - fallbackRevisionId: normalizedVariantId || undefined, - requireRuntime: false, - }), - [variantForDisplay, normalizedVariantId], - ) - - const {label: formattedVariantLabel} = useMemo( - () => - deriveVariantLabelParts({ - variant: variantForDisplay, - displayLabel: variantDisplay.label, - }), - [variantForDisplay, variantDisplay.label], - ) - - const variantAppName = useMemo( - () => - deriveVariantAppName({ - variant: variantForDisplay, - fallbackAppName: - (evaluation as any)?.appName ?? - (evaluation as any)?.app_name ?? - (evaluation as any)?.app?.name ?? - undefined, - }), - [variantForDisplay, evaluation], - ) - - const variantLabel = combineAppNameWithLabel( - variantAppName, - prettifyVariantLabel(formattedVariantLabel) ?? formattedVariantLabel, - ) - - const revisionId = variantDisplay.revisionId || normalizedVariantId || "" - - const variantAppId = useMemo( - () => - normalizeId( - (variantForDisplay as any)?.appId ?? - (variantForDisplay as any)?.app_id ?? - (variantForDisplay as any)?.application?.id ?? - (variantForDisplay as any)?.application_id ?? - (variantForDisplay as any)?.application_ref?.id ?? - (variantForDisplay as any)?.applicationRef?.id, - ), - [variantForDisplay], - ) - - const evaluationAppId = useMemo( - () => - normalizeId( - (evaluation as any)?.appId ?? - (evaluation as any)?.app_id ?? - (evaluation as any)?.app?.id ?? - (evaluation as any)?.application?.id, - ), - [evaluation], - ) - - const normalizedRouteAppId = useMemo( - () => normalizeId(router.query?.app_id as string | undefined), - [router.query?.app_id], - ) - - const navigableAppId = variantAppId || evaluationAppId || normalizedRouteAppId - const isRouteAppContext = - Boolean(normalizedRouteAppId) && navigableAppId === normalizedRouteAppId - const blockedByRuntime = isRouteAppContext && variantDisplay.hasRuntime === false - - const canNavigateToVariant = Boolean( - revisionId && navigableAppId && variantDisplay.isHealthy !== false && !blockedByRuntime, - ) - - const parameters = useMemo(() => { - const map = (evaluation as any)?.parametersByRevisionId as - | Record - | undefined - - if (map) { - const candidateIds = [ - normalizedVariantId, - String((selectedVariant as any)?._revisionId ?? ""), - String((selectedVariant as any)?.id ?? ""), - String(selectedVariant?.variantId ?? ""), - ].filter( - (id) => - !!id && - id !== "undefined" && - id !== "null" && - id !== "[object Object]" && - id !== "NaN", - ) - - for (const id of candidateIds) { - if (map[id]) { - return map[id] - } - } - } - - const projectScopedParams = (projectScopedVariant as any)?.configParams - - return ( - (selectedVariant as any)?.parameters ?? - (selectedVariant as any)?.configParams ?? - projectScopedParams ?? - undefined - ) - }, [evaluation, normalizedVariantId, selectedVariant, projectScopedVariant]) - - const deriveParams = useMemo( - () => ({variantId: normalizedVariantId, parameters}), - [normalizedVariantId, parameters], - ) - - const {prompts, customProps} = useAtomValue(derivedPromptsAtomFamily(deriveParams), { - store: jotaiStore, - }) - - const basePrompts = prompts ?? [] - const promptsList = basePrompts.length ? basePrompts : fallbackPrompts - - const combinedCustomProps = useMemo(() => { - if (customProps && Object.keys(customProps).length > 0) return customProps - return fallbackCustomProps - }, [customProps, fallbackCustomProps]) - - const baseCustomPropsHasContent = useMemo(() => { - if (!customProps) return false - return Object.values(customProps).some((value) => { - if (value === null || value === undefined) return false - if (Array.isArray(value)) return value.length > 0 - if (typeof value === "object") return Object.keys(value).length > 0 - if (typeof value === "string") return value.trim().length > 0 - return true - }) - }, [customProps]) - - const combinedCustomPropsHasContent = useMemo(() => { - if (!combinedCustomProps) return false - return Object.values(combinedCustomProps).some((value) => { - if (value === null || value === undefined) return false - if (Array.isArray(value)) return value.length > 0 - if (typeof value === "object") return Object.keys(value).length > 0 - if (typeof value === "string") return value.trim().length > 0 - return true - }) - }, [combinedCustomProps]) - - const hasPrompts = promptsList.length > 0 - const hasContent = hasPrompts || combinedCustomPropsHasContent - const hasVariantsInRun = - (evaluation?.variants?.length ?? 0) > 0 || Boolean(projectScopedVariant) - const isVariantSelectable = Boolean(normalizedVariantId && variantForDisplay) - const showSkeleton = Boolean( - !variantForDisplay && normalizedVariantId && hasVariantsInRun && !parameters, - ) - const showPrompts = isVariantSelectable && hasContent - const emptyDescription = !isVariantSelectable - ? "Prompt configuration is unavailable because the source application or variant is no longer accessible." - : hasContent - ? "Prompt configuration isn't available because the original application is no longer accessible." - : "This evaluation does not include any prompt configuration data." - - const promptsMap = useMemo(() => { - if (!normalizedVariantId) return {} - return {[normalizedVariantId]: promptsList as PromptNode[] | undefined} - }, [normalizedVariantId, promptsList]) - - const fallbackCustomPropsPopulated = useMemo( - () => Object.keys(fallbackCustomProps).length > 0, - [fallbackCustomProps], - ) - - const shouldAttemptFallback = useMemo(() => { - if (!normalizedVariantId) return false - if (!fallbackVariantSource?.uri) return false - if (basePrompts.length > 0 || baseCustomPropsHasContent) return false - if (fallbackPrompts.length > 0 || fallbackCustomPropsPopulated) return false - return true - }, [ - normalizedVariantId, - fallbackVariantSource, - basePrompts.length, - baseCustomPropsHasContent, - fallbackPrompts.length, - fallbackCustomPropsPopulated, - ]) - - useEffect(() => { - if (!shouldAttemptFallback) return - - let isCancelled = false - let retryTimeout: ReturnType | undefined - - const snapshot = - (parameters && Object.keys(parameters as any).length > 0 - ? parameters - : (fallbackVariantSource as any)?.configParams) ?? {} - - const run = async () => { - try { - const {schema} = await fetchOpenApiSchemaJson(fallbackVariantSource!.uri as string) - if (!schema) { - throw new Error("Missing OpenAPI schema") - } - - const mergedParameters = mergeParametersWithSnapshot( - (fallbackVariantSource as any)?.parameters, - snapshot, - ) - - const fallbackVariant = { - ...fallbackVariantSource, - parameters: mergedParameters ?? snapshot, - } - - const derivedPrompts = derivePromptsFromSpec( - fallbackVariant as any, - schema as any, - ) as PromptNode[] - const derivedCustomProps = deriveCustomPropertiesFromSpec( - fallbackVariant as any, - schema as any, - ) as Record - - if (isCancelled) return - - fallbackAttemptsRef.current = 0 - setFallbackPrompts(Array.isArray(derivedPrompts) ? derivedPrompts : []) - setFallbackCustomProps(derivedCustomProps ?? {}) - - if (process.env.NODE_ENV !== "production" && typeof window !== "undefined") { - console.info("[PromptConfigCard] Fallback prompts derived", { - runId: evaluation?.id, - variantId: normalizedVariantId, - promptCount: derivedPrompts?.length ?? 0, - customPropsCount: Object.keys(derivedCustomProps ?? {}).length, - }) - } - } catch (error: any) { - if (isCancelled) return - const attempt = fallbackAttemptsRef.current + 1 - fallbackAttemptsRef.current = attempt - if (attempt <= 3) { - if (process.env.NODE_ENV !== "production" && typeof window !== "undefined") { - console.warn("[PromptConfigCard] Fallback prompt fetch failed, retrying", { - runId: evaluation?.id, - variantId: normalizedVariantId, - attempt, - error, - }) - } - retryTimeout = setTimeout(() => { - setFallbackTrigger((prev) => prev + 1) - }, 500 * attempt) - } else if (process.env.NODE_ENV !== "production" && typeof window !== "undefined") { - console.error("[PromptConfigCard] Fallback prompt fetch failed", { - runId: evaluation?.id, - variantId: normalizedVariantId, - attempt, - error, - }) - } - } - } - - run() - - return () => { - isCancelled = true - if (retryTimeout) clearTimeout(retryTimeout) - } - }, [ - shouldAttemptFallback, - fallbackTrigger, - normalizedVariantId, - fallbackVariantSource, - evaluation?.id, - parameters, - ]) - - const usingFallbackPrompts = basePrompts.length === 0 && fallbackPrompts.length > 0 - const usingFallbackCustomProps = !baseCustomPropsHasContent && fallbackCustomPropsPopulated - const parametersSource = - usingFallbackPrompts || usingFallbackCustomProps - ? "project-fallback" - : selectedVariant - ? "run" - : projectScopedVariant - ? "project-scoped" - : "none" - - return ( -
    2}, - {"!rounded-r-none": isComparison && isFirstPrompt}, - {"!rounded-none": isComparison && isMiddlePrompt}, - {"!rounded-l-none": isComparison && isLastPrompt}, - ])} - > -
    -
    - {evaluation?.name ? ( - - ) : null} - {variantForDisplay ? ( - - ) : ( - - Variant unavailable - - )} -
    -
    - - {showSkeleton ? ( - - ) : showPrompts ? ( - -
    - {promptsList.map((prompt) => ( - - ))} - -
    -
    - ) : ( -
    - - {emptyDescription} - - } - image={Empty.PRESENTED_IMAGE_SIMPLE} - /> -
    - )} -
    - ) -} - -export default memo(PromptConfigCard) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/index.tsx deleted file mode 100644 index 97c27cdbae..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunPromptConfigViewer/index.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import {memo, useEffect, useMemo, useRef} from "react" - -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {atom, useAtomValue, useSetAtom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {projectIdAtom} from "@/oss/state/project/selectors/project" -import { - clearProjectVariantReferencesAtom, - prefetchProjectVariantConfigs, - setProjectVariantReferencesAtom, -} from "@/oss/state/projectVariantConfig" - -import {collectProjectVariantReferences} from "../../../../../lib/hooks/usePreviewEvaluations/projectVariantConfigs" -import {urlStateAtom} from "../../../state/urlState" - -import PromptConfigCard from "./assets/PromptConfigCard" - -// Helper atom to read multiple run states given a list of runIds -const evaluationsRunFamily = atomFamily( - (runIds: string[]) => - atom((get) => { - return runIds.map((runId) => get(evaluationRunStateFamily(runId))) - }), - deepEqual, -) - -const EvalRunPromptConfigViewer = () => { - const runId = useRunId() - const urlState = useAtomValue(urlStateAtom) - const compareRunIds = urlState?.compare - - // Read base run and all comparison run states - const runIds = useMemo(() => { - if (!compareRunIds?.length) return [runId!] - return [runId!, ...compareRunIds] - }, [runId, compareRunIds]) - - const runs = useAtomValue(evaluationsRunFamily(runIds)) - const renderableRuns = useMemo( - () => runs?.filter((run) => Boolean(run?.enrichedRun)) ?? [], - [runs], - ) - const projectId = useAtomValue(projectIdAtom) - const setProjectVariantReferences = useSetAtom(setProjectVariantReferencesAtom) - const clearProjectVariantReferences = useSetAtom(clearProjectVariantReferencesAtom) - - const projectVariantReferences = useMemo(() => { - if (!projectId || !renderableRuns.length) return [] - const enrichedRuns = renderableRuns - .map((run) => run.enrichedRun) - .filter((run): run is NonNullable => Boolean(run)) - return collectProjectVariantReferences(enrichedRuns, projectId) - }, [projectId, renderableRuns]) - const referencesSetRef = useRef(false) - - useEffect(() => { - if (!projectId || projectVariantReferences.length === 0) { - return - } - setProjectVariantReferences(projectVariantReferences) - prefetchProjectVariantConfigs(projectVariantReferences) - referencesSetRef.current = true - }, [ - projectId, - projectVariantReferences, - setProjectVariantReferences, - prefetchProjectVariantConfigs, - ]) - - useEffect( - () => () => { - if (referencesSetRef.current) { - clearProjectVariantReferences() - referencesSetRef.current = false - } - }, - [clearProjectVariantReferences], - ) - - return ( -
    0}])}> - {renderableRuns.map((run, idx) => { - const enriched = run.enrichedRun! - const variants = Array.isArray(enriched?.variants) ? enriched.variants : [] - - const primaryVariant = - variants.find((variant) => { - const revisionId = - (variant as any)?._revisionId ?? - (variant as any)?.id ?? - variant?.variantId - return Boolean(revisionId) - }) ?? variants[0] - - const variantRevisionId = - (primaryVariant as any)?._revisionId ?? - (primaryVariant as any)?.id ?? - primaryVariant?.variantId ?? - "" - - const reactKey = variantRevisionId || `${enriched.id || "run"}-${idx}` - - return ( - 0} - colorIndex={run.colorIndex || (run.isBase ? 1 : undefined) || 1} - isFirstPrompt={idx === 0} - isMiddlePrompt={idx > 0 && idx < renderableRuns.length - 1} - isLastPrompt={idx === renderableRuns.length - 1} - totalRuns={renderableRuns.length} - /> - ) - })} -
    - ) -} - -export default memo(EvalRunPromptConfigViewer) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/EvalRunScoreTableSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/EvalRunScoreTableSkeleton.tsx deleted file mode 100644 index ee6c0d540b..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/EvalRunScoreTableSkeleton.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" -import clsx from "clsx" - -const EvalRunScoreTableSkeleton = ({className}: {className?: string}) => { - return ( -
    -
    - - -
    -
    - - -
    -
    - ) -} - -export default memo(EvalRunScoreTableSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/TraceMetrics.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/TraceMetrics.tsx deleted file mode 100644 index 06a6cb9d4a..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/TraceMetrics.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import {memo} from "react" - -import {Timer, Coins, PlusCircle} from "@phosphor-icons/react" -import {Space, Tooltip} from "antd" - -import {formatCurrency, formatLatency, formatTokenUsage} from "@/oss/lib/helpers/formatters" - -const TraceMetrics = ({latency, cost, tokens}: {latency: number; cost: number; tokens: number}) => { - return ( -
    - - -
    - - {formatLatency(latency)} -
    -
    - - -
    - - {formatCurrency(cost)} -
    -
    - - -
    - - {formatTokenUsage(tokens)} -
    -
    -
    -
    - ) -} - -export default memo(TraceMetrics) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/constants.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/constants.ts deleted file mode 100644 index f4947321b6..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/assets/constants.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {ColumnType} from "antd/es/table" - -export const FIXED_COLUMNS: ColumnType[] = [ - { - title: "Metric", - dataIndex: "title", - key: "title", - minWidth: 120, - fixed: "left", - }, - { - title: "Label", - dataIndex: "label", - key: "label", - minWidth: 120, - }, -] diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/index.tsx deleted file mode 100644 index 3dcf2de1e9..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunScoreTable/index.tsx +++ /dev/null @@ -1,879 +0,0 @@ -import {isValidElement, cloneElement, memo, useCallback, useMemo, useEffect, useState} from "react" - -import {Table, Typography} from "antd" -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {atom, useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" -import dynamic from "next/dynamic" - -import {formatColumnTitle} from "@/oss/components/Filters/EditColumns/assets/helper" -import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" -import FiltersPreview from "@/oss/components/pages/evaluations/onlineEvaluation/components/FiltersPreview" -import {useRunId} from "@/oss/contexts/RunIdContext" -import useURL from "@/oss/hooks/useURL" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import {formatLatency} from "@/oss/lib/helpers/formatters" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {runMetricStatsFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import { - BasicStats, - canonicalizeMetricKey, - getMetricDisplayName, - getMetricValueWithAliases, -} from "@/oss/lib/metricUtils" - -import { - retrieveQueryRevision, - type QueryFilteringPayload, -} from "../../../../../services/onlineEvaluations/api" -import { - collectMetricSchemasFromEvaluator, - deriveSchemaMetricType, -} from "../../../components/VirtualizedScenarioTable/assets/evaluatorSchemaUtils" -import RenameEvalButton from "../../../HumanEvalRun/components/Modals/RenameEvalModal/assets/RenameEvalButton" -import {urlStateAtom} from "../../../state/urlState" -import EvalNameTag from "../../assets/EvalNameTag" -import TagWithLink from "../../assets/TagWithLink" -import {EVAL_TAG_COLOR, EVAL_COLOR, EVAL_BG_COLOR} from "../../assets/utils" -import {formatMetricName} from "../../assets/utils" -import VariantTag from "../../assets/VariantTag" -import {getVariantDisplayMetadata} from "../../assets/variantUtils" -import type {EvaluatorMetricsSpiderChartProps} from "../EvaluatorMetircsSpiderChart/types" -import PlaceholderOverlay from "../shared/PlaceholderOverlay" -import SpiderChartPlaceholder from "../shared/SpiderChartPlaceholder" - -const EvaluatorMetricsSpiderChart = dynamic( - () => import("../EvaluatorMetircsSpiderChart"), - {ssr: false}, -) - -// Atom helpers to read multiple runs' state/metrics in one go -const runsStateFamily = atomFamily( - (runIds: string[]) => atom((get) => runIds.map((id) => get(evaluationRunStateFamily(id)))), - deepEqual, -) -const runsMetricsFamily = atomFamily( - (runIds: string[]) => - atom((get) => runIds.map((id) => ({id, metrics: get(runMetricStatsFamily({runId: id}))}))), - deepEqual, -) - -const INVOCATION_METRIC_KEYS = [ - "attributes.ag.metrics.costs.cumulative.total", - "attributes.ag.metrics.duration.cumulative", - "attributes.ag.metrics.tokens.cumulative.total", - "attributes.ag.metrics.errors.cumulative", -] as const - -const INVOCATION_METRIC_SET = new Set(INVOCATION_METRIC_KEYS) - -const COST_METRIC_KEY = INVOCATION_METRIC_KEYS[0] -const DURATION_METRIC_KEY = INVOCATION_METRIC_KEYS[1] -const TOKEN_METRIC_KEY = INVOCATION_METRIC_KEYS[2] -const ERRORS_METRIC_KEY = INVOCATION_METRIC_KEYS[3] - -const INVOCATION_METRIC_COLUMNS: {key: string; label: string}[] = [ - {key: COST_METRIC_KEY, label: "Cost (Total)"}, - {key: DURATION_METRIC_KEY, label: "Duration (Total)"}, - {key: TOKEN_METRIC_KEY, label: "Tokens (Total)"}, - {key: ERRORS_METRIC_KEY, label: "Errors"}, -] - -const metricHasContent = (metric: Record | undefined): boolean => { - if (!metric || typeof metric !== "object") return false - if (typeof metric.mean === "number" && Number.isFinite(metric.mean)) return true - if (typeof metric.count === "number" && metric.count > 0) return true - - const distribution: any[] | undefined = Array.isArray((metric as any).distribution) - ? (metric as any).distribution - : undefined - if (distribution && distribution.some((bin) => Number(bin?.count ?? 0) > 0)) return true - - const hist = Array.isArray((metric as any).hist) ? (metric as any).hist : undefined - if (hist && hist.some((bin) => Number(bin?.count ?? bin?.frequency ?? 0) > 0)) return true - - const freq = Array.isArray((metric as any).frequency) - ? (metric as any).frequency - : Array.isArray((metric as any).rank) - ? (metric as any).rank - : undefined - if (freq && freq.some((entry) => Number(entry?.count ?? entry?.frequency ?? 0) > 0)) return true - - const unique = (metric as any).unique - if (Array.isArray(unique) && unique.length > 0) { - return typeof metric.mean === "number" - } - - return false -} - -const EvalRunScoreTable = ({className, type}: {className?: string; type: "auto" | "online"}) => { - const baseRunId = useRunId() - const {projectURL} = useURL() - const urlState = useAtomValue(urlStateAtom) - const compareRunIds = (urlState?.compare || []).filter((id) => id && id !== baseRunId) - const allRunIds = useMemo(() => [baseRunId!, ...compareRunIds], [baseRunId, compareRunIds]) - - const isComparison = compareRunIds.length > 0 - - // Fetch all runs and their metrics - const runs = useAtomValue(runsStateFamily(allRunIds)) - const metricsByRun = useAtomValue(runsMetricsFamily(allRunIds)) - - const evaluatorsBySlug = useMemo(() => { - const map = new Map() - const register = (entry: any, slug: string) => { - if (!entry || typeof entry !== "object") return - if (!slug || map.has(slug)) return - map.set(slug, entry) - } - - runs.forEach((state) => { - const annotationSteps = state?.enrichedRun?.data?.steps?.filter( - (step: any) => step?.type === "annotation", - ) - annotationSteps?.forEach((step: any) => { - const evaluatorId = step?.references?.evaluator?.id - if (!evaluatorId) return - const evaluator = (state?.enrichedRun?.evaluators || []).find( - (e: any) => e.id === evaluatorId, - ) - if (evaluator) { - const originalKey = typeof step?.key === "string" ? step.key : undefined - const parts = originalKey ? originalKey.split(".") : [] - const humanKey = parts.length > 1 ? parts[1] : originalKey - const resolvedKey = step.origin === "human" ? humanKey : originalKey - if (originalKey) { - register(evaluator, originalKey) - } - if (resolvedKey && resolvedKey !== originalKey) { - register(evaluator, resolvedKey) - } - } - }) - }) - - return Object.fromEntries(map.entries()) - }, [runs]) - - const schemaMetricDefinitionsBySlug = useMemo(() => { - const map: Record = {} - Object.entries(evaluatorsBySlug).forEach(([slug, evaluator]) => { - const definitions = collectMetricSchemasFromEvaluator(evaluator) - .map(({name, schema}) => { - const trimmed = (name || "").trim() - if (!trimmed) return null - return {name: trimmed, type: deriveSchemaMetricType(schema)} - }) - .filter(Boolean) as {name: string; type?: string | string[]}[] - - const existing = map[slug] ?? [] - const merged = new Map() - existing.forEach((definition) => merged.set(definition.name, definition)) - definitions.forEach((definition) => merged.set(definition.name, definition)) - map[slug] = Array.from(merged.values()) - }) - return map - }, [evaluatorsBySlug]) - - const evaluatorMetricKeysBySlug = useMemo(() => { - const map: Record> = {} - Object.entries(schemaMetricDefinitionsBySlug).forEach(([slug, definitions]) => { - const set = new Set() - definitions.forEach(({name}) => { - const canonical = canonicalizeMetricKey(name) - set.add(name) - set.add(canonical) - const prefixed = `${slug}.${name}` - set.add(prefixed) - set.add(canonicalizeMetricKey(prefixed)) - }) - map[slug] = set - }) - return map - }, [schemaMetricDefinitionsBySlug]) - - // Convenience lookup maps - const evalById = useMemo(() => { - const map: Record = {} - runs.forEach((r) => (map[r.enrichedRun?.id || r.id] = r)) - return map - }, [runs]) - - const metricsLookup = useMemo(() => { - const map: Record> = {} - - metricsByRun.forEach(({id, metrics}) => { - const source = (metrics || {}) as Record - const normalized: Record = {...source} - - Object.entries(source || {}).forEach(([rawKey, value]) => { - const canonical = canonicalizeMetricKey(rawKey) - if (canonical !== rawKey && normalized[canonical] === undefined) { - normalized[canonical] = value - } - }) - map[id] = normalized - }) - - return map - }, [metricsByRun]) - - const combinedMetricEntries = useMemo(() => { - const entries: { - fullKey: string - evaluatorSlug: string - metricKey: string - }[] = [] - const seen = new Set() - - const pushEntry = (source: Record) => { - Object.keys(source || {}).forEach((rawKey) => { - const canonical = canonicalizeMetricKey(rawKey) - if (INVOCATION_METRIC_SET.has(canonical)) return - if (!canonical.includes(".")) return - if (seen.has(canonical)) return - - const metric = - (getMetricValueWithAliases(source, canonical) as Record) || - (source?.[rawKey] as Record) - if (!metricHasContent(metric)) return - - const segments = canonical.split(".").filter(Boolean) - if (!segments.length) return - - const resolveSlugFromSegments = () => { - let slugCandidate = segments[0] - let idx = 1 - while (idx <= segments.length) { - if (evaluatorsBySlug[slugCandidate]) { - return {slug: slugCandidate, metricStartIdx: idx} - } - if (idx >= segments.length) break - slugCandidate = `${slugCandidate}.${segments[idx]}` - idx += 1 - } - if (segments.length > 1 && evaluatorsBySlug[segments[1]]) { - return {slug: segments[1], metricStartIdx: 2} - } - return null - } - - const resolved = resolveSlugFromSegments() - if (!resolved) return - const {slug, metricStartIdx} = resolved - - const evaluator = evaluatorsBySlug[slug] - if (!evaluator) return - - const metricKeySegments = segments.slice(metricStartIdx) - const metricKey = - metricKeySegments.length > 0 - ? metricKeySegments.join(".") - : (segments[metricStartIdx - 1] ?? slug) - - if (metricKey.startsWith("attributes.ag.metrics")) { - return - } - - const allowedKeys = evaluatorMetricKeysBySlug[slug] - if (allowedKeys && allowedKeys.size) { - const keySegments = metricKey.split(".").filter(Boolean) - const candidateKeys = new Set([metricKey]) - keySegments.forEach((_, idx) => { - const prefix = keySegments.slice(0, idx + 1).join(".") - const suffix = keySegments.slice(idx).join(".") - if (prefix) candidateKeys.add(prefix) - if (suffix) candidateKeys.add(suffix) - const segment = keySegments[idx] - if (segment) candidateKeys.add(segment) - }) - const matchesDefinition = Array.from(candidateKeys).some((key) => - allowedKeys.has(key), - ) - if (!matchesDefinition) return - } - - entries.push({fullKey: canonical, evaluatorSlug: slug, metricKey}) - seen.add(canonical) - }) - } - - metricsByRun.forEach(({metrics}) => { - const source = (metrics || {}) as Record - pushEntry(source) - }) - - return entries - }, [metricsByRun, evaluatorsBySlug, evaluatorMetricKeysBySlug]) - - const baseRunState = baseRunId ? evalById[baseRunId] : undefined - const hasBaseScenarios = - (typeof baseRunState?.statusMeta?.total === "number" && - baseRunState.statusMeta.total > 0) || - (Array.isArray(baseRunState?.scenarios) && baseRunState.scenarios.length > 0) - const shouldShowSpiderPlaceholder = !hasBaseScenarios - - const getFrequencyData = useCallback((metric: any, returnPercentage = true) => { - const trueEntry = (metric as any)?.frequency?.find((f: any) => f?.value === true) - const total = (metric as any)?.count ?? 0 - return returnPercentage - ? `${(((trueEntry?.count ?? 0) / total) * 100).toFixed(2)}%` - : ((trueEntry?.count ?? 0) / total) * 100 - }, []) - - const chartMetrics = useMemo(() => { - interface Axis { - name: string - maxScore: number - type: "binary" | "numeric" - value?: number - [k: string]: any - _key: string - } - - const axesByKey: Record = {} - - combinedMetricEntries.forEach(({fullKey, evaluatorSlug, metricKey}) => { - const evaluator = evaluatorsBySlug[evaluatorSlug] - if (!evaluator) return - - const displayMetricName = metricKey - ? formatMetricName(metricKey) - : formatMetricName(fullKey) - const evaluatorLabel = evaluator?.name ?? formatColumnTitle(evaluatorSlug) - - const axis = - axesByKey[fullKey] || - (axesByKey[fullKey] = { - name: `${evaluatorLabel} - ${displayMetricName}`, - maxScore: 100, - type: "numeric", - _key: fullKey, - }) - - allRunIds.forEach((runId, runIdx) => { - const stats = metricsLookup[runId] || {} - const metric = getMetricValueWithAliases(stats, fullKey) - if (!metricHasContent(metric)) return - - const isBinary = Array.isArray((metric as any)?.frequency) - axis.type = isBinary ? "binary" : "numeric" - if (!isBinary) { - const mx = (metric as any)?.max - if (typeof mx === "number") { - axis.maxScore = Math.max(axis.maxScore, mx) - } - } else { - axis.maxScore = 100 - } - - const seriesKey = runIdx === 0 ? "value" : `value-${runIdx + 1}` - axis[seriesKey] = isBinary - ? getFrequencyData(metric, false) - : ((metric as any)?.mean ?? 0) - }) - }) - - let axes: Axis[] = Object.values(axesByKey) - - const evaluatorCount = axes.length - const addInvocationAxis = (metricKey: string, label?: string) => { - const axis: Axis = { - name: label ?? getMetricDisplayName(metricKey), - maxScore: 0, - type: "numeric", - _key: metricKey, - } - - allRunIds.forEach((runId, runIdx) => { - const metrics = metricsLookup[runId] - const metric = getMetricValueWithAliases(metrics || {}, metricKey) as any - if (!metric) return - const seriesKey = runIdx === 0 ? "value" : `value-${runIdx + 1}` - if (metric.mean !== undefined) { - axis[seriesKey] = metric.mean - axis.maxScore = Math.max(axis.maxScore, metric.mean) - } - }) - - if (axis.maxScore > 0) { - axes.push(axis) - } - } - - if (evaluatorCount < 3) { - INVOCATION_METRIC_COLUMNS.forEach(({key, label}) => addInvocationAxis(key, label)) - } - - if (axes.length > 0) { - allRunIds.forEach((_, runIdx) => { - const seriesKey = runIdx === 0 ? "value" : `value-${runIdx + 1}` - axes.forEach((a) => { - if (a[seriesKey] === undefined) a[seriesKey] = 0 - }) - }) - } - - return axes.map(({_key, ...rest}) => rest) - }, [allRunIds, combinedMetricEntries, evaluatorsBySlug, metricsLookup, getFrequencyData]) - - const spiderChartClassName = clsx([ - "min-h-[400px] h-[400px]", - {"w-[50%] !h-full": !isComparison}, - ]) - - const chartSeries = useMemo( - () => - allRunIds.map((id, idx) => { - const state = evalById[id] - const compareIdx = state?.compareIndex || idx + 1 - const colorIdx = state?.colorIndex || (state?.isBase ? 1 : undefined) || compareIdx - return { - key: idx === 0 ? "value" : `value-${idx + 1}`, - color: (EVAL_COLOR as any)[colorIdx] || "#3B82F6", - name: state?.enrichedRun?.name || `Eval ${compareIdx}`, - } - }), - [allRunIds, evalById], - ) - - const sortedEvaluatorMetricEntries = useMemo(() => { - const entries = [...combinedMetricEntries] - entries.sort((a, b) => - a.evaluatorSlug === b.evaluatorSlug - ? a.metricKey.localeCompare(b.metricKey) - : a.evaluatorSlug.localeCompare(b.evaluatorSlug), - ) - return entries - }, [combinedMetricEntries]) - - const dataSource = useMemo(() => { - // const baseEval = evalById[baseRunId!]?.enrichedRun - const rows: any[] = [] - - // Testsets row - if (type !== "online") { - const testsetRow: any = {key: "testsets", title: "Testsets", values: {}} - allRunIds.forEach((id) => { - if (baseRunId !== id) return - const enr = evalById[id]?.enrichedRun - const tags = (enr?.testsets || []).map((t: any) => ( - - )) - testsetRow.values[id] = tags.length ? tags[0] : "" - }) - rows.push(testsetRow) - } - - // Evaluations row - const evalsRow: any = {key: "evaluations", title: "Evaluations", values: {}} - allRunIds.forEach((id) => { - const state = evalById[id] - const enr = state?.enrichedRun - const colorIndex = - state?.colorIndex || (state?.isBase ? 1 : undefined) || state?.compareIndex || 1 - const color = EVAL_TAG_COLOR?.[colorIndex] - // evalsRow.values[id] = enr ? : "" - evalsRow.values[id] = enr ? ( -
    - - - - -
    - ) : ( - "" - ) - }) - rows.push(evalsRow) - - // date row - const dateRow: any = {key: "date", title: "Created at", values: {}} - allRunIds.forEach((id) => { - const state = evalById[id] - const enr = state?.enrichedRun - dateRow.values[id] = enr?.createdAt - }) - rows.push(dateRow) - - if (type === "online") { - const samplingRow: any = { - key: "sampling", - title: "Sampling rate", - values: {}, - } - allRunIds.forEach((id) => { - const state = evalById[id] - samplingRow.values[id] = - }) - rows.push(samplingRow) - } - - // Variants row - if (type !== "online") { - const variantsRow: any = {key: "variants", title: "Variants", values: {}} - allRunIds.forEach((id) => { - const enr = evalById[id]?.enrichedRun - const v = enr?.variants?.[0] as any - if (!v) { - variantsRow.values[id] =
    N/A
    - return - } - const summary = getVariantDisplayMetadata(v) - variantsRow.values[id] = ( - - ) - }) - rows.push(variantsRow) - } - - // Filters / Queries row - if (type === "online") { - const filtersRow: any = {key: "filters", title: "Filters / Queries", values: {}} - allRunIds.forEach((id) => { - const state = evalById[id] - filtersRow.values[id] = - }) - rows.push(filtersRow) - } - - // Metric rows (generic + evaluator) - const pushMetricRow = (key: string, labelNode: any) => { - const row: any = {key, title: labelNode, values: {}} - allRunIds.forEach((id) => { - const metric = getMetricValueWithAliases(metricsLookup[id] || {}, key) as - | BasicStats - | any - let value: any - - if (metric && (metric as any)?.mean !== undefined) { - const meanValue = (metric as any).mean - value = - key === DURATION_METRIC_KEY - ? formatLatency(meanValue) - : formatMetricValue(key, meanValue) - } else if ( - metric && - Array.isArray((metric as any)?.unique) && - typeof (metric as any)?.unique?.[0] === "boolean" - ) { - value = getFrequencyData(metric) - } - - row.values[id] = - value === undefined || value === null || value === "" ? ( -
    - ) : ( - value - ) - }) - rows.push(row) - } - - INVOCATION_METRIC_COLUMNS.forEach(({key: canonicalKey, label}) => { - const baseMetric = getMetricValueWithAliases( - metricsLookup[baseRunId!] || {}, - canonicalKey, - ) as any - const hasMean = baseMetric && (baseMetric as any)?.mean !== undefined - const titleNode = ( -
    - {label} - {/* {hasMean && (mean)} */} -
    - ) - pushMetricRow(canonicalKey, titleNode) - }) - - // Evaluator metrics grouped by evaluator slug - sortedEvaluatorMetricEntries.forEach(({evaluatorSlug: slug, metricKey, fullKey}) => { - const evaluator = evaluatorsBySlug[slug] - const baseMetric = getMetricValueWithAliases( - metricsLookup[baseRunId!] || {}, - fullKey, - ) as any - const metricPath = metricKey || fullKey - const labelSegment = metricPath.split(".").pop() || metricPath - const displayMetricName = formatColumnTitle(labelSegment) - const titleNode = ( -
    - - {evaluator?.name ?? formatColumnTitle(slug)} - -
    - {displayMetricName} - {baseMetric && (baseMetric as any)?.mean !== undefined && ( - (mean) - )} -
    -
    - ) - pushMetricRow(fullKey, titleNode) - }) - - return rows - }, [ - allRunIds, - baseRunId, - evalById, - evaluatorsBySlug, - getFrequencyData, - metricsLookup, - projectURL, - sortedEvaluatorMetricEntries, - type, - ]) - - return ( -
    -
    - Evaluator Scores Overview - - Average evaluator score across evaluations - -
    - -
    -
    -
    { - // First column is the label/title - const cols: any[] = [ - { - title: "Metric", - dataIndex: "title", - key: "title", - minWidth: 120, - fixed: "left", - }, - ] - - // One value column per run (base + comparisons) - allRunIds.forEach((id, idx) => { - const state = evalById[id] - const compareIdx = state?.compareIndex || idx + 1 - const colorIdx = - state?.colorIndex || - (state?.isBase ? 1 : undefined) || - compareIdx - cols.push({ - title: idx === 0 ? "Label" : `Label_${idx + 1}`, - key: `label_${id}`, - render: (_: any, record: any) => { - // Merge "Testsets" row across all run columns - if (record?.key === "testsets") { - if (id === allRunIds[0]) { - return { - children: - record?.values?.[baseRunId] ?? - record?.values?.[id] ?? - "", - props: {colSpan: allRunIds.length}, - } - } - return {children: null, props: {colSpan: 0}} - } - const value = record?.values?.[id] - if (!value) return "-" - if (record?.key !== "evaluations") return value - - const runState = evalById[id] - const enriched = runState?.enrichedRun - const firstVariant: any = enriched?.variants?.[0] - const summary = getVariantDisplayMetadata(firstVariant) - - if (isValidElement(value)) { - return cloneElement(value as any, { - allowVariantNavigation: summary.canNavigate, - variantName: summary.label, - id: summary.revisionId || undefined, - }) - } - - return summary.label - }, - minWidth: 120, - onCell: (record: any) => ({ - style: - isComparison && record?.key !== "testsets" - ? {background: (EVAL_BG_COLOR as any)[colorIdx]} - : undefined, - }), - }) - }) - - return cols - }, [allRunIds, baseRunId, isComparison, evalById])} - pagination={false} - showHeader={false} - bordered - scroll={{x: "max-content"}} - rowKey={(r) => r.key} - /> - - {shouldShowSpiderPlaceholder ? ( -
    - - -
    - ) : chartMetrics.length < 3 ? null : ( - - )} - - - ) -} - -export default memo(EvalRunScoreTable) - -const queryRevisionCache = new Map() - -function useRunQueryRevision(state: any) { - const runIndex = state?.runIndex - const enriched = state?.enrichedRun - const queryId: string | undefined = useMemo(() => { - // runIndex path - const stepsMeta = (runIndex?.steps || {}) as Record - for (const meta of Object.values(stepsMeta)) { - const refs = (meta as any)?.refs || {} - const q = refs?.query || {} - const id = q?.id || refs?.queryId - if (typeof id === "string" && id.trim()) return id - } - // raw data path (like OnlineEvaluation table records) - const steps = (enriched as any)?.data?.steps - const inputStep = Array.isArray(steps) - ? steps.find((s: any) => s?.type === "input") - : undefined - const qRefs = inputStep?.references || {} - const rid = qRefs?.query?.id || qRefs?.queryId - return typeof rid === "string" && rid.trim() ? rid : undefined - }, [runIndex?.steps, enriched]) - - const [revision, setRevision] = useState(() => { - if (!queryId) return undefined - return queryRevisionCache.get(queryId) - }) - useEffect(() => { - let mounted = true - ;(async () => { - try { - if (!queryId) { - if (mounted) setRevision(undefined) - return - } - if (queryRevisionCache.has(queryId)) { - if (mounted) setRevision(queryRevisionCache.get(queryId)) - return - } - const res = await retrieveQueryRevision({query_ref: {id: queryId}}) - const rev = res?.query_revision || null - queryRevisionCache.set(queryId, rev) - if (mounted) setRevision(rev) - } catch { - if (mounted) setRevision(null) - } - })() - return () => { - mounted = false - } - }, [queryId]) - - const {filtering, windowing} = (revision?.data ?? {}) as { - filtering?: QueryFilteringPayload - windowing?: {rate?: number; limit?: number; newest?: string; oldest?: string} - } - - return {filtering, windowing} -} - -function RunFiltersTags({state}: {state: any}) { - const {filtering, windowing} = useRunQueryRevision(state) - - const historicalRangeLabel = useMemo(() => { - const oldest = windowing?.oldest - const newest = windowing?.newest - if (!oldest || !newest) return undefined - const oldestDate = dayjs(oldest) - const newestDate = dayjs(newest) - if (!oldestDate.isValid() || !newestDate.isValid()) return undefined - const diffDays = Math.max(newestDate.diff(oldestDate, "day"), 0) - if (diffDays > 0 && diffDays <= 31) { - return `Historical: Last ${diffDays} day${diffDays === 1 ? "" : "s"}` - } - return `Historical: ${oldestDate.format("DD MMM YYYY")} – ${newestDate.format( - "DD MMM YYYY", - )}` - }, [windowing?.newest, windowing?.oldest]) - - const hasMeta = Boolean(windowing?.oldest && windowing?.newest && historicalRangeLabel) - - return ( -
    - - {hasMeta ? ( -
    - {historicalRangeLabel} -
    - ) : null} -
    - ) -} - -function RunSamplingRate({state}: {state: any}) { - const {windowing} = useRunQueryRevision(state) - const ratePercent = useMemo(() => { - const r = typeof windowing?.rate === "number" ? windowing?.rate : undefined - if (r === undefined || Number.isNaN(r)) return undefined - const clamped = Math.max(0, Math.min(1, r)) - return Math.round(clamped * 100) - }, [windowing?.rate]) - - if (ratePercent === undefined) { - return
    - } - return {ratePercent}% -} diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunSelectedEvaluations/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunSelectedEvaluations/index.tsx deleted file mode 100644 index bb6daeffaa..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunSelectedEvaluations/index.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import {memo, useMemo} from "react" - -import deepEqual from "fast-deep-equal" -import {atom, useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" - -import { - evalAtomStore, - evaluationRunStateFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import EvalNameTag from "../../assets/EvalNameTag" -import {EVAL_TAG_COLOR} from "../../assets/utils" - -const comparisonRunsAtom = atomFamily( - (runIds: string[]) => - atom((get) => { - return runIds.map((runId) => { - const state = get(evaluationRunStateFamily(runId)) - return { - runId, - run: state?.enrichedRun, - compareIndex: state?.compareIndex, - colorIndex: state?.colorIndex, - isBase: state?.isBase, - isComparison: state?.isComparison, - } - }) - }), - deepEqual, -) -const EvalRunSelectedEvaluations = ({runIds, baseRunId}: {runIds: string[]; baseRunId: string}) => { - // Build a stable, de-duplicated list so transient states (during swaps) don't render duplicates - const uniqueIds = useMemo(() => { - const list = [baseRunId, ...runIds] - const seen = new Set() - return list.filter((id) => { - if (!id || seen.has(id)) return false - seen.add(id) - return true - }) - }, [baseRunId, runIds.join(",")]) - - const runs = useAtomValue(comparisonRunsAtom(uniqueIds), {store: evalAtomStore()}) - - return ( -
    - Evaluations: -
    -
    - {runs - ?.filter((r) => Boolean(r?.run)) - .map((r) => { - const idx = r?.colorIndex ?? (r?.isBase ? 1 : undefined) - const color = idx ? (EVAL_TAG_COLOR as any)[idx] : undefined - return ( - - ) - })} -
    - {/*
    */} -
    -
    - ) -} - -export default memo(EvalRunSelectedEvaluations) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewUtilityOptions/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewUtilityOptions/index.tsx deleted file mode 100644 index c2a9ddeaf9..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewUtilityOptions/index.tsx +++ /dev/null @@ -1,413 +0,0 @@ -import {Dispatch, memo, SetStateAction, useCallback, useMemo, useState} from "react" - -import {message} from "antd" -import {ColumnsType} from "antd/es/table" -import {useAtomValue} from "jotai" -import {useRouter} from "next/router" - -import EditColumns from "@/oss/components/Filters/EditColumns" -import {useRunId} from "@/oss/contexts/RunIdContext" -import {convertToStringOrJson} from "@/oss/lib/helpers/utils" -import { - evalAtomStore, - evaluationEvaluatorsFamily, - evaluationRunStateFamily, - scenarioIdsFamily, - scenarioStepFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {scenarioMetricsMapFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" - -import EvalRunScenarioNavigator from "../../../components/EvalRunScenarioNavigator" -import SaveDataButton from "../../../components/SaveDataModal/assets/SaveDataButton" -import useExpandableComparisonDataSource from "../../../components/VirtualizedScenarioTable/hooks/useExpandableComparisonDataSource" -import {metricsFromEvaluatorsFamily} from "../../../components/VirtualizedScenarioTable/hooks/useTableDataSource" -import {urlStateAtom} from "../../../state/urlState" - -const EMPTY_ROWS: any[] = [] - -interface ScenarioCsvRow { - scenarioId?: string - record: Record -} - -const extractPrimitiveMetricValue = (input: any): any => { - if (input === null || input === undefined) return input - if (typeof input !== "object") return input - if (Array.isArray(input)) { - for (const item of input) { - const value = extractPrimitiveMetricValue(item) - if (value !== undefined) return value - } - return undefined - } - if (typeof (input as any).mean !== "undefined") return (input as any).mean - if (typeof (input as any).value !== "undefined") return (input as any).value - if (Array.isArray((input as any).frequency) && (input as any).frequency.length) { - const sorted = [...(input as any).frequency].sort( - (a, b) => (b?.count ?? 0) - (a?.count ?? 0), - ) - const candidate = sorted.find((entry) => entry?.value !== undefined) - if (candidate) return candidate.value - } - if (Array.isArray((input as any).rank) && (input as any).rank.length) { - const candidate = (input as any).rank.find((entry: any) => entry?.value !== undefined) - if (candidate) return candidate.value - } - if (Array.isArray((input as any).unique) && (input as any).unique.length) { - return (input as any).unique.find((item: any) => item !== undefined) - } - for (const value of Object.values(input)) { - const extracted = extractPrimitiveMetricValue(value) - if (extracted !== undefined) return extracted - } - return undefined -} - -const parseAnnotationMetricKey = ( - key: string, -): null | {slug: string; metric: string; source: "direct" | "analytics"} => { - if (!key.includes(".")) return null - if (key.startsWith("attributes.ag.")) return null - const analyticsOutputMatch = key.match(/^([^\.]+)\.attributes\.ag\.data\.outputs\.(.+)$/) - if (analyticsOutputMatch) { - return {slug: analyticsOutputMatch[1], metric: analyticsOutputMatch[2], source: "analytics"} - } - const analyticsMetricMatch = key.match(/^([^\.]+)\.attributes\.ag\.metrics\.(.+)$/) - if (analyticsMetricMatch) { - return { - slug: analyticsMetricMatch[1], - metric: analyticsMetricMatch[2], - source: "analytics", - } - } - const [slug, ...rest] = key.split(".") - const metric = rest.join(".") - if (!slug || !metric) return null - return {slug, metric, source: "direct"} -} - -const EvalRunTestcaseViewUtilityOptions = ({ - columns, - setEditColumns, -}: { - columns: ColumnsType - setEditColumns: Dispatch> -}) => { - const runId = useRunId() - const router = useRouter() - // states for select dropdown - const [rows, setRows] = useState(EMPTY_ROWS) - const evaluation = useAtomValue(evaluationRunStateFamily(runId)) - const urlState = useAtomValue(urlStateAtom) - // Determine runs to include: base + comparisons (unique, exclude base duplicates) - const compareRunIds = useMemo( - () => (urlState?.compare || []).filter(Boolean) as string[], - [urlState?.compare], - ) - const hasComparisons = compareRunIds.length > 0 - const allRunIds = Array.from(new Set([runId, ...compareRunIds.filter((id) => id !== runId)])) - const selectedScenarioId = router.query.scrollTo as string - - const {rawColumns: comparisonRawColumns} = useExpandableComparisonDataSource({ - baseRunId: runId, - comparisonRunIds: compareRunIds, - }) - - const csvDataFormat = useCallback(async () => { - const store = evalAtomStore() - - // Helper: build rows for a single run - const buildRowsForRun = async (rId: string): Promise => { - // 1) Scenario IDs and evaluator info for this run - const ids = store.get(scenarioIdsFamily(rId)) - const evaluatorsRaw = store.get(evaluationEvaluatorsFamily(rId)) || [] - const evaluatorList: any[] = Array.isArray(evaluatorsRaw) - ? (evaluatorsRaw as any[]) - : Object.values(evaluatorsRaw as any) - const evaluatorSlugs = evaluatorList.map((e: any) => e.slug) - const baseEvaluatorMap = new Map() - evaluatorList.forEach((evaluator: any) => { - if (evaluator?.slug) baseEvaluatorMap.set(evaluator.slug, evaluator) - }) - - // 2) Resolve steps and metrics for this run - const [scenarioMetricsMap, ...allScenarios] = await Promise.all([ - store.get(scenarioMetricsMapFamily(rId)), - ...ids.map((id) => store.get(scenarioStepFamily({runId: rId, scenarioId: id}))), - ]) - - // Evaluation name for this run (for column 'name' when comparing) - const runState = store.get(evaluationRunStateFamily(rId)) - const evalName = runState?.enrichedRun?.name - - // 3) Build CSV-friendly rows for this run - const rowsForRun: ScenarioCsvRow[] = [] - - allScenarios.forEach((scenario) => { - if (!scenario) return - const sid = scenario.scenarioId || scenario.id || scenario.steps?.[0]?.scenarioId - const scenarioId = sid ? String(sid) : undefined - - const scenarioEvaluatorMap = new Map(baseEvaluatorMap) - const registerEvaluator = (candidate?: any) => { - if (!candidate?.slug) return - const existing = scenarioEvaluatorMap.get(candidate.slug) - if (existing && existing.name) return - scenarioEvaluatorMap.set(candidate.slug, {...existing, ...candidate}) - } - ;(scenario.steps || []).forEach((step: any) => { - registerEvaluator(step?.evaluator) - registerEvaluator(step?.annotation?.references?.evaluator) - }) - ;(scenario.annSteps || []).forEach((step: any) => { - registerEvaluator(step?.evaluator) - registerEvaluator(step?.annotation?.references?.evaluator) - }) - const resolveEvaluatorLabel = (slug?: string) => { - if (!slug) return undefined - const evaluator = scenarioEvaluatorMap.get(slug) - return evaluator?.name || evaluator?.displayName || evaluator?.slug || slug - } - - const primaryInput = scenario.inputSteps?.find((s: any) => s.inputs) || {} - const {inputs = {}, groundTruth = {}, status: inputStatus} = primaryInput as any - - const record: Record = {} - - // When in comparison mode, include evaluation name - if (hasComparisons && evalName) { - record.name = evalName - } - - // 1. Add input - if (!Object.keys(groundTruth).length) { - Object.entries(primaryInput.testcase?.data || {}).forEach(([k, v]) => { - if (k === "testcase_dedup_id") return - record[`input.${k}`] = convertToStringOrJson(v) - }) - } else { - Object.entries(inputs || {}).forEach(([k, v]) => { - record[`input.${k}`] = convertToStringOrJson(v) - }) - } - - // 2. Add output - // Extract model output from the first invocation step that contains a trace - const invWithTrace = scenario.invocationSteps?.find((inv: any) => inv.trace) - - if (!invWithTrace) { - const invWithErr = scenario.invocationSteps?.find((inv: any) => inv.error) - if (invWithErr) { - record.output = convertToStringOrJson( - invWithErr.error?.stacktrace || invWithErr.error, - ) - } - } - - if (invWithTrace) { - const traceObj = invWithTrace?.trace - let traceOutput: any - if (Array.isArray(traceObj?.nodes)) { - traceOutput = traceObj.nodes[0]?.data?.outputs - } else if (Array.isArray(traceObj?.trees)) { - traceOutput = traceObj.trees[0]?.nodes?.[0]?.data?.outputs - } - - if (traceOutput) { - record.output = convertToStringOrJson(traceOutput) - } - } - - // 3. Add status - if (!invWithTrace) { - const _invWithTrace = scenario.invocationSteps?.find((inv: any) => inv.error) - record.status = _invWithTrace?.status ?? "unknown" - } else { - record.status = invWithTrace?.status ?? "unknown" - } - - // 4. Add annotation and metrics/errors - const annSteps = scenario.steps.filter((step) => - evaluatorSlugs.includes(step.stepKey), - ) - const steps = annSteps.length - ? annSteps - : scenario.invocationSteps?.filter((inv: any) => inv.error) - const annotation = scenarioMetricsMap?.[sid] - - // Prefill metric columns so compare-eval metrics are visible even if values missing yet - const evalMetricsDefs = store.get(metricsFromEvaluatorsFamily(rId)) as any - if (evalMetricsDefs && typeof evalMetricsDefs === "object") { - Object.entries(evalMetricsDefs).forEach(([slug, defs]: [string, any[]]) => { - const label = resolveEvaluatorLabel(slug) - if (!label) return - if (!Array.isArray(defs)) return - defs.forEach((metricDef) => { - Object.keys(metricDef || {}) - .filter((k) => k !== "evaluatorSlug") - .forEach((metricName) => { - const key = `${label}.${metricName}` - if (!(key in record)) record[key] = "" - }) - }) - }) - } - - if (steps?.some((step) => step.error) || invWithTrace?.error) { - const evalMetrics = store.get(metricsFromEvaluatorsFamily(rId)) - steps.forEach((step) => { - if (!step.error) return null - - const errorMessage = - step.error.stacktrace || step?.error?.message || step.error - Object.entries(evalMetrics || {}).forEach(([k, v]) => { - if (Array.isArray(v)) { - v.forEach((metric) => { - const {evaluatorSlug, ...rest} = metric - const label = - resolveEvaluatorLabel(evaluatorSlug) || - evaluatorSlug || - "unknown" - - Object.keys(rest || {}).forEach((metricKey) => { - record[`${label}.${metricKey}`] = - convertToStringOrJson(errorMessage) - }) - }) - } - }) - }) - } - - if (annotation) { - Object.entries(annotation || {}).forEach(([k, v]) => { - const parsed = parseAnnotationMetricKey(k) - if (!parsed) return - if (["error", "errors"].includes(parsed.metric)) return - const label = resolveEvaluatorLabel(parsed.slug) - if (!label) return - - const primitive = extractPrimitiveMetricValue(v) - if (primitive === undefined) return - - const recordKey = `${label}.${parsed.metric}` - const existingValue = record[recordKey] - if ( - parsed.source === "direct" && - existingValue !== undefined && - existingValue !== null && - existingValue !== "" - ) { - return - } - - record[recordKey] = - typeof primitive === "number" - ? Number.isFinite(primitive) && !Number.isInteger(primitive) - ? primitive.toFixed(3) - : primitive - : convertToStringOrJson(primitive) - }) - } - rowsForRun.push({record, scenarioId}) - }) - - return rowsForRun - } - - // Build data across all runs - const rowsByRun = new Map() - const lookupByRun = new Map>() - - for (const rId of allRunIds) { - const rows = await buildRowsForRun(rId) - rowsByRun.set(rId, rows) - - const scenarioLookup = new Map() - rows.forEach((row) => { - if (row && row.scenarioId) { - scenarioLookup.set(row.scenarioId, row) - } - }) - lookupByRun.set(rId, scenarioLookup) - } - - if (!hasComparisons) { - const baseRows = rowsByRun.get(runId) || [] - return baseRows.map(({record}) => record) - } - - const orderedResults: Record[] = [] - const baseRows = rowsByRun.get(runId) || [] - const uniqueCompareRunIds = Array.from( - new Set(compareRunIds.filter((id) => id && id !== runId)), - ) - - baseRows.forEach((baseRow, index) => { - if (!baseRow) return - orderedResults.push(baseRow.record) - - uniqueCompareRunIds.forEach((compareId) => { - const compareRows = rowsByRun.get(compareId) || [] - if (!compareRows.length) return - - const scenarioLookup = lookupByRun.get(compareId) - const matchedRow = - (baseRow.scenarioId && scenarioLookup?.get(baseRow.scenarioId)) || - compareRows[index] - - if (matchedRow) { - orderedResults.push(matchedRow.record) - } - }) - }) - - return orderedResults - }, [runId, evalAtomStore, allRunIds, compareRunIds, hasComparisons]) - - const onClickSaveData = useCallback(async () => { - try { - const data = await csvDataFormat() - setRows(data) - } catch (error) { - message.error("Failed to export results") - } - }, [csvDataFormat]) - - return ( -
    -
    - Go to testcase: - -
    -
    - - { - setEditColumns(keys) - }} - /> -
    -
    - ) -} - -export default memo(EvalRunTestcaseViewUtilityOptions) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewer/assets/EvalRunTestcaseViewerSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewer/assets/EvalRunTestcaseViewerSkeleton.tsx deleted file mode 100644 index 16d29a948c..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewer/assets/EvalRunTestcaseViewerSkeleton.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" - -export const EvalRunTestcaseTableSkeleton = memo( - ({rows = 8, cols = 5, rowHight = 60}: {rows?: number; cols?: number; rowHight?: number}) => { - return ( -
    -
    - - - {Array.from({length: cols}).map((_, colIndex) => ( - - ))} - - - - {Array.from({length: rows}).map((_, rowIndex) => ( - - {Array.from({length: cols}).map((_, colIndex) => ( - - ))} - - ))} - -
    - -
    - -
    -
    - ) - }, -) - -const EvalRunTestcaseViewerSkeleton = ({ - rows = 8, - cols = 5, - rowHight = 60, -}: { - rows?: number - cols?: number - rowHight?: number -}) => { - return ( -
    -
    - -
    - - -
    -
    - - -
    - ) -} - -export default memo(EvalRunTestcaseViewerSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewer/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewer/index.tsx deleted file mode 100644 index 0508bfba38..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvalRunTestcaseViewer/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import {memo} from "react" - -import VirtualizedScenarioTable from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable" -import useTableDataSource from "@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource" - -import EvalRunTestcaseViewUtilityOptions from "../EvalRunTestcaseViewUtilityOptions" - -import EvalRunTestcaseViewerSkeleton from "./assets/EvalRunTestcaseViewerSkeleton" - -const EvalRunTestcaseViewer = () => { - const {antColumns, isLoadingSteps, setEditColumns, rawColumns} = useTableDataSource() - - if (isLoadingSteps) { - return - } - - return ( -
    - - -
    - -
    -
    - ) -} - -export default memo(EvalRunTestcaseViewer) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetircsSpiderChart/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetircsSpiderChart/index.tsx deleted file mode 100644 index 870d59a3b0..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetircsSpiderChart/index.tsx +++ /dev/null @@ -1,223 +0,0 @@ -import {memo, useMemo} from "react" - -import {Typography} from "antd" -import clsx from "clsx" -import { - PolarAngleAxis, - PolarGrid, - PolarRadiusAxis, - Radar, - RadarChart, - ResponsiveContainer, - Tooltip, -} from "recharts" - -import {format3Sig} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" -import {formatCurrency, formatLatency} from "@/oss/lib/helpers/formatters" - -import {EVAL_COLOR} from "../../assets/utils" - -import {EvaluatorMetricsSpiderChartProps, MetricData, SeriesMeta} from "./types" - -const EvaluatorMetricsSpiderChart = ({ - className, - metrics = [], - maxScore = 100, - series = [{key: "value", color: EVAL_COLOR[1], name: "Eval 1"}], -}: EvaluatorMetricsSpiderChartProps) => { - // Build chart data with per-axis normalization to 0-100 so - // each axis can have its own maxScore while sharing a single radius scale. - const chartData: MetricData[] = useMemo(() => { - return metrics.map((m) => { - const axisMax = - typeof m.maxScore === "number" && isFinite(m.maxScore) && m.maxScore > 0 - ? m.maxScore - : maxScore - - const baseRaw = typeof m.value === "number" && isFinite(m.value) ? m.value : 0 - const baseNorm = Math.max(0, Math.min(100, (baseRaw / axisMax) * 100)) - - const obj: MetricData = { - subject: m.name, - value: baseNorm, - rawValue: baseRaw, - maxScore: axisMax, - type: m.type, - } - - // Add normalized values for additional series using same axis max - series.forEach((s) => { - const key = s.key - if (key === "value") return // already set - const raw = typeof m[key] === "number" && isFinite(m[key]) ? m[key] : 0 - const norm = Math.max(0, Math.min(100, (raw / axisMax) * 100)) - ;(obj as any)[key] = norm - }) - - return obj - }) - }, [metrics, maxScore, series]) - - if (metrics.length === 0) { - return ( -
    - No metrics available -
    - ) - } - - const LABEL_OFFSET = 12 // distance outside web - const NUDGE = 5 // small outward nudge - const RAD = Math.PI / 180 - - return ( -
    - - - - { - const {cx, cy, radius, payload, index} = props - const label = (payload?.value ?? "") as string - - const angle = Number(payload?.coordinate ?? 0) - const r = (radius ?? 0) + LABEL_OFFSET - - const x = cx + r * Math.cos(-angle * RAD) - const y = cy + r * Math.sin(-angle * RAD) - - const cos = Math.cos(-angle * RAD) - const sin = Math.sin(-angle * RAD) - - const textAnchor = - Math.abs(cos) < 0.1 ? "middle" : cos > 0 ? "start" : "end" - - const nudgeX = cos * NUDGE - const nudgeY = sin * NUDGE - - // simple 2-line clamp to avoid spilling into chart - const clampLines = (s: string, max = 18) => { - const parts = s.includes(" - ") ? s.split(" - ") : [s] - if (parts.length >= 2) return parts.slice(0, 2) - const words = s.split(/\s+/) - let line1 = "" - let line2 = "" - for (const w of words) { - if ((line1 + " " + w).trim().length <= max) - line1 = (line1 + " " + w).trim() - else if ((line2 + " " + w).trim().length <= max) - line2 = (line2 + " " + w).trim() - else { - line2 = (line2 || w).slice(0, max - 1) + "…" - break - } - } - return line2 ? [line1, line2] : [line1] - } - - const lines = clampLines(label, 18) - - return ( - - - {lines.map((ln, i) => ( - - {ln} - - ))} - - - ) - }} - /> - - { - try { - const d = payload?.payload as MetricData | undefined - if (!d) return [val, "Score"] - // val is normalized percentage for the active series - const pct = typeof val === "number" ? val : Number(val) - // Reconstruct raw from normalized and axis max (for numeric) - const rawFromPct = (pctNum: number) => - (pctNum / 100) * (d?.maxScore ?? 0) - - const color = - typeof payload?.color === "string" ? payload.color : "#0F172A" - const styledName = ( - {String(name)} - ) - - if (d.type === "binary") { - const valueLabel = `${pct.toFixed(2)}% / 100%` - return [ - {valueLabel}, - styledName, - ] - } - - // Numeric: format latency/costs specially when subject hints it - const raw = rawFromPct(pct) - const valueColor = {color, fontWeight: 600} - if (String(d?.subject).toLowerCase().includes("duration")) { - return [ - - {`${formatLatency(raw)} / ${formatLatency(d?.maxScore)}`} - , - styledName, - ] - } - if (String(d?.subject).toLowerCase().includes("cost")) { - return [ - - {`${formatCurrency(raw)} / ${formatCurrency(d?.maxScore)}`} - , - styledName, - ] - } - return [ - {`${format3Sig(raw)} / ${format3Sig( - d?.maxScore, - )}`}, - styledName, - ] - } catch (error) { - return [String(val), String(name)] - } - }} - /> - {series.map((s: SeriesMeta, i: number) => ( - - ))} - - -
    - ) -} - -export default memo(EvaluatorMetricsSpiderChart) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetircsSpiderChart/types.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetircsSpiderChart/types.ts deleted file mode 100644 index 6a485ee9bb..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetircsSpiderChart/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -export interface MetricData { - subject: string - // Normalized values used for plotting (0-100) per series. - // Base series uses `value`; additional series use keys like `value-2`, `value-3`, ... - value?: number - [key: string]: any - // Raw value and axis-specific max for tooltip/labels (base series) - rawValue: number - maxScore: number - type?: "binary" | "numeric" -} - -export interface SeriesMeta { - key: string // e.g. "value", "value-2", ... - color: string - name?: string -} - -export interface EvaluatorMetricsSpiderChartProps { - className?: string - metrics: { - name: string - // Base value; additional series are passed via dynamic props (e.g., value-2) - value?: number - [key: string]: any - maxScore: number - type: "binary" | "numeric" - }[] - maxScore?: number - series?: SeriesMeta[] -} diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/TimeSeriesChart.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/TimeSeriesChart.tsx deleted file mode 100644 index 3fba471a38..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/TimeSeriesChart.tsx +++ /dev/null @@ -1,1105 +0,0 @@ -import {Fragment, memo, useMemo, useState, useEffect, useRef, type ReactNode} from "react" - -import {Card, Typography} from "antd" -import clsx from "clsx" -import { - Area, - CartesianGrid, - ComposedChart, - Line, - LineChart, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from "recharts" - -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" - -import {formatMetricName} from "../../assets/utils" -import PlaceholderOverlay, {PlaceholderEvaluationType} from "../shared/PlaceholderOverlay" - -import {withAlpha, format3Sig, formatTimestamp} from "./assets/helpers" -import HistogramChart from "./assets/HistogramChart" -import LowerBand from "./assets/LowerBand" -import UpperBand from "./assets/UpperBand" - -// helpers moved to ./assets/helpers - -const PLACEHOLDER_TIME_START = Date.UTC(2025, 0, 1, 9, 0, 0) -const PLACEHOLDER_TIME_STEP = 60 * 60 * 1000 -export const PLACEHOLDER_LINE_COLOR = "#9EB8FF" -export const PLACEHOLDER_FILL_COLOR = "rgba(62, 124, 247, 0.12)" -export const PLACEHOLDER_TIME_SERIES = [ - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 0, value: 22}, - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 1, value: 32}, - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 2, value: 26}, - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 3, value: 38}, - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 4, value: 30}, - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 5, value: 42}, - {timestamp: PLACEHOLDER_TIME_START + PLACEHOLDER_TIME_STEP * 6, value: 34}, -] as const - -const X_AXIS_PADDING_RATIO = 0.035 -const X_AXIS_PADDING_MIN_MS = 60 * 1000 // 1 minute -const BOOLEAN_AXIS_PADDING = 2 -const BOOLEAN_AXIS_TICKS = [0, 25, 50, 75, 100] as const - -interface SeriesPoint { - timestamp: number - value: number - scenarioCount?: number - p25?: number - p50?: number - p75?: number - histogram?: {from: number; to: number; count: number}[] -} - -interface TimeSeries { - id: string - name: string - color: string - points: SeriesPoint[] -} - -const EvaluatorMetricsTimeSeriesChart = ({ - className, - name, - metricKey, - evaluator, - series, - isBoolean, - evaluationType = "online", - placeholderTitle, - placeholderDescription, -}: { - className?: string - name: string - metricKey?: string - evaluator?: EvaluatorDto - series: TimeSeries[] - isBoolean?: boolean - evaluationType?: PlaceholderEvaluationType - placeholderTitle?: ReactNode - placeholderDescription?: ReactNode -}) => { - useEffect(() => { - if (process.env.NODE_ENV === "development") { - try { - const _seriesCount = Array.isArray(series) ? series.length : 0 - const _summary = (series || []).map((s) => { - const pts = Array.isArray(s.points) ? s.points : [] - const count = pts.length - const timestamps = pts.slice(0, 10).map((p) => p.timestamp) - const allTs = pts.map((p) => p.timestamp) - const minTs = allTs.length ? Math.min(...allTs) : undefined - const maxTs = allTs.length ? Math.max(...allTs) : undefined - return { - id: s.id, - name: s.name, - points: count, - minTs, - maxTs, - sampleTs: timestamps, - } - }) - } catch {} - } - }, [series, metricKey, isBoolean, evaluationType]) - const hasData = series?.some((s) => s.points.length > 0) - const evaluatorLabel = evaluator?.name || evaluator?.slug || "this evaluator" - const overlayTitle = placeholderTitle ?? "Waiting for your traces" - const overlayDescription = - placeholderDescription ?? - `Generate traces with ${evaluatorLabel} to start collecting results.` - - const chartData = useMemo(() => { - const map = new Map>() - series.forEach((s) => { - s.points.forEach((pt) => { - const existing = map.get(pt.timestamp) ?? {timestamp: pt.timestamp} - existing[s.id] = pt.value - if (pt.scenarioCount !== undefined) { - existing[`${s.id}__count`] = pt.scenarioCount - } - if (pt.p25 !== undefined) { - existing[`${s.id}__p25`] = pt.p25 - } - if (pt.p75 !== undefined) { - existing[`${s.id}__p75`] = pt.p75 - } - if (pt.p50 !== undefined) { - existing[`${s.id}__p50`] = pt.p50 - } - // old band helpers removed; we will compute highlight areas in windowData - if (pt.histogram && pt.histogram.length) { - existing[`${s.id}__hist`] = pt.histogram - } - map.set(pt.timestamp, existing) - }) - }) - return Array.from(map.values()).sort( - (a, b) => (a.timestamp as number) - (b.timestamp as number), - ) - }, [series]) - - const tsExtent = useMemo(() => { - if (!chartData.length) return undefined as undefined | {min: number; max: number} - const values = chartData.map((d) => Number(d.timestamp)) - const min = Math.min(...values) - const max = Math.max(...values) - return {min, max} - }, [chartData]) - - // Controlled x-domain for zooming - const [xDomain, setXDomain] = useState<[number | "auto", number | "auto"]>(["auto", "auto"]) - - useEffect(() => { - // Reset on data change - setXDomain(["auto", "auto"]) - }, [tsExtent?.min, tsExtent?.max]) - - const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v)) - const resolveRange = (): [number, number] | undefined => { - if (!tsExtent) return undefined - const min = xDomain[0] === "auto" ? tsExtent.min : (xDomain[0] as number) - const max = xDomain[1] === "auto" ? tsExtent.max : (xDomain[1] as number) - return [min, max] - } - - const containerRef = useRef(null) - const [isPanning, setIsPanning] = useState(false) - const [suppressTooltip, setSuppressTooltip] = useState(false) - const [panStartX, setPanStartX] = useState(null) - const [panStartDomain, setPanStartDomain] = useState<[number, number] | null>(null) - const wheelAnchorRef = useRef<{ - center: number - ratio: number - timeoutId: ReturnType | null - } | null>(null) - const panRAF = useRef(null) - const panTargetRef = useRef<[number, number] | null>(null) - const tooltipTimerRef = useRef | null>(null) - - const handleMouseDown: React.MouseEventHandler = (e) => { - if (!tsExtent) return - setIsPanning(true) - setSuppressTooltip(true) - setPanStartX(e.clientX) - const range = resolveRange() || [tsExtent.min, tsExtent.max] - setPanStartDomain(range) - } - const handleMouseMove: React.MouseEventHandler = (e) => { - const rect = containerRef.current?.getBoundingClientRect() - if (!isPanning || !tsExtent || panStartX === null || !panStartDomain) return - e.preventDefault() - const plotWidth = Math.max(1, (rect?.width || 0) - chartMargin.left - chartMargin.right) - const dx = e.clientX - panStartX - const domainWidth = Math.max(panStartDomain[1] - panStartDomain[0], 1) - const speed = 1.6 // pan faster - const delta = (-dx / plotWidth) * domainWidth * speed - let nextMin = panStartDomain[0] + delta - let nextMax = panStartDomain[1] + delta - if (nextMin < tsExtent.min) { - const diff = tsExtent.min - nextMin - nextMin += diff - nextMax += diff - } - if (nextMax > tsExtent.max) { - const diff = nextMax - tsExtent.max - nextMin -= diff - nextMax -= diff - } - - panTargetRef.current = [nextMin, nextMax] - if (panRAF.current == null) { - panRAF.current = requestAnimationFrame(() => { - panRAF.current = null - const t = panTargetRef.current - if (t) setXDomain(t) - }) - } - } - const endPan = () => { - setIsPanning(false) - setPanStartX(null) - setPanStartDomain(null) - if (panRAF.current) { - cancelAnimationFrame(panRAF.current) - panRAF.current = null - } - panTargetRef.current = null - // release tooltip shortly after pan end - if (tooltipTimerRef.current) clearTimeout(tooltipTimerRef.current) - tooltipTimerRef.current = setTimeout(() => setSuppressTooltip(false), 120) - } - - // Native non-passive wheel listener to ensure preventDefault works across browsers - useEffect(() => { - const el = containerRef.current - if (!el) return - - const handler = (evt: WheelEvent) => { - if (!tsExtent || !chartData.length) return - // Only handle wheel for chart zoom when a modifier key is held - const withModifier = evt.shiftKey || evt.ctrlKey || evt.metaKey - if (!withModifier) { - // Let the event bubble to allow normal page scrolling - return - } - evt.preventDefault() - // suppress tooltip during wheel gesture - setSuppressTooltip(true) - if (tooltipTimerRef.current) clearTimeout(tooltipTimerRef.current) - - const rect = el.getBoundingClientRect() - const plotWidth = Math.max(1, rect.width - chartMargin.left - chartMargin.right) - const x = Math.max(0, Math.min(plotWidth, evt.clientX - rect.left - chartMargin.left)) - - const currentMin = xDomain[0] === "auto" ? tsExtent.min : (xDomain[0] as number) - const currentMax = xDomain[1] === "auto" ? tsExtent.max : (xDomain[1] as number) - - // Determine a stable anchor (data center + pixel ratio) for the whole wheel gesture - const ratio = Math.max(0, Math.min(1, x / plotWidth)) - let anchorCenter = wheelAnchorRef.current?.center - let anchorRatio = wheelAnchorRef.current?.ratio - if (anchorCenter == null || anchorRatio == null) { - anchorCenter = currentMin + ratio * (currentMax - currentMin) - anchorRatio = ratio - } - - const spanTotal = Math.max(tsExtent.max - tsExtent.min, 1) - const currentWidth = Math.max(currentMax - currentMin, 1) - const minWidth = spanTotal / 200 - const scrollOut = evt.deltaY > 0 - // Dead-zone at extremes to avoid jumpy behavior - const atMax = currentWidth >= spanTotal * 0.999 - const atMin = currentWidth <= minWidth * 1.001 - if ((scrollOut && atMax) || (!scrollOut && atMin)) { - // Don't change domain; just arm the idle timer to clear anchor and restore tooltip - if (wheelAnchorRef.current?.timeoutId) - clearTimeout(wheelAnchorRef.current.timeoutId) - const timeoutId = setTimeout(() => { - wheelAnchorRef.current = null - if (tooltipTimerRef.current) clearTimeout(tooltipTimerRef.current) - tooltipTimerRef.current = setTimeout(() => setSuppressTooltip(false), 80) - }, 120) - wheelAnchorRef.current = {center: anchorCenter, ratio: anchorRatio, timeoutId} - return - } - const rawFactor = scrollOut ? 1.25 : 0.8 - let newWidth = clamp(currentWidth * rawFactor, minWidth, spanTotal) - // Keep the anchor at the same pixel ratio by distributing width based on stored ratio - let nextMin = anchorCenter - anchorRatio * newWidth - let nextMax = nextMin + newWidth - let clamped = false - if (nextMin < tsExtent.min) { - nextMin = tsExtent.min - nextMax = nextMin + newWidth - clamped = true - } - if (nextMax > tsExtent.max) { - nextMax = tsExtent.max - nextMin = nextMax - newWidth - clamped = true - } - // If we had to clamp to boundaries, recompute anchorRatio so the cursor stays stable in subsequent ticks - if (clamped) { - anchorRatio = (anchorCenter - nextMin) / newWidth - // Bound [0,1] in case anchor is outside after clamp - anchorRatio = Math.max(0, Math.min(1, anchorRatio)) - } - - setXDomain([nextMin, nextMax]) - - // Reset anchor after idle time to start a new gesture on next wheel - if (wheelAnchorRef.current?.timeoutId) clearTimeout(wheelAnchorRef.current.timeoutId) - const timeoutId = setTimeout(() => { - // Clear anchor so the next wheel gesture re-anchors under the cursor - wheelAnchorRef.current = null - // allow tooltip again shortly after wheel settles - if (tooltipTimerRef.current) clearTimeout(tooltipTimerRef.current) - tooltipTimerRef.current = setTimeout(() => setSuppressTooltip(false), 80) - }, 180) - wheelAnchorRef.current = {center: anchorCenter, ratio: anchorRatio, timeoutId} - } - - el.addEventListener("wheel", handler, {passive: false}) - return () => { - el.removeEventListener("wheel", handler as any) - } - }, [chartData, tsExtent, xDomain]) - - // Cleanup any pending animation frame on unmount - useEffect(() => { - return () => { - if (panRAF.current) cancelAnimationFrame(panRAF.current) - if (tooltipTimerRef.current) clearTimeout(tooltipTimerRef.current) - } - }, []) - - // (Optional) Brush handler removed as the Brush component is not rendered currently - - const latestSummaries = useMemo(() => { - return series.map((s) => { - const latest = s.points.at(-1) - if (!latest) { - return { - name: s.name, - color: s.color, - value: "-", - } - } - - const formatted = isBoolean - ? `${Number(latest.value).toFixed(0)}%` - : format3Sig(latest.value) - return { - name: s.name, - color: s.color, - value: formatted, - } - }) - }, [series, isBoolean]) - - // Consistent chart margins to compute plot area sizes - const chartMargin = useMemo(() => ({top: 8, right: 12, bottom: 24, left: 48}), []) - - const domain = useMemo(() => { - if (isBoolean) return [0 - BOOLEAN_AXIS_PADDING, 100 + BOOLEAN_AXIS_PADDING] as const - const values = series.flatMap((s) => - s.points.flatMap((p) => - [p.value, p.p25, p.p50, p.p75].filter( - (val): val is number => typeof val === "number" && Number.isFinite(val), - ), - ), - ) - if (!values.length) return ["auto", "auto"] as const - const min = Math.min(...values) - const max = Math.max(...values) - if (min === max) { - const offset = Math.max(Math.abs(min) * 0.1, 1) - return [min - offset, max + offset] as const - } - const padding = (max - min) * 0.1 - return [min - padding, max + padding] as const - }, [series, isBoolean]) - - const xAxisDomain = useMemo(() => { - if (!tsExtent) return undefined - const rawMin = - xDomain[0] === "auto" || typeof xDomain[0] !== "number" ? tsExtent.min : xDomain[0] - const rawMax = - xDomain[1] === "auto" || typeof xDomain[1] !== "number" ? tsExtent.max : xDomain[1] - if (!Number.isFinite(rawMin) || !Number.isFinite(rawMax)) return undefined - const span = Math.max(rawMax - rawMin, 1) - const padding = Math.max(span * X_AXIS_PADDING_RATIO, X_AXIS_PADDING_MIN_MS) - const paddedMin = rawMin - padding - const paddedMax = rawMax + padding - return [paddedMin, paddedMax] as [number, number] - }, [tsExtent, xDomain]) - - const AxisTick = memo((props: any) => { - const {x, y, payload} = props || {} - const value = Number(payload?.value) - if (!Number.isFinite(value)) return null - const date = new Date(value) - const dateStr = date.toLocaleDateString([], { - year: "numeric", - month: "short", - day: "numeric", - }) - const timeStr = date.toLocaleTimeString([], { - hour: "2-digit", - minute: "2-digit", - hour12: false, - }) - return ( - - - - {dateStr} - - - {timeStr} - - - - ) - }) - - const makeActiveDot = - (strokeColor: string, r = 3) => - (props: any) => { - const isEdge = !!props?.payload?.__edgeRow - if (isEdge) return - const {cx, cy} = props || {} - if (typeof cx !== "number" || typeof cy !== "number") return - return ( - - ) - } - - const ChartLegend = memo((props: any) => { - // Manual items mode: [{label, color}] — used when rendering outside the chart - if (Array.isArray(props?.items)) { - const items = props.items as {label: string; color: string}[] - if (!items.length) return null - return ( -
    - {items.map((it, idx) => ( -
    - - {it.label} -
    - ))} -
    - ) - } - - // Fallback: Recharts payload mode (not used after moving legend outside) - const raw: any[] = Array.isArray(props?.payload) ? props.payload : [] - if (!raw.length) return null - const items = raw - .filter((it) => !!String(it?.value ?? "")) - .map((it) => ({ - label: String(it?.payload?.name ?? it?.value ?? ""), - color: String(it?.payload?.stroke || it?.payload?.fill || it?.color || "#888"), - })) - if (!items.length) return null - return - }) - - // Augmented data: full wide dataset plus interpolated boundary rows at min/max - const windowData = useMemo(() => { - if (!chartData.length || !tsExtent) return chartData - const range = resolveRange() || [tsExtent.min, tsExtent.max] - const minNum = range[0] - const maxNum = range[1] - if (!Number.isFinite(minNum) || !Number.isFinite(maxNum) || maxNum <= minNum) - return chartData - - const rowMap = new Map>() - // only rows inside the current window - chartData.forEach((r: any) => { - const ts = Number(r.timestamp) - if (!Number.isFinite(ts) || ts < minNum || ts > maxNum) return - rowMap.set(Number(r.timestamp), {...r}) - }) - - const sorted = series.map((s) => ({ - id: s.id, - pts: [...s.points].sort((a, b) => a.timestamp - b.timestamp), - })) - - const addEdgeRow = (boundaryTs: number, side: "min" | "max") => { - let row = rowMap.get(boundaryTs) ?? {timestamp: boundaryTs} - ;(row as any).__edgeRow = true - let any = false - for (const s of sorted) { - const pts = s.pts - if (!pts.length) continue - // Binary search first index with timestamp >= boundaryTs - let lo = 0 - let hi = pts.length - 1 - let idx = pts.length - while (lo <= hi) { - const mid = (lo + hi) >> 1 - const t = pts[mid].timestamp - if (t >= boundaryTs) { - idx = mid - hi = mid - 1 - } else lo = mid + 1 - } - const next = pts[idx] - const prev = pts[idx - 1] - // Determine series range - const firstTs = pts[0]?.timestamp - const lastTs = pts[pts.length - 1]?.timestamp - if (!Number.isFinite(firstTs) || !Number.isFinite(lastTs)) continue - - // Only render at boundary if it lies within [firstTs, lastTs] - if (boundaryTs < firstTs || boundaryTs > lastTs) { - continue - } - - // Exact hit - if (next && next.timestamp === boundaryTs) { - ;(row as any)[s.id] = next.value - any = true - continue - } - if (prev && prev.timestamp === boundaryTs) { - ;(row as any)[s.id] = prev.value - any = true - continue - } - - // Interpolate between surrounding points when inside range - if (prev && next && next.timestamp !== prev.timestamp) { - if (prev.timestamp <= boundaryTs && boundaryTs <= next.timestamp) { - if (isBoolean) { - // Step-like: choose nearer neighbor within the segment - const pick = side === "min" ? prev : next - ;(row as any)[s.id] = pick.value - any = true - } else { - const ratio = - (boundaryTs - prev.timestamp) / (next.timestamp - prev.timestamp) - const val = prev.value + ratio * (next.value - prev.value) - ;(row as any)[s.id] = val - any = true - } - } - } - } - if (any) rowMap.set(boundaryTs, row) - } - - addEdgeRow(minNum, "min") - addEdgeRow(maxNum, "max") - - // Interpolate p25/p75 for rows that lack them so active dots appear consistently - const interpAt = ( - pts: {timestamp: number; value: number}[], - t: number, - ): number | undefined => { - if (!pts.length) return undefined - if (t <= pts[0].timestamp) return pts[0].value - if (t >= pts[pts.length - 1].timestamp) return pts[pts.length - 1].value - let lo = 0 - let hi = pts.length - 1 - while (lo <= hi) { - const mid = (lo + hi) >> 1 - const mt = pts[mid].timestamp - if (mt < t) lo = mid + 1 - else hi = mid - 1 - } - const next = pts[lo] - const prev = pts[lo - 1] - if (!prev || !next || next.timestamp === prev.timestamp) return undefined - const r = (t - prev.timestamp) / (next.timestamp - prev.timestamp) - return prev.value + r * (next.value - prev.value) - } - - for (const s of series) { - const p25Pts = s.points - .filter((p) => typeof p.p25 === "number") - .map((p) => ({timestamp: p.timestamp, value: p.p25 as number})) - .sort((a, b) => a.timestamp - b.timestamp) - const p75Pts = s.points - .filter((p) => typeof p.p75 === "number") - .map((p) => ({timestamp: p.timestamp, value: p.p75 as number})) - .sort((a, b) => a.timestamp - b.timestamp) - if (!p25Pts.length && !p75Pts.length) continue - - for (const [ts, row] of rowMap.entries()) { - if (typeof (row as any)[`${s.id}__p25`] !== "number" && p25Pts.length) { - const v = interpAt(p25Pts, ts) - if (typeof v === "number" && Number.isFinite(v)) { - ;(row as any)[`${s.id}__p25`] = v - } - } - if (typeof (row as any)[`${s.id}__p75`] !== "number" && p75Pts.length) { - const v = interpAt(p75Pts, ts) - if (typeof v === "number" && Number.isFinite(v)) { - ;(row as any)[`${s.id}__p75`] = v - } - } - - // Compute helpers - const mainVal = Number((row as any)[s.id]) - const p25Val = (row as any)[`${s.id}__p25`] - const p75Val = (row as any)[`${s.id}__p75`] - if (Number.isFinite(mainVal)) { - const NUM_SEGS = 30 - if (typeof p75Val === "number" && Number.isFinite(p75Val as number)) { - ;(row as any)[`${s.id}__upperBase`] = mainVal - const ud = Math.max(0, (p75Val as number) - mainVal) - const usz = ud / NUM_SEGS - for (let i = 0; i < NUM_SEGS; i++) { - ;(row as any)[`${s.id}__upperSeg${i}`] = usz - } - } - if (typeof p25Val === "number" && Number.isFinite(p25Val as number)) { - ;(row as any)[`${s.id}__lowerBase`] = p25Val as number - const ld = Math.max(0, mainVal - (p25Val as number)) - const lsz = ld / NUM_SEGS - for (let i = 0; i < NUM_SEGS; i++) { - ;(row as any)[`${s.id}__lowerSeg${i}`] = lsz - } - } - } - } - } - - return Array.from(rowMap.values()).sort((a, b) => Number(a.timestamp) - Number(b.timestamp)) - }, [chartData, xDomain, tsExtent, series, isBoolean]) - - return ( - -
    - - {evaluator?.name ?? formatMetricName(metricKey || name)} - - - {name} - -
    -
    - {latestSummaries.length ? ( -
    - {latestSummaries.map((item) => ( -
    - - {item.name}: - {item.value} -
    - ))} -
    - ) : null} -
    -
    - } - className={clsx("rounded !p-0 overflow-hidden", className)} - classNames={{title: "!py-0 !px-4", header: "!p-0", body: "!p-0"}} - > -
    { - setXDomain(["auto", "auto"]) - // Also clear any previous wheel anchor so next zoom re-anchors at cursor - wheelAnchorRef.current = null - }} - > -
    - {hasData ? ( - - - - } - tickMargin={20} - minTickGap={16} - height={40} - /> - - isBoolean - ? `${Number(value).toFixed(0)}%` - : format3Sig(value) - } - padding={{top: 8, bottom: 8}} - width={chartMargin.left} - /> - { - if (suppressTooltip) return null - if (!active || !payload || !payload.length) return null - const rows = (payload as any[]).filter((row: any) => { - const key = String(row?.dataKey || "") - // Exclude helper series for highlight areas and redundant percentile lines - if (!key) return false - if (key.endsWith("__upperBase")) return false - if (key.endsWith("__lowerBase")) return false - if (key.includes("__upperSeg")) return false - if (key.includes("__lowerSeg")) return false - // Remove separate percentile lines (we show range below the main row) - if (key.endsWith("__p25")) return false - if (key.endsWith("__p75")) return false - return true - }) - return ( -
    -
    - {formatTimestamp(Number(label))} -
    -
    - {rows.map((row) => { - const name = row.name - const color = row.color - const dataKey = row.dataKey as string - const valueNum = Number(row.value) - const countRaw = - row.payload?.[`${dataKey}__count`] - const count = - typeof countRaw === "number" - ? Number.isInteger(countRaw) - ? countRaw - : Number(countRaw.toFixed(2)) - : countRaw - const p25 = row.payload?.[`${dataKey}__p25`] - const p75 = row.payload?.[`${dataKey}__p75`] - const formatValue = (val?: number) => { - if (val == null) return undefined - if (isBoolean) { - const normalized = - Math.abs(val) <= 1 - ? val * 100 - : val - return `${Number(normalized).toFixed(0)}%` - } - return format3Sig(val) - } - const formattedValue = formatValue(valueNum) - const formattedP25 = formatValue(p25) - const formattedP75 = formatValue(p75) - const histogram = row.payload?.[ - `${dataKey}__hist` - ] as { - from: number - to: number - count: number - }[] - const formatAxisValue = (val: number) => { - if (isBoolean) { - const normalized = - Math.abs(val) <= 1 - ? val * 100 - : val - return `${Number(normalized).toFixed(0)}%` - } - return format3Sig(val) - } - const histogramData = Array.isArray( - histogram, - ) - ? histogram - .map((bin) => { - const from = Number(bin?.from) - const to = Number(bin?.to) - const count = Number( - bin?.count, - ) - if ( - !Number.isFinite(from) || - !Number.isFinite(to) || - !Number.isFinite(count) - ) - return null - return { - label: `${formatAxisValue( - from, - )} – ${formatAxisValue(to)}`, - value: count, - } - }) - .filter( - ( - item, - ): item is { - label: string - value: number - } => item !== null, - ) - : [] - return ( -
    -
    -
    - - - {name} - - {count != null ? ( - - • {count} scenarios - - ) : null} -
    -
    - {formattedValue} -
    -
    - {formattedP25 || formattedP75 ? ( -
    - P25: {formattedP25 ?? "-"} - {formattedP75 ? ( - {` / P75: ${formattedP75}`} - ) : null} -
    - ) : null} - {histogramData.length ? ( -
    -
    - -
    -
    - ) : null} -
    - ) - })} -
    -
    - ) - }} - /> - {/* */} - {series.map((s) => { - const hasRange = s.points.some( - (pt) => - typeof pt.p25 === "number" && - typeof pt.p75 === "number", - ) - - return ( - - {hasRange ? ( - <> - - - - - - ) : null} - - - ) - })} -
    -
    - ) : ( - - - - { - const date = new Date(value) - return date.toLocaleTimeString([], { - hour: "2-digit", - minute: "2-digit", - }) - }} - tick={{fill: "#94A3B8", fontSize: 11}} - axisLine={{stroke: "rgba(148, 163, 184, 0.35)"}} - tickMargin={12} - /> - - - - - - - - - null} /> - - - - - )} - {!hasData ? ( - - ) : null} -
    -
    - {(() => { - const items = series.flatMap((s) => { - const base = [{label: s.name, color: s.color}] - const hasRange = s.points.some( - (pt) => typeof pt.p25 === "number" && typeof pt.p75 === "number", - ) - if (!hasRange) return base - return [ - ...base, - {label: `${s.name} P25`, color: withAlpha(s.color, 0.1)}, - {label: `${s.name} P75`, color: withAlpha(s.color, 0.1)}, - ] - }) - return - })()} - - ) -} - -export default memo(EvaluatorMetricsTimeSeriesChart) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/BarChart.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/BarChart.tsx deleted file mode 100644 index 50ae382b24..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/BarChart.tsx +++ /dev/null @@ -1,286 +0,0 @@ -import {memo, useMemo} from "react" - -import { - Bar, - CartesianGrid, - Cell, - BarChart as RechartsBarChart, - ResponsiveContainer, - Tooltip, - TooltipProps, - XAxis, - YAxis, -} from "recharts" - -type ChartDatum = Record - -interface BarChartProps { - data: readonly ChartDatum[] - xKey: string - yKey: string - /** optional key in data row that carries the color (e.g. 'color') */ - colorKey?: string - - /** Axis / chart tuning */ - yDomain?: [number | "auto" | "dataMin", number | "auto" | "dataMax"] - xAxisProps?: Partial> - yAxisProps?: Partial> - cartesianGridProps?: Partial> - chartProps?: Partial> - containerProps?: Partial> - - /** Bar sizing & spacing */ - barSize?: number // if omitted, width is auto-calculated from gaps - barGap?: number | string // e.g. 16 or '30%' - barCategoryGap?: number | string // e.g. 24 or '30%' - - /** Tooltip label for Y value. Pass falsy to hide Tooltip. */ - tooltipLabel?: string - tooltipFormatter?: (value: number, row: ChartDatum) => string - - /** Per-bar overrides */ - getCellProps?: (row: ChartDatum, index: number) => Partial> - - /** Direct pass-through to */ - barProps?: Partial> - - className?: string -} - -const BarChart = ({ - data, - xKey, - yKey, - colorKey, - yDomain = ["auto", "auto"], - xAxisProps, - yAxisProps, - cartesianGridProps, - chartProps, - containerProps, - // Use percentage-based gaps by default for consistent spacing across datasets - barSize, - barGap = "10%", - barCategoryGap = "30%", - tooltipLabel = "Value", - tooltipFormatter, - getCellProps, - barProps, - className, -}: BarChartProps) => { - const chartBarSize = !barSize ? undefined : barSize - const yAxisWidth = typeof yAxisProps?.width === "number" ? yAxisProps.width : 58 - const { - interval: xAxisInterval, - height: xAxisHeight, - tickWidth: xAxisTickWidthProp, - ...restXAxisProps - } = xAxisProps ?? {} - - const labelBasedTickWidth = useMemo(() => { - const longestLabelLength = data.reduce((max, row) => { - const rawLabel = row?.[xKey] - - if (typeof rawLabel === "string" || typeof rawLabel === "number") { - return Math.max(max, String(rawLabel).length) - } - - return max - }, 0) - - // Invert the relationship: longer labels get smaller width, shorter labels get more width - const maxPossibleWidth = 100 - const minPossibleWidth = 60 - const baseWidth = Math.max(1, longestLabelLength) // Ensure we don't divide by zero - const invertedWidth = (1 / baseWidth) * 1000 // Scale factor to get reasonable numbers - - return Math.min(maxPossibleWidth, Math.max(minPossibleWidth, invertedWidth)) - }, [data, xKey]) - - const xAxisTickWidth = xAxisTickWidthProp ?? labelBasedTickWidth - - return ( - - - ( - -
    - {payload?.value} -
    -
    - )} - height={xAxisHeight ?? 24} - {...restXAxisProps} - /> - - - - {tooltipLabel ? ( - ) => { - if (!active || !payload?.length) return null - - const rows = payload.filter((p) => p?.value != null) - if (!rows.length) return null - - return ( -
    - {/*
    - {label} -
    */} - {rows.map((entry, idx) => { - const rawRow = entry?.payload as ChartDatum - const barColor = - (colorKey && typeof rawRow?.[colorKey] === "string" - ? (rawRow[colorKey] as string) - : undefined) || - entry?.color || - "#3B82F6" - const entryLabel = (() => { - const rawLabel = rawRow?.[xKey] - if ( - typeof rawLabel === "string" || - typeof rawLabel === "number" - ) - return String(rawLabel) - - return entry?.name || tooltipLabel - })() - const formattedValue = - typeof entry?.value === "number" - ? (tooltipFormatter?.(entry.value, rawRow) ?? - String(entry.value)) - : String(entry?.value ?? "") - return ( -
    -
    - - - {entryLabel} - -
    - - {formattedValue} - -
    - ) - })} -
    - ) - }} - /> - ) : null} - - - {data.map((row, i) => { - const fill = - colorKey && typeof row[colorKey] === "string" - ? (row[colorKey] as string) - : undefined - return ( - - ) - })} - -
    -
    - ) -} - -export default memo(BarChart) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/EvaluatorMetricsChartSkeleton.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/EvaluatorMetricsChartSkeleton.tsx deleted file mode 100644 index 833b8e674e..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/EvaluatorMetricsChartSkeleton.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import {memo} from "react" - -import {Skeleton} from "antd" -import clsx from "clsx" - -const EvaluatorMetricsChartSkeleton = ({className}: {className?: string}) => { - return ( -
    -
    - - -
    -
    - -
    -
    - ) -} - -export default memo(EvaluatorMetricsChartSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/HistogramChart.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/HistogramChart.tsx deleted file mode 100644 index e8046c92da..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/HistogramChart.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import {memo} from "react" - -import { - BarChart as RechartsBarChart, - Bar, - XAxis, - YAxis, - ResponsiveContainer, - Tooltip, - CartesianGrid, - Cell, -} from "recharts" - -type ChartDatum = Record - -interface HistogramChartProps { - data: readonly ChartDatum[] - xKey: string - yKey: string - /** optional key in data row that carries the color (e.g. 'color') */ - colorKey?: string - - /** Axis / chart tuning */ - yDomain?: [number | "auto" | "dataMin", number | "auto" | "dataMax"] - xAxisProps?: Partial> - yAxisProps?: Partial> - cartesianGridProps?: Partial> - chartProps?: Partial> - containerProps?: Partial> - - /** Bar sizing & spacing */ - barSize?: number // if omitted, width is auto-calculated from gaps - barGap?: number | string // e.g. 16 or '30%' - barCategoryGap?: number | string // e.g. 24 or '30%' - - /** Tooltip label for Y value. Pass falsy to hide Tooltip. */ - tooltipLabel?: string - - /** Per-bar overrides */ - getCellProps?: (row: ChartDatum, index: number) => Partial> - - /** Direct pass-through to */ - barProps?: Partial> - - className?: string -} - -const HistogramChart = ({ - data, - xKey, - yKey, - colorKey, - yDomain = ["auto", "auto"], - xAxisProps, - yAxisProps, - cartesianGridProps, - chartProps, - containerProps, - // Use percentage-based gaps by default for consistent spacing across datasets - barSize, - barGap = "10%", - barCategoryGap = "30%", - tooltipLabel = "Value", - getCellProps, - barProps, - className, -}: HistogramChartProps) => { - const chartBarSize = !barSize ? undefined : barSize - const yAxisWidth = typeof yAxisProps?.width === "number" ? yAxisProps.width : 48 - - return ( - - - - - - - {tooltipLabel ? ( - [v as number, tooltipLabel]} - cursor={false} - contentStyle={{ - backgroundColor: "white", - border: "1px solid #d9d9d9", - borderRadius: "4px", - padding: "4px 8px", - }} - /> - ) : null} - - - {data.map((row, i) => { - const fill = - colorKey && typeof row[colorKey] === "string" - ? (row[colorKey] as string) - : undefined - return ( - - ) - })} - - - - ) -} - -export default memo(HistogramChart) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/LowerBand.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/LowerBand.tsx deleted file mode 100644 index 29b039c640..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/LowerBand.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import {memo} from "react" - -import {Area} from "recharts" - -function LowerBand({id, color}: {id: string; color: string}) { - // Generate gradient strips - more strips = smoother gradient - const numStrips = 30 - const gradientFalloff = 1.8 // Controls how quickly the gradient fades - const maxOpacity = 0.5 // Maximum opacity at the main line - - // Parse color if it's in hex format, otherwise use rgba - const getColorWithOpacity = (opacity: number) => { - // If color is already rgba, extract RGB values - // Otherwise assume it's hex and convert - if (color.startsWith("rgba")) { - const match = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/) - if (match) { - return `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${opacity})` - } - } - // For hex colors like "#f44336" - const hex = color.replace("#", "") - const r = parseInt(hex.substring(0, 2), 16) - const g = parseInt(hex.substring(2, 4), 16) - const b = parseInt(hex.substring(4, 6), 16) - return `rgba(${r}, ${g}, ${b}, ${opacity})` - } - - return ( - <> - {/* Baseline at lower boundary */} - - - {/* Generate gradient strips from boundary to main line */} - {Array.from({length: numStrips}).map((_, i) => { - // Calculate opacity: starts transparent at boundary (i=0), - // increases toward main line (i=numStrips-1) - const ratio = i / (numStrips - 1) - const opacity = Math.pow(ratio, gradientFalloff) * maxOpacity - - return ( - - ) - })} - - ) -} - -export default memo(LowerBand) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/UpperBand.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/UpperBand.tsx deleted file mode 100644 index 0ccf00e510..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/UpperBand.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import {memo} from "react" - -import {Area} from "recharts" - -function UpperBand({id, color}: {id: string; color: string}) { - // Generate gradient strips - more strips = smoother gradient - const numStrips = 30 - const gradientFalloff = 1.8 // Controls how quickly the gradient fades - const maxOpacity = 0.5 // Maximum opacity at the main line - - // Parse color if it's in hex format, otherwise use rgba - const getColorWithOpacity = (opacity: number) => { - // If color is already rgba, extract RGB values - // Otherwise assume it's hex and convert - if (color.startsWith("rgba")) { - const match = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/) - if (match) { - return `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${opacity})` - } - } - // For hex colors like "#2196f3" - const hex = color.replace("#", "") - const r = parseInt(hex.substring(0, 2), 16) - const g = parseInt(hex.substring(2, 4), 16) - const b = parseInt(hex.substring(4, 6), 16) - return `rgba(${r}, ${g}, ${b}, ${opacity})` - } - - return ( - <> - {/* Baseline at main line */} - - - {/* Generate gradient strips from main line to boundary */} - {Array.from({length: numStrips}).map((_, i) => { - // Calculate opacity: starts strong at main line (i=0), - // fades toward boundary (i=numStrips-1) - const ratio = i / (numStrips - 1) - const opacity = Math.pow(1 - ratio, gradientFalloff) * maxOpacity - - return ( - - ) - })} - - ) -} - -export default memo(UpperBand) diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/helpers.ts b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/helpers.ts deleted file mode 100644 index 3622fbe691..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/assets/helpers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export const withAlpha = (color: string, alpha: number) => { - if (color.startsWith("#")) { - const hex = color.slice(1) - const normalized = - hex.length === 3 - ? hex - .split("") - .map((ch) => ch + ch) - .join("") - : hex - const int = Number.parseInt(normalized, 16) - if (!Number.isNaN(int)) { - const r = (int >> 16) & 255 - const g = (int >> 8) & 255 - const b = int & 255 - return `rgba(${r}, ${g}, ${b}, ${alpha})` - } - } - return color -} - -export const format3Sig = (n: number) => { - if (!Number.isFinite(n)) return String(n) - const abs = Math.abs(n) - if (abs !== 0 && (abs < 0.001 || abs >= 1000)) return n.toExponential(2) - const s = n.toPrecision(3) - return String(Number(s)) -} - -export const formatTimestamp = (value: number) => { - if (!Number.isFinite(value)) return "" - const date = new Date(value) - if (Number.isNaN(date.getTime())) return "" - return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}` -} diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/index.tsx deleted file mode 100644 index a78b3d9d54..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/EvaluatorMetricsChart/index.tsx +++ /dev/null @@ -1,336 +0,0 @@ -import {useCallback, useMemo, useState, type ReactNode} from "react" - -import {Card, Radio, Typography} from "antd" -import clsx from "clsx" - -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" - -import {EVAL_BG_COLOR} from "../../assets/utils" -import BarChartPlaceholder from "../shared/BarChartPlaceholder" -import PlaceholderOverlay, {PlaceholderEvaluationType} from "../shared/PlaceholderOverlay" - -import BarChart from "./assets/BarChart" -import HistogramChart from "./assets/HistogramChart" - -/* ---------------- helpers ---------------- */ - -const format3Sig = (n: number) => { - if (!Number.isFinite(n)) return String(n) - const abs = Math.abs(n) - if (abs !== 0 && (abs < 0.001 || abs >= 1000)) return n.toExponential(2) - const s = n.toPrecision(3) - return String(Number(s)) -} - -interface BooleanMetric { - rank: {value: boolean; count: number}[] - count: number - unique: boolean[] - frequency: {value: boolean; count: number}[] -} - -/** Boolean metric → two-bars histogram */ -export function toBooleanHistogramRows( - metric: BooleanMetric, - opts?: {trueLabel?: string; falseLabel?: string; trueColor?: string; falseColor?: string}, -) { - const source = metric.frequency?.length ? metric.frequency : metric.rank - const map = new Map(source.map((f) => [f.value, f.count])) - const t = map.get(true) ?? 0 - const f = map.get(false) ?? 0 - return [ - {x: opts?.trueLabel ?? "true", y: t, color: opts?.trueColor ?? "#22c55e"}, - {x: opts?.falseLabel ?? "false", y: f, color: opts?.falseColor ?? "#ef4444"}, - ] as const -} - -interface EvaluatorMetric { - count: number - sum: number - mean: number - min: number - max: number - range: number - distribution: {value: number; count: number}[] - percentiles: Record - iqrs: Record - binSize: number -} - -/** - * Numeric metric → XY rows from distribution, ignoring binSize. - * X is just the formatted starting value; Y is count. - * This gives a categorical X axis that still preserves the shape. - */ -export function toXYRowsFromDistributionNoBin( - metric: EvaluatorMetric, - opts?: {color?: string; digits?: number}, -) { - const rows = [...(metric.distribution ?? [])] - .sort((a, b) => a.value - b.value) - .map((d) => ({ - x: format3Sig(opts?.digits != null ? Number(d.value.toFixed(opts.digits)) : d.value), - y: d.count, - color: opts?.color ?? "rgba(145, 202, 255, 0.7)", - })) - - return rows -} - -/** Fallback: if no distribution is present, plot a single bar at the mean (x label = value) */ -export function toSingleMeanRow(metric: EvaluatorMetric, opts?: {color?: string; digits?: number}) { - const y = typeof metric.mean === "number" ? metric.mean : 0 - const x = format3Sig(opts?.digits != null ? Number(y.toFixed(opts.digits)) : y) - return [{x, y, color: opts?.color ?? "rgba(145, 202, 255, 0.7)"}] as const -} - -const items = ["average", "histogram", "total"] - -/* ---------------- page component ---------------- */ - -const EvaluatorMetricsChart = ({ - className, - name, - metricKey, - metric, - evaluator, - isCompare, - averageRows, - summaryRows, - evaluationType = "auto", - hasMetricData = false, - placeholderTitle, - placeholderDescription, -}: { - className?: string - name: string - metricKey?: string - metric: Record - evaluator?: EvaluatorDto - isCompare?: boolean - averageRows?: readonly {x: string; y: number; color?: string}[] - summaryRows?: readonly {x: string; y: number; color?: string}[] - evaluationType?: PlaceholderEvaluationType - hasMetricData?: boolean - placeholderTitle?: ReactNode - placeholderDescription?: ReactNode -}) => { - const [selectedItem, setSelectedItem] = useState(items[0]) - const isBooleanMetric = !!metric?.unique?.length - const hasDistribution = Array.isArray(metric?.distribution) && metric.distribution.length > 0 - const isNumeric = typeof metric?.mean === "number" || hasDistribution - - // Big summary number - const chartSummeryValue = useMemo(() => { - if (isBooleanMetric) { - const trueEntry = metric?.frequency?.find((f: any) => f?.value === true) - const total = metric?.count ?? 0 - const pct = total ? ((trueEntry?.count ?? 0) / total) * 100 : 0 - return `${pct.toFixed(2)}%` - } - if (typeof metric?.mean === "number") return format3Sig(metric.mean) - return "" - }, [metric, isBooleanMetric]) - - // Summary for compare mode: one value per evaluation with +/- delta vs base - const compareSummaries = useMemo(() => { - // Use only evaluations that actually have this evaluator's metric (averageRows already filtered) - if (!isCompare || !averageRows?.length) - return [] as {value: string; delta?: string; color: string}[] - - const base = averageRows?.[0]?.y ?? 0 - const isPct = isBooleanMetric - return averageRows.map((r, i) => { - const color = (r as any)?.color || (EVAL_BG_COLOR as any)[i + 1] || "#3B82F6" - const valNum = Number(r.y || 0) - const value = isPct ? `${valNum.toFixed(2)}%` : format3Sig(valNum) - if (i === 0) return {value, delta: "-", color} - // percent difference vs base (avoid divide by zero) - const deltaPct = base ? ((valNum - base) / Math.abs(base)) * 100 : 0 - const sign = deltaPct > 0 ? "+" : "" - const delta = `${sign}${deltaPct.toFixed(0)}%` - return {value, delta, color} - }) - }, [isCompare, averageRows, isBooleanMetric]) - - // Shape data: - // - Boolean: two bars true/false - // - Numeric: distribution → (x = formatted start value, y = count) - // - Fallback numeric: single bar at mean (x = value, y = mean) - const chartData = useMemo(() => { - if (isBooleanMetric) { - return toBooleanHistogramRows(metric as BooleanMetric, { - trueLabel: "true", - falseLabel: "false", - trueColor: "rgba(145, 202, 255, 0.7)", - falseColor: "rgba(145, 202, 255, 0.7)", - }) - } - if (hasDistribution) { - return toXYRowsFromDistributionNoBin(metric as EvaluatorMetric, { - color: "rgba(145, 202, 255, 0.7)", - digits: 3, - }) - } - if (isNumeric) { - return toSingleMeanRow(metric as EvaluatorMetric, { - color: "rgba(145, 202, 255, 0.7)", - digits: 3, - }) - } - return [] - }, [metric, isBooleanMetric, hasDistribution, isNumeric]) - - const showHistogram = !isCompare || selectedItem === "histogram" - - const formatYAxisTick = useCallback( - (value: number) => { - if (typeof value !== "number" || Number.isNaN(value)) return "" - - const formatToThreeDecimals = (num: number) => { - if (num === 0) return "0" - const abs = Math.abs(num) - if (abs < 0.001) return num.toExponential(2) - return Number(num.toFixed(3)).toString() - } - - if (isBooleanMetric) { - return `${formatToThreeDecimals(value)}%` - } - - return formatToThreeDecimals(value) - }, - [isBooleanMetric], - ) - - const hasSummaryRows = summaryRows?.some((row) => Number.isFinite(row.y)) ?? false - const showPlaceholder = chartData.length === 0 && !hasSummaryRows && !hasMetricData - const evaluatorLabel = evaluator?.name || evaluator?.slug || "this evaluator" - const defaultPlaceholderTitle = - evaluationType === "online" ? "Waiting for your traces" : "Waiting for evaluation runs" - const defaultPlaceholderDescription = - evaluationType === "online" - ? `Generate traces with ${evaluatorLabel} to start collecting results.` - : `Annotate your scenarios with ${evaluatorLabel} to start seeing distribution data.` - const overlayTitle = placeholderTitle ?? defaultPlaceholderTitle - const overlayDescription = placeholderDescription ?? defaultPlaceholderDescription - - return ( - -
    - - {evaluatorLabel} - - - {name} - -
    -
    - } - className={clsx("rounded !p-0 overflow-hidden", className)} - classNames={{title: "!py-0 !px-4", header: "!p-0", body: "!p-0"}} - > - {showPlaceholder ? ( -
    - - -
    - ) : ( -
    - {isCompare ? ( -
    - {compareSummaries.map((s, idx) => ( -
    - - {s.value} - - - {s.delta} - -
    - ))} -
    - ) : ( -
    - - {chartSummeryValue} - -
    - )} - -
    -
    - - {showHistogram ? "Frequency" : "Avg score"} - -
    - {showHistogram ? ( - - ) : ( - formatYAxisTick(value)} - yAxisProps={{tickFormatter: formatYAxisTick}} - barCategoryGap={ - (averageRows?.length ?? 0) < 4 ? "30%" : "10%" - } - barProps={{radius: [8, 8, 0, 0]}} - /> - )} -
    -
    - - {name} - -
    -
    - )} - - ) -} - -export default EvaluatorMetricsChart diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/BarChartPlaceholder.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/BarChartPlaceholder.tsx deleted file mode 100644 index 84d548358c..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/BarChartPlaceholder.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import {memo} from "react" - -import clsx from "clsx" -import {Bar, BarChart, CartesianGrid, ResponsiveContainer, XAxis, YAxis} from "recharts" - -const PLACEHOLDER_DATA = [ - {label: "A", value: 12}, - {label: "B", value: 28}, - {label: "C", value: 20}, - {label: "D", value: 36}, -] as const - -const BarChartPlaceholder = memo(({className}: {className?: string}) => ( -
    - - - - - - - - -
    -)) - -BarChartPlaceholder.displayName = "BarChartPlaceholder" - -export default BarChartPlaceholder diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/PlaceholderOverlay.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/PlaceholderOverlay.tsx deleted file mode 100644 index a995dc755f..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/PlaceholderOverlay.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import {ReactNode} from "react" - -import clsx from "clsx" - -export type PlaceholderEvaluationType = "online" | "auto" | "human" - -interface PlaceholderOverlayProps { - className?: string - evaluationType?: PlaceholderEvaluationType - title?: ReactNode - description?: ReactNode - children?: ReactNode -} - -const DEFAULT_COPY: Record = { - online: { - title: "Waiting for your traces", - description: "Generate traces to start collecting results.", - }, - auto: { - title: "Waiting for evaluation runs", - description: "Run your prompt against testcases to start collecting metrics.", - }, - human: { - title: "Waiting for evaluation runs", - description: "Run your prompt against testcases to start collecting metrics.", - }, -} - -const PlaceholderOverlay = ({ - className, - evaluationType = "online", - title, - description, - children, -}: PlaceholderOverlayProps) => { - const copy = DEFAULT_COPY[evaluationType] ?? DEFAULT_COPY.online - const resolvedTitle = title ?? copy.title - const resolvedDescription = description ?? copy.description - - return ( -
    - {children ?? ( - <> - {resolvedTitle} - {resolvedDescription} - - )} -
    - ) -} - -export default PlaceholderOverlay diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/SpiderChartPlaceholder.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/SpiderChartPlaceholder.tsx deleted file mode 100644 index dface270b4..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/components/shared/SpiderChartPlaceholder.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import {memo} from "react" - -import { - PolarAngleAxis, - PolarGrid, - PolarRadiusAxis, - Radar, - RadarChart, - ResponsiveContainer, -} from "recharts" - -const SPIDER_PLACEHOLDER_POINTS: readonly {subject: string; value: number}[] = [ - {subject: "Evaluator quality", value: 58}, - {subject: "Latency", value: 36}, - {subject: "Tokens", value: 64}, - {subject: "Cost", value: 48}, - {subject: "Stability", value: 72}, -] as const - -const SpiderChartPlaceholder = memo(({className}: {className?: string}) => ( -
    - - - - - - - - -
    -)) - -SpiderChartPlaceholder.displayName = "SpiderChartPlaceholder" - -export default SpiderChartPlaceholder diff --git a/web/oss/src/components/EvalRunDetails/AutoEvalRun/index.tsx b/web/oss/src/components/EvalRunDetails/AutoEvalRun/index.tsx deleted file mode 100644 index 3a42100598..0000000000 --- a/web/oss/src/components/EvalRunDetails/AutoEvalRun/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" -import dynamic from "next/dynamic" - -import {runViewTypeAtom} from "../state/urlState" - -import AutoEvalRunSkeleton from "./assets/AutoEvalRunSkeleton" -import {AutoEvalRunDetailsProps} from "./assets/types" -import EvalRunHeader from "./components/EvalRunHeader" - -const EvalRunOverviewViewer = dynamic(() => import("../components/EvalRunOverviewViewer"), { - ssr: false, -}) -const EvalRunPromptConfigViewer = dynamic(() => import("./components/EvalRunPromptConfigViewer"), { - ssr: false, -}) -const EvalRunTestcaseViewer = dynamic(() => import("./components/EvalRunTestcaseViewer"), { - ssr: false, -}) - -const viewTypeAtom = selectAtom(runViewTypeAtom, (v) => v, deepEqual) -const AutoEvalRunDetails = ({name, description, id, isLoading}: AutoEvalRunDetailsProps) => { - const viewType = useAtomValue(viewTypeAtom) - - if (isLoading) { - return - } - - return ( -
    - - - {viewType === "overview" ? ( - - ) : viewType === "testcases" ? ( - - ) : viewType === "prompt" ? ( - - ) : null} -
    - ) -} - -export default AutoEvalRunDetails diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/annotationUtils.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/annotationUtils.ts deleted file mode 100644 index cacaffc627..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/annotationUtils.ts +++ /dev/null @@ -1,383 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {uuidToSpanId, uuidToTraceId} from "@/oss/lib/hooks/useAnnotations/assets/helpers" -import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import { - evaluationEvaluatorsFamily, - evaluationRunStateFamily, - evalAtomStore, - scenarioStepFamily, - revalidateScenarioForRun, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {triggerMetricsFetch} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {IAnnotationStep, IStepResponse} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {EvaluationStatus} from "@/oss/lib/Types" -import {getJWT} from "@/oss/services/api" -import {updateScenarioStatusRemote} from "@/oss/services/evaluations/workerUtils" -import {createScenarioMetrics} from "@/oss/services/runMetrics/api" -import {getProjectValues} from "@/oss/state/project" - -import {setOptimisticStepData} from "./optimisticUtils" -import {collectStepsAndMetrics} from "./stepsMetricsUtils" -/** - * Retrieve the scenario object (if present) for the given id. - * Updated for multi-run support with runId parameter. - */ -export const getScenario = (scenarioId: string, runId: string) => { - // Use run-scoped atoms for multi-run support - return ( - evalAtomStore() - .get(evaluationRunStateFamily(runId)) - ?.scenarios?.find((s: any) => s.id === scenarioId) || null - ) -} - -/** - * Retrieve the evaluators associated with the current evaluation run. - * Updated for multi-run support with runId parameter. - */ -export const getEvaluators = (runId: string) => { - return evalAtomStore().get(evaluationEvaluatorsFamily(runId)) -} - -/** - * Lazily load step data for a scenario via the jotai family. - * Updated for multi-run support with runId parameter. - */ -export const getStepData = async (scenarioId: string, runId?: string) => { - if (runId) { - // Use run-scoped atoms for multi-run support - return await evalAtomStore().get(scenarioStepFamily({scenarioId, runId})) - } -} - -/** - * Utility that checks the `requiredMetrics` object returned by payload generation. - * If any metric is missing it will call the provided formatter and returns `false`. Otherwise returns `true`. - */ -export const validateRequiredMetrics = ( - requiredMetrics: Record, - formatErrorMessages: (requiredMetrics: Record) => void, -): boolean => { - const hasMissing = Object.keys(requiredMetrics || {}).length > 0 - if (hasMissing) { - formatErrorMessages(requiredMetrics) - } - return !hasMissing -} - -// ---------------------------------- -// Backend synchronisation utilities -// ---------------------------------- - -interface PushStepsAndMetricsParams { - patchStepsFull: any[] - stepsToCreate?: any[] - metricEntries: {scenarioId: string; data: Record}[] - projectId: string - runId: string -} - -export const pushStepsAndMetrics = async ({ - patchStepsFull, - stepsToCreate = [], - metricEntries, - projectId, - runId, -}: PushStepsAndMetricsParams) => { - // Normalize payloads to results schema - const normalizePatch = (items: any[]) => - items.map((it) => { - const out: Record = { - id: it.id, - status: it.status, - trace_id: it.trace_id ?? it.traceId, - span_id: it.span_id ?? it.spanId, - references: it.references, - } - const stepKey = it.step_key ?? it.stepKey - if (stepKey) out.step_key = stepKey - return out - }) - - const normalizeCreate = (items: any[]) => - items.map((it) => { - const out: Record = { - status: it.status, - step_key: it.step_key ?? it.stepKey ?? it.key, - trace_id: it.trace_id ?? it.traceId, - span_id: it.span_id ?? it.spanId, - scenario_id: it.scenario_id ?? it.scenarioId, - run_id: it.run_id ?? it.runId, - references: it.references, - } - const testcaseId = it.testcase_id ?? it.testcaseId - if (testcaseId) out.testcase_id = testcaseId - return out - }) - - if (patchStepsFull.length) { - await axios.patch(`/preview/evaluations/results/?project_id=${projectId}`, { - results: normalizePatch(patchStepsFull), - }) - } - if (stepsToCreate.length) { - await axios.post(`/preview/evaluations/results/?project_id=${projectId}`, { - results: normalizeCreate(stepsToCreate), - }) - } - if (metricEntries.length) { - const jwt = await getJWT() - if (jwt) { - await createScenarioMetrics(getAgentaApiUrl(), jwt, runId, metricEntries, projectId) - } - } -} - -/** - * Triggers revalidation for a single scenario and cleans up optimistic overrides once fresh data arrives. - */ -/** - * Partitions Promise.allSettled results into successful responses and builds evaluator status map - */ -export const partitionAnnotationResults = ( - annotationResults: PromiseSettledResult[], - payload: any[], -): {annotationResponses: any[]; evaluatorStatuses: Record} => { - const fulfilled = annotationResults.filter( - (r): r is PromiseFulfilledResult => r.status === "fulfilled", - ) - const annotationResponses = fulfilled.map((f) => f.value) - const evaluatorStatuses: Record = {} - annotationResults.forEach((result, idx) => { - const slug = payload[idx]?.annotation?.references?.evaluator?.slug - if (!slug) return - evaluatorStatuses[slug] = - result.status === "fulfilled" ? EvaluationStatus.SUCCESS : EvaluationStatus.FAILURE - }) - return {annotationResponses, evaluatorStatuses} -} - -/** - * Returns true if metrics are missing and the caller should abort. - */ -export const abortIfMissingMetrics = ( - requiredMetrics: Record | undefined, - formatErrorMessages: (metrics: any) => void, -): boolean => { - if (requiredMetrics && Object.keys(requiredMetrics).length > 0) { - formatErrorMessages(requiredMetrics) - return true - } - return false -} - -/** - * Handles backend sync and scenario status updates after annotation succeeds - */ -export const startOptimisticAnnotation = async ( - scenarioId: string, - step: IAnnotationStep, - apiUrl: string, - jwt: string, - projectId: string, - runId?: string, -) => { - setOptimisticStepData( - scenarioId, - [ - { - ...structuredClone(step), - status: "annotating", - }, - ], - runId, - ) - updateScenarioStatusRemote(apiUrl, jwt, scenarioId, EvaluationStatus.RUNNING, projectId, runId) -} - -/** - * Build common annotation context (evaluators, trace ids, testset ids, etc.) - */ -export const buildAnnotationContext = async ({ - scenarioId, - stepKey, - runId, -}: { - scenarioId: string - stepKey: string - runId: string -}) => { - const evaluators = getEvaluators(runId) - const testsets = evalAtomStore().get(evaluationRunStateFamily(runId))?.enrichedRun?.testsets - const stepData = await getStepData(scenarioId, runId) - const jwt = await getJWT() - const {projectId} = getProjectValues() - - const invocationStep = stepData?.invocationSteps?.find((s: any) => s.stepKey === stepKey) - if (!invocationStep) return null - - const traceTree = (invocationStep as any)?.trace - if (!traceTree) return null - - const node = traceTree.nodes?.[0] - if (!node) return null - - const traceSpanIds = { - spanId: uuidToSpanId(node.node.id) as string, - traceId: uuidToTraceId(node.root.id) as string, - } - - const testcaseId = invocationStep.testcaseId - const testsetId = testsets?.find((s: any) => s.data?.testcase_ids?.includes(testcaseId))?.id - - return { - evaluators, - jwt, - projectId, - stepData, - traceSpanIds, - testsetId, - testcaseId, - invocationStep, - traceTree, - apiUrl: getAgentaApiUrl(), - } -} - -export const processAnnotationError = async ( - scenarioId: string, - err: unknown, - annotationSteps: IAnnotationStep[], - apiUrl: string, - jwt: string, - projectId: string, - runId: string, - setErrorMessages: (msgs: string[]) => void, -) => { - setErrorMessages([(err as Error).message]) - setOptimisticStepData( - scenarioId, - annotationSteps.map((st) => ({ - ...structuredClone(st), - status: EvaluationStatus.ERROR, - })), - ) - // await updateScenarioStatus(scenario, finalStatus) - updateScenarioStatusRemote(apiUrl, jwt, scenarioId, EvaluationStatus.ERROR, projectId, runId) -} - -export const finalizeAnnotationSuccess = async ({ - annotationSteps, - mode, - annotationResponses, - evaluatorStatuses, - stepData, - stepKey, - scenarioId, - runId, - projectId, - scenario, - jwt, - apiUrl, - evaluators, - setErrorMessages, -}: { - annotationSteps: IAnnotationStep[] - mode: "create" | "update" - annotationResponses: any[] - evaluatorStatuses: Record - stepData: any - stepKey: string - scenarioId: string - runId: string - projectId: string - jwt: string - apiUrl: string - scenario: any - evaluators: EvaluatorDto[] - setErrorMessages: (val: any[]) => void -}) => { - if (!annotationResponses.length) return - - const {stepsToCreate, patchStepsFull, metricEntries} = collectStepsAndMetrics({ - mode, - annotationResponses, - stepData, - stepKey, - evaluatorStatuses, - scenarioId, - runId, - evaluators, - }) - - await pushStepsAndMetrics({ - patchStepsFull, - stepsToCreate, - metricEntries, - projectId, - runId, - }) - - await updateScenarioStatusRemote( - apiUrl, - jwt, - scenarioId, - EvaluationStatus.SUCCESS, - projectId, - runId, - ) - await triggerScenarioRevalidation( - runId, - scenarioId, - annotationSteps.map((st) => ({ - ...structuredClone(st), - status: "revalidating", - })), - ) - - // Trigger metrics refresh when scenario completes (success or failure) - if (runId) { - triggerMetricsFetch(runId) - } - - // Note: Metrics will be automatically refreshed by store-level subscription - console.log(`[finalizeAnnotationSuccess] Annotation finalized for runId: ${runId}`) - - setErrorMessages([]) -} - -export const triggerScenarioRevalidation = async ( - runId: string, - scenarioId: string, - updatedSteps?: IStepResponse[], -) => { - try { - await revalidateScenarioForRun(runId, scenarioId, evalAtomStore(), updatedSteps) - } catch (err) { - console.error("Failed to revalidate scenario", err) - } -} - -/** Return all annotationSteps that match any item in the payload */ -export const findAnnotationStepsFromPayload = ( - annotationSteps: IAnnotationStep[] = [], - payload: {annotation: AnnotationDto}[], -) => { - if (!annotationSteps.length || !payload.length) return [] - - return annotationSteps.filter((step) => - payload.some(({annotation}) => { - const evaluatorSlug = annotation.references?.evaluator?.slug - const linkKeys = annotation.links ? Object.keys(annotation.links) : [] - if (!evaluatorSlug || !linkKeys.length) return false - - // backend guarantees first (and usually only) link key is the invocation key - const invocationKey = linkKeys[0] // e.g. "default-2cd951533447" - const expectedStepKey = `${invocationKey}.${evaluatorSlug}` - - return step.stepKey === expectedStepKey - }), - ) -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/helpers.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/helpers.ts deleted file mode 100644 index 03fc0cfeda..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/helpers.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { - generateAnnotationPayloadData, - generateNewAnnotationPayloadData, -} from "@agenta/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" - -import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import {createAnnotation, updateAnnotation} from "@/oss/services/annotations/api" - -import { - getScenario, - buildAnnotationContext, - partitionAnnotationResults, - abortIfMissingMetrics, - finalizeAnnotationSuccess, - startOptimisticAnnotation, - processAnnotationError, - findAnnotationStepsFromPayload, -} from "./annotationUtils" - -export const handleAnnotate = async ({ - runId, - scenarioId, - updatedMetrics, - formatErrorMessages, - setErrorMessages, - projectId, - stepKey, -}: { - runId: string - scenarioId: string - updatedMetrics: Record - formatErrorMessages: (requiredMetrics: Record) => void - setErrorMessages: (errorMessages: string[]) => void - projectId: string - stepKey: string -}) => { - console.log("handleAnnotate") - const ctx = await buildAnnotationContext({scenarioId, stepKey, runId}) - if (!ctx) return - const {evaluators, stepData, traceSpanIds, testsetId, testcaseId, traceTree, jwt, apiUrl} = ctx - - if (!traceTree) { - if (process.env.NODE_ENV !== "production") { - console.debug("No trace found on invocation step", scenarioId) - } - return - } - - const node = traceTree.nodes?.[0] - - if (!node) { - if (process.env.NODE_ENV !== "production") { - console.debug("No trace node found for scenario", scenarioId) - } - return - } - - const params = { - updatedMetrics, - selectedEvaluators: evaluators.map((e) => e.slug), - evaluators, - traceSpanIds, - testsetId, - testcaseId, - } - - const {payload, requiredMetrics} = generateNewAnnotationPayloadData({ - ...params, - invocationStepKey: stepKey, - testsetId, - testcaseId, - }) - - if (abortIfMissingMetrics(requiredMetrics, formatErrorMessages)) return - if (!payload.length) return - - const annotationSteps = findAnnotationStepsFromPayload(stepData?.annotationSteps, payload) - - if (!annotationSteps.length) { - console.error("No annotation steps matched payload", {scenarioId, payload}) - throw new Error("Annotation step(s) not found") - } - - try { - // optimistic update for each matched step - annotationSteps.forEach((st) => { - startOptimisticAnnotation(scenarioId, st, apiUrl, jwt, projectId, runId) - }) - - const annotationResults = await Promise.allSettled( - payload.map((evaluatorPayload) => createAnnotation(evaluatorPayload)), - ) - const {annotationResponses, evaluatorStatuses} = partitionAnnotationResults( - annotationResults, - payload, - ) - - await finalizeAnnotationSuccess({ - mode: "create", - annotationResponses, - evaluatorStatuses, - stepData, - stepKey, - scenarioId, - runId, - projectId, - scenario: getScenario(scenarioId, runId), - setErrorMessages, - annotationSteps, - jwt, - apiUrl, - evaluators, - }) - } catch (err) { - await processAnnotationError( - scenarioId, - err, - annotationSteps, - apiUrl, - jwt || "", - projectId, - runId, - setErrorMessages, - ) - } -} - -export const handleUpdateAnnotate = async ({ - runId, - scenarioId, - updatedMetrics, - formatErrorMessages, - setErrorMessages, - projectId, - stepKey, -}: { - runId: string - scenarioId: string - updatedMetrics: Record - formatErrorMessages: (requiredMetrics: Record) => void - setErrorMessages: (errorMessages: string[]) => void - projectId: string - stepKey: string -}) => { - console.log("handleUpdateAnnotate") - const ctx = await buildAnnotationContext({scenarioId, stepKey, runId}) - if (!ctx) return - const {evaluators, stepData, jwt, apiUrl} = ctx - - const allAnnotations = stepData?.annotationSteps - ?.map((s) => s.annotation) - .filter(Boolean) as AnnotationDto[] - - // Only use the new canonical payload generator - const params = { - updatedMetrics, - selectedEvaluators: evaluators.map((e) => e.slug), - evaluators, - annotations: allAnnotations, - } - const {payload, requiredMetrics} = generateAnnotationPayloadData({ - ...params, - invocationStepKey: stepKey, - }) - - if (abortIfMissingMetrics(requiredMetrics, formatErrorMessages)) return - if (!payload.length) return - - const scenario = getScenario(scenarioId, runId) - const annotationSteps = findAnnotationStepsFromPayload( - stepData?.annotationSteps, - payload - .map((p) => { - const annotation = allAnnotations.find( - (a) => a.span_id === p.span_id && a.trace_id === p.trace_id, - ) - return { - annotation, - } - }) - .filter(Boolean) as {annotation: AnnotationDto}[], - ) - - if (!annotationSteps.length) { - console.error("No annotation steps matched payload", {scenarioId, payload}) - throw new Error("Annotation step(s) not found") - } - - try { - // 1. enabling annotating state - annotationSteps.forEach((st) => { - startOptimisticAnnotation(scenarioId, st, apiUrl, jwt, projectId, runId) - }) - - // 2. updating annotations - const annotationResults = await Promise.allSettled( - payload.map((annotation) => { - const {trace_id, span_id, ...rest} = annotation - return updateAnnotation({ - payload: rest, - traceId: trace_id || "", - spanId: span_id || "", - }) - }), - ) - const {annotationResponses, evaluatorStatuses} = partitionAnnotationResults( - annotationResults, - payload, - ) - - // 3. Optimistic update: mark as revalidating - await finalizeAnnotationSuccess({ - mode: "update", - annotationResponses, - evaluatorStatuses, - stepData, - stepKey, - scenarioId, - runId, - projectId, - scenario, - setErrorMessages, - annotationSteps, - jwt, - apiUrl, - evaluators, - }) - setErrorMessages([]) - } catch (err) { - await processAnnotationError( - scenarioId, - err, - annotationSteps, - apiUrl, - jwt || "", - projectId, - runId, - setErrorMessages, - ) - } -} - -export const statusColorMap: Record = { - pending: "text-[#758391]", - incomplete: "text-[#758391]", - running: "text-[#758391]", - done: "text-green-600", - success: "text-green-600", - failed: "text-red-500", - error: "text-red-500", - cancelled: "text-yellow-500", -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/optimisticUtils.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/optimisticUtils.ts deleted file mode 100644 index 361a3db1bc..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/optimisticUtils.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Import run-scoped version for multi-run support -import { - scenarioStepLocalFamily, - evalAtomStore, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {IStepResponse} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" - -/** - * Merge partial step data into the optimistic cache so components can render - * interim worker results immediately while awaiting server revalidation. - */ -export const setOptimisticStepData = async ( - scenarioId: string, - updatedSteps: IStepResponse[], - runId?: string, -) => { - // Write into per-scenario atom to avoid cloning the entire cache map - // Skip if no runId provided since run-scoped atoms require it - if (!runId) { - console.warn("[setOptimisticStepData] No runId provided, skipping optimistic update") - return - } - - evalAtomStore().set(scenarioStepLocalFamily({runId, scenarioId}), (draft: any) => { - if (!draft) return - - updatedSteps.forEach((updatedStep) => { - const targetStep = - draft.invocationSteps?.find((s: any) => s.stepKey === updatedStep.stepKey) || - draft.inputSteps?.find((s: any) => s.stepKey === updatedStep.stepKey) || - draft.annotationSteps?.find((s: any) => s.stepKey === updatedStep.stepKey) - - if (!targetStep) return - - Object.entries(updatedStep).forEach(([k, v]) => { - // @ts-ignore – dynamic merge - targetStep[k] = v as any - }) - }) - }) -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/runnableSelectors.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/runnableSelectors.ts deleted file mode 100644 index b2a6dc5c6c..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/runnableSelectors.ts +++ /dev/null @@ -1,64 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {selectAtom, loadable, atomFamily} from "jotai/utils" - -import { - scenariosFamily, - scenarioStatusAtomFamily, - scenarioStepFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -/** - * IDs of scenarios that are currently runnable (i.e. have invocation parameters - * and are not in a final/running UI state). - */ -// 1. Combine the needed state into a single base atom -// helper shallow array equality -const shallowArrayEqual = (a: T[], b: T[]) => - a.length === b.length && a.every((v, i) => v === b[i]) - -// A scenario is considered runnable when: -// 1. Its overall status is not in a terminal / running state, AND -// 2. Its step data has been fetched (Loadable state === "hasData"), AND -// 3. At least one invocationStep still contains `invocationParameters` (i.e. not yet executed) -// Per-scenario memoised check – avoids re-running heavy logic for all 1000 scenarios -export const scenarioIsRunnableFamily = atomFamily( - (params: {scenarioId: string; runId: string}) => - atom((get) => { - const {status} = get(scenarioStatusAtomFamily(params)) - if (["running", "done", "success", "revalidating"].includes(status)) return false - const loadableStep = get(loadable(scenarioStepFamily(params))) - if (loadableStep.state !== "hasData") return false - const invSteps: any[] = loadableStep.data?.invocationSteps ?? [] - return invSteps.some((st) => !!st.invocationParameters) - }), - deepEqual, -) - -export const runnableScenarioIdsFamily = atomFamily((runId: string) => { - return atom((get) => { - const scenarios = get(scenariosFamily(runId)) - return scenarios - .filter((scenario: any) => - get(scenarioIsRunnableFamily({scenarioId: scenario.id, runId})), - ) - .map((s: any) => s.id) - }) -}, deepEqual) - -/* memoised view that won’t re-emit if the array is the same */ -export const runnableScenarioIdsMemoFamily = atomFamily((runId: string) => { - return selectAtom(runnableScenarioIdsFamily(runId), (ids) => ids, shallowArrayEqual) -}, deepEqual) - -// Boolean flag: true if at least one scenario is runnable. Uses early exit to avoid building arrays -export const hasRunnableScenarioFamily = atomFamily((runId: string) => { - return atom((get) => { - const scenarios = get(scenariosFamily(runId)) - for (const scenario of scenarios) { - if (get(scenarioIsRunnableFamily({scenarioId: (scenario as any).id, runId}))) - return true - } - return false - }) -}, deepEqual) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/types.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/types.ts deleted file mode 100644 index a48a4840bd..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/assets/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface EvalRunProps { - id: string - name: string - description?: string - runId?: string -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/AnnotateScenarioButton/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/AnnotateScenarioButton/index.tsx deleted file mode 100644 index dc2ec556ce..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/AnnotateScenarioButton/index.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import {useState, useCallback, memo} from "react" - -import {Button} from "antd" -import {useAtomValue} from "jotai" - -import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import {scenarioUiFlagsFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/progress" -import {getProjectValues} from "@/oss/state/project" - -import {buildAnnotationContext} from "../../assets/annotationUtils" -import {handleAnnotate, handleUpdateAnnotate} from "../../assets/helpers" - -import {AnnotateScenarioButtonProps} from "./types" - -const AnnotateScenarioButton = ({ - runId, - scenarioId, - stepKey, - updatedMetrics, - formatErrorMessages, - setErrorMessages, - disabled = false, - label = "Annotate", - isAnnotated = false, - onAnnotate: propsOnAnnotate, - className, -}: AnnotateScenarioButtonProps) => { - const [annotating, setAnnotating] = useState(false) - const uiFlags = useAtomValue(scenarioUiFlagsFamily({scenarioId, runId})) - const isLoading = annotating || uiFlags.isAnnotating || uiFlags.isRevalidating - - const onAnnotate = useCallback(async () => { - try { - setAnnotating(true) - - const ctx = await buildAnnotationContext({scenarioId, stepKey, runId}) - if (!ctx) return - const {evaluators, stepData} = ctx - const annotations = stepData?.annotationSteps - ?.map((s) => s.annotation) - .filter(Boolean) as AnnotationDto[] - - const annEvalSlugs = annotations - .map((a) => a.references?.evaluator?.slug) - .filter(Boolean) as string[] - const selectedEval = evaluators - .map((e) => e.slug) - .filter((evaluator) => !annEvalSlugs.includes(evaluator)) - - if (selectedEval.length > 0) { - await handleAnnotate({ - runId, - scenarioId, - updatedMetrics, - formatErrorMessages, - setErrorMessages, - projectId: getProjectValues().projectId, - stepKey, - }) - } - - if (annotations.length > 0) { - await handleUpdateAnnotate({ - runId, - scenarioId, - updatedMetrics, - formatErrorMessages, - setErrorMessages, - projectId: getProjectValues().projectId, - stepKey, - }) - } - } catch (error) { - console.error("Failed to annotate scenario", error) - } finally { - propsOnAnnotate?.() - setAnnotating(false) - } - }, [runId, scenarioId, stepKey, updatedMetrics, formatErrorMessages, setErrorMessages]) - - return ( - - ) -} - -export default memo(AnnotateScenarioButton) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalResultsView/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalResultsView/index.tsx deleted file mode 100644 index 0573c776de..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalResultsView/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import {memo} from "react" - -import EvalRunOverviewViewer from "../../../components/EvalRunOverviewViewer" - -/** - * Displays run-level evaluation results grouped by evaluator. - * Uses selectAtom to subscribe only to the evaluator *list shape* (slug array) so the - * parent component re-renders only when evaluators are added/removed – any metric changes - * are handled inside each card. - */ -const EvalResultsView = ({runId}: {runId: string}) => { - return ( -
    - -
    - ) -} - -export default memo(EvalResultsView) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunBatchActions.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunBatchActions.tsx deleted file mode 100644 index 44314a935f..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunBatchActions.tsx +++ /dev/null @@ -1,236 +0,0 @@ -import {memo, useCallback, useState} from "react" - -import RunButton from "@agenta/oss/src/components/Playground/assets/RunButton" -import {getDefaultStore, useAtomValue} from "jotai" -import {loadable} from "jotai/utils" - -// agenta hooks & utils -import {useRunId} from "@/oss/contexts/RunIdContext" -import {convertToStringOrJson} from "@/oss/lib/helpers/utils" -import {useEvalScenarioQueue} from "@/oss/lib/hooks/useEvalScenarioQueue" -import { - scenarioStepFamily, - scenariosFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {scenarioMetricsMapFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" - -import SaveDataButton from "../../components/SaveDataModal/assets/SaveDataButton" -import {hasRunnableScenarioFamily} from "../assets/runnableSelectors" - -import InstructionButton from "./Modals/InstructionModal/assets/InstructionButton" - -const EMPTY_ROWS: any[] = [] - -/** - * This component renders a bar of buttons above the scenario table. - * It includes a button to run all scenarios, a button to export results, - * a button to save the testset, a button to refresh the page, and a button - * to open the instruction modal. - * - * @returns A JSX element containing a bar of buttons. - */ -// derived atom: keeps only the length (count) of runnable scenarios to minimise re-renders - -const EvalRunBatchActions = ({name}: {name: string}) => { - const [rows, setRows] = useState(EMPTY_ROWS) - const runId = useRunId() - - const {enqueueScenario} = useEvalScenarioQueue({concurrency: 5, runId}) - - // Lightweight subscription: only track the count of runnable scenarios - use global store - const hasRunnable = useAtomValue(hasRunnableScenarioFamily(runId)) - const isRunAllDisabled = !hasRunnable - - const handleRunAll = useCallback(async () => { - if (!runId) return - - try { - const store = getDefaultStore() - - // Get all scenarios for this run (same as single run approach) - const scenarios = store.get(scenariosFamily(runId)) - console.log(`[EvalRunBatchActions] Found ${scenarios.length} total scenarios`) - - if (scenarios.length === 0) { - console.warn("[EvalRunBatchActions] No scenarios found") - return - } - - let enqueuedCount = 0 - - // For each scenario, get its step data using the same approach as RunEvalScenarioButton - for (const scenario of scenarios) { - const scenarioId = scenario.id - - try { - // Use the same loadable approach as RunEvalScenarioButton - const stepLoadableAtom = loadable(scenarioStepFamily({scenarioId, runId})) - const stepLoadable = store.get(stepLoadableAtom) - - if (stepLoadable.state !== "hasData" || !stepLoadable.data) { - console.log( - `[EvalRunBatchActions] Scenario ${scenarioId} - step data not ready (state: ${stepLoadable.state})`, - ) - continue - } - - const invocationSteps = stepLoadable.data.invocationSteps || [] - console.log( - `[EvalRunBatchActions] Scenario ${scenarioId} has ${invocationSteps.length} invocation steps`, - ) - - // Find the first step with invocation parameters (same logic as RunEvalScenarioButton) - const targetStep = invocationSteps.find((s: any) => s.invocationParameters) - - if (targetStep && targetStep.invocationParameters) { - // Check if step is not already running or successful - const isRunning = invocationSteps.some((s: any) => s.status === "running") - const isSuccess = (targetStep as any).status === "success" - - if (!isRunning && !isSuccess) { - console.log( - `[EvalRunBatchActions] Enqueuing scenario ${scenarioId}, step ${targetStep.stepKey}`, - ) - enqueueScenario(scenarioId, targetStep.stepKey) - enqueuedCount++ - } else { - console.log( - `[EvalRunBatchActions] Skipping scenario ${scenarioId} - already running or successful`, - ) - } - } else { - console.log( - `[EvalRunBatchActions] Skipping scenario ${scenarioId} - no invocation parameters`, - ) - } - } catch (error) { - console.error( - `[EvalRunBatchActions] Error processing scenario ${scenarioId}:`, - error, - ) - } - } - - console.log( - `[EvalRunBatchActions] Run all completed, enqueued ${enqueuedCount} scenarios`, - ) - - // Note: Metrics will be automatically fetched by store-level subscription - if (enqueuedCount > 0) { - console.log( - `[EvalRunBatchActions] Enqueued ${enqueuedCount} scenarios for runId: ${runId}`, - ) - } - } catch (error) { - console.error("[EvalRunBatchActions] Error in handleRunAll:", error) - } - }, [runId, enqueueScenario]) - - const csvDataFormat = useCallback(async () => { - if (!runId) return [] - - // 1. Gather the scenario IDs present in the current evaluation (sync) - const store = getDefaultStore() - const scenarios = store.get(scenariosFamily(runId)) - const ids = scenarios.map((s: any) => s.id) - - // 2. Resolve (possibly async) scenario step data for each id - const [scenarioMetricsMap, ...allScenarios] = await Promise.all([ - store.get(scenarioMetricsMapFamily(runId)), - ...ids.map((id) => store.get(scenarioStepFamily({runId, scenarioId: id}))), - ]) - - // 3. Build the CSV-friendly records - const data = allScenarios.map((scenario) => { - if (!scenario) return {} - const sid = scenario.steps?.[0]?.scenarioId - - const primaryInput = scenario.inputSteps?.find((s: any) => s.inputs) || {} - const {inputs = {}, groundTruth = {}, status: inputStatus} = primaryInput as any - - const record: Record = {} - - // Add inputs - Object.entries(inputs).forEach(([k, v]) => { - record[k] = convertToStringOrJson(v) - }) - - // Add ground truths - Object.entries(groundTruth).forEach(([k, v]) => { - record[k] = convertToStringOrJson(v) - }) - - // Add annotation metrics/notes per evaluator slug - scenario.annotationSteps?.forEach((annStep: any) => { - const evaluatorSlug = (annStep.stepKey as string)?.split(".")[1] - if (!evaluatorSlug) return - - // 1. summarize metrics from scenarioMetricsMap for this scenario by slug prefix - const summarized: Record = {} - // const sid = - // scenario.scenarioId || (scenario as any).scenario_id || (scenario as any).id - const scenarioMetrics = scenarioMetricsMap?.[String(sid)] || {} - Object.entries(scenarioMetrics).forEach(([fullKey, stats]) => { - if (fullKey.startsWith(`${evaluatorSlug}.`)) { - const metricKey = fullKey.slice(evaluatorSlug.length + 1) - summarized[metricKey] = stats - } - }) - - if (Object.keys(summarized).length) { - record[evaluatorSlug] = convertToStringOrJson({...summarized}) - } - }) - - // Extract model output from the first invocation step that contains a trace - const invWithTrace = scenario.invocationSteps?.find((inv: any) => inv.trace) - const traceObj = invWithTrace?.trace - let traceOutput: any - if (Array.isArray(traceObj?.nodes)) { - traceOutput = traceObj.nodes[0]?.data?.outputs - } else if (Array.isArray(traceObj?.trees)) { - traceOutput = traceObj.trees[0]?.nodes?.[0]?.data?.outputs - } - - if (traceOutput) { - record.output = convertToStringOrJson(traceOutput) - } - - record.status = inputStatus ?? "unknown" - return record - }) - - return data - }, [runId]) - - const onClickSaveData = useCallback(async () => { - const data = await csvDataFormat() - setRows(data) - }, [csvDataFormat]) - - return ( -
    - - - - - - - -
    - ) -} - -export default memo(EvalRunBatchActions) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunName/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunName/index.tsx deleted file mode 100644 index 96bdcb6d14..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunName/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import {memo} from "react" - -import {Typography} from "antd" -import {useAtomValue} from "jotai" - -import {urlStateAtom} from "../../../state/urlState" -import {EvalRunProps} from "../../assets/types" -import RenameEvalButton from "../Modals/RenameEvalModal/assets/RenameEvalButton" - -const EvalRunName = (props: EvalRunProps) => { - const {id, name, description, runId} = props || {} - const urlState = useAtomValue(urlStateAtom) - - // Check if we're in comparison mode - const isComparisonMode = Boolean(urlState.compare && urlState.compare.length > 0) - - if (isComparisonMode) { - return ( -
    -
    -
    - - Evaluation Run Comparison - -
    -
    - {description && ( - - {description} - - )} -
    - ) - } - - return ( -
    -
    -
    - - {name} - - -
    -
    - {description && ( - - {description} - - )} -
    - ) -} - -export default memo(EvalRunName) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenario/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenario/index.tsx deleted file mode 100644 index b1783d41bb..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenario/index.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import {memo} from "react" - -import clsx from "clsx" -import {useAtomValue} from "jotai" - -import {runViewTypeAtom} from "../../../state/urlState" -import EvalRunScenarioCard from "../EvalRunScenarioCard" -import ScenarioAnnotationPanel from "../ScenarioAnnotationPanel" - -import {EvalRunScenarioProps} from "./types" - -const EvalRunScenario = ({scenarioId, runId, className}: EvalRunScenarioProps) => { - const viewType = useAtomValue(runViewTypeAtom) - - return ( -
    _.ant-card]:grow": viewType !== "focus", - }, - ])} - > -
    - {viewType !== "focus" ? ( - - ) : null} - -
    -
    - ) -} - -export default memo(EvalRunScenario) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenario/types.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenario/types.ts deleted file mode 100644 index 26a7b69ed4..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenario/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface EvalRunScenarioProps { - scenarioId: string - runId: string - className?: string -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/EvalRunScenarioCardBody.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/EvalRunScenarioCardBody.tsx deleted file mode 100644 index 39f4f2208b..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/EvalRunScenarioCardBody.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import {FC, memo, useCallback, useMemo} from "react" - -import {Typography} from "antd" -import {atom, useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" - -import { - loadableScenarioStepFamily, - bulkStepsCacheFamily, - getCurrentRunId, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import {renderSkeleton} from "./assets/utils" -import InvocationRun from "./InvocationRun" - -interface EvalRunScenarioCardBodyProps { - scenarioId: string - runId?: string -} - -const EvalRunScenarioCardBody: FC = ({scenarioId, runId}) => { - // Get effective runId - use provided runId or fallback to current run context - const effectiveRunId = useMemo(() => { - if (runId) return runId - try { - return getCurrentRunId() - } catch (error) { - return "" - } - }, [runId]) - - /* --- atoms & data --- */ - // Unified data access that prioritizes bulk cache over individual scenario atoms - // This ensures we get data from whichever source is available - const invocationSteps = useAtomValue( - useMemo( - () => - atom((get) => { - // First try bulk cache (populated by worker) - const bulkCache = get(bulkStepsCacheFamily(effectiveRunId)) - const bulkData = bulkCache?.get(scenarioId) - if ( - bulkCache && - bulkData?.state === "hasData" && - bulkData.data?.invocationSteps - ) { - return bulkData.data.invocationSteps as any[] - } - - // Fallback to individual scenario atom - const loadable = get( - loadableScenarioStepFamily({scenarioId, runId: effectiveRunId}), - ) - if (loadable.state === "hasData" && loadable.data?.invocationSteps) { - return loadable.data.invocationSteps as any[] - } - - return [] - }), - [scenarioId, effectiveRunId], - ), - ) - - // Use the same atom for load state as we use for data to ensure consistency - // This prevents blocking UI when we have optimistically updated data - const loadState = useAtomValue( - useMemo( - () => - selectAtom(loadableScenarioStepFamily({scenarioId, runId: effectiveRunId}), (l) => { - return l.state - }), - [scenarioId, effectiveRunId], - ), - ) - - /* --- render content --- */ - const renderRuns = useCallback(() => { - if (!invocationSteps.length) return null - - return invocationSteps.map((invStep: any) => ( - - )) - }, [scenarioId, invocationSteps, effectiveRunId]) - - /* --- loading / error states --- */ - // Determine if we truly have no cached data for this scenario yet - const hasCachedSteps = useAtomValue( - useMemo( - () => - selectAtom( - loadableScenarioStepFamily({scenarioId, runId: effectiveRunId}), - (l) => l.state === "hasData" && l.data !== undefined, - ), - [scenarioId, effectiveRunId], - ), - ) - - // Check scenario status to determine if we're in execution/revalidation state - const scenarioStatus = useAtomValue( - useMemo( - () => - selectAtom(loadableScenarioStepFamily({scenarioId, runId: effectiveRunId}), (l) => { - if (l.state !== "hasData" || !l.data) return null - const invSteps = l.data.invocationSteps || [] - const annSteps = l.data.annotationSteps || [] - const inputSteps = l.data.inputSteps || [] - - // Check if any step is running or revalidating - const isRunning = [...invSteps, ...annSteps, ...inputSteps].some( - (s: any) => s.status === "running" || s.status === "revalidating", - ) - - return isRunning ? "active" : "idle" - }), - [scenarioId, effectiveRunId], - ), - ) - - // Only show loading skeleton when we're actually fetching data from server AND have no cached data - // Don't show loading during scenario execution ("running") or revalidation ("revalidating") - const isInitialLoading = - loadState === "loading" && - !hasCachedSteps && - invocationSteps.length === 0 && - scenarioStatus !== "active" - - if (isInitialLoading) { - return renderSkeleton() - } - if (loadState === "hasError") { - return Failed to load scenario data. - } - - if (!invocationSteps.length) return null - - return
    {renderRuns()}
    -} - -export default memo(EvalRunScenarioCardBody) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationInputs.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationInputs.tsx deleted file mode 100644 index cfc9d6333e..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationInputs.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import {memo} from "react" - -import JSON5 from "json5" - -import TextControl from "@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/TextControl" -import SharedEditor from "@/oss/components/Playground/Components/SharedEditor" -import useEvalRunScenarioData from "@/oss/lib/hooks/useEvaluationRunData/useEvalRunScenarioData" - -import {renderChatMessages} from "../../../assets/renderChatMessages" - -interface InvocationInputsProps { - scenarioId: string - testcaseId: string | undefined - runId?: string -} - -const InvocationInputs = ({scenarioId, testcaseId, runId}: InvocationInputsProps) => { - const data = useEvalRunScenarioData(scenarioId, runId) - // Prefer the inputStep directly enriched with `inputs` field (added during bulk/enrichment) - const inputStep = - data?.inputSteps?.find((s) => s.testcaseId === testcaseId) ?? - data?.steps?.find((s) => s.testcaseId === testcaseId && s.inputs) - const inputs = inputStep?.inputs ?? {} - const groundTruth = (inputStep as any)?.groundTruth ?? {} - - // Merge inputs and groundTruth, giving preference to explicit inputs if duplicate keys - const displayInputs = {...groundTruth, ...inputs} - - if (!displayInputs || Object.keys(displayInputs).length === 0) return null - - // Separate inputs into primitives, JSON objects/arrays, and chat messages - const primitiveEntries: [string, string][] = [] - const jsonEntries: [string, any][] = [] - const chatEntries: [string, string][] = [] - - Object.entries(displayInputs).forEach(([k, _v]) => { - // If already an object/array, treat as JSON directly - if (_v && typeof _v === "object") { - jsonEntries.push([k, _v]) - return - } - // Strings may encode JSON or chat messages - if (typeof _v === "string") { - try { - const parsed = JSON5.parse(_v) - if ( - parsed && - Array.isArray(parsed) && - parsed.every( - (m: any) => m && typeof m === "object" && "role" in m && "content" in m, - ) - ) { - chatEntries.push([k, _v]) - } else if (parsed && typeof parsed === "object") { - jsonEntries.push([k, parsed]) - } else { - primitiveEntries.push([k, _v]) - } - } catch { - primitiveEntries.push([k, _v]) - } - return - } - // Fallback to primitive string rendering - primitiveEntries.push([k, String(_v)]) - }) - - const renderPrimitive = ([k, v]: [string, string]) => ( -
    - {}} - disabled - state="readOnly" - className="!text-xs" - /> -
    - ) - - // Render complex chat message inputs using shared util - const renderComplex = ([k, v]: [string, string]) => - renderChatMessages({keyPrefix: k, rawJson: v, view: "single"}) - - const renderJson = ([k, obj]: [string, any]) => ( -
    - -
    - ) - - return ( -
    - {/* Render primitives first */} - {primitiveEntries.map(renderPrimitive)} - {/* Then structured JSON objects/arrays */} - {jsonEntries.map(renderJson)} - {/* Then complex chat/message inputs */} - {chatEntries.flatMap(renderComplex)} -
    - ) -} - -export default memo(InvocationInputs) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationResponse.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationResponse.tsx deleted file mode 100644 index 76520ea9ee..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationResponse.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import {memo} from "react" - -import {Typography} from "antd" -import JSON5 from "json5" - -import GenerationResultUtils from "@/oss/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils" -import SimpleDropdownSelect from "@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect" -import SharedEditor from "@/oss/components/Playground/Components/SharedEditor" -import {useInvocationResult} from "@/oss/lib/hooks/useInvocationResult" - -import RunEvalScenarioButton from "../RunEvalScenarioButton" - -import {InvocationResponseProps} from "./types" - -const InvocationResponse = ({scenarioId, stepKey, runId}: InvocationResponseProps) => { - const {status, trace, value, messageNodes} = useInvocationResult({scenarioId, stepKey, runId}) - const editorKey = trace?.trace_id ?? trace?.id ?? `${scenarioId}-${stepKey}-${runId}` - - return ( -
    -
    - - Model Response - - -
    - - {messageNodes ? ( - messageNodes - ) : typeof value === "object" && value && "role" in value && "content" in value ? ( - - {}} - disabled - /> -
    - } - initialValue={(value as any).content} - editorClassName="!text-xs" - disabled - error={!!trace?.exception} - /> - ) : typeof value === "string" ? ( - (() => { - try { - const parsed = JSON5.parse(value) - if (parsed && typeof parsed === "object") { - const pretty = JSON.stringify(parsed, null, 2) - return ( - {}} - initialValue={pretty} - editorType="border" - placeholder="Click the 'Run' icon to get variant output" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true, codeOnly: true}} - error={!!trace?.exception} - /> - ) - } - - return ( - {}} - initialValue={value} - editorType="border" - placeholder="Click the 'Run' icon to get variant output" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true}} - error={!!trace?.exception} - /> - ) - } catch { - return ( - {}} - initialValue={value} - editorType="border" - placeholder="Click the 'Run' icon to get variant output" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true}} - error={!!trace?.exception} - /> - ) - } - })() - ) : typeof value === "object" ? ( - {}} - initialValue={(() => { - try { - return JSON.stringify(value, null, 2) - } catch { - return String(value) - } - })()} - editorType="border" - placeholder="Click the 'Run' icon to get variant output" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true, codeOnly: true}} - error={!!trace?.exception} - /> - ) : ( - {}} - initialValue={status?.error ? String(status.error) : (value ?? status?.result)} - editorType="border" - placeholder="Click the 'Run' icon to get variant output" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true}} - error={!!trace?.exception} - /> - )} - {trace ? ( - - ) : null} - - ) -} - -export default memo(InvocationResponse) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationRun.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationRun.tsx deleted file mode 100644 index d04cee9eaf..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/InvocationRun.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import {memo} from "react" - -import InvocationInputs from "./InvocationInputs" -import InvocationResponse from "./InvocationResponse" -import {InvocationRunProps} from "./types" - -const InvocationRun = ({invStep, scenarioId, runId}: InvocationRunProps) => { - return ( -
    - - -
    - ) -} - -export default memo(InvocationRun) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/index.tsx deleted file mode 100644 index 57558062c8..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import {memo, useMemo} from "react" - -import {Card} from "antd" -import deepEqual from "fast-deep-equal" -import {useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" - -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {EvaluationRunState} from "@/oss/lib/hooks/useEvaluationRunData/types" - -import EvalRunScenarioCardTitle from "../EvalRunScenarioCardTitle" -import RunEvalScenarioButton from "../RunEvalScenarioButton" - -import EvalRunScenarioCardBody from "./EvalRunScenarioCardBody" -import {EvalRunScenarioCardProps} from "./types" - -/** - * Component that renders a card view for a specific evaluation run scenario. - * Depending on the `viewType`, it can display the scenario in a card format - * or a full-width format. Utilizes data from Jotai atoms to display scenario - * details, including loading state and error handling. - * - * @param {string} scenarioId - The unique identifier for the scenario to be displayed. - * @param {ViewType} [viewType="list"] - Determines the layout of the scenario display, - * either as a "list" (card format) or "single" (full-width). - */ -const EvalRunScenarioCard = ({scenarioId, runId, viewType = "list"}: EvalRunScenarioCardProps) => { - /* scenario index for card title */ - // Read from the same global store that writes are going to - const scenarioIndex = useAtomValue( - useMemo( - () => - selectAtom( - evaluationRunStateFamily(runId), // Use run-scoped atom with runId - (state: EvaluationRunState) => - state.scenarios?.find((s) => s.id === scenarioId)?.scenarioIndex, - deepEqual, - ), - [scenarioId, runId], // Include runId in dependencies - ), - ) - - if (scenarioIndex === undefined) return null - - return viewType === "list" ? ( - - } - style={{width: 400}} - className="self-stretch" - actions={[]} - > - - - ) : ( -
    - -
    - ) -} - -export default memo(EvalRunScenarioCard) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/types.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/types.ts deleted file mode 100644 index 559d89c211..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCard/types.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {ComponentProps} from "react" - -import {Typography} from "antd" - -export type ViewType = "list" | "focus" - -export interface EvalRunScenarioCardProps { - scenarioId: string - runId: string - viewType?: ViewType -} - -export interface KeyValueProps { - label: string - value: any - type?: ComponentProps["type"] -} - -export interface InvocationResponseProps { - scenarioId: string - stepKey: string - runId?: string -} - -export interface InvocationRunProps { - invStep: any - scenarioId: string - runId?: string -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCardTitle/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCardTitle/index.tsx deleted file mode 100644 index 2b4c1db711..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCardTitle/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import {memo} from "react" - -import {Typography} from "antd" - -import EvalRunScenarioStatusTag from "../../../components/EvalRunScenarioStatusTag" - -import {EvalRunScenarioCardTitleProps} from "./types" - -const EvalRunScenarioCardTitle = ({ - scenarioIndex, - scenarioId, - runId, -}: EvalRunScenarioCardTitleProps) => { - return ( -
    - Testcase #{scenarioIndex} - -
    - ) -} - -export default memo(EvalRunScenarioCardTitle) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCardTitle/types.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCardTitle/types.ts deleted file mode 100644 index de91d7ca09..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioCardTitle/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface EvalRunScenarioCardTitleProps { - scenarioIndex: number - scenarioId: string - runId: string -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioFilters.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioFilters.tsx deleted file mode 100644 index a934157a00..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/EvalRunScenarioFilters.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import {memo, useCallback} from "react" - -import {Segmented} from "antd" -import {useSetAtom, useAtomValue} from "jotai" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import { - totalCountFamily, - evalScenarioFilterAtom, - pendingCountFamily, - unannotatedCountFamily, - failedCountFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -const EvalRunScenarioFilters = () => { - const runId = useRunId() - - // Read from the same global store that writes are going to - const setFilterAtom = useSetAtom(evalScenarioFilterAtom) - const filter = useAtomValue(evalScenarioFilterAtom) - const totalCount = useAtomValue(totalCountFamily(runId)) - const pendingCount = useAtomValue(pendingCountFamily(runId)) - const unannotatedCount = useAtomValue(unannotatedCountFamily(runId)) - const failedCount = useAtomValue(failedCountFamily(runId)) - - const handleChange = useCallback((val: string) => { - setFilterAtom(val as any) - }, []) - - return ( - - ) -} - -export default memo(EvalRunScenarioFilters) diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/index.tsx deleted file mode 100644 index 86e81c461e..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/RenameEvalModal/index.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import {useCallback, useMemo, useState} from "react" - -import {message} from "antd" -import {useSWRConfig} from "swr" - -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" -import {useRunId} from "@/oss/contexts/RunIdContext" -import axios from "@/oss/lib/api/assets/axiosConfig" -import { - evalAtomStore, - evaluationRunStateFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import {RenameEvalModalProps} from "../types" - -import RenameEvalModalContent from "./assets/RenameEvalModalContent" - -const RenameEvalModal = ({ - id, - name, - description, - runId, - onCancel, - afterClose, - ...modalProps -}: RenameEvalModalProps) => { - const {mutate} = useSWRConfig() - const contextRunId = useRunId() // Get runId from context - const effectiveRunId = runId || contextRunId // Use prop runId if available, otherwise context - const [editName, setEditName] = useState(name) - const [editDescription, setEditDescription] = useState(description || "") - const [loading, setLoading] = useState(false) - const [error, setError] = useState(null) - - const onAfterClose = useCallback(() => { - setEditName(name) - setEditDescription(description || "") - setError(null) - afterClose?.() - }, [name, description, afterClose]) - - const handleSave = useCallback(async () => { - setLoading(true) - setError(null) - - // Use run-scoped atom with effectiveRunId (from prop or context) - const state = evalAtomStore().get(evaluationRunStateFamily(effectiveRunId)) - - try { - const response = await axios.patch(`/preview/evaluations/runs/${id}`, { - run: { - ...state.rawRun, - id, - name: editName, - description: editDescription, - }, - }) - - const updatedCount = response?.data?.count - if (typeof updatedCount === "number" && updatedCount <= 0) { - message.error("Failed to update evaluation run.") - onCancel?.({} as any) - return - } - - await mutate( - (key: string) => key.includes("/preview/evaluations/runs/") || key.includes(id), - undefined, - true, - ) - - message.success("Evaluation run updated") - onCancel?.({} as any) - } catch (err: any) { - setError(err?.message || "Failed to update run") - } finally { - setLoading(false) - } - }, [id, editName, editDescription, mutate, effectiveRunId, name, onCancel]) - - const isDisabled = useMemo(() => { - return ( - editName?.trim?.() === name?.trim?.() && - editDescription?.trim?.() === description?.trim?.() - ) - }, [editName, editDescription, name, description]) - - return ( - - - - ) -} - -export default RenameEvalModal diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/types.d.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/types.d.ts deleted file mode 100644 index a453b392e1..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/Modals/types.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -import {Dispatch, SetStateAction, ReactNode} from "react" - -import {ModalProps, ButtonProps} from "antd" - -export interface InstructionModalProps extends ModalProps {} - -export interface RenameEvalModalProps extends ModalProps { - id: string - name: string - description?: string - runId?: string -} - -export interface RenameEvalModalContentProps { - loading?: boolean - error: string | null - editName: string - setEditName: Dispatch> - editDescription: string - setEditDescription: Dispatch> -} - -export interface RenameEvalButtonProps extends ButtonProps { - id: string - name: string - description?: string - runId?: string - icon?: boolean - children?: ReactNode - label?: string -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/RunEvalScenarioButton/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/RunEvalScenarioButton/index.tsx deleted file mode 100644 index 248ca7da4a..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/RunEvalScenarioButton/index.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import {memo, useMemo, useCallback} from "react" - -import RunButton from "@agenta/oss/src/components/Playground/assets/RunButton" -import {Tooltip} from "antd" -import {useAtomValue} from "jotai" -import {loadable} from "jotai/utils" - -// Use EE run-scoped versions for multi-run support -import {useEvalScenarioQueue} from "@/oss/lib/hooks/useEvalScenarioQueue" -import { - getCurrentRunId, - scenarioStepFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import {RunEvalScenarioButtonProps} from "./types" - -const RunEvalScenarioButton = memo( - ({scenarioId, stepKey, label = "Run Scenario", runId}: RunEvalScenarioButtonProps) => { - // Use effective runId with fallback using useMemo - const effectiveRunId = useMemo(() => { - if (runId) return runId - try { - return getCurrentRunId() - } catch (error) { - console.warn("[RunEvalScenarioButton] No run ID available:", error) - return "" - } - }, [runId]) - - const {enqueueScenario} = useEvalScenarioQueue({concurrency: 5, runId: effectiveRunId}) - - // Derive invocationParameters via scenario step loadable (run-scoped) - use global store - const stepLoadable = useAtomValue( - loadable(scenarioStepFamily({scenarioId, runId: effectiveRunId})), - ) - - // derive running flag directly from run-scoped scenario step data - const isRunning = useMemo(() => { - if (stepLoadable.state !== "hasData" || !stepLoadable.data) return false - const data = stepLoadable.data - return ( - data?.invocationSteps?.some((s: any) => s.status === "running") || - data?.annotationSteps?.some((s: any) => s.status === "running") || - data?.inputSteps?.some((s: any) => s.status === "running") - ) - }, [stepLoadable]) - - // Extract invocation steps (if any) - const invocationSteps = - stepLoadable.state === "hasData" ? stepLoadable.data?.invocationSteps || [] : [] - - // Determine target step - const targetStep = stepKey - ? invocationSteps.find((s) => s.stepKey === stepKey) - : invocationSteps.find((s) => s.invocationParameters) - - const autoStepKey = targetStep?.stepKey - const invocationParameters = targetStep?.invocationParameters - const invocationStepStatus = targetStep?.status - - const handleClick = useCallback(() => { - if (invocationParameters) { - enqueueScenario(scenarioId, autoStepKey) - } - }, [enqueueScenario, scenarioId, autoStepKey, invocationParameters]) - - const button = useMemo( - () => ( - - ), - [handleClick, isRunning, invocationStepStatus, invocationParameters, label], - ) - - return ( -
    - {invocationParameters ? ( - - {JSON.stringify(invocationParameters, null, 2)} -
    - } - > - {button} - - ) : ( - button - )} -
    - ) - }, -) - -export default RunEvalScenarioButton diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/RunEvalScenarioButton/types.ts b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/RunEvalScenarioButton/types.ts deleted file mode 100644 index a523a32155..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/RunEvalScenarioButton/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface RunEvalScenarioButtonProps { - scenarioId: string - label?: string - stepKey?: string - runId?: string // Optional for multi-run support -} diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioAnnotationPanel/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioAnnotationPanel/index.tsx deleted file mode 100644 index c706820839..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/ScenarioAnnotationPanel/index.tsx +++ /dev/null @@ -1,298 +0,0 @@ -import {FC, memo, useCallback, useMemo, useRef, useState} from "react" - -import {Card, Typography} from "antd" -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {useAtomValue} from "jotai" -import {selectAtom, loadable} from "jotai/utils" -import dynamic from "next/dynamic" - -import { - getInitialMetricsFromAnnotations, - getInitialSelectedEvalMetrics, -} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" -import {UpdatedMetricsType} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/types" -import {isAnnotationCreatedByCurrentUser} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/utils" -import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import { - getCurrentRunId, - scenarioStepFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" - -import AnnotateScenarioButton from "../AnnotateScenarioButton" -import RunEvalScenarioButton from "../RunEvalScenarioButton" - -import {ScenarioAnnotationPanelProps} from "./types" - -const Annotate = dynamic( - () => - import( - "@agenta/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/Annotate" - ), - {ssr: false}, -) - -const EmptyArray: any[] = [] - -const ScenarioAnnotationPanelAnnotation = memo( - ({ - onAnnotate, - runId, - scenarioId, - buttonClassName, - invStep, - annotationsByStep, - evaluators, - }: ScenarioAnnotationPanelProps) => { - const [errorMessages, setErrorMessages] = useState(EmptyArray as string[]) - - // TODO: move this to a shared utils file - const formatErrorMessages = useCallback((requiredMetrics: Record) => { - const errorMessages: string[] = [] - - for (const [key, data] of Object.entries(requiredMetrics || {})) { - errorMessages.push( - `Value ${data?.value === "" ? "empty string" : data?.value} is not assignable to type ${data?.type} in ${key}`, - ) - } - setErrorMessages(errorMessages) - }, []) - - const [updatedMetrics, setUpdatedMetrics] = useState({}) - - // helper to compute per-step annotation & evaluator lists - const buildAnnotateData = useCallback( - (stepKey: string) => { - const _steps = annotationsByStep?.[stepKey] || [] - const _annotations = _steps - .map((s) => s.annotation) - .filter(Boolean) as AnnotationDto[] - const annotationEvaluatorSlugs = _annotations - .map((annotation) => annotation?.references?.evaluator?.slug) - .filter(Boolean) - - return { - annotations: _annotations, - evaluatorSlugs: - evaluators - ?.map((e) => e.slug) - .filter((slug) => !annotationEvaluatorSlugs.includes(slug)) || [], - evaluators: - evaluators?.filter((e) => !annotationEvaluatorSlugs.includes(e.slug)) || [], - } - }, - [annotationsByStep, evaluators], - ) - - const {_annotations, isAnnotated, isCreatedByCurrentUser, selectedEvaluators} = - useMemo(() => { - const annotateData = buildAnnotateData(invStep.stepKey) - - const _annotations = annotateData.annotations - const selectedEvaluators = annotateData.evaluatorSlugs - - const isAnnotated = _annotations.length > 0 - const isCreatedByCurrentUser = _annotations.length - ? _annotations.some((ann) => isAnnotationCreatedByCurrentUser(ann)) - : true - - return { - isAnnotated, - isCreatedByCurrentUser, - selectedEvaluators, - _annotations, - } - }, [invStep.stepKey, buildAnnotateData, evaluators]) - - const isChangedMetricData = useMemo(() => { - const annotateData = buildAnnotateData(invStep.stepKey) - - const initialAnnotationMetrics = getInitialMetricsFromAnnotations({ - annotations: annotateData.annotations, - evaluators, - }) - const annotationSlugs = annotateData.annotations - .map((ann) => ann.references?.evaluator?.slug) - .filter(Boolean) - - // Filter updatedMetrics to only include user existing annotations - const filteredUpdatedMetrics = Object.fromEntries( - Object.entries(updatedMetrics).filter(([slug]) => annotationSlugs.includes(slug)), - ) - - if ( - Object.keys(filteredUpdatedMetrics).length === 0 && - filteredUpdatedMetrics.constructor === Object - ) { - return true - } - return deepEqual(filteredUpdatedMetrics, initialAnnotationMetrics) - }, [updatedMetrics, evaluators, invStep.stepKey]) - - const isChangedSelectedEvalMetrics = useMemo(() => { - const annotateData = buildAnnotateData(invStep.stepKey) - const selectedEvaluators = annotateData.evaluatorSlugs - - const initialSelectedEvalMetrics = getInitialSelectedEvalMetrics({ - evaluators: annotateData.evaluators, - selectedEvaluators, - }) - - const filteredUpdatedMetrics = Object.fromEntries( - Object.entries(updatedMetrics).filter(([slug]) => - selectedEvaluators.includes(slug), - ), - ) - - if ( - Object.keys(filteredUpdatedMetrics).length === 0 && - filteredUpdatedMetrics.constructor === Object - ) { - return true - } - - return deepEqual(filteredUpdatedMetrics, initialSelectedEvalMetrics) - }, [updatedMetrics, updatedMetrics, evaluators, invStep.stepKey]) - - return ( -
    - - -
    - ) - }, -) - -const ScenarioAnnotationPanel: FC = ({ - runId, - scenarioId, - className, - classNames, - buttonClassName, - onAnnotate, -}) => { - // Use effective runId with fallback using useMemo - const effectiveRunId = useMemo(() => { - if (runId) return runId - try { - return getCurrentRunId() - } catch (error) { - console.warn("[ScenarioAnnotationPanel] No run ID available:", error) - return "" - } - }, [runId]) - - // Get evaluators from run-scoped state instead of global atom - const evaluatorsSelector = useCallback((state: any) => { - return state?.enrichedRun?.evaluators ? Object.values(state.enrichedRun.evaluators) : [] - }, []) - - const evaluatorsAtom = useMemo( - () => selectAtom(evaluationRunStateFamily(effectiveRunId), evaluatorsSelector, deepEqual), - [effectiveRunId, evaluatorsSelector], - ) - const evaluators = useAtomValue(evaluatorsAtom) - - // Loadable step data for this scenario (always eager) - now run-scoped - // Read from the same global store that writes are going to - const stepDataLoadable = useAtomValue( - loadable(scenarioStepFamily({scenarioId, runId: effectiveRunId})), - ) - - // Preserve last known data so we can still show tool-tips / fields while revalidating - const prevDataRef = useRef(undefined) - - let stepData: UseEvaluationRunScenarioStepsFetcherResult | undefined = undefined - if (stepDataLoadable.state === "hasData") { - stepData = stepDataLoadable.data - prevDataRef.current = stepDataLoadable.data - } else if (stepDataLoadable.state === "loading") { - stepData = prevDataRef.current - } - - // Memoize field slices for best performance (multi-step) - const _invocationSteps = useMemo(() => stepData?.invocationSteps ?? [], [stepData]) - // Build annotations per step key - const annotationsByStep = useMemo(() => { - if (!stepData) return {} - - type AnnStep = (typeof stepData.steps)[number] - const map: Record = {} - if (!stepData?.steps || !_invocationSteps.length) return map - - // Pre-compute all annotation steps once (annotation step = has invocation key prefix) - const allAnnSteps = (stepData.steps || []).filter((s) => - _invocationSteps.some((invStep) => (s.stepKey ?? "").startsWith(`${invStep.stepKey}.`)), - ) - _invocationSteps.forEach(({stepKey}) => { - const anns = allAnnSteps.filter((s) => (s.stepKey ?? "").startsWith(`${stepKey}.`)) - map[stepKey] = anns - }) - return map - }, [stepData?.steps, _invocationSteps]) - - const hasAnyTrace = useMemo(() => _invocationSteps.some((s) => s.traceId), [_invocationSteps]) - - return ( - -
    - {_invocationSteps.map((invStep) => { - return ( - - ) - })} -
    - {!hasAnyTrace ? ( -
    - To annotate, please generate output - -
    - ) : null} -
    - ) -} - -export default ScenarioAnnotationPanel diff --git a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/SingleScenarioViewer/index.tsx b/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/SingleScenarioViewer/index.tsx deleted file mode 100644 index 14f3e4d9ac..0000000000 --- a/web/oss/src/components/EvalRunDetails/HumanEvalRun/components/SingleScenarioViewer/index.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import {memo, useEffect} from "react" - -import {Button, Space, Typography} from "antd" -import clsx from "clsx" -import {useAtom, useAtomValue} from "jotai" -import {loadable} from "jotai/utils" -import {useRouter} from "next/router" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import { - displayedScenarioIdsFamily, - scenariosFamily, - scenarioStepProgressFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import EvalRunScenarioNavigator from "../../../components/EvalRunScenarioNavigator" -import {urlStateAtom} from "../../../state/urlState" -import EvalRunScenarioCard from "../EvalRunScenarioCard" -import ScenarioAnnotationPanel from "../ScenarioAnnotationPanel" -import ScenarioLoadingIndicator from "../ScenarioLoadingIndicator/ScenarioLoadingIndicator" - -import {SingleScenarioViewerProps} from "./types" - -const SingleScenarioViewer = ({runId}: SingleScenarioViewerProps) => { - // Use run-scoped atoms with the provided runId - const effectiveRunId = useRunId() || runId - - // Read from the same global store that writes are going to - const scenariosLoadable = useAtomValue(loadable(scenariosFamily(effectiveRunId))) - const scenarioIdsFromFamily = useAtomValue(displayedScenarioIdsFamily(effectiveRunId)) - - // Fallback: if displayedScenarioIdsFamily is empty but scenariosLoadable has data, use that - const scenarioIds = - scenarioIdsFromFamily?.length > 0 - ? scenarioIdsFromFamily - : scenariosLoadable.state === "hasData" - ? scenariosLoadable.data?.map((s) => s.id) || [] - : [] - const scenarioStepProgress = useAtomValue(scenarioStepProgressFamily(effectiveRunId)) - - // Access URL state atom - const router = useRouter() - const [urlState, setUrlState] = useAtom(urlStateAtom) - - // Prefer URL query first, then atom, then fallback - const activeId = - (router.query.scenarioId as string | undefined) ?? urlState.scenarioId ?? scenarioIds[0] - - // Ensure URL/atom always reference a scenario visible in current list - // Ensure URL/atom correctness - useEffect(() => { - if (scenarioIds.length === 0) return - - const currentScenarioId = - (router.query.scenarioId as string | undefined) ?? urlState.scenarioId - - if (!currentScenarioId || !scenarioIds.includes(currentScenarioId)) { - // Default to the first scenario for this run when no valid selection/deep-link. - setUrlState((draft) => { - draft.scenarioId = scenarioIds[0] - }) - return - } - }, [scenarioIds, router.query.scenarioId, urlState.scenarioId, setUrlState]) - - if (scenariosLoadable.state !== "hasData") { - const step = scenarioStepProgress.loadingStep as string | undefined - if (step === "eval-run" || step === "scenarios") { - return ( - -
    - ) -} - -export default memo(ConfigurationViewer) diff --git a/web/oss/src/components/EvalRunDetails/OnlineEvalRun/components/TracesViewer/index.tsx b/web/oss/src/components/EvalRunDetails/OnlineEvalRun/components/TracesViewer/index.tsx deleted file mode 100644 index 2ada026d04..0000000000 --- a/web/oss/src/components/EvalRunDetails/OnlineEvalRun/components/TracesViewer/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import {memo} from "react" - -import {useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -const TracesViewer = () => { - const runId = useRunId() - // const runState = useAtomValue( - // selectAtom(evaluationRunStateFamily(runId!), (v) => ({ - // enrichedRun: v.enrichedRun, - // runIndex: v.runIndex, - // })), - // ) as any - - // const steps = (runState?.runIndex?.steps && Object.values(runState.runIndex.steps)) || [] - - // if (!steps.length) { - // return ( - //
    - // No traces available yet. - //
    - // ) - // } - - return ( -
    - {/*
    - {steps.map((s: any, idx: number) => ( -
    -
    {s?.type || "step"}
    -
    - {JSON.stringify(s, null, 2)} -
    -
    - ))} -
    */} -
    - ) -} - -export default memo(TracesViewer) diff --git a/web/oss/src/components/EvalRunDetails/OnlineEvalRun/index.tsx b/web/oss/src/components/EvalRunDetails/OnlineEvalRun/index.tsx deleted file mode 100644 index b8fbf46677..0000000000 --- a/web/oss/src/components/EvalRunDetails/OnlineEvalRun/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" -import dynamic from "next/dynamic" - -import {evalAtomStore} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import EvalRunHeader from "../AutoEvalRun/components/EvalRunHeader" -import EvalRunOverviewViewer from "../components/EvalRunOverviewViewer" -import VirtualizedScenarioTable from "../components/VirtualizedScenarioTable" -import {runViewTypeAtom} from "../state/urlState" - -import ConfigurationViewer from "./components/ConfigurationViewer" - -export interface OnlineEvalRunDetailsProps { - name: string - description: string - id: string - isLoading?: boolean -} - -const viewTypeAtom = selectAtom(runViewTypeAtom, (v) => v, deepEqual) -const OnlineEvalRunDetails = ({name, id, isLoading}: OnlineEvalRunDetailsProps) => { - const store = evalAtomStore() - const viewType = useAtomValue(viewTypeAtom, {store}) - - // No special skeleton for now; render minimal shell if loading - if (isLoading) { - return ( -
    - -
    - ) - } - - return ( -
    - - - {viewType === "overview" ? ( - - ) : viewType === "results" ? ( - - ) : viewType === "configuration" ? ( - - ) : null} -
    - ) -} - -export default OnlineEvalRunDetails diff --git a/web/oss/src/components/EvalRunDetails/UrlSync.tsx b/web/oss/src/components/EvalRunDetails/UrlSync.tsx deleted file mode 100644 index a17cc175e9..0000000000 --- a/web/oss/src/components/EvalRunDetails/UrlSync.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import {useEffect, useRef} from "react" - -import {useAtom, useAtomValue} from "jotai" -import {useRouter} from "next/router" - -import {EvalRunUrlState, runViewTypeAtom, urlStateAtom} from "./state/urlState" - -const UrlSync = ({evalType}: {evalType: "auto" | "human" | "online" | "custom"}) => { - const router = useRouter() - - // Use global store for all atom reads/writes to ensure consistency - const [urlState, setUrlState] = useAtom(urlStateAtom) - - // Track the last applied router->atom key to avoid re-applying the same state - const lastAppliedKeyRef = useRef(null) - const initializedRef = useRef(false) - const viewType = useAtomValue(runViewTypeAtom) - - // Router -> Atom (sync whenever relevant query params change) - useEffect(() => { - if (!router.isReady) return - const {view, scenarioId, compare} = router.query - const queryView = Array.isArray(view) ? view[0] : (view as string | undefined) - const fallbackView = - evalType === "online" ? "results" : evalType === "human" ? "focus" : "testcases" - const v = queryView ?? fallbackView - - // Parse compare parameter - can be a single string or array of strings - let compareIds: string[] | undefined - if (compare) { - if (Array.isArray(compare)) { - compareIds = compare.filter((id) => typeof id === "string" && id.length > 0) - } else if (typeof compare === "string" && compare.length > 0) { - // Handle comma-separated string or single ID - compareIds = compare.includes(",") - ? compare - .split(",") - .map((id) => id.trim()) - .filter(Boolean) - : [compare] - } - } - - const nextScenarioId = v === "focus" ? (scenarioId as string | undefined) : undefined - const nextKey = `${v}|${nextScenarioId || ""}|${(compareIds || []).join(",")}` - const curr = urlState - const sameView = curr.view === (v as EvalRunUrlState["view"]) - const sameScenario = (curr.scenarioId || undefined) === (nextScenarioId || undefined) - const currCompareKey = (curr.compare || []).join(",") - const nextCompareKey = (compareIds || []).join(",") - const sameCompare = currCompareKey === nextCompareKey - - if (lastAppliedKeyRef.current === nextKey && sameView && sameScenario && sameCompare) return - - setUrlState({ - view: v as EvalRunUrlState["view"], - scenarioId: nextScenarioId, - compare: compareIds, - }) - lastAppliedKeyRef.current = nextKey - initializedRef.current = true - }, [router.isReady, evalType, router.query.view, router.query.scenarioId, router.query.compare]) - - // Atom -> Router - const lastReplacedKeyRef = useRef(null) - useEffect(() => { - if (!router.isReady) return - if (urlState.view === undefined) return // wait until atom populated - if (evalType === "online") return - // Early guard: if router already matches atom state, do nothing - const rView = (router.query.view as string) || "" - const rScenario = (router.query.scenarioId as string) || "" - const rCompare = Array.isArray(router.query.compare) - ? router.query.compare.join(",") - : (router.query.compare as string) || "" - const aView = urlState.view || "" - const aScenario = urlState.view === "focus" ? urlState.scenarioId || "" : "" - const aCompare = (urlState.compare || []).join(",") - if (rView === aView && rScenario === aScenario && rCompare === aCompare) { - return - } - // Build nextQuery starting from current router.query so that dynamic route params (app_id, evaluation_id, etc.) are preserved - const nextQuery: Record = {...router.query} - // Apply view from atom - if (urlState.view) nextQuery.view = urlState.view - - // Handle scenarioId depending on view - if (urlState.view === "focus") { - if (urlState.scenarioId !== undefined) { - // atom resolved - if (urlState.scenarioId) nextQuery.scenarioId = urlState.scenarioId - else delete nextQuery.scenarioId - } else if ("scenarioId" in router.query) { - // keep existing router scenarioId until atom resolves - nextQuery.scenarioId = router.query.scenarioId as string - } - } else { - // non-scenario view – ensure scenarioId is gone - delete nextQuery.scenarioId - } - - // Handle compare parameter - if (urlState.compare && urlState.compare.length > 0) { - // Convert array to comma-separated string for URL - nextQuery.compare = urlState.compare.join(",") - } else { - delete nextQuery.compare - } - - // remove empty/undefined values - Object.keys(nextQuery).forEach((k) => { - if (nextQuery[k] === undefined || nextQuery[k] === "") { - delete nextQuery[k] - } - }) - - let mustReplace = false - // strip scenarioId for non-scenario views - if (urlState.view !== "focus") { - if ("scenarioId" in nextQuery) delete nextQuery.scenarioId - } - // Need replace if router still has scenarioId but nextQuery doesn't - if ("scenarioId" in router.query && !("scenarioId" in nextQuery)) { - mustReplace = true - } - // detect difference including removed keys (normalize arrays to strings for compare) - const normalize = (q: Record) => { - const copy: Record = {} - for (const k of Object.keys(q)) { - const val = q[k] - if (Array.isArray(val)) copy[k] = val.join(",") - else copy[k] = val - } - return copy - } - const currNorm = normalize(router.query as any) - const nextNorm = normalize(nextQuery) - const allKeys = new Set([...Object.keys(currNorm), ...Object.keys(nextNorm)]) - let hasDiff = mustReplace - if (!hasDiff) { - for (const k of allKeys) { - if (currNorm[k] !== nextNorm[k]) { - hasDiff = true - break - } - } - } - // Fast-path guard: if router already equals desired key, skip replace - const routerKey = `${(router.query.view as string) || ""}|${(router.query.scenarioId as string) || ""}|${ - (typeof router.query.compare === "string" - ? router.query.compare - : Array.isArray(router.query.compare) - ? router.query.compare?.join(",") - : "") || "" - }` - const desiredKey = `${nextQuery.view || ""}|${nextQuery.scenarioId || ""}|${(nextQuery.compare as string) || ""}` - if (routerKey === desiredKey) { - lastReplacedKeyRef.current = desiredKey - return - } - - if (hasDiff && lastReplacedKeyRef.current !== desiredKey) { - router.replace( - { - pathname: router.pathname, - query: nextQuery, - }, - undefined, - {shallow: !mustReplace}, - ) - lastReplacedKeyRef.current = desiredKey - } - }, [urlState]) - - return null -} - -export default UrlSync diff --git a/web/oss/src/components/EvalRunDetails/assets/renderChatMessages.tsx b/web/oss/src/components/EvalRunDetails/assets/renderChatMessages.tsx deleted file mode 100644 index d75c1f975d..0000000000 --- a/web/oss/src/components/EvalRunDetails/assets/renderChatMessages.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import {ReactNode} from "react" - -import clsx from "clsx" -import dynamic from "next/dynamic" - -import ImagePreview from "@/oss/components/Common/ImagePreview" -import SimpleSharedEditor from "@/oss/components/EditorViews/SimpleSharedEditor" -import SimpleDropdownSelect from "@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect" -import SharedEditor from "@/oss/components/Playground/Components/SharedEditor" - -const Tooltip = dynamic(() => import("antd").then((mod) => mod.Tooltip), {ssr: false}) - -/** - * Renders an array of chat messages (OpenAI format) as readonly SharedEditor blocks. - * Returns an array of
    nodes so callers can embed them directly in their JSX. - */ -export function renderChatMessages({ - keyPrefix, - rawJson, - view, - editorType = "shared", -}: { - keyPrefix: string - rawJson: string - view?: "table" | "single" - editorType?: "simple" | "shared" | "normal" -}): ReactNode[] { - let messages: {role: string; content: any}[] = [] - try { - messages = JSON.parse(rawJson) - if (!Array.isArray(messages)) - return [{String(rawJson)}] - } catch { - return [{String(rawJson)}] - } - - if (view === "table") { - return messages.map((msg, i) => { - const textContent = Array.isArray(msg.content) - ? msg.content.find((content) => content.type === "text")?.text - : msg.content - const images = Array.isArray(msg.content) - ? msg.content.filter((content) => content.type === "image_url") - : [] - const showDivider = i < messages.length - 1 - - return ( -
    - {msg.role} - {textContent ? ( -
    {textContent}
    - ) : null} - {images.length ? ( -
    - {images.map((imageContent: any, index: number) => ( - - ))} -
    - ) : null} - {showDivider ? ( -
    - ) : null} -
    - ) - }) - } - - return messages.map((msg, i) => { - const textContent = Array.isArray(msg.content) - ? msg.content.find((content) => content.type === "text")?.text - : msg.content - const images = Array.isArray(msg.content) - ? msg.content.filter((content) => content.type === "image_url") - : [] - const showDivider = i < messages.length - 1 - - return ( -
    - {editorType === "simple" ? ( - {}} - headerName={msg.role} - headerClassName="capitalize" - initialValue={textContent} - editorType="borderless" - state="readOnly" - placeholder="N/A" - disabled - readOnly - editorClassName="!text-xs" - className="!w-[97.5%]" - editorProps={{enableResize: true}} - footer={ -
    - {images.map((imageContent: any, index: number) => ( - - ))} -
    - } - /> - ) : editorType === "normal" ? ( -
    - {msg.role} - {textContent} -
    - ) : ( - - {msg.role} - - ) : ( -
    - {}} - disabled - /> -
    - ) - } - initialValue={textContent} - className="hover:!border-[transparent]" - editorClassName="!text-xs" - editorProps={{enableResize: true}} - disabled - footer={ -
    - {images.map((imageContent: any, index: number) => ( - - ))} -
    - } - /> - )} - - {showDivider ? ( -
    - ) : null} -
    - ) - }) -} diff --git a/web/oss/src/components/EvalRunDetails/components/ComparisonDataFetcher.tsx b/web/oss/src/components/EvalRunDetails/components/ComparisonDataFetcher.tsx deleted file mode 100644 index 33758831fc..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/ComparisonDataFetcher.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import {memo, useEffect, useRef} from "react" - -import {useAtomValue} from "jotai" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import useEvaluationRunData from "@/oss/lib/hooks/useEvaluationRunData" - -import { - evalAtomStore, - evaluationRunStateFamily, - initializeRun, -} from "../../../lib/hooks/useEvaluationRunData/assets/atoms" -import {urlStateAtom} from "../state/urlState" - -const COLOR_SEQUENCE = [1, 2, 3, 4, 5] - -/** - * Individual comparison run data fetcher component - * Mounts the same data fetching logic as EvaluationPageData for a specific comparison run - */ -const ComparisonRunDataFetcher = memo(({runId}: {runId: string}) => { - // Initialize run-scoped atoms and subscriptions when runId is available - useEffect(() => { - if (runId) { - initializeRun(runId) - } - }, [runId]) - - // Use the same data fetching hook as the main evaluation page - // This will trigger all the same atom subscriptions and data loading - useEvaluationRunData(runId, true, runId) - - // This component doesn't render anything - it just triggers data fetching - return null -}) - -ComparisonRunDataFetcher.displayName = "ComparisonRunDataFetcher" - -/** - * Main comparison data fetcher that mounts individual fetchers for each comparison run - * This leverages the existing EvaluationPageData pattern without reimplementing anything - */ -export const ComparisonDataFetcher = memo(() => { - const runColorRegistryRef = useRef(new Map()) - - const urlState = useAtomValue(urlStateAtom) - const comparisonRunIds = urlState.compare || [] - const baseRunId = useRunId() - const prevCompareIdsRef = useRef([]) - const store = evalAtomStore() - - // Keep run flags in sync with compare list - useEffect(() => { - const ensureColorIndex = (runId: string | undefined) => { - if (!runId) return undefined - const registry = runColorRegistryRef.current - if (registry.has(runId)) return registry.get(runId) - - const used = new Set(registry.values()) - const available = COLOR_SEQUENCE.find((idx) => !used.has(idx)) - const nextIndex = available ?? (registry.size % COLOR_SEQUENCE.length) + 1 - registry.set(runId, nextIndex) - return nextIndex - } - - if (!baseRunId) return - - // Base run is always index 1 and not a comparison - store.set(evaluationRunStateFamily(baseRunId), (draft: any) => { - draft.isBase = true - draft.isComparison = false - draft.compareIndex = 1 - draft.colorIndex = draft.colorIndex ?? ensureColorIndex(baseRunId) - }) - - // Reset flags for runs removed from compare - const prev = prevCompareIdsRef.current - const removed = prev.filter((id) => !comparisonRunIds.includes(id)) - removed.forEach((id) => { - // Never reset flags for the current base run even if it was - // temporarily present in the previous compare list during swaps - if (id === baseRunId) return - store.set(evaluationRunStateFamily(id), (draft: any) => { - draft.isBase = false - draft.isComparison = false - draft.compareIndex = undefined - draft.colorIndex = draft.colorIndex ?? ensureColorIndex(id) - }) - }) - - // Set flags and compareIndex for current compare list - // Skip the base run if it appears in the comparison list temporarily during routing swaps - comparisonRunIds.forEach((id, idx) => { - if (id === baseRunId) return - store.set(evaluationRunStateFamily(id), (draft: any) => { - draft.isBase = false - draft.isComparison = true - draft.compareIndex = idx + 2 // start from 2 for comparisons - draft.colorIndex = draft.colorIndex ?? ensureColorIndex(id) - }) - }) - - // Save for next diff - prevCompareIdsRef.current = [...comparisonRunIds] - }, [baseRunId, comparisonRunIds.join(",")]) - - // Mount a data fetcher component for each comparison run - // This will trigger the same initialization and data loading as the main run - return ( - <> - {comparisonRunIds.map((runId) => ( - - ))} - - ) -}) - -ComparisonDataFetcher.displayName = "ComparisonDataFetcher" diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunOverviewViewer/assets/EvalRunOverviewViewerSkeleton.tsx b/web/oss/src/components/EvalRunDetails/components/EvalRunOverviewViewer/assets/EvalRunOverviewViewerSkeleton.tsx deleted file mode 100644 index 000dd3c312..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunOverviewViewer/assets/EvalRunOverviewViewerSkeleton.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import {memo} from "react" - -import clsx from "clsx" - -import EvalRunScoreTableSkeleton from "../../../AutoEvalRun/components/EvalRunScoreTable/assets/EvalRunScoreTableSkeleton" -import EvaluatorMetricsChartSkeleton from "../../../AutoEvalRun/components/EvaluatorMetricsChart/assets/EvaluatorMetricsChartSkeleton" - -const EvalRunOverviewViewerSkeleton = ({className}: {className?: string}) => { - return ( - <> -
    - -
    - -
    - {Array.from({length: 3}).map((_, index) => ( - - ))} -
    - - ) -} - -export default memo(EvalRunOverviewViewerSkeleton) diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunOverviewViewer/index.tsx b/web/oss/src/components/EvalRunDetails/components/EvalRunOverviewViewer/index.tsx deleted file mode 100644 index 7e9d39745d..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunOverviewViewer/index.tsx +++ /dev/null @@ -1,1241 +0,0 @@ -import {memo, useCallback, useMemo} from "react" - -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {atom, useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" -import {Area, CartesianGrid, Line, LineChart, ResponsiveContainer, XAxis, YAxis} from "recharts" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import { - evaluationEvaluatorsFamily, - evaluationRunStateFamily, - loadingStateAtom, - loadingStateFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import { - runMetricStatsFamily, - runMetricsFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import {canonicalizeMetricKey, getMetricValueWithAliases} from "@/oss/lib/metricUtils" - -import {formatMetricName} from "../../AutoEvalRun/assets/utils" -import {EVAL_COLOR} from "../../AutoEvalRun/assets/utils" -import EvalRunScoreTable from "../../AutoEvalRun/components/EvalRunScoreTable" -import EvaluatorMetricsChart from "../../AutoEvalRun/components/EvaluatorMetricsChart" -import EvaluatorMetricsTimeSeriesChart, { - PLACEHOLDER_LINE_COLOR, - PLACEHOLDER_TIME_SERIES, -} from "../../AutoEvalRun/components/EvaluatorMetricsChart/TimeSeriesChart" -import PlaceholderOverlay, { - PlaceholderEvaluationType, -} from "../../AutoEvalRun/components/shared/PlaceholderOverlay" -import SpiderChartPlaceholder from "../../AutoEvalRun/components/shared/SpiderChartPlaceholder" -import {evalTypeAtom} from "../../state/evalType" -import {urlStateAtom} from "../../state/urlState" -import { - collectEvaluatorIdentifiers, - collectMetricSchemasFromEvaluator, - deriveSchemaMetricType, - mergeEvaluatorRecords, - pickString, - toArray, -} from "../VirtualizedScenarioTable/assets/evaluatorSchemaUtils" - -import EvalRunOverviewViewerSkeleton from "./assets/EvalRunOverviewViewerSkeleton" - -const PlaceholderTimeSeriesBackdrop = () => ( - - - - { - const date = new Date(value) - return date.toLocaleTimeString([], {hour: "2-digit", minute: "2-digit"}) - }} - /> - - - - - - - - - - - - -) - -// Only evaluator metrics (slug-prefixed) should render in overview charts; skip invocation metrics. -const INVOCATION_METRIC_PREFIX = "attributes.ag." - -const toFiniteNumber = (value: unknown): number | undefined => - typeof value === "number" && Number.isFinite(value) ? value : undefined - -const getStatusCount = (meta: Record | undefined, keys: string[]): number => { - if (!meta) return 0 - const seen = new Set() - let total = 0 - keys.forEach((rawKey) => { - const key = typeof rawKey === "string" ? rawKey.trim() : "" - if (!key || seen.has(key)) return - const direct = toFiniteNumber(meta[key]) - if (direct !== undefined) { - total += direct - seen.add(key) - return - } - const summary = (meta?.statusSummary ?? {}) as Record - const summaryValue = toFiniteNumber(summary[key]) - if (summaryValue !== undefined) { - total += summaryValue - seen.add(key) - } - }) - return total -} - -const extractTimeSeriesValue = (rawValue: any): {value: number; isBoolean: boolean} | null => { - if (rawValue === null || rawValue === undefined) return null - - if (typeof rawValue === "number" && Number.isFinite(rawValue)) { - return {value: rawValue, isBoolean: false} - } - if (typeof rawValue === "boolean") { - return {value: rawValue ? 100 : 0, isBoolean: true} - } - - if (Array.isArray(rawValue) && rawValue.length) { - const numericValues = rawValue.filter((entry) => typeof entry === "number") - if (numericValues.length) { - const sum = numericValues.reduce((acc, num) => acc + num, 0) - return {value: sum / numericValues.length, isBoolean: false} - } - } - - if (rawValue && typeof rawValue === "object") { - if (typeof rawValue.mean === "number" && Number.isFinite(rawValue.mean)) { - return {value: rawValue.mean, isBoolean: false} - } - if (typeof rawValue.value === "number" && Number.isFinite(rawValue.value)) { - return {value: rawValue.value, isBoolean: false} - } - - const frequency = Array.isArray((rawValue as any).frequency) - ? (rawValue as any).frequency - : Array.isArray((rawValue as any).rank) - ? (rawValue as any).rank - : Array.isArray((rawValue as any).freq) - ? (rawValue as any).freq - : undefined - - const uniqueArr = Array.isArray((rawValue as any).unique) - ? (rawValue as any).unique - : Array.isArray((rawValue as any).uniq) - ? (rawValue as any).uniq - : undefined - - if (uniqueArr || frequency) { - const counts = frequency?.map((entry) => entry?.count ?? entry?.frequency ?? 0) ?? [] - const total = - typeof rawValue.count === "number" - ? rawValue.count - : counts.reduce((acc, v) => acc + v, 0) - - if (total > 0 && frequency) { - const trueEntry = frequency.find((entry) => entry?.value === true) - const trueCount = trueEntry ? (trueEntry.count ?? trueEntry.frequency ?? 0) : 0 - const pct = (trueCount / total) * 100 - const clamped = Math.max(0, Math.min(100, pct)) - return {value: clamped, isBoolean: true} - } - } - - if (Array.isArray(rawValue.distribution) && rawValue.distribution.length) { - const totalCount = rawValue.distribution.reduce( - (acc: number, entry: any) => acc + (entry?.count ?? 0), - 0, - ) - if (totalCount > 0) { - const sum = rawValue.distribution.reduce( - (acc: number, entry: any) => acc + (entry?.value ?? 0) * (entry?.count ?? 0), - 0, - ) - return {value: sum / totalCount, isBoolean: false} - } - } - } - - return null -} - -// Lightweight readers (mirrors what ScoreTable does) to fetch multiple runs' state/metrics -const runsStateFamily = atomFamily( - (runIds: string[]) => atom((get) => runIds.map((id) => get(evaluationRunStateFamily(id)))), - deepEqual, -) -const runsMetricsFamily = atomFamily( - (runIds: string[]) => - atom((get) => runIds.map((id) => ({id, metrics: get(runMetricStatsFamily({runId: id}))}))), - deepEqual, -) -const runsRawMetricsFamily = atomFamily( - (runIds: string[]) => - atom((get) => runIds.map((id) => ({id, metrics: get(runMetricsFamily(id))}))), - deepEqual, -) - -const EvalRunOverviewViewer = ({type = "auto"}: {type: "auto" | "online"}) => { - const runId = useRunId() - const urlState = useAtomValue(urlStateAtom) - const evalType = useAtomValue(evalTypeAtom) - const compareRunIds = urlState.compare - const isCompare = !!compareRunIds?.length - - const metrics = useAtomValue(runMetricStatsFamily({runId})) - const evaluators = useAtomValue(evaluationEvaluatorsFamily(runId)) - const loadingState = useAtomValue(loadingStateAtom) - const loadingStateFamilyData = useAtomValue(loadingStateFamily(runId)) - const allRunIds = useMemo( - () => [runId!, ...(compareRunIds || []).filter((id) => id && id !== runId)], - [runId, compareRunIds], - ) - const runs = useAtomValue(runsStateFamily(allRunIds)) - const metricsByRun = useAtomValue(runsMetricsFamily(allRunIds)) - const rawMetricsByRun = useAtomValue(runsRawMetricsFamily(allRunIds)) - - const evaluatorsBySlug = useMemo(() => { - const map = new Map() - const register = (entry: any, slug: string) => { - if (!entry || typeof entry !== "object") return - - if (!slug || map.has(slug)) return - map.set(slug, entry) - } - - runs.forEach((state) => { - const annotationSteps = state?.enrichedRun?.data?.steps?.filter( - (step) => step.type === "annotation", - ) - annotationSteps?.forEach((step) => { - toArray( - state?.enrichedRun?.evaluators?.filter( - (evaluator) => evaluator.id === step.references?.evaluator?.id, - ), - ).forEach((evaluator) => { - if (!evaluator) return - const originalKey = typeof step?.key === "string" ? step.key : undefined - const registerKey = (key?: string) => { - if (!key) return - register(evaluator, key) - } - registerKey(originalKey) - if (step.origin === "human" && originalKey) { - const parts = originalKey.split(".") - if (parts.length > 1) { - registerKey(parts[1]) - } - } - }) - }) - }) - - return Object.fromEntries(map.entries()) - }, [runs, evaluators]) - - const schemaMetricDefinitionsBySlug = useMemo(() => { - const map: Record = {} - Object.entries(evaluatorsBySlug).forEach(([slug, evaluator]) => { - const definitions = collectMetricSchemasFromEvaluator(evaluator) - .map(({name, schema}) => { - const trimmed = (name || "").trim() - if (!trimmed) return null - return {name: trimmed, type: deriveSchemaMetricType(schema)} - }) - .filter(Boolean) as {name: string; type?: string | string[]}[] - - const existing = map[slug] ?? [] - const merged = new Map() - existing.forEach((definition) => merged.set(definition.name, definition)) - definitions.forEach((definition) => merged.set(definition.name, definition)) - map[slug] = Array.from(merged.values()) - }) - return map - }, [evaluatorsBySlug]) - - const evaluatorMetricKeysBySlug = useMemo(() => { - const map: Record> = {} - Object.entries(schemaMetricDefinitionsBySlug).forEach(([slug, definitions]) => { - const set = new Set() - definitions.forEach(({name}) => { - const canonical = canonicalizeMetricKey(name) - set.add(name) - set.add(canonical) - const prefixed = `${slug}.${name}` - set.add(prefixed) - set.add(canonicalizeMetricKey(prefixed)) - }) - map[slug] = set - }) - return map - }, [schemaMetricDefinitionsBySlug]) - - const schemaMetricNamesBySlug = useMemo(() => { - const map: Record = {} - Object.entries(schemaMetricDefinitionsBySlug).forEach(([slug, definitions]) => { - const names = Array.from( - new Set( - definitions - .map((definition) => definition.name.trim()) - .filter((name) => name.length > 0), - ), - ) - if (map[slug]) { - const merged = new Set([...map[slug], ...names]) - map[slug] = Array.from(merged) - } else { - map[slug] = names - } - }) - return map - }, [schemaMetricDefinitionsBySlug]) - - const metricHasContent = (metric: Record | undefined): boolean => { - if (!metric || typeof metric !== "object") return false - if (typeof metric.mean === "number" && Number.isFinite(metric.mean)) return true - if (typeof metric.count === "number" && metric.count > 0) return true - - const distribution: any[] | undefined = Array.isArray((metric as any).distribution) - ? (metric as any).distribution - : undefined - if (distribution && distribution.some((bin) => Number(bin?.count ?? 0) > 0)) return true - - const hist = Array.isArray((metric as any).hist) ? (metric as any).hist : undefined - if (hist && hist.some((bin) => Number(bin?.count ?? bin?.frequency ?? 0) > 0)) return true - - const freq = Array.isArray((metric as any).frequency) - ? (metric as any).frequency - : Array.isArray((metric as any).rank) - ? (metric as any).rank - : undefined - if (freq && freq.some((entry) => Number(entry?.count ?? entry?.frequency ?? 0) > 0)) - return true - - const unique = (metric as any).unique - if (Array.isArray(unique) && unique.length > 0) { - // if we have unique values but no counts, treat as data only if mean exists - return typeof metric.mean === "number" - } - - return false - } - - const combinedMetricEntries = useMemo(() => { - const entries: { - fullKey: string - evaluatorSlug: string - metricKey: string - metric: Record - }[] = [] - const seen = new Set() - - const pushEntry = (rawKey: string, source: Record) => { - const canonical = canonicalizeMetricKey(rawKey) - if (canonical.startsWith(INVOCATION_METRIC_PREFIX)) return - if (!canonical.includes(".")) return - if (seen.has(canonical)) return - - const metric = - (getMetricValueWithAliases(source, canonical) as Record) || - (source?.[rawKey] as Record) - if (!metricHasContent(metric)) return - - const segments = canonical.split(".").filter(Boolean) - if (!segments.length) return - - const resolveSlugFromSegments = (): {slug: string; metricStartIdx: number} | null => { - let slugCandidate = segments[0] - let idx = 1 - while (idx <= segments.length) { - if (evaluatorsBySlug[slugCandidate]) { - return {slug: slugCandidate, metricStartIdx: idx} - } - if (idx >= segments.length) break - slugCandidate = `${slugCandidate}.${segments[idx]}` - idx += 1 - } - if (segments.length > 1 && evaluatorsBySlug[segments[1]]) { - return {slug: segments[1], metricStartIdx: 2} - } - return null - } - - const resolved = resolveSlugFromSegments() - if (!resolved) return - const {slug, metricStartIdx} = resolved - - const metricKeySegments = segments.slice(metricStartIdx) - const metricKey = - metricKeySegments.length > 0 - ? metricKeySegments.join(".") - : segments[metricStartIdx - 1] - - const evaluator = evaluatorsBySlug[slug] - if (!evaluator) { - return - } - - if (metricKey.startsWith("attributes.ag.metrics")) { - return - } - - const allowedKeys = evaluatorMetricKeysBySlug[slug] - if (allowedKeys && allowedKeys.size > 0) { - const segments = metricKey.split(".").filter(Boolean) - const candidateKeys = new Set([metricKey]) - segments.forEach((_, idx) => { - const prefix = segments.slice(0, idx + 1).join(".") - const suffix = segments.slice(idx).join(".") - if (prefix) candidateKeys.add(prefix) - if (suffix) candidateKeys.add(suffix) - const segment = segments[idx] - if (segment) candidateKeys.add(segment) - }) - const matchesDefinition = Array.from(candidateKeys).some((key) => - allowedKeys.has(key), - ) - if (!matchesDefinition) return - } - - entries.push({fullKey: canonical, evaluatorSlug: slug, metricKey, metric}) - seen.add(canonical) - } - - const baseMetrics = (metrics || {}) as Record - Object.keys(baseMetrics).forEach((fullKey) => { - pushEntry(fullKey, baseMetrics) - }) - - metricsByRun.forEach(({metrics: runMetrics}) => { - const scoped = (runMetrics || {}) as Record - Object.keys(scoped).forEach((fullKey) => { - pushEntry(fullKey, scoped) - }) - }) - - return entries - }, [metrics, metricsByRun, evaluatorsBySlug, evaluatorMetricKeysBySlug]) - - const evalById = useMemo(() => { - const map: Record = {} - runs.forEach((r) => (map[r.enrichedRun?.id || r.id] = r)) - return map - }, [runs]) - - const metricsLookup = useMemo(() => { - const map: Record> = {} - metricsByRun.forEach(({id, metrics}) => { - const source = (metrics || {}) as Record - const normalized: Record = {...source} - Object.keys(source || {}).forEach((rawKey) => { - const canonical = canonicalizeMetricKey(rawKey) - if (canonical !== rawKey && normalized[canonical] === undefined) { - normalized[canonical] = source[rawKey] - } - }) - map[id] = normalized - }) - return map - }, [metricsByRun]) - - const rawMetricsLookup = useMemo(() => { - const map: Record = {} - rawMetricsByRun.forEach(({id, metrics}) => { - map[id] = Array.isArray(metrics) ? metrics : [] - }) - return map - }, [rawMetricsByRun]) - - const hasMetrics = combinedMetricEntries.length > 0 - const isRefreshingMetrics = loadingStateFamilyData.isRefreshingMetrics - const shouldShowMetricsSkeleton = - loadingState.isLoadingMetrics || - (loadingStateFamilyData.isLoadingMetrics && (!isRefreshingMetrics || !hasMetrics)) - const evaluatorList = Object.values(evaluatorsBySlug) - const resolvedEvalType: PlaceholderEvaluationType = - evalType === "online" ? "online" : evalType === "human" ? "human" : "auto" - - const evaluatorKeysWithMetrics = useMemo(() => { - const set = new Set() - combinedMetricEntries.forEach(({evaluatorSlug}) => { - if (evaluatorSlug) set.add(evaluatorSlug) - }) - return set - }, [combinedMetricEntries]) - - const placeholderEvaluators = useMemo(() => { - return Object.entries(evaluatorsBySlug).filter(([slug, evaluator]) => { - return !evaluatorKeysWithMetrics.has(slug) - }) - }, [evaluatorList, evaluatorKeysWithMetrics]) - - const statusInsights = useMemo(() => { - let runsWithAnyOutcome = 0 - let runsWithSuccess = 0 - let hasAnyError = false - - runs.forEach((state) => { - if (!state) return - - const meta = (state.statusMeta ?? {}) as Record - const total = getStatusCount(meta, ["total"]) - const completed = getStatusCount(meta, ["completed"]) - const successCount = getStatusCount(meta, ["success"]) - const errorCount = getStatusCount(meta, ["error"]) + getStatusCount(meta, ["failed"]) - const cancelledCount = getStatusCount(meta, ["cancelled", "canceled"]) - const normalizedStatus = String( - (state.enrichedRun as any)?.status ?? (state.rawRun as any)?.status ?? "", - ).toLowerCase() - const runMarkedError = - normalizedStatus === "error" || - normalizedStatus === "failed" || - normalizedStatus === "failure" - - const encounteredError = - errorCount > 0 || - runMarkedError || - !!state?.isError?.run || - !!state?.isError?.metrics || - !!state?.isError?.scenarios - - const hasOutcome = - total > 0 || - completed > 0 || - successCount > 0 || - errorCount > 0 || - cancelledCount > 0 || - runMarkedError || - !!state?.isError?.run || - !!state?.isError?.metrics || - !!state?.isError?.scenarios || - Array.isArray(state?.scenarios) - - if (hasOutcome) { - runsWithAnyOutcome += 1 - } - - if (encounteredError) { - hasAnyError = true - } - - if (successCount > 0) { - runsWithSuccess += 1 - } - }) - - return {runsWithAnyOutcome, runsWithSuccess, hasAnyError} - }, [runs]) - - const {runsWithAnyOutcome, runsWithSuccess, hasAnyError} = statusInsights - const shouldShowErrorCopy = runsWithAnyOutcome > 0 && hasAnyError && runsWithSuccess === 0 - - const buildPlaceholderCopy = useCallback( - ( - context: "timeSeries" | "chart" | "empty", - options?: {metricName?: string; evaluatorLabel?: string}, - ) => { - const rawMetricName = options?.metricName?.trim() - const metricName = rawMetricName && rawMetricName.length ? rawMetricName : undefined - const rawEvaluatorLabel = options?.evaluatorLabel?.trim() - const evaluatorLabel = - rawEvaluatorLabel && rawEvaluatorLabel.length ? rawEvaluatorLabel : undefined - const evaluatorDisplay = evaluatorLabel ?? "this evaluator" - - if (shouldShowErrorCopy) { - if (context === "timeSeries") { - const traceLabel = metricName ? `${metricName} traces` : "traces" - return { - title: `${metricName ?? "Metric"} traces unavailable`, - description: `All executions ended in errors${ - evaluatorLabel ? ` for ${evaluatorDisplay}` : "" - }. Resolve the failures and rerun to see ${traceLabel}.`, - } - } - if (context === "chart") { - const resultLabel = metricName ? `${metricName} results` : "metric results" - return { - title: `${metricName ?? "Metric"} results unavailable`, - description: `All scenarios ended in errors${ - evaluatorLabel ? ` for ${evaluatorDisplay}` : "" - }. Resolve the failures and rerun to see ${resultLabel}.`, - } - } - return { - title: - resolvedEvalType === "online" - ? "Traces ended in error" - : "Evaluations ended in error", - description: `Every run finished with errors. Resolve the issues and rerun to see ${ - resolvedEvalType === "online" ? "new traces" : "metrics" - }.`, - } - } - - if (context === "timeSeries") { - const traceLabel = metricName ?? "metric" - const resultLabel = metricName ? `${metricName} results` : "results" - return { - title: `Waiting for ${traceLabel} traces`, - description: `Generate traces with ${evaluatorDisplay} to start collecting ${resultLabel}.`, - } - } - - if (context === "chart") { - const metricLabel = metricName ?? "metric" - const distributionLabel = metricName - ? `${metricName} distribution data` - : "distribution data" - return { - title: `Waiting for ${metricLabel} results`, - description: `Annotate your scenarios with ${evaluatorDisplay} to start seeing ${distributionLabel}.`, - } - } - - return { - title: - resolvedEvalType === "online" - ? "Waiting for your traces" - : "Waiting for evaluation runs", - description: - resolvedEvalType === "online" - ? "Generate traces to start collecting results." - : "Run your prompt against testcases to start collecting metrics.", - } - }, - [resolvedEvalType, shouldShowErrorCopy], - ) - - const scaffoldItems = useMemo(() => { - if (hasMetrics) return [] - if (!evaluatorList.length) - return [ - { - id: "placeholder", - label: "Awaiting evaluators", - }, - ] - return evaluatorList.map((ev: any, idx: number) => ({ - id: ev?.slug || `evaluator-${idx}`, - label: ev?.name || ev?.slug || "Evaluator", - })) - }, [hasMetrics, evaluatorList]) - - const getEvaluatorLabel = (ev: any) => ev?.name || ev?.slug || "this evaluator" - - const placeholderCards = useMemo(() => { - if (!placeholderEvaluators.length) return [] - - return placeholderEvaluators.flatMap((evaluator, idx) => { - const evaluatorKey = evaluator?.slug || evaluator?.id || `placeholder-${idx}` - const label = getEvaluatorLabel(evaluator) - const slug = evaluator?.slug - const metricKeys = slug ? (schemaMetricNamesBySlug[slug] ?? []) : [] - const uniqueMetricKeys = metricKeys.length - ? Array.from(new Set(metricKeys)) - : ["__metrics_pending__"] - - return uniqueMetricKeys.map((metricKey, metricIdx) => { - const formattedName = - metricKey === "__metrics_pending__" - ? "Metrics pending" - : formatMetricName(metricKey) - const copy = - type === "online" - ? buildPlaceholderCopy("timeSeries", { - metricName: formattedName, - evaluatorLabel: label, - }) - : buildPlaceholderCopy("chart", { - metricName: formattedName, - evaluatorLabel: label, - }) - if (type === "online") { - return ( - - ) - } - return ( - - ) - }) - }) - }, [ - buildPlaceholderCopy, - getEvaluatorLabel, - placeholderEvaluators, - resolvedEvalType, - schemaMetricNamesBySlug, - type, - ]) - - const emptyPlaceholder = useMemo(() => { - const copy = buildPlaceholderCopy("empty") - return ( -
    -
    - {resolvedEvalType === "online" ? ( - - ) : ( - - )} -
    - -
    - {copy.title} - {copy.description} - {scaffoldItems.length ? ( -
    - {scaffoldItems.map(({id, label}) => ( - - {label} - - ))} -
    - ) : null} -
    -
    -
    - ) - }, [buildPlaceholderCopy, resolvedEvalType, scaffoldItems]) - - if (shouldShowMetricsSkeleton) { - return ( - - ) - } - - return ( - <> -
    - -
    - -
    - {hasMetrics ? ( - <> - {combinedMetricEntries - .filter( - (entry) => - entry.metric?.type !== "string" && - entry.metric?.type !== "json", - ) - .map(({fullKey, metric, evaluatorSlug, metricKey}, idx) => { - if (!metric || !Object.keys(metric || {}).length) return null - - const isBooleanMetric = - Array.isArray(metric?.unique) && metric.unique.length > 0 - const chartWidthClass = - type === "online" - ? "w-full" - : "w-[calc(50%-0.3rem)] 2xl:w-[calc(33.33%-0.34rem)]" - - if (type === "online") { - const resolveEntryTimestamp = (entry: any): number | null => { - const rawTs = entry?.timestamp ?? null - if (typeof rawTs === "number") { - return Number.isFinite(rawTs) ? rawTs : null - } - if (typeof rawTs === "string" && rawTs.length) { - const parsed = new Date(rawTs).getTime() - return Number.isFinite(parsed) ? parsed : null - } - if (rawTs instanceof Date) { - const time = rawTs.getTime() - return Number.isFinite(time) ? time : null - } - return null - } - - const timeSeries = allRunIds - .map((id, i) => { - const state = evalById[id] - const compareIdx = state?.compareIndex || i + 1 - const entries = rawMetricsLookup[id] || [] - if (!entries.length) return null - const timestampedEntries = entries.filter( - (entry: any) => - resolveEntryTimestamp(entry) !== null, - ) - if (!timestampedEntries.length) return null - - const points = timestampedEntries - .map((entry: any) => { - const ts = resolveEntryTimestamp(entry) - if (ts == null) return null - - const source = entry?.data || {} - const isPlainObject = ( - v: unknown, - ): v is Record => - !!v && - typeof v === "object" && - !Array.isArray(v) - - const groupFlat: Record = {} - Object.entries(source || {}).forEach( - ([groupKey, groupVal]) => { - if (isPlainObject(groupVal)) { - Object.entries(groupVal).forEach( - ([innerKey, innerVal]) => { - groupFlat[ - `${groupKey}.${innerKey}` - ] = innerVal - }, - ) - } - }, - ) - - let rawValue = getMetricValueWithAliases( - source, - fullKey, - ) - - if (rawValue === undefined) { - const matchKey = Object.keys( - groupFlat, - ).find( - (k) => - k === fullKey || - k.endsWith(`.${fullKey}`), - ) - if (matchKey) rawValue = groupFlat[matchKey] - } - if (rawValue === undefined) return null - - const resolved = - extractTimeSeriesValue(rawValue) - - if (!resolved) return null - const {value, isBoolean: valueIsBoolean} = - resolved - - const percentiles = (() => { - if ( - !rawValue || - typeof rawValue !== "object" - ) - return {} - const pcts = (rawValue as any).pcts - if (!pcts || typeof pcts !== "object") - return {} - const read = (key: string) => { - const v = (pcts as Record)[ - key - ] - return typeof v === "number" && - Number.isFinite(v) - ? v - : undefined - } - return { - p25: read("p25") ?? read("P25"), - p50: read("p50") ?? read("P50"), - p75: read("p75") ?? read("P75"), - } - })() - - const scenarioCount = (() => { - let resolved: number | undefined - if ( - rawValue && - typeof rawValue === "object" - ) { - const countValue = (rawValue as any) - .count - const numericCount = Number(countValue) - if ( - Number.isFinite(numericCount) && - numericCount >= 0 - ) { - resolved = numericCount - } else { - const freq = Array.isArray( - (rawValue as any).frequency, - ) - ? (rawValue as any).frequency - : Array.isArray( - (rawValue as any).rank, - ) - ? (rawValue as any).rank - : undefined - if (freq) { - const total = freq.reduce( - (acc: number, item: any) => - acc + - Number( - item?.count ?? - item?.frequency ?? - 0, - ), - 0, - ) - if ( - Number.isFinite(total) && - total > 0 - ) { - resolved = total - } - } - } - } - if (resolved === undefined) { - const entryCount = Number(entry?.count) - if ( - Number.isFinite(entryCount) && - entryCount >= 0 - ) { - resolved = entryCount - } - } - if ( - resolved === undefined && - Array.isArray(entry?.scenario_ids) - ) { - resolved = entry.scenario_ids.length - } - if ( - resolved === undefined && - Array.isArray(entry?.scenarioIds) - ) { - resolved = entry.scenarioIds.length - } - return resolved - })() - - const histogram = (() => { - if ( - !rawValue || - typeof rawValue !== "object" - ) - return - const hist = (rawValue as any).hist - if (!Array.isArray(hist)) return - const bins = hist - .map((bin: any) => { - const interval = Array.isArray( - bin?.interval, - ) - ? bin.interval - : [] - const from = Number(interval?.[0]) - const to = Number(interval?.[1]) - let count = Number( - bin?.count ?? bin?.frequency, - ) - if ( - !Number.isFinite(from) || - !Number.isFinite(to) || - !Number.isFinite(count) - ) - return null - if ( - scenarioCount !== undefined && - scenarioCount > 1 && - count > 0 && - count <= 1 - ) { - count *= scenarioCount - } - return {from, to, count} - }) - .filter( - ( - bin, - ): bin is { - from: number - to: number - count: number - } => bin !== null, - ) - return bins.length ? bins : undefined - })() - - return { - timestamp: ts, - value, - isBoolean: valueIsBoolean, - scenarioCount, - p25: percentiles.p25, - p50: percentiles.p50, - p75: percentiles.p75, - histogram, - } - }) - .filter( - ( - point, - ): point is { - timestamp: number - value: number - isBoolean?: boolean - scenarioCount?: number - p25?: number - p50?: number - p75?: number - histogram?: { - from: number - to: number - count: number - }[] - } => point !== null, - ) - .sort((a, b) => a.timestamp - b.timestamp) - - if (!points.length) return null - - const containsBoolean = points.some((p) => p.isBoolean) - - return { - id, - name: - state?.enrichedRun?.name || - `Eval ${compareIdx}`, - color: (EVAL_COLOR as any)[compareIdx] || "#3B82F6", - points, - isBoolean: containsBoolean, - } - }) - .filter(Boolean) as { - id: string - name: string - color: string - points: { - timestamp: number - value: number - isBoolean?: boolean - scenarioCount?: number - p25?: number - p50?: number - p75?: number - histogram?: {from: number; to: number; count: number}[] - }[] - isBoolean?: boolean - }[] - - const isSeriesBoolean = - isBooleanMetric || - timeSeries.some((series) => series.isBoolean) - - if (timeSeries.length) { - const placeholderCopy = shouldShowErrorCopy - ? buildPlaceholderCopy("timeSeries", { - metricName: formatMetricName(metricKey), - evaluatorLabel: getEvaluatorLabel( - evaluatorsBySlug[evaluatorSlug], - ), - }) - : undefined - return ( - ({ - id: series.id, - name: series.name, - color: series.color, - points: series.points.map( - ({ - timestamp, - value, - scenarioCount, - p25, - p50, - p75, - histogram, - }) => ({ - timestamp, - value, - scenarioCount, - p25, - p50, - p75, - histogram, - }), - ), - }))} - placeholderTitle={placeholderCopy?.title} - placeholderDescription={ - placeholderCopy?.description - } - /> - ) - } - // fall through to histogram fallback when no time series data - } - - // Build comparison rows for this evaluator metric - const rowsWithMeta = isCompare - ? allRunIds.map((id, i) => { - const state = evalById[id] - const compareIdx = state?.compareIndex || i + 1 - const stats = metricsLookup[id] || {} - const m: any = getMetricValueWithAliases(stats, fullKey) - const hasMetric = !!m - let y = 0 - if (hasMetric) { - if (Array.isArray(m?.unique)) { - const trueEntry = ( - m?.frequency || - m?.rank || - [] - )?.find((f: any) => f?.value === true) - const total = m?.count ?? 0 - y = total - ? ((trueEntry?.count ?? 0) / total) * 100 - : 0 - } else if (typeof m?.mean === "number") { - y = m.mean - } - } - return { - id, - x: state?.enrichedRun?.name || `Eval ${compareIdx}`, - y, - hasMetric, - color: (EVAL_COLOR as any)[compareIdx] || "#3B82F6", - } - }) - : undefined - - const averageRows = rowsWithMeta - ?.filter((r) => r.hasMetric) - .map(({x, y, color}) => ({x, y, color})) - const summaryRows = rowsWithMeta?.map(({x, y, color}) => ({ - x, - y, - color, - })) - const hasMetricData = - rowsWithMeta?.some((row) => row.hasMetric) ?? false - - const placeholderCopy = shouldShowErrorCopy - ? buildPlaceholderCopy("chart", { - metricName: formatMetricName(metricKey), - evaluatorLabel: getEvaluatorLabel( - evaluatorsBySlug[evaluatorSlug], - ), - }) - : undefined - - return ( - - ) - })} - {placeholderCards.length ? placeholderCards : null} - - ) : placeholderCards.length ? ( - placeholderCards - ) : ( - emptyPlaceholder - )} -
    - - ) -} - -export default memo(EvalRunOverviewViewer) diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioNavigator/index.tsx b/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioNavigator/index.tsx deleted file mode 100644 index 108fdf7c04..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioNavigator/index.tsx +++ /dev/null @@ -1,308 +0,0 @@ -import {memo, ReactNode, useCallback, useEffect, useMemo, useState} from "react" - -import {message} from "@agenta/oss/src/components/AppMessageContext" -import {LeftOutlined, RightOutlined} from "@ant-design/icons" -import {Button, Input, Select, SelectProps} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" -import {loadable} from "jotai/utils" -import {useRouter} from "next/router" - -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {useRunId} from "@/oss/contexts/RunIdContext" -import useFocusInput from "@/oss/hooks/useFocusInput" -import {useEvalScenarioQueue} from "@/oss/lib/hooks/useEvalScenarioQueue" -import { - evalAtomStore, - // evaluationScenariosDisplayAtom, - getCurrentRunId, - scenarioStatusAtomFamily, - scenarioStatusFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import { - scenariosFamily, - displayedScenarioIdsFamily, - scenarioStepFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios" - -import {statusColorMap} from "../../HumanEvalRun/assets/helpers" -import EvalRunScenarioStatusTag from "../EvalRunScenarioStatusTag" - -const EvalRunScenarioNavigator = ({ - activeId, - className, - showOnlySelect = false, - querySelectorName = "scenarioId", - selectProps, - showStatus = true, - runId: propRunId, -}: { - activeId: string - className?: string - showOnlySelect?: boolean - querySelectorName?: string - selectProps?: SelectProps - showStatus?: boolean - runId?: string -}) => { - const router = useRouter() - const runId = useRunId() - const evalType = useAtomValue(evalTypeAtom) - const isOnlineEval = evalType === "online" - const labelPrefix = isOnlineEval ? "Scenario" : "Testcase" - - // Get effective runId - use provided runId or fallback to current run context - const effectiveRunId = useMemo(() => { - if (propRunId) return propRunId - if (runId) return runId - try { - return getCurrentRunId() - } catch (error) { - return "" - } - }, [runId, propRunId]) - - // Get full scenario objects so we can access stable scenarioIndex - // Read from the same global store that writes are going to - const allScenarios = useAtomValue(scenariosFamily(effectiveRunId)) ?? [] - - // Get filtered scenario IDs from the displayedScenarioIdsFamily atom - const filteredScenarioIds = useAtomValue(displayedScenarioIdsFamily(effectiveRunId)) ?? [] - - // states for select dropdown - const [searchTerm, setSearchTerm] = useState("") - const [isOpenSelect, setIsOpenSelect] = useState(false) - const {inputRef} = useFocusInput({isOpen: isOpenSelect}) - - // When user selects a scenario, update the URL - const handleSelect = useCallback( - (newId: string) => { - if (router.query[querySelectorName] !== newId) { - router.replace( - { - pathname: router.pathname, - query: {...router.query, [querySelectorName]: newId}, - }, - undefined, - {shallow: false}, - ) - } - }, - [router, querySelectorName], - ) - - // Create a map for quick lookup of scenario objects by ID - const scenarioMap = useMemo(() => { - const map = new Map() - allScenarios.forEach((scenario) => { - map.set(scenario.id || scenario._id, scenario) - }) - return map - }, [allScenarios]) - - // Get filtered scenarios with search term applied - const _scenarios = useMemo(() => { - const list = filteredScenarioIds - .map((id) => scenarioMap.get(id)) - .filter((scenario) => scenario) // Remove any undefined scenarios - .filter((scenario) => - scenario.scenarioIndex - ? scenario.scenarioIndex.toString().includes(searchTerm) - : true, - ) - - return list - }, [searchTerm, filteredScenarioIds, scenarioMap]) - - const scenarioIds = _scenarios.map((s) => s.id || s._id) - - const handlePrevNext = useCallback( - (direction: -1 | 1) => { - if (!activeId) return - const idx = scenarioIds.indexOf(activeId) - const newIdx = idx + direction - if (newIdx < 0 || newIdx >= scenarioIds.length) return - handleSelect(scenarioIds[newIdx]) - }, - [activeId, scenarioIds, handleSelect], - ) - - const prevDisabled = scenarioIds.indexOf(activeId) <= 0 - const nextDisabled = scenarioIds.indexOf(activeId) >= scenarioIds.length - 1 - - // Keyboard shortcuts: Left/Right for navigation, Meta+Enter/Ctrl+Enter for Run - const {enqueueScenario} = useEvalScenarioQueue({concurrency: 5}) - const status = useAtomValue( - useMemo( - () => scenarioStatusAtomFamily({scenarioId: activeId, runId: effectiveRunId}), - [activeId, effectiveRunId], - ), - ) as any - const rawStatus = status?.status - const isRunning = ["running", "EVALUATION_STARTED"].includes(rawStatus as string) - const isDone = [ - "done", - "success", - "EVALUATION_FINISHED", - "EVALUATION_FINISHED_WITH_ERRORS", - ].includes(rawStatus as string) - - useEffect(() => { - if (showOnlySelect) return - const onKeyDown = (e: KeyboardEvent) => { - if (e.target && (e.target as HTMLElement).tagName === "INPUT") return // don't hijack input fields - if (e.key === "ArrowLeft" && !prevDisabled) { - handlePrevNext(-1) - e.preventDefault() - } else if (e.key === "ArrowRight" && !nextDisabled) { - handlePrevNext(1) - e.preventDefault() - } else if ((e.metaKey || e.ctrlKey) && e.key === "Enter") { - // Access invocationParameters inline from atom store - const stepLoadable = evalAtomStore().get( - loadable(scenarioStepFamily({runId: effectiveRunId, scenarioId: activeId})), - ) - const hasInvocationParams = - stepLoadable.state === "hasData" && - stepLoadable.data?.invocationSteps?.some((st: any) => st.invocationParameters) - if (!isRunning && !isDone && hasInvocationParams && activeId) { - enqueueScenario(activeId) - } else if (!hasInvocationParams) { - message.success("This scenario has already been ran before") - } - } - } - window.addEventListener("keydown", onKeyDown) - return () => window.removeEventListener("keydown", onKeyDown) - }, [ - handlePrevNext, - prevDisabled, - nextDisabled, - activeId, - isRunning, - isDone, - enqueueScenario, - showOnlySelect, - ]) - - return ( -
    - {!showOnlySelect && ( - - )} -
    - setSearchTerm(e.target.value)} - /> - -
    - -
    {menu}
    -
    - )} - {...selectProps} - > - {_scenarios.map((scenario) => { - const {id, scenarioIndex} = scenario as any - - // non-hook read; never suspends - const loadableStatus = evalAtomStore().get( - loadable(scenarioStatusFamily({scenarioId: id, runId: effectiveRunId})), - ) - const scenStatus = - loadableStatus.state === "hasData" - ? loadableStatus.data - : {status: "pending", label: "Pending"} - - const colorClass = statusColorMap[scenStatus.status] - const labelIndex = scenarioIndex ?? scenarioIds.indexOf(id) + 1 - - return ( - -
    - - {labelPrefix} {labelIndex} - - {scenStatus.status} -
    -
    - ) - })} - - - {activeId && showStatus ? ( - - ) : null} -
    - - {!showOnlySelect && ( - - )} - - ) -} - -export default memo(EvalRunScenarioNavigator) diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets/index.tsx b/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets/index.tsx deleted file mode 100644 index 2b87a19431..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/assets/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -export const STATUS_COLOR: Record = { - success: "success", - done: "success", - failure: "error", - failed: "error", - EVALUATION_FAILED: "error", - EVALUATION_FINISHED_WITH_ERRORS: "warning", - cancelled: "warning", - EVALUATION_AGGREGATION_FAILED: "warning", - pending: "default", - EVALUATION_INITIALIZED: "default", - running: "blue", - incomplete: "blue", - EVALUATION_STARTED: "blue", - revalidating: "purple", -} - -export const STATUS_COLOR_TEXT: Record = { - success: "text-green-600", - done: "text-green-600", - failure: "text-red-500", - failed: "text-red-500", - EVALUATION_FAILED: "text-red-500", - EVALUATION_FINISHED_WITH_ERRORS: "text-orange-500", - cancelled: "text-yellow-500", - EVALUATION_AGGREGATION_FAILED: "text-orange-500", - pending: "text-gray-400", - EVALUATION_INITIALIZED: "text-gray-400", - running: "text-blue-500", - EVALUATION_STARTED: "text-blue-500", - revalidating: "text-purple-500", -} diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/index.tsx b/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/index.tsx deleted file mode 100644 index 365c6cbe47..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunScenarioStatusTag/index.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import {memo, useMemo} from "react" - -import {Tag} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" -import {loadable} from "jotai/utils" - -import {getStatusLabel} from "@/oss/lib/constants/statusLabels" -import {scenarioStatusFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" - -import {STATUS_COLOR, STATUS_COLOR_TEXT} from "./assets" -/** - * Component to display the status of an evaluation scenario as a Tag. - * - * Retrieves the optimistic scenario overrides for the given scenarioId, - * and uses them to show transient UI-only states like "annotating" or - * "revalidating" if the backend has not yet been updated. - * - * @param scenarioId The ID of the scenario to display the status for. - * @returns A Tag component displaying the status of the scenario. - */ -interface EvalRunScenarioStatusTagProps { - scenarioId: string - runId: string - className?: string - showAsTag?: boolean -} - -const EvalRunScenarioStatusTag = ({ - scenarioId, - runId, - className, - showAsTag = true, -}: EvalRunScenarioStatusTagProps) => { - /** - * Loadable atom wrapping scenarioStatusFamily, which provides the most - * up-to-date status for the given scenarioId. This can be either a status - * that is being optimistically updated, or the latest status update from - * the backend. - * - * @type {import("jotai/utils").Loadable} - */ - const statusLoadable = useAtomValue( - useMemo(() => loadable(scenarioStatusFamily({scenarioId, runId})), [scenarioId, runId]), - ) - const scenarioStatus = statusLoadable.state === "hasData" ? statusLoadable.data : undefined - const status = (scenarioStatus?.status as string) || "pending" - const label = getStatusLabel(status) - - return showAsTag ? ( - - {label} - - ) : ( - - {label} - - ) -} - -export default memo(EvalRunScenarioStatusTag) diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/assets/constants.ts b/web/oss/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/assets/constants.ts deleted file mode 100644 index d24203d677..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/assets/constants.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Feature flag to toggle prototype card (list) view -export const ENABLE_CARD_VIEW = process.env.NEXT_PUBLIC_ENABLE_EVAL_CARD_VIEW === "true" - -export const VIEW_HUMAN_OPTIONS = (() => { - const base = [ - {label: "Focus view", value: "focus"}, - {label: "Table view", value: "table"}, - {label: "Results view", value: "results"}, - ] - if (ENABLE_CARD_VIEW) { - base.splice(1, 0, {label: "Card view", value: "list"}) - } - return base -})() - -export const VIEW_AUTO_OPTIONS = [ - {label: "Overview", value: "overview"}, - {label: "Testcases", value: "testcases"}, - {label: "Prompt configuration", value: "prompt"}, -] - -export const VIEW_ONLINE_OPTIONS = [ - {label: "Overview", value: "overview"}, - {label: "Results", value: "results"}, - {label: "Configuration", value: "configuration"}, -] diff --git a/web/oss/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/index.tsx b/web/oss/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/index.tsx deleted file mode 100644 index 8f34b80915..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/EvalRunScenariosViewSelector/index.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import {memo, useTransition} from "react" - -import {Radio} from "antd" -import {useAtomValue} from "jotai" -import {useRouter} from "next/router" - -import {evalTypeAtom} from "../../state/evalType" -import {runViewTypeAtom} from "../../state/urlState" - -import { - ENABLE_CARD_VIEW, - VIEW_HUMAN_OPTIONS, - VIEW_AUTO_OPTIONS, - VIEW_ONLINE_OPTIONS, -} from "./assets/constants" - -const EvalRunScenariosViewSelector = () => { - const evalType = useAtomValue(evalTypeAtom) - // Read from the same global store that writes are going to - const viewType = useAtomValue(runViewTypeAtom) - const [_isPending, startTransition] = useTransition() - - const router = useRouter() - - // Sync local atom from urlStateAtom changes - return ( -
    - { - const v = e.target.value as - | "focus" - | "list" - | "table" - | "overview" - | "testcases" - | "prompt" - | "results" - | "configuration" - startTransition(() => { - // Update router query so UrlSync can mirror it into atoms - const nextQuery: Record = {...router.query, view: v} - if (v !== "focus") { - delete nextQuery.scenarioId - } - router.replace({pathname: router.pathname, query: nextQuery}, undefined, { - shallow: true, - }) - }) - }} - defaultValue={evalType === "online" ? "results" : "focus"} - value={ENABLE_CARD_VIEW ? viewType : viewType === "list" ? "focus" : viewType} - > - {(evalType === "human" - ? VIEW_HUMAN_OPTIONS - : evalType === "online" - ? VIEW_ONLINE_OPTIONS - : VIEW_AUTO_OPTIONS - ).map((option) => ( - - {option.label} - - ))} - -
    - ) -} - -export default memo(EvalRunScenariosViewSelector) diff --git a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/types.ts b/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/types.ts deleted file mode 100644 index c68d8a5cbc..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/assets/types.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {ModalProps} from "antd" - -import {TooltipButtonProps} from "@/oss/components/Playground/assets/EnhancedButton" -import {EvaluationFlow, EvaluationScenario} from "@/oss/lib/Types" - -export interface EvaluationRow extends EvaluationScenario, Record { - evaluationFlow: EvaluationFlow -} - -export interface SaveDataModalProps extends ModalProps { - rows: EvaluationRow[] - exportDataset?: boolean - name?: string -} - -export interface SaveDataModalContentProps { - rows: EvaluationRow[] - rowKeys: string[] - exportDataset?: boolean - name: string - setName: React.Dispatch> - isOpen: boolean - selectedColumns: string[] - setSelectedColumns: React.Dispatch> -} - -export interface SaveDataButtonProps extends TooltipButtonProps { - rows: EvaluationRow[] - exportDataset?: boolean - name?: string - icon?: boolean - children?: React.ReactNode - label?: string -} diff --git a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/index.tsx b/web/oss/src/components/EvalRunDetails/components/SaveDataModal/index.tsx deleted file mode 100644 index b3c13a3c81..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/SaveDataModal/index.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import {useCallback, useEffect, useState} from "react" - -import {message} from "antd" -import dynamic from "next/dynamic" - -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" -import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" -import {createNewTestset} from "@/oss/services/testsets/api" - -import {SaveDataModalProps} from "./assets/types" - -const SaveDataModalContent = dynamic(() => import("./assets/SaveDataModalContent"), {ssr: false}) - -const SaveDataModal = ({rows, exportDataset = false, name, ...props}: SaveDataModalProps) => { - const [submitLoading, setSubmitLoading] = useState(false) - const [_name, setName] = useState(name || "") - const [selectedColumns, setSelectedColumns] = useState([]) - - const getKeys = useCallback(() => { - const keys = new Set() - rows.forEach((row) => { - Object.keys(row).forEach((key) => keys.add(key)) - }) - return Array.from(keys) - }, [rows]) - - useEffect(() => { - setName(name || "") - setSelectedColumns(getKeys()) - }, [rows, name]) - - const reset = useCallback(() => { - setName("") - setSelectedColumns([]) - setSubmitLoading(false) - }, []) - - const onClose = useCallback(() => { - reset() - props.onCancel?.({} as any) - }, [props]) - - const onSaveTestset = useCallback(async () => { - try { - setSubmitLoading(true) - - const filteredRows = rows.map((row) => { - const filteredRow: any = {} - Object.keys(row).forEach((key) => { - if (selectedColumns.includes(key)) { - filteredRow[key] = row[key] - } - }) - return filteredRow - }) - - await createNewTestset(_name, filteredRows) - - message.success("Testset created successfully!") - onClose() - } catch (error) { - console.error("Error creating testset:", error) - message.error("Failed to create testset. Please try again!") - } finally { - setSubmitLoading(false) - } - }, [rows, _name, selectedColumns, onClose]) - - const onExportResults = useCallback(async () => { - try { - setSubmitLoading(true) - const filteredRows = rows.map((row) => { - const filteredRow: any = {} - Object.keys(row).forEach((key) => { - if (selectedColumns.includes(key)) { - filteredRow[key] = row[key] - } - }) - return filteredRow - }) - - const csvData = convertToCsv(filteredRows, selectedColumns) - downloadCsv(csvData, _name) - message.success("Results exported successfully!") - onClose() - } catch (error) { - console.error("Error exporting results:", error) - message.error("Error exporting results") - } finally { - setSubmitLoading(false) - } - }, [rows, selectedColumns, onClose, _name]) - - return ( - - - - ) -} - -export default SaveDataModal diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/ComparisonScenarioTable.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/ComparisonScenarioTable.tsx deleted file mode 100644 index d2907fe44a..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/ComparisonScenarioTable.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import {RefObject, useEffect, useMemo} from "react" - -import {DownOutlined} from "@ant-design/icons" -import clsx from "clsx" -import {atom, useAtom, useAtomValue} from "jotai" -import {useResizeObserver} from "usehooks-ts" - -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import {useRunId} from "@/oss/contexts/RunIdContext" - -import {EVAL_BG_COLOR} from "../../AutoEvalRun/assets/utils" -import {EvalRunTestcaseTableSkeleton} from "../../AutoEvalRun/components/EvalRunTestcaseViewer/assets/EvalRunTestcaseViewerSkeleton" -import {urlStateAtom} from "../../state/urlState" - -import useExpandableComparisonDataSource from "./hooks/useExpandableComparisonDataSource" -import useScrollToScenario from "./hooks/useScrollToScenario" - -export const expendedRowAtom = atom>({}) - -const ComparisonTable = () => { - const baseRunId = useRunId() - const urlState = useAtomValue(urlStateAtom) - const [expendedRows, setExpendedRows] = useAtom(expendedRowAtom) - const comparisonRunIds = urlState.compare || [] - - // Use the new expandable comparison data source - const { - antColumns: columns, - rows: dataSource, - loading, - } = useExpandableComparisonDataSource({ - baseRunId, - comparisonRunIds, - }) - - const expandedRowKeys = useMemo( - () => Object.keys(expendedRows).filter((key) => expendedRows[key]), - [expendedRows], - ) - - useEffect(() => { - if (!dataSource?.length) return - - setExpendedRows((prev) => { - const next = {...prev} - let changed = false - const availableKeys = new Set() - - dataSource.forEach((row: any) => { - if (!row?.key) return - availableKeys.add(row.key) - - if (row.children?.length && prev[row.key] === undefined) { - next[row.key] = true - changed = true - } - }) - - Object.keys(next).forEach((key) => { - if (!availableKeys.has(key)) { - delete next[key] - changed = true - } - }) - - return changed ? next : prev - }) - }, [dataSource]) - - const {tableContainerRef, tableInstance} = useScrollToScenario({ - dataSource, - expandedRowKeys, - }) - - const {height: scrollY} = useResizeObserver({ - ref: tableContainerRef as RefObject, - box: "border-box", - }) - - if (!baseRunId || !comparisonRunIds.length) { - return ( -
    -
    Please select runs to compare
    -
    - ) - } - - if (loading || !EnhancedTable) { - return - } - - return ( -
    -
    - record.key || record.scenarioId} - className="comparison-table agenta-scenario-table" - addNotAvailableCell={false} - skeletonRowCount={0} - loading={false} - tableLayout="fixed" - onRow={(record) => ({ - style: - (record?.colorIndex ?? record?.compareIndex) - ? { - background: - EVAL_BG_COLOR[record.colorIndex || record.compareIndex], - } - : undefined, - onClick: (event) => { - const target = event.target as HTMLElement - const isFirstCell = target.closest(".scenario-index-row-cell") - - if (isFirstCell && record.children?.length > 0) { - const isExpanded = expendedRows[record.key] - if (isExpanded) { - setExpendedRows((prev) => ({ - ...prev, - [record.key]: false, - })) - } else { - setExpendedRows((prev) => ({ - ...prev, - [record.key]: true, - })) - } - } - }, - })} - expandable={{ - expandedRowKeys, - rowExpandable: (record: any) => record.children?.length > 0, - expandRowByClick: false, - expandedRowOffset: 1, - showExpandColumn: true, // Hide default expand column since we have custom one - indentSize: 0, - expandIcon: ({expanded, record, ...rest}) => { - if (!columns.find((col) => col.key === "#")?.key) return null - const showIndex = !record.isComparison - return ( -
    - {showIndex && {record.scenarioIndex}} - {record.children?.length > 0 ? ( -
    - -
    - ) : null} -
    - ) - }, - }} - /> -
    -
    - ) -} - -export default ComparisonTable diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/ScenarioTable.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/ScenarioTable.tsx deleted file mode 100644 index 1291ddaaec..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/ScenarioTable.tsx +++ /dev/null @@ -1,257 +0,0 @@ -import {memo, useCallback, useEffect, useMemo, useState} from "react" - -import clsx from "clsx" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" -import {useResizeObserver} from "usehooks-ts" - -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import QueryFiltersSummaryCard from "@/oss/components/pages/evaluations/onlineEvaluation/components/QueryFiltersSummaryCard" -import {useRunId} from "@/oss/contexts/RunIdContext" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import { - evalAtomStore, - evaluationRunStateFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {useAppNavigation, useAppState} from "@/oss/state/appState" - -import { - retrieveQueryRevision, - type QueryFilteringPayload, - type QueryWindowingPayload, -} from "../../../../services/onlineEvaluations/api" -import {EvalRunTestcaseTableSkeleton} from "../../AutoEvalRun/components/EvalRunTestcaseViewer/assets/EvalRunTestcaseViewerSkeleton" - -import useScrollToScenario from "./hooks/useScrollToScenario" -import useTableDataSource from "./hooks/useTableDataSource" -import type {TableRow} from "./types" - -const VirtualizedScenarioTableAnnotateDrawer = dynamic( - () => import("./assets/VirtualizedScenarioTableAnnotateDrawer"), - {ssr: false}, -) - -const ScenarioTable = ({runId: propRunId}: {runId?: string}) => { - // Data sources - use prop runId if provided, otherwise fall back to context - const contextRunId = useRunId() - const runId = propRunId || contextRunId - const {antColumns, rows, isLoadingSteps} = useTableDataSource() - const hasRows = rows.length > 0 - const store = evalAtomStore() - const evaluationState = useAtomValue(evaluationRunStateFamily(runId!), {store}) as any - const evalType = useAtomValue(evalTypeAtom) - const navigation = useAppNavigation() - const appState = useAppState() - - const runIndex = evaluationState?.runIndex - const queryRef = useMemo(() => { - const steps: Record = runIndex?.steps || {} - for (const meta of Object.values(steps)) { - const refs = (meta as any)?.refs || {} - if (refs?.query?.id) return {id: refs.query.id} - if (refs?.query_revision?.id) return {revisionId: refs.query_revision.id} - } - return undefined - }, [runIndex?.steps]) - - const [filtering, setFiltering] = useState(undefined) - const [windowing, setWindowing] = useState(undefined) - const [filtersLoading, setFiltersLoading] = useState(false) - const [queryCreatedAt, setQueryCreatedAt] = useState(null) - - const resolveTimestamp = ( - ...values: (string | number | null | undefined)[] - ): string | number | null => { - for (const value of values) { - if (!value) continue - const parsed = dayjs(value) - if (parsed.isValid()) return value - } - return null - } - - useEffect(() => { - let mounted = true - ;(async () => { - try { - setFiltersLoading(true) - if (!queryRef?.id) { - if (mounted) setFiltering(null) - if (mounted) setWindowing(null) - if (mounted) setQueryCreatedAt(null) - if (mounted) setFiltersLoading(false) - return - } - const res = await retrieveQueryRevision({query_ref: {id: queryRef.id}}) - if (mounted) { - const data = (res?.query_revision?.data as any) ?? {} - setFiltering(data?.filtering ?? null) - setWindowing(data?.windowing ?? null) - setQueryCreatedAt( - resolveTimestamp( - (res?.query_revision as any)?.created_at, - (res?.query_revision as any)?.createdAt, - (res?.query_revision as any)?.createdAtTimestamp, - (res?.query_revision?.meta as any)?.created_at, - (res?.query_revision?.meta as any)?.createdAt, - ), - ) - } - } catch { - if (mounted) { - setFiltering(null) - setWindowing(null) - setQueryCreatedAt(null) - } - } finally { - if (mounted) setFiltersLoading(false) - } - })() - return () => { - mounted = false - } - }, [queryRef?.id]) - - const runCreatedAt = useMemo( - () => - resolveTimestamp( - queryCreatedAt, - (evaluationState?.rawRun as any)?.created_at, - (evaluationState?.rawRun as any)?.createdAt, - (evaluationState?.rawRun as any)?.createdAtTimestamp, - (evaluationState?.enrichedRun as any)?.created_at, - (evaluationState?.enrichedRun as any)?.createdAt, - (evaluationState?.enrichedRun as any)?.createdAtTimestamp, - ), - [queryCreatedAt, evaluationState], - ) - - const {tableContainerRef, tableInstance} = useScrollToScenario({ - dataSource: rows, - }) - - const {height: scrollY} = useResizeObserver({ - ref: tableContainerRef, - box: "border-box", - }) - - const emptyTableContent = useMemo(() => { - const isOnline = evalType === "online" - return ( -
    -
    - - {isOnline ? "No traces captured yet" : "No scenarios found"} - - {isOnline && ( - - No traces matched the current query yet. This view updates automatically - as new requests match your filters. - - )} -
    - {isOnline && ( -
    - -
    - )} -
    - ) - }, [evalType, filtering, filtersLoading, runCreatedAt, windowing]) - - const tableScrollY = useMemo(() => { - if (!scrollY) return undefined - const computed = scrollY - 45 - return Number.isFinite(computed) && computed > 0 ? computed : undefined - }, [scrollY]) - - const handleRowFocus = useCallback( - (record: TableRow, event: React.MouseEvent) => { - if (evalType !== "auto" && evalType !== "online" && evalType !== "custom") return - - // Ignore clicks originating from interactive elements inside the row - const interactiveTarget = (event.target as HTMLElement | null)?.closest( - "button, a, [role='button'], .ant-btn", - ) - if (interactiveTarget) return - - const scenarioId = record?.scenarioId || record?.key - const targetRunId = (record as any)?.runId || runId - if (!scenarioId || !targetRunId) return - - const currentScenario = appState.query?.focusScenarioId - const currentRun = appState.query?.focusRunId - const scenarioMatches = Array.isArray(currentScenario) - ? currentScenario[0] === scenarioId - : currentScenario === scenarioId - const runMatches = Array.isArray(currentRun) - ? currentRun[0] === targetRunId - : currentRun === targetRunId - - if (scenarioMatches && runMatches) return - - navigation.patchQuery( - { - focusScenarioId: scenarioId, - focusRunId: targetRunId, - }, - {shallow: true}, - ) - }, - [appState.query?.focusRunId, appState.query?.focusScenarioId, evalType, navigation, runId], - ) - - if (isLoadingSteps && !hasRows) { - return - } - - return ( -
    -
    - record.key || record.scenarioId} - className="agenta-scenario-table" - rowClassName={(record: any) => - clsx( - "scenario-row", - record?.temporalGroupIndex % 2 === 0 ? "bg-slate-50" : "bg-white", - record?.isTemporalGroupStart && - "border-t border-slate-200 first:border-t-0", - ) - } - tableLayout="fixed" - skeletonRowCount={0} - loading={false} - locale={{emptyText: emptyTableContent}} - ref={tableInstance} - onRow={(record: any) => ({ - onClick: (event) => handleRowFocus(record, event), - })} - /> - - -
    -
    - ) -} - -export default memo(ScenarioTable) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ActionCell.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ActionCell.tsx deleted file mode 100644 index 94f333a72e..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ActionCell.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import {memo, useCallback} from "react" - -import {Button, Spin} from "antd" -import {getDefaultStore} from "jotai" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import {virtualScenarioTableAnnotateDrawerAtom} from "@/oss/lib/atoms/virtualTable" - -// Use EE run-scoped versions for multi-run support -import { - hasScenarioStepData, - useScenarioStepSnapshot, -} from "../../../../../lib/hooks/useEvaluationRunData/useScenarioStepSnapshot" -import RunEvalScenarioButton from "../../../HumanEvalRun/components/RunEvalScenarioButton" - -import {CellWrapper} from "./CellComponents" - -/** - * Shared action-cell renderer for the Scenario tables (OSS & EE). - * Shows either a "Run" button (if scenario hasn't been executed) or an "Annotate" action. - */ -const ActionCell = ({scenarioId, runId: propRunId}: {scenarioId: string; runId?: string}) => { - const store = getDefaultStore() - const contextRunId = useRunId() - const effectiveRunId = propRunId || contextRunId - - const {data: stepData} = useScenarioStepSnapshot(scenarioId, effectiveRunId) - - const openAnnotateDrawer = useCallback(() => { - store.set(virtualScenarioTableAnnotateDrawerAtom, { - open: true, - scenarioId, - runId: effectiveRunId, // Include runId for multi-run support - }) - }, [scenarioId, effectiveRunId, store]) - - if (!effectiveRunId || !hasScenarioStepData(stepData)) { - return ( - - - - ) - } - - const invocationArr: any[] = stepData?.invocationSteps || [] - - const allSuccess = - invocationArr.length > 0 && invocationArr.every((s) => s.status === "success") - - // first step that still has parameters to run - const firstStepKey = invocationArr.find((s: any) => s.invocationParameters)?.stepKey - - if (!allSuccess) { - return ( - - - - ) - } - - return ( - - - - ) -} - -export default memo(ActionCell) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents.tsx deleted file mode 100644 index fa0aef82a1..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents.tsx +++ /dev/null @@ -1,892 +0,0 @@ -import {HTMLProps, ReactNode, memo, useMemo} from "react" - -import {ArrowsOut} from "@phosphor-icons/react" -import {Skeleton} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" - -import TooltipButton from "@/oss/components/Playground/assets/EnhancedButton" -import {Expandable} from "@/oss/components/Tables/ExpandableCell" -import {useOptionalRunId, useRunId} from "@/oss/contexts/RunIdContext" -import {useInvocationResult} from "@/oss/lib/hooks/useInvocationResult" -import {resolvePath} from "@/oss/lib/evalRunner/pureEnrichment" -import {useAppNavigation, useAppState} from "@/oss/state/appState" - -import { - hasScenarioStepData, - useScenarioStepSnapshot, -} from "../../../../../lib/hooks/useEvaluationRunData/useScenarioStepSnapshot" -import {renderChatMessages} from "../../../assets/renderChatMessages" -import {evalTypeAtom} from "../../../state/evalType" -import {TableRow} from "../types" - -import {titleCase} from "./flatDataSourceBuilder" -const GenerationResultUtils = dynamic( - () => - import( - "@agenta/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils" - ), - {ssr: false, loading: () =>
    }, -) -const WRAPPER_KEYS = new Set([ - "inputs", - "input", - "data", - "result", - "attribute", - "attributes", - "payload", - "request", - "requestBody", - "body", - "value", -]) - -const tryParseJson = (value: any) => { - if (typeof value !== "string") return value - try { - return JSON.parse(value) - } catch { - return value - } -} - -const unwrapForDisplay = (value: any, preferredKeys: string[] = []): any => { - if (value == null) return value - const normalized = tryParseJson(value) - if (normalized !== value) return unwrapForDisplay(normalized, preferredKeys) - if (Array.isArray(value)) return value - if (typeof value !== "object") return value - if (Array.isArray(value)) return value - if (typeof value !== "object") return value - - for (const key of preferredKeys) { - if (value && Object.prototype.hasOwnProperty.call(value, key)) { - return unwrapForDisplay(value[key], preferredKeys) - } - } - - const entries = Object.entries(value ?? {}) - if (entries.length === 1) { - const [key, nested] = entries[0] - if (WRAPPER_KEYS.has(key)) { - return unwrapForDisplay(nested, preferredKeys) - } - } - return value -} - -const formatPrimitiveValue = (value: any): string => { - if (value == null) return "" - if (typeof value === "string") return value - if (typeof value === "number" || typeof value === "boolean") return String(value) - if (Array.isArray(value)) { - return value - .map((item) => formatPrimitiveValue(unwrapForDisplay(item))) - .filter(Boolean) - .join("\n") - } - if (typeof value === "object") { - return Object.entries(value) - .map(([key, nested]) => { - const formatted = formatPrimitiveValue(unwrapForDisplay(nested)) - if (!formatted) return "" - return `${titleCase(key)}: ${formatted}` - }) - .filter(Boolean) - .join("\n") - } - return String(value) -} - -const stringifyOnlineValue = (value: any, depth = 0): string => { - const unwrapped = unwrapForDisplay(value) - if (unwrapped == null) return "" - if (typeof unwrapped === "string") return unwrapped - if (typeof unwrapped === "number" || typeof unwrapped === "boolean") return String(unwrapped) - if (Array.isArray(unwrapped)) { - return unwrapped - .map((item) => stringifyOnlineValue(item, depth)) - .filter(Boolean) - .join(depth === 0 ? "\n" : ", ") - } - if (typeof unwrapped === "object") { - const entries = Object.entries(unwrapped) - if (!entries.length) return "" - return entries - .map(([key, nested]) => { - const rendered = stringifyOnlineValue(nested, depth + 1) - if (!rendered) return "" - return depth === 0 ? rendered : `${titleCase(key)}: ${rendered}` - }) - .filter(Boolean) - .join(depth === 0 ? "\n" : ", ") - } - return String(unwrapped) -} - -const isChatMessage = (entry: any) => - entry && typeof entry === "object" && "role" in entry && "content" in entry - -const buildOnlineInputItems = ( - value: any, -): {label?: string; value?: string; chat?: ReactNode[]}[] => { - const unwrapped = unwrapForDisplay(value, ["inputs", "input", "data", "requestBody", "body"]) - if (unwrapped == null) return [] - if (Array.isArray(unwrapped) && unwrapped.every(isChatMessage)) { - return [ - { - label: "Messages", - chat: renderChatMessages({ - keyPrefix: "input", - rawJson: JSON.stringify(unwrapped), - view: "table", - }), - }, - ] - } - if (typeof unwrapped !== "object" || Array.isArray(unwrapped)) { - const valueStr = stringifyOnlineValue(unwrapped, 0) - return valueStr ? [{value: valueStr}] : [] - } - - return Object.entries(unwrapped) - .map(([key, nested]) => { - if (isChatMessage(nested)) { - return { - label: titleCase(key), - chat: renderChatMessages({ - keyPrefix: `input-${key}`, - rawJson: JSON.stringify([nested]), - view: "table", - }), - } - } - if (Array.isArray(nested) && nested.every(isChatMessage)) { - return { - label: titleCase(key), - chat: renderChatMessages({ - keyPrefix: `input-${key}`, - rawJson: JSON.stringify(nested), - view: "table", - }), - } - } - const rendered = stringifyOnlineValue(nested, 0) - if (!rendered) return null - const label = titleCase(key) - const sanitized = rendered.startsWith(`${label}: `) - ? rendered.slice(label.length + 2) - : rendered - return {label, value: sanitized} - }) - .filter(Boolean) as {label?: string; value?: string; chat?: ReactNode[]}[] -} - -const buildOnlineOutput = ( - rawValue: any, - fallback: any, - keyPrefix: string, -): {text?: string; chat?: ReactNode[]} => { - const candidates = [rawValue, fallback] - for (const candidate of candidates) { - if (candidate == null) continue - const parsed = unwrapForDisplay(candidate, ["outputs", "output", "response", "text"]) - if (Array.isArray(parsed) && parsed.every(isChatMessage)) { - return { - chat: renderChatMessages({ - keyPrefix, - rawJson: JSON.stringify(parsed), - view: "table", - }), - } - } - if (parsed && typeof parsed === "object" && isChatMessage(parsed)) { - return { - chat: renderChatMessages({ - keyPrefix, - rawJson: JSON.stringify([parsed]), - view: "table", - }), - } - } - const formatted = formatPrimitiveValue(parsed) - if (formatted) { - return {text: formatted} - } - } - return {text: formatPrimitiveValue(fallback)} -} - -export const CellWrapper = memo( - ({children, className, style, ...rest}: HTMLProps) => { - return ( -
    - {children} -
    - ) - }, -) - -export const InputCell = memo( - ({ - scenarioId, - inputKey, - stepKey, - showEditor = true, - disableExpand = false, - runId, - }: { - scenarioId: string - inputKey: string - stepKey?: string - showEditor?: boolean - disableExpand?: boolean - runId?: string - }) => { - const evalType = useAtomValue(evalTypeAtom) - - // Use effective runId with proper fallback logic - const contextRunId = useRunId() - const effectiveRunId = useMemo(() => runId ?? contextRunId ?? null, [runId, contextRunId]) - - const {data: stepData} = useScenarioStepSnapshot(scenarioId, effectiveRunId) - const hasStepData = hasScenarioStepData(stepData) - const enrichedArr = hasStepData ? (stepData?.inputSteps ?? []) : [] - let targetStep = stepKey ? enrichedArr.find((s) => s.stepKey === stepKey) : undefined - if (!targetStep) targetStep = enrichedArr[0] - const invocationStep = hasStepData ? stepData?.invocationSteps?.[0] : undefined - - let val: any - if (hasStepData && targetStep && (targetStep as any).inputs) { - let _inputs = {} - try { - const {testcase_dedup_id, ...rest} = targetStep.testcase.data - _inputs = {...(targetStep as any).inputs, ...rest} - } catch (e) { - _inputs = {} - } - - const inputs = {..._inputs} - const groundTruth = (targetStep as any).groundTruth ?? {} - // Merge like InvocationInputs: groundTruth first, then inputs override duplicates - const merged = {...groundTruth, ...inputs} - const path = inputKey.startsWith("data.") ? inputKey.slice(5) : inputKey - val = resolvePath(merged, path) - } - - if (val === undefined && hasStepData && invocationStep) { - const evResult = - resolvePath(invocationStep?.inputs, inputKey) ?? - resolvePath(invocationStep?.data, inputKey) ?? - resolvePath(invocationStep?.result, inputKey) - if (evResult !== undefined) val = evResult - } - - if (val === undefined && invocationStep?.trace) { - const tryTrace = resolvePath(invocationStep.trace, inputKey) - if (tryTrace !== undefined) val = tryTrace - } - - // Use shared util for complex chat messages, otherwise primitive display - let isChat = false - let reactNodes: React.ReactNode[] | undefined - if (typeof val === "string") { - try { - const parsed = JSON.parse(val) - isChat = - Array.isArray(parsed) && parsed.every((m: any) => "role" in m && "content" in m) - } catch { - /* ignore */ - } - } - if (isChat) { - reactNodes = renderChatMessages({ - keyPrefix: `${scenarioId}-${inputKey}`, - rawJson: val as string, - view: "table", - }) - } - - const isOnlineEval = evalType === "online" - const onlineInputItems = useMemo(() => { - if (!hasStepData || !isOnlineEval || reactNodes) return [] - - const candidateValues: any[] = [val] - if (invocationStep) { - candidateValues.push( - invocationStep?.trace?.data?.inputs, - invocationStep?.trace?.data?.inputs?.inputs, - invocationStep?.trace?.inputs, - invocationStep?.inputs, - invocationStep?.data?.inputs, - invocationStep?.data, - ) - } - if (targetStep) { - candidateValues.push((targetStep as any).inputs, (targetStep as any).groundTruth) - } - - for (const candidate of candidateValues) { - if (!candidate) continue - const items = buildOnlineInputItems(candidate) - if (items.length) return items - } - - return [] - }, [hasStepData, isOnlineEval, reactNodes, val, invocationStep, targetStep]) - const showOnlineLabels = showEditor !== false - - if (!hasStepData) { - return ( - - - - ) - } - - return ( - - - {reactNodes ? ( -
    {reactNodes}
    - ) : isOnlineEval ? ( - onlineInputItems.length ? ( -
    - {onlineInputItems.map((item, index) => ( -
    - {showOnlineLabels && item.label ? ( - - {item.label} - - ) : null} - {item.chat ? ( -
    {item.chat}
    - ) : ( - {item.value} - )} -
    - ))} -
    - ) : ( - N/A - ) - ) : val != null && val !== "" && !showEditor ? ( -
    {String(val)}
    - ) : val != null && val !== "" ? ( - {}} - initialValue={String(val)} - editorType="borderless" - placeholder="Click the 'Run' icon to get variant output" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true}} - /> - ) : ( - N/A - )} -
    -
    - ) - }, -) - -export const InputSummaryCell = memo( - ({scenarioId, runId}: {scenarioId: string; runId?: string}) => { - const contextRunId = useRunId() - const evalType = useAtomValue(evalTypeAtom) - const effectiveRunId = useMemo(() => runId ?? contextRunId ?? null, [runId, contextRunId]) - - const {data: stepData} = useScenarioStepSnapshot(scenarioId, effectiveRunId) - - if (!hasScenarioStepData(stepData)) { - return ( - - - - ) - } - - const inputSteps = stepData?.inputSteps ?? [] - - const combined = new Map() - const structured: Record = {} - - const deepMerge = (target: Record, source?: Record) => { - if (!source || typeof source !== "object") return target - Object.entries(source).forEach(([key, rawValue]) => { - // Prevent prototype pollution by excluding dangerous keys - if (key === "__proto__" || key === "constructor" || key === "prototype") return - const parsed = tryParseJson(rawValue) - const value = parsed - if (value && typeof value === "object" && !Array.isArray(value)) { - target[key] = deepMerge((target[key] ||= {}), value as Record) - } else { - target[key] = value - } - }) - return target - } - - const flattenInto = (value: any, path: string[] = []) => { - if (value == null) return - const parsed = tryParseJson(value) - if (parsed !== value) { - flattenInto(parsed, path) - return - } - if (Array.isArray(value)) { - const keyPath = path.join(".") - if ( - value.length && - value.every( - (entry) => - entry && - typeof entry === "object" && - "role" in entry && - "content" in entry, - ) - ) { - if (!combined.has(keyPath || "messages")) { - combined.set(keyPath || "messages", value) - } - return - } - - if (value.length && value.every((entry) => typeof entry !== "object")) { - const joined = value.map((entry) => String(entry)).join(", ") - if (keyPath && !combined.has(keyPath)) { - combined.set(keyPath, joined) - } - return - } - - value.forEach((entry, index) => flattenInto(entry, [...path, String(index)])) - return - } - if (typeof value === "object") { - Object.entries(value).forEach(([key, nested]) => { - flattenInto(nested, [...path, key]) - }) - return - } - if (!path.length) return - const keyPath = path.join(".") - if (!combined.has(keyPath)) { - combined.set(keyPath, value) - } - } - - const mergeCandidate = (source?: Record) => { - if (!source || typeof source !== "object") return - flattenInto(source) - deepMerge(structured, source) - } - - inputSteps.forEach((step: any) => { - mergeCandidate(step?.groundTruth) - mergeCandidate(step?.inputs) - try { - const {testcase_dedup_id, ...rest} = step?.testcase?.data ?? {} - mergeCandidate(rest) - } catch { - /* ignore */ - } - }) - - const invocationStep = stepData?.invocationSteps?.[0] - - if (invocationStep) { - mergeCandidate(invocationStep?.inputs) - const invocationParams = invocationStep?.invocationParameters - if (invocationParams && typeof invocationParams === "object") { - Object.values(invocationParams).forEach((param: any) => { - mergeCandidate(param?.requestBody?.inputs) - mergeCandidate(param?.inputs) - mergeCandidate(param?.agConfig?.inputs) - }) - } - - const collectTraceInputs = (node: any) => { - if (!node || typeof node !== "object") return - if (node.inputs && typeof node.inputs === "object") mergeCandidate(node.inputs) - if (node.data && typeof node.data === "object") { - if (node.data.inputs && typeof node.data.inputs === "object") { - mergeCandidate(node.data.inputs) - } - } - const children = ([] as any[]) - .concat(node?.nodes || []) - .concat(node?.children || []) - .concat(node?.events || []) - children.forEach(collectTraceInputs) - } - - if (invocationStep?.trace) { - collectTraceInputs(invocationStep.trace) - if (invocationStep.trace?.tree) collectTraceInputs(invocationStep.trace.tree) - } - } - - if (!combined.size) { - return ( - - - - ) - } - - const buildOnlineItems = () => { - const items: {label: string; value?: string; chat?: ReactNode[]}[] = [] - for (const [path, value] of combined.entries()) { - const segments = path.split(".").filter(Boolean) - while (segments.length && WRAPPER_KEYS.has(segments[0])) { - segments.shift() - } - if (!segments.length) continue - const label = titleCase(segments[segments.length - 1]) - - if (Array.isArray(value) && value.every(isChatMessage)) { - const nodes = renderChatMessages({ - keyPrefix: `${scenarioId}-${label}`, - rawJson: JSON.stringify(value), - view: "table", - }) - items.push({label, chat: nodes}) - continue - } - - if (isChatMessage(value)) { - const nodes = renderChatMessages({ - keyPrefix: `${scenarioId}-${label}`, - rawJson: JSON.stringify([value]), - view: "table", - }) - items.push({label, chat: nodes}) - continue - } - - const rendered = stringifyOnlineValue(value, 0) - if (!rendered) continue - const sanitized = rendered.startsWith(`${label}: `) - ? rendered.slice(label.length + 2) - : rendered - items.push({label, value: sanitized}) - } - return items - } - - if (evalType === "online") { - const items = buildOnlineItems() - if (!items.length) { - return ( - - - - ) - } - - return ( - - -
    - {items.map(({label, value, chat}) => ( -
    - {label} - {chat ? ( -
    {chat}
    - ) : ( - {value} - )} -
    - ))} -
    -
    -
    - ) - } - - const serialized = (() => { - try { - return JSON.stringify(structured, null, 2) - } catch { - return String(structured) - } - })() - - return ( - - - {}} - initialValue={serialized} - editorType="borderless" - disabled - editorClassName="!text-xs" - editorProps={{enableResize: true}} - /> - - - ) - }, -) - -// Dynamic invocation result cell for run-index driven columns -export const InvocationResultCellSkeleton = memo(() => { - return ( - - ) -}) - -export const InvocationResultCell = memo( - ({ - scenarioId, - stepKey, - path, - isSkeleton, - runId, - record, - }: { - isSkeleton: boolean - scenarioId: string - stepKey: string - path: string - runId?: string // Optional for multi-run support - record?: TableRow - }) => { - const evalType = useAtomValue(evalTypeAtom) - const {trace, value, rawValue, messageNodes, hasError} = useInvocationResult({ - scenarioId, - stepKey, - runId, - viewType: "table", - }) - const navigation = useAppNavigation() - const appState = useAppState() - const contextRunId = useOptionalRunId() - const enableFocusDrawer = - evalType === "auto" || evalType === "online" || evalType === "custom" - - const handleOpenFocus = () => { - const targetRunId = runId ?? contextRunId ?? null - if (!targetRunId) { - console.warn("[InvocationResultCell] Missing runId while opening focus view", { - scenarioId, - }) - return - } - - const currentScenarioValue = appState.query?.focusScenarioId - const currentRunValue = appState.query?.focusRunId - const scenarioMatches = Array.isArray(currentScenarioValue) - ? currentScenarioValue[0] === scenarioId - : currentScenarioValue === scenarioId - const runMatches = Array.isArray(currentRunValue) - ? currentRunValue[0] === targetRunId - : currentRunValue === targetRunId - - if (!scenarioMatches || !runMatches) { - navigation.patchQuery( - { - focusScenarioId: scenarioId, - focusRunId: targetRunId, - }, - {shallow: true}, - ) - } - } - - const isOnlineEval = evalType === "online" - const onlineOutput = useMemo(() => { - if (!isOnlineEval) return {text: undefined, chat: undefined} - if (messageNodes) return {text: undefined, chat: messageNodes} - return buildOnlineOutput(rawValue, value, `${scenarioId}-output`) - }, [isOnlineEval, messageNodes, rawValue, value, scenarioId]) - - const formattedPrimitive = useMemo(() => { - if (value === null || value === undefined) return "" - if (typeof value === "string") { - try { - const parsed = JSON.parse(value) - if (parsed && typeof parsed === "object") { - return JSON.stringify(parsed, null, 2) - } - } catch { - /* ignore parse errors */ - } - return value - } - if (typeof value === "object") { - try { - return JSON.stringify(value, null, 2) - } catch { - return String(value) - } - } - return String(value) - }, [value]) - - return ( - - {!isSkeleton && enableFocusDrawer ? ( - } - size="small" - className="absolute top-2 right-2 z-[2] hidden group-hover:block" - onClick={handleOpenFocus} - tooltipProps={{title: "Focus view"}} - /> - ) : null} - {isSkeleton ? ( - <> -
    -
    - - ) : messageNodes ? ( - <> - {/* */} - -
    {messageNodes}
    -
    - - ) : onlineOutput.chat?.length ? ( - <> - -
    {onlineOutput.chat}
    -
    - - ) : onlineOutput.text ? ( - <> - -
    - {onlineOutput.text} -
    -
    - - ) : ( - <> - {/* */} - -
    - {formattedPrimitive ? ( -
    -                                        {formattedPrimitive}
    -                                    
    - ) : null} -
    -
    - - )} - {trace ? ( -
    - - {/* */} -
    - ) : ( -
    - )} - - ) - }, -) - -export const SkeletonCell = () => { - return ( - - - - ) -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ComparisonModeToggle.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ComparisonModeToggle.tsx deleted file mode 100644 index fbd54285eb..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ComparisonModeToggle.tsx +++ /dev/null @@ -1,237 +0,0 @@ -import React, {memo, useEffect, useMemo, useRef, useState} from "react" - -import {CloseOutlined, PlusOutlined, SwapOutlined} from "@ant-design/icons" -import {Button, Modal, Select, Space, Tag, Tooltip} from "antd" -import {useAtom} from "jotai" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import usePreviewEvaluations from "@/oss/lib/hooks/usePreviewEvaluations" - -import {urlStateAtom} from "../../../state/urlState" - -interface AvailableRun { - id: string - name: string - createdAt: string - status: string -} - -const ComparisonModeToggle = () => { - const [urlState, setUrlState] = useAtom(urlStateAtom) - const [isModalOpen, setIsModalOpen] = useState(false) - const [selectedRuns, setSelectedRuns] = useState([]) - - const currentRunId = useRunId() - const isComparisonMode = Boolean(urlState.compare && urlState.compare.length > 0) - const compareRunIds = urlState.compare || [] - - // Fetch all evaluation runs for comparison - const {runs: allRuns, swrData} = usePreviewEvaluations() - - // Transform runs for the selector and filter out the current run - const availableRuns = useMemo(() => { - if (!allRuns) return [] - - return allRuns - .filter((run) => run.id !== currentRunId) - .map((run) => ({ - id: run.id, - name: run.name || `Run ${run.id.slice(0, 8)}`, - createdAt: new Date(run.createdAt).toLocaleDateString(), - status: run.status, - })) - .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()) - }, [allRuns, currentRunId]) - - // Get current run info for display - const currentRun = useMemo(() => { - if (!allRuns) return null - return allRuns.find((run) => run.id === currentRunId) - }, [allRuns, currentRunId]) - - // Use ref to track previous compareRunIds to avoid infinite loops - const prevCompareRunIdsRef = useRef([]) - - // Sync selectedRuns with URL state when it changes - useEffect(() => { - const prevIds = prevCompareRunIdsRef.current - const currentIds = compareRunIds - - // Check if arrays are different - const isDifferent = - prevIds.length !== currentIds.length || - prevIds.some((id, index) => id !== currentIds[index]) - - if (isDifferent) { - setSelectedRuns(compareRunIds) - prevCompareRunIdsRef.current = [...compareRunIds] - } - }, [compareRunIds]) - - const handleEnableComparison = () => { - setSelectedRuns(compareRunIds) - setIsModalOpen(true) - } - - const handleDisableComparison = () => { - setUrlState((draft) => { - draft.compare = undefined - }) - } - - const handleApplyComparison = () => { - setUrlState((draft) => { - draft.compare = selectedRuns.length > 0 ? selectedRuns : undefined - }) - setIsModalOpen(false) - } - - const handleRemoveRun = (runIdToRemove: string) => { - const updatedRuns = compareRunIds.filter((id) => id !== runIdToRemove) - setUrlState((draft) => { - draft.compare = updatedRuns.length > 0 ? updatedRuns : undefined - }) - } - - return ( - <> - - {!isComparisonMode ? ( - - ) : ( - -
    - {/* Comparing with: */} - {compareRunIds.map((runId) => { - const run = availableRuns.find((r) => r.id === runId) - return ( - handleRemoveRun(runId)} - color="blue" - > - {run?.name || runId} - - ) - })} -
    - - -
    - )} -
    - - setIsModalOpen(false)} - width={600} - okText="Apply Comparison" - cancelText="Cancel" - > -
    -
    -
    - Base Run - - {currentRun?.name || `Current Run (${currentRunId?.slice(0, 8)})`} - -
    -
    - This is the base run that other runs will be compared against. -
    -
    - -
    - - -
    - - {selectedRuns.length > 0 && ( -
    -
    Comparison Preview:
    -
    -
    - Base - - {currentRun?.name || `Current Run`} - -
    - {selectedRuns.map((runId) => { - const run = availableRuns.find( - (r: AvailableRun) => r.id === runId, - ) - return ( -
    - Compare - {run?.name} -
    - ) - })} -
    -
    - )} - -
    - - 💡 Tip: Use comparison mode to analyze performance differences between - runs - -
    -
    -
    - - ) -} - -export default memo(ComparisonModeToggle) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedAnnotationValueCell.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedAnnotationValueCell.tsx deleted file mode 100644 index b5c575f01c..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedAnnotationValueCell.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import {memo, useMemo} from "react" - -import {useCachedScenarioSteps} from "@/oss/components/EvalRunDetails/hooks/useCachedScenarioSteps" -import LabelValuePill from "@/oss/components/ui/LabelValuePill" -import {useOptionalRunId} from "@/oss/contexts/RunIdContext" - -import {CellWrapper} from "../CellComponents" - -import {CollapsedAnnotationValueCellProps} from "./types" - -function buildCollapsedValues(data: any, keys: string[]) { - const annotations: any[] = [] - - if (Array.isArray(data?.annotationSteps) && data.annotationSteps.length) { - annotations.push(...data.annotationSteps.map((st: any) => st.annotation).filter(Boolean)) - } - if (data?.annotations?.length) { - annotations.push(...data.annotations) - } - if (data?.annotation) { - annotations.push(data.annotation) - } - - // Deduplicate by span_id+trace_id to avoid duplicates if same ann appears in multiple arrays - const unique = new Map() - annotations.forEach((ann) => { - if (!ann) return - const key = `${ann.trace_id || ""}_${ann.span_id || Math.random()}` - if (!unique.has(key)) unique.set(key, ann) - }) - - const out: Record = {} - keys.forEach((fieldPath) => { - for (const ann of unique.values()) { - let val = fieldPath - .split(".") - .reduce((acc: any, k: string) => (acc ? acc[k] : undefined), ann) - - if (val === undefined && fieldPath.startsWith("data.outputs.")) { - const suffix = fieldPath.slice("data.outputs.".length) - val = ann?.data?.outputs?.metrics?.[suffix] ?? ann?.data?.outputs?.extra?.[suffix] - } - if (val !== undefined) { - out[fieldPath] = val - break // stop at first found value - } - } - }) - return out -} - -const CollapsedAnnotationValueCell = memo( - ({scenarioId, runId, childrenDefs}) => { - const contextRunId = useOptionalRunId() - const effectiveRunId = runId ?? contextRunId ?? null - - const keyPaths = useMemo( - () => childrenDefs.map((c) => c.path || c.dataIndex || c.key) as string[], - [childrenDefs], - ) - - if (!scenarioId || !effectiveRunId) { - return ( - - - - ) - } - - const {data: scenarioSteps} = useCachedScenarioSteps(effectiveRunId, scenarioId) - - const collapsedValues = useMemo(() => { - if (!scenarioSteps) return {} - return buildCollapsedValues(scenarioSteps, keyPaths) - }, [scenarioSteps, keyPaths]) - - if (!Object.keys(collapsedValues).length) { - return ( - - - - ) - } - - return ( - -
    - {Object.entries(collapsedValues).map(([name, val]) => ( - - ))} -
    -
    - ) - }, -) - -export default CollapsedAnnotationValueCell diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricValueCell.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricValueCell.tsx deleted file mode 100644 index 4653a6b1d9..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/CollapsedMetricValueCell.tsx +++ /dev/null @@ -1,410 +0,0 @@ -import {memo, useMemo, type ReactNode} from "react" - -import {useAtomValue} from "jotai" - -import {formatColumnTitle} from "@/oss/components/Filters/EditColumns/assets/helper" -import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" -import LabelValuePill from "@/oss/components/ui/LabelValuePill" -import {useOptionalRunId} from "@/oss/contexts/RunIdContext" -import { - SchemaMetricType, - canonicalizeMetricKey, - extractPrimitive, - getMetricValueWithAliases, - summarizeMetric, -} from "@/oss/lib/metricUtils" - -import {scenarioMetricSelectorFamily} from "../../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {TableColumn} from "../../types" -import {evaluatorFailuresMapFamily} from "../atoms/evaluatorFailures" -import {CellWrapper} from "../CellComponents" - -import {EvaluatorFailureCell} from "./MetricCell" - -export interface CollapsedMetricValueCellProps { - scenarioId: string - evaluatorSlug?: string - runId?: string - childrenDefs?: TableColumn[] -} - -interface PillEntry { - label: string - value: string -} - -const includesBooleanType = (metricType?: SchemaMetricType): boolean => { - if (!metricType) return false - return Array.isArray(metricType) ? metricType.includes("boolean") : metricType === "boolean" -} - -const flattenColumns = (columns?: TableColumn[]): TableColumn[] => { - if (!columns?.length) return [] - const queue = [...columns] - const leaves: TableColumn[] = [] - - while (queue.length) { - const column = queue.shift() - if (!column) continue - if (column.children && column.children.length) { - queue.push(...column.children) - } else { - leaves.push(column) - } - } - - return leaves -} - -const toBooleanString = (value: unknown): string | undefined => { - if (typeof value === "boolean") return value ? "true" : "false" - if (typeof value === "number") { - if (value === 1) return "true" - if (value === 0) return "false" - } - if (typeof value === "string") { - const trimmed = value.trim().toLowerCase() - if (trimmed === "true" || trimmed === "false") return trimmed - if (trimmed === "1") return "true" - if (trimmed === "0") return "false" - } - return undefined -} - -const extractBooleanFromStats = (value: any): string | undefined => { - if (!value || typeof value !== "object") return undefined - const candidates: unknown[] = [] - if (Array.isArray(value.rank) && value.rank.length) { - candidates.push(value.rank[0]?.value) - } - if (Array.isArray(value.frequency) && value.frequency.length) { - candidates.push(value.frequency[0]?.value) - } - if ("mean" in value) candidates.push(value.mean) - if ("sum" in value) candidates.push(value.sum) - if ("value" in value) candidates.push((value as any).value) - - for (const candidate of candidates) { - const boolString = toBooleanString(candidate) - if (boolString) return boolString - } - return undefined -} - -const resolveBooleanDisplay = ({ - summarized, - rawValue, - metricType, -}: { - summarized: unknown - rawValue: unknown - metricType?: SchemaMetricType -}): string | undefined => { - const preferBoolean = includesBooleanType(metricType) - if (preferBoolean) { - const summaryBool = toBooleanString(summarized) - if (summaryBool) return summaryBool - const rawBool = - toBooleanString(rawValue) || - (typeof rawValue === "object" ? extractBooleanFromStats(rawValue) : undefined) - if (rawBool) return rawBool - } else { - const rawBool = - toBooleanString(rawValue) || - (typeof rawValue === "object" ? extractBooleanFromStats(rawValue) : undefined) - if (rawBool) return rawBool - const summaryBool = toBooleanString(summarized) - if (summaryBool) return summaryBool - } - return undefined -} - -const summariseMetricValue = (value: unknown, metricType?: SchemaMetricType) => { - if (value === null || value === undefined) return undefined - - if (typeof value === "object" && !Array.isArray(value)) { - const summary = summarizeMetric(value as any, metricType) - if (summary !== undefined) return summary - - const primitive = extractPrimitive(value) - if (primitive !== undefined) return primitive - } - - return value -} - -const buildCandidateKeys = (column: TableColumn, evaluatorSlug?: string): string[] => { - const keys = new Set() - const addKey = (key?: string) => { - if (!key) return - if (!keys.has(key)) keys.add(key) - const canonical = canonicalizeMetricKey(key) - if (canonical !== key && !keys.has(canonical)) { - keys.add(canonical) - } - } - - addKey(column.path) - addKey(column.fallbackPath) - if (typeof column.key === "string") addKey(column.key) - - if (column.path?.includes(".")) { - const tail = column.path.split(".").pop() - if (tail) addKey(tail) - } - - if (evaluatorSlug) { - const ensurePrefixed = (raw?: string) => { - if (!raw) return - if (raw.startsWith(`${evaluatorSlug}.`)) { - addKey(raw) - } else { - addKey(`${evaluatorSlug}.${raw}`) - } - } - - ensurePrefixed(column.path) - ensurePrefixed(column.fallbackPath) - if (typeof column.key === "string") ensurePrefixed(column.key) - } - - return Array.from(keys).filter(Boolean) -} - -const buildLabel = (column: TableColumn) => { - const raw = - (typeof column.title === "string" && column.title.trim()) || - (typeof column.name === "string" && column.name.trim()) || - column.path?.split(".").pop() || - (typeof column.key === "string" ? column.key : "") || - "" - - const base = raw || "Metric" - return /\s/.test(base) || base.includes("(") ? base : formatColumnTitle(base) -} - -const buildCollapsedPills = ({ - rowMetrics, - childrenDefs, - evaluatorSlug, -}: { - rowMetrics: Record - childrenDefs?: TableColumn[] - evaluatorSlug?: string -}): PillEntry[] => { - if (!rowMetrics || typeof rowMetrics !== "object") return [] - - const leaves = flattenColumns(childrenDefs) - if (!leaves.length) return [] - - const seenLabels = new Set() - const result: PillEntry[] = [] - - leaves.forEach((column) => { - const candidateKeys = buildCandidateKeys(column, evaluatorSlug) - let rawValue: unknown - let resolvedKey: string | undefined - - for (const key of candidateKeys) { - if (!key) continue - if (rowMetrics[key] !== undefined) { - rawValue = rowMetrics[key] - resolvedKey = key - break - } - const alias = getMetricValueWithAliases(rowMetrics, key) - if (alias !== undefined) { - rawValue = alias - resolvedKey = key - break - } - } - - if (rawValue === undefined) return - - const summarized = summariseMetricValue(rawValue, column.metricType) - if (summarized === undefined || summarized === null) return - - const canonicalKey = canonicalizeMetricKey(resolvedKey ?? column.path ?? column.key ?? "") - const label = buildLabel(column) - if (!label.trim() || seenLabels.has(label)) return - const booleanDisplay = resolveBooleanDisplay({ - summarized, - rawValue, - metricType: column.metricType, - }) - - const value = - booleanDisplay ?? - (typeof summarized === "number" - ? formatMetricValue(canonicalKey, summarized) - : String(summarized)) - - seenLabels.add(label) - result.push({label, value}) - }) - - return result -} - -interface BaseCellProps extends CollapsedMetricValueCellProps { - emptyState: ReactNode -} - -const CollapsedMetricValueCellContent = ({ - scenarioId, - evaluatorSlug, - runId, - childrenDefs, - emptyState, -}: Required) => { - const rowMetrics = useAtomValue(scenarioMetricSelectorFamily({runId, scenarioId})) || {} - const evaluatorFailuresMap = useAtomValue(evaluatorFailuresMapFamily(runId)) - - const candidateSlugs = useMemo(() => { - const set = new Set() - const addCandidate = (value?: string | null) => { - if (!value || typeof value !== "string") return - const trimmed = value.trim() - if (!trimmed) return - if (!set.has(trimmed)) set.add(trimmed) - - const dotParts = trimmed.split(".") - dotParts.forEach((part) => { - const segment = part.trim() - if (segment && !set.has(segment)) { - set.add(segment) - } - }) - } - - addCandidate(evaluatorSlug) - childrenDefs?.forEach((col) => { - addCandidate(col.stepKey) - if (col.stepKeyByRunId && typeof col.stepKeyByRunId === "object") { - Object.values(col.stepKeyByRunId).forEach((stepKey) => addCandidate(stepKey)) - } - addCandidate(col.path) - addCandidate(col.fallbackPath) - if (typeof col.key === "string") addCandidate(col.key) - if (typeof col.name === "string") addCandidate(col.name) - }) - - return Array.from(set) - }, [childrenDefs, evaluatorSlug]) - - const pillEntries = useMemo( - () => - buildCollapsedPills({ - rowMetrics, - childrenDefs, - evaluatorSlug, - }), - [rowMetrics, childrenDefs, evaluatorSlug], - ) - - const failure = useMemo(() => { - if (!candidateSlugs.length) return undefined - const failures = evaluatorFailuresMap?.get(scenarioId) - if (!failures) return undefined - - for (const slug of candidateSlugs) { - if (failures[slug]) { - return failures[slug] - } - } - - const entries = Object.entries(failures) - const substringMatch = entries.find(([failureSlug]) => - candidateSlugs.some((candidate) => { - if (!candidate || candidate.length < 3) return false - return candidate.includes(failureSlug) || failureSlug.includes(candidate) - }), - ) - if (substringMatch) return substringMatch[1] - - const normalize = (value: string) => value.replace(/[^\w]/g, "").toLowerCase() - const normalizedCandidates = candidateSlugs.map(normalize) - const normalizedMatch = entries.find(([failureSlug]) => - normalizedCandidates.includes(normalize(failureSlug)), - ) - return normalizedMatch?.[1] - }, [candidateSlugs, evaluatorFailuresMap, scenarioId]) - - if (failure) { - return - } - - if (!pillEntries.length) { - return ( - - {typeof emptyState === "string" ? ( - {emptyState} - ) : ( - emptyState - )} - - ) - } - - return ( - -
    - {pillEntries.map(({label, value}) => ( - - ))} -
    -
    - ) -} - -const BaseCollapsedMetricValueCell = ({ - scenarioId, - evaluatorSlug, - runId, - childrenDefs, - emptyState, -}: BaseCellProps) => { - const contextRunId = useOptionalRunId() - const effectiveRunId = runId ?? contextRunId ?? null - - if (!scenarioId || !effectiveRunId) { - return ( - - {typeof emptyState === "string" ? ( - {emptyState} - ) : ( - emptyState - )} - - ) - } - - return ( - - ) -} - -const CollapsedMetricValueCell = memo((props) => ( - -)) - -export const AutoEvalCollapsedMetricValueCell = memo((props) => ( - } - /> -)) - -export default CollapsedMetricValueCell diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/MetricCell.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/MetricCell.tsx deleted file mode 100644 index 28268c68eb..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/MetricCell.tsx +++ /dev/null @@ -1,527 +0,0 @@ -import {type ReactNode, memo, useCallback, useMemo} from "react" - -import {Tag, Tooltip} from "antd" -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {useAtomValue} from "jotai" -import {loadable, selectAtom} from "jotai/utils" - -import {useCachedScenarioSteps} from "@/oss/components/EvalRunDetails/hooks/useCachedScenarioSteps" -import {useMetricStepError} from "@/oss/components/EvalRunDetails/hooks/useMetricStepError" -import {urlStateAtom} from "@/oss/components/EvalRunDetails/state/urlState" -import MetricDetailsPopover from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover" // adjust path if necessary -import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" // same util used elsewhere -import {Expandable} from "@/oss/components/Tables/ExpandableCell" -import {getStatusLabel} from "@/oss/lib/constants/statusLabels" -import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import { - evaluationRunStateFamily, - getCurrentRunId, - scenarioStepFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {scenarioMetricsMapFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {runScopedMetricDataFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import {EvaluationStatus} from "@/oss/lib/Types" - -import {STATUS_COLOR_TEXT} from "../../../EvalRunScenarioStatusTag/assets" -import {CellWrapper} from "../CellComponents" // CellWrapper is default export? need to check. - -import {resolveAnnotationMetricValue, resolveStepFailure} from "./helpers" -import {AnnotationValueCellProps, MetricCellProps, MetricValueCellProps} from "./types" - -/* - * MetricCell – common renderer for metric columns (scenario-level or evaluator-level). - * Props: - * - metricKey: base metric name (without evaluator slug) - * - fullKey: full metric path as used in maps (e.g. "evaluator.slug.score") - * - value: value for current scenario row - * - distInfo: pre-computed distribution / stats for popover (optional) - * - metricType: primitive type from evaluator schema ("number", "boolean", "array", etc.) - */ - -const MetricCell = memo( - ({ - hidePrimitiveTable = true, - scenarioId, - metricKey, - fullKey, - value, - distInfo, - metricType, - isComparisonMode, - }) => { - if (value === undefined || value === null) { - if (isComparisonMode) { - return ( - -
    - - ) - } - return null - } - - if (typeof value === "object" && Object.keys(value || {}).length === 0) { - if (isComparisonMode) { - return ( - -
    - - ) - } - return null - } - - const frequency = value?.frequency || value?.freq - - if (frequency && frequency?.length > 0) { - const mostFrequent = frequency.reduce((max, current) => - current.count > max.count ? current : max, - ).value - value = mostFrequent - } - - // Non-numeric arrays rendered as Tag list - let formatted: ReactNode = formatMetricValue(metricKey, value) - if (metricType === "boolean" && Array.isArray(value as any)) { - const trueEntry = (distInfo as any).frequency.find((f: any) => f.value === true) - const total = (distInfo as any).count ?? 0 - if (total) { - return ( -
    -
    -
    -
    - true - false -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {(((trueEntry?.count ?? 0) / total) * 100).toFixed(2)} -
    -
    - ) - } - } - - if (metricType === "array" || Array.isArray(value)) { - const values = Array.isArray(value) ? value : [value] - // const Component = metricType === "string" ? "span" : Tag - formatted = - metricType === "string" ? ( -
    - {values.map((it: any) => ( -
  • - {String(it)} -
  • - ))} -
    - ) : ( -
    - {values.map((it: any) => ( - - {String(it)} - - ))} -
    - ) - } else if (typeof value === "object") { - // Extract primitive when wrapped in an object (e.g. { score, value, ... }) - if ("score" in value) value = (value as any).score - else { - const prim = Object.values(value || {}).find( - (v) => typeof v === "number" || typeof v === "string", - ) - value = prim !== undefined ? prim : JSON.stringify(value) - } - } - - // Boolean metrics – show raw value - if (metricType === "boolean") { - formatted = String(value) - } - - // 1) Detect string by the actual value, not by metricType - const isPlainString = typeof value === "string" - - // 2) When string, render as a wrapped block (no popover) - if (isPlainString) { - return ( - -
    - {value as string} -
    -
    - ) - } - - // 3) Only show popover for non-strings - if (distInfo && !isPlainString) { - return ( - - - - {formatted} - - - - ) - } - - return ( - - - {formatted} - - - ) - }, -) - -// --- Wrapper cell that fetches the value from atoms ---------------------- - -export const MetricValueCell = memo( - ({scenarioId, metricKey, fallbackKey, fullKey, metricType, evalType, runId, stepKey}) => { - const param = useMemo( - () => ({runId, scenarioId, metricKey}), - [runId, scenarioId, metricKey], - ) - - const fallbackParam = useMemo( - () => - fallbackKey && fallbackKey !== metricKey - ? ({runId, scenarioId, metricKey: fallbackKey} as const) - : param, - [fallbackKey, metricKey, param, runId, scenarioId], - ) - - const urlState = useAtomValue(urlStateAtom) - const isComparisonMode = Boolean(urlState.compare && urlState.compare.length > 0) - - let value, distInfo - const result = useAtomValue(runScopedMetricDataFamily(param as any)) - const fallbackResult = useAtomValue(runScopedMetricDataFamily(fallbackParam as any)) - - value = result.value - distInfo = result.distInfo - - if ((value === undefined || value === null) && fallbackResult) { - value = fallbackResult.value - distInfo = distInfo ?? fallbackResult.distInfo - } - const {errorStep} = useMetricStepError({ - runId, - scenarioId, - metricKey, - fallbackKey, - fullKey, - stepKey, - }) - - // TODO: create a separate component for error - if (errorStep?.status || errorStep?.error) { - const tooltipContent = - errorStep?.error || "Evaluator returned an error for this metric." - return ( - {tooltipContent}} - classNames={{body: "max-w-[200px] max-h-[300px] overflow-y-auto"}} - > - - {getStatusLabel(errorStep?.status || EvaluationStatus.ERROR)} - - - ) - } - - return ( - - ) - }, -) - -export const EvaluatorFailureCell = ({status, error}: EvaluatorFailure) => { - const tooltipContent = error || "Evaluator returned an error for this metric." - const normalizedStatus = status || EvaluationStatus.ERROR - const statusClass = STATUS_COLOR_TEXT[normalizedStatus] || "text-red-500" - - return ( - - {String(tooltipContent)}} - classNames={{body: "max-w-[200px] max-h-[300px] overflow-y-auto"}} - > - - {getStatusLabel(normalizedStatus)} - - - - ) -} - -// --- Annotation value cell ----------------------------------------------- -// It's a hot fix until we fix the backend issue for annotation metrics -// In the backend the metrics endpoint is not returning all the type of annotation metrics -export const AnnotationValueCell = memo( - ({ - scenarioId, - stepKey, - name, - fieldPath, - metricKey, - metricType, - fullKey, - distInfo: propsDistInfo, - runId, - }) => { - // Use effective runId with fallback using useMemo - const effectiveRunId = useMemo(() => { - if (runId) return runId - try { - return getCurrentRunId() - } catch (error) { - return "" - } - }, [runId]) - // Get evaluators from run-scoped state instead of global atom - const evaluatorsSelector = useCallback((state: any) => { - return state?.enrichedRun?.evaluators ? Object.values(state.enrichedRun.evaluators) : [] - }, []) - const evaluatorsAtom = useMemo( - () => - selectAtom(evaluationRunStateFamily(effectiveRunId), evaluatorsSelector, deepEqual), - [effectiveRunId, evaluatorsSelector], - ) - const evaluators = useAtomValue(evaluatorsAtom) - const {data: stepData, hasResolved: hasAnnotationSteps} = useCachedScenarioSteps( - effectiveRunId, - scenarioId, - ) - - // Memoize annotation steps for best performance (multi-step) - const _annotationSteps = useMemo( - () => - (stepData?.annotationSteps ?? - []) as UseEvaluationRunScenarioStepsFetcherResult["annotationSteps"], - [stepData], - ) - - // Build annotations per step key / slug - const annotationsByStep = useMemo(() => { - type AnnStep = UseEvaluationRunScenarioStepsFetcherResult["annotationSteps"][number] - const map: Record = {} - if (!_annotationSteps.length) return map - - _annotationSteps.forEach((step) => { - const annotation = step.annotation - const fullKey = step.stepKey ?? (step as any).key - const evaluatorSlug = annotation?.references?.evaluator?.slug - const linkKeys = annotation?.links ? Object.keys(annotation.links) : [] - - const possibleKeys = new Set() - linkKeys.forEach((key) => { - if (key) possibleKeys.add(key) - }) - if (fullKey) { - possibleKeys.add(fullKey) - const invocationKey = fullKey.includes(".") ? fullKey.split(".")[0] : fullKey - if (invocationKey) possibleKeys.add(invocationKey) - } - if (evaluatorSlug) { - possibleKeys.add(evaluatorSlug) - } - - if (!possibleKeys.size) { - possibleKeys.add("__default__") - } - - possibleKeys.forEach((key) => { - if (!map[key]) map[key] = [] - map[key].push(step) - }) - }) - return map - }, [_annotationSteps]) - const buildAnnotateData = useCallback( - (lookupKey?: string) => { - const fallbackSteps = _annotationSteps || [] - const _steps = (lookupKey && annotationsByStep?.[lookupKey]) || fallbackSteps - const _annotations = _steps - .map((s) => s.annotation) - .filter(Boolean) as AnnotationDto[] - const annotationEvaluatorSlugs = _annotations - .map((annotation) => annotation?.references?.evaluator?.slug) - .filter(Boolean) - - return { - annotations: _annotations, - evaluatorSlugs: - evaluators - ?.map((e) => e.slug) - .filter((slug) => !annotationEvaluatorSlugs.includes(slug)) || [], - evaluators: - evaluators?.filter((e) => !annotationEvaluatorSlugs.includes(e.slug)) || [], - } - }, - [annotationsByStep, evaluators, _annotationSteps], - ) - const annotationKeys = useMemo( - () => Object.keys(annotationsByStep).filter((key) => key !== "__default__"), - [annotationsByStep], - ) - const resolvedAnnotationKey = useMemo(() => { - if (!annotationKeys.length) { - return annotationsByStep.__default__ ? "__default__" : undefined - } - - if (stepKey && stepKey !== "metric") { - if (annotationsByStep[stepKey]) return stepKey - - const suffixMatch = annotationKeys.find((key) => key.endsWith(stepKey)) - if (suffixMatch) return suffixMatch - } - - const slugCandidates = [metricKey, name, fieldPath] - .map((candidate) => candidate?.split(".")[0]) - .filter((slug): slug is string => Boolean(slug)) - - for (const slug of slugCandidates) { - const slugMatch = annotationKeys.find( - (key) => key === slug || key.endsWith(`.${slug}`), - ) - if (slugMatch) return slugMatch - } - - if (annotationsByStep.__default__) { - return "__default__" - } - - return annotationKeys[0] - }, [annotationKeys, annotationsByStep, fieldPath, metricKey, name, stepKey]) - const annotationsForStep = useMemo(() => { - const annotateData = buildAnnotateData(resolvedAnnotationKey) - return annotateData.annotations - }, [buildAnnotateData, resolvedAnnotationKey]) - - const failureInfo = useMemo(() => { - if (!stepData && !hasAnnotationSteps) return null - if (!stepData) return null - const slugHints = [ - resolvedAnnotationKey, - ...annotationsForStep.map( - (ann) => ann?.references?.evaluator?.slug || ann?.references?.evaluator?.key, - ), - ] - .flat() - .filter((slug): slug is string => Boolean(slug)) - - const uniqueSlugs = Array.from(new Set(slugHints)) - - const failure = resolveStepFailure({ - data: stepData, - scenarioId, - slugCandidates: uniqueSlugs, - stepKey, - debug: { - metricKey: metricKey ?? fieldPath ?? "", - runId: effectiveRunId, - }, - }) - - return failure - }, [ - annotationsForStep, - effectiveRunId, - fieldPath, - metricKey, - resolvedAnnotationKey, - scenarioId, - stepData, - stepKey, - ]) - - const metricVal = useMemo( - () => - resolveAnnotationMetricValue({ - annotations: annotationsForStep, - fieldPath, - metricKey, - name, - }), - [annotationsForStep, fieldPath, metricKey, name], - ) - const distInfo = propsDistInfo - - if (failureInfo?.status || failureInfo?.error) { - const tooltipContent = - failureInfo?.error || "Evaluator returned an error for this annotation." - return ( - - - - {getStatusLabel(failureInfo?.status || EvaluationStatus.ERROR)} - - - - ) - } - - return ( - - ) - }, -) - -export default MetricCell diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/helpers.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/helpers.ts deleted file mode 100644 index 2c7c3f1230..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/helpers.ts +++ /dev/null @@ -1,299 +0,0 @@ -import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import {EvaluationStatus} from "@/oss/lib/Types" - -interface ScenarioStep { - stepKey?: string - status?: string - error?: unknown - scenarioId?: string - references?: { - evaluator?: {slug?: string; key?: string} - application?: {slug?: string} - } -} - -const FAILURE_STATUS_SET = new Set( - [ - EvaluationStatus.FAILURE, - EvaluationStatus.FAILED, - EvaluationStatus.ERROR, - EvaluationStatus.ERRORS, - EvaluationStatus.AGGREGATION_FAILED, - EvaluationStatus.FINISHED_WITH_ERRORS, - ].map((status) => String(status).toLowerCase()), -) - -const normalizeStatus = (status?: string): string => { - if (!status) return "" - return String(status).toLowerCase() -} - -export const hasFailureStatus = (status?: string): boolean => { - return FAILURE_STATUS_SET.has(normalizeStatus(status)) -} - -export const resolveErrorMessage = (error: unknown): string | undefined => { - if (!error) return undefined - if (typeof error === "string") return error - - if (error instanceof Error) { - return error.stack || error.message - } - - if (typeof error === "object" && error !== null) { - const err = error as Record - const code = - typeof err.code === "number" - ? err.code - : typeof err.statusCode === "number" - ? err.statusCode - : undefined - const message = - typeof err.message === "string" - ? err.message - : typeof err.detail === "string" - ? err.detail - : undefined - const typeLink = typeof err.type === "string" ? err.type : undefined - const stacktrace = - typeof err.stacktrace === "string" - ? err.stacktrace - : typeof err.stack === "string" - ? err.stack - : undefined - - if (code || message || typeLink || stacktrace) { - const lines: string[] = [] - if (code || message) { - lines.push(`(${code ?? ""}) ${message ?? "Evaluator returned an error."}`.trim()) - } - if (typeLink) { - lines.push("", "For more information, please follow this link:", typeLink) - } - if (stacktrace) { - lines.push("", "Stacktrace:", stacktrace) - } - return lines.join("\n").trim() - } - - try { - return JSON.stringify(error) - } catch { - return String(error) - } - } - - return String(error) -} - -const matchesSlug = (step: ScenarioStep | undefined, slug: string): boolean => { - if (!step || !slug) return false - const candidates = [slug] - const dashed = slug.replace(/\./g, "-") - if (dashed !== slug) candidates.push(dashed) - const underscored = slug.replace(/\./g, "_") - if (underscored !== slug) candidates.push(underscored) - - const stepIdentifiers = [ - step.stepKey, - step.references?.evaluator?.slug, - step.references?.evaluator?.key, - step.references?.application?.slug, - ] - for (const identifier of stepIdentifiers) { - if (!identifier) continue - const normalized = String(identifier).toLowerCase() - const matched = candidates.some((candidate) => { - const lowered = candidate.toLowerCase() - return ( - normalized === lowered || - normalized.endsWith(`.${lowered}`) || - normalized.endsWith(`-${lowered}`) || - normalized.endsWith(`_${lowered}`) - ) - }) - if (matched) return true - } - - return false -} - -const collectScenarioSteps = ( - data?: UseEvaluationRunScenarioStepsFetcherResult, -): ScenarioStep[] => { - if (!data) return [] - const buckets: ScenarioStep[] = [] - if (Array.isArray(data.steps)) buckets.push(...(data.steps as ScenarioStep[])) - if (Array.isArray(data.annotationSteps)) - buckets.push(...(data.annotationSteps as ScenarioStep[])) - if (Array.isArray(data.invocationSteps)) - buckets.push(...(data.invocationSteps as ScenarioStep[])) - return buckets -} - -export const resolveStepFailure = ({ - data, - scenarioId, - slugCandidates, - stepKey, - debug, -}: { - data?: UseEvaluationRunScenarioStepsFetcherResult - scenarioId: string - slugCandidates?: string[] - stepKey?: string - debug?: {metricKey: string; runId: string} -}): {status?: string; error?: string} | null => { - if (!data) return null - const steps = collectScenarioSteps(data) - const failureCandidates = steps.filter((step) => hasFailureStatus(step?.status)) - - let failingStep: ScenarioStep | undefined - - if (stepKey) { - failingStep = failureCandidates.find((step) => step.stepKey === stepKey) - } - - if (!failingStep && slugCandidates?.length) { - for (const candidateSlug of slugCandidates) { - if (!candidateSlug) continue - const match = failureCandidates.find((step) => matchesSlug(step, candidateSlug)) - if (match) { - failingStep = match - - break - } - } - } - - if (failingStep) { - return { - status: failingStep.status, - error: resolveErrorMessage(failingStep.error), - } - } - - const fallbackInvocation = (data.invocationSteps || []).find( - (step) => step?.scenarioId === scenarioId && hasFailureStatus(step?.status), - ) - - if (fallbackInvocation) { - return { - status: fallbackInvocation.status, - error: resolveErrorMessage(fallbackInvocation.error), - } - } - - return null -} - -const OUTPUTS_PREFIX = "data.outputs." -const OUTPUT_SECTION_KEYS = ["metrics", "notes", "extra"] as const - -const getNestedValue = (source: any, path?: string): any => { - if (!source || !path) return undefined - const segments = path.split(".").filter(Boolean) - if (!segments.length) return undefined - return segments.reduce((acc, segment) => { - if (acc === undefined || acc === null) return undefined - return acc[segment] - }, source) -} - -const normalizeOutputsPath = (path?: string): string | undefined => { - if (!path) return undefined - if (path.startsWith(OUTPUTS_PREFIX)) { - return path.slice(OUTPUTS_PREFIX.length) - } - if (path.startsWith("outputs.")) { - return path.slice("outputs.".length) - } - return path -} - -export const resolveAnnotationMetricValue = ({ - annotations, - fieldPath, - metricKey, - name, -}: { - annotations: AnnotationDto[] - fieldPath?: string - metricKey?: string - name?: string -}) => { - if (!annotations?.length) return undefined - - const fieldSegments = fieldPath?.split(".").filter(Boolean) ?? [] - - const annotationsBySlug = new Map() - annotations.forEach((ann) => { - const slug = ann?.references?.evaluator?.slug - if (slug) annotationsBySlug.set(slug, ann) - }) - - const slugIndex = fieldSegments.findIndex((segment) => annotationsBySlug.has(segment)) - const slug = slugIndex >= 0 ? fieldSegments[slugIndex] : undefined - const remainderSegments = slugIndex >= 0 ? fieldSegments.slice(slugIndex + 1) : fieldSegments - const remainderPath = remainderSegments.length ? remainderSegments.join(".") : undefined - - const keyCandidates = Array.from( - new Set( - [metricKey, name, remainderSegments.at(-1), fieldSegments.at(-1)] - .filter((key): key is string => Boolean(key)) - .map((key) => key), - ), - ) - - const outputPathCandidates = Array.from( - new Set( - [ - normalizeOutputsPath(fieldPath), - normalizeOutputsPath(remainderPath), - ...keyCandidates.flatMap((key) => - OUTPUT_SECTION_KEYS.map((section) => `${section}.${key}`), - ), - ].filter((path): path is string => Boolean(path)), - ), - ) - - const rootPathCandidates = Array.from( - new Set([fieldPath, remainderPath, ...keyCandidates].filter(Boolean) as string[]), - ) - - const prioritizedAnnotations = (() => { - if (slug) { - const matched = annotationsBySlug.get(slug) - if (matched) return [matched] - } - - const matchedByKey = annotations.filter((ann) => { - const outputs = ann?.data?.outputs - if (!outputs) return false - return keyCandidates.some((key) => - OUTPUT_SECTION_KEYS.some( - (section) => getNestedValue(outputs[section], key) !== undefined, - ), - ) - }) - - if (matchedByKey.length) return matchedByKey - return annotations - })() - - for (const ann of prioritizedAnnotations) { - const outputs = ann?.data?.outputs ?? {} - for (const path of outputPathCandidates) { - const val = getNestedValue(outputs, path) - if (val !== undefined) return val - } - - for (const path of rootPathCandidates) { - const val = getNestedValue(ann, path) - if (val !== undefined) return val - } - } - - return undefined -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/types.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/types.ts deleted file mode 100644 index 3b5f7eea48..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/MetricCell/types.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {BasicStats, SchemaMetricType} from "@/oss/lib/metricUtils" - -import {TableColumn} from "../types" - -export interface MetricCellProps { - scenarioId: string - metricKey: string - fullKey?: string - value: any - distInfo?: Record | Promise> - metricType?: SchemaMetricType - isComparisonMode?: boolean -} - -export interface MetricValueCellProps { - scenarioId: string - metricKey: string - fallbackKey?: string - fullKey?: string - distInfo?: Record | Promise> - metricType?: SchemaMetricType - evalType?: "auto" | "human" - runId?: string - stepKey?: string -} - -export interface AnnotationValueCellProps { - scenarioId: string - fieldPath: string // e.g. "data.outputs.isGood" - metricKey: string - fullKey?: string - distInfo?: Record | Promise> - metricType?: SchemaMetricType - stepKey?: string - name?: string - runId?: string -} - -export interface CollapsedAnnotationValueCellProps { - scenarioId: string - childrenDefs: TableColumn[] - runId?: string -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ScenarioTraceSummary.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ScenarioTraceSummary.tsx deleted file mode 100644 index 79d949f293..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/ScenarioTraceSummary.tsx +++ /dev/null @@ -1,307 +0,0 @@ -import {memo, useMemo} from "react" - -import {Clock} from "@phosphor-icons/react" -import clsx from "clsx" - -import {Expandable} from "@/oss/components/Tables/ExpandableCell" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import useEvalRunScenarioData from "@/oss/lib/hooks/useEvaluationRunData/useEvalRunScenarioData" - -import {titleCase} from "./flatDataSourceBuilder" -import TraceMetrics from "../../../AutoEvalRun/components/EvalRunScoreTable/assets/TraceMetrics" - -type InvocationParamsEntry = - | { - requestBody?: { - ag_config?: { - prompt?: { - messages?: Array<{role?: string; content?: string}> - template_format?: string - input_keys?: string[] - llm_config?: { - model?: string - } - } - } - inputs?: Record - } - } - | null - | undefined - -const getNestedValue = (root: any, path: string): any => { - return path.split(".").reduce((acc, key) => { - if (acc && typeof acc === "object") { - return acc[key] - } - return undefined - }, root as any) -} - -const takeFirstNumber = (values: Array): number | undefined => { - for (const value of values) { - if (typeof value === "number" && !Number.isNaN(value)) return value - if (typeof value === "string") { - const parsed = Number(value) - if (!Number.isNaN(parsed)) return parsed - } - } - return undefined -} - -const normaliseText = (value: unknown): string => { - if (value === null || value === undefined) return "" - if (typeof value === "string") return value - if (typeof value === "number" || typeof value === "boolean") return String(value) - try { - return JSON.stringify(value, null, 2) - } catch (error) { - return String(value) - } -} - -const ScenarioTraceSummary = ({ - scenarioId, - stepKey, - runId, - trace, - status, - className, -}: { - scenarioId: string - stepKey: string - runId?: string - trace?: any - status?: {status?: string} - className?: string -}) => { - const scenarioData = useEvalRunScenarioData(scenarioId, runId) - - const invocationStep = useMemo(() => { - const steps = scenarioData?.invocationSteps ?? [] - if (!steps.length) return undefined - if (!stepKey) return steps[0] - return steps.find((step) => step.stepKey === stepKey) ?? steps[0] - }, [scenarioData?.invocationSteps, stepKey]) - - const invocationParams = useMemo(() => { - const stepKeyEntry = invocationStep?.stepKey - const scopedParams = - invocationStep?.invocationParameters ?? scenarioData?.invocationParameters - if (stepKeyEntry && scopedParams && stepKeyEntry in scopedParams) { - return scopedParams[stepKeyEntry] - } - if (scopedParams) { - const firstEntry = Object.values(scopedParams).find(Boolean) - if (firstEntry) return firstEntry as InvocationParamsEntry - } - return undefined - }, [ - invocationStep?.invocationParameters, - invocationStep?.stepKey, - scenarioData?.invocationParameters, - ]) - - const promptMessages = useMemo(() => { - const messages = invocationParams?.requestBody?.ag_config?.prompt?.messages - if (!Array.isArray(messages)) return [] - return messages.filter((msg) => !!msg && normaliseText(msg.content).trim().length > 0) - }, [invocationParams]) - - const promptText = useMemo(() => { - if (!promptMessages.length) return "" - return promptMessages - .map((msg) => { - const role = msg.role ? titleCase(msg.role) : "Message" - const content = normaliseText(msg.content) - return `${role}\n${content}` - }) - .join("\n\n") - }, [promptMessages]) - - const inputEntries = useMemo(() => { - const entries: Array<{key: string; value: string}> = [] - const inputs = invocationParams?.requestBody?.inputs - if (inputs && typeof inputs === "object") { - Object.entries(inputs).forEach(([key, value]) => { - const textValue = normaliseText(value).trim() - entries.push({ - key, - value: textValue.length > 0 ? textValue : "—", - }) - }) - } - return entries - }, [invocationParams]) - - const modelName = - invocationParams?.requestBody?.ag_config?.prompt?.llm_config?.model || - getNestedValue(trace, "otel.attributes.llm.request.model") || - getNestedValue(trace, "otel.attributes.llm.model") || - getNestedValue(trace, "otel.attributes.model") - - const templateFormat = invocationParams?.requestBody?.ag_config?.prompt?.template_format - - const startedAt = - invocationStep?.createdAt || - invocationStep?.timestamp || - getNestedValue(trace, "time.start") - - const latencySeconds = takeFirstNumber([ - getNestedValue(trace, "metrics.duration.cumulative"), - getNestedValue(trace, "metrics.duration.total"), - getNestedValue(trace, "metrics.duration"), - typeof invocationStep?.interval === "number" ? invocationStep.interval / 1000 : undefined, - (() => { - const start = getNestedValue(trace, "time.start") - const end = getNestedValue(trace, "time.end") - if (start && end) { - const delta = dayjs(end).diff(dayjs(start), "second", true) - return Number.isFinite(delta) ? delta : undefined - } - return undefined - })(), - ]) - - const totalCost = takeFirstNumber([ - getNestedValue(trace, "metrics.costs.cumulative.total"), - getNestedValue(trace, "metrics.cost.total"), - getNestedValue(trace, "metrics.cost"), - getNestedValue(trace, "data.metrics.costs.cumulative.total"), - getNestedValue(trace, "data.costs.cumulative.total"), - getNestedValue(trace, "attributes.ag.metrics.costs.cumulative.total"), - getNestedValue(trace, "otel.attributes.ag.metrics.costs.cumulative.total"), - ]) - - const totalTokens = takeFirstNumber([ - getNestedValue(trace, "metrics.tokens.cumulative.total"), - getNestedValue(trace, "metrics.tokens.total"), - getNestedValue(trace, "metrics.tokens"), - getNestedValue(trace, "data.metrics.tokens.cumulative.total"), - getNestedValue(trace, "attributes.ag.metrics.tokens.cumulative.total"), - getNestedValue(trace, "otel.attributes.ag.metrics.tokens.cumulative.total"), - ]) - - const statusLabel = useMemo(() => { - const raw = status?.status || invocationStep?.status - if (!raw) return undefined - return titleCase(raw.replace(/_/g, " ")) - }, [status?.status, invocationStep?.status]) - - const hasMetrics = [latencySeconds, totalCost, totalTokens].some( - (value) => typeof value === "number" && !Number.isNaN(value), - ) - - const hasAnyDetails = - Boolean(trace) || - Boolean(statusLabel) || - Boolean(modelName) || - Boolean(templateFormat) || - Boolean(startedAt) || - hasMetrics || - promptText.length > 0 || - inputEntries.length > 0 - - if (!hasAnyDetails) return null - - const formattedStartedAt = startedAt ? dayjs(startedAt).format("MMM D, YYYY HH:mm:ss") : null - - return ( -
    - {(statusLabel || modelName || templateFormat) && ( -
    - {statusLabel ? ( - - Status - {statusLabel} - - ) : null} - {modelName ? ( - - Model - {modelName} - - ) : null} - {templateFormat ? ( - - Template - - {templateFormat} - - - ) : null} -
    - )} - - {(formattedStartedAt || hasMetrics) && ( -
    - {formattedStartedAt ? ( - - - {formattedStartedAt} - - ) : null} - {hasMetrics ? ( - - ) : null} -
    - )} - {!hasMetrics && !formattedStartedAt && trace ? ( - - Trace captured. Use focus view to inspect the full execution. - - ) : null} - - {inputEntries.length > 0 ? ( -
    - - Inputs - - -
    - {inputEntries.map((entry) => ( - - - {entry.key} - - {entry.value} - - ))} -
    -
    -
    - ) : null} - - {promptText ? ( -
    - - Prompt - - -
    -                            {promptText}
    -                        
    -
    -
    - ) : null} -
    - ) -} - -export default memo(ScenarioTraceSummary) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/StatusCell.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/StatusCell.tsx deleted file mode 100644 index c93ed1d64f..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/StatusCell.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import {memo} from "react" - -import {useRunId} from "@/oss/contexts/RunIdContext" - -import EvalRunScenarioStatusTag from "../../EvalRunScenarioStatusTag" - -import {CellWrapper} from "./CellComponents" - -interface Props { - scenarioId: string - result?: string - runId?: string -} - -/** - * Lightweight status cell for Scenario rows. - * Displays coloured status tag and optional result snippet. - */ -const StatusCell = ({scenarioId, runId: propRunId}: Props) => { - const contextRunId = useRunId() - const effectiveRunId = propRunId || contextRunId - - return ( - - - - ) -} - -export default memo(StatusCell) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/TimestampCell.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/TimestampCell.tsx deleted file mode 100644 index 360cdded82..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/TimestampCell.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import {memo, useMemo} from "react" - -import {atom, useAtomValue} from "jotai" - -import {useRunId} from "@/oss/contexts/RunIdContext" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {evalAtomStore} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/store" -import { - hasScenarioStepData, - useScenarioStepSnapshot, -} from "@/oss/lib/hooks/useEvaluationRunData/useScenarioStepSnapshot" - -import {CellWrapper} from "./CellComponents" - -const TimestampCell = ({ - scenarioId, - runId: propRunId, - timestamp: providedTimestamp, - isGroupStart = true, -}: { - scenarioId: string - runId?: string - timestamp?: string | null - isGroupStart?: boolean -}) => { - const store = evalAtomStore() - const contextRunId = useRunId() - const effectiveRunId = useMemo( - () => propRunId ?? contextRunId ?? null, - [propRunId, contextRunId], - ) - - const stepSnapshot = useScenarioStepSnapshot(scenarioId, effectiveRunId) - - const runStateAtom = useMemo( - () => (effectiveRunId ? evaluationRunStateFamily(effectiveRunId) : atom(() => undefined)), - [effectiveRunId], - ) - const runState = useAtomValue(runStateAtom, {store}) as any - - let timestamp: string | undefined | null = providedTimestamp ?? undefined - if (!timestamp && hasScenarioStepData(stepSnapshot.data)) { - const invocation = stepSnapshot.data?.invocationSteps?.[0] - const fallback = invocation ?? stepSnapshot.data?.inputSteps?.[0] - timestamp = - (invocation?.timestamp as string | undefined) || - (invocation?.createdAt as string | undefined) || - (fallback?.timestamp as string | undefined) || - (fallback?.createdAt as string | undefined) - } - - if (!timestamp && runState) { - const scenario = - Array.isArray(runState?.scenarios) && - runState.scenarios.find((sc: any) => sc.id === scenarioId || sc._id === scenarioId) - timestamp = - (scenario?.timestamp as string | undefined) || - (scenario?.createdAt as string | undefined) || - timestamp - if (!timestamp) { - const timeMeta = runState?.statusMeta?.timestamps?.[scenarioId] - const transitionMeta = runState?.statusMeta?.transitions?.[scenarioId] - const candidate = - (timeMeta?.startedAt as any) ?? - (timeMeta?.endedAt as any) ?? - (Array.isArray(transitionMeta) && transitionMeta[0]?.timestamp) - if (candidate != null) { - timestamp = String(candidate) - } - } - } - - const normalizeToDayjs = (value: string | number | undefined) => { - if (value == null) return null - if (typeof value === "string") { - const parsed = dayjs(value) - if (parsed.isValid()) return parsed - const numeric = Number(value) - if (!Number.isNaN(numeric)) { - const ms = numeric > 1e12 ? numeric : numeric * 1000 - const parsedNumeric = dayjs(ms) - return parsedNumeric.isValid() ? parsedNumeric : null - } - return null - } - if (typeof value === "number") { - const ms = value > 1e12 ? value : value * 1000 - const parsed = dayjs(ms) - return parsed.isValid() ? parsed : null - } - return null - } - - const parsedTimestamp = normalizeToDayjs(timestamp || undefined) - const formatted = parsedTimestamp?.isValid() - ? parsedTimestamp.format("MMM D, YYYY HH:mm:ss") - : undefined - - if ( - !formatted && - process.env.NODE_ENV !== "production" && - typeof window !== "undefined" && - effectiveRunId - ) { - console.debug("[OnlineEval][TimestampCell] Missing timestamp", { - runId: effectiveRunId, - scenarioId, - raw: timestamp, - stepState: stepSnapshot.state, - }) - } - - return ( - - {formatted ? ( - {formatted} - ) : ( - - )} - - ) -} - -export default memo(TimestampCell) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/atoms/evaluatorFailures.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/atoms/evaluatorFailures.ts deleted file mode 100644 index 0c11d76b85..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/atoms/evaluatorFailures.ts +++ /dev/null @@ -1,70 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import { - displayedScenarioIdsFamily, - loadableScenarioStepFamily, - scenarioStepLocalFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios" - -import {EvaluatorFailure, hasFailureStatus, resolveErrorMessage} from "../MetricCell/helpers" - -export type EvaluatorFailureMap = Map> - -export const evaluatorFailuresMapFamily = atomFamily( - (runId: string) => - atom((get) => { - const scenarioIds = get(displayedScenarioIdsFamily(runId)) ?? [] - const result: EvaluatorFailureMap = new Map() - - scenarioIds.forEach((scenarioId) => { - const loadable = get(loadableScenarioStepFamily({runId, scenarioId})) - let data = loadable.state === "hasData" ? loadable.data : undefined - if (!data) { - const local = get(scenarioStepLocalFamily({runId, scenarioId})) - if (local && Object.keys(local).length > 0) { - data = local - } - } - if (!data) return - - const failures: Record = {} - const handleStep = (step: any) => { - if (!step) return - const slugCandidate = - step?.annotation?.references?.evaluator?.slug ?? - step?.references?.evaluator?.slug ?? - step?.references?.application?.slug ?? - step?.stepKey?.split?.(".")?.[0] - if (!slugCandidate || failures[slugCandidate]) return - if (hasFailureStatus(step?.status)) { - failures[slugCandidate] = { - status: step?.status, - error: resolveErrorMessage(step?.error), - } - } - } - - const annotationSteps = Array.isArray(data.annotationSteps) - ? data.annotationSteps - : [] - annotationSteps.forEach(handleStep) - - const invocationSteps = Array.isArray(data.invocationSteps) - ? data.invocationSteps - : [] - invocationSteps.forEach(handleStep) - - const generalSteps = Array.isArray(data.steps) ? data.steps : [] - generalSteps.forEach(handleStep) - - if (Object.keys(failures).length) { - result.set(scenarioId, failures) - } - }) - - return result - }), - deepEqual, -) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants.ts deleted file mode 100644 index 9726bb3410..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/constants.ts +++ /dev/null @@ -1,78 +0,0 @@ -// Centralized column widths for easy reuse -export const COLUMN_WIDTHS = { - input: 400, - groundTruth: 460, - response: 400, - action: 140, - metric: 100, - padding: 100, -} as const - -// Table layout constants -export const TABLE_LAYOUT = { - rowHeight: 54, // approximate height of one table row (px) -} as const - -export const SKELETON_ROW_COUNT = 5 - -export const GeneralHumanEvalMetricColumns = [ - { - name: "totalCost", - kind: "metric", - path: "totalCost", - stepKey: "metric", - metricType: "number", - }, - { - name: "Total Duration", - kind: "metric", - path: "duration.total", - stepKey: "metric", - metricType: "number", - }, - { - name: "totalTokens", - kind: "metric", - path: "totalTokens", - stepKey: "metric", - metricType: "number", - }, - { - name: "errors", - kind: "metric", - path: "errors", - stepKey: "metric", - metricType: "number", - }, -] - -export const GeneralAutoEvalMetricColumns = [ - { - name: "Cost (Total)", - kind: "metric", - path: "attributes.ag.metrics.costs.cumulative.total", - stepKey: "metric", - metricType: "number", - }, - { - name: "Duration (Total)", - kind: "metric", - path: "attributes.ag.metrics.duration.cumulative", - stepKey: "metric", - metricType: "number", - }, - { - name: "Tokens (Total)", - kind: "metric", - path: "attributes.ag.metrics.tokens.cumulative.total", - stepKey: "metric", - metricType: "number", - }, - { - name: "Errors", - kind: "metric", - path: "attributes.ag.metrics.errors.cumulative", - stepKey: "metric", - metricType: "number", - }, -] diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/dataSourceBuilder.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/dataSourceBuilder.ts deleted file mode 100644 index 19b7f47efd..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/dataSourceBuilder.ts +++ /dev/null @@ -1,820 +0,0 @@ -import groupBy from "lodash/groupBy" - -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {formatColumnTitle} from "@/oss/components/Filters/EditColumns/assets/helper" -import { - evalAtomStore, - evaluationEvaluatorsFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import type { - ColumnDef, - RunIndex, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {BasicStats, canonicalizeMetricKey} from "@/oss/lib/metricUtils" -import {buildSkeletonRows} from "@/oss/lib/tableUtils" - -import {TableRow} from "../types" - -import {GeneralAutoEvalMetricColumns, GeneralHumanEvalMetricColumns} from "./constants" -import {createEvaluatorNameResolver} from "./evaluatorNameUtils" - -const pickString = (value: unknown): string | undefined => { - if (typeof value !== "string") return undefined - const trimmed = value.trim() - return trimmed.length ? trimmed : undefined -} - -const resolvePreferredSlug = ( - slug: string | undefined, - revisionSlugByEvaluatorSlug?: Map, -): string | undefined => { - if (!slug) return undefined - return revisionSlugByEvaluatorSlug?.get(slug) ?? slug -} - -const buildBaseSlugByRevisionSlug = ( - revisionSlugByEvaluatorSlug?: Map, -): Map => { - const map = new Map() - revisionSlugByEvaluatorSlug?.forEach((revision, base) => { - if (revision) { - map.set(revision, base) - } - }) - return map -} - -const resolveSlugFromStepMeta = ( - meta: RunIndex["steps"][string] | undefined, - revisionSlugByEvaluatorSlug?: Map, -): string | undefined => { - if (!meta) return undefined - const refs: any = meta?.refs ?? {} - const baseSlug = - pickString(meta?.key) ?? - pickString(refs?.evaluator?.slug) ?? - pickString(refs?.evaluator_variant?.slug) ?? - pickString(refs?.evaluatorRevision?.slug) ?? - pickString(meta.key) - return resolvePreferredSlug(baseSlug, revisionSlugByEvaluatorSlug) -} - -const buildMetricDefsLookup = ( - metricsByEvaluator: Record, - revisionSlugByEvaluatorSlug?: Map, -) => { - const baseSlugByRevisionSlug = new Map() - revisionSlugByEvaluatorSlug?.forEach((revision, base) => { - if (revision) baseSlugByRevisionSlug.set(revision, base) - }) - - return (slug: string | undefined): any[] => { - if (!slug) return [] - const direct = metricsByEvaluator[slug] - if (Array.isArray(direct) && direct.length) return direct - const base = baseSlugByRevisionSlug.get(slug) - if (base) { - const baseDefs = metricsByEvaluator[base] - if (Array.isArray(baseDefs) && baseDefs.length) return baseDefs - } - return [] - } -} - -const OUTPUT_PREFIX = "attributes.ag.data.outputs." -const OUTPUT_PREFIX_LOWER = OUTPUT_PREFIX.toLowerCase() - -const normalizeEvaluatorMetricName = (name?: string): string | undefined => { - if (typeof name !== "string") return undefined - const trimmed = name.trim() - if (!trimmed) return undefined - const lower = trimmed.toLowerCase() - if (lower.startsWith(OUTPUT_PREFIX_LOWER)) { - const tail = trimmed.slice(OUTPUT_PREFIX.length) - return tail ? `outputs.${tail}` : "outputs" - } - return trimmed -} - -const inferMetricTypeFromStats = (stats: BasicStats | undefined): string | undefined => { - if (!stats) return undefined - if (typeof (stats as any).mean === "number" || typeof (stats as any).sum === "number") { - return "number" - } - if (Array.isArray((stats as any).frequency)) { - const values = (stats as any).frequency.map((entry: any) => entry?.value) - const uniqueTypes = new Set(values.map((value) => typeof value)) - if (uniqueTypes.size === 1) { - const [only] = Array.from(uniqueTypes) - if (only === "boolean") return "boolean" - if (only === "string") return "string" - } - } - return undefined -} - -const inferMetricsFromStatsForSlug = ( - slug: string, - statsMap: Record | undefined, - relatedSlugs: string[] = [], -): any[] => { - if (!slug || !statsMap) return [] - const candidates = new Set([slug, ...relatedSlugs].filter(Boolean) as string[]) - const derived = new Map() - - const recordMetric = (name: string | undefined, stats: BasicStats | undefined) => { - if (!name) return - const normalizedName = normalizeEvaluatorMetricName(name) ?? name - if (!normalizedName) return - const existing = derived.get(normalizedName) ?? {} - if (!existing.metricType) { - const inferred = inferMetricTypeFromStats(stats) - if (inferred) existing.metricType = inferred - } - derived.set(normalizedName, existing) - } - - Object.entries(statsMap).forEach(([rawKey, stats]) => { - if (typeof rawKey !== "string") return - for (const candidate of candidates) { - const prefix = `${candidate}.` - if (rawKey.startsWith(prefix)) { - const metricName = rawKey.slice(prefix.length) - if (metricName && !metricName.includes("attributes.ag.metrics")) { - if (metricName.startsWith(OUTPUT_PREFIX)) { - const tail = metricName.slice(OUTPUT_PREFIX.length) - if (tail) { - recordMetric(`${tail}`, stats) - } - } - } - return - } - } - - if (rawKey.startsWith(OUTPUT_PREFIX)) { - const tail = rawKey.slice(OUTPUT_PREFIX.length) - if (!tail) return - recordMetric(`outputs.${tail}`, stats) - } - }) - - return Array.from(derived.entries()).map(([key, meta]) => ({[key]: meta})) -} - -const AUTO_INVOCATION_METRIC_SUFFIXES = GeneralAutoEvalMetricColumns.map((col) => col.path) -const AUTO_INVOCATION_METRIC_CANONICAL_SET = new Set( - AUTO_INVOCATION_METRIC_SUFFIXES.map((path) => canonicalizeMetricKey(path)), -) - -const matchesGeneralInvocationMetric = (path?: string): boolean => { - if (!path) return false - if (AUTO_INVOCATION_METRIC_SUFFIXES.some((suffix) => path.endsWith(suffix))) { - return true - } - const segments = path.split(".") - for (let i = 0; i < segments.length; i += 1) { - const candidate = segments.slice(i).join(".") - if (AUTO_INVOCATION_METRIC_CANONICAL_SET.has(canonicalizeMetricKey(candidate))) { - return true - } - } - return AUTO_INVOCATION_METRIC_CANONICAL_SET.has(canonicalizeMetricKey(path)) -} - -/** - * Build the data source (rows) for the virtualised scenario table. - * This logic was previously inline inside the table component; moving it here means - * the component can stay tidy while we have a single canonical place that knows: - * • which scenarios belong to the run - * • what their execution / annotation status is - * • how to present skeleton rows while data is still loading - */ - -export function buildScenarioTableRows({ - scenarioIds, - allScenariosLoaded, - skeletonCount = 20, - runId, - scenarioMetaById, -}: { - scenarioIds: string[] - allScenariosLoaded: boolean - skeletonCount?: number - runId: string - scenarioMetaById?: Map -}): TableRow[] { - if (!allScenariosLoaded) { - // Render placeholder skeleton rows (fixed count) so the table height is stable - return buildSkeletonRows(skeletonCount).map((r, idx) => ({ - ...r, - scenarioIndex: idx + 1, - })) - } - - let previousGroupKey: string | undefined - let temporalGroupIndex = -1 - - return scenarioIds.map((id, idx) => { - const meta = scenarioMetaById?.get(id) - const timestamp = meta?.timestamp || meta?.createdAt || null - const groupKey = timestamp ?? "__no_timestamp__" - const isGroupStart = groupKey !== previousGroupKey - if (isGroupStart) { - temporalGroupIndex += 1 - previousGroupKey = groupKey - } - - return { - key: id, - scenarioId: id, - scenarioIndex: idx + 1, - runId, - timestamp, - temporalGroupKey: groupKey, - temporalGroupIndex, - isTemporalGroupStart: isGroupStart, - } - }) -} - -/** - * Build raw ColumnDef list for scenario table. - */ -export function buildScenarioTableData({ - runIndex, - metricsFromEvaluators, - metrics, - runId, - evaluators, - evaluatorNameBySlug, - revisionSlugByEvaluatorSlug, -}: { - runIndex: RunIndex | null | undefined - metricsFromEvaluators: Record - metrics: Record - runId: string - evaluators: EvaluatorDto[] - evaluatorNameBySlug?: Record - revisionSlugByEvaluatorSlug?: Map -}): (ColumnDef & {values?: Record})[] { - const baseColumnDefs: ColumnDef[] = runIndex ? Object.values(runIndex.columnsByStep).flat() : [] - const evalType = evalAtomStore().get(evalTypeAtom) - const isHumanLikeEval = evalType === "human" - // || evalType === "online" - const resolveEvaluatorName = createEvaluatorNameResolver(evaluatorNameBySlug) - const metricStatsMap = (metrics || {}) as Record - const slugToStepKeyMap = new Map() - Object.entries(runIndex?.steps || {}).forEach(([key, meta]) => { - const slug = resolveSlugFromStepMeta(meta, revisionSlugByEvaluatorSlug) - if (slug && !slugToStepKeyMap.has(slug)) { - slugToStepKeyMap.set(slug, key) - } - }) - const baseSlugByRevisionSlug = buildBaseSlugByRevisionSlug(revisionSlugByEvaluatorSlug) - const evaluatorSlugSet = new Set( - (evaluators || []) - .map((e) => (typeof e?.slug === "string" ? e.slug : undefined)) - .filter((slug): slug is string => Boolean(slug)), - ) - - const columnsInput = baseColumnDefs.filter( - (col) => col.kind === "input" && col.name !== "testcase_dedup_id", - ) - const columnsInvocation = baseColumnDefs.filter((col) => col.kind === "invocation") - - if (!columnsInput.length && isHumanLikeEval && columnsInvocation.length) { - columnsInput.push({ - name: "Inputs", - kind: "input", - path: "__fallback_input__", - stepKey: columnsInvocation[0]?.stepKey ?? "__fallback_input__", - key: "__fallback_input__", - } as ColumnDef) - } - - // Further group metrics by evaluator when evaluators info present - const evaluatorMetricGroups: any[] = [] - const invocationMetricGroups: any[] = [] - const rawMetricsByEvaluator: Record = - metricsFromEvaluators && typeof metricsFromEvaluators === "object" - ? (metricsFromEvaluators as Record) - : {} - - const normalizedMetricsByEvaluator: Record = {} - const registerMetricDefinitions = (targetSlug: string, defs: any[]) => { - if (!targetSlug || !Array.isArray(defs)) return - if (!normalizedMetricsByEvaluator[targetSlug]) { - normalizedMetricsByEvaluator[targetSlug] = [] - } - defs.forEach((definition) => { - if (!definition || typeof definition !== "object") return - const normalizedDefinition: Record = {} - Object.entries(definition).forEach(([key, value]) => { - if (!key) return - const normalizedKey = normalizeEvaluatorMetricName(key) ?? key - normalizedDefinition[normalizedKey] = value - }) - if (Object.keys(normalizedDefinition).length) { - normalizedMetricsByEvaluator[targetSlug].push(normalizedDefinition) - } - }) - } - Object.entries(rawMetricsByEvaluator).forEach(([slug, defs]) => { - if (!Array.isArray(defs)) return - const preferred = resolvePreferredSlug(slug, revisionSlugByEvaluatorSlug) ?? slug - registerMetricDefinitions(preferred, defs) - }) - - const getMetricDefinitionsForSlug = buildMetricDefsLookup( - normalizedMetricsByEvaluator, - revisionSlugByEvaluatorSlug, - ) - - // Evaluator Metric Columns - if (metricsFromEvaluators && isHumanLikeEval) { - const annotationData = baseColumnDefs.filter((def) => def.kind === "annotation") - const columnsByEvaluator: Record = {} - - annotationData.forEach((data) => { - const stepMeta = runIndex?.steps?.[data.stepKey] - const slug = stepMeta?.key.split(".")[1] - if (!slug) return - ;(columnsByEvaluator[slug] ||= []).push(data) - }) - - const evaluatorSlugs = new Set() - Object.keys(columnsByEvaluator).forEach((slug) => { - const d = columnsByEvaluator[slug] - evaluatorSlugs.add(slug) - }) - - evaluatorSlugs.forEach((slug) => { - if (!slug) return - const slugColumns = columnsByEvaluator[slug] || [] - const baseSlugForRevision = baseSlugByRevisionSlug.get(slug) - const evaluator = - evaluators?.find((e) => e.slug === slug) || - evaluators?.find( - (e) => resolvePreferredSlug(e.slug, revisionSlugByEvaluatorSlug) === slug, - ) - const evaluatorLabel = resolveEvaluatorName(slug) - - const metricDefsForSlug = getMetricDefinitionsForSlug(slug) - const inferredMetricDefs = - metricDefsForSlug.length > 0 - ? metricDefsForSlug - : inferMetricsFromStatsForSlug( - slug, - metrics?.[slug] as Record, - baseSlugForRevision ? [baseSlugForRevision] : [], - ) - const resolvedMetricDefs = - inferredMetricDefs && inferredMetricDefs.length - ? inferredMetricDefs - : inferMetricsFromStatsForSlug( - slug, - metricStatsMap, - baseSlugForRevision ? [baseSlugForRevision] : [], - ) - - const resolveMetricType = (metricName: string) => { - const entry = resolvedMetricDefs.find((definition: Record) => { - if (!definition || typeof definition !== "object") return false - return Object.prototype.hasOwnProperty.call(definition, metricName) - }) - if (!entry) return undefined - return entry[metricName]?.metricType - } - - let children = - slugColumns.map((data) => { - const rawName = - data.name?.startsWith(`${slug}.`) && data.name.length > slug.length + 1 - ? data.name.slice(slug.length + 1) - : data.name - const metricName = normalizeEvaluatorMetricName(rawName) ?? rawName - const normalizedLabel = (metricName || rawName || "").toLowerCase() - if (normalizedLabel === "outputs" || normalizedLabel === "metrics") { - return undefined - } - const formattedMetricName = formatColumnTitle(metricName || data.name || "") - const primaryKey = metricName - ? `${slug}.attributes.ag.data.outputs.${metricName}` - : data.name || data.path - return { - ...data, - name: metricName || data.name, - title: formattedMetricName, - kind: "annotation" as const, - // kind: "metric" as const, - path: primaryKey, - stepKey: data.stepKey, - fallbackPath: data.path && data.path !== primaryKey ? data.path : undefined, - metricType: resolveMetricType(metricName || data.name || ""), - } - }) || ([].filter(Boolean) as ColumnDef[]) - - if (!children.length && resolvedMetricDefs.length) { - const seen = new Set() - const fallbackStepKey = slugColumns[0]?.stepKey || slugToStepKeyMap.get(slug) - children = resolvedMetricDefs - .map((definition: Record) => { - const metricName = Object.keys(definition || {})[0] - if (!metricName || seen.has(metricName)) return undefined - seen.add(metricName) - const formattedMetricName = formatColumnTitle(metricName) - return { - name: metricName, - title: formattedMetricName, - kind: "annotation" as const, - // kind: "metric" as const, - key: `${slug}.${metricName}`, - path: `${slug}.${metricName}`, - fallbackPath: `${slug}.${metricName}`, - stepKey: fallbackStepKey ?? "metric", - metricType: definition?.[metricName]?.metricType, - } - }) - .filter(Boolean) as ColumnDef[] - } - - if (!children.length) return - - evaluatorMetricGroups.push({ - title: evaluator?.name || evaluatorLabel, - key: `metrics_${slug}`, - children, - }) - }) - } - - if (metricsFromEvaluators && ["auto", "online", "custom"].includes(evalType)) { - const annotationData = baseColumnDefs.filter((def) => def.kind === "annotation") - - const stepSlugByKey = new Map() - Object.entries(runIndex?.steps || {}).forEach(([key, meta]) => { - if (meta.kind === "annotation") { - const slug = resolveSlugFromStepMeta(meta, revisionSlugByEvaluatorSlug) - if (slug) { - stepSlugByKey.set(key, slug) - } - } - }) - - const annotationColumnsBySlug: Record = {} - annotationData.forEach((column) => { - const slug = column.stepKey ? stepSlugByKey.get(column.stepKey) : undefined - if (!slug) return - ;(annotationColumnsBySlug[slug] ||= []).push(column) - }) - - const gatherMetricDefinitions = (key: string): any[] => { - const defs = getMetricDefinitionsForSlug(key) - if (defs.length) return defs - const alias = stepSlugByKey.get(key) - if (alias && alias !== key) { - return getMetricDefinitionsForSlug(alias) - } - return [] - } - - const sourceKeys = new Set() - Array.from(stepSlugByKey.keys()).forEach((key) => { - sourceKeys.add(key) - const slugFromKey = resolvePreferredSlug( - stepSlugByKey.get(key) || key, - revisionSlugByEvaluatorSlug, - ) - if (slugFromKey) sourceKeys.add(slugFromKey) - }) - const evaluatorGroupsBySlug = new Map< - string, - {title: string; key: string; children: ColumnDef[]; seen: Set} - >() - - const getChildIdentity = (child: ColumnDef): string | undefined => - (typeof child.key === "string" && child.key.length ? child.key : undefined) ?? - (typeof child.path === "string" && child.path.length ? child.path : undefined) ?? - (typeof child.name === "string" && child.name.length ? child.name : undefined) - - const appendChildrenToGroup = (slug: string, title: string, children: ColumnDef[]) => { - if (!children.length) return - const groupKey = `metrics_${slug}_evaluators` - const existing = evaluatorGroupsBySlug.get(groupKey) - if (!existing) { - const seen = new Set() - const deduped: ColumnDef[] = [] - children.forEach((child) => { - const identity = getChildIdentity(child) - if (!identity || seen.has(identity)) return - seen.add(identity) - deduped.push(child) - }) - if (!deduped.length) return - evaluatorGroupsBySlug.set(groupKey, { - title, - key: groupKey, - children: deduped, - seen, - }) - return - } - children.forEach((child) => { - const identity = getChildIdentity(child) - if (!identity || existing.seen.has(identity)) return - existing.seen.add(identity) - existing.children.push(child) - }) - } - - sourceKeys.forEach((rawKey) => { - const slug = resolvePreferredSlug( - stepSlugByKey.get(rawKey) || rawKey, - revisionSlugByEvaluatorSlug, - ) - if (!slug) return - - const stepData = runIndex?.steps?.[rawKey] - - const baseSlugForRevision = baseSlugByRevisionSlug.get(slug) - const evaluator = evaluators?.find((e) => e.id === stepData?.refs?.evaluator?.id) - const evaluatorLabel = resolveEvaluatorName(slug) - const metricDefsPrimary = gatherMetricDefinitions(rawKey) - let metricDefsForKey = - metricDefsPrimary && metricDefsPrimary.length - ? metricDefsPrimary - : gatherMetricDefinitions(slug) - if (!metricDefsForKey || !metricDefsForKey.length) { - const relatedSlugs = new Set() - if (typeof rawKey === "string" && rawKey.length) relatedSlugs.add(rawKey) - const alias = stepSlugByKey.get(rawKey) - if (alias && alias !== slug) relatedSlugs.add(alias) - if (baseSlugForRevision) relatedSlugs.add(baseSlugForRevision) - metricDefsForKey = inferMetricsFromStatsForSlug( - slug, - metricStatsMap, - Array.from(relatedSlugs), - ) - } - - const normalizedRawKey = resolvePreferredSlug( - stepSlugByKey.get(rawKey) || rawKey, - revisionSlugByEvaluatorSlug, - ) - const columnsForKey = [ - ...(annotationColumnsBySlug[slug] || []), - ...(normalizedRawKey && normalizedRawKey !== slug - ? annotationColumnsBySlug[normalizedRawKey] || [] - : []), - ] - const hasMetricDefs = - normalizedMetricsByEvaluator[slug]?.length || - (normalizedRawKey && normalizedMetricsByEvaluator[normalizedRawKey]?.length) || - (metricDefsForKey?.length ?? 0) > 0 - - if (!columnsForKey.length && !hasMetricDefs && !metricDefsForKey?.length) { - return - } - - const seen = new Set() - const children: ColumnDef[] = [] - const pushChild = (child?: ColumnDef) => { - if (!child) return - const key = child.key || child.path || child.name - if (!key) return - if (seen.has(key)) return - seen.add(key) - children.push(child) - } - - const appendMetricDefs = (definitions: Record[]) => { - definitions.forEach((definition: Record) => { - const originalName = Object.keys(definition || {})[0] - const metricName = normalizeEvaluatorMetricName(originalName) ?? originalName - const metricType = definition?.[metricName]?.metricType - if (!metricName) return - if (metricType === "object") return - const canonicalKey = `${slug}.${metricName}` - if (seen.has(canonicalKey)) return - const candidatesForSkip = [ - canonicalKey, - metricName, - `attributes.ag.data.outputs.${metricName}`, - ] - if ( - candidatesForSkip.some((candidate) => - matchesGeneralInvocationMetric(candidate), - ) - ) { - return - } - const formattedName = formatColumnTitle(metricName) - - pushChild({ - name: metricName, - title: formattedName, - kind: "annotation" as const, - key: canonicalKey, - path: `${rawKey}.${OUTPUT_PREFIX}${metricName}`, - stepKey: rawKey ?? "metric", - metricType, - }) - }) - } - - if (metricDefsForKey.length) { - appendMetricDefs(metricDefsForKey) - } - - if (!children.length) return - - appendChildrenToGroup(slug, evaluator?.name || evaluatorLabel, children) - }) - - evaluatorGroupsBySlug.forEach(({seen: _seen, ...group}) => { - evaluatorMetricGroups.push(group) - }) - } - const genericMetricsGroup = { - title: "Metrics", - key: "__metrics_group__", - children: - evalType === "human" ? GeneralHumanEvalMetricColumns : GeneralAutoEvalMetricColumns, - } - - let metaStart: ColumnDef[] = [ - {name: "#", kind: "meta" as any, path: "scenarioIndex", stepKey: "meta"}, - ] - - if (evalType === "online") { - metaStart.push({ - name: "Timestamp", - kind: "meta" as any, - path: "timestamp", - key: "timestamp", - stepKey: "meta", - }) - } - - const metaEnd: ColumnDef[] = - evalType === "human" - ? [{name: "Action", kind: "meta" as any, path: "action", stepKey: "meta"}] - : [] - - const columnsCore = [...columnsInput, ...columnsInvocation, ...evaluatorMetricGroups] - if (genericMetricsGroup) columnsCore.push(genericMetricsGroup as any) - const columns = [...metaStart, ...columnsCore, ...metaEnd] - - return columns -} - -/** - * Build columns for comparison mode showing multiple runs side-by-side - */ -export function buildComparisonTableColumns({ - baseRunId, - comparisonRunIds, - baseRunIndex, - comparisonRunIndexes, - metricsFromEvaluators, - evaluatorNameBySlug, -}: { - baseRunId: string - comparisonRunIds: string[] - baseRunIndex: RunIndex | null | undefined - comparisonRunIndexes: Record - metricsFromEvaluators: Record> - evaluatorNameBySlug?: Record -}): (ColumnDef & {values?: Record})[] { - if (!baseRunIndex) return [] - - const allRunIds = [baseRunId, ...comparisonRunIds] - const evalType = evalAtomStore().get(evalTypeAtom) - const resolveEvaluatorName = createEvaluatorNameResolver(evaluatorNameBySlug) - - // Start with meta columns - const metaColumns: ColumnDef[] = [ - {name: "#", kind: "meta" as any, path: "scenarioIndex", stepKey: "meta"}, - ] - - // Get base column definitions (inputs, outputs, etc.) - const baseColumnDefs: ColumnDef[] = Object.values(baseRunIndex.columnsByStep).flat() - const inputOutputColumns = baseColumnDefs - .filter((col) => col.kind !== "annotation" && col.kind !== "metric") - .filter((col) => col.name !== "testcase_dedup_id") - - // For comparison mode, we want to show inputs once, then outputs/metrics for each run - const inputColumns = inputOutputColumns.filter((col) => col.stepKey === "input") - - // Create run-specific output columns - const runSpecificColumns: any[] = [] - - allRunIds.forEach((runId, index) => { - const isBase = index === 0 - const runLabel = isBase ? "Base" : `Run ${index}` - const runShort = runId.slice(0, 8) - - // Output columns for this run - const outputColumns = inputOutputColumns - .filter((col) => col.stepKey === "output") - .map((col) => ({ - ...col, - name: `${col.name} (${runLabel})`, - title: `${col.name} (${runShort})`, - runId, - isComparison: !isBase, - })) - - // Metric columns for this run - if (metricsFromEvaluators && evalType !== "auto") { - const annotationData = baseColumnDefs.filter((def) => def.kind === "annotation") - const groupedAnnotationData = groupBy(annotationData, (data) => { - return data.name.split(".")[0] - }) - - for (const [evaluatorSlug, annotations] of Object.entries(groupedAnnotationData)) { - const evaluatorLabel = resolveEvaluatorName(evaluatorSlug) - const metricGroup = { - title: `${evaluatorLabel} (${runLabel})`, - key: `metrics_${evaluatorSlug}_${runId}`, - runId, - isComparison: !isBase, - children: annotations.map((data) => { - const [, metricName] = data.name.split(".") - return { - ...data, - name: metricName, - title: `${metricName} (${runShort})`, - kind: "metric", - path: data.name, - stepKey: "metric", - runId, - isComparison: !isBase, - metricType: metricsFromEvaluators[evaluatorSlug]?.find( - (x) => metricName in x, - )?.[metricName]?.metricType, - } - }), - } - runSpecificColumns.push(metricGroup) - } - } - - runSpecificColumns.push(...outputColumns) - }) - - const actionColumns: ColumnDef[] = [ - {name: "Action", kind: "meta" as any, path: "action", stepKey: "meta"}, - ] - - return [...metaColumns, ...inputColumns, ...runSpecificColumns, ...actionColumns] -} - -/** - * Build rows for comparison mode with data from multiple runs - */ -export function buildComparisonTableRows({ - scenarioIds, - baseRunId, - comparisonRunIds, - allScenariosLoaded, - skeletonCount = 20, -}: { - scenarioIds: string[] - baseRunId: string - comparisonRunIds: string[] - allScenariosLoaded: boolean - skeletonCount?: number -}): TableRow[] { - if (!allScenariosLoaded) { - return buildSkeletonRows(skeletonCount).map((r, idx) => ({ - ...r, - scenarioIndex: idx + 1, - })) - } - - return scenarioIds.map((scenarioId, idx) => { - const row: TableRow = { - key: scenarioId, - scenarioIndex: idx + 1, - scenarioId, - baseRunId, - comparisonRunIds, - } - - // Add run-specific data placeholders - // The actual data will be populated by the table cells using atoms - const allRunIds = [baseRunId, ...comparisonRunIds] - allRunIds.forEach((runId) => { - row[`${runId}_data`] = { - runId, - scenarioId, - // Cell components will use atoms to get actual data - } - }) - - return row - }) -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/evaluatorNameUtils.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/evaluatorNameUtils.ts deleted file mode 100644 index cbf2e51414..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/evaluatorNameUtils.ts +++ /dev/null @@ -1,86 +0,0 @@ -const toIterable = (input: any): any[] => { - if (!input) return [] - if (Array.isArray(input)) return input - if (typeof input === "object") return Object.values(input) - return [] -} - -const pickString = (candidate: unknown): string | undefined => { - if (typeof candidate === "string") { - const trimmed = candidate.trim() - if (trimmed.length) return trimmed - } - return undefined -} - -const extractSlug = (entry: any): string | undefined => { - return ( - pickString(entry?.slug) ?? - pickString(entry?.key) ?? - pickString(entry?.id) ?? - pickString(entry?.meta?.slug) ?? - pickString(entry?.flags?.slug) - ) -} - -const extractName = (entry: any): string | undefined => { - const candidates = [ - entry?.name, - entry?.displayName, - entry?.display_name, - entry?.title, - entry?.meta?.displayName, - entry?.meta?.display_name, - entry?.meta?.name, - entry?.flags?.display_name, - entry?.flags?.name, - entry?.data?.display_name, - ] - for (const candidate of candidates) { - const resolved = pickString(candidate) - if (resolved) return resolved - } - return undefined -} - -export const buildEvaluatorNameMap = ( - ...sources: Array | Record | null | undefined> -): Record => { - const map = new Map() - const register = (entry: any) => { - if (!entry) return - const slug = extractSlug(entry) - if (!slug || map.has(slug)) return - const name = extractName(entry) - if (name) { - map.set(slug, name) - } - } - sources.forEach((source) => { - toIterable(source).forEach(register) - }) - return Object.fromEntries(map.entries()) -} - -export const createEvaluatorNameResolver = ( - namesBySlug?: Record, -): ((slug?: string | null) => string) => { - const resolvedNames = namesBySlug ?? {} - const fallback = new Map() - let unnamedCounter = 1 - - return (rawSlug?: string | null) => { - const slug = pickString(rawSlug) - if (slug) { - const mapped = pickString(resolvedNames[slug]) - if (mapped) return mapped - if (fallback.has(slug)) return fallback.get(slug) as string - const label = `Evaluator ${unnamedCounter++}` - fallback.set(slug, label) - return label - } - - const genericLabel = `Evaluator ${unnamedCounter++}` - return genericLabel - } -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/evaluatorSchemaUtils.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/evaluatorSchemaUtils.ts deleted file mode 100644 index 795cc9373b..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/evaluatorSchemaUtils.ts +++ /dev/null @@ -1,159 +0,0 @@ -export const toArray = (value: any): any[] => { - if (!value) return [] - if (Array.isArray(value)) return value - if (typeof value === "object") return Object.values(value) - return [] -} - -export const pickString = (candidate: unknown): string | undefined => { - if (typeof candidate === "string") { - const trimmed = candidate.trim() - if (trimmed.length > 0) return trimmed - } - return undefined -} - -export const collectEvaluatorIdentifiers = (entry: any): string[] => { - if (!entry || typeof entry !== "object") return [] - const ids = new Set() - ;[ - entry?.slug, - entry?.id, - entry?.key, - entry?.uid, - entry?.meta?.evaluator_key, - entry?.flags?.evaluator_key, - entry?.data?.slug, - entry?.data?.id, - entry?.data?.key, - entry?.data?.evaluator_key, - ].forEach((candidate) => { - const value = pickString(candidate) - if (value) ids.add(value.toLowerCase()) - }) - return Array.from(ids) -} - -const mergePlainObjects = (primary: any, fallback: any): any => { - if (primary === undefined || primary === null) return fallback - if (fallback === undefined || fallback === null) return primary - - const primaryIsObject = typeof primary === "object" && !Array.isArray(primary) - const fallbackIsObject = typeof fallback === "object" && !Array.isArray(fallback) - - if (primaryIsObject && fallbackIsObject) { - const result: Record = {...fallback} - Object.entries(primary).forEach(([key, value]) => { - result[key] = mergePlainObjects(value, (fallback as Record)[key]) - }) - return result - } - - return primary -} - -export const mergeEvaluatorRecords = (runEvaluator?: any, catalogEvaluator?: any): any => { - if (!runEvaluator) return catalogEvaluator - if (!catalogEvaluator) return runEvaluator - - const merged: Record = { - ...catalogEvaluator, - ...runEvaluator, - } - - merged.data = mergePlainObjects(runEvaluator?.data, catalogEvaluator?.data) - merged.settings_values = mergePlainObjects( - runEvaluator?.settings_values, - catalogEvaluator?.settings_values, - ) - merged.metrics = mergePlainObjects(runEvaluator?.metrics, catalogEvaluator?.metrics) - - return merged -} - -export const collectMetricSchemasFromEvaluator = ( - evaluator: any, -): Array<{name: string; schema: any}> => { - if (!evaluator || typeof evaluator !== "object") return [] - const map = new Map() - const register = (obj: any) => { - if (!obj || typeof obj !== "object") return - Object.entries(obj).forEach(([key, schema]) => { - if (!map.has(key)) { - map.set(key, schema) - } - }) - } - - register(evaluator?.metrics) - register(evaluator?.data?.schemas?.outputs?.properties) - register(evaluator?.data?.service?.format?.properties?.outputs?.properties) - register(evaluator?.data?.service?.configuration?.format?.properties?.outputs?.properties) - register(evaluator?.data?.configuration?.format?.properties?.outputs?.properties) - register(evaluator?.data?.service?.format?.outputs?.properties) - register(evaluator?.data?.service?.configuration?.outputs?.properties) - register(evaluator?.data?.configuration?.outputs?.properties) - - return Array.from(map.entries()).map(([name, schema]) => ({name, schema})) -} - -export const deriveSchemaMetricType = (schema: any): string | string[] | undefined => { - if (!schema || typeof schema !== "object") return undefined - const normalizeType = (value: unknown) => { - if (!value) return undefined - if (Array.isArray(value)) { - const types = value - .map((entry) => - typeof entry === "string" - ? entry.toLowerCase() - : typeof entry?.type === "string" - ? entry.type.toLowerCase() - : undefined, - ) - .filter(Boolean) as string[] - if (types.length) return Array.from(new Set(types)) - return undefined - } - if (typeof value === "string") { - return value.toLowerCase() - } - if (typeof value === "object" && value !== null) { - return normalizeType((value as Record).type) - } - return undefined - } - - const primaryType = normalizeType(schema.type) - if (primaryType) return primaryType - - const compositeKeys: Array<"anyOf" | "oneOf" | "allOf"> = ["anyOf", "oneOf", "allOf"] - for (const key of compositeKeys) { - if (Array.isArray(schema[key])) { - const set = new Set() - schema[key].forEach((node: any) => { - const type = deriveSchemaMetricType(node) - if (!type) return - if (Array.isArray(type)) type.forEach((entry) => set.add(entry)) - else set.add(type) - }) - if (set.size) { - const arr = Array.from(set) - return arr.length === 1 ? arr[0] : arr - } - } - } - - if (Array.isArray(schema.enum) && schema.enum.length) { - if (schema.enum.every((value: unknown) => typeof value === "boolean")) return "boolean" - if (schema.enum.every((value: unknown) => typeof value === "number")) return "number" - if (schema.enum.every((value: unknown) => typeof value === "string")) return "string" - } - - if (schema.items) { - const itemType = deriveSchemaMetricType(schema.items) - if (itemType) return itemType - return "array" - } - - return undefined -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder.ts deleted file mode 100644 index a9bd65fcb0..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/flatDataSourceBuilder.ts +++ /dev/null @@ -1,8 +0,0 @@ -// ---------------- Helpers ------------------ -export const titleCase = (str: string) => - String(str || "") - .replace(/([a-z0-9])([A-Z])/g, "$1 $2") - .replace(/_/g, " ") - .replace(/\s+/g, " ") - .trim() - .replace(/^[a-z]|\s[a-z]/g, (m) => m.toUpperCase()) diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/types.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/types.ts deleted file mode 100644 index 916a7e4cf8..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {SchemaMetricType} from "@/oss/lib/metricUtils" - -export interface BaseColumn { - name: string - title: string - key: string - kind: string - path: string - fallbackPath?: string - stepKey: string - stepKeyByRunId?: Record - metricType: SchemaMetricType - children?: TableColumn[] -} - -export interface TableColumn extends BaseColumn { - children?: TableColumn[] -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/utils.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/utils.tsx deleted file mode 100644 index c2843b89de..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/utils.tsx +++ /dev/null @@ -1,811 +0,0 @@ -import clsx from "clsx" - -import {EnhancedColumnType} from "@/oss/components/EnhancedUIs/Table/types" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {Expandable} from "@/oss/components/Tables/ExpandableCell" -import {evalAtomStore} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {getMetricConfig} from "@/oss/lib/metrics/utils" -import {buildMetricSorter} from "@/oss/lib/metricSorter" -import {extractPrimitive, isSortableMetricType} from "@/oss/lib/metricUtils" - -import { - runMetricsStatsCacheFamily, - runScopedMetricDataFamily, - scenarioMetricValueFamily, -} from "../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {EVAL_BG_COLOR} from "../../../AutoEvalRun/assets/utils" -import type {TableRow} from "../types" - -import ActionCell from "./ActionCell" -import type {EvaluatorFailureMap} from "./atoms/evaluatorFailures" -import { - CellWrapper, - InputCell, - InputSummaryCell, - InvocationResultCell, - SkeletonCell, -} from "./CellComponents" -import {COLUMN_WIDTHS} from "./constants" -import {titleCase} from "./flatDataSourceBuilder" -import CollapsedAnnotationValueCell from "./MetricCell/CollapsedAnnotationValueCell" -import CollapsedMetricValueCell, { - AutoEvalCollapsedMetricValueCell, -} from "./MetricCell/CollapsedMetricValueCell" -import {AnnotationValueCell, EvaluatorFailureCell, MetricValueCell} from "./MetricCell/MetricCell" -import TimestampCell from "./TimestampCell" -import {BaseColumn, TableColumn} from "./types" - -// ---------------- Helpers to detect/normalize annotation-like metric paths ---------------- -const OUT_PREFIX = "attributes.ag.data.outputs." -const IN_PREFIX = "attributes.ag.data.inputs." - -/** A “metric” column that actually points inside the annotation payload. */ -const isAnnotationLikeMetricPath = (p?: string) => - typeof p === "string" && (p.includes(OUT_PREFIX) || p.includes(IN_PREFIX)) - -/** Strip the run-scoped prefix to the field path used by AnnotationValueCell helpers. */ -const toAnnotationFieldPath = (p: string) => - p.includes(OUT_PREFIX) - ? p.slice(OUT_PREFIX.length) - : p.includes(IN_PREFIX) - ? p.slice(IN_PREFIX.length) - : p -// ------------------------------------------------------------------------------------------ - -// Helper to compare metric/annotation primitives across scenarios (used for sorting metrics) -function scenarioMetricPrimitive(recordKey: string, column: any, runId: string) { - const st = evalAtomStore() - let raw: any = column.values?.[recordKey] - if (raw === undefined) { - const metricKey = column.path || column.key || column.name || "" - const fallbackKey = column.fallbackPath - if (column.kind === "metric") { - const stepSlug = - column.stepKey && column.stepKey.includes(".") - ? column.stepKey.split(".")[1] - : undefined - raw = st.get( - scenarioMetricValueFamily({ - runId, - scenarioId: recordKey, - metricKey, - stepSlug, - }) as any, - ) - if ((raw === undefined || raw === null) && fallbackKey && fallbackKey !== metricKey) { - raw = st.get( - scenarioMetricValueFamily({ - runId, - scenarioId: recordKey, - metricKey: fallbackKey, - stepSlug, - }) as any, - ) - } - } else { - const stepSlug = - column.stepKey && column.stepKey.includes(".") - ? column.stepKey.split(".")[1] - : undefined - raw = st.get( - runScopedMetricDataFamily({ - scenarioId: recordKey, - stepSlug, - metricKey, - runId, - }) as any, - )?.value - if ((raw === undefined || raw === null) && fallbackKey && fallbackKey !== metricKey) { - raw = st.get( - runScopedMetricDataFamily({ - scenarioId: recordKey, - stepSlug, - metricKey: fallbackKey, - runId, - }) as any, - )?.value - } - } - } - return extractPrimitive(raw) -} - -function scenarioMetricSorter(column: any, runId: string) { - return buildMetricSorter((row) => - scenarioMetricPrimitive(row.key as string, column, runId), - ) -} - -/** - * Transforms a list of scenario metrics into a map of scenarioId -> metrics, merging - * nested metrics under `outputs` into the same level. - */ -export const getScenarioMetricsMap = ({scenarioMetrics}: {scenarioMetrics: any[]}) => { - const map: Record> = {} - const _metrics = scenarioMetrics || [] - - _metrics.forEach((m: any) => { - const sid = m.scenarioId - if (!sid) return - - const data: Record = - m && typeof m === "object" && m.data && typeof m.data === "object" ? {...m.data} : {} - - if (data.outputs && typeof data.outputs === "object") { - Object.assign(data, data.outputs) - delete data.outputs - } - - if (!map[sid]) map[sid] = {} - Object.assign(map[sid], data) - }) - - return map -} - -// ---------------- Column adapter ------------------ -const generateColumnTitle = (col: BaseColumn) => { - if (col.kind === "metric") { - if (typeof col.title === "string" && col.title.trim().length > 0) { - return col.title - } - if (typeof col.path === "string") { - return getMetricConfig(col.path).label - } - } - if (col.kind === "invocation") return titleCase(col.name) - if (col.kind === "annotation") return titleCase(col.name) - return titleCase(col.title ?? col.name) -} - -const generateColumnWidth = (col: BaseColumn) => { - if (col.kind === "meta") return 80 - if (col.kind === "input") return COLUMN_WIDTHS.input - if (col.kind === "metric") return COLUMN_WIDTHS.metric - if (col.kind === "annotation") return COLUMN_WIDTHS.metric - if (col.kind === "invocation") return COLUMN_WIDTHS.response - return 20 -} - -const orderRank = (def: EnhancedColumnType): number => { - if (def.key === "#") return 0 - if (def.key === "timestamp") return 1 - if (def.key === "inputs_group") return 2 - if (def.key === "outputs" || def.key === "output") return 3 - if (def.key === "Status") return 4 - if (def.key === "annotation" || def.key?.includes("metrics")) return 5 - if (def.key?.includes("evaluators")) return 6 - if (def.key === "__metrics_group__") return 7 - if (def.key === "errors") return 9 // ensure errors column stays at the end of metrics group - return 8 -} - -const normalizeEvaluatorSlug = (slug?: string) => - slug ? slug.replace(/[\s._-]+/g, "").toLowerCase() : "" - -const resolveEvaluatorFailure = ( - map: EvaluatorFailureMap | undefined, - scenarioId: string, - slug?: string, -) => { - if (!map || !slug) return undefined - const failures = map.get(scenarioId) - if (!failures) return undefined - if (failures[slug]) return failures[slug] - const target = normalizeEvaluatorSlug(slug) - if (!target) return undefined - const entry = Object.entries(failures).find( - ([candidateSlug]) => normalizeEvaluatorSlug(candidateSlug) === target, - ) - return entry?.[1] -} - -export function buildAntdColumns( - cols: TableColumn[], - runId: string, - options: { - evaluatorFailuresMap?: EvaluatorFailureMap - expendedRows?: Record - } = {}, -): EnhancedColumnType[] { - const evaluatorFailuresMap = options?.evaluatorFailuresMap - const expendedRows = options?.expendedRows - const resolveStepKeyForRun = (column: TableColumn, targetRunId: string) => { - return column.stepKeyByRunId?.[targetRunId] ?? column.stepKey - } - const distMap = runId ? evalAtomStore().get(runMetricsStatsCacheFamily(runId)) : {} - const evalType = evalAtomStore().get(evalTypeAtom) - - const resolveComparisonBackground = (record?: TableRow) => { - const compareIndex = (record as any)?.compareIndex - if (compareIndex === undefined || compareIndex === null) return undefined - const key = String(compareIndex) - const color = - (EVAL_BG_COLOR as Record)[key] ?? - (typeof compareIndex === "number" - ? (EVAL_BG_COLOR as Record)[compareIndex] - : undefined) - if (color) { - return {backgroundColor: color} - } - return undefined - } - - const temporalCellClasses = (record?: TableRow) => { - if (!record) return "" - if ((record as any)?.compareIndex) return "" - const bgClass = - typeof record.temporalGroupIndex === "number" && record.temporalGroupIndex % 2 === 0 - ? "bg-slate-50" - : "bg-white" - const borderClass = record.isTemporalGroupStart - ? "border-t border-slate-200 first:border-t-0" - : "" - return clsx(bgClass, borderClass) - } - - const temporalContentPadding = (record?: TableRow) => - record?.isTemporalGroupStart ? "pt-3" : "pt-1" - - // Count how many input/output columns we have - const inputColumns = cols.filter((col) => col.kind === "input") - const outputColumns = cols.filter((col) => col.kind === "invocation") - - return cols - .map((c: TableColumn): EnhancedColumnType | null => { - const editLabel = generateColumnTitle(c) - const common = { - metricType: c.metricType ?? c.kind, - title: editLabel, - key: c.key ?? c.name, - minWidth: generateColumnWidth(c), - width: generateColumnWidth(c), - __editLabel: editLabel, - } - - // Sorting: - // - keep sorting for true numeric/boolean/string metrics - // - disable sorting for annotation-like metric paths (their values come from annotations, not metrics atoms) - const sortable = - (c.kind === "metric" || c.kind === "annotation") && - !isAnnotationLikeMetricPath(c.path) && - isSortableMetricType(c.metricType) - - const sorter = sortable ? scenarioMetricSorter(c, runId) : undefined - - if (c.children) { - // drop empty wrapper groups - if ((!c.title && !c.name) || c.kind === "metrics_group") { - return { - ...common, - __editLabel: editLabel, - children: buildAntdColumns(c.children, runId, options), - } as EnhancedColumnType - } - if (c.key === "__metrics_group__" || c.key?.startsWith("metrics_")) { - return { - title: ( - - {c.key === "__metrics_group__" ? "Metrics" : (c.title ?? "")} - - ), - dataIndex: c.key, - collapsible: true, - key: c.key, - __editLabel: editLabel, - renderAggregatedData: ({record}) => { - const hasAnnotation = - Array.isArray(c.children) && - c.children.some((ch: any) => ch.kind === "annotation") - const evaluatorSlug = - c.key === "__metrics_group__" - ? undefined - : c.name || - c.key.replace(/^metrics_/, "").replace(/_evaluators/, "") - const scenarioId = (record as any).scenarioId || (record as any).key - const failure = resolveEvaluatorFailure( - evaluatorFailuresMap, - scenarioId, - evaluatorSlug, - ) - if (failure) { - return ( - - ) - } - if (hasAnnotation) { - return ( - - ) - } - return evalType === "auto" || evalType === "custom" ? ( - - ) : ( - - ) - }, - children: buildAntdColumns(c.children, runId, options), - } - } - - return { - ...common, - __editLabel: editLabel, - title: titleCase(c.title ?? c.name), - key: c.key ?? c.name, - children: buildAntdColumns(c.children, runId, options), - } as EnhancedColumnType - } - - if (c.kind === "meta") { - switch (c.path) { - case "scenarioIndex": - return { - ...common, - fixed: "left", - width: 50, - minWidth: 50, - onCell: (record) => { - const showBorder = - expendedRows?.[record.key] || - (record?.isComparison && !record.isLastRow) - return { - className: clsx( - temporalCellClasses(record), - showBorder && "!border-b-0", - showBorder - ? "!p-0" - : record?.children?.length || record?.isComparison - ? "!p-0" - : undefined, - ), - style: resolveComparisonBackground(record), - } - }, - render: (_: any, record: TableRow) => ( - - {record.scenarioIndex} - - ), - } - case "timestamp": - return { - ...common, - width: 200, - minWidth: 180, - render: (_: any, record: TableRow) => { - const effectiveRunId = (record as any).runId || runId - return ( - - ) - }, - } - case "action": - if (evalType === "auto" || evalType === "custom") return null - return { - ...common, - fixed: "right", - width: 120, - minWidth: 120, - render: (_: any, record: TableRow) => { - const effectiveRunId = (record as any).runId || runId - return ( - - ) - }, - } - default: - return {...common, dataIndex: c.path} - } - } - - if (c.kind === "input") { - const isFallbackInput = c.path === "__fallback_input__" - if (isFallbackInput) { - return { - ...common, - title: ( - - Inputs - - ), - key: "inputs_group", - addNotAvailableCell: false, - onCell: (record) => { - const showBorder = - expendedRows?.[record.key] || - (record?.isComparison && !record.isLastRow) - return { - className: clsx( - temporalCellClasses(record), - showBorder && "!border-b-0", - ), - style: resolveComparisonBackground(record), - } - }, - render: (_: any, record: TableRow) => { - if (record.isComparison) return "" - const effectiveRunId = (record as any).runId || runId - const scenarioId = record.scenarioId || record.key - return ( - - ) - }, - } - } - - const isFirstInput = inputColumns.length > 0 && inputColumns[0] === c - if (!isFirstInput) return null - - return { - title: ( - Inputs - ), - dataIndex: "inputs_group", - key: "inputs_group", - align: "left", - collapsible: true, - addNotAvailableCell: false, - onCell: (record) => { - const showBorder = - expendedRows?.[record.key] || - (record?.isComparison && !record.isLastRow) - return { - className: clsx( - temporalCellClasses(record), - showBorder && "!border-b-0", - ), - style: resolveComparisonBackground(record), - } - }, - renderAggregatedData: ({record, isCollapsed}) => { - if (record.isComparison) return null - const effectiveRunId = (record as any).runId || runId - const scenarioId = record.scenarioId || record.key - const shouldShowPrefix = evalType !== "online" - return ( -
    - - {inputColumns.map((inputCol) => ( -
    - {shouldShowPrefix ? ( - - {titleCase(inputCol.name!)}: - - ) : null} -
    - -
    -
    - ))} -
    -
    - ) - }, - children: inputColumns.map((inputCol, idx) => ({ - title: titleCase(inputCol.name!), - key: `${inputCol.name}-input-${idx}`, - addNotAvailableCell: false, - onCell: (record) => { - const showBorder = - expendedRows?.[record.key] || - (record?.isComparison && !record.isLastRow) - return { - className: clsx( - temporalCellClasses(record), - showBorder && "!border-b-0", - ), - style: resolveComparisonBackground(record), - } - }, - render: (_: any, record: TableRow) => { - if (record.isComparison) return "" - const shouldShowPrefix = evalType !== "online" - const effectiveRunId = (record as any).runId || runId - const scenarioId = record.scenarioId || record.key - return ( - - ) - }, - })), - } - } - - if (c.kind === "invocation") { - const createOutputColumnDef = ( - outputCol: TableColumn, - idx: number, - totalOutputs: number, - ) => { - const isOnlineEval = evalType === "online" - const isAutoEval = evalType === "auto" || evalType === "custom" - const useSingleColumnLayout = isOnlineEval || (isAutoEval && totalOutputs <= 1) - const outputKey = outputCol.name || outputCol.path || `output-${idx}` - const columnTitle = useSingleColumnLayout - ? "Output" - : titleCase(outputKey || `Output ${idx + 1}`) - const editLabelForOutput = useSingleColumnLayout - ? "Output" - : generateColumnTitle(outputCol) - return { - metricType: outputCol.metricType ?? outputCol.kind, - title: columnTitle, - key: useSingleColumnLayout - ? "output" - : (outputCol.key ?? `${outputKey}-output-${idx}`), - minWidth: generateColumnWidth(outputCol), - width: generateColumnWidth(outputCol), - __editLabel: editLabelForOutput, - addNotAvailableCell: false, - onCell: (record) => { - const showBorder = - expendedRows?.[record.key] || - (record?.isComparison && !record.isLastRow) - return { - className: clsx( - temporalCellClasses(record), - showBorder && "!border-b-0", - ), - } - }, - render: (_: any, record: TableRow) => { - const effectiveRunId = (record as any).runId || runId - const scenarioId = record.scenarioId || record.key - return ( - - ) - }, - } as EnhancedColumnType - } - - if ( - evalType === "online" || - ((evalType === "auto" || evalType === "custom") && outputColumns.length <= 1) - ) { - const outputIndex = Math.max(outputColumns.indexOf(c), 0) - return createOutputColumnDef(c, outputIndex, outputColumns.length) - } - - const isFirstOutput = outputColumns.length > 0 && outputColumns[0] === c - if (!isFirstOutput) return null - - return { - title: ( - Outputs - ), - dataIndex: "outputs", - key: "outputs", - align: "left", - collapsible: true, - addNotAvailableCell: false, - onCell: (record) => { - const showBorder = - expendedRows?.[record.key] || - (record?.isComparison && !record.isLastRow) - return { - className: clsx( - temporalCellClasses(record), - showBorder && "!border-b-0", - ), - style: resolveComparisonBackground(record), - } - }, - renderAggregatedData: ({record}) => { - return ( - - Expand the Outputs group to inspect invocation results. - - ) - }, - children: outputColumns.map((outputCol, idx) => - createOutputColumnDef(outputCol, idx, outputColumns.length), - ), - } - } - - // --------- Leaf cells ---------- - return { - ...common, - sorter, - render: (_unused: any, record: TableRow) => { - const effectiveRunId = (record as any).runId || runId - - switch (c.kind) { - case "input": { - const inputStepKey = resolveStepKeyForRun(c, effectiveRunId) - return ( - - ) - } - case "invocation": { - const invocationStepKey = resolveStepKeyForRun(c, effectiveRunId) - return ( - - ) - } - case "annotation": { - const annotationStepKey = resolveStepKeyForRun(c, effectiveRunId) - return ( - - ) - } - case "metric": { - // If this “metric” is actually pointing inside annotations, render via AnnotationValueCell - // if (isAnnotationLikeMetricPath(c.path)) { - // const annotationStepKey = resolveStepKeyForRun(c, effectiveRunId) - // const fieldPath = toAnnotationFieldPath(c.path) - // return ( - // - // ) - // } - - const scenarioId = record.scenarioId || record.key - const evaluatorSlug = (c as any).evaluatorSlug as string | undefined - const groupIndex = (c as any).evaluatorColumnIndex ?? 0 - const groupCount = (c as any).evaluatorColumnCount ?? 1 - const failure = resolveEvaluatorFailure( - evaluatorFailuresMap, - scenarioId, - evaluatorSlug, - ) - - if (failure) { - if (groupIndex === 0) { - return { - children: ( - - ), - props: {colSpan: Math.max(groupCount, 1)}, - } - } - return {children: null, props: {colSpan: 0}} - } - - return ( - - ) - } - default: - return record.isSkeleton ? ( - - ) : ( - (c.values?.[record.scenarioId || record.key] ?? "") - ) - } - }, - } - }) - .filter(Boolean) - .sort((a, b) => { - if (!a || !b) return 0 - const r = orderRank(a) - orderRank(b) - if (r !== 0) return r - const aName = "title" in a && a.title ? String(a.title) : a.key - const bName = "title" in b && b.title ? String(b.title) : b.key - return aName?.localeCompare(bName) - }) as EnhancedColumnType[] -} diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useExpandableComparisonDataSource.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useExpandableComparisonDataSource.tsx deleted file mode 100644 index 6af6d7d86e..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useExpandableComparisonDataSource.tsx +++ /dev/null @@ -1,637 +0,0 @@ -import {useEffect, useMemo, useState} from "react" - -import deepEqual from "fast-deep-equal" -import {atom, getDefaultStore, useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" - -import {filterColumns} from "@/oss/components/Filters/EditColumns/assets/helper" -import useEvaluatorConfigs from "@/oss/lib/hooks/useEvaluatorConfigs" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import {fetchEvaluatorById} from "@/oss/services/evaluators" -import { - evaluationRunStateFamily, - runIndexFamily, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import type {RunIndex} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" - -import { - displayedScenarioIdsFamily, - scenarioStepsFamily, -} from "../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios" -import {buildScenarioTableData} from "../assets/dataSourceBuilder" -import {buildEvaluatorNameMap} from "../assets/evaluatorNameUtils" -import { - collectEvaluatorIdentifiers, - collectMetricSchemasFromEvaluator, - deriveSchemaMetricType, - mergeEvaluatorRecords, - pickString, - toArray, -} from "../assets/evaluatorSchemaUtils" -import type {TableColumn} from "../assets/types" -import {buildAntdColumns} from "../assets/utils" -import {expendedRowAtom} from "../ComparisonScenarioTable" - -import {editColumnsFamily} from "./useTableDataSource" - -export interface GroupedScenario { - key: string - scenarioId: string - testcaseId: string - inputs: any - outputs: any - runId: string - comparedScenarios: { - id: string - inputSteps: string - inputs: any - outputs: any - runId: string - colorIndex?: number - }[] -} - -interface UseExpandableComparisonDataSourceProps { - baseRunId: string - comparisonRunIds: string[] -} - -const testcaseForScenarios = atomFamily( - (runId: string) => - atom((get) => { - const scenarioSteps = get(scenarioStepsFamily(runId)) - const allScenarioIds = Object.keys(scenarioSteps) - const allSteps = allScenarioIds.reduce((acc, scenarioId) => { - const scenarioTestcaseIds = scenarioSteps[scenarioId]?.data?.inputSteps?.map( - (s) => s?.testcaseId, - ) - acc[scenarioId] = scenarioTestcaseIds - return acc - }, {}) - return allSteps - }), - deepEqual, -) -export const comparisonRunsStepsAtom = atomFamily( - (runIds: string[]) => - atom((get) => { - const steps = runIds.reduce((acc, runId) => { - const scenarioSteps = get(scenarioStepsFamily(runId)) - - const allStepIds = Object.keys(scenarioSteps) - const allSteps = allStepIds.map((stepId) => ({ - id: stepId, - ...scenarioSteps[stepId], - })) - const allStepsData = allSteps.reduce((acc, step) => { - if (step.state === "hasData") { - acc[step.id] = step?.data?.inputSteps?.map((s) => s?.testcaseId) - } - return acc - }, {}) - - acc[runId] = allStepsData - return acc - }, {}) - return steps - }), - deepEqual, -) - -export const comparisonRunIndexesAtom = atomFamily( - (runIds: string[]) => - atom((get) => - runIds.reduce>((acc, runId) => { - acc[runId] = get(runIndexFamily(runId)) - return acc - }, {}), - ), - deepEqual, -) - -const comparisonRunsEvaluatorsAtom = atomFamily( - (runIds: string[]) => - atom((get) => { - const evaluators = new Set() - runIds.forEach((runId) => { - const evals = get(evaluationRunStateFamily(runId)) - const enrichRun = evals?.enrichedRun - if (enrichRun) { - enrichRun.evaluators?.forEach((e) => evaluators.add(e)) - } - }) - - return Array.from(evaluators) - }), - deepEqual, -) - -const metricsFromEvaluatorsFamily = atomFamily( - (runIds: string[]) => - atom((get) => { - // Build a map of evaluatorSlug -> unique metrics - const result: Record = {} - const seenMetricBySlug: Record> = {} - - runIds.forEach((runId) => { - const state = get(evaluationRunStateFamily(runId)) - const evaluators = state?.enrichedRun?.evaluators - ? Object.values(state.enrichedRun.evaluators) - : [] - - evaluators.forEach((ev: any) => { - const slug = ev?.slug - if (!slug) return - - if (!seenMetricBySlug[slug]) { - seenMetricBySlug[slug] = new Set() - } - - if (ev?.metrics && typeof ev.metrics === "object") { - Object.entries(ev.metrics).forEach( - ([metricName, metricInfo]: [string, any]) => { - if (seenMetricBySlug[slug].has(metricName)) return - seenMetricBySlug[slug].add(metricName) - - if (!result[slug]) result[slug] = [] - result[slug].push({ - [metricName]: { - metricType: metricInfo?.type || "unknown", - }, - evaluatorSlug: slug, - }) - }, - ) - } - }) - }) - - return result - }), - deepEqual, -) - -const useExpandableComparisonDataSource = ({ - baseRunId, - comparisonRunIds, -}: UseExpandableComparisonDataSourceProps) => { - const store = getDefaultStore() - // const fetchMultipleRuns = useSetAtom(multiRunDataFetcherAtom) - - const comparisonRunsSteps = useAtomValue(comparisonRunsStepsAtom(comparisonRunIds)) - const baseTestcases = useAtomValue(testcaseForScenarios(baseRunId)) - const comparisonRunIndexes = useAtomValue(comparisonRunIndexesAtom(comparisonRunIds)) - - const comparisonRunsEvaluators = useAtomValue(comparisonRunsEvaluatorsAtom(comparisonRunIds)) - - const metricsFromEvaluators = useAtomValue( - metricsFromEvaluatorsFamily([baseRunId, ...comparisonRunIds]), - ) - - // Match scenarios by content rather than IDs - const matchedScenarios = useMemo(() => { - const matches: Record = {} - - // For each base scenario, find matching scenarios in comparison runs - Object.entries(baseTestcases as Record).forEach( - ([baseScenarioId, baseSteps]) => { - const baseTestcaseData = baseSteps?.[0] - if (!baseTestcaseData) return - - const comparedScenarios: any[] = [] - - // Search through all comparison runs - Object.entries(comparisonRunsSteps as Record).forEach( - ([compRunId, compScenarios]) => { - Object.entries(compScenarios as Record).forEach( - ([compScenarioId, compSteps]) => { - const compTestcaseData = compSteps?.[0] - if (!compTestcaseData) return - - const inputsMatch = baseTestcaseData === compTestcaseData - - if (inputsMatch) { - // Derive compareIndex for this run from state or fallback to order in comparisonRunIds - const compState = store.get(evaluationRunStateFamily(compRunId)) - const compareIndex = - compState?.compareIndex ?? - (comparisonRunIds.includes(compRunId) - ? comparisonRunIds.indexOf(compRunId) + 2 - : undefined) - const colorIndex = - compState?.colorIndex ?? - (comparisonRunIds.includes(compRunId) - ? comparisonRunIds.indexOf(compRunId) + 2 - : undefined) - comparedScenarios.push({ - matchedTestcaseId: compTestcaseData, - runId: compRunId, - scenarioId: compScenarioId, - compareIndex, - colorIndex, - }) - } - }, - ) - }, - ) - - matches[baseScenarioId] = comparedScenarios - }, - ) - - return matches - }, [baseTestcases, comparisonRunsSteps, comparisonRunIds.join(","), store]) - - // Build columns using EXACT same approach as regular table (useTableDataSource) - const runIndex = useAtomValue(runIndexFamily(baseRunId)) - const evaluationRunState = useAtomValue(evaluationRunStateFamily(baseRunId)) - const expendedRows = useAtomValue(expendedRowAtom) - const evaluators = evaluationRunState?.enrichedRun?.evaluators || [] - const baseAppId = - evaluationRunState?.enrichedRun?.appId ?? - evaluationRunState?.enrichedRun?.app_id ?? - evaluationRunState?.enrichedRun?.app?.id ?? - evaluationRunState?.enrichedRun?.application?.id ?? - null - const baseEvaluators = Array.isArray(evaluators) ? evaluators : Object.values(evaluators) - const [fetchedEvaluatorsById, setFetchedEvaluatorsById] = useState>({}) - const allEvaluators = useMemo(() => { - const bySlug = new Map() - ;[ - ...comparisonRunsEvaluators, - ...baseEvaluators, - ...Object.values(fetchedEvaluatorsById), - ].forEach((ev: any) => { - if (ev?.slug && !bySlug.has(ev.slug)) bySlug.set(ev.slug, ev) - }) - return Array.from(bySlug.values()) - }, [comparisonRunsEvaluators, baseEvaluators, fetchedEvaluatorsById]) - const {data: previewEvaluators} = useEvaluators({preview: true}) - const {data: projectEvaluators} = useEvaluators() - const {data: evaluatorConfigs} = useEvaluatorConfigs({appId: baseAppId}) - const evaluatorConfigsForNames = useMemo( - () => - (evaluatorConfigs ?? []).map((config) => ({ - ...config, - slug: config?.id, - })), - [evaluatorConfigs], - ) - const evaluatorNameBySlug = useMemo( - () => - buildEvaluatorNameMap( - allEvaluators, - previewEvaluators, - projectEvaluators, - evaluatorConfigsForNames, - Object.values(fetchedEvaluatorsById), - ), - [ - allEvaluators, - previewEvaluators, - projectEvaluators, - evaluatorConfigsForNames, - fetchedEvaluatorsById, - ], - ) - - const evaluatorIdsAcrossRunIndexes = useMemo(() => { - const ids = new Set() - const collect = (index: RunIndex | null | undefined) => { - const steps = index?.steps ?? {} - Object.values(steps).forEach((meta: any) => { - const id = - typeof meta?.refs?.evaluator?.id === "string" - ? meta.refs.evaluator.id - : undefined - if (id) ids.add(id) - }) - } - collect(runIndex) - Object.values(comparisonRunIndexes || {}).forEach(collect) - return ids - }, [runIndex, comparisonRunIndexes]) - - const catalogEvaluatorsByIdentifier = useMemo(() => { - const map = new Map() - const register = (entry: any) => { - if (!entry) return - collectEvaluatorIdentifiers(entry).forEach((identifier) => { - if (!map.has(identifier)) { - map.set(identifier, entry) - } - }) - } - toArray(previewEvaluators).forEach(register) - toArray(projectEvaluators).forEach(register) - Object.values(fetchedEvaluatorsById || {}).forEach(register) - return map - }, [previewEvaluators, projectEvaluators, fetchedEvaluatorsById]) - - const resolvedMetricsFromEvaluators = useMemo(() => { - const result: Record = {} - const appendDefinition = ( - slug: string | undefined, - metricName: string | undefined, - metricType?: string | string[], - ) => { - if (!slug) return - const name = metricName?.trim() - if (!name) return - - const list = (result[slug] ||= []) - const existing = list.find((definition: Record) => - Object.prototype.hasOwnProperty.call(definition, name), - ) - if (existing) { - existing[name] = { - ...existing[name], - metricType: existing[name]?.metricType ?? metricType, - } - return - } - list.push({ - [name]: {metricType}, - }) - } - - const registerEvaluator = (entry: any) => { - if (!entry || typeof entry !== "object") return - const slug = pickString(entry.slug) - if (!slug) return - const schemas = collectMetricSchemasFromEvaluator(entry) - schemas.forEach(({name, schema}) => { - appendDefinition(slug, name, deriveSchemaMetricType(schema)) - }) - } - - allEvaluators.forEach((evaluator: any) => { - const identifiers = collectEvaluatorIdentifiers(evaluator) - let catalogMatch: any - for (const identifier of identifiers) { - const matched = catalogEvaluatorsByIdentifier.get(identifier) - if (matched) { - catalogMatch = matched - break - } - } - const merged = mergeEvaluatorRecords(evaluator, catalogMatch) - registerEvaluator(merged) - }) - - Object.entries(metricsFromEvaluators || {}).forEach(([slug, definitions]) => { - const entries = Array.isArray(definitions) ? definitions : [definitions] - entries.forEach((definition) => { - if (!definition || typeof definition !== "object") return - Object.entries(definition).forEach(([metricName, meta]) => { - if (metricName === "evaluatorSlug") return - appendDefinition(slug, metricName, (meta as any)?.metricType) - }) - }) - }) - - return result - }, [allEvaluators, catalogEvaluatorsByIdentifier, metricsFromEvaluators]) - - useEffect(() => { - const knownIds = new Set() - ;[ - ...(allEvaluators || []), - ...(previewEvaluators || []), - ...(projectEvaluators || []), - ...(Object.values(fetchedEvaluatorsById) || []), - ].forEach((ev: any) => { - const id = typeof ev?.id === "string" ? ev.id : undefined - if (id) knownIds.add(id) - }) - - const missingIds = Array.from(evaluatorIdsAcrossRunIndexes).filter( - (id) => !knownIds.has(id), - ) - if (!missingIds.length) return - - let cancelled = false - ;(async () => { - const results = await Promise.allSettled( - missingIds.map(async (id) => { - try { - const evaluator = await fetchEvaluatorById(id) - return {id, evaluator} - } catch (error) { - console.warn( - "[useExpandableComparisonDataSource] Failed to fetch evaluator by id", - JSON.stringify({id, error: (error as Error)?.message}), - ) - return {id, evaluator: null} - } - }), - ) - if (cancelled) return - setFetchedEvaluatorsById((prev) => { - const next = {...prev} - results.forEach((result) => { - if (result.status !== "fulfilled") return - const {id, evaluator} = result.value - if (evaluator && !next[id]) { - next[id] = evaluator - } - }) - return next - }) - })() - - return () => { - cancelled = true - } - }, [ - evaluatorIdsAcrossRunIndexes, - allEvaluators, - previewEvaluators, - projectEvaluators, - fetchedEvaluatorsById, - ]) - const revisionSlugMap = useMemo(() => { - const map = new Map() - Object.values(runIndex?.steps ?? {}).forEach((meta: any) => { - if (!meta || meta.kind !== "annotation") return - const baseSlug = - typeof meta?.refs?.evaluator?.slug === "string" - ? meta.refs.evaluator.slug - : undefined - const revisionSlug = - typeof meta?.refs?.evaluatorRevision?.slug === "string" - ? meta.refs.evaluatorRevision.slug - : undefined - if (baseSlug && revisionSlug && baseSlug !== revisionSlug && !map.has(baseSlug)) { - map.set(baseSlug, revisionSlug) - } - }) - return map - }, [runIndex]) - - const rawColumns = useMemo( - () => - buildScenarioTableData({ - runIndex, - metricsFromEvaluators: resolvedMetricsFromEvaluators, - runId: baseRunId, - evaluators: allEvaluators, - evaluatorNameBySlug, - revisionSlugByEvaluatorSlug: revisionSlugMap, - }), - [ - runIndex, - resolvedMetricsFromEvaluators, - allEvaluators, - evaluatorNameBySlug, - revisionSlugMap, - expendedRows, - ], - ) - - const columnsWithRunSpecificSteps = useMemo(() => { - if (!rawColumns) return [] as TableColumn[] - - const allRunIndexes: Record = { - [baseRunId]: runIndex, - ...(comparisonRunIndexes || {}), - } - - const cache = new Map() - - const getColumnsForRun = (runId: string) => { - if (cache.has(runId)) return cache.get(runId)! - const idx = allRunIndexes[runId] - const cols = idx ? Object.values(idx.columnsByStep || {}).flat() : [] - cache.set(runId, cols) - return cols - } - - const matchStepKey = (runId: string, column: any): string | undefined => { - if (runId === baseRunId && column.stepKey) return column.stepKey - const candidates = getColumnsForRun(runId) - const match = candidates.find((candidate) => { - if (candidate.kind !== column.kind) return false - if (column.path && candidate.path) { - return candidate.path === column.path - } - if (column.name && candidate.name) { - return candidate.name === column.name - } - return false - }) - return match?.stepKey - } - - const attach = (columns: any[]): any[] => - columns.map((column) => { - const children = column.children ? attach(column.children) : undefined - const shouldAttachStepKey = - column.kind === "input" || - column.kind === "invocation" || - column.kind === "annotation" - - if (!shouldAttachStepKey) { - return children ? {...column, children} : column - } - - const stepKeyByRunId = Object.keys(allRunIndexes).reduce< - Record - >((acc, runId) => { - const mapped = matchStepKey(runId, column) - if (mapped) acc[runId] = mapped - return acc - }, {}) - - if (column.stepKey && !stepKeyByRunId[baseRunId]) { - stepKeyByRunId[baseRunId] = column.stepKey - } - - if (!Object.keys(stepKeyByRunId).length) { - return children ? {...column, children} : column - } - - const enriched = { - ...column, - stepKeyByRunId, - } - if (children) enriched.children = children - return enriched - }) - - return attach(rawColumns as any[]) as TableColumn[] - }, [rawColumns, baseRunId, runIndex, comparisonRunIndexes]) - - // Build Ant Design columns using the same function as regular table - const baseAntColumns = useMemo( - () => - buildAntdColumns(columnsWithRunSpecificSteps as TableColumn[], baseRunId, { - expendedRows, - }), - [columnsWithRunSpecificSteps, baseRunId, expendedRows], - ) - - const hiddenColumns = useAtomValue(editColumnsFamily(baseRunId)) - - const antColumns = useMemo( - () => filterColumns(baseAntColumns, hiddenColumns), - [baseAntColumns, hiddenColumns], - ) - - // For backward compatibility, also provide basic columns - const columns = baseAntColumns - - // No longer need expandedRowRender - using children approach instead - const expandedRowRender = undefined - - const loading = false - - // Build rows with actual scenario data - use the SAME approach as regular table - const scenarioIds = useAtomValue(displayedScenarioIdsFamily(baseRunId)) || [] - - const rows = useMemo(() => { - const builtRows = scenarioIds.map((scenarioId, idx) => { - // Get matched comparison scenarios for this base scenario - const comparedScenarios = matchedScenarios[scenarioId] || [] - const baseState = store.get(evaluationRunStateFamily(baseRunId)) - const baseColorIndex = baseState?.colorIndex ?? 1 - - // Create base row structure - const baseRow = { - key: scenarioId, - scenarioIndex: idx + 1, - runId: baseRunId, // This row represents the base run - compareIndex: 1, - colorIndex: baseColorIndex, - // Add children for comparison scenarios - children: comparedScenarios.map((compScenario, compIdx) => ({ - key: `${scenarioId}-comp-${compScenario.runId}-${compIdx}`, - scenarioIndex: idx + 1, // Same scenario index as parent - runId: compScenario.runId, // Use comparison run ID - scenarioId: compScenario.scenarioId, // Use comparison scenario ID - isComparison: true, // Flag to identify comparison rows - isLastRow: compIdx === comparedScenarios.length - 1, - compareIndex: compScenario.compareIndex, - colorIndex: compScenario.colorIndex ?? compScenario.compareIndex, - })), - } - - return baseRow - }) - - return builtRows - }, [scenarioIds, matchedScenarios, baseRunId, store]) - - return { - antColumns, - columns, - rawColumns: baseAntColumns, - rows, - expandedRowRender, - loading, - totalColumnWidth: 0, // TODO: Calculate if needed - } -} - -export default useExpandableComparisonDataSource diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useScrollToScenario.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useScrollToScenario.ts deleted file mode 100644 index f901299ad8..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useScrollToScenario.ts +++ /dev/null @@ -1,88 +0,0 @@ -import {RefObject, useEffect, useMemo, useRef} from "react" - -import {useRouter} from "next/router" - -import {TableRow} from "../types" - -type TableRowWithChildren = TableRow & { - scenarioId?: string - children?: TableRowWithChildren[] -} - -const useScrollToScenario = ({ - dataSource, - expandedRowKeys = [], -}: { - dataSource: TableRowWithChildren[] - expandedRowKeys?: string[] -}) => { - const router = useRouter() - const tableContainerRef = useRef(null) - const tableInstance = useRef(null) - - const selectedScenarioId = router.query.scrollTo as string - - const flattenedRowKeys = useMemo(() => { - const keys: string[] = [] - const expandedSet = new Set((expandedRowKeys || []).map((key) => String(key))) - - const traverse = (rows: TableRowWithChildren[] = []) => { - rows.forEach((row) => { - const rowKey = (row?.key ?? row?.scenarioId) as string | undefined - if (!rowKey) return - - keys.push(rowKey) - - const isExpanded = expandedSet.has(rowKey) - if (!isExpanded) { - return - } - - if (Array.isArray(row.children) && row.children.length > 0) { - traverse(row.children) - } - }) - } - - traverse(dataSource) - - return keys - }, [dataSource, expandedRowKeys]) - - // Scroll to the specified row when user selects a scenario in auto eval - useEffect(() => { - if (!router.isReady) return - if (!tableInstance.current || !selectedScenarioId) return - // Get the row index from the flattened dataSource including expanded rows - const rowIndex = flattenedRowKeys.findIndex((key) => key === selectedScenarioId) - if (rowIndex === -1) return - // Use Ant Design's scrollTo method for virtualized tables when available - if (typeof tableInstance.current?.scrollTo === "function") { - tableInstance.current.scrollTo({ - index: rowIndex, - behavior: "smooth", - }) - } - - const rowElement = tableContainerRef.current?.querySelector( - `[data-row-key="${selectedScenarioId}"]`, - ) as HTMLElement | null - - // Fallback to native DOM scrolling when virtualization instance is unavailable - if (typeof tableInstance.current?.scrollTo !== "function") { - rowElement?.scrollIntoView({behavior: "smooth", block: "center"}) - } - - // Add highlight effect - if (rowElement) { - rowElement.classList.add("highlight-row") - setTimeout(() => { - rowElement.classList.remove("highlight-row") - }, 2000) - } - }, [selectedScenarioId, flattenedRowKeys, router.isReady]) - - return {tableContainerRef, tableInstance} -} - -export default useScrollToScenario diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource.ts deleted file mode 100644 index f5628bae0e..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource.ts +++ /dev/null @@ -1,426 +0,0 @@ -import {useEffect, useMemo, useState} from "react" - -import deepEqual from "fast-deep-equal" -import {atom, useAtom, useAtomValue} from "jotai" -import {atomFamily, selectAtom} from "jotai/utils" -import {Loadable} from "jotai/vanilla/utils/loadable" -import groupBy from "lodash/groupBy" - -import {filterColumns} from "@/oss/components/Filters/EditColumns/assets/helper" -import {useRunId} from "@/oss/contexts/RunIdContext" -import {ColumnDef} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" -import useEvaluatorConfigs from "@/oss/lib/hooks/useEvaluatorConfigs" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import {fetchEvaluatorById} from "@/oss/services/evaluators" - -import { - evaluationRunStateFamily, - loadingStateFamily, - runIndexFamily, -} from "../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedAtoms" -// import {scenarioMetricsMapFamily} from "../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import {runMetricsStatsCacheFamily} from "../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics" -import { - displayedScenarioIdsFamily, - loadableScenarioStepFamily, -} from "../../../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios" -import {evaluatorFailuresMapFamily} from "../assets/atoms/evaluatorFailures" -import {buildScenarioTableData, buildScenarioTableRows} from "../assets/dataSourceBuilder" -import {buildEvaluatorNameMap} from "../assets/evaluatorNameUtils" -import { - collectEvaluatorIdentifiers, - collectMetricSchemasFromEvaluator, - deriveSchemaMetricType, - mergeEvaluatorRecords, - pickString, - toArray, -} from "../assets/evaluatorSchemaUtils" -import {buildAntdColumns} from "../assets/utils" - -const EMPTY_SCENARIOS: any[] = [] -const EMPTY_METRICS_MAP: Record = {} - -export const editColumnsFamily = atomFamily((runId: string) => atom([]), deepEqual) - -export const allScenariosLoadedFamily = atomFamily( - (runId: string) => - atom((get) => { - const runState = get(evaluationRunStateFamily(runId)) - const loadingState = get(loadingStateFamily(runId)) - const scenarios = runState?.scenarios - if (loadingState?.isLoadingScenarios) return false - return Array.isArray(scenarios) - }), - deepEqual, -) - -// Run-scoped metrics from evaluators atom family -export const metricsFromEvaluatorsFamily = atomFamily( - (runId: string) => - selectAtom( - evaluationRunStateFamily(runId), - (state) => { - const evs = state?.enrichedRun?.evaluators - ? Object.values(state.enrichedRun.evaluators) - : [] - if (!evs || !Array.isArray(evs)) { - return {} - } - return groupBy( - evs.reduce((acc: any[], ev: any) => { - return [ - ...acc, - ...Object.entries(ev.metrics || {}).map( - ([metricName, metricInfo]: [string, any]) => { - return { - [metricName]: { - metricType: metricInfo.type, - }, - evaluatorSlug: ev.slug, - } - }, - ), - ] - }, []), - (def: any) => { - return def.evaluatorSlug - }, - ) - }, - deepEqual, - ), - deepEqual, -) - -const firstScenarioLoadableFamily = atomFamily( - (runId: string) => - atom((get) => { - const ids = get(displayedScenarioIdsFamily(runId)) || EMPTY_SCENARIOS - if (!ids.length) { - return {state: "hasValue", data: undefined} as Loadable< - UseEvaluationRunScenarioStepsFetcherResult | undefined - > - } - return get(loadableScenarioStepFamily({runId, scenarioId: ids[0]})) - }), - deepEqual, -) - -const useTableDataSource = () => { - const runId = useRunId() - - // states - const [editColumns, setEditColumns] = useAtom(editColumnsFamily(runId)) - - // Read from the same global store that writes are going to - const scenarioIds = useAtomValue(displayedScenarioIdsFamily(runId)) || EMPTY_SCENARIOS - const allScenariosLoaded = useAtomValue(allScenariosLoadedFamily(runId)) - - // const metricDistributions = useAtomValue(runMetricsStatsAtom) - const runIndex = useAtomValue(runIndexFamily(runId)) - const metricsFromEvaluators = - useAtomValue(metricsFromEvaluatorsFamily(runId)) || EMPTY_METRICS_MAP - const metricStatsMap = useAtomValue(runMetricsStatsCacheFamily(runId)) || {} - // temporary implementation to implement loading state for auto eval - const firstScenarioLoadable = useAtomValue(firstScenarioLoadableFamily(runId)) - const loadableState = firstScenarioLoadable?.state - const evaluationRunState = useAtomValue(evaluationRunStateFamily(runId)) - const runAppId = - evaluationRunState?.enrichedRun?.appId ?? - evaluationRunState?.enrichedRun?.app_id ?? - evaluationRunState?.enrichedRun?.app?.id ?? - evaluationRunState?.enrichedRun?.application?.id ?? - null - const rawEvaluators = evaluationRunState?.enrichedRun?.evaluators - const runEvaluators = useMemo( - () => - Array.isArray(rawEvaluators) - ? rawEvaluators - : rawEvaluators - ? Object.values(rawEvaluators) - : [], - [rawEvaluators], - ) - const revisionSlugByEvaluatorSlug = useMemo(() => { - const map = new Map() - const steps = runIndex?.steps ?? {} - Object.values(steps).forEach((meta: any) => { - if (!meta || meta.kind !== "annotation") return - const baseSlug = pickString(meta?.refs?.evaluator?.slug) - const revisionSlug = pickString(meta?.refs?.evaluatorRevision?.slug) - if (baseSlug && revisionSlug && baseSlug !== revisionSlug) { - if (!map.has(baseSlug)) { - map.set(baseSlug, revisionSlug) - } - } - }) - return map - }, [runIndex]) - const evaluatorFailuresMap = useAtomValue(evaluatorFailuresMapFamily(runId)) - const {data: previewEvaluators} = useEvaluators({preview: true}) - const {data: projectEvaluators} = useEvaluators() - const [fetchedEvaluatorsById, setFetchedEvaluatorsById] = useState>({}) - const {data: evaluatorConfigs} = useEvaluatorConfigs({appId: runAppId}) - const evaluatorConfigsForNames = useMemo( - () => - (evaluatorConfigs ?? []).map((config) => ({ - ...config, - slug: config?.id, - })), - [evaluatorConfigs], - ) - const evaluatorNameBySlug = useMemo( - () => - buildEvaluatorNameMap( - runEvaluators, - previewEvaluators, - projectEvaluators, - evaluatorConfigsForNames, - Object.values(fetchedEvaluatorsById), - ), - [ - runEvaluators, - previewEvaluators, - projectEvaluators, - evaluatorConfigsForNames, - fetchedEvaluatorsById, - ], - ) - - const catalogEvaluatorsByIdentifier = useMemo(() => { - const map = new Map() - const register = (entry: any) => { - if (!entry) return - collectEvaluatorIdentifiers(entry).forEach((identifier) => { - if (!map.has(identifier)) { - map.set(identifier, entry) - } - }) - } - toArray(previewEvaluators).forEach(register) - toArray(projectEvaluators).forEach(register) - Object.values(fetchedEvaluatorsById || {}).forEach(register) - return map - }, [previewEvaluators, projectEvaluators, fetchedEvaluatorsById]) - - const resolvedMetricsFromEvaluators = useMemo(() => { - const result: Record = {} - const appendDefinition = ( - slug: string | undefined, - metricName: string | undefined, - metricType?: string | string[], - ) => { - if (!slug) return - const name = metricName?.trim() - if (!name) return - - const list = (result[slug] ||= []) - const existing = list.find((definition: Record) => - Object.prototype.hasOwnProperty.call(definition, name), - ) - if (existing) { - existing[name] = { - ...existing[name], - metricType: existing[name]?.metricType ?? metricType, - } - return - } - list.push({ - [name]: {metricType}, - }) - } - - const registerEvaluator = (entry: any) => { - if (!entry || typeof entry !== "object") return - const slug = pickString(entry.slug) - if (!slug) return - const schemas = collectMetricSchemasFromEvaluator(entry) - schemas.forEach(({name, schema}) => { - appendDefinition(slug, name, deriveSchemaMetricType(schema)) - }) - } - - runEvaluators.forEach((evaluator: any) => { - const identifiers = collectEvaluatorIdentifiers(evaluator) - let catalogMatch: any - for (const identifier of identifiers) { - const matched = catalogEvaluatorsByIdentifier.get(identifier) - if (matched) { - catalogMatch = matched - break - } - } - const merged = mergeEvaluatorRecords(evaluator, catalogMatch) - registerEvaluator(merged) - }) - - Object.entries(metricsFromEvaluators || {}).forEach(([slug, definitions]) => { - const entries = Array.isArray(definitions) ? definitions : [definitions] - entries.forEach((definition) => { - if (!definition || typeof definition !== "object") return - Object.entries(definition).forEach(([metricName, meta]) => { - if (metricName === "evaluatorSlug") return - appendDefinition(slug, metricName, (meta as any)?.metricType) - }) - }) - }) - - return result - }, [ - catalogEvaluatorsByIdentifier, - metricsFromEvaluators, - runEvaluators, - revisionSlugByEvaluatorSlug, - ]) - - const evaluatorIdsFromRunIndex = useMemo(() => { - const ids = new Set() - const steps = runIndex?.steps ?? {} - Object.values(steps).forEach((meta: any) => { - const id = - typeof meta?.refs?.evaluator?.id === "string" ? meta.refs.evaluator.id : undefined - if (id) ids.add(id) - }) - return ids - }, [runIndex]) - - useEffect(() => { - const knownIds = new Set() - ;[ - ...(runEvaluators || []), - ...(previewEvaluators || []), - ...(projectEvaluators || []), - ...(Object.values(fetchedEvaluatorsById) || []), - ].forEach((ev: any) => { - const id = typeof ev?.id === "string" ? ev.id : undefined - if (id) knownIds.add(id) - }) - - const missingIds = Array.from(evaluatorIdsFromRunIndex).filter((id) => !knownIds.has(id)) - if (!missingIds.length) return - - let cancelled = false - ;(async () => { - const results = await Promise.allSettled( - missingIds.map(async (id) => { - try { - const evaluator = await fetchEvaluatorById(id) - return {id, evaluator} - } catch (error) { - console.warn( - "[useTableDataSource] Failed to fetch evaluator by id", - JSON.stringify({id, error: (error as Error)?.message}), - ) - return {id, evaluator: null} - } - }), - ) - if (cancelled) return - setFetchedEvaluatorsById((prev) => { - const next = {...prev} - results.forEach((result) => { - if (result.status !== "fulfilled") return - const {id, evaluator} = result.value - if (evaluator && !next[id]) { - next[id] = evaluator - } - }) - return next - }) - })() - - return () => { - cancelled = true - } - }, [ - evaluatorIdsFromRunIndex, - runEvaluators, - previewEvaluators, - projectEvaluators, - fetchedEvaluatorsById, - ]) - - const scenarioMetaById = useMemo(() => { - const map = new Map() - const scenarios = evaluationRunState?.scenarios || [] - scenarios.forEach((sc: any) => { - const identifier = sc?.id || sc?._id - if (!identifier) return - map.set(identifier, { - timestamp: sc?.timestamp || sc?.createdAt || sc?.created_at, - createdAt: sc?.createdAt || sc?.created_at, - }) - }) - return map - }, [evaluationRunState?.scenarios]) - - const isLoadingSteps = useMemo(() => { - if (!scenarioIds || scenarioIds.length === 0) return false - return loadableState === "loading" || !allScenariosLoaded - }, [scenarioIds, loadableState, allScenariosLoaded]) - - const rows = useMemo(() => { - return buildScenarioTableRows({ - scenarioIds, - allScenariosLoaded, - runId, - scenarioMetaById, - }) - }, [scenarioIds, allScenariosLoaded, scenarioMetaById, runId]) - - // New alternative data source built via shared helper - const builtColumns: ColumnDef[] = useMemo( - () => - buildScenarioTableData({ - runIndex, - runId, - metricsFromEvaluators: resolvedMetricsFromEvaluators, - metrics: metricStatsMap, - evaluators: runEvaluators, - evaluatorNameBySlug, - revisionSlugByEvaluatorSlug, - }), - [ - runIndex, - runId, - resolvedMetricsFromEvaluators, - metricStatsMap, - runEvaluators, - evaluatorNameBySlug, - revisionSlugByEvaluatorSlug, - ], - ) - - // Build Ant Design columns and make them resizable - const antColumns = useMemo(() => { - return buildAntdColumns(builtColumns, runId, {evaluatorFailuresMap}) - }, [builtColumns, runId, evaluatorFailuresMap]) - - const visibleColumns = useMemo( - () => filterColumns(antColumns, editColumns), - [antColumns, editColumns], - ) - - const totalColumnWidth = useMemo(() => { - const calc = (cols: any[]): number => - cols.reduce((sum, col) => { - if (col?.children && col?.children.length) { - return sum + calc(col?.children) - } - return sum + (col?.width ?? col?.minWidth ?? 100) - }, 0) - return calc(antColumns) - }, [antColumns]) - - return { - rawColumns: antColumns, - antColumns: visibleColumns, - rows, - totalColumnWidth, - isLoadingSteps, - editColumns, - setEditColumns, - } -} - -export default useTableDataSource diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/index.tsx b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/index.tsx deleted file mode 100644 index 19db92e1fa..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/index.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import {memo} from "react" - -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" - -import {urlStateAtom} from "../../state/urlState" - -import ScenarioTable from "./ScenarioTable" - -const ComparisonTable = dynamic(() => import("./ComparisonScenarioTable"), {ssr: false}) - -const VirtualizedScenarioTable = () => { - const urlState = useAtomValue(urlStateAtom) - const isComparisonMode = Boolean(urlState.compare && urlState.compare.length > 0) - - if (isComparisonMode) { - return - } - - return -} - -export default VirtualizedScenarioTable diff --git a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/types.ts b/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/types.ts deleted file mode 100644 index 393826b5db..0000000000 --- a/web/oss/src/components/EvalRunDetails/components/VirtualizedScenarioTable/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {ColumnsType} from "antd/es/table" - -export interface TableRow { - key: string // scenarioId - scenarioIndex: number - status?: string - result?: string - baseRunId?: string - runId?: string - scenarioId?: string - /** - * For skeleton rows shown while data is loading. - */ - isSkeleton?: boolean - timestamp?: string | null - temporalGroupKey?: string - temporalGroupIndex?: number - isTemporalGroupStart?: boolean -} - -export interface VirtualizedScenarioTableProps { - columns?: ColumnsType - dataSource?: TableRow[] - totalColumnWidth?: number -} diff --git a/web/oss/src/components/EvalRunDetails/hooks/useCachedScenarioSteps.ts b/web/oss/src/components/EvalRunDetails/hooks/useCachedScenarioSteps.ts deleted file mode 100644 index 3e8693d4a3..0000000000 --- a/web/oss/src/components/EvalRunDetails/hooks/useCachedScenarioSteps.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {useEffect, useMemo} from "react" - -import {useAtomValue} from "jotai" -import {loadable} from "jotai/utils" - -import {scenarioStepFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios" -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" - -type ScenarioStepLoadableState = ReturnType< - typeof loadable> ->["state"] - -const scenarioStepsCache = new Map() -const resolvedKeys = new Set() - -export const useCachedScenarioSteps = ( - runId?: string | null, - scenarioId?: string | null, -): { - data?: UseEvaluationRunScenarioStepsFetcherResult - state: ScenarioStepLoadableState - hasResolved: boolean - error?: unknown -} => { - const key = runId && scenarioId ? `${runId}::${scenarioId}` : null - - const loadableAtom = useMemo(() => { - if (!runId || !scenarioId) return null - return loadable( - scenarioStepFamily({ - runId, - scenarioId, - }), - ) - }, [runId, scenarioId]) - - const stepLoadable = loadableAtom - ? (useAtomValue(loadableAtom) as { - state: ScenarioStepLoadableState - data?: UseEvaluationRunScenarioStepsFetcherResult - }) - : undefined - - useEffect(() => { - if (!key || !stepLoadable) return - if (stepLoadable.state === "hasData" && stepLoadable.data) { - scenarioStepsCache.set(key, stepLoadable.data) - resolvedKeys.add(key) - } - }, [key, stepLoadable]) - - const cached = key ? scenarioStepsCache.get(key) : undefined - const data = - stepLoadable?.state === "hasData" && stepLoadable.data - ? stepLoadable.data - : cached !== undefined - ? cached - : undefined - - const state = - stepLoadable?.state ?? (key ? (resolvedKeys.has(key) ? "stale" : "loading") : "loading") - const hasResolved = key ? resolvedKeys.has(key) : false - const error = stepLoadable?.state === "hasError" ? stepLoadable.error : undefined - - return {data, state, hasResolved, error} -} diff --git a/web/oss/src/components/EvalRunDetails/hooks/useMetricStepError.ts b/web/oss/src/components/EvalRunDetails/hooks/useMetricStepError.ts deleted file mode 100644 index 460be125d1..0000000000 --- a/web/oss/src/components/EvalRunDetails/hooks/useMetricStepError.ts +++ /dev/null @@ -1,120 +0,0 @@ -import {useMemo} from "react" - -import {UseEvaluationRunScenarioStepsFetcherResult} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import {EvaluationStatus} from "@/oss/lib/Types" - -import {useCachedScenarioSteps} from "./useCachedScenarioSteps" - -import { - resolveErrorMessage, - resolveStepFailure, -} from "../components/VirtualizedScenarioTable/assets/MetricCell/helpers" - -type ScenarioStepsResult = { - data?: UseEvaluationRunScenarioStepsFetcherResult - state?: ReturnType["state"] - hasResolved?: boolean - error?: unknown -} - -interface UseMetricStepErrorOptions { - runId?: string | null - scenarioId?: string | null - metricKey: string - fallbackKey?: string - fullKey?: string - stepKey?: string - slugCandidates?: string[] - scenarioStepsResult?: ScenarioStepsResult -} - -export const useMetricStepError = ({ - runId, - scenarioId, - metricKey, - fallbackKey, - fullKey, - stepKey, - slugCandidates, - scenarioStepsResult, -}: UseMetricStepErrorOptions) => { - const shouldFetch = Boolean(runId && scenarioId) - - const fallbackResult = useCachedScenarioSteps( - shouldFetch ? (runId ?? undefined) : undefined, - shouldFetch ? (scenarioId ?? undefined) : undefined, - ) - - const effectiveResult = scenarioStepsResult ?? fallbackResult - - const {data, state, hasResolved, error} = effectiveResult - - const errorStep = useMemo(() => { - if (!shouldFetch) return null - - if (!data && !hasResolved) return null - - if (state === "hasError") { - return { - status: EvaluationStatus.ERROR, - error: resolveErrorMessage(error), - } - } - - if (!data) return null - - const defaultSlugCandidates = (() => { - const derived: string[] = [] - const [baseSlug] = metricKey.split(".") - if (baseSlug) derived.push(baseSlug) - - const fallbackSlug = fallbackKey?.split(".")?.[0] - if (fallbackSlug && !derived.includes(fallbackSlug)) { - derived.push(fallbackSlug) - } - const fullSlug = fullKey?.split(".")?.[0] - if (fullSlug && !derived.includes(fullSlug)) { - derived.push(fullSlug) - } - return derived - })() - - const combinedSlugCandidates = (() => { - const set = new Set() - defaultSlugCandidates.forEach((slug) => slug && set.add(slug)) - slugCandidates?.forEach((slug) => slug && set.add(slug)) - return Array.from(set) - })() - - const failure = resolveStepFailure({ - data, - scenarioId: scenarioId ?? "", - slugCandidates: combinedSlugCandidates, - stepKey, - debug: {metricKey, runId}, - }) - - return failure - }, [ - shouldFetch, - data, - hasResolved, - state, - error, - metricKey, - fallbackKey, - fullKey, - slugCandidates, - stepKey, - scenarioId, - runId, - ]) - - return { - errorStep, - scenarioSteps: data, - scenarioStepsState: state, - hasResolvedScenarioSteps: hasResolved, - scenarioStepsError: error, - } -} diff --git a/web/oss/src/components/EvalRunDetails/index.tsx b/web/oss/src/components/EvalRunDetails/index.tsx deleted file mode 100644 index 0e7d748c61..0000000000 --- a/web/oss/src/components/EvalRunDetails/index.tsx +++ /dev/null @@ -1,339 +0,0 @@ -import {memo, useCallback, useEffect} from "react" - -import {Spin, Typography} from "antd" -import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {getDefaultStore, useAtom, useAtomValue, useSetAtom} from "jotai" -import {selectAtom} from "jotai/utils" -import {useRouter} from "next/router" - -import ErrorState from "@/oss/components/ErrorState" -import EvalRunDetails from "@/oss/components/EvalRunDetails/HumanEvalRun" -import SingleModelEvaluationTable from "@/oss/components/EvaluationTable/SingleModelEvaluationTable" -import {RunIdProvider} from "@/oss/contexts/RunIdContext" -import {appendBreadcrumbAtom, breadcrumbAtom, setBreadcrumbsAtom} from "@/oss/lib/atoms/breadcrumb" -import {isUuid} from "@/oss/lib/helpers/utils" -import useEvaluationRunData from "@/oss/lib/hooks/useEvaluationRunData" -import { - evaluationRunStateFamily, - initializeRun, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {_EvaluationScenario, Evaluation} from "@/oss/lib/Types" -import {abortAll} from "@/oss/lib/utils/abortControllers" - -import EvaluationScenarios from "../pages/evaluations/evaluationScenarios/EvaluationScenarios" - -import AutoEvalRunDetails from "./AutoEvalRun" -import {ComparisonDataFetcher} from "./components/ComparisonDataFetcher" -import OnlineEvalRunDetails from "./OnlineEvalRun" -import OnlineUrlSync from "./OnlineEvalRun/OnlineUrlSync" -import {evalTypeAtom, setEvalTypeAtom} from "./state/evalType" -import UrlSync from "./UrlSync" - -const EvaluationPageData = memo( - ({children, runId}: {children?: React.ReactNode; runId?: string}) => { - const router = useRouter() - - // Abort any in-flight data requests when navigating away - useEffect(() => { - if (runId) { - initializeRun(runId) - } - }, [runId]) - - // Abort any in-flight data requests when navigating away - useEffect(() => { - return () => { - abortAll() - } - }, [router.pathname]) - - useEvaluationRunData(runId || null, true, runId) - return runId ? children : null - }, -) - -const LegacyEvaluationPage = ({id: evaluationTableId}: {id: string}) => { - const evalType = useAtomValue(evalTypeAtom) - - const {legacyEvaluationSWR, legacyScenariosSWR} = useEvaluationRunData( - evaluationTableId || null, - true, - ) - - if (legacyEvaluationSWR.isLoading || legacyScenariosSWR.isLoading) { - return ( -
    -
    - - - Loading... - -
    -
    - ) - } - - const data = legacyEvaluationSWR.data - - return data ? ( - evalType === "auto" || evalType === "custom" ? ( - - ) : evalType === "human" ? ( - - ) : null - ) : null -} - -const PreviewEvaluationPage = memo( - ({ - evalType, - name, - description, - id, - }: { - evalType: "auto" | "human" | "online" | "custom" - name: string - description: string - id: string - }) => { - return evalType === "auto" || evalType === "custom" ? ( - - ) : evalType === "online" ? ( - - ) : ( - - ) - }, -) - -const LoadingState = ({ - evalType, - name, - description, - id, -}: { - evalType: "auto" | "human" | "online" | "custom" - name: string - description: string - id: string -}) => { - return evalType === "auto" || evalType === "custom" ? ( - - ) : evalType === "online" ? ( - - ) : ( -
    -
    - - - Loading... - -
    -
    - ) -} - -const EvaluationPage = memo( - ({evalType, runId}: {evalType: "auto" | "human" | "online" | "custom"; runId: string}) => { - const rootStore = getDefaultStore() - const breadcrumbs = useAtomValue(breadcrumbAtom, {store: rootStore}) - const appendBreadcrumb = useSetAtom(appendBreadcrumbAtom, {store: rootStore}) - - const router = useRouter() - - const {isPreview, name, description, id} = useAtomValue( - selectAtom( - evaluationRunStateFamily(runId!), - useCallback((v) => { - return { - isPreview: v.isPreview, - name: v.enrichedRun?.name, - description: v.enrichedRun?.description, - id: v.enrichedRun?.id, - } - }, []), - deepEqual, - ), - ) - - useEffect(() => { - // Try loaded name first; fallback to name in URL (when present as /results/:id/:name). - const base = (typeof window !== "undefined" ? window.location.pathname : "") || "" - const segs = base.split("/").filter(Boolean) - const resultsIdx = segs.findIndex((s) => s === "results") - const urlName = - resultsIdx !== -1 && segs[resultsIdx + 2] && !isUuid(segs[resultsIdx + 2]) - ? segs[resultsIdx + 2] - : undefined - - const label = name || urlName - if (!id || !label) return - - const existing = (breadcrumbs && (breadcrumbs["eval-detail"] as any)) || null - const currentLabel: string | undefined = existing?.label - if (currentLabel === label) return - - appendBreadcrumb({ - "eval-detail": { - label, - value: id as string, - }, - }) - }, [appendBreadcrumb, breadcrumbs, id, name]) - - useEffect(() => { - const base = (typeof window !== "undefined" ? window.location.pathname : "") || "" - const segs = base.split("/").filter(Boolean) - const desiredLabel = - evalType === "online" - ? "online evaluation" - : evalType === "human" - ? "human annotation" - : evalType === "custom" - ? "custom evaluation" - : "auto evaluation" - - const appsIdx = segs.findIndex((s) => s === "apps") - if (appsIdx !== -1) { - const appId = segs[appsIdx + 1] - if (!appId) return - const evaluationsHref = `/${segs.slice(0, appsIdx + 2).join("/")}/evaluations` - - const current = (rootStore.get(breadcrumbAtom) as any) || {} - const appPage = current["appPage"] as any - const needsHref = - !appPage || !appPage.href || !appPage.href.endsWith("/evaluations") - const needsLabel = !appPage || appPage.label !== desiredLabel - if (!needsHref && !needsLabel) return - - rootStore.set(appendBreadcrumbAtom, { - appPage: { - ...(appPage || {}), - label: desiredLabel, - href: evaluationsHref, - }, - }) - return - } - - const evaluationsIdx = segs.findIndex((s) => s === "evaluations") - if (evaluationsIdx === -1) return - const evaluationsHref = `/${segs.slice(0, evaluationsIdx + 1).join("/")}` - - const current = (rootStore.get(breadcrumbAtom) as any) || {} - const projectPage = current["projectPage"] as any - const needsHref = !projectPage || projectPage.href !== evaluationsHref - const needsLabel = !projectPage || projectPage.label !== desiredLabel - if (!needsHref && !needsLabel) return - - rootStore.set(appendBreadcrumbAtom, { - projectPage: { - ...(projectPage || {}), - label: desiredLabel, - href: evaluationsHref, - }, - }) - }, [rootStore, appendBreadcrumb, evalType]) - - // Clean up eval-detail crumb when leaving the page to avoid stale breadcrumbs - useEffect(() => { - return () => { - const current = (rootStore.get(breadcrumbAtom) as any) || {} - if (current["eval-detail"]) { - const {"eval-detail": _omit, ...rest} = current - rootStore.set(setBreadcrumbsAtom, rest) - } - } - }, [rootStore]) - - const hasPreviewData = Boolean(id) - - if (isPreview && !hasPreviewData) { - return ( - router.reload()} - /> - ) - } - - return ( -
    - {/** TODO: improve the component state specially AutoEvalRunDetails */} - {isPreview === undefined ? ( - - ) : isPreview && id ? ( - <> - {evalType === "online" ? ( - - ) : ( - - )} - - - ) : ( - - )} -
    - ) - }, -) - -const EvalRunDetailsPage = memo( - ({evalType: propsEvalType}: {evalType: "auto" | "human" | "online" | "custom"}) => { - const router = useRouter() - const runIdParam = router.query.evaluation_id - const runId = - typeof runIdParam === "string" - ? runIdParam - : Array.isArray(runIdParam) - ? runIdParam[0] - : null - const setEvalType = useSetAtom(setEvalTypeAtom) - const evalType = useAtomValue(evalTypeAtom) - - useEffect(() => { - setEvalType(propsEvalType) - - return () => { - setEvalType(null) - } - }, [propsEvalType]) - - return ( - - {evalType && runId ? ( - <> - - - - - ) : null} - - ) - }, -) - -export default memo(EvalRunDetailsPage) diff --git a/web/oss/src/components/EvalRunDetails/state/evalType.ts b/web/oss/src/components/EvalRunDetails/state/evalType.ts deleted file mode 100644 index 306b919b73..0000000000 --- a/web/oss/src/components/EvalRunDetails/state/evalType.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {atom} from "jotai" - -// This atom is used to store the evaluation type for the current evaluation run. -// It is used to determine which evaluation page to render. -export const evalTypeAtom = atom<"auto" | "human" | "online" | "custom" | null>(null) - -export const setEvalTypeAtom = atom( - null, - (get, set, update: "auto" | "human" | "online" | "custom" | null) => { - set(evalTypeAtom, update) - }, -) diff --git a/web/oss/src/components/EvalRunDetails/state/focusScenarioAtom.ts b/web/oss/src/components/EvalRunDetails/state/focusScenarioAtom.ts deleted file mode 100644 index 3940d1afea..0000000000 --- a/web/oss/src/components/EvalRunDetails/state/focusScenarioAtom.ts +++ /dev/null @@ -1,89 +0,0 @@ -import {atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -export interface FocusTarget { - focusRunId: string | null - focusScenarioId: string | null -} - -interface FocusDrawerState extends FocusTarget { - open: boolean - isClosing: boolean -} - -export const initialFocusDrawerState: FocusDrawerState = { - open: false, - isClosing: false, - focusRunId: null, - focusScenarioId: null, -} - -export const focusDrawerAtom = atomWithImmer(initialFocusDrawerState) - -export const focusScenarioAtom = atom((get) => { - const {focusRunId, focusScenarioId} = get(focusDrawerAtom) - if (!focusScenarioId) return null - return {focusRunId, focusScenarioId} -}) - -export const isFocusDrawerOpenAtom = atom((get) => get(focusDrawerAtom).open) - -export const focusDrawerTargetAtom = atom((get) => { - const {focusRunId, focusScenarioId} = get(focusDrawerAtom) - return {focusRunId, focusScenarioId} -}) - -export const setFocusDrawerTargetAtom = atom(null, (_get, set, target: FocusTarget) => { - set(focusDrawerAtom, (draft) => { - if ( - draft.focusRunId === target.focusRunId && - draft.focusScenarioId === target.focusScenarioId - ) { - return - } - draft.focusRunId = target.focusRunId - draft.focusScenarioId = target.focusScenarioId - }) -}) - -export const openFocusDrawerAtom = atom(null, (_get, set, target: FocusTarget) => { - set(focusDrawerAtom, (draft) => { - const sameTarget = - draft.focusRunId === target.focusRunId && - draft.focusScenarioId === target.focusScenarioId && - draft.open - draft.open = true - draft.isClosing = false - if (!sameTarget) { - draft.focusRunId = target.focusRunId - draft.focusScenarioId = target.focusScenarioId - } - }) -}) - -export const closeFocusDrawerAtom = atom(null, (_get, set) => { - set(focusDrawerAtom, (draft) => { - if (!draft.open && !draft.focusScenarioId && !draft.focusRunId) { - return - } - draft.open = false - draft.isClosing = true - }) -}) - -export const resetFocusDrawerAtom = atom(null, (_get, set) => { - set(focusDrawerAtom, () => ({...initialFocusDrawerState})) -}) - -export const applyFocusDrawerStateAtom = atom( - null, - (_get, set, payload: Partial) => { - set(focusDrawerAtom, (draft) => { - const next = {...draft, ...payload} - draft.open = Boolean(next.open) - draft.isClosing = Boolean(next.isClosing) - draft.focusRunId = next.focusRunId ?? null - draft.focusScenarioId = next.focusScenarioId ?? null - }) - }, -) diff --git a/web/oss/src/components/EvalRunDetails/state/urlState.ts b/web/oss/src/components/EvalRunDetails/state/urlState.ts deleted file mode 100644 index aa4697994a..0000000000 --- a/web/oss/src/components/EvalRunDetails/state/urlState.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -import {evalTypeAtom} from "./evalType" - -export interface EvalRunUrlState { - view?: - | "list" - | "table" - | "focus" - | "results" - | "overview" - | "testcases" - | "prompt" - | "results" - | "configuration" - scenarioId?: string - compare?: string[] // Array of run IDs to compare against the base run -} - -// Holds the subset of query params we care about for EvalRunDetails page -export const urlStateAtom = atomWithImmer({}) - -type HumanEvalViewTypes = "focus" | "list" | "table" | "results" -type AutoEvalViewTypes = "overview" | "testcases" | "prompt" -type OnlineEvalViewTypes = "overview" | "results" | "configuration" - -// Derived UI atom: maps the URL state and eval type to a concrete view -export const runViewTypeAtom = atom( - (get) => { - const evalType = get(evalTypeAtom) - const view = get(urlStateAtom).view - - const humanViews: HumanEvalViewTypes[] = ["focus", "list", "table", "results"] - // Put "testcases" first so it becomes the default for auto evaluations - const autoViews: AutoEvalViewTypes[] = ["testcases", "overview", "prompt"] - - if (evalType === "auto" || evalType === "custom") { - // default and validation for auto eval - const v = (view as AutoEvalViewTypes | undefined) ?? autoViews[0] - return autoViews.includes(v) ? v : autoViews[0] - } - - if (evalType === "online") { - const onlineViews: OnlineEvalViewTypes[] = ["results", "overview", "configuration"] - const v = (view as OnlineEvalViewTypes | undefined) ?? onlineViews[0] - return onlineViews.includes(v) ? v : onlineViews[0] - } - - // default and validation for human eval - const v = (view as HumanEvalViewTypes | undefined) ?? humanViews[0] - return humanViews.includes(v) ? v : humanViews[0] - }, -) diff --git a/web/oss/src/components/EvaluationTable/ABTestingEvaluationTable.tsx b/web/oss/src/components/EvaluationTable/ABTestingEvaluationTable.tsx deleted file mode 100644 index 58c05677ba..0000000000 --- a/web/oss/src/components/EvaluationTable/ABTestingEvaluationTable.tsx +++ /dev/null @@ -1,838 +0,0 @@ -// @ts-nocheck -import {useState, useEffect, useCallback, useMemo, useRef} from "react" - -import SecondaryButton from "@agenta/oss/src/components/SecondaryButton/SecondaryButton" -import {Button, Card, Col, Input, Radio, Row, Space, Statistic, Table, message} from "antd" -import type {ColumnType} from "antd/es/table" -import {getDefaultStore, useAtomValue} from "jotai" -import debounce from "lodash/debounce" -import {useRouter} from "next/router" - -import {useQueryParamState} from "@/oss/state/appState" -import {EvaluationFlow} from "@/oss/lib/enums" -import {exportABTestingEvaluationData} from "@/oss/lib/helpers/evaluate" -import {isBaseResponse, isFuncResponse} from "@/oss/lib/helpers/playgroundResp" -import {testsetRowToChatMessages} from "@/oss/lib/helpers/testset" -import { - EvaluationTypeLabels, - batchExecute, - camelToSnake, - getStringOrJson, -} from "@/oss/lib/helpers/utils" -import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" -import useStatelessVariants from "@/oss/lib/hooks/useStatelessVariants" -import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" -import {extractInputKeysFromSchema} from "@/oss/lib/shared/variant/inputHelpers" -import {getRequestSchema} from "@/oss/lib/shared/variant/openapiUtils" -import {derivePromptsFromSpec} from "@/oss/lib/shared/variant/transformer/transformer" -import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" -import type {BaseResponse, EvaluationScenario, KeyValuePair, Variant} from "@/oss/lib/Types" -import {callVariant} from "@/oss/services/api" -import {updateEvaluationScenario, updateEvaluation} from "@/oss/services/human-evaluations/api" -import {useEvaluationResults} from "@/oss/services/human-evaluations/hooks/useEvaluationResults" -import {customPropertiesByRevisionAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import { - stablePromptVariablesAtomFamily, - transformedPromptsAtomFamily, -} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {appUriInfoAtom, appSchemaAtom} from "@/oss/state/variant/atoms/fetcher" - -import EvaluationCardView from "../Evaluations/EvaluationCardView" -import {VARIANT_COLORS} from "../Evaluations/EvaluationCardView/assets/styles" -import EvaluationVotePanel from "../Evaluations/EvaluationCardView/EvaluationVotePanel" -import VariantAlphabet from "../Evaluations/EvaluationCardView/VariantAlphabet" - -import {useABTestingEvaluationTableStyles} from "./assets/styles" -import ParamsFormWithRun from "./components/ParamsFormWithRun" -import type {ABTestingEvaluationTableProps, ABTestingEvaluationTableRow} from "./types" - -// Note: Avoid Typography.Title to prevent EllipsisMeasure/ResizeObserver loops - -/** - * - * @param evaluation - Evaluation object - * @param evaluationScenarios - Evaluation rows - * @param columnsCount - Number of variants to compare face to face (per default 2) - * @returns - */ -const ABTestingEvaluationTable: React.FC = ({ - evaluation, - evaluationScenarios, - isLoading, -}) => { - const classes = useABTestingEvaluationTableStyles() - const router = useRouter() - const appId = router.query.app_id as string - const uriObject = useAtomValue(appUriInfoAtom) - const store = getDefaultStore() - const evalVariants = [...evaluation.variants] - - const {variants: data, isLoading: isVariantsLoading} = useStatelessVariants() - - // // Select the correct variant revisions for this evaluation - const variantData = useMemo(() => { - const allVariantData = data || [] - if (!allVariantData.length) return [] - - return evaluation.variants.map((evVariant, idx) => { - const revisionId = evaluation.variant_revision_ids?.[idx] - const revisionNumber = evaluation.revisions?.[idx] - - // 1. Try to find by exact revision id - let selected = allVariantData.find((v) => v.id === revisionId) - - // 2. Try by variantId & revision number - if (!selected && revisionNumber !== undefined) { - selected = allVariantData.find( - (v) => v.variantId === evVariant.variantId && v.revision === revisionNumber, - ) - } - - // 3. Fallback – latest revision for that variant - if (!selected) { - selected = allVariantData.find( - (v) => v.variantId === evVariant.variantId && v.isLatestRevision, - ) - } - - return selected || evVariant - }) - }, [data, evaluation.variants, evaluation.variant_revision_ids, evaluation.revisions]) - - const [rows, setRows] = useState([]) - const [, setEvaluationStatus] = useState(evaluation.status) - const [viewModeParam, setViewModeParam] = useQueryParamState("viewMode") - const viewMode = useMemo(() => { - if (Array.isArray(viewModeParam)) { - return viewModeParam[0] ?? "card" - } - if (typeof viewModeParam === "string" && viewModeParam) { - return viewModeParam - } - return "card" - }, [viewModeParam]) - const setViewMode = useCallback( - (nextMode: string) => { - setViewModeParam(nextMode, {method: "replace", shallow: true}) - }, - [setViewModeParam], - ) - const {data: evaluationResults, mutate} = useEvaluationResults({ - evaluationId: evaluation.id, - onSuccess: () => { - updateEvaluation(evaluation.id, {status: EvaluationFlow.EVALUATION_FINISHED}) - }, - onError: (err) => { - console.error("Failed to fetch results:", err) - }, - }) - - const {numOfRows, flagVotes, positiveVotes, appVariant1Votes, appVariant2Votes} = - useMemo(() => { - const votesData = evaluationResults?.votes_data || {} - const variantsVotesData = votesData.variants_votes_data || {} - - const [variant1, variant2] = evaluation.variants || [] - - return { - numOfRows: votesData.nb_of_rows || 0, - flagVotes: votesData.flag_votes?.number_of_votes || 0, - positiveVotes: votesData.positive_votes?.number_of_votes || 0, - appVariant1Votes: variantsVotesData?.[variant1?.variantId]?.number_of_votes || 0, - appVariant2Votes: variantsVotesData?.[variant2?.variantId]?.number_of_votes || 0, - } - }, [evaluationResults, evaluation.variants]) - - const depouncedUpdateEvaluationScenario = useCallback( - debounce((data: Partial, scenarioId) => { - updateEvaluationScenarioData(scenarioId, data) - }, 800), - [], - ) - - useEffect(() => { - if (evaluationScenarios) { - setRows(() => { - const obj = [...evaluationScenarios] - const spec = store.get(appSchemaAtom) as any - const routePath = uriObject?.routePath - - obj.forEach((item, rowIndex) => { - // Map outputs into row shape for table columns - item.outputs.forEach((op) => (item[op.variant_id] = op.variant_output)) - - try { - // Build a stable input name set from variants (schema for custom, stable prompts otherwise) - const names = new Set() - ;(variantData || []).forEach((v: any) => { - const rid = v?.id - if (!rid) return - const flags = store.get( - variantFlagsAtomFamily({revisionId: rid}), - ) as any - if (flags?.isCustom && spec) { - extractInputKeysFromSchema(spec as any, routePath).forEach((k) => - names.add(k), - ) - } else { - const vars = store.get( - stablePromptVariablesAtomFamily(rid), - ) as string[] - ;(vars || []).forEach((k) => names.add(k)) - } - }) - - const chatCol = evaluation?.testset?.testsetChatColumn || "" - const reserved = new Set(["correct_answer", chatCol]) - const testRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - - const existing = new Set( - (Array.isArray(item.inputs) ? item.inputs : []) - .map((ip: any) => ip?.input_name) - .filter(Boolean), - ) - - const nextInputs = Array.isArray(item.inputs) ? [...item.inputs] : [] - Array.from(names) - .filter((k) => typeof k === "string" && k && !reserved.has(k)) - .forEach((k) => { - if (!existing.has(k)) { - nextInputs.push({ - input_name: k, - input_value: (testRow as any)?.[k] ?? "", - }) - } - }) - item.inputs = nextInputs - } catch { - // best-effort prepopulation only - } - }) - - return obj - }) - } - }, [evaluationScenarios, variantData, uriObject?.routePath, evaluation?.testset?.csvdata]) - - const handleInputChange = useCallback( - (e: React.ChangeEvent, id: string, inputIndex: number) => { - setRows((oldRows) => { - const rowIndex = oldRows.findIndex((row) => row.id === id) - const newRows = [...oldRows] - if (newRows[rowIndex] && newRows[rowIndex].inputs?.[inputIndex]) { - newRows[rowIndex].inputs[inputIndex].input_value = e.target.value - } - return newRows - }) - }, - [], - ) - - const setRowValue = useCallback( - (rowIndex: number, columnKey: keyof ABTestingEvaluationTableRow, value: any) => { - setRows((oldRows) => { - const newRows = [...oldRows] - newRows[rowIndex][columnKey] = value as never - return newRows - }) - }, - [], - ) - - // Upsert a single input value into a row by scenario id - const upsertRowInput = useCallback((rowId: string, name: string, value: any) => { - setRows((old) => { - const idx = old.findIndex((r) => r.id === rowId) - if (idx === -1) return old - const next = [...old] - const row = {...next[idx]} - const inputs = Array.isArray(row.inputs) ? [...row.inputs] : [] - const pos = inputs.findIndex((ip) => ip.input_name === name) - if (pos === -1) { - inputs.push({input_name: name, input_value: value}) - } else if (inputs[pos]?.input_value !== value) { - inputs[pos] = {...inputs[pos], input_value: value} - } - row.inputs = inputs - next[idx] = row as any - return next - }) - }, []) - - const updateEvaluationScenarioData = useCallback( - async (id: string, data: Partial, showNotification = true) => { - await updateEvaluationScenario( - evaluation.id, - id, - Object.keys(data).reduce( - (acc, key) => ({ - ...acc, - [camelToSnake(key)]: data[key as keyof EvaluationScenario], - }), - {}, - ), - evaluation.evaluationType, - ) - .then(() => { - setRows((prev) => { - const next = [...prev] - const idx = next.findIndex((r) => r.id === id) - if (idx >= 0) { - Object.keys(data).forEach((key) => { - // @ts-ignore - next[idx][key] = data[key as keyof EvaluationScenario] as any - }) - } - return next - }) - if (showNotification) message.success("Evaluation Updated!") - }) - .catch(console.error) - }, - [evaluation.evaluationType, evaluation.id], - ) - - const handleVoteClick = useCallback( - async (id: string, vote: string) => { - const rowIndex = rows.findIndex((row) => row.id === id) - const evaluation_scenario_id = rows[rowIndex]?.id - - if (evaluation_scenario_id) { - setRowValue(rowIndex, "vote", "loading") - const data = { - vote: vote, - outputs: evalVariants.map((v: Variant) => ({ - variant_id: v.variantId, - variant_output: rows[rowIndex][v.variantId], - })), - inputs: rows[rowIndex].inputs, - } - await updateEvaluationScenarioData(evaluation_scenario_id, data) - await mutate() - } - }, - [rows, setRowValue, updateEvaluationScenarioData, evalVariants], - ) - - // Keep stable refs to callback handlers to avoid re-creating table columns - // Initialize with no-ops to avoid TDZ when functions are declared below - const runEvaluationRef = useRef< - (id: string, count?: number, showNotification?: boolean) => void - >(() => {}) - const handleInputChangeRef = useRef< - (e: React.ChangeEvent, id: string, inputIndex: number) => void - >(() => {}) - const handleVoteClickRef = useRef<(id: string, vote: string) => void>(() => {}) - // // Note: assign .current values after handlers are defined (see below) - - const runEvaluation = useCallback( - async (id: string, count = 1, showNotification = true) => { - const _variantData = variantData - const rowIndex = rows.findIndex((row) => row.id === id) - const testRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - - // Derive request schema once - const spec = store.get(appSchemaAtom) as any - const routePath = uriObject?.routePath - const requestSchema: any = spec ? getRequestSchema(spec as any, {routePath}) : undefined - const hasMessagesProp = Boolean(requestSchema?.properties?.messages) - - const outputs = rows[rowIndex].outputs.reduce( - (acc, op) => ({...acc, [op.variant_id]: op.variant_output}), - {}, - ) - - await Promise.all( - evalVariants.map(async (variant: Variant, idx: number) => { - setRowValue(rowIndex, variant.variantId, "loading...") - - const isChatTestset = !!evaluation?.testset?.testsetChatColumn - - const rawMessages = isChatTestset - ? testsetRowToChatMessages(evaluation.testset.csvdata[rowIndex], false) - : [] - - const sanitizedMessages = rawMessages.map((msg) => { - if (!Array.isArray(msg.content)) return msg - return { - ...msg, - content: msg.content.filter((part) => { - return part.type !== "image_url" || part.image_url.url.trim() !== "" - }), - } - }) - - try { - // Build stable optional parameters using atom-based prompts (stable params) - const revisionId = _variantData?.[idx]?.id as string | undefined - const flags = revisionId - ? (store.get(variantFlagsAtomFamily({revisionId})) as any) - : undefined - const isCustom = Boolean(flags?.isCustom) - // Determine effective input keys per variant - const schemaKeys = spec - ? extractInputKeysFromSchema(spec as any, routePath) - : [] - const stableFromParams: string[] = (() => { - try { - const params = (_variantData[idx] as any)?.parameters - const ag = params?.ag_config ?? params ?? {} - const s = new Set() - Object.values(ag || {}).forEach((cfg: any) => { - const arr = cfg?.input_keys - if (Array.isArray(arr)) { - arr.forEach((k) => { - if (typeof k === "string" && k) s.add(k) - }) - } - }) - return Array.from(s) - } catch { - return [] - } - })() - - console.log("stableFromParams", stableFromParams) - // Also include stable variables derived from saved prompts (handles cases where input_keys are not explicitly listed) - const stableFromPrompts: string[] = revisionId - ? (store.get(stablePromptVariablesAtomFamily(revisionId)) as string[]) - : [] - const effectiveKeys = isCustom - ? schemaKeys - : Array.from( - new Set([ - ...(stableFromParams || []), - ...(stableFromPrompts || []), - ]), - ).filter((k) => typeof k === "string" && k && k !== "chat") - - // Build input params strictly from effective keys using testcase (with row overrides) - let inputParamsDict: Record = {} - if (Array.isArray(effectiveKeys) && effectiveKeys.length > 0) { - effectiveKeys.forEach((key) => { - const fromRowInput = rows[rowIndex]?.inputs?.find( - (ip) => ip.input_name === key, - )?.input_value - const fromTestcase = (testRow as any)?.[key] - if (fromRowInput !== undefined) inputParamsDict[key] = fromRowInput - else if (fromTestcase !== undefined) - inputParamsDict[key] = fromTestcase - }) - } else { - // Fallback: preserve previous behavior if keys unavailable - inputParamsDict = rows[rowIndex].inputs.reduce( - (acc: Record, item) => { - acc[item.input_name] = item.input_value - return acc - }, - {}, - ) - } - // Fallback: if chat testset, hydrate from test row keys as needed - if (isChatTestset) { - const testRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - const reserved = new Set([ - "correct_answer", - evaluation?.testset?.testsetChatColumn || "", - ]) - Object.keys(testRow) - .filter((k) => !reserved.has(k)) - .forEach((k) => { - if (!(k in inputParamsDict)) - inputParamsDict[k] = (testRow as any)[k] - }) - } - - const stableOptional = revisionId - ? store.get( - transformedPromptsAtomFamily({ - revisionId, - useStableParams: true, - }), - ) - : undefined - - const optionalParameters = - stableOptional || - (_variantData[idx]?.parameters - ? transformToRequestBody({ - variant: _variantData[idx], - allMetadata: getAllMetadata(), - prompts: - spec && _variantData[idx] - ? derivePromptsFromSpec( - _variantData[idx] as any, - spec as any, - uriObject?.routePath, - ) || [] - : [], - // Keep request shape aligned with OpenAPI schema - isChat: hasMessagesProp, - isCustom, - customProperties: undefined, - }) - : (_variantData[idx]?.promptOptParams as any)) - // For new arch, variable inputs must live under requestBody.inputs - // Mark them as non-"input" so callVariant places them under "inputs" - const synthesizedParamDef = Object.keys(inputParamsDict).map((name) => ({ - name, - input: false, - })) as any - - const result = await callVariant( - inputParamsDict, - synthesizedParamDef, - optionalParameters, - appId || "", - _variantData[idx].baseId || "", - sanitizedMessages, - undefined, - true, - !!_variantData[idx]._parentVariant, // isNewVariant (new arch if parent exists) - isCustom, - uriObject, - _variantData[idx].variantId, - ) - - let res: BaseResponse | undefined - - if (typeof result === "string") { - res = {version: "2.0", data: result} as BaseResponse - } else if (isFuncResponse(result)) { - res = {version: "2.0", data: result.message} as BaseResponse - } else if (isBaseResponse(result)) { - res = result as BaseResponse - } else if (result.data) { - res = {version: "2.0", data: result.data} as BaseResponse - } else { - res = {version: "2.0", data: ""} as BaseResponse - } - - const _result = getStringOrJson(res.data) - - setRowValue(rowIndex, variant.variantId, _result) - ;(outputs as KeyValuePair)[variant.variantId] = _result - setRowValue( - rowIndex, - "evaluationFlow", - EvaluationFlow.COMPARISON_RUN_STARTED, - ) - if (idx === evalVariants.length - 1) { - if (count === 1 || count === rowIndex) { - setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) - } - } - - updateEvaluationScenarioData( - id, - { - outputs: Object.keys(outputs).map((key) => ({ - variant_id: key, - variant_output: outputs[key as keyof typeof outputs], - })), - inputs: rows[rowIndex].inputs, - }, - showNotification, - ) - } catch (err) { - console.error("Error running evaluation:", err) - setEvaluationStatus(EvaluationFlow.EVALUATION_FAILED) - setRowValue( - rowIndex, - variant.variantId, - err?.response?.data?.detail?.message || "Failed to run evaluation!", - ) - } - }), - ) - }, - [ - variantData, - rows, - evalVariants, - updateEvaluationScenarioData, - setRowValue, - appId, - evaluation.testset.csvdata, - ], - ) - - // Now that handlers are declared, update stable refs - useEffect(() => { - runEvaluationRef.current = runEvaluation - handleInputChangeRef.current = handleInputChange - handleVoteClickRef.current = handleVoteClick - }, [runEvaluation, handleInputChange, handleVoteClick]) - - const runAllEvaluations = useCallback(async () => { - setEvaluationStatus(EvaluationFlow.EVALUATION_STARTED) - batchExecute(rows.map((row) => () => runEvaluation(row.id!, rows.length - 1, false))) - .then(() => { - setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) - mutate() - message.success("Evaluations Updated!") - }) - .catch((err) => console.error("An error occurred:", err)) - }, [runEvaluation, rows]) - - const dynamicColumns: ColumnType[] = useMemo( - () => - evalVariants.map((variant: Variant, ix) => { - const columnKey = variant.variantId - - return { - title: ( -
    - Variant: - - - {evalVariants - ? variantNameWithRev({ - variant_name: variant.variantName, - revision: evaluation.revisions[ix], - }) - : ""} - -
    - ), - dataIndex: columnKey, - key: columnKey, - width: "20%", - render: (text: any, record: ABTestingEvaluationTableRow) => { - const value = - text || - record?.[columnKey] || - record.outputs?.find((o: any) => o.variant_id === columnKey) - ?.variant_output || - "" - return ( -
    - {value} -
    - ) - }, - } - }), - [evalVariants, evaluation.revisions], - ) - - const columns = useMemo(() => { - return [ - { - key: "1", - title: ( -
    -
    - Inputs (Testset: - {evaluation.testset.name} - ) -
    -
    - ), - width: 300, - dataIndex: "inputs", - render: (_: any, record: ABTestingEvaluationTableRow, rowIndex: number) => { - return ( - runEvaluationRef.current(record.id!)} - onParamChange={(name, value) => upsertRowInput(record.id!, name, value)} - variantData={variantData} - isLoading={isVariantsLoading} - /> - ) - }, - }, - { - title: "Expected Output", - dataIndex: "expectedOutput", - key: "expectedOutput", - width: "25%", - render: (text: any, record: any, rowIndex: number) => { - const correctAnswer = - record.correctAnswer || evaluation.testset.csvdata[rowIndex].correct_answer - - return ( - <> - - depouncedUpdateEvaluationScenario( - { - correctAnswer: e.target.value, - }, - record.id, - ) - } - key={record.id} - /> - - ) - }, - }, - ...dynamicColumns, - { - title: "Score", - dataIndex: "score", - key: "score", - render: (text: any, record: any, rowIndex: number) => { - return ( - <> - { - handleVoteClickRef.current(record.id, vote)} - loading={record.vote === "loading"} - vertical - key={record.id} - outputs={record.outputs} - /> - } - - ) - }, - }, - { - title: "Additional Note", - dataIndex: "additionalNote", - key: "additionalNote", - render: (text: any, record: any, rowIndex: number) => { - return ( - <> - - depouncedUpdateEvaluationScenario( - {note: e.target.value}, - record.id, - ) - } - key={record.id} - /> - - ) - }, - }, - ] - }, [ - isVariantsLoading, - evaluation.testset.name, - classes.inputTestContainer, - classes.inputTest, - dynamicColumns, - evalVariants, - ]) - - return ( -
    -

    {EvaluationTypeLabels.human_a_b_testing}

    -
    - - - - - - exportABTestingEvaluationData( - evaluation, - evaluationScenarios, - rows, - ) - } - disabled={false} - > - Export Results - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - setViewMode(e.target.value)} - value={viewMode} - optionType="button" - /> -
    - - {viewMode === "tabular" ? ( - record.id!} - /> - ) : ( - handleVoteClick(id, vote as string)} - onInputChange={handleInputChange} - updateEvaluationScenarioData={updateEvaluationScenarioData} - evaluation={evaluation} - variantData={variantData} - isLoading={isLoading || isVariantsLoading} - /> - )} - - ) -} - -export default ABTestingEvaluationTable diff --git a/web/oss/src/components/EvaluationTable/SingleModelEvaluationTable.tsx b/web/oss/src/components/EvaluationTable/SingleModelEvaluationTable.tsx deleted file mode 100644 index 2bac4883a9..0000000000 --- a/web/oss/src/components/EvaluationTable/SingleModelEvaluationTable.tsx +++ /dev/null @@ -1,767 +0,0 @@ -// @ts-nocheck -import {useCallback, useEffect, useState, useMemo} from "react" - -import { - Button, - Card, - Col, - Input, - Radio, - Row, - Space, - Statistic, - Table, - Typography, - message, -} from "antd" -import type {ColumnType} from "antd/es/table" -import {getDefaultStore, useAtomValue} from "jotai" -import debounce from "lodash/debounce" -import {useRouter} from "next/router" - -import SaveTestsetModal from "@/oss/components/SaveTestsetModal/SaveTestsetModal" -import SecondaryButton from "@/oss/components/SecondaryButton/SecondaryButton" -import {EvaluationFlow} from "@/oss/lib/enums" -import {exportSingleModelEvaluationData} from "@/oss/lib/helpers/evaluate" -import {isBaseResponse, isFuncResponse} from "@/oss/lib/helpers/playgroundResp" -import {testsetRowToChatMessages} from "@/oss/lib/helpers/testset" -import { - EvaluationTypeLabels, - batchExecute, - camelToSnake, - getStringOrJson, -} from "@/oss/lib/helpers/utils" -import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" -import useStatelessVariants from "@/oss/lib/hooks/useStatelessVariants" -import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" -import {extractInputKeysFromSchema} from "@/oss/lib/shared/variant/inputHelpers" -import {getRequestSchema} from "@/oss/lib/shared/variant/openapiUtils" -import {derivePromptsFromSpec} from "@/oss/lib/shared/variant/transformer/transformer" -import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" -import type {BaseResponse, EvaluationScenario, KeyValuePair, Variant} from "@/oss/lib/Types" -import {callVariant} from "@/oss/services/api" -import {updateEvaluation, updateEvaluationScenario} from "@/oss/services/human-evaluations/api" -import {useQueryParamState} from "@/oss/state/appState" -import {customPropertiesByRevisionAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import { - stablePromptVariablesAtomFamily, - transformedPromptsAtomFamily, -} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {appUriInfoAtom, appSchemaAtom} from "@/oss/state/variant/atoms/fetcher" - -import EvaluationCardView from "../Evaluations/EvaluationCardView" -import EvaluationVotePanel from "../Evaluations/EvaluationCardView/EvaluationVotePanel" - -import {useSingleModelEvaluationTableStyles} from "./assets/styles" -import ParamsFormWithRun from "./components/ParamsFormWithRun" -import type {EvaluationTableProps, SingleModelEvaluationRow} from "./types" - -const {Title} = Typography - -/** - * - * @param evaluation - Evaluation object - * @param evaluationScenarios - Evaluation rows - * @param columnsCount - Number of variants to compare face to face (per default 2) - * @returns - */ -const SingleModelEvaluationTable: React.FC = ({ - evaluation, - evaluationScenarios, - isLoading, -}) => { - const classes = useSingleModelEvaluationTableStyles() - const router = useRouter() - const appId = router.query.app_id as string - const uriObject = useAtomValue(appUriInfoAtom) - const store = getDefaultStore() - const variants = evaluation.variants - - const {variants: data, isLoading: isVariantsLoading} = useStatelessVariants() - - // Select the correct variant revisions for this evaluation - const variantData = useMemo(() => { - const allVariantData = data || [] - if (!allVariantData.length) return [] - - return evaluation.variants.map((evVariant, idx) => { - const revisionId = evaluation.variant_revision_ids?.[idx] - const revisionNumber = evaluation.revisions?.[idx] - - // 1. Try to find by exact revision id - let selected = allVariantData.find((v) => v.id === revisionId) - - // 2. Try by variantId & revision number - if (!selected && revisionNumber !== undefined) { - selected = allVariantData.find( - (v) => v.variantId === evVariant.variantId && v.revision === revisionNumber, - ) - } - - // 3. Fallback – latest revision for that variant - if (!selected) { - selected = allVariantData.find( - (v) => v.variantId === evVariant.variantId && v.isLatestRevision, - ) - } - - return selected || evVariant - }) - }, [data, evaluation.variants, evaluation.variant_revision_ids, evaluation.revisions]) - - const [rows, setRows] = useState([]) - const [evaluationStatus, setEvaluationStatus] = useState(evaluation.status) - const [viewModeParam, setViewModeParam] = useQueryParamState("viewMode") - const viewMode = useMemo(() => { - if (Array.isArray(viewModeParam)) { - return viewModeParam[0] ?? "card" - } - if (typeof viewModeParam === "string" && viewModeParam) { - return viewModeParam - } - return "card" - }, [viewModeParam]) - const setViewMode = useCallback( - (nextMode: string) => { - setViewModeParam(nextMode, {method: "replace", shallow: true}) - }, - [setViewModeParam], - ) - const [accuracy, setAccuracy] = useState(0) - const [isTestsetModalOpen, setIsTestsetModalOpen] = useState(false) - - const depouncedUpdateEvaluationScenario = useCallback( - debounce((data: Partial, scenarioId) => { - updateEvaluationScenarioData(scenarioId, data) - }, 800), - [rows], - ) - - useEffect(() => { - if (evaluationScenarios) { - const obj = [...evaluationScenarios] - const spec = store.get(appSchemaAtom) as any - const routePath = uriObject?.routePath - - obj.forEach((item, rowIndex) => { - // Map outputs into row shape for table columns - item.outputs.forEach((op) => (item[op.variant_id] = op.variant_output)) - - try { - const names = new Set() - ;(variantData || []).forEach((v: any) => { - const rid = v?.id - if (!rid) return - const flags = store.get(variantFlagsAtomFamily({revisionId: rid})) as any - if (flags?.isCustom && spec) { - extractInputKeysFromSchema(spec as any, routePath).forEach((k) => - names.add(k), - ) - } else { - const vars = store.get(stablePromptVariablesAtomFamily(rid)) as string[] - ;(vars || []).forEach((k) => names.add(k)) - } - }) - - const chatCol = evaluation?.testset?.testsetChatColumn || "" - const reserved = new Set(["correct_answer", chatCol]) - const testRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - - const existing = new Set( - (Array.isArray(item.inputs) ? item.inputs : []) - .map((ip: any) => ip?.input_name) - .filter(Boolean), - ) - - const nextInputs = Array.isArray(item.inputs) ? [...item.inputs] : [] - Array.from(names) - .filter((k) => typeof k === "string" && k && !reserved.has(k)) - .forEach((k) => { - if (!existing.has(k)) { - nextInputs.push({ - input_name: k, - input_value: (testRow as any)?.[k] ?? "", - }) - } - }) - item.inputs = nextInputs - } catch { - // best-effort only - } - }) - - setRows(obj) - } - }, [evaluationScenarios, variantData]) - - useEffect(() => { - const filtered = rows.filter((row) => typeof row.score === "number" && !isNaN(row.score)) - - if (filtered.length > 0) { - const avg = filtered.reduce((acc, val) => acc + Number(val.score), 0) / filtered.length - setAccuracy(avg) - } else { - setAccuracy(0) - } - }, [rows]) - - useEffect(() => { - if (evaluationStatus === EvaluationFlow.EVALUATION_FINISHED) { - updateEvaluation(evaluation.id, {status: EvaluationFlow.EVALUATION_FINISHED}).catch( - (err) => console.error("Failed to fetch results:", err), - ) - } - }, [evaluationStatus, evaluation.id]) - - const handleInputChange = ( - e: React.ChangeEvent, - id: string, - inputIndex: number, - ) => { - const rowIndex = rows.findIndex((row) => row.id === id) - const newRows = [...rows] - newRows[rowIndex].inputs[inputIndex].input_value = e.target.value - setRows(newRows) - } - - const handleScoreChange = (id: string, score: number) => { - const rowIndex = rows.findIndex((row) => row.id === id) - const evaluation_scenario_id = rows[rowIndex].id - - if (evaluation_scenario_id) { - setRowValue(rowIndex, "score", "loading") - const data = { - score: score ?? "", - outputs: variants.map((v: Variant) => ({ - variant_id: v.variantId, - variant_output: rows[rowIndex][v.variantId], - })), - inputs: rows[rowIndex].inputs, - } - - updateEvaluationScenarioData(evaluation_scenario_id, data) - } - } - - const depouncedHandleScoreChange = useCallback( - debounce((...args: Parameters) => { - handleScoreChange(...args) - }, 800), - [handleScoreChange], - ) - - const updateEvaluationScenarioData = async ( - id: string, - data: Partial, - showNotification = true, - ) => { - await updateEvaluationScenario( - evaluation.id, - id, - Object.keys(data).reduce( - (acc, key) => ({ - ...acc, - [camelToSnake(key)]: data[key as keyof EvaluationScenario], - }), - {}, - ), - evaluation.evaluationType, - ) - .then(() => { - Object.keys(data).forEach((key) => { - setRowValue( - rows.findIndex((item) => item.id === id), - key, - data[key as keyof EvaluationScenario], - ) - }) - if (showNotification) message.success("Evaluation Updated!") - }) - .catch(console.error) - } - - const runAllEvaluations = async () => { - setEvaluationStatus(EvaluationFlow.EVALUATION_STARTED) - batchExecute(rows.map((row) => () => runEvaluation(row.id!, rows.length - 1, false))) - .then(() => { - setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) - message.success("Evaluations Updated!") - }) - .catch((err) => console.error("An error occurred:", err)) - } - - const runEvaluation = async (id: string, count = 1, showNotification = true) => { - const rowIndex = rows.findIndex((row) => row.id === id) - // Build input params from stable effective keys: schema keys for custom; stable prompt variables/parameters for non-custom - const testRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - const spec = store.get(appSchemaAtom) as any - const routePath = uriObject?.routePath - const requestSchema: any = spec ? getRequestSchema(spec as any, {routePath}) : undefined - const hasMessagesProp = Boolean(requestSchema?.properties?.messages) - - const effectiveKeysForVariant = (idx: number): string[] => { - const v = variantData?.[idx] as any - const rid = v?.id - const flags = rid ? (store.get(variantFlagsAtomFamily({revisionId: rid})) as any) : null - const isCustom = Boolean(flags?.isCustom) - if (isCustom) { - return spec ? extractInputKeysFromSchema(spec as any, routePath) : [] - } - // Union of saved parameters input_keys and stable prompt variables - const fromParams: string[] = (() => { - try { - const params = v?.parameters - const ag = params?.ag_config ?? params ?? {} - const s = new Set() - Object.values(ag || {}).forEach((cfg: any) => { - const arr = cfg?.input_keys - if (Array.isArray(arr)) - arr.forEach((k) => typeof k === "string" && s.add(k)) - }) - return Array.from(s) - } catch { - return [] - } - })() - const fromPrompts: string[] = rid - ? (store.get(stablePromptVariablesAtomFamily(rid)) as string[]) || [] - : [] - return Array.from(new Set([...(fromParams || []), ...(fromPrompts || [])])).filter( - (k) => k && k !== (evaluation?.testset?.testsetChatColumn || ""), - ) - } - - let inputParamsDict: Record = {} - const keys = effectiveKeysForVariant(0) // single model uses one variant for inputs shape - if (Array.isArray(keys) && keys.length > 0) { - keys.forEach((key) => { - const fromScenario = rows[rowIndex]?.inputs?.find( - (ip) => ip.input_name === key, - )?.input_value - const fromTestcase = (testRow as any)?.[key] - if (fromScenario !== undefined) inputParamsDict[key] = fromScenario - else if (fromTestcase !== undefined) inputParamsDict[key] = fromTestcase - }) - } else { - // Fallback to backend-provided inputs - inputParamsDict = rows[rowIndex].inputs.reduce((acc: Record, item) => { - acc[item.input_name] = item.input_value - return acc - }, {}) - } - - const outputs = rows[rowIndex].outputs.reduce( - (acc, op) => ({...acc, [op.variant_id]: op.variant_output}), - {}, - ) - await Promise.all( - variants.map(async (variant: Variant, idx: number) => { - setRowValue(rowIndex, variant.variantId, "loading...") - - const isChatTestset = !!evaluation?.testset?.testsetChatColumn - const rawMessages = isChatTestset - ? testsetRowToChatMessages(evaluation.testset.csvdata[rowIndex], false) - : [] - - const sanitizedMessages = rawMessages.map((msg) => { - if (!Array.isArray(msg.content)) return msg - return { - ...msg, - content: msg.content.filter((part) => { - return part.type !== "image_url" || part.image_url.url.trim() !== "" - }), - } - }) - - try { - const revisionId = variantData?.[idx]?.id as string | undefined - const flags = revisionId - ? (store.get(variantFlagsAtomFamily({revisionId})) as any) - : undefined - const isCustom = Boolean(flags?.isCustom) - // Recompute effective keys for this variant index - const vKeys = effectiveKeysForVariant(idx) - if (Array.isArray(vKeys) && vKeys.length > 0) { - vKeys.forEach((key) => { - if (!(key in inputParamsDict)) { - const v = (testRow as any)?.[key] - if (v !== undefined) inputParamsDict[key] = v - } - }) - } - if (isChatTestset) { - const testRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - const reserved = new Set([ - "correct_answer", - evaluation?.testset?.testsetChatColumn || "", - ]) - Object.keys(testRow) - .filter((k) => !reserved.has(k)) - .forEach((k) => { - if (!(k in inputParamsDict)) - inputParamsDict[k] = (testRow as any)[k] - }) - } - - // Prefer stable transformed parameters (saved revision + schema) - const stableOptional = revisionId - ? store.get( - transformedPromptsAtomFamily({ - revisionId, - useStableParams: true, - }), - ) - : undefined - const optionalParameters = - stableOptional || - (variantData[idx]?.parameters - ? transformToRequestBody({ - variant: variantData[idx], - allMetadata: getAllMetadata(), - prompts: - spec && variantData[idx] - ? derivePromptsFromSpec( - variantData[idx] as any, - spec as any, - uriObject?.routePath, - ) || [] - : [], - // Keep request shape aligned with OpenAPI schema - isChat: hasMessagesProp, - isCustom, - // stableOptional already includes custom props; fallback path keeps schema-aligned custom props - customProperties: undefined, - }) - : (variantData[idx]?.promptOptParams as any)) - - // For new arch, variable inputs must live under requestBody.inputs - // Mark them as non-"input" so callVariant places them under "inputs" - const synthesizedParamDef = Object.keys(inputParamsDict).map((name) => ({ - name, - input: false, - })) as any - - const result = await callVariant( - inputParamsDict, - synthesizedParamDef, - optionalParameters, - appId || "", - variantData[idx].baseId || "", - sanitizedMessages, - undefined, - true, - !!variantData[idx]._parentVariant, // isNewVariant - isCustom, - uriObject, - variantData[idx].variantId, - ) - - let res: BaseResponse | undefined - - if (typeof result === "string") { - res = {version: "2.0", data: result} as BaseResponse - } else if (isFuncResponse(result)) { - res = {version: "2.0", data: result.message} as BaseResponse - } else if (isBaseResponse(result)) { - res = result as BaseResponse - } else if (result.data) { - res = {version: "2.0", data: result.data} as BaseResponse - } else { - res = {version: "2.0", data: ""} as BaseResponse - console.error("Unknown response type:", result) - } - - const _result = getStringOrJson(res.data) - - setRowValue(rowIndex, variant.variantId, _result) - ;(outputs as KeyValuePair)[variant.variantId] = _result - setRowValue(rowIndex, "evaluationFlow", EvaluationFlow.COMPARISON_RUN_STARTED) - if (idx === variants.length - 1) { - if (count === 1 || count === rowIndex) { - setEvaluationStatus(EvaluationFlow.EVALUATION_FINISHED) - } - } - - updateEvaluationScenarioData( - id, - { - outputs: Object.keys(outputs).map((key) => ({ - variant_id: key, - variant_output: outputs[key as keyof typeof outputs], - })), - inputs: rows[rowIndex].inputs, - }, - showNotification, - ) - } catch (err) { - console.error("Error running evaluation:", err) - setEvaluationStatus(EvaluationFlow.EVALUATION_FAILED) - setRowValue( - rowIndex, - variant.variantId, - err?.response?.data?.detail?.message || "Failed to run evaluation!", - ) - } - }), - ) - } - - const setRowValue = ( - rowIndex: number, - columnKey: keyof SingleModelEvaluationRow, - value: any, - ) => { - const newRows = [...rows] - newRows[rowIndex][columnKey] = value as never - setRows(newRows) - } - - const dynamicColumns: ColumnType[] = variants.map( - (variant: Variant) => { - const columnKey = variant.variantId - - return { - title: ( -
    - App Variant: - - {variants - ? variantNameWithRev({ - variant_name: variant.variantName, - revision: evaluation.revisions[0], - }) - : ""} - -
    - ), - dataIndex: columnKey, - key: columnKey, - width: "25%", - render: (text: any, record: SingleModelEvaluationRow, rowIndex: number) => { - let outputValue = text - if (!outputValue && record.outputs && record.outputs.length > 0) { - outputValue = record.outputs.find( - (output: any) => output.variant_id === columnKey, - )?.variant_output - } - return ( -
    - {outputValue} -
    - ) - }, - } - }, - ) - - const columns = [ - { - key: "1", - title: ( -
    -
    - Inputs (Testset: - {evaluation.testset.name} - ) -
    -
    - ), - width: 300, - dataIndex: "inputs", - render: (_: any, record: SingleModelEvaluationRow, rowIndex: number) => { - return ( - runEvaluation(record.id!)} - onParamChange={(name, value) => - handleInputChange( - {target: {value}} as any, - record.id, - record?.inputs.findIndex((ip) => ip.input_name === name), - ) - } - variantData={variantData} - isLoading={isVariantsLoading} - /> - ) - }, - }, - { - title: "Expected Output", - dataIndex: "expectedOutput", - key: "expectedOutput", - width: "25%", - render: (text: any, record: any, rowIndex: number) => { - const correctAnswer = - record.correctAnswer || evaluation.testset.csvdata[rowIndex].correct_answer - - return ( - <> - - depouncedUpdateEvaluationScenario( - { - correctAnswer: e.target.value, - }, - record.id, - ) - } - key={record.id} - /> - - ) - }, - }, - ...dynamicColumns, - { - title: "Score", - dataIndex: "score", - key: "score", - render: (text: any, record: any, rowIndex: number) => { - return ( - <> - { - - depouncedHandleScoreChange(record.id, val[0].score as number) - } - loading={record.score === "loading"} - showVariantName={false} - key={record.id} - outputs={record.outputs} - /> - } - - ) - }, - }, - { - title: "Additional Note", - dataIndex: "additionalNote", - key: "additionalNote", - render: (text: any, record: any, rowIndex: number) => { - return ( - <> - - depouncedUpdateEvaluationScenario({note: e.target.value}, record.id) - } - key={record.id} - /> - - ) - }, - }, - ] - - return ( -
    - {EvaluationTypeLabels.single_model_test} -
    - -
    - - - - exportSingleModelEvaluationData( - evaluation, - evaluationScenarios, - rows, - ) - } - disabled={false} - > - Export Results - - - - - - - - - - - - - - - -
    - setViewMode(e.target.value)} - value={viewMode} - optionType="button" - /> -
    - - setIsTestsetModalOpen(false)} - onSuccess={(testsetName: string) => { - message.success(`Row added to the "${testsetName}" testset!`) - setIsTestsetModalOpen(false) - }} - rows={rows} - evaluation={evaluation} - /> - - {viewMode === "tabular" ? ( -
    record.id!} - /> - ) : ( - depouncedHandleScoreChange(id, score as number)} - onInputChange={handleInputChange} - updateEvaluationScenarioData={updateEvaluationScenarioData} - evaluation={evaluation} - variantData={variantData} - isLoading={isLoading || isVariantsLoading} - /> - )} - - ) -} - -export default SingleModelEvaluationTable diff --git a/web/oss/src/components/EvaluationTable/components/ParamsFormWithRun.tsx b/web/oss/src/components/EvaluationTable/components/ParamsFormWithRun.tsx deleted file mode 100644 index 9857286493..0000000000 --- a/web/oss/src/components/EvaluationTable/components/ParamsFormWithRun.tsx +++ /dev/null @@ -1,148 +0,0 @@ -// @ts-nocheck -import {useMemo} from "react" - -import {CaretRightOutlined} from "@ant-design/icons" -import {Button, Form} from "antd" -import {atom, useAtomValue} from "jotai" - -import ParamsForm from "@/oss/components/ParamsForm" -import {useLegacyVariants} from "@/oss/lib/hooks/useLegacyVariant" -import type {Evaluation} from "@/oss/lib/Types" -import {inputParamsAtomFamily} from "@/oss/state/newPlayground/core/inputParams" -import {stablePromptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" - -import {useSingleModelEvaluationTableStyles} from "../assets/styles" -import type {SingleModelEvaluationRow} from "../types" - -/** - * - * @param evaluation - Evaluation object - * @param evaluationScenarios - Evaluation rows - * @param columnsCount - Number of variants to compare face to face (per default 2) - * @returns - */ -const ParamsFormWithRun = ({ - evaluation, - record, - rowIndex, - onRun, - onParamChange, - variantData = [], - isLoading, -}: { - record: SingleModelEvaluationRow - rowIndex: number - evaluation: Evaluation - onRun: () => void - onParamChange: (name: string, value: any) => void - variantData: ReturnType - isLoading: boolean -}) => { - const classes = useSingleModelEvaluationTableStyles() - const [form] = Form.useForm() - const selectedVariant = variantData?.[0] - const routePath = useAtomValue(appUriInfoAtom)?.routePath - const hasRevision = Boolean(selectedVariant && (selectedVariant as any).id) - // Memoize the atom-family selector only when we have a proper revision and route - const inputParamsSelector = useMemo( - () => - (hasRevision && routePath - ? inputParamsAtomFamily({variant: selectedVariant as any, routePath}) - : atom([])) as any, - [hasRevision ? (selectedVariant as any).id : undefined, routePath], - ) - const baseInputParams = useAtomValue(inputParamsSelector) as any[] - // Stable variables derived from saved prompts (spec + saved parameters; no live mutations) - const stableVariableNames = useAtomValue( - selectedVariant?.id - ? (stablePromptVariablesAtomFamily((selectedVariant as any).id) as any) - : atom([]), - ) as string[] - const flags = useAtomValue( - selectedVariant?.id - ? (variantFlagsAtomFamily({revisionId: (selectedVariant as any).id}) as any) - : atom({}), - ) as any - - // Build input params similar to EvaluationCardView with robust fallbacks - const testsetRow = evaluation?.testset?.csvdata?.[rowIndex] || {} - const chatCol = evaluation?.testset?.testsetChatColumn - const reservedKeys = new Set(["correct_answer", chatCol || ""]) as Set - - const derivedInputParams = useMemo((): any[] => { - const haveSchema = Array.isArray(baseInputParams) && baseInputParams.length > 0 - let source: any[] - if (haveSchema) { - source = baseInputParams - } else if (Array.isArray(record?.inputs) && record.inputs.length > 0) { - source = record.inputs - .filter((ip: any) => (chatCol ? ip.input_name !== chatCol : true)) - .map((ip: any) => ({name: ip.input_name, type: "string"})) - } else { - source = Object.keys(testsetRow) - .filter((k) => !reservedKeys.has(k)) - .map((k) => ({name: k, type: "string"})) - } - // Filter to stable variables only for non-custom apps - if ( - !flags?.isCustom && - Array.isArray(stableVariableNames) && - stableVariableNames.length > 0 - ) { - const allow = new Set( - stableVariableNames.filter((name) => (chatCol ? name !== chatCol : true)), - ) - source = (source || []).filter((p: any) => allow.has(p?.name)) - } - - return (source || []).map((item: any) => ({ - ...item, - value: - record?.inputs?.find((ip: any) => ip.input_name === item.name)?.input_value ?? - (testsetRow as any)?.[item.name] ?? - "", - })) - }, [baseInputParams, record?.inputs, testsetRow, chatCol, stableVariableNames, flags?.isCustom]) - - return isLoading ? null : ( -
    -
    - {evaluation.testset.testsetChatColumn && ( -
    - {evaluation.testset.csvdata[rowIndex][ - evaluation.testset.testsetChatColumn - ] || " - "} -
    - )} - {derivedInputParams && derivedInputParams.length > 0 ? ( - { - // Ensure local row inputs are updated before invoking run - Object.entries(values || {}).forEach(([k, v]) => - onParamChange(k as string, v), - ) - onRun() - }} - key={`${record.id}-${rowIndex}`} - form={form} - /> - ) : null} -
    -
    - -
    -
    - ) -} - -export default ParamsFormWithRun diff --git a/web/oss/src/components/Evaluations/EvaluationCardView/index.tsx b/web/oss/src/components/Evaluations/EvaluationCardView/index.tsx deleted file mode 100644 index 2b31bfb74e..0000000000 --- a/web/oss/src/components/Evaluations/EvaluationCardView/index.tsx +++ /dev/null @@ -1,523 +0,0 @@ -// @ts-nocheck -import {useCallback, useEffect, useMemo, useRef} from "react" - -import { - LeftOutlined, - LoadingOutlined, - PlayCircleOutlined, - QuestionCircleOutlined, - RightOutlined, -} from "@ant-design/icons" -import {Button, Empty, Form, Input, Result, Space, Tooltip, Typography, theme} from "antd" -import {atom, useAtomValue} from "jotai" -import debounce from "lodash/debounce" -import {useLocalStorage} from "usehooks-ts" - -import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" -import ParamsForm from "@/oss/components/ParamsForm" -import {useQueryParamState} from "@/oss/state/appState" -import {EvaluationType} from "@/oss/lib/enums" -import {testsetRowToChatMessages} from "@/oss/lib/helpers/testset" -import useStatelessVariants from "@/oss/lib/hooks/useStatelessVariants" -import type {ChatMessage, EvaluationScenario} from "@/oss/lib/Types" -import {inputParamsAtomFamily} from "@/oss/state/newPlayground/core/inputParams" -import {stablePromptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" - -import {useStyles} from "./assets/styles" -import EvaluationCard from "./EvaluationCard" -import EvaluationVotePanel from "./EvaluationVotePanel" -import type {EvaluationCardViewProps} from "./types" - -const EvaluationCardView: React.FC = ({ - variants, - evaluationScenarios, - onRun, - onVote, - onInputChange, - updateEvaluationScenarioData, - evaluation, - variantData = [], - isLoading, -}) => { - const classes = useStyles() - const {token} = theme.useToken() - const [evaluationsState, setEvaluationsState] = useLocalStorage< - Record - >("evaluationsState", {}) - - const [scenarioParam, setScenarioParam] = useQueryParamState("evaluationScenario") - const fallbackScenarioId = useMemo(() => { - return ( - evaluationsState[evaluation.id]?.lastVisitedScenario || evaluationScenarios[0]?.id || "" - ) - }, [evaluation.id, evaluationScenarios, evaluationsState]) - const scenarioId = useMemo(() => { - if (Array.isArray(scenarioParam)) { - return scenarioParam[0] || fallbackScenarioId - } - if (typeof scenarioParam === "string" && scenarioParam) { - return scenarioParam - } - return fallbackScenarioId - }, [scenarioParam, fallbackScenarioId]) - const setScenarioId = useCallback( - (nextId: string) => { - if (!nextId) return - setScenarioParam(nextId, {method: "replace", shallow: true}) - }, - [setScenarioParam], - ) - - const [instructionsShown, setInstructionsShown] = useLocalStorage( - "evalInstructionsShown", - false, - ) - const {scenario, scenarioIndex} = useMemo(() => { - const scenarioIndex = evaluationScenarios.findIndex( - (scenario) => scenario.id === scenarioId, - ) - return {scenario: evaluationScenarios[scenarioIndex], scenarioIndex} - }, [scenarioId, evaluationScenarios]) - - useEffect(() => { - setEvaluationsState((prevEvaluationsState) => ({ - ...prevEvaluationsState, - [evaluation.id]: { - ...(prevEvaluationsState[evaluation.id] || {}), - lastVisitedScenario: scenarioId, - }, - })) - }, [scenarioId]) - - const rootRef = useRef(null) - const opened = useRef(false) - const callbacks = useRef({ - onVote, - onRun, - onInputChange, - }) - const isChat = !!evaluation.testset.testsetChatColumn - const testsetRow = evaluation.testset.csvdata[scenarioIndex] - const isAbTesting = evaluation.evaluationType === EvaluationType.human_a_b_testing - const [form] = Form.useForm() - const {_variants: _allStatelessVariants} = useStatelessVariants() as any - - const loadPrevious = () => { - if (scenarioIndex === 0) return - setScenarioId(evaluationScenarios[scenarioIndex - 1].id) - } - - const loadNext = () => { - if (scenarioIndex === evaluationScenarios.length - 1) return - setScenarioId(evaluationScenarios[scenarioIndex + 1].id) - } - - const showInstructions = useCallback(() => { - if (opened.current) return - - opened.current = true - AlertPopup({ - title: "Instructions", - type: "info", - message: ( -
      -
    1. - Use the buttons Next and Prev or the arrow keys{" "} - {`Left (<)`} and {`Right (>)`} to navigate between - evaluations. -
    2. -
    3. - Click the Run{" "} - button on - right or press {`Enter (↵)`} key to generate the variants' - outputs. -
    4. - {isAbTesting && ( -
    5. - Vote by either clicking the evaluation buttons at the right - sidebar or pressing the key a for 1st Variant,{" "} - b for 2nd Variant and x if both are bad. -
    6. - )} -
    7. - Add a note to an evaluation from the Additional Notes input section{" "} - in the right sidebar. -
    8. -
    - ), - okText: Ok, - cancelText: null, - width: 500, - onCancel: () => (opened.current = false), - onOk: () => (opened.current = false), - }) - }, []) - - const depouncedUpdateEvaluationScenario = useCallback( - debounce((data: Partial) => { - updateEvaluationScenarioData(scenarioId, data) - }, 800), - [scenarioId], - ) - - const onChatChange = (chat: ChatMessage[]) => { - const stringified = JSON.stringify(chat) - testsetRow[evaluation.testset.testsetChatColumn] = stringified - - depouncedUpdateEvaluationScenario({ - inputs: [ - {input_name: "chat", input_value: stringified}, - ...scenario.inputs.filter( - (ip: {input_name: string; input_value: string}) => ip.input_name !== "chat", - ), - ], - [evaluation.testset.testsetChatColumn]: stringified, - }) - } - - //hack to always get the latest callbacks using ref - useEffect(() => { - callbacks.current = {onVote, onRun, onInputChange} - }, [onVote, onRun, onInputChange]) - - // focus the root element on mount - useEffect(() => { - if (rootRef.current) { - rootRef.current.focus() - } - }, []) - - useEffect(() => { - if (!instructionsShown) { - showInstructions() - setInstructionsShown(true) - } - }, [instructionsShown]) - - useEffect(() => { - if (typeof window === "undefined") return () => {} - - const listener = (e: KeyboardEvent) => { - if (document.activeElement !== rootRef.current) return - if (e.key === "ArrowLeft") loadPrevious() - else if (e.key === "ArrowRight") loadNext() - else if (e.key === "Enter") callbacks.current.onRun(scenarioId) - - if (isAbTesting) { - if (e.key === "a") callbacks.current.onVote(scenarioId, variants[0].variantId) - else if (e.key === "b") callbacks.current.onVote(scenarioId, variants[1].variantId) - else if (e.key === "x") callbacks.current.onVote(scenarioId, "0") - } - } - - document.addEventListener("keydown", listener) - return () => document.removeEventListener("keydown", listener) - }, [scenarioIndex]) - - useEffect(() => { - if (scenario) { - const chatStr = scenario?.inputs.find( - (ip: {input_name: string; input_value: string}) => ip.input_name === "chat", - )?.input_value - if (chatStr) testsetRow[evaluation.testset.testsetChatColumn] = chatStr - } - }, [scenario]) - - const correctAnswer = useMemo(() => { - if (scenario?.correctAnswer) return scenario.correctAnswer - const res = testsetRow?.correct_answer - return res || "" - }, [testsetRow?.correct_answer, scenario?.correctAnswer]) - - const chat = useMemo(() => { - const fromInput = scenario?.inputs.find( - (ip: {input_name: string; input_value: string}) => ip.input_name === "chat", - )?.input_value - if (!isChat) return [] - - return testsetRowToChatMessages( - fromInput - ? {chat: fromInput, correct_answer: testsetRow?.correct_answer} - : testsetRow || {}, - false, - ) - }, [scenarioIndex]) - - const routePath = useAtomValue(appUriInfoAtom)?.routePath - const selectedRevisionId = (variantData?.[0] as any)?.id as string | undefined - const hasRevision = Boolean(variantData?.[0] && selectedRevisionId) - const inputParamsSelector = useMemo( - () => - (hasRevision && routePath - ? inputParamsAtomFamily({variant: variantData[0] as any, routePath}) - : atom([])) as any, - [hasRevision ? (variantData?.[0] as any)?.id : undefined, routePath], - ) - const baseInputParams = useAtomValue(inputParamsSelector) as any[] - // // Stable variables derived from saved prompts (spec + saved parameters; no live mutations) - const variableNames = useAtomValue( - hasRevision ? (stablePromptVariablesAtomFamily(selectedRevisionId!) as any) : atom([]), - ) as string[] - // Avoid creating new atoms during render to prevent infinite update loops - const emptyObjAtom = useMemo(() => atom({}), []) - const stableFlagsParam = useMemo( - () => (selectedRevisionId ? {revisionId: selectedRevisionId} : undefined), - [selectedRevisionId], - ) - const flags = useAtomValue( - hasRevision && stableFlagsParam - ? (variantFlagsAtomFamily(stableFlagsParam) as any) - : (emptyObjAtom as any), - ) as any - - const derivedInputParams = useMemo(() => { - const haveSchemaParams = Array.isArray(baseInputParams) && baseInputParams.length > 0 - - // Determine candidate field names - let sourceParams: any[] = [] - if (haveSchemaParams) { - sourceParams = baseInputParams - } else if (Array.isArray(scenario?.inputs) && scenario.inputs.length > 0) { - sourceParams = scenario.inputs - .filter((ip: any) => (isChat ? ip.input_name !== "chat" : true)) - .map((ip: any) => ({name: ip.input_name, type: "string"})) - } else { - const reserved = new Set([ - "correct_answer", - evaluation?.testset?.testsetChatColumn || "", - ]) - const row = testsetRow || {} - sourceParams = Object.keys(row) - .filter((k) => !reserved.has(k)) - .map((k) => ({name: k, type: "string"})) - } - // Display only stable inputs: filter to stable variable names for non-custom apps - // For chat apps, exclude the reserved "chat" key (handled separately below). - if (!flags?.isCustom && Array.isArray(variableNames) && variableNames.length > 0) { - const allow = new Set(variableNames.filter((name) => (isChat ? name !== "chat" : true))) - sourceParams = (sourceParams || []).filter((p: any) => allow.has(p?.name)) - } - - const withValues = (sourceParams || []).map((item: any) => { - const fromScenario = scenario?.inputs.find( - (ip: {input_name: string; input_value: string}) => ip.input_name === item.name, - )?.input_value - const fromRow = (testsetRow as any)?.[item.name] - return { - ...item, - value: fromScenario ?? fromRow ?? "", - } - }) - - if (isChat) { - return [...withValues, {name: "chat", type: "string", value: chat}] - } - return withValues - }, [ - baseInputParams, - scenario?.inputs, - isChat, - chat, - evaluation?.testset?.testsetChatColumn, - testsetRow, - variableNames, - flags?.isCustom, - ]) - - const handleRun = useCallback(async () => { - try { - // Persist current derived inputs into scenario if missing, so runner sees them - const nextInputs = (derivedInputParams || []) - .filter((p: any) => p.name !== "chat") - .map((p: any) => ({input_name: p.name, input_value: p.value ?? ""})) - - if (Array.isArray(nextInputs) && nextInputs.length > 0) { - await updateEvaluationScenarioData(scenarioId, {inputs: nextInputs}) - } - } catch (e) { - console.warn("[EvaluationCardView] failed to persist inputs before run", e) - } - onRun(scenarioId) - }, [derivedInputParams, scenarioId, onRun, updateEvaluationScenarioData]) - - return ( -
    - {isLoading ? ( - } /> - ) : scenario ? ( - <> -
    -
    - -

    - Evaluation: {scenarioIndex + 1}/{evaluationScenarios.length} -

    - -
    - -
    - Inputs - {derivedInputParams.length > 0 || isChat ? ( - { - if (isChat && name === "chat") return onChatChange(value) - const idx = - scenario?.inputs?.findIndex( - (ip: any) => ip.input_name === name, - ) ?? -1 - if (idx === -1) { - // If the input key does not exist yet (cold load fallback), persist it - const nextInputs = [ - {input_name: name, input_value: value}, - ...((scenario?.inputs || []).filter( - (ip: any) => ip.input_name !== name, - ) as any[]), - ] - updateEvaluationScenarioData(scenarioId, { - inputs: nextInputs as any, - }) - } else { - onInputChange({target: {value}} as any, scenarioId, idx) - } - }} - inputParams={derivedInputParams} - key={`${scenarioId}-${(variantData?.[0] as any)?.id || ""}`} - useChatDefaultValue - form={form} - onFinish={handleRun} - imageSize="large" - /> - ) : null} -
    - -
    - - - - - onRun(scenarioId) : form.submit} - /> - -
    - -
    -
    - {!isAbTesting ? ( - - Model Response - - ) : ( - - Outputs - - )} -
    - - -
    -
    - -
    -

    Submit your feedback

    - {scenario.outputs.length > 0 && - scenario.outputs.every((item) => !!item.variant_output) && ( - - - {isAbTesting - ? "Which response is better?" - : "Rate the response"} - - {isAbTesting ? ( - onVote(scenarioId, vote)} - loading={scenario.vote === "loading"} - vertical - key={scenarioId} - outputs={scenario.outputs} - /> - ) : ( - onVote(scenarioId, val[0].score)} - loading={scenario.score === "loading"} - showVariantName={false} - key={scenarioId} - outputs={scenario.outputs} - /> - )} - - )} - - - Expected Answer - - depouncedUpdateEvaluationScenario({ - correctAnswer: e.target.value, - }) - } - key={scenarioId} - /> - - - - Additional Notes - - depouncedUpdateEvaluationScenario({note: e.target.value}) - } - key={scenarioId} - /> - -
    - - ) : ( - - )} -
    - ) -} - -export default EvaluationCardView diff --git a/web/oss/src/components/Evaluators/assets/cells/EvaluatorTagsCell.tsx b/web/oss/src/components/Evaluators/assets/cells/EvaluatorTagsCell.tsx deleted file mode 100644 index b2f0dddcae..0000000000 --- a/web/oss/src/components/Evaluators/assets/cells/EvaluatorTagsCell.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import {memo} from "react" - -import {Tag} from "antd" - -const EvaluatorTagsCell = memo(({tags}: {tags: string[]}) => { - if (!tags?.length) return null - - return ( -
    - {tags.map((tag) => ( - - {tag} - - ))} -
    - ) -}) - -export default EvaluatorTagsCell diff --git a/web/oss/src/components/Evaluators/assets/cells/EvaluatorTypePill.tsx b/web/oss/src/components/Evaluators/assets/cells/EvaluatorTypePill.tsx deleted file mode 100644 index 727ca05926..0000000000 --- a/web/oss/src/components/Evaluators/assets/cells/EvaluatorTypePill.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import {memo, useMemo, type CSSProperties} from "react" - -import {Tag} from "antd" - -import {EvaluatorTypeBadge} from "../types" - -const hexToRgb = (hex?: string) => { - if (!hex) return null - let sanitized = hex.replace("#", "") - if (sanitized.length === 3) { - sanitized = sanitized - .split("") - .map((char) => char + char) - .join("") - } - if (sanitized.length !== 6) return null - - const intVal = Number.parseInt(sanitized, 16) - if (Number.isNaN(intVal)) return null - - return { - r: (intVal >> 16) & 255, - g: (intVal >> 8) & 255, - b: intVal & 255, - } -} - -const EvaluatorTypePill = memo(({badge}: {badge: EvaluatorTypeBadge}) => { - const baseHex = badge.colorHex - const computedStyle = useMemo(() => { - const rgb = hexToRgb(baseHex) - if (!rgb) return undefined - - return { - backgroundColor: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.12)`, - borderColor: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.32)`, - color: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.88)`, - } satisfies CSSProperties - }, [baseHex]) - - return ( - - {badge.label} - - ) -}) - -export default EvaluatorTypePill diff --git a/web/oss/src/components/Evaluators/assets/cells/TableDropdownMenu/index.tsx b/web/oss/src/components/Evaluators/assets/cells/TableDropdownMenu/index.tsx deleted file mode 100644 index 767e44bd5e..0000000000 --- a/web/oss/src/components/Evaluators/assets/cells/TableDropdownMenu/index.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import {memo, useMemo} from "react" - -import {MoreOutlined} from "@ant-design/icons" -import {GearSix, PencilSimpleLine, Trash} from "@phosphor-icons/react" -import {Button, Dropdown, MenuProps} from "antd" - -import {TableDropdownMenuProps} from "./types" - -const TableDropdownMenu = ({ - record, - category, - onEdit, - onConfigure, - onDelete, -}: TableDropdownMenuProps) => { - const items = useMemo(() => { - const menuItems: MenuProps["items"] = [] - - menuItems.push({ - key: "edit", - label: "Edit evaluator", - icon: , - onClick: (event) => { - event.domEvent.stopPropagation() - category === "human" ? onEdit?.(record) : onConfigure?.(record) - }, - }) - - if (menuItems.length) { - menuItems.push({type: "divider"}) - } - - menuItems.push({ - key: "delete", - label: "Delete", - icon: , - danger: true, - onClick: (event) => { - event.domEvent.stopPropagation() - onDelete(record) - }, - }) - - return menuItems - }, [category, record]) - - return ( - - - } - /> - ) - } - - if (existingConfig && (!editEvalEditValues || !editMode)) { - return - } - - const setCurrent: React.Dispatch> = () => { - navigateBack() - } - - const handleOnCancel = () => { - navigateBack() - } - - return ( - - ) -} - -export default ConfigureEvaluatorPage diff --git a/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/assets/DeleteEvaluatorsModalContent/index.tsx b/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/assets/DeleteEvaluatorsModalContent/index.tsx deleted file mode 100644 index 7243d815d8..0000000000 --- a/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/assets/DeleteEvaluatorsModalContent/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import {memo, useMemo} from "react" - -import {Typography} from "antd" - -interface DeleteEvaluatorsModalContentProps { - selectedCount: number - selectedNames: string[] -} - -const DeleteEvaluatorsModalContent = ({ - selectedCount, - selectedNames, -}: DeleteEvaluatorsModalContentProps) => { - const previewNames = useMemo(() => selectedNames.slice(0, 3), [selectedNames]) - const remaining = Math.max(selectedCount - previewNames.length, 0) - - return ( -
    - - {selectedCount === 1 - ? "Are you sure you want to delete this evaluator?" - : "Are you sure you want to delete the selected evaluators?"} - - - {previewNames.length > 0 && ( -
      - {previewNames.map((name) => ( -
    • {name}
    • - ))} - {remaining > 0 &&
    • and {remaining} more…
    • } -
    - )} -
    - ) -} - -export default memo(DeleteEvaluatorsModalContent) diff --git a/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/index.tsx b/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/index.tsx deleted file mode 100644 index 97c33bf066..0000000000 --- a/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/index.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import {memo} from "react" - -import dynamic from "next/dynamic" - -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" - -import {DeleteEvaluatorsModalProps} from "./types" - -const DeleteEvaluatorsModalContent = dynamic( - () => import("./assets/DeleteEvaluatorsModalContent"), - {ssr: false}, -) - -const DeleteEvaluatorsModal = ({ - selectedCount, - selectedNames, - confirmLoading = false, - onConfirm, - open, - onCancel, - okButtonProps, - ...modalProps -}: DeleteEvaluatorsModalProps) => { - return ( - - - - ) -} - -export default memo(DeleteEvaluatorsModal) diff --git a/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/types.ts b/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/types.ts deleted file mode 100644 index 3a2c1205f3..0000000000 --- a/web/oss/src/components/Evaluators/components/DeleteEvaluatorsModal/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {EnhancedModalProps} from "@/oss/components/EnhancedUIs/Modal/types" - -export interface DeleteEvaluatorsModalProps extends Omit { - selectedCount: number - selectedNames: string[] - confirmLoading?: boolean - onConfirm: () => void -} diff --git a/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/assets/SelectEvaluatorModalContent/index.tsx b/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/assets/SelectEvaluatorModalContent/index.tsx deleted file mode 100644 index a6085b8529..0000000000 --- a/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/assets/SelectEvaluatorModalContent/index.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import {memo, useCallback, useMemo, useState} from "react" - -import {ArrowRight} from "@phosphor-icons/react" -import type {TabsProps} from "antd" -import {Empty, Skeleton, Tabs, Tag, Typography, message} from "antd" -import clsx from "clsx" -import {useRouter} from "next/router" - -import type {EvaluatorPreview} from "@/oss/components/Evaluators/assets/types" -import useURL from "@/oss/hooks/useURL" -import {getEvaluatorTags} from "@/oss/lib/helpers/evaluate" -import {capitalize} from "@/oss/lib/helpers/utils" -import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" -import type {Evaluator} from "@/oss/lib/Types" - -const DEFAULT_TAB_KEY = "all" - -const TAG_CLASSNAME_MAP: Record = { - rag: "bg-sky-100 text-sky-700", - classifiers: "bg-orange-100 text-orange-700", - similarity: "bg-blue-100 text-blue-700", - ai_llm: "bg-violet-100 text-violet-700", - functional: "bg-amber-100 text-amber-700", -} - -const ENABLED_EVALUATORS = [ - "auto_exact_match", - "auto_contains_json", - "auto_similarity_match", - "auto_semantic_similarity", - "auto_regex_test", - "field_match_test", - "auto_json_diff", - "auto_ai_critique", - "auto_custom_code_run", - "auto_webhook_test", - "auto_starts_with", - "auto_ends_with", - "auto_contains", - "auto_contains_any", - "auto_contains_all", - "auto_levenshtein_distance", - "rag_faithfulness", - "rag_context_relevancy", -] - -const getEvaluatorTagValues = (item: EvaluatorPreview | Evaluator) => { - const registry = new Set() - // Prefer explicit evaluator tags when available and fall back to metadata tags - const primaryTags = Array.isArray((item as Evaluator).tags) ? (item as Evaluator).tags : [] - - primaryTags.filter(Boolean).forEach((tag) => { - registry.add(String(tag).toLowerCase()) - }) - - const rawTags = [ - ...(Array.isArray((item.flags as any)?.tags) ? (item.flags as any).tags : []), - ...(Array.isArray((item.meta as any)?.tags) ? (item.meta as any).tags : []), - ].filter(Boolean) - - rawTags.forEach((tag) => registry.add(String(tag).toLowerCase())) - - return Array.from(registry) -} - -const SelectEvaluatorModalContent = () => { - const {projectURL} = useURL() - const router = useRouter() - const {evaluatorsSwr, isLoadingEvaluators} = useFetchEvaluatorsData() - const [activeTab, setActiveTab] = useState(DEFAULT_TAB_KEY) - const evaluators = evaluatorsSwr.data || [] - const baseTags = useMemo(() => getEvaluatorTags(), []) - - const availableTags = useMemo(() => { - const normalized = new Map() - baseTags.forEach((tag) => { - normalized.set(tag.value, tag.label) - }) - - evaluators.forEach((item) => { - getEvaluatorTagValues(item).forEach((tag) => { - if (!normalized.has(tag)) { - normalized.set(tag, capitalize(tag.replace(/[_-]+/g, " "))) - } - }) - }) - - return normalized - }, [baseTags, evaluators]) - - const tabItems = useMemo(() => { - const items: TabsProps["items"] = [{key: DEFAULT_TAB_KEY, label: "All templates"}] - - availableTags.forEach((label, value) => { - items!.push({key: value, label}) - }) - - return items - }, [availableTags]) - - const filteredEvaluators = useMemo(() => { - const enabled_evaluators = evaluators.filter((item) => { - return ENABLED_EVALUATORS.includes(item.key) - }) - - if (activeTab === DEFAULT_TAB_KEY) { - return enabled_evaluators - } - - return enabled_evaluators.filter((item) => { - const tags = getEvaluatorTagValues(item) - return tags.includes(activeTab) - }) - }, [activeTab, evaluators]) - - const handleTabChange = useCallback((key: string) => { - setActiveTab(key) - }, []) - - const handleTemplateSelect = useCallback( - async (template: EvaluatorPreview | Evaluator) => { - const evaluatorId = (template as any)?.key - if (!evaluatorId) { - message.error("Unable to open evaluator template") - return - } - - await router.push(`${projectURL}/evaluators/configure/${evaluatorId}`) - }, - [router, projectURL], - ) - - const renderContent = () => { - if (isLoadingEvaluators) { - return ( -
    - {Array.from({length: 5}).map((_, index) => ( - - ))} -
    - ) - } - - if (!filteredEvaluators.length) { - return ( -
    - -
    - ) - } - - return ( -
    - {filteredEvaluators.map((item) => { - const primaryTag = getEvaluatorTagValues(item)[0] - const tagClassnames = primaryTag - ? TAG_CLASSNAME_MAP[primaryTag] || "bg-slate-100 text-slate-700" - : "bg-slate-100 text-slate-700" - - return ( -
    handleTemplateSelect(item)} - className={clsx( - "border-0 border-b border-solid border-gray-200 min-h-[72px] flex flex-col justify-center gap-3 py-3 px-4 cursor-pointer group", - )} - > -
    - - {item.name} - - -
    - {item.description} -
    - ) - })} -
    - ) - } - - return ( -
    -
    - - Select evaluator type - - - Choose base template for your evaluator - -
    - - -
    {renderContent()}
    -
    - ) -} - -export default memo(SelectEvaluatorModalContent) diff --git a/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/index.tsx b/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/index.tsx deleted file mode 100644 index 858de0e46e..0000000000 --- a/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/index.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import {memo} from "react" - -import dynamic from "next/dynamic" - -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" - -import {SelectEvaluatorModalProps} from "./types" -const SelectEvaluatorModalContent = dynamic(() => import("./assets/SelectEvaluatorModalContent"), { - ssr: false, -}) - -const SelectEvaluatorModal = ({open, onCancel, ...modalProps}: SelectEvaluatorModalProps) => { - return ( - - - - ) -} - -export default memo(SelectEvaluatorModal) diff --git a/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/types.ts b/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/types.ts deleted file mode 100644 index 29b0bbbc32..0000000000 --- a/web/oss/src/components/Evaluators/components/SelectEvaluatorModal/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {EnhancedModalProps} from "@/oss/components/EnhancedUIs/Modal/types" - -export interface SelectEvaluatorModalProps extends EnhancedModalProps {} diff --git a/web/oss/src/components/Evaluators/hooks/useEvaluatorsRegistryData.ts b/web/oss/src/components/Evaluators/hooks/useEvaluatorsRegistryData.ts deleted file mode 100644 index 3aa171dc76..0000000000 --- a/web/oss/src/components/Evaluators/hooks/useEvaluatorsRegistryData.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {useCallback, useMemo} from "react" - -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" -import {Evaluator, EvaluatorConfig} from "@/oss/lib/Types" - -import {EvaluatorCategory, EvaluatorPreview, EvaluatorRegistryRow} from "../assets/types" -import { - sortEvaluatorRowsByCreatedAtDesc, - transformEvaluatorConfigsToRows, - transformEvaluatorsToRows, -} from "../assets/utils" - -const HUMAN_QUERY = Object.freeze({is_human: true}) - -const useEvaluatorsRegistryData = (category: EvaluatorCategory) => { - const { - evaluatorsSwr: baseEvaluatorsSwr, - evaluatorConfigsSwr, - isLoadingEvaluators, - refetchAll: refetchEvaluatorResources, - } = useFetchEvaluatorsData() - - const humanEvaluatorsSwr = useEvaluators({ - preview: true, - queries: HUMAN_QUERY, - }) - - const rows = useMemo(() => { - let unsortedRows: EvaluatorRegistryRow[] - - if (category === "human") { - const humanEvaluators = (humanEvaluatorsSwr.data || []) as EvaluatorPreview[] - unsortedRows = transformEvaluatorsToRows(humanEvaluators, "human") - } else { - const evaluatorConfigs = (evaluatorConfigsSwr.data || []) as EvaluatorConfig[] - const baseEvaluators = (baseEvaluatorsSwr.data || []) as Evaluator[] - - unsortedRows = transformEvaluatorConfigsToRows( - evaluatorConfigs, - category, - baseEvaluators, - ) - } - - return sortEvaluatorRowsByCreatedAtDesc(unsortedRows) - }, [category, baseEvaluatorsSwr.data, evaluatorConfigsSwr.data, humanEvaluatorsSwr.data]) - - const isLoading = useMemo( - () => - category === "human" - ? humanEvaluatorsSwr.isLoading - : evaluatorConfigsSwr.isLoading || isLoadingEvaluators, - [isLoadingEvaluators, evaluatorConfigsSwr.isLoading, humanEvaluatorsSwr.isLoading], - ) - - const refetchAll = useCallback(async () => { - await Promise.all( - [refetchEvaluatorResources(), humanEvaluatorsSwr.mutate?.()].filter(Boolean), - ) - }, [refetchEvaluatorResources, humanEvaluatorsSwr.mutate]) - - return {rows, isLoading, refetchAll} -} - -export default useEvaluatorsRegistryData diff --git a/web/oss/src/components/Evaluators/index.tsx b/web/oss/src/components/Evaluators/index.tsx deleted file mode 100644 index e1062ad107..0000000000 --- a/web/oss/src/components/Evaluators/index.tsx +++ /dev/null @@ -1,374 +0,0 @@ -import {memo, useCallback, useEffect, useMemo, useState, type ChangeEvent, type Key} from "react" - -import {DeleteOutlined, PlusOutlined} from "@ant-design/icons" -import {Button, Input, Tabs, Typography} from "antd" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" -import {useLocalStorage} from "usehooks-ts" - -import {message} from "@/oss/components/AppMessageContext" -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import {AnnotateDrawerSteps} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/enum" -import {useQueryParam} from "@/oss/hooks/useQuery" -import useURL from "@/oss/hooks/useURL" -import {checkIfResourceValidForDeletion} from "@/oss/lib/helpers/evaluate" -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" -import {deleteEvaluatorConfig} from "@/oss/services/evaluations/api" -import {deleteHumanEvaluator} from "@/oss/services/evaluators" -import {useProjectData} from "@/oss/state/project/hooks" - -import { - DEFAULT_EVALUATOR_TAB, - EVALUATOR_TABLE_STORAGE_PREFIX, - EVALUATOR_TABS, -} from "./assets/constants" -import getColumns from "./assets/getColumns" -import {EvaluatorCategory, EvaluatorRegistryRow} from "./assets/types" -import DeleteEvaluatorsModal from "./components/DeleteEvaluatorsModal" -import SelectEvaluatorModal from "./components/SelectEvaluatorModal" -import useEvaluatorsRegistryData from "./hooks/useEvaluatorsRegistryData" - -const AnnotateDrawer = dynamic( - () => import("@/oss/components/pages/observability/drawer/AnnotateDrawer"), - {ssr: false}, -) - -const isValidEvaluatorTab = (value: string): value is EvaluatorCategory => { - return EVALUATOR_TABS.some(({key}) => key === value) -} - -const EvaluatorsRegistry = ({scope = "project"}: {scope?: "project" | "app"}) => { - const {projectId} = useProjectData() - const router = useRouter() - const {projectURL} = useURL() - const storageKey = useMemo( - () => `${EVALUATOR_TABLE_STORAGE_PREFIX}-${scope}-${projectId || "global"}-tab`, - [projectId, scope], - ) - const [activeTab, setActiveTab] = useLocalStorage( - storageKey, - DEFAULT_EVALUATOR_TAB, - ) - const [tabState, setTabState] = useQueryParam("tab", activeTab) - - useEffect(() => { - if (isValidEvaluatorTab(tabState)) { - if (tabState !== activeTab) { - setActiveTab(tabState) - } - return - } - - const fallbackTab = isValidEvaluatorTab(activeTab) ? activeTab : DEFAULT_EVALUATOR_TAB - - if (activeTab !== fallbackTab) { - setActiveTab(fallbackTab) - } - - if (tabState !== fallbackTab) { - setTabState(fallbackTab) - } - }, [tabState, activeTab]) - - // states - const [searchTerm, setSearchTerm] = useState("") - const [selectedRowKeys, setSelectedRowKeys] = useState([]) - const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) - const [isDeleting, setIsDeleting] = useState(false) - const [isSelectEvaluatorModalOpen, setIsSelectEvaluatorModalOpen] = useState(false) - const [isAnnotateDrawerOpen, setIsAnnotateDrawerOpen] = useState(false) - const [drawerMode, setDrawerMode] = useState<"create" | "edit">("create") - const [evaluatorToEdit, setEvaluatorToEdit] = useState(null) - - const {rows, isLoading, refetchAll} = useEvaluatorsRegistryData(activeTab) - - const rowsById = useMemo(() => { - return new Map(rows.map((row) => [row.id, row])) - }, [rows]) - - useEffect(() => { - setSelectedRowKeys((prev) => { - const validKeys = prev.filter((key) => rowsById.has(String(key))) - return validKeys.length === prev.length ? prev : validKeys - }) - }, [rowsById]) - - const filteredRows = useMemo(() => { - if (!searchTerm) return rows - - return rows.filter((row) => { - const haystack = [ - row.name, - row.slug, - row.typeBadge.label, - row.versionLabel, - row.modifiedBy, - ...row.tags, - ] - .filter(Boolean) - .join(" ") - .toLowerCase() - - return haystack.includes(searchTerm.trim().toLowerCase()) - }) - }, [rows, searchTerm]) - - const selectedRows = useMemo( - () => selectedRowKeys.map((key) => rowsById.get(String(key))).filter(Boolean), - [selectedRowKeys, rowsById], - ) as EvaluatorRegistryRow[] - - const selectedNames = useMemo(() => selectedRows.map((row) => row.name), [selectedRows]) - - const onTabChange = useCallback( - (value: EvaluatorCategory) => { - setActiveTab(value) - setSelectedRowKeys([]) - setTabState(value) - }, - [setActiveTab, setTabState], - ) - - const onSearch = useCallback((event: ChangeEvent) => { - setSearchTerm(event.target.value) - }, []) - - const handleOpenHumanDrawer = useCallback(() => { - setDrawerMode("create") - setEvaluatorToEdit(null) - setIsAnnotateDrawerOpen(true) - }, []) - - const handleOpenCreateModal = useCallback(() => { - if (activeTab === "human") { - handleOpenHumanDrawer() - return - } - setIsSelectEvaluatorModalOpen(true) - }, [activeTab, handleOpenHumanDrawer]) - - const handleCloseSelectModal = useCallback(() => { - setIsSelectEvaluatorModalOpen(false) - }, []) - - const closeAnnotateDrawer = useCallback(() => { - setIsAnnotateDrawerOpen(false) - setEvaluatorToEdit(null) - setDrawerMode("create") - }, []) - - const onSavedEvaluator = useCallback( - async (_slug?: string) => { - try { - await refetchAll() - } catch (error) { - console.error(error) - } finally { - closeAnnotateDrawer() - } - }, - [refetchAll, closeAnnotateDrawer], - ) - - const openDrawerForRecord = useCallback( - (record: EvaluatorRegistryRow) => { - if (activeTab !== "human") return - setDrawerMode("edit") - setEvaluatorToEdit(record.raw) - setIsAnnotateDrawerOpen(true) - }, - [activeTab], - ) - - const handleNavigateToConfigure = useCallback( - async (record: EvaluatorRegistryRow) => { - const raw = record.raw as EvaluatorRegistryRow["raw"] & {kind?: string} - const isConfig = raw && raw.kind === "config" - const targetId = isConfig ? record.id : (record.slug as string) - - await router.push(`${projectURL}/evaluators/configure/${encodeURIComponent(targetId)}`) - }, - [projectURL, router], - ) - - const createEvaluatorDrawerProps = useMemo( - () => ({ - mode: drawerMode, - evaluator: drawerMode === "edit" ? evaluatorToEdit || undefined : undefined, - onSuccess: onSavedEvaluator, - skipPostCreateStepChange: drawerMode === "create", - }), - [drawerMode, evaluatorToEdit, onSavedEvaluator], - ) - - const handleConfirmDelete = useCallback(async () => { - if (!selectedRows.length) return - const ids = selectedRows.map((row) => row.id).filter(Boolean) as string[] - if (!ids.length) return - - try { - setIsDeleting(true) - - if (activeTab === "human") { - await Promise.all(ids.map((id) => deleteHumanEvaluator(id))) - } else { - const canDelete = await checkIfResourceValidForDeletion({ - resourceType: "evaluator_config", - resourceIds: ids, - }) - if (!canDelete) return - - await Promise.all(ids.map((id) => deleteEvaluatorConfig(id))) - } - - message.success( - ids.length === 1 ? "Evaluator deleted" : `${ids.length} evaluators deleted`, - ) - - setSelectedRowKeys([]) - await refetchAll() - } catch (error) { - console.error(error) - message.error("Failed to delete evaluators") - } finally { - setIsDeleting(false) - setIsDeleteModalOpen(false) - } - }, [selectedRows, refetchAll, activeTab]) - - const handleRowDelete = useCallback( - (record: EvaluatorRegistryRow) => { - if (!record?.id) return - setSelectedRowKeys([record.id]) - setIsDeleteModalOpen(true) - }, - [setIsDeleteModalOpen, setSelectedRowKeys], - ) - - const tableColumns = useMemo( - () => - getColumns({ - category: activeTab, - onEdit: openDrawerForRecord, - onConfigure: handleNavigateToConfigure, - onDelete: handleRowDelete, - }), - [activeTab], - ) - - const activeTabLabel = useMemo(() => { - return EVALUATOR_TABS.find((tab) => tab.key === activeTab)?.label || "Evaluators" - }, [activeTab]) - - useEffect(() => { - setSelectedRowKeys([]) - }, [activeTab]) - - const breadcrumbKey = scope === "project" ? "projectPage" : "appPage" - - useBreadcrumbsEffect( - { - breadcrumbs: {[breadcrumbKey]: {label: activeTabLabel}}, - type: "append", - condition: true, - }, - [breadcrumbKey, activeTabLabel], - ) - - const isDeleteDisabled = selectedRowKeys.length === 0 - - return ( -
    - Evaluators - -
    - onTabChange(key as EvaluatorCategory)} - /> -
    -
    - - - -
    - -
    - record.id} - rowSelection={{ - type: "checkbox", - columnWidth: 48, - fixed: "left", - selectedRowKeys, - onChange: (keys) => setSelectedRowKeys(keys as Key[]), - }} - tableLayout="fixed" - virtualized - className="flex-1" - onRow={(record) => ({ - className: "cursor-pointer", - onClick: () => { - activeTab === "human" - ? openDrawerForRecord(record) - : handleNavigateToConfigure(record) - }, - })} - /> -
    - - { - setIsDeleteModalOpen(false) - setSelectedRowKeys([]) - }} - onConfirm={handleConfirmDelete} - confirmLoading={isDeleting} - selectedCount={selectedRowKeys.length} - selectedNames={selectedNames} - /> - - - - -
    - ) -} - -export default memo(EvaluatorsRegistry) diff --git a/web/oss/src/components/Filters/EditColumns.tsx b/web/oss/src/components/Filters/EditColumns.tsx new file mode 100644 index 0000000000..8e7fc1ddaa --- /dev/null +++ b/web/oss/src/components/Filters/EditColumns.tsx @@ -0,0 +1,111 @@ +import {useState} from "react" + +import {Columns} from "@phosphor-icons/react" +import type {MenuProps} from "antd" +import {Button, Checkbox, Dropdown, Space} from "antd" +import {ColumnsType} from "antd/es/table" +import {createUseStyles} from "react-jss" + +const useStyles = createUseStyles((theme) => ({ + dropdownMenu: { + "&>.ant-dropdown-menu-item": { + "& .anticon-check": { + display: "none", + }, + }, + "&>.ant-dropdown-menu-item-selected": { + "&:not(:hover)": { + backgroundColor: "transparent !important", + }, + "& .anticon-check": { + display: "inline-flex !important", + }, + }, + }, + button: { + display: "flex", + alignItems: "center", + }, +})) + +interface EditColumnsProps { + isOpen: boolean + handleOpenChange: (open: boolean) => void + selectedKeys: string[] + columns: ColumnsType + onChange: (key: string) => void + excludes?: string[] // Array of column keys to exclude + buttonText?: string +} + +const EditColumns: React.FC = ({ + isOpen, + handleOpenChange, + selectedKeys, + columns, + onChange, + excludes = [], + buttonText = "Edit Columns", +}) => { + const classes = useStyles() + const [open, setOpen] = useState(isOpen) + + const handleDropdownChange = (newOpen: boolean) => { + setOpen(newOpen) + if (!newOpen) handleOpenChange(newOpen) + } + + const generateEditItems = (): MenuProps["items"] => { + return columns + .filter((col) => !excludes.includes(col.key as string)) + .flatMap((col) => [ + { + key: col.key as React.Key, + label: ( + e.stopPropagation()}> + onChange(col.key as string)} + /> + {col.title as string} + + ), + }, + ...(("children" in col && + col.children?.map((child) => ({ + key: child.key as React.Key, + label: ( + e.stopPropagation()}> + onChange(child.key as string)} + /> + {(child.title || child.key) as string} + + ), + }))) || + []), + ]) + } + + return ( + + + + ) +} + +export default EditColumns diff --git a/web/oss/src/components/Filters/EditColumns/assets/helper.ts b/web/oss/src/components/Filters/EditColumns/assets/helper.ts deleted file mode 100644 index 511eabc8f6..0000000000 --- a/web/oss/src/components/Filters/EditColumns/assets/helper.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {ColumnsType} from "antd/es/table" - -export const filterColumns = (cols: ColumnsType, hidden: string[]): ColumnsType => { - return cols - .map((col) => { - const key = col.key != null ? String(col.key) : undefined - if (key && hidden.includes(key)) return null - - if ("children" in col && col.children) { - const children = filterColumns(col.children, hidden) - - if (!children.length) { - // Drop parent column when all descendants are hidden to avoid rendering entire records - // as fallback cell content in Ant Table. - return null - } - - return { - ...col, - children, - } - } - - return col - }) - .filter(Boolean) as ColumnsType -} - -export const formatColumnTitle = (text: string) => { - return text - .replace(/_/g, " ") - .replace(/([a-z])([A-Z])/g, "$1 $2") - .replace(/\b\w/g, (c) => c) -} diff --git a/web/oss/src/components/Filters/EditColumns/assets/types.ts b/web/oss/src/components/Filters/EditColumns/assets/types.ts deleted file mode 100644 index 2ccdd36664..0000000000 --- a/web/oss/src/components/Filters/EditColumns/assets/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {ButtonProps, PopoverProps} from "antd" -import {ColumnsType} from "antd/es/table" - -export interface EditColumnsProps { - columns: ColumnsType - uniqueKey: string - onChange?: (hidden: string[]) => void - excludes?: string[] - buttonText?: string - popoverProps?: PopoverProps - buttonProps?: ButtonProps -} diff --git a/web/oss/src/components/Filters/EditColumns/index.tsx b/web/oss/src/components/Filters/EditColumns/index.tsx deleted file mode 100644 index 857814582b..0000000000 --- a/web/oss/src/components/Filters/EditColumns/index.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import {useCallback, useEffect, useMemo, useState} from "react" - -import {Columns} from "@phosphor-icons/react" -import {Button, Checkbox, Popover, Space} from "antd" -import {ColumnGroupType, ColumnsType, ColumnType} from "antd/es/table" -import {useLocalStorage} from "usehooks-ts" - -import {formatColumnTitle} from "./assets/helper" -import {EditColumnsProps} from "./assets/types" - -const collectColumnByKey = (columns: ColumnsType, key: string): any | null => { - try { - for (const col of columns) { - if (String(col.key) === key) return col - if ("children" in col && col.children) { - const found = collectColumnByKey(col.children, key) - if (found) return found - } - } - return null - } catch (error) { - return null - } -} - -const collectKeys = (cols: ColumnsType): string[] => { - try { - const res: string[] = [] - cols?.forEach((c) => { - if (c.key) res.push(String(c.key)) - if ("children" in c && c.children && Array.isArray(c.children)) { - res.push(...collectKeys(c.children)) - } - }) - return res - } catch (error) { - return [] - } -} - -const getSafeName = (col: ColumnGroupType | ColumnType) => { - try { - if ((col as any).__editLabel && typeof (col as any).__editLabel === "string") { - return (col as any).__editLabel - } - if ("title" in col && typeof col.title === "string") return col.title - if ("dataIndex" in col && typeof col.dataIndex === "string") return col.dataIndex - if ("key" in col && typeof col.key === "string") return col.key - return "" - } catch (error) { - return "" - } -} - -const EditColumns = ({ - uniqueKey, - excludes = [], - columns, - onChange, - buttonText = "Edit columns", - popoverProps, - buttonProps, -}: EditColumnsProps) => { - const defaultHidden = useMemo(() => { - const keys: string[] = [] - const traverse = (cols: ColumnsType) => { - cols.forEach((col) => { - if (excludes.includes(String(col.key))) return - if ((col as any).defaultHidden) { - keys.push(String(col.key)) - } - if ("children" in col && col.children) { - traverse(col.children) - } - }) - } - traverse(columns) - return keys - }, [columns, excludes]) - - const [hiddenCols, setHiddenCols] = useLocalStorage( - `${uniqueKey}-tableColumnsHidden`, - defaultHidden, - ) - const [open, setOpen] = useState(false) - - // Apply defaultHidden ONLY if there is no saved value yet. - useEffect(() => { - if (!hiddenCols.length && defaultHidden.length > 0) { - setHiddenCols(defaultHidden) - } - }, [defaultHidden]) - - useEffect(() => { - try { - onChange?.(hiddenCols) - } catch (err) { - console.error(err) - } - }, [hiddenCols]) - - const toggleColumn = useCallback( - (key: string) => { - try { - const col = collectColumnByKey(columns, key) - let keys = [key] - if (col && "children" in col && Array.isArray(col.children)) { - // include the parent + all descendant keys - keys = [key, ...collectKeys(col.children)] - } - setHiddenCols((prev) => { - let next = [...prev] - keys.forEach((k) => { - if (next.includes(k)) next = next.filter((x) => x !== k) - else next.push(k) - }) - return next - }) - } catch (error) { - console.error(error) - } - }, - [columns, setHiddenCols], - ) - - const buildItems = useCallback( - (cols: ColumnsType, level = 0): {key: string; label: React.ReactNode}[] => { - try { - return cols - .filter(Boolean) - .filter((col) => !excludes.includes(String(col.key))) - .flatMap((col) => { - if (col.key === "key" || typeof col.key !== "string") return [] - const key = String(col.key) - const safeName = getSafeName(col) - const item = { - key, - label: ( - - - {formatColumnTitle(safeName)} - - ), - } - const children = - "children" in col && col.children - ? buildItems(col.children, level + 1) - : [] - return [item, ...children!] - }) - } catch (err) { - return [] - } - }, - [hiddenCols, excludes], - ) - - return ( - - {buildItems(columns).map((item) => ( -
    { - toggleColumn(String(item.key)) - }} - className="px-2 py-1.5 hover:bg-gray-100 cursor-pointer flex items-center rounded-lg select-none" - > - {item.label} -
    - ))} - - } - > - -
    - ) -} - -export default EditColumns diff --git a/web/oss/src/components/Filters/Filters.tsx b/web/oss/src/components/Filters/Filters.tsx index 2e3995f643..896be077bc 100644 --- a/web/oss/src/components/Filters/Filters.tsx +++ b/web/oss/src/components/Filters/Filters.tsx @@ -1,268 +1,44 @@ import {useMemo, useState} from "react" -import {ArrowClockwiseIcon, CaretDown, Funnel, Plus, Trash} from "@phosphor-icons/react" -import { - Button, - Divider, - Input, - Popover, - Select, - Space, - Typography, - Dropdown, - MenuProps, - TreeSelect, -} from "antd" -import type {TreeSelectProps} from "antd" +import {ArrowCounterClockwise, CaretDown, Funnel, Plus, Trash} from "@phosphor-icons/react" +import {Button, Divider, Input, Popover, Select, Space, Typography, ButtonProps} from "antd" import isEqual from "lodash/isEqual" +import {createUseStyles} from "react-jss" -import { - fieldConfigByOptionKey, - FieldConfig, -} from "@/oss/components/pages/observability/assets/filters/fieldAdapter" -import { - getOperator, - valueShapeFor, -} from "@/oss/components/pages/observability/assets/filters/operatorRegistry" -import {planInputs} from "@/oss/components/pages/observability/assets/filters/rulesEngine" -import { - normalizeFilter, - toUIValue, -} from "@/oss/components/pages/observability/assets/filters/valueCodec" import useLazyEffect from "@/oss/hooks/useLazyEffect" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import {EvaluatorPreviewDto} from "@/oss/lib/hooks/useEvaluators/types" -import {Filter, FilterConditions} from "@/oss/lib/Types" +import {Filter, JSSTheme} from "@/oss/lib/Types" -import { - NUM_OPS, - STRING_EQU_AND_CONTAINS_OPS, - STRING_EQU_OPS, -} from "../pages/observability/assets/utils" import CustomAntdBadge from "../ui/CustomAntdBadge" -import {useStyles} from "./assets/styles" -import { - buildCustomTreeNode, - collectOptionValues, - collectTreeKeys, - createEmptyFilter, - CUSTOM_FIELD_VALUE, - effectiveFieldForRow, - getGroupDefaultValue, - getOptionKey, - isBooleanLike, - isNumberLike, - mapToTreeData, - noopTreeExpand, - normalizeAttributeSearch, - operatorOptionsFromIds, - valueToPathLabel, -} from "./helpers/utils" -import { - FilterMenuNode, - FilterLeaf, - FilterGroup, - SelectOption, - Props, - FilterItem, - FieldMenuItem, - RowValidation, -} from "./types" - -type AnnotationFeedbackValueType = "string" | "number" | "boolean" - -interface AnnotationFeedbackCondition { - field?: string | string[] - operator?: FilterConditions - value?: string | number | boolean - valueType?: AnnotationFeedbackValueType -} - -interface AnnotationFilterValue { - evaluator?: string - feedback?: AnnotationFeedbackCondition -} - -interface AnnotationFeedbackOption { - label: string - value: string - evaluatorSlug: string - evaluatorLabel: string - type: AnnotationFeedbackValueType -} - -const ALL_FEEDBACK_OPERATOR_OPTIONS = [...STRING_EQU_AND_CONTAINS_OPS, ...NUM_OPS] - -const ALL_FEEDBACK_OPERATOR_VALUES = new Set(ALL_FEEDBACK_OPERATOR_OPTIONS.map((opt) => opt.value)) - -const NUMERIC_FEEDBACK_OPERATOR_VALUES = new Set(NUM_OPS.map((opt) => opt.value)) - -// Collapse multiple "any evaluator" annotation rows that differ only by feedback.key -// back into a single UI row with feedback.field: string[] -const collapseAnnotationAnyEvaluatorRowsFromProps = ( - items: FilterItem[], - getField: (uiKey?: string) => FieldConfig | undefined, -): FilterItem[] => { - type GroupKey = string - const groups = new Map() - const order: GroupKey[] = [] - - const makeKey = (it: FilterItem, ann: any) => { - // Build a key that ignores feedback.field but includes everything else - const uiKey = it.selectedField || it.field || "" - const base = { - uiKey, - isCustomField: it.isCustomField, - baseField: it.baseField, - key: it.key ?? "", - operator: it.operator ?? "", - // Feedback parts that must match to be considered the same group - fbOperator: ann?.feedback?.operator ?? "", - fbValueType: ann?.feedback?.valueType ?? "string", - fbValue: ann?.feedback?.value ?? "", - evaluator: ann?.evaluator ?? undefined, // must be undefined for “any evaluator” - } - return JSON.stringify(base) - } - - const resultPush = (key: GroupKey, item: FilterItem) => { - if (!groups.has(key)) { - groups.set(key, item) - order.push(key) - } - } - - for (const it of items) { - const uiKey = it.selectedField || it.field || "" - const baseFieldCfg = getField(uiKey) - const field = effectiveFieldForRow(baseFieldCfg, it) - - const ann = extractAnnotationValue(it.value) - const isAnnotation = field?.baseField?.includes("annotation") ?? false - const anyEvaluator = isAnnotation && ann && !ann.evaluator - const fbField = ann?.feedback?.field - - // Only collapse when it’s “any evaluator” and the feedback field is a single key - if (anyEvaluator && typeof fbField === "string" && fbField) { - const key = makeKey(it, ann) - const existing = groups.get(key) - if (!existing) { - // First in group → convert feedback.field into array - const clone: FilterItem = JSON.parse(JSON.stringify(it)) - const cAnn = extractAnnotationValue(clone.value)! - cAnn.feedback = {...(cAnn.feedback ?? {}), field: [fbField]} - clone.value = [cAnn] - resultPush(key, clone) - } else { - // Append to array (dedupe) - const eAnn = extractAnnotationValue(existing.value)! - const arr = Array.isArray(eAnn.feedback?.field) - ? (eAnn.feedback!.field as string[]) - : [] - if (!arr.includes(fbField)) arr.push(fbField) - eAnn.feedback = {...(eAnn.feedback ?? {}), field: arr} - existing.value = [eAnn] - } - } else { - // Pass-through rows that aren’t “any evaluator” singles - const passthroughKey = `__pt__${Math.random().toString(36).slice(2)}` - resultPush(passthroughKey, it) - } - } - - return order.map((k) => groups.get(k)!) -} - -const extractAnnotationValue = (raw: FilterItem["value"]): AnnotationFilterValue | undefined => { - if (!Array.isArray(raw) || raw.length === 0) return undefined - const candidate = raw[0] - if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) return undefined - const annotation = candidate as AnnotationFilterValue - const next: AnnotationFilterValue = {} - if ("evaluator" in annotation) next.evaluator = annotation.evaluator - if (annotation.feedback && typeof annotation.feedback === "object") - next.feedback = {...annotation.feedback} - return Object.keys(next).length > 0 ? next : undefined -} - -const EMPTY_DISABLED_OPTIONS = new Set() - -const buildFieldMenuItems = ( - nodes: FilterMenuNode[], - onSelect: (value: string, displayLabel?: string) => void, - parentKey = "root", - ancestors: FilterGroup[] = [], - submenuPopupClassName?: string, - disabledOptionKeys: Set = EMPTY_DISABLED_OPTIONS, -): MenuProps["items"] => { - const items: MenuProps["items"] = [] - nodes.forEach((node, index) => { - if (node.kind === "group") { - const group = node as FilterGroup - const groupKey = `group:${parentKey}:${index}` - const defaultValue = getGroupDefaultValue(group) - const isDefaultDisabled = defaultValue ? disabledOptionKeys.has(defaultValue) : false - items.push({ - key: groupKey, - label: ( -
    - {group.icon ? : null} - {group.label} -
    - ), - children: buildFieldMenuItems( - group.children, - onSelect, - groupKey, - [...ancestors, group], - submenuPopupClassName, - disabledOptionKeys, - ), - onTitleClick: defaultValue - ? ({domEvent}: {domEvent: MouseEvent}) => { - if (isDefaultDisabled) { - domEvent.preventDefault() - domEvent.stopPropagation() - return - } - domEvent.preventDefault() - domEvent.stopPropagation() - onSelect( - defaultValue, - group.titleClickDisplayLabel ?? group.leafDisplayLabel, - ) - } - : undefined, - // popupClassName: submenuPopupClassName, - classNames: { - popup: { - root: submenuPopupClassName, - }, - }, - } as FieldMenuItem) - } else { - const leaf = node as FilterLeaf - const optionKey = getOptionKey(leaf) - items.push({ - key: optionKey, - label: ( -
    - {leaf.icon ? : null} - {leaf.label} -
    - ), - disabled: disabledOptionKeys.has(optionKey), - } as FieldMenuItem) - } - }) - return items +const useStyles = createUseStyles((theme: JSSTheme) => ({ + popover: { + "& .ant-popover-inner": { + width: "650px !important", + padding: `0px ${theme.paddingXS}px ${theme.paddingXS}px ${theme.padding}px`, + }, + }, + filterHeading: { + fontSize: theme.fontSizeHeading5, + lineHeight: theme.lineHeightHeading5, + fontWeight: theme.fontWeightMedium, + }, + filterContainer: { + padding: 8, + display: "flex", + flexDirection: "column", + alignItems: "start", + borderRadius: theme.borderRadius, + backgroundColor: "#f5f7fa", + marginTop: 8, + }, +})) + +interface Props { + filterData?: Filter[] + columns: {value: string; label: string; type?: string}[] + onApplyFilter: (filters: Filter[]) => void + onClearFilter: (filters: Filter[]) => void + buttonProps?: ButtonProps } const Filters: React.FC = ({ @@ -273,510 +49,102 @@ const Filters: React.FC = ({ buttonProps, }) => { const classes = useStyles() + const emptyFilter = [{key: "", operator: "", value: "", isPermanent: false}] as Filter[] - const {data: evaluatorPreviews} = useEvaluators({preview: true}) - - const annotationEvaluatorOptions = useMemo( - () => - (evaluatorPreviews ?? []).map((evaluator) => ({ - label: evaluator.name || evaluator.slug, - value: evaluator.slug, - })), - [evaluatorPreviews], + const [filter, setFilter] = useState(() => + !filterData?.length ? emptyFilter : filterData, ) - - const deriveFeedbackValueType = (schema: any): AnnotationFeedbackValueType => { - const type = schema?.type - if (type === "number" || type === "integer") return "number" - if (type === "boolean") return "boolean" - if (type === "array") { - const itemType = schema?.items?.type - if (itemType === "number" || itemType === "integer") return "number" - if (itemType === "boolean") return "boolean" - } - return "string" - } - - const annotationFeedbackOptions = useMemo(() => { - if (!evaluatorPreviews) return [] as AnnotationFeedbackOption[] - const options: AnnotationFeedbackOption[] = [] - evaluatorPreviews.forEach((evaluator: EvaluatorPreviewDto) => { - const metrics = evaluator.metrics ?? {} - Object.entries(metrics).forEach(([key, schema]) => { - const typedSchema = schema as any - options.push({ - label: typedSchema?.title ?? key, - value: key, - evaluatorSlug: evaluator.slug, - evaluatorLabel: evaluator.name || evaluator.slug, - type: deriveFeedbackValueType(typedSchema), - }) - }) - }) - return options - }, [evaluatorPreviews]) - - // Dedupe feedback options by feedback key across evaluators - const dedupeFeedbackOptions = (options: AnnotationFeedbackOption[]) => { - const byKey = new Map() - for (const opt of options) { - if (!byKey.has(opt.value)) byKey.set(opt.value, opt) - } - return Array.from(byKey.values()) - } - - const fieldMap = useMemo(() => fieldConfigByOptionKey(columns), [columns]) - const getField = (uiKey?: string): FieldConfig | undefined => - uiKey ? fieldMap.get(uiKey) : undefined - - const mapFilterData = (data: Filter[]): FilterItem[] => - data.map((item) => { - const byOptionKey = getField(item.field) - const field = - byOptionKey ?? - (() => { - if (item.key) { - for (const fc of fieldMap.values()) if (fc.queryKey === item.key) return fc - } - const matches: FieldConfig[] = [] - for (const fc of fieldMap.values()) - if (fc.baseField === item.field || (item.key && fc.baseField === item.key)) - matches.push(fc) - if (matches.length > 1) { - const valuesArray = Array.isArray(item.value) - ? item.value - : item.value == null - ? [] - : [item.value] - for (const candidate of matches) { - if (!candidate.referenceProperty) continue - const hasMatch = valuesArray.some( - (entry) => - entry && - typeof entry === "object" && - candidate.referenceProperty! in entry, - ) - if (hasMatch) return candidate - } - } - return matches[0] - })() - - if (field) { - const pre = field.toUI ? field.toUI(item.value) : item.value - const shape = item.operator - ? valueShapeFor(item.operator as any, field.type) - : "single" - const valueUI = toUIValue(pre, shape) - return { - ...item, - field: field.optionKey, - key: item.key ?? "", - selectedField: field.optionKey, - fieldType: field.type, - isCustomField: false, - baseField: field.baseField, - selectedLabel: field.label, - value: valueUI, - customValueType: field.optionKey === "custom" ? "string" : undefined, - } - } - const customKey = item.key || item.field || "" - return { - ...item, - field: customKey, - key: customKey, - selectedField: customKey ? CUSTOM_FIELD_VALUE : undefined, - fieldType: undefined, - isCustomField: Boolean(customKey), - baseField: item.field, - selectedLabel: undefined, - } - }) - - const sanitizeFilterItems = (items: FilterItem[]): Filter[] => - items.map( - ({ - field, - key, - operator, - value, - isPermanent, - baseField, - selectedField, - customValueType, - }) => { - const fc = getField(selectedField || field || "") - if (!fc) { - const raw: Filter = {field, key, operator, value} - return isPermanent ? {...raw, isPermanent} : raw - } - - const isException = - fc.baseField === "events" && - (operator === "exists" || operator === "not_exists") - - let valueToSend = value - if (fc.optionKey === "custom") { - const vt = customValueType ?? "string" - const effType = vt === "number" ? "number" : "string" - const shape = operator - ? valueShapeFor(operator as any, effType as any) - : "single" - - const toBool = (raw: unknown) => { - const s = String(Array.isArray(raw) ? raw[0] : raw) - .trim() - .toLowerCase() - return s === "true" ? true : s === "false" ? false : undefined - } - const toNum = (raw: unknown) => { - const n = Number(Array.isArray(raw) ? raw[0] : (raw as any)) - return Number.isFinite(n) ? n : undefined - } - - if (vt === "number") { - if (shape === "list") { - const arr = Array.isArray(value) ? value : [value] - valueToSend = arr - .map((v) => Number(v)) - .filter((n) => Number.isFinite(n)) - } else if (shape === "range") { - const arr = Array.isArray(value) ? value : [] - const a = Number(arr[0]), - b = Number(arr[1]) - valueToSend = - Number.isFinite(a) && Number.isFinite(b) ? [a, b] : undefined - } else { - valueToSend = toNum(value) - } - } else if (vt === "boolean") { - if (shape === "list") { - const arr = Array.isArray(value) ? value : [value] - const mapped = arr.map((v) => { - const s = String(v).trim().toLowerCase() - return s === "true" ? true : s === "false" ? false : undefined - }) - valueToSend = mapped.filter((v) => v !== undefined) - if ((valueToSend as unknown[]).length === 0) valueToSend = undefined - } else { - valueToSend = toBool(value) - } - } else { - if (shape === "list") { - valueToSend = Array.isArray(value) ? value : [value].filter(Boolean) - } else if (shape === "range") { - valueToSend = Array.isArray(value) ? value : value - } else { - valueToSend = Array.isArray(value) ? (value[0] ?? "") : (value ?? "") - } - } - } - - if (isException) valueToSend = fc.defaultValue ?? valueToSend - - const keyForFilter = key && key !== "" ? key : fc.queryKey - const filterForNormalization: Filter = { - field: fc.baseField, - operator, - value: valueToSend, - } - if (keyForFilter) filterForNormalization.key = keyForFilter - const normalized = normalizeFilter(filterForNormalization, { - fieldType: - fc.optionKey === "custom" - ? customValueType === "number" - ? "number" - : "string" - : fc.type, - opId: operator, - toExternal: fc.toExternal, - }) - return isPermanent ? {...normalized, isPermanent} : normalized - }, - ) - - const [filter, setFilter] = useState(() => - !filterData?.length ? [createEmptyFilter()] : mapFilterData(filterData), + const sanitizedFilters = useMemo( + () => filter.filter(({key, operator}) => key && operator), + [filter], ) - const [activeFieldDropdown, setActiveFieldDropdown] = useState(null) const [isFilterOpen, setIsFilterOpen] = useState(false) - const [keySearchTerms, setKeySearchTerms] = useState>({}) - - const sanitizedFilters = useMemo(() => { - return sanitizeFilterItems( - filter.filter(({field, operator, isPermanent, isCustomField}) => { - if (isPermanent) return true - if (!operator) return false - if (isCustomField) return !!field - return !!field - }), - ) - }, [filter]) useLazyEffect(() => { if (filterData && filterData.length > 0) { - const mapped = mapFilterData(filterData) - // NEW: collapse expanded any-evaluator annotation rows back into one UI row - const collapsed = collapseAnnotationAnyEvaluatorRowsFromProps(mapped, getField) - setFilter(collapsed) + setFilter(filterData) } else { - setFilter([]) + setFilter(emptyFilter) } - }, [filterData, columns]) - - const handleFieldSelection = (uiValue: string, idx: number, selectedLabel?: string) => { - setFilter((prev) => { - const next = [...prev] - const current = {...next[idx]} - if (uiValue === CUSTOM_FIELD_VALUE) { - Object.assign(current, { - selectedField: undefined, - field: "", - key: "", - operator: "", - value: "", - fieldType: undefined, - isCustomField: true, - baseField: undefined, - selectedLabel: undefined, - customValueType: undefined, - }) - } else { - const field = getField(uiValue)! - current.selectedField = field.optionKey - current.field = field.optionKey - current.key = field.keyInput?.kind === "none" ? (field.queryKey ?? "") : "" - current.operator = field.operatorIds[0] ?? "" - const effType = field.optionKey === "custom" ? "string" : field.type - const shape = current.operator - ? valueShapeFor(current.operator as any, effType as any) - : "single" - let defaultValue = toUIValue(field.defaultValue, shape) - if ( - shape === "list" && - current.operator && - planInputs(field, current.operator as any).valueAs === "text" && - (defaultValue == null || - (Array.isArray(defaultValue) && defaultValue.length === 0)) - ) { - defaultValue = "" - } - current.value = defaultValue - current.fieldType = field.type - current.isCustomField = false - current.baseField = field.baseField - current.selectedLabel = selectedLabel ?? field.label - current.customValueType = field.optionKey === "custom" ? "string" : undefined - } - next[idx] = current - return next - }) - setKeySearchTerms((prev) => { - if (!(idx in prev)) return prev - const next = {...prev} - delete next[idx] - return next - }) - setActiveFieldDropdown(null) - } + }, [filterData]) + + const operators = [ + {type: "string", value: "contains", label: "contains"}, + {type: "string", value: "matches", label: "matches"}, + {type: "string", value: "like", label: "like"}, + {type: "string", value: "startswith", label: "startswith"}, + {type: "string", value: "endswith", label: "endswith"}, + {type: "exists", value: "exists", label: "exists"}, + {type: "exists", value: "not_exists", label: "not exists"}, + {type: "exists", value: "in", label: "in"}, + {type: "exists", value: "is", label: "is"}, + {type: "exists", value: "is_not", label: "is not"}, + {type: "number", value: "eq", label: "="}, + {type: "number", value: "neq", label: "!="}, + {type: "number", value: "gt", label: ">"}, + {type: "number", value: "lt", label: "<"}, + {type: "number", value: "gte", label: ">="}, + {type: "number", value: "lte", label: "<="}, + {type: "number", value: "btwn", label: "between"}, + ] + + const filteredColumns = useMemo( + () => columns.filter((col) => !filter.some((item) => item.key === col.value)), + [columns, filter], + ) const onFilterChange = ({ columnName, value, idx, }: { - columnName: keyof FilterItem + columnName: keyof Omit value: any idx: number }) => { - setFilter((prev) => { - const next = [...prev] - const current = {...next[idx]} - const field = getField(current.selectedField || current.field || "") - - if (columnName === "operator" && field) { - const effType = - field.optionKey === "custom" - ? current.customValueType === "number" - ? "number" - : "string" - : field.type - const shape = valueShapeFor(value as any, effType as any) - current.value = toUIValue(current.value, shape) - current.operator = value - next[idx] = current - return next - } - - next[idx] = {...current, [columnName]: value} - return next + setFilter((prevFilters) => { + const newFilters = [...prevFilters] + newFilters[idx] = {...newFilters[idx], [columnName]: value} + return newFilters }) - if (columnName === "key") { - setKeySearchTerms((prev) => { - if (!(idx in prev)) return prev - const next = {...prev} - delete next[idx] - return next - }) - } } - const rowValidations: RowValidation[] = filter.map((item) => { - if (item.isPermanent) return {isValid: true} - - const uiKey = item.selectedField || item.field || "" - const baseFieldCfg = getField(uiKey) - const field = effectiveFieldForRow(baseFieldCfg, item) - - if (!field) return {isValid: false} - - const operatorValue = - item.operator || (field.operatorIds.length === 1 ? field.operatorIds[0] : "") - if (!operatorValue) return {isValid: false} - - const needsKey = !!field.keyInput && field.keyInput.kind !== "none" - if (needsKey && (!item.key || item.key === "")) return {isValid: false} - - const hidesValue = - getOperator(operatorValue as any).hidesValue || field.valueInput?.kind === "none" - if (hidesValue) return {isValid: true} - - const effType = - field.optionKey === "custom" - ? item.customValueType === "number" - ? "number" - : "string" - : field.type - const wantsBooleanValidation = - field.optionKey === "custom" && item.customValueType === "boolean" - const wantsNumberValidation = effType === "number" - - const shape = valueShapeFor(operatorValue as any, effType as any) - const value = item.value - - if (shape === "range") { - let parsed: unknown[] | null = null - if (Array.isArray(value)) parsed = value - else if (typeof value === "string") { - const trimmed = value.trim() - if (!trimmed) return {isValid: false} - try { - const json = JSON.parse(value) - if (Array.isArray(json)) parsed = json - } catch { - parsed = null - } - } else if (value == null) { - return {isValid: false} - } - - if (!parsed || parsed.length !== 2) { - return {isValid: false, valueInvalid: true} - } - - if (wantsNumberValidation && parsed.some((entry) => !isNumberLike(entry))) { - return {isValid: false, valueInvalid: true} - } - - return {isValid: true} - } - - if (shape === "list") { - if (Array.isArray(value)) { - if (value.length === 0) return {isValid: false} - if (wantsBooleanValidation && value.some((entry) => !isBooleanLike(entry))) - return {isValid: false, valueInvalid: true} - if (wantsNumberValidation && value.some((entry) => !isNumberLike(entry))) - return {isValid: false, valueInvalid: true} - return {isValid: true} - } - - const trimmed = String(value ?? "").trim() - if (!trimmed) return {isValid: false} - return {isValid: true} - } - - const normalized = Array.isArray(value) ? value[0] : value - if (normalized == null) return {isValid: false} - const asString = typeof normalized === "string" ? normalized.trim() : String(normalized) - if (!asString) return {isValid: false} - - if (wantsBooleanValidation && !isBooleanLike(normalized)) - return {isValid: false, valueInvalid: true} - - if (wantsNumberValidation && !isNumberLike(normalized)) - return {isValid: false, valueInvalid: true} - - return {isValid: true} - }) - - const isApplyDisabled = rowValidations.some(({isValid}) => !isValid) - - const onDeleteFilter = (index: number) => - setFilter((prev) => prev.filter((_, idx) => idx !== index)) - const clearFilter = () => { - const kept = filter.filter((f) => f.isPermanent) - const sanitizedKept = sanitizeFilterItems(kept) - if (!isEqual(sanitizedKept, filterData)) onClearFilter(sanitizedKept) - setActiveFieldDropdown(null) - setFilter(kept.length ? kept : []) + const onDeleteFilter = (index: number) => { + setFilter(filter.filter((_, idx) => idx !== index)) } - const getFilterOptionKey = (item: FilterItem) => - item.selectedField || - (typeof item.field === "string" && item.field ? item.field : undefined) || - item.baseField || - "" - - const annotationDisabledOptions = useMemo(() => new Set(["has_annotation"]), []) + const addNestedFilter = () => { + setFilter([...filter, {key: "", operator: "", value: "", isPermanent: false}]) + } - const hasAnnotationIndices = useMemo( - () => - filter.reduce((acc, current, index) => { - if (getFilterOptionKey(current) === "has_annotation") acc.push(index) - return acc - }, []), - [filter], - ) + const clearFilter = () => { + const clearedFilters = filter.filter((f) => f.isPermanent) - // Explode "any evaluator + multi feedback" rows into multiple rows so the backend can treat each feedback separately - const explodeAnnotationAnyEvaluatorRows = (items: FilterItem[]): FilterItem[] => { - const out: FilterItem[] = [] - for (const it of items) { - const ann = extractAnnotationValue(it.value) - const fields = ann?.feedback?.field - if (!ann?.evaluator && Array.isArray(fields) && fields.length > 1) { - for (const key of fields) { - const clone: FilterItem = JSON.parse(JSON.stringify(it)) - const cAnn = extractAnnotationValue(clone.value)! - cAnn.feedback = {...(cAnn.feedback ?? {}), field: key} - clone.value = [cAnn] - out.push(clone) - } - } else { - out.push(it) - } + if (!isEqual(clearedFilters, filterData)) { + onClearFilter(clearedFilters) } - return out + setFilter(!clearedFilters.length ? emptyFilter : clearedFilters) } const applyFilter = () => { - const expanded = explodeAnnotationAnyEvaluatorRows(filter) - const out = sanitizeFilterItems(expanded) - if (!isEqual(out, filterData)) onApplyFilter(out) - setActiveFieldDropdown(null) + if (!isEqual(sanitizedFilters, filterData)) { + onApplyFilter(sanitizedFilters) + } setIsFilterOpen(false) } - const getWithinPopover = (trigger: HTMLElement | null) => - (trigger && (trigger.closest(".ant-popover") as HTMLElement)) || document.body - - const dropdownPanelStyle = { - maxWidth: "calc(100vw - 32px)", - maxHeight: "60vh", - overflow: "auto", - } as const + const mapColumnLabel = useMemo( + () => + columns.reduce( + (acc, col) => { + acc[col.value] = col.label + return acc + }, + {} as Record, + ), + [columns], + ) + const getColumnLabelFromValue = (key: string) => mapColumnLabel[key] || key return ( = ({ trigger="click" overlayClassName={classes.popover} arrow={false} - onOpenChange={(open) => { - setIsFilterOpen(open) - if (!open) setActiveFieldDropdown(null) - }} + onOpenChange={() => setIsFilterOpen(false)} open={isFilterOpen} placement="bottomLeft" - autoAdjustOverflow - styles={{body: {maxHeight: "70vh"}, root: {maxWidth: "100vw"}}} - destroyOnHidden content={
    -
    - Filter +
    + Filter
    +
    {filter.map((item, idx) => { - const uiKey = item.selectedField || item.field || "" - const baseFieldCfg = getField(uiKey) - const field = effectiveFieldForRow(baseFieldCfg, item) - - const isAnnotationFieldSelected = - field?.baseField?.includes("annotation") ?? false - - const operatorOptions = field - ? (field.operatorOptions ?? - operatorOptionsFromIds(field.operatorIds)) - : [] - - const singleOperator = operatorOptions.length === 1 - const operatorValue = - item.operator || - (singleOperator ? operatorOptions[0]?.value : undefined) - - const plan = - field && operatorValue - ? planInputs(field, operatorValue as any) - : undefined - const showKey = Boolean(plan?.needsKey) - const showValue = Boolean(plan?.showValue) - const valueAs = plan?.valueAs - const valueOptions = plan?.valueOptions - const keyPlaceholder = plan?.placeholders?.key ?? "Key" - const valuePlaceholder = plan?.placeholders?.value ?? "Value" - - const rawValue = Array.isArray(item.value) ? "" : (item.value as any) - const displayValue = (field as any)?.valueDisplayText || rawValue - const validation = rowValidations[idx] ?? {isValid: true} - const valueHasError = Boolean(validation.valueInvalid) - - const annotationValue = extractAnnotationValue(item.value) - - const disableHasAnnotationForRow = hasAnnotationIndices.some( - (annotationIdx) => annotationIdx !== idx, - ) - const disabledFieldOptionsForMenu = disableHasAnnotationForRow - ? annotationDisabledOptions - : undefined - - const setAnnotationValue = ( - updater: ( - prev: AnnotationFilterValue | undefined, - ) => AnnotationFilterValue | undefined, - ) => { - const next = updater( - annotationValue ? {...annotationValue} : undefined, - ) - if (!next || Object.keys(next).length === 0) { - onFilterChange({columnName: "value", value: [], idx}) - return - } - - const valueToStore: AnnotationFilterValue = {...next} - if (valueToStore.feedback) { - const cleanedFeedback = {...valueToStore.feedback} - if (cleanedFeedback.valueType === undefined) - cleanedFeedback.valueType = "string" - valueToStore.feedback = cleanedFeedback - } - - onFilterChange({columnName: "value", value: [valueToStore], idx}) - } - - const currentFeedback = annotationValue?.feedback - - // Build available feedback options - const availableFeedbackOptions = (() => { - if (annotationValue?.evaluator) { - const filtered = annotationFeedbackOptions.filter( - (option) => - option.evaluatorSlug === annotationValue.evaluator, - ) - // Keep currently selected key if it exists and is not part of filtered - const selectedKey = Array.isArray(currentFeedback?.field) - ? currentFeedback?.field[0] - : currentFeedback?.field - const selected = selectedKey - ? annotationFeedbackOptions.find( - (option) => option.value === selectedKey, - ) - : undefined - if ( - selected && - !filtered.some((o) => o.value === selected.value) - ) - return [selected, ...filtered] - return filtered - } - // No evaluator. Show deduped feedback names across all evaluators - return dedupeFeedbackOptions(annotationFeedbackOptions) - })() - - // Pick a type from the first selected key if present - const selectedFeedbackKey = Array.isArray(currentFeedback?.field) - ? currentFeedback?.field[0] - : currentFeedback?.field - const selectedFeedbackOption = selectedFeedbackKey - ? availableFeedbackOptions.find( - (option) => option.value === selectedFeedbackKey, - ) - : undefined - - const feedbackValueType = - currentFeedback?.valueType ?? - selectedFeedbackOption?.type ?? - "string" - - const isEvaluatorActive = annotationValue - ? "evaluator" in annotationValue - : false - const isFeedbackActive = annotationValue - ? "feedback" in annotationValue - : false - - const feedbackOperatorOptions = ALL_FEEDBACK_OPERATOR_OPTIONS - - const coerceNumericFeedbackValue = ( - input: unknown, - ): string | number | undefined => { - if (typeof input === "number") - return Number.isFinite(input) ? input : undefined - if (typeof input === "string") { - const trimmed = input.trim() - if (!trimmed) return "" - const numericPattern = /^-?(?:\d+|\d*\.\d+)$/ - return numericPattern.test(trimmed) ? Number(trimmed) : input - } - return undefined - } - - const parseFeedbackArrayInput = (input: string): any[] | undefined => { - const trimmed = input.trim() - if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) - return undefined - try { - const parsed = JSON.parse(trimmed) - return Array.isArray(parsed) ? parsed : undefined - } catch { - return undefined - } - } - - const ensureFeedbackOperator = ( - type: AnnotationFeedbackValueType, - current?: FilterConditions, - ): FilterConditions => { - if (current && ALL_FEEDBACK_OPERATOR_VALUES.has(current)) - return current - if (type === "number") { - return NUM_OPS[0]?.value ?? "" - } - return STRING_EQU_OPS[0]?.value ?? "" - } - - const handleEvaluatorChange = (value?: string) => { - setAnnotationValue((prev) => { - const base: AnnotationFilterValue = {...(prev ?? {})} - - if (!value) { - // Removing evaluator. Keep feedback as is. Now it means across any evaluator - delete base.evaluator - return Object.keys(base).length ? base : undefined - } - - base.evaluator = value - - if (base.feedback?.field) { - const allowed = new Set( - annotationFeedbackOptions - .filter((o) => o.evaluatorSlug === value) - .map((o) => o.value), - ) - if (Array.isArray(base.feedback.field)) { - const kept = base.feedback.field.filter((k) => - allowed.has(k), - ) - base.feedback.field = kept[0] ?? undefined - } else if ( - base.feedback.field && - !allowed.has(base.feedback.field) - ) { - base.feedback.field = undefined - } - } - - return base - }) - } - - const handleFeedbackFieldChange = (value: string | string[]) => { - setAnnotationValue((prev) => { - const base: AnnotationFilterValue = {...(prev ?? {})} - const feedback = {...(base.feedback ?? {})} - - const nextField: string | string[] = annotationValue?.evaluator - ? Array.isArray(value) - ? value[0] - : value - : value - - const sampleKey = Array.isArray(nextField) - ? nextField[0] - : nextField - const option = availableFeedbackOptions.find( - (opt) => opt.value === sampleKey, - ) - const nextType = option - ? option.type - : (feedback.valueType ?? "string") - - feedback.field = nextField - feedback.valueType = nextType - feedback.operator = ensureFeedbackOperator( - nextType, - feedback.operator, - ) - feedback.value = nextType === "boolean" ? true : "" - - base.feedback = feedback - return base - }) - } - - const handleFeedbackOperatorChange = (operator: FilterConditions) => { - setAnnotationValue((prev) => { - const base: AnnotationFilterValue = {...(prev ?? {})} - const feedback = {...(base.feedback ?? {}), operator} - - if (NUMERIC_FEEDBACK_OPERATOR_VALUES.has(operator)) { - feedback.valueType = "number" - const currentValue = feedback.value - const coerced = coerceNumericFeedbackValue(currentValue) - feedback.value = coerced === undefined ? "" : coerced - } - - base.feedback = feedback - return base - }) - } - - const handleFeedbackTypeChange = ( - type: AnnotationFeedbackValueType, - ) => { - setAnnotationValue((prev) => { - const base: AnnotationFilterValue = {...(prev ?? {})} - const feedback = {...(base.feedback ?? {})} - feedback.valueType = type - feedback.operator = ensureFeedbackOperator( - type, - feedback.operator, - ) - feedback.value = type === "boolean" ? true : "" - base.feedback = feedback - return base - }) - } - - const handleFeedbackValueChange = (raw: string | number | boolean) => { - setAnnotationValue((prev) => { - const base: AnnotationFilterValue = {...(prev ?? {})} - const fb = {...(base.feedback ?? {})} - - const type = fb.valueType ?? "string" - let value: any = raw as any - - if (typeof raw === "string") { - const parsedArray = parseFeedbackArrayInput(raw) - if (parsedArray !== undefined) { - value = parsedArray - } - } - - if (!Array.isArray(value)) { - if (type === "number") { - if (typeof raw === "number") { - value = Number.isFinite(raw) ? raw : fb.value - } else { - const coerced = coerceNumericFeedbackValue(raw) - value = coerced === undefined ? "" : coerced - } - } else if (type === "boolean") { - if (typeof raw === "boolean") { - value = raw - } else { - const s = String(raw).trim().toLowerCase() - value = - s === "true" - ? true - : s === "false" - ? false - : undefined - } - } else if (typeof raw === "string") { - value = raw - } else { - value = String(raw) - } - } - - base.feedback = {...fb, value} - return base - }) - } - - const removeEvaluator = () => { - setAnnotationValue((prev) => { - if (!prev?.feedback) { - onDeleteFilter(idx) - return undefined - } - const next = {...(prev ?? {})} - delete next.evaluator - return Object.keys(next).length ? next : undefined - }) - } - - const removeFeedback = () => { - setAnnotationValue((prev) => { - if (!prev?.feedback) return prev - - if (!prev.evaluator) { - onDeleteFilter(idx) - return undefined - } - const next = {...(prev ?? {})} - delete next.feedback - return Object.keys(next).length ? next : undefined - }) - } - - const feedbackValueRaw = (() => { - const raw = currentFeedback?.value - if (Array.isArray(raw)) { - try { - return JSON.stringify(raw) - } catch { - return "" - } - } - if (raw && typeof raw === "object") { - try { - return JSON.stringify(raw) - } catch { - return "" - } - } - if (raw === undefined || raw === null) return "" - if (typeof raw === "string") return raw - if (typeof raw === "number") return String(raw) - if (typeof raw === "boolean") return raw ? "true" : "false" - return "" - })() - - const renderAddFeedbackButton = () => ( - - ) - - const feedbackFieldValueForSelect: string | string[] | undefined = - (() => { - const f = currentFeedback?.field - if (Array.isArray(f)) return f - return f ?? undefined - })() - - const feedbackOptionsForSelect = availableFeedbackOptions.map( - (option) => ({ - label: annotationValue?.evaluator ? option.label : option.label, - value: option.value, - }), + const selectedColumn = columns.find((col) => col.value === item.key) + const filteredOperators = operators.filter( + (operator) => operator.type === selectedColumn?.type, ) return ( - - + +

    {idx === 0 ? "Where" : "And"} - +

    - -
    - - setActiveFieldDropdown(open ? idx : null) + + !label.value ? "Condition" : label.label } - menu={{ - items: buildFieldMenuItems( - columns, - (value, labelFromGroup) => - handleFieldSelection( - value, - idx, - labelFromGroup, - ), - "root", - [], - classes.fieldDropdownSubmenu, - disabledFieldOptionsForMenu ?? - EMPTY_DISABLED_OPTIONS, - ), - onClick: ({key}) => - handleFieldSelection(String(key), idx), - }} - getPopupContainer={(t) => getWithinPopover(t)} - > - - - - {showKey && - (field!.keyInput!.kind === "select" ? ( - (() => { - const options = field!.keyInput! - .options as SelectOption[] - const optionValues = - collectOptionValues(options) - const currentSearch = - keySearchTerms[idx] ?? "" - const normalizedSearch = - normalizeAttributeSearch(currentSearch) - const additionalNodes: NonNullable< - TreeSelectProps["treeData"] - > = [] - const keyValue = - item.key === undefined || - item.key === null - ? undefined - : String(item.key) - if ( - normalizedSearch && - !optionValues.has( - normalizedSearch.value, - ) - ) { - additionalNodes.push( - buildCustomTreeNode( - normalizedSearch.value, - normalizedSearch.pathLabel, - ), - ) - } - if ( - keyValue && - !optionValues.has(keyValue) && - !additionalNodes.some( - (node) => node.value === keyValue, - ) - ) { - additionalNodes.push( - buildCustomTreeNode( - keyValue, - valueToPathLabel(keyValue), - ), - ) - } - const baseTreeData = mapToTreeData(options) - const treeData = - additionalNodes.length > 0 - ? [ - ...additionalNodes, - ...baseTreeData, - ] - : baseTreeData - const expandedKeys = - collectTreeKeys(treeData) - return ( - - getWithinPopover(t) - } - value={ - item.key && item.key !== "" - ? (item.key as - | string - | number) - : undefined - } - onChange={(v) => - onFilterChange({ - columnName: "key", - value: v == null ? "" : v, - idx, - }) - } - onSearch={(searchValue) => - setKeySearchTerms((prev) => { - const trimmed = - searchValue.trim() - if (!trimmed) { - if (!(idx in prev)) - return prev - const next = {...prev} - delete next[idx] - return next - } - return { - ...prev, - [idx]: trimmed, - } - }) - } - onDropdownVisibleChange={(open) => { - if (!open) { - setKeySearchTerms( - (prev) => { - if (!(idx in prev)) - return prev - const next = { - ...prev, - } - delete next[idx] - return next - }, - ) - } - }} - placeholder={keyPlaceholder} - showSearch - treeNodeFilterProp="title" - treeDefaultExpandAll - treeExpandedKeys={expandedKeys} - onTreeExpand={noopTreeExpand} - treeLine={{showLeafIcon: false}} - disabled={item.isPermanent} - filterTreeNode={(input, node) => { - const title = - typeof node?.title === - "string" - ? node.title - : String( - node?.title ?? "", - ) - const value = String( - node?.value ?? "", - ) - const pathLabel = - typeof (node as any) - ?.pathLabel === "string" - ? ((node as any) - .pathLabel as string) - : "" - const search = input - .trim() - .toLowerCase() - return ( - title - .toLowerCase() - .includes(search) || - value - .toLowerCase() - .includes(search) || - pathLabel - .toLowerCase() - .includes(search) - ) - }} - /> - ) - })() - ) : ( - - onFilterChange({ - columnName: "key", - value: e.target.value, - idx, - }) - } - disabled={item.isPermanent} - /> - ))} - - {isAnnotationFieldSelected && ( - - That - - )} - - {!singleOperator && ( - - handleEvaluatorChange(value) - } - allowClear - suffixIcon={} - optionFilterProp="label" - getPopupContainer={(t) => - getWithinPopover(t) - } - styles={{ - popup: { - root: { - ...(dropdownPanelStyle || - {}), - }, - }, - }} - /> - -
    - ) : ( - - - {!isFeedbackActive && - renderAddFeedbackButton()} - - ) - ) : !showValue ? ( - - ) : valueAs === "tags" ? ( - - onFilterChange({ - columnName: "value", - value: v, - idx, - }) - } - placeholder={valuePlaceholder} - suffixIcon={} - popupMatchSelectWidth - disabled={item.isPermanent} - status={valueHasError ? "error" : undefined} - getPopupContainer={(t) => getWithinPopover(t)} - styles={{ - popup: { - root: { - ...(dropdownPanelStyle || {}), - }, - }, - }} - /> - ) : valueAs === "range" ? ( - - onFilterChange({ - columnName: "value", - value: e.target.value, - idx, - }) - } - disabled={item.isPermanent} - className="flex-1 min-w-[160px] w-full" - status={valueHasError ? "error" : undefined} - /> - ) : ( - - onFilterChange({ - columnName: "value", - value: e.target.value, - idx, - }) - } - disabled={item.isPermanent} - className="flex-1 min-w-[160px] w-full" - status={valueHasError ? "error" : undefined} - /> - )} - - {field?.optionKey === "custom" && ( - { - handleFeedbackFieldChange( - val as string | string[], - ) - }} - suffixIcon={} - optionFilterProp="label" - getPopupContainer={(t) => - getWithinPopover(t) - } - styles={{ - popup: { - root: { - ...(dropdownPanelStyle || {}), - }, - }, - }} - /> - } - getPopupContainer={(t) => - getWithinPopover(t) - } - styles={{ - popup: { - root: { - ...(dropdownPanelStyle || - {}), - }, - }, - }} - /> - ) : ( - - handleFeedbackValueChange( - e.target.value, - ) - } - /> - )} - + onFilterChange({ + columnName: "value", + value: e.target.value, + idx, + }) + } + /> + + )} + {filter.length > 1 && ( +
    -
    - -
    - - + + - - - - +
    } @@ -1858,13 +284,7 @@ const Filters: React.FC = ({ {...buttonProps} > Filters - {sanitizedFilters.filter(({field, operator}) => field && operator).length > 0 && ( - field && operator).length - } - /> - )} + {sanitizedFilters.length > 0 && }
    ) diff --git a/web/oss/src/components/Filters/Sort.tsx b/web/oss/src/components/Filters/Sort.tsx index b11a0eba5b..df76d6c66f 100644 --- a/web/oss/src/components/Filters/Sort.tsx +++ b/web/oss/src/components/Filters/Sort.tsx @@ -211,7 +211,7 @@ const Sort: React.FC = ({onSortApply, defaultSortValue}) => { <> -
    +
    Start and end time diff --git a/web/oss/src/components/Filters/assets/styles.ts b/web/oss/src/components/Filters/assets/styles.ts deleted file mode 100644 index 16d7baf2ef..0000000000 --- a/web/oss/src/components/Filters/assets/styles.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {JSSTheme} from "@/oss/lib/Types" -import {createUseStyles} from "react-jss" - -export const useStyles = createUseStyles((theme: JSSTheme) => ({ - popover: { - "&.ant-popover": { - maxWidth: "100vw", - }, - "& .ant-popover-inner": { - width: "clamp(320px, 60vw, 700px)", - maxWidth: "calc(100vw - 24px)", - maxHeight: "min(70vh, 640px)", - padding: 0, - }, - }, - fieldDropdownSubmenu: { - "& .ant-dropdown-menu": { - width: "100%", - maxWidth: "min(560px, calc(100vw - 32px))", - maxHeight: "60vh", - overflow: "auto", - }, - }, - filterHeading: { - display: "flex", - alignItems: "center", - justifyContent: "space-between", - padding: `${theme.paddingXS}px ${theme.paddingXS}px ${theme.paddingXS}px ${theme.padding}px`, - gap: theme.marginSM, - "& .ant-typography": { - fontSize: theme.fontSizeHeading5, - lineHeight: theme.lineHeightHeading5, - fontWeight: theme.fontWeightMedium, - }, - }, - filterContainer: { - display: "flex", - gap: theme.marginXS, - flexDirection: "column", - padding: theme.paddingXS, - }, -})) diff --git a/web/oss/src/components/Filters/helpers/utils.ts b/web/oss/src/components/Filters/helpers/utils.ts deleted file mode 100644 index 55b2f110d9..0000000000 --- a/web/oss/src/components/Filters/helpers/utils.ts +++ /dev/null @@ -1,205 +0,0 @@ -import {TreeSelectProps} from "antd" -import { - CustomValueType, - FilterGroup, - FilterLeaf, - FilterMenuNode, - RowValidation, - SelectOption, -} from "../types" -import { - getOperator, - valueShapeFor, -} from "@/oss/components/pages/observability/assets/filters/operatorRegistry" -import {FilterItem} from "../types" -import {Filter, FilterConditions} from "@/oss/lib/Types" -import {FieldConfig} from "../../pages/observability/assets/filters/fieldAdapter" -import {normalizeFilter, toUIValue} from "../../pages/observability/assets/filters/valueCodec" - -export const CUSTOM_FIELD_VALUE = "__custom__" - -export const createEmptyFilter = (): FilterItem => ({ - field: "", - key: "", - operator: "", - value: "", - isPermanent: false, - selectedField: undefined, - fieldType: undefined, - isCustomField: false, - baseField: undefined, - selectedLabel: undefined, -}) - -export const toStringValue = (value: SelectOption["value"]) => - typeof value === "string" || typeof value === "number" ? String(value) : undefined - -export const collectOptionValues = ( - options: SelectOption[] | undefined, - acc: Set = new Set(), -): Set => { - if (!options) return acc - options.forEach((option) => { - const rawValue = option.value ?? option.label - const stringified = toStringValue(rawValue) - if (stringified && (option.value !== undefined || option.selectable)) { - acc.add(stringified) - } - if (Array.isArray(option.children) && option.children.length) { - collectOptionValues(option.children as SelectOption[], acc) - } - }) - return acc -} - -export const valueToPathLabel = (value: string | number): string => { - const stringValue = String(value) - return stringValue.startsWith("attributes.") - ? stringValue.slice("attributes.".length) - : stringValue -} - -export const mapToTreeData = ( - options: SelectOption[] | undefined, - searchTerm?: string, -): NonNullable => - (options ?? []).map((option) => { - const children = - option.children && option.children.length > 0 - ? mapToTreeData(option.children as SelectOption[], searchTerm) - : undefined - const rawValue = option.value ?? option.label - const explicitPathLabel = (option as any).pathLabel - const pathLabel = - typeof explicitPathLabel === "string" - ? explicitPathLabel - : typeof rawValue === "string" || typeof rawValue === "number" - ? valueToPathLabel(rawValue) - : option.label - const normalizedValue = - typeof rawValue === "string" || typeof rawValue === "number" ? rawValue : option.label - return { - title: option.label, - value: normalizedValue, - key: String(normalizedValue), - selectable: option.selectable ?? option.value !== undefined, - children, - pathLabel, - } - }) - -export const buildCustomTreeNode = (value: string, pathLabel: string) => ({ - title: pathLabel, - value, - key: `custom:${value}`, - selectable: true, - pathLabel, -}) - -export const collectTreeKeys = ( - nodes: NonNullable, - acc: string[] = [], -): string[] => { - nodes.forEach((node) => { - if (node.key !== undefined) { - acc.push(String(node.key)) - } - if (Array.isArray(node.children) && node.children.length) { - collectTreeKeys(node.children as NonNullable, acc) - } - }) - return acc -} - -export const noopTreeExpand: TreeSelectProps["onTreeExpand"] = () => {} - -export const normalizeAttributeSearch = (value: string | undefined) => { - const trimmed = value?.trim() - if (!trimmed) return undefined - if (trimmed.startsWith("attributes.")) { - return {value: trimmed, pathLabel: valueToPathLabel(trimmed)} - } - if (trimmed.startsWith("ag.")) { - return {value: `attributes.${trimmed}`, pathLabel: trimmed} - } - return {value: trimmed, pathLabel: trimmed} -} - -export const isNumberLike = (value: unknown): boolean => { - if (typeof value === "number") return Number.isFinite(value) - if (typeof value === "string") { - const trimmed = value.trim() - if (!trimmed) return false - return !Number.isNaN(Number(trimmed)) - } - return false -} - -export const isBooleanLike = (value: unknown): boolean => { - if (typeof value === "boolean") return true - if (typeof value === "string") { - const normalized = value.trim().toLowerCase() - return normalized === "true" || normalized === "false" - } - return false -} - -export const getOptionKey = (leaf: FilterLeaf) => leaf.optionKey ?? leaf.value - -export const findFirstLeafValue = (nodes: FilterMenuNode[]): string | undefined => { - for (const child of nodes) { - if (child.kind === "leaf") return getOptionKey(child as FilterLeaf) - const nested = findFirstLeafValue((child as FilterGroup).children) - if (nested) return nested - } - return undefined -} -export const hasLeafWithValue = (nodes: FilterMenuNode[], v: string): boolean => - nodes.some((n) => - n.kind === "leaf" - ? getOptionKey(n as FilterLeaf) === v - : hasLeafWithValue((n as FilterGroup).children, v), - ) -export const getGroupDefaultValue = (group: FilterGroup): string | undefined => - group.defaultValue && hasLeafWithValue(group.children, group.defaultValue) - ? group.defaultValue - : findFirstLeafValue(group.children) - -export const customOperatorIdsForType = (t: CustomValueType): FilterConditions[] => - t === "number" - ? ["eq", "neq", "gt", "lt", "gte", "lte"] - : t === "boolean" - ? ["is", "is_not"] - : ["is", "is_not", "contains", "startswith", "endswith", "in", "not_in"] - -export const operatorOptionsFromIds = (ids: FilterConditions[]) => - ids.map((id) => { - const op = getOperator(id as any)! - if (!op) return {value: id, label: id} - return {value: op.id, label: op.label} - }) - -export const effectiveFieldForRow = ( - field: FieldConfig | undefined, - row: FilterItem, -): FieldConfig | undefined => { - if (!field) return undefined - if (field.optionKey !== "custom") return field - const t = row.customValueType ?? "string" - return { - ...field, - type: t === "number" ? "number" : "string", - operatorIds: customOperatorIdsForType(t), - operatorOptions: operatorOptionsFromIds(customOperatorIdsForType(t)), - valueInput: - t === "boolean" - ? { - kind: "select", - options: [ - {label: "true", value: "true"}, - {label: "false", value: "false"}, - ], - } - : field.valueInput, - } -} diff --git a/web/oss/src/components/Filters/types.d.ts b/web/oss/src/components/Filters/types.d.ts deleted file mode 100644 index eca0173cf6..0000000000 --- a/web/oss/src/components/Filters/types.d.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type {ComponentType} from "react" - -import type {IconProps} from "@phosphor-icons/react" - -export interface Props { - filterData?: Filter[] - columns: FilterMenuNode[] - onApplyFilter: (filters: Filter[]) => void - onClearFilter: (filters: Filter[]) => void - buttonProps?: ButtonProps -} - -export type CustomValueType = "string" | "number" | "boolean" - -export type FilterItem = Filter & { - selectedField?: string - fieldType?: "string" | "number" | "exists" - isCustomField?: boolean - baseField?: string - selectedLabel?: string - customValueType?: CustomValueType -} - -export type RowValidation = { - isValid: boolean - valueInvalid?: boolean -} - -export type FieldMenuItem = Required["items"][number] - -export interface ColumnOption { - value: string - label: string - type?: string - icon?: ComponentType - children?: ColumnOption[] -} - -export interface ColumnGroup { - field: string - label: string - options: ColumnOption[] -} - -export type IconType = ComponentType<{size?: number}> - -type InputKind = "text" | "select" | "none" - -export type SelectOption = { - label: string - value: string | number - selectable?: boolean - children?: SelectOption[] - pathLabel?: string -} - -type InputConfig = - | {kind: "text"; placeholder?: string} - | { - kind: "select" - options?: SelectOption[] - placeholder?: string - usesAttributeKeyTree?: boolean - treePath?: string - } - | {kind: "none"; display?: string} - -export type FilterLeaf = { - kind: "leaf" - field: string - value: string - label: string - type: "string" | "number" | "exists" - icon?: IconType - operatorOptions?: Array<{value: any; label: string}> - defaultValue?: Filter["value"] - keyInput?: InputConfig - valueInput?: InputConfig - disableValueInput?: boolean - valueDisplayText?: string - displayLabel?: string - optionKey?: string - queryKey?: string - referenceCategory?: string - referenceProperty?: string -} - -export interface FilterGroup { - kind: "group" - label: string - children: Array - icon?: IconType - defaultValue?: string - titleClickDisplayLabel?: string - leafDisplayLabel?: string -} -export type FilterMenuNode = FilterLeaf | FilterGroup diff --git a/web/oss/src/components/GenericDrawer/index.tsx b/web/oss/src/components/GenericDrawer/index.tsx index 4bb5f0705a..fabd8b8606 100644 --- a/web/oss/src/components/GenericDrawer/index.tsx +++ b/web/oss/src/components/GenericDrawer/index.tsx @@ -7,12 +7,7 @@ import EnhancedDrawer from "../EnhancedUIs/Drawer" import {GenericDrawerProps} from "./types" -const GenericDrawer = ({ - sideContentDefaultSize = 320, - mainContentDefaultSize = 640, - extraContentDefaultSize = 320, - ...props -}: GenericDrawerProps) => { +const GenericDrawer = ({...props}: GenericDrawerProps) => { const initialWidth = props.initialWidth || 1200 const [drawerWidth, setDrawerWidth] = useState(initialWidth) @@ -56,15 +51,13 @@ const GenericDrawer = ({ > {props.sideContent && ( - + {props.sideContent} )} - - {props.mainContent} - + {props.mainContent} {props.extraContent && ( - + {props.extraContent} )} diff --git a/web/oss/src/components/GenericDrawer/types.d.ts b/web/oss/src/components/GenericDrawer/types.d.ts index 0714149ace..39450f4359 100644 --- a/web/oss/src/components/GenericDrawer/types.d.ts +++ b/web/oss/src/components/GenericDrawer/types.d.ts @@ -10,7 +10,4 @@ export interface GenericDrawerProps extends DrawerProps { sideContent?: ReactNode initialWidth?: number externalKey?: string - sideContentDefaultSize?: number - mainContentDefaultSize?: number - extraContentDefaultSize?: number } diff --git a/web/oss/src/components/HumanEvaluations/SingleModelEvaluation.tsx b/web/oss/src/components/HumanEvaluations/SingleModelEvaluation.tsx deleted file mode 100644 index b43f394e99..0000000000 --- a/web/oss/src/components/HumanEvaluations/SingleModelEvaluation.tsx +++ /dev/null @@ -1,232 +0,0 @@ -import {memo, useMemo, useCallback, useState, type Key} from "react" - -import {ColumnsType} from "antd/es/table" -import clsx from "clsx" -import {useRouter} from "next/router" - -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import {EvaluationType} from "@/oss/lib/enums" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" -import useEvaluations from "@/oss/lib/hooks/useEvaluations" -import useRunMetricsMap from "@/oss/lib/hooks/useRunMetricsMap" -import {useAppsData} from "@/oss/state/app" - -import { - buildAppScopedUrl, - buildEvaluationNavigationUrl, - extractEvaluationAppId, -} from "../pages/evaluations/utils" - -import SingleModelEvaluationHeader from "./assets/SingleModelEvaluationHeader" -import {useStyles} from "./assets/styles" -import {getColumns} from "./assets/utils" -import {EvaluationRow} from "./types" - -interface SingleModelEvaluationProps { - viewType: "evaluation" | "overview" - scope?: "app" | "project" -} - -const SingleModelEvaluation = ({viewType, scope = "app"}: SingleModelEvaluationProps) => { - const classes = useStyles() - const router = useRouter() - const {appURL, projectURL, baseAppURL} = useURL() - const routeAppId = useAppId() - const activeAppId = scope === "app" ? routeAppId || undefined : undefined - const {apps: availableApps = []} = useAppsData() - - const [selectedEvalRecord, setSelectedEvalRecord] = useState() - const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) - const [selectedRowKeys, setSelectedRowKeys] = useState([]) - - const {mergedEvaluations, isLoadingPreview, isLoadingLegacy} = useEvaluations({ - withPreview: true, - types: [EvaluationType.single_model_test], - evalType: "human", - appId: activeAppId, - }) - - const runIds = useMemo( - () => mergedEvaluations.map((e) => ("id" in e ? e.id : e.key)), - [mergedEvaluations], - ) - const evaluatorSlugs = useMemo(() => { - const evaSlugs = new Set() - mergedEvaluations.forEach((e) => { - e?.data.steps?.forEach((step) => { - if (step.type === "annotation") { - evaSlugs.add(step.key) - } - }) - }) - return evaSlugs - }, [mergedEvaluations]) - - const {data: runMetricsMap} = useRunMetricsMap(runIds, evaluatorSlugs) - - const knownAppIds = useMemo(() => { - return new Set( - (availableApps as {app_id?: string}[]) - .map((app) => app?.app_id) - .filter(Boolean) as string[], - ) - }, [availableApps]) - - const resolveAppId = useCallback( - (record: EvaluationRow): string | undefined => { - const candidate = extractEvaluationAppId(record) || activeAppId - if (!candidate) return undefined - if (scope === "project" && !knownAppIds.has(candidate)) return undefined - return candidate - }, - [activeAppId, knownAppIds, scope], - ) - - const isRecordNavigable = useCallback( - (record: EvaluationRow): boolean => { - const evaluationId = "id" in record ? record.id : record.key - const recordAppId = resolveAppId(record) - return Boolean(evaluationId && recordAppId) - }, - [resolveAppId], - ) - - const rowSelection = useMemo(() => { - return { - onChange: (selectedRowKeys: Key[]) => { - setSelectedRowKeys(selectedRowKeys) - }, - getCheckboxProps: (record: EvaluationRow) => ({ - disabled: !isRecordNavigable(record), - }), - } - }, [isRecordNavigable]) - - const handleNavigation = useCallback( - ({revisionId, appId: recordAppId}: {revisionId: string; appId?: string}) => { - const targetAppId = recordAppId || activeAppId - if (!targetAppId) return - - router.push({ - pathname: buildAppScopedUrl(baseAppURL, targetAppId, "/playground"), - query: { - revisions: buildRevisionsQueryParam([revisionId]), - }, - }) - }, - [router, baseAppURL, activeAppId], - ) - - const columns: ColumnsType = useMemo(() => { - return getColumns({ - evaluations: mergedEvaluations, - onVariantNavigation: handleNavigation, - evalType: "human", - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - runMetricsMap, - scope, - baseAppURL, - extractAppId: extractEvaluationAppId, - projectURL, - resolveAppId, - }) - }, [ - mergedEvaluations, - handleNavigation, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - runMetricsMap, - scope, - baseAppURL, - projectURL, - resolveAppId, - ]) - - const dataSource = useMemo(() => { - return viewType === "overview" ? mergedEvaluations.slice(0, 5) : mergedEvaluations - }, [viewType, mergedEvaluations]) - - return ( -
    - - -
    - { - return record.id || record.key - }} - className={clsx("ph-no-capture", "grow min-h-0", "eval-runs-table")} - showHorizontalScrollBar={true} - columns={columns} - dataSource={dataSource} - virtualized - loading={isLoadingPreview || isLoadingLegacy} - uniqueKey="human-annotation" - onRow={(record) => { - const evaluationId = "id" in record ? record.id : record.key - const recordAppId = resolveAppId(record) - const isNavigable = isRecordNavigable(record) - - return { - className: isNavigable ? undefined : "cursor-not-allowed opacity-60", - style: {cursor: isNavigable ? "pointer" : "not-allowed"}, - onClick: () => { - if (!isNavigable || !recordAppId || !evaluationId) return - - const pathname = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: recordAppId, - path: `/evaluations/single_model_test/${evaluationId}`, - }) - - if (scope === "project") { - router.push({ - pathname, - query: recordAppId ? {app_id: recordAppId} : undefined, - }) - } else { - router.push(pathname) - } - }, - } - }} - /> -
    -
    - ) -} - -export default memo(SingleModelEvaluation) diff --git a/web/oss/src/components/HumanEvaluations/assets/EvaluationStatusCell.tsx b/web/oss/src/components/HumanEvaluations/assets/EvaluationStatusCell.tsx deleted file mode 100644 index 876836ef43..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/EvaluationStatusCell.tsx +++ /dev/null @@ -1,189 +0,0 @@ -import {memo, useEffect, useMemo, useRef} from "react" - -import {InfoCircleOutlined} from "@ant-design/icons" -import {GlobalToken, Tag, Tooltip, theme} from "antd" -import {useAtom, useAtomValue} from "jotai" -import {mutate} from "swr" - -import {EvaluationType} from "@/oss/lib/enums" -import useEvaluationRunScenarios, { - getEvaluationRunScenariosKey, -} from "@/oss/lib/hooks/useEvaluationRunScenarios" -import useEvaluations from "@/oss/lib/hooks/useEvaluations" -import {resourceStatusQueryFamily} from "@/oss/lib/hooks/usePreviewRunningEvaluations" -import {tempEvaluationAtom} from "@/oss/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom" -import {EvaluationStatus} from "@/oss/lib/Types" - -import {statusMapper} from "../../pages/evaluations/cellRenderers/cellRenderers" - -import {extractEvaluationStatus} from "./utils" - -const EvaluationStatusCell = ({ - runId, - status, - evalType, - preferProvidedStatus = false, - statusOverride, -}: { - runId: string - status?: EvaluationStatus - evalType?: "auto" | "human" | "custom" - preferProvidedStatus?: boolean - statusOverride?: ( - status: EvaluationStatus, - token: GlobalToken, - baseStatus?: { - label: string - color: string - tooltip?: string - }, - ) => { - label: string - color: string - tooltip?: string - } -}) => { - const swrData = useEvaluationRunScenarios(runId, undefined, { - syncAtom: false, - revalidateOnMount: true, - }) - const {token} = theme.useToken() - const {refetch} = useEvaluations({ - withPreview: true, - types: - evalType === "auto" || evalType === "custom" - ? [EvaluationType.automatic, EvaluationType.auto_exact_match] - : [EvaluationType.human, EvaluationType.single_model_test], - evalType, - }) - const runningEvaluations = useAtomValue( - resourceStatusQueryFamily(evalType === "auto" || evalType === "custom" ? runId : ""), - ) - const [tempEvaluation, setTempEvaluation] = useAtom(tempEvaluationAtom) - const handledCompletionRef = useRef>(new Set()) - const lastMutatedStatusRef = useRef<{runId?: string; status?: EvaluationStatus | null} | null>( - null, - ) - - // Force refetch once when component mounts (useful when returning from details page) - useEffect(() => { - if (!runId) return - - const key = getEvaluationRunScenariosKey(runId) - if (!key) return - - const status = runningEvaluations.data?.run?.status ?? null - const hasChanged = - !lastMutatedStatusRef.current || - lastMutatedStatusRef.current.runId !== runId || - lastMutatedStatusRef.current.status !== status - - if (!hasChanged) return - - lastMutatedStatusRef.current = {runId, status} - - mutate(`${key}-false`) - }, [runId, runningEvaluations.data?.run?.status]) - - // refresh the eval after a completed run - useEffect(() => { - if (evalType !== "auto" && evalType !== "custom") return - - const runIdToCheck = runningEvaluations.data?.run?.id - const runStatus = runningEvaluations.data?.run?.status - - if (!runIdToCheck || !runStatus) return - - const isTrackedTempEvaluation = tempEvaluation.some( - (evaluation) => evaluation.id === runIdToCheck, - ) - - if (!isTrackedTempEvaluation) { - handledCompletionRef.current.delete(runIdToCheck) - return - } - - const isTerminalStatus = ![ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(runStatus) - - if (!isTerminalStatus) { - handledCompletionRef.current.delete(runIdToCheck) - return - } - - const hasHandledCompletion = handledCompletionRef.current.has(runIdToCheck) - - if (hasHandledCompletion) return - - handledCompletionRef.current.add(runIdToCheck) - - setTempEvaluation((prev) => prev.filter((evaluation) => evaluation.id !== runIdToCheck)) - refetch() - }, [ - evalType, - refetch, - runningEvaluations.data?.run?.id, - runningEvaluations.data?.run?.status, - setTempEvaluation, - tempEvaluation, - ]) - - const {runStatus, scenarios} = useMemo(() => { - return extractEvaluationStatus(swrData.data?.scenarios || [], status, evalType) - }, [status, token, swrData.data?.scenarios, evalType]) - - const completedStatuses = [EvaluationStatus.SUCCESS] - const {completedCount, totalCount} = useMemo(() => { - return { - completedCount: scenarios.filter((s) => - completedStatuses.includes(s.status as EvaluationStatus), - ).length, - totalCount: scenarios.length, - } - }, [scenarios]) - - const _status = useMemo(() => { - if (preferProvidedStatus || (evalType !== "auto" && evalType !== "custom")) return runStatus - return runningEvaluations.data?.run?.status || runStatus - }, [preferProvidedStatus, evalType, runningEvaluations.data?.run?.status, runStatus]) - - const statusInfo = useMemo(() => { - const baseStatus = statusMapper(token)(_status as EvaluationStatus | "stopped" | "closed") - if (!statusOverride) return baseStatus - - const overrideStatus = statusOverride(_status as EvaluationStatus, token, baseStatus) - if (!overrideStatus) return baseStatus - - return { - ...baseStatus, - ...overrideStatus, - label: overrideStatus.label ?? baseStatus.label, - color: overrideStatus.color ?? baseStatus.color, - tooltip: !["Running", "Success"].includes(baseStatus.label) ? baseStatus.label : null, - } - }, [_status, statusOverride, token]) - - return ( -
    - - {statusInfo.label} - - -
    - {`${completedCount}`} - {` / `} - {`${totalCount}`} -
    -
    -
    - ) -} - -export default memo(EvaluationStatusCell) diff --git a/web/oss/src/components/HumanEvaluations/assets/LegacyEvalResultCell.tsx b/web/oss/src/components/HumanEvaluations/assets/LegacyEvalResultCell.tsx deleted file mode 100644 index 3dda59ca5b..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/LegacyEvalResultCell.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import {memo} from "react" - -import {Tag, Typography, Space} from "antd" - -import {getTypedValue} from "@/oss/lib/helpers/evaluate" - -import EvaluationErrorPopover from "../../pages/evaluations/EvaluationErrorProps/EvaluationErrorPopover" - -export const LegacyEvalResultCell = memo(({matchingResults}: {matchingResults: any}) => { - return ( - - {matchingResults?.map((result, index) => - result?.result?.error ? ( - - ) : ( - {getTypedValue(result?.result)} - ), - )} - - ) -}) - -export const LegacyEvalResultCellTitle = memo(({evaluator}: {evaluator: any}) => { - return ( -
    - {evaluator?.name} - - {evaluator?.evaluator?.name} - -
    - ) -}) diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveFrequencyChart.tsx b/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveFrequencyChart.tsx deleted file mode 100644 index bdc77ae83a..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveFrequencyChart.tsx +++ /dev/null @@ -1,463 +0,0 @@ -import {type FC, memo, useCallback, useState} from "react" - -import clsx from "clsx" - -import {ChartAxis} from "./ChartAxis" -import ChartFrame from "./ChartFrame" -import {getYTicks} from "./chartUtils" - -interface FrequencyDatum { - label: string | number - count: number -} - -interface ResponsiveFrequencyChartProps { - data: FrequencyDatum[] - highlightValues?: (string | number)[] - labelWidth?: number - direction?: "horizontal" | "vertical" - /** Optional: color for bars (also used for highlight when provided) */ - barColor?: string - /** Optional: disable gradient and use solid bars */ - disableGradient?: boolean - dynamicMargin?: Partial<{top: number; right: number; bottom: number; left: number}> -} - -// Resolve fills based on props (keep defaults when not provided) -const DEFAULTS = { - greenSolid: "#95DE64", - blueSolid: "#69B1FF", - graySolid: "#97A4B0", -} - -const CUSTOM_GRADIENT_ID = "barGradientCustom" - -/** - * ResponsiveFrequencyChart renders a vertical bar chart for categorical/frequency data. - * Bars to highlight are inferred automatically from highlightValues (if provided). - */ -const ResponsiveFrequencyChart: FC = memo( - ({ - data, - highlightValues = [], - labelWidth, - direction = "horizontal", - barColor, - disableGradient = false, - dynamicMargin: dynamicPropsMargin, - }) => { - const isVertical = direction === "vertical" - const xMax = Math.max(...data.map((d) => d.count), 1) - const yCount = data.length - const xTicks = getYTicks(xMax) - const yLabels = data.map((d) => d.label) - - // Tooltip state - const [hoveredBar, setHoveredBar] = useState(null) - const [mousePos, setMousePos] = useState<{x: number; y: number} | null>(null) - - // Dynamically calculate margins based on orientation - const defaultMargin = {top: 16, right: 16, bottom: 32, left: 40} - let dynamicMargin = defaultMargin - if (isVertical) { - const longestBottomLabel = yLabels.reduce( - (max: number, label) => Math.max(max, String(label).length), - 0, - ) - const bottomMargin = Math.max(32, Math.min(120, longestBottomLabel * 7 + 16)) - const longestCountLabel = xTicks.reduce( - (max: number, tick) => Math.max(max, String(tick).length), - 0, - ) - const leftMargin = Math.max(40, Math.min(120, longestCountLabel * 7 + 16)) - dynamicMargin = { - ...defaultMargin, - left: leftMargin, - bottom: bottomMargin, - ...dynamicPropsMargin, - } - } else { - const longestLabelLength = yLabels.reduce( - (max: number, label) => Math.max(max, String(label).length), - 0, - ) - const dynamicLeftMargin = Math.max(40, Math.min(120, longestLabelLength * 7 + 16)) - dynamicMargin = {...defaultMargin, left: dynamicLeftMargin, ...dynamicPropsMargin} - } - - // Calculate maxCount and maxCountOccurrences once - const countMap = data.map((d) => d.count) - const maxCount = Math.max(...countMap) - const maxCountOccurrences = countMap.filter((count) => count === maxCount).length - // Store maxCount for later use in rendering - const uniqueMaxCount = maxCountOccurrences === 1 ? maxCount : null - - // Compute highlighted bar indices from highlightValues - const computedHighlightBarIndices = - highlightValues.length > 0 - ? data - .map((d, i) => - highlightValues.some((hv) => String(hv) === String(d.label)) ? i : -1, - ) - .filter((i) => i !== -1) - : [] - - return ( - - {({svgWidth, svgHeight, plotWidth, plotHeight, margin}) => { - // Scales for both orientations - const yLabelScaleHorizontal = (idx: number) => - (idx + 0.5) * (plotHeight / yCount) - const barHeightHorizontal = plotHeight / yCount - 6 - const xScaleHorizontal = (count: number) => (count / xMax) * plotWidth - - const xLabelScaleVertical = (idx: number) => (idx + 0.5) * (plotWidth / yCount) - const barWidthVertical = plotWidth / yCount - 6 - const yScaleVertical = (value: number) => ((xMax - value) / xMax) * plotHeight - - const getFill = useCallback( - (isHighlighted: boolean, d: FrequencyDatum): string => { - // If user supplies barColor, it overrides category colors: - if (barColor) { - // highlighted also uses barColor (solid), mirroring prior component behavior - if (isHighlighted) return barColor - return disableGradient ? barColor : `url(#${CUSTOM_GRADIENT_ID})` - } - // Default behavior (no barColor override) - if (isHighlighted) return DEFAULTS.greenSolid - if (disableGradient) { - // Solid fallbacks - if (d.label === "true") return DEFAULTS.greenSolid - if (uniqueMaxCount !== null && d.count === uniqueMaxCount) - return DEFAULTS.blueSolid - return DEFAULTS.graySolid - } - // Gradient fallbacks - if (d.label === "true") return "url(#barGradientGreen)" - if (uniqueMaxCount !== null && d.count === uniqueMaxCount) - return "url(#barGradientBlue)" - return "url(#barGradientGray)" - }, - [barColor], - ) - - return ( - <> - - {/* Bar gradient defs */} - - {/* If a custom barColor is provided and gradient is enabled, use a single custom gradient */} - {!disableGradient && barColor && ( - - - - - )} - - {/* Otherwise keep the existing three gradients (when gradient is enabled) */} - {!disableGradient && !barColor && ( - <> - {/* Gradient for "true" state */} - - - - - - {/* Gradient for default/false state */} - - - - - - {/* Gradient for most-count (unique max) */} - - - - - - )} - - - {/* Grid and highlight lines */} - {isVertical ? ( - - {xTicks.map((tick) => ( - - ))} - {highlightValues.map((val, i) => { - const idx = data.findIndex( - (d) => - typeof d.label === "number" && d.label === val, - ) - if (idx === -1) return null - return ( - - ) - })} - - ) : ( - - {xTicks.map((tick) => ( - - ))} - {highlightValues.map((val, i) => { - const idx = data.findIndex( - (d) => - typeof d.label === "number" && d.label === val, - ) - if (idx === -1) return null - return ( - - ) - })} - - )} - - {/* Bars */} - - {data.map((d, idx) => { - const isHighlighted = - computedHighlightBarIndices.includes(idx) - const isMaxUnique = - uniqueMaxCount !== null && d.count === uniqueMaxCount - - if (isVertical) { - const barX = - margin.left + - xLabelScaleVertical(idx) - - barWidthVertical / 2 - const barHeight = plotHeight - yScaleVertical(d.count) - return ( - { - setHoveredBar(idx) - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: e.clientX - (svgRect?.left ?? 0), - y: e.clientY - (svgRect?.top ?? 0), - }) - }} - onMouseMove={(e) => { - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: e.clientX - (svgRect?.left ?? 0), - y: e.clientY - (svgRect?.top ?? 0), - }) - }} - onMouseLeave={() => { - setHoveredBar(null) - setMousePos(null) - }} - /> - ) - } - - return ( - { - setHoveredBar(idx) - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: e.clientX - (svgRect?.left ?? 0), - y: e.clientY - (svgRect?.top ?? 0), - }) - }} - onMouseMove={(e) => { - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: e.clientX - (svgRect?.left ?? 0), - y: e.clientY - (svgRect?.top ?? 0), - }) - }} - onMouseLeave={() => { - setHoveredBar(null) - setMousePos(null) - }} - /> - ) - })} - - - {/* Axes */} - {isVertical ? ( - xLabelScaleVertical(idx)} - yScale={yScaleVertical} - /> - ) : ( - xScaleHorizontal(xTicks[idx])} - yScale={() => 0} - /> - )} - - - {/* Tooltip rendered outside SVG, absolutely positioned */} - {hoveredBar !== null && data[hoveredBar] && mousePos && ( -
    - {/* Caret */} -
    -
    - Label: - {String(data[hoveredBar].label)} -
    -
    - Count: - {data[hoveredBar].count} -
    -
    - )} - - ) - }} - - ) - }, -) - -export default ResponsiveFrequencyChart diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart.tsx b/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart.tsx deleted file mode 100644 index 55594d96d4..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart.tsx +++ /dev/null @@ -1,634 +0,0 @@ -import {FC, memo, useState} from "react" - -import type {ChartDatum} from "../types" - -import {ChartAxis} from "./ChartAxis" -import ChartFrame from "./ChartFrame" -import {format3Sig} from "./utils" - -interface ResponsiveMetricChartProps { - chartData: ChartDatum[] - extraDimensions: Record - highlightValue?: number - labelWidth?: number - direction?: "horizontal" | "vertical" - dynamicMargin?: Partial<{top: number; right: number; bottom: number; left: number}> - /** Optional: color for bars (also used for highlight). Default keeps current blue. */ - barColor?: string - /** Optional: when true, disables gradient and uses a solid color for bars. */ - disableGradient?: boolean -} - -const DEFAULT_PRIMARY = "#69B1FF" - -/** - * ResponsiveMetricChart is a functional component that renders a responsive histogram - * visualization using SVG. This chart displays data as bars with optional highlighted - * bins, reference lines, and tooltips for detailed information. The chart adapts to - * its container's size and provides scale functions for accurately positioning elements. - */ -/** - * ResponsiveMetricChart is a functional component that renders a responsive histogram - * visualization using SVG. This chart displays data as bars with optional highlighted - * bins, reference lines, and tooltips for detailed information. The chart adapts to - * its container's size and provides scale functions for accurately positioning elements. - * - * The highlighted bin is automatically inferred from highlightValue (if provided). - */ -const ResponsiveMetricChart: FC = memo( - ({ - chartData, - extraDimensions, - highlightValue, - labelWidth, - direction = "horizontal", - dynamicMargin: dynamicPropsMargin, - barColor, - disableGradient = false, - }) => { - const binSize = extraDimensions.binSize || 1 - const yMin = Math.min(...(chartData.map((d) => d.edge) as number[])) - const yMax = Math.max(...(chartData.map((d) => d.edge) as number[])) + binSize - const xMax = Math.max(...chartData.map((d) => d.value)) - - // Y axis: bin midpoints - const yTicks: number[] = chartData.map((d) => (d.edge ?? 0) + binSize / 2) - // X axis: value ticks - const xTicks: number[] = [] - const xTickCount = Math.min(4, xMax) - for (let i = 0; i <= xTickCount; i++) { - xTicks.push((i / xTickCount) * xMax) - } - - const clipPathId = `clip-histogram-${Math.random().toString(36).substr(2, 9)}` - // Tooltip state - const [hoveredBin, setHoveredBin] = useState(null) - const [mousePos, setMousePos] = useState<{x: number; y: number} | null>(null) - - // Compute highlighted bin index from highlightValue - let computedHighlightBinIndex: number | null = null - if (typeof highlightValue === "number" && chartData.length > 0) { - const roundTo = (n: number, digits: number) => { - const factor = Math.pow(10, digits) - return Math.round(n * factor) / factor - } - const DECIMALS = 6 - computedHighlightBinIndex = chartData.findIndex((d, i) => { - const binStart = d.edge ?? 0 - const binEnd = (d.edge ?? 0) + binSize - if (i === chartData.length - 1) { - // Last bin: inclusive of upper edge, round both values for robust comparison - const closeEnough = Math.abs(highlightValue - binEnd) < Math.pow(10, -DECIMALS) - return ( - roundTo(highlightValue, DECIMALS) >= roundTo(binStart, DECIMALS) && - (roundTo(highlightValue, DECIMALS) <= roundTo(binEnd, DECIMALS) || - closeEnough) - ) - } - // Other bins: upper edge exclusive, round for robust comparison - return ( - roundTo(highlightValue, DECIMALS) >= roundTo(binStart, DECIMALS) && - roundTo(highlightValue, DECIMALS) < roundTo(binEnd, DECIMALS) - ) - }) - if (computedHighlightBinIndex === -1) computedHighlightBinIndex = null - } - - // Dynamically calculate left margin for long y-labels - const yLabelsFormatted = yTicks.map(format3Sig) - const defaultMargin = {top: 16, right: 16, bottom: 32, left: 40} - let dynamicMargin = defaultMargin - if (direction === "horizontal") { - const longestLabelLength = yLabelsFormatted.reduce( - (max, label) => Math.max(max, String(label).length), - 0, - ) - const dynamicLeftMargin = Math.max(40, Math.min(120, longestLabelLength * 7 + 16)) - dynamicMargin = {...defaultMargin, left: dynamicLeftMargin} - } else { - const yAxisLabels = xTicks.map(format3Sig) - const longestLeft = yAxisLabels.reduce( - (max, label) => Math.max(max, String(label).length), - 0, - ) - const dynamicLeftMargin = Math.max(40, Math.min(120, longestLeft * 7 + 16)) - const xAxisLabels = yTicks.map(format3Sig) - const longestBottom = xAxisLabels.reduce( - (max, label) => Math.max(max, String(label).length), - 0, - ) - const dynamicBottomMargin = Math.max(32, Math.min(120, longestBottom * 7 + 16)) - dynamicMargin = { - ...defaultMargin, - left: dynamicLeftMargin, - bottom: dynamicBottomMargin, - ...dynamicPropsMargin, - } - } - - // NEW: resolve fills (keep defaults) - const baseSolid = barColor || DEFAULT_PRIMARY - const baseFill = disableGradient ? baseSolid : "url(#barGradientBlue)" - const highlightFill = barColor || DEFAULT_PRIMARY - - return ( -
    - - {({svgWidth, svgHeight, plotWidth, plotHeight, margin}) => { - // Scales for both orientations - const xScaleHorizontal = (value: number) => (value / xMax) * plotWidth - const yScaleHorizontal = (value: number) => - ((yMax - value) / (yMax - yMin)) * plotHeight - - const xScaleVertical = (value: number) => - ((value - yMin) / (yMax - yMin)) * plotWidth - const yScaleVertical = (value: number) => - ((xMax - value) / xMax) * plotHeight - - const isVertical = direction === "vertical" - const xScale = isVertical ? xScaleVertical : xScaleHorizontal - const yScale = isVertical ? yScaleVertical : yScaleHorizontal - - return ( - <> - - {/* Bar gradient (use barColor if provided) */} - - {!disableGradient && ( - - - - - )} - - - {/* Bin size overlay */} - {typeof extraDimensions.binSize === "number" && ( - - bin {format3Sig(extraDimensions.binSize)} - - )} - - {/* Grid lines */} - - {(isVertical ? xTicks : yTicks).map((tick) => ( - - ))} - - - {/* Histogram bars */} - - {chartData.map((d, idx) => { - const isHighlighted = idx === computedHighlightBinIndex - if (isVertical) { - const barLeft = - margin.left + xScaleVertical(d.edge as number) - const barRight = - margin.left + xScaleVertical(d.edge + binSize) - const barWidth = Math.abs(barRight - barLeft) - const barHeight = - plotHeight - yScaleVertical(d.value) - return ( - - - { - setHoveredBin(idx) - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: - e.clientX - - (svgRect?.left ?? 0), - y: - e.clientY - - (svgRect?.top ?? 0), - }) - }} - onMouseMove={(e) => { - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: - e.clientX - - (svgRect?.left ?? 0), - y: - e.clientY - - (svgRect?.top ?? 0), - }) - }} - onMouseLeave={() => { - setHoveredBin(null) - setMousePos(null) - }} - /> - - ) - } - - const barTop = - margin.top + yScaleHorizontal(d.edge + binSize) - const barBottom = - margin.top + yScaleHorizontal(d.edge as number) - const barHeight = Math.abs(barBottom - barTop) - const rawBarWidth = xScaleHorizontal(d.value) - const barWidth = Math.min(rawBarWidth, plotWidth) - return ( - - - { - setHoveredBin(idx) - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: e.clientX - (svgRect?.left ?? 0), - y: e.clientY - (svgRect?.top ?? 0), - }) - }} - onMouseMove={(e) => { - const svgRect = ( - e.target as SVGRectElement - ).ownerSVGElement?.getBoundingClientRect() - setMousePos({ - x: e.clientX - (svgRect?.left ?? 0), - y: e.clientY - (svgRect?.top ?? 0), - }) - }} - onMouseLeave={() => { - setHoveredBin(null) - setMousePos(null) - }} - /> - - ) - })} - - - {/* Reference lines */} - {typeof extraDimensions.mean === "number" && - (isVertical ? ( - - - - {`μ=${format3Sig(extraDimensions.mean)}`} - - - ) : ( - - - - {`μ=${format3Sig(extraDimensions.mean)}`} - - - ))} - - {typeof highlightValue === "number" && - highlightValue !== extraDimensions.mean && - (isVertical ? ( - - - - {format3Sig(highlightValue)} - - - {format3Sig(highlightValue)} - - - ) : ( - - - - {format3Sig(highlightValue)} - - - {format3Sig(highlightValue)} - - - ))} - - {/* Y-axis */} - - - - - {/* X/Y Axes */} - {/* - y-axis: categorical labels (formatted bin midpoints) - const yLabels = yTicks.map(format3Sig) - const yLabelScale = (idx: number) => ((yTicks.length - idx - 0.5) * (plotHeight / yTicks.length)) - */} - - isVertical - ? xScaleVertical(yTicks[idx]) - : xScaleHorizontal(xTicks[idx]) - } - yScale={isVertical ? yScaleVertical : yScaleHorizontal} - yLabels={isVertical ? undefined : yTicks.map(format3Sig)} - yLabelScale={ - isVertical - ? undefined - : (idx: number) => - (yTicks.length - idx - 0.5) * - (plotHeight / yTicks.length) - } - /> - - - {/* Tooltip outside SVG */} - {hoveredBin !== null && - chartData[hoveredBin] && - mousePos && - (() => { - const total = chartData.reduce((sum, d) => sum + d.value, 0) - const count = chartData[hoveredBin].value - const percent = total > 0 ? (count / total) * 100 : 0 - const isHighlighted = - hoveredBin === computedHighlightBinIndex - return ( -
    - {/* Caret */} -
    -
    - Range: - - {format3Sig( - chartData[hoveredBin].edge as number, - )} - – - {format3Sig( - chartData[hoveredBin].edge + binSize, - )} - - {isHighlighted && ( - - Highlighted - - )} -
    -
    - Count:{" "} - {count} - - ({percent.toFixed(1)}%) - -
    -
    - ) - })()} - - ) - }} - -
    - ) - }, -) - -export default ResponsiveMetricChart diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils.ts b/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils.ts deleted file mode 100644 index 2cd4ffbc56..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils.ts +++ /dev/null @@ -1,195 +0,0 @@ -import {ChartDatum, MetricFormatter} from "../types" - -/** - * Transforms the input data into an array of ChartDatum objects for chart rendering. - * - If `extra.distribution` is an array of numbers, returns them as ChartDatum with indices as names. - * - If `extra.distribution` is an array of objects, filters and maps them to ChartDatum based on `count` or `value`. - * - If `extra.percentiles` is an object, converts its entries to ChartDatum. - * - If `extra.iqrs` is an object, converts its entries to ChartDatum. - * - * @param {Record} extra - The input data containing distribution, percentiles, or iqrs. - * @returns {ChartDatum[]} An array of ChartDatum objects for use in charts. - */ -export const buildChartData = (extra: Record): ChartDatum[] => { - // distribution could be array of objects or numbers - // 1️⃣ Numeric histogram or object counts ------------------------------------ - if (Array.isArray(extra.distribution)) { - let data: ChartDatum[] = [] - if (extra.distribution.every((d) => typeof d === "number")) { - // If binSize & min are provided, label bins as ranges e.g. "0–0.1" - if (typeof extra.binSize === "number" && typeof extra.min === "number") { - data = extra.distribution.map((v: number, idx: number) => { - const minNum = Number(extra.min) - const start = minNum + idx * extra.binSize - const end = start + extra.binSize - return { - name: `${format3Sig(start)}–${format3Sig(end)}`, - value: v, - edge: start, // Changed from end to start - } - }) - } else { - data = extra.distribution.map((v: number, idx: number) => ({ - name: String(idx), - value: v, - })) - } - } else if (extra.distribution.every((d) => typeof d === "object" && d != null)) { - if (extra.distribution.every((d: any) => typeof d.value === "number")) { - // If binSize & min are provided, label bins as ranges e.g. "0–0.1" - if (typeof extra.binSize === "number" && typeof extra.min === "number") { - data = extra.distribution.map((d: any, idx: number) => { - const minNum = Number(extra.min) - const start = minNum + idx * extra.binSize - const end = start + extra.binSize - - return { - name: `${format3Sig(start)}–${format3Sig(end)}`, - value: d.count ?? d.value ?? 0, - edge: start, - } - }) - } else { - data = extra.distribution.map((d: any) => ({ - name: String(d.value), - value: d.count ?? d.value ?? 0, - })) - } - } else { - data = extra.distribution - .filter((d: any) => (d.count ?? d.value ?? 0) > 0) - .map((d: any, idx: number) => ({ - name: - typeof d.value === "number" - ? Number(d.value).toPrecision(3) - : String(idx), - value: Number(d.count ?? d.value ?? 0), - })) - } - } - // If we only have a single point, add a zero baseline to avoid Recharts/decimal.js errors - if (data.length === 1) { - data = [{name: "", value: 0}, ...data] - } - return data - } - - // 2️⃣ Categorical metrics: use frequency (all labels) falling back to rank --- - const catArray = Array.isArray(extra.frequency) - ? extra.frequency - : Array.isArray(extra.rank) - ? extra.rank - : null - if (Array.isArray(catArray)) { - const sorted = [...catArray].sort((a: any, b: any) => (b.count ?? 0) - (a.count ?? 0)) - return sorted.map((d: any) => ({name: String(d.value), value: Number(d.count ?? 0)})) - } - - // 3️⃣ Percentiles / IQRs ---------------------------------------------------- - if (extra.percentiles && typeof extra.percentiles === "object") { - return Object.entries(extra.percentiles).map(([k, v]) => ({name: k, value: Number(v)})) - } - if (extra.iqrs && typeof extra.iqrs === "object") { - return Object.entries(extra.iqrs).map(([k, v]) => ({name: k, value: Number(v)})) - } - return [] -} - -/** - * Registry mapping metric keys (full string match or RegExp string) to a formatter. - * Extend this map according to your metric naming conventions. - */ -export const METRIC_FORMATTERS: Record = { - // currency-like costs - cost: {prefix: "$", decimals: 6}, - costs: {prefix: "$", decimals: 6}, - price: {prefix: "$", decimals: 4}, - totalCost: {prefix: "$", decimals: 4}, - "attributes.ag.metrics.costs.cumulative.total": {prefix: "$", decimals: 4}, - // latency - latency: {decimals: 2, suffix: "s", multiplier: 0.001}, - duration: {decimals: 2, suffix: "s", multiplier: 0.001}, - "duration.total": {decimals: 2, suffix: "s", multiplier: 0.001}, - "attributes.ag.metrics.duration.cumulative": {decimals: 2, suffix: "s", multiplier: 0.001}, - "attributes.ag.metrics.tokens.cumulative.total": {decimals: 0}, - "attributes.ag.metrics.errors.cumulative": {decimals: 0}, - - // percentages - accuracy: {suffix: "%", decimals: 2}, - recall: {suffix: "%", decimals: 2}, - precision: {suffix: "%", decimals: 2}, -} - -export const format3Sig = (num: number | string): string => { - if (typeof num !== "number") return String(num) - if (!Number.isFinite(num)) return String(num) - - const abs = Math.abs(num) - if (abs === 0) return "0" - - const exponent = Math.floor(Math.log10(abs)) - - // Use scientific notation if exponent >= 10 or <= -10 - if (exponent >= 10 || exponent <= -10) { - return num.toExponential(2) - } - - // Use fixed-point notation with 3 significant digits - const decimals = Math.max(0, 2 - exponent) - const fixed = num.toFixed(decimals) - - // Strip trailing zeros and possible trailing decimal point - return fixed.replace(/\.?0+$/, "") -} - -/** - * Format a metric value using the mapping above. - * Falls back to the raw value when the metric has no formatter or value is non-numeric. - */ -export function formatMetricValue(metricKey: string, value: unknown): string { - if (value == null) { - return "" - } - - if (Array.isArray(value)) { - return value.map((v) => formatMetricValue(metricKey, v)).join(", ") - } - - if (typeof value === "boolean") { - return value ? "true" : "false" - } - - if (typeof value === "object") { - try { - return JSON.stringify(value, null, 2) - } catch (error) { - return String(value) - } - } - - if (typeof value !== "string" && typeof value !== "number") { - return String(value) - } - - const fmt = METRIC_FORMATTERS[metricKey] || { - decimals: 2, - } - - if (fmt?.format) { - return fmt.format(value) - } - - if (typeof value !== "number") { - const numericValue = Number(value) - if (Number.isNaN(numericValue)) { - return String(value) - } - const adjusted = fmt.multiplier ? numericValue * fmt.multiplier : numericValue - const rounded = Number.isFinite(adjusted) ? format3Sig(adjusted) : format3Sig(value) - return `${fmt.prefix ?? ""}${rounded}${fmt.suffix ?? ""}` - } - - const adjusted = fmt.multiplier ? value * fmt.multiplier : value - const rounded = Number.isFinite(adjusted) ? format3Sig(adjusted) : format3Sig(value) - return `${fmt.prefix ?? ""}${rounded}${fmt.suffix ?? ""}` -} diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/index.tsx b/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/index.tsx deleted file mode 100644 index 32870ec074..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/index.tsx +++ /dev/null @@ -1,385 +0,0 @@ -import {memo, useCallback, useMemo, useState, type FC} from "react" - -import {Popover, Tag, Space} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" - -import {Expandable} from "@/oss/components/Tables/ExpandableCell" -import {runMetricsStatsCacheFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {extractPrimitive, inferMetricType} from "@/oss/lib/metricUtils" - -import ResponsiveFrequencyChart from "./assets/ResponsiveFrequencyChart" -import ResponsiveMetricChart from "./assets/ResponsiveMetricChart" -import {buildChartData, format3Sig, formatMetricValue} from "./assets/utils" -import {MetricDetailsPopoverProps} from "./types" - -/** - * MetricDetailsPopover is a React functional component that provides a detailed view - * of metric information within a popover. It displays both a tabular representation - * of primitive metric entries and a chart visualization based on the provided metric - * data. The component determines the appropriate chart type dynamically and supports - * categorical and continuous data representations. - * - * Props: - * - metricKey: The key associated with the metric being displayed. - * - extraDimensions: Additional dimensions or metadata for the metric. - * - highlightValue: Optional value for highlighting in the chart. - * - hidePrimitiveTable: Boolean flag to toggle the visibility of the primitive table. - * - children: ReactNode elements to be rendered inside the popover trigger. - */ -const MetricDetailsPopover: FC = memo( - ({ - metricKey, - metricType, - extraDimensions, - highlightValue, - hidePrimitiveTable, - children, - className, - }) => { - const [open, setOpen] = useState(false) - const handleOpenChange = useCallback((v: boolean) => setOpen(v), []) - - const extraEntries = useMemo(() => Object.entries(extraDimensions), [extraDimensions]) - - const chartData = useMemo( - () => (open ? buildChartData(extraDimensions) : []), - [open, extraDimensions], - ) - - // Dynamically compute the pixel width required for Y-axis labels - const labelWidth = useMemo(() => { - if (!chartData.length) return 0 - const canvas = document.createElement("canvas") - const ctx = canvas.getContext("2d") - if (!ctx) return 0 - ctx.font = "10px Inter, sans-serif" // must match tick font - const max = Math.max(...chartData.map((d) => ctx.measureText(String(d.name)).width)) - return Math.ceil(max) + 8 // + padding - }, [chartData]) - - const primitiveEntries = useMemo(() => { - if (!open || hidePrimitiveTable) return [] - // const order = ["mean", "std", "min", "max", "count", "total", "binSize"] - const order = ["mean", "std", "min", "max", "count", "sum", "binSize", "unique", "rank"] - const allowed = new Set(order) - const _primitiveEntries = extraEntries - .filter(([k]) => allowed.has(k as string)) - .sort(([a], [b]) => { - const ia = order.indexOf(a as string) - const ib = order.indexOf(b as string) - const sa = ia === -1 ? Number.POSITIVE_INFINITY : ia - const sb = ib === -1 ? Number.POSITIVE_INFINITY : ib - - return sa - sb || (a as string).localeCompare(b as string) - }) - return _primitiveEntries - }, [open, hidePrimitiveTable, extraEntries]) - - const tableNode = useMemo(() => { - if (!primitiveEntries.length) return null - - return ( -
    - - {primitiveEntries.map(([k, v]) => ( - - - - - ))} - -
    {k} - {(() => { - if (Array.isArray(v)) { - const limit = 5 - if (k === "unique") { - const items = (v as any[]).slice(0, limit) - return ( -
    - {items.map((itm, idx) => ( - - {String(itm)} - - ))} - {v.length > limit && ( - - … - - )} -
    - ) - } - if ((k === "rank" || k === "frequency") && v.length) { - const items = (v as any[]).slice(0, limit) - return ( -
    - {items.map((o: any, idx) => ( - {`${o.value} (${o.count})`} - ))} - {v.length > limit && ( - - … - - )} -
    - ) - } - } - return formatMetricValue(metricKey, v as any) - })()} -
    - ) - }, [primitiveEntries, metricKey]) - - // Chart type logic - const isCategoricalChart = - Array.isArray(extraDimensions.distribution) || - Array.isArray(extraDimensions.rank) || - Array.isArray(extraDimensions.frequency) - const hasEdge = - chartData.length > 0 && Object.prototype.hasOwnProperty.call(chartData[0], "edge") - - const frequencyData = useMemo(() => { - // Only build for categorical/frequency charts without edge - if (isCategoricalChart && !hasEdge) { - // buildChartData returns [{ name, value }] but ResponsiveFrequencyChart expects [{ label, count }] - return buildChartData(extraDimensions).map((d) => ({ - label: d.name, - count: d.value, - })) - } - return [] - }, [extraDimensions, isCategoricalChart, hasEdge]) - - const chartNode = useMemo(() => { - if (!open) return null - // Histogram (hasEdge): use ResponsiveMetricChart - if (chartData.length > 0 && isCategoricalChart && hasEdge) { - return ( - - ) - } - // Frequency/categorical: use ResponsiveFrequencyChart - if (frequencyData.length > 0 && isCategoricalChart && !hasEdge) { - return ( - - ) - } - // No valid chart type available - return null - }, [chartData, isCategoricalChart, hasEdge, labelWidth, highlightValue, extraDimensions]) - - const content = useMemo( - () => ( -
    - {tableNode} - {chartNode} -
    - ), - [tableNode, chartNode], - ) - if (!extraEntries.length || metricType === "string") { - return <>{children} - } - - return ( -
    - - {children} - -
    - ) - }, -) - -MetricDetailsPopover.displayName = "MetricDetailsPopover" - -/** - * A wrapper component around MetricDetailsPopover that: - * - fetches run metrics using useEvaluationRunMetrics - * - computes a summary of the metric - * - passes the extra dimensions to the MetricDetailsPopover - * - conditionally renders the MetricDetailsPopover if the metric is not null - * - * @param scenarioId - the scenario ID - * @param runId - the run ID - * @param evaluatorSlug - the evaluator slug - * @param evaluatorMetricKey - the metric key - * @param hidePrimitiveTable - whether to hide the primitive table - * @param metricType - the type of the metric (optional) - */ -export const MetricDetailsPopoverWrapper = memo( - ({ - scenarioId, - runId, - evaluatorSlug, - evaluatorMetricKey, - hidePrimitiveTable = false, - metricType, - className, - statsOverride, - debug, - evaluator, - }: { - scenarioId?: string | null - runId: string - evaluatorSlug: string - evaluatorMetricKey: string - hidePrimitiveTable?: boolean - metricType?: string - evaluator?: EvaluatorDto - className?: string - statsOverride?: Record - debug?: boolean - }) => { - const metricKey = useMemo( - () => `${evaluatorSlug}.${evaluatorMetricKey}`, - [evaluatorSlug, evaluatorMetricKey], - ) - - // Use run-scoped stats cache instead of global cache - const runStatsCache = useAtomValue(runMetricsStatsCacheFamily(runId)) - const stats = statsOverride ?? runStatsCache?.[metricKey] - - const rawPrimitive = useMemo(() => extractPrimitive(stats), [stats]) - - const explicitTypeFromEvaluator = useMemo(() => { - return ( - evaluator?.metrics?.[evaluatorMetricKey]?.type || - evaluator?.metrics?.[evaluatorMetricKey]?.anyOf - ) - // as SchemaMetricType | undefined - }, [evaluator, evaluatorMetricKey]) - const resolvedMetricType = useMemo( - () => explicitTypeFromEvaluator ?? inferMetricType(rawPrimitive, metricType), - [explicitTypeFromEvaluator, rawPrimitive, metricType], - ) - - const summary = useMemo(() => { - if (!stats) return "N/A" - if (resolvedMetricType === "string" || resolvedMetricType === "object") { - return "N/A" - } - // Numeric metrics → mean - if (typeof (stats as any).mean === "number") { - return format3Sig(Number((stats as any).mean)) - } - // Boolean metrics → proportion of `true` - if (resolvedMetricType === "boolean" && Array.isArray((stats as any).frequency)) { - const trueEntry = (stats as any).frequency.find((f: any) => f.value === true) - const total = (stats as any).count ?? 0 - if (total) { - return ( -
    -
    -
    -
    - true - false -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {(((trueEntry?.count ?? 0) / total) * 100).toFixed(2)}% -
    -
    - ) - } - } - // Array metrics → show top 3 items - if (resolvedMetricType === "array" || resolvedMetricType === undefined) { - const items = - Array.isArray((stats as any).rank) && (stats as any).rank.length - ? (stats as any).rank - : Array.isArray((stats as any).unique) - ? (stats as any).unique.map((v: any) => ({value: v, count: undefined})) - : [] - const topItems = items.slice(0, 3) - return ( - - {topItems.map((it: any) => ( - - {String(it.value)} - {it.count !== undefined ? ` (${it.count})` : ""} - - ))} - - ) - } - // Categorical metrics → top rank - if (Array.isArray((stats as any).rank) && (stats as any).rank.length) { - const top = (stats as any).rank[0] - return `${top.value} (${top.count})` - } - if (Array.isArray((stats as any).unique) && (stats as any).unique.length) { - return `${(stats as any).unique.length} unique` - } - if (typeof (stats as any).count === "number") { - return (stats as any).count - } - return "–" - }, [stats, resolvedMetricType]) - - return stats ? ( - - {summary} - - ) : ( - "N/A" - ) - }, -) - -export default MetricDetailsPopover diff --git a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/types.ts b/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/types.ts deleted file mode 100644 index ae12092aad..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/MetricDetailsPopover/types.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type {ReactNode} from "react" - -export interface MetricDetailsPopoverProps { - metricKey: string - primaryLabel?: string - primaryValue?: number | string - extraDimensions: Record - /** Value to highlight (bin/bar will be inferred from this value) */ - highlightValue?: number | string | boolean | Array - /** Hide primitives key‒value table; useful for lightweight popovers */ - hidePrimitiveTable?: boolean - /** Force using edge-axis (for debugging) */ - hasEdge?: boolean - className?: string - children: ReactNode -} - -// helper to transform objects to chart data -export interface ChartDatum { - name: string | number - value: number - edge?: number -} - -export interface MetricFormatter { - /** String to prepend before the numeric value, e.g. "$" */ - prefix?: string - /** String to append after the numeric value, e.g. "%" */ - suffix?: string - /** Number of decimal places to round to. If undefined, value is not rounded */ - decimals?: number - /** Multiplier to apply before formatting */ - multiplier?: number - /** Optional custom formatter receives numeric value and returns formatted string */ - format?: (value: number | string) => string -} diff --git a/web/oss/src/components/HumanEvaluations/assets/SingleModelEvaluationHeader/index.tsx b/web/oss/src/components/HumanEvaluations/assets/SingleModelEvaluationHeader/index.tsx deleted file mode 100644 index d1d125c012..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/SingleModelEvaluationHeader/index.tsx +++ /dev/null @@ -1,328 +0,0 @@ -import {useCallback, useEffect, useMemo, useState, memo} from "react" - -import {Export, Plus, Trash} from "@phosphor-icons/react" -import {Button, message, Space, Typography} from "antd" -import clsx from "clsx" -import dynamic from "next/dynamic" -import Link from "next/link" -import {useSWRConfig} from "swr" - -import {statusMapper} from "@/oss/components/pages/evaluations/cellRenderers/cellRenderers" -import useURL from "@/oss/hooks/useURL" -import {EvaluationType} from "@/oss/lib/enums" -import {calculateAvgScore} from "@/oss/lib/helpers/evaluate" -import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" -import {getEvaluationRunScenariosKey} from "@/oss/lib/hooks/useEvaluationRunScenarios" -import useEvaluations from "@/oss/lib/hooks/useEvaluations" -import {summarizeMetric} from "@/oss/lib/metricUtils" -import {EvaluationStatus} from "@/oss/lib/Types" -import {getAppValues} from "@/oss/state/app" - -import {SingleModelEvaluationHeaderProps} from "../../types" -import {EvaluationRow} from "../../types" -import {useStyles} from "../styles" -import {extractEvaluationStatus, getMetricSummaryValue} from "../utils" - -const NewEvaluationModal = dynamic(() => import("../../../pages/evaluations/NewEvaluation"), { - ssr: false, -}) -const DeleteEvaluationModal = dynamic( - () => import("@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal"), - {ssr: false}, -) - -const SingleModelEvaluationHeader = ({ - viewType, - selectedRowKeys, - mergedEvaluations, - runMetricsMap, - setSelectedRowKeys, - isDeleteEvalModalOpen, - setIsDeleteEvalModalOpen, - selectedEvalRecord, - setSelectedEvalRecord, - scope, - projectURL, - activeAppId, - extractAppId, -}: SingleModelEvaluationHeaderProps) => { - const classes = useStyles() - const {appURL} = useURL() - const {cache} = useSWRConfig() - const {refetch, handleDeleteEvaluations: deleteEvaluations} = useEvaluations({ - withPreview: true, - types: [EvaluationType.single_model_test], - appId: activeAppId, - }) - - const [isEvalModalOpen, setIsEvalModalOpen] = useState(false) - const [isDeletingEvaluations, setIsDeletingEvaluations] = useState(false) - const [isScrolled, setIsScrolled] = useState(false) - - useEffect(() => { - if (viewType === "overview") return - - const handleScroll = () => { - setIsScrolled(window.scrollY > 180) - } - - window.addEventListener("scroll", handleScroll) - - return () => { - window.removeEventListener("scroll", handleScroll) - } - }, [viewType]) - - const selectedEvaluations = useMemo(() => { - return selectedEvalRecord - ? (() => { - const found = mergedEvaluations.find( - (e) => ("id" in e ? e.id : e.key) === selectedEvalRecord?.id, - ) - return found && "name" in found ? found.name : (found?.key ?? "") - })() - : mergedEvaluations - .filter((e) => selectedRowKeys.includes("id" in e ? e.id : e.key)) - .map((e) => ("name" in e ? e.name : e.key)) - .join(" | ") - }, [selectedEvalRecord, selectedRowKeys]) - - const handleDelete = useCallback( - async (ids: string[]) => { - setIsDeletingEvaluations(true) - try { - await deleteEvaluations(ids) - message.success( - ids.length > 1 ? `${ids.length} Evaluations Deleted` : "Evaluation Deleted", - ) - } catch (err) { - message.error("Failed to delete evaluations") - console.error(err) - } finally { - setIsDeletingEvaluations(false) - setIsDeleteEvalModalOpen(false) - setSelectedRowKeys([]) - } - }, - [deleteEvaluations], - ) - - const runStatus = useCallback( - (runId: string, status: EvaluationStatus, isLegacyEval: boolean) => { - if (isLegacyEval) { - const statusLabel = statusMapper({} as any)(status as EvaluationStatus) - .label as EvaluationStatus - return statusLabel - } - - const key = `${getEvaluationRunScenariosKey(runId)}-false` - const cachedData = cache.get(key) - const scenarios = cachedData?.data?.scenarios - - const {runStatus: _status} = extractEvaluationStatus(scenarios, status) - return _status == "success" ? "completed" : _status - }, - [cache], - ) - - const onExport = useCallback(() => { - const exportEvals = mergedEvaluations.filter((e) => - selectedRowKeys.some((selected) => selected === ("id" in e ? e.id : e.key)), - ) - - try { - if (exportEvals.length) { - const {currentApp} = getAppValues() - const filenameBase = - currentApp?.app_name || - (scope === "project" ? "all_applications" : "evaluations") - const filename = `${filenameBase.replace(/\s+/g, "_")}_human_annotation.csv` - - const rows = exportEvals.map((item) => { - const id = "id" in item ? item.id : item.key - const metrics = runMetricsMap?.[id] - const applicationName = (item as any)?.variants?.[0]?.appName || "-" - const applicationId = extractAppId(item as EvaluationRow) || "-" - - // Note: all the 'in' conditions here are for legacy eval - const row: Record = { - Name: "name" in item ? item.name : item.key, - Variant: `${item.variants?.[0]?.variantName} v${"revisions" in item ? item.revisions?.[0] : item.variants?.[0]?.revision}`, - Testset: - "testset" in item - ? item.testset.name - : (item.testsets?.[0]?.name ?? ""), - Status: - runStatus(id, item.status, item.status.includes("EVALUATION")) || "", - // legacy eval - ...("resultsData" in item - ? {"Average score": `${calculateAvgScore(item) || 0}%`} - : {}), - ...((item as any).createdBy?.user?.username - ? {"Created by": (item as any).createdBy?.user?.username} - : {}), - "Created on": item.createdAt, - } - - if (scope === "project") { - row.Application = applicationName - row["Application ID"] = applicationId - } - - // Track metric keys consumed by evaluator loop so we don't duplicate - const consumedKeys = new Set() - - if ("evaluators" in item && Array.isArray(item.evaluators)) { - item.evaluators.forEach((ev: any) => { - const metricDefs = - ev.data?.service?.format?.properties?.outputs?.properties || {} - Object.entries(metricDefs).forEach( - ([metricKey, def]: [string, any]) => { - const fullKey = `${ev.slug}.${metricKey}` - consumedKeys.add(fullKey) - const stat = metrics?.[fullKey] - const value = summarizeMetric(stat, def?.type) - row[`${ev.name} ${metricKey}`] = - value !== undefined && value !== null ? value : "N/A" - }, - ) - }) - } - - if (metrics) { - Object.entries(metrics).forEach(([metricKey, stat]) => { - if (consumedKeys.has(metricKey)) return - const value = summarizeMetric(stat as any) - row[metricKey] = value !== undefined && value !== null ? value : "N/A" - }) - } - - return row - }) - - const headerSet = new Set() - rows.forEach((r) => Object.keys(r).forEach((h) => headerSet.add(h))) - const headers = Array.from(headerSet) - - const csvData = convertToCsv(rows, headers) - downloadCsv(csvData, filename) - setSelectedRowKeys([]) - } - } catch (error) { - message.error("Failed to export results. Please try again later") - } - }, [mergedEvaluations, selectedRowKeys, runMetricsMap, scope, extractAppId]) - - return ( - <> - {viewType === "overview" ? ( -
    - - Human Annotation - - {(() => { - const href = - scope === "app" - ? appURL - ? `${appURL}/evaluations?selectedEvaluation=human_annotation` - : undefined - : `${projectURL}/evaluations?selectedEvaluation=human_annotation` - - if (!href) return null - - return ( - - ) - })()} - - - {(scope === "app" && activeAppId) || scope === "project" ? ( - - ) : null} -
    - ) : ( -
    - {(scope === "app" && activeAppId) || scope === "project" ? ( - - ) : null} - - - - - -
    - )} - - {((scope === "app" && activeAppId) || scope === "project") && ( - { - setIsEvalModalOpen(false) - }} - onSuccess={() => { - setIsEvalModalOpen(false) - refetch() - }} - preview={true} - evaluationType={"human"} - /> - )} - - { - setIsDeleteEvalModalOpen(false) - setSelectedEvalRecord(undefined) - }} - onOk={async () => { - const idsToDelete = selectedEvalRecord - ? [selectedEvalRecord.id] - : selectedRowKeys.map((key) => key?.toString()) - await handleDelete(idsToDelete.filter(Boolean)) - }} - evaluationType={selectedEvaluations} - isMultiple={!selectedEvalRecord && selectedRowKeys.length > 0} - /> - - ) -} - -export default memo(SingleModelEvaluationHeader) diff --git a/web/oss/src/components/HumanEvaluations/assets/TableDropdownMenu/index.tsx b/web/oss/src/components/HumanEvaluations/assets/TableDropdownMenu/index.tsx deleted file mode 100644 index 9312f7e771..0000000000 --- a/web/oss/src/components/HumanEvaluations/assets/TableDropdownMenu/index.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import {memo, useMemo} from "react" - -import {MoreOutlined} from "@ant-design/icons" -import {Database, Note, Rocket, Trash} from "@phosphor-icons/react" -import {Dropdown, Button, MenuProps} from "antd" -import {useRouter} from "next/router" - -import {EvaluationStatus} from "@/oss/lib/Types" - -import { - buildAppScopedUrl, - buildEvaluationNavigationUrl, - extractPrimaryInvocation, -} from "../../../pages/evaluations/utils" - -import {TableDropdownMenuProps} from "./types" - -const TableDropdownMenu = ({ - record, - evalType, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - onVariantNavigation, - baseAppURL, - extractAppId, - scope, - projectURL, - resolveAppId, - disableVariantAction = false, -}: TableDropdownMenuProps) => { - const router = useRouter() - const primaryInvocation = extractPrimaryInvocation(record) - const resolvedAppId = resolveAppId ? resolveAppId(record) : undefined - const targetAppId = resolvedAppId || primaryInvocation?.appId || extractAppId(record) - const variantId = primaryInvocation?.revisionId || record.variants?.[0]?.id - - const items: MenuProps["items"] = useMemo( - () => [ - { - key: "details", - label: "Open details", - icon: , - disabled: - [ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(record.status) || !targetAppId, - onClick: (e) => { - e.domEvent.stopPropagation() - if ( - (evalType === "auto" || evalType === "custom") && - ![ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(record.status) && - targetAppId - ) { - const evaluationId = "id" in record ? record.id : record.key - const suffix = - evalType === "auto" || evalType === "custom" - ? `/evaluations/results/${evaluationId}` - : `/evaluations/single_model_test/${evaluationId}` - const pathname = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: targetAppId, - path: suffix, - }) - - if (scope === "project") { - router.push({ - pathname, - query: targetAppId ? {app_id: targetAppId} : undefined, - }) - } else { - router.push(pathname) - } - } - }, - }, - { - key: "variant", - label: "View variant", - icon: , - disabled: disableVariantAction || !variantId || !targetAppId, - onClick: (e) => { - e.domEvent.stopPropagation() - if (disableVariantAction || !variantId) return - onVariantNavigation({revisionId: variantId, appId: targetAppId || undefined}) - }, - }, - { - key: "view_testset", - label: "View testset", - icon: , - onClick: (e) => { - e.domEvent.stopPropagation() - router.push(`${projectURL}/testsets/${record.testsets?.[0]?.id}`) - }, - }, - {type: "divider"}, - { - key: "delete_eval", - label: "Delete", - icon: , - danger: true, - onClick: (e) => { - e.domEvent.stopPropagation() - setSelectedEvalRecord(record) - setIsDeleteEvalModalOpen(true) - }, - }, - ], - [ - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - record, - onVariantNavigation, - evalType, - targetAppId, - baseAppURL, - variantId, - projectURL, - primaryInvocation, - scope, - ], - ) - return ( - - - , + , ]} /> ) diff --git a/web/oss/src/components/Layout/FooterIsland.tsx b/web/oss/src/components/Layout/FooterIsland.tsx deleted file mode 100644 index b5b335575d..0000000000 --- a/web/oss/src/components/Layout/FooterIsland.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import {memo} from "react" - -import {GithubFilled, LinkedinFilled, TwitterOutlined} from "@ant-design/icons" -import {Layout, Space, Typography} from "antd" -import Link from "next/link" - -const {Footer} = Layout - -interface FooterIslandProps { - className?: string -} - -export const FooterIsland = memo(function FooterIsland({className}: FooterIslandProps) { - return ( -
    - - - - - - - - - - - - Copyright © {new Date().getFullYear()} | Agenta. -
    - ) -}) diff --git a/web/oss/src/components/Layout/Layout.tsx b/web/oss/src/components/Layout/Layout.tsx index 7f9f160de5..1e6fcaa625 100644 --- a/web/oss/src/components/Layout/Layout.tsx +++ b/web/oss/src/components/Layout/Layout.tsx @@ -1,45 +1,87 @@ import {memo, useEffect, useMemo, useRef, type ReactNode, type RefObject} from "react" -import {Suspense} from "react" import {GithubFilled, LinkedinFilled, TwitterOutlined} from "@ant-design/icons" -import {ConfigProvider, Layout, Modal, Skeleton, Space, theme} from "antd" +import {Button, ConfigProvider, Layout, Modal, Skeleton, Space, Typography, theme} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" import dynamic from "next/dynamic" import Link from "next/link" +import {useRouter} from "next/router" import {ErrorBoundary} from "react-error-boundary" +import {ThemeProvider} from "react-jss" import {useLocalStorage, useResizeObserver} from "usehooks-ts" -import useURL from "@/oss/hooks/useURL" +import {useAppsData} from "@/oss/contexts/app.context" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProfileData} from "@/oss/contexts/profile.context" +import {DEFAULT_UUID, getCurrentProject, useProjectData} from "@/oss/contexts/project.context" import {usePostHogAg} from "@/oss/lib/helpers/analytics/hooks/usePostHogAg" -import {currentAppAtom} from "@/oss/state/app" -import {useAppQuery, useAppState} from "@/oss/state/appState" -import {useProfileData} from "@/oss/state/profile" -import {getProjectValues, useProjectData} from "@/oss/state/project" +// import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" +import {useVariants} from "@/oss/lib/hooks/useVariants" import OldAppDeprecationBanner from "../Banners/OldAppDeprecationBanner" import CustomWorkflowBanner from "../CustomWorkflowBanner" +import useCustomWorkflowConfig from "../pages/app-management/modals/CustomWorkflowModal/hooks/useCustomWorkflowConfig" import ProtectedRoute from "../ProtectedRoute/ProtectedRoute" -import BreadcrumbContainer from "./assets/Breadcrumbs" -import {useStyles} from "./assets/styles" +import {BreadcrumbContainer} from "./assets/Breadcrumbs" +import {useStyles, type StyleProps} from "./assets/styles" import ErrorFallback from "./ErrorFallback" -import {SidebarIsland} from "./SidebarIsland" import {getDeviceTheme, useAppTheme} from "./ThemeContextProvider" -const FooterIsland = dynamic(() => import("./FooterIsland").then((m) => m.FooterIsland), { +const Sidebar: any = dynamic(() => import("../Sidebar/Sidebar"), { ssr: false, - loading: () => null, + loading: () => , }) type StyleClasses = ReturnType -const {Content} = Layout +const {Content, Footer} = Layout interface LayoutProps { children: React.ReactNode } +const WithVariants = ({ + children, + handleBackToWorkspaceSwitch, +}: { + children: ReactNode + handleBackToWorkspaceSwitch: () => void +}) => { + const {currentApp} = useAppsData() + + // @ts-ignoree + const {mutate, data} = useVariants(currentApp)( + { + appId: currentApp?.app_id, + }, + [], + ) + + const variant = useMemo(() => data?.variants?.[0], [data?.variants]) + + const {CustomWorkflowModal, openModal} = useCustomWorkflowConfig({ + afterConfigSave: async () => { + await mutate() + }, + }) + + return ( + <> + + {variant && ( + + )} + {children} + + {CustomWorkflowModal} + + ) +} + const AppWithVariants = memo( ({ children, @@ -47,42 +89,38 @@ const AppWithVariants = memo( classes, isPlayground, isHumanEval, - isEvaluator, appTheme, ...props }: { children: ReactNode isAppRoute: boolean isHumanEval: boolean - isEvaluator: boolean classes: StyleClasses appTheme: string isPlayground?: boolean }) => { - const {baseAppURL} = useURL() - const appState = useAppState() + const router = useRouter() const lastNonSettingsRef = useRef(null) useEffect(() => { - if (!appState.pathname.includes("/settings")) { - lastNonSettingsRef.current = appState.asPath + if (!router.pathname.startsWith("/settings")) { + lastNonSettingsRef.current = router.asPath } - }, [appState.asPath, appState.pathname]) + }, [router.asPath]) - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() const {project, projects} = useProjectData() - // const profileLoading = useAtomValue(profilePendingAtom) - // const {changeSelectedOrg} = useOrgData() + const {changeSelectedOrg} = useOrgData() const handleBackToWorkspaceSwitch = () => { const project = projects.find((p) => p.user_role === "owner") if (project && !project.is_demo && project.organization_id) { - // changeSelectedOrg(project.organization_id) + changeSelectedOrg(project.organization_id) } } return ( -
    +
    {project?.is_demo && (
    You are in a view-only demo workspace. To go back to your @@ -93,30 +131,30 @@ const AppWithVariants = memo(
    )} - -
    +
    - {isAppRoute && !getProjectValues().projectId ? null : isAppRoute ? ( - - + {isAppRoute && + (!currentApp || + getCurrentProject().projectId === + DEFAULT_UUID) ? null : isAppRoute ? ( + @@ -132,13 +170,12 @@ const AppWithVariants = memo( - + ) : ( @@ -156,8 +193,7 @@ const AppWithVariants = memo( )}
    -
    - +
    @@ -173,7 +209,7 @@ const AppWithVariants = memo(
    Copyright © {new Date().getFullYear()} | Agenta.
    - +
    @@ -182,24 +218,27 @@ const AppWithVariants = memo( ) const App: React.FC = ({children}) => { - // profile used for side-effects in children; values unused here - useProfileData() + const {user, loading: loadingProfile} = useProfileData() const {appTheme} = useAppTheme() - const {baseAppURL} = useURL() + const {currentApp, isLoading, error} = useAppsData() const ref = useRef(null) const {height: footerHeight} = useResizeObserver({ ref: ref as RefObject, box: "border-box", }) + const {project} = useProjectData() const classes = useStyles({themeMode: appTheme, footerHeight} as StyleProps) - const appState = useAppState() - const query = useAppQuery() - + const router = useRouter() + const appId = router.query.app_id as string const isDarkTheme = appTheme === "dark" + const {token} = theme.useToken() const [, contextHolder] = Modal.useModal() + // useFetchEvaluatorsData() const posthog = usePostHogAg() const [hasCapturedTheme, setHasCapturedTheme] = useLocalStorage("hasCapturedTheme", false) + const userProfile = useMemo(() => !loadingProfile && !!user, [loadingProfile, user]) + useEffect(() => { if (!hasCapturedTheme) { const deviceTheme = getDeviceTheme() @@ -224,53 +263,65 @@ const App: React.FC = ({children}) => { } }, [appTheme]) - const {isHumanEval, isPlayground, isAppRoute, isAuthRoute, isEvaluator} = useMemo(() => { - const pathname = appState.pathname - const asPath = appState.asPath - const selectedEvaluation = Array.isArray(query.selectedEvaluation) - ? query.selectedEvaluation[0] - : query.selectedEvaluation + const {isHumanEval, isPlayground, isAppRoute, isAuthRoute} = useMemo(() => { return { isAuthRoute: - pathname.includes("/auth") || - pathname.includes("/post-signup") || - pathname.includes("/workspaces"), - isAppRoute: baseAppURL ? asPath.startsWith(baseAppURL) : false, - isPlayground: - pathname.includes("/playground") || pathname.includes("/evaluations/results"), - isEvaluator: pathname.includes("/evaluators/configure"), + router.pathname.includes("/auth") || + router.pathname.includes("/post-signup") || + router.pathname.includes("/workspaces"), + isAppRoute: router.pathname.startsWith("/apps/[app_id]"), + isPlayground: router.pathname.includes("/playground"), isHumanEval: - pathname.includes("/evaluations/single_model_test") || - selectedEvaluation === "human_annotation", + router.pathname.includes("/evaluations/single_model_test") || + router.query.selectedEvaluation === "human_annotation", } - }, [appState.asPath, appState.pathname, baseAppURL, query.selectedEvaluation]) + }, [router.pathname, router.query]) + + // wait until we have the app id, if its an app route + if (userProfile && isAppRoute && (!appId || !project)) return null + + if (userProfile && appId && !currentApp && !isLoading && !error) { + return ( +
    + 404 - Page Not Found + This page could not be found. + + +
    + ) + } return ( - }> - {typeof window === "undefined" ? null : isAuthRoute ? ( - - - {children} - {contextHolder} - - - ) : ( - - - {children} - {contextHolder} - - + <> + {typeof window === "undefined" ? null : ( + + {isAuthRoute ? ( + + + {children} + {contextHolder} + + + ) : ( + + + {children} + {contextHolder} + + + )} + )} - + ) } -export default App +export default memo(App) diff --git a/web/oss/src/components/Layout/SidebarIsland.tsx b/web/oss/src/components/Layout/SidebarIsland.tsx deleted file mode 100644 index c73ec9e1c6..0000000000 --- a/web/oss/src/components/Layout/SidebarIsland.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import {memo} from "react" - -import Sidebar from "../Sidebar/Sidebar" -interface SidebarIslandProps { - showSettingsView: boolean - lastPath: string | null -} - -// Pure, memo-wrapped island so updates inside Layout don’t re-render it unless its props change -export const SidebarIsland = memo(function SidebarIsland(props: SidebarIslandProps) { - return -}) diff --git a/web/oss/src/components/Layout/assets/Breadcrumbs.tsx b/web/oss/src/components/Layout/assets/Breadcrumbs.tsx index 6ed32597f8..ebccd3ba74 100644 --- a/web/oss/src/components/Layout/assets/Breadcrumbs.tsx +++ b/web/oss/src/components/Layout/assets/Breadcrumbs.tsx @@ -1,131 +1,68 @@ import {memo, useMemo} from "react" -import {Sidebar} from "@phosphor-icons/react" +import {Lightning} from "@phosphor-icons/react" import {Breadcrumb, Typography} from "antd" -import clsx from "clsx" -import {useAtom, useAtomValue} from "jotai" import Link from "next/link" - -import {breadcrumbAtom, type BreadcrumbAtom} from "@/oss/lib/atoms/breadcrumb" -import {sidebarCollapsedAtom} from "@/oss/lib/atoms/sidebar" -import {getUniquePartOfId, isUuid} from "@/oss/lib/helpers/utils" -import {useAppState} from "@/oss/state/appState" +import {useRouter} from "next/router" import packageJsonData from "../../../../package.json" -import EnhancedButton from "../../Playground/assets/EnhancedButton" -import TooltipWithCopyAction from "../../TooltipWithCopyAction" import {useStyles, type StyleProps} from "./styles" -const breadcrumbItemsGenerator = (breadcrumbs: BreadcrumbAtom): {title: React.ReactNode}[] => { - if (!breadcrumbs) return [] +const {Text} = Typography + +export const BreadcrumbRoot = memo(() => ( +
    + + Apps +
    +)) + +export const BreadcrumbContainer = memo( + ({appTheme, appName}: {appTheme: string; appName: string}) => { + const classes = useStyles({themeMode: appTheme} as StyleProps) + const router = useRouter() - return Object.values(breadcrumbs).map((item) => { - const title = item.href ? ( - - - {item.icon} - {item.label} - - - ) : item.value && isUuid(item.value) ? ( - - {item.icon} - - - {isUuid(item.label) ? getUniquePartOfId(item.label) : item.label} - - - - ) : ( - - {item.icon} - {item.label} - + const pathSegments = useMemo( + () => router.asPath.split("?")[0].split("/").filter(Boolean), + [router.asPath], ) + const isSelectedApp = pathSegments[0] === "apps" && !!pathSegments[1] - return { - title, - ...(item.menu && { - menu: { - items: breadcrumbItemsGenerator(item.menu), - className: "!w-full [&_.ant-dropdown-menu-title-content]:!truncate", - }, - }), - } - }) -} + const breadcrumbItems = useMemo(() => { + const items: {title: React.ReactNode; className?: string}[] = [] -const BreadcrumbContainer = memo(({appTheme}: {appTheme: string}) => { - const classes = useStyles({themeMode: appTheme} as StyleProps) - const breadcrumbs = useAtomValue(breadcrumbAtom) - const [collapsed, setCollapsed] = useAtom(sidebarCollapsedAtom) - const appState = useAppState() - const breadcrumbItems = useMemo( - () => breadcrumbItemsGenerator(breadcrumbs || {}), - [breadcrumbs], - ) + if (isSelectedApp) { + items.push({title: }) + } - return ( -
    -
    - - } - onClick={() => setCollapsed(!collapsed)} - tooltipProps={{ - title: "Toggle sidebar", - mouseEnterDelay: 1, - }} - /> -
    - -
    -
    + if (isSelectedApp && appName) { + items.push({title: appName}) + } -
    - agenta v{packageJsonData.version} -
    -
    - ) -}) + let displaySegments: string[] = [] + if (isSelectedApp) { + displaySegments = pathSegments.slice(2) + } else { + displaySegments = pathSegments + } -export default memo(BreadcrumbContainer) + if (displaySegments.length > 0) { + const formatted = displaySegments.map((seg) => seg.replace(/_/g, "-")).join(" / ") + + items.push({title: formatted, className: "capitalize"}) + } + + return items + }, [pathSegments, appName]) + + return ( +
    + +
    + agenta v{packageJsonData.version} +
    +
    + ) + }, +) diff --git a/web/oss/src/components/Layout/assets/styles.ts b/web/oss/src/components/Layout/assets/styles.ts index 5ecaaad993..3ba3cd8032 100644 --- a/web/oss/src/components/Layout/assets/styles.ts +++ b/web/oss/src/components/Layout/assets/styles.ts @@ -81,7 +81,6 @@ export const useStyles = createUseStyles((theme: JSSTheme) => ({ minHeight: "100vh", alignItems: "center", justifyContent: "center", - gap: 16, "& .ant-typography:nth-of-type(1)": { fontSize: 24, fontWeight: 600, diff --git a/web/oss/src/components/Layout/assets/utils.ts b/web/oss/src/components/Layout/assets/utils.ts deleted file mode 100644 index 86d2b3c106..0000000000 --- a/web/oss/src/components/Layout/assets/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export {buildBreadcrumbSegments as generateSegmentsForBreadcrumb} from "@/oss/lib/helpers/buildBreadcrumbs" diff --git a/web/oss/src/components/Logo/Logo.tsx b/web/oss/src/components/Logo/Logo.tsx index 1c3b6447d5..ddb1c133f9 100644 --- a/web/oss/src/components/Logo/Logo.tsx +++ b/web/oss/src/components/Logo/Logo.tsx @@ -5,8 +5,8 @@ import Image from "next/image" import {useAppTheme} from "../Layout/ThemeContextProvider" const LOGOS = { - dark: "/assets/Agenta-logo-full-dark-accent.png", - light: "/assets/Agenta-logo-full-light.png", + dark: "/assets/dark-complete-transparent-CROPPED.png", + light: "/assets/light-complete-transparent-CROPPED.png", } const Logo: React.FC> & {isOnlyIconLogo?: boolean}> = ( diff --git a/web/oss/src/components/Modals/CustomWorkflowModalMount.tsx b/web/oss/src/components/Modals/CustomWorkflowModalMount.tsx deleted file mode 100644 index f6d1551a46..0000000000 --- a/web/oss/src/components/Modals/CustomWorkflowModalMount.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import {useAtomValue} from "jotai" - -import CustomWorkflowModal from "@/oss/components/pages/app-management/modals/CustomWorkflowModal" -import {customWorkflowModalPropsAtom} from "@/oss/state/customWorkflow/modalAtoms" - -const CustomWorkflowModalMount = () => { - const props = useAtomValue(customWorkflowModalPropsAtom) - return -} - -export default CustomWorkflowModalMount diff --git a/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerContent.tsx b/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerContent.tsx index e5ab50f477..f8c6109434 100644 --- a/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerContent.tsx +++ b/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerContent.tsx @@ -1,14 +1,14 @@ -import React, {useEffect, useMemo, useState} from "react" +import {useEffect, useMemo, useState} from "react" import {Plus, WarningCircle} from "@phosphor-icons/react" -import {Button, Form, Input, Typography} from "antd" +import {Button, Form, Typography} from "antd" import {useWatch} from "antd/lib/form/Form" import SelectLLMProvider from "@/oss/components/SelectLLMProvider" import {useVaultSecret} from "@/oss/hooks/useVaultSecret" import {LlmProvider} from "@/oss/lib/helpers/llmProviders" import {isAppNameInputValid} from "@/oss/lib/helpers/utils" -import {PROVIDER_KINDS, PROVIDER_LABELS, SecretDTOProvider} from "@/oss/lib/Types" +import {SecretDTOProvider} from "@/oss/lib/Types" import LabelInput from "../../../assets/LabelInput" @@ -18,82 +18,6 @@ import {ConfigureProviderDrawerContentProps} from "./types" const {Text} = Typography -/** - * Optional render metadata you can attach to each PROVIDER_FIELDS item. - * Example: - * { - * key: "vertexCredentials", - * label: "Vertex Credentials (JSON)", - * model: ["vertex_ai"], - * attributes: { kind: "json", rows: 10, monospace: true, strict: true } - * } - */ -type FieldAttributes = - | {kind: "text"; inputType?: "text" | "password" | "url"} - | {kind: "textarea"; rows?: number; monospace?: boolean} - | {kind: "json"; rows?: number; monospace?: boolean; strict?: boolean} - -type FieldWithAttributes = { - attributes?: FieldAttributes - key: string - label: string - placeholder?: string - required?: boolean - model?: string[] - note?: string -} - -/** Render control based on field.attributes */ -const renderControl = (field: FieldWithAttributes, isRequired?: boolean) => { - const a = field.attributes - - if (!a || a.kind === "text") { - // Keep your existing single-line input - return ( - - ) - } - - if (a.kind === "textarea") { - return ( -
    - - {field.label} - {isRequired ? * : null} - - -
    - ) - } - - // a.kind === "json" - return ( -
    - - {field.label} - {isRequired ? * : null} - - -
    - ) -} - const ConfigureProviderDrawerContent = ({ form, onClose, @@ -103,34 +27,17 @@ const ConfigureProviderDrawerContent = ({ const {handleModifyCustomVaultSecret} = useVaultSecret() const standardProviders = useMemo(() => [...Object.values(SecretDTOProvider)], []) - const customProviders = useMemo(() => ["azure", "bedrock", "vertex_ai", "custom"], []) + const customProviders = useMemo(() => ["azure", "bedrock", "custom"], []) const validProviders = useMemo( () => [...customProviders, ...standardProviders], [standardProviders, customProviders], ) - - const providerValue = useWatch("provider", form) || "" - const normalizedProviderKind = useMemo(() => { - if (!providerValue || typeof providerValue !== "string") { - return "" - } - - const trimmedValue = providerValue.trim() - const lowerCaseValue = trimmedValue.toLowerCase() - - return PROVIDER_KINDS[trimmedValue] ?? PROVIDER_KINDS[lowerCaseValue] ?? lowerCaseValue - }, [providerValue]) - - const shouldFilter = validProviders.includes(normalizedProviderKind) + const providerValue = useWatch("provider", form)?.toLowerCase() || "" + const shouldFilter = validProviders.includes(providerValue) useEffect(() => { if (selectedProvider) { - form.setFieldsValue({ - ...selectedProvider, - provider: selectedProvider.provider - ? (PROVIDER_LABELS[selectedProvider.provider] ?? selectedProvider.provider) - : selectedProvider.provider, - }) + form.setFieldsValue(selectedProvider) } else { form.resetFields() } @@ -183,9 +90,7 @@ const ConfigureProviderDrawerContent = ({ )}
    - - Provider * - + Provider @@ -193,65 +98,47 @@ const ConfigureProviderDrawerContent = ({ {PROVIDER_FIELDS.filter((field) => { if (shouldFilter) { - return !field.model || field.model.includes(normalizedProviderKind) + return !field.model || field.model.includes(providerValue) } - return true - }).map((rawField) => { - const field = rawField as FieldWithAttributes - const isJson = field.attributes?.kind === "json" - const isRequired = - field.key === "apiBaseUrl" ? false : !shouldFilter ? !!field.required : true - return ( - - ( + <> + - {renderControl(field, isRequired)} - - - {field.note && ( - {field.note} - )} - - ) - })} + } + : {}), + }, + ]} + > + + + {field.note && {field.note}} + + ))} {(fields, {add, remove}) => ( @@ -266,7 +153,6 @@ const ConfigureProviderDrawerContent = ({ Add
    - {fields.length === 0 ? ( No custom models configured ) : ( diff --git a/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerTitle.tsx b/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerTitle.tsx index 4d5f5985b8..ac73d25902 100644 --- a/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerTitle.tsx +++ b/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ConfigureProviderDrawerTitle.tsx @@ -1,6 +1,6 @@ import {memo} from "react" -import {LinkSimple} from "@phosphor-icons/react" +import {Play} from "@phosphor-icons/react" import {Button, Typography} from "antd" const ConfigureProviderDrawerTitle = () => { @@ -8,11 +8,9 @@ const ConfigureProviderDrawerTitle = () => {
    Configure provider diff --git a/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/constants.ts b/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/constants.ts index 3cefde32b0..0b46bf9b9a 100644 --- a/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/constants.ts +++ b/web/oss/src/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/constants.ts @@ -8,14 +8,8 @@ export const PROVIDER_FIELDS: { note?: string required?: boolean model?: string[] - attributes?: Record }[] = [ - { - key: "name", - label: "Name", - placeholder: "Enter unique name", - required: true, - }, + {key: "name", label: "Name", placeholder: "Enter unique name", required: true}, { key: "apiKey", label: "API key", @@ -27,9 +21,9 @@ export const PROVIDER_FIELDS: { { key: "apiBaseUrl", label: "API base URL", - placeholder: "Enter API base URL", - note: "Include version (e.g. /v1) in the base URL (e.g. https://api.openai.com/v1)", - model: ["azure", "vertex_ai", "custom"], + placeholder: "https://api.openai.com/v1", + note: "Include /v1 in the base URL (e.g. https://api.openai.com/v1)", + model: ["azure", "custom"], required: false, }, { @@ -39,41 +33,10 @@ export const PROVIDER_FIELDS: { model: ["azure"], required: false, }, - { - key: "region", - label: "AWS region", - placeholder: "Enter AWS region", - model: ["bedrock", "sagemaker"], - required: false, - }, - { - key: "vertexProject", - label: "Vertex project", - placeholder: "Enter Vertex project", - model: ["vertex_ai"], - required: false, - }, - { - key: "vertexLocation", - label: "Vertex location", - placeholder: "Enter Vertex location", - model: ["vertex_ai"], - required: false, - }, - { - key: "vertexCredentials", - label: "Vertex credentials", - placeholder: "Enter Vertex credentials", - note: "This secret will be encrypted in transit and at rest.", - model: ["vertex_ai"], - required: false, - attributes: {kind: "json", rows: 10, monospace: true, strict: true}, - }, { key: "accessKeyId", label: "Access key ID", placeholder: "Enter access key ID", - note: "This secret will be encrypted in transit and at rest.", model: ["bedrock", "sagemaker"], required: false, }, @@ -81,7 +44,13 @@ export const PROVIDER_FIELDS: { key: "accessKey", label: "Secret Access Key", placeholder: "Enter secret access key", - note: "This secret will be encrypted in transit and at rest.", + model: ["bedrock", "sagemaker"], + required: false, + }, + { + key: "region", + label: "AWS region", + placeholder: "Enter aws region", model: ["bedrock", "sagemaker"], required: false, }, @@ -89,7 +58,6 @@ export const PROVIDER_FIELDS: { key: "sessionToken", label: "Session token", placeholder: "Enter session token", - note: "This secret will be encrypted in transit and at rest.", model: [], required: false, }, diff --git a/web/oss/src/components/NoMobilePageWrapper/NoMobilePageWrapper.tsx b/web/oss/src/components/NoMobilePageWrapper/NoMobilePageWrapper.tsx index 31c3b067a3..5243991fd6 100644 --- a/web/oss/src/components/NoMobilePageWrapper/NoMobilePageWrapper.tsx +++ b/web/oss/src/components/NoMobilePageWrapper/NoMobilePageWrapper.tsx @@ -29,11 +29,8 @@ const NoMobilePageWrapper: React.FC = ({children}) => { (bounds: DOMRectReadOnly) => { setShouldDisplay(() => { if (dismissed) return false // keep hidden if already dismissed by the user - const pathSegments = pathname.split("/").filter(Boolean) - const isMobileUnoptimizedRoute = MOBILE_UNOPTIMIZED_APP_ROUTES.some((route) => - pathSegments.includes(route), - ) - if (!isMobileUnoptimizedRoute) return false + if (!MOBILE_UNOPTIMIZED_APP_ROUTES.some((route) => pathname.startsWith(route))) + return false return bounds.width < token.screenMD }) diff --git a/web/oss/src/components/NoMobilePageWrapper/assets/constants.ts b/web/oss/src/components/NoMobilePageWrapper/assets/constants.ts index 12baf6c21a..058d997c1f 100644 --- a/web/oss/src/components/NoMobilePageWrapper/assets/constants.ts +++ b/web/oss/src/components/NoMobilePageWrapper/assets/constants.ts @@ -1,9 +1,9 @@ -// Route segments where the component should be displayed +// List of routes where the component should be displayed export const MOBILE_UNOPTIMIZED_APP_ROUTES = [ - "apps", - "observability", - "settings", - "testsets", - "evaluations", - "workspaces", + "/apps", + "/observability", + "/settings", + "/testsets", + "/evaluations", + "/workspaces", ] diff --git a/web/oss/src/components/ParamsForm/index.tsx b/web/oss/src/components/ParamsForm/index.tsx index c2e71b8721..540306a3b3 100644 --- a/web/oss/src/components/ParamsForm/index.tsx +++ b/web/oss/src/components/ParamsForm/index.tsx @@ -65,16 +65,13 @@ const ParamsForm: React.FC = ({ const imgHeight = imageSize === "small" ? 90 : 120 const chat = inputParams.find((param) => param.name === "chat")?.value - const inputParamsToRender = isChatVariant - ? inputParams.filter((p) => p.name !== "chat") - : inputParams return isChatVariant ? ( <>
    {/*@ts-ignore*/} {(_, formInstance) => { - return inputParamsToRender.map((param, index) => { + return inputParams.map((param, index) => { const type = param.type === "file_url" ? "url" @@ -175,7 +172,7 @@ const ParamsForm: React.FC = ({ {/*@ts-ignore*/} {(_, formInstance) => { - return inputParamsToRender.map((param, index) => { + return inputParams.map((param, index) => { const type = param.type === "file_url" ? "url" diff --git a/web/oss/src/components/Playground/Components/ChatCommon/ControlsBar.tsx b/web/oss/src/components/Playground/Components/ChatCommon/ControlsBar.tsx deleted file mode 100644 index 91383349c2..0000000000 --- a/web/oss/src/components/Playground/Components/ChatCommon/ControlsBar.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from "react" - -import AddButton from "@/oss/components/Playground/assets/AddButton" -import RunButton from "@/oss/components/Playground/assets/RunButton" - -interface Props { - isRunning?: boolean - onRun: () => void - onCancel: () => void - onAddMessage: () => void -} - -const ControlsBar: React.FC = ({isRunning, onRun, onCancel, onAddMessage}) => { - return ( -
    - {!isRunning ? ( - - ) : ( - - )} - -
    - ) -} - -export default ControlsBar diff --git a/web/oss/src/components/Playground/Components/ChatCommon/LastTurnFooterControls.tsx b/web/oss/src/components/Playground/Components/ChatCommon/LastTurnFooterControls.tsx deleted file mode 100644 index eec4f36cb6..0000000000 --- a/web/oss/src/components/Playground/Components/ChatCommon/LastTurnFooterControls.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React, {useMemo} from "react" - -import clsx from "clsx" -import {useAtomValue} from "jotai" - -import AddButton from "@/oss/components/Playground/assets/AddButton" -import RunButton from "@/oss/components/Playground/assets/RunButton" -import {isAnyRunningForLogicalAtomFamily} from "@/oss/state/newPlayground/chat/view" - -interface Props { - logicalId: string - onRun: () => void - onCancelAll: () => void - onAddMessage: () => void - className?: string -} - -const LastTurnFooterControls: React.FC = ({ - logicalId, - onRun, - onCancelAll, - onAddMessage, - className, -}) => { - const isAnyRunning = useAtomValue( - useMemo(() => isAnyRunningForLogicalAtomFamily(logicalId), [logicalId]), - ) as boolean - - return ( -
    - {!isAnyRunning ? ( - - ) : ( - - )} - -
    - ) -} - -export default LastTurnFooterControls diff --git a/web/oss/src/components/Playground/Components/ChatCommon/MessageEditor.tsx b/web/oss/src/components/Playground/Components/ChatCommon/MessageEditor.tsx deleted file mode 100644 index 0f5745294e..0000000000 --- a/web/oss/src/components/Playground/Components/ChatCommon/MessageEditor.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import React, {useMemo} from "react" - -import clsx from "clsx" - -import {EditorProvider} from "@/oss/components/Editor/Editor" -import SimpleDropdownSelect from "@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect" -import SharedEditor from "@/oss/components/Playground/Components/SharedEditor" - -interface MessageEditorProps { - role: string - text: string - disabled?: boolean - className?: string - editorClassName?: string - headerClassName?: string - placeholder?: string - onChangeRole?: (v: string) => void - onChangeText?: (v: string) => void - headerRight?: React.ReactNode - footer?: React.ReactNode - noProvider?: boolean - roleOptions?: {label: string; value: string}[] - enableTokens?: boolean -} - -const MessageEditor: React.FC = ({ - id, - role, - text, - disabled, - className, - editorClassName, - headerClassName, - footerClassName, - placeholder, - onChangeRole, - onChangeText, - headerRight, - headerBottom, - footer, - isJSON, - isTool, - noProvider, - roleOptions, - enableTokens, - ...props -}) => { - // TODO: REPLACE WITH METADATA SELECTOR - const selectOptions = useMemo( - () => - roleOptions ?? [ - {label: "user", value: "user"}, - {label: "assistant", value: "assistant"}, - {label: "system", value: "system"}, - {label: "tool", value: "tool"}, - ], - [roleOptions], - ) - - return ( - -
    - onChangeRole?.(v)} - disabled={disabled} - className="message-user-select" - /> - {headerRight} -
    - {headerBottom} -
    - } - editorType="border" - initialValue={text} - handleChange={(v: string) => onChangeText?.(v)} - editorClassName={editorClassName} - placeholder={placeholder} - disabled={disabled} - className={clsx("relative flex flex-col gap-1 rounded-[theme(spacing.2)]", className)} - footer={footer} - {...props} - editorProps={{ - codeOnly: isJSON, - // disabled: isTool, - noProvider: true, - enableTokens: Boolean(enableTokens), - // tokens: variables, - showToolbar: false, - }} - noProvider={true} - /> - ) -} - -const MessageEditorWrapper = ({isJSON, ...props}) => { - return ( - - - - ) -} - -export default MessageEditorWrapper diff --git a/web/oss/src/components/Playground/Components/Drawers/TestsetDrawer/index.tsx b/web/oss/src/components/Playground/Components/Drawers/TestsetDrawer/index.tsx index ce4e5ac75e..e3d53fb1d9 100644 --- a/web/oss/src/components/Playground/Components/Drawers/TestsetDrawer/index.tsx +++ b/web/oss/src/components/Playground/Components/Drawers/TestsetDrawer/index.tsx @@ -59,33 +59,7 @@ const TestsetDrawerButton = ({ return extractedData }, [resultHashes, results, isTestsetDrawerOpen]) - // Count of valid result hashes (may include failed ones; see validResultsCount for success only) - // const isResults = useMemo(() => resultHashes?.filter(Boolean)?.length, [resultHashes]) - // Count only successful results (those that have response data) - const validResultsCount = useMemo(() => { - // Direct results prop (rare path) - if (results) { - const arr = Array.isArray(results) ? results : [results] - return arr.filter((r: any) => { - const data = - (r?.response?.tree?.nodes?.[0]?.data as Record) || - r?.response?.data - return Boolean(data) - }).length - } - - // Hash-based results (common path) - const hashes = Array.isArray(resultHashes) ? resultHashes : [resultHashes] - return hashes - .map((h) => (h ? getResponseLazy(h) : null)) - .filter(Boolean) - .filter((r: any) => { - const data = - (r?.response?.tree?.nodes?.[0]?.data as Record) || - r?.response?.data - return Boolean(data) - }).length - }, [results, resultHashes]) + const isResults = useMemo(() => resultHashes?.filter(Boolean)?.length, [resultHashes]) return ( <> @@ -96,7 +70,7 @@ const TestsetDrawerButton = ({ }>, { onClick: () => { - if (validResultsCount <= 0) return + if (!isResults) return onClickTestsetDrawer?.(messageId) setIsTestsetDrawerOpen(true) }, @@ -107,10 +81,9 @@ const TestsetDrawerButton = ({ {...props} label={label} icon={icon && } - // Enable only when there is at least one successful generation - disabled={validResultsCount <= 0 || props.disabled} + disabled={!isResults || props.disabled} tooltipProps={{ - title: validResultsCount <= 0 ? "No successful generations to add" : "", + title: !isResults ? "Run tests before adding to test set" : "", }} onClick={() => { onClickTestsetDrawer?.(messageId) diff --git a/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/TraceDrawer.tsx b/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/TraceDrawer.tsx index c677d0bf80..d032b5ade6 100644 --- a/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/TraceDrawer.tsx +++ b/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/TraceDrawer.tsx @@ -1,24 +1,21 @@ -import {useCallback, useEffect, useRef, useState} from "react" +import {useCallback, useEffect, useMemo, useState} from "react" -import {CloseOutlined, FullscreenExitOutlined, FullscreenOutlined} from "@ant-design/icons" -import {Button, Splitter, Spin} from "antd" import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" -import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer" -import useTraceDrawer from "@/oss/components/pages/observability/drawer/hooks/useTraceDrawer" import TraceSidePanel from "@/oss/components/pages/observability/drawer/TraceSidePanel" -import {useObservability} from "@/oss/state/newObservability" -import {useQueryParamState} from "@/oss/state/appState" -import {clearTraceParamAtom} from "@/oss/state/url" - import { - isDrawerOpenAtom, - closeTraceDrawerAtom, - setTraceDrawerActiveSpanAtom, - setTraceDrawerTraceAtom, -} from "./store/traceDrawerStore" + buildNodeTree, + getNodeById, + observabilityTransformer, +} from "@/oss/lib/helpers/observability_helpers" +import useAnnotations from "@/oss/lib/hooks/useAnnotations" +import {attachAnnotationsToTraces} from "@/oss/lib/hooks/useAnnotations/assets/helpers" +import {_AgentaRootsResponse, AgentaNodeDTO} from "@/oss/services/observability/types" + +import {resetTraceDrawerAtom, isDrawerOpenAtom, drawerResultAtom} from "./store/traceDrawerStore" +const GenericDrawer = dynamic(() => import("@/oss/components/GenericDrawer")) const TraceContent = dynamic( () => import("@/oss/components/pages/observability/drawer/TraceContent"), ) @@ -27,167 +24,106 @@ const TraceTree = dynamic(() => import("@/oss/components/pages/observability/dra const TraceDrawer = () => { const open = useAtomValue(isDrawerOpenAtom) - const closeDrawer = useSetAtom(closeTraceDrawerAtom) - const clearTraceParam = useSetAtom(clearTraceParamAtom) + const result = useAtomValue(drawerResultAtom) + const setDrawerState = useSetAtom(resetTraceDrawerAtom) const [selected, setSelected] = useState("") - const {traces, activeSpanId, getTraceById, traceResponse, error, isLoading, traceId} = - useTraceDrawer() - const initialWidth = 1200 - const [drawerWidth, setDrawerWidth] = useState(initialWidth) + const traceSpans = result?.response?.tree + + const {data: annotations} = useAnnotations({ + queries: { + annotation: { + links: + traceSpans?.nodes?.map((node) => ({ + trace_id: node.trace_id, + span_id: node.span_id, + })) || [], + }, + }, + waitUntil: !open, + }) const [isAnnotationsSectionOpen, setIsAnnotationsSectionOpen] = useState(true) - const { - traceTabs, - filters, - sort, - limit, - setSelectedTraceId: setGlobalSelectedTraceId, - setSelectedNode: setGlobalSelectedNode, - } = useObservability() - const setActiveSpan = useSetAtom(setTraceDrawerActiveSpanAtom) - const setTraceDrawerTrace = useSetAtom(setTraceDrawerTraceAtom) - const [, setTraceQueryParam] = useQueryParamState("trace") - const [, setSpanQueryParam] = useQueryParamState("span") - - // Initialize selection when drawer payload changes - const lastPayloadActiveIdRef = useRef(undefined) - - useEffect(() => { - const incomingId = activeSpanId || traces[0]?.span_id || "" - if (!incomingId) { - setSelected("") - lastPayloadActiveIdRef.current = undefined - return - } - - const hasChanged = lastPayloadActiveIdRef.current !== incomingId - lastPayloadActiveIdRef.current = incomingId - - if (hasChanged || !selected) { - setSelected(incomingId) - } - }, [activeSpanId, traces, selected]) - // If current selection is not found in the latest traces (e.g., user clicked a different row), re-anchor - useEffect(() => { - if (selected && traces.length > 0) { - const exists = getTraceById(selected) - if (!exists) { - setSelected(activeSpanId || traces[0]?.span_id || "") - } + const traces = useMemo(() => { + if (traceSpans) { + const rawTraces = traceSpans.nodes + .flatMap((node) => buildNodeTree(node as AgentaNodeDTO)) + .flatMap((item: any) => observabilityTransformer(item)) + return attachAnnotationsToTraces(rawTraces, annotations || []) } - }, [selected, traces, activeSpanId, getTraceById]) + return [] + }, [traceSpans, annotations]) + + const activeTrace = useMemo( + () => + traces + ? (traces[0] ?? null) + : result?.error + ? ({ + exception: result?.metadata?.rawError, + node: {name: "Exception"}, + status: {code: "ERROR"}, + } as _AgentaRootsResponse) + : null, + [traces, result], + ) useEffect(() => { - if (selected) { - setActiveSpan(selected) - setSpanQueryParam(selected, {shallow: true}) - } else { - setSpanQueryParam(undefined, {shallow: true}) + if (!selected) { + setSelected(activeTrace?.node.id ?? "") } - }, [selected, setActiveSpan, setSpanQueryParam]) - - // Keep component mounted; EnhancedDrawer handles destroyOnHidden. We gate heavy work via memos. - - const activeId = selected || traces[0]?.span_id || "" - const activeTrace = getTraceById(activeId) + }, [activeTrace, selected]) - const handleAfterOpenChange = useCallback( - (isOpen: boolean) => { - if (!isOpen) { - clearTraceParam() - setSpanQueryParam(undefined, {shallow: true}) - } - }, - [clearTraceParam, setSpanQueryParam], + const selectedItem = useMemo( + () => (traces?.length ? getNodeById(traces, selected) : null), + [selected, traces], ) - const header = ( -
    -
    - ) + const handleClose = useCallback(() => { + setDrawerState({open: false, result: null}) + setSelected("") + }, [setDrawerState]) return ( - + ) : null + } + mainContent={ + activeTrace ? ( + + ) : null + } + sideContent={ + activeTrace ? ( + + ) : null + } + extraContent={ + isAnnotationsSectionOpen && + selectedItem && + } + externalKey={`extraContent-${isAnnotationsSectionOpen}`} className="[&_.ant-drawer-body]:p-0" - > -
    - -
    - - - - - - - - {isAnnotationsSectionOpen && ( - - - - )} - -
    -
    -
    -
    + /> ) } diff --git a/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/index.tsx b/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/index.tsx index 188aca2a00..a0cde5a78d 100644 --- a/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/index.tsx +++ b/web/oss/src/components/Playground/Components/Drawers/TraceDrawer/index.tsx @@ -1,14 +1,16 @@ -import {cloneElement, isValidElement, useCallback, useMemo} from "react" +import {cloneElement, isValidElement, useCallback, useEffect, useMemo, useState} from "react" import {TreeView} from "@phosphor-icons/react" import {Button} from "antd" import clsx from "clsx" -import {useSetAtom} from "jotai" -import {useQueryParamState} from "@/oss/state/appState" - -import {openTraceDrawerAtom, setTraceDrawerActiveSpanAtom} from "./store/traceDrawerStore" +import {traceDrawerJotaiStore, traceDrawerAtom} from "./store/traceDrawerStore" import {TraceDrawerButtonProps} from "./types" +import {buildNodeTree, observabilityTransformer} from "@/oss/lib/helpers/observability_helpers" +import {_AgentaRootsResponse, AgentaNodeDTO} from "@/oss/services/observability/types" +import {attachAnnotationsToTraces} from "@/oss/lib/hooks/useAnnotations/assets/helpers" +import useAnnotations from "@/oss/lib/hooks/useAnnotations" +import {useAtomValue} from "jotai" const TraceDrawerButton = ({ label, @@ -17,127 +19,72 @@ const TraceDrawerButton = ({ result, ...props }: TraceDrawerButtonProps) => { - const setActiveSpan = useSetAtom(setTraceDrawerActiveSpanAtom) - const openTraceDrawer = useSetAtom(openTraceDrawerAtom) - const [, setTraceQueryParam] = useQueryParamState("trace") - const [, setSpanQueryParam] = useQueryParamState("span") - - const traceId = useMemo(() => { - const directTraceId = - result?.response?.trace_id || result?.metadata?.rawError?.detail?.trace_id - if (directTraceId) return directTraceId - - const responseTrace = (result as any)?.response?.trace - if (responseTrace?.trace_id) return responseTrace.trace_id - - const nodes = (result as any)?.response?.tree?.nodes - const extractTraceId = (value: any): string | null => { - if (!value) return null - if (Array.isArray(value)) { - for (const entry of value) { - const found = extractTraceId(entry) - if (found) return found - } - return null - } - if (typeof value === "object") { - return ( - value.trace_id || - value.span_id || - value?.node?.trace_id || - value?.node?.id || - null - ) - } - return null - } - - if (!nodes) return undefined - if (Array.isArray(nodes)) { - return extractTraceId(nodes) - } - - for (const value of Object.values(nodes)) { - const found = extractTraceId(value) - if (found) return found + const [selected, setSelected] = useState("") + const {open} = useAtomValue(traceDrawerAtom) + const traceSpans = result?.response?.tree + + const {data: annotations} = useAnnotations({ + queries: { + annotation: { + links: + traceSpans?.nodes?.map((node) => ({ + trace_id: node?.trace_id, + span_id: node?.span_id, + })) || [], + }, + }, + waitUntil: !open, + }) + + const traces = useMemo(() => { + if (traceSpans) { + const rawTraces = traceSpans.nodes + .flatMap((node) => buildNodeTree(node as AgentaNodeDTO)) + .flatMap((item: any) => observabilityTransformer(item)) + return attachAnnotationsToTraces(rawTraces, annotations || []) } - - return undefined - }, [result]) + return [] + }, [traceSpans, annotations]) const handleOpen = useCallback(() => { - if (!traceId) return - - const deriveActiveSpan = (): string | null => { - const nodes = (result as any)?.response?.tree?.nodes - if (!nodes) return null - - const pickSpan = (node: any) => node?.span_id || node?.trace_id || null - - if (Array.isArray(nodes)) { - return pickSpan(nodes[0]) - } - - const first = Object.values(nodes)[0] - if (Array.isArray(first)) { - return pickSpan(first[0]) - } - - return pickSpan(first) - } + traceDrawerJotaiStore.set(traceDrawerAtom, {open: true, result}) + }, []) + + const activeTrace = useMemo( + () => + traces + ? traces[0] ?? null + : result?.error + ? ({ + exception: result?.metadata?.rawError, + node: {name: "Exception"}, + status: {code: "ERROR"}, + } as _AgentaRootsResponse) + : null, + [traces], + ) - const nextActiveSpan = deriveActiveSpan() - openTraceDrawer({traceId, activeSpanId: nextActiveSpan}) - setActiveSpan(nextActiveSpan) - setTraceQueryParam(traceId, {shallow: true}) - if (nextActiveSpan) { - setSpanQueryParam(nextActiveSpan, {shallow: true}) - } else { - setSpanQueryParam(undefined, {shallow: true}) + useEffect(() => { + if (!selected) { + setSelected(activeTrace?.node.id ?? "") } - }, [traceId, result, openTraceDrawer, setActiveSpan, setTraceQueryParam, setSpanQueryParam]) - - const hasTrace = useMemo(() => { - const nodes = (result as any)?.response?.tree?.nodes - const hasNodes = (() => { - if (!nodes) return false - if (Array.isArray(nodes)) { - return nodes.length > 0 - } - if (typeof nodes === "object") { - return Object.values(nodes).some((value) => { - if (!value) return false - if (Array.isArray(value)) { - return value.length > 0 - } - if (typeof value === "object") { - return Object.keys(value).length > 0 - } - return false - }) - } - return false - })() + }, [activeTrace, selected]) - return hasNodes || Boolean(result?.response?.trace) || Boolean(result?.error) - }, [result]) + const hasTrace = !!result?.response?.tree?.nodes?.length || !!result?.error return ( <> {isValidElement(children) ? ( - cloneElement( - children as React.ReactElement<{onClick: () => void; loading?: boolean}>, - { - onClick: handleOpen, - }, - ) + cloneElement(children as React.ReactElement<{onClick: () => void}>, { + onClick: handleOpen, + }) ) : ( -
    - - ) : ( + /** + * Scroll Sync Login + * to be extracted to a custom hook once it is refined and tested + */ + + const [configPanelRef, setConfigPanelRef] = useState(null) + const [generationPanelRef, setGenerationPanelRef] = useState(null) + const scrollingRef = useRef<{ + scrolling: HTMLElement + target: HTMLElement + } | null>(null) + + useAnimationFrame(({time}) => { + const isScrolling = scrollingRef.current + + if (!isScrolling || !configPanelRef) return + + const {scrolling, target} = isScrolling + + if (scrolling && target) { + target.scrollLeft = scrolling.scrollLeft + } + }) + + useEffect(() => { + const configPanel = configPanelRef + + const scrollHandle = (e: Event) => { + if (scrollingRef.current) return + if (!isComparisonView) return + + const elm = e.target as HTMLElement + + const scrolling = elm.isSameNode(configPanel) ? configPanel : generationPanelRef + + if (!scrolling) return + + const target = scrolling!.isSameNode(configPanel) ? generationPanelRef : configPanel + + if (!target) return + + scrollingRef.current = { + scrolling, + target, + } + } + const scrollEndHandle = () => { + scrollingRef.current = null + } + + if (configPanel) { + configPanel.addEventListener("scroll", scrollHandle) + configPanel.addEventListener("scrollend", scrollEndHandle) + } + + if (generationPanelRef) { + generationPanelRef.addEventListener("scroll", scrollHandle) + generationPanelRef.addEventListener("scrollend", scrollEndHandle) + } + + return () => { + if (configPanel) { + configPanel.removeEventListener("scroll", scrollHandle) + configPanel.removeEventListener("scroll", scrollEndHandle) + } + + if (generationPanelRef) { + generationPanelRef.removeEventListener("scroll", scrollHandle) + generationPanelRef.removeEventListener("scroll", scrollEndHandle) + } + } + }, [isComparisonView, configPanelRef, generationPanelRef]) + + return (
    - {isComparisonView && - (shouldShowVariantConfigSkeleton ? ( - - ) : ( - - ))} - {shouldShowVariantConfigSkeleton ? ( - - ) : ( - (displayedVariants || []).map((variant, index) => { - // Handle both object and string cases for displayedVariants - const variantId = - typeof variant === "string" ? variant : variant?.id - - return ( -
    { - variantRefs.current[index] = el - }} - > - -
    - ) - }) )} + {(displayedVariants || []).map((variantId, index) => { + return ( +
    { + variantRefs.current[index] = el + }} + > + +
    + ) + })} @@ -195,6 +200,7 @@ const PlaygroundMainView = ({className, isLoading = false, ...divProps}: MainLay key={`${isComparisonView ? "comparison" : "single"}-splitter-panel-runs`} > {isComparisonView && } +
    ) : null} - {/* ATOM-LEVEL OPTIMIZATION: Generation components using focused atom subscriptions - Comparison view: Uses rowIds from generationRowIdsAtom (chat/input rows) - Single view: Uses displayedVariants for individual variant generations */} - {shouldShowGenerationSkeleton ? ( - - ) : isComparisonView ? ( - - ) : ( - (displayedVariants || []).map((variantId) => { - // return null - return ( - - ) - }) - )} + {/* This component renders Output components based on the view type. + If the view is 'comparison', it uses generationData to render the component. + In 'single' view, it uses the variant id to render the component. */} + {isComparisonView + ? ((rowIds as string[]) || []).map((rowId, rowIndex) => { + return ( +
    + {/*
    */} + +
    + ) + }) + : (displayedVariants || []).map((variantId) => { + return ( + + ) + })}
    @@ -247,4 +258,4 @@ const PlaygroundMainView = ({className, isLoading = false, ...divProps}: MainLay ) } -export default memo(PlaygroundMainView) +export default PlaygroundMainView diff --git a/web/oss/src/components/Playground/Components/Menus/PlaygroundCreateNewVariant/assets/CreateNewVariantList.tsx b/web/oss/src/components/Playground/Components/Menus/PlaygroundCreateNewVariant/assets/CreateNewVariantList.tsx index 5bf128075a..44184d2829 100644 --- a/web/oss/src/components/Playground/Components/Menus/PlaygroundCreateNewVariant/assets/CreateNewVariantList.tsx +++ b/web/oss/src/components/Playground/Components/Menus/PlaygroundCreateNewVariant/assets/CreateNewVariantList.tsx @@ -3,13 +3,9 @@ import {useState, useMemo, useCallback} from "react" import {Check} from "@phosphor-icons/react" import {Button, Input} from "antd" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" import {useDebounceValue} from "usehooks-ts" -import { - toggleVariantDisplayMutationAtom, - variantListDisplayFilteredAtomFamily, -} from "../../../../state/atoms" +import usePlayground from "../../../../hooks/usePlayground" import NewVariantButton from "../../../Modals/CreateVariantModal/assets/NewVariantButton" import {useStyles} from "./styles" @@ -27,19 +23,22 @@ const CreateNewVariantList = ({ const [debouncedQuery] = useDebounceValue(query, 300) - // Use filtered display list from atoms - const variantsDisplay = useAtomValue(variantListDisplayFilteredAtomFamily(debouncedQuery)) - const toggleVariantDisplay = useSetAtom(toggleVariantDisplayMutationAtom) + const {variantsList, toggleVariantDisplay} = usePlayground({ + stateSelector: (state) => ({ + variantsList: state.variants.map((variant) => ({ + variantId: variant.id, + variantName: variant.variantName, + })), + }), + }) - const variantsList = useMemo(() => { - return (variantsDisplay || []).map((v: any) => ({ - variantId: v.id, - variantName: v.name, - })) - }, [variantsDisplay]) - - // Atom already filters; keep memoized mapped list only - const filteredVariants = variantsList + // Memoized filtered variants + const filteredVariants = useMemo(() => { + if (!debouncedQuery) return variantsList + return variantsList.filter((variant) => + variant.variantName.toLowerCase().includes(debouncedQuery), + ) + }, [variantsList, debouncedQuery]) const handleSearch = useCallback((e: React.ChangeEvent) => { const value = e.target.value diff --git a/web/oss/src/components/Playground/Components/Menus/PlaygroundGenerationVariableMenu/index.tsx b/web/oss/src/components/Playground/Components/Menus/PlaygroundGenerationVariableMenu/index.tsx index c4796a79c3..b953bda503 100644 --- a/web/oss/src/components/Playground/Components/Menus/PlaygroundGenerationVariableMenu/index.tsx +++ b/web/oss/src/components/Playground/Components/Menus/PlaygroundGenerationVariableMenu/index.tsx @@ -30,12 +30,12 @@ const PlaygroundGenerationVariableMenu: React.FC -
    Add to testset
    +
    Add to test set
    ), icon: , diff --git a/web/oss/src/components/Playground/Components/Menus/PlaygroundVariantHeaderMenu/index.tsx b/web/oss/src/components/Playground/Components/Menus/PlaygroundVariantHeaderMenu/index.tsx index c7073012ab..5ee73db332 100644 --- a/web/oss/src/components/Playground/Components/Menus/PlaygroundVariantHeaderMenu/index.tsx +++ b/web/oss/src/components/Playground/Components/Menus/PlaygroundVariantHeaderMenu/index.tsx @@ -2,18 +2,11 @@ import {useCallback, useMemo} from "react" import {MoreOutlined} from "@ant-design/icons" import {ArrowCounterClockwise, Copy, PencilSimple, Trash} from "@phosphor-icons/react" -import {Button, Dropdown, MenuProps, message} from "antd" -import {useAtomValue, useSetAtom} from "jotai" +import {Button, Dropdown, MenuProps} from "antd" -import {selectedVariantsAtom} from "@/oss/components/Playground/state/atoms" -import {parametersOverrideAtomFamily} from "@/oss/components/Playground/state/atoms" -import {clearLocalCustomPropsForRevisionAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import { - clearLocalPromptsForRevisionAtomFamily, - clearLocalTransformedPromptsForRevisionAtomFamily, -} from "@/oss/state/newPlayground/core/prompts" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" -import {removeVariantFromSelectionMutationAtom} from "../../../state/atoms/variantCrudMutations" import DeleteVariantButton from "../../Modals/DeleteVariantModal/assets/DeleteVariantButton" import {PlaygroundVariantHeaderMenuProps} from "./types" @@ -22,43 +15,31 @@ const PlaygroundVariantHeaderMenu: React.FC = variantId, ...props }) => { - const selectedVariants = useAtomValue(selectedVariantsAtom) - const removeVariantFromSelection = useSetAtom(removeVariantFromSelectionMutationAtom) - - const closePanelDisabled = useMemo(() => { - return selectedVariants.length === 1 && selectedVariants.includes(variantId) - }, [selectedVariants, variantId]) + const {mutate, closePanelDisabled} = usePlayground({ + stateSelector: useCallback( + (state: PlaygroundStateData) => { + return { + closePanelDisabled: + state.selected.length === 1 && state.selected.includes(variantId), + } + }, + [variantId], + ), + }) const handleClosePanel = useCallback(() => { - removeVariantFromSelection(variantId) - }, [removeVariantFromSelection, variantId]) - - const clearPrompts = useSetAtom(clearLocalPromptsForRevisionAtomFamily(variantId || "") as any) - const clearTransformed = useSetAtom( - clearLocalTransformedPromptsForRevisionAtomFamily(variantId || "") as any, - ) - const clearCustomProps = useSetAtom( - clearLocalCustomPropsForRevisionAtomFamily(variantId || "") as any, - ) - const setParamsOverride = useSetAtom(parametersOverrideAtomFamily(variantId || "") as any) + mutate((clonedState) => { + if (!clonedState) return clonedState + const previousSelected = [...clonedState.selected] + previousSelected.splice( + previousSelected.findIndex((id) => id === variantId), + 1, + ) - const handleDiscardDraft: NonNullable = (e) => { - e?.domEvent?.stopPropagation() - if (!variantId) return - try { - clearPrompts() - clearCustomProps() - clearTransformed() - setParamsOverride(null) - // Prune dynamically added variables and re-add current ones based on prompts - - message.success("Draft changes discarded") - } catch (err) { - message.error("Failed to discard draft changes") - - console.error(err) - } - } + clonedState.selected = previousSelected + return clonedState + }) + }, [variantId]) const items: MenuProps["items"] = useMemo( () => [ @@ -81,13 +62,6 @@ const PlaygroundVariantHeaderMenu: React.FC = }, }, {type: "divider"}, - { - key: "revert", - label: "Revert Changes", - icon: , - onClick: handleDiscardDraft, - disabled: !variantId, - }, { key: "clone", label: "Clone", @@ -126,7 +100,7 @@ const PlaygroundVariantHeaderMenu: React.FC = }, }, ], - [handleClosePanel, closePanelDisabled, variantId, handleDiscardDraft], + [handleClosePanel, closePanelDisabled, variantId], ) return ( diff --git a/web/oss/src/components/Playground/Components/Menus/SelectVariant/index.tsx b/web/oss/src/components/Playground/Components/Menus/SelectVariant/index.tsx index 82e2ebd88a..ff665e2b9d 100644 --- a/web/oss/src/components/Playground/Components/Menus/SelectVariant/index.tsx +++ b/web/oss/src/components/Playground/Components/Menus/SelectVariant/index.tsx @@ -3,58 +3,101 @@ import {useCallback, useMemo, useState} from "react" import {ArrowsLeftRight} from "@phosphor-icons/react" import {TreeSelect, Typography} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" +import groupBy from "lodash/groupBy" +import uniqBy from "lodash/uniqBy" import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" import EnvironmentStatus from "@/oss/components/VariantDetailsWithStatus/components/EnvironmentStatus" +import {CamelCaseEnvironment} from "@/oss/lib/Types" import AddButton from "../../../assets/AddButton" -import {variantOptionsAtomFamily} from "../../../state/atoms/optionsSelectors" +import usePlayground from "../../../hooks/usePlayground" +import {PlaygroundStateData} from "../../../hooks/usePlayground/types" import TreeSelectItemRenderer from "./assets/TreeSelectItemRenderer" import {SelectVariantProps} from "./types" -const SelectVariant = ({value, showAsCompare = false, ...props}: SelectVariantProps) => { +const SelectVariant = ({showAsCompare = false, ...props}: SelectVariantProps) => { const [searchTerm, setSearchTerm] = useState("") + const {revisionParents} = usePlayground({ + stateSelector: useCallback((state: PlaygroundStateData) => { + const parents = groupBy(state.availableRevisions || [], "variantId") - // Use optimized selector atom with deep equality checks - const variantOptionsAtom = useMemo(() => variantOptionsAtomFamily(searchTerm), [searchTerm]) - const baseOptions = useAtomValue(variantOptionsAtom) + return { + revisionParents: parents, + } + }, []), + }) - // Create final options with JSX titles (since JSX can't be in atoms) const variantOptions = useMemo(() => { - return baseOptions.map((option) => ({ - ...option, - title: ( -
    - - {option.variantName} - - -
    - ), - children: option.children.map((child) => ({ - ...child, + const options = Object.values(revisionParents).map((variantRevisions) => { + const deployedIn = uniqBy( + variantRevisions.reduce((acc, rev) => { + return [...acc, ...(rev.deployedIn || [])] + }, [] as CamelCaseEnvironment[]) as CamelCaseEnvironment[], + (env) => env.name, + ) + + return { title: ( -
    - + + {variantRevisions[0].variantName} + +
    ), - })), - })) - }, [baseOptions]) + selectable: false, + label: variantRevisions[0].variantName, + value: variantRevisions[0].variantId, + children: variantRevisions + .sort((a, b) => b.createdAtTimestamp - a.createdAtTimestamp) + .map((revision) => { + return { + title: ( +
    + +
    + ), + label: revision.variantName, + revisionNumber: revision.revisionNumber, + value: revision.id, + } + }), + } + }) + + if (searchTerm) { + const lower = searchTerm.toLowerCase() + + return options + .map((opt) => { + const parentMatches = opt.label.toLowerCase().includes(lower) + const children = parentMatches + ? opt.children + : opt.children.filter((child) => + child.revisionNumber.toString().includes(lower), + ) + + return {...opt, children} + }) + .filter((opt) => opt.label.toLowerCase().includes(lower) || opt.children.length > 0) + } + + return options + }, [revisionParents, searchTerm]) const [isOpenCompareSelect, setIsOpenCompareSelect] = useState(false) const [isOpenSelect, setIsOpenSelect] = useState(false) @@ -70,40 +113,28 @@ const SelectVariant = ({value, showAsCompare = false, ...props}: SelectVariantPr
    v.id)} - value={value} open={isOpenCompareSelect} - classNames={{ - popup: { - root: clsx([ - "!w-[280px] pt-0", - "[&_.ant-select-tree-checkbox]:hidden", - "[&_.ant-select-tree-treenode-checkbox-checked>.ant-select-tree-node-content-wrapper]:bg-[#F5F7FA]", - "[&_.ant-select-tree-node-content-wrapper]:!pl-1", - "[&_.ant-select-tree-switcher]:!mx-0 [&_.ant-select-tree-switcher]:!me-0", - "[&_.ant-select-tree-treenode-active]:!bg-transparent", - "[&_.ant-select-tree-switcher-noop]:!hidden", - "[&_.ant-select-tree-treenode-leaf_.ant-select-tree-node-content-wrapper]:!pl-0", - "&_span.ant-select-tree-node-content-wrapper]:w-[calc(100%-24px)]", - "[&_.ant-select-tree-node-content-wrapper]:!pl-2 [&_.ant-select-tree-node-content-wrapper]:flex [&_.ant-select-tree-node-content-wrapper]:items-center [&_.ant-select-tree-node-content-wrapper]:!justify-between [&_.ant-select-tree-node-content-wrapper]:!rounded-md", - "[&_.ant-select-tree-switcher]:flex [&_.ant-select-tree-switcher]:items-center [&_.ant-select-tree-switcher]:justify-center", - "[&_.ant-select-tree-title]:w-full", - ]), - }, - }} onOpenChange={(isOpen) => setIsOpenCompareSelect(isOpen)} + popupClassName={clsx([ + "!w-[280px] pt-0", + "[&_.ant-select-tree-checkbox]:hidden", + "[&_.ant-select-tree-treenode-checkbox-checked>.ant-select-tree-node-content-wrapper]:bg-[#F5F7FA]", + "[&_.ant-select-tree-node-content-wrapper]:!pl-1", + "[&_.ant-select-tree-switcher]:!mx-0 [&_.ant-select-tree-switcher]:!me-0", + "[&_.ant-select-tree-treenode-active]:!bg-transparent", + "[&_.ant-select-tree-switcher-noop]:!hidden", + "[&_.ant-select-tree-treenode-leaf_.ant-select-tree-node-content-wrapper]:!pl-0", + "[&_span.ant-select-tree-node-content-wrapper]:w-[calc(100%-24px)]", + "[&_.ant-select-tree-node-content-wrapper]:!pl-2 [&_.ant-select-tree-node-content-wrapper]:flex [&_.ant-select-tree-node-content-wrapper]:items-center [&_.ant-select-tree-node-content-wrapper]:!justify-between [&_.ant-select-tree-node-content-wrapper]:!rounded-md", + "[&_.ant-select-tree-switcher]:flex [&_.ant-select-tree-switcher]:items-center [&_.ant-select-tree-switcher]:justify-center", + "[&_.ant-select-tree-title]:w-full", + ])} className="w-full opacity-0 relative z-[2]" - styles={{ - popup: { - root: {maxHeight: 400, overflow: "auto"}, - }, - }} + dropdownStyle={{maxHeight: 400, overflow: "auto"}} size="small" treeData={variantOptions} - // fieldNames={{value: "value", label: "label", children: "children"}} - // treeData={[]} tagRender={() =>
    } - popupRender={(menu) => ( + dropdownRender={(menu) => (
    ) : ( - <> - setIsOpenSelect(isOpen)} - style={{width: 120}} - styles={{popup: {root: {maxHeight: 400, overflow: "auto"}}}} - size="small" - placeholder="Select variant" - treeData={variantOptions} - treeNodeLabelProp="label" - popupRender={(menu) => ( - - )} - treeDefaultExpandAll - treeExpandAction="click" - classNames={{ - popup: { - root: clsx([ - "!w-[280px] pt-0", - "[&_.ant-select-tree-switcher-noop]:!hidden", - "[&_.ant-select-tree-node-content-wrapper]:!pl-1", - "[&_.ant-select-tree-treenode-leaf_.ant-select-tree-node-content-wrapper]:!pl-0", - "[&_span.ant-select-tree-node-content-wrapper]:w-[calc(100%-24px)]", - "[&_.ant-select-tree-switcher]:!me-0", - "[&_.ant-select-tree-node-content-wrapper]:!pl-2 [&_.ant-select-tree-node-content-wrapper]:flex [&_.ant-select-tree-node-content-wrapper]:items-center [&_.ant-select-tree-node-content-wrapper]:!justify-between [&_.ant-select-tree-node-content-wrapper]:!rounded-md", - "[&_.ant-select-tree-switcher]:flex [&_.ant-select-tree-switcher]:items-center [&_.ant-select-tree-switcher]:justify-center", - "[&_.ant-select-tree-title]:w-full", - ]), - }, - }} - /> - {/* null */} - + setIsOpenSelect(isOpen)} + style={{width: 120}} + dropdownStyle={{maxHeight: 400, overflow: "auto"}} + size="small" + placeholder="Select variant" + treeData={variantOptions} + treeNodeLabelProp="label" + dropdownRender={(menu) => ( + + )} + treeDefaultExpandAll + treeExpandAction="click" + popupClassName={clsx([ + "!w-[280px] pt-0", + "[&_.ant-select-tree-switcher-noop]:!hidden", + "[&_.ant-select-tree-node-content-wrapper]:!pl-1", + "[&_.ant-select-tree-treenode-leaf_.ant-select-tree-node-content-wrapper]:!pl-0", + "[&_span.ant-select-tree-node-content-wrapper]:w-[calc(100%-24px)]", + "[&_.ant-select-tree-switcher]:!me-0", + "[&_.ant-select-tree-node-content-wrapper]:!pl-2 [&_.ant-select-tree-node-content-wrapper]:flex [&_.ant-select-tree-node-content-wrapper]:items-center [&_.ant-select-tree-node-content-wrapper]:!justify-between [&_.ant-select-tree-node-content-wrapper]:!rounded-md", + "[&_.ant-select-tree-switcher]:flex [&_.ant-select-tree-switcher]:items-center [&_.ant-select-tree-switcher]:justify-center", + "[&_.ant-select-tree-title]:w-full", + ])} + /> )} ) diff --git a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton/index.tsx b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton/index.tsx index 3c79487967..4a97059b86 100644 --- a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton/index.tsx @@ -1,12 +1,9 @@ -import {cloneElement, isValidElement, useEffect, useState} from "react" +import {cloneElement, isValidElement, useState} from "react" import {FloppyDiskBack} from "@phosphor-icons/react" import {Button} from "antd" -import {useAtomValue} from "jotai" import dynamic from "next/dynamic" -import {variantIsDirtyAtomFamily} from "@/oss/components/Playground/state/atoms" - import {CommitVariantChangesButtonProps} from "../types" const CommitVariantChangesModal = dynamic(() => import("../.."), {ssr: false}) @@ -20,7 +17,6 @@ const CommitVariantChangesButton = ({ ...props }: CommitVariantChangesButtonProps) => { const [isDeployModalOpen, setIsDeployModalOpen] = useState(false) - const disabled = !useAtomValue(variantIsDirtyAtomFamily(variantId || "")) return ( <> @@ -40,20 +36,21 @@ const CommitVariantChangesButton = ({ type="text" icon={icon && } onClick={() => setIsDeployModalOpen(true)} - disabled={disabled} {...props} > {label} )} - setIsDeployModalOpen(false)} - variantId={variantId} - onSuccess={onSuccess} - commitType={commitType} - /> + {variantId ? ( + setIsDeployModalOpen(false)} + variantId={variantId} + onSuccess={onSuccess} + commitType={commitType} + /> + ) : null} ) } diff --git a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesModalContent/index.tsx b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesModalContent/index.tsx index 7114bd1f7d..205026da52 100644 --- a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesModalContent/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesModalContent/index.tsx @@ -1,17 +1,12 @@ -import {useCallback, useEffect, useRef} from "react" +import {useCallback} from "react" import {ArrowRight} from "@phosphor-icons/react" -import {Checkbox, Input, Radio, RadioChangeEvent, Select, Tooltip, Typography} from "antd" -import {useAtomValue} from "jotai" +import {Input, Radio, RadioChangeEvent, Typography} from "antd" -import DiffView from "@/oss/components/Editor/DiffView" import CommitNote from "@/oss/components/Playground/assets/CommitNote" import Version from "@/oss/components/Playground/assets/Version" -import EnvironmentTagLabel, {deploymentStatusColors} from "@/oss/components/EnvironmentTagLabel" -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms" -import {newestRevisionForVariantIdAtomFamily} from "@/oss/components/Playground/state/atoms" -import {parametersOverrideAtomFamily} from "@/oss/components/Playground/state/atoms" -import {transformedPromptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" import {CommitVariantChangesModalContentProps} from "../types" @@ -23,221 +18,68 @@ const CommitVariantChangesModalContent = ({ setNote, selectedCommitType, setSelectedCommitType, - commitType, - shouldDeploy, - onToggleDeploy, - selectedEnvironment, - onSelectEnvironment, - isDeploymentPending, }: CommitVariantChangesModalContentProps) => { - // Get variant metadata and derived prompts (prefers local cache, falls back to spec) - const variant = useAtomValue(variantByRevisionIdAtomFamily(variantId)) as any - // const prompts = useAtomValue(promptsAtomFamily(variantId)) || [] - - // Guard against undefined variant during commit invalidation (after hooks) - if (!variant) { - return ( -
    -
    - Loading variant data... -
    -
    - ) - } - - // Extract values from the variant object (safe now) - const variantName = variant.variantName - const revision = variant.revision - // Determine target revision based on the latest revision number for this variant, not the base - const latestRevisionForVariant = useAtomValue( - newestRevisionForVariantIdAtomFamily(variant?.variantId || ""), - ) as any - const targetRevision = Number(latestRevisionForVariant?.revision ?? 0) + 1 - - // Compose a minimal EnhancedVariant-like object using current prompts - // const composedVariant = { - // ...variant, - // prompts, - // } as any - // Read both sources: prompt-derived params and any JSON override from the editor - const derivedAgConfig = useAtomValue(transformedPromptsAtomFamily(variantId))?.ag_config - const jsonOverride = useAtomValue(parametersOverrideAtomFamily(variantId)) - const params = commitType === "parameters" && jsonOverride ? jsonOverride : derivedAgConfig - // const params = - // transformToRequestBody({variant: composedVariant})?.ag_config - const oldParams = variant.parameters - - const onChange = useCallback( - (e: RadioChangeEvent) => { - setSelectedCommitType({...selectedCommitType, type: e.target.value}) - }, - [selectedCommitType, setSelectedCommitType], - ) - - // Snapshot diff content using refs (no re-renders, computed on first mount) - const initialOriginalRef = useRef(null) - const initialModifiedRef = useRef(null) - - // Reset refs when the target variant changes - useEffect(() => { - initialOriginalRef.current = null - initialModifiedRef.current = null - }, [variantId]) - - // Compute snapshot lazily on first render after mount - if (variant && initialOriginalRef.current === null && initialModifiedRef.current === null) { - try { - initialOriginalRef.current = JSON.stringify(variant.parameters) - // Use the same transformed local prompts ag_config that drives dirty-state - if (params !== undefined) { - initialModifiedRef.current = JSON.stringify(params) + const {variantName, revision, targetRevision} = usePlayground({ + variantId, + hookId: "CommitVariantChangesModal", + variantSelector: useCallback((variant: EnhancedVariant) => { + return { + variantName: variant.variantName, + revision: variant.revision as number, + targetRevision: variant._parentVariant.revision + 1, } - } catch { - // Keep refs null; we will fall back to live values below - } - } + }, []), + }) - const environmentOptions = ( - Object.keys(deploymentStatusColors) as Array - ).map((env) => ({ - value: env, - label: , - })) - - // Ensure DiffView gets strings even when params are undefined - const originalForDiff = initialOriginalRef.current ?? JSON.stringify(oldParams ?? {}) - const modifiedForDiff = initialModifiedRef.current ?? JSON.stringify(params ?? oldParams ?? {}) + const onChange = (e: RadioChangeEvent) => { + setSelectedCommitType({...selectedCommitType, type: e.target.value}) + } return ( -
    -
    -
    - - How would you like to save the changes? - -
    -
    - - - As a new version - - - - - -
    - {variantName} -
    - - - -
    -
    -
    - -
    - - - As a new variant - - - - - -
    - - setSelectedCommitType((prev) => { - const prevType = prev?.type - const guaranteedType: "version" | "variant" = - prevType === "version" || prevType === "variant" - ? prevType - : "variant" - return { - type: guaranteedType, - name: e.target.value, - } - }) - } - suffix={} - /> -
    -
    -
    -
    - -
    -
    - onToggleDeploy(event.target.checked)} - disabled={isDeploymentPending} - > - - Deploy after commit - - - - - - + setSelectedCommitType({...selectedCommitType, name: e.target.value}) + } /> +
    -
    -
    +
    + + + ) } diff --git a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/types.d.ts b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/types.d.ts index 76e5bf9854..0555ee5b90 100644 --- a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/types.d.ts +++ b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/assets/types.d.ts @@ -29,10 +29,4 @@ export interface CommitVariantChangesModalContentProps { setNote: React.Dispatch> selectedCommitType: SelectedCommitType | null setSelectedCommitType: React.Dispatch> - commitType?: CommitType - shouldDeploy: boolean - onToggleDeploy: (value: boolean) => void - selectedEnvironment: string | null - onSelectEnvironment: (value: string | null) => void - isDeploymentPending: boolean } diff --git a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/index.tsx b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/index.tsx index 9f267b2bb4..3498d7321f 100644 --- a/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/CommitVariantChangesModal/index.tsx @@ -1,21 +1,12 @@ -import {type ReactElement, useCallback, useEffect, useMemo, useState} from "react" +import {useCallback, useState} from "react" import {FloppyDiskBack} from "@phosphor-icons/react" -import {message} from "antd" -import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" -import {Resizable} from "react-resizable" import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" -import { - revisionListAtom, - saveVariantMutationAtom, - selectedVariantsAtom, - variantByRevisionIdAtomFamily, -} from "@/oss/components/Playground/state/atoms" - -import {createVariantMutationAtom} from "../../../state/atoms/variantCrudMutations" -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {getAllRevisionsLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" import {CommitVariantChangesModalProps, SelectedCommitType} from "./assets/types" const CommitVariantChangesModalContent = dynamic( @@ -29,335 +20,93 @@ const CommitVariantChangesModal: React.FC = ({ commitType, ...props }) => { - const {onCancel, ...modalProps} = props - // Get variant metadata from revision list - const revisions = useAtomValue(revisionListAtom) - const variant = revisions?.find((rev: any) => rev.id === variantId) - - // Extract values from variant - const variantName = variant?.variantName - - // Get mutation functions - const saveVariant = useSetAtom(saveVariantMutationAtom) - const createVariant = useSetAtom(createVariantMutationAtom) - const {isPending: isPublishing, mutateAsync: publish} = useAtomValue(publishMutationAtom) - - // Track loading state for mutations - const [isMutating, setIsMutating] = useState(false) - // Defer closing the modal until the UI actually swaps to target - const [waitForRevisionId, setWaitForRevisionId] = useState(undefined) - const [waitForVariantId, setWaitForVariantId] = useState(undefined) + const {saveVariant, addVariant, baseRevisionId, isMutating, variantName} = usePlayground({ + variantId, + hookId: "CommitVariantChangesModal", + variantSelector: useCallback( + (variant: EnhancedVariant) => { + return { + isMutating: variant.__isMutating, + variantName: variant.variantName, + baseRevisionId: variant.id, + } + }, + [variantId], + ), + }) const [selectedCommitType, setSelectedCommitType] = useState({ type: "version", }) const [note, setNote] = useState("") - const [shouldDeploy, setShouldDeploy] = useState(false) - const [selectedEnvironment, setSelectedEnvironment] = useState(null) - const [modalSize, setModalSize] = useState({width: 960, height: 640}) - const [viewport, setViewport] = useState({width: 0, height: 0}) const onClose = useCallback(() => { - onCancel?.({} as any) + props.onCancel?.({} as any) setSelectedCommitType({ type: "version", }) setNote("") - setShouldDeploy(false) - setSelectedEnvironment(null) - }, [onCancel]) - - // Observe current selected revision(s) to know when swap completes - const selectedRevisionIds = useAtomValue(selectedVariantsAtom) - const currentSelectedRevisionId = selectedRevisionIds?.[0] || "" - const currentSelectedVariant = useAtomValue( - variantByRevisionIdAtomFamily(currentSelectedRevisionId), - ) - - // Track viewport to clamp the resizable modal - useEffect(() => { - if (typeof window === "undefined") return - const updateViewport = () => - setViewport({width: window.innerWidth, height: window.innerHeight}) - updateViewport() - window.addEventListener("resize", updateViewport) - return () => window.removeEventListener("resize", updateViewport) }, []) - const computedMaxWidth = useMemo(() => { - if (!viewport.width) return 960 - return Math.min(Math.max(viewport.width - 48, 480), 1200) - }, [viewport.width]) - - const computedMaxHeight = useMemo(() => { - if (!viewport.height) return 640 - return Math.min(Math.max(viewport.height - 160, 400), 900) - }, [viewport.height]) - - const minConstraints = useMemo(() => { - return [Math.min(720, computedMaxWidth), Math.min(480, computedMaxHeight)] as [ - number, - number, - ] - }, [computedMaxWidth, computedMaxHeight]) - - const maxConstraints = useMemo(() => { - return [computedMaxWidth, computedMaxHeight] as [number, number] - }, [computedMaxWidth, computedMaxHeight]) - - useEffect(() => { - if (!viewport.width || !viewport.height) return - setModalSize((previous) => ({ - width: Math.min(Math.max(previous.width, minConstraints[0]), computedMaxWidth), - height: Math.min(Math.max(previous.height, minConstraints[1]), computedMaxHeight), - })) - }, [viewport, minConstraints, computedMaxWidth, computedMaxHeight]) - - // Close when the swap we wait for is satisfied - useEffect(() => { - if (waitForRevisionId && selectedRevisionIds?.includes(waitForRevisionId)) { - setIsMutating(false) - onClose() - setWaitForRevisionId(undefined) - } else if ( - waitForVariantId && - currentSelectedVariant?._parentVariant?.id && - currentSelectedVariant?._parentVariant?.id === waitForVariantId - ) { - setIsMutating(false) - onClose() - setWaitForVariantId(undefined) - } - }, [ - selectedRevisionIds, - currentSelectedVariant?._parentVariant?.id, - waitForRevisionId, - waitForVariantId, - onClose, - ]) - - const handleDeployAfterCommit = useCallback( - async (resultVariant?: any) => { - if (!shouldDeploy || !selectedEnvironment) { - return - } - - try { - const variantLike = resultVariant || currentSelectedVariant || {} - const variantIdForDeployment = - variantLike?.variant_id || - variantLike?.variantId || - variantLike?._parentVariant || - variant?.variantId || - currentSelectedVariant?._parentVariant || - currentSelectedVariant?.variantId - - const revisionIdForDeployment = - resultVariant?.id || - resultVariant?.revision_id || - waitForRevisionId || - waitForVariantId || - currentSelectedVariant?.id || - variantId - - if (!variantIdForDeployment) { - message.error("Unable to deploy because the variant identifier is missing.") - return - } - - await publish({ - type: "variant", - variant_id: variantIdForDeployment, - revision_id: revisionIdForDeployment ?? undefined, - environment_name: selectedEnvironment, - note, - }) - - message.success(`Deployment to ${selectedEnvironment} started`) - } catch (error) { - console.error("Failed to deploy after commit", error) - message.error("Failed to deploy to the selected environment.") - } - }, - [ - shouldDeploy, - selectedEnvironment, - publish, - note, - currentSelectedVariant, - variant, - waitForRevisionId, - waitForVariantId, - variantId, - ], - ) - const onSaveVariantChanges = useCallback(async () => { - try { - setIsMutating(true) - - if (selectedCommitType?.type === "version") { - const result = await saveVariant?.({ - variantId, - note, - commitType, - }) - - if (result?.success) { - // Reset commit-ready state after successful commit - onSuccess?.({ - revisionId: result.variant?.id, - variantId: result.variant?.variantId, - }) + if (selectedCommitType?.type === "version") { + await saveVariant?.(note, commitType, (variant) => { + onSuccess?.({revisionId: variant?._revisionId}) + }) + } else if (selectedCommitType?.type === "variant" && selectedCommitType?.name) { + addVariant?.({ + note, + commitType, + baseVariantName: variantName, + newVariantName: selectedCommitType?.name as string, + callback: (variant, state) => { + state.selected = [ + ...state.selected.filter((id) => id !== baseRevisionId), + variant.id, + ] + + const originalBaseVariant = getAllRevisionsLazy().find( + (v) => v.id === baseRevisionId, + ) as EnhancedVariant + + const newVariants = [...state.variants] + newVariants.splice( + newVariants.findIndex((v) => v.id === baseRevisionId), + 1, + originalBaseVariant, + ) - await handleDeployAfterCommit(result.variant) - - // Wait for the selected revision to reflect the new revision id - if (result.variant?.id) { - setWaitForRevisionId(result.variant.id) - } - } - } else if (selectedCommitType?.type === "variant" && selectedCommitType?.name) { - const result = await createVariant?.({ - revisionId: variantId, - baseVariantName: variantName || "", - newVariantName: selectedCommitType?.name as string, - note, - callback: (newVariant, state) => { - // For new variant creation, switch to display ONLY the newly created variant - // This is different from revision creation where we stay on the same variant - state.selected = [newVariant.id] - state.variants = [newVariant.id] - }, - }) - - if (result?.success) { - // For variant creation, we get a variant object back, not a revision - // The variant creation atom handles finding the matching revision and updating the URL - // We just need to pass the variant ID to the onSuccess callback - const newVariantId = result.variant?.variant_id - - // The onSuccess callback doesn't need a revisionId for variant creation - // since the variant creation atom handles the UI switch via URL update onSuccess?.({ - revisionId: undefined, // Will be determined by variant creation atom - variantId: newVariantId, + revisionId: variant?._revisionId, + variantId: variant._parentVariant.variantId, }) - await handleDeployAfterCommit(result.variant) + state.variants = newVariants - // Wait for the selected revision to belong to the newly created variant id - if (newVariantId) { - setWaitForVariantId(newVariantId) - } - } - } - } catch (error) { - console.error("Failed to commit variant changes:", error) - message.error("We couldn't save your changes. Please try again.") - } finally { - // Only close immediately if we're not waiting for the UI to reflect the swap - // (Keep isMutating true while waiting to prevent interactions) - if (!waitForRevisionId && !waitForVariantId) { - setIsMutating(false) - onClose() - } + return state + }, + }) } - }, [ - selectedCommitType, - saveVariant, - createVariant, - note, - variantName, - onSuccess, - variantId, - commitType, - handleDeployAfterCommit, - waitForRevisionId, - waitForVariantId, - onClose, - ]) - - const isOkDisabled = - !selectedCommitType?.type || - (selectedCommitType?.type === "variant" && !selectedCommitType?.name) || - (shouldDeploy && !selectedEnvironment) - - const modalRender = useCallback( - (modalNode: ReactElement) => ( - - setModalSize({width: data.size.width, height: data.size.height}) - } - handle={ - event.stopPropagation()} - /> - } - resizeHandles={["se"]} - handleSize={[18, 18]} - draggableOpts={{enableUserSelectHack: false}} - > -
    - {modalNode} -
    -
    - ), - [modalSize, minConstraints, maxConstraints], - ) - const isDeploymentPending = isMutating || (shouldDeploy && isPublishing) + onClose() + }, [selectedCommitType, baseRevisionId, saveVariant, addVariant, note]) return ( , - disabled: isOkDisabled, + disabled: + !selectedCommitType?.type || + (selectedCommitType?.type == "variant" && !selectedCommitType?.name), }} classNames={{footer: "flex items-center justify-end"}} - width={modalSize.width} - style={{ - maxWidth: maxConstraints[0], - }} - styles={{ - content: { - display: "flex", - flexDirection: "column", - height: "100%", - maxHeight: maxConstraints[1], - }, - body: { - display: "flex", - flexDirection: "column", - flex: 1, - minHeight: 0, - overflow: "auto", - }, - footer: { - display: "flex", - justifyContent: "flex-end", - gap: 8, - flexShrink: 0, - position: "sticky", - bottom: 0, - background: "#fff", - }, - }} - modalRender={modalRender} - {...modalProps} + afterClose={() => onClose()} + {...props} > = ({ setNote={setNote} setSelectedCommitType={setSelectedCommitType} selectedCommitType={selectedCommitType} - commitType={commitType} - shouldDeploy={shouldDeploy} - onToggleDeploy={setShouldDeploy} - selectedEnvironment={selectedEnvironment} - onSelectEnvironment={setSelectedEnvironment} - isDeploymentPending={isDeploymentPending} /> ) diff --git a/web/oss/src/components/Playground/Components/Modals/CreateVariantModal/index.tsx b/web/oss/src/components/Playground/Components/Modals/CreateVariantModal/index.tsx index 44b1d2f3f9..ceadd4fe0e 100644 --- a/web/oss/src/components/Playground/Components/Modals/CreateVariantModal/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/CreateVariantModal/index.tsx @@ -1,18 +1,13 @@ -import {type FC, useState, useCallback, useMemo} from "react" +import {type FC, useState, useCallback} from "react" -import {useAtomValue, useSetAtom} from "jotai" import groupBy from "lodash/groupBy" import dynamic from "next/dynamic" import {message} from "@/oss/components/AppMessageContext" import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" -import { - revisionListAtom, - selectedVariantsAtom, - setDisplayedVariantsMutationAtom, -} from "@/oss/components/Playground/state/atoms" -import {createVariantMutationAtom} from "../../../state/atoms/variantCrudMutations" +import usePlayground from "../../../hooks/usePlayground" +import {PlaygroundStateData} from "../../../hooks/usePlayground/types" import {CreateVariantModalProps} from "./types" @@ -30,79 +25,56 @@ const CreateVariantModal: FC = ({ const [newVariantName, setNewVariantName] = useState("") const [baseVariantName, setBaseVariantName] = useState("default") const [note, setNote] = useState("") - const [isSubmitting, setIsSubmitting] = useState(false) - const revisions = useAtomValue(revisionListAtom) - const createVariant = useSetAtom(createVariantMutationAtom) - const currentSelectedVariants = useAtomValue(selectedVariantsAtom) - const setDisplayedVariants = useSetAtom(setDisplayedVariantsMutationAtom) + const {addVariant, baseVariant, variantOptions} = usePlayground({ + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const parents = groupBy(state.availableRevisions, "variantId") + const baseVariant = (state.availableRevisions || []).find( + (variant) => variant.variantName === baseVariantName, + ) - const {baseVariant, variantOptions} = useMemo(() => { - const parents = groupBy(revisions, "variantId") - const baseVariant = revisions.find((variant) => variant.variantName === baseVariantName) - - return { - baseVariant: { - id: baseVariant?.variantId, - variantName: baseVariant?.variantName, - }, - variantOptions: Object.values(parents).map((variantRevisions) => { - const rev = variantRevisions[0] return { - id: rev.id, - variantName: rev.variantName, + baseVariant: { + id: baseVariant?.variantId, + variantName: baseVariant?.variantName, + }, + variantOptions: Object.values(parents).map((variantRevisions) => { + const rev = variantRevisions[0] + return { + id: rev.id, + variantName: rev.variantName, + } + }), } - }), - } - }, [revisions, baseVariantName]) + }, + [baseVariantName], + ), + }) // Validate and create new variants based on selected template - const addNewVariant = useCallback(async () => { + const addNewVariant = useCallback(() => { if (!baseVariant || !baseVariant.variantName) { message.error("Template variant not found. Please choose a valid variant.") return } - try { - setIsSubmitting(true) - const result = await createVariant({ - baseVariantName: baseVariant.variantName, - newVariantName: newVariantName, - note: note, - callback: (variant, state) => { - if (isCompareMode) { - // Add new variant to existing selection (comparison mode) - state.selected = [...currentSelectedVariants, variant.id] - } else { - // Replace current selection with new variant (single mode) - state.selected = [variant.id] - } - }, - }) - - if (!result || !result.success) { - const errMsg = result?.error || "Failed to create variant" - message.error(errMsg) - return - } - - // Close modal on success (now that UI can render the new variant) - propsSetIsModalOpen(false) - message.success(`Variant "${newVariantName}" created successfully`) - } catch (error) { - message.error(`Failed to create variant: ${error.message}`) - } finally { - setIsSubmitting(false) - } - }, [ - isCompareMode, - baseVariant, - createVariant, - newVariantName, - note, - currentSelectedVariants, - setDisplayedVariants, - propsSetIsModalOpen, - ]) + addVariant?.({ + baseVariantName: baseVariant.variantName, + newVariantName: newVariantName, + note: note, + callback: (variant, state) => { + if (isCompareMode) { + state.selected = [...state.selected, variant.id] + state.variants = [...state.variants, variant] + } else { + // remove existing variant + + state.selected = [variant.id] + state.variants = [variant] + } + }, + }) + }, [isCompareMode, baseVariant, addVariant, newVariantName]) const setIsModalOpen = useCallback( (value: boolean) => { @@ -125,15 +97,13 @@ const CreateVariantModal: FC = ({ open={isModalOpen} onOk={() => { if (isInputValid) { + setIsModalOpen(false) addNewVariant() } }} okText="Confirm" onCancel={() => setIsModalOpen(false)} - okButtonProps={{ - disabled: !isInputValid || !baseVariantName || isSubmitting, - loading: isSubmitting, - }} // Disable OK button if input is not valid + okButtonProps={{disabled: !isInputValid || !baseVariantName}} // Disable OK button if input is not valid > void -} - -const DeleteVariantContent = ({variantId, onClose}: Props) => { - // Focused atom family to avoid subscribing to a large list - const variant = useAtomValue(variantByRevisionIdAtomFamily(variantId)) as any - const deleteVariant = useSetAtom(deleteVariantMutationAtom) - - const [checking, setChecking] = useState(true) - const [canDelete, setCanDelete] = useState(null) - - // Derive parent variant id from revision to resolve display name - const parentVariantId = (variant?._parentVariant ?? variant?.variantId) as string | undefined - const parentDisplayName = useAtomValue( - parentVariantDisplayNameAtomFamily(parentVariantId || ""), - ) - - const {variantName, isMutating} = useMemo(() => { - return { - variantName: (parentDisplayName as string) || "-", - isMutating: (variant as any)?.__isMutating || false, - } - }, [parentDisplayName, variant]) - - // On mount, verify if resource is eligible for deletion - useEffect(() => { - let mounted = true - ;(async () => { - try { - const ok = await checkIfResourceValidForDeletion({ - resourceType: "variant", - resourceIds: [variantId], - }) - if (mounted) setCanDelete(ok) - } catch (e) { - if (mounted) setCanDelete(false) - } finally { - if (mounted) setChecking(false) - } - })() - return () => { - mounted = false - } - }, [variantId]) - - const onDeleteVariant = useCallback(async () => { - try { - const res = (await deleteVariant({variantId})) as any - if (res?.success) { - onClose() - } else { - console.error("Failed to delete variant:", res?.error || "unknown error") - } - } catch (error) { - console.error("Failed to delete variant:", error) - } - }, [deleteVariant, variantId, onClose]) - - // Loading state during pre-check - if (checking) { - return ( -
    - - Checking if this variant can be deleted… -
    - ) - } - - // Blocked state if not deletable - if (canDelete === false) { - return ( -
    - This variant cannot be deleted because it is currently in use. -
    - -
    -
    - ) - } - - // Ready state - return ( -
    -
    -
    - You are about to delete: - -
    - This action is not reversible. Deleting the revision will also -
    - -
    - - -
    -
    - ) -} - -export default DeleteVariantContent diff --git a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/DeleteVariantModalWrapper.tsx b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/DeleteVariantModalWrapper.tsx deleted file mode 100644 index 2c6d872c02..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/DeleteVariantModalWrapper.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" - -import { - closeDeleteVariantModalAtom, - deleteVariantModalOpenAtom, - deleteVariantModalVariantIdAtom, -} from "./store/deleteVariantModalStore" - -import DeleteVariantModal from "." - -const DeleteVariantModalWrapper = () => { - const open = useAtomValue(deleteVariantModalOpenAtom) - const variantId = useAtomValue(deleteVariantModalVariantIdAtom) - const close = useSetAtom(closeDeleteVariantModalAtom) - - if (!variantId) return null - - return close()} variantId={variantId} /> -} - -export default DeleteVariantModalWrapper diff --git a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/assets/DeleteVariantButton/index.tsx b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/assets/DeleteVariantButton/index.tsx index 3e19699b2d..29946007f3 100644 --- a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/assets/DeleteVariantButton/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/assets/DeleteVariantButton/index.tsx @@ -1,12 +1,11 @@ -import {cloneElement, isValidElement} from "react" +import {cloneElement, isValidElement, useState} from "react" import {Trash} from "@phosphor-icons/react" import {Button} from "antd" -import {useSetAtom} from "jotai" - -import {openDeleteVariantModalAtom} from "../../store/deleteVariantModalStore" +import dynamic from "next/dynamic" import {DeleteVariantButtonProps} from "./types" +const DeleteVariantModal = dynamic(() => import("../.."), {ssr: false}) const DeleteVariantButton = ({ variantId, @@ -15,7 +14,8 @@ const DeleteVariantButton = ({ children, ...props }: DeleteVariantButtonProps) => { - const openDeleteModal = useSetAtom(openDeleteVariantModalAtom) + const [isDeleteVariantModalOpen, setIsDeleteVariantModalOpen] = useState(false) + return ( <> {isValidElement(children) ? ( @@ -24,19 +24,29 @@ const DeleteVariantButton = ({ onClick: () => void }>, { - onClick: () => openDeleteModal(variantId), + onClick: () => { + setIsDeleteVariantModalOpen(true) + }, }, ) ) : ( )} + + {isDeleteVariantModalOpen && ( + setIsDeleteVariantModalOpen(false)} + variantId={variantId} + /> + )} ) } diff --git a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/index.tsx b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/index.tsx index 22798f376f..e633e81aca 100644 --- a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/index.tsx @@ -1,19 +1,73 @@ -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" +import {useCallback} from "react" -import DeleteVariantContent from "./Content" +import {Trash} from "@phosphor-icons/react" +import {Modal, Typography} from "antd" + +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {findVariantById} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" + +import {useStyles} from "./styles" import {DeleteVariantModalProps} from "./types" -type EnhancedProps = Omit, "children"> -type Props = EnhancedProps & DeleteVariantModalProps +const {Text} = Typography + +const DeleteVariantModal: React.FC = ({variantId, ...props}) => { + const classes = useStyles() + const {deleteVariant, isMutating, viewType, variantName, setSelectedVariant, _variantIds} = + usePlayground({ + variantId, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variant = findVariantById(state, variantId) + const _variantIds = state.variants.map((variant) => variant.id) + + return { + isMutating: variant?.__isMutating, + variantName: variant?.variantName, + _variantIds, + } + }, + [variantId], + ), + }) + + const onClose = useCallback(() => { + props.onCancel?.({} as any) + }, []) + + const onDeleteVariant = useCallback(() => { + const itemIndex = _variantIds?.findIndex((id) => id === variantId) as number + if (itemIndex === -1) return + + deleteVariant?.().then(() => { + onClose() + }) + }, [deleteVariant, _variantIds, viewType, setSelectedVariant]) -const DeleteVariantModal = ({variantId, ...props}: Props) => { return ( - - props.onCancel?.({} as any)} - /> - + }} + classNames={{footer: "flex items-center justify-end"}} + {...props} + > +
    + This action is not reversible. Deleting the variant will also + +
    + You are about to delete: + + {variantName} +
    +
    +
    ) } diff --git a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/store/deleteVariantModalStore.ts b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/store/deleteVariantModalStore.ts deleted file mode 100644 index edbadda87f..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/store/deleteVariantModalStore.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {atom} from "jotai" - -interface DeleteVariantModalState { - open: boolean - variantId?: string -} - -export const deleteVariantModalAtom = atom({open: false}) - -export const openDeleteVariantModalAtom = atom(null, (get, set, variantId: string) => { - set(deleteVariantModalAtom, {open: true, variantId}) -}) - -export const closeDeleteVariantModalAtom = atom(null, (get, set) => { - set(deleteVariantModalAtom, {open: false, variantId: undefined}) -}) - -export const deleteVariantModalOpenAtom = atom((get) => get(deleteVariantModalAtom).open) -export const deleteVariantModalVariantIdAtom = atom((get) => get(deleteVariantModalAtom).variantId) diff --git a/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/styles.ts b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/styles.ts new file mode 100644 index 0000000000..9674d82c02 --- /dev/null +++ b/web/oss/src/components/Playground/Components/Modals/DeleteVariantModal/styles.ts @@ -0,0 +1,11 @@ +import {createUseStyles} from "react-jss" + +import {JSSTheme} from "@/oss/lib/Types" + +export const useStyles = createUseStyles((theme: JSSTheme) => ({ + heading: { + fontSize: theme.fontSizeLG, + lineHeight: theme.lineHeightLG, + fontWeight: theme.fontWeightMedium, + }, +})) diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/DeployVariantModalWrapper.tsx b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/DeployVariantModalWrapper.tsx deleted file mode 100644 index 81a5573038..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/DeployVariantModalWrapper.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" - -import {closeDeployVariantModalAtom, deployVariantModalAtom} from "./store/deployVariantModalStore" - -import DeployVariantModal from "./index" - -const DeployVariantModalWrapper = () => { - const state = useAtomValue(deployVariantModalAtom) - const close = useSetAtom(closeDeployVariantModalAtom) - - return ( - close()} - parentVariantId={state.parentVariantId} - revisionId={state.revisionId} - variantName={state.variantName} - revision={state.revision} - mutate={state.mutate} - /> - ) -} - -export default DeployVariantModalWrapper diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton/index.tsx b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton/index.tsx index 66a3083005..80e80b8d49 100644 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton/index.tsx @@ -1,11 +1,12 @@ -import {cloneElement, isValidElement, useMemo, useState} from "react" +import {cloneElement, isValidElement, useCallback, useState} from "react" import {CloudArrowUp} from "@phosphor-icons/react" -import {useAtomValue} from "jotai" import dynamic from "next/dynamic" import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {PlaygroundStateData} from "@/oss/lib/hooks/useStatelessVariants/types" +import {findRevisionDeployment} from "@/oss/lib/shared/variant/utils" import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" import {DeployVariantButtonProps} from "./types" @@ -26,23 +27,74 @@ const DeployVariantButton = ({ mutate: mutateEnv, isEnvironmentsLoading, } = useEnvironments() + const { + environments, + variantName, + revision, + mutate: mutatePlayground, + } = usePlayground({ + variantId: revisionId || variantId, + hookId: "DeployVariantModal", + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variant = state.availableRevisions?.find((rev) => rev.id === revisionId) + return { + variantName: variant?.variantName || "", + revision: variant?.revisionNumber || "", + _revisionId: variant?.id || "", + environments: _environments.map((env) => { + const deployedAppRevisionId = env.deployed_app_variant_revision_id + const revision = state.availableRevisions?.find( + (rev) => rev.id === deployedAppRevisionId, + ) + return { + ...env, + revision: revision, + } + }), + } + }, + [_environments, variantId, revisionId], + ), + }) + + const onSuccess = useCallback(async () => { + const newEnvironmentsData = await mutateEnv() // refetch environments or chain using .then + + mutatePlayground((state) => { + const newEnv = newEnvironmentsData.map((env) => ({ + name: env.name, + appId: env.app_id, + deployedAppVariantId: env.deployed_app_variant_id, + deployedVariantName: env.deployed_variant_name, + deployedAppVariantRevisionId: env.deployed_app_variant_revision_id, + revision: env.revision, + })) - // Focused read for the specific revision's metadata - const variant = useAtomValue(variantByRevisionIdAtomFamily(revisionId)) as any + // map available revisions and update each of them using the new environments data + if (state.availableRevisions && state.availableRevisions.length > 0) { + state.availableRevisions?.forEach((availableRevision) => { + if (availableRevision) { + availableRevision.deployedIn = findRevisionDeployment( + availableRevision.id, + newEnv, + ) + } + }) + } - const {environments, variantName, revision} = useMemo(() => { - return { - variantName: variant?.variantName || "", - revision: (variant as any)?.revisionNumber ?? (variant as any)?.revision ?? "", - environments: _environments, - } - }, [variant, _environments]) + // update already mounted data in state.revisions + if (state.variants && state.variants.length > 0) { + state.variants?.forEach((revision) => { + if (revision) { + revision.deployedIn = findRevisionDeployment(revision.id, newEnv) + } + }) + } - const onSuccess = async () => { - // Just refetch environments - the revisionListAtom will automatically update - // when the deployment state changes through SWR revalidation - await mutateEnv() - } + return state + }) + }, []) return ( <> diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/index.tsx b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/index.tsx index 89dbd4c557..91b5a00445 100644 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/index.tsx @@ -1,24 +1,27 @@ import {useMemo} from "react" -import {Typography, Table} from "antd" +import {Typography, Table, Tag} from "antd" import {ColumnsType} from "antd/es/table" -import {useAtom, useAtomValue} from "jotai" import EnvironmentTagLabel from "@/oss/components/EnvironmentTagLabel" import CommitNote from "@/oss/components/Playground/assets/CommitNote" import Version from "@/oss/components/Playground/assets/Version" -import VariantNameCell from "@/oss/components/VariantNameCell" -import {deployNoteAtom, deploySelectedEnvAtom} from "../../store/deployVariantModalStore" +import {ExtendedEnvironment} from "../../types" -import {deployModalEnvironmentsTableAtom, type DeployModalEnvRow} from "./tableDataAtom" +import {DeployVariantModalContentProps} from "./types" -const DeployVariantModalContent = ({variantName, revision, isLoading}: any) => { - const data = useAtomValue(deployModalEnvironmentsTableAtom) - const [selectedEnvName, setSelectedEnvName] = useAtom(deploySelectedEnvAtom) - const [note, setNote] = useAtom(deployNoteAtom) - - const columns: ColumnsType = useMemo( +const DeployVariantModalContent = ({ + selectedEnvName, + setSelectedEnvName, + variantName, + revision, + environments, + isLoading, + note, + setNote, +}: DeployVariantModalContentProps) => { + const columns: ColumnsType = useMemo( () => [ { title: "Environment", @@ -38,15 +41,27 @@ const DeployVariantModalContent = ({variantName, revision, isLoading}: any) => { onHeaderCell: () => ({ style: {minWidth: 160}, }), - render: (_, record) => ( - - ), + render: (_, record) => { + return record.deployed_variant_name ? ( +
    + {record.revision ? ( +
    + {record.revision.name}{" "} + +
    + ) : ( + + No deployment + + )} +
    + ) : ( + "-" + ) + }, }, ], - [], + [environments], ) return ( @@ -68,7 +83,7 @@ const DeployVariantModalContent = ({variantName, revision, isLoading}: any) => { loading={isLoading} className={`ph-no-capture`} columns={columns} - dataSource={data as any} + dataSource={environments} rowKey="name" pagination={false} bordered diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/tableDataAtom.ts b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/tableDataAtom.ts deleted file mode 100644 index f45b6953fe..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantModalContent/tableDataAtom.ts +++ /dev/null @@ -1,33 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {selectAtom} from "jotai/utils" - -import {environmentsLoadableAtom} from "@/oss/state/environment/atoms/fetcher" - -// Row shape strictly needed by the table -export interface DeployModalEnvRow { - name: string - deployedAppVariantRevisionId?: string | null -} - -const PLACEHOLDER_ROWS: DeployModalEnvRow[] = [{name: "dev"}, {name: "stage"}, {name: "prod"}] - -// Lean selector for the Deploy Variant modal table -// - Only exposes fields used by the table -// - Bakes in placeholders when environments are loading or empty -export const deployModalEnvironmentsTableAtom = selectAtom( - environmentsLoadableAtom, - (loadable: any) => { - const isLoading = loadable?.isLoading ?? loadable?.isFetching - const envs = loadable?.data ?? null - - if (isLoading || !Array.isArray(envs) || envs.length === 0) { - return PLACEHOLDER_ROWS - } - - return (envs as any[]).map((e) => ({ - name: e?.name, - deployedAppVariantRevisionId: e?.deployedAppVariantRevisionId ?? null, - })) as DeployModalEnvRow[] - }, - deepEqual, -) diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/index.tsx b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/index.tsx index b420d947fe..97dc641822 100644 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/index.tsx @@ -1,21 +1,14 @@ -import {useCallback, useEffect} from "react" +import {useCallback, useState} from "react" import {Rocket} from "@phosphor-icons/react" -import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" import router from "next/router" import {message} from "@/oss/components/AppMessageContext" import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" import {usePostHogAg} from "@/oss/lib/helpers/analytics/hooks/usePostHogAg" -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" +import {createPublishVariant, createPublishRevision} from "@/oss/services/deployment/api" -import { - deploySelectedEnvAtom, - deployResetAtom, - deploySubmitAtom, - deployVariantModalAtom, -} from "./store/deployVariantModalStore" import {DeployVariantModalProps} from "./types" const DeployVariantModalContent = dynamic(() => import("./assets/DeployVariantModalContent"), { @@ -23,8 +16,8 @@ const DeployVariantModalContent = dynamic(() => import("./assets/DeployVariantMo }) const DeployVariantModal = ({ - parentVariantId, variantId, + environments, revisionId, variantName, revision, @@ -33,56 +26,49 @@ const DeployVariantModal = ({ ...props }: DeployVariantModalProps) => { const posthog = usePostHogAg() - const selectedEnvName = useAtomValue(deploySelectedEnvAtom) - const resetDeploy = useSetAtom(deployResetAtom) - const submitDeploy = useSetAtom(deploySubmitAtom) - const setModalState = useSetAtom(deployVariantModalAtom) - const {isPending: isLoading} = useAtomValue(publishMutationAtom) - const appId = router.query.app_id as string + const [selectedEnvName, setSelectedEnvName] = useState([]) + const [note, setNote] = useState("") + const [isLoading, setIsLoading] = useState(false) - // Ensure Jotai store has the necessary identifiers when this modal is used directly - useEffect(() => { - const next = { - parentVariantId: parentVariantId ?? variantId ?? null, - revisionId: revisionId ?? null, - variantName, - revision, - mutate, - } - setModalState((prev) => ({...prev, ...next})) - }, [parentVariantId, variantId, revisionId, variantName, revision, mutate, setModalState]) + const appId = router.query.app_id as string const onClose = useCallback(() => { props.onCancel?.({} as any) - resetDeploy() - }, [resetDeploy, props]) + setSelectedEnvName([]) + setNote("") + }, []) const deployVariants = useCallback(async () => { - // Ensure latest props are in the store before submitting - const next = { - parentVariantId: parentVariantId ?? variantId ?? null, - revisionId: revisionId ?? null, - variantName, - revision, - mutate, - } - console.debug("[DeployModal] pre-submit sync", next) - setModalState((prev) => ({...prev, ...next})) + const selectEnv = selectedEnvName[0] + try { + setIsLoading(true) + + if (variantId) { + await createPublishVariant({ + note, + variant_id: variantId, + environment_name: selectEnv, + }) + } else { + await createPublishRevision({ + note, + revision_id: revisionId, + environment_ref: selectEnv, + }) + } + + onClose() + mutate?.() - const result = await submitDeploy({ - parentVariantId: next.parentVariantId, - revisionId: next.revisionId, - }) - if (!result?.ok) { - if (result?.error) message.error(result.error) - return + message.success(`Published ${variantName} to ${selectEnv}`) + posthog?.capture?.("app_deployed", {app_id: appId, environment: selectEnv}) + } catch (error) { + message.error("Failed to deploy variants. Please try again") + } finally { + setIsLoading(false) } - const env = result.env as string - onClose() - message.success(`Published ${variantName} to ${env}`) - posthog?.capture?.("app_deployed", {app_id: appId, environment: env}) - }, [submitDeploy, onClose, variantName, appId, posthog]) + }, [createPublishVariant, revision, revisionId, variantId, selectedEnvName, note]) return ( ) diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/store/deployVariantModalStore.ts b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/store/deployVariantModalStore.ts deleted file mode 100644 index 2fac20a87e..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/store/deployVariantModalStore.ts +++ /dev/null @@ -1,129 +0,0 @@ -import {atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" - -interface DeployVariantModalState { - open: boolean - parentVariantId?: string | null - revisionId?: string | null - variantName?: string - revision?: number | string - mutate?: () => void -} - -export const deployVariantModalAtom = atomWithImmer({ - open: false, -}) - -export const openDeployVariantModalAtom = atom( - null, - ( - get, - set, - params: { - parentVariantId?: string | null - revisionId?: string | null - variantName: string - revision: number | string - mutate?: () => void - }, - ) => { - console.debug("[DeployModal] open", params) - set(deployVariantModalAtom, (draft) => { - draft.open = true - if ("parentVariantId" in params) draft.parentVariantId = params.parentVariantId ?? null - if ("revisionId" in params) draft.revisionId = params.revisionId ?? null - if ("variantName" in params) draft.variantName = params.variantName - if ("revision" in params) draft.revision = params.revision - if ("mutate" in params) draft.mutate = params.mutate - }) - }, -) - -export const closeDeployVariantModalAtom = atom(null, (get, set) => { - set(deployVariantModalAtom, (draft) => { - draft.open = false - }) -}) - -// Local modal state managed via atoms -export const deploySelectedEnvAtom = atom([]) -export const deployNoteAtom = atom("") - -export const deployResetAtom = atom(null, (get, set) => { - set(deploySelectedEnvAtom, []) - set(deployNoteAtom, "") -}) - -// Async submit action. Optional overrides allow providing ids directly. -// Returns { ok: boolean, env?: string, error?: string } -export const deploySubmitAtom = atom( - null, - async (get, set, overrides?: {parentVariantId?: string | null; revisionId?: string | null}) => { - const baseState = get(deployVariantModalAtom) - const state = { - ...baseState, - parentVariantId: overrides?.parentVariantId ?? baseState.parentVariantId ?? null, - revisionId: overrides?.revisionId ?? baseState.revisionId ?? null, - } - const selectedEnvName = get(deploySelectedEnvAtom) - const note = get(deployNoteAtom) - const {mutateAsync: publish} = get(publishMutationAtom) - - // Debug current state before proceeding - console.debug("[DeployModal] submit:start", { - state, - overrides, - selectedEnvName, - note, - }) - - const env = selectedEnvName[0] - if (!env) { - console.debug("[DeployModal] submit:fail", {reason: "no_env_selected"}) - return {ok: false, error: "No environment selected"} - } - if (!state.parentVariantId && !state.revisionId) { - console.debug("[DeployModal] submit:fail", { - reason: "missing_ids", - parentVariantId: state.parentVariantId, - revisionId: state.revisionId, - }) - return {ok: false, error: "Missing revision to deploy."} - } - - console.debug("[DeployModal] submit:overrides", overrides) - - try { - console.debug("[DeployModal] submit:publish", { - mode: state.parentVariantId ? "variant" : "revision", - parentVariantId: state.parentVariantId, - revisionId: state.revisionId, - env, - }) - await publish( - state.parentVariantId - ? { - type: "variant" as const, - variant_id: state.parentVariantId, - environment_name: env, - note, - revision_id: state.revisionId || undefined, - } - : { - type: "revision" as const, - revision_id: state.revisionId as string, - environment_ref: env, - note, - }, - ) - // success; keep state for UI to clear/close - console.debug("[DeployModal] submit:success", {env}) - return {ok: true, env} - } catch (e: any) { - console.debug("[DeployModal] submit:error", {error: e}) - return {ok: false, error: e?.message || "Failed to deploy"} - } - }, -) diff --git a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/types.d.ts b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/types.d.ts index a3390f5f01..f98d5f209a 100644 --- a/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/types.d.ts +++ b/web/oss/src/components/Playground/Components/Modals/DeployVariantModal/types.d.ts @@ -10,12 +10,9 @@ export interface ExtendedEnvironment extends Environment { } } export interface DeployVariantModalProps extends ModalProps { - /** When deploying a whole variant (not a specific revision). Synonym: variantId. */ - parentVariantId?: string - /** Optional alias supported by DeployVariantButton */ variantId?: string revisionId?: string - environments?: ExtendedEnvironment[] + environments: ExtendedEnvironment[] variantName: string revision: number | string isLoading?: boolean diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/index.tsx b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/index.tsx index 107927e88f..7dbd8584aa 100644 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/index.tsx @@ -2,11 +2,20 @@ import {cloneElement, isValidElement, SetStateAction, useCallback, useState} fro import {Database} from "@phosphor-icons/react" import {Button} from "antd" -import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" -import {appChatModeAtom} from "@/oss/components/Playground/state/atoms" -import {loadTestsetNormalizedMutationAtom} from "@/oss/components/Playground/state/atoms/mutations/testset/loadNormalized" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {findVariantById} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" +import {createMessageFromSchema} from "@/oss/components/Playground/hooks/usePlayground/assets/messageHelpers" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import {safeParse} from "@/oss/lib/helpers/utils" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import type { + ArrayMetadata, + Enhanced, + ObjectMetadata, +} from "@/oss/lib/shared/variant/genericTransformer/types" +import {createInputRow} from "@/oss/lib/shared/variant/inputHelpers" import {LoadTestsetButtonProps} from "./types" @@ -19,35 +28,115 @@ const LoadTestsetButton = ({ variantId, ...props }: LoadTestsetButtonProps) => { - const loadTestsetData = useSetAtom(loadTestsetNormalizedMutationAtom) - const isChat = useAtomValue(appChatModeAtom) ?? false + const {mutate, isChat, inputKeys} = usePlayground({ + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const _variantId = variantId || state.selected[0] + const variant = findVariantById(state, _variantId) + const inputKeys = (variant?.prompts || []).flatMap((prompt) => { + const keys = prompt.inputKeys.value.map((key) => key.value) + return keys + }) + + return {isChat: state.variants[0]?.isChat, inputKeys: inputKeys} + }, + [variantId], + ), + }) const [isTestsetModalOpen, setIsTestsetModalOpen] = useState(false) const [testsetData, setTestsetData] = useState | null>(null) const wrappedSetTestsetData = useCallback( (d: SetStateAction | null>) => { - // Only call the mutation if we have valid testset data - if (d && Array.isArray(d) && d.length > 0) { - // Use the new mutation atom to load testset data - loadTestsetData({ - testsetData: d, - isChatVariant: isChat, - regenerateVariableIds: true, - }) - } else if (d && !Array.isArray(d)) { - // Handle single testset item - loadTestsetData({ - testsetData: [d], - isChatVariant: isChat, - regenerateVariableIds: true, - }) - } + const data = Array.isArray(d) ? d : [d] + + mutate( + (clonedState) => { + if (!clonedState) return clonedState + + if (isChat) { + const messageRow = clonedState.generationData.messages.value[0] + + if (!messageRow) return clonedState + + data.forEach((row) => { + const chatMessages = safeParse(row.messages) + + const _metadata = getMetadataLazy( + messageRow.history.__metadata, + ) + const messageMetadata = _metadata?.itemMetadata as ObjectMetadata + + if (!messageMetadata) return + + const newMessages = chatMessages?.map( + (chat: {role: string; content: string}) => { + return createMessageFromSchema(messageMetadata, { + role: chat?.role, + content: chat?.content, + }) + }, + ) + + messageRow.history.value = [...newMessages] + + const generationMetadata = clonedState.generationData.inputs.__metadata + const parentMetadata = + getMetadataLazy>(generationMetadata) + const inputMetadata = parentMetadata?.itemMetadata + + if (!inputMetadata) return clonedState + + const _inputKeys = Object.keys(inputMetadata.properties) + const newRow = createInputRow(_inputKeys, inputMetadata) + + for (const key of _inputKeys as (keyof typeof newRow)[]) { + const newRowProperty = newRow[key] as Enhanced + newRowProperty.value = row[key] + } + + clonedState.generationData.inputs.value = [newRow] + }) + + return clonedState + } else { + // access the existing generation metadata to pull correct keys from testset rows + const generationMetadata = clonedState.generationData.inputs.__metadata + + // loop through the testset rows and create new generation rows from them + const newGenerationRows = data.map((row) => { + const parentMetadata = + getMetadataLazy>(generationMetadata) + const metadata = parentMetadata?.itemMetadata + + if (!metadata) return null + + const inputKeys = Object.keys(metadata.properties) + const newRow = createInputRow(inputKeys, metadata) + + // set the values of the new generation row inputs to the values of the testset row + for (const key of inputKeys as (keyof typeof newRow)[]) { + const newRowProperty = newRow[key] as Enhanced + newRowProperty.value = row[key] + } + + return newRow + }) + + clonedState.generationData.inputs.value = newGenerationRows.filter( + (row) => !!row, + ) + + return clonedState + } + }, + {revalidate: false}, + ) - // Update local state for the modal setTestsetData(d) }, - [loadTestsetData, isChat], + [inputKeys, isChat, mutate], ) return ( diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/types.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/types.d.ts similarity index 100% rename from web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/types.ts rename to web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetButton/types.d.ts diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetModalContent/index.tsx b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetModalContent/index.tsx deleted file mode 100644 index fe1d9ac5e3..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetModalContent/index.tsx +++ /dev/null @@ -1,460 +0,0 @@ -import dynamic from "next/dynamic" - -import {Expandable} from "@/oss/components/Tables/ExpandableCell" -import {getStringOrJson} from "@/oss/lib/helpers/utils" -import {Testset, testset} from "@/oss/lib/Types" -import {fetchTestset} from "@/oss/services/testsets/api" -import {useTestsetsData} from "@/oss/state/testset" -import {urlAtom} from "@/oss/state/url" -import {appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" -import {useQueryClient} from "@tanstack/react-query" -import {Checkbox, Divider, Input, Menu, Tooltip, Typography} from "antd" -import {ColumnsType} from "antd/es/table" -import {useAtomValue} from "jotai" -import {memo, useCallback, useEffect, useMemo, useState} from "react" -import {useRouter} from "next/router" -import clsx from "clsx" -import {useTestsetInputsAnalysis} from "../../hooks/useTestsetInputsAnalysis" -import {LoadTestsetModalContentProps} from "../types" -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" - -const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { - ssr: false, -}) - -const LoadTestsetModalContent = ({ - modalProps, - selectedTestset, - setSelectedTestset, - testsetCsvData, - selectedRowKeys, - setSelectedRowKeys, - isLoadingTestset, - isChat, -}: LoadTestsetModalContentProps) => { - const {testsets, columnsByTestsetId, isLoading} = useTestsetsData({enabled: modalProps.open}) - const queryClient = useQueryClient() - const router = useRouter() - - const [searchTerm, setSearchTerm] = useState("") - const appUriInfo = useAtomValue(appUriInfoAtom) - const routePath = appUriInfo?.routePath - const urlState = useAtomValue(urlAtom) - - // High-level analysis of inputs vs testset columns, including schema + dynamic variables - const {expectedInputVariables, hasCompatibilityIssue} = useTestsetInputsAnalysis({ - routePath, - testsetCsvData, - }) - - const normalizedExpectedVariables = useMemo( - () => - expectedInputVariables - .map((variable) => (typeof variable === "string" ? variable.trim() : "")) - .filter(Boolean), - [expectedInputVariables], - ) - - const testsetMatchInfo = useMemo(() => { - return testsets.reduce( - (acc, ts) => { - const id = ts?._id - if (!id) return acc - - const columns = columnsByTestsetId?.[id] - if (!Array.isArray(columns) || columns.length === 0) { - acc[id] = {score: 0, hasColumns: false} - return acc - } - - const normalizedColumns = new Set( - columns - .map((column) => (typeof column === "string" ? column.trim() : undefined)) - .filter(Boolean) as string[], - ) - - if (normalizedColumns.size === 0) { - acc[id] = {score: 0, hasColumns: false} - return acc - } - - const score = normalizedExpectedVariables.reduce((count, variable) => { - if (!variable) return count - return normalizedColumns.has(variable) ? count + 1 : count - }, 0) - - acc[id] = {score, hasColumns: true} - return acc - }, - {} as Record, - ) - }, [columnsByTestsetId, normalizedExpectedVariables, testsets]) - - const compatibilityByTestset = useMemo(() => { - return testsets.reduce( - (acc, ts) => { - const id = ts?._id - if (!id) return acc - - const rawColumns = columnsByTestsetId?.[id] - const columnsKnown = Array.isArray(rawColumns) - const trimmedColumns = columnsKnown - ? (rawColumns as string[]) - .map((column) => (typeof column === "string" ? column.trim() : "")) - .filter(Boolean) - : [] - const columnsLower = new Set(trimmedColumns.map((column) => column.toLowerCase())) - - const missingExpected = columnsKnown - ? normalizedExpectedVariables.filter( - (variable) => !columnsLower.has(variable.toLowerCase()), - ) - : [] - - const matched = columnsKnown - ? normalizedExpectedVariables.filter((variable) => - columnsLower.has(variable.toLowerCase()), - ) - : [] - - acc[id] = { - columns: trimmedColumns, - missingExpected, - matched, - columnsKnown, - hasWarning: columnsKnown && missingExpected.length > 0, - } - - return acc - }, - {} as Record< - string, - { - columns: string[] - missingExpected: string[] - matched: string[] - columnsKnown: boolean - hasWarning: boolean - } - >, - ) - }, [columnsByTestsetId, normalizedExpectedVariables, testsets]) - - const bestMatchingTestset = useMemo(() => { - if (!testsets.length) return {id: "", score: -1} - - if (normalizedExpectedVariables.length === 0) { - const firstId = testsets[0]?._id || "" - return {id: firstId, score: 0} - } - - let bestId = "" - let bestScore = 0 - - testsets.forEach((ts) => { - const id = ts?._id - if (!id) return - const info = testsetMatchInfo[id] - if (!info?.hasColumns) return - if (info.score > bestScore) { - bestScore = info.score - bestId = id - } - }) - - if (bestScore > 0 && bestId) { - return {id: bestId, score: bestScore} - } - - return {id: "", score: 0} - }, [normalizedExpectedVariables.length, testsetMatchInfo, testsets]) - - const {id: bestMatchingTestsetId, score: bestMatchingScore} = bestMatchingTestset - - const handleCreateTestset = useCallback(() => { - router.push(`${urlState.projectURL}/testsets`) - }, [router, urlState?.projectURL]) - - useEffect(() => { - if (!modalProps.open || !testsets.length) return - - setSelectedTestset((prev) => { - const prevExists = prev && testsets.some((ts) => ts?._id === prev) - if (prevExists) { - return prev - } - - if (!normalizedExpectedVariables.length) { - return testsets[0]?._id || "" - } - - return bestMatchingTestsetId || testsets[0]?._id || "" - }) - }, [bestMatchingTestsetId, modalProps.open, normalizedExpectedVariables.length, testsets]) - - const filteredTestset = useMemo(() => { - if (!searchTerm) return testsets - return testsets.filter((item: testset) => - item.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) - }, [searchTerm, testsets]) - - // Prefetch CSV data for the first N visible testsets to populate column cache - useEffect(() => { - if (!modalProps.open) return - - const BATCH = 8 - const list = (filteredTestset.length ? filteredTestset : testsets).slice(0, BATCH) - list.forEach((ts: any) => { - if (!ts?._id) return - queryClient.prefetchQuery({ - queryKey: ["testsetCsvData", ts._id], - queryFn: async () => { - const data = await fetchTestset(ts._id) - return data.csvdata ?? [] - }, - staleTime: 1000 * 60 * 2, - }) - }) - }, [modalProps.open, testsets, filteredTestset]) - - const selectionWarningMessage = useMemo(() => { - if (!hasCompatibilityIssue || !selectedTestset) return undefined - - const variantList = normalizedExpectedVariables.length - ? normalizedExpectedVariables.join(", ") - : "—" - - return `The testset has no CSV columns matching the expected variables {{${variantList}}}` - }, [hasCompatibilityIssue, normalizedExpectedVariables, selectedTestset]) - - const rowSelection = useMemo( - () => ({ - selectedRowKeys, - onChange: (keys: React.Key[]) => { - setSelectedRowKeys(keys) - }, - columnTitle: ( - - - 0 && - selectedRowKeys.length < testsetCsvData.length - } - checked={ - testsetCsvData.length > 0 && - selectedRowKeys.length === testsetCsvData.length - } - onChange={() => { - const allKeys = testsetCsvData.map((_, idx) => idx) - if (selectedRowKeys.length === allKeys.length) { - setSelectedRowKeys([]) - } else if (isChat) { - setSelectedRowKeys(allKeys.slice(0, 1)) - } else { - setSelectedRowKeys(allKeys) - } - }} - /> - - - ), - }), - [isChat, selectedRowKeys, selectionWarningMessage, setSelectedRowKeys, testsetCsvData], - ) - - const columnDef = useMemo(() => { - if (!testsetCsvData.length) { - return [ - {title: "-", width: 300}, - {title: "-", width: 300}, - ] - } - - const columns: ColumnsType = [] - - if (testsetCsvData.length > 0) { - const keys = Object.keys(testsetCsvData[0]).filter((key) => key !== "testcase_dedup_id") - - columns.push( - ...keys.map((key, index) => ({ - title: key, - dataIndex: key, - key: index, - width: 300, - onHeaderCell: () => ({ - style: {minWidth: 160}, - }), - onCell: () => ({ - title: selectionWarningMessage, - }), - render: (_: any, record: any) => { - const display = getStringOrJson(record[key]) - const content = ( - - {display} - - ) - return selectionWarningMessage ? ( - {content} - ) : ( - content - ) - }, - })), - ) - } - - return columns - }, [selectionWarningMessage, testsetCsvData]) - - const dataSource = useMemo(() => { - if (!testsetCsvData.length) return [] - return testsetCsvData.map((data, index) => ({...data, id: index})) - }, [testsetCsvData]) - - const menuItems = useMemo(() => { - if (!filteredTestset.length) return [] - - const items = filteredTestset.map((ts: testset) => { - const diagnostics = compatibilityByTestset[ts._id] - const columnsKnown = diagnostics?.columnsKnown ?? false - const hasWarning = diagnostics?.hasWarning ?? false - - const tooltip = - !columnsKnown && normalizedExpectedVariables.length - ? "Analyzing columns..." - : hasWarning && diagnostics?.missingExpected.length - ? `This testset has no CSV columns matching the expected variables` - : undefined - - return { - key: ts._id, - label: ( - - - {ts.name} - - - ), - __diag: { - id: ts._id, - name: ts.name, - columnsKnown, - columns: diagnostics?.columns ?? [], - expected: normalizedExpectedVariables, - missing: diagnostics?.missingExpected ?? [], - hasWarning, - }, - } - }) - - try { - console.table( - items.map((it: any) => ({ - id: it.__diag.id, - name: it.__diag.name, - columnsKnown: it.__diag.columnsKnown, - columns: it.__diag.columns?.join(", ") || "", - expected: it.__diag.expected?.join(", ") || "", - missing: it.__diag.missing?.join(", ") || "", - hasWarning: it.__diag.hasWarning, - })), - ) - } catch {} - - return items - }, [compatibilityByTestset, filteredTestset, normalizedExpectedVariables]) - - const onChangeTestset = useCallback(({key}: any) => { - setSelectedRowKeys([]) - setSelectedTestset(key) - }, []) - - const menuSelectedKeys = selectedTestset ? [selectedTestset] : [] - - if (!testsets.length && !testsetCsvData.length && !isLoadingTestset && !isLoading) - return ( - - ) - - return ( -
    -
    - setSearchTerm(e.target.value)} - /> - - - - -
    - - - -
    -
    - - Select a testcase - -
    - - ({ - className: "cursor-pointer", - title: selectionWarningMessage, - onClick: () => { - if (rowIndex === undefined) return - if (selectedRowKeys.includes(rowIndex)) { - setSelectedRowKeys( - selectedRowKeys.filter((row) => row !== rowIndex), - ) - } else if (isChat) { - setSelectedRowKeys([rowIndex]) - } else { - setSelectedRowKeys([...selectedRowKeys, rowIndex]) - } - }, - })} - /> -
    -
    - ) -} - -export default memo(LoadTestsetModalContent) diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetModalFooter/index.tsx b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetModalFooter/index.tsx deleted file mode 100644 index 152a91f9cd..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/LoadTestsetModalFooter/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import {appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" -import {Play} from "@phosphor-icons/react" -import {Button, Tooltip} from "antd" -import {useAtomValue} from "jotai" -import {memo, useCallback, useMemo} from "react" -import {useTestsetInputsAnalysis} from "../../hooks/useTestsetInputsAnalysis" -import {LoadTestsetModalFooterProps} from "../types" - -const LoadTestsetModalFooter = ({ - onClose, - isLoadingTestset, - selectedRowKeys, - testsetCsvData, - setTestsetData, -}: LoadTestsetModalFooterProps) => { - const appUriInfo = useAtomValue(appUriInfoAtom) - const routePath = appUriInfo?.routePath - - // High-level analysis of inputs vs testset columns, including schema + dynamic variables - const {expectedInputVariables, hasCompatibilityIssue} = useTestsetInputsAnalysis({ - routePath, - testsetCsvData, - }) - - const loadWarningMessage = useMemo(() => { - if (!hasCompatibilityIssue) return undefined - const variantList = expectedInputVariables.length ? expectedInputVariables.join(", ") : "—" - - return `The testset has no CSV columns matching the expected variables {{${variantList}}}. Loading may fail unless the variables align.` - }, [expectedInputVariables, hasCompatibilityIssue]) - - const loadTestset = useCallback(() => { - const selectedTestcase = testsetCsvData.filter((_, index) => - selectedRowKeys.includes(index), - ) - if (selectedTestcase) { - setTestsetData(selectedTestcase) - onClose() - } - }, [onClose, selectedRowKeys, setTestsetData, testsetCsvData]) - - return ( -
    - - - {/* Wrap disabled button with span so tooltip triggers on hover */} - - - - -
    - ) -} - -export default memo(LoadTestsetModalFooter) diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/testsetCsvData.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/testsetCsvData.ts deleted file mode 100644 index 41e8ec8923..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/testsetCsvData.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import {Testset} from "@/oss/lib/Types" -import {fetchTestset} from "@/oss/services/testsets/api" - -export interface TestsetCsvParams { - testsetId?: string - enabled?: boolean -} - -/** - * Atom family to fetch CSV data for a given testset ID. - * Returns the raw csvdata array from the testset response. - */ -export const testsetCsvDataQueryAtomFamily = atomFamily((params: TestsetCsvParams) => - atomWithQuery((get) => { - const {testsetId, enabled = true} = params || {} - return { - queryKey: ["testsetCsvData", testsetId], - queryFn: async () => { - if (!testsetId) return [] - const data = await fetchTestset(testsetId) - return data.csvdata || [] - }, - enabled: !!testsetId && enabled, - staleTime: 1000 * 60 * 2, // 2 minutes - refetchOnWindowFocus: false, - refetchOnReconnect: true, - } - }), -) diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/types.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/types.ts deleted file mode 100644 index d527c0b05f..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {Testset} from "@/oss/lib/Types" -import {ModalProps} from "antd" - -export interface LoadTestsetModalProps extends ModalProps { - setTestsetData: React.Dispatch[] | null>> - testsetData: Record | null - isChat?: boolean -} - -export interface LoadTestsetModalContentProps { - modalProps: LoadTestsetModalProps - selectedTestset: string - setSelectedTestset: React.Dispatch> - testsetCsvData: Testset["csvdata"] - selectedRowKeys: React.Key[] - setSelectedRowKeys: React.Dispatch> - isLoadingTestset: boolean - isChat: boolean -} - -export interface LoadTestsetModalFooterProps { - onClose: () => void - isLoadingTestset: boolean - selectedRowKeys: React.Key[] - testsetCsvData: Testset["csvdata"] - setTestsetData: React.Dispatch[] | null>> -} diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/hooks/useInputsVsColumns.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/hooks/useInputsVsColumns.ts deleted file mode 100644 index 95274fc57d..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/hooks/useInputsVsColumns.ts +++ /dev/null @@ -1,111 +0,0 @@ -import {useMemo} from "react" - -import {Testset} from "@/oss/lib/Types" - -export interface InputsVsColumnsResult { - availableCsvColumns: string[] - csvColumnMap: Map - matchingVariables: string[] - missingExpectedVariables: string[] - unexpectedCsvColumns: string[] - datasetLoaded: boolean - shouldBlockLoad: boolean - matchingVariableSet: Set - hasCompatibilityIssue: boolean - disabledReason?: string -} - -/** - * Reusable hook to compare required input variables against available CSV columns - * and provide derived helpers for UI state and messaging. - */ -export function useInputsVsColumns( - expectedInputVariables: string[], - testsetCsvData: Testset["csvdata"], -): InputsVsColumnsResult { - const availableCsvColumns = useMemo(() => { - if (!testsetCsvData.length) return [] as string[] - const firstRow = testsetCsvData[0] || ({} as Record) - return Object.keys(firstRow) - }, [testsetCsvData]) - - const csvColumnMap = useMemo(() => { - return availableCsvColumns.reduce((acc, column) => { - if (!column) return acc - const trimmed = String(column).trim() - if (!trimmed) return acc - if (!acc.has(trimmed)) { - acc.set(trimmed, trimmed) - } - return acc - }, new Map()) - }, [availableCsvColumns]) - - const matchingVariables = useMemo( - () => - expectedInputVariables.filter((variable) => { - if (typeof variable !== "string") return false - const trimmed = variable.trim() - if (!trimmed) return false - return csvColumnMap.has(trimmed) - }), - [csvColumnMap, expectedInputVariables], - ) - - const missingExpectedVariables = useMemo( - () => - expectedInputVariables.filter((variable) => { - if (typeof variable !== "string") return false - const trimmed = variable.trim() - if (!trimmed) return false - return !csvColumnMap.has(trimmed) - }), - [csvColumnMap, expectedInputVariables], - ) - - const unexpectedCsvColumns = useMemo(() => { - if (!availableCsvColumns.length) return [] - const expectedSet = new Set( - expectedInputVariables - .map((variable) => - typeof variable === "string" ? variable.trim().toLowerCase() : "", - ) - .filter(Boolean), - ) - if (!expectedSet.size) return [] - return availableCsvColumns.filter((column) => { - const trimmed = typeof column === "string" ? column.trim().toLowerCase() : "" - if (!trimmed) return false - return !expectedSet.has(trimmed) - }) - }, [availableCsvColumns, expectedInputVariables]) - - const datasetLoaded = testsetCsvData.length > 0 - - const shouldBlockLoad = - datasetLoaded && expectedInputVariables.length > 0 && matchingVariables.length === 0 - - const hasCompatibilityIssue = datasetLoaded && missingExpectedVariables.length > 0 - - const matchingVariableSet = useMemo(() => new Set(matchingVariables), [matchingVariables]) - - const disabledReason = useMemo(() => { - if (!hasCompatibilityIssue) return undefined - if (!expectedInputVariables.length) return undefined - if (!missingExpectedVariables.length) return undefined - return `Variant inputs missing in testset: ${missingExpectedVariables.join(", ")}` - }, [expectedInputVariables.length, hasCompatibilityIssue, missingExpectedVariables]) - - return { - availableCsvColumns, - csvColumnMap, - matchingVariables, - missingExpectedVariables, - unexpectedCsvColumns, - datasetLoaded, - shouldBlockLoad, - matchingVariableSet, - hasCompatibilityIssue, - disabledReason, - } -} diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/hooks/useTestsetInputsAnalysis.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/hooks/useTestsetInputsAnalysis.ts deleted file mode 100644 index 90ef68c1fe..0000000000 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/hooks/useTestsetInputsAnalysis.ts +++ /dev/null @@ -1,154 +0,0 @@ -import {useMemo} from "react" - -import {useAtomValue} from "jotai" - -import { - displayedVariantsVariablesAtom, - schemaInputKeysAtom, -} from "@/oss/components/Playground/state/atoms/variants" -import {Testset} from "@/oss/lib/Types" -import {requestSchemaMetaAtomFamily} from "@/oss/state/newPlayground/core/requestSchemaMeta" - -import {useInputsVsColumns} from "./useInputsVsColumns" - -export interface UseTestsetInputsAnalysisParams { - // Optional: pass routePath to fetch schema meta via atom - routePath?: string - // Explicit overrides to decouple from atoms when desired - displayedVariablesOverride?: string[] - schemaInputKeysOverride?: string[] - requestSchemaMetaOverride?: {inputKeys?: string[]; required?: string[]} - // The dataset to analyze - testsetCsvData: Testset["csvdata"] -} - -export interface UseTestsetInputsAnalysisResult { - normalizedDynamicVariables: string[] - schemaVariableCandidates: string[] - expectedInputVariables: string[] - shouldBlockLoad: boolean - matchingVariableSet: Set - matchingVariables: string[] - missingExpectedVariables: string[] - unexpectedCsvColumns: string[] - availableCsvColumns: string[] - hasCompatibilityIssue: boolean - disabledReason?: string -} - -/** - * High-level hook that can operate in two modes: - * 1) Controlled mode: receive explicit schema/vars via overrides (no atom reads) - * 2) Atom-backed mode: provide routePath and it will read from atoms - */ -export function useTestsetInputsAnalysis( - params: UseTestsetInputsAnalysisParams, -): UseTestsetInputsAnalysisResult { - const { - routePath, - displayedVariablesOverride, - schemaInputKeysOverride, - requestSchemaMetaOverride, - testsetCsvData, - } = params - - // Resolve dynamic variables - const displayedVariablesFromAtoms = useAtomValue(displayedVariantsVariablesAtom) - const displayedVariables = displayedVariablesOverride ?? displayedVariablesFromAtoms - - // Resolve schema keys - const schemaInputKeysFromAtoms = useAtomValue(schemaInputKeysAtom) - const schemaInputKeys = schemaInputKeysOverride ?? schemaInputKeysFromAtoms - - // Resolve schema meta - const requestSchemaMetaFromAtom = useAtomValue( - useMemo(() => requestSchemaMetaAtomFamily({variant: {} as any, routePath}), [routePath]), - ) - const requestSchemaMeta = requestSchemaMetaOverride ?? requestSchemaMetaFromAtom - - // Normalize dynamic variables - const normalizedDynamicVariables = useMemo( - () => - (displayedVariables || []) - .map((v) => (typeof v === "string" ? v.trim() : "")) - .filter(Boolean), - [displayedVariables], - ) - - // Build candidate keys from schema + dynamic vars - const schemaVariableCandidates = useMemo(() => { - const meta = requestSchemaMeta || {inputKeys: [], required: []} - const primaryKeys = [...(meta.inputKeys || []), ...(meta.required || [])] - const fallbackKeys = schemaInputKeys || [] - const result = new Map() - - const addValue = (value: string) => { - if (!value) return - const normalized = value.toLowerCase() - if (!result.has(normalized)) { - result.set(normalized, value) - } - } - - const addDynamicInputs = () => { - if (!normalizedDynamicVariables.length) return - normalizedDynamicVariables.forEach((variable) => addValue(variable)) - } - - const handleKey = (rawKey: string) => { - const key = typeof rawKey === "string" ? rawKey.trim() : "" - if (!key) return - if (key === "inputs") { - addDynamicInputs() - return - } - addValue(key) - } - - primaryKeys.forEach(handleKey) - - if (result.size === 0) { - fallbackKeys.forEach(handleKey) - } else { - fallbackKeys.forEach((key) => { - if (!key) return - handleKey(key) - }) - } - - addDynamicInputs() - - return Array.from(result.values()) - }, [normalizedDynamicVariables, requestSchemaMeta, schemaInputKeys]) - - const expectedInputVariables = useMemo( - () => - Array.from(new Map(schemaVariableCandidates.map((v) => [v.toLowerCase(), v])).values()), - [schemaVariableCandidates], - ) - - const { - shouldBlockLoad, - matchingVariableSet, - matchingVariables, - missingExpectedVariables, - unexpectedCsvColumns, - availableCsvColumns, - hasCompatibilityIssue, - disabledReason, - } = useInputsVsColumns(expectedInputVariables, testsetCsvData) - - return { - normalizedDynamicVariables, - schemaVariableCandidates, - expectedInputVariables, - shouldBlockLoad, - matchingVariables, - matchingVariableSet, - missingExpectedVariables, - unexpectedCsvColumns, - availableCsvColumns, - hasCompatibilityIssue, - disabledReason, - } -} diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/index.tsx b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/index.tsx index 6dcf295686..5ad5e61887 100644 --- a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/index.tsx +++ b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/index.tsx @@ -1,20 +1,16 @@ -import {useCallback, useMemo, useState} from "react" +import {useCallback, useEffect, useMemo, useState} from "react" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" +import {Play} from "@phosphor-icons/react" +import {Divider, Input, Menu, Modal, Table, Typography} from "antd" +import {ColumnsType} from "antd/es/table" -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" -import {Testset} from "@/oss/lib/Types" +import NoResultsFound from "@/oss/components/NoResultsFound/NoResultsFound" +import {getStringOrJson} from "@/oss/lib/helpers/utils" +import {TestSet, testset} from "@/oss/lib/Types" +import {fetchTestset, useLoadTestsetsList} from "@/oss/services/testsets/api" -import {testsetCsvDataQueryAtomFamily} from "./assets/testsetCsvData" -import {LoadTestsetModalProps} from "./assets/types" - -const LoadTestsetModalFooter = dynamic(() => import("./assets/LoadTestsetModalFooter"), { - ssr: false, -}) -const LoadTestsetModalContent = dynamic(() => import("./assets/LoadTestsetModalContent"), { - ssr: false, -}) +import {useStyles} from "./styles" +import {LoadTestsetModalProps} from "./types" const LoadTestsetModal: React.FC = ({ testsetData, @@ -22,68 +18,186 @@ const LoadTestsetModal: React.FC = ({ isChat = false, ...props }) => { - const {onCancel, afterClose, ...modalProps} = props + const classes = useStyles() + const {testsets} = useLoadTestsetsList() + const [isLoadingTestset, setIsLoadingTestset] = useState(false) const [selectedTestset, setSelectedTestset] = useState("") + const [testsetCsvData, setTestsetCsvData] = useState([]) const [selectedRowKeys, setSelectedRowKeys] = useState([]) + const [searchTerm, setSearchTerm] = useState("") - // Fetch testset CSV data via atomWithQuery - const testsetCsvQuery = useAtomValue( - useMemo( - () => - testsetCsvDataQueryAtomFamily({ - testsetId: selectedTestset, - enabled: modalProps.open && !!selectedTestset, - }), - [selectedTestset, modalProps.open], - ), + const testsetFetcher = useCallback( + async (testsetId: string) => { + try { + setIsLoadingTestset(true) + const data = await fetchTestset(testsetId) + setTestsetCsvData(data.csvdata) + } catch (error) { + console.error(error) + } finally { + setIsLoadingTestset(false) + } + }, + [fetchTestset, setTestsetCsvData], ) - const testsetCsvData: Testset["csvdata"] = useMemo( - () => ((testsetCsvQuery as any)?.data as Testset["csvdata"]) || [], - [testsetCsvQuery], - ) - const isLoadingTestset = useMemo( - () => !!(testsetCsvQuery as any)?.isLoading || !!(testsetCsvQuery as any)?.isPending, - [testsetCsvQuery], + useEffect(() => { + if (props.open && testsets.length > 0) { + const testsetId = selectedTestset || testsets[0]?._id + setSelectedTestset(testsetId) + testsetFetcher(testsetId) + } + }, [testsets, props.open]) + + const filteredTestset = useMemo(() => { + if (!searchTerm) return testsets + return testsets.filter((item: testset) => + item.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) + }, [searchTerm, testsets]) + + const rowSelection = useMemo( + () => ({ + selectedRowKeys, + onChange: (keys: React.Key[]) => { + setSelectedRowKeys(keys) + }, + }), + [selectedRowKeys], ) const onClose = useCallback(() => { - onCancel?.({} as any) + props.onCancel?.({} as any) setSelectedRowKeys([]) }, []) + const loadTestset = useCallback(() => { + const selectedTestCase = testsetCsvData.filter((_, index) => + selectedRowKeys.includes(index), + ) + if (selectedTestCase) { + setTestsetData(selectedTestCase) + onClose() + } + }, [selectedRowKeys]) + + const onChangeTestset = useCallback( + ({key}: any) => { + setSelectedRowKeys([]) + testsetFetcher(key) + setSelectedTestset(key) + }, + [testsetFetcher], + ) + + const columnDef = useMemo(() => { + const columns: ColumnsType = [] + + if (testsetCsvData.length > 0) { + const keys = Object.keys(testsetCsvData[0]) + + columns.push( + ...keys.map((key, index) => ({ + title: key, + dataIndex: key, + key: index, + width: 300, + onHeaderCell: () => ({ + style: {minWidth: 160}, + }), + render: (_: any, record: any) => { + const display = getStringOrJson(record[key]) + return
    {display}
    + }, + })), + ) + } + + return columns + }, [testsetCsvData]) + return ( - { - setSelectedRowKeys([]) - afterClose?.() + className={classes.container} + afterClose={() => setSelectedRowKeys([])} + title="Load test set" + okText="Load test set" + okButtonProps={{ + icon: , + iconPosition: "end", + disabled: !selectedRowKeys.length, + onClick: loadTestset, + loading: isLoadingTestset, }} - title="Load testset" - footer={ - - } - onCancel={onClose} - {...modalProps} + {...props} > - - + {!testsets.length ? ( + + ) : ( +
    +
    + setSearchTerm(e.target.value)} + /> + + + + ({ + key: testset._id, + label: testset.name, + }))} + onSelect={onChangeTestset} + defaultSelectedKeys={[selectedTestset]} + selectedKeys={[selectedTestset]} + className={classes.menu} + /> +
    + + + +
    + + Select a testcase + + + ({...data, id: index}))} + columns={columnDef} + className="flex-1" + bordered + rowKey={"id"} + pagination={false} + scroll={{y: 500, x: "max-content"}} + onRow={(_, rowIndex) => ({ + className: "cursor-pointer", + onClick: () => { + if (rowIndex !== undefined) { + if (selectedRowKeys.includes(rowIndex)) { + setSelectedRowKeys( + selectedRowKeys.filter((row) => row !== rowIndex), + ) + } else { + if (isChat) { + setSelectedRowKeys([rowIndex]) + } else { + setSelectedRowKeys([...selectedRowKeys, rowIndex]) + } + } + } + }, + })} + /> + + + )} + ) } diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/styles.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/styles.ts new file mode 100644 index 0000000000..5814c5fe7c --- /dev/null +++ b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/styles.ts @@ -0,0 +1,28 @@ +import {createUseStyles} from "react-jss" + +import {JSSTheme} from "@/oss/lib/Types" + +export const useStyles = createUseStyles((theme: JSSTheme) => ({ + container: { + "& .ant-modal-body": { + height: 600, + overflowY: "auto", + }, + }, + subTitle: { + fontSize: theme.fontSizeLG, + lineHeight: theme.lineHeightLG, + fontWeight: theme.fontWeightMedium, + }, + sidebar: { + display: "flex", + flexDirection: "column", + gap: theme.padding, + width: 200, + }, + menu: { + height: 500, + overflowY: "auto", + borderInlineEnd: `0px !important`, + }, +})) diff --git a/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/types.d.ts b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/types.d.ts new file mode 100644 index 0000000000..22f210d729 --- /dev/null +++ b/web/oss/src/components/Playground/Components/Modals/LoadTestsetModal/types.d.ts @@ -0,0 +1,7 @@ +import {ModalProps} from "antd" + +export interface LoadTestsetModalProps extends ModalProps { + setTestsetData: React.Dispatch[] | null>> + testsetData: Record | null + isChat?: boolean +} diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/index.tsx index 119ef5f66e..345a6e2770 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/index.tsx @@ -1,81 +1,139 @@ -import {useMemo} from "react" +import {useCallback, useMemo} from "react" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" - -import TurnMessageAdapter from "@/oss/components/Playground/adapters/TurnMessageAdapter" -// Shared placeholder for empty state -import {usePlaygroundLayout} from "@/oss/components/Playground/hooks/usePlaygroundLayout" -import {displayedVariantsAtom} from "@/oss/components/Playground/state/atoms" -import { - generationInputRowIdsAtom, - resolvedGenerationResultAtomFamily, -} from "@/oss/components/Playground/state/atoms/generationProperties" -// import {inputRowIdsWithPropertiesCompatAtom} from "@/oss/state/generation/compat" -import {generationRowIdsAtom} from "@/oss/components/Playground/state/atoms/generationProperties" -import {generationLogicalTurnIdsAtom} from "@/oss/state/generation/compat" -import {chatTurnsByIdAtom, runStatusByRowRevisionAtom} from "@/oss/state/generation/entities" -import { - addChatTurnAtom, - runChatTurnAtom, - cancelChatTurnAtom, -} from "@/oss/state/newPlayground/chat/actions" -import { - sessionTurnIdForVariantAtomFamily, - isCellRunningAtomFamily, -} from "@/oss/state/newPlayground/chat/view" - -import LastTurnFooterControls from "../../ChatCommon/LastTurnFooterControls" -import GenerationChatTurnNormalized from "../../PlaygroundGenerations/assets/GenerationChatTurnNormalized" + +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {findPropertyInObject} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" + +import {ObjectMetadata} from "../../../../../lib/shared/variant/genericTransformer/types" +import GenerationChatRow, { + GenerationChatRowOutput, +} from "../../PlaygroundGenerations/assets/GenerationChatRow" import GenerationCompletionRow from "../../PlaygroundGenerations/assets/GenerationCompletionRow" +import GenerationOutputText from "../../PlaygroundGenerations/assets/GenerationOutputText" import {GenerationComparisonChatOutputProps, GenerationComparisonChatOutputCellProps} from "./types" -// No local schema plumbing; PromptMessageConfig derives structure internally - const GenerationComparisonChatOutputCell = ({ variantId, - turnId, + historyId, + rowId, variantIndex, isFirstRow, + isLastRow, }: GenerationComparisonChatOutputCellProps) => { - const inputRowIds = useAtomValue(generationInputRowIdsAtom) - // Use the same list the renderer uses to decide "last" row - const allRowIds = useAtomValue(generationRowIdsAtom) as string[] - const isLastTurn = (allRowIds || [])[Math.max(0, (allRowIds || []).length - 1)] === turnId - - const displayedVariantIds = useAtomValue(displayedVariantsAtom) - const addTurn = useSetAtom(addChatTurnAtom) - const runTurn = useSetAtom(runChatTurnAtom) - const cancelTurn = useSetAtom(cancelChatTurnAtom) - const turnsById = useAtomValue(chatTurnsByIdAtom) as Record - const userMessageId = useMemo( - () => (turnsById?.[turnId] as any)?.userMessage?.__id as string | undefined, - [turnsById, turnId], - ) - const runStatusMap = useAtomValue(runStatusByRowRevisionAtom) as Record - const resultHashes = useMemo(() => { - try { - const hashes = (displayedVariantIds || []).map((revId: string) => { - const entry = runStatusMap?.[`${turnId}:${revId}`] - return entry?.resultHash as string | undefined + const {rerunChatOutput, messages, messageRow, inputRowIds, mutate} = usePlayground({ + variantId, + registerToWebWorker: true, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const inputRows = state.generationData.inputs.value || [] + + const historyMessage = findPropertyInObject(state, historyId) + const messageRow = findPropertyInObject(state.generationData.messages.value, rowId) + + const runs = !historyMessage?.__runs?.[variantId] + ? undefined + : historyMessage?.__runs?.[variantId] + ? historyMessage?.__runs?.[variantId].messages + ? historyMessage?.__runs?.[variantId].messages.map((message) => ({ + ...message, + __result: historyMessage.__runs[variantId].__result, + __isRunning: historyMessage.__runs[variantId].__isRunning, + })) + : [ + { + ...historyMessage.__runs[variantId].message, + __result: historyMessage.__runs[variantId].__result, + __isRunning: historyMessage.__runs[variantId].__isRunning, + }, + ] + : undefined + + const inputRowIds = (inputRows || []) + .filter((inputRow) => { + return ( + Object.keys( + (getMetadataLazy(inputRow.__metadata) as ObjectMetadata) + ?.properties, + ).length > 0 + ) + }) + .map((inputRow) => inputRow.__id) + + return { + messages: runs, + messageRow, + inputRowIds, + } + }, + [rowId, variantId, historyId], + ), + }) + + const handleDeleteMessage = useCallback( + (messageId: string) => { + mutate((clonedState) => { + if (!clonedState) return clonedState + + if (!variantId) { + const row = clonedState.generationData.messages.value.find( + (v) => v.__id === rowId, + ) + if (!row) return clonedState + + const isInput = row.history.value.findIndex((m) => m.__id === messageId) + if (isInput !== -1) { + row.history.value.splice(isInput, 1) + } else { + row.history.value.findIndex((m) => { + return m.__runs?.[variantId]?.message?.__id === messageId + }) + } + } else if (variantId) { + const row = clonedState.generationData.messages.value.find( + (v) => v.__id === rowId, + ) + if (!row) return clonedState + const isInput = row.history.value.findIndex((m) => { + return m.__runs?.[variantId]?.message?.__id === messageId + }) + if (isInput !== -1) { + delete row.history.value[isInput].__runs?.[variantId] + } + } }) - return hashes.filter((h): h is string => typeof h === "string" && h.length > 0) - } catch { - return [] as string[] - } - }, [runStatusMap, displayedVariantIds, turnId]) + }, + [variantId], + ) + + const canRerunMessage = useMemo(() => { + const isRunning = messages?.some((message) => message.__isRunning) + const hasResult = messages?.some((message) => !!message.__result) + + return !isRunning && hasResult + // !message?.__isRunning && !!message?.__result + }, [variantId, messages]) + + const rerunMessage = useCallback( + (messageId: string) => { + rerunChatOutput?.(messageId, variantId) + }, + [variantId], + ) return ( <>
    {variantIndex === 0 && ( -
    +
    {isFirstRow && inputRowIds.map((inputRowId) => { @@ -89,35 +147,21 @@ const GenerationComparisonChatOutputCell = ({ })}
    -
    - runTurn({turnId, messageId: userMessageId})} - resultHashes={resultHashes} - messageOptionProps={{ - hideAddToTestset: true, - }} +
    + - {isLastTurn ? ( - runTurn({turnId: turnId})} - onCancelAll={() => cancelTurn({turnId: turnId})} - onAddMessage={() => addTurn()} - className="p-3" - /> - ) : null}
    )} @@ -132,21 +176,39 @@ const GenerationComparisonChatOutputCell = ({ ])} >
    - + {messages && messages.length ? ( + messages.map((message) => ( + + )) + ) : ( +
    + +
    + )}
    @@ -154,24 +216,26 @@ const GenerationComparisonChatOutputCell = ({ } const GenerationComparisonChatOutput = ({ - turnId, + rowId, + historyId, + isLastRow, isFirstRow, }: GenerationComparisonChatOutputProps) => { - const {displayedVariants} = usePlaygroundLayout() + const {displayedVariants} = usePlayground() return (
    - {(displayedVariants || []).map((variantId, variantIndex) => { - return ( - - ) - })} + {(displayedVariants || []).map((variantId, variantIndex) => ( + + ))}
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/types.d.ts index 3e03b7697a..25232446f1 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonChatOutput/types.d.ts @@ -1,14 +1,16 @@ export interface GenerationComparisonChatOutputCellProps { variantId: string - turnId: string + rowId: string + historyId: string variantIndex?: number isFirstRow?: boolean isLastRow?: boolean } export interface GenerationComparisonChatOutputProps { + historyId: string className?: string - turnId: string + rowId: string isLastRow?: boolean isFirstRow?: boolean } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonCompletionOutput/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonCompletionOutput/index.tsx index 1ad431b284..7170231d73 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonCompletionOutput/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonCompletionOutput/index.tsx @@ -1,40 +1,71 @@ -import {useMemo} from "react" +import {useCallback, useMemo} from "react" import clsx from "clsx" -import {useAtomValue} from "jotai" +import JSON5 from "json5" +import dynamic from "next/dynamic" -import {generationResultAtomFamily} from "@/oss/components/Playground/state/atoms" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" import {getResponseLazy} from "@/oss/lib/hooks/useStatelessVariants/state" -import TypingIndicator from "../../../assets/TypingIndicator" +import {findPropertyInObject} from "../../../hooks/usePlayground/assets/helpers" import GenerationCompletion from "../../PlaygroundGenerations/assets/GenerationCompletion" -import ErrorPanel from "../../PlaygroundGenerations/assets/GenerationCompletionRow/ErrorPanel" -import GenerationResponsePanel from "../../PlaygroundGenerations/assets/GenerationCompletionRow/GenerationResponsePanel" -import { - RunningPlaceholder, - ClickRunPlaceholder, -} from "../../PlaygroundGenerations/assets/ResultPlaceholder" +import GenerationOutputText from "../../PlaygroundGenerations/assets/GenerationOutputText" +import SharedEditor from "../../SharedEditor" -import type {GenerationComparisonCompletionOutputProps} from "./types" +import {GenerationComparisonCompletionOutputProps} from "./types" +const GenerationResultUtils = dynamic( + () => import("../../PlaygroundGenerations/assets/GenerationResultUtils"), + {ssr: false}, +) + +const handleChange = () => undefined const GenerationComparisonCompletionOutput = ({ rowId, + focusDisable = false, variantId, variantIndex, isLastRow, + registerToWebWorker, }: GenerationComparisonCompletionOutputProps) => { - const { - resultHash, - isRunning, - result: inlineResult, - } = useAtomValue( - useMemo(() => generationResultAtomFamily({variantId, rowId}), [variantId, rowId]), - ) as any + const {resultHash, isRunning} = usePlayground({ + registerToWebWorker: registerToWebWorker ?? true, + variantId, + rowId, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const inputRow = findPropertyInObject(state, rowId) + const variantRun = inputRow?.__runs?.[variantId] + return { + resultHash: variantRun?.__result, + isRunning: variantRun?.__isRunning, + } + }, + [rowId, variantId], + ), + }) - const result = useMemo( - () => inlineResult ?? getResponseLazy(resultHash), - [inlineResult, resultHash], - ) + const result = useMemo(() => { + return getResponseLazy(resultHash) + }, [resultHash]) + + const responseData = result?.response?.data + const value = + typeof responseData === "string" + ? responseData + : typeof responseData === "object" && responseData.hasOwnProperty("content") + ? responseData.content + : "" + + let isJSON = false + try { + JSON.parse(value) + isJSON = true + } catch (e) { + isJSON = false + } return ( <> @@ -46,34 +77,127 @@ const GenerationComparisonCompletionOutput = ({ "shrink-0", ])} > -
    - -
    + {variantIndex === 0 && ( +
    + +
    + )}
    ) : null}
    -
    - {isRunning ? ( - - ) : result ? ( - result.error ? ( - - ) : ( - - ) - ) : ( - - )} +
    +
    +
    + {isRunning ? ( + + ) : !result ? ( + + ) : result.error ? ( + + } + /> + ) : result.response ? ( + Array.isArray(result.response?.data) ? ( + result.response.data.map((message, index) => { + let _json = false + try { + const parsed = JSON5.parse(message.content) + parsed.function.arguments = JSON5.parse( + parsed.function.arguments, + ) + const displayValue = { + arguments: parsed.function.arguments, + } + _json = true + + return ( + + + {parsed.function.name} + + + {parsed.id} + +
    + } + disabled + editorClassName="min-h-4 [&_p:first-child]:!mt-0" + footer={ + + } + className="mt-2 [&:first-child]:!mt-0" + handleChange={handleChange} + /> + ) + } catch (e) { + console.log("RENDER MSG ITEM ERROR!", message, e) + return
    errored
    + } + }) + ) : ( + + } + /> + ) + ) : null} +
    +
    diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonHeader/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonHeader/index.tsx index 31912c542f..dd5cdf1087 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonHeader/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/GenerationComparisonHeader/index.tsx @@ -1,22 +1,12 @@ -import {memo, useCallback, useEffect, useMemo} from "react" +import {memo, useCallback, useEffect} from "react" import {Button, Tooltip, Typography} from "antd" import clsx from "clsx" -import {atom, useAtom, useAtomValue, useSetAtom} from "jotai" - -import {inputRowIdsWithPropertiesCompatAtom} from "@/oss/state/generation/compat" -import {runAllChatAtom} from "@/oss/state/newPlayground/chat/actions" -import {triggerWebWorkerTestAtom} from "@/oss/state/newPlayground/mutations/webWorkerIntegration" import RunButton from "../../../assets/RunButton" -import { - appChatModeAtom, - generationHeaderDataAtomFamily, - displayedVariantsAtom, - cancelTestsMutationAtom, - canRunAllChatComparisonAtom, -} from "../../../state/atoms" -import {clearAllRunsMutationAtom} from "../../../state/atoms/utilityMutations" +import usePlayground from "../../../hooks/usePlayground" +import {clearRuns} from "../../../hooks/usePlayground/assets/generationHelpers" +import {PlaygroundStateData} from "../../../hooks/usePlayground/types" import TestsetDrawerButton from "../../Drawers/TestsetDrawer" import LoadTestsetButton from "../../Modals/LoadTestsetModal/assets/LoadTestsetButton" @@ -26,56 +16,66 @@ import type {GenerationComparisonHeaderProps} from "./types" const GenerationComparisonHeader = ({className}: GenerationComparisonHeaderProps) => { const classes = useStyles() - // Use atom-based state management - const displayedVariantIds = useAtomValue(displayedVariantsAtom) || [] - const [inputRowIds] = useAtom(inputRowIdsWithPropertiesCompatAtom) - const clearAllRuns = useSetAtom(clearAllRunsMutationAtom) - const isChatVariant = useAtomValue(appChatModeAtom) ?? false - const triggerTest = useSetAtom(triggerWebWorkerTestAtom) - const runAllChat = useSetAtom(runAllChatAtom) - const cancelTests = useSetAtom(cancelTestsMutationAtom) - const canRunAllChat = useAtomValue(canRunAllChatComparisonAtom) - - const headerDataAtom = useMemo( - () => - atom((get) => { - if (isChatVariant) return {resultHashes: [], isRunning: false} - const vids = (get(displayedVariantsAtom) || []) as string[] - const status = get( - // Reuse generationHeaderData per variant and fold - atom((g) => vids.map((id) => g(generationHeaderDataAtomFamily(id)))), - ) as {resultHashes: string[]; isRunning: boolean}[] - const resultHashes = status.flatMap((d) => d.resultHashes || []) - const isRunning = status.some((d) => d.isRunning) - return {resultHashes: resultHashes.filter(Boolean), isRunning} - }), - [isChatVariant], - ) - const {resultHashes, isRunning} = useAtomValue(headerDataAtom) + const {resultHashes, isRunning, runTests, mutate} = usePlayground({ + stateSelector: useCallback((state: PlaygroundStateData) => { + const variants = state.variants.filter((variant) => state.selected.includes(variant.id)) + const resultHashes: any[] = [] + let isRunning - // Create a runTests function that runs all available input rows - const runTests = useCallback(() => { - if (isChatVariant) { - if (canRunAllChat) runAllChat() - return - } - ;(inputRowIds as string[]).forEach((rid) => { - ;(displayedVariantIds as string[]).forEach((vid) => { - triggerTest({rowId: rid, variantId: vid} as any) - }) - }) - }, [triggerTest, isChatVariant, inputRowIds, displayedVariantIds, runAllChat, canRunAllChat]) + if (variants[0].isChat) { + const messageRows = state.generationData.messages.value + + messageRows.forEach((dataItem) => { + if (dataItem.history && Array.isArray(dataItem.history.value)) { + dataItem.history.value.forEach((historyItem) => { + if (historyItem.__runs) { + const runs = Object.values(historyItem.__runs) + for (const runData of runs) { + isRunning = runs.some((runData) => runData?.__isRunning) + resultHashes.push(runData?.__result) + } + } + }) + } + }) + + return {resultHashes: resultHashes.filter(Boolean), isRunning: isRunning || false} + } else { + const inputRows = state.generationData.inputs.value + + inputRows.forEach((dataItem) => { + if (dataItem.__runs) { + const runs = Object.values(dataItem.__runs || {}) + for (const runData of runs) { + isRunning = runs.some((runData) => runData?.__isRunning) + + resultHashes.push(runData?.__result) + } + } + }) + + return {resultHashes: resultHashes.filter(Boolean), isRunning: isRunning || false} + } + }, []), + }) const clearGeneration = useCallback(() => { - clearAllRuns() - }, [clearAllRuns]) + mutate( + (clonedState) => { + if (!clonedState) return clonedState + clearRuns(clonedState) + return clonedState + }, + {revalidate: false}, + ) + }, []) useEffect(() => { const listener = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key === "Enter") { e.preventDefault() e.stopPropagation() - if (!isRunning && (!isChatVariant || canRunAllChat)) runTests?.() + if (!isRunning) runTests?.() } } document.addEventListener("keydown", listener, true) @@ -101,26 +101,18 @@ const GenerationComparisonHeader = ({className}: GenerationComparisonHeaderProps - - - {!isRunning ? ( - - runTests?.()} - /> - - ) : ( - cancelTests({})} className="flex" /> - )} + + + + runTests?.()} /> +
    ) diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/assets/GenerationComparisonOutputHeader/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/assets/GenerationComparisonOutputHeader/index.tsx index eb3fb4d768..38dedcca3f 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/assets/GenerationComparisonOutputHeader/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/assets/GenerationComparisonOutputHeader/index.tsx @@ -1,11 +1,11 @@ -import {memo, useMemo} from "react" +import {memo, useCallback} from "react" import {Typography} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" import Version from "@/oss/components/Playground/assets/Version" -import {revisionListAtom} from "@/oss/components/Playground/state/atoms" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" import {useStyles} from "../styles" @@ -15,16 +15,15 @@ const GenerationComparisonOutputHeader: React.FC { - // Use atom-based state management - const revisions = useAtomValue(revisionListAtom) - - const {variantName, revision} = useMemo(() => { - const variant = (revisions || []).find((rev) => rev.id === variantId) - return { - variantName: variant?.variantName, - revision: variant?.revision, - } - }, [revisions, variantId]) + const {variantName, revision} = usePlayground({ + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variant = state.variants.find((variant) => variant.id === variantId) + return {variantName: variant?.variantName, revision: variant?.revision} + }, + [variantId], + ), + }) const classes = useStyles() return ( diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/index.tsx index a0a0ccb0b4..881ee58233 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerationComparisonView/index.tsx @@ -1,48 +1,49 @@ -import {useMemo} from "react" +import {useCallback} from "react" import clsx from "clsx" -import {useAtomValue} from "jotai" -import {usePlaygroundLayout} from "../../hooks/usePlaygroundLayout" -import {appChatModeAtom} from "../../state/atoms" +import usePlayground from "../../hooks/usePlayground" +import {findPropertyInObject} from "../../hooks/usePlayground/assets/helpers" +import type {PlaygroundStateData} from "../../hooks/usePlayground/types" +import {GenerationChatRow} from "../../state/types" import GenerationComparisonChatOutput from "./GenerationComparisonChatOutput" import GenerationComparisonCompletionOutput from "./GenerationComparisonCompletionOutput" -const GenerationComparisonOutput = ({ - rowId, - isLastRow, - isFirstRow, -}: { - rowId: string - isLastRow?: boolean - isFirstRow?: boolean -}) => { - // Use atom-based state management - const {displayedVariants} = usePlaygroundLayout() - const isChatVariant = useAtomValue(appChatModeAtom) - const isChat = isChatVariant +const GenerationComparisonOutput = ({rowId, isLastRow}: {rowId: string; isLastRow?: boolean}) => { + const {isChat, displayedVariants, chatHistory} = usePlayground({ + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const chatRow = findPropertyInObject(state, rowId) as GenerationChatRow + const chatHistory = chatRow?.history?.value?.map((item) => item.__id) + return {isChat: state.variants[0]?.isChat, chatHistory} + }, + [rowId], + ), + }) - return isChatVariant === undefined ? null : ( + return (
    - {isChat ? ( - - ) : ( - displayedVariants?.map((variantId, variantIndex) => ( - - )) - )} + {isChat + ? (chatHistory || []).map((chatId, historyIndex) => ( + + )) + : displayedVariants?.map((variantId, variantIndex) => ( + + ))}
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChat/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChat/index.tsx index 455262c296..ab896224be 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChat/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChat/index.tsx @@ -1,37 +1,91 @@ +import {useCallback} from "react" + import {Typography} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" -import {atom} from "jotai" -import {useSetAtom} from "jotai" -import LastTurnFooterControls from "@/oss/components/Playground/Components/ChatCommon/LastTurnFooterControls" -import {isComparisonViewAtom} from "@/oss/components/Playground/state/atoms" -import { - generationInputRowIdsAtom, - generationRowIdsAtom, -} from "@/oss/components/Playground/state/atoms/generationProperties" -import { - addChatTurnAtom, - runChatTurnAtom, - cancelChatTurnAtom, -} from "@/oss/state/newPlayground/chat/actions" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" +import {autoScrollToBottom} from "@/oss/components/Playground/assets/utilities/utilityFunctions" +import type {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import useLazyEffect from "@/oss/hooks/useLazyEffect" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {ObjectMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" +import usePlayground from "../../../../hooks/usePlayground" import PromptMessageConfig from "../../../PromptMessageConfig" -import GenerationChatTurnNormalized from "../GenerationChatTurnNormalized" +import GenerationChatRow from "../GenerationChatRow" import GenerationCompletionRow from "../GenerationCompletionRow" import type {GenerationChatProps} from "./types" const GenerationChat = ({variantId, viewAs}: GenerationChatProps) => { - const isComparisonView = useAtomValue(isComparisonViewAtom) - // Completion-style variable inputs for chat use normalized input rows with a derived fallback - const inputRowIds = useAtomValue(generationInputRowIdsAtom) as string[] - const turnIds = useAtomValue(generationRowIdsAtom) + const {inputRowIds, messageRowIds, viewType, historyIds, configMessageIds} = usePlayground({ + variantId, + hookId: "PlaygroundConfigVariantPrompts", + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const inputRows = state.generationData.inputs.value || [] + const messageRows = state.generationData.messages.value || [] + const configMessages = ( + state.variants.find((v) => v.id === variantId)?.prompts || [] + ).flatMap((variant) => { + return variant.messages.value + }) + + const historyIds = state.generationData.messages.value.reduce( + (acc, messageRow) => { + return { + ...acc, + [messageRow.__id]: messageRow.history.value.reduce( + (acc, historyItem) => { + const copyItem = structuredClone(historyItem) + delete copyItem.__runs + return [ + ...acc, + copyItem?.__id, + variantId + ? historyItem.__runs?.[variantId]?.__isRunning + ? `isRunning-${copyItem?.__id}` + : historyItem.__runs?.[variantId]?.__id + : undefined, + ].filter(Boolean) as string[] + }, + [] as string[], + ), + } + }, + {} as Record, + ) + + return { + inputRowIds: (inputRows || []) + .filter((inputRow) => { + return ( + Object.keys( + (getMetadataLazy(inputRow.__metadata) as ObjectMetadata) + ?.properties, + ).length > 0 + ) + }) + .map((inputRow) => inputRow.__id), + messageRowIds: (messageRows || []) + .map((messageRow) => { + return messageRow.__id + }) + .filter(Boolean) as string[], + configMessageIds: configMessages.map((message) => message.__id), + historyIds, + } + }, + [variantId], + ), + }) + const isComparisonView = viewType === "comparison" + + useLazyEffect(() => { + if (isComparisonView) return - // Config messages (read-only, single view only) - const prompts = useAtomValue(variantId ? promptsAtomFamily(variantId) : atom([])) as any[] - const configMessages = (prompts || []).flatMap((p: any) => p?.messages?.value || []) + const timer = autoScrollToBottom() + return timer + }, [messageRowIds]) return (
    @@ -41,22 +95,23 @@ const GenerationChat = ({variantId, viewAs}: GenerationChatProps) => { * meaning when there's */} {!!variantId && - inputRowIds.map((inputRowId) => ( - - ))} + inputRowIds.map((inputRowId) => { + return ( + + ) + })} - {/* Chat turns */} + {/* Prompt chats */}
    { ])} >
    - {!isComparisonView && ( -
    - Chat -
    - )} + {!isComparisonView && Chat}
    - {!isComparisonView && - (configMessages || []).map((m: any) => { - const contentStr = Array.isArray(m?.content?.value) - ? m.content.value - .map((p: any) => p?.text?.value || p?.text || "") - .join(" ") - : m?.content?.value || "" + {!isComparisonView + ? configMessageIds.map((messageId) => ( + + )) + : null} + {messageRowIds.map((messageRow) => { + return historyIds[messageRow].map((historyId, index) => { return ( - ) - })} - {turnIds.map((turnId) => ( - - ))} - {turnIds.length > 0 ? ( - - ) : null} + }) + })}
    @@ -110,25 +156,4 @@ const GenerationChat = ({variantId, viewAs}: GenerationChatProps) => { ) } -const FooterControlsSingle = ({ - variantId, - lastLogicalId, -}: { - variantId: string - lastLogicalId: string -}) => { - const addTurn = useSetAtom(addChatTurnAtom) - const runTurn = useSetAtom(runChatTurnAtom) - const cancelTurn = useSetAtom(cancelChatTurnAtom) - return ( - runTurn({turnId: lastLogicalId, variantId})} - onCancelAll={() => cancelTurn({turnId: lastLogicalId, variantId})} - onAddMessage={() => addTurn()} - className="p-3" - /> - ) -} - export default GenerationChat diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatRow/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatRow/index.tsx new file mode 100644 index 0000000000..a732b12181 --- /dev/null +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatRow/index.tsx @@ -0,0 +1,414 @@ +import {useCallback, useMemo} from "react" + +import clsx from "clsx" +import dynamic from "next/dynamic" + +import AddButton from "@/oss/components/Playground/assets/AddButton" +import RunButton from "@/oss/components/Playground/assets/RunButton" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import { + findPropertyInObject, + findVariantById, +} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" +import {createMessageFromSchema} from "@/oss/components/Playground/hooks/usePlayground/assets/messageHelpers" +import type {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import {GenerationChatHistoryItem} from "@/oss/components/Playground/state/types" +import {getMetadataLazy, getResponseLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {MessageWithRuns} from "@/oss/lib/hooks/useStatelessVariants/state/types" +import { + ArrayMetadata, + Enhanced, + ObjectMetadata, +} from "@/oss/lib/shared/variant/genericTransformer/types" + +import TextControl from "../../../PlaygroundVariantPropertyControl/assets/TextControl" +import PromptMessageConfig from "../../../PromptMessageConfig" + +import type {GenerationChatRowProps} from "./types" + +const GenerationResultUtils = dynamic(() => import("../GenerationResultUtils"), {ssr: false}) + +export const GenerationChatRowOutput = ({ + variantId, + message, + disabled = false, + rowId, + deleteMessage, + rerunMessage, + resultHash, + isRunning: propsIsRunning, + isMessageDeletable, + placeholder, + messageProps, + className, +}: GenerationChatRowProps) => { + const {viewType} = usePlayground({ + variantId, + rowId, + registerToWebWorker: true, + }) + const isComparisonView = viewType === "comparison" + const result = useMemo(() => { + return getResponseLazy(resultHash) + }, [resultHash]) + + const messageResult = useMemo(() => { + if (message?.__result) { + return getResponseLazy(message.__result) + } + + return undefined + }, [message?.__result]) + + return propsIsRunning ? ( +
    + +
    + ) : message.__hidden ? null : ( +
    + + +
    + ) : null + } + state={messageResult?.error ? "readOnly" : "filled"} + allowFileUpload + message={message} + editorProps={{enableTokens: false}} + /> + + ) +} + +const GenerationChatRow = ({ + withControls, + historyId, + variantId, + messageId, + rowId, + viewAs, + isMessageDeletable, + messageProps, + isRunning, +}: GenerationChatRowProps) => { + const { + historyItem, + historyItems, + disableRun, + messageRow, + viewType, + displayedVariants, + runTests, + cancelRunTests, + mutate, + rerunChatOutput, + } = usePlayground({ + variantId, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variant = findVariantById(state, variantId as string) + + if (messageId) { + return { + history: [findPropertyInObject(variant, messageId)], + } + } else { + const messageRow = (state.generationData.messages.value || []).find( + (inputRow) => { + return inputRow.__id === rowId + }, + ) + const messageHistory = messageRow?.history?.value || [] + const historyItem = findPropertyInObject( + messageHistory, + historyId || "", + ) as Enhanced + + const historyMessage = historyItem?.message + const historyMessages = historyItem?.messages + + const historyItems = + historyMessages && historyMessages.length > 0 + ? historyMessages.map((m) => ({ + ...historyItem, + ...m, + })) + : [ + { + ...historyItem, + ...historyMessage, + }, + ] + + const lastMessage = historyItems[historyItems.length - 1] + const lastMessageResult = getResponseLazy(lastMessage?.__result) + const disableRun = withControls && lastMessageResult?.error + + return { + messageRow, + historyItem: { + ...historyItem, + ...historyMessage, + }, + disableRun, + historyItems: historyItems, + history: messageHistory + .map((historyItem) => { + return !historyItem.__runs + ? historyItem + : variantId && historyItem.__runs[variantId] + ? { + ...historyItem.__runs[variantId].message, + __result: historyItem.__runs[variantId].__result, + __isRunning: historyItem.__runs[variantId].__isRunning, + } + : undefined + }) + .filter(Boolean), + } + } + }, + [withControls, variantId, messageId, rowId, historyId], + ), + }) + + const deleteMessage = useCallback((messageId: string) => { + mutate( + (clonedState) => { + if (!clonedState) return clonedState + + if (!variantId) { + const row = clonedState.generationData.messages.value.find( + (v) => v.__id === rowId, + ) + if (row) { + const isInput = row.history.value.findIndex((m) => m.__id === messageId) + if (isInput !== -1) { + row.history.value.splice(isInput, 1) + } + } + } else if (variantId) { + const row = clonedState.generationData.messages.value.find( + (v) => v.__id === rowId, + ) + if (row) { + const isInput = row.history.value.findIndex((m) => { + return m.__id === messageId + }) + if (isInput !== -1) { + row.history.value.splice(isInput, 1) + } else { + const isRunIndex = row.history.value.findIndex((m) => { + return m.__runs?.[variantId]?.message?.__id === messageId + }) + if (isRunIndex !== -1) { + delete row.history.value[isRunIndex].__runs?.[variantId] + } else { + const runIndex = row.history.value.findIndex((m) => { + return (m.__runs?.[variantId]?.messages || []).find( + (m) => m.__id === messageId, + ) + }) + + if (runIndex >= 0) { + const subRunIndex = ( + row.history.value[runIndex].__runs?.[variantId].messages || + [] + ).findIndex((m) => { + return m.__id === messageId + }) + + if (subRunIndex >= 0) { + row.history.value[runIndex].__runs[variantId].messages = + row.history.value[runIndex].__runs?.[ + variantId + ].messages?.filter((m) => m.__id !== messageId) + } + } + } + } + } + } + }, + {revalidate: false}, + ) + }, []) + + const addNewMessageToRowHistory = useCallback(() => { + mutate((clonedState) => { + if (!clonedState) return clonedState + + const messageRow = clonedState.generationData.messages.value.find((inputRow) => { + return inputRow.__id === rowId + }) + + if (!messageRow) return clonedState + + const _metadata = getMetadataLazy(messageRow.history.__metadata) + + const itemMetadata = _metadata?.itemMetadata as ObjectMetadata + const emptyMessage = createMessageFromSchema(itemMetadata, { + role: "user", + content: { + value: "", + }, + }) + + if (emptyMessage) { + messageRow.history.value.push(emptyMessage as GenerationChatHistoryItem) + } + + return clonedState + }) + }, [mutate, rowId]) + + const rerunMessage = useCallback( + (messageId: string) => { + rerunChatOutput?.(messageId) + }, + [rerunChatOutput], + ) + + return ( + <> +
    + {(historyItems || []).map((_historyItem) => { + const canRerun = () => { + if (_historyItem?.role?.value && _historyItem?.role?.value === "tool") { + return false + } + + if ( + viewType === "comparison" && + !variantId && + !!historyItem?.content?.value && + !!historyItem?.role?.value + ) { + const areAllRunning = Object.values(historyItem?.__runs || {}).every( + (run) => run?.__isRunning, + ) + const gotAllResponses = (displayedVariants || []).every((variantId) => { + return !!historyItem?.__runs?.[variantId]?.__result + }) + return !areAllRunning && gotAllResponses + } else if (viewType === "single" && !!variantId && !!historyItem) { + if (!historyItem?.__runs && !historyItem?.message) { + // this is an input row + const isRunning = Object.values(historyItem?.__runs || {}).every( + (run) => run?.__isRunning, + ) + return !isRunning + } else { + // this is a chat row + const isRunning = historyItem?.__isRunning + return !isRunning + } + } + return undefined + } + + return ( + + ) + })} +
    + {withControls ? ( +
    + {!!historyItem?.__isRunning || isRunning ? ( + cancelRunTests?.()} + size="small" + className="flex" + disabled={Boolean(disableRun)} + /> + ) : ( + runTests?.()} + className="flex" + /> + )} + +
    + ) : null} + + ) +} + +export default GenerationChatRow diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatRow/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatRow/types.d.ts new file mode 100644 index 0000000000..aadc2abbd9 --- /dev/null +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatRow/types.d.ts @@ -0,0 +1,22 @@ +import type {TestResult} from "@/oss/components/Playground/assets/utilities/transformer/types" + +import {PromptMessageConfigProps} from "../../../PromptMessageConfig/types" + +export interface GenerationChatRowProps { + variantId?: string + disabled?: boolean + rowId?: string + resultHash?: TestResult | string | null + historyId?: string + placeholder?: string + withControls?: boolean + messageId?: string + viewAs?: "input" | "output" + isRunning?: boolean + message?: GenerationChatHistoryItem + result?: TestResult + isMessageDeletable?: boolean + messageProps?: Partial + deleteMessage?: (messageId: string) => void + rerunMessage?: (messageId: string) => void +} diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatTurnNormalized/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatTurnNormalized/index.tsx deleted file mode 100644 index 8217746705..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationChatTurnNormalized/index.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import {useCallback, useMemo} from "react" - -// antd imports not needed here -import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" -import dynamic from "next/dynamic" - -import TurnMessageAdapter from "@/oss/components/Playground/adapters/TurnMessageAdapter" -import TypingIndicator from "@/oss/components/Playground/assets/TypingIndicator" -import ControlsBar from "@/oss/components/Playground/Components/ChatCommon/ControlsBar" -import {ClickRunPlaceholder} from "@/oss/components/Playground/Components/PlaygroundGenerations/assets/ResultPlaceholder" -import {useAssistantDisplayValue} from "@/oss/components/Playground/hooks/chat/useAssistant" -import useEffectiveRevisionId from "@/oss/components/Playground/hooks/chat/useEffectiveRevisionId" -import useHasAssistantContent from "@/oss/components/Playground/hooks/chat/useHasAssistantContent" -import {displayedVariantsAtom} from "@/oss/components/Playground/state/atoms" -import {resolvedGenerationResultAtomFamily} from "@/oss/components/Playground/state/atoms/generationProperties" -import {assistantMessageAtomFamily, chatTurnAtomFamily} from "@/oss/state/generation/selectors" -import { - addChatTurnAtom, - runChatTurnAtom, - cancelChatTurnAtom, -} from "@/oss/state/newPlayground/chat/actions" - -interface Props { - turnId: string - variantId?: string - withControls?: boolean - className?: string -} - -const GenerationResultUtils = dynamic(() => import("../GenerationResultUtils"), {ssr: false}) - -const GenerationChatTurnNormalized = ({ - turnId, - variantId, - withControls, - className, - hideUserMessage = false, - messageProps, -}: Props) => { - const displayedVariantIds = useAtomValue(displayedVariantsAtom) - const setAddTurn = useSetAtom(addChatTurnAtom) - const runTurn = useSetAtom(runChatTurnAtom) - const cancelTurn = useSetAtom(cancelChatTurnAtom) - - const effectiveRevisionId = useEffectiveRevisionId(variantId, displayedVariantIds as any) - const resolvedTurnId = turnId - - // Run status and result for this turn + revision via normalized atoms - const genResultAtom = useMemo( - () => - resolvedGenerationResultAtomFamily({ - variantId: variantId as string, - rowId: (resolvedTurnId || turnId) as string, - }), - [variantId, resolvedTurnId, turnId], - ) - const {isRunning, result: inlineResult} = useAtomValue(genResultAtom) as any - const result = inlineResult - - const onRun = useCallback(() => { - runTurn({turnId, variantId: variantId as string | undefined}) - }, [runTurn, turnId, variantId, effectiveRevisionId, resolvedTurnId]) - - const onCancel = useCallback(() => { - if (!resolvedTurnId) return - cancelTurn({ - turnId: resolvedTurnId || turnId, - variantId: effectiveRevisionId as string | undefined, - }) - }, [cancelTurn, resolvedTurnId, turnId, effectiveRevisionId]) - - const sessionRowId = useMemo( - () => - (resolvedTurnId || - (variantId && turnId ? `turn-${variantId}-${turnId}` : turnId)) as string, - [resolvedTurnId, variantId, turnId], - ) - - const assistantMsg = useAtomValue( - useMemo( - () => - assistantMessageAtomFamily({ - turnId: sessionRowId, - revisionId: variantId as string, - }), - [sessionRowId, variantId], - ), - ) as any - - const displayAssistantValue = useAssistantDisplayValue(assistantMsg, result) - - const turnState = useAtomValue(useMemo(() => chatTurnAtomFamily(sessionRowId), [sessionRowId])) - - const toolMessages = useMemo(() => { - if (!variantId) return [] as any[] - const responses = turnState?.toolResponsesByRevision?.[variantId] - return Array.isArray(responses) ? responses : [] - }, [turnState, variantId]) - - const hasAssistantContent = useHasAssistantContent( - assistantMsg as any, - displayAssistantValue, - toolMessages.length > 0, - ) - - return ( -
    - {!hideUserMessage ? ( - - ) : null} - {withControls ? ( - setAddTurn()} - /> - ) : null} - {isRunning && !hasAssistantContent ? ( - // While running, suppress any previous assistant message/error to avoid stale content - - ) : hasAssistantContent ? ( - <> - : null} - messageProps={messageProps} - /> - {variantId - ? toolMessages.map((_, index) => ( - - )) - : null} - - ) : ( - - )} -
    - ) -} - -export default GenerationChatTurnNormalized diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletion/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletion/index.tsx index 2a84088951..d55a76d29f 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletion/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletion/index.tsx @@ -1,13 +1,15 @@ -import React, {useCallback} from "react" +import {useCallback} from "react" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" import AddButton from "@/oss/components/Playground/assets/AddButton" -import {usePlaygroundLayout} from "@/oss/components/Playground/hooks/usePlaygroundLayout" -import {generationInputRowIdsAtom} from "@/oss/components/Playground/state/atoms/generationProperties" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import {inputRowIdsAtom} from "@/oss/state/generation/entities" +import {componentLogger} from "@/oss/components/Playground/assets/utilities/componentLogger" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {findPropertyInObject} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" +import type {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {ArrayMetadata, ObjectMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" +import {createInputRow} from "@/oss/lib/shared/variant/inputHelpers" import GenerationCompletionRow from "../GenerationCompletionRow" @@ -20,34 +22,59 @@ const GenerationCompletion = ({ rowId, withControls, }: GenerationCompletionProps) => { - const {isComparisonView} = usePlaygroundLayout() - const viewType = isComparisonView ? "comparison" : "single" + const {inputRowId, mutate, viewType, inputRowIds} = usePlayground({ + variantId, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const inputRowId = findPropertyInObject(state, rowId as string) + const inputRows = state.generationData.inputs.value || [] - // Use derived row IDs: returns normalized ids; for completion with none, exposes a virtual default id - const inputRowIds = useAtomValue(generationInputRowIdsAtom) as string[] - const inputRowId = inputRowIds[0] || null + return { + inputRowId: inputRowId?.__id, + inputRowIds: inputRows?.map((row) => row?.__id), + } + }, + [rowId], + ), + }) - // EFFICIENT MUTATION: Use dedicated mutation atom instead of complex useCallback logic - const addNewInputRow = useSetAtom(inputRowIdsAtom) - const handleAddNewRow = useCallback(() => { - addNewInputRow((prev) => [...prev, `row-${generateId()}`]) - }, [addNewInputRow]) + const addNewInputRow = useCallback(() => { + mutate((clonedState) => { + if (!clonedState) return clonedState + + const _metadata = getMetadataLazy( + clonedState?.generationData.inputs.__metadata, + ) + + const itemMetadata = _metadata?.itemMetadata as ObjectMetadata + + if (!itemMetadata) return clonedState + + const inputKeys = Object.keys(itemMetadata.properties) + const newRow = createInputRow(inputKeys, itemMetadata) + + clonedState.generationData.inputs.value.push(newRow) + + return clonedState + }) + }, [mutate]) + + componentLogger("GenerationTestView", inputRowId) - // Ensure is handled at MainLayout level to avoid write-on-render here return (
    {viewType === "comparison" ? ( ) : ( - (inputRowIds || []).map((rowIdItem) => ( + (inputRowIds || []).map((row) => ( )) @@ -60,7 +87,7 @@ const GenerationCompletion = ({ {"mb-10": viewType !== "comparison"}, ])} > - +
    ) : null} diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/DefaultView.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/DefaultView.tsx deleted file mode 100644 index 091ec205aa..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/DefaultView.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import {useMemo} from "react" - -import clsx from "clsx" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" - -import VariableControlAdapter from "@/oss/components/Playground/adapters/VariableControlAdapter" -import RunButton from "@/oss/components/Playground/assets/RunButton" -import {variableIdsUnifiedAtomFamily} from "@/oss/state/newPlayground/generation/selectors" - -const GenerationVariableOptions = dynamic(() => import("../GenerationVariableOptions"), { - ssr: false, -}) - -interface Props { - rowId: string - variantId?: string - isChat: boolean - viewType: "single" | "comparison" - view?: string - disabled?: boolean - inputOnly?: boolean - resultHash: string | null - runRow: () => void - cancelRow: () => void - isBusy: boolean -} - -const DefaultView = ({ - rowId, - variantId, - isChat, - viewType, - view, - disabled, - inputOnly, - resultHash, - runRow, - cancelRow, - isBusy, -}: Props) => { - const variableIds = useAtomValue( - useMemo( - () => variableIdsUnifiedAtomFamily({rowId, revisionId: variantId || ""}), - [rowId, variantId], - ), - ) as string[] - - return ( - <> -
    -
    -
    - {variableIds.map((variableId) => ( -
    - - - {!inputOnly && ( - - )} -
    - ))} - - {!inputOnly && variableIds.length === 0 ? ( - - ) : null} -
    -
    -
    - - {!inputOnly ? ( -
    - {isBusy ? ( - - ) : ( - - )} -
    - ) : null} - - ) -} - -export default DefaultView diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/ErrorPanel.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/ErrorPanel.tsx deleted file mode 100644 index b6e676064c..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/ErrorPanel.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import dynamic from "next/dynamic" - -import SharedEditor from "../../../SharedEditor" - -const GenerationResultUtils = dynamic(() => import("../GenerationResultUtils"), {ssr: false}) - -export default function ErrorPanel({result}: {result: any}) { - const errorText = - typeof result?.error === "string" ? result.error : String(result?.error ?? "Error") - return ( - } - handleChange={() => undefined} - /> - ) -} diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/GenerationResponsePanel.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/GenerationResponsePanel.tsx deleted file mode 100644 index 3b54e0547f..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/GenerationResponsePanel.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import {useMemo} from "react" - -import dynamic from "next/dynamic" - -import ToolCallView from "@/oss/components/Playground/Components/ToolCallView" -import {deriveToolViewModelFromResult} from "@/oss/state/newPlayground/chat/parsers" - -import SharedEditor from "../../../SharedEditor" - -const GenerationResultUtils = dynamic(() => import("../GenerationResultUtils"), {ssr: false}) - -interface Props { - result: any -} - -export default function GenerationResponsePanel({result}: Props) { - const {toolData, isJSON, displayValue} = useMemo( - () => deriveToolViewModelFromResult(result), - [result], - ) - - if (toolData) { - return ( - } - /> - ) - } - - return ( - } - handleChange={() => undefined} - /> - ) -} diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/SingleView.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/SingleView.tsx deleted file mode 100644 index e750dd22dc..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/SingleView.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import {useMemo} from "react" - -import {Typography} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" - -import VariableControlAdapter from "@/oss/components/Playground/adapters/VariableControlAdapter" -import RunButton from "@/oss/components/Playground/assets/RunButton" -import TypingIndicator from "@/oss/components/Playground/assets/TypingIndicator" -import {variableIdsUnifiedAtomFamily} from "@/oss/state/newPlayground/generation/selectors" - -import {RunningPlaceholder, ClickRunPlaceholder} from "../ResultPlaceholder" - -import ErrorPanel from "./ErrorPanel" -import GenerationResponsePanel from "./GenerationResponsePanel" - -const GenerationVariableOptions = dynamic(() => import("../GenerationVariableOptions"), { - ssr: false, -}) - -interface Props { - rowId: string - variantId: string - isChat: boolean - isBusy: boolean - isRunning: boolean - inputOnly?: boolean - result: any - resultHash: string | null - runRow: () => void - cancelRow: () => void - containerClassName?: string -} - -const SingleView = ({ - rowId, - variantId, - isChat, - isBusy, - isRunning, - inputOnly, - result, - resultHash, - runRow, - cancelRow, - containerClassName, -}: Props) => { - const variableIds = useAtomValue( - useMemo( - () => variableIdsUnifiedAtomFamily({rowId, revisionId: variantId}), - [rowId, variantId], - ), - ) as string[] - - return ( -
    0}, - containerClassName, - ])} - > -
    - {variableIds.length > 0 && ( - <> -
    - - Variables - -
    -
    - {variableIds.map((id) => { - return ( -
    - -
    - ) - })} -
    - - )} - {!inputOnly && variableIds.length === 0 ? ( -
    - -
    - ) : null} - - {!inputOnly && ( - - )} -
    - {!inputOnly ? ( -
    -
    - {!isBusy ? ( - - ) : ( - - )} -
    - -
    - {isBusy ? ( - - ) : !result ? ( - - ) : result.error ? ( - - ) : result.response ? ( - - ) : null} -
    -
    - ) : null} -
    - ) -} - -export default SingleView diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/index.tsx index c2a2e38c52..934111c476 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationCompletionRow/index.tsx @@ -1,27 +1,34 @@ import {useCallback, useMemo} from "react" -import {atom, useAtomValue, useSetAtom} from "jotai" - -import {loadingByRowRevisionAtomFamily} from "@/oss/state/newPlayground/generation/runtime" -import {triggerWebWorkerTestAtom} from "@/oss/state/newPlayground/mutations/webWorkerIntegration" - -import {usePlaygroundLayout} from "../../../../hooks/usePlaygroundLayout" -import { - appChatModeAtom, - cancelTestsMutationAtom, - displayedVariantsAtom, -} from "../../../../state/atoms" -import { - resolvedGenerationResultAtomFamily, - generationRunStatusAtomFamily, -} from "../../../../state/atoms/generationProperties" - -import DefaultView from "./DefaultView" -import SingleView from "./SingleView" +import {Typography} from "antd" +import clsx from "clsx" +import JSON5 from "json5" +import dynamic from "next/dynamic" + +import RunButton from "@/oss/components/Playground/assets/RunButton" +import {autoScrollToBottom} from "@/oss/components/Playground/assets/utilities/utilityFunctions" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" +import useLazyEffect from "@/oss/hooks/useLazyEffect" +import {getResponseLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {getEnhancedProperties} from "@/oss/lib/shared/variant" + +import usePlayground from "../../../../hooks/usePlayground" +import PlaygroundVariantPropertyControl from "../../../PlaygroundVariantPropertyControl" +import SharedEditor from "../../../SharedEditor" +import GenerationOutputText from "../GenerationOutputText" + import {useStyles} from "./styles" import type {GenerationCompletionRowProps} from "./types" -// Keep dynamic imports local to presentational components +const GenerationResultUtils = dynamic(() => import("../GenerationResultUtils"), { + ssr: false, +}) +const GenerationVariableOptions = dynamic(() => import("../GenerationVariableOptions"), { + ssr: false, +}) + +const handleChange = () => undefined const GenerationCompletionRow = ({ variantId, @@ -30,108 +37,332 @@ const GenerationCompletionRow = ({ inputOnly, view, disabled, - forceSingle, ...props }: GenerationCompletionRowProps) => { const classes = useStyles() + const {resultHash, variableIds, isRunning, viewType, isChat, runTests, cancelRunTests} = + usePlayground({ + variantId, + rowId, + registerToWebWorker: true, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const inputRow = state.generationData.inputs.value.find((inputRow) => { + return inputRow.__id === rowId + }) + + const variables = getEnhancedProperties(inputRow) + const variableIds = variables.map((p) => p.__id) - const isChat = useAtomValue(appChatModeAtom) - - // Only subscribe to generation result atoms in completion mode - const generationResultAtom = useMemo( - () => (!isChat ? resolvedGenerationResultAtomFamily({variantId, rowId}) : null), - [isChat, variantId, rowId], - ) as any - - const resultState = - !isChat && generationResultAtom ? (useAtomValue(generationResultAtom) as any) : ({} as any) - const resultHash = resultState?.resultHash as string | null - const isRunning = Boolean(resultState?.isRunning) - const resultFromAtom = resultState?.result - - const displayedVariantIds = useAtomValue(displayedVariantsAtom) - const isBusy = useAtomValue( - useMemo( - () => - atom((get) => { - if (isChat) return false - if (variantId) { - const {isRunning: variantRunning} = get( - generationRunStatusAtomFamily({variantId, rowId}), - ) - const variantLoading = get( - loadingByRowRevisionAtomFamily({rowId, revisionId: variantId}), - ) - return Boolean(variantRunning || variantLoading) + const resultHash = variantId ? inputRow?.__runs?.[variantId]?.__result : null + const isRunning = variantId ? inputRow?.__runs?.[variantId]?.__isRunning : false + return { + isChat: state.variants[0]?.isChat, + variableIds, + resultHash, + isRunning, + inputText: variables?.[0]?.value, // Temporary implementation } + }, + [rowId, variantId], + ), + }) - const ids = Array.isArray(displayedVariantIds) ? displayedVariantIds : [] - return ids.some((vid) => { - const {isRunning: variantRunning} = get( - generationRunStatusAtomFamily({variantId: vid, rowId}), - ) - const variantLoading = get( - loadingByRowRevisionAtomFamily({rowId, revisionId: vid}), - ) - return Boolean(variantRunning || variantLoading) - }) - }), - [displayedVariantIds, isChat, rowId, variantId], - ), - ) - const {isComparisonView} = usePlaygroundLayout() - const viewType = isComparisonView ? "comparison" : "single" - const triggerTest = useSetAtom(triggerWebWorkerTestAtom) - const cancelTests = useSetAtom(cancelTestsMutationAtom) + useLazyEffect(() => { + if (!isChat) return + + const timer = autoScrollToBottom() + return timer + }, [resultHash, isChat]) - const result = !isChat ? resultFromAtom : undefined + const result = useMemo(() => { + return getResponseLazy(resultHash) + }, [resultHash]) const runRow = useCallback(async () => { - // In comparison view with no explicit variantId, trigger for all displayed variants - if (!variantId && Array.isArray(displayedVariantIds) && displayedVariantIds.length > 0) { - displayedVariantIds.forEach((vid) => { - triggerTest({rowId, variantId: vid} as any) - }) - return - } - // Single view or explicit variant run - triggerTest({rowId, variantId: variantId as string}) - }, [triggerTest, rowId, variantId, displayedVariantIds]) + runTests?.(rowId, viewType === "single" ? variantId : undefined) + }, [runTests, variantId, rowId, viewType]) const cancelRow = useCallback(async () => { - const variantIds = viewType === "single" && variantId ? [variantId] : displayedVariantIds - await cancelTests({rowId, variantIds, reason: "user_cancelled"} as any) - }, [cancelTests, displayedVariantIds, variantId, viewType, rowId]) - - // Single view content - return forceSingle || (viewType === "single" && view !== "focus" && variantId) ? ( - - ) : ( - + cancelRunTests?.(rowId, viewType === "single" ? variantId : undefined) + }, [cancelRunTests, variantId, rowId, viewType]) + + if (viewType === "single" && view !== "focus" && variantId) { + const responseData = result?.response?.data + let value = + typeof responseData === "string" + ? responseData + : typeof responseData === "object" && responseData.hasOwnProperty("content") + ? responseData.content + : "" + + let isJSON = false + try { + const parsed = JSON5.parse(value) + isJSON = true + value = JSON.stringify(parsed, null, 2) + } catch (e) { + isJSON = false + } + + return ( +
    0}, + classes.container, + ])} + {...props} + > +
    + {variableIds.length > 0 && ( + <> +
    + + Variables + +
    +
    + {variableIds.map((variableId) => { + return ( + + ) + })} +
    + + {!inputOnly && ( + + )} + + )} +
    + + {!inputOnly && ( +
    +
    + {!isRunning ? ( + + ) : ( + + )} +
    +
    + {isRunning ? ( + + ) : !result ? ( + + ) : result.error ? ( + + } + handleChange={handleChange} + /> + ) : result.response ? ( + Array.isArray(result.response?.data) ? ( + result.response.data.map((message, index) => { + let _json = false + try { + const parsed = JSON5.parse(message.content) + parsed.function.arguments = JSON5.parse( + parsed.function.arguments, + ) + const displayValue = { + arguments: parsed.function.arguments, + } + _json = true + + return ( + + + {parsed.function.name} + + + {parsed.id} + +
    + } + disabled + editorClassName="min-h-4 [&_p:first-child]:!mt-0" + footer={ + + } + handleChange={handleChange} + /> + ) + } catch (e) { + console.log("RENDER MSG ITEM ERROR!", message, e) + return
    errored
    + } + }) + ) : ( + + } + handleChange={handleChange} + /> + ) + ) : null} +
    + + {/**This is used in when we don't have variables to display */} + {variableIds.length === 0 ? ( + + ) : ( +
    + )} +
    + )} +
    + ) + } + + return ( + <> +
    +
    +
    + {variableIds.map((variableId) => { + return ( +
    + + + {!inputOnly && ( + + )} +
    + ) + })} +
    +
    +
    + + {!inputOnly ? ( +
    + {!isRunning ? ( + + ) : ( + + )} +
    + ) : null} + ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationHeader/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationHeader/index.tsx index a0d7b6d6e2..bc1ddf3263 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationHeader/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationHeader/index.tsx @@ -1,20 +1,14 @@ -import {useCallback, useEffect, useMemo} from "react" +import {useCallback, useEffect} from "react" import {Button, Tooltip, Typography} from "antd" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" -import {appTypeAtom} from "@/oss/components/Playground/state/atoms/app" -import { - generationInputRowIdsAtom, - generationRowIdsAtom, -} from "@/oss/components/Playground/state/atoms/generationProperties" -import {clearAllRunsMutationAtom} from "@/oss/components/Playground/state/atoms/utilityMutations" -import {runAllChatAtom} from "@/oss/state/newPlayground/chat/actions" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {findVariantById} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" import RunButton from "../../../../assets/RunButton" -import {usePlaygroundAtoms} from "../../../../hooks/usePlaygroundAtoms" -import {generationHeaderDataAtomFamily, triggerWebWorkerTestAtom} from "../../../../state/atoms" +import {clearRuns} from "../../../../hooks/usePlayground/assets/generationHelpers" +import type {PlaygroundStateData} from "../../../../hooks/usePlayground/types" import TestsetDrawerButton from "../../../Drawers/TestsetDrawer" import LoadTestsetButton from "../../../Modals/LoadTestsetModal/assets/LoadTestsetButton" @@ -23,40 +17,65 @@ import type {GenerationHeaderProps} from "./types" const GenerationHeader = ({variantId}: GenerationHeaderProps) => { const classes = useStyles() - - // ATOM-LEVEL OPTIMIZATION: Use focused atom for generation header data - // Memoize the atom to prevent infinite re-renders - const generationHeaderAtom = useMemo( - () => generationHeaderDataAtomFamily(variantId), - [variantId], - ) - const {resultHashes, isRunning} = useAtomValue(generationHeaderAtom) - - // Use optimized playground atoms for mutations - const playgroundAtoms = usePlaygroundAtoms() - const clearGeneration = useSetAtom(clearAllRunsMutationAtom) - - const triggerTest = useSetAtom(triggerWebWorkerTestAtom) - const runAllChat = useSetAtom(runAllChatAtom) - const appType = useAtomValue(appTypeAtom) - const completionRowIds = useAtomValue(generationInputRowIdsAtom) as string[] - - const runTests = useCallback(() => { - if (appType === "chat") runAllChat() - else { - // Run for all completion rows: iterate input row ids and trigger tests - for (const rid of completionRowIds || []) { - triggerTest({rowId: rid, variantId}) - } - } - }, [appType, runAllChat, completionRowIds, triggerTest, variantId]) + const {resultHashes, isRunning, mutate, runTests, cancelRunTests} = usePlayground({ + variantId, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variant = findVariantById(state, variantId) + + if (variant?.isChat) { + const messageRows = state.generationData.messages.value + + const resultHashes = messageRows + .flatMap((message) => { + const historyArray = message.history.value + return historyArray.map( + (history) => history.__runs?.[variantId]?.__result, + ) + }) + .filter(Boolean) + + const isRunning = messageRows.some((inputRow) => + inputRow.history.value.some((history) => + variantId ? history.__runs?.[variantId]?.__isRunning : false, + ), + ) + return {resultHashes, isRunning} + } else { + const inputRows = state.generationData.inputs.value + + const resultHashes = (inputRows || []).map((inputRow) => + variantId ? inputRow?.__runs?.[variantId]?.__result : null, + ) + + const isRunning = (inputRows || []).some((inputRow) => + variantId ? inputRow?.__runs?.[variantId]?.__isRunning : false, + ) + + return {resultHashes, isRunning} + } + }, + [variantId], + ), + }) + + const clearGeneration = useCallback(() => { + mutate( + (clonedState) => { + if (!clonedState) return clonedState + clearRuns(clonedState) + return clonedState + }, + {revalidate: false}, + ) + }, [mutate]) useEffect(() => { const listener = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key === "Enter") { e.preventDefault() e.stopPropagation() - if (!isRunning) runTests() + if (!isRunning) runTests?.() } } document.addEventListener("keydown", listener, true) @@ -66,53 +85,47 @@ const GenerationHeader = ({variantId}: GenerationHeaderProps) => { }, [runTests, isRunning]) return ( -
    -
    - - Generations - - -
    - - - - - - - - - {!isRunning ? ( - - runTests()} - disabled={isRunning} - /> - - ) : ( + + Generations + + +
    + + + + + + + + + {!isRunning ? ( + playgroundAtoms.cancelRunTests?.()} - className="flex" + isRunAll + type="primary" + onClick={() => runTests?.()} + disabled={isRunning} /> - )} -
    + + ) : ( + cancelRunTests?.()} className="flex" /> + )}
    -
    +
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationOutputText/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationOutputText/index.tsx new file mode 100644 index 0000000000..e769bfc570 --- /dev/null +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationOutputText/index.tsx @@ -0,0 +1,24 @@ +import {Typography} from "antd" +import clsx from "clsx" + +import {GenerationOutputTextProps} from "./types" + +const GenerationOutputText: React.FC = ({ + text, + type, + isPlaceholder = false, + className, + ...props +}) => { + return ( + + {text} + + ) +} + +export default GenerationOutputText diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationOutputText/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationOutputText/types.d.ts new file mode 100644 index 0000000000..c5731591cf --- /dev/null +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationOutputText/types.d.ts @@ -0,0 +1,8 @@ +import {Typography} from "antd" + +const {Text} = Typography + +export interface GenerationOutputTextProps extends React.ComponentProps { + text: string + isPlaceholder?: boolean +} diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/index.tsx index 9805def9b7..c04c684015 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/index.tsx @@ -7,23 +7,20 @@ import clsx from "clsx" import StatusRenderer from "@/oss/components/pages/observability/components/StatusRenderer" import ResultTag from "@/oss/components/ResultTag/ResultTag" import {formatCurrency, formatLatency, formatTokenUsage} from "@/oss/lib/helpers/formatters" -import {StatusCode} from "@/oss/services/tracing/types" +import {NodeStatusCode, NodeStatusDTO} from "@/oss/services/observability/types" import TraceDrawerButton from "../../../Drawers/TraceDrawer" import {GenerationResultUtilsProps} from "./types" -const GenerationResultUtils: React.FC = ({ - className, - showStatus = true, - result, -}) => { +const GenerationResultUtils: React.FC = ({className, result}) => { const tree = result?.response?.tree - const node = tree?.nodes?.[0] - const metricAcc = node?.metrics?.acc - const metricUnit = node?.metrics?.unit - const metric = metricAcc || metricUnit - const status = result?.error ? StatusCode.STATUS_CODE_ERROR : (node?.status as StatusCode) + const metric = tree?.nodes?.[0]?.metrics?.acc + const status = result?.error + ? { + code: NodeStatusCode.ERROR, + } + : (tree?.nodes?.[0]?.status as NodeStatusDTO) const durations = metric?.duration?.total const tokens = metric?.tokens?.total const costs = metric?.costs?.total @@ -41,39 +38,35 @@ const GenerationResultUtils: React.FC = ({ return (
    - + - {showStatus && } + - {durations ? ( - - {formattedLatency} - - ) : null} + + {formattedLatency} + - {tokens || costs ? ( - - {formattedTokens} / {formattedCosts} -
    - } - popoverContent={ - - -
    {formattedPrompts}
    -
    Prompt tokens
    -
    - -
    {formattedCompletions}
    -
    Completion tokens
    -
    + + {formattedTokens} / {formattedCosts} + + } + popoverContent={ + + +
    {formattedPrompts}
    +
    Prompt tokens
    - } - /> - ) : null} + +
    {formattedCompletions}
    +
    Completion tokens
    +
    +
    + } + /> ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/types.d.ts index 4d648c7710..8259579779 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils/types.d.ts @@ -3,5 +3,4 @@ import {TestResult} from "@/oss/components/Playground/assets/utilities/transform export interface GenerationResultUtilsProps { className?: string result: TestResult | null | undefined - showStatus?: boolean } diff --git a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationVariableOptions/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationVariableOptions/index.tsx index 2794232374..a80ca0906c 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationVariableOptions/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundGenerations/assets/GenerationVariableOptions/index.tsx @@ -1,60 +1,110 @@ -import {useMemo} from "react" +import {useCallback} from "react" import {Copy, MinusCircle} from "@phosphor-icons/react" import {Button} from "antd" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" -import {deleteGenerationInputRowMutationAtom} from "@/oss/components/Playground/state/atoms/mutations/input/deleteInputRow" -import {duplicateGenerationInputRowMutationAtom} from "@/oss/components/Playground/state/atoms/mutations/input/duplicateInputRow" -import {inputRowIdsAtom, inputRowsByIdFamilyAtom} from "@/oss/state/generation/entities" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {getEnhancedProperties} from "@/oss/lib/shared/variant" +import type {ArrayMetadata, ObjectMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" +import {createInputRow} from "@/oss/lib/shared/variant/inputHelpers" -import {usePlaygroundLayout} from "../../../../hooks/usePlaygroundLayout" +import usePlayground from "../../../../hooks/usePlayground" +import {PlaygroundStateData} from "../../../../hooks/usePlayground/types" import PlaygroundGenerationVariableMenu from "../../../Menus/PlaygroundGenerationVariableMenu" import type {GenerationVariableOptionsProps} from "./types" const GenerationVariableOptions: React.FC = ({ rowId, + variantId, className, resultHash, variableId, }) => { - const inputRowIds = useAtomValue(inputRowIdsAtom) - const rowState = useAtomValue(useMemo(() => inputRowsByIdFamilyAtom(rowId), [rowId])) as any - const variableValue = useMemo(() => { - try { - const node = (rowState?.variables || []).find((n: any) => n?.__id === variableId) - const v = node ? (node?.content?.value ?? node?.value) : "" - return typeof v === "string" ? v : String(v ?? "") - } catch { - return "" - } - }, [rowState, variableId]) - const {isComparisonView} = usePlaygroundLayout() - - // EFFICIENT MUTATIONS: Use dedicated mutation atoms instead of complex useCallback logic - const deleteInputRow = useSetAtom(deleteGenerationInputRowMutationAtom) - const duplicateInputRow = useSetAtom(duplicateGenerationInputRowMutationAtom) - - // Derive inputRows length from inputRowIds for safety check - const inputRowsLength = inputRowIds?.length || 0 - const viewType = isComparisonView ? "comparison" : "single" + const {mutate, viewType, inputRows, variable} = usePlayground({ + variantId, + hookId: "GenerationVariableOptions", + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const inputRows = state.generationData.inputs.value || [] + const inputRow = inputRows.find((inputRow) => { + return inputRow.__id === rowId + }) + const variables = getEnhancedProperties(inputRow) + const variable = variables.find((p) => p.__id === variableId) + + return {inputRows, variable} + }, + [rowId, variableId], + ), + }) + + const deleteInputRow = useCallback(() => { + mutate( + (clonedState) => { + if (!clonedState) return clonedState + + const generationRows = clonedState.generationData.inputs.value + clonedState.generationData.inputs.value = generationRows.filter( + (row) => row.__id !== rowId, + ) + + return clonedState + }, + {revalidate: false}, + ) + }, []) + + const duplicateInputRow = useCallback(() => { + mutate( + (clonedState) => { + if (!clonedState) return clonedState + + const _metadata = getMetadataLazy( + clonedState?.generationData.inputs.__metadata, + ) + const itemMetadata = _metadata?.itemMetadata as ObjectMetadata + + if (!itemMetadata) return clonedState + + const inputKeys = Object.keys( + itemMetadata.properties, + ) as (keyof typeof existingRow)[] + const newRow = createInputRow(inputKeys, itemMetadata) + + const existingRow = clonedState?.generationData.inputs.value.find( + (row) => row.__id === rowId, + ) + + if (existingRow) { + inputKeys.forEach((key) => { + if (existingRow[key] !== undefined) { + newRow[key] = structuredClone(existingRow[key]) + } + }) + } + + clonedState.generationData.inputs.value.push(newRow) + + return clonedState + }, + {revalidate: false}, + ) + }, []) return (
    + />
    Average Latency - {avgLatency} + {calculateAverageLatency("duration")}
    Average Cost - {avgTokens} / {avgCost} + {calculateAverageLatency("tokens")} /{" "} + {calculateAverageLatency("costs")}
    diff --git a/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/assets/VariantNavigationCard/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/assets/VariantNavigationCard/types.d.ts index 60475bfb8d..14445031dc 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/assets/VariantNavigationCard/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/assets/VariantNavigationCard/types.d.ts @@ -1,6 +1,6 @@ export interface VariantNavigationCardProps { id: string className?: string - revisionId: string + variantId: string handleScrollClick: () => void } diff --git a/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/index.tsx index a76445ef24..e7fd177a39 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundPromptComparisonView/PromptComparisonVariantNavigation/index.tsx @@ -5,12 +5,8 @@ import {restrictToParentElement} from "@dnd-kit/modifiers" import {arrayMove, SortableContext, verticalListSortingStrategy} from "@dnd-kit/sortable" import {Typography} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" -import {writePlaygroundSelectionToQuery} from "@/oss/state/url/playground" - -import {usePlaygroundLayout} from "../../../hooks/usePlaygroundLayout" -import {selectedVariantsAtom} from "../../../state/atoms" +import usePlayground from "../../../hooks/usePlayground" import VariantNavigationCard from "./assets/VariantNavigationCard" import type {PromptComparisonVariantNavigationProps} from "./types" @@ -20,8 +16,7 @@ const PromptComparisonVariantNavigation = ({ handleScroll, ...props }: PromptComparisonVariantNavigationProps) => { - const {displayedVariants} = usePlaygroundLayout() - const selectedVariants = useAtomValue(selectedVariantsAtom) + const {displayedVariants, setDisplayedVariants} = usePlayground() const sensors = useSensors( useSensor(PointerSensor, { @@ -38,21 +33,14 @@ const PromptComparisonVariantNavigation = ({ const {active, over} = event if (over?.id && active.id && active.id !== over?.id) { - // Get current revision IDs from selectedVariants (which is a string array) - const currentRevisionIds = selectedVariants || [] - - const oldIndex = currentRevisionIds.indexOf(active.id) - const newIndex = currentRevisionIds.indexOf(over.id) - - if (oldIndex !== -1 && newIndex !== -1) { - // Reorder the array - const reorderedRevisions = arrayMove(currentRevisionIds, oldIndex, newIndex) + const oldIndex = displayedVariants!.indexOf(active.id) + const newIndex = displayedVariants!.indexOf(over.id) - void writePlaygroundSelectionToQuery(reorderedRevisions) - } + const newArray = arrayMove(displayedVariants!, oldIndex, newIndex) + setDisplayedVariants?.(newArray) } }, - [selectedVariants], + [displayedVariants], ) return ( @@ -69,17 +57,19 @@ const PromptComparisonVariantNavigation = ({ modifiers={[restrictToParentElement]} > - {displayedVariants?.map((variantId, idx) => ( - handleScroll(idx)} - /> - ))} + {displayedVariants?.map((variantId, idx) => { + return ( + handleScroll(idx)} + /> + ) + })} diff --git a/web/oss/src/components/Playground/Components/PlaygroundTool/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundTool/index.tsx index 7287135a11..63612c7ed7 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundTool/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundTool/index.tsx @@ -1,321 +1,219 @@ -import React, {useCallback, useEffect, useMemo, useRef, useState} from "react" +import {useCallback, useEffect, useMemo, useState} from "react" import {Input, Tooltip} from "antd" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" import JSON5 from "json5" -import {v4 as uuidv4} from "uuid" import {EditorProvider} from "@/oss/components/Editor/Editor" -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" +import usePlayground from "../../hooks/usePlayground" +import { + findParentOfPropertyInObject, + findVariantById, +} from "../../hooks/usePlayground/assets/helpers" import PlaygroundVariantPropertyControlWrapper from "../PlaygroundVariantPropertyControl/assets/PlaygroundVariantPropertyControlWrapper" import PromptMessageContentOptions from "../PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/PromptMessageContentOptions" import SharedEditor from "../SharedEditor" import {TOOL_SCHEMA} from "./assets" -export type ToolFunction = { - name?: string - description?: string - [k: string]: any -} - -export type ToolObj = { - function?: ToolFunction - [k: string]: any -} | null - -export interface PlaygroundToolProps { - value: unknown - disabled?: boolean - variantId: string - baseProperty?: {__id?: string} & Record - editorProps?: { - handleChange?: (obj: ToolObj) => void - } -} - -function safeStringify(obj: any): string { - try { - return JSON.stringify(obj, null, 2) - } catch { - return "" - } -} - -// stable stringify - sorts keys so deep equals is reliable -function stableStringify(input: any): string { - const seen = new WeakSet() - function sortKeys(value: any): any { - if (value && typeof value === "object") { - if (seen.has(value)) return null // guard against cycles - seen.add(value) - if (Array.isArray(value)) return value.map(sortKeys) - const out: Record = {} - Object.keys(value) - .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)) - .forEach((k) => { - out[k] = sortKeys(value[k]) - }) - return out +const PlaygroundTool = ({value, disabled, variantId, baseProperty, ...editorProps}) => { + const [minimized, setMinimized] = useState(false) + const [toolString, setToolString] = useState(() => { + try { + return typeof value === "string" ? value : JSON5.stringify(value) + } catch (e) { + return null } - return value - } - try { - return JSON.stringify(sortKeys(input)) - } catch { - return "" - } -} - -function deepEqual(a: any, b: any): boolean { - return stableStringify(a) === stableStringify(b) -} - -function toToolObj(value: unknown): ToolObj { - try { - if (typeof value === "string") return value ? (JSON5.parse(value) as ToolObj) : {} - if (value && typeof value === "object") return value as ToolObj - return {} - } catch { - // Keep last known good - return {} - } -} - -/** - * Manages the tool JSON editor state and parsed object snapshot. - * - Emits onChange only when the canonical object actually changes (deep compare) - * - Reacts to external prop changes to `initialValue` - */ -function useToolState( - initialValue: unknown, - isReadOnly: boolean, - onChange?: (obj: ToolObj) => void, -) { - const [toolObj, setToolObj] = useState(() => toToolObj(initialValue)) - const [editorText, setEditorText] = useState(() => safeStringify(toolObj ?? {})) - const [editorValid, setEditorValid] = useState(true) - - // Last sent payload to avoid duplicate onChange calls - const lastSentSerializedRef = useRef(stableStringify(toolObj)) - - // Emit to parent when canonical state changes - useEffect(() => { - if (isReadOnly || !onChange) return - const current = stableStringify(toolObj) - if (current !== lastSentSerializedRef.current) { - lastSentSerializedRef.current = current - onChange(toolObj) + }) + const [functionName, setFunctionName] = useState(() => { + try { + return typeof value === "string" + ? JSON5.parse(value)?.function?.name + : value?.function?.name + } catch (err) { + return null + } + }) + const [functionDescription, setFunctionDescription] = useState(() => { + try { + return typeof value === "string" + ? JSON5.parse(value)?.function?.description + : value?.function?.description + } catch (err) { + return null + } + }) + + const parsed = useMemo(() => { + if (!toolString) return null + try { + return JSON5.parse(toolString) + } catch (e) { + return null } - }, [toolObj, onChange, isReadOnly]) + }, [toolString]) - // React to external initialValue changes - const lastPropValueRef = useRef(stableStringify(toToolObj(initialValue))) useEffect(() => { - const nextParsed = toToolObj(initialValue) - const nextSerialized = stableStringify(nextParsed) - if (nextSerialized !== lastPropValueRef.current) { - lastPropValueRef.current = nextSerialized - setToolObj(nextParsed) - setEditorText(safeStringify(nextParsed ?? {})) - setEditorValid(true) + if (!toolString) { + return } - }, [initialValue]) - const onEditorChange = useCallback( - (text: string) => { - if (isReadOnly) return - setEditorText(text) - try { - const parsed = text ? (JSON5.parse(text) as ToolObj) : {} - setEditorValid(true) - setToolObj((prev) => (deepEqual(prev, parsed) ? prev : parsed)) - } catch { - setEditorValid(false) + try { + const toolObj = JSON5.parse(toolString) + if (toolObj && toolObj.function) { + toolObj.function.name = functionName } - }, - [isReadOnly], - ) - - return { - toolObj, - editorText, - editorValid, - onEditorChange, - } -} + setToolString(JSON.stringify(toolObj)) + } catch (err) { + console.error(err) + } + }, [functionName]) -/** - * Header component - isolated to avoid re-creating callbacks unnecessarily - */ -function ToolHeader(props: { - idForActions: string - name: string - desc: string - editorValid: boolean - isReadOnly: boolean - minimized: boolean - onToggleMinimize: () => void - onDelete?: () => void -}) { - const {name, desc, editorValid, isReadOnly, minimized, onToggleMinimize, onDelete} = props + useEffect(() => { + if (!toolString) { + return + } - return ( -
    -
    -
    - - - + try { + const toolObj = JSON5.parse(toolString) + if (toolObj && toolObj.function) { + toolObj.function.description = functionDescription + } - - - -
    -
    + setToolString(JSON.stringify(toolObj)) + } catch (err) { + console.error(err) + } + }, [functionDescription]) - { + try { + const parsedTool = JSON5.parse(toolString) + editorProps?.handleChange?.(parsedTool) + setFunctionName((currentName) => { + if (currentName !== parsedTool?.function?.name) { + return parsedTool?.function?.name } - hideMarkdownToggle={true} - /> -
    - ) -} - -const PlaygroundTool: React.FC = ({ - value, - disabled, - variantId, - baseProperty, - editorProps, -}) => { - const editorIdRef = useRef(uuidv4()) - const isReadOnly = Boolean(disabled) - const [minimized, setMinimized] = useState(false) + return currentName + }) + setFunctionDescription((currentDescription) => { + if (currentDescription !== parsedTool?.function?.description) { + return parsedTool?.function?.description + } + return currentDescription + }) + } catch (e) { + if (!toolString) { + setFunctionName(null) + setFunctionDescription(null) + } + } + }, [toolString]) - const {toolObj, editorText, editorValid, onEditorChange} = useToolState( - value, - isReadOnly, - editorProps?.handleChange, - ) + const {mutate} = usePlayground() + const deleteMessage = useCallback(() => { + mutate((draftState) => { + const variant = findVariantById(draftState, variantId) - useAtomValue(variantByRevisionIdAtomFamily(variantId)) - const appUriInfo = useAtomValue(appUriInfoAtom) - const setPrompts = useSetAtom( - useMemo(() => promptsAtomFamily(variantId), [variantId, appUriInfo?.routePath]), - ) + const x = findParentOfPropertyInObject(variant, baseProperty.__id) + if (x) { + x.value = x.value.filter((v) => v.__id !== baseProperty.__id) + } - const deleteMessage = useCallback(() => { - if (isReadOnly) return - const id = baseProperty?.__id - if (!id) { - console.warn("Cannot delete tool - missing tool property ID") - return - } - setPrompts((prevPrompts: any[] = []) => { - return prevPrompts.map((prompt: any) => { - const toolsArr = prompt?.llmConfig?.tools?.value - if (Array.isArray(toolsArr)) { - const updatedTools = toolsArr.filter((tool: any) => tool.__id !== id) - if (updatedTools.length !== toolsArr.length) { - return { - ...prompt, - llmConfig: { - ...prompt.llmConfig, - tools: { - ...prompt.llmConfig?.tools, - value: updatedTools, - }, - }, - } - } - } - return prompt - }) + return draftState }) - }, [isReadOnly, baseProperty?.__id, setPrompts]) + }, [variantId, baseProperty.id]) return ( - _div]:!w-auto [&_>_div]:!grow !my-0", - {"[_.agenta-shared-editor]:w-full": isReadOnly}, - )} - > + { - if (isReadOnly) return - onEditorChange(e) + setToolString(e) }} - syncWithInitialValueChanges editorType="border" className={clsx([ "mt-2", - minimized - ? "[&_.agenta-editor-wrapper]:h-[calc(8px+calc(3*19.88px))] [&_.agenta-editor-wrapper]:overflow-y-auto [&_.agenta-editor-wrapper]:!mb-0" - : "[&_.agenta-editor-wrapper]:h-fit", + { + "[&_.agenta-editor-wrapper]:h-[calc(8px+calc(3*19.88px))] [&_.agenta-editor-wrapper]:overflow-y-auto [&_.agenta-editor-wrapper]:!mb-0": + minimized, + "[&_.agenta-editor-wrapper]:h-fit": !minimized, + }, ])} - state={isReadOnly ? "readOnly" : "filled"} + state="filled" header={ - setMinimized((v) => !v)} - onDelete={deleteMessage} - /> +
    +
    +
    + + { + setFunctionName(e.target.value) + }} + /> + + + { + setFunctionDescription(e.target.value) + }} + /> + +
    +
    + + { + setMinimized((current) => !current) + }, + }} + hideMarkdownToggle={true} + /> +
    } />
    diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/Editors.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/Editors.tsx deleted file mode 100644 index 7b7f3dcadd..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/Editors.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import {useEffect, memo} from "react" - -import {Spin} from "antd" -import clsx from "clsx" - -import {useVariantPrompts} from "@/oss/components/Playground/hooks/useVariantPrompts" - -import PlaygroundVariantConfigPrompt from "../../PlaygroundVariantConfigPrompt" -import PlaygroundVariantCustomProperties from "../../PlaygroundVariantCustomProperties" - -const PlaygroundVariantConfigEditors = ({ - variantId, - className, - ...divProps -}: { - variantId: string - className?: string -}) => { - const {promptIds, variantExists, debug} = useVariantPrompts(variantId) - - useEffect(() => { - if (process.env.NODE_ENV !== "production") { - console.info("[PlaygroundVariantConfigEditors]", { - variantId, - promptCount: promptIds.length, - variantExists, - debug, - }) - } - }, [variantId, promptIds.length, variantExists, debug]) - - if (!variantExists) { - return ( -
    - - variantId: {variantId} -
    - ) - } - - return ( -
    - {promptIds.map((promptId) => ( - - ))} - -
    - ) -} - -export default memo(PlaygroundVariantConfigEditors) diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/PlaygroundVariantConfigHeader.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/PlaygroundVariantConfigHeader.tsx index 90f5655715..f9704743ef 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/PlaygroundVariantConfigHeader.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/PlaygroundVariantConfigHeader.tsx @@ -1,17 +1,13 @@ -import {useCallback, useMemo} from "react" +import {useCallback} from "react" import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" -import { - enhancedRevisionByIdAtomFamily, - revisionDeploymentAtomFamily, -} from "@/oss/state/variant/atoms/fetcher" +import {atomStore, allRevisionsAtom} from "@/oss/lib/hooks/useStatelessVariants/state" -// import {baselineVariantAtomFamily} from "../../../state/atoms/dirtyState" -import {switchVariantAtom} from "../../../state/atoms/urlSync" import SelectVariant from "../../Menus/SelectVariant" import CommitVariantChangesButton from "../../Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton" import DeployVariantButton from "../../Modals/DeployVariantModal/assets/DeployVariantButton" @@ -27,109 +23,103 @@ const PlaygroundVariantHeaderMenu = dynamic( const PlaygroundVariantConfigHeader = ({ variantId, className, - embedded, - variantNameOverride, - revisionOverride, ...divProps -}: PlaygroundVariantConfigHeaderProps & {embedded?: boolean}) => { +}: PlaygroundVariantConfigHeaderProps) => { const classes = useStyles() + const {deployedIn, isLatestRevision, variantRevision, isDirty, mutate, _variantId} = + usePlayground({ + variantId, + hookId: "PlaygroundVariantConfigHeader", + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variants = state.variants + const variant = variants.find((v) => v.id === variantId) + const isDirty = state.dirtyStates?.[variantId] - // Read baseline revision directly from the source of truth (revisionListAtom) - const baseline = useAtomValue(enhancedRevisionByIdAtomFamily(variantId || "")) - const deployment = useAtomValue( - revisionDeploymentAtomFamily((baseline?.id as string) || ""), - ) as any - - // Extract revision display data with fallbacks for embedded usage - const _variantId = baseline?.id ?? variantId - const variantRevision = revisionOverride ?? baseline?.revision ?? null - const displayName = - variantNameOverride ?? - (baseline as any)?.variantName ?? - (baseline as any)?.name ?? - _variantId - const isLatestRevision = baseline?.isLatestRevision - // Keep the full deployment objects so downstream components (e.g., EnvironmentStatus) - // can access env.name and other fields. - const deployedIn = Array.isArray(deployment) ? (deployment as any[]) : [] - - // Stable minimal variant shape for presentational children - const variantMin = useMemo( - () => ({ - id: (_variantId as string) || "", - deployedIn, - isLatestRevision: isLatestRevision ?? false, - }), - [_variantId, deployedIn, isLatestRevision], - ) - - // Use the reusable switchVariant atom - const switchVariant = useSetAtom(switchVariantAtom) + return { + isDirty, + _variantId: variant?.id, + variantRevision: variant?.revision, + deployedIn: variant?.deployedIn, + isLatestRevision: variant?.isLatestRevision, + } + }, + [variantId], + ), + }) - const handleSwitchVariant = useCallback( + const switchVariant = useCallback( (newVariantId: string) => { - switchVariant({ - currentVariantId: variantId || "", - newVariantId, + // Get all revisions from atom store + const allRevisions = atomStore.get(allRevisionsAtom) || [] + + mutate((clonedState) => { + if (!clonedState) return clonedState + + // Update selected variants array by replacing the current variant with the new one + const previousSelected = [...clonedState.selected] + previousSelected.splice( + previousSelected.findIndex((id) => id === variantId), + 1, + newVariantId, + ) + clonedState.selected = previousSelected + + // Find the new variant in the atom store + const revisionToAdd = allRevisions.find( + (rev: {id: string}) => rev.id === newVariantId, + ) + + // Add the new variant to the variants array if it's not already there + if (revisionToAdd && !clonedState.variants.some((v) => v.id === newVariantId)) { + clonedState.variants = [...clonedState.variants, revisionToAdd] + console.log("Added variant from atom store in switchVariant:", newVariantId) + } + + return clonedState }) }, - [switchVariant, variantId], + [mutate, variantId], ) return (
    - {!embedded && ( - handleSwitchVariant?.(value)} - value={_variantId} - /> - )} - {embedded && !baseline ? ( -
    - {displayName as any} - {variantRevision !== null && variantRevision !== undefined && ( - - rev {String(variantRevision)} - - )} -
    - ) : ( - - )} + switchVariant?.(value)} value={_variantId} /> + +
    +
    + + + + +
    - {!embedded && ( -
    - - - - - -
    - )}
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/types.d.ts index 2cdc072dc9..9df21c6ca2 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/assets/types.d.ts @@ -2,7 +2,4 @@ import {BaseContainerProps} from "../../types" export interface PlaygroundVariantConfigHeaderProps extends BaseContainerProps { variantId: string - embedded?: boolean - variantNameOverride?: string - revisionOverride?: number | string | null } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/index.tsx index d8781e9abf..5e019501de 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfig/index.tsx @@ -1,10 +1,13 @@ -"use client" - -import {memo} from "react" +import {useCallback, memo} from "react" import clsx from "clsx" -import PlaygroundVariantConfigEditors from "./assets/Editors" +import type {EnhancedVariant} from "../../../../lib/shared/variant/transformer/types" +import {componentLogger} from "../../assets/utilities/componentLogger" +import usePlayground from "../../hooks/usePlayground" +import PlaygroundVariantConfigPrompt from "../PlaygroundVariantConfigPrompt" +import PlaygroundVariantCustomProperties from "../PlaygroundVariantCustomProperties" + import PlaygroundVariantConfigHeader from "./assets/PlaygroundVariantConfigHeader" import type {VariantConfigComponentProps} from "./types" @@ -23,13 +26,22 @@ import type {VariantConfigComponentProps} from "./types" * ``` */ -const PlaygroundVariantConfig: React.FC< - VariantConfigComponentProps & { - embedded?: boolean - variantNameOverride?: string - revisionOverride?: number | string | null - } -> = ({variantId, className, embedded, variantNameOverride, revisionOverride, ...divProps}) => { +const PlaygroundVariantConfig: React.FC = ({ + variantId, + className, + ...divProps +}) => { + const {promptIds = []} = usePlayground({ + variantId, + hookId: "PlaygroundConfigVariantPrompts", + variantSelector: useCallback((variant: EnhancedVariant) => { + const promptIds = (variant?.prompts || [])?.map((prompt) => prompt.__id) ?? [] + return {promptIds} + }, []), + }) + + componentLogger("PlaygroundVariantConfig", variantId, promptIds) + return (
    - + {promptIds.map((promptId) => ( + + ))} + -
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/ActionsOutputRenderer.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/ActionsOutputRenderer.tsx deleted file mode 100644 index 7be4ee6f2f..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/ActionsOutputRenderer.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React, {useMemo} from "react" - -import clsx from "clsx" -import {useSetAtom} from "jotai" - -import {getPromptById, getLLMConfig} from "@/oss/components/Playground/context/promptShape" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" - -import AddButton from "../../../assets/AddButton" -import { - addPromptMessageMutationAtomFamily, - addPromptToolMutationAtomFamily, -} from "../../../state/atoms/promptMutations" -import PlaygroundVariantPropertyControl from "../../PlaygroundVariantPropertyControl" -import TemplateFormatSelector from "./TemplateFormatSelector" - -interface Props { - variantId: string - compoundKey: string - viewOnly?: boolean -} - -const ActionsOutputRenderer: React.FC = ({variantId, compoundKey, viewOnly}) => { - const addNewMessage = useSetAtom(addPromptMessageMutationAtomFamily(compoundKey)) - const addNewTool = useSetAtom(addPromptToolMutationAtomFamily(compoundKey)) - const [, promptId] = compoundKey.split(":", 2) - const prompts = usePromptsSource(variantId) - - const responseFormatInfo = useMemo(() => { - const item = getPromptById(prompts, promptId) - const llm = getLLMConfig(item) - const enhancedId = llm?.responseFormat?.__id || llm?.response_format?.__id - const raw = llm?.response_format || llm?.responseFormat - return {enhancedId, raw} - }, [prompts, promptId]) - const responseFormatId = responseFormatInfo.enhancedId as string | undefined - return ( -
    _div]:!w-full": viewOnly, - })} - > - {!viewOnly && ( - <> - - - - )} -
    - {responseFormatId ? ( - - ) : ( - // Fallback for immutable/raw params (no property id) - - {(() => { - const t = (responseFormatInfo.raw || {})?.type - if (!t || t === "text") return "Default (text)" - if (t === "json_object") return "JSON mode" - if (t === "json_schema") return "JSON schema" - return String(t) - })()} - - )} -
    - -
    - ) -} - -export default ActionsOutputRenderer diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/MessagesRenderer.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/MessagesRenderer.tsx deleted file mode 100644 index 996f65476b..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/MessagesRenderer.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React, {useCallback, useMemo} from "react" - -import {Tag} from "antd" -import deepEqual from "fast-deep-equal" -import {useSetAtom} from "jotai" - -import {getPromptById, getArrayVal} from "@/oss/components/Playground/context/promptShape" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" - -import {deletePromptMessageMutationAtomFamily} from "../../../state/atoms/promptMutations" -import PromptMessageConfig from "../../PromptMessageConfig" -import SharedEditor from "../../SharedEditor" - -interface Props { - variantId: string - compoundKey: string - promptId: string - viewOnly?: boolean -} - -const MessagesRenderer: React.FC = ({promptId, variantId, compoundKey, viewOnly}) => { - const prompts = usePromptsSource(variantId) - const {messageIds, rawMessages} = useMemo(() => { - const item = getPromptById(prompts, promptId) - const arr = getArrayVal(item?.messages) - const ids = arr.map((m: any) => m?.__id).filter(Boolean) - return {messageIds: ids, rawMessages: arr} - }, [prompts, promptId, compoundKey]) - - const deleteMessageSetter = useSetAtom(deletePromptMessageMutationAtomFamily(compoundKey)) - const deleteMessage = useCallback( - (messageId: string) => deleteMessageSetter({messageId}), - [deleteMessageSetter], - ) - return ( - <> - {messageIds && messageIds.length > 0 - ? messageIds.map((messageId: string) => { - return ( - 1} - viewOnly={viewOnly} - /> - ) - }) - : // Fallback for immutable/raw prompts without property ids - (rawMessages || []).map((m: any, idx: number) => { - const role = m?.role || m?.role?.value || "user" - const content = m?.content?.value ?? m?.content - const text = Array.isArray(content) - ? content - .map( - (p: any) => - p?.text?.value || p?.text || p?.image_url?.url || "", - ) - .filter(Boolean) - .join("\n\n") - : typeof content === "string" - ? content - : JSON.stringify(content ?? "", null, 2) - - return ( -
    -
    - - {role} - -
    - -
    - ) - })} - - ) -} - -export default MessagesRenderer diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseContent.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseContent.tsx index e41e190959..384b2ff7b2 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseContent.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseContent.tsx @@ -1,23 +1,23 @@ -import {useEffect, useMemo} from "react" +import {useCallback} from "react" import {Alert} from "antd" import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {useAtomValue, useSetAtom} from "jotai" -import {selectAtom} from "jotai/utils" +import {v4 as uuidv4} from "uuid" -import {currentAppContextAtom} from "@/oss/state/app/selectors/app" -import { - promptsAtomFamily, - promptVariablesByPromptAtomFamily, -} from "@/oss/state/newPlayground/core/prompts" +import {findVariantById} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {ArrayMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" +import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" +import {createObjectFromMetadata} from "../../../../../lib/shared/variant/genericTransformer/helpers/arrays" +import AddButton from "../../../assets/AddButton" +import {hashMetadata} from "../../../assets/hash" +import {componentLogger} from "../../../assets/utilities/componentLogger" +import usePlayground from "../../../hooks/usePlayground" +import PlaygroundVariantPropertyControl from "../../PlaygroundVariantPropertyControl" +import PromptMessageConfig from "../../PromptMessageConfig" import type {PromptCollapseContentProps} from "../types" -import ActionsOutputRenderer from "./ActionsOutputRenderer" -import MessagesRenderer from "./MessagesRenderer" -import ToolsRenderer from "./ToolsRenderer" - /** * PlaygroundVariantConfigPromptCollapseContent renders the configuration interface * for a single prompt's messages. @@ -30,50 +30,203 @@ import ToolsRenderer from "./ToolsRenderer" * @component */ -const isCustomAtom = selectAtom(currentAppContextAtom, (ctx) => ctx.appType === "custom", deepEqual) const PlaygroundVariantConfigPromptCollapseContent: React.FC = ({ variantId, promptId, className, - viewOnly, ...props }) => { - // Minimal subscriptions by stable key `${revisionId}:${promptId}` - const compoundKey = `${variantId}:${promptId}` - - // Seed local prompts cache once to avoid first-edit race between derived and local state - const seedPrompts = useSetAtom(promptsAtomFamily(variantId)) - useEffect(() => { - seedPrompts((draft: any) => draft) - // run once per variantId mount - }, [variantId]) - - const promptVars = useAtomValue( - useMemo( - () => promptVariablesByPromptAtomFamily({revisionId: variantId, promptId}), - [variantId, promptId], + const { + responseFormatId, + promptName, + isCustom, + inputKeys, + messageIds, + toolIds, + mutateVariant, + hasVariable, + mutate, + } = usePlayground({ + variantId, + hookId: "PlaygroundConfigVariantPrompts", + variantSelector: useCallback( + (variant: EnhancedVariant) => { + const prompt = (variant.prompts || []).find((p) => p.__id === promptId) + const messages = prompt?.messages + + if (!messages) { + return {messageIds: []} + } + + return { + messageIds: messages.value.map((message) => message.__id), + inputKeys: prompt.inputKeys.value || [], + hasVariable: prompt.inputKeys.value.length > 0, + isCustom: variant.isCustom, + responseFormatId: prompt.llmConfig?.responseFormat?.__id, + responseFormat: prompt.llmConfig?.responseFormat?.value?.type, + promptName: prompt.__name, + toolIds: (prompt.llmConfig?.tools?.value || []).map((tool) => tool.__id), + } + }, + [promptId], ), - ) as string[] - const hasVariable = (promptVars?.length || 0) > 0 - const isCustom = useAtomValue(isCustomAtom) + }) + + const addNewTool = useCallback(() => { + if (!mutateVariant) return + + mutateVariant((draft) => { + const variantPrompt = draft.prompts?.find((p) => p.__id === promptId) + if (!variantPrompt?.llmConfig?.tools.value) { + variantPrompt.llmConfig.tools.value = [] + } + + variantPrompt?.llmConfig?.tools.value.push({ + __id: uuidv4(), + __metadata: hashMetadata({ + type: "object", + name: "ToolConfiguration", + description: "Tool configuration", + properties: { + type: { + type: "string", + description: "Type of the tool", + }, + name: { + type: "string", + description: "Name of the tool", + }, + description: { + type: "string", + description: "Description of the tool", + }, + parameters: { + type: "object", + properties: { + type: { + type: "string", + enum: ["object", "function"], + }, + }, + }, + }, + required: ["name", "description", "parameters"], + }), + value: { + type: "function", + function: { + name: "get_weather", + description: "Get current temperature for a given location.", + parameters: { + type: "object", + properties: { + location: { + type: "string", + description: "City and country e.g. Bogotá, Colombia", + }, + }, + required: ["location"], + additionalProperties: false, + }, + }, + }, + }) + + return draft + }) + }, [mutateVariant, promptId]) + const addNewMessage = useCallback(() => { + if (!mutateVariant) return + + mutateVariant((draft) => { + const variantPrompt = draft.prompts?.find((p) => p.__id === promptId) + const messages = variantPrompt?.messages.value + const parentMetadata = getMetadataLazy( + variantPrompt?.messages.__metadata, + ) + const metadata = parentMetadata?.itemMetadata + + if (variantPrompt && messages && metadata) { + const newMessage = createObjectFromMetadata(metadata) as (typeof messages)[number] + if (newMessage) { + messages.push(newMessage) + } + } + + return draft + }) + }, [mutateVariant, promptId]) + + const deleteMessage = useCallback( + (messageId: string) => { + if (!mutateVariant) return + + mutate( + (clonedState) => { + if (!clonedState) return clonedState + + const variant = findVariantById(clonedState, variantId) + + if (!variant) return clonedState + + const variantPrompt = variant.prompts?.find((p) => p.__id === promptId) + const messages = variantPrompt?.messages.value + + if (variantPrompt && messages) { + // Filter out the message with the specified ID + variantPrompt.messages.value = messages.filter( + (message) => message.__id !== messageId, + ) + } + + return clonedState + }, + {revalidate: false}, + ) + }, + [mutateVariant, promptId], + ) + + componentLogger( + "PlaygroundVariantConfigPromptCollapseContent", + variantId, + messageIds, + inputKeys, + ) return (
    - - - - {!isCustom && !hasVariable && !viewOnly && ( + {messageIds?.map((messageId) => ( + + ))} + {(toolIds || [])?.map((toolId) => ( +
    + +
    + ))} + + {!isCustom && !hasVariable && ( - Insert a {"{{variable}}"} in your - template to create an input. + Insert a {"{{ variable }}"} in + your template to create an input. } type="info" @@ -81,11 +234,19 @@ const PlaygroundVariantConfigPromptCollapseContent: React.FC )} - +
    + + + {responseFormatId ? ( +
    + +
    + ) : null} +
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseHeader.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseHeader.tsx index a77843b1da..b931e6ed48 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseHeader.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/PlaygroundVariantConfigPromptCollapseHeader.tsx @@ -1,12 +1,11 @@ -import {useMemo} from "react" +import {useCallback} from "react" import {Typography} from "antd" import clsx from "clsx" import dynamic from "next/dynamic" -import {getPromptById} from "@/oss/components/Playground/context/promptShape" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" - +import {EnhancedVariant} from "../../../../../lib/shared/variant/transformer/types" +import usePlayground from "../../../hooks/usePlayground" import type {PromptCollapseHeaderProps} from "../types" const {Text} = Typography @@ -36,22 +35,19 @@ const PlaygroundVariantConfigPromptCollapseHeader: React.FC { - const prompts = usePromptsSource(variantId) - const promptName = useMemo(() => { - const item = getPromptById(prompts, promptId) - return (item?.__name as string | undefined) ?? "Prompt" - }, [prompts, promptId]) + const {promptName} = usePlayground({ + variantId, + variantSelector: useCallback((variant: EnhancedVariant) => { + const prompt = variant?.prompts?.find((p) => p.__id === promptId) + return {promptName: prompt?.__name} + }, []), + }) return (
    - {promptName || "Prompt"} - + {promptName || "Prompt"} +
    ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/TemplateFormatSelector.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/TemplateFormatSelector.tsx deleted file mode 100644 index 16c140bfb6..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/TemplateFormatSelector.tsx +++ /dev/null @@ -1,167 +0,0 @@ -import {useMemo} from "react" - -import {useAtom} from "jotai" - -import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" -import type { - BaseOption, - OptionGroup, - SelectOptions, - StringMetadata, -} from "@/oss/lib/shared/variant/genericTransformer/types" -import { - promptTemplateFormatAtomFamily, - type PromptTemplateFormat, -} from "@/oss/components/Playground/state/atoms" -import SimpleDropdownSelect from "../../PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect" -import clsx from "clsx" - -interface TemplateFormatSelectorProps { - variantId: string - disabled?: boolean -} - -type TemplateOption = { - value: PromptTemplateFormat - label: string -} - -const FALLBACK_OPTIONS: TemplateOption[] = [ - {value: "curly", label: "curly"}, - // {value: "fstring", label: "fstring"}, - {value: "jinja2", label: "jinja2"}, -] - -const DEFAULT_LABEL = "Prompt syntax" - -const getTemplateFormatNode = (prompt: any): any => { - if (!prompt || typeof prompt !== "object") return undefined - return ( - prompt.templateFormat ?? - prompt.template_format ?? - prompt?.prompt?.templateFormat ?? - prompt?.prompt?.template_format - ) -} - -const isOptionGroupArray = (options: SelectOptions): options is OptionGroup[] => { - return ( - Array.isArray(options) && - options.length > 0 && - typeof options[0] === "object" && - options[0] !== null && - "options" in (options[0] as OptionGroup) - ) -} - -const normalizeOptions = (options?: SelectOptions): TemplateOption[] => { - if (!options) return [] - if (!Array.isArray(options)) return [] - - if (isOptionGroupArray(options)) { - return ( - options - .flatMap( - (group) => - (group.options || []) - .map((option) => { - const rawValue = option?.value ?? option?.label - if (!rawValue) return null - const value = String(rawValue) as PromptTemplateFormat - const label = option?.label ?? String(option.value ?? "") - return {value, label} - }) - .filter(Boolean) as TemplateOption[], - ) - // hard block fstring for grouped options too - .filter((opt) => opt.value !== "fstring") - ) - } - - return ( - (options as BaseOption[]) - // hard block fstring for flat options - .filter((option) => option.value !== "fstring") - .map((option) => { - const rawValue = option?.value ?? option?.label - if (!rawValue) return null - const value = String(rawValue) as PromptTemplateFormat - const label = option?.label ?? String(option.value ?? "") - return {value, label} - }) - .filter(Boolean) as TemplateOption[] - ) -} - -const TemplateFormatSelector: React.FC = ({ - variantId, - disabled = false, -}) => { - const templateAtom = useMemo(() => promptTemplateFormatAtomFamily(variantId), [variantId]) - const [format, setFormat] = useAtom(templateAtom) - const prompts = usePromptsSource(variantId) - - const {options, label} = useMemo(() => { - let metadata: StringMetadata | null = null - - for (const prompt of prompts || []) { - const node = getTemplateFormatNode(prompt) - if (node && typeof node === "object" && "__metadata" in node) { - const candidate = getMetadataLazy(node.__metadata) - if (candidate) { - metadata = candidate - if (candidate.options && candidate.options.length > 0) { - break - } - } - } - } - - const normalized = normalizeOptions(metadata?.options) - return { - options: normalized.length > 0 ? normalized : FALLBACK_OPTIONS, - label: DEFAULT_LABEL, - } - }, [prompts]) - - const dropdownOptions = useMemo( - () => - options.map((option) => ({ - key: option.value, - value: option.value, - label: option.label, - })), - [options], - ) - - const currentOption = useMemo( - () => options.find((option) => option.value === format), - [options, format], - ) - - const displayValue = useMemo(() => { - const optionLabel = currentOption?.label || format - return `${label}: ${optionLabel}` - }, [currentOption?.label, format, label]) - - return ( - setFormat(nextValue as PromptTemplateFormat)} - placeholder={label} - className={clsx( - "mt-2 border border-[#bdc7d1] h-[24px]", - "transition-all duration-200 ease-in-out", - "hover:!bg-transparent hover:!border-[#394857]", - disabled && "opacity-50 cursor-not-allowed", - )} - description={label} - withTooltip={false} - disabled={disabled} - /> - ) -} - -export default TemplateFormatSelector diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/ToolsRenderer.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/ToolsRenderer.tsx deleted file mode 100644 index 1ed98a6e82..0000000000 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/assets/ToolsRenderer.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React, {useMemo} from "react" - -import deepEqual from "fast-deep-equal" - -import {getPromptById, getArrayVal} from "@/oss/components/Playground/context/promptShape" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" - -import PlaygroundVariantPropertyControl from "../../PlaygroundVariantPropertyControl" - -interface Props { - variantId: string - compoundKey: string - viewOnly?: boolean -} - -const ToolsRenderer: React.FC = ({variantId, compoundKey, viewOnly}) => { - const [, promptId] = compoundKey.split(":", 2) - - const prompts = usePromptsSource(variantId) - const toolIds = useMemo(() => { - const item = getPromptById(prompts, promptId) - const llm = (item?.llmConfig ?? item?.llm_config) as any - const tools = getArrayVal(llm?.tools) - return tools.map((t: any) => t?.__id).filter(Boolean) - }, [prompts, promptId]) - - return ( - <> - {(toolIds || [])?.map((toolId) => ( -
    - -
    - ))} - - ) -} - -export default ToolsRenderer diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/index.tsx index f82e51d6ca..6b5ff63718 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/index.tsx @@ -3,6 +3,8 @@ import {useMemo, useRef} from "react" import {Collapse} from "antd" import clsx from "clsx" +import {componentLogger} from "../../assets/utilities/componentLogger" + import PlaygroundVariantConfigPromptCollapseContent from "./assets/PlaygroundVariantConfigPromptCollapseContent" import PlaygroundVariantConfigPromptCollapseHeader from "./assets/PlaygroundVariantConfigPromptCollapseHeader" import {useStyles} from "./styles" @@ -31,12 +33,12 @@ const PlaygroundVariantConfigPrompt: React.FC { const defaultActiveKey = useRef(["1"]) const classes = useStyles() + componentLogger("PlaygroundVariantConfigPrompt", variantId, promptId) + const items = useMemo( () => [ { @@ -50,7 +52,6 @@ const PlaygroundVariantConfigPrompt: React.FC ), @@ -58,12 +59,11 @@ const PlaygroundVariantConfigPrompt: React.FC ), }, ], - [variantId, promptId, viewOnly], + [variantId, promptId], ) return ( @@ -73,7 +73,6 @@ const PlaygroundVariantConfigPrompt: React.FC ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/types.d.ts index e31ee27bec..61a7ab8b25 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantConfigPrompt/types.d.ts @@ -8,8 +8,6 @@ export interface PlaygroundVariantConfigPromptComponentProps extends CollapsePro variantId: string /** Unique identifier for the prompt being configured */ promptId: string - /** Whether the prompt is mutable or view only */ - viewOnly?: boolean } /** @@ -19,8 +17,6 @@ export interface PromptCollapseContentProps extends BaseContainerProps { /** ID of the variant being configured */ variantId: EnhancedVariant["id"] promptId: string - /** Whether the prompt is mutable or view only */ - viewOnly?: boolean } /** @@ -31,6 +27,4 @@ export interface PromptCollapseHeaderProps extends BaseContainerProps { variantId: string /** ID of the prompt being configured */ promptId: string - /** Whether the prompt is mutable or view only */ - viewOnly?: boolean } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantCustomProperties/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantCustomProperties/index.tsx index 7991526ae3..9195d62f8d 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantCustomProperties/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantCustomProperties/index.tsx @@ -1,20 +1,12 @@ -import {memo, useCallback, useEffect, useMemo} from "react" +import {useCallback, memo, useMemo} from "react" import {Collapse, Typography} from "antd" import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {atom, getDefaultStore, useAtomValue, useSetAtom} from "jotai" -import {selectAtom} from "jotai/utils" -import {getMetadataLazy, metadataAtom} from "@/oss/lib/hooks/useStatelessVariants/state" -import { - customPropertiesByRevisionAtomFamily, - customPropertyIdsByRevisionAtomFamily, -} from "@/oss/state/newPlayground/core/customProperties" - -import {parameterUpdateMutationAtom} from "../../state/atoms/propertyMutations" +import type {EnhancedVariant} from "../../../../lib/shared/variant/transformer/types" +import usePlayground from "../../hooks/usePlayground" import {useStyles} from "../PlaygroundVariantConfigPrompt/styles" -import {renderMap} from "../PlaygroundVariantPropertyControl/assets/helpers" +import PlaygroundVariantPropertyControl from "../PlaygroundVariantPropertyControl" import type {PlaygroundVariantCustomPropertiesProps} from "./types" @@ -35,94 +27,19 @@ import type {PlaygroundVariantCustomPropertiesProps} from "./types" const {Text} = Typography -const PlaygroundVariantCustomProperty = memo( - ({variantId, viewOnly, id, customPropsRecord}: PlaygroundVariantCustomPropertyProps) => { - const propertyAtom = useMemo(() => { - return customPropsRecord - ? atom(() => customPropsRecord[id]) - : selectAtom( - customPropertiesByRevisionAtomFamily(variantId), - (state) => state[id], - deepEqual, - ) - }, [variantId, id, customPropsRecord]) - const customProperty = useAtomValue(propertyAtom) - const updateParam = useSetAtom(parameterUpdateMutationAtom) - - const propertyMetadataAtom = useMemo(() => { - return selectAtom(metadataAtom, (state) => state[customProperty?.__metadata], deepEqual) - }, [customProperty]) - - const meta = useAtomValue(propertyMetadataAtom, { - store: getDefaultStore(), - }) - - const type: string | undefined = (meta && (meta as any).type) || undefined - const renderer = type ? (renderMap as any)[type as keyof typeof renderMap] : undefined - - const handleChange = useCallback( - (newValue: any, _arg?: any, subPropertyId?: string) => { - const pid = subPropertyId || (customProperty as any)?.__id - if (process.env.NODE_ENV === "development") { - console.debug("[CustomProps][Mut][UI]", { - variantId, - propertyId: pid, - newValue, - }) - } - updateParam({ - event: newValue, - propertyId: pid, - variantId, - }) - }, - [variantId, updateParam], - ) - - if (!customProperty) { - return null - } - - if (renderer) { - const key = - (customProperty?.__test || (customProperty as any))?.__id || - String(meta?.title || Math.random()) - return ( -
    - {renderer({ - withTooltip: true, - metadata: meta, - key: customProperty?.__test, - value: (customProperty as any)?.value, - disabled: viewOnly, - propertyId: (customProperty as any)?.__id, - variantId, - handleChange: handleChange, - })} -
    - ) - } - return Unknown type - }, -) - const PlaygroundVariantCustomProperties: React.FC = ({ variantId, className, initialOpen, - viewOnly = false, - customPropsRecord: providedCustomProps, }) => { const classes = useStyles() - const updateParam = useSetAtom(parameterUpdateMutationAtom) - - // Derive custom properties from spec + saved params using new selector - const atomCustomPropertyIds = useAtomValue(customPropertyIdsByRevisionAtomFamily(variantId)) - const customPropertyIds = useMemo(() => { - return providedCustomProps ? Object.keys(providedCustomProps) : atomCustomPropertyIds - }, [providedCustomProps, atomCustomPropertyIds]) - - const hasCustomProperties = customPropertyIds.length > 0 + const {customProperties, hasCustomProperties} = usePlayground({ + variantId, + variantSelector: useCallback((variant: EnhancedVariant) => { + const customProperties = Object.values(variant?.customProperties || {}) + return {customProperties, hasCustomProperties: Object.keys(customProperties).length > 0} + }, []), + }) const items = useMemo(() => { return hasCustomProperties @@ -154,14 +71,13 @@ const PlaygroundVariantCustomProperties: React.FC - {customPropertyIds.map((customPropertyId) => { + {customProperties.map((customProperty) => { return ( - ) })} @@ -170,15 +86,7 @@ const PlaygroundVariantCustomProperties: React.FC> } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/ModelConfigModal.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/ModelConfigModal.tsx index 5e92bfc085..86a664e8eb 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/ModelConfigModal.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/ModelConfigModal.tsx @@ -1,8 +1,5 @@ import {memo, useCallback, type MouseEvent} from "react" -import {getLLMConfig, getPromptById} from "@/oss/components/Playground/context/promptShape" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" - import PlaygroundVariantPropertyControl from "../../PlaygroundVariantPropertyControl" import type {PlaygroundVariantModelConfigModalProps, ModelConfigModalContentProps} from "../types" @@ -43,93 +40,21 @@ const ModalContent: React.FC = ({ const ModelConfigModal: React.FC = ({ variantId, propertyIds, - disabled, - promptId, }) => { const preventClickBubble = useCallback((e: MouseEvent) => { e.preventDefault() e.stopPropagation() }, []) - // Always compute raw llm_config as a safety net (for provider-driven renders) - const prompts = usePromptsSource(variantId) - const llm = getLLMConfig(getPromptById(prompts, String(promptId))) || {} - const pickVal = (v: any) => - typeof v === "object" && v && "value" in (v as any) ? (v as any).value : v - const rows: [string, any][] = [] - - // Include common knobs explicitly (shown in Playground modal) - const KNOBS = [ - "temperature", - "topP", - "presencePenalty", - "frequencyPenalty", - "maxTokens", - "stream", - // keep others if present - ] as const - KNOBS.forEach((k) => { - const val = pickVal((llm as any)?.[k as any]) - if (val !== undefined && val !== null) rows.push([String(k), val]) - }) - - // Response format summary - const rf = (llm as any)?.response_format || (llm as any)?.responseFormat - if (rf) { - const t = typeof rf === "object" && rf ? rf.type || pickVal((rf as any).type) : String(rf) - let label = "text" - if (t === "json_object") label = "json_object" - else if (t === "json_schema") label = "json_schema" - else if (t && typeof t === "string") label = t - rows.push(["responseFormat", label]) - } - - // Fallback: include any other primitive knob not starting with __ and not complex objects - Object.entries(llm).forEach(([k, v]) => { - if (k.startsWith("__")) return - if (["tools", "toolChoice", "responseFormat", "model"].includes(k)) return - const val = pickVal(v) - if (typeof val !== "object" && val !== undefined && val !== null) { - if (!rows.find(([kk]) => kk === k)) rows.push([k, val]) - } - }) - - // If no enhanced property ids are available, show a clean read-only list - if (!propertyIds || propertyIds.length === 0) { - return ( - - {rows.length > 0 ? ( -
    - {rows.map(([k, v]) => ( -
    - {String(k)} - {String(v)} -
    - ))} -
    - ) : ( -
    - No model configuration properties available -
    - )} -
    - ) - } - - // Render actual model controls (disabled only affects interaction, not visibility) return ( - {(propertyIds || []).map((propertyId, idx) => { + {propertyIds.map((propertyId) => { return ( ) })} diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/PlaygroundVariantModelConfigTitle.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/PlaygroundVariantModelConfigTitle.tsx index 2268435677..6a64297513 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/PlaygroundVariantModelConfigTitle.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/assets/PlaygroundVariantModelConfigTitle.tsx @@ -23,7 +23,6 @@ import type {PlaygroundVariantModelConfigTitleProps} from "../types" const PlaygroundVariantModelConfigTitle: React.FC = ({ handleReset, className, - disabled, ...props }) => { return ( @@ -35,9 +34,7 @@ const PlaygroundVariantModelConfigTitle: React.FC Model Parameters - + ) } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/index.tsx index 6b2c84e2e7..b1e158a0c9 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/index.tsx @@ -1,18 +1,18 @@ -import {memo, useState, useCallback, useMemo} from "react" +import {memo, useState, useCallback} from "react" import {CaretDown} from "@phosphor-icons/react" import {Button, Popover} from "antd" -import {getPromptById, getLLMConfig} from "@/oss/components/Playground/context/promptShape" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" import {getEnhancedProperties} from "@/oss/lib/shared/variant" +import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" + +import {componentLogger} from "../../assets/utilities/componentLogger" +import usePlayground from "../../hooks/usePlayground" import ModelConfigModal from "./assets/ModelConfigModal" import PlaygroundVariantModelConfigTitle from "./assets/PlaygroundVariantModelConfigTitle" import type {PlaygroundVariantModelConfigProps} from "./types" -// Deprecated local selector: replaced by direct computation from unified prompts source - /** * PlaygroundVariantModelConfig Component * @@ -38,92 +38,98 @@ const PlaygroundVariantModelConfig: React.FC variantId, promptId, className, - viewOnly, ...popoverProps // Collect remaining props for Popover }) => { - // Compute model config from unified prompts source (provider-aware) - const prompts = usePromptsSource(variantId) - const {propertyIds, modelPropertyId, resolvedModelName} = useMemo(() => { - const prompt = getPromptById(prompts, promptId) - const llm = getLLMConfig(prompt) || {} - const properties = - getEnhancedProperties(llm, ["tools", "toolChoice", "responseFormat", "stream"]) || [] - const ids = properties.map((p: any) => p?.__id).filter(Boolean) - - // Prefer enhanced model value; fallback to raw string - const name = - (llm?.model && - (llm.model.value ?? (typeof llm.model === "string" ? llm.model : undefined))) || - undefined - - return { - propertyIds: ids, - modelPropertyId: llm?.model?.__id, - resolvedModelName: name, - } - }, [prompts, promptId]) - - // Reset no-op for now (mutation removed). Kept to avoid UI breakage. + const variantSelector = useCallback( + (variant: EnhancedVariant) => { + const prompt = (variant.prompts || []).find((p) => p.__id === promptId) + const llmConfig = prompt?.llmConfig + + const properties = + getEnhancedProperties(llmConfig, [ + "tools", + "toolChoice", + "responseFormat", + "stream", + ]) || [] + + return { + propertyIds: properties.map((p) => p.__id), + modelName: llmConfig?.model?.value, + } + }, + [promptId], + ) + + const {propertyIds, modelName, mutateVariant} = usePlayground({ + variantId, + hookId: "PlaygroundVariantModelConfig", + variantSelector, + }) // Local state for modal visibility const [isModalOpen, setIsModalOpen] = useState(false) - // Keep click noop to let Popover's onOpenChange manage visibility + componentLogger("PlaygroundVariantModelConfig", variantId, promptId, propertyIds, modelName) + const handleModalOpen = useCallback((e?: React.MouseEvent): void => { e?.preventDefault() e?.stopPropagation() }, []) - const handleResetDefaults = useCallback(() => { - if (!variantId || !promptId || !propertyIds || propertyIds.length === 0) { - console.warn("[RESET-SIMPLE] ⚠️ Missing required parameters for reset") - return - } - }, [variantId, promptId, propertyIds]) + const handleResetDefaults = useCallback(async () => { + mutateVariant?.((variant) => { + const prompt = variant?.prompts.find((p) => p.__id === promptId) + const llmConfig = prompt?.llmConfig + // @ts-ignore + const params = + variant.parameters?.agConfig || variant.parameters?.ag_config || variant.parameters + + const resetModelName = params?.prompt.llm_config?.model //TODO: Check this @ardaerzin - const displayModel = resolvedModelName ?? "Choose a model" - const canOpen = (propertyIds?.length || 0) > 0 + if (!llmConfig) return variant + + const {model, ...restOfConfig} = llmConfig + + const properties = + getEnhancedProperties(restOfConfig, [ + "tools", + "toolChoice", + "responseFormat", + "stream", + ]) || [] + + properties.forEach((property) => { + property.value = null + }) + + if (model.value !== resetModelName) { + llmConfig.model.value = resetModelName + } + + return variant + }) + }, [variantId]) return ( { - if (viewOnly) { - setIsModalOpen(false) - return - } - setIsModalOpen(open) - } - : undefined - } - classNames={{ - root: "w-full max-w-[300px]", - }} - destroyOnHidden + open={isModalOpen} + onOpenChange={setIsModalOpen} + overlayClassName="w-full max-w-[300px]" trigger={["click"]} placement="bottomRight" arrow={false} - title={ - - } + title={} content={ - + isModalOpen ? ( + + ) : null } className={className} > - ) diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/types.d.ts index c8fced62fc..c13d94ab80 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantModelConfig/types.d.ts @@ -18,9 +18,6 @@ export interface PlaygroundVariantModelConfigModalProps extends BaseContainerPro variantId: EnhancedVariant["id"] /** List of configurable model properties */ propertyIds: string[] - disabled?: boolean - /** Optional: prompt id for read-only fallback rendering */ - promptId?: EnhancedVariant["prompts"][number]["id"] | string } /** @@ -50,8 +47,6 @@ export interface PlaygroundVariantModelConfigProps extends PopoverProps { variantId: EnhancedVariant["id"] /** ID of the prompt being configured */ promptId: EnhancedVariant["prompts"][number]["id"] - /** Whether the component is in view-only mode or in mutable mode */ - viewOnly?: boolean } export interface PlaygroundVariantModelConfigTitleProps extends BaseContainerProps { diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundOutputControl/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundOutputControl/index.tsx index 1db1c8d812..170e2e1955 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundOutputControl/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundOutputControl/index.tsx @@ -1,4 +1,4 @@ -import {useCallback, useEffect, useMemo, useRef, useState} from "react" +import {useCallback, useEffect, useMemo, useState} from "react" import {Button, Modal, Tooltip, Typography} from "antd" import clsx from "clsx" @@ -22,7 +22,6 @@ const PlaygroundOutputControl = ({ value, handleChange, promptName, - viewOnly, ...rest }: { withTooltip: boolean @@ -33,106 +32,61 @@ const PlaygroundOutputControl = ({ }) => { const [editor] = useLexicalComposerContext() const [modalState, setModalState] = useState(false) - const isReadOnly = Boolean(viewOnly) const selectedOption = metadata.options.find((option) => option.value === value?.type) const schema = value?.json_schema - const {variantId: controlVariantId, propertyId: controlPropertyId} = (rest || {}) as any - const toPrettyString = useCallback((v: any): string => { - if (v == null) return "" - if (typeof v === "string") return v - try { - return JSON.stringify(v, null, 2) - } catch { - return String(v) - } - }, []) - - const [structuredOutputState, setStructuredOutputState] = useState(() => { - if (schema) return toPrettyString(schema) - const seed = constructJsonFromSchema(selectedOption?.config.json_schema, { - name: "Schema", - description: "A description of the schema", - strict: false, - schema: {type: "object", properties: {}}, - }) - return toPrettyString(seed) - }) + const [structuredOutputState, setStructuredOutputState] = useState( + schema || + constructJsonFromSchema(selectedOption?.config.json_schema, { + name: "Schema", + description: "A description of the schema", + strict: false, + schema: { + type: "object", + properties: {}, + }, + }), + ) useEffect(() => { - // Seed once when switching to json_schema and there is no existing value - if (!!selectedOption?.config?.json_schema && !schema) { - const obj = constructJsonFromSchema(selectedOption.config.json_schema, { + if (!!selectedOption?.config.json_schema && !schema) { + const obj = constructJsonFromSchema(selectedOption?.config.json_schema, { name: "MySchema", description: "A description of the schema", strict: false, - schema: {type: "object", properties: {}}, + schema: { + type: "object", + properties: {}, + }, }) - const pretty = toPrettyString(obj) - if (pretty && pretty !== structuredOutputState) { - setStructuredOutputState(pretty) - } + + setStructuredOutputState(JSON.stringify(obj, null, 2)) } - }, [selectedOption?.config?.json_schema, schema, structuredOutputState, toPrettyString]) + }, [selectedOption?.config?.json_schema]) useEffect(() => { - // Sync only when upstream value is present - if (value?.json_schema != null) { - const pretty = toPrettyString(value.json_schema) - if (pretty !== structuredOutputState) { - setStructuredOutputState(pretty) - } - } - }, [value?.json_schema, toPrettyString, structuredOutputState]) + setStructuredOutputState(value?.json_schema) + }, [value?.json_schema]) useEffect(() => { - if (isReadOnly) return if (selectedOption?.value === "json_schema") { if (!value?.json_schema) { setModalState(true) } } - }, [selectedOption?.value, isReadOnly, value?.json_schema]) - - // Ensure modal opens when switching to json_schema regardless of seed presence - const prevTypeRef = useRef(value?.type) - useEffect(() => { - const prev = prevTypeRef.current - if (isReadOnly) return - if (value?.type === "json_schema" && prev !== "json_schema") { - console.debug("[OutputControl] type transition -> json_schema; opening modal") - setModalState(true) - } - prevTypeRef.current = value?.type - }, [value?.type, isReadOnly]) - - // One-shot global fail-safe to reopen modal after possible remounts - useEffect(() => { - const flag = (window as any).__pgOpenJsonSchemaOnce - // Relax match to variant-level to avoid unstable propertyId mismatches - if (isReadOnly) return - if (flag && value?.type === "json_schema" && flag === (controlVariantId || true)) { - console.debug("[OutputControl] open via global flag (variant)", { - variant: controlVariantId, - }) - setModalState(true) - ;(window as any).__pgOpenJsonSchemaOnce = null - } - }, [controlVariantId, controlPropertyId, value?.type, isReadOnly]) + }, [selectedOption?.value]) const saveChanges = useCallback(() => { - if (isReadOnly) return editor.read(() => { const test = $getEditorCodeAsString(editor) setModalState(false) - // Commit json_schema type and schema together handleChange({ - type: "json_schema", + type: selectedOption?.value, json_schema: tryParsePartialJson(test), }) }) - }, [structuredOutputState, editor, handleChange, isReadOnly]) + }, [structuredOutputState]) const correctedStructuredOutput = useMemo(() => { try { @@ -144,156 +98,88 @@ const PlaygroundOutputControl = ({ } }, [structuredOutputState]) - const showReadOnlySchema = - isReadOnly && value?.type === "json_schema" && correctedStructuredOutput - return ( - {showReadOnlySchema ? ( -
    - - Output type: json_schema - - - +
    + + handleChange({ + type, + }) + } + className={clsx([ + "[&.ant-select-sm]:h-[24px] [&_.ant-select-selection-item]:!text-[12px]", + "[&.ant-select-sm]:!w-fit", + "z-[1] hover:z-[2]", + ])} + description={metadata.description} + withTooltip={withTooltip} + showSearch={false} + prefix={"Output type:"} />
    - ) : ( - <> - -
    - { - if (isReadOnly) return - if (type === "json_schema") { - const jsonOpt = metadata.options.find( - (o: any) => o.value === "json_schema", - ) as any - const seed = - value?.json_schema ?? - constructJsonFromSchema(jsonOpt?.config?.json_schema, { - name: "Schema", - description: "A description of the schema", - strict: false, - schema: {type: "object", properties: {}}, - }) - const pretty = toPrettyString(seed) - if (pretty) setStructuredOutputState(pretty) - ;(window as any).__pgOpenJsonSchemaOnce = - controlVariantId || true - - setModalState(true) - handleChange({ - type: "json_schema", - json_schema: tryParsePartialJson(pretty), - }) - return - } - handleChange({type}) - }} - className={clsx([ - "[&.ant-select-sm]:h-[24px] [&_.ant-select-selection-item]:!text-[12px]", - "[&.ant-select-sm]:!w-fit", - "z-[1] hover:z-[2]", - ])} - description={metadata.description} - withTooltip={withTooltip} - showSearch={false} - prefix={"Output type:"} - /> -
    -
    - {!!correctedStructuredOutput && value?.type === "json_schema" ? ( - - ) : null} - - )} - {!isReadOnly ? ( - { - setModalState(false) - }} - classNames={{ - content: "max-h-[80dvh] overflow-hidden flex flex-col", - body: "flex flex-col grow shrink-1 overflow-y-auto", - }} - onOk={saveChanges} + + {!!correctedStructuredOutput && value?.type === "json_schema" ? ( + ) : null} + { + setModalState(false) + setStructuredOutputState(schema || structuredOutputState) + }} + classNames={{ + content: "max-h-[80dvh] overflow-hidden flex flex-col", + body: "flex flex-col grow shrink-1 overflow-y-auto", + }} + onOk={saveChanges} + > + + Define the JSON schema for the structured output of the prompt:{" "} + {promptName || "no name"} + + +
    + +
    +
    +
    ) } -const PlaygroundOutputControlWrapper = (props: { - className?: string - children: React.ReactNode - withTooltip: boolean - promptName: string - metadata: CompoundMetadata - handleChange: (v: any, event?: any, propertyId?: string | undefined) => void - value: any -}) => { +const PlaygroundOutputControlWrapper = (props: {className?: string; children: React.ReactNode}) => { return ( - + ) diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundVariantPropertyControlWrapper.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundVariantPropertyControlWrapper.tsx index 629fa395c5..c6ab809fdb 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundVariantPropertyControlWrapper.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PlaygroundVariantPropertyControlWrapper.tsx @@ -5,7 +5,6 @@ import clsx from "clsx" const PlaygroundVariantPropertyControlWrapper = ({ className, children, - viewOnly, ...props }: HTMLProps) => { return ( diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptImageUpload/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptImageUpload/index.tsx index a56362a635..cda69c19ca 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptImageUpload/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptImageUpload/index.tsx @@ -8,9 +8,9 @@ import clsx from "clsx" import ImagePreview from "@/oss/components/Common/ImagePreview" import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import {isValidImageUrl} from "./assets/helpers" import {useStyles} from "./assets/styles" import {PromptImageUploadProps} from "./types" +import {isValidImageUrl} from "./assets/helpers" const {Dragger} = Upload @@ -150,7 +150,7 @@ const PromptImageUpload = ({
    Drag an image here or{" "} - diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/PromptMessageContentOptions.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/PromptMessageContentOptions.tsx index d6b739386a..391a4ad8cc 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/PromptMessageContentOptions.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/PromptMessageContentOptions.tsx @@ -1,6 +1,5 @@ import {useCallback, memo, useState} from "react" -import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" import { MinusCircle, Copy, @@ -8,29 +7,40 @@ import { ArrowClockwise, CaretDown, CaretUp, - Image as PhImage, + Image, MarkdownLogoIcon, TextAa, } from "@phosphor-icons/react" import clsx from "clsx" -import {useAtom, useAtomValue} from "jotai" -import {TOGGLE_MARKDOWN_VIEW} from "@/oss/components/Editor/plugins/markdown/commands" -import {markdownViewAtom} from "@/oss/components/Editor/state/assets/atoms" -import {getTextContent} from "@/oss/components/Playground/adapters/TurnMessageHeaderOptions" import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" -import {usePromptsSource} from "@/oss/components/Playground/context/PromptsSource" -import {findPropertyInObject} from "@/oss/components/Playground/hooks/usePlayground/assets/helpers" -import {appChatModeAtom} from "@/oss/components/Playground/state/atoms" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" import TestsetDrawerButton from "../../../../Drawers/TestsetDrawer" import type {PromptMessageContentOptionsProps} from "./types" +import {markdownViewAtom} from "@/oss/components/Editor/state/assets/atoms" +import {useAtom} from "jotai" +import {useLexicalComposerContext} from "@lexical/react/LexicalComposerContext" +import {TOGGLE_MARKDOWN_VIEW} from "@/oss/components/Editor/plugins/markdown/commands" + +export const getTextContent = (content: any) => { + if (typeof content === "string") return content + if (Array.isArray(content)) { + const value = content.filter( + (part: any) => part.type.value === "text" || part.type === "text", + ) + return value.length > 0 + ? typeof value[0].text === "string" + ? value[0].text + : value[0].text.value + : "" + } + return "" +} const PromptMessageContentOptions = ({ - id, messageId, - variantId, className, propertyId, isMessageDeletable, @@ -41,24 +51,23 @@ const PromptMessageContentOptions = ({ resultHashes, allowFileUpload, uploadCount, - viewOnly, hideMarkdownToggle, }: PromptMessageContentOptionsProps) => { const [editor] = useLexicalComposerContext() - const [markdownView] = useAtom(markdownViewAtom(id)) - - const prompts = usePromptsSource(variantId) || [] - const message = findPropertyInObject(prompts, propertyId) - - const isChat = useAtomValue(appChatModeAtom) ?? false + const [markdownView] = useAtom(markdownViewAtom) + const {propertyGetter, isChat} = usePlayground({ + stateSelector: (state) => ({ + isChat: state.variants.some((v) => v.isChat), + }), + }) const {deleteMessage, rerunMessage, minimize, onClickTestsetDrawer, handleAddUploadSlot} = actions || {} const [isCopied, setIsCopied] = useState(false) const onCopyText = useCallback(() => { - const text = getTextContent(message?.value) + const text = getTextContent(propertyGetter?.(propertyId)?.value || "") if (text) { setIsCopied(true) @@ -67,7 +76,7 @@ const PromptMessageContentOptions = ({ setIsCopied(false) }, 1000) } - }, [message]) + }, [propertyId, propertyGetter]) return (
    @@ -75,17 +84,14 @@ const PromptMessageContentOptions = ({ } type="text" - onClick={() => { - rerunMessage?.(messageId) - }} - disabled={!resultHashes || resultHashes.length === 0} + onClick={() => rerunMessage?.(messageId)} tooltipProps={{title: "Re-run"}} /> ) : null} {resultHashes && resultHashes?.length > 0 ? ( } + icon={} type="text" onClick={() => handleAddUploadSlot?.()} tooltipProps={{title: "Upload Image"}} @@ -121,25 +127,20 @@ const PromptMessageContentOptions = ({ /> )} - {!viewOnly && ( - } - type="text" - onClick={() => { - console.log("delete message", messageId) - deleteMessage?.(messageId) - }} - disabled={!isMessageDeletable} - tooltipProps={{title: "Remove"}} - /> - )} + } + type="text" + onClick={() => deleteMessage?.(messageId)} + disabled={isMessageDeletable} + tooltipProps={{title: "Remove"}} + /> : } + icon={minimized ? : } type="text" onClick={() => minimize?.(messageId)} - disabled={disabled} - tooltipProps={{title: minimized ? "Minimize" : "Maximize"}} + disabled={isMessageDeletable} + tooltipProps={{title: "Minimize"}} /> {children} diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/types.d.ts index dbf0ea3075..ad4298b0e0 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/types.d.ts @@ -19,6 +19,4 @@ export interface PromptMessageContentOptionsProps { allowFileUpload?: boolean uploadCount?: number hideMarkdownToggle?: boolean - /** Whether the component is in view-only mode or in mutable mode */ - viewOnly?: boolean } diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleInput/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleInput/index.tsx index 425f2bad69..d2b2f867d6 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleInput/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleInput/index.tsx @@ -29,12 +29,19 @@ const SimpleInput = ({ const [localValue, setLocalValue] = useDebounceInput(value, onChange, 300, "") const handleLocalValueChange = useCallback( - (event: ChangeEvent) => { - setLocalValue(event.target.value) + (value: ChangeEvent) => { + setLocalValue(value.target.value) }, [setLocalValue], ) + const change = useCallback( + (value: string) => { + onChange(value) + }, + [onChange], + ) + if (as === "SimpleInputWithLabel") { return ( { - const {isComparisonView} = usePlaygroundLayout() - const viewType = isComparisonView ? "comparison" : "single" + const {viewType} = usePlayground() if (viewType === "single" && view !== "focus") { return ( diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/helpers.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/helpers.tsx index f85644a375..1c316f3589 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/helpers.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/assets/helpers.tsx @@ -4,8 +4,6 @@ import dynamic from "next/dynamic" import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" import {EnhancedConfigValue} from "@/oss/lib/shared/variant/genericTransformer/types" -import {findPropertyInObject} from "../../../hooks/usePlayground/assets/helpers" - import PlaygroundTool from "../../PlaygroundTool" import {ArrayItemValue, RenderFunctions} from "../types" @@ -22,81 +20,18 @@ import TextControl from "./TextControl" const SelectLLMProvider = dynamic(() => import("@/oss/components/SelectLLMProvider"), {ssr: false}) -const derivePlainValue = (node: any): any => { - if (node === null || node === undefined) return node - if (Array.isArray(node)) { - return node.map((item) => derivePlainValue(item)) - } - - if (typeof node !== "object") { - return node - } - - const rawValue = (node as any).value - - if (Array.isArray(rawValue)) { - return rawValue.map((item: any) => derivePlainValue(item)) - } - - const plainChildren: Record = {} - for (const [key, value] of Object.entries(node)) { - if (key === "value" || key.startsWith("__")) continue - plainChildren[key] = derivePlainValue(value) - } - - if (Object.keys(plainChildren).length > 0) { - return plainChildren - } - - if (rawValue !== undefined) { - return rawValue - } - - return node -} - -const cloneEnhanced = (value: T): T => { - if (typeof structuredClone === "function") { - return structuredClone(value) - } - - return JSON.parse(JSON.stringify(value)) -} - const updateArrayItem = ( array: EnhancedConfigValue[], id: string, newValue: any, - handleChange: (v: any, event?: any, propertyId?: string) => void, - targetPropertyId?: string, + handleChange: (v: any) => void, ) => { const newArray = [...array] const index = array.findIndex((v) => v.__id === id) - if (index === -1) return - - if (targetPropertyId) { - const itemClone = cloneEnhanced(newArray[index]) - const targetNode = findPropertyInObject(itemClone, targetPropertyId) - - if (targetNode && typeof targetNode === "object") { - if ("content" in targetNode && targetNode.content && "value" in targetNode.content) { - ;(targetNode.content as any).value = newValue - } else if ("value" in targetNode) { - ;(targetNode as any).value = newValue - } - - if ("value" in itemClone) { - ;(itemClone as any).value = derivePlainValue(itemClone) - } - - newArray[index] = itemClone - handleChange({value: newArray}, undefined, targetPropertyId) - return - } + if (index !== -1) { + newArray[index] = {...newArray[index], value: newValue} + handleChange({value: newArray}) } - - newArray[index] = {...newArray[index], value: newValue} - handleChange({value: newArray}) } export const renderMap: RenderFunctions = { @@ -184,7 +119,7 @@ export const renderMap: RenderFunctions = { if (as === "SimpleDropdownSelect") { return ( { - const {disabled, withTooltip, metadata, value, handleChange} = props + array: ({disabled, withTooltip, metadata, value, handleChange}) => { if (!Array.isArray(value?.value)) { return null } @@ -363,30 +297,6 @@ export const renderMap: RenderFunctions = { })}
    ) - case "object": - return ( -
    - {renderMap.object({ - ...props, - metadata, - value: item.value, - baseProperty: item, - handleChange: ( - newValue: any, - event?: any, - targetPropertyId?: string, - ) => { - updateArrayItem( - value.value, - item.__id, - newValue, - handleChange, - targetPropertyId, - ) - }, - })} -
    - ) default: return null } @@ -400,24 +310,9 @@ export const renderMap: RenderFunctions = { const objectProperties = metadata.properties const withTooltip = props.withTooltip const baseProperty = props.baseProperty - if (metadata.name === "ToolConfiguration") { - const {handleChange, editorProps, variantId, baseProperty, disabled, value} = - props as any - return ( - - ) - } - - return ( + return metadata.name === "ToolConfiguration" ? ( + + ) : (
    {withTooltip ? ( diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/index.tsx b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/index.tsx index 7c1681f0af..41b65eb3f2 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/index.tsx +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/index.tsx @@ -1,32 +1,22 @@ import {memo, useMemo} from "react" import {Typography} from "antd" -import deepEqual from "fast-deep-equal" -import {atom, useAtomValue, useSetAtom} from "jotai" -import { - getMetadataLazy, - metadataSelectorFamily, - metadataAtom, -} from "@/oss/lib/hooks/useStatelessVariants/state" -import {customPropertiesByRevisionAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {getEnhancedRevisionById} from "@/oss/state/variant/atoms/fetcher" +import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" -import {usePromptsSource} from "../../context/PromptsSource" -import {findPropertyInObject, findPropertyById} from "../../hooks/usePlayground/assets/helpers" -import { - // updateGenerationDataPropertyMutationAtom, - promptPropertyAtomFamily, -} from "../../state/atoms" +import type { + Enhanced, + EnhancedObjectConfig, +} from "../../../../lib/shared/variant/genericTransformer/types" +import type {EnhancedVariant} from "../../../../lib/shared/variant/transformer/types" +import {componentLogger} from "../../assets/utilities/componentLogger" +import usePlayground from "../../hooks/usePlayground" +import {findPropertyInObject} from "../../hooks/usePlayground/assets/helpers" +import {findPropertyById} from "../../hooks/usePlayground/middlewares/playgroundVariantMiddleware" import {renderMap} from "./assets/helpers" import type {PlaygroundVariantPropertyControlProps} from "./types" -const nullValueAtom = atom(null) -const nullMetadataAtom = atom(null) -const noopWriteAtom = atom(null, () => {}) - // TODO: RENAME TO PlaygroundPropertyControl const PlaygroundVariantPropertyControl = ({ propertyId, @@ -35,7 +25,6 @@ const PlaygroundVariantPropertyControl = ({ as, view, rowId, - messageId, withTooltip, value: propsValue, disabled, @@ -43,263 +32,120 @@ const PlaygroundVariantPropertyControl = ({ placeholder, ...rest }: PlaygroundVariantPropertyControlProps): React.ReactElement | null => { - // Get the actual variant ID - const actualVariantId = useMemo( - () => (typeof variantId === "object" ? (variantId as any).id : variantId), - [variantId], - ) - - // ATOM-LEVEL: compute selector atoms (stable via useMemo), no conditional hooks - const propertyValueAtom = useMemo(() => { - if (!propertyId) return nullValueAtom - // Prompt-only: find property in prompts or custom properties for the given revision - return atom((get) => { - const revIdForPrompts = actualVariantId - if (revIdForPrompts) { - const prompts = get(promptsAtomFamily(revIdForPrompts)) - const list = (prompts as any[]) || [] - const property = - findPropertyInObject(list, propertyId) || - findPropertyById(list as any, propertyId) - if (property) { - return { - value: (property as any)?.content?.value || (property as any)?.value, - source: "variant" as const, - property, - } as any - } - - // Fallback: try custom properties derived from OpenAPI spec - const variant = getEnhancedRevisionById(get as any, revIdForPrompts) - if (variant) { - const customProps = get(customPropertiesByRevisionAtomFamily(revIdForPrompts)) - const values = Object.values(customProps || {}) as any[] - const node = values.find((n) => n?.__id === propertyId) - if (node) { - return { - value: (node as any)?.content?.value ?? (node as any)?.value, - source: "variant", - property: node, - } as any - } - } - } - return null as any - }) - }, [actualVariantId, propertyId]) - - const propertyMetadataAtom = useMemo(() => { - if (!propertyId) return nullMetadataAtom - return atom((get) => { - const resolveMetadata = (metaRef: any) => { - if (!metaRef) return null - if (typeof metaRef === "string") { - return (get(metadataSelectorFamily(metaRef)) as any) || getMetadataLazy(metaRef) - } - return metaRef - } - - const revIdForPrompts = actualVariantId - if (revIdForPrompts) { - const prompts = get(promptsAtomFamily(revIdForPrompts)) - const list = (prompts as any[]) || [] - const metadataMap = get(metadataAtom) as Record - const property = - findPropertyInObject(list, propertyId) || - findPropertyById(list as any, propertyId) - const propertyMetadata = resolveMetadata(property?.__metadata) - if (propertyMetadata) return propertyMetadata - if (property?.__metadata) { - const meta = metadataMap?.[property.__metadata] - return meta ?? getMetadataLazy(property.__metadata) - } - - // Fallback: custom properties metadata - const variant = getEnhancedRevisionById(get as any, revIdForPrompts) - if (variant) { - const customProps = get(customPropertiesByRevisionAtomFamily(revIdForPrompts)) - const values = Object.values(customProps || {}) as any[] - const node = values.find((n) => n?.__id === propertyId) - const customMetadata = resolveMetadata(node?.__metadata) - if (customMetadata) return customMetadata - if (node?.__metadata) { - const meta = metadataMap?.[node.__metadata] - return meta ?? getMetadataLazy(node.__metadata) - } - } - } - // Synthesize minimal metadata for string inputs when nothing found - return {type: "string", title: propertyId} as any - }) - }, [actualVariantId, propertyId]) - - // Subscribe to unified property data (handles both variant and generation data) - let propertyData = useAtomValue(propertyValueAtom) - let propertyMetadata = useAtomValue(propertyMetadataAtom) - - // Prompts-only write facade for variant updates - const variantPromptWriteAtom = useMemo(() => { - if (!actualVariantId || !propertyId) return noopWriteAtom - return promptPropertyAtomFamily({revisionId: actualVariantId, propertyId}) - }, [actualVariantId, propertyId]) - const setVariantPromptValue = useSetAtom(variantPromptWriteAtom) - - // Provider-aware fallback: if atom lookup misses but provider prompts have the node, synthesize data - const providerPrompts = usePromptsSource(actualVariantId || "") - let providerNode: any = null - if (!propertyData && Array.isArray(providerPrompts) && providerPrompts.length > 0) { - const node = findPropertyInObject(providerPrompts, propertyId) - if (node) { - providerNode = node - propertyData = { - value: (node as any)?.content?.value ?? (node as any)?.value, - source: "variant", - property: node, - } as any - } - } - - if (providerNode && providerNode.__metadata) { - const providerMetadata = getMetadataLazy(providerNode.__metadata) - if (providerMetadata) { - propertyMetadata = providerMetadata - } - } - - const property = useMemo(() => { - if (!propertyData && propertyMetadata) { - return { - __metadata: propertyMetadata, - value: propsValue, - handleChange: (next: any) => { - setVariantPromptValue(next) - }, - } - } - if (!propertyData || !propertyMetadata) return null - - const {value, source} = propertyData - - const handler = (newValue: any, _: any, targetPropertyId?: string) => { - // No-op guard: skip if value hasn't changed to avoid redundant atom writes - - let _value = newValue - // if newValue is instance of change event, then get the value properly - const extractEventValue = (input: any) => { - if (!input || typeof input !== "object") return undefined - const target = (input as any).target ?? (input as any).currentTarget - const candidate = target && typeof target === "object" ? target : null - if (candidate && "value" in candidate) return (candidate as any).value - if ("nativeEvent" in (input as any)) { - const nativeTarget = (input as any)?.nativeEvent?.target - if (nativeTarget && typeof nativeTarget === "object" && "value" in nativeTarget) - return (nativeTarget as any).value - } - return undefined - } - - if (typeof Event !== "undefined" && newValue instanceof Event) { - _value = (newValue as any).target?.value + componentLogger("PlaygroundVariantPropertyControl", variantId, propertyId) + + const { + mutate, + handleParamUpdate: updateVariantProperty, + baseProperty, + } = usePlayground({ + hookId: "PlaygroundVariantPropertyControl", + stateSelector: (state) => { + const object = rowId + ? state.generationData.inputs.value.find((v) => v.__id === rowId) || + (state.generationData.messages.value || []).find((v) => v.__id === rowId) + : variantId + ? state.variants.find((v) => v.id === variantId) + : null + + if (!object) { + return {} } else { - const syntheticVal = extractEventValue(newValue) - if (syntheticVal !== undefined) { - _value = syntheticVal - } + const property = rowId + ? (findPropertyInObject(object, propertyId) as EnhancedObjectConfig) + : (findPropertyById( + object as EnhancedVariant, + propertyId, + ) as EnhancedObjectConfig) + return {baseProperty: property} } + }, + }) - const currentVal = value - const isSame = - typeof _value === "object" && _value !== null - ? deepEqual(_value, currentVal) - : _value === currentVal - - if (isSame) return - - if (source === "variant" && actualVariantId) { - // Use prompts-only facade to route writes through the centralized mutation - setVariantPromptValue(_value) - } - } + const property = useMemo(() => { + if (!baseProperty) return null + + const {__metadata, value} = baseProperty + + const handler = rowId + ? (e: any) => { + mutate( + (clonedState) => { + if (!clonedState) return clonedState + const val = + e !== null && e !== undefined + ? typeof e === "object" && "target" in e + ? e.target.value + : e + : null + + const generationData = structuredClone(clonedState.generationData) + const object = + generationData.inputs.value.find((v) => v.__id === rowId) || + generationData.messages.value.find((v) => v.__id === rowId) + + if (!object) { + return clonedState + } + + const property = findPropertyInObject(object, propertyId) as Enhanced + + if (!property) return clonedState + + property.value = val + + clonedState.generationData = generationData + + return clonedState + }, + { + revalidate: false, + }, + ) + } + : (newValue: any, _: any, propertyId?: string) => { + updateVariantProperty?.(newValue, propertyId || baseProperty.__id, variantId) + } return { - __metadata: propertyMetadata && propertyMetadata, // already precomputed metadata + __metadata: getMetadataLazy(__metadata), value, handleChange: handler, } - }, [ - propertyData, - propertyMetadata, - propertyId, - rowId, - actualVariantId, - messageId, - propsValue, - setVariantPromptValue, - ]) - - // Defensive programming: Handle revoked proxy for entire property object - const {metadata, value, handleChange} = useMemo(() => { - try { - if (!property) { - return {metadata: null, value: null, handleChange: null} - } - return { - metadata: property.__metadata, - value: property.value, - handleChange: property.handleChange, - } - } catch (error) { - console.error( - "[PlaygroundVariantPropertyControl] Error accessing property (revoked proxy)", - error, - ) - return {metadata: null, value: null, handleChange: null} - } - }, [property]) + }, [baseProperty, mutate, propertyId, rowId, updateVariantProperty, variantId]) if (!property) { return null } - // Early return if no metadata - if (!metadata) { - return Unable to find metadata for property - } - - const metadataType: string | undefined = (() => { - try { - return (metadata as any)?.type - } catch { - return undefined - } - })() + const {__metadata: metadata, value, handleChange} = property - if (!metadataType) { - return No property type found + if (!metadata) { + return unable to find metadata for property } - const renderer = renderMap[metadataType as keyof typeof renderMap] as + const renderer = renderMap[metadata.type as keyof typeof renderMap] as | ((props: any) => React.ReactElement) | undefined if (renderer) { return renderer({ withTooltip, metadata: metadata, - value: propsValue ?? value, + value, handleChange, as, className, view, placeholder, disabled, - propertyId: (propertyData as any)?.property?.__id || propertyId, + propertyId: baseProperty?.__id, variantId: variantId, - baseProperty: (propertyData as any)?.property, + baseProperty: baseProperty, ...rest, }) } - return Unknown type: {metadataType} + return Unknown type: {metadata.type} } export default memo(PlaygroundVariantPropertyControl) diff --git a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/types.d.ts b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/types.d.ts index f2b82611d9..45d69d25ba 100644 --- a/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/types.d.ts +++ b/web/oss/src/components/Playground/Components/PlaygroundVariantPropertyControl/types.d.ts @@ -23,8 +23,6 @@ export interface PlaygroundVariantPropertyControlProps extends BaseContainerProp rowId?: string /** Unique identifier for the property */ propertyId: string - /** Message ID for chat message-specific updates */ - messageId?: string /** Optional rendering variant for the control */ as?: "SimpleDropdownSelect" | "PromptMessageContent" | "SimpleInput" view?: string diff --git a/web/oss/src/components/Playground/Components/PromptMessageConfig/index.tsx b/web/oss/src/components/Playground/Components/PromptMessageConfig/index.tsx index b0e3d3fc58..a745f1a273 100644 --- a/web/oss/src/components/Playground/Components/PromptMessageConfig/index.tsx +++ b/web/oss/src/components/Playground/Components/PromptMessageConfig/index.tsx @@ -1,33 +1,42 @@ -import {useMemo, useCallback, useState, useEffect, useRef} from "react" +import {useMemo, useCallback, useState, useEffect} from "react" import {mergeRegister} from "@lexical/utils" import clsx from "clsx" -import deepEqual from "fast-deep-equal" -import {atom, useSetAtom} from "jotai" +import JSON5 from "json5" import {$getRoot} from "lexical" -import {v4 as uuidv4} from "uuid" +import dynamic from "next/dynamic" import {useLexicalComposerContext, EditorProvider} from "@/oss/components/Editor/Editor" import {$isCodeBlockNode} from "@/oss/components/Editor/plugins/code/nodes/CodeBlockNode" -import PromptMessageHeader from "@/oss/components/Playground/Components/Shared/PromptMessageHeader" -import {useMessageContentHandlers} from "@/oss/components/Playground/hooks/useMessageContentHandlers" -import {useMessageContentProps} from "@/oss/components/Playground/hooks/useMessageContentProps" -import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {tryParsePartialJson} from "@/oss/components/Editor/plugins/code/tryParsePartialJson" +import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" +import {getMetadataLazy, getResponseLazy} from "@/oss/lib/hooks/useStatelessVariants/state" +import {createObjectFromMetadata} from "@/oss/lib/shared/variant/genericTransformer/helpers/arrays" import {ChatRole} from "@/oss/lib/Types" -import {usePromptMessageConfig} from "../../hooks/usePromptMessageConfig" import { - // updateGenerationDataPropertyMutationAtom, - promptPropertyAtomFamily, - promptTemplateFormatAtomFamily, -} from "../../state/atoms" -import {useAtomValue} from "jotai" -import {updateVariantPropertyEnhancedMutationAtom} from "../../state/atoms/propertyMutations" + Enhanced, + EnhancedObjectConfig, +} from "../../../../lib/shared/variant/genericTransformer/types" +import {EnhancedVariant} from "../../../../lib/shared/variant/transformer/types" +import usePlayground from "../../hooks/usePlayground" +import {findPropertyInObject, findVariantById} from "../../hooks/usePlayground/assets/helpers" +import {findPropertyById} from "../../hooks/usePlayground/middlewares/playgroundVariantMiddleware" +import {PlaygroundStateData} from "../../hooks/usePlayground/types" +import PlaygroundVariantPropertyControl from "../PlaygroundVariantPropertyControl" +import PromptImageUpload from "../PlaygroundVariantPropertyControl/assets/PromptImageUpload" import SharedEditor from "../SharedEditor" import type {PromptMessageConfigProps} from "./types" +import {getEnhancedProperties} from "@/oss/lib/shared/variant" -// Content options moved into PromptMessageHeader; dynamic import removed +const PromptMessageContentOptions = dynamic( + () => + import( + "../PlaygroundVariantPropertyControl/assets/PromptMessageContent/assets/PromptMessageContentOptions" + ), + {ssr: false}, +) /** * PromptMessageConfig Component @@ -43,7 +52,6 @@ import type {PromptMessageConfigProps} from "./types" * @param props.variantId - Unique identifier for the variant being configured */ const PromptMessageConfig = ({ - id, isFunction, variantId, messageId, @@ -63,81 +71,150 @@ const PromptMessageConfig = ({ footerClassName, editorProps, isJSON, - isTool, + allowFileUpload = false, message: messageProp, - viewOnly, ...props }: PromptMessageConfigProps) => { - const editorIdRef = useRef(id || uuidv4()) // Allow null to represent an empty upload slot // const [uploadedFileItems, setUploadedFileItems] = useState<(UploadFile | null)[]>([]) const [minimized, setMinimized] = useState(false) - // Use optimized hook for chat detection and message data - const { - isChat: _isChat, - message: optimizedMessage, - variables: optimizedVariables, - } = usePromptMessageConfig({ - variantId, - messageId, - rowId, + const {isChat} = usePlayground({ + stateSelector: (state) => ({ + isChat: state.variants.some((v) => v.isChat), + }), }) - // Prefer live message from generation entities to reflect mutations immediately - // Prompt-only message resolution - const message = (optimizedMessage as any) ?? (messageProp as any) - // Get optimized mutation functions - const updateVariantProperty = useSetAtom(updateVariantPropertyEnhancedMutationAtom) - // const updateGenerationDataProperty = useSetAtom(updateGenerationDataPropertyMutationAtom) - - // Facade write setup for content property (prompts-only). Fallback to noop when unavailable. - const noopWriteAtom = useMemo(() => atom(null, () => {}), []) - const revisionId = useMemo(() => { - return variantId && typeof variantId === "object" - ? (variantId as any).id - : (variantId as any) - }, [variantId]) - - // content write facade is defined after baseContentProperty to use the correct property id - - // Essential property extraction for message rendering via shared hook - const {baseProperty, baseImageProperties, baseContentProperty} = useMessageContentProps( - message as any, - ) + const {message} = usePlayground({ + variantId, + hookId: "PromptMessageConfig", + stateSelector: useCallback( + (state: PlaygroundStateData) => { + if (!rowId) { + const variant = findVariantById(state, variantId) + if (!variant) return {message: undefined} + + for (const prompt of variant.prompts || []) { + const message = prompt.messages?.value.find((msg) => msg.__id === messageId) + if (message) { + return { + messageFull: message, + message: { + role: message.role.__id, + content: message.content.__id, + name: message.name?.__id, + toolCalls: message.toolCalls?.__id, + toolCallId: message.toolCallId?.__id, + }, + } + } + } + return {message: undefined} + } else { + const object = + state.generationData.inputs.value.find((v) => v.__id === rowId) || + state.generationData.messages.value.find((v) => v.__id === rowId) - const contentPromptWriteAtom = useMemo(() => { - const contentId = (baseContentProperty as any)?.__id - if (revisionId && contentId) { - return promptPropertyAtomFamily({ - revisionId, - propertyId: contentId, - }) - } - return noopWriteAtom - }, [revisionId, (baseContentProperty as any)?.__id, noopWriteAtom]) - const setContentPromptValue = useSetAtom(contentPromptWriteAtom) - - // Facade write setup for base text property (prompts-only) - const baseTextPromptWriteAtom = useMemo(() => { - const textId = (baseProperty as any)?.__id - if (revisionId && textId) { - return promptPropertyAtomFamily({ - revisionId, - propertyId: textId, - }) - } - return noopWriteAtom - }, [revisionId, (baseProperty as any)?.__id, noopWriteAtom]) - const setBaseTextPromptValue = useSetAtom(baseTextPromptWriteAtom) + let message = findPropertyInObject(object, messageId) - // Use optimized variables data (already retrieved above) - const variables = optimizedVariables + message = message?.value || message - // Template format for token highlighting (curly | fstring | jinja2) - const templateFormat = useAtomValue( - useMemo(() => promptTemplateFormatAtomFamily(revisionId), [revisionId]), - ) + if (!message) return {message: undefined} + + // only access content after confirming message exists + let contentTarget = message.content + return { + message: { + role: message.role.__id, + content: contentTarget.__id, + toolCalls: message.toolCalls?.__id, + name: message.name?.__id, + toolCallId: message.toolCallId?.__id, + }, + } + } + }, + [messageId, rowId, variantId], + ), + }) + + const { + mutate, + handleParamUpdate: updateVariantProperty, + baseProperty, + isTool, + baseImageProperties, + messageRow, + baseContentProperty, + } = usePlayground({ + hookId: "PlaygroundVariantPropertyControl", + stateSelector: (state) => { + const object = rowId + ? state.generationData.inputs.value.find((v) => v.__id === rowId) || + (state.generationData.messages.value || []).find((v) => v.__id === rowId) + : variantId + ? state.variants.find((v) => v.id === variantId) + : null + + const messageRow = state.generationData.messages.value.find( + (messageId) => messageId.__id === rowId, + ) + + if (!object) { + return {} + } else { + const toolCalls = + findPropertyById(object as EnhancedVariant, message?.toolCalls) || + findPropertyInObject(state, message?.toolCalls) + + const isTool = !!toolCalls?.value && toolCalls.value.length > 0 + + let baseContentProperty = null + let textProperty = null + let baseImageProperties = null + let property = rowId + ? (findPropertyInObject( + object, + isTool ? toolCalls.value[0].__id : message?.content, + ) as EnhancedObjectConfig) + : (findPropertyById( + object as EnhancedVariant, + isTool ? toolCalls.value[0].__id : message?.content, + ) as EnhancedObjectConfig) + + baseContentProperty = property + if (Array.isArray(property?.value)) { + textProperty = property.value.find((v) => !!v && "text" in v)?.text + baseImageProperties = property.value + .map((v) => (!!v && "imageUrl" in v ? v.imageUrl?.url : undefined)) + .filter(Boolean) + property = textProperty || baseImageProperties + } + return { + baseProperty: property, + isTool, + messageRow, + textProperty, + baseImageProperties, + baseContentProperty, + } + } + }, + }) + + const {variables} = usePlayground({ + variantId, + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const variant = findVariantById(state, variantId) + const inputKeyValues = variant?.prompts.map((p) => p.inputKeys.value) + const variables = inputKeyValues?.flatMap((key) => key.map((k) => k.value)) + + return {variables} + }, + [variantId], + ), + }) const getProperty = useCallback( (property: any) => { @@ -145,56 +222,65 @@ const PromptMessageConfig = ({ const {__metadata, value} = property - // Smart handler with rowId-based routing (same logic as PlaygroundVariantPropertyControl) - const handler = (e: any) => { - const val = - e !== null && e !== undefined - ? typeof e === "object" && "target" in e - ? e.target.value - : e - : null - - const propertyId = property.__id - if (!propertyId) return - - // No-op guard: avoid redundant mutations that can cause render loops. - const currentVal = property?.value - const isSame = - typeof val === "object" && val !== null - ? deepEqual(val, currentVal) - : val === currentVal - if (!isTool && isSame) { - return - } - - // Prompt-only mutations (variant-scoped) - if (variantId) { - // Prefer prompts-only facade when possible - if ((baseProperty as any)?.__id && propertyId === (baseProperty as any).__id) { - setBaseTextPromptValue(val) - } else if ( - (baseContentProperty as any)?.__id && - propertyId === (baseContentProperty as any).__id - ) { - setContentPromptValue(val) - } else { - updateVariantProperty?.({ - variantId, - propertyId, - value: val, - }) + const handler = isTool + ? (e: any) => { + mutate((clonedState) => { + const message = findPropertyById( + clonedState.variants.find( + (v) => v.id === variantId, + ) as EnhancedVariant, + property.__id, + ) + if (!message) return clonedState + try { + const _obj = typeof e === "string" ? JSON.parse(e) : e + } catch (error) { + const _obj = tryParsePartialJson(e) + } + }) + } + : rowId + ? (e: any) => { + mutate( + (clonedState) => { + if (!clonedState) return clonedState + const val = + e !== null && e !== undefined + ? typeof e === "object" && "target" in e + ? e.target.value + : e + : null + + const generationData = structuredClone(clonedState.generationData) + const object = + generationData.inputs.value.find((v) => v.__id === rowId) || + generationData.messages.value.find((v) => v.__id === rowId) + + if (!object) { + return clonedState + } + + const _property = findPropertyInObject( + object, + property.__id, + ) as Enhanced + + if (!_property) return clonedState + + _property.value = val + + clonedState.generationData = generationData + + return clonedState + }, + { + revalidate: false, + }, + ) + } + : (newValue: any) => { + updateVariantProperty?.(newValue, property.__id, variantId) } - } else { - console.warn( - "⚠️ [PROMPT MESSAGE CONFIG] Prompt-only component missing variantId", - { - variantId, - rowId, - propertyId, - }, - ) - } - } return { __metadata: getMetadataLazy(__metadata), @@ -203,22 +289,11 @@ const PromptMessageConfig = ({ handleChange: handler, } }, - [ - isTool, - rowId, - updateVariantProperty, - // updateGenerationDataProperty, - variantId, - (baseProperty as any)?.__id, - (baseContentProperty as any)?.__id, - setBaseTextPromptValue, - setContentPromptValue, - ], + [isTool, mutate, rowId, updateVariantProperty, variantId], ) const property = useMemo(() => { - const result = getProperty(baseProperty) - return result + return getProperty(baseProperty) }, [baseProperty, getProperty]) const imageProperties = useMemo(() => { @@ -229,34 +304,61 @@ const PromptMessageConfig = ({ return getProperty(baseContentProperty) }, [baseContentProperty, getProperty]) - // Defensive programming: Handle revoked proxy for property object - let metadata: any - let value: any - let handleChange: any - - try { - const safeProperty: any = property || {} - metadata = safeProperty.__metadata - value = safeProperty.value - handleChange = safeProperty.handleChange - } catch (error) { - console.error("❌ [PromptMessageConfig] Error accessing property:", error) - metadata = undefined - value = undefined - handleChange = undefined - } - - const {computeDisplayValue} = useMessageContentHandlers() - const _value = useMemo( - () => - computeDisplayValue({ - propsInitialValue, - value, - isFunction: Boolean(isFunction), - isTool: Boolean(isTool), - contentProperty: contentProperty as any, - }), - [computeDisplayValue, propsInitialValue, value, isFunction, isTool, contentProperty], + const {__metadata: metadata, value, handleChange} = property || {} + + const _value = useMemo(() => { + if (isFunction) { + return propsInitialValue || value + } else if (isTool) { + let _val = propsInitialValue || value + let args = _val?.function?.arguments + if (typeof args === "string") { + args = JSON5.parse(args) + _val = args + } + return JSON5.stringify(_val, null, 2) + } else { + const x = value + if (Array.isArray(x)) { + const textNode = x.filter((part) => "text" in part) + return textNode.map((part) => part.text).join("") + } else { + return x || "" + } + } + }, [propsInitialValue, value, isFunction, isTool]) + + const handleAddUploadSlot = useCallback(() => { + const imageNodes = Array.isArray(contentProperty?.value) + ? contentProperty.value.filter((part) => "imageUrl" in part) + : [] + if (imageNodes?.length >= 5) return + + const itemMetadata = getMetadataLazy( + contentProperty?.__metadata, + )?.itemMetadata?.options?.find((part) => "imageUrl" in part.properties) + const imageNode = createObjectFromMetadata(itemMetadata) + imageNode.type.value = "image_url" + + const newValue = [...contentProperty?.value, imageNode] + contentProperty?.handleChange(newValue) + }, [contentProperty]) + + const handleRemoveFileItem = useCallback( + (propertyId: string) => { + if (!contentProperty) return + const cloned = structuredClone(contentProperty.value) + const index = cloned.findIndex((part) => { + const found = findPropertyInObject(part, propertyId) + return !!found + }) + if (index >= 0) { + // remove item at index + const x = cloned.splice(index, 1) + contentProperty.handleChange(cloned) + } + }, + [contentProperty], ) // Try to access the Lexical editor instance from context @@ -281,58 +383,255 @@ const PromptMessageConfig = ({ ) return unregister }, [editor]) - // toolInfo no longer needed after header extraction + + const _resultHashes = useMemo(() => { + if (!messageRow?.history?.value) return [] + + const results: string[] = [] + + if (messageId) { + const historyItem = messageRow.history.value.find((h) => h.__id === messageId) + + if (historyItem) { + Object.values(historyItem.__runs || {}).forEach((run) => { + // Only include results from runs associated with the selected messageId + if (run?.__result && run.messageId === messageId) results.push(run.__result) + }) + } else { + for (const history of messageRow.history.value) { + for (const run of Object.values(history.__runs || {})) { + if (run?.message?.__id === messageId) { + if (run.__result) results.push(run.__result) + } + + if ( + Array.isArray(run?.messages) && + run.messages.some((m) => m.__id === messageId) + ) { + if (run.__result) results.push(run.__result) + } + } + } + } + } else { + messageRow.history.value.forEach((history) => { + const result = history.__runs?.[variantId]?.__result + if (result) results.push(result) + }) + } + + return results + }, [messageId, messageRow, variantId]) + + const toolInfo = useMemo(() => { + if (!message || !isTool) return null + const _value = propsInitialValue || value + const parsed = typeof _value === "string" ? JSON5.parse(_value) : _value + return parsed + }, [propsInitialValue, message, value, isTool]) const _placeholder = useMemo(() => { return isFunction ? "Enter function output" : placeholder }, [isFunction, placeholder]) + if (!property) { + return null + } + if (!message) { return null } return ( setMinimized((c) => !c), - }} - /> + isFunction ? ( +
    +
    + + {!disabled && ( + { + setMinimized((current) => !current) + }, + handleAddUploadSlot, + }} + allowFileUpload={allowFileUpload} + uploadCount={imageProperties?.length} + hideMarkdownToggle={true} + /> + )} +
    +
    + + + {/* */} + {/* */} + {/* + {value?.id} + */} +
    +
    + ) : isTool ? ( +
    +
    + + {!disabled && ( + { + setMinimized((current) => !current) + }, + handleAddUploadSlot, + }} + allowFileUpload={allowFileUpload} + uploadCount={imageProperties?.length || 0} + hideMarkdownToggle={true} + > + {/*
    @@ -417,7 +354,6 @@ const TestsetTable: FC = ({mode}) => { onRowSelected={onRowSelectedOrDeselected} onRowDataUpdated={onRowSelectedOrDeselected} className="ph-no-capture" - suppressFieldDotNotation={true} />
    diff --git a/web/oss/src/components/TruncatedTooltipTag/index.tsx b/web/oss/src/components/TruncatedTooltipTag/index.tsx index fb95c1b112..4a35501ab3 100644 --- a/web/oss/src/components/TruncatedTooltipTag/index.tsx +++ b/web/oss/src/components/TruncatedTooltipTag/index.tsx @@ -21,9 +21,7 @@ const TruncatedTooltipTag = ({ {children} } - classNames={{ - root: `w-fit text-wrap`, - }} + overlayClassName={`w-fit text-wrap`} className={`overflow-hidden text-ellipsis whitespace-nowrap max-w-[100%]`} placement="bottomLeft" {...props} diff --git a/web/oss/src/components/VariantDetailsWithStatus/components/EnvironmentStatus.tsx b/web/oss/src/components/VariantDetailsWithStatus/components/EnvironmentStatus.tsx index 39250625c1..4207f28153 100644 --- a/web/oss/src/components/VariantDetailsWithStatus/components/EnvironmentStatus.tsx +++ b/web/oss/src/components/VariantDetailsWithStatus/components/EnvironmentStatus.tsx @@ -2,10 +2,8 @@ import {type FC} from "react" import {Badge, Space, Tooltip} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" import {Variant} from "@/oss/lib/shared/variant" -import {revisionDeploymentAtomFamily} from "@/oss/state/variant/atoms/fetcher" export const statusMap: Record = { production: {badge: "#73D13D"}, @@ -13,34 +11,22 @@ export const statusMap: Record = { development: {badge: "#9254DE"}, } -const EnvironmentStatus: FC<{ - variant: Pick & {id?: string} - className?: string -}> = ({variant, className}) => { - // Fallback to deployment atom if deployedIn is not embedded on the variant - const fallbackDeployedIn = useAtomValue( - revisionDeploymentAtomFamily((variant as any)?.id || ""), - ) as any[] - - const deployedIn = - (Array.isArray(variant.deployedIn) && variant.deployedIn.length > 0 - ? variant.deployedIn - : fallbackDeployedIn) || [] - +const EnvironmentStatus: FC<{variant: Pick; className?: string}> = ({ + variant, + className, +}) => { return ( - {deployedIn.map((env) => { - return ( - -
    - -
    -
    - ) - })} + {(variant.deployedIn || []).map((env) => ( + +
    + +
    +
    + ))}
    ) } diff --git a/web/oss/src/components/VariantDetailsWithStatus/components/VariantDetails.tsx b/web/oss/src/components/VariantDetailsWithStatus/components/VariantDetails.tsx index 37cf5ec866..4f13888c33 100644 --- a/web/oss/src/components/VariantDetailsWithStatus/components/VariantDetails.tsx +++ b/web/oss/src/components/VariantDetailsWithStatus/components/VariantDetails.tsx @@ -1,27 +1,13 @@ -// no react hooks needed here beyond Jotai - import {PencilSimpleLine} from "@phosphor-icons/react" -import {Dropdown, Space, Tag, Typography} from "antd" -import type {MenuProps} from "antd" -import {useAtomValue, useSetAtom} from "jotai" +import {Space, Tag, Typography} from "antd" -import {parametersOverrideAtomFamily} from "@/oss/components/Playground/state/atoms" import {Variant} from "@/oss/lib/Types" -import {clearLocalCustomPropsForRevisionAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import { - clearLocalPromptsForRevisionAtomFamily, - clearLocalTransformedPromptsForRevisionAtomFamily, -} from "@/oss/state/newPlayground/core/prompts" -import {latestAppRevisionIdAtom} from "@/oss/state/variant/selectors/variant" - -import {message} from "../../AppMessageContext" interface VariantDetailsProps { variantName?: string revision?: number | string | null - variant?: Pick + variant?: Pick & {isDraft?: boolean} showRevisionAsTag?: boolean - hasChanges?: boolean } const VariantDetails = ({ @@ -29,54 +15,7 @@ const VariantDetails = ({ revision, variant, showRevisionAsTag = true, - hasChanges = false, }: VariantDetailsProps) => { - const latestAppRevisionId = useAtomValue(latestAppRevisionIdAtom) - const currentRevisionId = (variant as any)?.id as string | undefined - const isAppLatest = !!currentRevisionId && currentRevisionId === latestAppRevisionId - const clearLocalPrompts = useSetAtom( - clearLocalPromptsForRevisionAtomFamily(currentRevisionId || "") as any, - ) - const clearLocalTransformed = useSetAtom( - clearLocalTransformedPromptsForRevisionAtomFamily(currentRevisionId || "") as any, - ) - const clearLocalCustomProps = useSetAtom( - clearLocalCustomPropsForRevisionAtomFamily(currentRevisionId || "") as any, - ) - const setParamsOverride = useSetAtom( - parametersOverrideAtomFamily(currentRevisionId || "") as any, - ) - - const handleDiscardDraft = () => { - if (!currentRevisionId) return - try { - // Clear local prompt edits and JSON override for this revision - clearLocalPrompts() - clearLocalTransformed() - clearLocalCustomProps() - setParamsOverride(null) - message.success("Draft changes discarded") - } catch (e) { - // Non-blocking: ensure UX feedback even if something goes wrong - message.error("Failed to discard draft changes") - - console.error(e) - } - } - - const draftMenuItems: MenuProps["items"] = [ - { - key: "discard", - label: "Discard draft changes", - danger: true, - disabled: !currentRevisionId, - }, - ] - const onDraftMenuClick: MenuProps["onClick"] = ({key}) => { - if (key === "discard") { - handleDiscardDraft() - } - } return ( {variantName ? {variantName} : null} @@ -89,22 +28,17 @@ const VariantDetails = ({ v{revision} ))} - {hasChanges ? ( - - - Draft - - + Draft + ) : ( - isAppLatest && ( + variant && + variant.isLatestRevision && ( Last modified diff --git a/web/oss/src/components/VariantDetailsWithStatus/index.tsx b/web/oss/src/components/VariantDetailsWithStatus/index.tsx index 6e6c822f96..b5c84c8331 100644 --- a/web/oss/src/components/VariantDetailsWithStatus/index.tsx +++ b/web/oss/src/components/VariantDetailsWithStatus/index.tsx @@ -1,10 +1,7 @@ import clsx from "clsx" -import {useAtomValue} from "jotai" import {Variant} from "@/oss/lib/Types" -import {variantIsDirtyAtomFamily} from "../Playground/state/atoms" - import EnvironmentStatus from "./components/EnvironmentStatus" import VariantDetails from "./components/VariantDetails" @@ -16,20 +13,15 @@ const VariantDetailsWithStatus = ({ hideName = false, className, showRevisionAsTag, - showStable = false, }: { - variant?: Pick + variant?: Pick & {isDraft?: boolean} hideName?: boolean showBadges?: boolean variantName?: string revision: number | string | undefined | null showRevisionAsTag?: boolean - showStable?: boolean className?: string }) => { - const _isDirty = useAtomValue(variantIsDirtyAtomFamily(variant?.id || "")) - const isDirty = showStable ? false : _isDirty - return (
    {showBadges && variant && }
    diff --git a/web/oss/src/components/VariantNameCell/index.tsx b/web/oss/src/components/VariantNameCell/index.tsx deleted file mode 100644 index 0a1c1a4b7e..0000000000 --- a/web/oss/src/components/VariantNameCell/index.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import {memo} from "react" - -import {Tag} from "antd" -import {useAtomValue} from "jotai" - -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms/propertySelectors" -import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" -import type {Variant} from "@/oss/lib/Types" -import {revisionDeploymentAtomFamily} from "@/oss/state/variant/atoms/fetcher" -import { - variantDisplayNameByIdAtomFamily, - latestAppRevisionIdAtom, -} from "@/oss/state/variant/selectors/variant" - -type Rev = { - id: string - variantId: string - revision?: number - revisionNumber?: number -} | null - -interface VariantNameCellProps { - revisionId?: string - showBadges?: boolean - showStable?: boolean - revision?: Rev - revisionName?: string | null -} - -const VariantNameCell = memo( - ({ - revisionId, - revision, - revisionName, - showBadges = false, - showStable = false, - }: VariantNameCellProps) => { - const resolvedRevision = useAtomValue( - variantByRevisionIdAtomFamily(revisionId || (revision?.id ?? "")), - ) as Rev - - const rev = resolvedRevision ?? revision - const variantId = (rev && rev.variantId) || "" - - const nameFromStore = useAtomValue(variantDisplayNameByIdAtomFamily(variantId)) - const latestIdForVariant = useAtomValue(latestAppRevisionIdAtom) - const deployedInFromStore = useAtomValue( - revisionDeploymentAtomFamily((rev && rev.id) || ""), - ) - - if (!rev) { - return ( - - No deployment - - ) - } - - const resolvedName = - (nameFromStore && nameFromStore !== "-" ? nameFromStore : null) || - revisionName || - (rev as any)?.variantName || - "-" - - const deployedIn = - deployedInFromStore && deployedInFromStore.length > 0 - ? deployedInFromStore - : ((rev as any)?.deployedIn as Variant["deployedIn"]) || [] - - const isLatestRevision = - typeof (rev as any)?.isLatestRevision === "boolean" - ? (rev as any).isLatestRevision - : rev.id === latestIdForVariant - - const variantMin: Pick = { - id: rev.id, - deployedIn, - isLatestRevision, - } - - return ( - - ) - }, -) - -export default VariantNameCell diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/VariantDrawerWrapper.tsx b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/VariantDrawerWrapper.tsx deleted file mode 100644 index 848b83ddd3..0000000000 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/VariantDrawerWrapper.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import {useCallback} from "react" - -import {useAtomValue, useSetAtom} from "jotai" - -import {variantDrawerAtom, closeVariantDrawerAtom} from "./store/variantDrawerStore" - -import VariantDrawer from "./index" - -const VariantDrawerWrapper = () => { - const drawerState = useAtomValue(variantDrawerAtom) - const closeDrawer = useSetAtom(closeVariantDrawerAtom) - - const handleClose = useCallback(() => { - closeDrawer() - }, [closeDrawer]) - - return ( - - ) -} - -export default VariantDrawerWrapper diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/DeploymentDrawerTitle/index.tsx b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/DeploymentDrawerTitle/index.tsx index e2291fc262..d677a8e058 100644 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/DeploymentDrawerTitle/index.tsx +++ b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/DeploymentDrawerTitle/index.tsx @@ -1,64 +1,30 @@ -import {memo, useCallback} from "react" +import {memo} from "react" -import {CloseOutlined, FullscreenExitOutlined, FullscreenOutlined} from "@ant-design/icons" +import {CloseOutlined} from "@ant-design/icons" import {ArrowCounterClockwise} from "@phosphor-icons/react" import {Button, Tag} from "antd" -import {useAtomValue, useSetAtom} from "jotai" +import {useRouter} from "next/router" -import {openDeploymentConfirmationModalAtom} from "@/oss/components/DeploymentsDashboard/modals/store/deploymentModalsStore" import EnvironmentTagLabel from "@/oss/components/EnvironmentTagLabel" -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms" -import {useQueryParam} from "@/oss/hooks/useQuery" -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" -import {deployedRevisionByEnvironmentAtomFamily} from "@/oss/state/variant/atoms/fetcher" import {DeploymentDrawerTitleProps} from "../types" const DeploymentDrawerTitle = ({ - variantId, + selectedVariant, onClose, - onToggleWidth, - isExpanded, + revert, + isLoading, }: DeploymentDrawerTitleProps) => { - const selectedVariant = useAtomValue(variantByRevisionIdAtomFamily(variantId)) - const [envName] = useQueryParam("selectedEnvName") - const {isPending: isPublishing, mutateAsync: publish} = useAtomValue(publishMutationAtom) - const deployedRevision = useAtomValue(deployedRevisionByEnvironmentAtomFamily(envName)) - const canRevert = variantId !== deployedRevision?.id - const openDeploymentConfirmationModal = useSetAtom(openDeploymentConfirmationModalAtom) - - const handleRevert = useCallback(() => { - openDeploymentConfirmationModal({ - envName, - actionType: "revert", - variant: selectedVariant, - onConfirm: async (noteValue) => { - await publish({ - type: "revision", - note: noteValue, - revision_id: variantId, - environment_ref: envName, - }) - onClose() - }, - successMessage: `Reverted in ${envName}`, - }) - }, [envName, selectedVariant, variantId, publish, openDeploymentConfirmationModal, onClose]) + const router = useRouter() return (
    diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters/index.tsx b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters/index.tsx index 894e4cffbd..ba301f8ed4 100644 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters/index.tsx +++ b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters/index.tsx @@ -1,173 +1,63 @@ -import {useCallback, useMemo, useRef} from "react" +import {useCallback, useMemo} from "react" -import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" import {getYamlOrJson} from "@/oss/lib/helpers/utils" import {VariantUpdateFunction} from "@/oss/lib/hooks/useStatelessVariants/types" -import { - deriveCustomPropertiesFromSpec, - derivePromptsFromSpec, -} from "@/oss/lib/shared/variant/transformer/transformer" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {customPropertiesAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import { - transformedPromptsAtomFamily, - promptsAtomFamily, -} from "@/oss/state/newPlayground/core/prompts" -import {appSchemaAtom, appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" +import {EnhancedVariant, VariantParameters} from "@/oss/lib/shared/variant/transformer/types" const SharedEditor = dynamic(() => import("@/oss/components/Playground/Components/SharedEditor"), { ssr: false, }) -const collectIdentifiers = (value: unknown): string[] => { - if (!value || typeof value !== "object") { - return [] - } - - const entries = Array.isArray(value) ? value : Object.values(value as Record) - - const current = !Array.isArray(value) - ? ((value as Record).__test ?? (value as Record).__id) - : undefined - - const nested = entries.flatMap((entry) => collectIdentifiers(entry)) - - return [current !== undefined ? String(current) : undefined, ...nested].filter( - (item): item is string => !!item, - ) -} - export const NewVariantParametersView = ({ selectedVariant, mutateVariant, - showOriginal, }: { selectedVariant: EnhancedVariant parameters?: Record mutateVariant?: | ((updates: Partial | VariantUpdateFunction) => Promise) | undefined - showOriginal?: boolean }) => { - const appUriInfo = useAtomValue(appUriInfoAtom) - const spec = useAtomValue(appSchemaAtom) - - const revisionId = (selectedVariant as any)?._revisionId || selectedVariant?.id - - // Base parameters are derived from prompts (same structure used for prompt commits) - const derived = useAtomValue(transformedPromptsAtomFamily(revisionId)) as any - const promptsAtom = useMemo(() => promptsAtomFamily(revisionId), [revisionId]) - const prompts = useAtomValue(promptsAtom) - const setPrompts = useSetAtom(promptsAtom) - - const customPropsAtom = useMemo( - () => - customPropertiesAtomFamily({ - revisionId, - routePath: appUriInfo?.routePath, - }), - [revisionId, appUriInfo?.routePath], - ) - const setCustomProps = useSetAtom(customPropsAtom) - const customProps = useAtomValue(customPropsAtom) - const configJsonString = useMemo(() => { - // When viewing original, always show the saved revision parameters - if (showOriginal) { - const base = (selectedVariant as any)?.parameters ?? {} - return getYamlOrJson("JSON", base) + interface OptionalParameters extends Omit { + agConfig?: VariantParameters["agConfig"] } + const parameters = structuredClone(selectedVariant.parameters) as OptionalParameters + if (parameters) { + delete parameters.agConfig + delete parameters.ag_config - if (!spec) { - const fallback = (selectedVariant as any)?.parameters ?? {} - return getYamlOrJson("JSON", fallback) + return getYamlOrJson("JSON", parameters) } + return "" + }, [selectedVariant?.id]) - const derivedConfig = derived?.ag_config ?? {} - return getYamlOrJson("JSON", derivedConfig) - }, [derived?.ag_config, showOriginal, spec, selectedVariant]) - - const derivedKeyFromAllProperties = useMemo(() => { - const customPropsIdentifiers = collectIdentifiers(customProps) - const promptsIdentifiers = collectIdentifiers(prompts) - - const identifiers = [...customPropsIdentifiers, ...promptsIdentifiers] - - return identifiers.join("-") - }, [customProps, prompts]) - - const idsRef = useRef(derivedKeyFromAllProperties) - const stableIdsRef = useRef(derivedKeyFromAllProperties) const onChange = useCallback( - (value: string, key: string) => { - if (showOriginal) return - if (!value) return + (value: string) => { + if (!mutateVariant || !value || !selectedVariant?.id) return try { - const parsed = JSON.parse(value || "{}") - if (!spec) return - - const variantForDerive = { - ...(selectedVariant as any), - parameters: { - ...(selectedVariant as any)?.parameters, - ag_config: parsed, - }, - } + mutateVariant?.((variant) => { + if (!variant) return - const nextPrompts = derivePromptsFromSpec( - variantForDerive as any, - spec as any, - appUriInfo?.routePath, - ) as any + const newParameters = structuredClone(JSON.parse(value || "{}")) - const nextCustomProps = deriveCustomPropertiesFromSpec( - variantForDerive as any, - spec as any, - appUriInfo?.routePath, - ) as Record + if (Object.keys(newParameters || {}).length) { + variant.parameters = newParameters + } - const newIds = [ - ...collectIdentifiers(nextPrompts), - ...collectIdentifiers(nextCustomProps), - ].join("-") - - idsRef.current = newIds - - setPrompts(nextPrompts) - setCustomProps(nextCustomProps) - } catch (error) { - // Ignore parse errors; editor will keep showing the current text - } + return variant + }) + } catch (error) {} }, - [ - showOriginal, - spec, - appUriInfo?.routePath, - setPrompts, - setCustomProps, - selectedVariant, - derivedKeyFromAllProperties, - ], + [mutateVariant], ) - const key = - idsRef.current === derivedKeyFromAllProperties - ? stableIdsRef.current - : derivedKeyFromAllProperties - - if (key === derivedKeyFromAllProperties) { - stableIdsRef.current = key - } - - if (!revisionId) return null - return ( -
    +
    { - onChange(value, derivedKeyFromAllProperties) - }} - disabled={!!showOriginal} - state={showOriginal ? "readOnly" : "filled"} + handleChange={onChange} className="!w-[97%] *:font-mono" />
    diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerContent/index.tsx b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerContent/index.tsx index 7bc6bd433f..24b50b36d9 100644 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerContent/index.tsx +++ b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerContent/index.tsx @@ -1,192 +1,69 @@ -import {memo, useEffect, useMemo} from "react" +import {useMemo} from "react" import {ArrowSquareOut} from "@phosphor-icons/react" -import {Button, Space, Spin, Tag, Typography, TabsProps, Tabs, Switch, Tooltip} from "antd" +import {Button, Space, Spin, Tabs, Tag, Typography, TabsProps} from "antd" import clsx from "clsx" -import {atom, useAtomValue, useSetAtom} from "jotai" -import {atomFamily} from "jotai/utils" import {useRouter} from "next/router" +import Avatar from "@/oss/components/Avatar/Avatar" import EnvironmentTagLabel from "@/oss/components/EnvironmentTagLabel" import PlaygroundVariantConfigPrompt from "@/oss/components/Playground/Components/PlaygroundVariantConfigPrompt" import PlaygroundVariantCustomProperties from "@/oss/components/Playground/Components/PlaygroundVariantCustomProperties" -import {PromptsSourceProvider} from "@/oss/components/Playground/context/PromptsSource" -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms" -import {parametersOverrideAtomFamily} from "@/oss/components/Playground/state/atoms" -import {variantIsDirtyAtomFamily} from "@/oss/components/Playground/state/atoms/dirtyState" -import UserAvatarTag from "@/oss/components/ui/UserAvatarTag" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" import {useAppId} from "@/oss/hooks/useAppId" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" -import {useQueryParam} from "@/oss/hooks/useQuery" -import useURL from "@/oss/hooks/useURL" -import {formatDate24} from "@/oss/lib/helpers/dateTimeHelper" -import { - derivePromptsFromSpec, - deriveCustomPropertiesFromSpec, -} from "@/oss/lib/shared/variant/transformer/transformer" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import { - appStatusLoadingAtom, - revisionDeploymentAtomFamily, - variantRevisionsQueryFamily, -} from "@/oss/state/variant/atoms/fetcher" -import {appSchemaAtom, appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" -import {variantDrawerAtom} from "../../store/variantDrawerStore" import {NewVariantParametersView} from "../Parameters" import {VariantDrawerContentProps} from "../types" const {Text} = Typography -const EMPTY_REVISION_ID = "__variant-drawer-empty__" - -const resolveParentVariantId = (variant: any): string | null => { - if (!variant) return null - const parent = variant?._parentVariant - if (typeof parent === "string" && parent.trim()) return parent - if (parent && typeof parent === "object") return parent.id || parent.variantId || null - return variant?.variantId ?? null -} - -export const drawerVariantIsLoadingAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - const schemaLoading = !!get(appStatusLoadingAtom) - if (!revisionId || revisionId === EMPTY_REVISION_ID) { - return schemaLoading - } - - const selectedVariant = get(variantByRevisionIdAtomFamily(revisionId)) as any - if (!selectedVariant) { - return true - } - - const parentVariantId = resolveParentVariantId(selectedVariant) - if (!parentVariantId) { - return schemaLoading - } - - const revisionsQuery = get(variantRevisionsQueryFamily(parentVariantId)) as any - const data = revisionsQuery?.data - const hasRevisionData = Array.isArray(data) && data.length > 0 - - const revisionLoading = - !!revisionsQuery?.isLoading || (!hasRevisionData && !!revisionsQuery?.isFetching) - - return schemaLoading || revisionLoading - }), -) - const VariantDrawerContent = ({ - variantId, + selectedVariant, + promptIds, + isLoading, type, - viewAs, + variants, onChangeViewAs, - showOriginal, - onToggleOriginal, }: VariantDrawerContentProps) => { const router = useRouter() - const {goToPlayground} = usePlaygroundNavigation() - - const isLoading = useAtomValue(drawerVariantIsLoadingAtomFamily(variantId)) - - // Focused selected variant by revision ID - const selectedVariant = useAtomValue(variantByRevisionIdAtomFamily(variantId)) as any - - // App-level: app status is true when OpenAPI schema is available - const appSchema = useAtomValue(appSchemaAtom) - const appStatus = !!appSchema - const uriInfo = useAtomValue(appUriInfoAtom) + const appId = useAppId() - const prompts = useAtomValue(promptsAtomFamily(variantId)) - const promptIds = prompts?.map((p: any) => p?.__id as string) - - // Focused deployed environments by revision ID - const deployedIn = useAtomValue(revisionDeploymentAtomFamily(variantId)) || [] - const commitMsg = selectedVariant?.commitMessage - const isDirty = useAtomValue( - variantIsDirtyAtomFamily((selectedVariant as any)?.id || variantId), - ) + const {appStatus, mutateVariant} = usePlayground({ + variantId: selectedVariant?.id, + stateSelector: (state) => { + return { + appStatus: state.appStatus, + } + }, + }) - // Ensure clean revisions don't get stuck in Original mode - useEffect(() => { - if (!isDirty && showOriginal) { - onToggleOriginal?.(false) - } - }, [isDirty, showOriginal, onToggleOriginal]) + const deployedIn = useMemo(() => { + if (type !== "variant") return [] - // Derive original (saved) prompts from spec and saved parameters for read-only view - const originalPrompts = useMemo(() => { - try { - if (!showOriginal) return [] as any[] - if (!appSchema || !selectedVariant) return [] as any[] - const routePath = uriInfo?.routePath - const derived = derivePromptsFromSpec( - selectedVariant as any, - appSchema as any, - routePath, + if (variants[0]?.revisions && variants[0]?.revisions?.length > 0) { + return ( + variants.find((v) => v?.id === selectedVariant?._parentVariant?.id)?.deployedIn || + [] ) - return Array.isArray(derived) ? (derived as any[]) : [] - } catch { - return [] as any[] } - }, [showOriginal, appSchema, selectedVariant, uriInfo?.routePath]) - const originalPromptIds = useMemo( - () => originalPrompts.map((p: any) => p.__id || p.__name).filter(Boolean), - [originalPrompts], - ) - - // Derive original (saved) custom properties for read-only view - const originalCustomPropsRecord = useMemo(() => { - try { - if (!showOriginal) return {} - if (!appSchema || !selectedVariant) return {} - const routePath = uriInfo?.routePath - const record = deriveCustomPropertiesFromSpec( - selectedVariant as any, - appSchema as any, - routePath, - ) as Record - return record || {} - } catch { - return {} - } - }, [showOriginal, appSchema, selectedVariant, uriInfo?.routePath]) + return selectedVariant?.deployedIn || [] + }, [type, variants, selectedVariant]) const tabItems = useMemo(() => { return [ appStatus ? { - key: "main", - label: type === "variant" ? "Overview" : "Variant", + key: type === "variant" ? "overview" : "variant", + label: ( +
    onChangeViewAs("prompt")}> + {type === "variant" ? "Overview" : "Variant"} +
    + ), className: "w-full h-full flex flex-col px-4", - children: showOriginal ? ( - - <> - {originalPromptIds.map((promptId: string) => ( - - ))} - - - - ) : ( + children: ( <> {(promptIds || [])?.map((promptId: string) => ( onChangeViewAs("parameters")}>JSON
    , className: "h-full flex flex-col px-4", - children: isLoading ? null : selectedVariant ? ( + children: selectedVariant ? ( ) : null, }, ].filter(Boolean) as TabsProps["items"] - }, [ - appStatus, - selectedVariant, - promptIds, - type, - showOriginal, - originalPrompts, - originalPromptIds, - isLoading, - ]) - const drawerState = useAtomValue(variantDrawerAtom) - const clearJsonOverride = useSetAtom( - parametersOverrideAtomFamily((selectedVariant as any)?.id || ""), - ) - - useEffect(() => { - // Component mount/unmount lifecycle for drawer content - return () => { - // In React StrictMode, components mount then immediately unmount once. - // Only clear when the drawer is actually closed to avoid reopen loops. - if (!drawerState.open) { - const isPlaygroundRoute = router.pathname.includes("/playground") - if (!isPlaygroundRoute) { - clearJsonOverride(null as any) - } - } - } - }, [clearJsonOverride, drawerState.open, router.pathname]) + }, [selectedVariant, promptIds, type, onChangeViewAs]) if (isLoading) { return ( @@ -273,25 +123,9 @@ const VariantDrawerContent = ({ ])} > onChangeViewAs(key === "json" ? "parameters" : "prompt")} + destroyInactiveTabPane + defaultActiveKey={type === "variant" ? "overview" : "variant"} className="overflow-auto" - tabBarExtraContent={{ - right: ( -
    - Original - - onToggleOriginal?.(checked)} - disabled={!isDirty} - /> - -
    - ), - }} items={tabItems} />
    @@ -312,7 +146,17 @@ const VariantDrawerContent = ({
    @@ -321,26 +165,21 @@ const VariantDrawerContent = ({
    Date modified - {(() => { - const ts = - (selectedVariant as any)?.updatedAtTimestamp ?? - (selectedVariant as any)?.createdAtTimestamp - return ts - ? formatDate24(ts) - : ((selectedVariant as any)?.createdAt ?? "-") - })()} + {selectedVariant?.updatedAt}
    Modified by - {/* Pass the revision id so selector can resolve modifiedBy correctly */} - + + {" "} + {selectedVariant?.modifiedBy} +
    - {commitMsg && ( + {selectedVariant?.commitMessage && (
    Note - {commitMsg} + {selectedVariant?.commitMessage || ""}
    )} @@ -359,4 +198,4 @@ const VariantDrawerContent = ({ ) } -export default memo(VariantDrawerContent) +export default VariantDrawerContent diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerTitle/index.tsx b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerTitle/index.tsx index ae3b260945..8a37e17d65 100644 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerTitle/index.tsx +++ b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/VariantDrawerTitle/index.tsx @@ -1,166 +1,171 @@ import {memo, useCallback, useMemo} from "react" -import {CloseOutlined, FullscreenExitOutlined, FullscreenOutlined} from "@ant-design/icons" +import {CloseOutlined} from "@ant-design/icons" import {CaretDown, CaretUp, Rocket} from "@phosphor-icons/react" import {Button} from "antd" -import {useAtomValue} from "jotai" import {useRouter} from "next/router" import CommitVariantChangesButton from "@/oss/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton" import DeployVariantButton from "@/oss/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton" -import { - revisionListAtom, - variantByRevisionIdAtomFamily, -} from "@/oss/components/Playground/state/atoms" -import {variantIsDirtyAtomFamily} from "@/oss/components/Playground/state/atoms" -import VariantNameCell from "@/oss/components/VariantNameCell" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" -import {useQuery, useQueryParam} from "@/oss/hooks/useQuery" -import useURL from "@/oss/hooks/useURL" -import {currentVariantAppStatusAtom} from "@/oss/state/variant/atoms/fetcher" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" +import {useAppsData} from "@/oss/contexts/app.context" +import {useAppId} from "@/oss/hooks/useAppId" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {useVariants} from "@/oss/lib/hooks/useVariants" import {VariantDrawerTitleProps} from "../types" -import {drawerVariantIsLoadingAtomFamily} from "../VariantDrawerContent" -// Local, focused subcomponents to reduce subscriptions and re-renders -const NavControls = memo( - ({ - variantId, - variantIds, - variants, - isLoading, - }: Pick) => { - const [, updateQuery] = useQuery("replace") - const [displayMode] = useQueryParam("displayMode") - const selectedVariant = useAtomValue(variantByRevisionIdAtomFamily(variantId)) as any - const selectedParent = useMemo(() => { - const parentId = - typeof selectedVariant?._parentVariant === "string" - ? selectedVariant?._parentVariant - : selectedVariant?._parentVariant?.id - return variants.find((v) => v.id === parentId) - }, [variants, selectedVariant]) - - const selectedVariantIndex = useMemo(() => { - if (variantIds && variantIds.length > 1) { - return variantIds.findIndex((id) => id === variantId) - } - if (displayMode && displayMode !== "flat") { - if (selectedParent) { - return selectedParent.revisions?.findIndex((r) => r.id === variantId) - } - return variants?.findIndex((v) => v.id === variantId) - } - return variants?.findIndex((v) => v.id === variantId) - }, [variantId, variants, selectedParent, displayMode, variantIds]) +const VariantDrawerTitle = ({ + selectedVariant, + onClose, + variants, + isDirty, + selectedDrawerVariant, + isLoading, + viewAs, +}: VariantDrawerTitleProps) => { + const {appStatus} = usePlayground({ + stateSelector: (state) => ({ + appStatus: state.appStatus, + }), + }) + const appId = useAppId() + const router = useRouter() + const {currentApp} = useAppsData() + // @ts-ignore + const {mutate: fetchAllVariants} = useVariants(currentApp)({appId}) + const [_, setQueryVariant] = useQueryParam("revisions") + const [displayMode] = useQueryParam("displayMode") + + const selectedParent = useMemo( + () => variants.find((v) => v.id === selectedVariant?._parentVariant.id), + [variants, selectedVariant], + ) - const isDisableNext = useMemo(() => { - if (variantIds && variantIds.length > 1) { - return selectedVariantIndex === (variantIds.length ?? 0) - 1 - } - if (displayMode && displayMode !== "flat") { - if (selectedParent) { - return selectedVariantIndex === (selectedParent?.revisions?.length ?? 0) - 1 - } - return selectedVariantIndex === (variants?.length ?? 0) - 1 + const selectedVariantIndex = useMemo(() => { + if (selectedDrawerVariant && !selectedDrawerVariant._parentVariant) { + return variants?.findIndex((v) => v.id === selectedVariant?._parentVariant?.id) + } + if (displayMode && displayMode !== "flat") { + if (selectedParent) { + return selectedParent.revisions?.findIndex((r) => r.id === selectedVariant?.id) } - return selectedVariantIndex === (variants?.length ?? 0) - 1 - }, [selectedVariantIndex, variants, selectedParent, displayMode, variantIds]) - - const isDisablePrev = useMemo(() => selectedVariantIndex === 0, [selectedVariantIndex]) - - const loadPrevVariant = useCallback(() => { - if (selectedVariantIndex === undefined || selectedVariantIndex <= 0) return - let nextId: string | undefined - if (variantIds && variantIds.length > 1) { - nextId = variantIds[selectedVariantIndex - 1] - } else if (displayMode && displayMode !== "flat") { - if (selectedParent) { - nextId = selectedParent?.revisions?.[selectedVariantIndex - 1]?.id - } else { - nextId = variants?.[selectedVariantIndex - 1]?.id - } + return variants?.findIndex((v) => v.id === selectedVariant?.id) + } + return variants?.findIndex((v) => v.id === selectedVariant?.id) + }, [selectedVariant, variants, selectedDrawerVariant, selectedParent, displayMode]) + + const loadPrevVariant = useCallback(() => { + if (selectedVariantIndex === undefined || selectedVariantIndex <= 0) return + if (displayMode && displayMode !== "flat") { + if (selectedDrawerVariant && selectedDrawerVariant._parentVariant) { + setQueryVariant( + JSON.stringify([selectedParent?.revisions?.[selectedVariantIndex - 1]?.id]), + ) } else { - nextId = variants?.[selectedVariantIndex - 1]?.id + setQueryVariant(JSON.stringify([variants?.[selectedVariantIndex - 1]?.id])) } - if (!nextId) return - // Shallow URL update for shareable deep link - updateQuery({revisionId: nextId, drawerType: "variant"}) - }, [selectedVariantIndex, displayMode, selectedParent, variants, updateQuery, variantIds]) - - const loadNextVariant = useCallback(() => { - if (selectedVariantIndex === undefined) return - let nextId: string | undefined - if (variantIds && variantIds.length > 1) { - if (selectedVariantIndex < variantIds.length - 1) { - nextId = variantIds[selectedVariantIndex + 1] - } - } else if (displayMode && displayMode !== "flat") { - if (selectedParent) { - if ( - selectedParent?.revisions && - selectedVariantIndex < (selectedParent.revisions?.length ?? 0) - 1 - ) { - nextId = selectedParent.revisions[selectedVariantIndex + 1]?.id - } - } else if (selectedVariantIndex < (variants?.length ?? 0) - 1) { - nextId = variants[selectedVariantIndex + 1]?.id + } else { + setQueryVariant(JSON.stringify([variants?.[selectedVariantIndex - 1]?.id])) + } + }, [ + selectedVariantIndex, + displayMode, + selectedDrawerVariant, + selectedParent, + variants, + setQueryVariant, + ]) + + const loadNextVariant = useCallback(() => { + if (selectedVariantIndex === undefined) return + if (displayMode && displayMode !== "flat") { + if (selectedDrawerVariant && selectedDrawerVariant._parentVariant) { + if ( + selectedParent?.revisions && + selectedVariantIndex < selectedParent.revisions.length - 1 + ) { + setQueryVariant( + JSON.stringify([selectedParent.revisions[selectedVariantIndex + 1]?.id]), + ) } } else if (selectedVariantIndex < (variants?.length ?? 0) - 1) { - nextId = variants[selectedVariantIndex + 1]?.id + setQueryVariant(JSON.stringify([variants[selectedVariantIndex + 1]?.id])) } - if (!nextId) return - // Shallow URL update for shareable deep link - updateQuery({revisionId: nextId, drawerType: "variant"}) - }, [selectedVariantIndex, displayMode, selectedParent, variants, updateQuery, variantIds]) + } else if (selectedVariantIndex < (variants?.length ?? 0) - 1) { + setQueryVariant(JSON.stringify([variants[selectedVariantIndex + 1]?.id])) + } + }, [ + selectedVariantIndex, + displayMode, + selectedDrawerVariant, + selectedParent, + variants, + setQueryVariant, + ]) - return ( -
    -
    + + +
    - ) - }, -) - -const VariantSummary = memo(({variantId}: {variantId: string}) => { - return -}) - -const TitleActions = memo( - ({ - variantId, - viewAs, - variants, - isLoading, - }: Pick) => { - const appStatus = useAtomValue(currentVariantAppStatusAtom) - const selectedVariant = useAtomValue(variantByRevisionIdAtomFamily(variantId)) as any - const isDirty = useAtomValue(variantIsDirtyAtomFamily(variantId)) - const {goToPlayground} = usePlaygroundNavigation() - const {appURL} = useURL() - const router = useRouter() - - return ( +
    - ) - }, -) - -const VariantDrawerTitle = ({ - onClose, - variantId, - variants, - viewAs, - variantIds, - onToggleWidth, - isExpanded, -}: VariantDrawerTitleProps) => { - const isLoading = useAtomValue(drawerVariantIsLoadingAtomFamily(variantId)) - return ( -
    -
    -
    - -
    ) } diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/types.d.ts b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/types.d.ts index 6ef846a04e..83e6cccf3d 100644 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/types.d.ts +++ b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/assets/types.d.ts @@ -15,39 +15,33 @@ export type ViewType = "prompt" | "parameters" export interface VariantDrawerProps extends DrawerProps { onClose?: (arg: any) => void - variants?: DrawerVariant[] | null - variantIds?: string[] + variants: DrawerVariant[] type: DrawerType revert?: Revert } export interface VariantDrawerTitleProps { - variantId: string + selectedVariant: DrawerVariant onClose: () => void variants: DrawerVariant[] + isDirty: boolean isLoading: boolean - variantIds?: string[] + selectedDrawerVariant?: EnhancedVariant> viewAs: ViewType - onToggleWidth: () => void - isExpanded: boolean } export interface VariantDrawerContentProps { - variantId: string + selectedVariant: DrawerVariant + promptIds: string[] isLoading: boolean + variants: DrawerVariant[] type: DrawerType - viewAs: ViewType onChangeViewAs: (view: ViewType) => void - // Controls whether to display original saved (stable) values - showOriginal?: boolean - onToggleOriginal?: (checked: boolean) => void } export interface DeploymentDrawerTitleProps { - variantId: string + selectedVariant: DrawerVariant onClose: () => void revert?: Revert isLoading: boolean - onToggleWidth: () => void - isExpanded: boolean } diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/index.tsx b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/index.tsx index fc5a442c6f..40b35b42fc 100644 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/index.tsx +++ b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/index.tsx @@ -1,168 +1,141 @@ import {useCallback, useEffect, useMemo, useState} from "react" -import {useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer" -import {useAppState, useQueryParamState} from "@/oss/state/appState" -import {clearVariantQueryParam} from "@/oss/state/url/test" +import usePlayground from "@/oss/components/Playground/hooks/usePlayground" +import {PlaygroundStateData} from "@/oss/components/Playground/hooks/usePlayground/types" +import {useAppId} from "@/oss/hooks/useAppId" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" -import DeploymentDrawerTitle from "./assets/DeploymentDrawerTitle" import type {VariantDrawerProps, ViewType} from "./assets/types" -import VariantDrawerContent from "./assets/VariantDrawerContent" -import VariantDrawerTitle from "./assets/VariantDrawerTitle" -import {variantDrawerAtom, variantDrawerVariantsAtom} from "./store/variantDrawerStore" - -const drawerSelectedVariantIdAtom = selectAtom( - variantDrawerAtom, - (state) => state.selectedVariantId, - (a, b) => a === b, -) - -const EMPTY_VARIANT_IDS = [] - -const VariantDrawer = ({variants: propsVariants, type, revert, ...props}: VariantDrawerProps) => { - const storedVariantId = useAtomValue(drawerSelectedVariantIdAtom) - const defaultVariants = useAtomValue(variantDrawerVariantsAtom) || [] - const variants = propsVariants ?? defaultVariants - const [queryVariant] = useQueryParamState("revisionId") - const appState = useAppState() - const rawQueryVariant = useMemo(() => { - const legacyValue = appState.query?.revisions as any - return queryVariant ?? legacyValue - }, [appState.query?.revisions, queryVariant]) - // Robust parsing: revisions can be a plain id string, a JSON array string, or an array - const urlSelectedVariantId = useMemo(() => { - const value: any = rawQueryVariant as any - if (Array.isArray(value)) { - return value[0] - } - if (typeof value === "string") { - const trimmed = value.trim() - if (!trimmed) return undefined - // Still support legacy JSON array deep links for backwards compatibility - if (trimmed.startsWith("[")) { - try { - const parsed = JSON.parse(trimmed) - if (Array.isArray(parsed)) { - return parsed[0] - } - } catch { - return undefined - } - } - return trimmed - } - return undefined - }, [rawQueryVariant]) +import {findVariantById} from "./utils" - const selectedVariantId = storedVariantId ?? urlSelectedVariantId +const VariantDrawerContent = dynamic(() => import("./assets/VariantDrawerContent"), {ssr: false}) +const VariantDrawerTitle = dynamic(() => import("./assets/VariantDrawerTitle"), {ssr: false}) +const DeploymentDrawerTitle = dynamic(() => import("./assets/DeploymentDrawerTitle"), {ssr: false}) - const [viewAs, setViewAs] = useState("prompt") - const [showOriginal, setShowOriginal] = useState(false) +const VariantDrawer = ({variants, type, revert, ...props}: VariantDrawerProps) => { + const appId = useAppId() + const [queryVariant, setQueryVariant] = useQueryParam("revisions") + const router = useRouter() + const {environments} = useEnvironments({appId}) - const routerRevisions = useMemo(() => { - // Skip URL processing on playground route to avoid conflicts - const isPlaygroundRoute = appState.pathname.includes("/playground") - if (isPlaygroundRoute || !rawQueryVariant) return [] - - const raw: any = rawQueryVariant as any - if (Array.isArray(raw)) return raw - - if (typeof raw === "string") { - const val = raw.trim() - if (!val) return [] - if (val.startsWith("[")) { - try { - const parsed = JSON.parse(val) - return Array.isArray(parsed) ? (parsed as string[]) : EMPTY_VARIANT_IDS - } catch { - return EMPTY_VARIANT_IDS - } - } - if (val.includes(",")) { - return val - .split(",") - .map((s) => s.trim()) - .filter(Boolean) - } - return [val] - } + const [viewAs, setViewAs] = useState("prompt") - return EMPTY_VARIANT_IDS - }, [appState.pathname, rawQueryVariant]) + const selectedDrawerVariant = useMemo(() => { + if (!queryVariant) return undefined - const {width: incomingWidth, ...restProps} = props - const initialWidth = incomingWidth ?? 1100 - const [drawerWidth, setDrawerWidth] = useState(initialWidth) + const targetId = JSON.parse(queryVariant)[0] as string + return findVariantById(variants ?? [], targetId) + }, [queryVariant, variants]) const onClose = useCallback(() => { props.onClose?.({} as any) - }, [props.onClose]) - - const handleAfterOpenChange = useCallback( - (nextOpen: boolean) => { - if (!nextOpen) { - clearVariantQueryParam() - } - props.afterOpenChange?.(nextOpen) - }, - [props.afterOpenChange], - ) + setQueryVariant("") + setViewAs("prompt") + }, []) const onChangeViewAs = useCallback((view: ViewType) => { setViewAs(view) }, []) - // Ensure we do not carry over "Original" state when switching to a clean revision + const routerRevisions = useMemo(() => { + if (!router.query.revisions) return [] + + try { + if (typeof router.query.revisions === "string") { + const listOfRevisions = JSON.parse(router.query.revisions) + + if (selectedDrawerVariant && !selectedDrawerVariant._parentVariant) { + return [ + variants?.find((v) => listOfRevisions.includes(v.id))?.revisions?.[0] + ?._revisionId, + ] + } else { + return listOfRevisions + } + } + } catch (e) { + console.error("Error parsing revisions from URL", e) + } + + return [] + }, [router.query.revisions, variants]) + + const { + isFetching: isLoading, + selected, + setDisplayedVariants, + promptIds, + isDirty, + selectedVariant, + } = usePlayground({ + stateSelector: useCallback( + (state: PlaygroundStateData) => { + const revision = state.variants.find((v) => state.selected?.includes(v._revisionId)) + + return { + selected: state.selected, + selectedVariant: revision, + isFetching: state.fetching, + isDirty: state.dirtyStates?.[revision?._revisionId as string], + promptIds: revision?.prompts?.map((p: any) => p.__id) || [], + } + }, + [routerRevisions, props.open, environments, variants], + ), + }) + + // Effect to mount revisions from URL when the component loads useEffect(() => { - setShowOriginal(false) - }, [selectedVariantId]) + if ((isLoading ?? false) || routerRevisions?.length === 0) return - const toggleWidth = useCallback(() => { - setDrawerWidth((width) => (width === initialWidth ? 1920 : initialWidth)) - }, [initialWidth]) + setDisplayedVariants?.(routerRevisions) + }, [routerRevisions, isLoading, selected]) return ( - - ) : ( - - ) - } - > - - + <> + + ) : ( + + ) + } + > + + + ) } diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/state/store.ts b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/state/store.ts deleted file mode 100644 index 862b259f2a..0000000000 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/state/store.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {Atom, atom} from "jotai" - -import {revisionListAtom} from "@/oss/state/variant/selectors/variant" - -// The shape of the drawer state -export interface VariantDrawerState { - open: boolean - id?: string - variantsSource: Atom | null -} - -// Main atom for the drawer state -export const variantDrawerAtom = atom({ - open: false, - id: undefined, - variantsSource: revisionListAtom, -}) - -// Optional: selectors and reset atom (if you want) -export const isVariantDrawerOpenAtom = atom((get) => get(variantDrawerAtom).open) -export const resetVariantDrawerAtom = atom(null, (get, set) => - set(variantDrawerAtom, {open: false, variantsSource: revisionListAtom}), -) -export const openVariantDrawerAtom = atom(null, (get, set) => - set(variantDrawerAtom, {open: true, variantsSource: revisionListAtom}), -) -export const openVariantDrawerWithIdAtom = atom(null, (get, set) => - set(variantDrawerAtom, {open: true, variantsSource: revisionListAtom, id: ""}), -) diff --git a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/store/variantDrawerStore.ts b/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/store/variantDrawerStore.ts deleted file mode 100644 index 2e09f3313f..0000000000 --- a/web/oss/src/components/VariantsComponents/Drawers/VariantDrawer/store/variantDrawerStore.ts +++ /dev/null @@ -1,98 +0,0 @@ -import {atom} from "jotai" -import {Atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -import {revisionListAtom} from "@/oss/components/Playground/state/atoms" -import {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {AgentaConfigPrompt} from "@/oss/lib/shared/variant/transformer/types" - -type DrawerVariant = EnhancedVariant> -type DrawerType = "variant" | "deployment" - -interface Revert { - isDisabled?: boolean - onClick: () => void - isLoading: boolean -} - -interface VariantDrawerState { - open: boolean - type: DrawerType - variantsAtom?: Atom - revert?: Revert - selectedVariantId?: string -} - -// Main drawer state atom -export const variantDrawerAtom = atomWithImmer({ - open: false, - type: "variant", - variantsAtom: undefined, - revert: undefined, - selectedVariantId: undefined, -}) - -// Action to open the drawer -export const openVariantDrawerAtom = atom( - null, - ( - get, - set, - params: { - type: DrawerType - variantsAtom?: Atom - revert?: Revert - selectedVariantId?: string - }, - ) => { - set(variantDrawerAtom, (draft) => { - draft.open = true - draft.type = params.type - draft.variantsAtom = params.variantsAtom - draft.revert = params.revert - draft.selectedVariantId = params.selectedVariantId - }) - }, -) - -// Action to close the drawer -export const closeVariantDrawerAtom = atom(null, (get, set) => { - // Only toggle open flag off; keep the rest to avoid re-open race - set(variantDrawerAtom, (draft) => { - draft.open = false - }) -}) - -// Action to fully clear drawer state (used on unmount) -export const clearVariantDrawerAtom = atom(null, (_get, set) => { - set(variantDrawerAtom, (draft) => { - draft.open = false - draft.type = "variant" - draft.variantsAtom = undefined - draft.revert = undefined - draft.selectedVariantId = undefined - }) -}) - -// Action to update only the selected revision inside the open drawer -export const setVariantDrawerSelectedIdAtom = atom(null, (_get, set, newId: string | undefined) => { - set(variantDrawerAtom, (draft) => { - draft.selectedVariantId = newId - }) -}) - -// Computed atom to get the variants list (either from custom atom or default) -export const variantDrawerVariantsAtom = atom((get) => { - const drawerState = get(variantDrawerAtom) - if (drawerState.variantsAtom) { - return get(drawerState.variantsAtom) - } - return get(revisionListAtom) -}) - -// Id of the revision to display in the drawer (single-source for Drawer selection) -export const drawerVariantIdAtom = atom(null) - -// One-time guard to initialize drawer state from URL only on initial load -export const drawerInitializedFromUrlAtom = atom(false) diff --git a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/Content.tsx b/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/Content.tsx deleted file mode 100644 index 62f8f837c6..0000000000 --- a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/Content.tsx +++ /dev/null @@ -1,221 +0,0 @@ -import {useMemo, useState} from "react" - -import {Dropdown, Typography} from "antd" -import {useAtomValue} from "jotai" - -import DiffView from "@/oss/components/Editor/DiffView" -import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" -import VariantNameCell from "@/oss/components/VariantNameCell" -import {Variant} from "@/oss/lib/Types" -import {variantUserProfileAtomFamily} from "@/oss/state/variant/selectors/variant" - -import { - comparisonModalAllVariantsAtom, - comparisonModalCompareListAtom, -} from "./store/comparisonModalStore" - -const {Title, Text} = Typography - -// All required data is sourced from atoms; no props needed - -const formatTimestamp = (timestamp: number) => new Date(timestamp * 1000).toLocaleString() - -const ModifiedByText = ({variant}: {variant: Variant}) => { - const {userProfile, modifiedById} = useAtomValue(variantUserProfileAtomFamily(variant.id)) - const displayName = - (userProfile as any)?.displayName ?? - (userProfile as any)?.name ?? - modifiedById ?? - (variant as any).modifiedBy ?? - (variant as any).createdBy ?? - "-" - return {displayName} -} - -const VariantComparisonContent = () => { - // Fetch lists from atoms - const compareList = useAtomValue(comparisonModalCompareListAtom) || [] - const allVariants = useAtomValue(comparisonModalAllVariantsAtom) || [] - - // Prefer explicit allVariants when provided, else fall back to compare list - const availableVariants: Variant[] = useMemo( - () => (allVariants.length ? (allVariants as Variant[]) : (compareList as Variant[])), - [allVariants, compareList], - ) - - // Defaults prefer the explicitly compared pair when present - const [originalVariantId, setOriginalVariantId] = useState( - (compareList[0]?.id as string | undefined) ?? availableVariants[0]?.id, - ) - const [modifiedVariantId, setModifiedVariantId] = useState( - (compareList[1]?.id as string | undefined) ?? availableVariants[1]?.id, - ) - const originalVariant = - availableVariants.find((v: Variant) => v.id === originalVariantId) || availableVariants[0] - const modifiedVariant = - availableVariants.find((v: Variant) => v.id === modifiedVariantId) || - availableVariants[1] || - availableVariants[0] - - // Memoize stringified parameters based on variant identity (id) to avoid - // re-triggering Editor effects due to changing object references - const originalText = useMemo( - () => JSON.stringify(originalVariant?.parameters ?? {}), - [originalVariant?.id], - ) - const modifiedText = useMemo( - () => JSON.stringify(modifiedVariant?.parameters ?? {}), - [modifiedVariant?.id], - ) - - // Safety: require at least one variant to render - if (!originalVariant) return null - - const createDropdownItems = (currentVariantId: string, onSelect: (id: string) => void) => { - return availableVariants.map((variant: Variant) => ({ - key: variant.id, - label: ( -
    - - - {formatTimestamp(variant.createdAtTimestamp)} - -
    - ), - onClick: () => onSelect(variant.id), - disabled: variant.id === currentVariantId, - })) - } - - const originalDropdownItems = createDropdownItems( - originalVariantId || originalVariant.id, - setOriginalVariantId, - ) - const modifiedDropdownItems = createDropdownItems( - modifiedVariantId || modifiedVariant.id, - setModifiedVariantId, - ) - - return ( -
    - {/* Left sidebar with variant information */} -
    - - Variant Comparison - - -
    -
    -
    -
    - - Original Version - -
    -
    -
    -
    - {availableVariants.length > 2 ? ( - -
    - -
    -
    - ) : ( - - )} -
    -
    -
    - Modified by:{" "} - -
    -
    - Created:{" "} - - {formatTimestamp(originalVariant.createdAtTimestamp)} - -
    -
    -
    -
    -
    - -
    -
    -
    - - Modified Version - -
    -
    -
    -
    - {availableVariants.length > 2 ? ( - -
    - -
    -
    - ) : ( - - )} -
    -
    -
    - Modified by:{" "} - -
    -
    - Created:{" "} - - {formatTimestamp(modifiedVariant.createdAtTimestamp)} - -
    -
    -
    -
    -
    -
    -
    - - {/* Right side with diff view */} -
    - -
    -
    - ) -} - -export default VariantComparisonContent diff --git a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/VariantComparisonModalWrapper.tsx b/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/VariantComparisonModalWrapper.tsx deleted file mode 100644 index 9460c3f123..0000000000 --- a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/VariantComparisonModalWrapper.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" -import {selectAtom} from "jotai/utils" - -import {comparisonModalAtom, closeComparisonModalAtom} from "./store/comparisonModalStore" - -import VariantComparisonModal from "./index" - -// Create selector atom once at module scope to keep it stable across renders -const comparisonModalOpenAtom = selectAtom(comparisonModalAtom, (s) => s.open) - -const VariantComparisonModalWrapper = () => { - const open = useAtomValue(comparisonModalOpenAtom) - const close = useSetAtom(closeComparisonModalAtom) - - return close()} /> -} - -export default VariantComparisonModalWrapper diff --git a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/index.tsx b/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/index.tsx index e581b7fd73..89b89f7044 100644 --- a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/index.tsx +++ b/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/index.tsx @@ -1,22 +1,22 @@ -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" +import {DiffEditor} from "@monaco-editor/react" +import {Modal} from "antd" -import VariantComparisonContent from "./Content" +import {Variant} from "@/oss/lib/Types" -type VariantComparisonModalProps = Omit, "children"> +type VariantComparisonModalProps = { + compareVariantList: Variant[] +} & React.ComponentProps -const VariantComparisonModal = ({...props}: VariantComparisonModalProps) => { +const VariantComparisonModal = ({compareVariantList, ...props}: VariantComparisonModalProps) => { return ( - - - + + + ) } diff --git a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/store/comparisonModalStore.ts b/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/store/comparisonModalStore.ts deleted file mode 100644 index f8aed18b4f..0000000000 --- a/web/oss/src/components/VariantsComponents/Modals/VariantComparisonModal/store/comparisonModalStore.ts +++ /dev/null @@ -1,82 +0,0 @@ -import {atom, Atom} from "jotai" - -import {revisionListAtom} from "@/oss/components/Playground/state/atoms" -import {Variant} from "@/oss/lib/Types" -import {selectedVariantsAtom} from "@/oss/state/variant/atoms/selection" - -// Global state for Variant Comparison Modal -export type VariantAtom = Atom - -interface ComparisonModalState { - open: boolean - compareListAtom?: VariantAtom - allVariantsAtom?: VariantAtom -} - -export const comparisonModalAtom = atom({ - open: false, - compareListAtom: undefined, - allVariantsAtom: undefined, -}) - -// Optional default selection scope used when no explicit compare list is provided -export const comparisonSelectionScopeAtom = atom(undefined) - -export const openComparisonModalAtom = atom( - null, - ( - get, - set, - params?: - | { - compareListAtom: VariantAtom - allVariantsAtom?: VariantAtom - } - | { - compareList: Variant[] - allVariants?: Variant[] - }, - ) => { - let compareListAtom: VariantAtom | undefined - let allVariantsAtom: VariantAtom | undefined - - if (params) { - if ("compareListAtom" in params) { - compareListAtom = params.compareListAtom - allVariantsAtom = params.allVariantsAtom - } else { - compareListAtom = atom(params.compareList || []) - allVariantsAtom = params.allVariants ? atom(params.allVariants) : undefined - } - } - - set(comparisonModalAtom, { - open: true, - compareListAtom, - allVariantsAtom, - }) - }, -) - -export const closeComparisonModalAtom = atom(null, (get, set) => { - set(comparisonModalAtom, { - open: false, - compareListAtom: undefined, - allVariantsAtom: undefined, - }) -}) - -export const comparisonModalCompareListAtom = atom((get) => { - const state = get(comparisonModalAtom) - if (state.compareListAtom) return get(state.compareListAtom) - const scope = get(comparisonSelectionScopeAtom) - if (scope) return get(selectedVariantsAtom(scope)) - // default to revisions list - return get(revisionListAtom) -}) - -export const comparisonModalAllVariantsAtom = atom((get) => { - const state = get(comparisonModalAtom) - if (state.allVariantsAtom) return get(state.allVariantsAtom) - return get(revisionListAtom) -}) diff --git a/web/oss/src/components/VariantsComponents/Table/assets/getVariantColumns.tsx b/web/oss/src/components/VariantsComponents/Table/assets/getVariantColumns.tsx index 424df14638..0f58ec8ac8 100644 --- a/web/oss/src/components/VariantsComponents/Table/assets/getVariantColumns.tsx +++ b/web/oss/src/components/VariantsComponents/Table/assets/getVariantColumns.tsx @@ -1,132 +1,30 @@ -import {memo, useCallback} from "react" - import {GearSix} from "@phosphor-icons/react" +import {Tag} from "antd" import {ColumnsType} from "antd/es/table" -import {getDefaultStore, useSetAtom} from "jotai" import dynamic from "next/dynamic" -import {openDeleteVariantModalAtom} from "@/oss/components/Playground/Components/Modals/DeleteVariantModal/store/deleteVariantModalStore" -import {openDeployVariantModalAtom} from "@/oss/components/Playground/Components/Modals/DeployVariantModal/store/deployVariantModalStore" +import Avatar from "@/oss/components/Avatar/Avatar" import TruncatedTooltipTag from "@/oss/components/TruncatedTooltipTag" -import UserAvatarTag from "@/oss/components/ui/UserAvatarTag" -import VariantNameCell from "@/oss/components/VariantNameCell" -import {isDemo} from "@/oss/lib/helpers/utils" +import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" +import {filterVariantParameters, isDemo} from "@/oss/lib/helpers/utils" import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {modelNameByRevisionIdAtomFamily} from "@/oss/state/variant/selectors/variant" const VariantDropdown = dynamic(() => import("../../Dropdown/VariantDropdown"), {ssr: false}) -const store = getDefaultStore() - -const CreatedByCell = memo(({record}: {record: EnhancedVariant}) => { - const fallbackName = - [ - (record as any)?.modifiedByDisplayName, - (record as any)?.modifiedBy, - (record as any)?.modifiedById, - (record as any)?.createdByDisplayName, - (record as any)?.createdBy, - (record as any)?.createdById, - ].find((value) => typeof value === "string" && value.trim().length > 0) ?? undefined - - return ( - - ) -}) - -const CreatedOnCell = memo(({record}: {record: EnhancedVariant}) => { - return
    {record.createdAt}
    -}) - -const ModelCell = memo(({record}: {record: EnhancedVariant}) => { - const modelFromStore = store.get(modelNameByRevisionIdAtomFamily(record.id)) - const inlineConfig = (record.parameters as any)?.prompt?.llm_config || record.parameters || {} - const inlineModel = - (record.modelName as string | undefined) || - (inlineConfig && typeof inlineConfig === "object" - ? (inlineConfig as any)?.model - : undefined) - - const name = [modelFromStore, inlineModel].find( - (value) => typeof value === "string" && value.trim().length > 0 && value !== "-", - ) - - return
    {name || "-"}
    -}) - -const CommitNotesCell = memo(({record}: {record: EnhancedVariant}) => { - const msg = record.commitMessage - return msg ? ( -
    e.stopPropagation()}> - -
    - ) : null -}) - -const ActionCell = memo( - ({ - record, - handleOpenDetails, - handleOpenInPlayground, - }: { - record: EnhancedVariant - handleOpenDetails?: (record: EnhancedVariant) => void - handleOpenInPlayground?: (record: EnhancedVariant) => void - }) => { - const openDeleteVariantModal = useSetAtom(openDeleteVariantModalAtom) - const openDeployVariantModal = useSetAtom(openDeployVariantModalAtom) - - const onDeploy = useCallback( - (r: EnhancedVariant) => { - // In this overview table, each row represents a revision. Always pass revisionId. - const payload = { - parentVariantId: null, - revisionId: (r as any)._revisionId ?? (r as any)._id ?? (r as any).id, - variantName: (r as any).variantName, - revision: (r as any).revision ?? (r as any).revisionNumber, - } - console.debug("[VariantsTable] deploy:open", {record: r, payload}) - openDeployVariantModal(payload) - }, - [openDeployVariantModal], - ) - - const onDelete = useCallback( - (r: EnhancedVariant) => { - // Open the global DeleteVariant modal immediately; it will perform its own pre-check - openDeleteVariantModal(r.id) - }, - [openDeleteVariantModal], - ) - - return ( - - ) - }, -) - export const getColumns = ({ handleOpenDetails, handleOpenInPlayground, + handleDeploy, + handleDeleteVariant, showEnvBadges, showActionsDropdown, - showStableName = false, }: { showEnvBadges: boolean handleOpenDetails?: (record: EnhancedVariant) => void handleOpenInPlayground?: (record: EnhancedVariant) => void + handleDeploy?: (record: EnhancedVariant) => void + handleDeleteVariant?: (record: EnhancedVariant) => void showActionsDropdown: boolean - showStableName?: boolean }): ColumnsType => { const columns: ColumnsType = [ { @@ -138,17 +36,16 @@ export const getColumns = ({ onHeaderCell: () => ({ style: {minWidth: 280}, }), - render: (_, record) => ( - - ), + render: (_, record) => { + return ( + + ) + }, }, { title: "Model", @@ -158,16 +55,28 @@ export const getColumns = ({ onHeaderCell: () => ({ style: {minWidth: 200}, }), - render: (_, record) => , + render: (_, record) => { + const parameters = + (record.parameters?.prompt as Record)?.llm_config || + record.parameters + return parameters && Object.keys(parameters).length + ? Object.values( + filterVariantParameters({record: parameters, key: "model"}), + ).map((value, index) => (value ?
    {value}
    : "-")) + : "-" + }, }, { title: "Created on", dataIndex: "createdAt", key: "createdAt", + width: 120, onHeaderCell: () => ({ style: {minWidth: 120}, }), - render: (_, record) => , + render: (_, record) => { + return
    {record.createdAt}
    + }, }, ] @@ -176,11 +85,26 @@ export const getColumns = ({ title: "Created by", dataIndex: "modifiedBy", key: "modifiedBy", + width: 160, onHeaderCell: () => ({ style: {minWidth: 160}, }), render: (_, record) => { - return + if (record._parentVariant) { + return ( + + {" "} + {record?.modifiedBy} + + ) + } else { + return ( + + {" "} + {record?.createdBy} + + ) + } }, }) } @@ -189,12 +113,18 @@ export const getColumns = ({ title: "Commit notes", dataIndex: "createdAt", key: "createdAt", - width: 180, + width: 560, onHeaderCell: () => ({ - style: {minWidth: 180, maxWidth: 560}, + style: {minWidth: 560}, }), className: "overflow-hidden text-ellipsis whitespace-nowrap max-w-[560px]", - render: (_, record) => , + render: (_, record) => { + return record.commitMessage ? ( +
    e.stopPropagation()}> + +
    + ) : null + }, }) if (showActionsDropdown) { @@ -204,13 +134,17 @@ export const getColumns = ({ width: 56, fixed: "right", align: "center", - render: (_, record) => ( - - ), + render: (_, record) => { + return ( + + ) + }, }) } diff --git a/web/oss/src/components/VariantsComponents/Table/index.tsx b/web/oss/src/components/VariantsComponents/Table/index.tsx index f46242dd3e..05a03b96a2 100644 --- a/web/oss/src/components/VariantsComponents/Table/index.tsx +++ b/web/oss/src/components/VariantsComponents/Table/index.tsx @@ -2,11 +2,8 @@ import {type ComponentProps, useMemo, useState} from "react" import {Spin, Table, TableColumnType} from "antd" import {TableRowSelection} from "antd/es/table/interface" -import {atom, useAtom} from "jotai" -import useURL from "@/oss/hooks/useURL" import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {variantTableSelectionAtomFamily} from "@/oss/state/variant/atoms/selection" import ResizableTitle from "../../ResizableTitle" @@ -20,11 +17,11 @@ type VariantsTableProps = { variants: EnhancedVariant[] handleOpenDetails?: (record: EnhancedVariant) => void handleOpenInPlayground?: (record: EnhancedVariant) => void + handleDeploy?: (record: EnhancedVariant) => void + handleDeleteVariant?: (record: EnhancedVariant) => void showActionsDropdown?: boolean enableColumnResize?: boolean showRevisionsAsChildren?: boolean - selectionScope?: string - showStableName?: boolean } & ComponentProps const VariantsTable = ({ @@ -33,34 +30,26 @@ const VariantsTable = ({ variants, handleOpenDetails, handleOpenInPlayground, + handleDeploy, + handleDeleteVariant, showEnvBadges = false, rowSelection, showActionsDropdown = true, enableColumnResize = false, showRevisionsAsChildren = false, - selectionScope, - showStableName = false, ...props }: VariantsTableProps) => { - const {appURL} = useURL() const initialColumns = useMemo( () => getColumns({ showEnvBadges, handleOpenDetails, handleOpenInPlayground, + handleDeploy, + handleDeleteVariant, showActionsDropdown, - showStableName, - appURL, }), - [ - handleOpenDetails, - handleOpenInPlayground, - showEnvBadges, - showActionsDropdown, - showStableName, - appURL, - ], + [handleOpenDetails, handleOpenInPlayground, handleDeploy, handleDeleteVariant], ) const [columns, setColumns] = useState(initialColumns) @@ -87,39 +76,52 @@ const VariantsTable = ({ })) }, [columns]) - // Always call hooks in a stable order; create a stable atom depending on selectionScope - const selectionAtom = useMemo( - () => - selectionScope - ? variantTableSelectionAtomFamily(selectionScope) - : atom([]), - [selectionScope], - ) - const [scopedSelectedKeys, setScopedSelectedKeys] = useAtom(selectionAtom) + const _variants = useMemo(() => { + if (!showRevisionsAsChildren) return variants + + // Group variants by their parent variant ID + const variantGroups = variants.reduce>((acc, variant) => { + const parentId = variant._parentVariant?.id + if (!parentId) return acc + + if (!acc[parentId]) { + acc[parentId] = [] + } + acc[parentId].push(variant) + return acc + }, {}) + + // Process each group + const result = [] + for (const [parentId, group] of Object.entries(variantGroups)) { + const revision = group[0] + if (group.length > 1 && revision._parentVariant.revision > 1) { + const parentVariant = revision._parentVariant + result.push({ + ...parentVariant, + children: group, + }) + } else { + result.push(revision) + } + } + + return result + }, [variants, showRevisionsAsChildren]) return (
    setScopedSelectedKeys(keys as React.Key[]), - } - : { - type: "checkbox", - columnWidth: 48, - checkStrictly: false, - ...rowSelection, - } - } + rowSelection={{ + type: "checkbox", + columnWidth: 48, + checkStrictly: false, + ...rowSelection, + }} className="ph-no-capture" - rowKey={(props as any)?.rowKey || "id"} + rowKey={"id"} columns={(enableColumnResize ? mergedColumns : initialColumns) as any} - dataSource={variants as EnhancedVariant[]} + dataSource={_variants as EnhancedVariant[]} scroll={{x: "max-content"}} bordered components={{ diff --git a/web/oss/src/components/VariantsComponents/index.tsx b/web/oss/src/components/VariantsComponents/index.tsx index a23d1dde5e..bf1d74c82f 100644 --- a/web/oss/src/components/VariantsComponents/index.tsx +++ b/web/oss/src/components/VariantsComponents/index.tsx @@ -1,141 +1,230 @@ // @ts-nocheck -import {useCallback, useMemo, useState} from "react" +import {useCallback, useMemo, useState, type Key} from "react" import {SwapOutlined} from "@ant-design/icons" import {Rocket} from "@phosphor-icons/react" -import {Button, Input, Radio, Space, Typography} from "antd" -import {getDefaultStore, useAtomValue, useSetAtom} from "jotai" +import {Button, Input, message, Radio, Space, Typography} from "antd" +import dynamic from "next/dynamic" import {useRouter} from "next/router" +import {useSWRConfig} from "swr" +import {useAppsData} from "@/oss/contexts/app.context" import {useAppId} from "@/oss/hooks/useAppId" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" import {useQueryParam} from "@/oss/hooks/useQuery" -import useURL from "@/oss/hooks/useURL" -import {formatDate24} from "@/oss/lib/helpers/dateTimeHelper" -import {variantsPendingAtom} from "@/oss/state/loadingSelectors" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {useQueryParamState} from "@/oss/state/appState" -import {selectedVariantsCountAtom} from "@/oss/state/variant/atoms/selection" -import { - modelNameByRevisionIdAtomFamily, - revisionListAtom, - variantDisplayNameByIdAtomFamily, -} from "@/oss/state/variant/selectors/variant" +import {checkIfResourceValidForDeletion} from "@/oss/lib/helpers/evaluate" +import {groupVariantsByParent, variantNameWithRev} from "@/oss/lib/helpers/variantHelper" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" +import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" +import {deleteSingleVariant, deleteSingleVariantRevision} from "@/oss/services/playground/api" + +import {getPlaygroundKey} from "../Playground/hooks/usePlayground/assets/helpers" import {useStyles} from "./assets/styles" -import { - openComparisonModalAtom, - comparisonSelectionScopeAtom, -} from "./Modals/VariantComparisonModal/store/comparisonModalStore" import VariantsTable from "./Table" -// Comparison modal is opened via atoms; no local deploy/delete modals here +const DeleteEvaluationModal = dynamic( + () => import("@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal"), + {ssr: false}, +) +const VariantDrawer = dynamic(() => import("./Drawers/VariantDrawer"), {ssr: false}) +const VariantComparisonModal = dynamic(() => import("./Modals/VariantComparisonModal"), { + ssr: false, +}) +const DeployVariantModal = dynamic( + () => import("@/oss/components/Playground/Components/Modals/DeployVariantModal"), + {ssr: false}, +) const VariantsDashboard = () => { const appId = useAppId() - const router = useRouter() const classes = useStyles() - const [, setQueryVariant] = useQueryParamState("revisionId") - const [displayMode, setDisplayMode] = useQueryParam("displayMode", "flat") const [searchTerm, setSearchTerm] = useState("") - const {baseAppURL} = useURL() - // Data: use all revisions list and map once to table rows (no slicing) - const revisions = useAtomValue(revisionListAtom) - const isVariantLoading = useAtomValue(variantsPendingAtom) - const baseRows = useMemo(() => { - const store = getDefaultStore() - return (revisions || []).map((r: any) => { - const ts = r.updatedAtTimestamp ?? r.createdAtTimestamp - const modelName = store.get(modelNameByRevisionIdAtomFamily(r.id)) - const variantName = store.get(variantDisplayNameByIdAtomFamily(r.variantId)) + const router = useRouter() + const {currentApp} = useAppsData() + const {data, mutate: fetchAllVariants, isLoading} = useVariants(currentApp)({appId}) + + const groupedVariants = useMemo(() => groupVariantsByParent(data?.variants), [data?.variants]) + + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + + const [queryVariant, setQueryVariant] = useQueryParam("revisions") + + const [selectedVariant, setSelectedVariant] = useState() + const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) + const [isDeployVariantModalOpen, setIsDeployVariantModalOpen] = useState(false) + const [isComparisonModalOpen, setIsComparisonModalOpen] = useState(false) + + const {environments: _environments, mutate: loadEnvironments} = useEnvironments({appId}) + + const environments = useMemo(() => { + return _environments.map((env) => { + const deployedAppRevisionId = env.deployed_app_variant_revision_id + const revision = (data?.variants || []).find( + (variant) => variant.id === deployedAppRevisionId, + ) return { - id: r.id, - variantId: r.variantId, - variantName, - commitMessage: r.commitMessage ?? r.commit_message ?? null, - createdAt: formatDate24(ts), - createdAtTimestamp: ts, - modifiedBy: r.modifiedBy ?? r.modified_by ?? r.createdBy ?? r.created_by, - modelName, - _revisionId: r.id, + ...env, + revision: { + ...revision, + revisionNumber: revision?.revision || revision?.revisionNumber || 0, + }, } }) - }, [revisions]) - - const filteredRows = useMemo(() => { - if (!searchTerm) return baseRows - const q = searchTerm.toLowerCase() - return baseRows.filter((r: any) => (r.variantName || "").toLowerCase().includes(q)) - }, [baseRows, searchTerm]) - - const tableRows = useMemo(() => { - if (displayMode !== "grouped") return filteredRows - // Group revisions by variantId; parent row uses latest revision id - const byVariant: Record = {} - filteredRows.forEach((r: any) => { - ;(byVariant[r.variantId] ||= []).push(r) - }) - const groups: any[] = [] - Object.values(byVariant).forEach((arr) => { - const sorted = [...arr].sort( - (a, b) => (b.createdAtTimestamp || 0) - (a.createdAtTimestamp || 0), - ) - const latest = sorted[0] - const children = sorted.slice(1) - groups.push({ - ...latest, - _parentVariant: true, - children, - }) - }) - return groups - }, [filteredRows, displayMode]) - - // Selection/compare using global atoms with a stable scope - const selectionScope = "variants/dashboard" - const selectedCount = useAtomValue(selectedVariantsCountAtom(selectionScope)) - const openComparisonModal = useSetAtom(openComparisonModalAtom) - const setComparisonSelectionScope = useSetAtom(comparisonSelectionScopeAtom) - const {goToPlayground} = usePlaygroundNavigation() - const prefetchPlayground = useCallback(async () => { - if (appId) { - router.prefetch(`${baseAppURL}/${appId}/playground`).catch(() => {}) + }, [data?.variants, _environments]) + + const {mutate} = useSWRConfig() + + const [displayMode, setDisplayMode] = useQueryParam("displayMode", "flat") + + const filteredVariants = useMemo(() => { + const variantsToFilter = displayMode === "grouped" ? groupedVariants : data?.variants + if (displayMode === "grouped") { + for (const variant of variantsToFilter) { + const deployedIn = variant.children.flatMap((revision) => revision.deployedIn) + const isLatest = variant.children.some((revision) => revision.isLatestRevision) + variant.deployedIn = deployedIn + variant.isLatestRevision = isLatest + } } - }, [appId, baseAppURL, router]) + if (!searchTerm || !variantsToFilter) return variantsToFilter + return variantsToFilter.filter((item: EnhancedVariant) => + item.variantName.toLowerCase().includes(searchTerm.toLowerCase()), + ) + }, [searchTerm, groupedVariants, data?.variants, displayMode]) - const handleNavigation = useCallback( - async (record?: any) => { - // Try to prefetch chunks before navigating for a seamless transition - prefetchPlayground() - // Prewarm prompts for the selected revision specifically - const store = getDefaultStore() - const revId = record?._revisionId ?? record?.id - if (revId) { - store.get(promptsAtomFamily(revId)) + const flattenAndFilterVariants = (variants: EnhancedVariant[], selectedIds: Key[]) => { + const result = [] + + const traverse = (variant: EnhancedVariant & {children: any}) => { + if (selectedIds.includes(variant.id)) { + result.push(variant) + } + if (variant.children && variant.children.length > 0) { + variant.children.forEach(traverse) } - if (revId) { - goToPlayground(revId) + } + + variants.forEach(traverse) + return result + } + + const selectedVariantsToCompare = useMemo(() => { + const variants = flattenAndFilterVariants(filteredVariants || [], selectedRowKeys).filter( + (variant) => !variant.children, + ) + + return { + isCompareDisabled: variants.length !== 2, + compareVariantList: variants, + } + }, [selectedRowKeys, filteredVariants]) + + const handleNavigation = useCallback( + (revision?: EnhancedVariant) => { + const revisions = flattenAndFilterVariants( + filteredVariants || [], + selectedRowKeys, + ).filter((variant) => !variant.children) + + if (revisions && revisions.length) { + router.push({ + pathname: `/apps/${appId}/playground`, + query: { + revisions: JSON.stringify(revisions.map((v) => v.id)), + }, + }) } else { - goToPlayground() + router.push({ + pathname: `/apps/${appId}/playground`, + query: revision + ? { + revisions: JSON.stringify([revision.id]), + } + : {}, + }) } }, - [goToPlayground, prefetchPlayground], + [appId, router, filteredVariants, selectedRowKeys], ) - const handleOpenDetails = useCallback( - (record: any) => { - const revId = record._revisionId ?? record.id - if (!revId) return - // Shallow URL patch lets the route listener atom open the drawer - setQueryVariant(revId, {shallow: true}) + const handleDeleteVariant = useCallback( + async (selectedVariant: EnhancedVariant) => { + try { + if ( + !(await checkIfResourceValidForDeletion({ + resourceType: "variant", + resourceIds: [selectedVariant.variantId], + })) + ) + return + + if (selectedVariant?._parentVariant) { + await deleteSingleVariantRevision(selectedVariant.variantId, selectedVariant.id) + message.success("Revision removed successfully!") + } else { + await deleteSingleVariant(selectedVariant.variantId) + message.success("Variant removed successfully!") + } + fetchAllVariants((state) => { + if (!state) return state + + const clonedState = structuredClone(state) + + if (selectedVariant._parentVariant) { + // Handle revision deletion + clonedState.variants = [ + ...clonedState.variants.filter( + (variant) => variant.id !== selectedVariant.id, + ), + ] + } else if (!selectedVariant._parentVariant && selectedVariant.children) { + // Handle variant deletion + clonedState.variants = [ + ...clonedState.variants.filter( + (variant) => + variant._parentVariant.id !== selectedVariant.variantId, + ), + ] + } + + return clonedState + }) + } catch (error) { + console.error(error) + } + + await mutate(getPlaygroundKey(), (playgroundState) => { + if (!playgroundState) return playgroundState + if (playgroundState.selected.includes(selectedVariant.variantId)) { + playgroundState.selected.splice( + playgroundState.selected.indexOf(selectedVariant.variantId), + 1, + ) + } + + playgroundState.variants = playgroundState.variants.filter( + (variant) => (variant.variantId || variant.id) !== selectedVariant.variantId, + ) + + return playgroundState + }) + + setIsDeleteEvalModalOpen(false) }, - [setQueryVariant], + [fetchAllVariants], ) + const handleDeployment = useCallback(() => { + mutate(getPlaygroundKey()) + loadEnvironments() + fetchAllVariants() + }, [loadEnvironments, fetchAllVariants]) + return ( <>
    - Variants + Variants
    @@ -158,27 +247,23 @@ const VariantsDashboard = () => {
    - {selectedCount > 0 && ( + {selectedVariantsToCompare.compareVariantList.length > 0 && ( - {selectedCount} selected + {selectedVariantsToCompare.compareVariantList.length} selected )}
    + + setQueryVariant("")} + variants={filteredVariants || []} + type={"variant"} + /> + + {selectedVariant && ( + setIsDeleteEvalModalOpen(false)} + onOk={() => handleDeleteVariant(selectedVariant)} + evaluationType={variantNameWithRev({ + variant_name: selectedVariant.variantName, + revision: selectedVariant.revision, + })} + /> + )} + + {selectedVariant && ( + setIsDeployVariantModalOpen(false)} + variantId={ + !selectedVariant._parentVariant ? selectedVariant.variantId : undefined + } + revisionId={selectedVariant._parentVariant ? selectedVariant.id : undefined} + environments={environments} + variantName={selectedVariant.variantName} + revision={selectedVariant.revision} + mutate={handleDeployment} + /> + )} + + {!selectedVariantsToCompare.isCompareDisabled && ( + setIsComparisonModalOpen(false)} + compareVariantList={selectedVariantsToCompare.compareVariantList} + /> + )} ) } diff --git a/web/oss/src/components/pages/WorkspaceProjectRedirect/index.tsx b/web/oss/src/components/pages/WorkspaceProjectRedirect/index.tsx deleted file mode 100644 index 7f6a446c45..0000000000 --- a/web/oss/src/components/pages/WorkspaceProjectRedirect/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import {useEffect} from "react" - -import {Spin} from "antd" -import {useRouter} from "next/router" - -import useURL from "@/oss/hooks/useURL" - -const WorkspaceProjectRedirect = () => { - const router = useRouter() - const {baseAppURL} = useURL() - - useEffect(() => { - if (!router.isReady) return - if (!baseAppURL) return - if (router.asPath !== baseAppURL) { - router.replace(baseAppURL) - } - }, [router, baseAppURL]) - - if (baseAppURL && router.asPath === baseAppURL) { - return null - } - - return ( -
    - -
    - ) -} - -export default WorkspaceProjectRedirect diff --git a/web/oss/src/components/pages/WorkspaceRedirect/index.tsx b/web/oss/src/components/pages/WorkspaceRedirect/index.tsx deleted file mode 100644 index bc847c58a9..0000000000 --- a/web/oss/src/components/pages/WorkspaceRedirect/index.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import {useEffect, useMemo} from "react" - -import {Spin} from "antd" -import {useRouter} from "next/router" -import {useAtomValue} from "jotai" - -import useURL from "@/oss/hooks/useURL" -import {projectsAtom} from "@/oss/state/project" - -const WorkspaceRedirect = () => { - const router = useRouter() - const projects = useAtomValue(projectsAtom) - const {workspaceId, baseAppURL} = useURL() - - const fallbackProjectId = useMemo(() => { - if (!workspaceId || !Array.isArray(projects)) return null - const belonging = projects.filter((project) => { - const workspaceMatch = project.workspace_id === workspaceId - const orgMatch = project.organization_id === workspaceId - return workspaceMatch || orgMatch - }) - if (!belonging.length) return null - const nonDemo = belonging.find((project) => !project.is_demo) - return (nonDemo ?? belonging[0])?.project_id ?? null - }, [projects, workspaceId]) - - const targetPath = useMemo(() => { - if (baseAppURL) return baseAppURL - if (workspaceId && fallbackProjectId) { - return `/w/${encodeURIComponent(workspaceId)}/p/${encodeURIComponent( - fallbackProjectId, - )}/apps` - } - if (workspaceId) { - return `/w/${encodeURIComponent(workspaceId)}` - } - return null - }, [baseAppURL, fallbackProjectId, workspaceId]) - - useEffect(() => { - if (!router.isReady) return - if (!targetPath) return - - const currentPath = router.asPath.split("?")[0] - const nextPath = targetPath.split("?")[0] - if (currentPath === nextPath) return - - void router.replace(targetPath) - }, [router, targetPath]) - - if (targetPath && router.asPath.split("?")[0] === targetPath.split("?")[0]) { - return null - } - - return ( -
    - -
    - ) -} - -export default WorkspaceRedirect diff --git a/web/oss/src/components/pages/WorkspaceSelection/index.tsx b/web/oss/src/components/pages/WorkspaceSelection/index.tsx deleted file mode 100644 index af24dbfcc3..0000000000 --- a/web/oss/src/components/pages/WorkspaceSelection/index.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import {useEffect, useMemo, useRef} from "react" - -import {Spin} from "antd" -import {useAtomValue} from "jotai" -import {useRouter} from "next/router" - -import useURL from "@/oss/hooks/useURL" -import {orgsAtom} from "@/oss/state/org" -import {buildPostLoginPath, waitForWorkspaceContext} from "@/oss/state/url/postLoginRedirect" - -const WorkspaceSelection = () => { - const router = useRouter() - const orgs = useAtomValue(orgsAtom) - const {workspaceId, baseAppURL, projectURL, orgURL} = useURL() - const pendingRef = useRef(false) - - const fallbackPath = useMemo(() => { - if (workspaceId) { - if (baseAppURL) return baseAppURL - if (projectURL) return `${projectURL}/apps` - return `/w/${encodeURIComponent(workspaceId)}` - } - - const fallbackWorkspace = Array.isArray(orgs) && orgs.length > 0 ? orgs[0]?.id : null - if (fallbackWorkspace) { - return `/w/${encodeURIComponent(fallbackWorkspace)}` - } - - if (orgURL) return orgURL - return null - }, [baseAppURL, orgURL, orgs, projectURL, workspaceId]) - - useEffect(() => { - if (!router.isReady) return - - if (pendingRef.current) return - - pendingRef.current = true - - let cancelled = false - const redirect = async (target: string | null) => { - if (!target || cancelled) return - const normalizedTarget = target.split("?")[0] - const latestPath = router.asPath.split("?")[0] - if (normalizedTarget === latestPath) return - await router.replace(target) - } - - const fallbackTimer = fallbackPath - ? setTimeout(() => { - void redirect(fallbackPath) - }, 150) - : null - - void waitForWorkspaceContext({ - timeoutMs: 1500, - requireProjectId: false, - requireOrgData: true, - }) - .then(async (context) => { - if (cancelled) return - - const resolvedPath = buildPostLoginPath(context) - - if (resolvedPath && resolvedPath !== "/w") { - if (fallbackTimer) clearTimeout(fallbackTimer) - await redirect(resolvedPath) - return - } - - if (fallbackPath) { - if (fallbackTimer) clearTimeout(fallbackTimer) - await redirect(fallbackPath) - } - }) - .finally(() => { - if (fallbackTimer) clearTimeout(fallbackTimer) - pendingRef.current = false - }) - - return () => { - cancelled = true - if (fallbackTimer) clearTimeout(fallbackTimer) - } - }, [fallbackPath, router, router.isReady]) - - return ( -
    - -
    - ) -} - -export default WorkspaceSelection diff --git a/web/oss/src/components/pages/_app/index.tsx b/web/oss/src/components/pages/_app/index.tsx deleted file mode 100644 index 7411c7ebd7..0000000000 --- a/web/oss/src/components/pages/_app/index.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import {QueryClientProvider} from "@tanstack/react-query" -import {App as AppComponent} from "antd" -import {enableMapSet} from "immer" -import {useAtomValue} from "jotai" -import type {AppProps} from "next/app" -import dynamic from "next/dynamic" -import {Inter} from "next/font/google" - -import ThemeContextProvider from "@/oss/components/Layout/ThemeContextProvider" -import GlobalScripts from "@/oss/components/Scripts/GlobalScripts" -import {queryClient} from "@/oss/lib/api/queryClient" -import AuthProvider from "@/oss/lib/helpers/auth/AuthProvider" -import {selectedOrgIdAtom} from "@/oss/state/org/selectors/org" -import {useUser} from "@/oss/state/profile" -import {useProjectData} from "@/oss/state/project" -import GlobalStateProvider from "@/oss/state/Providers" -import ThemeContextBridge from "@/oss/ThemeContextBridge" - -import AppGlobalWrappers from "../../AppGlobalWrappers" -import AppContextComponent from "../../AppMessageContext" - -enableMapSet() - -const NoMobilePageWrapper = dynamic( - () => import("@/oss/components/NoMobilePageWrapper/NoMobilePageWrapper"), - { - ssr: false, - }, -) -const CustomPosthogProvider = dynamic(() => import("@/oss/lib/helpers/analytics/AgPosthogProvider")) -const Layout = dynamic(() => import("@/oss/components/Layout/Layout"), { - ssr: false, -}) - -const inter = Inter({ - subsets: ["latin"], - variable: "--font-inter", -}) - -const PreloadQueries = () => { - useAtomValue(selectedOrgIdAtom) - useUser() - useProjectData() - - return null -} - -export default function App({Component, pageProps, ...rest}: AppProps) { - return ( - <> - - -
    - - - - - - - - - - - - - - - - - - - - - -
    - - ) -} diff --git a/web/oss/src/components/pages/app-management/components/AppCard.tsx b/web/oss/src/components/pages/app-management/components/AppCard.tsx index 45c5419129..6ffc7f1233 100644 --- a/web/oss/src/components/pages/app-management/components/AppCard.tsx +++ b/web/oss/src/components/pages/app-management/components/AppCard.tsx @@ -6,7 +6,6 @@ import {createUseStyles} from "react-jss" import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" import {JSSTheme, ListAppsItem} from "@/oss/lib/Types" -import useURL from "@/oss/hooks/useURL" const {Text} = Typography @@ -51,11 +50,11 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ const AppCard: React.FC<{ app: ListAppsItem - openDeleteAppModal: (appDetails: ListAppsItem) => void - openEditAppModal: (appDetails: ListAppsItem) => void -}> = ({app, openDeleteAppModal, openEditAppModal}) => { + setSelectedApp: React.Dispatch> + setIsDeleteAppModalOpen: (value: React.SetStateAction) => void + setIsEditAppModalOpen: (value: React.SetStateAction) => void +}> = ({app, setSelectedApp, setIsDeleteAppModalOpen, setIsEditAppModalOpen}) => { const router = useRouter() - const {baseAppURL} = useURL() const classes = useStyles() @@ -64,7 +63,7 @@ const AppCard: React.FC<{ router.push(`${baseAppURL}/${app.app_id}/overview`)} + onClick={() => router.push(`/apps/${app.app_id}/overview`)} extra={ , onClick: (e: any) => { e.domEvent.stopPropagation() - router.push(`${baseAppURL}/${app.app_id}/overview`) + router.push(`/apps/${app.app_id}/overview`) }, }, {type: "divider"}, @@ -87,7 +86,8 @@ const AppCard: React.FC<{ icon: , onClick: (e: any) => { e.domEvent.stopPropagation() - openEditAppModal(app) + setSelectedApp(app) + setIsEditAppModalOpen(true) }, }, { @@ -97,7 +97,8 @@ const AppCard: React.FC<{ danger: true, onClick: (e: any) => { e.domEvent.stopPropagation() - openDeleteAppModal(app) + setSelectedApp(app) + setIsDeleteAppModalOpen(true) }, }, ], diff --git a/web/oss/src/components/pages/app-management/components/AppTable.tsx b/web/oss/src/components/pages/app-management/components/AppTable.tsx index 573ae2bd0f..4aef76435e 100644 --- a/web/oss/src/components/pages/app-management/components/AppTable.tsx +++ b/web/oss/src/components/pages/app-management/components/AppTable.tsx @@ -5,19 +5,23 @@ import {ColumnsType} from "antd/es/table" import {useRouter} from "next/router" import NoResultsFound from "@/oss/components/NoResultsFound/NoResultsFound" -import useURL from "@/oss/hooks/useURL" import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" import {ListAppsItem} from "@/oss/lib/Types" interface AppTableProps { filteredApps: ListAppsItem[] - openDeleteAppModal: (appDetails: ListAppsItem) => void - openEditAppModal: (appDetails: ListAppsItem) => void + setSelectedApp: React.Dispatch> + setIsDeleteAppModalOpen: (value: React.SetStateAction) => void + setIsEditAppModalOpen: (value: React.SetStateAction) => void } -const AppTable = ({filteredApps, openDeleteAppModal, openEditAppModal}: AppTableProps) => { +const AppTable = ({ + filteredApps, + setIsDeleteAppModalOpen, + setIsEditAppModalOpen, + setSelectedApp, +}: AppTableProps) => { const router = useRouter() - const {baseAppURL} = useURL() const columns: ColumnsType = [ { @@ -63,7 +67,7 @@ const AppTable = ({filteredApps, openDeleteAppModal, openEditAppModal}: AppTable icon: , onClick: (e: any) => { e.domEvent.stopPropagation() - router.push(`${baseAppURL}/${record.app_id}/overview`) + router.push(`/apps/${record.app_id}/overview`) }, }, {type: "divider"}, @@ -73,7 +77,8 @@ const AppTable = ({filteredApps, openDeleteAppModal, openEditAppModal}: AppTable icon: , onClick: (e: any) => { e.domEvent.stopPropagation() - openEditAppModal(record) + setSelectedApp(record) + setIsEditAppModalOpen(true) }, }, { @@ -83,7 +88,8 @@ const AppTable = ({filteredApps, openDeleteAppModal, openEditAppModal}: AppTable danger: true, onClick: (e: any) => { e.domEvent.stopPropagation() - openDeleteAppModal(record) + setSelectedApp(record) + setIsDeleteAppModalOpen(true) }, }, ], @@ -113,7 +119,7 @@ const AppTable = ({filteredApps, openDeleteAppModal, openEditAppModal}: AppTable bordered onRow={(record) => ({ style: {cursor: "pointer"}, - onClick: () => router.push(`${baseAppURL}/${record.app_id}/overview`), + onClick: () => router.push(`/apps/${record.app_id}/overview`), })} locale={{emptyText: }} /> diff --git a/web/oss/src/components/pages/app-management/components/ApplicationManagementSection.tsx b/web/oss/src/components/pages/app-management/components/ApplicationManagementSection.tsx index e336f6f0f5..f3b9763eb0 100644 --- a/web/oss/src/components/pages/app-management/components/ApplicationManagementSection.tsx +++ b/web/oss/src/components/pages/app-management/components/ApplicationManagementSection.tsx @@ -1,15 +1,13 @@ -import {Dispatch, SetStateAction} from "react" +import {Dispatch, SetStateAction, useState} from "react" import {PlusOutlined} from "@ant-design/icons" import {Cards, Table} from "@phosphor-icons/react" import {Button, Flex, Input, Pagination, Radio, Space, Typography} from "antd" -import {useSetAtom} from "jotai" +import dynamic from "next/dynamic" import {createUseStyles} from "react-jss" import {useLocalStorage} from "usehooks-ts" import NoResultsFound from "@/oss/components/NoResultsFound/NoResultsFound" -import {openDeleteAppModalAtom} from "@/oss/components/pages/app-management/modals/DeleteAppModal/store/deleteAppModalStore" -import {openEditAppModalAtom} from "@/oss/components/pages/app-management/modals/EditAppModal/store/editAppModalStore" import usePagination from "@/oss/hooks/usePagination" import {JSSTheme, ListAppsItem} from "@/oss/lib/Types" @@ -17,6 +15,13 @@ import AppCard from "./AppCard" import AppTable from "./AppTable" import EmptyAppView from "./EmptyAppView" +const DeleteAppModal: any = dynamic( + () => import("@/oss/components/pages/app-management/modals/DeleteAppModal"), +) +const EditAppModal: any = dynamic( + () => import("@/oss/components/pages/app-management/modals/EditAppModal"), +) + interface ApplicationManagementSectionProps { selectedOrg: any apps: ListAppsItem[] @@ -64,8 +69,9 @@ const ApplicationManagementSection = ({ "app_management_display", "list", ) - const openDeleteAppModal = useSetAtom(openDeleteAppModalAtom) - const openEditAppModal = useSetAtom(openEditAppModalAtom) + const [selectedApp, setSelectedApp] = useState(null) + const [isDeleteAppModalOpen, setIsDeleteAppModalOpen] = useState(false) + const [isEditAppModalOpen, setIsEditAppModalOpen] = useState(false) const { paginatedItems: paginatedApps, @@ -121,8 +127,9 @@ const ApplicationManagementSection = ({ {appMsgDisplay === "list" ? ( ) : paginatedApps.length ? (
    @@ -130,8 +137,9 @@ const ApplicationManagementSection = ({
    ))} @@ -154,6 +162,22 @@ const ApplicationManagementSection = ({ )}
    + + {selectedApp && ( + <> + setIsDeleteAppModalOpen(false)} + appDetails={selectedApp} + /> + + setIsEditAppModalOpen(false)} + appDetails={selectedApp} + /> + + )} ) } diff --git a/web/oss/src/components/pages/app-management/index.tsx b/web/oss/src/components/pages/app-management/index.tsx index 3840183e7d..476b487c27 100644 --- a/web/oss/src/components/pages/app-management/index.tsx +++ b/web/oss/src/components/pages/app-management/index.tsx @@ -1,12 +1,15 @@ -import {useMemo, useState} from "react" +import {useState, useMemo} from "react" import {Typography} from "antd" import dayjs from "dayjs" -import {useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" import ResultComponent from "@/oss/components/ResultComponent/ResultComponent" +import {useAppsData} from "@/oss/contexts/app.context" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProfileData} from "@/oss/contexts/profile.context" +import {useProjectData} from "@/oss/contexts/project.context" import {useVaultSecret} from "@/oss/hooks/useVaultSecret" import {usePostHogAg} from "@/oss/lib/helpers/analytics/hooks/usePostHogAg" import {type LlmProvider} from "@/oss/lib/helpers/llmProviders" @@ -15,10 +18,6 @@ import {Template, GenericObject, StyleProps} from "@/oss/lib/Types" import {waitForAppToStart} from "@/oss/services/api" import {createAndStartTemplate, deleteApp, ServiceType} from "@/oss/services/app-selector/api" import useTemplates from "@/oss/services/app-selector/hooks/useTemplates" -import {useAppsData} from "@/oss/state/app" -import {appCreationStatusAtom, resetAppCreationAtom} from "@/oss/state/appCreation/status" -import {useOrgData} from "@/oss/state/org" -import {useProfileData} from "@/oss/state/profile" import {getTemplateKey, timeout} from "./assets/helpers" import {useStyles} from "./assets/styles" @@ -44,18 +43,25 @@ const SetupTracingModal: any = dynamic( const ObservabilityDashboardSection: any = dynamic( () => import("@/oss/components/pages/app-management/components/ObservabilityDashboardSection"), ) +const DemoApplicationsSection: any = dynamic( + () => import("@/oss/components/pages/app-management/components/DemoApplicationsSection"), +) + const {Title} = Typography const AppManagement: React.FC = () => { - const statusData = useAtomValue(appCreationStatusAtom) - const setStatusData = useSetAtom(appCreationStatusAtom) - const resetAppCreation = useSetAtom(resetAppCreationAtom) + const [statusData, setStatusData] = useState<{status: string; details?: any; appId?: string}>({ + status: "", + details: undefined, + appId: undefined, + }) const [statusModalOpen, setStatusModalOpen] = useState(false) - const [fetchingCustomWorkflow, setFetchingCustomWorkflow] = useState(false) - const {openModal} = useCustomWorkflowConfig({ + const [fetchingTemplate, setFetchingTemplate] = useState(false) + const {CustomWorkflowModal, openModal} = useCustomWorkflowConfig({ + setFetchingTemplate, + setStatusData, setStatusModalOpen, - setFetchingTemplate: setFetchingCustomWorkflow, - appId: "", + configureWorkflow: false, }) const posthog = usePostHogAg() const {appTheme} = useAppTheme() @@ -67,17 +73,22 @@ const AppManagement: React.FC = () => { const [isSetupTracingModal, setIsSetupTracingModal] = useState(false) const [newApp, setNewApp] = useState("") const [searchTerm, setSearchTerm] = useState("") - const {apps, error, mutate} = useAppsData() + const {apps, error, isLoading, mutate} = useAppsData() const {secrets} = useVaultSecret() + const {project} = useProjectData() const {selectedOrg} = useOrgData() - const [{data: templates = [], isLoading: fetchingTemplate}, noTemplateMessage] = useTemplates() + const [{data: templates = []}, noTemplateMessage] = useTemplates() const handleTemplateCardClick = async (template_id: string) => { setIsAddAppFromTemplatedModal(false) + // warn the user and redirect if openAI key is not present + // TODO: must be changed for multiples LLM keys + // if (await redirectIfNoLLMKeys({secrets})) return + + setFetchingTemplate(true) setStatusModalOpen(true) - resetAppCreation() // attempt to create and start the template, notify user of the progress const apiKeys = secrets @@ -87,18 +98,19 @@ const AppManagement: React.FC = () => { providerKey: isDemo() && apiKeys?.length === 0 ? [] : (apiKeys as LlmProvider[]), onStatusChange: async (status, details, appId) => { if (["error", "bad_request", "timeout", "success"].includes(status)) - if (status === "success") { - await mutate() - posthog?.capture?.("app_deployment", { - properties: { - app_id: appId, - environment: "UI", - deployed_by: user?.id, - }, - }) - } - - setStatusData((prev) => ({...prev, status, details, appId: appId || prev.appId})) + setFetchingTemplate(false) + if (status === "success") { + await mutate() + posthog?.capture?.("app_deployment", { + properties: { + app_id: appId, + environment: "UI", + deployed_by: user?.id, + }, + }) + } + + setStatusData((prev) => ({status, details, appId: appId || prev.appId})) }, }) } @@ -150,7 +162,9 @@ const AppManagement: React.FC = () => { return ( <>
    - {error ? ( + {isLoading || (!apps && !error) ? ( + + ) : error ? ( ) : ( <> @@ -176,11 +190,15 @@ const AppManagement: React.FC = () => { setSearchTerm={setSearchTerm} /> + {!project?.is_demo && } + )}
    + {CustomWorkflowModal} + setIsSetupTracingModal(false)} @@ -220,13 +238,10 @@ const AppManagement: React.FC = () => { { - setStatusModalOpen(false) - resetAppCreation() - }} + onCancel={() => setStatusModalOpen(false)} statusData={statusData} appName={newApp} /> diff --git a/web/oss/src/components/pages/app-management/modals/CreateAppStatusModal.tsx b/web/oss/src/components/pages/app-management/modals/CreateAppStatusModal.tsx index 796504556b..bc37fb37e7 100644 --- a/web/oss/src/components/pages/app-management/modals/CreateAppStatusModal.tsx +++ b/web/oss/src/components/pages/app-management/modals/CreateAppStatusModal.tsx @@ -1,16 +1,12 @@ -import {useEffect} from "react" +import {useEffect, useState} from "react" import {Check, CircleNotch, ExclamationMark} from "@phosphor-icons/react" import {Modal, Typography, theme} from "antd" -import {useAtom, useAtomValue, useSetAtom} from "jotai" +import {useRouter} from "next/router" import {createUseStyles} from "react-jss" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" import {getErrorMessage} from "@/oss/lib/helpers/errorHandler" -import {JSSTheme} from "@/oss/lib/Types" -import {appCreationMessagesAtom, appCreationNavigationAtom} from "@/oss/state/appCreation/status" -import {resetAppCreationAtom} from "@/oss/state/appCreation/status" -import type {AppCreationStatus} from "@/oss/state/appCreation/status" +import {GenericObject, JSSTheme} from "@/oss/lib/Types" import CustomAppCreationLoader from "./CustomAppCreationLoader" @@ -63,7 +59,7 @@ interface Props { loading: boolean onErrorRetry?: () => void onTimeoutRetry?: () => void - statusData: AppCreationStatus + statusData: {status: string; details?: any; appId?: string} appName: string } @@ -75,18 +71,24 @@ const CreateAppStatusModal: React.FC> appName, ...props }) => { + const router = useRouter() const classes = useStyles() - const {goToPlayground} = usePlaygroundNavigation() const { token: {colorError, cyan5: colorSuccess}, } = theme.useToken() - const [messages, setMessages] = useAtom(appCreationMessagesAtom) - const navigationTarget = useAtomValue(appCreationNavigationAtom) - const setNavigationTarget = useSetAtom(appCreationNavigationAtom) - const resetAppCreation = useSetAtom(resetAppCreationAtom) + const [messages, setMessages] = useState< + Record< + string, + { + type: "error" | "success" | "loading" + message: string + errorMessage?: string + } + > + >({}) const {appId, status, details} = statusData - const isError = ["bad_request", "error", "permission_denied"].includes(status) + const isError = ["bad_request", "error"].includes(status) const isTimeout = status === "timeout" const isSuccess = status === "success" const closable = isError || isTimeout @@ -103,87 +105,79 @@ const CreateAppStatusModal: React.FC> onTimeoutRetry?.() } else if (isSuccess) { props.onCancel?.(e) - if (appId) setNavigationTarget(appId) + if (appId) router.push(`/apps/${appId}/playground`) } } useEffect(() => { - setMessages((draft) => { + setMessages((prev) => { + let obj: GenericObject switch (status) { case "creating_app": - draft[status] = { - type: "loading", - message: "Adding application", + obj = { + ...prev, + [status]: { + type: "loading", + message: "Adding application", + }, } - if (draft.fetching_image?.type === "loading") - draft.fetching_image.type = "success" - break + if (obj.fetching_image?.type === "loading") obj.fetching_image.type = "success" + return obj case "starting_app": - draft[status] = { - type: "loading", - message: "Starting service (takes ~20s)", + obj = { + ...prev, + [status]: { + type: "loading", + message: "Starting service (takes ~20s)", + }, } - if (draft.creating_app?.type === "loading") draft.creating_app.type = "success" - break + if (obj.creating_app?.type === "loading") obj.creating_app.type = "success" + return obj case "success": - draft[status] = { - type: "success", - message: "Launching your application", + obj = { + ...prev, + [status]: { + type: "success", + message: "Launching your application", + }, } - if (draft.starting_app?.type === "loading") draft.starting_app.type = "success" + if (obj.starting_app?.type === "loading") obj.starting_app.type = "success" if (appId) { - setNavigationTarget(appId) + router.push(`/apps/${appId}/playground`) } - break + return obj case "bad_request": case "error": - case "permission_denied": - { - const lastStatus = Object.keys(draft).pop() ?? "" - if (!lastStatus) break - draft[lastStatus] = { - ...(draft[lastStatus] ?? { - type: "error", - message: draft[lastStatus]?.message ?? "", - }), + const lastStatus = Object.keys(prev).pop() ?? "" + return { + ...prev, + [lastStatus]: { + ...prev[lastStatus], type: "error", - errorMessage: `${getErrorMessage(details)}`, - } + errorMessage: `Error: ${getErrorMessage(details)}`, + }, } - break case "timeout": - draft.starting_app = { - ...(draft.starting_app ?? { + return { + ...prev, + starting_app: { + ...prev.starting_app, type: "error", - message: "Starting service (takes ~20s)", - }), - type: "error", - errorMessage: - 'Error: The app took too long to start. Press the "Retry" button if you want to try again.', + errorMessage: `Error: The app took too long to start. Press the "Retry" button if you want to try again.`, + }, } - break case "cleanup": - draft[status] = { - type: "loading", - message: "Performing cleaning up before retrying", + return { + ...prev, + [status]: { + type: "loading", + message: "Performing cleaning up before retrying", + }, } - break } + return prev }) - }, [appId, details, setMessages, setNavigationTarget, status]) - - useEffect(() => { - // Only handle navigation when the status modal is open to prevent - // unintended redirects when returning to /apps after creation. - if (!props.open) return - if (!navigationTarget) return - - const nextAppId = navigationTarget - setNavigationTarget(null) - goToPlayground(undefined, {appId: nextAppId}) - // Clear creation state so revisiting /apps doesn't re-trigger navigation - resetAppCreation() - }, [props.open, goToPlayground, navigationTarget, setNavigationTarget, resetAppCreation]) + }, [appId, details, router, status]) return ( { - const classes = useStyles() - const [testConnectionStatus, setTestConnectionStatus] = useAtom(customWorkflowTestStatusAtom) - const [isConfiguringWorkflow, setIsConfiguringWorkflow] = useAtom(customWorkflowConfiguringAtom) - - const rawAppId = (props as any)?.appId ?? "" - const appKey = rawAppId && String(rawAppId).trim().length ? String(rawAppId) : "new-app" - const [values, setValues] = useAtom(customWorkflowValuesAtomFamily(appKey)) - const workflowUrlInput = values.appUrl - const isUrlValid = useMemo(() => { - const url = (workflowUrlInput || "").trim() - if (!url) return false - try { - const parsed = new URL(url) - return parsed.protocol === "http:" || parsed.protocol === "https:" - } catch (e) { - return false - } - }, [workflowUrlInput]) - - useEffect(() => { - // Only sync from props when creating a new app (unhydrated) AND values are explicitly provided - if (configureWorkflow) return - if (!customWorkflowAppValues) return - const hasExplicit = Boolean( - customWorkflowAppValues.appName || - customWorkflowAppValues.appUrl || - customWorkflowAppValues.appDesc, - ) - if (!hasExplicit) return - setValues((draft) => { - draft.appName = customWorkflowAppValues.appName - draft.appUrl = customWorkflowAppValues.appUrl - draft.appDesc = customWorkflowAppValues.appDesc - }) - }, [configureWorkflow, customWorkflowAppValues, setValues]) - - // Access current app and variants before seeding effect - const {currentApp, apps} = useAppsData() - // Fetch variants as a fallback if not provided via props - // @ts-ignore - const {data: fetchedVariantsData} = useVariants(currentApp) - const effectiveVariants = variants?.length ? variants : fetchedVariantsData?.variants - - // Seeding is handled on modal open via openCustomWorkflowModalAtom -> customWorkflowSeedAtom - - // Fallback hydration: if modal opened before atoms resolved, hydrate missing fields once they arrive - useEffect(() => { - if (!configureWorkflow) return - const derivedName = (currentApp as any)?.app_name || "" - const derivedUrl = (effectiveVariants as any)?.[0]?.uri || "" - if (!derivedName && !derivedUrl) return - if (!values.appName && derivedName) { - setValues((draft) => { - draft.appName = derivedName - }) - } - if (!values.appUrl && derivedUrl) { - setValues((draft) => { - draft.appUrl = derivedUrl - }) - setTestConnectionStatus({success: false, error: false, loading: false}) - } - }, [configureWorkflow, (currentApp as any)?.app_name, (effectiveVariants as any)?.[0]?.uri]) - - // When URL changes, clear previous test status so user gets accurate hints - useEffect(() => { - setTestConnectionStatus({success: false, error: false, loading: false}) - }, [workflowUrlInput]) - - // Compute appNameExist locally based on current form values (applies to both create & configure) - const appNameExistComputed = useMemo(() => { - if (!Array.isArray(apps)) return false - const name = (values.appName || "").toLowerCase().trim() - if (!name) return false - return apps.some((app: any) => (app?.app_name || "").toLowerCase() === name) - }, [apps, values.appName]) - - const handleEditCustomUrl = useCallback(async () => { - if (!effectiveVariants?.length) { - notification.error({ - message: "Custom workflow", - description: "No variants found to update.", - duration: 3, - }) - return - } - - // Deduplicate by effective target variant ID: parent id if present, else own id - const targetIds = new Set() - for (const v of effectiveVariants) { - const parent = (v as any)._parentVariant - const parentId = - typeof parent === "string" - ? parent - : (parent?.id as string | undefined) || - (parent?.variantId as string | undefined) - const selfId = (v as any).id || (v as any).variantId - const resolved = parentId || selfId - if (resolved) targetIds.add(resolved) - } - - setIsConfiguringWorkflow(true) - try { - await Promise.all( - Array.from(targetIds).map((id) => - updateVariant({ - serviceUrl: removeTrailingSlash(workflowUrlInput), - variantId: id, - }), - ), - ) - await Promise.all([allVariantsDataMutate?.(), mutate()]) - setCustomWorkflowAppValues?.((prev) => ({ - ...prev, - appUrl: workflowUrlInput, - })) - notification.success({ - message: "Custom workflow", - description: "Workflow URL saved successfully.", - duration: 2, - }) - // Close only on success - props.onCancel?.({} as any) - } catch (error) { - console.error("Failed to update variants:", error) - notification.error({ - message: "Custom workflow", - description: "Failed to save the workflow URL. Please try again.", - duration: 3, - }) - } finally { - setIsConfiguringWorkflow(false) - } - }, [ - effectiveVariants, - workflowUrlInput, - allVariantsDataMutate, - mutate, - setCustomWorkflowAppValues, - props, - ]) - - const runTestConnection = useCallback(async (delay = 0, url?: string) => { - if (!url) return - - setTestConnectionStatus({success: false, error: false, loading: true}) - - try { - if (delay) await new Promise((resolve) => setTimeout(resolve, delay)) - const {status} = (await findCustomWorkflowPath(url, "/health")) || {} - if (!status) throw new Error("Unable to establish connection") - setTestConnectionStatus({success: true, error: false, loading: false}) - } catch (error) { - console.error(error) - setTestConnectionStatus({success: false, error: true, loading: false}) - } - }, []) - - useEffect(() => { - if (workflowUrlInput) { - const timeout = setTimeout(() => runTestConnection(undefined, workflowUrlInput), 100) - return () => clearTimeout(timeout) - } - }, [workflowUrlInput, runTestConnection]) - - useEffect(() => { - if (props.open) { - setTestConnectionStatus({ - error: false, - success: false, - loading: false, - }) - } - }, [props.open]) - - // Footer rendered inline at the end to keep it bound to live local values - - return ( -
    -
    - - {configureWorkflow ? ( - Configure - ) : ( - Custom workflow - )} - - - - {!configureWorkflow && ( - - - - )} -
    - - {!configureWorkflow && ( - - Connect your own AI service to Agenta to use our evaluation tools with your - code. Your application will remain on your infrastructure while Agenta - communicates with it through the URL you provide. - - )} - -
    - App name *} - initialValue={values.appName} - handleChange={(value) => { - setValues((draft) => { - draft.appName = value - }) - setCustomWorkflowAppValues?.((prev) => ({...prev, appName: value})) - }} - editorType="border" - placeholder="Enter app name" - editorClassName={`!border-none !shadow-none px-0 ${ - appNameExistComputed || - (values.appName.length > 0 && !isAppNameInputValid(values.appName)) - ? "border-red-500 !border" - : "" - }`} - className="py-1 px-[11px] !w-auto" - useAntdInput - disabled={configureWorkflow} - state={configureWorkflow ? "disabled" : "filled"} - /> - - {appNameExist && ( - - App name already exists - - )} - {values.appName.length > 0 && !isAppNameInputValid(values.appName) && ( - - App name must contain only letters, numbers, underscore, or dash without any - spaces. - - )} -
    - - Workflow URL *} - initialValue={workflowUrlInput} - handleChange={(value) => { - setValues((draft) => { - draft.appUrl = value - }) - setCustomWorkflowAppValues?.((prev) => ({...prev, appUrl: value})) - }} - editorType="border" - placeholder="Enter workflow URL" - editorClassName="!border-none !shadow-none px-0" - className="py-1 px-[11px] !w-auto" - useAntdInput - /> - - { - props.onCancel?.({} as any)} - handleCreateApp={handleCreateApp} - handleEditCustomUrl={handleEditCustomUrl} - isConfiguringWorkflow={isConfiguringWorkflow} - configureWorkflow={configureWorkflow} - customWorkflowAppValues={values} - testConnectionStatus={testConnectionStatus} - appNameExist={appNameExistComputed} - runTestConnection={runTestConnection} - isUrlValid={isUrlValid} - variantsReady={Array.isArray(effectiveVariants) && effectiveVariants.length > 0} - /> - } -
    - ) -} - -export default CustomWorkflowModalContent diff --git a/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/components/CustomWorkflowModalFooter.tsx b/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/components/CustomWorkflowModalFooter.tsx index 1934856297..3817be4d52 100644 --- a/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/components/CustomWorkflowModalFooter.tsx +++ b/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/components/CustomWorkflowModalFooter.tsx @@ -1,6 +1,6 @@ import {memo} from "react" -import {CheckCircleOutlined, ExclamationCircleOutlined, LinkOutlined} from "@ant-design/icons" +import {CheckCircleOutlined, ExclamationCircleOutlined} from "@ant-design/icons" import {Button, notification, Space, Tooltip, Typography} from "antd" import {isAppNameInputValid} from "@/oss/lib/helpers/utils" @@ -15,8 +15,6 @@ const CustomWorkflowModalFooter = ({ appNameExist, handleCancelButton, handleCreateApp, - isUrlValid, - variantsReady, }: { handleEditCustomUrl: () => Promise testConnectionStatus: { @@ -35,40 +33,30 @@ const CustomWorkflowModalFooter = ({ isConfiguringWorkflow: boolean handleCreateApp: () => void handleCancelButton: () => void - isUrlValid?: boolean - variantsReady?: boolean }) => { return (
    - + -
    - {testConnectionStatus.success && ( - <> - - Success - - )} - {testConnectionStatus.error && ( - <> - - Failure - - )} -
    + {testConnectionStatus.success && ( + <> + + Successful + + )} + {testConnectionStatus.error && ( + <> + + Failed + + )}
    {configureWorkflow ? ( @@ -76,24 +64,16 @@ const CustomWorkflowModalFooter = ({ + + )} +
    + + {!configureWorkflow && ( + + Connect your own AI service to Agenta to use our evaluation tools with your + code. Your application will remain on your infrastructure while Agenta + communicates with it through the URL you provide. + + )} + +
    + App name *} + initialValue={customWorkflowAppValues.appName} + handleChange={(value) => + setCustomWorkflowAppValues((prev) => ({ + ...prev, + appName: value, + })) + } + editorType="border" + placeholder="Enter app name" + editorClassName={`!border-none !shadow-none px-0 ${appNameExist || (customWorkflowAppValues.appName.length > 0 && !isAppNameInputValid(customWorkflowAppValues.appName)) ? "border-red-500 !border" : ""}`} + className="py-1 px-[11px] !w-auto" + useAntdInput + disabled={configureWorkflow} + state={configureWorkflow ? "disabled" : "filled"} + /> + + {appNameExist && ( + + App name already exists + + )} + {customWorkflowAppValues.appName.length > 0 && + !isAppNameInputValid(customWorkflowAppValues.appName) && ( + + App name must contain only letters, numbers, underscore, or dash + without any spaces. + + )} +
    + + Workflow URL *} + initialValue={workflowUrlInput} + handleChange={(value) => + setCustomWorkflowAppValues((prev) => ({ + ...prev, + appUrl: value, + })) + } + editorType="border" + placeholder="Enter workflow URL" + editorClassName="!border-none !shadow-none px-0" + className="py-1 px-[11px] !w-auto" + useAntdInput + /> + +
    ) } diff --git a/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/types.d.ts b/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/types.d.ts index 2ae125a475..43c999849b 100644 --- a/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/types.d.ts +++ b/web/oss/src/components/pages/app-management/modals/CustomWorkflowModal/types.d.ts @@ -7,8 +7,6 @@ import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" import {Variant} from "@/oss/lib/Types" export type CustomWorkflowModalProps = { - /** If provided, modal configures the app with this id; otherwise it creates a new app */ - appId?: string customWorkflowAppValues: { appName: string appUrl: string @@ -22,9 +20,6 @@ export type CustomWorkflowModalProps = { }> > handleCreateApp: () => void - /** - * Deprecated: use appId instead. If appId is provided, it's configure mode; else create mode - */ configureWorkflow?: boolean variants?: EnhancedVariant[] allVariantsDataMutate?: KeyedMutator diff --git a/web/oss/src/components/pages/app-management/modals/DeleteAppModal.tsx b/web/oss/src/components/pages/app-management/modals/DeleteAppModal.tsx new file mode 100644 index 0000000000..de8a34af17 --- /dev/null +++ b/web/oss/src/components/pages/app-management/modals/DeleteAppModal.tsx @@ -0,0 +1,46 @@ +import {useCallback, useState} from "react" + +import {Modal} from "antd" + +import {useAppsData} from "@/oss/contexts/app.context" +import {ListAppsItem} from "@/oss/lib/Types" +import {deleteApp} from "@/oss/services/app-selector/api" + +interface DeleteAppModalProps extends React.ComponentProps { + appDetails: ListAppsItem +} + +const DeleteAppModal = ({appDetails, ...props}: DeleteAppModalProps) => { + const [confirmLoading, setConfirmLoading] = useState(false) + const {mutate} = useAppsData() + + const handleDeleteOk = useCallback(async () => { + setConfirmLoading(true) + try { + await deleteApp(appDetails.app_id) + await mutate() + } catch (error) { + console.error(error) + } finally { + // remove variant tabs position index from LS + localStorage.removeItem(`tabIndex_${appDetails.app_id}`) + props.onCancel?.({} as any) + setConfirmLoading(false) + } + }, [appDetails, mutate, props]) + + return ( + +

    Are you sure you want to delete {appDetails.app_name}?

    +
    + ) +} + +export default DeleteAppModal diff --git a/web/oss/src/components/pages/app-management/modals/DeleteAppModal/index.tsx b/web/oss/src/components/pages/app-management/modals/DeleteAppModal/index.tsx deleted file mode 100644 index 8826180cd5..0000000000 --- a/web/oss/src/components/pages/app-management/modals/DeleteAppModal/index.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import {useCallback} from "react" - -import {Modal} from "antd" -import {useAtomValue, useSetAtom} from "jotai" -import {useRouter} from "next/router" - -import useURL from "@/oss/hooks/useURL" -import {deleteApp} from "@/oss/services/app-selector/api" -import {useAppsData} from "@/oss/state/app" - -import { - closeDeleteAppModalAtom, - deleteAppModalAtom, - setDeleteAppModalLoadingAtom, -} from "./store/deleteAppModalStore" - -const DeleteAppModal = (props = {}) => { - const router = useRouter() - const {open, appDetails, confirmLoading} = useAtomValue(deleteAppModalAtom) - const closeModal = useSetAtom(closeDeleteAppModalAtom) - const setLoading = useSetAtom(setDeleteAppModalLoadingAtom) - const {mutate: mutateApps} = useAppsData() - const {baseProjectURL} = useURL() - - const handleDeleteOk = useCallback(async () => { - if (!appDetails) return - - setLoading(true) - try { - await deleteApp(appDetails.app_id) - await mutateApps() - closeModal() - if (router.pathname.includes("/overview")) { - await router.push(baseProjectURL) - } - } catch (error) { - console.error("Failed to delete app:", error) - } finally { - setLoading(false) - } - }, [appDetails, setLoading, mutateApps, closeModal, router]) - - return ( - -

    Are you sure you want to delete {appDetails?.app_name}?

    -
    - ) -} - -export default DeleteAppModal diff --git a/web/oss/src/components/pages/app-management/modals/DeleteAppModal/store/deleteAppModalStore.ts b/web/oss/src/components/pages/app-management/modals/DeleteAppModal/store/deleteAppModalStore.ts deleted file mode 100644 index 9c891d3e24..0000000000 --- a/web/oss/src/components/pages/app-management/modals/DeleteAppModal/store/deleteAppModalStore.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {atom} from "jotai" - -import type {ListAppsItem} from "@/oss/lib/Types" - -// The shape of the modal state -export interface DeleteAppModalState { - open: boolean - appDetails: ListAppsItem | null - confirmLoading?: boolean -} - -// Main atom for the modal state -export const deleteAppModalAtom = atom({ - open: false, - appDetails: null, - confirmLoading: false, -}) - -// Selectors -export const isDeleteAppModalOpenAtom = atom((get) => get(deleteAppModalAtom).open) -export const deleteAppModalAppDetailsAtom = atom((get) => get(deleteAppModalAtom).appDetails) - -// Actions -export const openDeleteAppModalAtom = atom(null, (get, set, appDetails: ListAppsItem) => - set(deleteAppModalAtom, {open: true, appDetails, confirmLoading: false}), -) - -export const closeDeleteAppModalAtom = atom(null, (get, set) => - set(deleteAppModalAtom, {open: false, appDetails: null, confirmLoading: false}), -) - -export const setDeleteAppModalLoadingAtom = atom(null, (get, set, loading: boolean) => { - const current = get(deleteAppModalAtom) - set(deleteAppModalAtom, {...current, confirmLoading: loading}) -}) diff --git a/web/oss/src/components/pages/app-management/modals/EditAppModal.tsx b/web/oss/src/components/pages/app-management/modals/EditAppModal.tsx new file mode 100644 index 0000000000..6491f7599f --- /dev/null +++ b/web/oss/src/components/pages/app-management/modals/EditAppModal.tsx @@ -0,0 +1,97 @@ +import {useMemo, useState} from "react" + +import {CheckOutlined} from "@ant-design/icons" +import {Input, Modal, Typography} from "antd" +import {createUseStyles} from "react-jss" + +import {useAppsData} from "@/oss/contexts/app.context" +import useLazyEffect from "@/oss/hooks/useLazyEffect" +import {isAppNameInputValid} from "@/oss/lib/helpers/utils" +import {GenericObject, JSSTheme, ListAppsItem} from "@/oss/lib/Types" +import {updateAppName} from "@/oss/services/app-selector/api" + +type EditAppModalProps = { + appDetails: ListAppsItem +} & React.ComponentProps + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + title: { + fontSize: theme.fontSizeLG, + lineHeight: theme.lineHeightLG, + fontWeight: theme.fontWeightStrong, + }, + modalError: { + color: "red", + marginLeft: theme.marginXS, + }, +})) + +const EditAppModal = ({appDetails, ...props}: EditAppModalProps) => { + const classes = useStyles() + const {apps, mutate} = useAppsData() + const [appNameInput, setAppNameInput] = useState(appDetails.app_name) + const [editAppLoading, setEditAppLoading] = useState(false) + + useLazyEffect(() => { + setAppNameInput(appDetails.app_name) + }, [apps, appDetails]) + + const appNameExist = useMemo( + () => + apps.some( + (app: GenericObject) => + app.app_name.toLowerCase() === appNameInput.toLowerCase() && + app.app_name.toLowerCase() !== appDetails.app_name.toLowerCase(), + ), + [apps, appNameInput, appDetails.app_name], + ) + + const handleEditAppName = async () => { + try { + setEditAppLoading(true) + await updateAppName(appDetails.app_id, appNameInput) + await mutate() + props.onCancel?.({} as any) + } catch (error) { + console.error(error) + } finally { + setEditAppLoading(false) + } + } + + return ( + , + disabled: appNameExist || appNameInput.length === 0, + loading: editAppLoading, + }} + onOk={handleEditAppName} + okText={"Confirm"} + title={Rename App} + {...props} + > +
    + setAppNameInput(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + handleEditAppName() + } + }} + /> + {appNameExist &&
    App name already exists
    } + {appNameInput.length > 0 && !isAppNameInputValid(appNameInput) && ( +
    + App name must contain only letters, numbers, underscore, or dash +
    + )} +
    +
    + ) +} + +export default EditAppModal diff --git a/web/oss/src/components/pages/app-management/modals/EditAppModal/index.tsx b/web/oss/src/components/pages/app-management/modals/EditAppModal/index.tsx deleted file mode 100644 index e297af8772..0000000000 --- a/web/oss/src/components/pages/app-management/modals/EditAppModal/index.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import {useCallback, useEffect, useMemo, useState} from "react" - -import {CheckOutlined} from "@ant-design/icons" -import {Input, Modal, Typography} from "antd" -import clsx from "clsx" -import {useAtomValue, useSetAtom} from "jotai" -import {createUseStyles} from "react-jss" - -import {isAppNameInputValid} from "@/oss/lib/helpers/utils" -import {GenericObject, JSSTheme} from "@/oss/lib/Types" -import {updateAppName} from "@/oss/services/app-selector/api" -import {useAppsData} from "@/oss/state/app" - -import {closeEditAppModalAtom, editAppModalAtom} from "./store/editAppModalStore" - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - title: { - fontSize: theme.fontSizeLG, - lineHeight: theme.lineHeightLG, - fontWeight: theme.fontWeightStrong, - }, -})) - -const EditAppModal = () => { - const {open, appDetails} = useAtomValue(editAppModalAtom) - const closeModal = useSetAtom(closeEditAppModalAtom) - const classes = useStyles() - const {apps, isLoading, mutate} = useAppsData() - const [appNameInput, setAppNameInput] = useState(appDetails?.app_name || "") - - useEffect(() => { - setAppNameInput(appDetails?.app_name) - }, [appDetails]) - - const appNameExist = useMemo( - () => - apps.some( - (app: GenericObject) => - app.app_name.toLowerCase() === appNameInput?.toLowerCase() && - app.app_name.toLowerCase() !== appDetails?.app_name.toLowerCase(), - ), - [apps, appNameInput, appDetails?.app_name], - ) - - const handleEditAppName = useCallback(async () => { - try { - await updateAppName(appDetails?.app_id, appNameInput) - await mutate() - closeModal() - } catch (error) { - console.error(error) - } - }, [appDetails, appNameInput, mutate, closeModal]) - - return ( - , - disabled: !appDetails || appNameExist || appNameInput?.length === 0, - loading: isLoading, - }} - onOk={handleEditAppName} - okText={"Confirm"} - title={Rename App} - open={open} - onCancel={closeModal} - > -
    - setAppNameInput(e.target.value)} - onKeyDown={(e) => { - if (e.key === "Enter") { - handleEditAppName() - } - }} - /> - {appNameExist && ( -
    App name already exists
    - )} - {appNameInput?.length > 0 && !isAppNameInputValid(appNameInput) && ( -
    - App name must contain only letters, numbers, underscore, or dash -
    - )} -
    -
    - ) -} - -export default EditAppModal diff --git a/web/oss/src/components/pages/app-management/modals/EditAppModal/store/editAppModalStore.ts b/web/oss/src/components/pages/app-management/modals/EditAppModal/store/editAppModalStore.ts deleted file mode 100644 index acbb6695ed..0000000000 --- a/web/oss/src/components/pages/app-management/modals/EditAppModal/store/editAppModalStore.ts +++ /dev/null @@ -1,28 +0,0 @@ -import {atom} from "jotai" - -import type {ListAppsItem} from "@/oss/lib/Types" - -// The shape of the modal state -export interface EditAppModalState { - open: boolean - appDetails: ListAppsItem | null -} - -// Main atom for the modal state -export const editAppModalAtom = atom({ - open: false, - appDetails: null, -}) - -// Selectors -export const isEditAppModalOpenAtom = atom((get) => get(editAppModalAtom).open) -export const editAppModalAppDetailsAtom = atom((get) => get(editAppModalAtom).appDetails) - -// Actions -export const openEditAppModalAtom = atom(null, (get, set, appDetails: ListAppsItem) => - set(editAppModalAtom, {open: true, appDetails}), -) - -export const closeEditAppModalAtom = atom(null, (get, set) => - set(editAppModalAtom, {open: false, appDetails: null}), -) diff --git a/web/oss/src/components/pages/app-management/modals/MaxAppModal.tsx b/web/oss/src/components/pages/app-management/modals/MaxAppModal.tsx index 330ad640cc..8ee1f9dfc2 100644 --- a/web/oss/src/components/pages/app-management/modals/MaxAppModal.tsx +++ b/web/oss/src/components/pages/app-management/modals/MaxAppModal.tsx @@ -43,7 +43,7 @@ const MaxAppModal: React.FC = ({...props}) => {
    import("./components/TracingTabContent").then((m) => m.TracingTabContent), - { - ssr: false, - }, -) +import {TracingTabContent} from "./components/TracingTabContent" const {Text, Title} = Typography -const SetupTracingModalContent = ({ - classes, - ...props -}: { - classes: any - onCancel: ModalProps["onCancel"] -}) => { +const SetupTracingModal = (props: ModalProps) => { + const classes = useStyles() const [apiKeyValue, setApiKeyValue] = useState("") const codeBlocks = useMemo(() => generateCodeBlocks(apiKeyValue, isDemo()), [apiKeyValue]) + const items: TabsProps["items"] = [ { key: "openai", @@ -104,39 +93,6 @@ const SetupTracingModalContent = ({ }, ] - return ( -
    -
    - -
    -
    - - Tracing - - Debug effectively, bootstrap testsets, monitor and compare app versions - - - -
    -
    - ) -} - -const SetupTracingModal = (props: ModalProps) => { - const classes = useStyles() - return ( { closeIcon={null} {...props} > - +
    +
    + +
    +
    + + Tracing + + Debug effectively, bootstrap test sets, monitor and compare app versions + + + +
    +
    ) } diff --git a/web/oss/src/components/pages/auth/EmailPasswordAuth/index.tsx b/web/oss/src/components/pages/auth/EmailPasswordAuth/index.tsx index 00a26c4c3d..696e1a780e 100644 --- a/web/oss/src/components/pages/auth/EmailPasswordAuth/index.tsx +++ b/web/oss/src/components/pages/auth/EmailPasswordAuth/index.tsx @@ -3,19 +3,18 @@ import {useState} from "react" import {Button, Form, FormProps, Input} from "antd" import {signUp} from "supertokens-auth-react/recipe/emailpassword" -import usePostAuthRedirect from "@/oss/hooks/usePostAuthRedirect" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProfileData} from "@/oss/contexts/profile.context" +import {useProjectData} from "@/oss/contexts/project.context" import ShowErrorMessage from "../assets/ShowErrorMessage" import {EmailPasswordAuthProps} from "../assets/types" -const EmailPasswordAuth = ({ - message, - setMessage, - authErrorMsg, - initialEmail, -}: EmailPasswordAuthProps) => { - const {handleAuthSuccess} = usePostAuthRedirect() - const [form, setForm] = useState({email: initialEmail || "", password: ""}) +const EmailPasswordAuth = ({message, setMessage, authErrorMsg}: EmailPasswordAuthProps) => { + const {reset: resetProfileData} = useProfileData() + const {reset: resetOrgData} = useOrgData() + const {reset: resetProjectData} = useProjectData() + const [form, setForm] = useState({email: "", password: ""}) const [isLoading, setIsLoading] = useState(false) const signUpClicked: FormProps<{email: string; password: string}>["onFinish"] = async ( @@ -46,12 +45,13 @@ const EmailPasswordAuth = ({ setMessage({message: res.error, type: "error"}) }) } else { - setMessage({message: "Verification successful", type: "success"}) - const {createdNewRecipeUser, user} = response as { - createdNewRecipeUser?: boolean - user?: {loginMethods?: unknown[]} - } - await handleAuthSuccess({createdNewRecipeUser, user}) + resetProfileData() + resetOrgData() + resetProjectData() + setMessage({ + message: "Sign in successfully!", + type: "success", + }) } } catch (error) { authErrorMsg(error) @@ -62,12 +62,7 @@ const EmailPasswordAuth = ({ return (
    - + + {message.type == "error" && } { - const {handleAuthSuccess} = usePostAuthRedirect() + const {reset: resetProfileData} = useProfileData() + const {reset: resetOrgData} = useOrgData() + const {reset: resetProjectData} = useProjectData() const classes = useStyles() + const router = useRouter() + const [isResendDisabled, setIsResendDisabled] = useState(false) const [isLoading, setIsLoading] = useState(false) @@ -78,11 +87,29 @@ const SendOTP = ({ const response = await consumeCode({userInputCode: values.otp}) if (response.status === "OK") { + resetProfileData() + resetOrgData() + resetProjectData() await clearLoginAttemptInfo() setMessage({message: "Verification successful", type: "success"}) - // Clear selected org via atom to keep storage in sync - const {createdNewRecipeUser, user} = response - await handleAuthSuccess({createdNewRecipeUser, user}, {isInvitedUser}) + localStorage.setItem(LS_ORG_KEY, "") + if ( + isDemo() && + response.createdNewRecipeUser && + response.user.loginMethods.length === 1 + ) { + if (isInvitedUser) { + await router.push("/workspaces/accept?survey=true") + } else { + await router.push("/post-signup") + } + } else { + if (isInvitedUser) { + await router.push("/workspaces/accept") + } else { + await router.push("/apps") + } + } } else if (response.status === "INCORRECT_USER_INPUT_CODE_ERROR") { const trileLeft = response.maximumCodeInputAttempts - response.failedCodeInputAttemptCount diff --git a/web/oss/src/components/pages/auth/SocialAuth/index.tsx b/web/oss/src/components/pages/auth/SocialAuth/index.tsx index 94f0838b43..d6fd8086d9 100644 --- a/web/oss/src/components/pages/auth/SocialAuth/index.tsx +++ b/web/oss/src/components/pages/auth/SocialAuth/index.tsx @@ -1,5 +1,3 @@ -import {useRef} from "react" - import {GithubOutlined, GoogleOutlined} from "@ant-design/icons" import {Button, Divider} from "antd" import {useRouter} from "next/router" @@ -11,12 +9,9 @@ import {SocialAuthProps} from "../assets/types" const SocialAuth = ({authErrorMsg, isLoading, setIsLoading, disabled}: SocialAuthProps) => { const router = useRouter() - const inFlight = useRef(false) const googleSignInClicked = async () => { try { - if (disabled || isLoading || inFlight.current) return - inFlight.current = true setIsLoading(true) const authUrl = await getAuthorisationURLWithQueryParamsAndSetState({ @@ -25,18 +20,17 @@ const SocialAuth = ({authErrorMsg, isLoading, setIsLoading, disabled}: SocialAut getEnv("NEXT_PUBLIC_AGENTA_WEB_URL") || getEnv("NEXT_PUBLIC_AGENTA_API_URL") }/auth/callback/google`, }) - await router.push(authUrl) + + router.push(authUrl) } catch (err) { authErrorMsg(err) + } finally { setIsLoading(false) - inFlight.current = false } } const githubSignInClicked = async () => { try { - if (disabled || isLoading || inFlight.current) return - inFlight.current = true setIsLoading(true) const authUrl = await getAuthorisationURLWithQueryParamsAndSetState({ @@ -45,11 +39,12 @@ const SocialAuth = ({authErrorMsg, isLoading, setIsLoading, disabled}: SocialAut getEnv("NEXT_PUBLIC_AGENTA_WEB_URL") || getEnv("NEXT_PUBLIC_AGENTA_API_URL") }/auth/callback/github`, }) - await router.push(authUrl) + + router.push(authUrl) } catch (err) { authErrorMsg(err) + } finally { setIsLoading(false) - inFlight.current = false } } diff --git a/web/oss/src/components/pages/auth/assets/types.d.ts b/web/oss/src/components/pages/auth/assets/types.d.ts index 100a5a5a9f..5842234569 100644 --- a/web/oss/src/components/pages/auth/assets/types.d.ts +++ b/web/oss/src/components/pages/auth/assets/types.d.ts @@ -4,7 +4,6 @@ export interface EmailPasswordAuthProps { message: AuthErrorMsgType setMessage: React.Dispatch> authErrorMsg: (error: any) => void - initialEmail?: string } export interface SendOTPProps { diff --git a/web/oss/src/components/pages/evaluations/EvaluationsView.tsx b/web/oss/src/components/pages/evaluations/EvaluationsView.tsx deleted file mode 100644 index 3f724bdfe9..0000000000 --- a/web/oss/src/components/pages/evaluations/EvaluationsView.tsx +++ /dev/null @@ -1,189 +0,0 @@ -import {useEffect, useMemo} from "react" - -import {Tabs, Typography} from "antd" -import clsx from "clsx" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" -import {createUseStyles} from "react-jss" -import {useLocalStorage} from "usehooks-ts" - -import {useAppId} from "@/oss/hooks/useAppId" -import {useQueryParam} from "@/oss/hooks/useQuery" -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" -import {JSSTheme} from "@/oss/lib/Types" - -const AutoEvaluation = dynamic( - () => import("@/oss/components/pages/evaluations/autoEvaluation/AutoEvaluation"), - {ssr: false}, -) -const SingleModelEvaluation = dynamic( - () => import("@/oss/components/HumanEvaluations/SingleModelEvaluation"), - {ssr: false}, -) -const AbTestingEvaluation = dynamic( - () => import("@/oss/components/HumanEvaluations/AbTestingEvaluation"), - {ssr: false}, -) -const OnlineEvaluation = dynamic(() => import("./onlineEvaluation/OnlineEvaluation"), {ssr: false}) -const CustomEvaluation = dynamic(() => import("./customEvaluation/CustomEvaluation"), { - ssr: false, -}) - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - container: { - display: "flex", - flexDirection: "column", - gap: theme.marginLG, - }, - title: { - fontSize: theme.fontSizeLG, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeightHeading4, - }, -})) - -type EvaluationScope = "app" | "project" - -const formatLabel = (value: string) => value.replaceAll("_", " ") - -interface TabOption { - value: string - label: string - disabled?: boolean -} - -interface EvaluationsViewProps { - scope?: EvaluationScope -} - -const allowedOptionsByScope: Record = { - app: [ - {value: "auto_evaluation", label: "Automatic Evaluations"}, - {value: "human_annotation", label: "Human Annotations"}, - // {value: "online_evaluation", label: "Online Evaluations"}, - {value: "custom_evaluation", label: "SDK Evaluations"}, - {value: "human_ab_testing", label: "A/B Testing"}, - ], - project: [ - {value: "auto_evaluation", label: "Automatic Evaluations"}, - {value: "human_annotation", label: "Human Annotations"}, - {value: "online_evaluation", label: "Online Evaluations"}, - {value: "custom_evaluation", label: "SDK Evaluations"}, - ], -} - -const EvaluationsView = ({scope = "app"}: EvaluationsViewProps) => { - const classes = useStyles() - const router = useRouter() - const routeAppId = useAppId() - - const uniqueScopeKey = useMemo(() => { - if (scope !== "app") return "project" - if (!routeAppId) return "app" - const parts = routeAppId.split("-") - return parts[parts.length - 1] || "app" - }, [scope, routeAppId]) - - const [defaultKey, setDefaultKey] = useLocalStorage( - `${uniqueScopeKey}-last-visited-evaluation`, - "auto_evaluation", - ) - const [selectedEvaluation, setSelectedEvaluation] = useQueryParam( - "selectedEvaluation", - defaultKey, - ) - - // Ensure selected evaluation is valid for current scope - useEffect(() => { - const allowed = allowedOptionsByScope[scope] - .filter((option) => !option.disabled) - .map((option) => option.value) - if (!selectedEvaluation || !router.query.selectedEvaluation) { - setSelectedEvaluation(defaultKey) - return - } - - if (!allowed.includes(selectedEvaluation)) { - const fallback = allowed.includes(defaultKey) ? defaultKey : allowed[0] - setSelectedEvaluation(fallback) - } - }, [ - selectedEvaluation, - defaultKey, - setSelectedEvaluation, - scope, - router.query.selectedEvaluation, - ]) - - const options = allowedOptionsByScope[scope] - - useEffect(() => { - if ( - selectedEvaluation && - selectedEvaluation !== defaultKey && - options.some((option) => option.value === selectedEvaluation && !option.disabled) - ) { - setDefaultKey(selectedEvaluation) - } - }, [selectedEvaluation, defaultKey, setDefaultKey, options]) - - useBreadcrumbsEffect( - { - breadcrumbs: - scope === "app" - ? {appPage: {label: formatLabel(selectedEvaluation)}} - : {projectPage: {label: formatLabel(selectedEvaluation)}}, - type: "append", - condition: !!selectedEvaluation, - }, - [selectedEvaluation, scope, router.asPath], - ) - - const renderPage = useMemo(() => { - switch (selectedEvaluation) { - case "human_annotation": - return - case "human_ab_testing": - return scope === "app" ? ( - - ) : ( - - ) - case "online_evaluation": - return - case "custom_evaluation": - return - case "auto_evaluation": - default: - return - } - }, [selectedEvaluation, scope]) - - return ( -
    -
    - Evaluations -
    -
    - ({ - label: o.label, - key: o.value, - disabled: o.disabled, - }))} - activeKey={selectedEvaluation} - onChange={(key) => { - if (options.find((option) => option.value === key)?.disabled) return - setSelectedEvaluation(key) - }} - /> -
    - -
    {renderPage}
    -
    - ) -} - -export default EvaluationsView diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/AdvancedSettings.tsx b/web/oss/src/components/pages/evaluations/NewEvaluation/Components/AdvancedSettings.tsx deleted file mode 100644 index 4edb5403b0..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/AdvancedSettings.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import {memo, useCallback, useMemo} from "react" - -import {QuestionCircleOutlined} from "@ant-design/icons" -import {Button, Col, Flex, Form, Input, InputNumber, Row, Tooltip, Typography} from "antd" -import deepEqual from "fast-deep-equal" - -import {DEFAULT_ADVANCE_SETTINGS} from "../assets/constants" -import {AdvancedSettingsProps} from "../types" - -const AdvancedSettings = ({advanceSettings, setAdvanceSettings}: AdvancedSettingsProps) => { - const handleChange = (key: string, value: any) => { - setAdvanceSettings((prev) => ({ - ...prev, - [key]: value, - })) - } - - const handleResetDefaults = useCallback(() => { - setAdvanceSettings(DEFAULT_ADVANCE_SETTINGS) - }, []) - - const isAdvancedSettingsChanged = useMemo( - () => !deepEqual(advanceSettings, DEFAULT_ADVANCE_SETTINGS), - [advanceSettings], - ) - - const {correct_answer_column, ...rateLimitConfig} = advanceSettings - - return ( - - - - - Rate Limit Configuration - - {isAdvancedSettingsChanged && ( - - )} -
    - } - style={{marginBottom: 0}} - > - - {Object.entries(rateLimitConfig).map(([key, value]) => ( -
    - - {key - .replace(/_/g, " ") - .replace(/\b\w/g, (c) => c.toUpperCase())} -   - - - - - } - rules={[ - { - validator: (_, value) => { - if (value !== null) { - return Promise.resolve() - } - return Promise.reject("This field is required") - }, - }, - ]} - > - handleChange(key, value)} - style={{width: "100%"}} - min={0} - /> - - - ))} - - - - Correct Answer Column  - - - - - } - > - handleChange("correct_answer_column", e.target.value)} - style={{width: "50%"}} - /> - - - - ) -} - -export default memo(AdvancedSettings) diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/NewEvaluationModalContent.tsx b/web/oss/src/components/pages/evaluations/NewEvaluation/Components/NewEvaluationModalContent.tsx deleted file mode 100644 index 74ea54ce8b..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/NewEvaluationModalContent.tsx +++ /dev/null @@ -1,321 +0,0 @@ -import {type FC, memo, useCallback, useMemo} from "react" - -import {CloseCircleOutlined} from "@ant-design/icons" -import {Input, Typography, Tabs, Tag} from "antd" -import clsx from "clsx" -import dynamic from "next/dynamic" - -import useFocusInput from "@/oss/hooks/useFocusInput" -import useURL from "@/oss/hooks/useURL" - -import {useStyles} from "../assets/styles" -import TabLabel from "../assets/TabLabel" -import {NewEvaluationModalContentProps} from "../types" - -import SelectAppSection from "./SelectAppSection" - -const SelectEvaluatorSection = dynamic( - () => import("./SelectEvaluatorSection/SelectEvaluatorSection"), - {ssr: false}, -) - -const SelectTestsetSection = dynamic(() => import("./SelectTestsetSection"), { - ssr: false, -}) - -const SelectVariantSection = dynamic(() => import("./SelectVariantSection"), { - ssr: false, -}) - -const AdvancedSettings = dynamic(() => import("./AdvancedSettings"), { - ssr: false, -}) - -const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { - ssr: false, -}) - -const NewEvaluationModalContent: FC = ({ - onSuccess, - handlePanelChange, - activePanel, - selectedTestsetId, - setSelectedTestsetId, - selectedVariantRevisionIds, - setSelectedVariantRevisionIds, - selectedEvalConfigs, - setSelectedEvalConfigs, - evaluationName, - setEvaluationName, - preview, - evaluationType, - testsets, - variants, - variantsLoading, - evaluators, - evaluatorConfigs, - advanceSettings, - setAdvanceSettings, - appOptions, - selectedAppId, - onSelectApp, - appSelectionDisabled, - ...props -}) => { - const classes = useStyles() - const {inputRef} = useFocusInput({isOpen: props.isOpen || false}) - const {redirectUrl} = useURL() - const appSelectionComplete = Boolean(selectedAppId) - const hasAppOptions = appOptions.length > 0 - - const handleCreateApp = useCallback(() => { - redirectUrl() - }, [redirectUrl]) - - const selectedTestset = useMemo( - () => testsets.find((ts) => ts._id === selectedTestsetId) || null, - [testsets, selectedTestsetId], - ) - - const selectedVariants = useMemo( - () => variants?.filter((v) => selectedVariantRevisionIds.includes(v.id)) || [], - [variants, selectedVariantRevisionIds], - ) - - const selectedEvalConfig = useMemo(() => { - const source = preview ? (evaluators as any[]) : (evaluatorConfigs as any[]) - return source.filter((cfg) => selectedEvalConfigs.includes(cfg.id)) - }, [preview, evaluators, evaluatorConfigs, selectedEvalConfigs]) - - const items = useMemo(() => { - const requireAppMessage = ( - - Select an application first to load this section. - - ) - - return [ - { - key: "appPanel", - label: ( - - {appSelectionComplete && ( - } - onClose={() => { - if (!appSelectionDisabled) onSelectApp("") - }} - > - {appOptions.find((opt) => opt.value === selectedAppId)?.label ?? - selectedAppId} - - )} - - ), - children: ( -
    - {hasAppOptions ? ( - <> - - {!appSelectionComplete && !appSelectionDisabled ? ( - - Please select an application to continue configuring the - evaluation. - - ) : null} - - ) : ( - - )} -
    - ), - }, - { - key: "variantPanel", - label: ( - 0}> - {selectedVariants.map((v) => ( - } - onClose={() => { - setSelectedVariantRevisionIds( - selectedVariantRevisionIds.filter((id) => id !== v.id), - ) - }} - > - {`${v.variantName} - v${v.revision}`} - - ))} - - ), - children: appSelectionComplete ? ( - - ) : ( - requireAppMessage - ), - }, - { - key: "testsetPanel", - label: ( - - {selectedTestset ? ( - } - onClose={() => { - setSelectedTestsetId("") - }} - > - {selectedTestset.name} - - ) : null} - - ), - children: appSelectionComplete ? ( - - ) : ( - requireAppMessage - ), - }, - { - key: "evaluatorPanel", - label: ( - 0}> - {selectedEvalConfig.map((cfg: any) => { - return ( - } - color={cfg.color} - onClose={() => { - setSelectedEvalConfigs( - selectedEvalConfigs.filter((id) => id !== cfg.id), - ) - }} - > - {cfg.name} - - ) - })} - - ), - children: appSelectionComplete ? ( - - ) : ( - requireAppMessage - ), - }, - ...(evaluationType === "auto" - ? [ - { - key: "advancedSettingsPanel", - label: ( - - {Object.entries(advanceSettings).map(([key, value]) => ( - - {key}: {value} - - ))} - - ), - children: appSelectionComplete ? ( - - ) : ( - requireAppMessage - ), - }, - ] - : []), - ] - }, [ - selectedTestset, - selectedVariants, - selectedEvalConfig, - handlePanelChange, - selectedTestsetId, - selectedVariantRevisionIds, - selectedEvalConfigs, - preview, - evaluationType, - testsets, - variants, - evaluators, - evaluatorConfigs, - advanceSettings, - appSelectionComplete, - appOptions, - selectedAppId, - onSelectApp, - appSelectionDisabled, - hasAppOptions, - handleCreateApp, - ]) - - return ( -
    -
    - Evaluation name - { - setEvaluationName(e.target.value) - }} - /> -
    - - -
    - ) -} - -export default memo(NewEvaluationModalContent) diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectAppSection.tsx b/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectAppSection.tsx deleted file mode 100644 index 2275dc4380..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectAppSection.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import {HTMLProps, ReactNode, useMemo} from "react" - -import {Table, Tag, Typography} from "antd" -import type {ColumnsType} from "antd/es/table" - -import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" - -import type {NewEvaluationAppOption} from "../types" - -const formatAppType = (type?: string | null) => { - if (!type) return null - const normalized = type.replace(/_/g, " ") - return normalized.charAt(0).toUpperCase() + normalized.slice(1) -} - -interface SelectAppSectionProps extends HTMLProps { - apps: NewEvaluationAppOption[] - selectedAppId: string - onSelectApp: (value: string) => void - disabled?: boolean - emptyText?: ReactNode -} - -const SelectAppSection = ({ - apps, - selectedAppId, - onSelectApp, - disabled, - className, - emptyText, -}: SelectAppSectionProps) => { - const columns: ColumnsType = useMemo(() => { - return [ - { - title: "Application", - dataIndex: "label", - key: "label", - render: (value: string) => {value}, - }, - { - title: "Type", - dataIndex: "type", - key: "type", - width: 160, - render: (value: string | null | undefined) => { - const label = formatAppType(value) - return label ? ( - {label} - ) : ( - - ) - }, - }, - { - title: "Created", - dataIndex: "createdAt", - key: "createdAt", - width: 240, - render: (value: string, record) => { - const displayDate = value || record.updatedAt || "" - return displayDate ? ( - - {formatDay({date: displayDate, outputFormat: "DD MMM YYYY | h:mm a"})} - - ) : ( - - ) - }, - }, - ] - }, []) - - const dataSource = useMemo( - () => - apps.map((app) => ({ - key: app.value, - ...app, - })), - [apps], - ) - - return ( -
    -
    (disabled ? "" : "cursor-pointer")} - onRow={(record) => ({ - onClick: () => { - if (disabled || record.value === selectedAppId) return - onSelectApp(record.value) - }, - })} - rowSelection={{ - type: "radio", - columnWidth: 48, - selectedRowKeys: selectedAppId ? [selectedAppId] : [], - onChange: (selectedRowKeys) => { - if (disabled) return - const [key] = selectedRowKeys - onSelectApp(key as string) - }, - getCheckboxProps: () => ({disabled}), - }} - locale={{ - emptyText: - emptyText ?? - (disabled - ? "Application selection is locked in app scope" - : "No applications available"), - }} - /> - - ) -} - -export default SelectAppSection diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectEvaluatorSection/SelectEvaluatorSection.tsx b/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectEvaluatorSection/SelectEvaluatorSection.tsx deleted file mode 100644 index e0d3ff065d..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectEvaluatorSection/SelectEvaluatorSection.tsx +++ /dev/null @@ -1,315 +0,0 @@ -import {memo, useEffect, useMemo, useRef, useState} from "react" - -import {PlusOutlined} from "@ant-design/icons" -import {Button, Input, Table, Tag, Space} from "antd" -import {ColumnsType} from "antd/es/table" -import clsx from "clsx" -import dynamic from "next/dynamic" -import router from "next/router" - -import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" -import useURL from "@/oss/hooks/useURL" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" -import {Evaluator, EvaluatorConfig} from "@/oss/lib/Types" - -import type {SelectEvaluatorSectionProps} from "../../types" - -const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { - ssr: false, -}) - -const EvaluatorMetrics = memo(({evaluator}: {evaluator: EvaluatorDto<"response">}) => { - const metrics = getMetricsFromEvaluator(evaluator) - return ( -
    - {Object.entries(metrics).map(([key, value]) => { - return ( - - {key} - - ) - })} -
    - ) -}) - -// Use a generic type variable Preview and conditionally type filteredEvalConfigs -const SelectEvaluatorSection = ({ - selectedEvalConfigs, - setSelectedEvalConfigs, - className, - handlePanelChange, - preview, - evaluators: propsEvaluators, - evaluatorConfigs: propsEvaluatorConfigs, - selectedAppId, - ...props -}: SelectEvaluatorSectionProps & {preview?: Preview}) => { - const {projectURL} = useURL() - const fetchData = useFetchEvaluatorsData({ - preview: preview as boolean, - queries: {is_human: preview}, - appId: selectedAppId || "", - }) - const evaluatorsRegistryUrl = useMemo( - () => `${projectURL}/evaluators?tab=${preview ? "human" : "automatic"}`, - [projectURL, preview], - ) - - const evaluationData = useMemo(() => { - if (preview) { - const evaluators = (propsEvaluators || - fetchData.evaluatorsSwr.data || - []) as EvaluatorDto<"response">[] - const evaluatorConfigs = evaluators - const isLoadingEvaluators = fetchData.isLoadingEvaluators - const isLoadingEvaluatorConfigs = fetchData.isLoadingEvaluatorConfigs - return {evaluators, evaluatorConfigs, isLoadingEvaluators, isLoadingEvaluatorConfigs} - } else { - const evaluators = propsEvaluators?.length - ? propsEvaluators - : ((fetchData.evaluatorsSwr.data || []) as Evaluator[]) - const evaluatorConfigs = (propsEvaluatorConfigs || - fetchData.evaluatorConfigsSwr.data || - []) as EvaluatorConfig[] - const isLoadingEvaluators = fetchData.isLoadingEvaluators - const isLoadingEvaluatorConfigs = fetchData.isLoadingEvaluatorConfigs - return {evaluators, evaluatorConfigs, isLoadingEvaluators, isLoadingEvaluatorConfigs} - } - }, [fetchData, preview, propsEvaluators, propsEvaluatorConfigs]) - - const {evaluators, evaluatorConfigs, isLoadingEvaluators, isLoadingEvaluatorConfigs} = - evaluationData - - const [searchTerm, setSearchTerm] = useState("") - const prevSelectedAppIdRef = useRef() - const {refetchEvaluatorConfigs} = fetchData - - useEffect(() => { - if (!selectedAppId) { - prevSelectedAppIdRef.current = selectedAppId - return - } - - if (prevSelectedAppIdRef.current === selectedAppId) { - return - } - - prevSelectedAppIdRef.current = selectedAppId - refetchEvaluatorConfigs() - }, [selectedAppId, refetchEvaluatorConfigs]) - - useEffect(() => { - if (isLoadingEvaluators || isLoadingEvaluatorConfigs) return - - const availableIds = new Set( - (preview - ? (evaluators as EvaluatorDto<"response">[]) - : (evaluatorConfigs as EvaluatorConfig[]) - ).map((config) => config.id), - ) - - setSelectedEvalConfigs((prevSelected) => { - const nextSelected = prevSelected.filter((id) => availableIds.has(id)) - return nextSelected.length === prevSelected.length ? prevSelected : nextSelected - }) - }, [ - preview, - evaluators, - evaluatorConfigs, - isLoadingEvaluators, - isLoadingEvaluatorConfigs, - setSelectedEvalConfigs, - ]) - - const columnsPreview: ColumnsType> = useMemo( - () => [ - { - title: "Name", - dataIndex: "name", - key: "name", - render: (_, record: EvaluatorDto<"response">) => { - return
    {record.name}
    - }, - }, - { - title: "Slug", - dataIndex: "slug", - key: "slug", - render: (_, record: EvaluatorDto<"response">) => { - return
    {record.slug}
    - }, - }, - { - title: "Metrics", - dataIndex: "data", - key: "data", - render: (_, record: EvaluatorDto<"response">) => ( - - ), - }, - ], - [], - ) - - const columnsConfig: ColumnsType = useMemo( - () => [ - { - title: "Name", - dataIndex: "name", - key: "name", - render: (_, record: EvaluatorConfig) => { - return
    {record.name}
    - }, - }, - { - title: "Type", - dataIndex: "type", - key: "type", - render: (x, record: EvaluatorConfig) => { - // Find the evaluator by key to display its name - const evaluator = (evaluators as Evaluator[]).find( - (item) => item.key === record.evaluator_key, - ) - return {evaluator?.name} - }, - }, - ], - [evaluators], - ) - - // Conditionally type filteredEvalConfigs based on Preview - const filteredEvalConfigs: Preview extends true - ? EvaluatorDto<"response">[] - : EvaluatorConfig[] = useMemo(() => { - if (preview) { - // Explicitly narrow types for Preview = true - const data = evaluators as EvaluatorDto<"response">[] - if (!searchTerm) return data - return data.filter((item) => - item.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) as any - } else { - // Explicitly narrow types for Preview = false - const data = evaluatorConfigs as EvaluatorConfig[] - if (!searchTerm) return data - return data.filter((item) => - item.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) as any - } - }, [searchTerm, evaluatorConfigs, preview, evaluators]) - - const selectedEvalConfig = useMemo( - () => evaluatorConfigs.filter((config) => selectedEvalConfigs.includes(config.id)), - [evaluatorConfigs, selectedEvalConfigs], - ) - - const onSelectEvalConfig = (selectedRowKeys: React.Key[]) => { - const currentSelected = new Set(selectedEvalConfigs) - const configs = filteredEvalConfigs as EvaluatorDto<"response">[] - configs.forEach((item) => { - if (selectedRowKeys.includes(item.id)) { - currentSelected.add(item.id) - } else { - currentSelected.delete(item.id) - } - }) - setSelectedEvalConfigs(Array.from(currentSelected)) - } - - return ( - <> -
    -
    - setSearchTerm(e.target.value)} - /> - - - -
    - - {filteredEvalConfigs.length === 0 ? ( - router.push(evaluatorsRegistryUrl)} - /> - ) : preview ? ( - > - rowSelection={{ - type: "checkbox", - columnWidth: 48, - selectedRowKeys: selectedEvalConfigs, - onChange: (selectedRowKeys) => { - onSelectEvalConfig(selectedRowKeys) - }, - }} - onRow={(record) => ({ - style: {cursor: "pointer"}, - onClick: () => { - if (selectedEvalConfigs.includes(record.id)) { - onSelectEvalConfig( - selectedEvalConfigs.filter((id) => id !== record.id), - ) - } else { - onSelectEvalConfig([...selectedEvalConfigs, record.id]) - } - }, - })} - className="ph-no-capture" - columns={columnsPreview} - rowKey={"id"} - dataSource={filteredEvalConfigs as EvaluatorDto<"response">[]} - scroll={{x: true}} - bordered - pagination={false} - /> - ) : ( - - rowSelection={{ - type: "checkbox", - columnWidth: 48, - selectedRowKeys: selectedEvalConfigs, - onChange: (selectedRowKeys) => { - onSelectEvalConfig(selectedRowKeys) - }, - }} - onRow={(record) => ({ - style: {cursor: "pointer"}, - onClick: () => { - if (selectedEvalConfigs.includes(record.id)) { - onSelectEvalConfig( - selectedEvalConfigs.filter((id) => id !== record.id), - ) - } else { - onSelectEvalConfig([...selectedEvalConfigs, record.id]) - } - }, - })} - className="ph-no-capture" - columns={columnsConfig} - rowKey={"id"} - dataSource={filteredEvalConfigs as EvaluatorConfig[]} - scroll={{x: true, y: 455}} - bordered - pagination={false} - /> - )} -
    - - ) -} - -export default memo(SelectEvaluatorSection) diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectTestsetSection.tsx b/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectTestsetSection.tsx deleted file mode 100644 index a49664e493..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/Components/SelectTestsetSection.tsx +++ /dev/null @@ -1,366 +0,0 @@ -import {memo, useCallback, useEffect, useMemo, useState} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {Input, Tooltip, Typography} from "antd" -import Table, {ColumnsType} from "antd/es/table" -import clsx from "clsx" -import dayjs from "dayjs" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" - -import {useTestsetInputsAnalysis} from "@/oss/components/Playground/Components/Modals/LoadTestsetModal/hooks/useTestsetInputsAnalysis" -import { - displayedVariantsVariablesAtom, - schemaInputKeysAtom, -} from "@/oss/components/Playground/state/atoms/variants" -import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" -import {testset} from "@/oss/lib/Types" -import {fetchTestset} from "@/oss/services/testsets/api" -import {stablePromptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {useTestsetsData} from "@/oss/state/testset" -import {appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" - -import type {SelectTestsetSectionProps} from "../types" - -const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { - ssr: false, -}) - -const SelectTestsetSection = ({ - testsets: propsTestsets, - selectedTestsetId, - setSelectedTestsetId, - handlePanelChange, - selectedVariantRevisionIds, - className, - ...props -}: SelectTestsetSectionProps) => { - const [searchTerm, setSearchTerm] = useState("") - const {testsets: fetchedTestsets, columnsByTestsetId} = useTestsetsData() - const testsets = useMemo(() => { - return propsTestsets && propsTestsets.length > 0 ? propsTestsets : fetchedTestsets || [] - }, [propsTestsets, fetchedTestsets]) - - // Stable flag for whether any revision is selected - const hasSelectedRevision = useMemo( - () => (selectedVariantRevisionIds?.length ?? 0) > 0, - [selectedVariantRevisionIds], - ) - - // Derive expected input variables from schema/dynamic vars (no dataset needed here) - const appUriInfo = useAtomValue(appUriInfoAtom) - const routePath = appUriInfo?.routePath - const displayedVariables = useAtomValue(displayedVariantsVariablesAtom) - const schemaInputKeys = useAtomValue(schemaInputKeysAtom) - const selectedRevisionId = hasSelectedRevision ? selectedVariantRevisionIds[0] : undefined - const eeDisplayedVars = useAtomValue( - useMemo( - () => - selectedRevisionId - ? stablePromptVariablesAtomFamily(selectedRevisionId) - : stablePromptVariablesAtomFamily("") /* empty, returns [] */, - [selectedRevisionId], - ), - ) - const {expectedInputVariables} = useTestsetInputsAnalysis({ - routePath, - testsetCsvData: [], - displayedVariablesOverride: (hasSelectedRevision - ? (eeDisplayedVars as string[]) - : (displayedVariables as string[] | undefined)) as string[] | undefined, - schemaInputKeysOverride: schemaInputKeys as string[] | undefined, - }) - - const expectedVariables = useMemo( - () => - (expectedInputVariables || []) - .map((variable) => (typeof variable === "string" ? variable.trim() : "")) - .filter(Boolean), - [expectedInputVariables], - ) - - const hasExpectedVariables = expectedVariables.length > 0 - - const queryClient = useQueryClient() - - useEffect(() => { - if (!hasSelectedRevision || !hasExpectedVariables) return - if (!Array.isArray(testsets) || testsets.length === 0) return - - const pending = testsets.filter((ts) => { - const cols = columnsByTestsetId?.[ts._id] - return !Array.isArray(cols) || cols.length === 0 - }) - - if (!pending.length) return - - let cancelled = false - const BATCH_SIZE = 5 - - const prefetchColumns = async () => { - for (let index = 0; index < pending.length && !cancelled; index += BATCH_SIZE) { - const chunk = pending.slice(index, index + BATCH_SIZE) - await Promise.all( - chunk.map(async (ts) => { - if (!ts?._id) return - const queryKey = ["testsetCsvData", ts._id] - const existing = queryClient.getQueryData(queryKey) - if (existing) return - try { - const csvdata = await queryClient.fetchQuery({ - queryKey, - queryFn: async () => { - const data = await fetchTestset(ts._id) - return Array.isArray(data?.csvdata) ? data.csvdata : [] - }, - }) - if (!cancelled && (!csvdata || (csvdata as any[]).length === 0)) { - // ensure we still notify listeners to re-run diagnostics - queryClient.setQueryData(queryKey, csvdata) - } - } catch { - // swallow errors; diagnostics will treat as unknown columns - } - }), - ) - } - } - - prefetchColumns() - return () => { - cancelled = true - } - }, [columnsByTestsetId, hasExpectedVariables, hasSelectedRevision, queryClient, testsets]) - - // Determine disabled state and tooltip for each testset based on known columns - const compatibilityByTestset = useMemo(() => { - const diagnostics: Record< - string, - { - columns: string[] - columnsKnown: boolean - missingExpected: string[] - matched: string[] - hasWarning: boolean - message?: string - } - > = {} - - const expectedLabel = expectedVariables.join(", ") - - ;(testsets || []).forEach((ts) => { - const cols = columnsByTestsetId?.[ts._id] - const columnsKnown = Array.isArray(cols) - const trimmedColumns = columnsKnown - ? (cols as string[]) - .map((column) => (typeof column === "string" ? column.trim() : "")) - .filter(Boolean) - : [] - - const columnsLower = new Set(trimmedColumns.map((column) => column.toLowerCase())) - - const missingExpected = - columnsKnown && hasSelectedRevision && hasExpectedVariables - ? expectedVariables.filter( - (variable) => !columnsLower.has(variable.toLowerCase()), - ) - : [] - - const matched = - columnsKnown && hasSelectedRevision && hasExpectedVariables - ? expectedVariables.filter((variable) => - columnsLower.has(variable.toLowerCase()), - ) - : [] - - const hasWarning = missingExpected.length > 0 - - let message: string | undefined - - if (hasSelectedRevision && hasExpectedVariables) { - if (!columnsKnown) { - message = "Analyzing columns..." - } else if (hasWarning) { - const variantList = expectedVariables.length ? expectedLabel : "—" - message = `The testset has no CSV columns matching the expected variables {{${variantList}}}` - } - } - - diagnostics[ts._id] = { - columns: trimmedColumns, - columnsKnown, - missingExpected, - matched, - hasWarning, - message, - } - }) - - return diagnostics - }, [columnsByTestsetId, hasExpectedVariables, hasSelectedRevision, expectedVariables, testsets]) - - const getTestsetMessage = useCallback( - (testsetId: string) => compatibilityByTestset[testsetId]?.message, - [compatibilityByTestset], - ) - - const selectedTestsetMessage = useMemo(() => { - if (!selectedTestsetId) return undefined - return compatibilityByTestset[selectedTestsetId]?.message - }, [compatibilityByTestset, selectedTestsetId]) - - const columns: ColumnsType = useMemo(() => { - return [ - { - title: "Name", - dataIndex: "name", - key: "name", - onHeaderCell: () => ({ - style: {minWidth: 180}, - }), - render: (_: any, record: testset) => { - const message = getTestsetMessage(record._id) - const content = {record.name} - return message ? {content} : content - }, - }, - { - title: "Date Modified", - dataIndex: "updated_at", - key: "updated_at", - onHeaderCell: () => ({ - style: {minWidth: 180}, - }), - render: (date: string, record: testset) => { - const message = getTestsetMessage(record._id) - const description = formatDay({date, outputFormat: "DD MMM YYYY | h:mm a"}) - return message ? ( - - {description} - - ) : ( - description - ) - }, - }, - { - title: "Date created", - dataIndex: "created_at", - key: "created_at", - onHeaderCell: () => ({ - style: {minWidth: 180}, - }), - render: (date: string, record: testset) => { - const message = getTestsetMessage(record._id) - const description = formatDay({date, outputFormat: "DD MMM YYYY | h:mm a"}) - return message ? ( - - {description} - - ) : ( - description - ) - }, - }, - ] - }, [getTestsetMessage]) - - const filteredTestset = useMemo(() => { - let allTestsets = testsets.sort( - (a: testset, b: testset) => - dayjs(b.updated_at).valueOf() - dayjs(a.updated_at).valueOf(), - ) - if (searchTerm) { - allTestsets = testsets.filter((item: testset) => - item.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) - } - return allTestsets - }, [searchTerm, testsets]) - - const selectedTestset = useMemo( - () => testsets.find((testset) => testset._id === selectedTestsetId) || null, - [selectedTestsetId, testsets], - ) - - return ( -
    -
    - setSearchTerm(e.target.value)} - /> -
    -
    { - return { - title: getTestsetMessage(record._id), - } - }, - renderCell: ( - _: any, - record: testset, - __: number, - originNode: React.ReactNode, - ) => { - const message = getTestsetMessage(record._id) - return message ? ( - - {originNode} - - ) : ( - originNode - ) - }, - onChange: (selectedRowKeys) => { - setSelectedTestsetId(selectedRowKeys[0] as string) - handlePanelChange("evaluatorPanel") - }, - }} - className={`ph-no-capture`} - columns={columns} - dataSource={filteredTestset} - rowKey="_id" - scroll={{x: "max-content", y: 455}} - bordered - pagination={false} - rowClassName={(record) => - clsx( - "cursor-pointer", - compatibilityByTestset[record._id]?.hasWarning && "opacity-70", - ) - } - locale={{ - emptyText: ( - - ), - }} - onRow={(record) => { - const message = getTestsetMessage(record._id) - return { - title: message, - onClick: () => { - if (selectedTestset?._id === record._id) { - setSelectedTestsetId("") - } else { - setSelectedTestsetId(record._id) - handlePanelChange("evaluatorPanel") - } - }, - } - }} - /> - - ) -} - -export default memo(SelectTestsetSection) diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/assets/constants.ts b/web/oss/src/components/pages/evaluations/NewEvaluation/assets/constants.ts deleted file mode 100644 index 746f5d838f..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/assets/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const DEFAULT_ADVANCE_SETTINGS = { - batch_size: 10, - max_retries: 3, - retry_delay: 3, - delay_between_batches: 5, - correct_answer_column: "correct_answer", -} diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/index.tsx b/web/oss/src/components/pages/evaluations/NewEvaluation/index.tsx deleted file mode 100644 index 7aa28f5e12..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/index.tsx +++ /dev/null @@ -1,551 +0,0 @@ -import {useCallback, memo, useEffect, useMemo, useRef, useState} from "react" - -import {getDefaultStore} from "jotai" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" - -import {message} from "@/oss/components/AppMessageContext" -import EnhancedModal from "@/oss/components/EnhancedUIs/Modal" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import {useVaultSecret} from "@/oss/hooks/useVaultSecret" -import {redirectIfNoLLMKeys} from "@/oss/lib/helpers/utils" -import useAppVariantRevisions from "@/oss/lib/hooks/useAppVariantRevisions" -import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" -import usePreviewEvaluations from "@/oss/lib/hooks/usePreviewEvaluations" -import {extractInputKeysFromSchema} from "@/oss/lib/shared/variant/inputHelpers" -import {createEvaluation} from "@/oss/services/evaluations/api" -import {fetchTestset} from "@/oss/services/testsets/api" -import {useAppsData} from "@/oss/state/app/hooks" -import {stablePromptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {useTestsetsData} from "@/oss/state/testset" -import {appSchemaAtom, appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" - -import {buildEvaluationNavigationUrl} from "../utils" - -import {DEFAULT_ADVANCE_SETTINGS} from "./assets/constants" -import {useStyles} from "./assets/styles" -import type {LLMRunRateLimitWithCorrectAnswer, NewEvaluationModalGenericProps} from "./types" - -const NewEvaluationModalContent = dynamic(() => import("./Components/NewEvaluationModalContent"), { - ssr: false, -}) - -const NewEvaluationModal = ({ - onSuccess, - preview = false as Preview, - evaluationType, - ...props -}: NewEvaluationModalGenericProps) => { - const classes = useStyles() - const appId = useAppId() - const isAppScoped = Boolean(appId) - const {apps: availableApps = []} = useAppsData() - const [selectedAppId, setSelectedAppId] = useState(appId || "") - const appOptions = useMemo(() => { - const options = availableApps.map((app) => ({ - label: app.app_name, - value: app.app_id, - type: app.app_type ?? null, - createdAt: app.created_at ?? null, - updatedAt: app.updated_at ?? null, - })) - if (selectedAppId && !options.some((opt) => opt.value === selectedAppId)) { - options.push({ - label: selectedAppId, - value: selectedAppId, - type: null, - createdAt: null, - updatedAt: null, - }) - } - return options - }, [availableApps, selectedAppId]) - const router = useRouter() - const {baseAppURL, projectURL} = useURL() - - // Fetch evaluation data - const evaluationData = useFetchEvaluatorsData({ - preview, - queries: {is_human: evaluationType === "human"}, - appId: selectedAppId || "", - }) - - // Use useMemo to derive evaluators, evaluatorConfigs, and loading flags based on preview flag - const {evaluators, evaluatorConfigs, loadingEvaluators, loadingEvaluatorConfigs} = - useMemo(() => { - if (preview) { - return { - evaluators: evaluationData.evaluatorsSwr?.data || [], - evaluatorConfigs: [], - loadingEvaluators: evaluationData.evaluatorsSwr?.isLoading ?? false, - loadingEvaluatorConfigs: false, - } - } else { - return { - evaluators: [], - evaluatorConfigs: evaluationData.evaluatorConfigsSwr?.data || [], - loadingEvaluators: false, - loadingEvaluatorConfigs: evaluationData.evaluatorConfigsSwr?.isLoading ?? false, - } - } - }, [ - preview, - evaluationData.evaluatorsSwr?.data, - evaluationData.evaluatorsSwr?.isLoading, - evaluationData.evaluatorConfigsSwr?.data, - evaluationData.evaluatorConfigsSwr?.isLoading, - ]) - - const [submitLoading, setSubmitLoading] = useState(false) - const [selectedTestsetId, setSelectedTestsetId] = useState("") - const [selectedVariantRevisionIds, setSelectedVariantRevisionIds] = useState([]) - const [selectedEvalConfigs, setSelectedEvalConfigs] = useState([]) - const [activePanel, setActivePanel] = useState( - isAppScoped ? "variantPanel" : "appPanel", - ) - const [evaluationName, setEvaluationName] = useState("") - const [nameFocused, setNameFocused] = useState(false) - const [advanceSettings, setAdvanceSettings] = - useState(DEFAULT_ADVANCE_SETTINGS) - - useEffect(() => { - if (isAppScoped) { - setSelectedAppId(appId || "") - } else if (!props.open) { - setSelectedAppId("") - } - }, [appId, isAppScoped, props.open]) - - useEffect(() => { - if (!props.open) return - if (!isAppScoped) return - if (!selectedAppId) return - if (activePanel !== "appPanel") return - setActivePanel("variantPanel") - }, [props.open, isAppScoped, selectedAppId, activePanel]) - - const handleAppSelection = useCallback( - (value: string) => { - if (value === selectedAppId) return - setSelectedAppId(value) - setSelectedTestsetId("") - setSelectedVariantRevisionIds([]) - setSelectedEvalConfigs([]) - setEvaluationName("") - setActivePanel("variantPanel") - setAdvanceSettings(DEFAULT_ADVANCE_SETTINGS) - }, - [ - selectedAppId, - isAppScoped, - setSelectedTestsetId, - setSelectedVariantRevisionIds, - setSelectedEvalConfigs, - setEvaluationName, - setActivePanel, - setAdvanceSettings, - ], - ) - - const {variants: appVariantRevisions, isLoading: variantsLoading} = useAppVariantRevisions( - selectedAppId || null, - ) - const filteredVariants = useMemo(() => { - if (!selectedAppId) return [] - return appVariantRevisions || [] - }, [appVariantRevisions, selectedAppId]) - - const {createNewRun: createPreviewEvaluationRun} = usePreviewEvaluations({ - appId: selectedAppId || appId, - }) - const {testsets, isLoading: testsetsLoading} = useTestsetsData() - - const {secrets} = useVaultSecret() - - const handlePanelChange = useCallback((key: string | string[]) => { - setActivePanel(key as string) - }, []) - - const afterClose = useCallback(() => { - props?.afterClose?.() - setEvaluationName("") - setSelectedEvalConfigs([]) - setSelectedTestsetId("") - setSelectedVariantRevisionIds([]) - setAdvanceSettings(DEFAULT_ADVANCE_SETTINGS) - setActivePanel("appPanel") - if (!isAppScoped) { - setSelectedAppId("") - } - }, [props?.afterClose, isAppScoped]) - - // Track focus on any input within modal to avoid overriding user typing - useEffect(() => { - function handleFocusIn(e: FocusEvent) { - if ((e.target as HTMLElement).tagName === "INPUT") { - setNameFocused(true) - } - } - function handleFocusOut(e: FocusEvent) { - if ((e.target as HTMLElement).tagName === "INPUT") { - setNameFocused(false) - } - } - document.addEventListener("focusin", handleFocusIn) - document.addEventListener("focusout", handleFocusOut) - return () => { - document.removeEventListener("focusin", handleFocusIn) - document.removeEventListener("focusout", handleFocusOut) - } - }, []) - - // Memoised base (deterministic) part of generated name (without random suffix) - const generatedNameBase = useMemo(() => { - if (!selectedVariantRevisionIds.length || !selectedTestsetId) return "" - const variant = filteredVariants?.find((v) => selectedVariantRevisionIds.includes(v.id)) - const testset = testsets?.find((ts) => ts._id === selectedTestsetId) - if (!variant || !testset) return "" - return `${variant.variantName}-v${variant.revision}-${testset.name}` - }, [selectedVariantRevisionIds, selectedTestsetId, filteredVariants, testsets]) - - // Auto-generate / update evaluation name intelligently to avoid loops - const lastAutoNameRef = useRef("") - const lastBaseRef = useRef("") - const randomWordRef = useRef("") - - // Generate a short, readable random suffix (stable per modal open) - const genRandomWord = () => { - // Prefer Web Crypto for better entropy - const n = globalThis.crypto?.getRandomValues?.(new Uint32Array(1))?.[0] ?? 0 - if (n) return n.toString(36).slice(0, 5) - // Fallback to Math.random - return Math.random().toString(36).slice(2, 7) - } - - useEffect(() => { - if (!props.open) return - // New random suffix per open, and reset last suggestion trackers - randomWordRef.current = genRandomWord() - lastAutoNameRef.current = "" - lastBaseRef.current = "" - return () => { - randomWordRef.current = "" - } - }, [props.open]) - useEffect(() => { - if (!generatedNameBase) return - if (nameFocused) return // user typing - - // When base (variant/testset) changed → generate new suggestion - if (generatedNameBase !== lastBaseRef.current) { - // Ensure we have a random word for this session - if (!randomWordRef.current) randomWordRef.current = genRandomWord() - const randomWord = randomWordRef.current - const newName = `${generatedNameBase}-${randomWord}` - const shouldUpdate = !evaluationName || evaluationName === lastAutoNameRef.current - lastBaseRef.current = generatedNameBase - lastAutoNameRef.current = newName - if (shouldUpdate) { - setEvaluationName(newName) - } - return - } - - // If user cleared the field (blur) -> restore auto-name - if (!evaluationName) { - setEvaluationName(lastAutoNameRef.current) - } - }, [generatedNameBase, evaluationName, nameFocused, evaluationType]) - - const validateSubmission = useCallback(async () => { - if (!evaluationName) { - message.error("Please enter evaluation name") - return false - } - if (!selectedTestsetId) { - message.error("Please select a testset") - return false - } - if (selectedVariantRevisionIds.length === 0) { - message.error("Please select app variant") - return false - } - if (selectedEvalConfigs.length === 0) { - message.error("Please select evaluator configuration") - return false - } - if ( - !preview && - selectedEvalConfigs.some( - (id) => - evaluatorConfigs.find((config) => config.id === id)?.evaluator_key === - "auto_ai_critique", - ) && - (await redirectIfNoLLMKeys({secrets})) - ) { - message.error("LLM keys are required for AI Critique configuration") - return false - } - - // Validate variant - if (selectedVariantRevisionIds.length > 0) { - const revisions = filteredVariants?.filter((rev) => - selectedVariantRevisionIds.includes(rev.id), - ) - if (!revisions?.length) { - message.error("Please select variant") - return false - } - - const variantInputs = revisions - .map((rev) => { - const store = getDefaultStore() - const flags = store.get(variantFlagsAtomFamily({revisionId: rev.id})) as any - const spec = store.get(appSchemaAtom) as any - const routePath = store.get(appUriInfoAtom)?.routePath || "" - const schemaKeys = spec - ? extractInputKeysFromSchema(spec as any, routePath) - : [] - if (flags?.isCustom) { - // Custom workflows: strictly use schema-defined input keys - return schemaKeys - } - // Non-custom: use stable variables from saved parameters (ignore live edits) - const stableVars = store.get(stablePromptVariablesAtomFamily(rev.id)) || [] - return Array.from(new Set(stableVars)) - }) - .flat() - - const testset = await fetchTestset(selectedTestsetId) - if (!testset) { - message.error("Please select a testset") - return false - } - const testsetColumns = Object.keys(testset?.csvdata[0] || {}) - - if (!testsetColumns.length) { - message.error("Please select a correct testset which has testcases") - return false - } - - // Validate that testset contains required expected answer columns from selected evaluator configs - const missingColumnConfigs = selectedEvalConfigs - .map((configId) => evaluatorConfigs.find((config) => config.id === configId)) - .filter((config) => { - // Only check configs that have a correct_answer_key setting - if (!config?.settings_values?.correct_answer_key) return false - const expectedColumn = config.settings_values.correct_answer_key - return !testsetColumns.includes(expectedColumn) - }) - - if (missingColumnConfigs.length > 0) { - const missingColumns = missingColumnConfigs - .map((config) => config?.settings_values?.correct_answer_key) - .filter(Boolean) - .join(", ") - message.error( - `Please select a testset that has the required expected answer columns: ${missingColumns}`, - ) - return false - } - - if (variantInputs.length > 0) { - const isInputParamsAndTestsetColumnsMatch = variantInputs.every((input) => { - return testsetColumns.includes(input) - }) - if (!isInputParamsAndTestsetColumnsMatch) { - message.error( - "The testset columns do not match the selected variant input parameters", - ) - return false - } - } - } - return true - }, [ - selectedTestsetId, - selectedVariantRevisionIds, - selectedEvalConfigs, - evaluatorConfigs, - secrets, - preview, - evaluationName, - advanceSettings, - filteredVariants, - testsets, - evaluationType, - ]) - - const onSubmit = useCallback(async () => { - setSubmitLoading(true) - try { - if (!(await validateSubmission())) return - - const targetAppId = selectedAppId || appId - if (!targetAppId) { - message.error("Please select an application") - setSubmitLoading(false) - return - } - - const revisions = filteredVariants - const {correct_answer_column, ...rateLimitValues} = advanceSettings - - // Narrow evalDataSource with runtime guards for correct typing - let evalDataSource: typeof evaluatorConfigs | typeof evaluators - if (preview) { - evalDataSource = evaluators - - const selectionData = { - name: evaluationName, - revisions: revisions - ?.filter((rev) => selectedVariantRevisionIds.includes(rev.id)) - .filter(Boolean), - testset: testsets?.find((testset) => testset._id === selectedTestsetId), - evaluators: selectedEvalConfigs - .map((id) => - (evalDataSource || []).find((config) => { - return config.id === id - }), - ) - .filter(Boolean), - rate_limit: rateLimitValues, - correctAnswerColumn: correct_answer_column, - } - - if ( - !selectionData.revisions?.length || - !selectionData.testset || - !selectionData.evaluators?.length || - (evaluationType === "human" && !evaluationName) - ) { - message.error( - `Please select a testset, app variant, ${evaluationType === "human" ? "evaluation name, and" : " and"} evaluator configuration. Missing: ${ - !selectionData.revisions?.length ? "app revision" : "" - } ${!selectionData.testset ? "testset" : ""} ${ - !selectionData.evaluators?.length - ? "evaluators" - : evaluationType === "human" && !evaluationName - ? "evaluation name" - : "" - }`, - ) - setSubmitLoading(false) - return - } else { - const data = await createPreviewEvaluationRun(structuredClone(selectionData)) - - const runId = data.run.runs[0].id - const scope = isAppScoped ? "app" : "project" - const targetPath = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: targetAppId, - path: `/evaluations/single_model_test/${runId}`, - }) - - if (scope === "project") { - router.push({ - pathname: targetPath, - query: targetAppId ? {app_id: targetAppId} : undefined, - }) - } else { - router.push(targetPath) - } - } - } else { - createEvaluation(targetAppId, { - testset_id: selectedTestsetId, - revisions_ids: selectedVariantRevisionIds, - evaluators_configs: selectedEvalConfigs, - rate_limit: rateLimitValues, - correct_answer_column: correct_answer_column, - name: evaluationName, - }) - .then(onSuccess) - .catch(console.error) - .finally(() => { - // refetch - setSubmitLoading(false) - }) - } - } catch (error) { - console.error(error) - setSubmitLoading(false) - } finally { - setSubmitLoading(false) - } - - return - }, [ - appId, - selectedAppId, - selectedTestsetId, - selectedVariantRevisionIds, - selectedEvalConfigs, - advanceSettings, - evaluatorConfigs, - evaluationName, - filteredVariants, - testsets, - evaluators, - preview, - validateSubmission, - createPreviewEvaluationRun, - baseAppURL, - onSuccess, - ]) - - return ( - New {evaluationType === "auto" ? "Auto" : "Human"} Evaluation} - onOk={onSubmit} - okText="Start Evaluation" - maskClosable={false} - width={1200} - className={classes.modalContainer} - confirmLoading={submitLoading} - afterClose={afterClose} - {...props} - > - - - ) -} - -export default memo(NewEvaluationModal) diff --git a/web/oss/src/components/pages/evaluations/NewEvaluation/types.ts b/web/oss/src/components/pages/evaluations/NewEvaluation/types.ts deleted file mode 100644 index f81bf885ef..0000000000 --- a/web/oss/src/components/pages/evaluations/NewEvaluation/types.ts +++ /dev/null @@ -1,94 +0,0 @@ -import type {Dispatch, HTMLProps, SetStateAction} from "react" - -import {ModalProps} from "antd" - -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {LLMRunRateLimit, Evaluator, EvaluatorConfig, testset} from "@/oss/lib/Types" - -export interface NewEvaluationAppOption { - label: string - value: string - type?: string | null - createdAt?: string | null - updatedAt?: string | null -} - -export interface LLMRunRateLimitWithCorrectAnswer extends LLMRunRateLimit { - correct_answer_column: string -} - -export interface NewEvaluationModalProps extends ModalProps { - onSuccess?: () => void - evaluationType: "auto" | "human" - preview?: boolean -} - -export interface NewEvaluationModalContentProps extends HTMLProps { - evaluationType: "auto" | "human" - activePanel: string | null - selectedTestsetId: string - selectedVariantRevisionIds: string[] - selectedEvalConfigs: string[] - evaluationName: string - preview?: boolean - isLoading?: boolean - setSelectedTestsetId: Dispatch> - onSuccess?: () => void - handlePanelChange: (key: string | string[]) => void - setSelectedVariantRevisionIds: Dispatch> - setSelectedEvalConfigs: Dispatch> - setEvaluationName: Dispatch> - isOpen?: boolean - testsets: testset[] - variants?: EnhancedVariant[] - variantsLoading?: boolean - evaluators: Evaluator[] | EvaluatorDto<"response">[] - evaluatorConfigs: EvaluatorConfig[] - advanceSettings: LLMRunRateLimitWithCorrectAnswer - setAdvanceSettings: Dispatch> - appOptions: NewEvaluationAppOption[] - selectedAppId: string - onSelectApp: (value: string) => void - appSelectionDisabled?: boolean -} - -export interface SelectVariantSectionProps extends HTMLProps { - isVariantLoading?: boolean - variants?: EnhancedVariant[] - selectedVariantRevisionIds: string[] - setSelectedVariantRevisionIds: Dispatch> - handlePanelChange: (key: string | string[]) => void - evaluationType: "auto" | "human" - selectedTestsetId?: string -} - -export interface SelectTestsetSectionProps extends HTMLProps { - testsets: testset[] - selectedTestsetId: string - setSelectedTestsetId: Dispatch> - handlePanelChange: (key: string | string[]) => void - preview?: boolean - selectedVariantRevisionIds: string[] -} - -export interface SelectEvaluatorSectionProps extends HTMLProps { - evaluatorConfigs: EvaluatorConfig[] - evaluators: Evaluator[] - selectedEvalConfigs: string[] - setSelectedEvalConfigs: Dispatch> - handlePanelChange: (key: string | string[]) => void - preview?: boolean - selectedAppId?: string -} - -export interface AdvancedSettingsProps { - advanceSettings: LLMRunRateLimitWithCorrectAnswer - setAdvanceSettings: Dispatch> - preview?: boolean -} - -export interface NewEvaluationModalGenericProps - extends Omit { - preview?: Preview -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx deleted file mode 100644 index 5371a12fb4..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx +++ /dev/null @@ -1,327 +0,0 @@ -import {useCallback, useMemo, useState} from "react" - -import {QueryClient, QueryClientProvider} from "@tanstack/react-query" -import {message} from "antd" -import {ColumnsType} from "antd/es/table" -import {useAtom} from "jotai" -import {useRouter} from "next/router" - -import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import {filterColumns} from "@/oss/components/Filters/EditColumns/assets/helper" -import {getColumns} from "@/oss/components/HumanEvaluations/assets/utils" -import {EvaluationRow} from "@/oss/components/HumanEvaluations/types" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import {EvaluationType} from "@/oss/lib/enums" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" -import useEvaluations from "@/oss/lib/hooks/useEvaluations" -import {tempEvaluationAtom} from "@/oss/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom" -import useRunMetricsMap from "@/oss/lib/hooks/useRunMetricsMap" -import {EvaluationStatus} from "@/oss/lib/Types" -import {useAppsData} from "@/oss/state/app" - -import {buildAppScopedUrl, buildEvaluationNavigationUrl, extractEvaluationAppId} from "../utils" - -import AutoEvaluationHeader from "./assets/AutoEvaluationHeader" - -interface AutoEvaluationProps { - viewType?: "overview" | "evaluation" - scope?: "app" | "project" -} - -const AutoEvaluation = ({viewType = "evaluation", scope = "app"}: AutoEvaluationProps) => { - const routeAppId = useAppId() - const activeAppId = scope === "app" ? routeAppId || undefined : undefined - const router = useRouter() - const {baseAppURL, projectURL} = useURL() - - const [selectedRowKeys, setSelectedRowKeys] = useState([]) - - const [selectedEvalRecord, setSelectedEvalRecord] = useState() - const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) - const [isDeletingEvaluations, setIsDeletingEvaluations] = useState(false) - const [hiddenColumns, setHiddenColumns] = useState([]) - const [tempEvaluation, setTempEvaluation] = useAtom(tempEvaluationAtom) - const {apps: availableApps = []} = useAppsData() - - const { - mergedEvaluations: _mergedEvaluations, - isLoadingPreview, - isLoadingLegacy, - refetch, - handleDeleteEvaluations: deleteEvaluations, - previewEvaluations, - } = useEvaluations({ - withPreview: true, - types: [EvaluationType.automatic, EvaluationType.auto_exact_match], - evalType: "auto", - appId: activeAppId, - }) - - const previewAutoEvals = useMemo(() => { - const evals = previewEvaluations.swrData?.data?.runs || [] - if (!evals.length) return [] - - return evals.filter((run) => { - const steps = Array.isArray(run?.data?.steps) ? run.data.steps : [] - const hasOnlyAutoAnnotations = steps.every( - (step) => step?.type !== "annotation" || step?.origin === "auto", - ) - const isLive = run?.flags?.isLive === true || run?.flags?.is_live === true - const source = - typeof run?.meta?.source === "string" ? run.meta.source.toLowerCase() : undefined - const isOnlineSource = source === "online_evaluation_drawer" - return hasOnlyAutoAnnotations && !isLive && !isOnlineSource - }) - }, [previewEvaluations]) - - const mergedEvaluations = useMemo(() => { - const mergedIds = new Set(_mergedEvaluations?.map((e) => e.id)) - const filteredTempEvals = tempEvaluation.filter((e) => !mergedIds.has(e.id)) - return [..._mergedEvaluations, ...filteredTempEvals] - }, [_mergedEvaluations, tempEvaluation]) - - const runIds = useMemo(() => { - return mergedEvaluations - .map((evaluation) => { - const candidate = "id" in evaluation ? evaluation.id : evaluation.key - return typeof candidate === "string" ? candidate.trim() : undefined - }) - .filter((id): id is string => Boolean(id && id.length > 0)) - }, [mergedEvaluations]) - const evaluatorSlugs = useMemo(() => { - const evaSlugs = new Set() - previewAutoEvals.forEach((e) => { - e?.data.steps?.forEach((step) => { - if (step.type === "annotation") { - evaSlugs.add(step.key) - } - }) - }) - return evaSlugs - }, [previewAutoEvals]) - - const {data: runMetricsMap} = useRunMetricsMap(runIds, evaluatorSlugs) - - const resolveAppId = useCallback( - (record: EvaluationRow): string | undefined => { - const candidate = extractEvaluationAppId(record) || activeAppId - return candidate - }, - [activeAppId], - ) - - const isRecordNavigable = useCallback( - (record: EvaluationRow): boolean => { - const status = record.status?.value || record.status - const evaluationId = "id" in record ? record.id : record.key - const recordAppId = resolveAppId(record) - const isActionableStatus = ![ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(status) - return Boolean(isActionableStatus && evaluationId && recordAppId) - }, - [resolveAppId], - ) - - const handleVariantNavigation = useCallback( - ({revisionId, appId: recordAppId}: {revisionId: string; appId?: string}) => { - const targetAppId = recordAppId || activeAppId - if (!targetAppId) { - message.warning("This application's variant is no longer available.") - return - } - - router.push({ - pathname: buildAppScopedUrl(baseAppURL, targetAppId, "/playground"), - query: { - revisions: buildRevisionsQueryParam([revisionId]), - }, - }) - }, - [activeAppId, baseAppURL, router], - ) - - const handleDelete = useCallback( - async (ids: string[]) => { - setIsDeletingEvaluations(true) - try { - await deleteEvaluations(ids) - message.success( - ids.length > 1 ? `${ids.length} Evaluations Deleted` : "Evaluation Deleted", - ) - refetch() - } catch (err) { - message.error("Failed to delete evaluations") - console.error(err) - } finally { - setTempEvaluation((prev) => - prev.length > 0 ? prev.filter((e) => !ids.includes(e?.id)) : [], - ) - setIsDeletingEvaluations(false) - setIsDeleteEvalModalOpen(false) - setSelectedRowKeys([]) - } - }, - [refetch, deleteEvaluations], - ) - - const _columns: ColumnsType = useMemo(() => { - return getColumns({ - evaluations: mergedEvaluations, - onVariantNavigation: handleVariantNavigation, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - runMetricsMap, - evalType: "auto", - scope, - baseAppURL, - extractAppId: extractEvaluationAppId, - projectURL, - resolveAppId, - }) - }, [ - mergedEvaluations, - handleVariantNavigation, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - runMetricsMap, - scope, - baseAppURL, - projectURL, - resolveAppId, - ]) - - const visibleColumns = useMemo( - () => filterColumns(_columns, hiddenColumns), - [_columns, hiddenColumns], - ) - - const selectedEvaluations = useMemo(() => { - return selectedEvalRecord - ? (() => { - const found = mergedEvaluations.find( - (e) => ("id" in e ? e.id : e.key) === selectedEvalRecord?.id, - ) - return found && "name" in found ? found.name : (found?.key ?? "") - })() - : mergedEvaluations - .filter((e) => selectedRowKeys.includes("id" in e ? e.id : e.key)) - .map((e) => ("name" in e ? e.name : e.id)) - .join(" | ") - }, [selectedEvalRecord, selectedRowKeys, mergedEvaluations]) - - const dataSource = useMemo(() => { - return viewType === "overview" ? mergedEvaluations.slice(0, 5) : mergedEvaluations - }, [mergedEvaluations, viewType]) - - return ( -
    - - 0 && !mergedEvaluations?.length) - } - rowSelection={ - viewType === "evaluation" - ? { - type: "checkbox", - columnWidth: 48, - selectedRowKeys, - onChange: (selectedRowKeys: React.Key[]) => { - setSelectedRowKeys(selectedRowKeys) - }, - getCheckboxProps: (record: EvaluationRow) => ({ - disabled: !isRecordNavigable(record), - }), - } - : undefined - } - className="ph-no-capture" - showHorizontalScrollBar={true} - columns={visibleColumns} - rowKey={(record: any) => ("id" in record ? record.id : record.key)} - dataSource={dataSource} - tableLayout="fixed" - virtualized - onRow={(record) => { - const navigable = isRecordNavigable(record) - const recordAppId = resolveAppId(record) - const evaluationId = "id" in record ? record.id : record.key - return { - style: { - cursor: navigable ? "pointer" : "not-allowed", - }, - className: navigable ? undefined : "cursor-not-allowed opacity-60", - onClick: () => { - if (!navigable || !recordAppId || !evaluationId) { - message.warning( - "This evaluation's application is no longer available.", - ) - return - } - - const targetPath = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: recordAppId, - path: `/evaluations/results/${evaluationId}`, - }) - - if (scope === "project") { - router.push({ - pathname: targetPath, - query: recordAppId ? {app_id: recordAppId} : undefined, - }) - } else { - router.push({pathname: targetPath, query: {eval_type: "auto"}}) - } - }, - } - }} - /> - { - setIsDeleteEvalModalOpen(false) - setSelectedEvalRecord(undefined) - }} - onOk={async () => { - const idsToDelete = selectedEvalRecord - ? [selectedEvalRecord.id] - : selectedRowKeys.map((key) => key?.toString()) - await handleDelete(idsToDelete.filter(Boolean)) - }} - evaluationType={selectedEvaluations} - isMultiple={!selectedEvalRecord && selectedRowKeys.length > 0} - /> -
    - ) -} - -export default AutoEvaluation diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/AdvancedSettings.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/AdvancedSettings.tsx deleted file mode 100644 index 213efee7b2..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/AdvancedSettings.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import {CaretRightOutlined, InfoCircleOutlined} from "@ant-design/icons" -import Editor from "@monaco-editor/react" -import { - Form, - Input, - InputNumber, - Switch, - Tooltip, - Collapse, - theme, - AutoComplete, - Select, -} from "antd" -import {createUseStyles} from "react-jss" - -import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" -import {generatePaths} from "@/oss/lib/transformers" - -const useStyles = createUseStyles((theme: any) => ({ - label: { - display: "flex", - alignItems: "center", - gap: "0.5rem", - }, - editor: { - border: `1px solid ${theme.colorBorder}`, - borderRadius: theme.borderRadius, - overflow: "hidden", - }, -})) - -interface AdvancedSettingsProps { - settings: Record[] - selectedTestcase: { - testcase: Record | null - } -} - -const AdvancedSettings: React.FC = ({settings, selectedTestcase}) => { - const classes = useStyles() - const {appTheme} = useAppTheme() - const {token} = theme.useToken() - - return ( - ( - - )} - > - - {settings - .filter((field) => field.type !== "hidden") - .map((field) => { - const rules = [ - {required: field.required ?? true, message: "This field is required"}, - ] - - return ( - - {field.label} - {field.description && ( - - - - )} - - } - initialValue={field.default} - rules={rules} - > - {(field.type === "string" || field.type === "regex") && - selectedTestcase.testcase ? ( - - option!.value - .toUpperCase() - .indexOf(inputValue.toUpperCase()) !== -1 - } - /> - ) : field.type === "string" || field.type === "regex" ? ( - - ) : field.type === "number" ? ( - - ) : field.type === "boolean" || field.type === "bool" ? ( - - ) : field.type === "text" ? ( - - ) : field.type === "code" ? ( - - ) : field.type === "multiple_choice" ? ( - - ) : type === "hidden" ? ( - - ) : type === "messages" ? ( - - ) : type === "number" ? ( - - ) : type === "boolean" || type === "bool" ? ( - - ) : type === "text" ? ( - - ) : type === "code" ? ( - - ) : type === "object" ? ( - - ) : type === "llm_response_schema" ? ( - - ) : null} - - )} - - {ExternalHelpInfo} - - ) -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorVariantModal.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorVariantModal.tsx deleted file mode 100644 index 05cc7ddb77..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/EvaluatorVariantModal.tsx +++ /dev/null @@ -1,734 +0,0 @@ -import { - isValidElement, - useCallback, - useEffect, - useMemo, - useState, - type ComponentProps, - type Dispatch, - type ReactNode, - type SetStateAction, -} from "react" - -import {testsetCsvDataQueryAtomFamily} from "@agenta/oss/src/components/Playground/Components/Modals/LoadTestsetModal/assets/testsetCsvData" -import {CloseCircleOutlined, CloseOutlined} from "@ant-design/icons" -import {Play} from "@phosphor-icons/react" -import {Button, Input, Modal, Tabs, Tag, Tooltip, Typography} from "antd" -import clsx from "clsx" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" -import {createUseStyles} from "react-jss" - -import VariantsTable from "@/oss/components/VariantsComponents/Table" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import useAppVariantRevisions from "@/oss/lib/hooks/useAppVariantRevisions" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import type {JSSTheme, ListAppsItem, Variant} from "@/oss/lib/Types" -import {useAppsData} from "@/oss/state/app/hooks" -import {stablePromptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {useTestsetsData} from "@/oss/state/testset" - -import TabLabel from "../../../NewEvaluation/assets/TabLabel" -import SelectAppSection from "../../../NewEvaluation/Components/SelectAppSection" -import type {NewEvaluationAppOption} from "../../../NewEvaluation/types" - -import {buildVariantFromRevision} from "./variantUtils" - -type EvaluatorVariantModalProps = { - variants: Variant[] | null - setSelectedVariant: Dispatch> - selectedVariant: Variant | null - selectedTestsetId?: string -} & ComponentProps - -interface VariantDiagnostics { - hasWarning: boolean - message?: string - columnsKnown: boolean -} - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - title: { - fontSize: theme.fontSizeHeading4, - lineHeight: theme.lineHeightLG, - fontWeight: theme.fontWeightStrong, - }, - container: { - "& .ant-modal-body": { - height: 600, - }, - }, - tabs: { - height: "100%", - display: "flex", - "& .ant-tabs-nav": { - minWidth: 220, - }, - "& .ant-tabs-nav-list": { - width: "100%", - }, - "& .ant-tabs-content-holder": { - flex: 1, - paddingLeft: theme.padding, - overflow: "auto", - }, - }, - searchRow: { - display: "flex", - justifyContent: "space-between", - }, - tabsContainer: { - height: "100%", - display: "flex", - "& .ant-tabs-content-holder": { - paddingLeft: theme.padding, - flex: 1, - overflow: "auto", - }, - "& .ant-tabs-tab": { - color: theme.colorTextSecondary, - "&:hover": { - backgroundColor: theme.colorInfoBg, - }, - }, - "& .ant-tabs-ink-bar": { - display: "none", - }, - "& .ant-tabs-tab-active": { - backgroundColor: theme.controlItemBgActive, - borderRight: `2px solid ${theme.colorPrimary}`, - color: theme.colorPrimary, - fontWeight: `${theme.fontWeightMedium} !important`, - }, - }, -})) - -const NoResultsFound = dynamic(() => import("@/oss/components/NoResultsFound/NoResultsFound"), { - ssr: false, -}) - -const EvaluatorVariantModal = ({ - variants: _variants, - setSelectedVariant, - selectedVariant, - selectedTestsetId, - ...props -}: EvaluatorVariantModalProps) => { - const classes = useStyles() - const appIdFromRoute = useAppId() - const isAppScoped = Boolean(appIdFromRoute) - const {apps: availableApps = []} = useAppsData() - const {redirectUrl} = useURL() - - const [activePanel, setActivePanel] = useState( - isAppScoped ? "variantPanel" : "appPanel", - ) - const [searchTerm, setSearchTerm] = useState("") - const [appSearchTerm, setAppSearchTerm] = useState("") - const [selectedAppId, setSelectedAppId] = useState("") - const [selectedRowKeys, setSelectedRowKeys] = useState([]) - const [rowDiagnostics, setRowDiagnostics] = useState>({}) - - const appOptions: NewEvaluationAppOption[] = useMemo(() => { - const options = - (availableApps as ListAppsItem[]).map((app) => ({ - label: app.app_name, - value: app.app_id, - type: app.app_type ?? null, - createdAt: app.created_at ?? null, - updatedAt: app.updated_at ?? null, - })) ?? [] - - if (selectedAppId && !options.some((option) => option.value === selectedAppId)) { - options.push({ - label: selectedAppId, - value: selectedAppId, - type: null, - createdAt: null, - updatedAt: null, - }) - } - - return options - }, [availableApps, selectedAppId]) - - const handleCreateApp = useCallback(() => { - redirectUrl() - }, [redirectUrl]) - - const filteredAppOptions = useMemo(() => { - if (!appSearchTerm) return appOptions - return appOptions.filter((option) => - option.label.toLowerCase().includes(appSearchTerm.toLowerCase()), - ) - }, [appOptions, appSearchTerm]) - - const {columnsByTestsetId} = useTestsetsData({enabled: Boolean(props.open)}) - - const testsetCsvQuery = useAtomValue( - useMemo( - () => - testsetCsvDataQueryAtomFamily({ - testsetId: selectedTestsetId || "", - enabled: Boolean(selectedTestsetId && props.open), - }), - [selectedTestsetId, props.open], - ), - ) as any - const testsetCsvData = useMemo( - () => (Array.isArray(testsetCsvQuery?.data) ? (testsetCsvQuery.data as any[]) : []), - [testsetCsvQuery], - ) - - const derivedTestsetColumns = useMemo(() => { - const fromColumns = - selectedTestsetId && columnsByTestsetId?.[selectedTestsetId]?.length - ? (columnsByTestsetId[selectedTestsetId] as string[]) - : [] - - const firstRow = - Array.isArray(testsetCsvData) && testsetCsvData.length > 0 - ? (testsetCsvData[0] as Record) - : undefined - - let normalizedSource: Record | undefined - if (firstRow && typeof firstRow === "object") { - const candidate = - "data" in firstRow && firstRow.data && typeof firstRow.data === "object" - ? (firstRow.data as Record) - : firstRow - normalizedSource = candidate - } - - const fromCsv = normalizedSource ? Object.keys(normalizedSource) : [] - - const merged = new Map() - - const addValue = (value?: string) => { - if (!value) return - const trimmed = value.trim() - if (!trimmed) return - if (!merged.has(trimmed.toLowerCase())) { - merged.set(trimmed.toLowerCase(), trimmed) - } - } - - fromColumns.forEach((col) => addValue(typeof col === "string" ? col : String(col))) - fromCsv.forEach((col) => addValue(typeof col === "string" ? col : String(col))) - - return Array.from(merged.values()) - }, [columnsByTestsetId, selectedTestsetId, testsetCsvData]) - - const normalizedTestsetColumns = useMemo( - () => - derivedTestsetColumns - .map((col) => (typeof col === "string" ? col.trim().toLowerCase() : "")) - .filter(Boolean), - [derivedTestsetColumns], - ) - - const {variants: appVariantRevisions, isLoading: variantsLoading} = useAppVariantRevisions( - selectedAppId || null, - ) - - const {latestRevisions, revisionToVariantMap, revisionById, variantById} = useMemo(() => { - if (!appVariantRevisions?.length) { - return { - latestRevisions: [] as EnhancedVariant[], - revisionToVariantMap: new Map(), - revisionById: new Map(), - variantById: new Map(), - } - } - - const grouped = new Map() - const revisionLookup = new Map() - appVariantRevisions.forEach((rev) => { - if (!rev?.variantId) return - const key = rev.variantId - const existing = grouped.get(key) ?? [] - existing.push(rev) - grouped.set(key, existing) - if (rev.id) { - revisionLookup.set(String(rev.id), rev) - } - }) - - const revisionToVariant = new Map() - const variantMap = new Map() - const latest: EnhancedVariant[] = [] - - grouped.forEach((revisions, variantId) => { - const sorted = [...revisions].sort( - (a, b) => (b.updatedAtTimestamp ?? 0) - (a.updatedAtTimestamp ?? 0), - ) - const baseRevision = sorted[0] ?? revisions[0] - if (!baseRevision) return - - const baseVariant = buildVariantFromRevision(baseRevision, selectedAppId) - baseVariant.revisions = sorted - - variantMap.set(variantId, baseVariant) - sorted.forEach((rev) => { - if (rev.id) { - revisionToVariant.set(String(rev.id), baseVariant) - } - }) - - latest.push(baseRevision) - }) - - latest.sort((a, b) => (b.updatedAtTimestamp ?? 0) - (a.updatedAtTimestamp ?? 0)) - - return { - latestRevisions: latest, - revisionToVariantMap: revisionToVariant, - revisionById: revisionLookup, - variantById: variantMap, - } - }, [appVariantRevisions, selectedAppId]) - - useEffect(() => { - if (!selectedRowKeys.length) return - const filteredKeys = selectedRowKeys.filter((key) => revisionToVariantMap.has(String(key))) - if (filteredKeys.length !== selectedRowKeys.length) { - setSelectedRowKeys(filteredKeys) - } - }, [revisionToVariantMap, selectedRowKeys]) - - useEffect(() => { - if (!props.open) { - setSearchTerm("") - setAppSearchTerm("") - setSelectedRowKeys([]) - setActivePanel(isAppScoped ? "variantPanel" : "appPanel") - if (!isAppScoped) setSelectedAppId("") - return - } - - const derivedAppId = (isAppScoped ? appIdFromRoute : selectedVariant?.appId) ?? "" - if (derivedAppId) { - setSelectedAppId(derivedAppId) - setActivePanel("variantPanel") - } else { - setActivePanel("appPanel") - } - }, [props.open, isAppScoped, appIdFromRoute, selectedVariant?.appId]) - - useEffect(() => { - if (!props.open) return - if (!selectedVariant?.variantId) return - const variant = variantById.get(selectedVariant.variantId) - if (!variant?.revisions?.length) return - const latestRevisionId = variant.revisions[0]?.id - if (!latestRevisionId) return - setSelectedRowKeys((prev) => (prev.length ? prev : [String(latestRevisionId)])) - }, [props.open, variantById, selectedVariant?.variantId]) - - const loadVariant = useCallback(() => { - const [selectedRevisionId] = selectedRowKeys - if (!selectedRevisionId) return - - const baseVariant = revisionToVariantMap.get(String(selectedRevisionId)) - if (!baseVariant) return - - const variantToSet = { - ...baseVariant, - revisions: baseVariant.revisions ? [...baseVariant.revisions] : [], - } - - setSelectedVariant(variantToSet) - props.onCancel?.({} as any) - }, [selectedRowKeys, revisionToVariantMap, setSelectedVariant, props]) - - const handlePanelChange = useCallback((key: string) => { - setActivePanel(key) - }, []) - - const handleAppSelection = useCallback( - (value: string) => { - if (value === selectedAppId) return - setSelectedAppId(value) - setSelectedRowKeys([]) - setSearchTerm("") - setActivePanel("variantPanel") - }, - [selectedAppId], - ) - - const appSelectionComplete = Boolean(selectedAppId) - - const filteredRevisions = useMemo(() => { - if (!searchTerm) return latestRevisions - return latestRevisions.filter((item) => - (item.variantName || "").toLowerCase().includes(searchTerm.toLowerCase()), - ) - }, [searchTerm, latestRevisions]) - - useEffect(() => { - setRowDiagnostics((prev) => { - if (!prev || Object.keys(prev).length === 0) return prev - const allowed = new Set( - (filteredRevisions || []).map((revision) => String(revision.id)), - ) - let changed = false - const next: Record = {} - Object.entries(prev).forEach(([key, meta]) => { - if (allowed.has(key)) { - next[key] = meta - } else { - changed = true - } - }) - return changed ? next : prev - }) - }, [filteredRevisions]) - - const selectedRevisionTags = useMemo(() => { - if (!selectedRowKeys.length) return [] - return selectedRowKeys - .map((key) => { - const revision = revisionById.get(String(key)) - if (!revision) return null - return { - revisionId: String(key), - label: `${revision.variantName} - v${revision.revision}`, - } - }) - .filter(Boolean) as {revisionId: string; label: string}[] - }, [selectedRowKeys, revisionById]) - - const selectedVariantDiagnostics = useMemo(() => { - const [activeRevisionId] = selectedRowKeys - if (!activeRevisionId) return undefined - return rowDiagnostics[String(activeRevisionId)] - }, [rowDiagnostics, selectedRowKeys]) - - const selectedVariantMessage = selectedVariantDiagnostics?.message - const selectedVariantHasWarning = Boolean(selectedVariantDiagnostics?.hasWarning) - - const loadWarningMessage = selectedVariantMessage - - const modalFooter = ( -
    - - - - - - -
    - ) - - const handleRowDiagnostics = useCallback((id: string, meta: VariantDiagnostics) => { - if (!id) return - setRowDiagnostics((prev) => { - const existing = prev[id] - if ( - existing && - existing.hasWarning === meta.hasWarning && - existing.message === meta.message && - existing.columnsKnown === meta.columnsKnown - ) { - return prev - } - return {...prev, [id]: meta} - }) - }, []) - - const SelectionCell = ({ - record, - node, - onMetaChange, - }: { - record: EnhancedVariant - node: ReactNode - onMetaChange: (id: string, meta: VariantDiagnostics) => void - }) => { - const revisionId = record?.id ? String(record.id) : "" - const stableVariablesAtom = useMemo( - () => stablePromptVariablesAtomFamily(revisionId || ""), - [revisionId], - ) - const variables = useAtomValue(stableVariablesAtom) as string[] - - const expectedVariables = useMemo( - () => - Array.isArray(variables) - ? variables - .map((value) => (typeof value === "string" ? value.trim() : "")) - .filter(Boolean) - : [], - [variables], - ) - - const columnsKnown = Boolean(selectedTestsetId) && normalizedTestsetColumns.length > 0 - - const missingVariables = useMemo( - () => - columnsKnown - ? expectedVariables.filter( - (value) => !normalizedTestsetColumns.includes(value.toLowerCase()), - ) - : [], - [columnsKnown, expectedVariables, normalizedTestsetColumns], - ) - - const hasWarning = - Boolean(selectedTestsetId) && - columnsKnown && - expectedVariables.length > 0 && - missingVariables.length > 0 - - const message = useMemo(() => { - if (!selectedTestsetId || !expectedVariables.length) return undefined - if (!columnsKnown) return "Analyzing testset columns..." - if (missingVariables.length > 0) { - const missingList = missingVariables.join(", ") - return `The selected testset is missing required inputs for this variant: {{${missingList}}}` - } - return undefined - }, [columnsKnown, expectedVariables.length, missingVariables, selectedTestsetId]) - - useEffect(() => { - if (!revisionId) return - onMetaChange(revisionId, {hasWarning, message, columnsKnown}) - }, [revisionId, hasWarning, message, columnsKnown, onMetaChange]) - - if (!isValidElement(node)) { - return message ? ( - - {node} - - ) : ( - {node} - ) - } - - const wrappedNode = {node} - - return message ? {wrappedNode} : wrappedNode - } - - const variantTabContent = ( -
    -
    - setSearchTerm(e.target.value)} - placeholder="Search variants" - allowClear - className="w-[240px]" - disabled={!appSelectionComplete} - /> -
    - - {appSelectionComplete ? ( - { - setSelectedRowKeys(value.map((id) => id.toString())) - }, - renderCell: (_: any, record: any, __: number, originNode: ReactNode) => ( - - ), - type: "radio", - }} - isLoading={variantsLoading} - onRowClick={() => {}} - rowKey={"id"} - showStableName - showActionsDropdown={false} - rowClassName={(record) => - clsx( - rowDiagnostics[String((record as EnhancedVariant).id)]?.hasWarning && - "opacity-70", - ) - } - onRow={(record) => { - const revision = record as EnhancedVariant - const diag = rowDiagnostics[String(revision.id)] - return { - className: "variant-table-row", - style: diag?.hasWarning - ? {cursor: "pointer", opacity: 0.7} - : {cursor: "pointer"}, - title: diag?.message, - onClick: () => { - if (revision.id) { - setSelectedRowKeys([String(revision.id)]) - } - }, - } - }} - /> - ) : ( - - Select an application first to load this section. - - )} -
    - ) - - const tabs = useMemo(() => { - const showAppEmptyState = appOptions.length === 0 - const noSearchResults = filteredAppOptions.length === 0 && !showAppEmptyState - - return [ - { - key: "appPanel", - label: ( - - {appSelectionComplete && ( - : null} - onClose={() => { - if (!isAppScoped) { - setSelectedAppId("") - setSelectedRowKeys([]) - setActivePanel("appPanel") - } - }} - > - {appOptions.find((opt) => opt.value === selectedAppId)?.label ?? - selectedAppId} - - )} - - ), - children: ( -
    - {showAppEmptyState ? ( - - ) : ( - <> -
    - setAppSearchTerm(e.target.value)} - placeholder="Search applications" - allowClear - className="w-[240px]" - disabled={isAppScoped} - /> -
    - - {!appSelectionComplete && !isAppScoped ? ( - - Please select an application to continue. - - ) : null} - - )} -
    - ), - }, - { - key: "variantPanel", - label: ( - - - 0}> - {selectedRevisionTags.map(({revisionId, label}) => ( - } - onClose={() => setSelectedRowKeys([])} - > - {label} - - ))} - - - - ), - children: variantTabContent, - }, - ] - }, [ - appOptions, - appSelectionComplete, - handleAppSelection, - isAppScoped, - selectedAppId, - selectedRevisionTags, - selectedRowKeys, - setActivePanel, - setSelectedAppId, - setSelectedRowKeys, - filteredAppOptions, - variantTabContent, - handleCreateApp, - selectedVariantHasWarning, - selectedVariantMessage, - ]) - - return ( - - - Select variant to run - - - - - - { - if (value !== undefined) { - setRawSchema(value) - setSupportsBasicMode( - value ? isSchemaCompatibleWithBasicMode(value) : false, - ) - - if (Array.isArray(name)) { - form.setFieldValue(name, value) - } else { - form.setFieldValue([name], value) - } - } - }} - editorProps={{ - codeOnly: true, - language: "json", - }} - syncWithInitialValueChanges={true} - /> - - {contextHolder} - - ) - } - - // Basic Mode - return ( - <> -
    - - Feedback Configuration - - - - - - - {/* Response Format */} -
    -
    - Response Format - - - -
    - - updateCategory(index, "name", e.target.value) - } - style={{width: 150}} - /> - - updateCategory(index, "description", e.target.value) - } - style={{flex: 1}} - /> -
    - ))} - -
    - )} - - {/* Include Reasoning */} -
    - setIncludeReasoning(e.target.checked)} - > - Include reasoning - - - - -
    - - - {contextHolder} - - ) -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/JSONSchemaGenerator.ts b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/JSONSchemaGenerator.ts deleted file mode 100644 index b6acddb008..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/JSONSchemaGenerator.ts +++ /dev/null @@ -1,152 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {GeneratedJSONSchema, SchemaConfig} from "./types" - -export function isSchemaCompatibleWithBasicMode(schemaString: string): boolean { - const config = parseJSONSchema(schemaString) - - if (!config) { - return false - } - - try { - const parsed = JSON.parse(schemaString) - const normalizedOriginalSchema = parsed.schema || parsed - const regeneratedSchema = generateJSONSchema(config).schema - - return deepEqual(normalizedOriginalSchema, regeneratedSchema) - } catch { - return false - } -} - -export function generateJSONSchema(config: SchemaConfig): GeneratedJSONSchema { - const {responseFormat, includeReasoning, continuousConfig, categoricalOptions} = config - - const properties: Record = {} - const required: string[] = ["correctness"] - - // Base description is always "The grade results" - const baseDescription = "The grade results" - - // Add the main correctness field based on response format - switch (responseFormat) { - case "continuous": - properties.correctness = { - type: "number", - description: baseDescription, - minimum: continuousConfig?.minimum ?? 0, - maximum: continuousConfig?.maximum ?? 10, - } - break - - case "boolean": - properties.correctness = { - type: "boolean", - description: baseDescription, - } - break - - case "categorical": - if (categoricalOptions && categoricalOptions.length > 0) { - const enumValues = categoricalOptions.map((opt) => opt.name) - const categoryDescriptions = categoricalOptions - .map((opt) => `"${opt.name}": ${opt.description}`) - .join("| ") - - properties.correctness = { - type: "string", - description: `${baseDescription}. Categories: ${categoryDescriptions}`, - enum: enumValues, - } - } else { - // Fallback if no categories defined - properties.correctness = { - type: "string", - description: baseDescription, - } - } - break - } - - // Add reasoning field if requested - if (includeReasoning) { - properties.comment = { - type: "string", - description: "Reasoning for the score", - } - required.push("comment") - } - - return { - name: "schema", - schema: { - title: "extract", - description: "Extract information from the user's response.", - type: "object", - properties, - required, - strict: true, - }, - } -} - -export function parseJSONSchema(schemaString: string): SchemaConfig | null { - try { - const parsed = JSON.parse(schemaString) - - // Handle both old format (direct schema) and new format (with name wrapper) - const schema = parsed.schema || parsed - - if (!schema.properties || !schema.properties.correctness) { - return null - } - - const correctness = schema.properties.correctness - const hasReasoning = !!schema.properties.comment - - let responseFormat: SchemaConfig["responseFormat"] = "boolean" - let continuousConfig: SchemaConfig["continuousConfig"] - let categoricalOptions: SchemaConfig["categoricalOptions"] - - if (correctness.type === "number") { - responseFormat = "continuous" - continuousConfig = { - minimum: correctness.minimum ?? 0, - maximum: correctness.maximum ?? 10, - } - } else if (correctness.type === "boolean") { - responseFormat = "boolean" - } else if (correctness.type === "string" && correctness.enum) { - responseFormat = "categorical" - - // Parse category descriptions from the description field - const desc = correctness.description || "" - const categoriesMatch = desc.match(/Categories: (.+)/) - - if (categoriesMatch) { - const categoriesStr = categoriesMatch[1] - const categoryPairs = categoriesStr.split("| ") - - categoricalOptions = correctness.enum.map((name: string) => { - const pair = categoryPairs.find((p: string) => p.startsWith(`"${name}":`)) - const description = pair ? pair.split(": ")[1] || "" : "" - return {name, description} - }) - } else { - categoricalOptions = correctness.enum.map((name: string) => ({ - name, - description: "", - })) - } - } - - return { - responseFormat, - includeReasoning: hasReasoning, - continuousConfig, - categoricalOptions, - } - } catch { - return null - } -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/index.ts b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/index.ts deleted file mode 100644 index 9447df2662..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export {JSONSchemaEditor} from "./JSONSchemaEditor" -export * from "./types" -export * from "./JSONSchemaGenerator" diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/types.ts b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/types.ts deleted file mode 100644 index 7b758b77a3..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/JSONSchema/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -export type ResponseFormatType = "continuous" | "boolean" | "categorical" - -export interface ContinuousConfig { - minimum: number - maximum: number -} - -export interface CategoricalOption { - name: string - description: string -} - -export interface SchemaConfig { - responseFormat: ResponseFormatType - includeReasoning: boolean - continuousConfig?: ContinuousConfig - categoricalOptions?: CategoricalOption[] -} - -export interface JSONSchemaProperty { - type: string - description: string - minimum?: number - maximum?: number - enum?: string[] -} - -export interface GeneratedJSONSchema { - name: string - schema: { - title: string - description: string - type: "object" - properties: Record - required: string[] - strict: boolean - } -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/Messages.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/Messages.tsx deleted file mode 100644 index 8d74181adb..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/Messages.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import {useEffect, useMemo} from "react" - -import {PlusOutlined} from "@ant-design/icons" -import {MinusCircle} from "@phosphor-icons/react" -import {Button, Form, Input} from "antd" -import isEqual from "lodash/isEqual" - -import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" -import MessageEditor from "@/oss/components/Playground/Components/ChatCommon/MessageEditor" - -interface Message { - role: string - content: string -} - -interface MessagesProps { - value?: Message[] - onChange?: (messages: Message[]) => void -} - -const roleOptions = [ - {label: "system", value: "system"}, - {label: "user", value: "user"}, - {label: "assistant", value: "assistant"}, -] - -const normalizeMessages = (messages?: Message[] | string): Message[] => { - if (typeof messages === "string") { - return [{role: "system", content: messages}] - } - if (Array.isArray(messages)) { - return messages.filter(Boolean).map((message) => ({ - role: message.role || "user", - content: message.content || "", - })) - } - return [] -} - -export const Messages: React.FC = ({value = [], onChange}) => { - const form = Form.useFormInstance() - const normalizedValue = useMemo(() => normalizeMessages(value), [value]) - const watchedMessages = Form.useWatch("messages", form) - const currentMessages = watchedMessages ?? normalizedValue - - useEffect(() => { - const currentMessages = form.getFieldValue("messages") - if (!isEqual(currentMessages, normalizedValue)) { - form.setFieldsValue({messages: normalizedValue}) - } - }, [normalizedValue, form]) - - const updateMessages = (updater: (messages: Message[]) => Message[]) => { - const existing = normalizeMessages(form.getFieldValue("messages")) - const updated = updater(existing) - form.setFieldsValue({messages: updated}) - onChange?.(updated) - } - - return ( - - {(fields, {add, remove}) => ( - <> - {fields.map(({key, name, ...restField}, index) => { - const message = currentMessages?.[index] ?? { - role: "user", - content: "", - } - - return ( -
    -
    - - - - - - - - updateMessages((prev) => { - const next = [...prev] - next[index] = { - ...next[index], - role, - } - return next - }) - } - onChangeText={(content) => - updateMessages((prev) => { - const next = [...prev] - next[index] = { - ...next[index], - content: content || "", - } - return next - }) - } - roleOptions={roleOptions} - editorType="border" - headerRight={ - fields.length > 1 ? ( -
    - } - type="text" - onClick={() => { - remove(name) - const updated = normalizeMessages( - form.getFieldValue("messages"), - ) - onChange?.(updated) - }} - tooltipProps={{title: "Remove"}} - /> -
    - ) : undefined - } - /> -
    -
    - ) - })} - - - - - )} -
    - ) -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/index.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/index.tsx deleted file mode 100644 index a3ab293953..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/index.tsx +++ /dev/null @@ -1,387 +0,0 @@ -import {useEffect, useMemo, useState} from "react" - -import {ArrowLeft} from "@phosphor-icons/react" -import {Button, Flex, Form, Input, message, Space, Typography, Splitter, Divider} from "antd" -import dynamic from "next/dynamic" -import {createUseStyles} from "react-jss" - -import {useAppId} from "@/oss/hooks/useAppId" -import { - EvaluationSettingsTemplate, - Evaluator, - EvaluatorConfig, - JSSTheme, - testset, - Variant, -} from "@/oss/lib/Types" -import { - CreateEvaluationConfigData, - createEvaluatorConfig, - updateEvaluatorConfig, -} from "@/oss/services/evaluations/api" -import {useAppList} from "@/oss/state/app" - -import AdvancedSettings from "./AdvancedSettings" -import {DynamicFormField} from "./DynamicFormField" - -const DebugSection: any = dynamic( - () => - import( - "@/oss/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/DebugSection" - ), - {ssr: false}, -) - -interface ConfigureEvaluatorProps { - setCurrent: React.Dispatch> - handleOnCancel: () => void - onSuccess: () => void - selectedEvaluator: Evaluator - variants: Variant[] | null - testsets: testset[] | null - selectedTestcase: { - testcase: Record | null - } - setSelectedVariant: React.Dispatch> - selectedVariant: Variant | null - editMode: boolean - editEvalEditValues: EvaluatorConfig | null - setEditEvalEditValues: React.Dispatch> - setEditMode: (value: React.SetStateAction) => void - cloneConfig: boolean - setCloneConfig: React.Dispatch> - setSelectedTestcase: React.Dispatch< - React.SetStateAction<{ - testcase: Record | null - }> - > - setSelectedTestset: React.Dispatch> - selectedTestset: string - appId?: string | null -} - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - headerText: { - "& .ant-typography": { - lineHeight: theme.lineHeightLG, - fontSize: theme.fontSizeHeading4, - fontWeight: theme.fontWeightStrong, - }, - }, - title: { - fontSize: theme.fontSizeLG, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeightLG, - }, - formContainer: { - display: "flex", - flexDirection: "column", - gap: theme.padding, - height: "100%", - width: "100%", - "& .ant-form-item": { - marginBottom: 10, - }, - }, - formTitleText: { - fontSize: theme.fontSize, - lineHeight: theme.lineHeight, - fontWeight: theme.fontWeightMedium, - }, -})) - -const ConfigureEvaluator = ({ - setCurrent, - selectedEvaluator, - handleOnCancel, - variants, - testsets, - onSuccess, - selectedTestcase, - selectedVariant, - setSelectedVariant, - editMode, - editEvalEditValues, - setEditEvalEditValues, - setEditMode, - cloneConfig, - setCloneConfig, - setSelectedTestcase, - selectedTestset, - setSelectedTestset, - appId: appIdOverride, -}: ConfigureEvaluatorProps) => { - const routeAppId = useAppId() - const apps = useAppList() - const appId = appIdOverride ?? routeAppId ?? apps?.[0].app_id - const classes = useStyles() - const [form] = Form.useForm() - const [submitLoading, setSubmitLoading] = useState(false) - const [traceTree, setTraceTree] = useState<{ - trace: Record | string | null - }>({ - trace: null, - }) - - const evaluatorVersionNumber = useMemo(() => { - const raw = - editEvalEditValues?.settings_values?.version ?? - selectedEvaluator?.settings_template?.version?.default ?? - 3 - - if (typeof raw === "number") return raw - // extract leading number (e.g., "4", "4.1", "v4") - const match = String(raw).match(/\d+(\.\d+)?/) - return match ? parseFloat(match[0]) : 3 - }, [editEvalEditValues?.settings_values?.version, selectedEvaluator]) - - const evalFields = useMemo(() => { - const templateEntries = Object.entries(selectedEvaluator?.settings_template || {}) - const allowStructuredOutputs = evaluatorVersionNumber >= 4 - - return templateEntries.reduce( - (acc, [key, field]) => { - const f = field as Partial | undefined - if (!f?.type) return acc - if (!allowStructuredOutputs && (key === "json_schema" || key === "response_type")) { - return acc - } - acc.push({ - key, - ...(f as EvaluationSettingsTemplate), - advanced: Boolean((f as any)?.advanced), - }) - return acc - }, - [] as Array, - ) - }, [selectedEvaluator, evaluatorVersionNumber]) - - const advancedSettingsFields = evalFields.filter((field) => field.advanced) - const basicSettingsFields = evalFields.filter((field) => !field.advanced) - - const onSubmit = async (values: CreateEvaluationConfigData) => { - try { - setSubmitLoading(true) - if (!selectedEvaluator.key) throw new Error("No selected key") - const settingsValues = values.settings_values || {} - - const jsonSchemaFieldPath: Array = ["settings_values", "json_schema"] - const hasJsonSchema = Object.prototype.hasOwnProperty.call( - settingsValues, - "json_schema", - ) - - if (hasJsonSchema) { - form.setFields([{name: jsonSchemaFieldPath, errors: []}]) - - if (typeof settingsValues.json_schema === "string") { - try { - const parsed = JSON.parse(settingsValues.json_schema) - if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { - throw new Error() - } - settingsValues.json_schema = parsed - } catch { - form.setFields([ - { - name: jsonSchemaFieldPath, - errors: ["Enter a valid JSON object"], - }, - ]) - throw new Error("JSON schema must be a valid JSON object") - } - } else if ( - settingsValues.json_schema && - (typeof settingsValues.json_schema !== "object" || - Array.isArray(settingsValues.json_schema)) - ) { - form.setFields([ - { - name: jsonSchemaFieldPath, - errors: ["Enter a valid JSON object"], - }, - ]) - throw new Error("JSON schema must be a valid JSON object") - } - } - - const data = { - ...values, - evaluator_key: selectedEvaluator.key, - settings_values: settingsValues, - } - - if (editMode) { - await updateEvaluatorConfig(editEvalEditValues?.id!, data) - - setEditEvalEditValues((previous) => - previous - ? { - ...previous, - ...data, - settings_values: settingsValues, - } - : previous, - ) - } else { - const response = await createEvaluatorConfig(appId, data) - const createdConfig = response?.data - - if (createdConfig) { - setEditEvalEditValues(createdConfig) - setEditMode(true) - } - } - - onSuccess() - } catch (error: any) { - if (error?.errorFields) return - console.error(error) - message.error(error.message) - } finally { - setSubmitLoading(false) - } - } - - useEffect(() => { - // Reset form before loading new values so there are no stale values - form.resetFields() - - if (editMode && editEvalEditValues) { - // Load all values including nested settings_values - form.setFieldsValue({ - ...editEvalEditValues, - settings_values: editEvalEditValues.settings_values || {}, - }) - } else if (cloneConfig && editEvalEditValues) { - // When cloning, copy only settings_values and clear the name so user provides a new name - form.setFieldsValue({ - settings_values: editEvalEditValues.settings_values || {}, - name: "", - }) - } - }, [editMode, cloneConfig, editEvalEditValues, form]) - - return ( -
    -
    -
    -
    - - - - - -
    - -
    -
    - - - - {selectedEvaluator.name} - - - - {selectedEvaluator.description} - - - -
    -
    -
    - - - -
    - - {basicSettingsFields.length ? ( -
    - - Parameters - - {basicSettingsFields.map((field) => ( - - ))} -
    - ) : ( - "" - )} - - {advancedSettingsFields.length > 0 && ( -
    - -
    - )} - -
    -
    - - - - -
    -
    - ) -} - -export default ConfigureEvaluator diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/variantUtils.ts b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/variantUtils.ts deleted file mode 100644 index 69d9ae3a46..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/variantUtils.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import type {Variant} from "@/oss/lib/Types" - -export const buildVariantFromRevision = ( - revision: EnhancedVariant, - fallbackAppId?: string, -): Variant => { - return { - id: revision.variantId, - name: revision.variantName, - variantName: revision.variantName, - templateVariantName: (revision as any)?.templateVariantName ?? null, - persistent: true, - previousVariantName: (revision as any)?.previousVariantName ?? null, - variantId: revision.variantId, - appId: revision.appId ?? fallbackAppId ?? "", - appName: revision.appName ?? "", - baseId: revision.baseId ?? "", - baseName: revision.baseName ?? "", - configName: revision.configName ?? "", - uri: revision.uri ?? "", - parameters: revision.parameters ?? {}, - modifiedBy: revision.modifiedBy ?? revision.createdBy ?? "", - modifiedById: revision.modifiedById ?? "", - createdAt: revision.createdAt ?? "", - createdAtTimestamp: revision.createdAtTimestamp ?? 0, - updatedAt: revision.updatedAt ?? revision.createdAt ?? "", - updatedAtTimestamp: revision.updatedAtTimestamp ?? revision.createdAtTimestamp ?? 0, - isLatestRevision: revision.isLatestRevision ?? false, - commitMessage: revision.commitMessage ?? null, - deployedIn: revision.deployedIn ?? [], - projectId: (revision as any)?.projectId ?? "", - revisions: [], - } as Variant -} diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/index.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/index.tsx deleted file mode 100644 index b5ff36068a..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/NewEvaluator/index.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import {useMemo, useState} from "react" - -import {CloseOutlined} from "@ant-design/icons" -import {ArrowLeft} from "@phosphor-icons/react" -import {Button, Divider, Flex, Input, Radio, Space, Typography} from "antd" -import {createUseStyles} from "react-jss" - -import {getEvaluatorTags} from "@/oss/lib/helpers/evaluate" -import {Evaluator, JSSTheme} from "@/oss/lib/Types" - -import NewEvaluatorList from "./NewEvaluatorList" - -interface NewEvaluatorProps { - setCurrent: React.Dispatch> - handleOnCancel: () => void - evaluators: Evaluator[] - setSelectedEvaluator: React.Dispatch> - setEvaluatorsDisplay: any - evaluatorsDisplay: string -} - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - title: { - display: "flex", - alignItems: "center", - justifyContent: "space-between", - "& .ant-typography": { - fontSize: theme.fontSizeHeading4, - fontWeight: theme.fontWeightStrong, - lineHeight: theme.lineHeightLG, - }, - }, - subTitle: { - fontSize: theme.fontSizeLG, - lineHeight: theme.lineHeightLG, - fontWeight: theme.fontWeightMedium, - }, - radioBtnContainer: { - display: "flex", - alignItems: "center", - gap: theme.marginXS, - "& .ant-radio-button-wrapper": { - borderRadius: theme.borderRadius, - borderInlineStartWidth: "1px", - "&:before": { - width: 0, - }, - "&:not(.ant-radio-button-wrapper-checked)": { - border: "none", - "&:hover": { - backgroundColor: theme.colorBgTextHover, - }, - }, - }, - }, -})) - -const NewEvaluator = ({ - evaluators, - setCurrent, - handleOnCancel, - setSelectedEvaluator, - setEvaluatorsDisplay, - evaluatorsDisplay, -}: NewEvaluatorProps) => { - const classes = useStyles() - const [searchTerm, setSearchTerm] = useState("") - const evaluatorTags = getEvaluatorTags() - const [selectedEvaluatorCategory, setSelectedEvaluatorCategory] = useState("view_all") - - const filteredEvaluators = useMemo(() => { - let filtered = evaluators - - console.log("filtered", filtered) - - if (selectedEvaluatorCategory !== "view_all") { - filtered = filtered.filter((item) => item.tags.includes(selectedEvaluatorCategory)) - } - - if (searchTerm) { - filtered = filtered.filter((item) => - item.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) - } - - return filtered - }, [searchTerm, selectedEvaluatorCategory, evaluators]) - - return ( -
    -
    -
    - -
    -
    -
    - setSelectedEvaluatorCategory(e.target.value)} - > - View all - - {evaluatorTags.map((val, idx) => ( - - {val.label} - - ))} - - - - setSearchTerm(e.target.value)} - placeholder="Search" - allowClear - /> - -
    -
    - -
    - -
    - -
    -
    - ) -} - -export default NewEvaluator diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/assets/AutoEvaluationHeader.tsx b/web/oss/src/components/pages/evaluations/autoEvaluation/assets/AutoEvaluationHeader.tsx deleted file mode 100644 index 783fb6804f..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/assets/AutoEvaluationHeader.tsx +++ /dev/null @@ -1,647 +0,0 @@ -import {memo, useCallback, useMemo, useState} from "react" - -import {ArrowsLeftRight, Export, Gauge, Plus, Trash} from "@phosphor-icons/react" -import {Button, Space, Input, message, theme, Typography} from "antd" -import {ColumnsType} from "antd/es/table" -import {useAtom, useSetAtom} from "jotai" -import dynamic from "next/dynamic" -import Link from "next/link" -import {useRouter} from "next/router" - -import EditColumns from "@/oss/components/Filters/EditColumns" -import {formatColumnTitle} from "@/oss/components/Filters/EditColumns/assets/helper" -import {formatMetricValue} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils" -import {EvaluationRow} from "@/oss/components/HumanEvaluations/types" -import useURL from "@/oss/hooks/useURL" -import {snakeToCamelCaseKeys} from "@/oss/lib/helpers/casing" -import {formatDate24, formatDay} from "@/oss/lib/helpers/dateTimeHelper" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import {getTypedValue} from "@/oss/lib/helpers/evaluate" -import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" -import {variantNameWithRev} from "@/oss/lib/helpers/variantHelper" -import {searchQueryAtom} from "@/oss/lib/hooks/usePreviewEvaluations/states/queryFilterAtoms" -import {tempEvaluationAtom} from "@/oss/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom" -import {getMetricConfig} from "@/oss/lib/metrics/utils" -import {EvaluationStatus} from "@/oss/lib/Types" -import {getAppValues} from "@/oss/state/app" - -import {statusMapper} from "../../cellRenderers/cellRenderers" -import {buildEvaluationNavigationUrl} from "../../utils" -import {useStyles} from "./styles" - -import {AutoEvaluationHeaderProps} from "./types" - -const isLegacyEvaluation = (evaluation: any): boolean => "aggregated_results" in evaluation - -const getEvaluationKey = (evaluation: any): string | undefined => - (evaluation?.id ?? evaluation?.key)?.toString() - -const disallowedCompareStatuses = new Set([ - EvaluationStatus.RUNNING, - EvaluationStatus.PENDING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - EvaluationStatus.STARTED, -]) - -const NewEvaluationModal = dynamic(() => import("../../NewEvaluation"), { - ssr: false, -}) - -const AutoEvaluationHeader = ({ - selectedRowKeys, - evaluations, - columns, - setSelectedRowKeys, - setHiddenColumns, - setIsDeleteEvalModalOpen, - viewType, - runMetricsMap, - refetch, - scope, - baseAppURL, - projectURL, - activeAppId, - extractAppId, -}: AutoEvaluationHeaderProps) => { - const classes = useStyles() - const router = useRouter() - - const {token} = theme.useToken() - const {appURL} = useURL() - // atoms - const [searchQuery, setSearchQuery] = useAtom(searchQueryAtom) - const setTempEvaluation = useSetAtom(tempEvaluationAtom) - - // local states - const [searchTerm, setSearchTerm] = useState("") - const [newEvalModalOpen, setNewEvalModalOpen] = useState(false) - - const onExport = useCallback(() => { - try { - const selectedKeySet = new Set(selectedRowKeys.map((key) => key?.toString())) - const exportEvals = evaluations.filter((evaluation) => { - const key = getEvaluationKey(evaluation) - return key ? selectedKeySet.has(key) : false - }) - if (!exportEvals.length) return - - const legacyEvals = exportEvals.filter((e) => "aggregated_results" in e) - const newEvals = exportEvals.filter((e) => "name" in e) - - const {currentApp} = getAppValues() - const filenameBase = - currentApp?.app_name || (scope === "project" ? "all_applications" : "evaluations") - const filename = `${filenameBase.replace(/\s+/g, "_")}_evaluation_scenarios.csv` - - const exportableEvals = [] - - if (legacyEvals.length) { - const legacyEvalsData = legacyEvals.map((item) => { - const record: Record = {} - - // 1. variant name - record.Variant = variantNameWithRev({ - variant_name: item.variants[0].variantName ?? "", - revision: item.revisions?.[0], - }) - // 2. testset name - record.Testset = item.testset?.name - - // 3. status - record.Status = statusMapper(token)( - item.status?.value as EvaluationStatus, - ).label - - // 4. aggregated results for legacy evals - item.aggregated_results?.forEach((result) => { - record[result.evaluator_config.name] = getTypedValue(result?.result) - }) - - // 5. avg latency legacy evals - record["Avg. Latency"] = getTypedValue(item?.average_latency) - - // 6. total cost for legacy evals - record["Total Cost"] = getTypedValue(item?.average_cost) - - // 7. created at - record["Created At"] = formatDate24(item?.created_at) - - return record - }) - - exportableEvals.push(...legacyEvalsData) - } - - if (newEvals.length) { - const newEvalsData = newEvals.map((item) => { - // Instead of using a plain object, use a Map to maintain insertion order - const record = new Map() - - // Add properties in the desired order - record.set("Name", item.name) - - // 1. variant name - record.set( - "Variant", - variantNameWithRev({ - variant_name: item.variants[0].variantName ?? "", - revision: item.variants[0].revision, - }), - ) - - // 2. testset name - record.set("Testset", item.testsets?.[0]?.name) - - // 3. status - record.set("Status", statusMapper(token)(item.status as EvaluationStatus).label) - - // 5. evaluator metrics - // 5. metrics (evaluator and invocation) - const metrics = runMetricsMap?.[item.id] || {} - const evaluators = item.evaluators || [] - - // First, collect all metrics and sort them - const sortedMetrics = Object.entries(metrics).sort(([a], [b]) => { - // Evaluator metrics (with dots) come first - const aIsEvaluator = a.includes(".") - const bIsEvaluator = b.includes(".") - - // If both are evaluator metrics, sort them alphabetically - if (aIsEvaluator && bIsEvaluator) { - return a.localeCompare(b) - } - - // If one is evaluator and one is not, evaluator comes first - if (aIsEvaluator) return -1 - if (bIsEvaluator) return 1 - - // Both are not evaluator metrics, sort them alphabetically - return a.localeCompare(b) - }) - - // Then process them in the sorted order - for (const [k, v] of sortedMetrics) { - if (k.includes(".")) { - // Handle evaluator metrics - const [evaluatorSlug, metricKey] = k.split(".") - const evaluator = evaluators.find((e: any) => e.slug === evaluatorSlug) - if (!evaluator) continue - - const key = `${evaluator.name}.${metricKey}` - - if (v.mean !== undefined) { - record.set(key, v.mean) - } else if (v.unique) { - const trueEntry = v?.frequency?.find((f: any) => f?.value === true) - const total = v?.count ?? 0 - const pct = total ? ((trueEntry?.count ?? 0) / total) * 100 : 0 - record.set(key, `${pct.toFixed(2)}%`) - } - } else { - // Handle invocation metrics - const key = formatColumnTitle(k) - - if (v.mean !== undefined) { - const {primary: primaryKey, label} = getMetricConfig(k) - record.set(label || key, formatMetricValue(k, v?.[primaryKey])) - } else if (v.unique) { - const trueEntry = v?.frequency?.find((f: any) => f?.value === true) - const total = v?.count ?? 0 - const pct = total ? ((trueEntry?.count ?? 0) / total) * 100 : 0 - record.set(key, `${pct.toFixed(2)}%`) - } - } - } - // 6. created by - record.set("Created By", item?.createdBy?.user?.username) - - // 7. created at - record.set("Created At", item?.createdAt) - - return Object.fromEntries(record) - }) - - exportableEvals.push(...newEvalsData) - } - - // Get all unique column keys - const columnKeys = new Set() - exportableEvals.forEach((row) => { - Object.keys(row).forEach((key) => columnKeys.add(key)) - }) - - // Build ordered columns according to the desired export order - const startColumns = ["Name", "Variant", "Testset", "Status"].filter((k) => - columnKeys.has(k), - ) - const endColumns = ["Created By", "Created At"].filter((k) => columnKeys.has(k)) - - // Evaluator metrics first (keys with a dot), sorted alphabetically for stability - const evaluatorMetricColumns = Array.from(columnKeys) - .filter((k) => k.includes(".")) - .sort((a, b) => a.localeCompare(b)) - - // Remaining metrics/columns (excluding the above), sorted alphabetically - const remainingColumns = Array.from(columnKeys) - .filter( - (k) => !startColumns.includes(k) && !endColumns.includes(k) && !k.includes("."), - ) - .sort((a, b) => a.localeCompare(b)) - - const _columns = [ - ...startColumns, - ...evaluatorMetricColumns, - ...remainingColumns, - ...endColumns, - ] - - const csvData = convertToCsv(exportableEvals, _columns) - downloadCsv(csvData, filename) - message.success("Results exported successfully!") - } catch (error) { - message.error("Failed to export evaluations") - } - }, [evaluations, selectedRowKeys, runMetricsMap, scope]) - - const onSearch = useCallback( - (text: string) => { - if (!text && !searchQuery) return - if (text === searchQuery) return - - setSearchQuery(text) - }, - [searchQuery], - ) - - const selectedEvaluations = useMemo(() => { - if (!selectedRowKeys.length) return [] - const selectedSet = new Set(selectedRowKeys.map((key) => key?.toString())) - - return evaluations.filter((evaluation: any) => { - const key = getEvaluationKey(evaluation) - return key ? selectedSet.has(key) : false - }) - }, [evaluations, selectedRowKeys]) - - const selectedAppId = useMemo(() => { - const ids = (selectedEvaluations as EvaluationRow[]) - .map((evaluation) => extractAppId(evaluation)) - .filter((id): id is string => typeof id === "string" && id.length > 0) - const uniqueIds = Array.from(new Set(ids)) - const commonId = uniqueIds.length === 1 ? uniqueIds[0] : undefined - return commonId || activeAppId - }, [selectedEvaluations, activeAppId, extractAppId]) - - const selectionType = useMemo(() => { - if (!selectedEvaluations.length) return "none" - - const hasLegacy = selectedEvaluations.some((evaluation) => isLegacyEvaluation(evaluation)) - const hasModern = selectedEvaluations.some((evaluation) => !isLegacyEvaluation(evaluation)) - - if (hasLegacy && hasModern) return "mixed" - if (hasLegacy) return "legacy" - return "modern" - }, [selectedEvaluations]) - - const legacySelections = useMemo( - () => selectedEvaluations.filter((evaluation) => isLegacyEvaluation(evaluation)), - [selectedEvaluations], - ) - - const modernSelections = useMemo( - () => selectedEvaluations.filter((evaluation) => !isLegacyEvaluation(evaluation)), - [selectedEvaluations], - ) - - const legacyCompareDisabled = useMemo(() => { - if (selectionType !== "legacy") return true - if (scope === "app" && !selectedAppId) return true - if (legacySelections.length < 2) return true - - const [first] = legacySelections - - return legacySelections.some((item: any) => { - const status = item.status?.value as EvaluationStatus - return ( - status === EvaluationStatus.STARTED || - status === EvaluationStatus.INITIALIZED || - item.testset?.id !== first?.testset?.id - ) - }) - }, [selectionType, selectedAppId, scope, legacySelections]) - - const modernCompareDisabled = useMemo(() => { - if (selectionType !== "modern") return true - if (!selectedEvaluations.length) return true - // users can compare up to 5 evals at a time - if (selectedEvaluations.length > 5) return true - if (scope === "app" && !selectedAppId) return true - if (modernSelections.length < 2) return true - - const [first] = modernSelections - const baseTestsetId = first?.testsets?.[0]?.id - if (!baseTestsetId) return true - - if (process.env.NODE_ENV !== "production") { - console.debug("[AutoEvaluationHeader] modern compare check", { - scope, - selectedAppId, - baseTestsetId, - selectionCount: modernSelections.length, - statusList: modernSelections.map((run: any) => run?.status ?? run?.status?.value), - testsetIds: modernSelections.map((run: any) => run?.testsets?.[0]?.id), - }) - } - - return modernSelections.some((run: any) => { - const status = (run?.status?.value ?? run?.status) as EvaluationStatus | string - const testsetId = run?.testsets?.[0]?.id - - return ( - !testsetId || - testsetId !== baseTestsetId || - (status && disallowedCompareStatuses.has(status)) - ) - }) - }, [selectionType, selectedEvaluations, selectedAppId, scope, modernSelections]) - - const compareDisabled = useMemo(() => { - if (selectionType === "legacy") return legacyCompareDisabled - if (selectionType === "modern") return modernCompareDisabled - return true - }, [selectionType, legacyCompareDisabled, modernCompareDisabled]) - - const handleCompare = useCallback(() => { - if (compareDisabled) return - const selectedCommonAppId = selectedAppId - if (process.env.NODE_ENV !== "production") { - console.debug("[AutoEvaluationHeader] handleCompare invoked", { - scope, - selectionType, - selectedCommonAppId, - selectedCount: selectedEvaluations.length, - selectedIds: selectedRowKeys, - }) - } - - if (selectionType === "legacy") { - const legacyIds = selectedEvaluations - .filter((evaluation) => isLegacyEvaluation(evaluation)) - .map((evaluation: any) => evaluation.id) - - if (!legacyIds.length) return - - const primaryLegacyAppId = - selectedCommonAppId || - (legacySelections[0] ? extractAppId(legacySelections[0]) : undefined) - if (scope === "app" && !primaryLegacyAppId) return - - const pathname = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: primaryLegacyAppId, - path: "/evaluations/results/compare", - }) - - router.push({ - pathname, - query: { - evaluations: legacyIds.join(","), - ...(scope === "project" && primaryLegacyAppId - ? {app_id: primaryLegacyAppId} - : {}), - }, - }) - return - } - - if (selectionType === "modern") { - const modernSelectionSet = new Set( - selectedEvaluations - .filter((evaluation) => !isLegacyEvaluation(evaluation)) - .map((evaluation: any) => evaluation.id?.toString()), - ) - const modernIds = selectedRowKeys - .map((key) => key?.toString()) - .filter((id) => (id ? modernSelectionSet.has(id) : false)) - const [baseId, ...compareIds] = modernIds - if (!baseId) return - - const baseRun = - modernSelections.find((evaluation) => getEvaluationKey(evaluation) === baseId) || - undefined - const baseAppId = baseRun ? extractAppId(baseRun) : undefined - const effectiveAppId = selectedCommonAppId || baseAppId - if (process.env.NODE_ENV !== "production") { - console.debug("[AutoEvaluationHeader] navigating to compare view", { - baseId, - compareIds, - baseAppId, - selectedCommonAppId, - effectiveAppId, - }) - } - if (scope === "app" && !effectiveAppId) return - - const pathname = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: effectiveAppId, - path: `/evaluations/results/${baseId}`, - }) - - router.push({ - pathname, - query: { - ...(compareIds.length ? {compare: compareIds} : {}), - ...(scope === "project" && effectiveAppId ? {app_id: effectiveAppId} : {}), - }, - }) - } - }, [ - compareDisabled, - selectionType, - selectedEvaluations, - router, - baseAppURL, - projectURL, - selectedRowKeys, - scope, - extractAppId, - modernSelections, - legacySelections, - selectedAppId, - ]) - - return ( -
    - {viewType === "overview" ? ( -
    -
    - - Automatic Evaluation - - {(() => { - const href = - scope === "app" - ? appURL - ? `${appURL}/evaluations?selectedEvaluation=auto_evaluation` - : undefined - : `${projectURL}/evaluations?selectedEvaluation=auto_evaluation` - if (!href) return null - return ( - - - - ) - })()} -
    - {(scope === "app" || scope === "project") && ( - - )} -
    - ) : ( - <> -
    - - {(scope === "app" && activeAppId) || scope === "project" ? ( - <> - - - - ) : null} - -
    - -
    - setSearchTerm(e.target.value)} - onClear={() => { - setSearchTerm("") - if (searchQuery) { - setSearchQuery("") - } - }} - onKeyDown={(e) => { - if (e.key === "Enter") { - onSearch(searchTerm) - } - }} - /> -
    - - - - - { - setHiddenColumns(keys) - }} - /> -
    -
    - - )} - - {(scope === "app" && activeAppId) || scope === "project" ? ( - { - setNewEvalModalOpen(false) - }} - onSuccess={(res) => { - const runningEvaluations = res.data.runs || [] - setTempEvaluation((prev) => { - const existingIds = new Set([ - ...prev.map((e) => e.id), - ...evaluations.map((e) => e.id), - ]) - const newEvaluations = runningEvaluations - .filter((e) => !existingIds.has(e.id)) - .map((e) => { - const camelCase = snakeToCamelCaseKeys(e) - return { - ...camelCase, - data: {steps: [{origin: "auto", type: "annotation"}]}, - status: "running", - createdAt: formatDay({ - date: camelCase.createdAt, - outputFormat: "DD MMM YYYY | h:mm a", - }), - createdAtTimestamp: dayjs( - camelCase.createdAt, - "YYYY/MM/DD H:mm:ssAZ", - ).valueOf(), - } - }) - - return [...prev, ...newEvaluations] - }) - - refetch() - setNewEvalModalOpen(false) - }} - evaluationType="auto" - preview={false} - /> - ) : null} -
    - ) -} - -export default memo(AutoEvaluationHeader) diff --git a/web/oss/src/components/pages/evaluations/autoEvaluation/assets/types.ts b/web/oss/src/components/pages/evaluations/autoEvaluation/assets/types.ts deleted file mode 100644 index c98818da34..0000000000 --- a/web/oss/src/components/pages/evaluations/autoEvaluation/assets/types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {ColumnsType} from "antd/es/table" - -import {EvaluationRow} from "@/oss/components/HumanEvaluations/types" -import {BasicStats} from "@/oss/lib/metricUtils" - -export interface AutoEvaluationHeaderProps { - selectedRowKeys: React.Key[] - evaluations: EvaluationRow[] - columns: ColumnsType - setSelectedRowKeys: React.Dispatch> - setHiddenColumns: React.Dispatch> - selectedEvalRecord?: EvaluationRow - setIsDeleteEvalModalOpen: React.Dispatch> - viewType?: "overview" | "evaluation" - runMetricsMap: Record> | undefined - refetch: () => void - scope: "app" | "project" - baseAppURL: string - projectURL: string - activeAppId?: string - extractAppId: (evaluation: EvaluationRow) => string | undefined -} diff --git a/web/oss/src/components/pages/evaluations/cellRenderers/cellRenderers.tsx b/web/oss/src/components/pages/evaluations/cellRenderers/cellRenderers.tsx deleted file mode 100644 index c05bb69f53..0000000000 --- a/web/oss/src/components/pages/evaluations/cellRenderers/cellRenderers.tsx +++ /dev/null @@ -1,283 +0,0 @@ -import {memo, useCallback, useEffect, useState} from "react" - -import {type ICellRendererParams} from "@ag-grid-community/core" -import { - CopyOutlined, - FullscreenExitOutlined, - FullscreenOutlined, - InfoCircleOutlined, -} from "@ant-design/icons" -import {GlobalToken, Space, Tooltip, Typography, message, theme} from "antd" -import dayjs from "dayjs" -import duration from "dayjs/plugin/duration" -import relativeTime from "dayjs/plugin/relativeTime" -import Link from "next/link" -import {createUseStyles} from "react-jss" - -import {useDurationCounter} from "@/oss/hooks/useDurationCounter" -import {getTypedValue} from "@/oss/lib/helpers/evaluate" -import { - EvaluationStatus, - EvaluatorConfig, - JSSTheme, - _Evaluation, - _EvaluationScenario, -} from "@/oss/lib/Types" -dayjs.extend(relativeTime) -dayjs.extend(duration) - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - statusCell: { - display: "flex", - alignItems: "center", - gap: "0.25rem", - height: "100%", - marginBottom: 0, - - "& > div:nth-of-type(1)": { - height: 6, - aspectRatio: 1 / 1, - borderRadius: "50%", - }, - }, - dot: { - height: 3, - aspectRatio: 1 / 1, - borderRadius: "50%", - backgroundColor: "#8c8c8c", - marginTop: 2, - }, - date: { - color: "#8c8c8c", - }, - longCell: { - height: "100%", - position: "relative", - overflow: "hidden", - textOverflow: "ellipsis", - whiteSpace: "nowrap", - "& .ant-space": { - position: "absolute", - bottom: 2, - right: 0, - height: 35, - backgroundColor: theme.colorBgContainer, - padding: "0.5rem", - borderRadius: theme.borderRadius, - border: `1px solid ${theme.colorBorder}`, - display: "none", - }, - "&:hover .ant-space": { - display: "inline-flex", - }, - }, -})) - -export function LongTextCellRenderer(params: ICellRendererParams, output?: any) { - const {value, api, node} = params - const [expanded, setExpanded] = useState( - node.rowHeight !== api.getSizesForCurrentTheme().rowHeight, - ) - const classes = useStyles() - - const onCopy = useCallback(() => { - navigator.clipboard - .writeText(value as string) - .then(() => { - message.success("Copied to clipboard") - }) - .catch(console.error) - }, [value]) - - const onExpand = useCallback(() => { - const cells = document.querySelectorAll(`[row-id='${node.id}'] .ag-cell > *`) - const cellsArr = Array.from(cells || []) - const defaultHeight = api.getSizesForCurrentTheme().rowHeight - if (!expanded) { - cellsArr.forEach((cell) => { - cell.setAttribute( - "style", - "overflow: visible; white-space: pre-wrap; text-overflow: unset;", - ) - }) - const height = Math.max(...cellsArr.map((cell) => cell.scrollHeight)) - node.setRowHeight(height <= defaultHeight ? defaultHeight * 2 : height + 10) - } else { - cellsArr.forEach((cell) => { - cell.setAttribute( - "style", - "overflow: hidden; white-space: nowrap; text-overflow: ellipsis;", - ) - }) - node.setRowHeight(defaultHeight) - } - api.onRowHeightChanged() - }, [expanded, api, node]) - - useEffect(() => { - node.addEventListener("heightChanged", () => { - setExpanded(node.rowHeight !== api.getSizesForCurrentTheme().rowHeight) - }) - }, [api, node]) - - return ( -
    - {output ? output : value} - - {expanded ? ( - - ) : ( - - )} - - -
    - ) -} - -export const ResultRenderer = memo( - ( - params: ICellRendererParams<_EvaluationScenario> & { - config: EvaluatorConfig - }, - ) => { - const result = params.data?.results.find( - (item) => item.evaluator_config === params.config.id, - )?.result - - return {getTypedValue(result)} - }, - (prev, next) => prev.value === next.value, -) - -export const runningStatuses = [EvaluationStatus.INITIALIZED, EvaluationStatus.STARTED] -export const statusMapper = - (token: GlobalToken) => (status: EvaluationStatus | "stopped" | "closed") => { - const statusMap = { - [EvaluationStatus.PENDING]: { - label: "Pending", - color: token.colorTextSecondary, - }, - [EvaluationStatus.INCOMPLETE]: { - label: "Incomplete", - color: token.colorTextSecondary, - }, - [EvaluationStatus.INITIALIZED]: { - label: "Queued", - color: token.colorTextSecondary, - }, - [EvaluationStatus.RUNNING]: { - label: "Running", - color: token.colorTextSecondary, - }, - [EvaluationStatus.STARTED]: { - label: "Running", - color: token.colorWarning, - }, - [EvaluationStatus.FINISHED]: { - label: "Success", - color: token.colorSuccess, - }, - [EvaluationStatus.SUCCESS]: { - label: "Success", - color: token.colorSuccess, - }, - [EvaluationStatus.ERROR]: { - label: "Some Errors", - color: token.colorWarning, - }, - [EvaluationStatus.ERRORS]: { - label: "Some Errors", - color: token.colorWarning, - }, - [EvaluationStatus.FAILURE]: { - label: "Failure", - color: token.colorError, - }, - [EvaluationStatus.FINISHED_WITH_ERRORS]: { - label: "Completed with Errors", - color: token.colorWarning, - }, - [EvaluationStatus.AGGREGATION_FAILED]: { - label: "Result Aggregation Failed", - color: token.colorWarning, - }, - [EvaluationStatus.CANCELLED]: { - label: "Stopped", - color: token.colorTextTertiary, - }, - stopped: { - label: "Stopped", - color: token.colorTextTertiary, - }, - closed: { - label: "Closed", - color: token.colorTextSecondary, - }, - } - - return ( - statusMap[status] || { - label: "Unknown", - color: "purple", - } - ) - } - -export const StatusRenderer = memo( - (params: ICellRendererParams<_Evaluation>) => { - const classes = useStyles() - const {token} = theme.useToken() - const duration = useDurationCounter( - params.data?.duration || 0, - runningStatuses.includes(params.value), - ) - const {label, color} = statusMapper(token)(params.data?.status.value as EvaluationStatus) - const errorMsg = params.data?.status.error?.message - const errorStacktrace = params.data?.status.error?.stacktrace - - return ( - -
    - {label} - {errorMsg && ( - - - - - - )} - - {duration} - - ) - }, - (prev, next) => prev.value === next.value && prev.data?.duration === next.data?.duration, -) - -export const LinkCellRenderer = memo( - (params: ICellRendererParams & {href: string}) => { - const {value, href} = params - return {value} - }, - (prev, next) => prev.value === next.value && prev.href === next.href, -) - -export const DateFromNowRenderer = memo( - (params: ICellRendererParams) => { - const [date, setDate] = useState(params.value) - - useEffect(() => { - const interval = setInterval(() => { - setDate((date: any) => dayjs(date).add(1, "second").valueOf()) - }, 60000) - return () => clearInterval(interval) - }, []) - - return {dayjs(date).fromNow()} - }, - (prev, next) => prev.value === next.value, -) diff --git a/web/oss/src/components/pages/evaluations/customEvaluation/CustomEvaluation.tsx b/web/oss/src/components/pages/evaluations/customEvaluation/CustomEvaluation.tsx deleted file mode 100644 index ce97fc9c4c..0000000000 --- a/web/oss/src/components/pages/evaluations/customEvaluation/CustomEvaluation.tsx +++ /dev/null @@ -1,559 +0,0 @@ -import {isValidElement, useCallback, useMemo, useState} from "react" - -import {Export, Trash} from "@phosphor-icons/react" -import {Button, Space, message} from "antd" -import type {ColumnType, ColumnsType} from "antd/es/table" -import {useAtom} from "jotai" -import {useRouter} from "next/router" -import {renderToStaticMarkup} from "react-dom/server" - -import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import EditColumns from "@/oss/components/Filters/EditColumns" -import {filterColumns} from "@/oss/components/Filters/EditColumns/assets/helper" -import {getColumns} from "@/oss/components/HumanEvaluations/assets/utils" -import type {EvaluationRow} from "@/oss/components/HumanEvaluations/types" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import {EvaluationType} from "@/oss/lib/enums" -import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" -import useEvaluations from "@/oss/lib/hooks/useEvaluations" -import {tempEvaluationAtom} from "@/oss/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom" -import useRunMetricsMap from "@/oss/lib/hooks/useRunMetricsMap" -import {EvaluationStatus} from "@/oss/lib/Types" -import {getAppValues} from "@/oss/state/app" - -import {buildAppScopedUrl, buildEvaluationNavigationUrl, extractEvaluationAppId} from "../utils" - -interface CustomEvaluationProps { - scope?: "app" | "project" - viewType?: "overview" | "evaluation" -} - -const isPreviewCustomRun = (run: any) => { - const steps = Array.isArray(run?.data?.steps) ? run.data.steps : [] - const hasCustomStep = steps.some( - (step: any) => - step?.origin === "custom" || - step?.type === "custom" || - step?.metadata?.origin === "custom", - ) - if (!hasCustomStep) return false - - const source = typeof run?.meta?.source === "string" ? run.meta.source.toLowerCase() : undefined - const isOnlineSource = source === "online_evaluation_drawer" - const isLive = Boolean(run?.flags?.is_live) - - return hasCustomStep && !isOnlineSource && !isLive -} - -type ExportableColumn = { - header: string - column: ColumnType -} - -const decodeHtmlEntities = (value: string): string => - value - .replace(/ /gi, " ") - .replace(/&/gi, "&") - .replace(/</gi, "<") - .replace(/>/gi, ">") - .replace(/'/gi, "'") - .replace(/"/gi, '"') - -const stripHtml = (markup: string): string => { - if (!markup) return "" - const withoutTags = markup.replace(/<[^>]+>/g, " ") - return decodeHtmlEntities(withoutTags).replace(/\s+/g, " ").trim() -} - -const nodeToText = (node: any): string => { - if (node === null || node === undefined) return "" - if (typeof node === "string" || typeof node === "number") return String(node) - if (typeof node === "boolean") return node ? "true" : "false" - if (Array.isArray(node)) { - return node.map((item) => nodeToText(item)).filter(Boolean).join(" ") - } - if (isValidElement(node)) { - return stripHtml(renderToStaticMarkup(node)) - } - if (typeof node === "object") { - try { - return stripHtml(renderToStaticMarkup(<>{node})) - } catch (_error) { - return "" - } - } - return "" -} - -const getValueFromDataIndex = ( - record: EvaluationRow, - dataIndex: ColumnType["dataIndex"], -): any => { - if (dataIndex === undefined || dataIndex === null) return undefined - const path = - typeof dataIndex === "number" - ? [dataIndex] - : Array.isArray(dataIndex) - ? dataIndex - : String(dataIndex).split(".") - - return path.reduce((acc: any, key) => { - if (acc === null || acc === undefined) return undefined - if (typeof key === "number") { - return acc?.[key] - } - const candidate = acc?.[key] - if (candidate !== undefined) return candidate - if (typeof key === "string") { - const numericKey = Number.isNaN(Number(key)) ? key : Number(key) - return acc?.[numericKey as keyof typeof acc] - } - return undefined - }, record) -} - -const resolveColumnTitle = (title: ColumnType["title"]): string => { - if (title === null || title === undefined) return "" - if (typeof title === "string") return title - if (typeof title === "number" || typeof title === "boolean") return String(title) - if (typeof title === "function") { - try { - const node = title({}) - return nodeToText(node) - } catch (_error) { - return "" - } - } - if (isValidElement(title)) { - return nodeToText(title) - } - return "" -} - -const flattenColumnsForExport = ( - columns: ColumnsType, - parentTitles: string[] = [], -): ExportableColumn[] => { - const flattened: ExportableColumn[] = [] - columns.forEach((col) => { - const currentTitle = resolveColumnTitle(col.title) - const nextParentTitles = currentTitle ? [...parentTitles, currentTitle] : parentTitles - - if ("children" in col && col.children && col.children.length) { - flattened.push(...flattenColumnsForExport(col.children, nextParentTitles)) - return - } - - const header = - nextParentTitles.join(" / ") || - String( - col.key ?? - (Array.isArray(col.dataIndex) - ? col.dataIndex.join(".") - : col.dataIndex ?? ""), - ) - - if (!header.trim()) return - if (String(col.key ?? "").toLowerCase() === "key") return - - flattened.push({ - header, - column: col, - }) - }) - return flattened -} - -const extractColumnValue = ( - column: ColumnType, - record: EvaluationRow, - index: number, -): string => { - const baseValue = getValueFromDataIndex(record, column.dataIndex) - const rendered = column.render ? column.render(baseValue, record, index) : baseValue - let text = nodeToText(rendered) - - if (!text && baseValue !== undefined) { - text = nodeToText(baseValue) - } - - return text -} - -const CustomEvaluation = ({scope = "app", viewType = "evaluation"}: CustomEvaluationProps) => { - const router = useRouter() - const routeAppId = useAppId() - const activeAppId = scope === "app" ? routeAppId || undefined : undefined - const {baseAppURL, projectURL} = useURL() - - const [hiddenColumns, setHiddenColumns] = useState([]) - const [selectedRowKeys, setSelectedRowKeys] = useState([]) - const [selectedEvalRecord, setSelectedEvalRecord] = useState() - const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) - const [isDeletingEvaluations, setIsDeletingEvaluations] = useState(false) - const [tempEvaluation, setTempEvaluation] = useAtom(tempEvaluationAtom) - - const { - mergedEvaluations: mergedEvaluationsFromHook, - previewEvaluations, - isLoadingLegacy, - isLoadingPreview, - refetch, - handleDeleteEvaluations: deleteEvaluations, - } = useEvaluations({ - withPreview: true, - types: [EvaluationType.custom_code_run], - evalType: "custom", - appId: activeAppId, - }) - - const previewRuns = useMemo(() => { - const runs = previewEvaluations?.swrData?.data?.runs || [] - return runs.filter(isPreviewCustomRun) - }, [previewEvaluations]) - - const evaluatorSlugs = useMemo(() => { - const slugs = new Set() - previewRuns.forEach((run: any) => { - const annotationSteps = Array.isArray(run?.data?.steps) - ? run.data.steps.filter((step: any) => step?.type === "annotation") - : [] - annotationSteps.forEach((step: any) => { - if (step?.key) slugs.add(step.key) - }) - }) - return Array.from(slugs) - }, [previewRuns]) - - const mergedEvaluations = useMemo(() => { - const mergedIds = new Set(mergedEvaluationsFromHook.map((e) => ("id" in e ? e.id : e.key))) - const tempEntries = tempEvaluation.filter((evaluation) => !mergedIds.has(evaluation.id)) - return [...mergedEvaluationsFromHook, ...tempEntries] - }, [mergedEvaluationsFromHook, tempEvaluation]) - - const runIds = useMemo( - () => mergedEvaluations.map((record) => ("id" in record ? record.id : record.key)), - [mergedEvaluations], - ) - - const {data: runMetricsMap} = useRunMetricsMap(runIds, evaluatorSlugs) - - const handleVariantNavigation = useCallback( - ({revisionId, appId}: {revisionId: string; appId?: string}) => { - const targetAppId = appId || activeAppId - if (!targetAppId) return - const url = buildAppScopedUrl(baseAppURL, targetAppId, "/playground") - router.push({ - pathname: url, - query: { - revisions: buildRevisionsQueryParam([revisionId]), - }, - }) - }, - [activeAppId, baseAppURL, router], - ) - - const columns: ColumnsType = useMemo(() => { - return getColumns({ - evaluations: mergedEvaluations, - onVariantNavigation: handleVariantNavigation, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - runMetricsMap, - evalType: "auto", - scope, - baseAppURL, - extractAppId: extractEvaluationAppId, - projectURL, - preferRunStepSlugs: true, - disableVariantAction: true, - }) - }, [ - mergedEvaluations, - handleVariantNavigation, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - runMetricsMap, - scope, - baseAppURL, - projectURL, - ]) - - const visibleColumns = useMemo( - () => filterColumns(columns, hiddenColumns), - [columns, hiddenColumns], - ) - - const exportColumns = useMemo( - () => flattenColumnsForExport(visibleColumns), - [visibleColumns], - ) - - const handleDelete = useCallback( - async (ids: string[]) => { - setIsDeletingEvaluations(true) - try { - await deleteEvaluations(ids) - message.success( - ids.length > 1 ? `${ids.length} evaluations deleted` : "Evaluation deleted", - ) - await refetch() - } catch (error) { - message.error("Failed to delete evaluations") - console.error("Failed to delete custom evaluations", error) - } finally { - setTempEvaluation((prev) => - prev.length > 0 - ? prev.filter((evaluation) => !ids.includes(evaluation?.id)) - : [], - ) - setIsDeletingEvaluations(false) - setIsDeleteEvalModalOpen(false) - setSelectedRowKeys([]) - setSelectedEvalRecord(undefined) - } - }, - [deleteEvaluations, refetch, setTempEvaluation], - ) - - const dataSource = useMemo(() => { - return viewType === "overview" ? mergedEvaluations.slice(0, 5) : mergedEvaluations - }, [mergedEvaluations, viewType]) - - const selectedKeySet = useMemo(() => { - const set = new Set() - selectedRowKeys.forEach((key) => { - if (key == null) return - const value = key.toString() - if (value) set.add(value) - }) - return set - }, [selectedRowKeys]) - - const recordIndexLookup = useMemo(() => { - const map = new Map() - mergedEvaluations.forEach((evaluation, idx) => { - const key = ( - "id" in evaluation ? evaluation.id : evaluation.key - )?.toString() - if (key) { - map.set(key, idx) - } - }) - return map - }, [mergedEvaluations]) - - const selectedEvaluations = useMemo(() => { - if (selectedEvalRecord) { - const selectedId = ( - "id" in selectedEvalRecord ? selectedEvalRecord.id : selectedEvalRecord.key - )?.toString() - const matched = selectedId - ? mergedEvaluations.find((evaluation) => { - const evalId = ( - "id" in evaluation ? evaluation.id : evaluation.key - )?.toString() - return evalId === selectedId - }) - : undefined - return matched ? [matched] : [selectedEvalRecord] - } - if (!selectedKeySet.size) return [] - return mergedEvaluations.filter((evaluation) => { - const key = ("id" in evaluation ? evaluation.id : evaluation.key)?.toString() - return key ? selectedKeySet.has(key) : false - }) - }, [selectedEvalRecord, selectedKeySet, mergedEvaluations]) - - const selectedEvaluationsLabel = useMemo(() => { - if (!selectedEvaluations.length) return "Custom evaluation" - return selectedEvaluations - .map((item) => ("name" in item ? item.name : item.key)) - .join(" | ") - }, [selectedEvaluations]) - - const handleRowNavigation = useCallback( - (record: EvaluationRow) => { - const status = record.status?.value || record.status - if ( - [ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(status as EvaluationStatus) - ) { - return - } - - const evaluationId = "id" in record ? record.id : record.key - const recordAppId = extractEvaluationAppId(record) || activeAppId - if (!recordAppId || !evaluationId) return - - const targetPath = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: recordAppId, - path: `/evaluations/results/${evaluationId}`, - }) - - if (scope === "project") { - router.push({ - pathname: targetPath, - query: recordAppId - ? {app_id: recordAppId, eval_type: "custom"} - : {eval_type: "custom"}, - }) - } else { - router.push({ - pathname: targetPath, - query: {eval_type: "custom"}, - }) - } - }, - [activeAppId, scope, baseAppURL, projectURL, router], - ) - - const handleExportSelected = useCallback(() => { - if (!selectedEvaluations.length) { - message.warning("Select at least one evaluation to export") - return - } - - if (!exportColumns.length) { - message.warning("There are no visible columns to export") - return - } - - try { - const rows = selectedEvaluations.map((item) => { - const key = ("id" in item ? item.id : item.key)?.toString() - const recordIndex = key ? recordIndexLookup.get(key) ?? 0 : 0 - const row: Record = {} - - exportColumns.forEach(({header, column}) => { - row[header] = extractColumnValue(column, item, recordIndex) || "" - }) - - return row - }) - - const headers = exportColumns.map(({header}) => header) - - const csvData = convertToCsv(rows, headers) - if (!csvData) { - message.error("Failed to prepare export") - return - } - - const {currentApp} = getAppValues() - const filenameBase = - currentApp?.app_name || - (scope === "project" ? "all_applications" : "evaluations") - const filename = `${filenameBase.replace(/\s+/g, "_")}_custom_evaluations.csv` - downloadCsv(filename, csvData) - } catch (error) { - console.error("Failed to export custom evaluations", error) - message.error("Failed to export evaluations") - } - }, [ - selectedEvaluations, - exportColumns, - recordIndexLookup, - scope, - ]) - - return ( -
    -
    - - - - - setHiddenColumns(keys)} - /> -
    - - setSelectedRowKeys(keys), - } - : undefined - } - className="ph-no-capture" - columns={visibleColumns as any} - rowKey={(record: any) => ("id" in record ? record.id : record.key)} - dataSource={dataSource} - tableLayout="fixed" - virtualized - onRow={(record) => ({ - style: { - cursor: ![ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(record.status?.value || record.status) - ? "pointer" - : "not-allowed", - }, - onClick: () => handleRowNavigation(record), - })} - /> - - { - setIsDeleteEvalModalOpen(false) - setSelectedEvalRecord(undefined) - }} - onOk={async () => { - const ids = selectedEvaluations - .map((evaluation) => - "id" in evaluation ? evaluation.id : evaluation.key?.toString(), - ) - .filter(Boolean) as string[] - if (ids.length) { - await handleDelete(ids) - } - }} - evaluationType={selectedEvaluationsLabel} - isMultiple={selectedEvaluations.length > 1} - /> -
    - ) -} - -export default CustomEvaluation diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/OnlineEvaluation.tsx b/web/oss/src/components/pages/evaluations/onlineEvaluation/OnlineEvaluation.tsx deleted file mode 100644 index cf6c1d07b6..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/OnlineEvaluation.tsx +++ /dev/null @@ -1,746 +0,0 @@ -import {useCallback, useMemo, useState} from "react" - -import {Gauge, Plus} from "@phosphor-icons/react" -import {Button, message} from "antd" -import {useRouter} from "next/router" - -import DeleteEvaluationModal from "@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal" -import EnhancedTable from "@/oss/components/EnhancedUIs/Table" -import EditColumns from "@/oss/components/Filters/EditColumns" -import {filterColumns} from "@/oss/components/Filters/EditColumns/assets/helper" -import {getColumns} from "@/oss/components/HumanEvaluations/assets/utils" -import type {EvaluationRow} from "@/oss/components/HumanEvaluations/types" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import axios from "@/oss/lib/api/assets/axiosConfig" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import useRunMetricsMap from "@/oss/lib/hooks/useRunMetricsMap" -import {getMetricConfig} from "@/oss/lib/metrics/utils" -import {canonicalizeMetricKey} from "@/oss/lib/metricUtils" -import {EvaluationStatus} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" - -import {retrieveQueryRevision} from "../../../../services/onlineEvaluations/api" -import {GeneralAutoEvalMetricColumns} from "../../../EvalRunDetails/components/VirtualizedScenarioTable/assets/constants" -import EvaluationStatusCell from "../../../HumanEvaluations/assets/EvaluationStatusCell" -import {buildEvaluationNavigationUrl} from "../utils" - -import OnlineEvaluationRowActions from "./components/OnlineEvaluationRowActions" -import QueryFiltersCell from "./components/QueryFiltersCell" -import useOnlineEvaluations from "./hooks/useOnlineEvaluations" -import OnlineEvaluationDrawer from "./OnlineEvaluationDrawer" - -// A minimal Online Evaluations view that shows the table structure with a proper empty state -// until the Online evaluations data model and fetching are implemented. - -interface OnlineEvaluationProps { - viewType?: "overview" | "evaluation" - scope?: "app" | "project" -} - -const OnlineEvaluation = ({viewType = "evaluation", scope = "project"}: OnlineEvaluationProps) => { - const [hiddenColumns, setHiddenColumns] = useState([]) - const [selectedRowKeys, setSelectedRowKeys] = useState([]) - const [selectedEvalRecord, setSelectedEvalRecord] = useState() - const [isDeleteEvalModalOpen, setIsDeleteEvalModalOpen] = useState(false) - const [isDeletingEvaluations, setIsDeletingEvaluations] = useState(false) - const {baseAppURL, projectURL} = useURL() - const [isCreateDrawerOpen, setIsCreateDrawerOpen] = useState(false) - const routeAppId = useAppId() - const activeAppId = scope === "app" ? routeAppId || undefined : undefined - const {evaluations, isLoading, mutate, isValidating} = useOnlineEvaluations({ - appId: activeAppId, - scope, - }) - - const {data: availableEvaluators = []} = useEvaluators({ - preview: true, - queries: {is_human: false}, - }) - - const evaluatorNameLookup = useMemo(() => { - const map = new Map() - availableEvaluators.forEach((ev) => { - if (!ev) return - const label = (ev as any)?.name || (ev as any)?.label || ev.slug || ev.key - const identifiers = [ - ev.id, - ev.slug, - ev.key, - (ev as any)?.meta?.evaluator_key, - (ev as any)?.meta?.key, - (ev as any)?.meta?.slug, - ] - identifiers.forEach((identifier) => { - if (typeof identifier === "string" && identifier.trim()) { - map.set(identifier, label || identifier) - } - }) - }) - return map - }, [availableEvaluators]) - - const runIds = useMemo(() => evaluations.map((e) => ("id" in e ? e.id : e.key)), [evaluations]) - const evaluatorSlugs = useMemo(() => { - const evaSlugs = new Set() - evaluations.forEach((e) => { - const ann = (e as any)?.data?.steps?.find((step: any) => step?.type === "annotation") - const refs = ann?.references || {} - const slug = refs?.evaluator?.slug || refs?.evaluator?.key || ann?.key || undefined - if (typeof slug === "string" && slug.trim()) evaSlugs.add(slug) - }) - return evaSlugs - }, [evaluations]) - - const {data: runMetricsMap} = useRunMetricsMap(runIds, evaluatorSlugs) - - const extractAppId = useCallback((evaluation: EvaluationRow) => { - const meta = (evaluation as any)?.meta - const config = meta?.configuration - return config?.app_id ?? config?.appId ?? meta?.app_id ?? meta?.appId - }, []) - - const ColumnsEvaluatorCell = ({record}: {record: any}) => { - const annotationStep = (record?.data?.steps || []).find( - (s: any) => s?.type === "annotation", - ) - const refs = annotationStep?.references || {} - const evaluatorSlug = refs?.evaluator?.slug || refs?.evaluator?.key - const evaluatorId = refs?.evaluator?.id - const evaluatorName = refs?.evaluator?.name - const displayName = useMemo(() => { - const list = (record?.evaluators || []) as any[] - const match = list.find( - (e) => - e?.id === evaluatorId || e?.slug === evaluatorSlug || e?.key === evaluatorSlug, - ) - if (match?.name && typeof match.name === "string") return match.name - if (typeof evaluatorName === "string" && evaluatorName.trim()) return evaluatorName - if (evaluatorSlug && evaluatorNameLookup.has(evaluatorSlug)) { - return evaluatorNameLookup.get(evaluatorSlug) as string - } - if (evaluatorId && evaluatorNameLookup.has(evaluatorId)) { - return evaluatorNameLookup.get(evaluatorId) as string - } - return evaluatorSlug || "Evaluator" - }, [record, evaluatorId, evaluatorSlug, evaluatorName, evaluatorNameLookup]) - - return ( -
    - {displayName} -
    - ) - } - - const columns = useMemo(() => { - // Reuse the shared columns builder, but remove app/variant/testset columns - const base = getColumns({ - evaluations, - onVariantNavigation: () => undefined, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - // Pass computed metrics to show evaluator metric columns - runMetricsMap: runMetricsMap || {}, - evalType: "online", - scope, - baseAppURL, - extractAppId, - projectURL, - }) - - const disallowedKeys = new Set(["variants", "testsetName", "application"]) as Set< - string | number - > - - const pruned = (base as any[]).filter((col) => !disallowedKeys.has(col?.key)) - - // Inject Online-only columns: Filters, Evaluator - const filtersCol = { - title: "Filters", - key: "onlineFilters", - dataIndex: "onlineFilters", - width: 320, - render: (_: any, record: any) => , - } - const evaluatorCol = { - title: "Evaluator", - key: "onlineEvaluator", - dataIndex: "onlineEvaluator", - width: 220, - render: (_: any, record: any) => , - } - - // Position them after the base filters/metadata columns if any; else prepend - let finalCols = [ - // keep first existing id/name/date, then our custom cols - ...(pruned.slice(0, 2) as any[]), - filtersCol, - evaluatorCol, - ...pruned.slice(2), - ] - - // Online-only: normalize status column (Queued vs Running vs Stopped) - finalCols = finalCols.map((col: any) => { - if (col?.key === "status") { - return { - ...col, - render: (value: any, record: any) => { - const flagSources = [ - (record as any)?.flags, - (record as any)?.data?.flags, - (record as any)?.meta?.flags, - (record as any)?.statusMeta, - ] - - const getStatusString = (candidate: any): string => { - if (!candidate && candidate !== 0) return "" - if (typeof candidate === "string") return candidate - if (typeof candidate === "object") { - return ( - (candidate as any)?.value || - (candidate as any)?.status || - (candidate as any)?.state || - "" - ) - } - return String(candidate) - } - - const rawStatus = - getStatusString(value) || - getStatusString((record as any)?.status) || - getStatusString((record as any)?.data?.status) - - const normalizedStatus = rawStatus.toLowerCase() - - const isExplicitFalse = (val: any) => - val === false || val === 0 || val === "false" || val === "0" - const isExplicitTrue = (val: any) => - val === true || val === 1 || val === "true" || val === "1" - - const isStoppedByFlags = flagSources.some((src) => { - if (!src || typeof src !== "object") return false - return ( - isExplicitFalse((src as any).isActive) || - isExplicitFalse((src as any).is_active) || - isExplicitFalse((src as any).isLive) || - isExplicitFalse((src as any).is_live) || - isExplicitTrue((src as any).isStopped) || - isExplicitTrue((src as any).is_stopped) || - (typeof (src as any).state === "string" && - ((src as any).state as string).toLowerCase() === "stopped") - ) - }) - - const normalizedStatusKey = normalizedStatus.replace(/[\s-]+/g, "_") - - const stopStatusTokens = new Set([ - EvaluationStatus.CANCELLED.toLowerCase(), - "canceled", - "stopped", - "halted", - "closed", - ]) - const isStoppedStatus = - stopStatusTokens.has(normalizedStatus) || - stopStatusTokens.has(normalizedStatusKey) - - const errorStatusTokens = new Set([ - EvaluationStatus.ERROR, - EvaluationStatus.ERRORS, - EvaluationStatus.FAILURE, - EvaluationStatus.FINISHED_WITH_ERRORS, - EvaluationStatus.AGGREGATION_FAILED, - "error", - "errors", - "some_errors", - "failure", - "failed", - "fail", - "timeout", - "terminated", - "launch_error", - ]) - const statusHasErrors = - errorStatusTokens.has( - normalizedStatusKey as EvaluationStatus | string, - ) || - errorStatusTokens.has(normalizedStatus as EvaluationStatus | string) - - const adjustedStatus: EvaluationStatus = (() => { - if (isStoppedByFlags || isStoppedStatus) - return EvaluationStatus.CANCELLED - if (!normalizedStatusKey) return EvaluationStatus.RUNNING - if (statusHasErrors) return EvaluationStatus.ERRORS - return EvaluationStatus.RUNNING - })() - - const runId = "id" in record ? record.id : record.key - return ( - { - if (currentStatus === EvaluationStatus.CANCELLED) { - return { - label: "Stopped", - color: token.colorTextTertiary, - } - } - if ( - [EvaluationStatus.ERRORS, EvaluationStatus.ERROR].includes( - currentStatus, - ) - ) { - return { - label: "Running", - color: token.colorSuccess, - tooltip: "Some scenarios failed", - } - } - return { - label: "Running", - color: token.colorSuccess, - } - }} - /> - ) - }, - } - } - return col - }) - - return finalCols.map((col) => { - if (col.key === "key") { - return { - ...col, - render: (_: any, record: EvaluationRow) => ( - - ), - } - } - return col - }) - }, [ - evaluations, - runMetricsMap, - scope, - baseAppURL, - projectURL, - extractAppId, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - mutate, - ]) - const visibleColumns = useMemo( - () => filterColumns(columns, hiddenColumns), - [columns, hiddenColumns], - ) - - const router = useRouter() - const dataSource = useMemo( - () => (viewType === "overview" ? evaluations.slice(0, 5) : evaluations), - [evaluations, viewType], - ) - - const handleExportCsv = useCallback(async () => { - if (typeof window === "undefined") return - const selected = evaluations.filter((e) => { - const key = ("id" in e ? (e as any).id : (e as any).key) as string - return selectedRowKeys.includes(key) - }) - if (!selected.length) return - // Build evaluator metric keys (per evaluator slug) - const evalMetricKeyMap = new Map}>() - selected.forEach((rec) => { - const evaluators = (((rec as any)?.evaluators || []) as any[]).filter(Boolean) - evaluators.forEach((ev) => { - const slug = ev?.slug || ev?.key - if (!slug) return - const name = ev?.name || slug - const metricsObj = ev?.data?.service?.format?.properties?.outputs?.properties || {} - const keys = new Set(Object.keys(metricsObj)) - if (!evalMetricKeyMap.has(slug)) { - evalMetricKeyMap.set(slug, {name, keys}) - } else { - const entry = evalMetricKeyMap.get(slug)! - keys.forEach((k) => entry.keys.add(k)) - } - }) - }) - - // Build general run metric keys from constant used by table - const generalMetricDefs = GeneralAutoEvalMetricColumns || [] - - // CSV headers (flattened) matching visible table columns - const headers: string[] = [ - "Name", - "Filters", - "Evaluator", - "Status", - "Created by", - "Created on", - ] - - // Add evaluator metric headers in stable order: by evaluator name then metric key - const evalHeaderPairs: {slug: string; label: string; metricKey: string}[] = [] - Array.from(evalMetricKeyMap.entries()) - .sort((a, b) => a[1].name.localeCompare(b[1].name)) - .forEach(([slug, {name, keys}]) => { - Array.from(keys) - .sort() - .forEach((metricKey) => { - const label = `${name}.${metricKey}` - evalHeaderPairs.push({slug, label, metricKey}) - headers.push(label) - }) - }) - - // Add general metrics (Invocation Metrics) - const generalHeaderPairs: {label: string; canonicalKey: string; rawKey: string}[] = [] - generalMetricDefs.forEach((def) => { - const canonicalKey = canonicalizeMetricKey(def.path) - headers.push(def.name) - generalHeaderPairs.push({label: def.name, canonicalKey, rawKey: def.path}) - }) - - // Helper to pick primary value from metric object or simple value - const pickPrimary = (metricKey: string, metric: any): string | number | undefined => { - if (metric == null) return undefined - if (typeof metric === "object") { - const {primary} = getMetricConfig(metricKey) - const v = metric?.[primary] - return v == null ? undefined : v - } - return metric - } - - // Preload Filters info per selected row (based on query reference) - const filtersById: Record = {} - try { - await Promise.all( - selected.map(async (rec) => { - const id = ("id" in rec ? (rec as any).id : (rec as any).key) as string - const inputStep = ((rec as any)?.data?.steps || []).find( - (s: any) => s?.type === "input", - ) - const qRefs = inputStep?.references || {} - const queryId = qRefs?.query?.id || qRefs?.queryId - if (!queryId) return - try { - const res = await retrieveQueryRevision({query_ref: {id: queryId}}) - const revision = res?.query_revision - const filtering = revision?.data?.filtering - const windowing = revision?.data?.windowing - const oldest = windowing?.oldest - const newest = windowing?.newest - let historicalRangeLabel: string | undefined - if (oldest && newest) { - const oldestDate = dayjs(oldest) - const newestDate = dayjs(newest) - if (oldestDate.isValid() && newestDate.isValid()) { - const diffDays = Math.max(newestDate.diff(oldestDate, "day"), 0) - if (diffDays > 0 && diffDays <= 31) { - historicalRangeLabel = `Historical: Last ${diffDays} day${diffDays === 1 ? "" : "s"}` - } else { - historicalRangeLabel = `Historical: ${oldestDate.format("DD MMM YYYY")} – ${newestDate.format("DD MMM YYYY")}` - } - } - } - const base = filtering ? JSON.stringify(filtering) : "" - filtersById[id] = [base, historicalRangeLabel].filter(Boolean).join(" | ") - } catch { - // ignore per-row filter load errors - } - }), - ) - } catch { - // ignore - } - - const rows = selected.map((rec) => { - const id = ("id" in rec ? (rec as any).id : (rec as any).key) as string - const name = ("name" in rec ? (rec as any).name : id) as string - const status = ((rec as any)?.status ?? (rec as any)?.data?.status ?? "") as string - const createdOn = ((rec as any)?.createdAt ?? - (rec as any)?.data?.created_at ?? - "") as string - const annotation = ((rec as any)?.data?.steps || []).find( - (s: any) => s?.type === "annotation", - ) - const refs = annotation?.references || {} - const evaluatorSlug = refs?.evaluator?.slug || refs?.evaluator?.key || "" - const evaluatorName = (() => { - const list = ((rec as any)?.evaluators || []) as any[] - const match = list.find( - (e) => - e?.id === refs?.evaluator?.id || - e?.slug === evaluatorSlug || - e?.key === evaluatorSlug, - ) - return (match?.name || evaluatorSlug || "") as string - })() - const createdBy = ((rec as any)?.createdBy?.user?.username ?? "") as string - - // Base fields - const row: Record = { - Name: name, - Filters: filtersById[id] || "", - Evaluator: evaluatorName, - Status: status, - "Created by": createdBy, - "Created on": createdOn, - } - - const metrics = (runMetricsMap || ({} as any))[id] || {} - - // Evaluator metrics values - evalHeaderPairs.forEach(({slug, label, metricKey}) => { - // Try different key encodings - const candidates = [ - `${slug}.${metricKey}`, - metricKey, - `attributes.ag.data.outputs.${metricKey}`, - ] - let found: any - for (const k of candidates) { - if (metrics[k] != null) { - found = metrics[k] - break - } - } - const canonical = canonicalizeMetricKey(`${slug}.${metricKey}`) - row[label] = pickPrimary(canonical, found) - }) - - // General metrics values - generalHeaderPairs.forEach(({label, canonicalKey, rawKey}) => { - const tail = rawKey.split(".").slice(-1)[0] - const candidates = [canonicalKey, rawKey, `attributes.ag.data.outputs.${tail}`] - let found: any - for (const k of candidates) { - if (metrics[k] != null) { - found = metrics[k] - break - } - } - row[label] = pickPrimary(canonicalKey, found) - }) - - return row - }) - const escape = (v: unknown) => { - const s = `${v ?? ""}` - if (s.includes(",") || s.includes("\n") || s.includes('"')) { - return '"' + s.replace(/"/g, '""') + '"' - } - return s - } - const csv = [ - headers.join(","), - ...rows.map((r) => headers.map((h) => escape((r as any)[h])).join(",")), - ].join("\n") - const blob = new Blob([csv], {type: "text/csv;charset=utf-8;"}) - const url = URL.createObjectURL(blob) - const link = document.createElement("a") - link.href = url - link.download = "online-evaluations.csv" - document.body.appendChild(link) - link.click() - document.body.removeChild(link) - URL.revokeObjectURL(url) - }, [evaluations, selectedRowKeys, extractAppId, runMetricsMap]) - - const selectedEvaluations = useMemo(() => { - return selectedEvalRecord - ? (() => { - const targetId = - "id" in (selectedEvalRecord as any) - ? (selectedEvalRecord as any).id - : (selectedEvalRecord as any).key - const found = evaluations.find( - (e) => ("id" in e ? (e as any).id : (e as any).key) === targetId, - ) - return ( - (found && ("name" in found ? (found as any).name : (found as any).key)) || "" - ) - })() - : evaluations - .filter((e) => - selectedRowKeys.includes("id" in e ? (e as any).id : (e as any).key), - ) - .map((e) => ("name" in e ? (e as any).name : "id" in e ? e.id : (e as any).key)) - .join(" | ") - }, [selectedEvalRecord, selectedRowKeys, evaluations]) - - const handleDelete = useCallback( - async (ids: string[]) => { - setIsDeletingEvaluations(true) - try { - const {projectId} = getProjectValues() - await axios.delete(`/preview/evaluations/runs/?project_id=${projectId}`, { - data: {run_ids: ids}, - }) - message.success( - ids.length > 1 ? `${ids.length} Evaluations Deleted` : "Evaluation Deleted", - ) - await mutate() - } catch (err) { - message.error("Failed to delete evaluations") - } finally { - setIsDeletingEvaluations(false) - setIsDeleteEvalModalOpen(false) - setSelectedRowKeys([]) - } - }, - [mutate], - ) - - return ( -
    - {viewType === "evaluation" && ( - <> - {/*
    */} -
    -
    -
    - {((scope === "app" && activeAppId) || scope === "project") && ( - <> - - - - )} -
    -
    -
    - - - setHiddenColumns(keys)} - /> -
    -
    - - )} - setSelectedRowKeys(keys), - } - : undefined - } - onRow={(record) => ({ - style: {cursor: "pointer"}, - onClick: () => { - const evaluationId = "id" in record ? record.id : record.key - // const recordAppId = extractEvaluationAppId(record) || activeAppId - if (!evaluationId) return - - const pathname = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - // appId: recordAppId, - path: `/evaluations/results/${evaluationId}?type=online`, - }) - - router.push(pathname) - }, - })} - className="ph-no-capture" - columns={visibleColumns as any} - rowKey={(record: any) => ("id" in record ? record.id : record.key)} - dataSource={dataSource} - tableLayout="fixed" - virtualized - loading={isLoading || isValidating} - /> - setIsCreateDrawerOpen(false)} - onCreate={() => { - void mutate() - setIsCreateDrawerOpen(false) - }} - /> - { - setIsDeleteEvalModalOpen(false) - setSelectedEvalRecord(undefined) - }} - onOk={async () => { - const idsToDelete = selectedEvalRecord - ? [ - ("id" in selectedEvalRecord - ? (selectedEvalRecord as any).id - : (selectedEvalRecord as any).key) as string, - ] - : selectedRowKeys.map((key) => key?.toString()) - await handleDelete(idsToDelete.filter(Boolean) as string[]) - }} - evaluationType={ - selectedEvalRecord - ? ("name" in (selectedEvalRecord as any) - ? (selectedEvalRecord as any).name - : (selectedEvalRecord as any).key) || "Online evaluation" - : selectedEvaluations && selectedEvaluations.length > 0 - ? selectedEvaluations - : "Online evaluation" - } - isMultiple={!selectedEvalRecord && selectedRowKeys.length > 0} - /> -
    - ) -} - -export default OnlineEvaluation diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/OnlineEvaluationDrawer.tsx b/web/oss/src/components/pages/evaluations/onlineEvaluation/OnlineEvaluationDrawer.tsx deleted file mode 100644 index 7dfc589305..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/OnlineEvaluationDrawer.tsx +++ /dev/null @@ -1,663 +0,0 @@ -import {useCallback, useEffect, useMemo, useState} from "react" -import type {ReactNode} from "react" - -import {Button, Collapse, DatePicker, Form, Input, Select, Switch, Tooltip, Typography} from "antd" -import dayjs from "dayjs" -import type {Dayjs} from "dayjs" -import {useAtom, useAtomValue, useSetAtom} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" -import {v4 as uuidv4} from "uuid" - -import {message} from "@/oss/components/AppMessageContext" -import EnhancedDrawer from "@/oss/components/EnhancedUIs/Drawer" -import getFilterColumns from "@/oss/components/pages/observability/assets/getFilterColumns" -import {evaluatorConfigsAtom} from "@/oss/lib/atoms/evaluation" -import {getColorPairFromStr} from "@/oss/lib/helpers/colors" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import type {EvaluatorPreviewDto} from "@/oss/lib/hooks/useEvaluators/types" -import useFetchEvaluatorsData from "@/oss/lib/hooks/useFetchEvaluatorsData" -import type {Evaluator, Filter} from "@/oss/lib/Types" -import { - createSimpleEvaluation, - createSimpleQuery, - retrieveQueryRevision, - type QueryRevisionDataPayload, - type SimpleEvaluationCreatePayload, - type SimpleQueryCreatePayload, -} from "../../../../services/onlineEvaluations/api" - -import { - buildQuerySlug, - parseSamplingRate, - toFilteringPayload, - toWindowingPayload, -} from "./assets/helpers" -import {onlineEvalFiltersAtom, resetOnlineEvalFiltersAtom} from "./assets/state" -import {useDrawerStyles} from "./assets/styles" -import EvaluatorDetailsPreview from "./components/EvaluatorDetailsPreview" -import EvaluatorTypeTag from "./components/EvaluatorTypeTag" -import SamplingRateControl from "./components/SamplingRateControl" -import {useEvaluatorDetails} from "./hooks/useEvaluatorDetails" -import {useEvaluatorSelection} from "./hooks/useEvaluatorSelection" -import {useEvaluatorTypeFromConfigs} from "./hooks/useEvaluatorTypeFromConfigs" -import {capitalize} from "./utils/evaluatorDetails" - -interface OnlineEvaluationDrawerProps { - open: boolean - onClose: () => void - onCreate?: (values: any) => void -} - -const {Text, Link: TypographyLink} = Typography -const {RangePicker} = DatePicker -const Filters = dynamic(() => import("@/oss/components/Filters/Filters"), {ssr: false}) - -const OnlineEvaluationDrawer = ({open, onClose, onCreate}: OnlineEvaluationDrawerProps) => { - const {evaluatorsSwr: baseEvaluatorsSwr} = useFetchEvaluatorsData({appId: ""}) - const queryClient = useAtomValue(queryClientAtom) - const classes = useDrawerStyles() - const [form] = Form.useForm() - const filterColumns = useMemo(() => getFilterColumns(), []) - const [filters, setFilters] = useAtom(onlineEvalFiltersAtom) - const resetFilters = useSetAtom(resetOnlineEvalFiltersAtom) - // Load preview evaluators (with IDs) to map evaluator_config.evaluator_key -> evaluator.id - const previewEvaluatorsSwr = useEvaluators({preview: true, queries: {is_human: false}}) - const baseEvaluators = (baseEvaluatorsSwr.data as Evaluator[] | undefined) ?? [] - const evaluators = useAtomValue(evaluatorConfigsAtom) - const previewEvaluators = (previewEvaluatorsSwr.data as EvaluatorPreviewDto[] | undefined) ?? [] - const selectedEvaluatorId = Form.useWatch("evaluator", form) - const samplingRate = Form.useWatch("sampling_rate", form) - const isHistorical = Form.useWatch("historical", form) ?? false - const [isSubmitting, setIsSubmitting] = useState(false) - const router = useRouter() - - const { - evaluatorOptions, - selectedEvaluatorConfig, - matchedPreviewEvaluator, - evaluatorTypeLookup, - } = useEvaluatorSelection({ - evaluators: evaluators || [], - selectedEvaluatorId, - previewEvaluators, - baseEvaluators, - }) - - useEffect(() => { - if (!selectedEvaluatorId) return - const selectedOption = evaluatorOptions.find( - (option) => option?.value === selectedEvaluatorId, - ) - const fullEvaluator = - matchedPreviewEvaluator && matchedPreviewEvaluator.id === selectedEvaluatorId - ? matchedPreviewEvaluator - : selectedEvaluatorConfig - - console.log("[OnlineEvaluationDrawer] Evaluator selected", { - evaluatorId: selectedEvaluatorId, - evaluatorLabel: selectedOption?.label, - evaluatorOption: selectedOption, - evaluatorConfig: fullEvaluator, - }) - }, [selectedEvaluatorId, evaluatorOptions, matchedPreviewEvaluator, selectedEvaluatorConfig]) - - const evaluatorDetails = useEvaluatorDetails({ - evaluator: matchedPreviewEvaluator as any, - config: selectedEvaluatorConfig, - evaluatorTypeLookup, - }) - - const hasParameters = evaluatorDetails.visibleParameters.length > 0 - - // Config-derived label/color with meta fallback - const evaluatorReferenceForType = matchedPreviewEvaluator ?? selectedEvaluatorConfig - const {label: cfgLabel, color: cfgColor} = useEvaluatorTypeFromConfigs({ - evaluator: evaluatorReferenceForType, - }) - const evaluatorTypeColors = useMemo( - () => - !cfgColor && evaluatorDetails.typeSlug - ? getColorPairFromStr(evaluatorDetails.typeSlug) - : undefined, - [cfgColor, evaluatorDetails.typeSlug], - ) - const finalTypeColor = cfgColor ?? evaluatorDetails.typeColor - const finalTypeLabel = useMemo(() => { - if (cfgLabel) return cfgLabel - if (evaluatorDetails.typeLabel) return evaluatorDetails.typeLabel - if (evaluatorDetails.typeSlug) - return capitalize(evaluatorDetails.typeSlug.replace(/_/g, " ")) - return undefined - }, [cfgLabel, evaluatorDetails.typeLabel, evaluatorDetails.typeSlug]) - - const hasEvaluatorType = Boolean(finalTypeLabel) - const hasModel = Boolean(evaluatorDetails.model) - const hasPrompt = evaluatorDetails.promptSections.length > 0 - const hasOutputs = (evaluatorDetails.outputs?.length ?? 0) > 0 - const isLoadingEvaluators = - previewEvaluatorsSwr.isLoading || - previewEvaluatorsSwr.isPending || - baseEvaluatorsSwr.isLoading || - baseEvaluatorsSwr.isPending - const hasEvaluatorOptions = evaluatorOptions.length > 0 - const workspaceId = useMemo(() => { - const value = router.query.workspace_id - if (Array.isArray(value)) return value[0] - return typeof value === "string" ? value : undefined - }, [router.query.workspace_id]) - const projectId = useMemo(() => { - const value = router.query.project_id - if (Array.isArray(value)) return value[0] - return typeof value === "string" ? value : undefined - }, [router.query.project_id]) - - const invalidateUseEvaluatorsQueries = useCallback(async () => { - if (!queryClient) return - try { - await queryClient.invalidateQueries({queryKey: ["evaluators"] as const}) - if (process.env.NODE_ENV !== "production") { - console.debug("[OnlineEvaluationDrawer] invalidated useEvaluators queries") - } - } catch (err) { - if (process.env.NODE_ENV !== "production") { - console.warn( - "[OnlineEvaluationDrawer] failed to invalidate useEvaluators queries", - err, - ) - } - } - }, [queryClient]) - const evaluatorRegistryHref = useMemo(() => { - if (!workspaceId || !projectId) return undefined - return `/w/${workspaceId}/p/${projectId}/evaluators` - }, [workspaceId, projectId]) - - useEffect(() => { - if (isHistorical) { - const currentRange: Dayjs[] | undefined = form.getFieldValue("historical_range") - if (!currentRange || currentRange.length !== 2) { - const end = dayjs() - const start = end.subtract(7, "day") - form.setFieldsValue({historical_range: [start, end]}) - } - } else { - form.setFieldsValue({historical_range: undefined}) - } - }, [form, isHistorical]) - - useEffect(() => { - if (!open) { - form.resetFields() - resetFilters() - } - }, [open, form, resetFilters]) - - const handleSubmit = async () => { - if (!hasEvaluatorOptions) { - message.info( - "Add a supported evaluator (LLM-as-a-judge, Code, Regex test, or Webhook test) in the Evaluator Registry before creating a live evaluation.", - ) - return - } - setIsSubmitting(true) - try { - const values = await form.validateFields() - const samplingRateValue = parseSamplingRate(values.sampling_rate) - const payload: Record = { - ...values, - filters, - } - if (hasEvaluatorType) { - payload.evaluator_type = - evaluatorDetails.typeSlug ?? evaluatorDetails.typeLabel ?? undefined - } - if (hasParameters && Object.keys(evaluatorDetails.parameterPayload).length > 0) { - payload.parameters = evaluatorDetails.parameterPayload - } - if (hasModel) { - payload.model = evaluatorDetails.model - } - if (hasPrompt) { - payload.prompt = evaluatorDetails.promptSections - .map((section, idx) => { - const title = section.label || section.role || `Message ${idx + 1}` - const lines = [title] - if ( - section.role && - section.label && - section.role.toLowerCase() !== section.label.toLowerCase() - ) { - lines[0] = `${section.label} (${section.role})` - } - if (section.content) { - lines.push(section.content) - } - if (section.attachments.length) { - section.attachments.forEach((attachment, attachmentIdx) => { - lines.push(`Attachment ${attachmentIdx + 1}: ${attachment.url}`) - }) - } - return lines.filter(Boolean).join("\n") - }) - .join("\n\n") - } - if (hasOutputs) { - payload.outputs = evaluatorDetails.outputs.map((metric) => ({ - name: metric.name, - type: metric.type, - required: metric.required, - description: metric.description, - })) - } - - let historicalRangeIso: string[] | undefined - if (isHistorical) { - const range: Dayjs[] | undefined = form.getFieldValue("historical_range") - if (range && range.length === 2) { - historicalRangeIso = range.map((date) => date?.toISOString()) - payload.historical_range = historicalRangeIso - } - } - - const filteringPayload = toFilteringPayload(filters) - const windowingPayload = toWindowingPayload({ - samplingRate: samplingRateValue, - historicalRange: historicalRangeIso, - }) - - const querySlug = `${buildQuerySlug(values.name)}-${uuidv4().slice(0, 8)}` - const queryPayload: SimpleQueryCreatePayload = { - slug: querySlug, - name: values.name, - description: values.description, - } - - const queryData: QueryRevisionDataPayload = {} - if (filteringPayload) { - queryData.filtering = filteringPayload - } - if (windowingPayload) { - queryData.windowing = windowingPayload - } - if (Object.keys(queryData).length) { - queryPayload.data = queryData - } - - const queryResponse = await createSimpleQuery({query: queryPayload}) - const queryId = queryResponse.query?.id - if (!queryId) { - throw new Error("Unable to create query for online evaluation.") - } - - const revisionResponse = await retrieveQueryRevision({ - query_ref: {id: queryId}, - }) - const queryRevisionId = revisionResponse.query_revision?.id - if (!queryRevisionId) { - throw new Error("Unable to resolve query revision for online evaluation.") - } - - // Prefer preview evaluator artifact id; fall back to selected config id if preview not available - const evaluatorStepId = - selectedEvaluatorId ?? - (selectedEvaluatorConfig as any)?.id ?? - matchedPreviewEvaluator?.id - - if (!evaluatorStepId) { - throw new Error("Please select an evaluator.") - } - - const evaluationPayload: SimpleEvaluationCreatePayload = { - name: values.name, - description: values.description, - flags: { - is_live: true, - is_closed: false, - is_active: false, - }, - data: { - status: "pending", - // Per API docs, use arrays of IDs for steps - query_steps: {[queryRevisionId]: "auto"}, - evaluator_steps: {[evaluatorStepId]: "auto"}, - repeats: 1, - }, - } - - if (process.env.NODE_ENV !== "production") { - console.debug("[OnlineEvaluationDrawer] submission payload", { - queryPayload, - queryRevisionId, - evaluatorStepId, - evaluationPayload, - selectedEvaluatorConfig, - matchedPreviewEvaluator, - }) - } - - const evaluationResponse = await createSimpleEvaluation({ - evaluation: evaluationPayload, - }) - const evaluation = evaluationResponse.evaluation - if (!evaluation?.id) { - throw new Error("Failed to create online evaluation.") - } - - if (process.env.NODE_ENV !== "production") { - console.debug("[OnlineEvaluationDrawer] evaluation created", { - evaluation, - }) - } - message.success("Online evaluation created") - onCreate?.(evaluation) - await invalidateUseEvaluatorsQueries() - onClose() - } catch (error) { - const err = error as Error & {errorFields?: unknown} - if (err && "errorFields" in err) { - return - } - message.error(err?.message || "Failed to create online evaluation") - } finally { - setIsSubmitting(false) - } - } - - const evaluatorSummary = useMemo(() => { - if (!selectedEvaluatorConfig) return undefined - const displayName = - selectedEvaluatorConfig.name || selectedEvaluatorConfig?.slug || "Evaluator" - return ( -
    - {displayName} - -
    - ) - }, [selectedEvaluatorConfig, finalTypeLabel, finalTypeColor, evaluatorTypeColors]) - - const querySummary = useMemo(() => { - const summaryParts: string[] = [] - summaryParts.push( - filters.length - ? `${filters.length} filter${filters.length === 1 ? "" : "s"}` - : "No filters", - ) - const rateValue = - typeof samplingRate === "number" - ? samplingRate - : typeof samplingRate === "string" && samplingRate.trim() !== "" - ? samplingRate - : undefined - if (rateValue !== undefined) { - summaryParts.push(`Sampling ${rateValue}%`) - } - summaryParts.push("Live traffic") - return {summaryParts.join(" • ")} - }, [filters.length, samplingRate]) - - const buildPanelHeader = (title: string, summary?: ReactNode) => ( -
    - {title} - {summary ?
    {summary}
    : null} -
    - ) - - return ( - Online evaluation configuration} - open={open} - onClose={onClose} - width={520} - destroyOnClose - closeOnLayoutClick={false} - styles={{body: {padding: 0}, footer: {padding: 8}}} - footer={ -
    -
    - - -
    -
    - } - > -
    - - - - - - - - - - - - Add tags Optional - -
    - } - style={{marginBottom: 0}} - > - - { - if (!option) return false - const query = input.toLowerCase() - if (!query.length) return true - const searchableTexts: string[] = [] - - const searchText = - typeof (option as any)?.searchText === "string" - ? (option as any).searchText - : undefined - if (searchText) { - searchableTexts.push(searchText) - } - if (typeof option.title === "string") { - searchableTexts.push(option.title) - } - if (typeof option.label === "string") { - searchableTexts.push(option.label) - } - if ( - typeof option.value === "string" || - typeof option.value === "number" - ) { - searchableTexts.push(String(option.value)) - } - - return searchableTexts - .map((text) => text.toLowerCase()) - .some((text) => text.includes(query)) - }} - allowClear - /> - {!isLoadingEvaluators && !hasEvaluatorOptions ? ( - - No supported evaluators are available. Add an - evaluator configured as LLM-as-a-judge, Code, Regex - test, or Webhook test to continue. - {evaluatorRegistryHref ? ( - <> - {" "} - - Open evaluator registry - - . - - ) : null} - - ) : null} - - - - - ), - }, - ]} - /> - - - ) -} - -export default OnlineEvaluationDrawer diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/helpers.ts b/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/helpers.ts deleted file mode 100644 index 0905a94722..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/helpers.ts +++ /dev/null @@ -1,126 +0,0 @@ -import type {Filter, FilterConditions} from "@/oss/lib/Types" -import {inferReferenceOptionKey} from "@/oss/components/pages/observability/assets/filters/referenceUtils" - -import type { - QueryConditionPayload, - QueryFilteringPayload, - QueryRevisionDataPayload, -} from "../../../../../services/onlineEvaluations/api" - -const slugify = (value: string) => - value - .trim() - .toLowerCase() - .replace(/[^a-z0-9]+/g, "-") - .replace(/^-+|-+$/g, "") - -export const buildQuerySlug = (name?: string) => { - const normalized = slugify(name ?? "") || "online-evaluation" - return normalized -} - -export const buildEvaluationSlug = (name?: string) => (name ? slugify(name) : "") - -export const toFilteringPayload = (filters: Filter[]): QueryFilteringPayload | undefined => { - if (!filters.length) return undefined - - const conditions: QueryConditionPayload[] = filters - .map((filter) => { - const operator = - filter.operator && filter.operator.trim() - ? filter.operator - : ("is" as FilterConditions) - - if (filter.field === "references") { - return { - field: filter.field, - value: filter.value, - operator, - } - } - - const condition: QueryConditionPayload = { - field: filter.field, - value: filter.value, - operator, - } - - if (filter.key && filter.key.trim()) { - condition.key = filter.key - } - - return condition - }) - .filter((condition): condition is QueryConditionPayload => - Boolean(condition.field && condition.operator), - ) - - return { - operator: "and", - conditions, - } -} - -const collectConditions = ( - node?: QueryFilteringPayload | QueryConditionPayload | null, -): QueryConditionPayload[] => { - if (!node) return [] - if ((node as QueryFilteringPayload)?.conditions) { - const filtering = node as QueryFilteringPayload - return (filtering.conditions || []).flatMap((child) => - collectConditions(child as QueryFilteringPayload | QueryConditionPayload), - ) - } - const condition = node as QueryConditionPayload - if (!condition || (!condition.field && !condition.key)) return [] - return [condition] -} - -export const fromFilteringPayload = (payload?: QueryFilteringPayload | null): Filter[] => { - if (!payload) return [] - return collectConditions(payload).map((condition) => { - const rawOperator = (condition.operator ?? "is").trim() - const operator = (rawOperator || "is") as FilterConditions - const key = - condition.field === "references" - ? inferReferenceOptionKey(condition.value, condition.key) - : condition.key - return { - field: (condition.field ?? condition.key ?? "") as string, - key, - operator, - value: condition.value, - } - }) -} - -export const toWindowingPayload = ({ - samplingRate, - historicalRange, -}: { - samplingRate?: number | null - historicalRange?: string[] -}): QueryRevisionDataPayload["windowing"] => { - const windowing: QueryRevisionDataPayload["windowing"] = {} - - if (typeof samplingRate === "number") { - windowing.rate = Math.min(Math.max(samplingRate / 100, 0), 1) - } - - if (historicalRange && historicalRange.length === 2) { - const [oldest, newest] = historicalRange - windowing.oldest = oldest - windowing.newest = newest - windowing.order = "ascending" - } - - return Object.keys(windowing).length ? windowing : undefined -} - -export const parseSamplingRate = (value: unknown): number | null => { - if (value === undefined || value === null || value === "") return null - const n = typeof value === "number" ? value : Number(value) - if (Number.isNaN(n)) return null - const rounded = Math.round(n) - return Math.min(Math.max(rounded, 0), 100) -} diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/state.ts b/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/state.ts deleted file mode 100644 index 8e314af802..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/state.ts +++ /dev/null @@ -1,72 +0,0 @@ -import {atom} from "jotai" - -import type {Filter} from "@/oss/lib/Types" -import {routerAppIdAtom} from "@/oss/state/app" - -const userFiltersAtom = atom([]) -const traceTypeDefaultEnabledAtom = atom(true) - -const isTraceTypeFilter = (filter: Filter) => (filter.key ?? filter.field) === "trace_type" - -export const onlineEvalFiltersAtom = atom( - (get) => { - const appId = get(routerAppIdAtom) - const userFilters = get(userFiltersAtom) - const defaultEnabled = get(traceTypeDefaultEnabledAtom) - - const hasUserTraceType = userFilters.some(isTraceTypeFilter) - - const softDefaults: Filter[] = [] - if (defaultEnabled && !hasUserTraceType) { - softDefaults.push({ - field: "trace_type", - operator: "is", - value: "invocation", - }) - } - - const appScope: Filter[] = appId - ? [ - { - field: "references", - operator: "in", - value: [ - { - id: String(appId), - "attributes.key": "application", - }, - ], - isPermanent: true, - }, - ] - : [] - - return [...appScope, ...softDefaults, ...userFilters] - }, - (get, set, update: Filter[] | ((prev: Filter[]) => Filter[])) => { - const currentCombined = get(onlineEvalFiltersAtom) - const nextCombined = - typeof update === "function" ? (update as any)(currentCombined) : update - const normalizedNext = Array.isArray(nextCombined) ? nextCombined.filter(Boolean) : [] - - const nextUserFilters = normalizedNext.filter((filter) => !(filter as any).isPermanent) - set(userFiltersAtom, nextUserFilters) - - if (!normalizedNext.some((filter) => !(filter as any).isPermanent)) { - set(traceTypeDefaultEnabledAtom, false) - return - } - - const hadTraceType = currentCombined.some(isTraceTypeFilter) - const hasTraceTypeNext = normalizedNext.some(isTraceTypeFilter) - - if (hadTraceType && !hasTraceTypeNext) { - set(traceTypeDefaultEnabledAtom, false) - } - }, -) - -export const resetOnlineEvalFiltersAtom = atom(null, (get, set) => { - set(userFiltersAtom, []) - set(traceTypeDefaultEnabledAtom, true) -}) diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/styles.ts b/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/styles.ts deleted file mode 100644 index 3f90ba24dc..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/assets/styles.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {createUseStyles} from "react-jss" - -import type {JSSTheme} from "@/oss/lib/Types" - -export const useDrawerStyles = createUseStyles((theme: JSSTheme) => ({ - collapseContainer: { - "& .ant-collapse-header": { - borderBottom: `1px solid ${theme.colorSplit} !important`, - }, - "& .ant-collapse-item": { - display: "flex !important", - flexDirection: "column", - }, - "& .ant-collapse-content": { - borderBottom: `0.1px solid ${theme.colorSplit} !important`, - borderRadius: "0px !important", - }, - }, - collapse: { - "& .ant-collapse-item": { - border: "none !important", - borderRadius: "10px !important", - overflow: "hidden", - backgroundColor: "#FFFFFF", - boxShadow: "0 1px 2px rgba(15, 23, 42, 0.06)", - }, - "& .ant-collapse-item + .ant-collapse-item": { - marginTop: "8px", - }, - "& .ant-collapse-header": { - backgroundColor: `#FAFAFB !important`, - borderBottom: `1px solid ${theme.colorSplit} !important`, - padding: "12px 16px !important", - }, - "& .ant-collapse-content": { - borderTop: "none !important", - borderRadius: "0 0 10px 10px !important", - }, - "& .ant-collapse-content > .ant-collapse-content-box": { - padding: "16px !important", - }, - }, -})) diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/EvaluatorDetailsPreview.tsx b/web/oss/src/components/pages/evaluations/onlineEvaluation/components/EvaluatorDetailsPreview.tsx deleted file mode 100644 index 306fef4d44..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/EvaluatorDetailsPreview.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import {Fragment} from "react" - -import {Form, Tag, Tooltip, Typography} from "antd" - -import type {EvaluatorDetails, OutputMetric, ParameterPreviewItem} from "../types" - -import EvaluatorTypeTag from "./EvaluatorTypeTag" -import PromptPreview from "./PromptPreview" -import ReadOnlyBox from "./ReadOnlyBox" - -const {Text} = Typography - -interface EvaluatorDetailsPreviewProps { - details: EvaluatorDetails - typeLabel?: string - typeColor?: string - fallbackColors?: {backgroundColor?: string; textColor?: string} - showType?: boolean -} - -const renderParameterValue = (param: ParameterPreviewItem) => { - const displayValue = param.displayValue?.trim() - if (!displayValue) { - return Not provided - } - - const isMultiline = displayValue.includes("\n") - const baseContent = isMultiline ? ( -
    -            {displayValue}
    -        
    - ) : ( - {displayValue} - ) - - if (param.fullValue && param.fullValue !== displayValue) { - const labelPrefix = param.key ? `${param.key}: ` : "" - return {baseContent} - } - - return baseContent -} - -const renderOutputType = (metric: OutputMetric) => { - if (!metric.type) return "unknown" - return metric.type -} - -const EvaluatorDetailsPreview = ({ - details, - typeLabel, - typeColor, - fallbackColors, - showType, -}: EvaluatorDetailsPreviewProps) => { - const hasParameters = details.visibleParameters.length > 0 - const hasOutputs = (details.outputs?.length ?? 0) > 0 - const hasPrompt = details.promptSections.length > 0 - - return ( - <> - {showType && typeLabel ? ( - -
    - -
    -
    - ) : null} - - {hasParameters && ( - - {details.visibleParameters.map((param, index) => { - const rawLabel = param.key?.trim() || "Parameter" - const formattedLabel = formatParameterLabel(rawLabel) - const labelNode = - formattedLabel === rawLabel ? ( - formattedLabel - ) : ( - {formattedLabel} - ) - - return ( - - {renderParameterValue(param)} - - ) - })} - - )} - - {/* {details.parameters.length > 0 ? ( - - -
    -                            {JSON.stringify(details.parameterPayload, null, 2)}
    -                        
    -
    -
    - ) : null} */} - - {hasOutputs && - details.outputs.map((metric, index) => ( - - -
    - {metric.name} - - {renderOutputType(metric)} - - {metric.required ? ( - - Required - - ) : ( - - Optional - - )} -
    - {metric.description ? ( -
    {metric.description}
    - ) : null} -
    -
    - ))} - - {hasPrompt && ( - - - - )} - - ) -} - -const formatParameterLabel = (value: string) => { - const trimmed = value.trim() - if (!trimmed) return "Parameter" - - const withSpaces = trimmed - .replace(/([a-z0-9])([A-Z])/g, "$1 $2") - .replace(/[_-]+/g, " ") - .replace(/\s+/g, " ") - .trim() - - if (!withSpaces) return "Parameter" - - return withSpaces - .split(" ") - .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) - .join(" ") -} - -export default EvaluatorDetailsPreview diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/EvaluatorTypeTag.tsx b/web/oss/src/components/pages/evaluations/onlineEvaluation/components/EvaluatorTypeTag.tsx deleted file mode 100644 index 5f0632c476..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/EvaluatorTypeTag.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import {Tag} from "antd" - -interface EvaluatorTypeTagProps { - label?: string - color?: string - fallback?: {backgroundColor?: string; textColor?: string} -} - -const EvaluatorTypeTag = ({label, color, fallback}: EvaluatorTypeTagProps) => { - if (!label) return null - const style = - color == null - ? { - fontSize: 12, - backgroundColor: fallback?.backgroundColor ?? "#EAEFF5", - color: fallback?.textColor ?? "#344054", - } - : {fontSize: 12} - - return ( - - {label} - - ) -} - -export default EvaluatorTypeTag diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/FiltersPreview.tsx b/web/oss/src/components/pages/evaluations/onlineEvaluation/components/FiltersPreview.tsx deleted file mode 100644 index 716febc4a5..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/FiltersPreview.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import {useMemo} from "react" - -import {Typography} from "antd" -import clsx from "clsx" - -import { - fieldConfigByOptionKey, - type FieldConfig, -} from "@/oss/components/pages/observability/assets/filters/fieldAdapter" -import {getOperator} from "@/oss/components/pages/observability/assets/filters/operatorRegistry" -import getFilterColumns from "@/oss/components/pages/observability/assets/getFilterColumns" -import type {Filter, FilterConditions, FilterValue} from "@/oss/lib/Types" - -import type {QueryFilteringPayload} from "../../../../../services/onlineEvaluations/api" -import {fromFilteringPayload} from "../assets/helpers" - -import ReadOnlyBox from "./ReadOnlyBox" - -const {Text} = Typography - -interface FiltersPreviewProps { - filtering?: QueryFilteringPayload | null - filters?: Filter[] - className?: string - compact?: boolean -} - -interface NormalizedFilter { - id: string - fieldLabel: string - operatorLabel: string - valueLabel: string -} - -const formatValue = (value: FilterValue): string => { - if (Array.isArray(value)) { - const parts = value - .map((entry) => formatValue(entry as FilterValue)) - .filter((part) => part && part !== "—") - return parts.length ? parts.join(", ") : "—" - } - if (value && typeof value === "object") { - if ("label" in value && (value as any).label) { - return String((value as any).label) - } - if ("value" in value && (value as any).value) { - return String((value as any).value) - } - const entries = Object.entries(value as Record) - .filter(([, v]) => v !== undefined && v !== null && v !== "") - .map(([key, val]) => `${key}: ${formatValue(val as FilterValue)}`) - if (entries.length === 0) return "—" - return entries.join(", ") - } - if (value === undefined || value === null || value === "") return "—" - return String(value) -} - -const buildNormalizedFilters = ( - filters: Filter[], - fieldMap: Map, -): NormalizedFilter[] => { - if (!filters.length) return [] - - const lookupFieldConfig = (field?: string, key?: string) => { - if (!field && !key) return undefined - if (field && fieldMap.has(field)) return fieldMap.get(field) - if (key && fieldMap.has(key)) return fieldMap.get(key) - return undefined - } - - return filters.map((filter, index) => { - const cfg = lookupFieldConfig(filter.field, filter.key) - const fieldLabel = cfg?.label ?? filter.key ?? filter.field ?? "-" - - const operator = filter.operator as FilterConditions - let operatorLabel = operator || "is" - if (cfg?.operatorOptions) { - const match = cfg.operatorOptions.find((opt) => opt.value === operator) - if (match?.label) { - operatorLabel = match.label - } - } else { - try { - operatorLabel = getOperator(operator).label - } catch { - operatorLabel = operator || "is" - } - } - - let displayValue: FilterValue = filter.value - if (cfg?.toUI) { - try { - displayValue = cfg.toUI(filter.value) - } catch { - displayValue = filter.value - } - } - - const valueLabel = formatValue(displayValue) - - return { - id: `${filter.field || filter.key || "filter"}-${index}`, - fieldLabel, - operatorLabel, - valueLabel, - } - }) -} - -const FiltersPreview = ({filtering, filters, className, compact}: FiltersPreviewProps) => { - const columns = useMemo(() => getFilterColumns(), []) - const fieldMap = useMemo(() => fieldConfigByOptionKey(columns), [columns]) - const normalizedFilters = useMemo(() => { - const baseFilters = filters ?? fromFilteringPayload(filtering) - return buildNormalizedFilters(baseFilters, fieldMap) - }, [filters, filtering, fieldMap]) - - const hasFilters = normalizedFilters.length > 0 - - if (!hasFilters) { - return ( - - No filters - - ) - } - - if (compact) { - return ( -
    - {normalizedFilters.map((item) => ( -
    - {item.fieldLabel}{" "} - {item.operatorLabel}{" "} - {item.valueLabel} -
    - ))} -
    - ) - } - - return ( -
    -
    - Field - Operator - Value -
    - {normalizedFilters.map((item) => ( -
    - {item.fieldLabel} - {item.operatorLabel} - {item.valueLabel} -
    - ))} -
    - ) -} - -export default FiltersPreview diff --git a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/OnlineEvaluationRowActions.tsx b/web/oss/src/components/pages/evaluations/onlineEvaluation/components/OnlineEvaluationRowActions.tsx deleted file mode 100644 index f2a764e3cc..0000000000 --- a/web/oss/src/components/pages/evaluations/onlineEvaluation/components/OnlineEvaluationRowActions.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import {memo, useMemo, useState} from "react" - -import {MoreOutlined} from "@ant-design/icons" -import {Note, Play, Stop, Trash} from "@phosphor-icons/react" -import {Button, Dropdown, MenuProps, message} from "antd" -import {useRouter} from "next/router" - -import {startSimpleEvaluation, stopSimpleEvaluation} from "@/oss/services/onlineEvaluations/api" - -import {extractPrimaryInvocation, buildEvaluationNavigationUrl} from "../../utils" -import {EvaluationRow} from "../types" - -interface OnlineEvaluationRowActionsProps { - record: EvaluationRow - baseAppURL: string - projectURL: string - scope: "app" | "project" - extractAppId: (evaluation: EvaluationRow) => string | undefined - setSelectedEvalRecord: (record: EvaluationRow | undefined) => void - setIsDeleteEvalModalOpen: (value: boolean) => void - mutate?: () => Promise -} - -const OnlineEvaluationRowActions = ({ - record, - baseAppURL, - projectURL, - scope, - extractAppId, - setSelectedEvalRecord, - setIsDeleteEvalModalOpen, - mutate, -}: OnlineEvaluationRowActionsProps) => { - const router = useRouter() - const [loadingKey, setLoadingKey] = useState(null) - const primaryInvocation = extractPrimaryInvocation(record) - const targetAppId = extractAppId(record) || primaryInvocation?.appId - const evaluationId = "id" in record ? record.id : record.key - const flags = ((record as any)?.flags || {}) as { - isActive?: boolean - isClosed?: boolean - } - const isActive = Boolean(flags?.isActive ?? flags?.is_active) - const isClosed = Boolean(flags?.isClosed ?? flags?.is_closed) - const canStart = !isActive && !isClosed - const canStop = isActive - - const handleNavigateDetails = () => { - const pathname = buildEvaluationNavigationUrl({ - scope, - baseAppURL, - projectURL, - appId: targetAppId, - path: `/evaluations/results/${evaluationId}`, - }) - if (scope === "project") { - router.push({ - pathname, - query: targetAppId ? {app_id: targetAppId} : undefined, - }) - } else { - router.push(pathname) - } - } - - const handleAction = async (type: "start" | "stop") => { - if (!evaluationId) return - setLoadingKey(type) - try { - if (type === "start") { - await startSimpleEvaluation(evaluationId) - message.success("Evaluation started") - } else { - await stopSimpleEvaluation(evaluationId) - message.success("Evaluation stopped") - } - await mutate?.() - } catch (error) { - message.error( - type === "start" ? "Failed to start evaluation" : "Failed to stop evaluation", - ) - } finally { - setLoadingKey(null) - } - } - - const items: MenuProps["items"] = useMemo(() => { - const menuItems: MenuProps["items"] = [ - { - key: "details", - label: "Open details", - icon: , - onClick: (e) => { - e.domEvent.stopPropagation() - handleNavigateDetails() - }, - }, - ] - - if (canStart || canStop) { - if (canStart) { - menuItems.push({ - key: "start", - label: "Start evaluation", - icon: , - onClick: (e) => { - e.domEvent.stopPropagation() - handleAction("start") - }, - disabled: loadingKey !== null, - }) - } - if (canStop) { - menuItems.push({ - key: "stop", - label: "Stop evaluation", - icon: , - onClick: (e) => { - e.domEvent.stopPropagation() - handleAction("stop") - }, - disabled: loadingKey !== null, - }) - } - } - - menuItems.push( - {type: "divider"}, - { - key: "delete", - label: "Delete", - icon: , - danger: true, - onClick: (e) => { - e.domEvent.stopPropagation() - setSelectedEvalRecord(record) - setIsDeleteEvalModalOpen(true) - }, - }, - ) - return menuItems - }, [ - canStart, - canStop, - handleNavigateDetails, - loadingKey, - record, - setIsDeleteEvalModalOpen, - setSelectedEvalRecord, - targetAppId, - ]) - - return ( - -
    { selectedRowKeys, ...rowSelection, }} - loading={showTableLoading} - columns={mergedColumns as TableColumnType[]} + loading={isLoading} + columns={mergedColumns as TableColumnType[]} dataSource={traces} bordered style={{cursor: "pointer"}} - sticky={{ - offsetHeader: 0, - offsetScroll: 0, - }} onRow={(record) => ({ onClick: () => { - setSelectedNode(record.span_id) - const isSpanView = traceTabs === "span" - - const targetTraceId = - record.trace_id || - (record as any)?.invocationIds?.trace_id || - (record as any)?.node?.trace_id || - (record as any)?.root?.id || - (record as any)?.traceId || - (record as any)?.trace?.id || - record.span_id || - null - - const targetSpanId = isSpanView - ? record.span_id || null - : record.span_id || null - - if (!targetTraceId) { - console.warn( - "TraceDrawer: unable to determine trace id for record", - record, - ) - return - } - - setSelectedTraceId(targetTraceId) - setTraceDrawerActiveSpan(targetSpanId) - setTraceParam(targetTraceId, {shallow: true}) - if (targetSpanId) { - setSpanParam(targetSpanId, {shallow: true}) + setSelected(record.node.id) + if (traceTabs === "node") { + setSelectedTraceId(record.node.id) } else { - setSpanParam(undefined, {shallow: true}) + setSelectedTraceId(record.root.id) } }, })} @@ -250,16 +170,6 @@ const ObservabilityDashboard = () => { emptyText: , }} /> - {hasMoreTraces && ( - - )} { setSelectedRowKeys([]) }} /> + + {activeTrace && !!traces?.length && ( + setSelectedTraceId("")} + expandable + headerExtra={ + + } + mainContent={selectedItem ? : null} + sideContent={ + + } + extraContent={ + isAnnotationsSectionOpen && + selectedItem && + } + externalKey={`extraContent-${isAnnotationsSectionOpen}`} + className="[&_.ant-drawer-body]:p-0" + /> + )} ) } -export default ObservabilityDashboard +export default () => ( + + + +) diff --git a/web/oss/src/components/pages/observability/assets/EmptyObservability/index.tsx b/web/oss/src/components/pages/observability/assets/EmptyObservability/index.tsx index 3c6b6f68d4..05a640e54a 100644 --- a/web/oss/src/components/pages/observability/assets/EmptyObservability/index.tsx +++ b/web/oss/src/components/pages/observability/assets/EmptyObservability/index.tsx @@ -5,14 +5,10 @@ import {useRouter} from "next/router" import EmptyComponent from "@/oss/components/EmptyComponent" import {useAppId} from "@/oss/hooks/useAppId" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" -import useURL from "@/oss/hooks/useURL" const EmptyObservability = () => { const router = useRouter() const appId = useAppId() - const {baseAppURL} = useURL() - const {goToPlayground} = usePlaygroundNavigation() return (
    @@ -23,7 +19,7 @@ const EmptyObservability = () => { description="Monitor the performance and results of your LLM applications here." primaryCta={{ text: appId ? "Go to Playground" : "Create an Application", - onClick: () => (appId ? goToPlayground() : router.push(baseAppURL)), + onClick: () => router.push(appId ? `/apps/${appId}/playground` : "/apps"), tooltip: "Run your LLM app in the playground to generate and view insights.", }} secondaryCta={{ diff --git a/web/oss/src/components/pages/observability/assets/ObservabilityHeader/index.tsx b/web/oss/src/components/pages/observability/assets/ObservabilityHeader/index.tsx index 5b22b0ca5a..2a7bf3b38e 100644 --- a/web/oss/src/components/pages/observability/assets/ObservabilityHeader/index.tsx +++ b/web/oss/src/components/pages/observability/assets/ObservabilityHeader/index.tsx @@ -1,46 +1,43 @@ -import {useCallback, useEffect, useState, useMemo} from "react" -import {useAtomValue} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" +import {useCallback, useEffect, useState} from "react" import {ArrowClockwise, Database, Export} from "@phosphor-icons/react" -import {Button, Input, Radio, RadioChangeEvent, Space} from "antd" +import {Button, Input, Pagination, Radio, RadioChangeEvent, Space} from "antd" import clsx from "clsx" import dynamic from "next/dynamic" import {SortResult} from "@/oss/components/Filters/Sort" import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" +import {getAppValues} from "@/oss/contexts/app.context" +import {useObservabilityData} from "@/oss/contexts/observability.context" import useLazyEffect from "@/oss/hooks/useLazyEffect" import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" import {convertToCsv, downloadCsv} from "@/oss/lib/helpers/fileManipulations" import {formatCurrency, formatLatency, formatTokenUsage} from "@/oss/lib/helpers/formatters" import {getNodeById} from "@/oss/lib/helpers/observability_helpers" import {Filter, FilterConditions, KeyValuePair} from "@/oss/lib/Types" -import {getAppValues} from "@/oss/state/app" -import {useObservability} from "@/oss/state/newObservability" -import { - getAgData, - getAgDataInputs, - getAgDataOutputs, - getCost, - getLatency, - getTokens, -} from "@/oss/state/newObservability/selectors/tracing" - -import getFilterColumns from "../getFilterColumns" -import {buildAttributeKeyTreeOptions} from "../filters/attributeKeyOptions" + +import {TestsetTraceData} from "../../drawer/TestsetDrawer/assets/types" +import {FILTER_COLUMNS} from "../constants" import {ObservabilityHeaderProps} from "../types" const EditColumns = dynamic(() => import("@/oss/components/Filters/EditColumns"), {ssr: false}) const Filters = dynamic(() => import("@/oss/components/Filters/Filters"), {ssr: false}) const Sort = dynamic(() => import("@/oss/components/Filters/Sort"), {ssr: false}) -const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { +const ObservabilityHeader = ({ + setEditColumns, + selectedRowKeys, + setTestsetDrawerData, + editColumns, + columns, +}: ObservabilityHeaderProps) => { const [isFilterColsDropdownOpen, setIsFilterColsDropdownOpen] = useState(false) const [isScrolled, setIsScrolled] = useState(false) const { traces, isLoading, + count, searchQuery, setSearchQuery, traceTabs, @@ -49,20 +46,11 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { setFilters, sort, setSort, + pagination, + setPagination, fetchTraces, fetchAnnotations, - selectedRowKeys, - setTestsetDrawerData, - editColumns, - setEditColumns, - } = useObservability() - const queryClient = useAtomValue(queryClientAtom) - - const attributeKeyOptions = useMemo(() => buildAttributeKeyTreeOptions(traces), [traces]) - const filterColumns = useMemo( - () => getFilterColumns(attributeKeyOptions), - [attributeKeyOptions], - ) + } = useObservabilityData() useEffect(() => { const handleScroll = () => { @@ -76,11 +64,17 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { } }, []) + const handleToggleColumnVisibility = useCallback((key: string) => { + setEditColumns((prev) => + prev.includes(key) ? prev.filter((item) => item !== key) : [...prev, key], + ) + }, []) + const updateFilter = useCallback( - ({field, operator, value}: {field: string; operator: FilterConditions; value: string}) => { + ({key, operator, value}: {key: string; operator: FilterConditions; value: string}) => { setFilters((prevFilters) => { - const otherFilters = prevFilters.filter((f) => f.field !== field) - return value ? [...otherFilters, {field, operator, value}] : otherFilters + const otherFilters = prevFilters.filter((f) => f.key !== key) + return value ? [...otherFilters, {key, operator, value}] : otherFilters }) }, [setFilters], @@ -92,7 +86,7 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { setSearchQuery(query) if (!query) { - setFilters((prevFilters) => prevFilters.filter((f) => f.field !== "content")) + setFilters((prevFilters) => prevFilters.filter((f) => f.key !== "content")) } }, [setSearchQuery, setFilters], @@ -100,26 +94,22 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { const onSearchQueryApply = useCallback(() => { if (searchQuery) { - updateFilter({ - field: "content", - operator: "contains", - value: searchQuery, - }) + updateFilter({key: "content", operator: "contains", value: searchQuery}) } }, [searchQuery, updateFilter]) const onSearchClear = useCallback(() => { - const isSearchFilterExist = filters.some((item) => item.field === "content") + const isSearchFilterExist = filters.some((item) => item.key === "content") if (isSearchFilterExist) { - setFilters((prevFilters) => prevFilters.filter((f) => f.field !== "content")) + setFilters((prevFilters) => prevFilters.filter((f) => f.key !== "content")) } }, [filters]) // Sync searchQuery with filters state useLazyEffect(() => { - const dataFilter = filters.find((f) => f.field === "content") - setSearchQuery(dataFilter && typeof dataFilter.value === "string" ? dataFilter.value : "") + const dataFilter = filters.find((f) => f.key === "content") + setSearchQuery(dataFilter ? dataFilter.value : "") }, [filters]) const onApplyFilter = useCallback((newFilters: Filter[]) => { @@ -130,40 +120,35 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { setFilters(filter) setSearchQuery("") if (traceTabs === "chat") { - setTraceTabs("trace") + setTraceTabs("tree") } }, []) const onTraceTabChange = useCallback( - (e: RadioChangeEvent) => { + async (e: RadioChangeEvent) => { const selectedTab = e.target.value - queryClient.removeQueries({queryKey: ["tracing"]}) setTraceTabs(selectedTab) if (selectedTab === "chat") { - updateFilter({ - field: "span_type", - operator: "is", - value: selectedTab, - }) + updateFilter({key: "node.type", operator: "is", value: selectedTab}) } else { - const isSpanTypeFilterExist = filters.some( - (item) => item.field === "span_type" && item.value === "chat", + const isNodeTypeFilterExist = filters.some( + (item) => item.key === "node.type" && item.value === "chat", ) - if (isSpanTypeFilterExist) { - setFilters((prevFilters) => prevFilters.filter((f) => f.field !== "span_type")) + if (isNodeTypeFilterExist) { + setFilters((prevFilters) => prevFilters.filter((f) => f.key !== "node.type")) } } }, - [filters, updateFilter, queryClient, setTraceTabs, setFilters], + [filters, traceTabs, updateFilter], ) // Sync traceTabs with filters state useLazyEffect(() => { - const spanTypeFilter = filters.find((f) => f.field === "span_type")?.value + const nodeTypeFilter = filters.find((f) => f.key === "node.type")?.value setTraceTabs((prev) => - spanTypeFilter === "chat" ? "chat" : prev == "chat" ? "trace" : prev, + nodeTypeFilter === "chat" ? "chat" : prev == "chat" ? "tree" : prev, ) }, [filters]) @@ -171,18 +156,28 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { setSort({type, sorted, customRange}) }, []) + const onPaginationChange = (current: number, pageSize: number) => { + setPagination({size: pageSize, page: current}) + } + // reset pagination to page 1 whenever quearies get updated + useLazyEffect(() => { + if (pagination.page > 1) { + setPagination({...pagination, page: 1}) + } + }, [filters, sort, traceTabs]) + const getTestsetTraceData = useCallback(() => { if (!traces?.length) return [] const extractData = selectedRowKeys.map((key, idx) => { const node = getNodeById(traces, key as string) - return {data: getAgData(node) as KeyValuePair, key: node?.key, id: idx + 1} + return {data: node?.data as KeyValuePair, key: node?.key, id: idx + 1} }) if (extractData.length > 0) { - setTestsetDrawerData(extractData) + setTestsetDrawerData(extractData as TestsetTraceData[]) } - }, [traces, selectedRowKeys, setTestsetDrawerData]) + }, [traces, selectedRowKeys]) const onExport = useCallback(async () => { try { @@ -195,30 +190,21 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { } // Helper function to create a trace object - const createTraceObject = (trace: any) => { - const inputs = getAgDataInputs(trace) - const outputs = getAgDataOutputs(trace) - const duration = formatLatency(getLatency(trace)) - const cost = formatCurrency(getCost(trace)) - const usage = formatTokenUsage(getTokens(trace)) - - return { - "Trace ID": trace.trace_id, - Name: trace.span_name || "N/A", - "Span type": trace.span_type || "N/A", - Inputs: convertToStringOrJson(inputs) || "N/A", - Outputs: convertToStringOrJson(outputs) || "N/A", - Duration: duration, - Cost: cost, - Usage: usage, - Timestamp: formatDay({ - date: trace.start_time, - inputFormat: "YYYY-MM-DDTHH:mm:ss.SSSSSS", - outputFormat: "HH:mm:ss DD MMM YYYY", - }), - Status: trace.status_code === "failed" ? "ERROR" : "SUCCESS", - } - } + const createTraceObject = (trace: any) => ({ + "Trace ID": trace.key, + Name: trace.node.name, + "Span type": trace.node.type || "N/A", + Inputs: convertToStringOrJson(trace?.data?.inputs) || "N/A", + Outputs: convertToStringOrJson(trace?.data?.outputs) || "N/A", + Duration: formatLatency(trace?.metrics?.acc?.duration.total / 1000), + Cost: formatCurrency(trace.metrics?.acc?.costs?.total), + Usage: formatTokenUsage(trace.metrics?.acc?.tokens?.total), + Timestamp: formatDay({ + date: trace.time.start, + outputFormat: "HH:mm:ss DD MMM YYYY", + }), + Status: trace.status.code === "failed" ? "ERROR" : "SUCCESS", + }) const csvData = convertToCsv( traces.flatMap((trace) => { @@ -267,7 +253,7 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { /> )} { /> {isScrolled && ( <> - + - Root + Root LLM - All + All @@ -298,19 +284,37 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { onClick={() => getTestsetTraceData()} icon={} disabled={traces.length === 0 || selectedRowKeys.length === 0} - tooltipProps={{title: "Add to testset"}} + tooltipProps={{title: "Add to test set"}} /> )}
    + + + {!isScrolled && (
    - Root + Root LLM - All + All @@ -328,15 +332,15 @@ const ObservabilityHeader = ({columns}: ObservabilityHeaderProps) => { icon={} disabled={traces.length === 0 || selectedRowKeys.length === 0} > - Add to testset + Add to test set { - setEditColumns(keys) - }} + onChange={handleToggleColumnVisibility} />
    diff --git a/web/oss/src/components/pages/observability/assets/constants.ts b/web/oss/src/components/pages/observability/assets/constants.ts index a4de231d3f..035471b7dc 100644 --- a/web/oss/src/components/pages/observability/assets/constants.ts +++ b/web/oss/src/components/pages/observability/assets/constants.ts @@ -1,700 +1,87 @@ -import { - Download, - Gear, - LineSegments, - Sparkle, - ArrowBendRightDownIcon, - MagnifyingGlassIcon, - LightningIcon, - ArrowBendRightUpIcon, - GearFineIcon, - SpinnerIcon, - TreeViewIcon, - TreeStructureIcon, - CoinsIcon, - TimerIcon, - PlusCircleIcon, - WarningOctagonIcon, - PencilIcon, -} from "@phosphor-icons/react" -import {SpanCategory} from "@/oss/services/tracing/types" -import {FilterMenuNode} from "@/oss/components/Filters/types" -import { - STRING_EQU_AND_CONTAINS_OPS, - STRING_SEARCH_OPS, - NUM_OPS, - STRING_EQU_OPS, - COLLECTION_MEMBERSHIP_OPS, -} from "./utils" +import {Download, Gear, LineSegments, Sparkle, TreeStructure} from "@phosphor-icons/react" -export const FILTER_COLUMNS: FilterMenuNode[] = [ - { - kind: "leaf", - label: "Text search", - displayLabel: "Text search", - icon: MagnifyingGlassIcon, - field: "content", - value: "content", - type: "string", - operatorOptions: [{value: "contains", label: "contains"}], - valueInput: {kind: "text", placeholder: "Text"}, - }, - // { - // kind: "leaf", - // label: "Input", - // icon: ArrowBendRightDownIcon, - // field: "attributes.ag.data.inputs", - // type: "string", - // value: "attributes.ag.data.inputs", - // operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - // valueInput: {kind: "text", placeholder: "Value"}, - // }, - // { - // kind: "leaf", - // label: "Output", - // icon: ArrowBendRightUpIcon, - // field: "attributes.ag.data.outputs", - // type: "string", - // value: "attributes.ag.data.outputs", - // operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - // valueInput: {kind: "text", placeholder: "Value"}, - // }, - { - kind: "leaf", - label: "Input Key", - icon: ArrowBendRightDownIcon, - field: "input_keys", - type: "string", - value: "ag.data.inputs", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: {kind: "text", placeholder: "Value"}, - keyInput: { - kind: "select", - placeholder: "Search or enter key", - options: [], - usesAttributeKeyTree: true, - treePath: "ag.data.inputs", - }, - }, - { - kind: "leaf", - label: "Output Key", - icon: ArrowBendRightUpIcon, - field: "output_keys", - type: "string", - value: "ag.data.outputs", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: {kind: "text", placeholder: "Value"}, - keyInput: { - kind: "select", - placeholder: "Search or enter key", - options: [], - usesAttributeKeyTree: true, - treePath: "ag.data.outputs", - }, - }, - { - kind: "group", - label: "Trace", - icon: TreeStructureIcon, - children: [ - { - kind: "leaf", - label: "ID", - displayLabel: "Trace ID", - field: "trace_id", - type: "string", - value: "trace_id", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: { - kind: "text", - placeholder: "Search or enter value", - }, - }, - { - kind: "leaf", - label: "Type", - displayLabel: "Trace Type", - field: "trace_type", - type: "string", - value: "trace_type", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: { - kind: "select", - placeholder: "Search or enter value", - options: [ - {label: "Invocation", value: "invocation"}, - {label: "Annotation", value: "annotation"}, - ], - }, - }, - ], - }, - { - kind: "group", - label: "Span", - icon: TreeViewIcon, - children: [ - { - kind: "leaf", - label: "ID", - displayLabel: "Span ID", - field: "span_id", - type: "string", - value: "span_id", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: { - kind: "text", - placeholder: "Search or enter value", - }, - }, - { - kind: "leaf", - label: "Type", - displayLabel: "Span Type", - field: "span_type", - type: "string", - value: "span_type", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: { - kind: "select", - placeholder: "Search or enter value", - options: [ - {label: "chat", value: "chat"}, - {label: "agent", value: "agent"}, - {label: "workflow", value: "workflow"}, - {label: "chain", value: "chain"}, - {label: "task", value: "task"}, - {label: "tool", value: "tool"}, - {label: "embedding", value: "embedding"}, - {label: "query", value: "query"}, - {label: "rerank", value: "rerank"}, - {label: "llm", value: "llm"}, - ], - }, - }, - { - kind: "leaf", - label: "Name", - displayLabel: "Span Name", - field: "span_name", - type: "string", - value: "span_name", - operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - valueInput: { - kind: "text", - placeholder: "Search or enter value", - }, - }, - ], - }, - { - kind: "leaf", - label: "Duration (ms)", - icon: TimerIcon, - field: "attributes.ag.metrics.duration.cumulative", - type: "number", - value: "attributes.ag.metrics.duration.cumulative", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "group", - label: "Cost ($)", - icon: CoinsIcon, - defaultValue: "attributes.ag.metrics.costs.cumulative.total", - titleClickDisplayLabel: "Total Cost", - children: [ - { - kind: "group", - label: "Completion", - defaultValue: "attributes.ag.metrics.costs.cumulative.completion", - leafDisplayLabel: "Completion Cost", - children: [ - { - kind: "leaf", - field: "attributes.ag.metrics.costs.cumulative.completion", - type: "number", - value: "attributes.ag.metrics.costs.cumulative.completion", - label: "Aggregate", - displayLabel: "Total Completion Cost", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "leaf", - field: "attributes.ag.metrics.costs.incremental.completion", - type: "number", - value: "attributes.ag.metrics.costs.incremental.completion", - label: "Span", - displayLabel: "Total Completion Cost (Span)", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - ], - }, - { - kind: "group", - label: "Prompt", - defaultValue: "attributes.ag.metrics.costs.cumulative.prompt", - leafDisplayLabel: "Prompt Cost", - children: [ - { - kind: "leaf", - field: "attributes.ag.metrics.costs.cumulative.prompt", - type: "number", - value: "attributes.ag.metrics.costs.cumulative.prompt", - label: "Aggregate", - displayLabel: "Total Prompt Cost", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "leaf", - field: "attributes.ag.metrics.costs.incremental.prompt", - type: "number", - value: "attributes.ag.metrics.costs.incremental.prompt", - label: "Span", - displayLabel: "Total Prompt Cost (Span)", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - ], - }, - { - kind: "group", - defaultValue: "attributes.ag.metrics.costs.cumulative.total", - leafDisplayLabel: "Total Cost", - label: "Total", - children: [ - { - kind: "leaf", - field: "attributes.ag.metrics.costs.cumulative.total", - type: "number", - value: "attributes.ag.metrics.costs.cumulative.total", - label: "Aggregate", - displayLabel: "Total Cost", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "leaf", - field: "attributes.ag.metrics.costs.incremental.total", - type: "number", - value: "attributes.ag.metrics.costs.incremental.total", - label: "Span", - displayLabel: "Total Cost (Span)", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - ], - }, - ], - }, - { - kind: "group", - label: "Tokens", - icon: PlusCircleIcon, - defaultValue: "attributes.ag.metrics.tokens.cumulative.total", - titleClickDisplayLabel: "Total Tokens", - children: [ - { - kind: "group", - label: "Completion", - defaultValue: "attributes.ag.metrics.tokens.cumulative.completion", - leafDisplayLabel: "Completion Tokens", - children: [ - { - kind: "leaf", - field: "attributes.ag.metrics.tokens.cumulative.completion", - type: "number", - value: "attributes.ag.metrics.tokens.cumulative.completion", - label: "Aggregate", - displayLabel: "Total Completion Tokens", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "leaf", - field: "attributes.ag.metrics.tokens.incremental.completion", - type: "number", - value: "attributes.ag.metrics.tokens.incremental.completion", - label: "Span", - displayLabel: "Total Completion Tokens (Span)", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - ], - }, - { - kind: "group", - label: "Prompt", - defaultValue: "attributes.ag.metrics.tokens.cumulative.prompt", - leafDisplayLabel: "Prompt Tokens", - children: [ - { - kind: "leaf", - field: "attributes.ag.metrics.tokens.cumulative.prompt", - type: "number", - value: "attributes.ag.metrics.tokens.cumulative.prompt", - label: "Aggregate", - displayLabel: "Total Prompt Tokens", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "leaf", - field: "attributes.ag.metrics.tokens.incremental.prompt", - type: "number", - value: "attributes.ag.metrics.tokens.incremental.prompt", - label: "Span", - displayLabel: "Total Prompt Tokens (Span)", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - ], - }, - { - kind: "group", - defaultValue: "attributes.ag.metrics.tokens.cumulative.total", - leafDisplayLabel: "Total Tokens", - label: "Total", - children: [ - { - kind: "leaf", - field: "attributes.ag.metrics.tokens.cumulative.total", - type: "number", - value: "attributes.ag.metrics.tokens.cumulative.total", - label: "Aggregate", - displayLabel: "Total Tokens", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - { - kind: "leaf", - field: "attributes.ag.metrics.tokens.incremental.total", - type: "number", - value: "attributes.ag.metrics.tokens.incremental.total", - label: "Span", - displayLabel: "Total Tokens (Span)", - operatorOptions: NUM_OPS, - valueInput: { - kind: "text", - placeholder: "Value", - }, - }, - ], - }, - ], - }, - { - kind: "group", - label: "Annotation", - icon: PencilIcon, - children: [ - { - kind: "leaf", - label: "Has Annotation", - field: "has_annotation", - type: "string", - value: "has_annotation", - operatorOptions: COLLECTION_MEMBERSHIP_OPS, - valueInput: { - kind: "text", - placeholder: "Search or enter value", - }, - }, - { - kind: "leaf", - label: "Is Annotation", - field: "is_annotation", - type: "string", - value: "is_annotation", - operatorOptions: COLLECTION_MEMBERSHIP_OPS, - valueInput: { - kind: "text", - placeholder: "Search or enter value", - }, - }, - ], - }, - { - kind: "group", - label: "Status", - icon: SpinnerIcon, - children: [ - { - kind: "leaf", - label: "Code", - displayLabel: "Status Code", - field: "status_code", - type: "string", - value: "status_code", - operatorOptions: STRING_EQU_OPS, - valueInput: { - kind: "select", - placeholder: "Status", - options: [ - {label: "Success", value: "STATUS_CODE_OK"}, - {label: "Failure", value: "STATUS_CODE_ERROR"}, - ], - }, - }, - { - kind: "leaf", - label: "Message", - displayLabel: "Status Message", - field: "status_message", - type: "string", - value: "status_message", - operatorOptions: STRING_SEARCH_OPS, - valueInput: { - kind: "text", - placeholder: "Message", - }, - }, - ], - }, - { - kind: "leaf", - label: "Exception", - icon: WarningOctagonIcon, - type: "exists", - value: "events", - field: "events", - operatorOptions: [ - {value: "in", label: "exist"}, - {value: "not_in", label: "not exists"}, - ], - defaultValue: [{name: "exception"}], - disableValueInput: true, - valueDisplayText: "exception", - }, - { - kind: "group", - label: "Reference", - icon: GearFineIcon, - children: [ - { - kind: "group", - label: "Application", - children: [ - { - kind: "leaf", - field: "references", - type: "exists", - value: "id", - optionKey: "application.id", - queryKey: "application.id", - referenceCategory: "application", - referenceProperty: "id", - label: "ID", - displayLabel: "Application ID", - operatorOptions: [ - {value: "in", label: "is"}, - {value: "not_in", label: "is not"}, - ], - }, - { - kind: "leaf", - field: "references", - type: "exists", - value: "slug", - optionKey: "application.slug", - queryKey: "application.slug", - referenceCategory: "application", - referenceProperty: "slug", - label: "Slug", - displayLabel: "Application Slug", - operatorOptions: [ - {value: "in", label: "is"}, - {value: "not_in", label: "is not"}, - ], - }, - ], - }, - { - kind: "group", - label: "Environment", - children: [ - { - kind: "leaf", - field: "references", - type: "exists", - value: "id", - optionKey: "environment.id", - queryKey: "environment.id", - referenceCategory: "environment", - referenceProperty: "id", - label: "ID", - displayLabel: "Environment ID", - operatorOptions: [ - {value: "in", label: "is"}, - {value: "not_in", label: "is not"}, - ], - }, - { - kind: "leaf", - field: "references", - type: "exists", - value: "slug", - optionKey: "environment.slug", - queryKey: "environment.slug", - referenceCategory: "environment", - referenceProperty: "slug", - label: "Slug", - displayLabel: "Environment Slug", - operatorOptions: [ - {value: "in", label: "is"}, - {value: "not_in", label: "is not"}, - ], - }, - ], - }, - ], - }, - { - kind: "leaf", - label: "Custom", - displayLabel: "Custom", - icon: LightningIcon, - field: "custom", - value: "custom", - type: "string", - keyInput: { - kind: "select", - placeholder: "Search key", - options: [], - usesAttributeKeyTree: true, - }, - operatorOptions: [ - {value: "is", label: "is"}, - {value: "is_not", label: "is not"}, - {value: "contains", label: "contains"}, - {value: "startswith", label: "starts with"}, - {value: "endswith", label: "ends with"}, - {value: "in", label: "in"}, - {value: "not_in", label: "not in"}, - ], - valueInput: {kind: "text", placeholder: "Value"}, - }, - // Tags -> my_tag + IS + blue - // attributes + ag.tags.my_tag + IS + blue - // {kind: "leaf", field: "tags", type: "exists", value: "tags", label: "Tags", icon: TagSimple}, - // { - // kind: "leaf", - // label: "Tags", - // icon: TagSimpleIcon, - // field: "attributes", - // type: "string", - // value: "attributes", - // operatorOptions: STRING_EQU_AND_CONTAINS_OPS, - // valueInput: { - // kind: "select", - // placeholder: "Search or enter value", - // options: [ - // {label: "env1", value: "env1"}, - // {label: "env2", value: "env2"}, - // ], - // }, - // }, +import {NodeType} from "@/oss/services/observability/types" + +export const FILTER_COLUMNS = [ + {type: "exists", value: "tree.id", label: "Tree ID"}, + {type: "exists", value: "node.id", label: "Node ID"}, + {type: "exists", value: "node.type", label: "Node Type"}, + {type: "exists", value: "node.name", label: "Node Name"}, + {type: "number", value: "metrics.acc.duration.total", label: "Duration (ms)"}, + {type: "number", value: "metrics.acc.costs.total", label: "Cost ($)"}, + {type: "number", value: "metrics.acc.tokens.total", label: "Total Tokens"}, + {type: "number", value: "metrics.acc.tokens.prompt", label: "Prompt Tokens"}, + {type: "number", value: "metrics.acc.tokens.completion", label: "Completion Tokens"}, + {type: "exists", value: "status.code", label: "Status Code"}, + {type: "exists", value: "status.message", label: "Status Message"}, + {type: "exists", value: "exception.type", label: "Exception Type"}, + {type: "exists", value: "exception.message", label: "Exception Message"}, + {type: "exists", value: "exception.stacktrace", label: "Exception Stacktrace"}, + {type: "string", value: "content", label: "Content"}, + {type: "exists", value: "refs.application.id", label: "Application ID"}, + {type: "exists", value: "refs.application.slug", label: "Application Slug"}, + {type: "exists", value: "refs.variant.id", label: "Variant ID"}, + {type: "exists", value: "refs.variant.slug", label: "Variant Slug"}, + {type: "exists", value: "refs.variant.version", label: "Variant Version"}, + {type: "exists", value: "refs.environment.id", label: "Environment ID"}, + {type: "exists", value: "refs.environment.slug", label: "Environment Slug"}, + {type: "exists", value: "refs.environment.version", label: "Environment Version"}, ] -export const spanTypeStyles = { - [SpanCategory.AGENT]: { +export const nodeTypeStyles = { + [NodeType.AGENT]: { bgColor: "#E6F4FF", color: "#4096FF", icon: Gear, }, - [SpanCategory.WORKFLOW]: { + [NodeType.WORKFLOW]: { color: "#586673", bgColor: "#F5F7FA", - icon: TreeStructureIcon, + icon: TreeStructure, }, - [SpanCategory.CHAIN]: { + [NodeType.CHAIN]: { bgColor: "#E6F4FF", color: "#4096FF", icon: Gear, }, - [SpanCategory.TASK]: { + [NodeType.TASK]: { bgColor: "#EAEFF5", color: "#586673", - icon: TreeStructureIcon, + icon: TreeStructure, }, - [SpanCategory.TOOL]: { + [NodeType.TOOL]: { bgColor: "#F9F0FF", color: "#9254DE", icon: Download, }, - [SpanCategory.EMBEDDING]: { + [NodeType.EMBEDDING]: { bgColor: "#FFFBE6", color: "#D4B106", icon: LineSegments, }, - [SpanCategory.COMPLETION]: { + [NodeType.COMPLETION]: { bgColor: "#E6FFFB", color: "#13C2C2", icon: Sparkle, }, - [SpanCategory.QUERY]: { + [NodeType.QUERY]: { bgColor: "#FFFBE6", color: "#D4B106", icon: LineSegments, }, - [SpanCategory.CHAT]: { + [NodeType.CHAT]: { bgColor: "#E6FFFB", color: "#13C2C2", icon: Sparkle, }, - [SpanCategory.RERANK]: { + [NodeType.RERANK]: { bgColor: "#FFFBE6", color: "#D4B106", icon: LineSegments, }, - [SpanCategory.LLM]: { - bgColor: "#E6FFFB", - color: "#13C2C2", - icon: Sparkle, - }, - [SpanCategory.UNDEFINED]: { + default: { bgColor: "#F5F7FA", color: "#586673", - icon: TreeStructureIcon, + icon: TreeStructure, }, } diff --git a/web/oss/src/components/pages/observability/assets/filters/attributeKeyOptions.ts b/web/oss/src/components/pages/observability/assets/filters/attributeKeyOptions.ts deleted file mode 100644 index 475a342ea7..0000000000 --- a/web/oss/src/components/pages/observability/assets/filters/attributeKeyOptions.ts +++ /dev/null @@ -1,103 +0,0 @@ -import {TraceSpanNode} from "@/oss/services/tracing/types" -import {SelectOption} from "@/oss/components/Filters/types" - -export type AttributeKeyTreeOption = SelectOption & { - children?: AttributeKeyTreeOption[] - pathLabel: string -} - -type MutableTreeNode = { - children: Map - selectable: boolean -} - -const createNode = (): MutableTreeNode => ({children: new Map(), selectable: false}) - -const ensureChild = (parent: MutableTreeNode, key: string) => { - let child = parent.children.get(key) - if (!child) { - child = createNode() - parent.children.set(key, child) - } - return child -} - -const addPath = (root: MutableTreeNode, path: string[]) => { - if (!path.length) return - let node = root - path.forEach((segment) => { - node = ensureChild(node, segment) - node.selectable = true - }) -} - -const traverseValue = (root: MutableTreeNode, value: unknown, path: string[]) => { - if (value === undefined || value === null) return - - if (Array.isArray(value)) { - if (path.length) addPath(root, path) - value.forEach((item) => { - if (item && typeof item === "object") traverseValue(root, item, path) - }) - return - } - - if (typeof value === "object") { - const entries = Object.entries(value as Record) - if (entries.length === 0) { - if (path.length) addPath(root, path) - return - } - entries.forEach(([key, child]) => { - traverseValue(root, child, [...path, key]) - }) - return - } - - if (path.length) addPath(root, path) -} - -const collectFromSpan = (root: MutableTreeNode, span: TraceSpanNode) => { - const agAttributes = (span.attributes as Record | undefined)?.ag - if (agAttributes && typeof agAttributes === "object") { - traverseValue(root, agAttributes, ["ag"]) - } - - if (Array.isArray(span.children)) { - span.children.forEach((child) => collectFromSpan(root, child as TraceSpanNode)) - } -} - -const toOptions = (node: MutableTreeNode, prefix: string[]): AttributeKeyTreeOption[] => { - const entries = Array.from(node.children.entries()).sort(([a], [b]) => a.localeCompare(b)) - return entries.map(([segment, child]) => { - const path = [...prefix, segment] - const children = toOptions(child, path) - return { - label: segment, - value: `attributes.${path.join(".")}`, - selectable: child.selectable, - pathLabel: path.join("."), - children: children.length ? children : undefined, - } - }) -} - -export const buildAttributeKeyTreeOptions = ( - traces: TraceSpanNode[] | undefined, -): AttributeKeyTreeOption[] => { - if (!Array.isArray(traces) || traces.length === 0) return [] - const root = createNode() - traces.forEach((trace) => collectFromSpan(root, trace)) - const agNode = root.children.get("ag") - if (!agNode) return [] - return [ - { - label: "ag", - value: "attributes.ag", - selectable: agNode.selectable, - pathLabel: "ag", - children: toOptions(agNode, ["ag"]), - }, - ] -} diff --git a/web/oss/src/components/pages/observability/assets/filters/fieldAdapter.ts b/web/oss/src/components/pages/observability/assets/filters/fieldAdapter.ts deleted file mode 100644 index c9b1f14d82..0000000000 --- a/web/oss/src/components/pages/observability/assets/filters/fieldAdapter.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {FilterLeaf, FilterGroup, FilterMenuNode} from "@/oss/components/Filters/types" -import {FilterConditions} from "@/oss/lib/Types" -import {FILTER_COLUMNS} from "../constants" -import {ScalarType, getOperatorsForType} from "./operatorRegistry" - -export type FieldConfig = { - optionKey: string - baseField: string - label: string - type: ScalarType - operatorIds: FilterConditions[] - operatorOptions?: Array<{value: FilterConditions; label: string}> - keyInput?: { - kind: "none" | "text" | "select" - options?: any[] - placeholder?: string - usesAttributeKeyTree?: boolean - treePath?: string - } - valueInput?: {kind: "none" | "text" | "select"; options?: any[]; placeholder?: string} - defaultValue?: any - disableValueInput?: boolean - valueDisplayText?: string - queryKey?: string - referenceProperty?: string - // reference/application/evaluator transforms - toExternal?: (normalized: any) => any - toUI?: (external: any) => any -} - -const toScalar = (leaf: FilterLeaf): ScalarType => leaf.type as ScalarType -const getOptionKey = (leaf: FilterLeaf) => leaf.optionKey ?? leaf.value - -const walk = (nodes: FilterMenuNode[], acc: FieldConfig[]) => { - nodes.forEach((n) => { - if (n.kind === "group") return walk((n as FilterGroup).children, acc) - const leaf = n as FilterLeaf - const t = toScalar(leaf) - const optionKey = getOptionKey(leaf) - const operatorOptions = leaf.operatorOptions?.map((o) => ({ - value: o.value as FilterConditions, - label: o.label, - })) - const operatorIds = (operatorOptions?.map((o) => o.value) ?? - getOperatorsForType(t).map((o) => o.id)) as FilterConditions[] - - const cfg: FieldConfig = { - optionKey, - baseField: leaf.field, - label: leaf.displayLabel ?? leaf.label, - type: t, - operatorIds, - operatorOptions, - keyInput: leaf.keyInput - ? leaf.keyInput.kind === "select" - ? { - kind: "select", - options: (leaf as any).keyInput?.options, - placeholder: leaf.keyInput.placeholder, - usesAttributeKeyTree: (leaf as any).keyInput?.usesAttributeKeyTree, - treePath: (leaf as any).keyInput?.treePath, - } - : leaf.keyInput.kind === "text" - ? { - kind: "text", - placeholder: leaf.keyInput.placeholder, - } - : {kind: "none"} - : {kind: "none"}, - valueInput: leaf.disableValueInput - ? {kind: "none"} - : leaf.valueInput - ? { - kind: leaf.valueInput.kind as any, - options: (leaf as any).valueInput?.options, - placeholder: - leaf.valueInput.kind === "text" - ? leaf.valueInput.placeholder - : undefined, - } - : {kind: "text"}, - defaultValue: leaf.defaultValue, - disableValueInput: !!leaf.disableValueInput, - valueDisplayText: leaf.valueDisplayText, - queryKey: leaf.queryKey, - referenceProperty: leaf.referenceProperty, - } - - // references/application/evaluator → keep simple mapper - if (leaf.referenceCategory && leaf.referenceProperty) { - cfg.toExternal = (normalized: any) => { - const entries = Array.isArray(normalized) - ? normalized - : normalized - ? [normalized] - : [] - const withKey = - leaf.referenceCategory === "application" - ? {"attributes.key": "application"} - : leaf.referenceCategory === "evaluator" - ? {"attributes.key": "evaluator"} - : leaf.referenceCategory === "application_variant" - ? {"attributes.key": "application_variant"} - : {} - return entries.map((v) => - typeof v === "object" && v - ? {...withKey, ...v} - : {...withKey, [leaf.referenceProperty!]: String(v)}, - ) - } - cfg.toUI = (external: any) => { - const arr = Array.isArray(external) ? external : external ? [external] : [] - return arr.map((e: any) => - e && typeof e === "object" ? (e[leaf.referenceProperty!] ?? "") : e, - ) - } - } - - acc.push(cfg) - }) - return acc -} - -export const buildFieldConfigs = (nodes: FilterMenuNode[] = FILTER_COLUMNS): FieldConfig[] => - walk(nodes, []) - -export const fieldConfigByOptionKey = (nodes: FilterMenuNode[] = FILTER_COLUMNS) => { - const map = new Map() - buildFieldConfigs(nodes).forEach((fc) => map.set(fc.optionKey, fc)) - return map -} diff --git a/web/oss/src/components/pages/observability/assets/filters/operatorRegistry.ts b/web/oss/src/components/pages/observability/assets/filters/operatorRegistry.ts deleted file mode 100644 index cd13db9d1c..0000000000 --- a/web/oss/src/components/pages/observability/assets/filters/operatorRegistry.ts +++ /dev/null @@ -1,62 +0,0 @@ -import {FilterConditions} from "@/oss/lib/Types" - -export type ScalarType = "string" | "number" | "exists" -export type ValueShape = "none" | "single" | "list" | "range" - -export type OperatorDef = { - id: FilterConditions - label: string - forTypes: ScalarType[] - valueShape: ValueShape - hidesValue?: boolean -} - -export const OPERATORS: OperatorDef[] = [ - // string search - {id: "contains", label: "contains", forTypes: ["string"], valueShape: "single"}, - {id: "startswith", label: "starts with", forTypes: ["string"], valueShape: "single"}, - {id: "endswith", label: "ends with", forTypes: ["string"], valueShape: "single"}, - - // string equality / membership (shape is adjusted by valueShapeFor below) - {id: "is", label: "is", forTypes: ["string", "exists"], valueShape: "single"}, - {id: "is_not", label: "is not", forTypes: ["string", "exists"], valueShape: "single"}, - - // existence - {id: "exists", label: "exists", forTypes: ["exists"], valueShape: "none", hidesValue: true}, - { - id: "not_exists", - label: "not exists", - forTypes: ["exists"], - valueShape: "none", - hidesValue: true, - }, - - // list membership (explicit) - {id: "in", label: "in", forTypes: ["string", "exists"], valueShape: "list"}, - {id: "not_in", label: "not in", forTypes: ["string", "exists"], valueShape: "list"}, - - // numeric - {id: "eq", label: "=", forTypes: ["number"], valueShape: "single"}, - {id: "neq", label: "!=", forTypes: ["number"], valueShape: "single"}, - {id: "gt", label: ">", forTypes: ["number"], valueShape: "single"}, - {id: "lt", label: "<", forTypes: ["number"], valueShape: "single"}, - {id: "gte", label: ">=", forTypes: ["number"], valueShape: "single"}, - {id: "lte", label: "<=", forTypes: ["number"], valueShape: "single"}, -] - -export const getOperator = (id: FilterConditions) => OPERATORS.find((o) => o.id === id)! - -export const getOperatorsForType = (t: ScalarType) => - OPERATORS.filter((o) => o.forTypes.includes(t)) - -/** - * Resolve the *effective* value shape of an operator for a given field type. - * - "is"/"is_not": single for string, list for exists (select/tag style) - * - everything else: as declared - */ -export const valueShapeFor = (opId: FilterConditions, t: ScalarType): ValueShape => { - if (opId === "is" || opId === "is_not") { - return t === "exists" ? "list" : "single" - } - return getOperator(opId).valueShape -} diff --git a/web/oss/src/components/pages/observability/assets/filters/referenceUtils.ts b/web/oss/src/components/pages/observability/assets/filters/referenceUtils.ts deleted file mode 100644 index 17c2e61211..0000000000 --- a/web/oss/src/components/pages/observability/assets/filters/referenceUtils.ts +++ /dev/null @@ -1,125 +0,0 @@ -import type {FilterValue} from "@/oss/lib/Types" - -type ReferenceCategory = - | "reference" - | "application" - | "evaluator" - | "application_variant" - | "environment" - -const REFERENCE_KEY_PREFIX_MAP: Record, string> = { - application: "application", - evaluator: "evaluator", - application_variant: "application_variant", - environment: "environment", -} - -const isRecord = (value: unknown): value is Record => - typeof value === "object" && value !== null && !Array.isArray(value) - -const coerceArray = (value: T | T[] | undefined | null): T[] => { - if (Array.isArray(value)) return value - if (value === undefined || value === null) return [] - return [value] -} - -const detectCategoryFromValue = (entry: Record): ReferenceCategory => { - const attrKey = entry["attributes.key"] - if (typeof attrKey === "string" && attrKey in REFERENCE_KEY_PREFIX_MAP) { - return attrKey as ReferenceCategory - } - const category = entry.category - if (typeof category === "string" && category in REFERENCE_KEY_PREFIX_MAP) { - return category as ReferenceCategory - } - return "reference" -} - -const detectPropertyFromValue = (entry: Record): string => { - if (entry.version !== undefined && entry.version !== null) return "version" - if (entry.slug !== undefined && entry.slug !== null) return "slug" - if (entry.id !== undefined && entry.id !== null) return "id" - return "id" -} - -export const parseReferenceKey = ( - rawKey?: string, - rawValue?: any, -): {category: ReferenceCategory; property: string} => { - if (typeof rawKey === "string" && rawKey.trim() !== "") { - const [categoryPart, propertyPart] = rawKey.split(".") - if (propertyPart && categoryPart in REFERENCE_KEY_PREFIX_MAP) { - return { - category: categoryPart as ReferenceCategory, - property: propertyPart, - } - } - if (categoryPart === "reference" && propertyPart) { - return {category: "reference", property: propertyPart} - } - if (!propertyPart) { - return {category: "reference", property: categoryPart} - } - } - - const candidates = coerceArray(rawValue) - - for (const candidate of candidates) { - if (!isRecord(candidate)) continue - const category = detectCategoryFromValue(candidate) - const property = detectPropertyFromValue(candidate) - return {category, property} - } - - return {category: "reference", property: "id"} -} - -export const normalizeReferenceValue = ( - rawValue: FilterValue, - property: string, - category: ReferenceCategory, -): Record[] => { - const extras = - category === "reference" - ? undefined - : ({ - "attributes.key": - REFERENCE_KEY_PREFIX_MAP[category as Exclude], - } as Record) - - return coerceArray(rawValue) - .map((entry) => { - if (isRecord(entry)) { - const next: Record = {} - Object.entries(entry).forEach(([key, val]) => { - if (val === undefined || val === null) return - next[key] = typeof val === "string" ? val : String(val) - }) - const value = next[property] - if (!value || value.trim() === "") return undefined - next[property] = value.trim() - if (extras) next["attributes.key"] = extras["attributes.key"] - else if (category === "reference") delete next["attributes.key"] - return next - } - - const str = entry === undefined || entry === null ? "" : String(entry).trim() - if (!str) return undefined - return { - [property]: str, - ...(extras ?? {}), - } - }) - .filter((item): item is Record => Boolean(item)) -} - -export const inferReferenceOptionKey = ( - rawValue: FilterValue, - rawKey?: string, -): string | undefined => { - const {category, property} = parseReferenceKey(rawKey, rawValue) - if (!property) return undefined - if (category === "reference") return property - const prefix = REFERENCE_KEY_PREFIX_MAP[category as Exclude] - return property ? `${prefix}.${property}` : prefix -} diff --git a/web/oss/src/components/pages/observability/assets/filters/rulesEngine.ts b/web/oss/src/components/pages/observability/assets/filters/rulesEngine.ts deleted file mode 100644 index e2b7b4d810..0000000000 --- a/web/oss/src/components/pages/observability/assets/filters/rulesEngine.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {FilterConditions} from "@/oss/lib/Types" -import {FieldConfig} from "./fieldAdapter" -import {getOperator, valueShapeFor} from "./operatorRegistry" - -export type InputPlan = { - needsKey: boolean - showValue: boolean - valueAs: "text" | "select" | "tags" | "range" | "none" - placeholders?: {key?: string; value?: string} - valueOptions?: Array<{label: string; value: string | number}> -} - -export const planInputs = (field: FieldConfig, opId: FilterConditions): InputPlan => { - const op = getOperator(opId) - const shape = valueShapeFor(opId, field.type) - - const needsKey = !!field.keyInput && field.keyInput.kind !== "none" - const showValue = !op.hidesValue && field.valueInput?.kind !== "none" - - let valueAs: InputPlan["valueAs"] = "text" - if (!showValue) valueAs = "none" - else if (shape === "range") valueAs = "range" - else if (shape === "list") valueAs = field.valueInput?.kind === "select" ? "tags" : "text" - else if (shape === "single") valueAs = field.valueInput?.kind === "select" ? "select" : "text" - - return { - needsKey, - showValue, - valueAs, - placeholders: { - key: field.keyInput?.placeholder, - value: field.valueInput?.placeholder ?? (shape === "range" ? "[min, max]" : "Value"), - }, - valueOptions: field.valueInput?.kind === "select" ? field.valueInput.options : undefined, - } -} diff --git a/web/oss/src/components/pages/observability/assets/filters/valueCodec.ts b/web/oss/src/components/pages/observability/assets/filters/valueCodec.ts deleted file mode 100644 index 0fad4cdeb8..0000000000 --- a/web/oss/src/components/pages/observability/assets/filters/valueCodec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import {Filter} from "@/oss/lib/Types" -import {ScalarType, ValueShape, valueShapeFor} from "./operatorRegistry" -import {coerceNumericValue} from "@/oss/state/newObservability" - -const toStringList = (v: unknown): string[] => { - if (Array.isArray(v)) return v.map(String) - if (v == null) return [] - const s = String(v).trim() - if (!s) return [] - if (s.startsWith("[") && s.endsWith("]")) { - try { - const arr = JSON.parse(s) - if (Array.isArray(arr)) return arr.map(String) - } catch {} - } - return s - .split(/[\s,;\n\r\t]+/g) - .map((t) => t.trim()) - .filter(Boolean) -} - -const toNumberPair = (v: unknown): number[] => { - const out: number[] = [] - const push = (raw: any) => { - const n = coerceNumericValue(raw) as any - if (typeof n === "number" && Number.isFinite(n)) out.push(n) - } - if (Array.isArray(v)) v.slice(0, 2).forEach(push) - else if (typeof v === "string") { - const s = v.trim() - if (!s) return [] - if (s.startsWith("[") && s.endsWith("]")) { - try { - const arr = JSON.parse(s) - if (Array.isArray(arr)) arr.slice(0, 2).forEach(push) - } catch {} - } else - s.split(/[\s,;\n\r\t]+/g) - .filter(Boolean) - .slice(0, 2) - .forEach(push) - } - return out.length === 2 ? out : [] -} - -export type NormalizerCtx = { - fieldType: ScalarType - opId: Filter["operator"] - toExternal?: (normalized: any) => any - toUI?: (external: any) => any -} - -export const normalizeValue = (raw: unknown, shape: ValueShape, t: ScalarType) => { - if (shape === "none") return "" - if (shape === "range") return toNumberPair(raw) - if (shape === "list") { - if (Array.isArray(raw)) { - const hasObjects = raw.some( - (item) => item !== null && typeof item === "object" && !Array.isArray(item), - ) - if (hasObjects) return raw - const list = (raw as unknown[]).map((entry) => String(entry)) - return t === "number" ? list.map(coerceNumericValue) : list - } - const list = toStringList(raw) - return t === "number" ? list.map(coerceNumericValue) : list - } - if (Array.isArray(raw)) return raw[0] ?? "" - return t === "number" ? coerceNumericValue(raw as any) : (raw ?? "") -} - -export const toUIValue = (external: any, shape: ValueShape) => { - if (shape === "none") return "" - if (shape === "range") return Array.isArray(external) ? external : [] - if (shape === "list") return Array.isArray(external) ? external : toStringList(external) - return Array.isArray(external) ? (external[0] ?? "") : external -} - -export const normalizeFilter = (f: Filter, ctx: NormalizerCtx): Filter => { - const shape = valueShapeFor(ctx.opId, ctx.fieldType) - const normalized = normalizeValue(f.value, shape, ctx.fieldType) - const value = ctx.toExternal ? ctx.toExternal(normalized) : normalized - return {...f, value} -} diff --git a/web/oss/src/components/pages/observability/assets/getFilterColumns.ts b/web/oss/src/components/pages/observability/assets/getFilterColumns.ts deleted file mode 100644 index 0450f0ee28..0000000000 --- a/web/oss/src/components/pages/observability/assets/getFilterColumns.ts +++ /dev/null @@ -1,87 +0,0 @@ -import {FILTER_COLUMNS} from "./constants" -import {FilterGroup, FilterLeaf, FilterMenuNode} from "@/oss/components/Filters/types" -import {AttributeKeyTreeOption} from "./filters/attributeKeyOptions" - -const cloneTreeOption = (option: AttributeKeyTreeOption): AttributeKeyTreeOption => ({ - ...option, - children: option.children ? option.children.map(cloneTreeOption) : undefined, -}) - -const cloneTreeOptions = ( - options: AttributeKeyTreeOption[] | undefined, -): AttributeKeyTreeOption[] => (options ? options.map(cloneTreeOption) : []) - -const findOptionByPath = ( - options: AttributeKeyTreeOption[] | undefined, - segments: string[], -): AttributeKeyTreeOption | undefined => { - if (!options || segments.length === 0) return undefined - - const [segment, ...rest] = segments - const match = options.find((option) => option.label === segment) - - if (!match) return undefined - if (rest.length === 0) return match - - return findOptionByPath(match.children, rest) -} - -const selectTreeOptions = ( - options: AttributeKeyTreeOption[] | undefined, - treePath?: string, -): AttributeKeyTreeOption[] => { - if (!options || options.length === 0) return [] - if (!treePath) return cloneTreeOptions(options) - - const segments = treePath.split(".").filter(Boolean) - const branch = findOptionByPath(options, segments) - - if (!branch) return [] - - if (branch.children && branch.children.length > 0) { - return cloneTreeOptions(branch.children) - } - - return [cloneTreeOption(branch)] -} - -const cloneNodes = (nodes: FilterMenuNode[]): FilterMenuNode[] => - nodes.map((node) => { - if (node.kind === "group") { - const group = node as FilterGroup - return { - ...group, - children: cloneNodes(group.children), - } - } - return {...(node as FilterLeaf)} - }) - -const applyAttributeKeyOptions = ( - nodes: FilterMenuNode[], - options: AttributeKeyTreeOption[] | undefined, -) => { - if (!options || options.length === 0) return nodes - - nodes.forEach((node) => { - if (node.kind === "group") { - applyAttributeKeyOptions((node as FilterGroup).children, options) - return - } - const leaf = node as FilterLeaf - if (leaf.keyInput?.kind === "select" && leaf.keyInput.usesAttributeKeyTree) { - const {treePath} = leaf.keyInput - leaf.keyInput = { - ...leaf.keyInput, - options: selectTreeOptions(options, treePath), - } - } - }) - return nodes -} - -/** Single entry-point used by the UI */ -const getFilterColumns = (attributeKeyOptions?: AttributeKeyTreeOption[]): FilterMenuNode[] => - applyAttributeKeyOptions(cloneNodes(FILTER_COLUMNS), attributeKeyOptions) - -export default getFilterColumns diff --git a/web/oss/src/components/pages/observability/assets/getObservabilityColumns.tsx b/web/oss/src/components/pages/observability/assets/getObservabilityColumns.tsx index a25c1cee0d..11a10a61cf 100644 --- a/web/oss/src/components/pages/observability/assets/getObservabilityColumns.tsx +++ b/web/oss/src/components/pages/observability/assets/getObservabilityColumns.tsx @@ -1,48 +1,41 @@ +import {Space, Tooltip, Typography} from "antd" import {ColumnsType} from "antd/es/table" import ResultTag from "@/oss/components/ResultTag/ResultTag" import TruncatedTooltipTag from "@/oss/components/TruncatedTooltipTag" +import LabelValuePill from "@/oss/components/ui/LabelValuePill" +import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" +import {formatCurrency, formatLatency, formatTokenUsage} from "@/oss/lib/helpers/formatters" import {getStringOrJson} from "@/oss/lib/helpers/utils" -import {TraceSpanNode} from "@/oss/services/tracing/types" +import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" +import {TracesWithAnnotations} from "@/oss/services/observability/types" -import CostCell from "../components/CostCell" -import DurationCell from "../components/DurationCell" -import EvaluatorMetricsCell from "../components/EvaluatorMetricsCell" -import NodeNameCell from "../components/NodeNameCell" import StatusRenderer from "../components/StatusRenderer" -import TimestampCell from "../components/TimestampCell" -import UsageCell from "../components/UsageCell" -import { - getCost, - getLatency, - getTokens, - getTraceInputs, - getTraceOutputs, -} from "@/oss/state/newObservability" + +import {nodeTypeStyles} from "./constants" interface ObservabilityColumnsProps { - evaluatorSlugs: string[] + annotations: AnnotationDto[] } -export const getObservabilityColumns = ({evaluatorSlugs}: ObservabilityColumnsProps) => { - const columns: ColumnsType = [ +export const getObservabilityColumns = ({annotations}: ObservabilityColumnsProps) => { + const columns: ColumnsType = [ { title: "ID", - dataIndex: ["span_id"], + dataIndex: ["node", "id"], key: "key", width: 200, onHeaderCell: () => ({ style: {minWidth: 200}, }), - defaultHidden: true, fixed: "left", render: (_, record) => { - return + return }, }, { title: "Name", - dataIndex: ["span_name"], + dataIndex: ["node", "name"], key: "name", ellipsis: true, width: 200, @@ -50,19 +43,37 @@ export const getObservabilityColumns = ({evaluatorSlugs}: ObservabilityColumnsPr style: {minWidth: 200}, }), fixed: "left", - render: (_, record) => , + render: (_, record) => { + const {icon: Icon} = nodeTypeStyles[record.node.type ?? "default"] + + return ( + +
    + +
    + + {record.node.name.length >= 15 ? ( + + {record.node.name.slice(0, 15)}... + + ) : ( + record.node.name + )} + +
    + ) + }, }, { title: "Span type", key: "span_type", - dataIndex: ["span_type"], - defaultHidden: true, + dataIndex: ["node", "type"], width: 200, onHeaderCell: () => ({ style: {minWidth: 200}, }), render: (_, record) => { - return
    {record.span_type}
    + return
    {record.node.type}
    }, }, { @@ -71,10 +82,9 @@ export const getObservabilityColumns = ({evaluatorSlugs}: ObservabilityColumnsPr width: 400, className: "overflow-hidden text-ellipsis whitespace-nowrap max-w-[400px]", render: (_, record) => { - const inputs = getTraceInputs(record) return ( ) @@ -86,10 +96,9 @@ export const getObservabilityColumns = ({evaluatorSlugs}: ObservabilityColumnsPr width: 400, className: "overflow-hidden text-ellipsis whitespace-nowrap max-w-[400px]", render: (_, record) => { - const outputs = getTraceOutputs(record) return ( ) @@ -99,83 +108,120 @@ export const getObservabilityColumns = ({evaluatorSlugs}: ObservabilityColumnsPr title: "Evaluators", key: "evaluators", align: "start", - children: evaluatorSlugs.map((evaluatorSlug) => ({ + children: Array.from( + new Set(annotations.map((a) => a.references?.evaluator?.slug).filter(Boolean)), + ).map((evaluatorSlug) => ({ title: "", key: evaluatorSlug, onHeaderCell: () => ({ style: {display: "none"}, }), - render: (_, record) => ( - - ), + render: (_, record) => { + const metrics = record.aggregatedEvaluatorMetrics?.[evaluatorSlug || ""] + if (!metrics) { + return + } + + return ( +
    +
    + + {evaluatorSlug} + + + + {Object.keys(metrics).length}{" "} + {Object.keys(metrics).length === 1 ? "metric" : "metrics"} + +
    + +
    + {Object.entries(metrics).map(([metricName, rawData]) => { + const data = rawData as {average?: number} + + return ( + + ) + })} +
    +
    + ) + }, })), }, { title: "Duration", key: "duration", dataIndex: ["time", "span"], - width: 90, + width: 80, onHeaderCell: () => ({ - style: {minWidth: 90}, + style: {minWidth: 80}, }), - render: (_, record) => { - const duration = getLatency(record) - return - }, + render: (_, record) => ( +
    + {formatLatency( + record?.metrics?.acc?.duration?.total + ? record?.metrics?.acc?.duration?.total / 1000 + : null, + )} +
    + ), }, { title: "Cost", key: "cost", - dataIndex: ["attributes", "ag", "metrics", "costs", "cumulative", "total"], - width: 90, + dataIndex: ["metrics", "acc", "costs", "total"], + width: 80, onHeaderCell: () => ({ - style: {minWidth: 90}, + style: {minWidth: 80}, }), - render: (_, record) => { - const cost = getCost(record) - return - }, + render: (_, record) =>
    {formatCurrency(record.metrics?.acc?.costs?.total)}
    , }, { title: "Usage", key: "usage", - dataIndex: ["attributes", "ag", "metrics", "tokens", "cumulative", "total"], - width: 90, + dataIndex: ["metrics", "acc", "tokens", "total"], + width: 80, onHeaderCell: () => ({ - style: {minWidth: 90}, + style: {minWidth: 80}, }), - render: (_, record) => { - const tokens = getTokens(record) - return - }, + render: (_, record) => ( +
    {formatTokenUsage(record.metrics?.acc?.tokens?.total)}
    + ), }, { title: "Timestamp", key: "timestamp", - dataIndex: ["created_at"], + dataIndex: ["lifecycle", "created_at"], width: 200, onHeaderCell: () => ({ style: {minWidth: 200}, }), - render: (_, record) => , + render: (_, record) => { + return ( +
    + {formatDay({ + date: record.lifecycle?.created_at, + outputFormat: "HH:mm:ss DD MMM YYYY", + })} +
    + ) + }, }, { title: "Status", key: "status", - dataIndex: ["status_code"], + dataIndex: ["status", "code"], width: 160, onHeaderCell: () => ({ style: {minWidth: 160}, }), - render: (_, record) => - StatusRenderer({ - status: record.status_code, - message: record.status_message, - showMore: true, - }), + render: (_, record) => StatusRenderer({status: record.status, showMore: true}), }, ] diff --git a/web/oss/src/components/pages/observability/assets/types.d.ts b/web/oss/src/components/pages/observability/assets/types.d.ts index abc74ffcb8..0f0f0974d5 100644 --- a/web/oss/src/components/pages/observability/assets/types.d.ts +++ b/web/oss/src/components/pages/observability/assets/types.d.ts @@ -1,12 +1,20 @@ +import {Dispatch, SetStateAction, Key} from "react" + import {Avatar} from "antd" import {ColumnsType} from "antd/es/table" -import {TraceSpanNode} from "@/oss/services/tracing/types" +import {_AgentaRootsResponse, TracesWithAnnotations} from "@/oss/services/observability/types" + +import {TestsetTraceData} from "../../drawer/TestsetDrawer/assets/types" export interface ObservabilityHeaderProps { - columns: ColumnsType + setEditColumns: Dispatch> + selectedRowKeys: Key[] + setTestsetDrawerData: Dispatch> + editColumns: string[] + columns: ColumnsType } export type AvatarTreeContentProps = { - value: TraceSpanNode + value: _AgentaRootsResponse } & React.ComponentProps diff --git a/web/oss/src/components/pages/observability/assets/utils.ts b/web/oss/src/components/pages/observability/assets/utils.ts index 5ba7f5f07f..f9f7d9cbb3 100644 --- a/web/oss/src/components/pages/observability/assets/utils.ts +++ b/web/oss/src/components/pages/observability/assets/utils.ts @@ -1,11 +1,47 @@ -import {TraceSpanNode} from "@/oss/services/tracing/types" +import {_AgentaRootsResponse} from "@/oss/services/observability/types" + +export const filterColumns = [ + {type: "exists", value: "tree.id", label: "tree ID"}, + {type: "exists", value: "node.id", label: "node ID"}, + {type: "exists", value: "node.type", label: "node type"}, + {type: "exists", value: "node.name", label: "node name"}, + {type: "exists", value: "status.code", label: "status code"}, + {type: "exists", value: "status.message", label: "status message"}, + {type: "exists", value: "exception.type", label: "exception type"}, + {type: "exists", value: "exception.message", label: "exception message"}, + {type: "exists", value: "exception.stacktrace", label: "exception stacktrace"}, + {type: "string", value: "content", label: "content"}, + {type: "number", value: "metrics.acc.duration.total", label: "duration"}, + {type: "number", value: "metrics.acc.costs.total", label: "cost"}, + { + type: "number", + value: "metrics.acc.tokens.prompt", + label: "prompt tokens (accumulated)", + }, + { + type: "number", + value: "metrics.acc.tokens.completion", + label: "completion tokens (accumulated)", + }, + {type: "number", value: "metrics.acc.tokens.total", label: "usage"}, + {type: "number", value: "metrics.unit.tokens.prompt", label: "prompt tokens"}, + {type: "number", value: "metrics.unit.tokens.completion", label: "completion tokens"}, + {type: "exists", value: "refs.variant.id", label: "variant ID"}, + {type: "exists", value: "refs.variant.slug", label: "variant slug"}, + {type: "exists", value: "refs.variant.version", label: "variant version"}, + {type: "exists", value: "refs.environment.id", label: "environment ID"}, + {type: "exists", value: "refs.environment.slug", label: "environment slug"}, + {type: "exists", value: "refs.environment.version", label: "environment version"}, + {type: "exists", value: "refs.application.id", label: "application ID"}, + {type: "exists", value: "refs.application.slug", label: "application slug"}, +] -export const filterTree = (node: TraceSpanNode, search: string) => { - const nameMatches = node.span_name?.toLowerCase().includes(search.toLowerCase()) +export const filterTree = (node: _AgentaRootsResponse, search: string) => { + const nameMatches = node.node?.name?.toLowerCase().includes(search.toLowerCase()) const filteredChildren = (node.children || []) .map((child) => filterTree(child, search)) - .filter(Boolean) as TraceSpanNode[] + .filter(Boolean) as _AgentaRootsResponse[] if (nameMatches || filteredChildren.length > 0) { return { @@ -16,42 +52,3 @@ export const filterTree = (node: TraceSpanNode, search: string) => { return null } - -import {FilterConditions} from "@/oss/lib/Types" - -export const COLLECTION_MEMBERSHIP_OPS: Array<{value: FilterConditions; label: string}> = [ - {value: "in", label: "contains"}, - {value: "not_in", label: "does not contain"}, -] - -export const STRING_EQU_OPS: Array<{value: FilterConditions; label: string}> = [ - {value: "is", label: "is"}, - {value: "is_not", label: "is not"}, -] - -export const STRING_EQU_AND_CONTAINS_OPS: Array<{value: FilterConditions; label: string}> = [ - ...STRING_EQU_OPS, - ...COLLECTION_MEMBERSHIP_OPS, -] - -export const EXISTS_OPS: Array<{value: FilterConditions; label: string}> = [ - {value: "exists", label: "exists"}, - {value: "not_exists", label: "not exists"}, -] - -export const STRING_SEARCH_OPS: Array<{value: FilterConditions; label: string}> = [ - {value: "contains", label: "contains"}, - {value: "startswith", label: "starts with"}, - {value: "endswith", label: "ends with"}, - // {value: "matches", label: "matches"}, - // {value: "like", label: "like"}, -] - -export const NUM_OPS: Array<{value: FilterConditions; label: string}> = [ - {value: "eq", label: "="}, - {value: "neq", label: "!="}, - {value: "gt", label: ">"}, - {value: "lt", label: "<"}, - {value: "gte", label: ">="}, - {value: "lte", label: "<="}, -] diff --git a/web/oss/src/components/pages/observability/components/AccordionTreePanel.tsx b/web/oss/src/components/pages/observability/components/AccordionTreePanel.tsx index ae735e53bd..98358f4a61 100644 --- a/web/oss/src/components/pages/observability/components/AccordionTreePanel.tsx +++ b/web/oss/src/components/pages/observability/components/AccordionTreePanel.tsx @@ -1,21 +1,17 @@ -import {useCallback, useEffect, useMemo, useRef, useState} from "react" +import {useEffect, useMemo, useRef, useState} from "react" -import {MarkdownLogoIcon, TextAa} from "@phosphor-icons/react" +import Editor from "@monaco-editor/react" import {Collapse, Radio, Space} from "antd" import yaml from "js-yaml" import {createUseStyles} from "react-jss" import CopyButton from "@/oss/components/CopyButton/CopyButton" -import {EditorProvider, useLexicalComposerContext} from "@/oss/components/Editor/Editor" -import EditorWrapper from "@/oss/components/Editor/Editor" -import {ON_CHANGE_LANGUAGE} from "@/oss/components/Editor/plugins/code" -import {TOGGLE_MARKDOWN_VIEW} from "@/oss/components/Editor/plugins/markdown/commands" -import EnhancedButton from "@/oss/components/Playground/assets/EnhancedButton" +import {useAppTheme} from "@/oss/components/Layout/ThemeContextProvider" import {getStringOrJson} from "@/oss/lib/helpers/utils" import {JSSTheme} from "@/oss/lib/Types" type AccordionTreePanelProps = { - value: Record | string + value: Record label: string enableFormatSwitcher?: boolean bgColor?: string @@ -25,6 +21,7 @@ type AccordionTreePanelProps = { const useStyles = createUseStyles((theme: JSSTheme) => ({ collapseContainer: ({bgColor}: {bgColor?: string}) => ({ backgroundColor: "unset", + height: "100%", display: "flex", flexDirection: "column", "& .ant-collapse-item": { @@ -59,71 +56,21 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ }, }), editor: ({bgColor}: {bgColor?: string}) => ({ - "& .agenta-editor-wrapper": { + "& .monaco-editor .monaco-editor-background": { backgroundColor: bgColor, }, - "& .editor-code": { - backgroundColor: "transparent", - margin: 0, + "& .monaco-editor .margin": { + backgroundColor: bgColor, + }, + "& .monaco-editor .scrollbar.vertical .slider": { + borderRadius: 6, + }, + "& .monaco-editor .scrollbar.vertical": { + backgroundColor: theme.colorBgContainerDisabled, }, }), })) -const LanguageAwareViewer = ({ - initialValue, - language, -}: { - initialValue: string - language: "json" | "yaml" -}) => { - const [editor] = useLexicalComposerContext() - const changeLanguage = useCallback( - (lang: "json" | "yaml") => { - editor.dispatchCommand(ON_CHANGE_LANGUAGE, {language: lang}) - }, - [editor], - ) - - useEffect(() => { - if (language === "json" || language === "yaml") { - changeLanguage(language) - } - editor.setEditable(false) - }, [language, changeLanguage, editor]) - - return ( - - ) -} - -const MarkdownToggleButton = () => { - const [editor] = useLexicalComposerContext() - const [markdownView, setMarkdownView] = useState(false) - - return ( - : } - type="text" - onClick={() => { - setMarkdownView((prev) => !prev) - editor.dispatchCommand(TOGGLE_MARKDOWN_VIEW, undefined) - }} - tooltipProps={{ - title: !markdownView ? "Preview text" : "Preview markdown", - }} - /> - ) -} - const AccordionTreePanel = ({ value, label, @@ -133,11 +80,13 @@ const AccordionTreePanel = ({ ...props }: AccordionTreePanelProps) => { const classes = useStyles({bgColor}) - const [segmentedValue, setSegmentedValue] = useState<"json" | "yaml">("json") + const {appTheme} = useAppTheme() + const [segmentedValue, setSegmentedValue] = useState("JSON") const editorRef = useRef(null) + const [editorHeight, setEditorHeight] = useState(200) const yamlOutput = useMemo(() => { - if (segmentedValue === "yaml" && value && Object.keys(value).length) { + if (segmentedValue === "YAML" && value && Object.keys(value).length) { try { const jsonObject = JSON.parse(getStringOrJson(value)) return yaml.dump(jsonObject) @@ -149,7 +98,11 @@ const AccordionTreePanel = ({ return "" }, [segmentedValue, value]) - const collapse = ( + useEffect(() => { + setEditorHeight(Math.min(editorRef.current?.clientHeight || 200, 800)) + }, [value, label, segmentedValue, yamlOutput]) + + return ( - {typeof value === "string" ? ( -
    - -
    - ) : ( - - { + const model = editor.getModel() + + if (model) { + const updateHeight = () => { + const contentHeight = editor.getContentHeight() + setEditorHeight(contentHeight) } - language={segmentedValue} - /> - - )} + editor.onDidContentSizeChange(updateHeight) + updateHeight() + } + }} + /> ), extra: ( @@ -205,18 +174,15 @@ const AccordionTreePanel = ({ {enableFormatSwitcher && typeof value !== "string" && ( - setSegmentedValue(e.target.value as "json" | "yaml") - } + onChange={(e) => setSegmentedValue(e.target.value)} > - JSON - YAML + JSON + YAML )} - {typeof value === "string" && } ) - - if (typeof value === "string") { - return ( - - {collapse} - - ) - } - - return collapse } export default AccordionTreePanel diff --git a/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx b/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx index 2e05aa4ffb..0458758279 100644 --- a/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx +++ b/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx @@ -1,11 +1,12 @@ import {Avatar} from "antd" +import {NodeType} from "@/oss/services/observability/types" + +import {nodeTypeStyles} from "../assets/constants" import {AvatarTreeContentProps} from "../assets/types" -import {spanTypeStyles} from "../assets/constants" -import {SpanCategory} from "@/oss/services/tracing/types" -export const statusMapper = (span: SpanCategory | null | undefined) => { - const {bgColor, color, icon: Icon} = spanTypeStyles[span ?? "undefined"] +export const statusMapper = (node: NodeType | null | undefined) => { + const {bgColor, color, icon: Icon} = nodeTypeStyles[node ?? "default"] return { bgColor, color, @@ -14,8 +15,8 @@ export const statusMapper = (span: SpanCategory | null | undefined) => { } const AvatarTreeContent = ({value, ...props}: AvatarTreeContentProps) => { - const {span_type} = value || {} - const {icon} = statusMapper(span_type) + const {node} = value || {} + const {icon} = statusMapper(node?.type) return ( { - const formatted = useAtomValue(formattedCostAtomFamily(cost)) - return
    {formatted}
    -}) - -export default CostCell diff --git a/web/oss/src/components/pages/observability/components/DeleteTraceModal.tsx b/web/oss/src/components/pages/observability/components/DeleteTraceModal.tsx index 3f36ae4d08..2006453e5a 100644 --- a/web/oss/src/components/pages/observability/components/DeleteTraceModal.tsx +++ b/web/oss/src/components/pages/observability/components/DeleteTraceModal.tsx @@ -2,33 +2,29 @@ import {useState} from "react" import {DeleteOutlined} from "@ant-design/icons" import {Modal} from "antd" -import {useSetAtom} from "jotai" -import {closeTraceDrawerAtom} from "@/oss/components/Playground/Components/Drawers/TraceDrawer/store/traceDrawerStore" -import {useObservability} from "@/oss/state/newObservability" -import {deletePreviewTrace} from "@/oss/services/tracing/api" +import {useObservabilityData} from "@/oss/contexts/observability.context" +import {deleteTrace} from "@/oss/services/observability/core" type DeleteTraceModalProps = { setSelectedTraceId: (val: string) => void - activeTraceId: string + activeTraceNodeId: string } & React.ComponentProps -const DeleteTraceModal = ({setSelectedTraceId, activeTraceId, ...props}: DeleteTraceModalProps) => { - const {fetchTraces, setSelectedTraceId: setGlobalSelectedTraceId} = useObservability() - const closeDrawer = useSetAtom(closeTraceDrawerAtom) +const DeleteTraceModal = ({ + setSelectedTraceId, + activeTraceNodeId, + ...props +}: DeleteTraceModalProps) => { + const {fetchTraces} = useObservabilityData() const [isLoading, setIsLoading] = useState(false) const handleDelete = async () => { try { setIsLoading(true) - await deletePreviewTrace(activeTraceId) - await fetchTraces() - // Clear both local (drawer) and global (observability) selections + await deleteTrace(activeTraceNodeId) + fetchTraces() setSelectedTraceId("") - setGlobalSelectedTraceId("") - // Close modal and drawer on success to avoid dangling state - props.onCancel?.({} as any) - closeDrawer() } catch (error) { console.error(error) } finally { diff --git a/web/oss/src/components/pages/observability/components/DurationCell.tsx b/web/oss/src/components/pages/observability/components/DurationCell.tsx deleted file mode 100644 index d4245bdd30..0000000000 --- a/web/oss/src/components/pages/observability/components/DurationCell.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import {memo} from "react" - -import {useAtomValue} from "jotai" - -import {formattedDurationAtomFamily} from "@/oss/state/newObservability" - -interface Props { - ms?: number -} - -const DurationCell = memo(({ms}: Props) => { - const formatted = useAtomValue(formattedDurationAtomFamily(ms)) - return
    {formatted}
    -}) - -export default DurationCell diff --git a/web/oss/src/components/pages/observability/components/EvaluatorMetricsCell.tsx b/web/oss/src/components/pages/observability/components/EvaluatorMetricsCell.tsx deleted file mode 100644 index 2cbecc3264..0000000000 --- a/web/oss/src/components/pages/observability/components/EvaluatorMetricsCell.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import {memo} from "react" - -import {Typography} from "antd" -import {useAtomValue} from "jotai" - -import LabelValuePill from "@/oss/components/ui/LabelValuePill" -import {traceAnnotationInfoAtomFamily} from "@/oss/state/newObservability" - -interface Props { - invocationKey: string - evaluatorSlug: string -} - -const EvaluatorMetricsCell = memo(({invocationKey, evaluatorSlug}: Props) => { - const {aggregatedEvaluatorMetrics} = useAtomValue(traceAnnotationInfoAtomFamily(invocationKey)) - const metrics = aggregatedEvaluatorMetrics?.[evaluatorSlug] - - if (!metrics) { - return - } - - return ( -
    -
    - {evaluatorSlug} - - {Object.keys(metrics).length}{" "} - {Object.keys(metrics).length === 1 ? "metric" : "metrics"} - -
    -
    - {Object.entries(metrics).map(([metricName, rawData]) => { - const data = rawData as {average?: number} - return ( - - ) - })} -
    -
    - ) -}) - -export default EvaluatorMetricsCell diff --git a/web/oss/src/components/pages/observability/components/NodeNameCell.tsx b/web/oss/src/components/pages/observability/components/NodeNameCell.tsx deleted file mode 100644 index c0730b3f32..0000000000 --- a/web/oss/src/components/pages/observability/components/NodeNameCell.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import {memo} from "react" - -import {Space, Tooltip, Typography} from "antd" -import {useAtomValue} from "jotai" - -import {nodeDisplayNameAtomFamily} from "@/oss/state/newObservability" - -import {spanTypeStyles} from "../assets/constants" -import {SpanCategory} from "@/oss/services/tracing/types" - -interface Props { - name: string - type?: SpanCategory -} - -const NodeNameCell = memo(({name, type}: Props) => { - const display = useAtomValue(nodeDisplayNameAtomFamily(name)) - const {icon: Icon} = spanTypeStyles[type ?? "undefined"] - - return ( - -
    - -
    - - {display.truncated ? ( - - {display.text} - - ) : ( - display.text - )} - -
    - ) -}) - -export default NodeNameCell diff --git a/web/oss/src/components/pages/observability/components/StatusRenderer.tsx b/web/oss/src/components/pages/observability/components/StatusRenderer.tsx index 8c6bd4a241..2689b05cf8 100644 --- a/web/oss/src/components/pages/observability/components/StatusRenderer.tsx +++ b/web/oss/src/components/pages/observability/components/StatusRenderer.tsx @@ -1,11 +1,12 @@ +// @ts-nocheck import {CheckCircleOutlined, CloseCircleOutlined, InfoCircleOutlined} from "@ant-design/icons" import {Space, Tag, Tooltip} from "antd" -import {StatusCode} from "@/oss/services/tracing/types" +import {NodeStatusCode, NodeStatusDTO} from "@/oss/services/observability/types" -export const statusMapper = (status: StatusCode) => { +export const statusMapper = (status: NodeStatusCode) => { switch (status) { - case StatusCode.STATUS_CODE_ERROR: + case NodeStatusCode.ERROR: return { label: "failure", color: "error", @@ -22,19 +23,17 @@ export const statusMapper = (status: StatusCode) => { const StatusRenderer = ({ status, - message, showMore = false, }: { - status?: StatusCode - message?: string + status?: NodeStatusDTO showMore?: boolean }) => { - const {label, color, icon} = statusMapper(status || StatusCode.STATUS_CODE_UNSET) - const errorMsg = status === StatusCode.STATUS_CODE_ERROR ? message : null + const {label, color, icon} = statusMapper(status?.code) + const errorMsg = status?.code === NodeStatusCode.ERROR ? status?.message : null return ( - + {label} {showMore && errorMsg && ( diff --git a/web/oss/src/components/pages/observability/components/TimestampCell.tsx b/web/oss/src/components/pages/observability/components/TimestampCell.tsx deleted file mode 100644 index 2d593f04ce..0000000000 --- a/web/oss/src/components/pages/observability/components/TimestampCell.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import {memo} from "react" - -import {useAtomValue} from "jotai" - -import {formattedTimestampAtomFamily} from "@/oss/state/newObservability" - -interface Props { - timestamp?: string -} - -const TimestampCell = memo(({timestamp}: Props) => { - const formatted = useAtomValue(formattedTimestampAtomFamily(timestamp)) - return
    {formatted}
    -}) - -export default TimestampCell diff --git a/web/oss/src/components/pages/observability/components/UsageCell.tsx b/web/oss/src/components/pages/observability/components/UsageCell.tsx deleted file mode 100644 index c28125531a..0000000000 --- a/web/oss/src/components/pages/observability/components/UsageCell.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import {memo} from "react" - -import {useAtomValue} from "jotai" - -import {formattedUsageAtomFamily} from "@/oss/state/newObservability" - -interface Props { - tokens?: number -} - -const UsageCell = memo(({tokens}: Props) => { - const formatted = useAtomValue(formattedUsageAtomFamily(tokens)) - return
    {formatted}
    -}) - -export default UsageCell diff --git a/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/Annotate/index.tsx b/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/Annotate/index.tsx index dedcd4143e..0216ae1456 100644 --- a/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/Annotate/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/Annotate/index.tsx @@ -30,7 +30,6 @@ const Annotate = ({ }: AnnotateProps) => { const {data: evaluators} = useEvaluators({ preview: true, - queries: {is_human: true}, }) // converting selected evaluator into useable metrics diff --git a/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/AnnotateDrawerTitle/index.tsx b/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/AnnotateDrawerTitle/index.tsx index 4f2b589ec0..58f6074886 100644 --- a/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/AnnotateDrawerTitle/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/AnnotateDrawerTitle/index.tsx @@ -3,13 +3,11 @@ import {memo, useCallback, useEffect, useMemo, useState} from "react" import {CaretLeft, Plus} from "@phosphor-icons/react" import {Button, message, Typography} from "antd" import deepEqual from "fast-deep-equal" -import {useRouter} from "next/router" -import {useSWRConfig} from "swr" +import useAnnotations from "@/oss/lib/hooks/useAnnotations" import useEvaluators from "@/oss/lib/hooks/useEvaluators" import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" import {createAnnotation, updateAnnotation} from "@/oss/services/annotations/api" -import {useObservability} from "@/oss/state/newObservability" import {AnnotateDrawerSteps} from "../enum" import { @@ -19,6 +17,8 @@ import { getInitialSelectedEvalMetrics, } from "../transforms" import {AnnotateDrawerIdsType, AnnotateDrawerStepsType, AnnotateDrawerTitleProps} from "../types" +import {useRouter} from "next/router" +import {getObservabilityValues} from "@/oss/contexts/observability.context" const AnnotateDrawerTitle = ({ steps, @@ -32,35 +32,36 @@ const AnnotateDrawerTitle = ({ showOnly, }: AnnotateDrawerTitleProps) => { const router = useRouter() - const {fetchAnnotations} = useObservability() const [isSaving, setIsSaving] = useState(false) - const {mutate: mutateCache} = useSWRConfig() + const {mutate} = useAnnotations({ + queries: { + annotation: { + links: [ + { + trace_id: traceSpanIds?.traceId, + span_id: traceSpanIds?.spanId, + }, + ], + }, + }, + waitUntil: !traceSpanIds, + }) const {data: evaluators} = useEvaluators({ preview: true, - queries: {is_human: true}, }) const onClickPrev = useCallback( (step: AnnotateDrawerStepsType) => { - const hasSingleView = Boolean( - showOnly?.annotateUi || showOnly?.selectEvaluatorsUi || showOnly?.createEvaluatorUi, - ) - - if ( - hasSingleView || - step === AnnotateDrawerSteps.ANNOTATE || - !Object.values(AnnotateDrawerSteps).includes(step) - ) { + if (step === AnnotateDrawerSteps.ANNOTATE) { onClose() - return + } else { + setSteps((prev) => { + const prevIndex = Object.values(AnnotateDrawerSteps).indexOf(prev) + return Object.values(AnnotateDrawerSteps)[prevIndex - 1] + }) } - - setSteps((prev) => { - const prevIndex = Object.values(AnnotateDrawerSteps).indexOf(prev) - return Object.values(AnnotateDrawerSteps)[prevIndex - 1] - }) }, - [onClose, setSteps, showOnly], + [onClose, setSteps], ) const onClickNext = useCallback( @@ -70,20 +71,17 @@ const AnnotateDrawerTitle = ({ [setSteps], ) - const displayErrorMessage = useCallback( - (requiredMetrics: Record) => { - const errorMessages: string[] = [] + const displayErrorMessage = useCallback((requiredMetrics: Record) => { + const errorMessages: string[] = [] - for (const [key, data] of Object.entries(requiredMetrics || {})) { - errorMessages.push( - `Value ${data?.value === "" ? "empty string" : data?.value} is not assignable to type ${data?.type} in ${key}`, - ) - } - onCaptureError?.(errorMessages, false) - setIsSaving(false) - }, - [onCaptureError], - ) + for (const [key, data] of Object.entries(requiredMetrics || {})) { + errorMessages.push( + `Value ${data?.value === "" ? "empty string" : data?.value} is not assignable to type ${data?.type} in ${key}`, + ) + } + onCaptureError?.(errorMessages, false) + setIsSaving(false) + }, []) const onSaveChanges = useCallback(async () => { try { @@ -134,27 +132,14 @@ const AnnotateDrawerTitle = ({ await Promise.all(payload.map((evaluator) => createAnnotation(evaluator))) } } - // Invalidate ALL annotation caches (both Jotai atoms and SWR) - // 1. Refetch annotations for observability atoms (Jotai) + message.success("Annotations updated successfully") + + // need to mutate the from observability context only if it's used there if (router.asPath.includes("/observability") || router.asPath.includes("/traces")) { - await fetchAnnotations() + getObservabilityValues().fetchAnnotations() + } else { + await mutate() } - - // 2. Invalidate SWR cache for useAnnotations hook (used by TraceDrawer) - await mutateCache( - (key) => Array.isArray(key) && key[0]?.includes("/preview/annotations/"), - undefined, - {revalidate: true}, - ) - - // 3. Also invalidate evaluators cache - await mutateCache( - (key) => Array.isArray(key) && key[0]?.includes("/evaluators"), - undefined, - {revalidate: true}, - ) - - message.success("Annotations updated successfully") onClose() } catch (error: any) { console.error("Error saving changes", error) @@ -163,19 +148,7 @@ const AnnotateDrawerTitle = ({ } finally { setIsSaving(false) } - }, [ - annotations, - updatedMetrics, - evaluators, - selectedEvaluators, - traceSpanIds, - router.asPath, - fetchAnnotations, - mutateCache, - displayErrorMessage, - onClose, - onCaptureError, - ]) + }, [updatedMetrics, annotations, evaluators, selectedEvaluators, traceSpanIds]) const initialAnnotationMetrics = useMemo( () => getInitialMetricsFromAnnotations({annotations, evaluators}), @@ -184,7 +157,7 @@ const AnnotateDrawerTitle = ({ const initialSelectedEvalMetrics = useMemo( () => getInitialSelectedEvalMetrics({evaluators, selectedEvaluators}) || {}, - [evaluators, selectedEvaluators], + [selectedEvaluators], ) const isChangedMetricData = useMemo(() => { @@ -197,7 +170,7 @@ const AnnotateDrawerTitle = ({ Object.entries(updatedMetrics).filter(([slug]) => annotationSlugs.includes(slug)), ) return deepEqual(filteredUpdatedMetrics, initialAnnotationMetrics) - }, [initialAnnotationMetrics, updatedMetrics, annotations]) + }, [initialAnnotationMetrics, updatedMetrics]) const isChangedSelectedEvalMetrics = useMemo(() => { const filteredUpdatedMetrics = Object.fromEntries( @@ -205,14 +178,14 @@ const AnnotateDrawerTitle = ({ ) return deepEqual(filteredUpdatedMetrics, initialSelectedEvalMetrics) - }, [initialSelectedEvalMetrics, updatedMetrics, selectedEvaluators]) + }, [initialSelectedEvalMetrics, updatedMetrics]) // Reset error messages useEffect(() => { if (isChangedMetricData && isChangedSelectedEvalMetrics) { onCaptureError?.([]) } - }, [isChangedMetricData, isChangedSelectedEvalMetrics, onCaptureError]) + }, [isChangedMetricData, isChangedSelectedEvalMetrics]) return (
    diff --git a/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/CreateEvaluator/assets/CreateNewMetric/index.tsx b/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/CreateEvaluator/assets/CreateNewMetric/index.tsx index c9427a2835..6c2d0873ac 100644 --- a/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/CreateEvaluator/assets/CreateNewMetric/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/AnnotateDrawer/assets/CreateEvaluator/assets/CreateNewMetric/index.tsx @@ -35,13 +35,10 @@ const CreateNewMetric = ({ // it will add a empty field for enum when user select label option useEffect(() => { - if (metricType !== "label" && metricType !== "class") return - - const existingEnum = form.getFieldValue(["metrics", field.name, "enum"]) - if (!Array.isArray(existingEnum) || existingEnum.length === 0) { + if (metricType === "label" || metricType === "class") { form.setFieldValue(["metrics", field.name, "enum"], [""]) } - }, [metricType, field.name, form]) + }, [metricType]) const getCurrentEnumValues = useCallback( (currentIndex: number) => { @@ -158,11 +155,7 @@ const CreateNewMetric = ({ > setNewTestsetName(e.target.value)} - placeholder="Testset name" + placeholder="Test set name" /> ) : ( - Please select a testset to create mappings + Please select a test set to create mappings )} @@ -890,8 +883,8 @@ const TestsetDrawer = ({ setShowLastFiveRows(!showLastFiveRows) } > - Show last {selectedTestsetTestcases.length} test - cases in testset + Show last {selectedTestsetTestCases.length} test + cases in test set )} @@ -903,18 +896,18 @@ const TestsetDrawer = ({ dataSource={[ ...preview.data, ...(showLastFiveRows - ? selectedTestsetTestcases + ? selectedTestsetTestCases : []), ]} rowClassName={(_, index) => { if (showLastFiveRows) { const totalRows = preview.data.length + - selectedTestsetTestcases.length + selectedTestsetTestCases.length if ( index >= - totalRows - selectedTestsetTestcases.length + totalRows - selectedTestsetTestCases.length ) { return "!bg-[#fafafa]" } @@ -929,7 +922,7 @@ const TestsetDrawer = ({ ) : ( - Please select testset to view testset preview. + Please select test set to view test set preview. )} @@ -948,7 +941,7 @@ const TestsetDrawer = ({
    You have created new columns. Do you want to add them to the{" "} - {testset.name} testset? + {testset.name} test set?
    diff --git a/web/oss/src/components/pages/observability/drawer/TestsetDrawer/assets/helpers.ts b/web/oss/src/components/pages/observability/drawer/TestsetDrawer/assets/helpers.ts deleted file mode 100644 index 9ffb36365a..0000000000 --- a/web/oss/src/components/pages/observability/drawer/TestsetDrawer/assets/helpers.ts +++ /dev/null @@ -1,32 +0,0 @@ -const splitPath = (path: string) => path.split(/(? p.replace(/\\\./g, ".")) - -export const getValueAtPath = (obj: any, rawPath: string) => { - if (obj == null || !rawPath) return undefined - - // quick direct hit (entire path is a literal key on the current object) - if (Object.prototype.hasOwnProperty.call(obj, rawPath)) return obj[rawPath] - - const parts = splitPath(rawPath) - let cur: any = obj - - for (let i = 0; i < parts.length; i++) { - if (cur == null) return undefined - - const key = parts[i] - - if (Object.prototype.hasOwnProperty.call(cur, key)) { - cur = cur[key] - continue - } - - // fallback: treat the remaining segments as one literal key containing dots - const remainder = parts.slice(i).join(".") - if (Object.prototype.hasOwnProperty.call(cur, remainder)) { - return cur[remainder] - } - - return undefined - } - - return cur -} diff --git a/web/oss/src/components/pages/observability/drawer/TraceContent/components/AnnotationTabItem/index.tsx b/web/oss/src/components/pages/observability/drawer/TraceContent/components/AnnotationTabItem/index.tsx index 8750d6c418..30d8ea2ed9 100644 --- a/web/oss/src/components/pages/observability/drawer/TraceContent/components/AnnotationTabItem/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/TraceContent/components/AnnotationTabItem/index.tsx @@ -32,7 +32,7 @@ const useStyles = createUseStyles((theme: JSSTheme) => ({ const AnnotationTabItem = ({annotations}: {annotations: AnnotationDto[]}) => { const classes = useStyles() - const {data: evaluators = []} = useEvaluators({ + const {data: evaluators} = useEvaluators({ preview: true, }) diff --git a/web/oss/src/components/pages/observability/drawer/TraceContent/components/OverviewTabItem/index.tsx b/web/oss/src/components/pages/observability/drawer/TraceContent/components/OverviewTabItem/index.tsx index 535f4596e5..1c7d420c23 100644 --- a/web/oss/src/components/pages/observability/drawer/TraceContent/components/OverviewTabItem/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/TraceContent/components/OverviewTabItem/index.tsx @@ -1,36 +1,20 @@ import React from "react" import {Space} from "antd" -import {useAtomValue} from "jotai" import ResultTag from "@/oss/components/ResultTag/ResultTag" import {getStringOrJson} from "@/oss/lib/helpers/utils" -import {TraceSpanNode} from "@/oss/services/tracing/types" -import { - spanDataInputsAtomFamily, - spanDataInternalsAtomFamily, - spanDataOutputsAtomFamily, - spanMetaConfigurationAtomFamily, - spanNodeTypeAtomFamily, - spanExceptionAtomFamily, -} from "@/oss/state/newObservability/selectors/tracing" +import {_AgentaRootsResponse} from "@/oss/services/observability/types" import AccordionTreePanel from "../../../../components/AccordionTreePanel" import {transformDataInputs} from "../../utils" -const OverviewTabItem = ({activeTrace}: {activeTrace: TraceSpanNode}) => { - const metaConfig = useAtomValue(spanMetaConfigurationAtomFamily(activeTrace)) - const inputs = useAtomValue(spanDataInputsAtomFamily(activeTrace)) - const outputs = useAtomValue(spanDataOutputsAtomFamily(activeTrace)) - const internals = useAtomValue(spanDataInternalsAtomFamily(activeTrace)) - const nodeType = useAtomValue(spanNodeTypeAtomFamily(activeTrace)) - const exception = useAtomValue(spanExceptionAtomFamily(activeTrace)) - +const OverviewTabItem = ({activeTrace}: {activeTrace: _AgentaRootsResponse}) => { return ( - {metaConfig && ( + {activeTrace?.meta && activeTrace?.meta.request && ( - {Object.entries(metaConfig) + {Object.entries(activeTrace?.meta.request) .filter(([key]) => [ "model", @@ -46,90 +30,99 @@ const OverviewTabItem = ({activeTrace}: {activeTrace: TraceSpanNode}) => { )} - {inputs ? ( + {activeTrace?.data && activeTrace?.data?.inputs ? ( - {inputs?.prompt && - Array.isArray(inputs?.prompt) && - inputs?.prompt.length > 0 && - inputs?.prompt.every((item: any) => "role" in item) ? ( - Object.entries(transformDataInputs(inputs)).map(([key, values]) => { - if (key === "prompt") { - return Array.isArray(values) - ? values.map((param, index) => { - // First check for content - if (param.content !== undefined) { - return ( - - ) - } - // Then check for contents with proper structure - else if ( - param.contents && - Array.isArray(param.contents) && - param.contents.length === 1 && - param.contents[0].message_content?.text - ) { - return ( - - ) - } - // Otherwise show the whole object minus the role - else { - // Create a copy without the role property - const {role, ...paramWithoutRole} = param - return ( - - ) - } - }) - : null - } else { - return Array.isArray(values) && values.length > 0 ? ( - - ) : null - } - }) + {activeTrace?.data?.inputs?.prompt && + Array.isArray(activeTrace?.data?.inputs?.prompt) && + activeTrace?.data?.inputs?.prompt.length > 0 && + activeTrace?.data?.inputs?.prompt.every((item: any) => "role" in item) ? ( + Object.entries(transformDataInputs(activeTrace?.data?.inputs)).map( + ([key, values]) => { + if (key === "prompt") { + return Array.isArray(values) + ? values.map((param, index) => { + // First check for content + if (param.content !== undefined) { + return ( + + ) + } + // Then check for contents with proper structure + else if ( + param.contents && + Array.isArray(param.contents) && + param.contents.length === 1 && + param.contents[0].message_content?.text + ) { + return ( + + ) + } + // Otherwise show the whole object minus the role + else { + // Create a copy without the role property + const {role, ...paramWithoutRole} = param + return ( + + ) + } + }) + : null + } else { + return Array.isArray(values) && values.length > 0 ? ( + + ) : null + } + }, + ) ) : ( - + )} ) : null} - {outputs ? ( + {activeTrace?.data && activeTrace?.data?.outputs ? ( - {outputs?.completion && - Array.isArray(outputs?.completion) && - outputs?.completion.length > 0 && - outputs?.completion.every((item: any) => "role" in item) ? ( - Object.values(outputs).map((item) => + {activeTrace?.data?.outputs?.completion && + Array.isArray(activeTrace?.data?.outputs?.completion) && + activeTrace?.data?.outputs?.completion.length > 0 && + activeTrace?.data?.outputs?.completion.every((item: any) => "role" in item) ? ( + Object.values(activeTrace?.data.outputs).map((item) => Array.isArray(item) ? item.map((param: any, index) => { // First check for content @@ -186,30 +179,30 @@ const OverviewTabItem = ({activeTrace}: {activeTrace: TraceSpanNode}) => { ) : ( )} ) : null} - {internals && ( + {activeTrace?.data && activeTrace?.data?.internals && ( - {nodeType !== "chat" && ( + {activeTrace?.node?.type !== "chat" && ( )} )} - {exception && ( + {activeTrace?.exception && ( diff --git a/web/oss/src/components/pages/observability/drawer/TraceContent/index.tsx b/web/oss/src/components/pages/observability/drawer/TraceContent/index.tsx index 6f9f84f897..69fcfa3ddf 100644 --- a/web/oss/src/components/pages/observability/drawer/TraceContent/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/TraceContent/index.tsx @@ -1,17 +1,13 @@ -import {useEffect, useMemo, useState} from "react" +import {useMemo, useState} from "react" import {Database} from "@phosphor-icons/react" -import {Button, Divider, Space, Tabs, TabsProps, Tag, Typography, Tooltip, Skeleton} from "antd" +import {Button, Divider, Space, Tabs, TabsProps, Tag, Typography, Tooltip} from "antd" import clsx from "clsx" -import {getDefaultStore, useAtomValue, useSetAtom} from "jotai" import dynamic from "next/dynamic" -import { - isDrawerOpenAtom, - resetTraceDrawerAtom, -} from "@/oss/components/Playground/Components/Drawers/TraceDrawer/store/traceDrawerStore" import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" import {KeyValuePair} from "@/oss/lib/Types" +import {TracesWithAnnotations} from "@/oss/services/observability/types" import AccordionTreePanel from "../../components/AccordionTreePanel" import AnnotateDrawerButton from "../AnnotateDrawer/assets/AnnotateDrawerButton" @@ -19,83 +15,21 @@ import AnnotateDrawerButton from "../AnnotateDrawer/assets/AnnotateDrawerButton" import {useStyles} from "./assets/styles" import AnnotationTabItem from "./components/AnnotationTabItem" import OverviewTabItem from "./components/OverviewTabItem" -import {TraceSpanNode} from "@/oss/services/tracing/types" -import {spanAgDataAtomFamily} from "@/oss/state/newObservability/selectors/tracing" const TestsetDrawer = dynamic(() => import("../TestsetDrawer/TestsetDrawer"), {ssr: false}) interface TraceContentProps { - activeTrace?: TraceSpanNode - traceResponse?: any - error?: any - isLoading?: boolean + activeTrace: TracesWithAnnotations } -const store = getDefaultStore() - -const TraceContent = ({ - activeTrace: active, - traceResponse, - error, - isLoading, -}: TraceContentProps) => { - const resetDrawer = useSetAtom(resetTraceDrawerAtom) - const activeTrace = active - const activeTraceData = useAtomValue(spanAgDataAtomFamily(activeTrace)) - const {key, children, spans, invocationIds, ...filteredTrace} = activeTrace || {} +const TraceContent = ({activeTrace}: TraceContentProps) => { + const {key, children, nodes, ...filteredTrace} = activeTrace || {} const classes = useStyles() const [tab, setTab] = useState("overview") const [isTestsetDrawerOpen, setIsTestsetDrawerOpen] = useState(false) - const testsetData = useMemo(() => { - if (!activeTrace?.key) return [] as {data: KeyValuePair; key: string; id: number}[] - return [ - { - data: activeTraceData as KeyValuePair, - key: activeTrace.key, - id: 1, - }, - ] - }, [activeTrace?.key, activeTraceData]) - - const loadingContent = ( -
    - -
    - ) - const items: TabsProps["items"] = useMemo(() => { - if (isLoading && !activeTrace) { - return [ - { - key: "loading", - label: "Overview", - children: loadingContent, - }, - ] - } - - // When activeTrace is missing (e.g., failed generation), show just Raw Data/Error - if (!activeTrace) { - const errorPayload = error - const rawPayload = - traceResponse?.response || (errorPayload ? {error: errorPayload} : {}) - return [ - { - key: "raw_data", - label: "Raw Data", - children: ( - - ), - }, - ] - } - - return [ + const items: TabsProps["items"] = useMemo( + () => [ { key: "overview", label: "Overview", @@ -118,25 +52,9 @@ const TraceContent = ({ label: "Annotations", children: , }, - ] - }, [activeTrace, filteredTrace, isLoading, traceResponse, error]) - - // Ensure active tab exists in items; if not, switch to first tab - const itemKeys = useMemo(() => (items || []).map((it) => String(it?.key)), [items]) - useEffect(() => { - if (!itemKeys.includes(tab) && itemKeys.length > 0) { - setTab(itemKeys[0]) - } - }, [itemKeys.join("|"), tab]) - - useEffect(() => { - return () => { - const isOpen = store.get(isDrawerOpenAtom) - if (!isOpen) { - resetDrawer() - } - } - }, []) + ], + [activeTrace], + ) return (
    @@ -145,21 +63,21 @@ const TraceContent = ({
    - {activeTrace?.span_name || (error ? "Error" : "")} + {activeTrace?.node?.name} - {activeTrace?.span_id || "-"} + # {activeTrace.span_id}
    @@ -196,11 +114,13 @@ const TraceContent = ({ />
    - setIsTestsetDrawerOpen(false)} - /> + {isTestsetDrawerOpen && ( + setIsTestsetDrawerOpen(false)} + /> + )}
    ) } diff --git a/web/oss/src/components/pages/observability/drawer/TraceContent/utils/index.ts b/web/oss/src/components/pages/observability/drawer/TraceContent/utils/index.ts index 4664ec4e71..68c841b324 100644 --- a/web/oss/src/components/pages/observability/drawer/TraceContent/utils/index.ts +++ b/web/oss/src/components/pages/observability/drawer/TraceContent/utils/index.ts @@ -1,32 +1,25 @@ export const transformDataInputs = (data: any) => { - if (!data) { - return {} - } - - const transformed: Record = {} - - if (data.prompt) { - transformed.prompt = data.prompt - } - - const tools: any[] = [] - - if (Array.isArray(data.functions)) { - const functions = data.functions.map((item: any) => ({ - type: "function", - function: item, - })) - - tools.push(...functions) - } - - if (Array.isArray(data.tools)) { - tools.push(...data.tools) - } - - if (tools.length > 0) { - transformed.tools = tools - } - - return transformed + return Object.keys(data).reduce((acc, curr) => { + if (curr === "prompt") { + acc[curr] = data[curr] + } + + if (!acc.tools) { + acc.tools = [] + } + + if (curr === "functions") { + const functions = data[curr].map((item: any) => ({ + type: "function", + function: item, + })) + acc.tools.push(...functions) + } + + if (curr === "tools") { + acc.tools.push(...data[curr]) + } + + return acc + }, {} as any) } diff --git a/web/oss/src/components/pages/observability/drawer/TraceHeader/assets/types.d.ts b/web/oss/src/components/pages/observability/drawer/TraceHeader/assets/types.d.ts index d7dc1f2c4f..174f896c9e 100644 --- a/web/oss/src/components/pages/observability/drawer/TraceHeader/assets/types.d.ts +++ b/web/oss/src/components/pages/observability/drawer/TraceHeader/assets/types.d.ts @@ -1,34 +1,11 @@ import {Dispatch, SetStateAction} from "react" import {_AgentaRootsResponse, TracesWithAnnotations} from "@/oss/services/observability/types" -import {TraceSpanNode} from "@/oss/services/tracing/types" -import {Filter} from "@/oss/lib/Types" -import {SortResult} from "@/oss/components/Filters/Sort" -import {QueryValue} from "@/oss/state/appState/types" -import {TraceTabTypes} from "@/oss/state/newObservability/atoms/controls" export interface TraceHeaderProps { - // Original props (ObservabilityDashboard) - activeTrace?: TracesWithAnnotations - traces?: TraceSpanNode[] - // Lean alternative: pass just the active trace id (TraceDrawer) - activeTraceId?: string - traceId?: string | null - traceTabs: TraceTabTypes - filters: Filter[] - sort: SortResult - limit: number + activeTrace: TracesWithAnnotations + traces: _AgentaRootsResponse[] setSelectedTraceId: (val: string) => void - setSelectedNode?: (val: string) => void - setTraceParam: ( - value: QueryValue | ((prev: QueryValue) => QueryValue), - options?: {shallow?: boolean; preserveHash?: boolean}, - ) => void - setSpanParam: ( - value: QueryValue | ((prev: QueryValue) => QueryValue), - options?: {shallow?: boolean; preserveHash?: boolean}, - ) => void - setTraceDrawerTrace: (payload: {traceId: string; activeSpanId?: string | null}) => void activeTraceIndex?: number setIsAnnotationsSectionOpen?: Dispatch> isAnnotationsSectionOpen?: boolean diff --git a/web/oss/src/components/pages/observability/drawer/TraceHeader/index.tsx b/web/oss/src/components/pages/observability/drawer/TraceHeader/index.tsx index f14933fa20..7dcc976b58 100644 --- a/web/oss/src/components/pages/observability/drawer/TraceHeader/index.tsx +++ b/web/oss/src/components/pages/observability/drawer/TraceHeader/index.tsx @@ -1,97 +1,23 @@ -import {useCallback, useEffect, useMemo, useState} from "react" +import {useCallback, useState} from "react" import {DeleteOutlined} from "@ant-design/icons" import {CaretDown, CaretUp, SidebarSimple} from "@phosphor-icons/react" import {Button, Space, Tag, Typography} from "antd" -import {useAtomValue} from "jotai" import TooltipWithCopyAction from "@/oss/components/TooltipWithCopyAction" -import {fetchAllPreviewTraces} from "@/oss/services/tracing/api" -import { - isSpansResponse, - isTracesResponse, - transformTracesResponseToTree, - transformTracingResponse, -} from "@/oss/services/tracing/lib/helpers" -import {TraceSpanNode} from "@/oss/services/tracing/types" -import {selectedAppIdAtom} from "@/oss/state/app/selectors/app" -import {useObservability} from "@/oss/state/newObservability" -import buildTraceQueryParams from "@/oss/state/newObservability/utils/buildTraceQueryParams" +import {useObservabilityData} from "@/oss/contexts/observability.context" +import {_AgentaRootsResponse} from "@/oss/services/observability/types" import DeleteTraceModal from "../../components/DeleteTraceModal" import {useStyles} from "./assets/styles" import {TraceHeaderProps} from "./assets/types" -const getTraceIdFromNode = (node: any): string | null => { - if (!node) return null - return ( - node.trace_id || - node.invocationIds?.trace_id || - node.node?.trace_id || - node.root?.id || - null - ) -} - -const getSpanIdFromNode = (node: any): string | null => { - if (!node) return null - return node.span_id || node.invocationIds?.span_id || node.node?.span_id || null -} - -const getNodeTimestamp = (node: any): string | number | null => { - if (!node) return null - return ( - node.start_time || - node.startTime || - node.timestamp || - node.created_at || - node.createdAt || - node.node?.start_time || - node.node?.timestamp || - node.node?.created_at || - null - ) -} - -const toISOString = (value: string | number | Date | null | undefined): string | null => { - if (value === null || value === undefined) return null - let date: Date - if (value instanceof Date) { - date = value - } else if (typeof value === "number") { - const ms = value < 1e12 ? value * 1000 : value - date = new Date(ms) - } else { - date = new Date(value) - } - if (Number.isNaN(date.getTime())) return null - return date.toISOString() -} - -type NavSource = "table" | "remote" - -interface NavState { - candidate: TraceSpanNode | null - loading: boolean - source: NavSource | null -} - const TraceHeader = ({ - activeTrace: propActiveTrace, - traces: drawerTraces, - activeTraceId, - traceId, - traceTabs, - filters, - sort, - limit, + activeTrace, + traces, setSelectedTraceId, - setSelectedNode, - setTraceParam, - setSpanParam, - setTraceDrawerTrace, - activeTraceIndex: _activeTraceIndex, + activeTraceIndex, setIsAnnotationsSectionOpen, isAnnotationsSectionOpen, setSelected, @@ -99,372 +25,85 @@ const TraceHeader = ({ const classes = useStyles() const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) - const {traces: tableTracesRaw, hasMoreTraces, fetchMoreTraces} = useObservability() - const appId = useAtomValue(selectedAppIdAtom) - - const tableTraces = useMemo(() => tableTracesRaw as TraceSpanNode[], [tableTracesRaw]) - - const focusMode: "trace" | "span" = traceTabs === "trace" ? "trace" : "span" - - const activeTrace = useMemo(() => { - if (propActiveTrace) return propActiveTrace - if (!Array.isArray(drawerTraces)) return undefined - return (drawerTraces as TraceSpanNode[]).find( - (node) => getSpanIdFromNode(node) === activeTraceId, - ) - }, [propActiveTrace, drawerTraces, activeTraceId]) - - const activeSpanKey = useMemo(() => { - return getSpanIdFromNode(activeTrace) || activeTraceId || null - }, [activeTrace, activeTraceId]) - - const activeTraceKey = useMemo(() => { - return getTraceIdFromNode(activeTrace) || traceId || null - }, [activeTrace, traceId]) - - const activeFocusKey = focusMode === "span" ? activeSpanKey : activeTraceKey - - const activeTimestampIso = useMemo( - () => toISOString(getNodeTimestamp(activeTrace)), - [activeTrace], - ) - - const filtersKey = useMemo(() => JSON.stringify(filters ?? []), [filters]) - const sortKey = useMemo(() => JSON.stringify(sort ?? {}), [sort]) - - const baseParams = useMemo( - () => - buildTraceQueryParams({ - focus: traceTabs, - filters, - sort, - limit, - }), - [traceTabs, filtersKey, sortKey, limit], - ) - - const requestSize = useMemo(() => { - if (!limit || Number.isNaN(limit)) return 5 - return Math.max(1, Math.min(limit, 10)) - }, [limit]) - - const tableSpanKeySet = useMemo(() => { - const set = new Set() - tableTraces.forEach((item) => { - const key = getSpanIdFromNode(item) - if (key) set.add(key) - }) - return set - }, [tableTraces]) - - const tableTraceKeySet = useMemo(() => { - const set = new Set() - tableTraces.forEach((item) => { - const key = getTraceIdFromNode(item) - if (key) set.add(key) - }) - return set - }, [tableTraces]) - - const tableIndex = useMemo(() => { - if (!activeFocusKey) return -1 - return tableTraces.findIndex((item) => { - const key = focusMode === "span" ? getSpanIdFromNode(item) : getTraceIdFromNode(item) - return key === activeFocusKey - }) - }, [tableTraces, focusMode, activeFocusKey]) - - const prevFromTable = - tableIndex > 0 && tableIndex < tableTraces.length - ? (tableTraces[tableIndex - 1] as TraceSpanNode) - : null - - const nextFromTable = - tableIndex >= 0 && tableIndex < tableTraces.length - 1 - ? (tableTraces[tableIndex + 1] as TraceSpanNode) - : null - - const [prevNav, setPrevNav] = useState({ - candidate: null, - loading: false, - source: null, - }) - const [nextNav, setNextNav] = useState({ - candidate: null, - loading: false, - source: null, - }) - - const fetchRelativeTrace = useCallback( - async (direction: "prev" | "next"): Promise => { - if (!appId || !activeTimestampIso || !activeFocusKey) { - console.debug("[TraceNav] skip fetch – missing context", { - direction, - appId, - activeTimestampIso, - activeFocusKey, - }) - return null - } - - console.debug("[TraceNav] fetchRelative:start", { - direction, - focusMode, - activeTimestampIso, - activeFocusKey, - }) - - const params: Record = {...baseParams, size: requestSize} - - if (direction === "next") { - params.newest = activeTimestampIso - if (baseParams.oldest) params.oldest = baseParams.oldest - } else { - params.oldest = activeTimestampIso - if (baseParams.newest) params.newest = baseParams.newest - } - - try { - const response = await fetchAllPreviewTraces(params, appId) - - console.debug("[TraceNav] fetchRelative:response", { - direction, - hasTraces: Boolean((response as any)?.traces), - hasSpans: Boolean((response as any)?.spans), - }) - let candidates: TraceSpanNode[] = [] - - if (isTracesResponse(response)) { - candidates = transformTracingResponse(transformTracesResponseToTree(response)) - } else if (isSpansResponse(response)) { - candidates = transformTracingResponse(response.spans) - } else if (Array.isArray((response as any)?.spans)) { - candidates = transformTracingResponse((response as any).spans) - } - - if (!candidates.length) return null + const {pagination, count, navigateToPage, fetchTraces, traceTabs} = useObservabilityData() - const focusKeyGetter = - focusMode === "trace" ? getTraceIdFromNode : getSpanIdFromNode + const isFirstItem = pagination.page === 1 && activeTraceIndex === 0 + const isLastItem = + pagination.page === Math.ceil(count / pagination.size) && + activeTraceIndex === traces.length - 1 - const filtered = candidates.filter((item) => { - const candidateKey = focusKeyGetter(item) - if (!candidateKey || candidateKey === activeFocusKey) return false - if (focusMode === "trace") { - if (tableTraceKeySet.has(candidateKey)) return false - } else if (tableSpanKeySet.has(candidateKey)) { - return false + const handleNextTrace = useCallback(async () => { + if (activeTraceIndex === undefined) return + + // Check if we're at the last item of the current page + if (activeTraceIndex === traces.length - 1) { + const nextPage = pagination.page + 1 + const totalPages = Math.ceil(count / pagination.size) + + // Check if next page exists + if (nextPage <= totalPages) { + try { + // First fetch the next page data + await navigateToPage(nextPage) + + // Get the updated traces data + const updatedData: any = await fetchTraces() + + const nextPageTraces = updatedData?.traces || [] + + // Set the first item of the new page as selected + if (nextPageTraces.length > 0) { + const firstTrace = nextPageTraces[0] + const id = traceTabs === "node" ? firstTrace.node.id : firstTrace.root.id + setSelectedTraceId(id) + setSelected?.(firstTrace.node.id) } - return true - }) - - console.debug("[TraceNav] fetchRelative:filtered", { - direction, - total: candidates.length, - filtered: filtered.length, - firstSpan: filtered[0]?.span_id, - firstTrace: filtered[0]?.trace_id, - }) - - if (!filtered.length) { - console.debug("[TraceNav] no filtered candidates", {direction}) - return null + } catch (error) { + console.error("Error navigating to next page:", error) } - - return filtered[0] - } catch (error) { - console.error("Trace navigation fetch failed", error) - return null } - }, - [ - appId, - activeTimestampIso, - activeFocusKey, - baseParams, - focusMode, - requestSize, - tableSpanKeySet, - tableTraceKeySet, - ], - ) - - useEffect(() => { - if (prevFromTable) { - console.debug("[TraceNav] prev candidate from table", { - spanId: getSpanIdFromNode(prevFromTable), - traceId: getTraceIdFromNode(prevFromTable), - }) - setPrevNav({candidate: prevFromTable, loading: false, source: "table"}) - return - } - - if (!activeTimestampIso || !appId || !activeFocusKey) { - console.debug("[TraceNav] prev disabled – missing context") - setPrevNav({candidate: null, loading: false, source: null}) - return - } - - let cancelled = false - setPrevNav({candidate: null, loading: true, source: null}) - - fetchRelativeTrace("prev").then((result) => { - if (cancelled) return - console.debug("[TraceNav] prev fetch result", { - spanId: getSpanIdFromNode(result), - traceId: getTraceIdFromNode(result), - }) - setPrevNav({candidate: result, loading: false, source: result ? "remote" : null}) - }) - - return () => { - cancelled = true - } - }, [prevFromTable, fetchRelativeTrace, activeTimestampIso, appId, activeFocusKey]) - - useEffect(() => { - if (nextFromTable) { - console.debug("[TraceNav] next candidate from table", { - spanId: getSpanIdFromNode(nextFromTable), - traceId: getTraceIdFromNode(nextFromTable), - }) - setNextNav({candidate: nextFromTable, loading: false, source: "table"}) - return - } - - if (!activeTimestampIso || !appId || !activeFocusKey) { - console.debug("[TraceNav] next disabled – missing context") - setNextNav({candidate: null, loading: false, source: null}) - return - } - - if (tableIndex >= 0 && !hasMoreTraces) { - console.debug("[TraceNav] next disabled – end of results") - setNextNav({candidate: null, loading: false, source: null}) - return - } - - let cancelled = false - setNextNav({candidate: null, loading: true, source: null}) - - fetchRelativeTrace("next").then((result) => { - if (cancelled) return - console.debug("[TraceNav] next fetch result", { - spanId: getSpanIdFromNode(result), - traceId: getTraceIdFromNode(result), - }) - setNextNav({candidate: result, loading: false, source: result ? "remote" : null}) - }) - - return () => { - cancelled = true + } else { + // Regular next item within current page + const nextTrace = traces[activeTraceIndex + 1] + const id = traceTabs === "node" ? nextTrace.node.id : nextTrace.root.id + setSelectedTraceId(id) + setSelected?.(nextTrace.node.id) } - }, [ - nextFromTable, - fetchRelativeTrace, - activeTimestampIso, - appId, - activeFocusKey, - hasMoreTraces, - tableIndex, - ]) - - const navigateToTarget = useCallback( - (target: TraceSpanNode | null, source: NavSource | null) => { - if (!target) return - - const targetTraceId = getTraceIdFromNode(target) - const targetSpanId = getSpanIdFromNode(target) - - console.debug("[TraceNav] navigate", { - source, - focusMode, - targetTraceId, - targetSpanId, - }) - - setTraceParam(targetTraceId ?? undefined, {shallow: true}) - - if (targetTraceId) { - setTraceDrawerTrace({traceId: targetTraceId, activeSpanId: targetSpanId ?? null}) - } - - if (source === "table") { - const selectionKey = - focusMode === "span" - ? (targetSpanId ?? targetTraceId ?? undefined) - : (targetTraceId ?? targetSpanId ?? undefined) - - if (selectionKey) { - console.debug("[TraceNav] setSelectedTraceId", selectionKey) - setSelectedTraceId(selectionKey) - } - } + }, [activeTraceIndex, traces, traceTabs, pagination, count, navigateToPage, fetchTraces]) - if (targetSpanId) { - console.debug("[TraceNav] setSelectedNode", targetSpanId) - setSelectedNode?.(targetSpanId) - setSelected?.(targetSpanId) - } else { - console.debug("[TraceNav] clear SelectedNode") - setSelectedNode?.("") - setSelected?.("") - } - - if (focusMode === "span") { - console.debug("[TraceNav] setSpanParam", targetSpanId) - setSpanParam(targetSpanId ?? undefined, {shallow: true}) - } else { - console.debug("[TraceNav] clear span param") - setSpanParam(undefined, {shallow: true}) - } - }, - [ - focusMode, - setSelectedTraceId, - setSelectedNode, - setSelected, - setTraceParam, - setSpanParam, - setTraceDrawerTrace, - ], - ) - - const handlePrevTrace = useCallback(() => { - if (prevNav.loading || !prevNav.candidate) return - console.debug("[TraceNav] handlePrev", { - source: prevNav.source, - spanId: getSpanIdFromNode(prevNav.candidate), - traceId: getTraceIdFromNode(prevNav.candidate), - }) - navigateToTarget(prevNav.candidate, prevNav.source) - }, [prevNav, navigateToTarget]) + const handlePrevTrace = useCallback(async () => { + if (activeTraceIndex === undefined) return - const handleNextTrace = useCallback(async () => { - if (nextNav.loading || !nextNav.candidate) return + // Check if we're at the first item of the current page + if (activeTraceIndex === 0 && pagination.page > 1) { + const prevPage = pagination.page - 1 - console.debug("[TraceNav] handleNext", { - source: nextNav.source, - spanId: getSpanIdFromNode(nextNav.candidate), - traceId: getTraceIdFromNode(nextNav.candidate), - }) - - if (nextNav.source === "remote" && hasMoreTraces) { try { - console.debug("[TraceNav] fetchMoreTraces before navigating") - await fetchMoreTraces() + // First fetch the previous page data + await navigateToPage(prevPage) + + // Get the updated traces data + const updatedData: any = await fetchTraces() + const prevPageTraces = updatedData?.traces || [] + + // Set the last item of the previous page as selected + if (prevPageTraces.length > 0) { + const lastTrace = prevPageTraces[prevPageTraces.length - 1] + const id = traceTabs === "node" ? lastTrace.node.id : lastTrace.root.id + setSelectedTraceId(id) + setSelected?.(lastTrace.node.id) + } } catch (error) { - console.error("Failed to fetch additional traces", error) + console.error("Error navigating to previous page:", error) } + } else if (activeTraceIndex > 0) { + // Regular previous item within current page + const prevTrace = traces[activeTraceIndex - 1] + const id = traceTabs === "node" ? prevTrace.node.id : prevTrace.root.id + setSelectedTraceId(id) + setSelected?.(prevTrace.node.id) } - - navigateToTarget(nextNav.candidate, nextNav.source) - }, [nextNav, hasMoreTraces, fetchMoreTraces, navigateToTarget]) - - const isPrevDisabled = prevNav.loading || !prevNav.candidate || !activeFocusKey - const isNextDisabled = nextNav.loading || !nextNav.candidate || !activeFocusKey - - const displayTrace = propActiveTrace || drawerTraces?.[0] + }, [activeTraceIndex, traces, traceTabs, pagination, navigateToPage, fetchTraces]) return ( <> @@ -474,32 +113,25 @@ const TraceHeader = ({ - - )} + +
    Invoke LLM - {invokeLlmUrl && ( - - )} -
    - -
    - - - {!invokeLlmUrl && ( -
    - Deploy a variant to start using this endpoint - -
    - )}
    + +
    ) diff --git a/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/assets/styles.ts b/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/assets/styles.ts new file mode 100644 index 0000000000..cf5d821db3 --- /dev/null +++ b/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/assets/styles.ts @@ -0,0 +1,24 @@ +import {createUseStyles} from "react-jss" + +import type {JSSTheme} from "@/oss/lib/Types" + +export const useStyles = createUseStyles((theme: JSSTheme) => ({ + drawerTitleContainer: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + "& h1.ant-typography": { + fontSize: theme.fontSizeHeading5, + fontWeight: theme.fontWeightMedium, + textTransform: "capitalize", + }, + }, + noDataContainer: { + height: 200, + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + gap: 16, + }, +})) diff --git a/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/hooks/useURI.ts b/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/hooks/useURI.ts new file mode 100644 index 0000000000..a621dc60a4 --- /dev/null +++ b/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/hooks/useURI.ts @@ -0,0 +1,19 @@ +import {useCallback} from "react" + +import useSWR from "swr" + +import {fetchAppContainerURL} from "@/oss/services/api" + +const useURI = (appId: string, variantId?: string) => { + console.log("USE URI") + const fetcher = useCallback(async () => { + const url = await fetchAppContainerURL(appId, variantId) + return `${url}/run` + }, []) + + const swr = useSWR(variantId ? ["uri"] : null, fetcher) + + return swr +} + +export default useURI diff --git a/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/index.tsx b/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/index.tsx index 643c9eed6c..9afe12947a 100644 --- a/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/index.tsx +++ b/web/oss/src/components/pages/overview/deployments/DeploymentDrawer/index.tsx @@ -13,7 +13,6 @@ import { } from "@phosphor-icons/react" import {Button, Drawer, DrawerProps, Dropdown, Space, Tabs, Tooltip, Typography} from "antd" import clsx from "clsx" -import {useAtomValue} from "jotai" import dynamic from "next/dynamic" import {useRouter} from "next/router" @@ -24,12 +23,10 @@ import invokeLlmAppcURLCode from "@/oss/code_snippets/endpoints/invoke_llm_app/c import invokeLlmApppythonCode from "@/oss/code_snippets/endpoints/invoke_llm_app/python" import invokeLlmApptsCode from "@/oss/code_snippets/endpoints/invoke_llm_app/typescript" import VariantPopover from "@/oss/components/pages/overview/variants/VariantPopover" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" +import {useAppsData} from "@/oss/contexts/app.context" import {isDemo} from "@/oss/lib/helpers/utils" -import useStatelessVariants from "@/oss/lib/hooks/useStatelessVarziants" -import {extractInputKeysFromSchema} from "@/oss/lib/shared/variant/inputHelpers" -import {createParams} from "@/oss/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/endpoints" -import {currentAppAtom} from "@/oss/state/app" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import {createParams} from "@/oss/pages/apps/[app_id]/endpoints" import LanguageCodeBlock from "./assets/LanguageCodeBlock" import {useStyles} from "./assets/styles" @@ -53,9 +50,8 @@ const DeploymentDrawer = ({ const classes = useStyles() const router = useRouter() const appId = router.query.app_id as string - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() const [selectedLang, setSelectedLang] = useState("python") - const {goToPlayground} = usePlaygroundNavigation() const {data: uri} = useURI(appId, selectedEnvironment?.deployed_app_variant_id) const variant = useMemo(() => { return ( @@ -66,26 +62,31 @@ const DeploymentDrawer = ({ }, [variants, selectedEnvironment.deployed_app_variant_id]) const [isHistoryModalOpen, setIsHistoryModalOpen] = useState(false) - // We no longer need variant.inputParams from useVariants; keep commented for reference - // const {data} = useVariants(currentApp, [variant!].filter(Boolean)) - const {specMap, uriMap} = useStatelessVariants() + const {data} = useVariants(currentApp)({appId}, [variant!].filter(Boolean)) const params = useMemo(() => { - // Derive inputs from app-level OpenAPI schema - const vId = variant?.variantId - const spec = (vId && (specMap?.[vId] as any)) || undefined - const routePath = (vId && uriMap?.[vId]?.routePath) || "" - const inputKeys = spec ? extractInputKeysFromSchema(spec, routePath) : [] - const synthesized = inputKeys.map((name) => ({name, input: name === "messages"})) + const _variant = (data?.variants || []).find( + (item) => + (item?.variant?.id || item?.variant?.variantId) === + selectedEnvironment.deployed_app_variant_revision_id, + ) + const {inputParams, isChatVariant} = _variant || {} - const built = createParams( - synthesized, + const params = createParams( + inputParams, selectedEnvironment?.name || "none", "add_a_value", + isChatVariant, currentApp, ) - return built - }, [variant?.variantId, specMap, uriMap, currentApp, selectedEnvironment?.name]) + + return params + }, [ + data?.variants, + currentApp, + selectedEnvironment.deployed_app_variant_revision_id, + selectedEnvironment?.name, + ]) const invokeLlmAppCodeSnippet: Record = { python: invokeLlmApppythonCode(uri!, params), @@ -154,9 +155,14 @@ const DeploymentDrawer = ({ label: "Open in playground", icon: , onClick: () => - goToPlayground( - selectedEnvironment.deployed_app_variant_revision_id, - ), + router.push({ + pathname: `/apps/${appId}/playground`, + query: { + revisions: JSON.stringify([ + selectedEnvironment.deployed_app_variant_revision_id, + ]), + }, + }), }, ], }} @@ -190,7 +196,7 @@ const DeploymentDrawer = ({ ])} > invokeLlmAppCodeSnippet: Record - handleOpenSelectDeployVariantModal: () => void - invokeLlmUrl: string | undefined } diff --git a/web/oss/src/components/pages/overview/deployments/DeploymentModal.tsx b/web/oss/src/components/pages/overview/deployments/DeploymentModal.tsx index da01b29396..be5b8c26c8 100644 --- a/web/oss/src/components/pages/overview/deployments/DeploymentModal.tsx +++ b/web/oss/src/components/pages/overview/deployments/DeploymentModal.tsx @@ -2,12 +2,11 @@ import {useCallback, useState} from "react" import {Rocket} from "@phosphor-icons/react" import {message, Modal, Typography} from "antd" -import {useAtomValue} from "jotai" import {createUseStyles} from "react-jss" import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" import {Environment, JSSTheme} from "@/oss/lib/Types" -import {publishMutationAtom} from "@/oss/state/deployment/atoms/publish" +import {createPublishVariant, createPublishRevision} from "@/oss/services/deployment/api" type DeploymentModalProps = { selectedEnvironment: Environment @@ -48,38 +47,38 @@ const DeploymentModal = ({ ...props }: DeploymentModalProps) => { const classes = useStyles() - const {isPending: isPublishVariantLoading, mutateAsync: publish} = - useAtomValue(publishMutationAtom) + const [isPublishVariantLoading, setIsPublishVariantLoading] = useState(false) const publishVariant = useCallback(async () => { try { if (!selectedEnvironment || !selectedVariant) return + setIsPublishVariantLoading(true) - await publish( - selectedVariant._parentVariant - ? { - type: "revision", - revision_id: selectedVariant.id, - environment_ref: selectedEnvironment.name, - note: "", - } - : { - type: "variant", - variant_id: selectedVariant.variantId, - revision_id: selectedVariant.id, - environment_name: selectedEnvironment.name, - note: "", - }, - ) + if (selectedVariant._parentVariant) { + await createPublishRevision({ + revision_id: selectedVariant.id, + environment_ref: selectedEnvironment.name, + note: "", + }) + } else { + await createPublishVariant({ + variant_id: selectedVariant.variantId, + revision_id: selectedVariant.id, + environment_name: selectedEnvironment.name, + note: "", + }) + } + await loadEnvironments() message.success( `Published ${selectedVariant.variantName} to ${selectedEnvironment.name}`, ) } catch (error) { console.error(error) } finally { + setIsPublishVariantLoading(false) setIsDeploymentModalOpen(false) } - }, [selectedEnvironment, selectedVariant, publish, setIsDeploymentModalOpen]) + }, [createPublishVariant, selectedEnvironment, selectedVariant, loadEnvironments]) return ( { - const {environments, isEnvironmentsLoading: isDeploymentLoading} = useEnvironments() - const {appURL} = useURL() - const router = useRouter() +interface DeploymentOverviewProps { + variants: EnhancedVariant[] + isDeploymentLoading: boolean + environments: Environment[] + loadEnvironments: () => Promise +} - const handleCardClick = useCallback( - (env: Environment) => { - router.push({ - pathname: `${appURL}/deployments`, - query: { - selectedEnvName: env.name, - }, - }) +const useStyles = createUseStyles((theme: JSSTheme) => ({ + container: { + display: "flex", + flexDirection: "column", + gap: theme.paddingXS, + "& > h1.ant-typography": { + fontSize: theme.fontSize, }, - [router, appURL], - ) + }, + cardContainer: { + display: "flex", + gap: theme.padding, + }, +})) + +const DeploymentOverview = ({ + variants, + isDeploymentLoading, + environments, + loadEnvironments, +}: DeploymentOverviewProps) => { + const classes = useStyles() + const router = useRouter() + const appId = router.query.app_id as string + + useEffect(() => { + if (!appId) return + loadEnvironments() + }, [appId, loadEnvironments]) return ( -
    _div_h1.ant-typography]:text-xs"])}> +
    Deployment - + {isDeploymentLoading ? ( +
    + {Array.from({length: 3}).map((_, index) => ( + + ))} +
    + ) : ( +
    + {environments.map((env, index) => { + const selectedDeployedVariant = variants?.find( + (variant) => variant?.id === env.deployed_app_variant_revision_id, + ) + + return ( + { + router.push({ + pathname: `/apps/${appId}/deployments`, + query: { + selectedEnvName: env.name, + }, + }) + }} + selectedDeployedVariant={selectedDeployedVariant} + env={env} + /> + ) + })} +
    + )}
    ) } diff --git a/web/oss/src/components/pages/overview/deployments/HistoryConfig.tsx b/web/oss/src/components/pages/overview/deployments/HistoryConfig.tsx index a6b7aa6aed..6cc2ad5716 100644 --- a/web/oss/src/components/pages/overview/deployments/HistoryConfig.tsx +++ b/web/oss/src/components/pages/overview/deployments/HistoryConfig.tsx @@ -1,15 +1,14 @@ import {useMemo} from "react" import {Typography} from "antd" -import {useAtomValue} from "jotai" import {createUseStyles} from "react-jss" import {NewVariantParametersView} from "@/oss/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters" +import {useAppsData} from "@/oss/contexts/app.context" import {filterVariantParameters} from "@/oss/lib/helpers/utils" import {useVariants} from "@/oss/lib/hooks/useVariants" import {JSSTheme, Variant} from "@/oss/lib/Types" import {DeploymentRevisionConfig} from "@/oss/lib/Types" -import {currentAppAtom} from "@/oss/state/app" const useStyles = createUseStyles((theme: JSSTheme) => ({ title: { @@ -61,9 +60,14 @@ interface HistoryConfigProps { const HistoryConfig = ({depRevisionConfig, variant: propsVariant}: HistoryConfigProps) => { const classes = useStyles() - const currentApp = useAtomValue(currentAppAtom) + const {currentApp} = useAppsData() // @ts-ignore - const {data, isLoading} = useVariants(currentApp, [propsVariant]) + const {data, isLoading} = useVariants(currentApp)( + { + appId: currentApp?.app_id, + }, + [propsVariant], + ) const variant = useMemo( // @ts-ignore () => data?.variants.find((v) => v.id === propsVariant.id), diff --git a/web/oss/src/components/pages/overview/variants/VariantPopover.tsx b/web/oss/src/components/pages/overview/variants/VariantPopover.tsx index abdcadf2dd..0489f9c1bf 100644 --- a/web/oss/src/components/pages/overview/variants/VariantPopover.tsx +++ b/web/oss/src/components/pages/overview/variants/VariantPopover.tsx @@ -1,28 +1,21 @@ import {ArrowSquareOut} from "@phosphor-icons/react" import {Badge, Button, Flex, Popover, Tag, Typography} from "antd" -import {useAtomValue} from "jotai" +import {useRouter} from "next/router" +import VariantDetailsWithStatus from "@/oss/components/VariantDetailsWithStatus" import {statusMap} from "@/oss/components/VariantDetailsWithStatus/components/EnvironmentStatus" -import VariantNameCell from "@/oss/components/VariantNameCell" -import {usePlaygroundNavigation} from "@/oss/hooks/usePlaygroundNavigation" import {formatVariantIdWithHash} from "@/oss/lib/helpers/utils" import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" import {Environment} from "@/oss/lib/Types" -import {variantUserDisplayNameAtomFamily} from "@/oss/state/variant/selectors/variant" type VariantPopoverProps = { env: Environment selectedDeployedVariant: EnhancedVariant | undefined } & React.ComponentProps -const ModifiedByText = ({variant}: {variant: EnhancedVariant}) => { - const name = useAtomValue(variantUserDisplayNameAtomFamily(variant.id)) - if (!name) return null - return {name} -} - const VariantPopover = ({env, selectedDeployedVariant, ...props}: VariantPopoverProps) => { - const {goToPlayground} = usePlaygroundNavigation() + const router = useRouter() + const appId = router.query.app_id as string return ( e.stopPropagation()} className="flex flex-col gap-4"> - - {/* */} + /> - - - - - - - + <> +
    +
    + + Recent Prompts + + + + + + + + +
    + + { + setQueryVariant(JSON.stringify([variant._revisionId ?? variant.id])) + setSelectedVariant(variant) + }} + rowSelection={{onChange: (value) => setSelectedRowKeys(value)}} + isLoading={isVariantLoading} + handleOpenDetails={(record) => { + setQueryVariant(JSON.stringify([variant._revisionId ?? variant.id])) + setSelectedVariant(record) + }} + handleDeleteVariant={(record) => { + setSelectedVariant(record) + setIsDeleteEvalModalOpen(true) + }} + handleDeploy={(record) => { + setIsDeployVariantModalOpen(true) + setSelectedVariant(record) + }} + handleOpenInPlayground={(record) => { + handleNavigation(record) + }} + />
    - { - // Cosmetic URL update for deep linking - updateQuery({ - revisionId: variant._revisionId ?? variant.id, - drawerType: "variant", - }) - // Open the drawer via atoms with an explicit selectedVariantId - }} - selectionScope={selectionScope} - isLoading={isVariantLoading} - handleOpenDetails={(record) => { - // Cosmetic URL update for deep linking - updateQuery({ - revisionId: record._revisionId ?? record.id, - drawerType: "variant", - }) - // Open the drawer via atoms with an explicit selectedVariantId - }} - handleOpenInPlayground={(record) => { - handleNavigation(record) - }} + setQueryVariant("")} + variants={variantList} + type="variant" /> -
    + + {selectedVariant && ( + setIsDeleteEvalModalOpen(false)} + onOk={() => handleDeleteVariant(selectedVariant)} + evaluationType={variantNameWithRev({ + variant_name: selectedVariant.variantName, + revision: selectedVariant.revision, + })} + /> + )} + + {selectedVariant && ( + setIsDeployVariantModalOpen(false)} + variantId={!selectedVariant._parentVariant ? selectedVariant.variantId : null} + revisionId={selectedVariant._parentVariant ? selectedVariant.id : null} + environments={environments} + variantName={selectedVariant.variantName} + revision={selectedVariant.revision} + mutate={handleDeployment} + /> + )} + + {!selectedVariantsToCompare.isCompareDisabled && ( + setIsComparisonModalOpen(false)} + compareVariantList={selectedVariantsToCompare.compareVariantList} + /> + )} + ) } diff --git a/web/oss/src/components/pages/settings/APIKeys/APIKeys.tsx b/web/oss/src/components/pages/settings/APIKeys/APIKeys.tsx index a2a50ac394..e8dccad646 100644 --- a/web/oss/src/components/pages/settings/APIKeys/APIKeys.tsx +++ b/web/oss/src/components/pages/settings/APIKeys/APIKeys.tsx @@ -4,11 +4,11 @@ import {CopyOutlined, DeleteOutlined, PlusOutlined} from "@ant-design/icons" import {Alert, Button, Modal, Table, Tooltip, Typography, theme} from "antd" import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" +import {useOrgData} from "@/oss/contexts/org.context" import {useLoading} from "@/oss/hooks/useLoading" import {copyToClipboard} from "@/oss/lib/helpers/copyToClipboard" import {APIKey} from "@/oss/lib/Types" import {createApiKey, deleteApiKey, fetchAllListApiKeys} from "@/oss/services/apiKeys/api" -import {useOrgData} from "@/oss/state/org" import {Loading} from "./assets/constants" diff --git a/web/oss/src/components/pages/settings/Secrets/SecretProviderTable/index.tsx b/web/oss/src/components/pages/settings/Secrets/SecretProviderTable/index.tsx index aad21d6bc9..d44b42cb77 100644 --- a/web/oss/src/components/pages/settings/Secrets/SecretProviderTable/index.tsx +++ b/web/oss/src/components/pages/settings/Secrets/SecretProviderTable/index.tsx @@ -31,7 +31,7 @@ const SecretProviderTable = ({type}: {type: "standard" | "custom"}) => { style: {minWidth: 160}, }), render: (_, record) => { - const Icon = LLMIcons[record.title as string] + const Icon = LLMIcons[(record.title as string)?.replace(" ", "").toLowerCase()] return isCustom ? ( record?.name @@ -184,7 +184,7 @@ const SecretProviderTable = ({type}: {type: "standard" | "custom"}) => { className="ph-no-capture" columns={columns} dataSource={isCustom ? customRowSecrets : secrets} - rowKey={(record) => record.id || record.title || record.name || ""} + rowKey="id" bordered pagination={false} loading={loading} diff --git a/web/oss/src/components/pages/settings/WorkspaceManage/Modals/InviteUsersModal.tsx b/web/oss/src/components/pages/settings/WorkspaceManage/Modals/InviteUsersModal.tsx index 77b721e53c..8204fbf976 100644 --- a/web/oss/src/components/pages/settings/WorkspaceManage/Modals/InviteUsersModal.tsx +++ b/web/oss/src/components/pages/settings/WorkspaceManage/Modals/InviteUsersModal.tsx @@ -5,13 +5,13 @@ import {Alert, Form, Input, Modal, Select, Space, Typography, message, theme} fr import {useAtom} from "jotai" import Link from "next/link" +import {useOrgData} from "@/oss/contexts/org.context" import useLazyEffect from "@/oss/hooks/useLazyEffect" import {workspaceRolesAtom} from "@/oss/lib/atoms/organization" import {useSubscriptionDataWrapper} from "@/oss/lib/helpers/useSubscriptionDataWrapper" import {isDemo, snakeToTitle} from "@/oss/lib/helpers/utils" import {Plan} from "@/oss/lib/Types" import {inviteToWorkspace} from "@/oss/services/workspace/api" -import {useOrgData} from "@/oss/state/org" import {InviteFormProps, InviteUsersModalProps} from "./assets/types" @@ -23,7 +23,7 @@ const InviteForm: FC = ({onSuccess, workspaceId, form, setLoadi const {selectedOrg, refetch} = useOrgData() const [roles] = useAtom(workspaceRolesAtom) const {token} = theme.useToken() - const organizationId = selectedOrg?.id + const orgId = selectedOrg?.id const filteredRoles = useMemo(() => { if (!isDemo()) { @@ -34,7 +34,7 @@ const InviteForm: FC = ({onSuccess, workspaceId, form, setLoadi const onSubmit = useCallback( ({emails, role}: {emails: string[]; role: string | null}) => { - if (!organizationId) return + if (!orgId) return setLoading(true) @@ -43,7 +43,7 @@ const InviteForm: FC = ({onSuccess, workspaceId, form, setLoadi email, ...(role ? {roles: [role]} : {}), })), - organizationId, + orgId, workspaceId, }) .then((responses) => { @@ -63,7 +63,7 @@ const InviteForm: FC = ({onSuccess, workspaceId, form, setLoadi .catch(console.error) .finally(() => setLoading(false)) }, - [organizationId], + [orgId], ) return ( diff --git a/web/oss/src/components/pages/settings/WorkspaceManage/WorkspaceManage.tsx b/web/oss/src/components/pages/settings/WorkspaceManage/WorkspaceManage.tsx index a041a7d624..9f90e342c3 100644 --- a/web/oss/src/components/pages/settings/WorkspaceManage/WorkspaceManage.tsx +++ b/web/oss/src/components/pages/settings/WorkspaceManage/WorkspaceManage.tsx @@ -1,17 +1,20 @@ import {useEffect, useMemo, useState, type FC} from "react" import {GearSix, PencilSimple, Plus} from "@phosphor-icons/react" -import {Button, Input, Space, Spin, Table, Tag, Typography} from "antd" +import {Button, Input, Space, Spin, Table, Tag, Typography, message} from "antd" import {ColumnsType} from "antd/es/table" +import {useAtom} from "jotai" import dynamic from "next/dynamic" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProfileData} from "@/oss/contexts/profile.context" import {useQueryParam} from "@/oss/hooks/useQuery" +import {workspaceRolesAtom} from "@/oss/lib/atoms/organization" import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" import {getUsernameFromEmail, isDemo} from "@/oss/lib/helpers/utils" import {WorkspaceMember} from "@/oss/lib/Types" -import {useOrgData} from "@/oss/state/org" -import {useProfileData} from "@/oss/state/profile" -import {useUpdateWorkspaceName, useWorkspaceMembers} from "@/oss/state/workspace" +import {updateOrganization} from "@/oss/services/organization/api" +import {fetchAllWorkspaceRoles, updateWorkspace} from "@/oss/services/workspace/api" import AvatarWithLabel from "./assets/AvatarWithLabel" import {Actions, Roles} from "./cellRenderers" @@ -21,18 +24,18 @@ const InviteUsersModal = dynamic(() => import("./Modals/InviteUsersModal"), {ssr const WorkspaceManage: FC = () => { const {user: signedInUser} = useProfileData() - const {selectedOrg, loading, refetch} = useOrgData() - const {updateWorkspaceName} = useUpdateWorkspaceName() - const {filteredMembers, searchTerm, setSearchTerm} = useWorkspaceMembers() + const {selectedOrg, setSelectedOrg, loading, refetch} = useOrgData() + const [searchTerm, setSearchTerm] = useState("") const [isInviteModalOpen, setIsInviteModalOpen] = useState(false) const [isInvitedUserLinkModalOpen, setIsInvitedUserLinkModalOpen] = useState(false) const [invitedUserData, setInvitedUserData] = useState<{email: string; uri: string}>({ email: "", uri: "", }) + const setRoles = useAtom(workspaceRolesAtom)[1] const [queryInviteModalOpen, setQueryInviteModalOpen] = useQueryParam("inviteModal") - const organizationId = selectedOrg?.id + const orgId = selectedOrg?.id const workspaceId = selectedOrg?.default_workspace?.id const workspace = selectedOrg?.default_workspace @@ -43,6 +46,21 @@ const WorkspaceManage: FC = () => { setWorkspaceNameInput(workspace?.name || "") }, [workspace?.name]) + const members = workspace?.members || [] + + useEffect(() => { + fetchAllWorkspaceRoles().then(setRoles).catch(console.error) + }, []) + + const filteredMembers = useMemo(() => { + if (searchTerm) { + return members.filter((member) => + member.user.email.toLowerCase().includes(searchTerm.toLowerCase()), + ) + } + return members + }, [members, searchTerm]) + const columns = useMemo( () => ( @@ -81,7 +99,7 @@ const WorkspaceManage: FC = () => { ), @@ -128,7 +146,7 @@ const WorkspaceManage: FC = () => { member.user.email === signedInUser?.email || member.user.id === selectedOrg?.owner } - organizationId={organizationId!} + orgId={orgId!} workspaceId={workspaceId!} onResendInvite={(data: any) => { if (!isDemo() && data.uri) { @@ -146,17 +164,31 @@ const WorkspaceManage: FC = () => { ) const handleSaveWorkspaceName = async () => { - if (!workspaceId || !organizationId) return - - await updateWorkspaceName({ - organizationId, - workspaceId, - name: workspaceNameInput, - onSuccess: () => { - // Only handle UI state - workspace data is updated by the mutation atom - setIsEditingName(false) - }, - }) + if (!workspaceId || !orgId) return + try { + await Promise.all([ + updateWorkspace({orgId, workspaceId, name: workspaceNameInput}), + updateOrganization(orgId, workspaceNameInput), + ]) + setSelectedOrg((prev) => + prev + ? { + ...prev, + name: workspaceNameInput, + default_workspace: { + ...prev.default_workspace, + name: workspaceNameInput, + }, + } + : prev, + ) + refetch() + message.success("Workspace renamed") + setIsEditingName(false) + } catch (error) { + console.error(error) + message.error("Failed to rename workspace") + } } return ( @@ -203,7 +235,6 @@ const WorkspaceManage: FC = () => { placeholder="Search" className="w-[400px]" allowClear - value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} /> @@ -219,7 +250,6 @@ const WorkspaceManage: FC = () => { dataSource={filteredMembers} - rowKey={(record) => record.user.id} columns={columns} pagination={false} bordered diff --git a/web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx b/web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx index ed8a00fbbd..c5423bbebd 100644 --- a/web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx +++ b/web/oss/src/components/pages/settings/WorkspaceManage/cellRenderers.tsx @@ -3,28 +3,29 @@ import {useState} from "react" import {EditOutlined, MoreOutlined, SyncOutlined} from "@ant-design/icons" import {ArrowClockwise, Trash} from "@phosphor-icons/react" import {Button, Dropdown, Space, Tag, Tooltip, Typography, message} from "antd" +import {useAtom} from "jotai" import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" +import {useOrgData} from "@/oss/contexts/org.context" +import {workspaceRolesAtom} from "@/oss/lib/atoms/organization" import {useSubscriptionDataWrapper} from "@/oss/lib/helpers/useSubscriptionDataWrapper" import {isDemo, snakeToTitle} from "@/oss/lib/helpers/utils" import {Plan, User} from "@/oss/lib/Types" -import {WorkspaceMember} from "@/oss/lib/Types" +import {WorkspaceMember, WorkspaceRole} from "@/oss/lib/Types" import { assignWorkspaceRole, removeFromWorkspace, resendInviteToWorkspace, unAssignWorkspaceRole, } from "@/oss/services/workspace/api" -import {useOrgData} from "@/oss/state/org" -import {useWorkspaceRoles} from "@/oss/state/workspace" export const Actions: React.FC<{ member: WorkspaceMember hidden?: boolean - organizationId: string + orgId: string workspaceId: string onResendInvite: any -}> = ({member, hidden, organizationId, workspaceId, onResendInvite}) => { +}> = ({member, hidden, orgId, workspaceId, onResendInvite}) => { const {user} = member const isMember = user.status === "member" @@ -34,9 +35,9 @@ export const Actions: React.FC<{ if (hidden) return null const handleResendInvite = () => { - if (!organizationId || !user.email || !workspaceId) return + if (!orgId || !user.email || !workspaceId) return setResendLoading(true) - resendInviteToWorkspace({organizationId, workspaceId, email: user.email}) + resendInviteToWorkspace({orgId, workspaceId, email: user.email}) .then((res) => { if (!isDemo() && typeof res.url === "string") { onResendInvite({email: user.email, uri: res.url}) @@ -50,14 +51,12 @@ export const Actions: React.FC<{ } const handleRemove = () => { - if (!organizationId || !user.email || !workspaceId) return + if (!orgId || !user.email || !workspaceId) return AlertPopup({ title: "Remove member", message: `Are you sure you want to remove ${user.username} from this workspace?`, onOk: () => - removeFromWorkspace({organizationId, workspaceId, email: user.email}, true).then( - () => refetch(), - ), + removeFromWorkspace({orgId, workspaceId, email: user.email}, true).then(() => refetch()), okText: "Remove", }) } @@ -109,12 +108,12 @@ export const Actions: React.FC<{ export const Roles: React.FC<{ member: WorkspaceMember signedInUser: User - organizationId: string + orgId: string workspaceId: string -}> = ({member, signedInUser, organizationId, workspaceId}) => { +}> = ({member, signedInUser, orgId, workspaceId}) => { const [loading, setLoading] = useState(false) - const {roles} = useWorkspaceRoles() - const {selectedOrg, refetch} = useOrgData() + const [roles] = useAtom(workspaceRolesAtom) + const {selectedOrg, setSelectedOrg} = useOrgData() const {subscription}: {subscription?: any} = useSubscriptionDataWrapper() ?? { subscription: undefined, } @@ -127,29 +126,44 @@ export const Roles: React.FC<{ const handleChangeRole = async (roleName: string) => { setLoading(true) try { - await assignWorkspaceRole({ - organizationId, - workspaceId, - email: user.email, - role: roleName, - }) + await assignWorkspaceRole({orgId, workspaceId, email: user.email, role: roleName}) await Promise.all( member.roles .filter((item) => item.role_name !== roleName) .map((item) => unAssignWorkspaceRole({ - organizationId, + orgId, workspaceId, email: user.email, role: item.role_name, }), ), ) - await refetch() - message.success("Workspace role updated") + if (selectedOrg) + setSelectedOrg({ + ...selectedOrg, + default_workspace: { + ...selectedOrg.default_workspace, + members: selectedOrg.default_workspace.members.map((item) => { + if (item.user.email === user.email) { + return { + ...item, + roles: [ + { + ...(roles.find( + (item) => item.role_name === roleName, + ) as WorkspaceRole), + permissions: [], + }, + ], + } + } + return item + }), + }, + }) } catch (error) { console.error("Failed to change the role:", error) - message.error("Failed to update workspace role") } finally { setLoading(false) } diff --git a/web/oss/src/components/pages/testset/modals/CreateTestset.tsx b/web/oss/src/components/pages/testset/modals/CreateTestset.tsx index 12e32d69b0..14edd77cbc 100644 --- a/web/oss/src/components/pages/testset/modals/CreateTestset.tsx +++ b/web/oss/src/components/pages/testset/modals/CreateTestset.tsx @@ -46,19 +46,21 @@ const CreateTestset: React.FC = ({setCurrent}) => { const classes = useStyles() return (
    - Create new testset + Create new test set
    setCurrent(1)}> Create from scratch - Create a new testset directly from the webUI + Create a new test set directly from the webUI
    setCurrent(2)}> - Upload a testset - Upload your testset as CSV or JSON + Upload a test set + Upload your test set as CSV or JSON
    setCurrent(3)}> Create with API - Create a testset programmatically using our API endpoints + + Create a test set programmatically using our API endpoints +
    diff --git a/web/oss/src/components/pages/testset/modals/CreateTestsetFromApi.tsx b/web/oss/src/components/pages/testset/modals/CreateTestsetFromApi.tsx index 796d29fd5c..518c9e5927 100644 --- a/web/oss/src/components/pages/testset/modals/CreateTestsetFromApi.tsx +++ b/web/oss/src/components/pages/testset/modals/CreateTestsetFromApi.tsx @@ -13,7 +13,7 @@ import pythonCodeUpload from "@/oss/code_snippets/testsets/create_with_upload/py import tsCodeUpload from "@/oss/code_snippets/testsets/create_with_upload/typescript" import CopyButton from "@/oss/components/CopyButton/CopyButton" import CodeBlock from "@/oss/components/DynamicCodeBlock/CodeBlock" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import {JSSTheme} from "@/oss/lib/Types" const {Text} = Typography @@ -102,11 +102,11 @@ const CreateTestsetFromApi: React.FC = ({setCurrent, onCancel}) => { onClick={() => setCurrent(0)} /> - Create a testset with API + Create a test set with API
    - Create a testset programmatically using our API endpoints + Create a test set programmatically using our API endpoints
    Select type @@ -116,11 +116,11 @@ const CreateTestsetFromApi: React.FC = ({setCurrent, onCancel}) => {
    - Use this endpoint to create a new Testset for your App using JSON + Use this endpoint to create a new Test set for your App using JSON
    = ({setCurrent, onCancel}) => {
    diff --git a/web/oss/src/components/pages/testset/modals/CreateTestsetFromScratch.tsx b/web/oss/src/components/pages/testset/modals/CreateTestsetFromScratch.tsx index 6974e8f64b..1b137e1193 100644 --- a/web/oss/src/components/pages/testset/modals/CreateTestsetFromScratch.tsx +++ b/web/oss/src/components/pages/testset/modals/CreateTestsetFromScratch.tsx @@ -5,10 +5,13 @@ import {Button, Input, message, Typography} from "antd" import {useRouter} from "next/router" import {createUseStyles} from "react-jss" -import useURL from "@/oss/hooks/useURL" import {JSSTheme, KeyValuePair, testset, TestsetCreationMode} from "@/oss/lib/Types" -import {createNewTestset, fetchTestset, updateTestset} from "@/oss/services/testsets/api" -import {useTestsetsData} from "@/oss/state/testset" +import { + createNewTestset, + fetchTestset, + updateTestset, + useLoadTestsetsList, +} from "@/oss/services/testsets/api" const {Text} = Typography @@ -42,25 +45,22 @@ const CreateTestsetFromScratch: React.FC = ({ }) => { const classes = useStyles() const router = useRouter() - const {projectURL} = useURL() const [testsetName, setTestsetName] = useState( mode === "rename" ? (editTestsetValues?.name as string) : "", ) const [isLoading, setIsLoading] = useState(false) - const {mutate} = useTestsetsData() + const {mutate} = useLoadTestsetsList() const handleCreateTestset = async (data?: KeyValuePair[]) => { setIsLoading(true) try { const rowData = data const response = await createNewTestset(testsetName, rowData) - - await mutate() - message.success("Testset created successfully") - router.push(`${projectURL}/testsets/${response.data.id}`) + message.success("Test set created successfully") + router.push(`/testsets/${response.data.id}`) } catch (error) { - console.error("Error saving testset:", error) - message.error("Failed to create Testset. Please try again!") + console.error("Error saving test set:", error) + message.error("Failed to create Test set. Please try again!") } finally { setIsLoading(false) } @@ -76,8 +76,8 @@ const CreateTestsetFromScratch: React.FC = ({ throw new Error("Failed to load instances") } } catch (error) { - console.error("Error cloning testset:", error) - message.error("Failed to clone Testset. Please try again!") + console.error("Error cloning test set:", error) + message.error("Failed to clone Test set. Please try again!") } finally { setIsLoading(false) } @@ -89,15 +89,15 @@ const CreateTestsetFromScratch: React.FC = ({ const fetchedTestset = await fetchTestset(testsetId) if (fetchedTestset.csvdata) { await updateTestset(testsetId, testsetName, fetchedTestset.csvdata) - message.success("Testset renamed successfully") + message.success("Test set renamed successfully") mutate() onCancel() } else { throw new Error("Failed to load instances") } } catch (error) { - console.error("Error renaming testset:", error) - message.error("Failed to rename Testset. Please try again!") + console.error("Error renaming test set:", error) + message.error("Failed to rename Test set. Please try again!") } finally { setIsLoading(false) } @@ -122,9 +122,9 @@ const CreateTestsetFromScratch: React.FC = ({ case "create": return "Create from scratch" case "clone": - return "Clone Testset" + return "Clone Test set" case "rename": - return "Rename Testset" + return "Rename Test set" } }, [mode]) @@ -146,10 +146,10 @@ const CreateTestsetFromScratch: React.FC = ({ {getHeaderText}
    - Create a new testset directly from the webUI + Create a new test set directly from the webUI
    - Testset Name + Test Set Name = ({ onClick={onSubmit} loading={isLoading} > - {mode === "rename" ? "Rename" : "Create testset"} + {mode === "rename" ? "Rename" : "Create test set"}
    diff --git a/web/oss/src/components/pages/testset/modals/DeleteTestset.tsx b/web/oss/src/components/pages/testset/modals/DeleteTestset.tsx index a12fb3e82d..c055020fcf 100644 --- a/web/oss/src/components/pages/testset/modals/DeleteTestset.tsx +++ b/web/oss/src/components/pages/testset/modals/DeleteTestset.tsx @@ -1,18 +1,18 @@ import {Dispatch, SetStateAction, useState} from "react" import {DeleteOutlined} from "@ant-design/icons" -import {Modal, ModalProps} from "antd" +import {Modal} from "antd" import {KeyedMutator} from "swr" import {checkIfResourceValidForDeletion} from "@/oss/lib/helpers/evaluate" import {testset} from "@/oss/lib/Types" import {deleteTestsets} from "@/oss/services/testsets/api" -interface DeleteTestsetProps extends ModalProps { +type DeleteTestsetProps = { selectedTestsetToDelete: testset[] mutate: KeyedMutator setSelectedTestsetToDelete: Dispatch> -} +} & React.ComponentProps const DeleteTestset = ({ selectedTestsetToDelete, diff --git a/web/oss/src/components/pages/testset/modals/UploadTestset.tsx b/web/oss/src/components/pages/testset/modals/UploadTestset.tsx index 42008c37cf..0f14b25762 100644 --- a/web/oss/src/components/pages/testset/modals/UploadTestset.tsx +++ b/web/oss/src/components/pages/testset/modals/UploadTestset.tsx @@ -8,8 +8,7 @@ import {createUseStyles} from "react-jss" import {globalErrorHandler} from "@/oss/lib/helpers/errorHandler" import {isValidCSVFile, isValidJSONFile} from "@/oss/lib/helpers/fileManipulations" import {GenericObject, JSSTheme} from "@/oss/lib/Types" -import {uploadTestsets} from "@/oss/services/testsets/api" -import {useTestsetsData} from "@/oss/state/testset" +import {uploadTestsets, useLoadTestsetsList} from "@/oss/services/testsets/api" const {Text} = Typography @@ -61,7 +60,7 @@ const UploadTestset: React.FC = ({setCurrent, onCancel}) => { const [testsetName, setTestsetName] = useState("") const [uploadLoading, setUploadLoading] = useState(false) const [fileProgress, setFileProgress] = useState({} as UploadFile) - const {mutate} = useTestsetsData() + const {mutate} = useLoadTestsetsList() const onFinish = async (values: any) => { const {file} = values @@ -123,11 +122,11 @@ const UploadTestset: React.FC = ({setCurrent, onCancel}) => { onClick={() => setCurrent(0)} /> - Upload a testset + Upload a test set
    - Upload your testset as CSV or JSON + Upload your test set as CSV or JSON
    Select type @@ -138,7 +137,7 @@ const UploadTestset: React.FC = ({setCurrent, onCancel}) => {
    - Testset Name + Test Set Name = ({setCurrent, onCancel}) => { {uploadType === "CSV" ? ( <> - The testset should be in CSV format with the + The test set should be in CSV format with the following requirements:
    @@ -240,7 +239,7 @@ const UploadTestset: React.FC = ({setCurrent, onCancel}) => { ) : ( <> - The testset should be in JSON format with the + The test set should be in JSON format with the following requirements: @@ -278,7 +277,7 @@ const UploadTestset: React.FC = ({setCurrent, onCancel}) => { )} @@ -301,7 +300,7 @@ const UploadTestset: React.FC = ({setCurrent, onCancel}) => { type="primary" onClick={() => form.submit()} > - Create testset + Create test set
    diff --git a/web/oss/src/components/ui/CustomTreeComponent/index.tsx b/web/oss/src/components/ui/CustomTreeComponent/index.tsx index 4709986384..1d3c6efa05 100644 --- a/web/oss/src/components/ui/CustomTreeComponent/index.tsx +++ b/web/oss/src/components/ui/CustomTreeComponent/index.tsx @@ -7,7 +7,6 @@ import {_AgentaRootsResponse} from "@/oss/services/observability/types" import {TreeContent} from "../../pages/observability/drawer/TraceTree" import {useStyles} from "./assets/styles" -import {TraceSpanNode} from "@/oss/services/tracing/types" /** * CustomTree is a recursive tree view component for rendering a hierarchy of nodes. @@ -29,7 +28,7 @@ interface TreeProps { /** * Root node of the hierarchical data structure. */ - data: TraceSpanNode + data: _AgentaRootsResponse /** * Settings for what additional metrics to show in each node. @@ -52,7 +51,7 @@ interface TreeProps { } const TreeNodeComponent: React.FC<{ - node: TraceSpanNode + node: _AgentaRootsResponse isLast: boolean settings: {latency: boolean; cost: boolean; tokens: boolean} selectedKey: string | null @@ -81,7 +80,7 @@ const TreeNodeComponent: React.FC<{ ? `${classes.nodeLabel} ${shouldShowAsLast ? "last" : ""}` : "flex items-center" } - onClick={() => onSelect(node.span_id)} + onClick={() => onSelect(node.node.id)} > {hasChildren && ( diff --git a/web/oss/src/components/ui/UserAvatarTag.tsx b/web/oss/src/components/ui/UserAvatarTag.tsx index af644b42ee..9c3ca0b2b9 100644 --- a/web/oss/src/components/ui/UserAvatarTag.tsx +++ b/web/oss/src/components/ui/UserAvatarTag.tsx @@ -1,56 +1,19 @@ -import {memo} from "react" +import React from "react" import {Tag} from "antd" -import {useAtomValue} from "jotai" - -import {variantUserDisplayNameAtomFamily} from "@/oss/state/variant/selectors/variant" import Avatar from "../Avatar/Avatar" -interface VariantUserAvatarTagProps { - variantId: string - fallback?: string - nameOverride?: string -} - -const VariantUserAvatarTag = memo( - ({variantId, fallback, nameOverride}: VariantUserAvatarTagProps) => { - const derivedName = useAtomValue(variantUserDisplayNameAtomFamily(variantId)) - const name = - nameOverride || - (derivedName && derivedName !== "-" ? derivedName : undefined) || - fallback || - "-" - return ( - - {name} - - ) - }, -) - interface UserAvatarTagProps { - modifiedBy?: string - variantId?: string - nameOverride?: string + modifiedBy: string } -const UserAvatarTag = memo(({modifiedBy, variantId, nameOverride}: UserAvatarTagProps) => { - if (variantId) { - return ( - - ) - } - const name = nameOverride || modifiedBy || "-" +const UserAvatarTag = ({modifiedBy}: UserAvatarTagProps) => { return ( - {name} + {modifiedBy} ) -}) +} export default UserAvatarTag diff --git a/web/oss/src/contexts/RunIdContext.tsx b/web/oss/src/contexts/RunIdContext.tsx deleted file mode 100644 index 9050fc97d7..0000000000 --- a/web/oss/src/contexts/RunIdContext.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, {createContext, useContext} from "react" - -/** - * Context for providing the current evaluation run ID to components. - * This enables components to use run-scoped atoms without prop drilling. - */ -export const RunIdContext = createContext(null) - -/** - * Provider component that supplies the run ID to all child components. - */ -export const RunIdProvider: React.FC<{ - runId: string | null - children: React.ReactNode -}> = ({runId, children}) => { - return {children} -} - -/** - * Hook to access the current run ID from context. - * Throws an error if used outside of a RunIdProvider. - */ -export const useRunId = (): string => { - const runId = useContext(RunIdContext) - if (!runId) { - throw new Error( - "useRunId must be used within a RunIdProvider. " + - "Make sure your component is wrapped with ", - ) - } - return runId -} - -/** - * Hook to safely access the run ID, returning null if not available. - * Useful for components that can work with or without a run ID. - */ -export const useOptionalRunId = (): string | null => { - return useContext(RunIdContext) -} diff --git a/web/oss/src/contexts/app.context.tsx b/web/oss/src/contexts/app.context.tsx new file mode 100644 index 0000000000..7c0d3101bf --- /dev/null +++ b/web/oss/src/contexts/app.context.tsx @@ -0,0 +1,158 @@ +// @ts-nocheck +import { + PropsWithChildren, + createContext, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from "react" + +import {HookAPI} from "antd/es/modal/useModal" +import {useRouter} from "next/router" +import useSWR from "swr" +import {useLocalStorage} from "usehooks-ts" + +import {ListAppsItem} from "@/oss/lib/Types" + +import {useOrgData} from "./org.context" +import {useProfileData} from "./profile.context" +import {useProjectData, DEFAULT_UUID} from "./project.context" + +interface AppContextType { + currentApp: ListAppsItem | null + apps: ListAppsItem[] + error: any + isLoading: boolean + mutate: () => void + recentlyVisitedAppId: string | null + modalInstance?: HookAPI + setModalInstance: (context: any) => void +} + +const initialValues: AppContextType = { + currentApp: null, + apps: [], + error: null, + isLoading: false, + mutate: () => {}, + recentlyVisitedAppId: null, + setModalInstance: (context) => {}, +} + +export const useApps = (options = {}) => { + const {projectId} = useProjectData() + const {user} = useProfileData() + + const isMockProjectId = projectId === DEFAULT_UUID + + const {selectedOrg, loading} = useOrgData() + const {data, error, isLoading, mutate} = useSWR( + !user || isMockProjectId || !selectedOrg?.id || !projectId + ? null + : `/api/apps?` + (!isMockProjectId ? `project_id=${projectId}&` : ""), + { + ...options, + shouldRetryOnError: false, + revalidateOnFocus: false, + }, + ) + + return { + data: (data || []) as ListAppsItem[], + error, + isLoading: isLoading ?? loading, + mutate, + } +} + +export const AppContext = createContext(initialValues) + +export const useAppsData = () => useContext(AppContext) + +const appContextValues = {...initialValues} + +export const getAppValues = () => appContextValues + +const AppContextProvider: React.FC = ({children}) => { + const {isLoading: isProjectLoading} = useProjectData() + const router = useRouter() + const appId = router.query?.app_id as string + const [recentlyVisitedAppId, setRecentlyVisitedAppId] = useLocalStorage( + "recentlyVisitedApp", + null, + ) + const currentAppRef = useRef(null) + const { + data: apps, + error, + isLoading, + mutate, + } = useApps({ + onSuccess: (data) => { + if (!appId) { + return recentlyVisitedAppId + ? data.find((item: ListAppsItem) => item.app_id === recentlyVisitedAppId) || + null + : null + } + currentAppRef.current = data.find((item: ListAppsItem) => item.app_id === appId) || null + }, + }) + + useEffect(() => { + if (appId) { + setRecentlyVisitedAppId(appId) + } + }, [appId]) + + const currentApp = useMemo(() => { + if (!appId) { + return recentlyVisitedAppId + ? apps.find((item: ListAppsItem) => item.app_id === recentlyVisitedAppId) || null + : null + } + if (appId && appId === currentAppRef.current?.app_id) { + return currentAppRef.current + } + const newApp = apps.find((item: ListAppsItem) => item.app_id === appId) || null + currentAppRef.current = newApp + return currentAppRef.current + }, [apps, appId, recentlyVisitedAppId]) + + useEffect(() => { + if (!currentApp) { + setRecentlyVisitedAppId(null) + } + }, [currentApp]) + + const [modalInstance, setModalInstance] = useState() + + appContextValues.modalInstance = modalInstance + appContextValues.setModalInstance = setModalInstance + appContextValues.currentApp = currentApp + appContextValues.apps = apps + appContextValues.error = error + appContextValues.isLoading = isLoading || isProjectLoading + appContextValues.recentlyVisitedAppId = recentlyVisitedAppId + + return ( + + {children} + + ) +} + +export default AppContextProvider diff --git a/web/oss/src/contexts/observability.context.tsx b/web/oss/src/contexts/observability.context.tsx new file mode 100644 index 0000000000..00de974fce --- /dev/null +++ b/web/oss/src/contexts/observability.context.tsx @@ -0,0 +1,184 @@ +// @ts-nocheck +import {createContext, PropsWithChildren, useContext, useMemo, useState, useEffect} from "react" + +import {useRouter} from "next/router" + +import {SortResult} from "@/oss/components/Filters/Sort" +import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" +import {Filter} from "@/oss/lib/Types" +import {useTraces} from "@/oss/services/observability/hooks/useTraces" + +import useAnnotations from "../lib/hooks/useAnnotations" +import {attachAnnotationsToTraces} from "../lib/hooks/useAnnotations/assets/helpers" +import {AnnotationDto} from "../lib/hooks/useAnnotations/types" +import {TracesWithAnnotations} from "../services/observability/types" + +interface ObservabilityContextType { + traces: TracesWithAnnotations[] + annotations: AnnotationDto[] + count: number + isLoading: boolean + fetchTraces: () => void + fetchAnnotations: () => void + clearQueryStates: () => void + searchQuery: string + setSearchQuery: React.Dispatch> + traceTabs: TraceTabTypes + setTraceTabs: React.Dispatch> + filters: Filter[] + setFilters: React.Dispatch> + sort: SortResult + setSort: React.Dispatch> + pagination: {page: number; size: number} + setPagination: React.Dispatch> + navigateToPage: (newPage: number) => Promise +} + +type TraceTabTypes = "tree" | "node" | "chat" + +const initialValues: ObservabilityContextType = { + traces: [], + annotations: [], + count: 0, + isLoading: false, + fetchTraces: () => {}, + fetchAnnotations: () => {}, + clearQueryStates: () => {}, + searchQuery: "", + setSearchQuery: () => {}, + traceTabs: "tree", + setTraceTabs: () => {}, + filters: [], + setFilters: () => {}, + sort: {}, + setSort: () => {}, + pagination: {page: 1, size: 10}, + setPagination: () => {}, + navigateToPage: () => {}, +} + +export const ObservabilityContext = createContext(initialValues) + +export const useObservabilityData = () => useContext(ObservabilityContext) + +const observabilityContextValues = {...initialValues} + +export const getObservabilityValues = () => observabilityContextValues + +const ObservabilityContextProvider: React.FC = ({children}) => { + const router = useRouter() + const appId = router.isReady ? (router.query.app_id as string | undefined) : undefined + // query states + const [searchQuery, setSearchQuery] = useState("") + const [traceTabs, setTraceTabs] = useState("tree") + const [filters, setFilters] = useState([]) + const [sort, setSort] = useState({}) + const [pagination, setPagination] = useState({page: 1, size: 50}) + + // Update filters when router becomes ready or appId changes + useEffect(() => { + if (!router.isReady) return + + if (appId) { + setFilters((prev) => { + const other = prev.filter((f) => f.key !== "refs.application.id") + return [ + ...other, + { + key: "refs.application.id", + operator: "is", + value: appId, + isPermanent: true, + }, + ] + }) + } + + // set default sort if not set + if (!sort.sorted) { + setSort({ + type: "standard", + sorted: dayjs().utc().subtract(24, "hours").toISOString().split(".")[0], + }) + } + }, [router.isReady, appId]) + + const { + data, + isLoading, + mutate: fetchTraces, + } = useTraces( + { + pagination, + sort, + filters, + traceTabs, + autoPrefetch: !router.isReady || !sort.type, + waitUntil: !router.isReady || !sort.type, + }, + appId, + ) + const navigateToPage = (newPage: number) => { + setPagination((prev) => ({...prev, page: newPage})) + } + const {traces, traceCount} = data || {} + + const annotationLinks = useMemo( + () => (traces || []).map((t) => t.invocationIds || {}).filter(Boolean), + [traces], + ) + + const {data: annotations, mutate: fetchAnnotations} = useAnnotations({ + queries: annotationLinks.length ? {annotation: {links: annotationLinks}} : undefined, + waitUntil: annotationLinks.length === 0, + }) + + const tracesWithAnnotations: TracesWithAnnotations[] = useMemo(() => { + return attachAnnotationsToTraces(traces || [], annotations || []) + }, [traces, annotations]) + + const clearQueryStates = () => { + setSearchQuery("") + setTraceTabs("tree") + setFilters([]) + setSort({} as SortResult) + setPagination({page: 1, size: 10}) + } + + observabilityContextValues.traces = tracesWithAnnotations + observabilityContextValues.annotations = annotations + observabilityContextValues.isLoading = isLoading + observabilityContextValues.fetchTraces = fetchTraces + observabilityContextValues.fetchAnnotations = fetchAnnotations + observabilityContextValues.count = traceCount + observabilityContextValues.navigateToPage = navigateToPage + + return ( + + {children} + + ) +} + +export default ObservabilityContextProvider diff --git a/web/oss/src/contexts/org.context.tsx b/web/oss/src/contexts/org.context.tsx new file mode 100644 index 0000000000..0a5672fb7b --- /dev/null +++ b/web/oss/src/contexts/org.context.tsx @@ -0,0 +1,136 @@ +import {PropsWithChildren, createContext, useCallback, useContext, useEffect, useState} from "react" + +import {useRouter} from "next/router" + +import {useProfileData} from "@/oss/contexts/profile.context" +import {useSession} from "@/oss/hooks/useSession" +import useStateCallback from "@/oss/hooks/useStateCallback" +import {Org, OrgDetails} from "@/oss/lib/Types" +import {fetchAllOrgsList, fetchSingleOrg} from "@/oss/services/organization/api" + +export const LS_ORG_KEY = "selectedOrg" + +interface OrgContextType { + orgs: Org[] + selectedOrg: OrgDetails | null + loading: boolean + changeSelectedOrg: (orgId: string, onSuccess?: () => void) => void + setSelectedOrg: React.Dispatch> + reset: () => void + refetch: (onSuccess?: () => void) => void +} + +const initialValues: OrgContextType = { + orgs: [], + selectedOrg: null, + loading: false, + changeSelectedOrg: () => {}, + setSelectedOrg: () => {}, + reset: () => {}, + refetch: () => {}, +} + +export const OrgContext = createContext(initialValues) + +export const useOrgData = () => useContext(OrgContext) + +const orgContextValues = {...initialValues} + +export const getOrgValues = () => orgContextValues + +const OrgContextProvider: React.FC = ({children}) => { + const [orgs, setOrgs] = useStateCallback([]) + const [selectedOrg, setSelectedOrg] = useStateCallback(null) + const [loadingOrgs, setLoadingOrgs] = useState(false) + const [loadingOrgDetails, setLoadingOrgDetails] = useState(false) + const {logout, doesSessionExist} = useSession() + const {user} = useProfileData() + const router = useRouter() + + const fetchAllOrgs = useCallback((onSuccess?: () => void) => { + setLoadingOrgs(true) + fetchAllOrgsList() + .then((orgs) => { + setOrgs(orgs, onSuccess) + }) + .catch((error) => { + console.error(error) + logout() + }) + .finally(() => setLoadingOrgs(false)) + }, []) + + useEffect(() => { + if (user?.id && orgs.length > 0) { + setLoadingOrgDetails(true) + const org = + orgs.find((org: Org) => org.id === localStorage.getItem(LS_ORG_KEY)) || + orgs.find((org: Org) => org.owner === user.id) || + orgs[0] + if (org?.id) { + fetchSingleOrg({orgId: org.id}) + .then(setSelectedOrg) + .catch(console.error) + .finally(() => setLoadingOrgDetails(false)) + } else { + setSelectedOrg(null) + setLoadingOrgDetails(false) + } + } + }, [user?.id, orgs]) + + useEffect(() => { + localStorage.setItem(LS_ORG_KEY, selectedOrg?.id || "") + }, [selectedOrg?.id]) + + useEffect(() => { + // fetch profile and orgs list only if user is logged in + if (doesSessionExist) { + fetchAllOrgs() + } + }, [doesSessionExist]) + + const changeSelectedOrg: OrgContextType["changeSelectedOrg"] = (orgId, onSuccess) => { + setLoadingOrgDetails(true) + const org = orgs.find((org) => org.id === orgId) || selectedOrg + if (!org?.id) return + fetchSingleOrg({orgId: org?.id!}) + .then((data) => { + setSelectedOrg(data) + if (onSuccess) { + onSuccess() + } + router.push("/apps") + }) + .finally(() => setLoadingOrgDetails(false)) + .catch(console.error) + } + + const reset = () => { + setOrgs(initialValues.orgs) + setSelectedOrg(initialValues.selectedOrg) + } + + orgContextValues.orgs = orgs + orgContextValues.selectedOrg = selectedOrg + orgContextValues.changeSelectedOrg = changeSelectedOrg + orgContextValues.setSelectedOrg = setSelectedOrg + + return ( + + {children} + + ) +} + +export default OrgContextProvider diff --git a/web/oss/src/contexts/profile.context.tsx b/web/oss/src/contexts/profile.context.tsx new file mode 100644 index 0000000000..c1b0c861de --- /dev/null +++ b/web/oss/src/contexts/profile.context.tsx @@ -0,0 +1,77 @@ +import {PropsWithChildren, createContext, useState, useContext, useEffect, useCallback} from "react" + +import {useSession} from "@/oss/hooks/useSession" +import useStateCallback from "@/oss/hooks/useStateCallback" +import {usePostHogAg} from "@/oss/lib/helpers/analytics/hooks/usePostHogAg" +import {User} from "@/oss/lib/Types" +import {fetchProfile} from "@/oss/services/api" + +interface ProfileContextType { + user: User | null + loading: boolean + reset: () => void + refetch: (onSuccess?: () => void) => void +} + +const initialValues: ProfileContextType = { + user: null, + loading: false, + reset: () => {}, + refetch: () => {}, +} + +export const ProfileContext = createContext(initialValues) + +export const useProfileData = () => useContext(ProfileContext) + +const profileContextValues = {...initialValues} + +export const getProfileValues = () => profileContextValues + +const ProfileContextProvider: React.FC = ({children}) => { + const posthog = usePostHogAg() + const [user, setUser] = useStateCallback(null) + const [loading, setLoading] = useState(false) + const {logout, doesSessionExist} = useSession() + + const fetcher = useCallback((onSuccess?: () => void) => { + setLoading(true) + fetchProfile() + .then((profile) => { + posthog?.identify?.() + setUser(profile.data, onSuccess) + }) + .catch((error) => { + console.error(error) + logout() + }) + .finally(() => setLoading(false)) + }, []) + + useEffect(() => { + if (doesSessionExist) { + fetcher() + } + }, [doesSessionExist]) + + const reset = () => { + setUser(initialValues.user) + } + + profileContextValues.user = user + + return ( + + {children} + + ) +} + +export default ProfileContextProvider diff --git a/web/oss/src/contexts/project.context.tsx b/web/oss/src/contexts/project.context.tsx new file mode 100644 index 0000000000..8ad8a2f561 --- /dev/null +++ b/web/oss/src/contexts/project.context.tsx @@ -0,0 +1,106 @@ +import {PropsWithChildren, createContext, useState, useContext, useEffect} from "react" + +import {useSession} from "@/oss/hooks/useSession" +import useStateCallback from "@/oss/hooks/useStateCallback" +import {isDemo} from "@/oss/lib/helpers/utils" +import {fetchAllProjects} from "@/oss/services/project" +import {ProjectsResponse} from "@/oss/services/project/types" + +import {useOrgData} from "./org.context" + +export const DEFAULT_UUID = "00000000-0000-0000-0000-000000000000" + +interface ProjectContextType { + project: ProjectsResponse | null + projects: ProjectsResponse[] + isProjectId: boolean + projectId: string + isLoading: boolean + reset: () => void + refetch: (onSuccess?: () => void) => void +} + +const initialValues: ProjectContextType = { + project: null, + projects: [], + isProjectId: false, + projectId: "", + isLoading: false, + reset: () => {}, + refetch: () => {}, +} + +export const ProjectContext = createContext(initialValues) + +export const useProjectData = () => useContext(ProjectContext) + +const projectContextValues = {...initialValues} + +export const getCurrentProject = () => projectContextValues + +const ProjectContextProvider: React.FC = ({children}) => { + const [project, setProject] = useStateCallback(null) + const [projects, setProjects] = useState([]) + const [isLoading, setIsLoading] = useState(false) + const {doesSessionExist} = useSession() + + const {selectedOrg} = useOrgData() + + const workspaceId: string = selectedOrg?.default_workspace?.id || DEFAULT_UUID + + const isProjectId = !isLoading && !!project?.project_id + const projectId = (project?.project_id as string) || DEFAULT_UUID + + const fetcher = async (onSuccess?: () => void) => { + setIsLoading(true) + try { + const data = await fetchAllProjects() + + const _project = isDemo() + ? data.find((p) => p.workspace_id === workspaceId) || null + : data[0] || null + + setProject(_project, onSuccess) + setProjects(data) + } catch (error) { + console.error(error) + setProject(null) + } finally { + setIsLoading(false) + } + } + + useEffect(() => { + if (doesSessionExist) { + fetcher() + } + }, [doesSessionExist, selectedOrg]) + + const reset = () => { + setProject(initialValues.project) + } + + projectContextValues.project = project + projectContextValues.projects = projects + projectContextValues.isLoading = isLoading + projectContextValues.isProjectId = isProjectId + projectContextValues.projectId = projectId + + return ( + + {children} + + ) +} + +export default ProjectContextProvider diff --git a/web/oss/src/hooks/useAppId.ts b/web/oss/src/hooks/useAppId.ts index 7514a791b9..19718d52bf 100644 --- a/web/oss/src/hooks/useAppId.ts +++ b/web/oss/src/hooks/useAppId.ts @@ -1,8 +1,6 @@ -import {useAtomValue} from "jotai" - -import {routerAppIdAtom} from "../state/app" +import {useRouter} from "next/router" export const useAppId = (): string => { - const appId = useAtomValue(routerAppIdAtom) - return appId || "" + const router = useRouter() + return (router.query.app_id ?? "") as string } diff --git a/web/oss/src/hooks/useDebounceInput.ts b/web/oss/src/hooks/useDebounceInput.ts index 1fc341100e..9bd14b8b30 100644 --- a/web/oss/src/hooks/useDebounceInput.ts +++ b/web/oss/src/hooks/useDebounceInput.ts @@ -1,4 +1,4 @@ -import {useState, useEffect, useRef} from "react" +import {useState, useEffect} from "react" import {useDebounceValue} from "usehooks-ts" @@ -58,39 +58,21 @@ export function useDebounceInput( ) { const [localValue, setLocalValue] = useState(value ?? defaultValue) const [query, setQuery] = useDebounceValue(localValue, delay) - const lastEmittedRef = useRef(undefined) - // Emit only when debounced value differs from the latest controlled value - // and hasn't been emitted already. This prevents update feedback loops. useLazyEffect(() => { - const controlled = value ?? defaultValue - const shouldEmit = query !== controlled && query !== lastEmittedRef.current - if (shouldEmit) { - lastEmittedRef.current = query - onChange?.(query) - } - }, [query, value, defaultValue]) + onChange?.(query) + }, [query]) - // Sync down stream changes from the controlled value but avoid wiping user input - // when value is temporarily undefined/null during upstream recalculations. useEffect(() => { - if (value === undefined || value === null) return setQuery(value) setLocalValue((prevValue) => { - return value !== prevValue ? value : prevValue + const newValue = value ?? defaultValue + if (newValue !== prevValue) { + return newValue + } + return prevValue }) - }, [value]) - - // // Immediate emit on clears to avoid stale values when users submit quickly after deleting - // useEffect(() => { - // const controlled = value ?? defaultValue - // const isCleared = (localValue as any) === "" - // if (isCleared && localValue !== controlled && localValue !== lastEmittedRef.current) { - // lastEmittedRef.current = localValue - // onChange?.(localValue) - // } - // // eslint-disable-next-line react-hooks/exhaustive-deps - // }, [localValue]) + }, [value, defaultValue]) return [localValue, setLocalValue] as const } diff --git a/web/oss/src/hooks/usePlaygroundNavigation.ts b/web/oss/src/hooks/usePlaygroundNavigation.ts deleted file mode 100644 index 8937c6766f..0000000000 --- a/web/oss/src/hooks/usePlaygroundNavigation.ts +++ /dev/null @@ -1,83 +0,0 @@ -import {useCallback} from "react" - -import {useSetAtom} from "jotai" -import {useAppId} from "@/oss/hooks/useAppId" -import useURL from "@/oss/hooks/useURL" -import {recentAppIdAtom} from "@/oss/state/app/atoms/fetcher" -import {useAppNavigation} from "@/oss/state/appState" - -interface VariantLike { - id?: string - _revisionId?: string - revisionId?: string - deployed_app_variant_revision_id?: string - variant?: {id?: string} -} - -export type PlaygroundTarget = string | VariantLike | (string | VariantLike)[] - -const extractRevisionId = (x: VariantLike): string | undefined => { - return ( - x?._revisionId || - x?.revisionId || - x?.id || - x?.deployed_app_variant_revision_id || - x?.variant?.id || - undefined - ) -} - -export const normalizeRevisionIds = (target?: PlaygroundTarget): string[] => { - if (!target) return [] - if (typeof target === "string") return [target] - if (Array.isArray(target)) { - const out: string[] = [] - target.forEach((t) => { - out.push(...normalizeRevisionIds(t)) - }) - return out - } - const id = extractRevisionId(target) - return id ? [id] : [] -} - -/** - * Reusable navigation helper for redirecting to Playground. - * Uses the global PlaygroundNavigator via jotai to centralize routing logic. - */ -interface GoToPlaygroundOptions { - appId?: string | null -} - -export const usePlaygroundNavigation = () => { - const appId = useAppId() - const {push} = useAppNavigation() - const {baseAppURL} = useURL() - const setRecentAppId = useSetAtom(recentAppIdAtom) - - const goToPlayground = useCallback( - (target?: PlaygroundTarget, options?: GoToPlaygroundOptions) => { - const resolvedAppId = options?.appId ?? appId - if (!resolvedAppId) return - const selectedKeys = Array.from( - new Set( - normalizeRevisionIds(target).filter( - (id) => typeof id === "string" && id.trim().length > 0, - ), - ), - ) - if (options?.appId) { - setRecentAppId(options.appId) - } - const querySuffix = - selectedKeys.length > 0 - ? `?playgroundRevisions=${encodeURIComponent(JSON.stringify(selectedKeys))}` - : "" - - push(`${baseAppURL}/${resolvedAppId}/playground${querySuffix}`) - }, - [appId, baseAppURL, push, setRecentAppId], - ) - - return {goToPlayground} -} diff --git a/web/oss/src/hooks/usePostAuthRedirect.ts b/web/oss/src/hooks/usePostAuthRedirect.ts deleted file mode 100644 index 0ac3379253..0000000000 --- a/web/oss/src/hooks/usePostAuthRedirect.ts +++ /dev/null @@ -1,104 +0,0 @@ -import {useCallback, useMemo} from "react" - -import {getDefaultStore} from "jotai" -import {useRouter} from "next/router" -import {useLocalStorage} from "usehooks-ts" - -import {isDemo} from "@/oss/lib/helpers/utils" -import {orgsAtom, useOrgData} from "@/oss/state/org" -import {resolvePreferredWorkspaceId} from "@/oss/state/org/selectors/org" -import {useProfileData} from "@/oss/state/profile" -import {userAtom} from "@/oss/state/profile/selectors/user" -import {useProjectData} from "@/oss/state/project" -import {buildPostLoginPath, waitForWorkspaceContext} from "@/oss/state/url/postLoginRedirect" - -interface AuthUserLike { - createdNewRecipeUser?: boolean - user?: { - loginMethods?: unknown[] - } -} - -interface HandleAuthSuccessOptions { - isInvitedUser?: boolean -} - -const usePostAuthRedirect = () => { - const router = useRouter() - const {refetch: resetProfileData} = useProfileData() - const {refetch: resetOrgData} = useOrgData() - const {reset: resetProjectData} = useProjectData() - const [invite] = useLocalStorage>("invite", {}) - - const hasInviteFromQuery = useMemo(() => { - const token = router.query?.token - if (Array.isArray(token)) { - return token.length > 0 - } - return Boolean(token) - }, [router.query]) - - const hasInviteFromStorage = useMemo(() => { - if (!invite) return false - return Object.keys(invite).length > 0 - }, [invite]) - - const derivedIsInvitedUser = hasInviteFromQuery || hasInviteFromStorage - - const resetAuthState = useCallback(async () => { - await resetProfileData() - await resetOrgData() - await resetProjectData() - }, [resetOrgData, resetProfileData, resetProjectData]) - - const handleAuthSuccess = useCallback( - async (authResult: AuthUserLike, options?: HandleAuthSuccessOptions) => { - const isInvitedUser = options?.isInvitedUser ?? derivedIsInvitedUser - const loginMethodCount = authResult?.user?.loginMethods?.length ?? 0 - const isNewUser = - isDemo() && Boolean(authResult?.createdNewRecipeUser) && loginMethodCount === 1 - - if (isNewUser) { - if (isInvitedUser) { - await router.push("/workspaces/accept?survey=true") - } else { - await resetAuthState() - await router.push("/post-signup") - } - return - } - - if (isInvitedUser) { - await router.push("/workspaces/accept") - return - } - - await resetAuthState() - - let context = await waitForWorkspaceContext({requireProjectId: false}) - - if (!context.workspaceId) { - const store = getDefaultStore() - const fallbackWorkspace = resolvePreferredWorkspaceId( - (store.get(userAtom) as {id?: string} | null)?.id ?? null, - store.get(orgsAtom), - ) - if (fallbackWorkspace) { - context = {workspaceId: fallbackWorkspace, projectId: null} - } - } - - const nextPath = buildPostLoginPath(context) - await router.replace(nextPath) - }, - [derivedIsInvitedUser, resetAuthState, router], - ) - - return { - handleAuthSuccess, - resetAuthState, - isInvitedUser: derivedIsInvitedUser, - } -} - -export default usePostAuthRedirect diff --git a/web/oss/src/hooks/useQuery.ts b/web/oss/src/hooks/useQuery.ts index f85a65313b..c7ffc83220 100644 --- a/web/oss/src/hooks/useQuery.ts +++ b/web/oss/src/hooks/useQuery.ts @@ -1,96 +1,65 @@ -import {useCallback, useEffect, useRef} from "react" +import {ParsedUrlQuery, parse} from "querystring" -import {ParsedUrlQuery} from "querystring" - -import {useAppNavigation, useAppQuery} from "@/oss/state/appState" +import {NextRouter, useRouter} from "next/router" type Method = "push" | "replace" -const normalizeValue = ( - value: string | string[] | number | boolean | null | undefined, -): string | string[] | undefined => { - if (value === null || value === undefined) return undefined - if (Array.isArray(value)) { - const normalizedArray = value - .map((item) => { - if (item === null || item === undefined) return undefined - const str = String(item) - return str === "" ? undefined : str - }) - .filter((item): item is string => item !== undefined) - - return normalizedArray.length > 0 ? normalizedArray : undefined +function getUpdateQuery(router: NextRouter, method: Method) { + return (queryObj: ParsedUrlQuery) => { + const query = parse(window.location.search.replace("?", "")) + + //do not update query if the value is the same + let changed = false + for (const key in queryObj) { + if (query[key]?.toString() !== queryObj[key]?.toString()) { + changed = true + break + } + } + if (!changed) return + + const newQuery = { + ...query, + ...queryObj, + } + //delete keys with undefined values + Object.keys(newQuery).forEach((key) => { + if (newQuery[key] === undefined || newQuery[key] === "") { + delete newQuery[key] + } + }) + + router[method]( + { + pathname: window.location.pathname, + query: newQuery, + }, + undefined, + {scroll: false}, + ) } - - const normalized = String(value) - return normalized === "" ? undefined : normalized -} - -const valuesAreEqual = ( - current: string | string[] | undefined, - next: string | string[] | undefined, -) => { - if (current === next) return true - if (Array.isArray(current) && Array.isArray(next)) { - if (current.length !== next.length) return false - return current.every((value, index) => value === next[index]) - } - return !Array.isArray(current) && !Array.isArray(next) && current === next } export function useQuery( method: Method = "push", ): [ParsedUrlQuery, (query: ParsedUrlQuery) => void] { - const query = useAppQuery() - const navigation = useAppNavigation() - const queryRef = useRef(query) - - useEffect(() => { - queryRef.current = query - }, [query]) + const router = useRouter() + const {query} = router - const updateQuery = useCallback( - (queryObj: ParsedUrlQuery) => { - const nextQuery: Record = {} - let hasChanged = false - const currentQuery = queryRef.current - - Object.keys(queryObj).forEach((key) => { - const requestedValue = normalizeValue(queryObj[key] as any) - const currentValue = normalizeValue(currentQuery[key] as any) - - if (!valuesAreEqual(currentValue, requestedValue)) { - hasChanged = true - } - - nextQuery[key] = requestedValue - }) - - if (!hasChanged) return - - navigation.patchQuery(nextQuery, {method, shallow: true}) - }, - [method, navigation], - ) - - return [query, updateQuery] + return [query, getUpdateQuery(router, method)] } export function useQueryParam( paramName: string, defaultValue?: string, method?: Method, -): [string | undefined, (val: string | undefined) => void] { +): [string, (val: string) => void] { const [query, updateQuery] = useQuery(method) - const rawValue = query[paramName] - const value = Array.isArray(rawValue) ? rawValue[0] : (rawValue as string | undefined) + const value = (query as Record)[paramName] || defaultValue - const setValue = useCallback( - (val: string | undefined) => { - updateQuery({[paramName]: val}) - }, - [paramName, updateQuery], - ) + const setValue = (val: string) => { + updateQuery({[paramName]: val}) + } - return [value ?? defaultValue, setValue] + return [value, setValue] } diff --git a/web/oss/src/hooks/useSession.ts b/web/oss/src/hooks/useSession.ts index fdab78c8fc..21d681dd03 100644 --- a/web/oss/src/hooks/useSession.ts +++ b/web/oss/src/hooks/useSession.ts @@ -1,44 +1,33 @@ -import {useEffect} from "react" - -import {useSetAtom} from "jotai" import {useRouter} from "next/router" -import {signOut} from "supertokens-auth-react/recipe/session" import {useSessionContext} from "supertokens-auth-react/recipe/session" +import {signOut} from "supertokens-auth-react/recipe/session" -import {resetOrgData} from "@/oss/state/org" -import {resetProfileData} from "@/oss/state/profile" -import {resetProjectData} from "@/oss/state/project" -import {sessionExistsAtom, sessionLoadingAtom} from "@/oss/state/session" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProfileData} from "@/oss/contexts/profile.context" +import {useProjectData} from "@/oss/contexts/project.context" export const useSession: () => { loading: boolean doesSessionExist: boolean - logout: () => Promise + logout: () => void } = () => { const res = useSessionContext() - const setSessionExists = useSetAtom(sessionExistsAtom) - const setSessionLoading = useSetAtom(sessionLoadingAtom) const router = useRouter() - - useEffect(() => { - setSessionLoading(res.loading) - if (!res.loading) { - setSessionExists((res as any).doesSessionExist) - } - }, [res.loading, (res as any).doesSessionExist, setSessionExists, setSessionLoading]) + const {reset: resetProfileData} = useProfileData() + const {reset: resetOrgData} = useOrgData() + const {reset: resetProjectData} = useProjectData() return { loading: res.loading, doesSessionExist: (res as any).doesSessionExist, - logout: async () => { + logout: () => { signOut() .then(async () => { + const posthog = (await import("posthog-js")).default + posthog.reset() resetProfileData() resetOrgData() resetProjectData() - const posthog = (await import("posthog-js")).default - posthog.reset() - setSessionExists(false) router.push("/auth") }) .catch(console.error) diff --git a/web/oss/src/hooks/useURL.ts b/web/oss/src/hooks/useURL.ts deleted file mode 100644 index d64af9f4a4..0000000000 --- a/web/oss/src/hooks/useURL.ts +++ /dev/null @@ -1,105 +0,0 @@ -import {useCallback} from "react" - -import {useAtomValue} from "jotai" - -import {useAppNavigation, useAppState} from "@/oss/state/appState" -import {urlAtom} from "@/oss/state/url" - -const useURL = () => { - const url = useAtomValue(urlAtom) - const navigation = useAppNavigation() - const appState = useAppState() - - const buildUrl = useCallback( - ({ - workspaceName, - appId: _appId, - path = "", - query = {}, - isAppUrl = false, - onlyWs = false, - }: { - workspaceName?: string - appId?: string - path?: string - query?: Record - isAppUrl?: boolean - onlyWs?: boolean - } = {}) => { - // Treat workspaceName param as an id for URL purposes - const wsId = workspaceName || url.workspaceId - const org = `${url.baseOrgURL}/${encodeURIComponent(wsId)}` - let target = org - - if (!onlyWs) { - if (url.projectId) { - target += `/p/${url.projectId}/apps` - } else { - // If project is not ready yet, fall back to org root - return org - } - } - - if (isAppUrl) { - target += `/${encodeURIComponent(_appId || url.appId)}` - } - - if (path) { - target += path.startsWith("/") ? path : `/${path}` - } - - const searchParams = new URLSearchParams(query as any) - const queryString = searchParams.toString() - if (queryString) { - target += `?${queryString}` - } - - return target - }, - [url.appId, url.workspaceId, url.projectId, url.baseOrgURL], - ) - - const redirectUrl = useCallback( - (params?: Parameters[0]) => { - const url = buildUrl(params) - navigation.push(url) - }, - [buildUrl, navigation], - ) - - // Determine if the given path (or current asPath) is a valid app route - const isValidAppRoute = useCallback( - (path?: string) => { - const pathOnly = (path ?? appState.asPath ?? "").split("?")[0] - const isAtOrgRoot = pathOnly === "/w" - const isAtWsRoot = /^\/w\/[^/]+$/.test(pathOnly) - const isAtWsProjectRoot = /^\/w\/[^/]+\/p\/?$/.test(pathOnly) - const hasReadyBase = Boolean(url.baseAppURL) - const isUnderAppBase = hasReadyBase && pathOnly.startsWith(url.baseAppURL) - // Fallback regex when baseAppURL isn't ready yet - const matchesValidAppPattern = /^\/w\/[^/]+\/p\/[^/]+\/apps(\/|$)/.test(pathOnly) - const validLocation = hasReadyBase ? isUnderAppBase : matchesValidAppPattern - return !isAtOrgRoot && !isAtWsRoot && !isAtWsProjectRoot && validLocation - }, - [appState.asPath, url.baseAppURL], - ) - - return { - appId: url.appId, - workspaceId: url.workspaceId, - workspaceName: url.workspaceName, - baseURL: url.baseAppURL, - buildUrl, - redirectUrl, - baseOrgURL: url.baseOrgURL, - orgURL: url.orgURL, - baseProjectURL: url.baseProjectURL, - projectURL: url.projectURL, - baseAppURL: url.baseAppURL, - recentlyVisitedAppURL: url.recentlyVisitedAppURL, - appURL: url.appURL, - isValidAppRoute, - } -} - -export default useURL diff --git a/web/oss/src/hooks/useVaultSecret.ts b/web/oss/src/hooks/useVaultSecret.ts index a368b412f0..ee3143e316 100644 --- a/web/oss/src/hooks/useVaultSecret.ts +++ b/web/oss/src/hooks/useVaultSecret.ts @@ -1,2 +1,271 @@ -// Re-export the new atom-based useVaultSecret hook -export {useVaultSecret} from "@/oss/state/app" +import {useCallback, useEffect, useMemo} from "react" + +import {atom, useAtom} from "jotai" +import useSWR from "swr" + +import { + llmAvailableProviders, + llmAvailableProvidersToken, + LlmProvider, + transformCustomProviderPayloadData, +} from "@/oss/lib/helpers/llmProviders" +import {SecretDTOProvider, SecretDTOKind, CustomSecretDTO} from "@/oss/lib/Types" +import { + fetchVaultSecret, + createVaultSecret, + updateVaultSecret, + deleteVaultSecret, +} from "@/oss/services/vault/api" + +import {useProfileData} from "../contexts/profile.context" +import {removeEmptyFromObjects} from "../lib/helpers/utils" + +/** + * Global state atom for tracking vault key migration status. + * Used to ensure migration only happens once and track its progress. + */ +const vaultSecretAtom = atom({ + migrating: false, + migrated: false, +}) + +/** + * Hook to handle migration of LLM provider keys from localStorage to vault. + * This is a one-time migration process that runs when the application starts. + * + * Flow: + * 1. Checks if migration is needed (not started and not completed) + * 2. Reads provider keys from localStorage + * 3. Migrates each key to the vault system + * 4. Creates a backup and cleans up localStorage + * + * @param handleModifyVaultSecret - Function to save a provider key to vault + * @returns Migration status and control functions + */ +const useMigrateVaultKeys = ({ + handleModifyVaultSecret, +}: { + handleModifyVaultSecret: (provider: LlmProvider) => Promise +}) => { + const {user} = useProfileData() + const [migrationStatus, setMigrationStatus] = useAtom(vaultSecretAtom) + + useEffect(() => { + if (user && !migrationStatus.migrating && !migrationStatus.migrated) { + setMigrationStatus({migrating: true, migrated: false}) + migrateProviderKeys() + } else if (!user && (migrationStatus.migrated || migrationStatus.migrating)) { + setMigrationStatus({migrating: false, migrated: false}) + } + }, [migrationStatus.migrating, user, migrationStatus.migrated]) + + const migrateProviderKeys = async () => { + try { + const localStorageProviders = localStorage.getItem(llmAvailableProvidersToken) + + if (localStorageProviders) { + const _providers = JSON.parse(localStorageProviders) + const providers = JSON.parse(_providers) + + for (const provider of providers) { + if (provider.key) { + await handleModifyVaultSecret(provider as LlmProvider) + } + } + + localStorage.setItem(`${llmAvailableProvidersToken}Backup`, localStorageProviders) + + localStorage.removeItem(llmAvailableProvidersToken) + } + } catch (error) { + console.error(error) + } finally { + setMigrationStatus({migrating: false, migrated: true}) + } + } + + return {migrationStatus, setMigrationStatus} +} + +/** + * Main hook for managing vault secrets and LLM provider keys. + * + * Features: + * - Handles migration from localStorage to vault system + * - Manages CRUD operations for provider keys + * - Provides real-time synchronization using SWR + * - Supports both standard and custom provider configurations + * + * Flow: + * 1. Initializes migration process if needed + * 2. Fetches secrets from vault once migration is complete + * 3. Maintains local state synchronized with vault + * 4. Provides methods for modifying and deleting secrets + * + * @returns { + * loading: boolean - Loading state including migration + * secrets: LlmProvider[] - List of standard provider configurations + * customRowSecrets: LlmProvider[] - List of custom provider configurations + * mutate: Function - SWR mutate function to refresh data + * handleModifyVaultSecret: Function - Update/create standard provider + * handleDeleteVaultSecret: Function - Delete provider configuration + * handleModifyCustomVaultSecret: Function - Update/create custom provider + * } + */ +export const useVaultSecret = () => { + /** + * Updates or creates a standard provider configuration in the vault. + * Maps provider names to their corresponding vault identifiers and handles the API calls. + * + * @param provider - Provider configuration to save + */ + const handleModifyVaultSecret = async (provider: LlmProvider) => { + try { + const envNameMap: Record = { + OPENAI_API_KEY: SecretDTOProvider.OPENAI, + COHERE_API_KEY: SecretDTOProvider.COHERE, + ANYSCALE_API_KEY: SecretDTOProvider.ANYSCALE, + DEEPINFRA_API_KEY: SecretDTOProvider.DEEPINFRA, + ALEPHALPHA_API_KEY: SecretDTOProvider.ALEPHALPHA, + GROQ_API_KEY: SecretDTOProvider.GROQ, + MISTRAL_API_KEY: SecretDTOProvider.MISTRALAI, + ANTHROPIC_API_KEY: SecretDTOProvider.ANTHROPIC, + PERPLEXITYAI_API_KEY: SecretDTOProvider.PERPLEXITYAI, + TOGETHERAI_API_KEY: SecretDTOProvider.TOGETHERAI, + OPENROUTER_API_KEY: SecretDTOProvider.OPENROUTER, + GEMINI_API_KEY: SecretDTOProvider.GEMINI, + } + + const payload = { + header: { + name: provider.title, + description: "", + }, + secret: { + kind: SecretDTOKind.PROVIDER_KEY, + data: { + kind: envNameMap[provider.name as string], + provider: { + key: provider.key, + }, + }, + }, + } + + const findSecret = secrets.find((s) => s.name === provider.name) + + if (findSecret && provider.id) { + await updateVaultSecret({secret_id: provider.id, payload}) + } else { + await createVaultSecret({payload}) + } + } catch (error) { + console.error(error) + } + } + + const {migrationStatus} = useMigrateVaultKeys({ + handleModifyVaultSecret, + }) + + const {data, isLoading, mutate} = useSWR( + migrationStatus?.migrated ? "vault/secrets" : null, + fetchVaultSecret, + { + revalidateOnFocus: false, + revalidateOnReconnect: false, + revalidateIfStale: false, + }, + ) + + const customRowSecrets = useMemo(() => { + return (data || []).filter((secret) => secret.type === SecretDTOKind.CUSTOM_PROVIDER_KEY) + }, [data]) + + const secrets = useMemo(() => { + return llmAvailableProviders.map((secret) => { + const match = (data || []).find((item: LlmProvider) => item.name === secret.name) + if (match) { + return { + ...secret, + key: match.key, + id: match.id, + created_at: match.created_at, + } + } else { + return secret + } + }) + }, [data]) + + /** + * Updates or creates a custom provider configuration in the vault. + * Handles transformation of provider data and cleanup of empty fields. + * + * @param provider - Custom provider configuration to save + */ + const handleModifyCustomVaultSecret = async (provider: LlmProvider) => { + const rawPayload = transformCustomProviderPayloadData(provider) + const payload = removeEmptyFromObjects(rawPayload) + + const findSecret = customRowSecrets.find((s) => s.id === provider.id) + + if (findSecret && provider.id) { + await updateVaultSecret>({ + secret_id: provider.id, + payload, + }) + } else { + await createVaultSecret>({payload}) + } + + await mutate() + } + + /** + * Deletes a provider configuration from the vault. + * Automatically refreshes the local state after deletion. + * + * @param provider - Provider configuration to delete + */ + const handleDeleteVaultSecret = async (provider: LlmProvider) => { + try { + if (provider.id) { + await deleteVaultSecret({secret_id: provider.id}) + await mutate() + } + } catch (error) { + console.error(error) + } + } + + /** + * Memoized version of handleModifyVaultSecret that includes data refresh. + * This is the preferred method for modifying vault secrets as it ensures + * the UI stays in sync with the vault state. + * + * @param provider - Provider configuration to save + */ + const handleModify = useCallback(async (provider: LlmProvider) => { + await handleModifyVaultSecret(provider) + await mutate() + }, []) + + /** + * Computed loading state that considers both data fetching and migration status. + * Used to show loading indicators in the UI while either operation is in progress. + */ + const loading = useMemo(() => { + return isLoading || !migrationStatus.migrated + }, [isLoading, migrationStatus.migrated]) + + return { + loading, + secrets, + mutate, + customRowSecrets, + handleModifyVaultSecret: handleModify, + handleDeleteVaultSecret, + handleModifyCustomVaultSecret, + } +} diff --git a/web/oss/src/lib/Types.ts b/web/oss/src/lib/Types.ts index c5716e292d..6e5560ac9b 100644 --- a/web/oss/src/lib/Types.ts +++ b/web/oss/src/lib/Types.ts @@ -61,7 +61,7 @@ export interface testset { updated_at: string } -export interface Testset { +export interface TestSet { id: string name: string created_at: string @@ -69,17 +69,7 @@ export interface Testset { csvdata: KeyValuePair[] } -export interface PreviewTestcase { - created_at: string - created_by_id: string - - id: string - set_id: string - testset_id: string - data: Record -} - -export interface PreviewTestset { +export interface PreviewTestSet { id: string name: string created_at: string @@ -103,7 +93,6 @@ export interface ListAppsItem { app_id: string app_name: string app_type?: string - created_at?: string updated_at: string } @@ -206,7 +195,7 @@ export interface Evaluation { testset: { _id: string testsetChatColumn: string - } & Testset + } & TestSet appName: string llmAppPromptTemplate?: string evaluationTypeSettings: { @@ -450,35 +439,6 @@ export enum SecretDTOProvider { GEMINI = "gemini", } -export const PROVIDER_LABELS: Record = { - openai: "OpenAI", - cohere: "Cohere", - anyscale: "Anyscale", - deepinfra: "DeepInfra", - alephalpha: "Aleph Alpha", - groq: "Groq", - mistralai: "Mistral AI", - anthropic: "Anthropic", - perplexityai: "Perplexity AI", - together_ai: "Together AI", - openrouter: "OpenRouter", - gemini: "Google Gemini", - vertex_ai: "Google Vertex AI", - bedrock: "AWS Bedrock", - // sagemaker: "AWS SageMaker", - azure: "Azure OpenAI", - custom: "Custom Provider", -} - -export const PROVIDER_KINDS: Record = Object.entries(PROVIDER_LABELS).reduce( - (acc, [kind, label]) => { - acc[kind] = kind - acc[label.toLowerCase()] = kind - return acc - }, - {} as Record, -) - interface VaultModels { slug: string } @@ -490,9 +450,6 @@ interface VaultProvider { aws_secret_access_key?: string aws_session_token?: string aws_region_name?: string - vertex_ai_project?: string - vertex_ai_location?: string - vertex_ai_credentials?: string api_key?: string } } @@ -568,18 +525,10 @@ export interface HumanEvaluationListTableDataType { variantNames: string[] } -export type FilterValue = - | string - | number - | boolean - | Record - | Array> - export interface Filter { - field: string - key?: string + key: string operator: FilterConditions - value: FilterValue + value: string isPermanent?: boolean } @@ -599,7 +548,6 @@ export type FilterConditions = | "lte" | "between" | "in" - | "not_in" | "is" | "is_not" | "btwn" @@ -831,16 +779,9 @@ export interface StyleProps { themeMode: "dark" | "light" } -export interface SettingsPreset { - key: string - name: string - values: Record -} - export interface Evaluator { name: string key: string - settings_presets?: SettingsPreset[] settings_template: Record icon_url?: string | StaticImageData color?: string @@ -883,8 +824,6 @@ export enum EvaluationStatus { RUNNING = "running", SUCCESS = "success", FAILURE = "failure", - FAILED = "failed", - ERRORS = "errors", CANCELLED = "cancelled", PENDING = "pending", INCOMPLETE = "incomplete", @@ -983,7 +922,6 @@ type ValueTypeOptions = | "hidden" | "messages" | "multiple_choice" - | "llm_response_schema" export interface EvaluationSettingsTemplate { type: ValueTypeOptions diff --git a/web/oss/src/lib/api/SWRConfig.tsx b/web/oss/src/lib/api/SWRConfig.tsx index 912c7e9b7d..beaa2402b5 100644 --- a/web/oss/src/lib/api/SWRConfig.tsx +++ b/web/oss/src/lib/api/SWRConfig.tsx @@ -1,4 +1,5 @@ import {SWRConfig, type SWRConfiguration} from "swr" +import {SWRDevTools} from "swr-devtools" import axios from "@/oss/lib/api/assets/axiosConfig" @@ -27,7 +28,11 @@ const config: SWRConfiguration = { const AgSWRConfig = ({children, config: passedConfig = {}}: AgSWRConfigProps) => { const mergedConfig = {...config, ...passedConfig} - return {children} + return ( + + {children} + + ) } export default AgSWRConfig diff --git a/web/oss/src/lib/api/assets/axiosConfig.ts b/web/oss/src/lib/api/assets/axiosConfig.ts index f9df511521..fa730ae352 100644 --- a/web/oss/src/lib/api/assets/axiosConfig.ts +++ b/web/oss/src/lib/api/assets/axiosConfig.ts @@ -1,22 +1,20 @@ import axiosApi, {CanceledError} from "axios" -import {getDefaultStore} from "jotai" import isObject from "lodash/isObject" import router from "next/router" import {signOut} from "supertokens-auth-react/recipe/session" import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" +import {getProfileValues} from "@/oss/contexts/profile.context" +import {getCurrentProject, DEFAULT_UUID} from "@/oss/contexts/project.context" import {getJWT} from "@/oss/services/api" -import {userAtom} from "@/oss/state/profile/selectors/user" -import {projectIdAtom} from "@/oss/state/project" -import {getAgentaApiUrl} from "../../helpers/api" import {getErrorMessage, globalErrorHandler} from "../../helpers/errorHandler" -import {isDemo} from "../../helpers/utils" +import {getAgentaApiUrl, isDemo} from "../../helpers/utils" export const PERMISSION_ERR_MSG = "You don't have permission to perform this action. Please contact your organization admin." -const ENDPOINTS_PROJECT_ID_WHITELIST = ["/projects", "/profile", "/organizations"] +const ENDPOINTS_PROJECT_ID_WHITELIST = ["/api/projects", "/api/profile", "/api/organizations"] const axios = axiosApi.create({ baseURL: getAgentaApiUrl(), headers: { @@ -28,18 +26,6 @@ axios.interceptors.request.use(async (config) => { const fullUri = axios.getUri(config) const agentaApiUrl = getAgentaApiUrl() - // Debug logging for test environment - if (process.env.NODE_ENV === "test") { - console.log("🌐 Axios Request Debug:", { - method: config.method?.toUpperCase(), - url: config.url, - baseURL: config.baseURL, - fullUri, - agentaApiUrl, - headers: config.headers, - }) - } - if (agentaApiUrl && !fullUri.includes(agentaApiUrl)) { config.headers.set("ngrok-skip-browser-warning", true) } @@ -47,21 +33,14 @@ axios.interceptors.request.use(async (config) => { if (!isDemo()) return config const jwt = await getJWT() - const store = getDefaultStore() + const profile = getProfileValues() - const user = store.get(userAtom) as any | undefined - const projectId = store.get(projectIdAtom) + const {projectId} = getCurrentProject() - if (!jwt || !user || !projectId) { + if (!jwt || !profile.user || projectId === DEFAULT_UUID) { const controller = new AbortController() const configuredUri = axios.getUri(config) if (!ENDPOINTS_PROJECT_ID_WHITELIST.some((endpoint) => configuredUri.includes(endpoint))) { - console.log("ABORTING REQUEST", { - configuredUri, - projectId, - jwt, - user, - }) controller.abort() } @@ -71,15 +50,6 @@ axios.interceptors.request.use(async (config) => { } } - // Add JWT Authorization header (before any early returns) - if (jwt) { - config.headers.set("Authorization", `Bearer ${jwt}`) - - if (process.env.NEXT_PUBLIC_LOG_APP_ATOMS === "true") { - console.log("🔐 Added JWT Authorization header:", `Bearer ${jwt.substring(0, 30)}...`) - } - } - if ( config.params?.["project_id"] || config.url?.includes("?project_id=") || @@ -122,7 +92,7 @@ axios.interceptors.response.use( message: error.response?.data?.detail || PERMISSION_ERR_MSG, cancelText: null, okText: "Ok", - }) // Commented out for test environment + }) error.message = error.response?.data?.detail || PERMISSION_ERR_MSG throw error } diff --git a/web/oss/src/lib/api/assets/axiosPure.ts b/web/oss/src/lib/api/assets/axiosPure.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/web/oss/src/lib/api/assets/fetchClient.ts b/web/oss/src/lib/api/assets/fetchClient.ts deleted file mode 100644 index 809e4d76a7..0000000000 --- a/web/oss/src/lib/api/assets/fetchClient.ts +++ /dev/null @@ -1,99 +0,0 @@ -import {getDefaultStore} from "jotai" - -import {projectIdAtom} from "../../../state/project" -import {getAgentaApiUrl} from "../../helpers/api" - -// Lazily import to avoid circulars in non-test -async function safeGetJWT(): Promise { - try { - const {getJWT} = await import("@/oss/services/api") - const token = await getJWT() - return token || undefined - } catch { - return undefined - } -} - -export function isTestEnv(): boolean { - return typeof process !== "undefined" && process.env.NODE_ENV === "test" -} - -export function getBaseUrl(): string { - // In tests, allow overriding via env to ensure absolute URLs - if (isTestEnv()) { - const fromEnv = process.env.VITEST_TEST_API_URL - if (fromEnv && fromEnv.trim().length > 0) return fromEnv - } - const base = getAgentaApiUrl() - return base && base.trim().length > 0 ? base : "http://localhost" -} - -export function ensureProjectId(existing?: string): string | undefined { - if (existing) return existing - if (process.env.VITEST_TEST_PROJECT_ID) return process.env.VITEST_TEST_PROJECT_ID - try { - const store = getDefaultStore() - const pid = store.get(projectIdAtom) - return pid - } catch { - return undefined - } -} - -export function ensureAppId(existing?: string): string { - if (isTestEnv() && process.env.VITEST_TEST_APP_ID) return process.env.VITEST_TEST_APP_ID - return existing || "" -} - -export async function getAuthToken(): Promise { - // Prefer explicit test JWT if provided via env, regardless of NODE_ENV - if (process.env.NODE_ENV === "test" && process.env.VITEST_TEST_JWT) - return process.env.VITEST_TEST_JWT - return safeGetJWT() -} - -export async function fetchJson(url: URL, init: RequestInit = {}): Promise { - const jwt = await getAuthToken() - - const headers = new Headers(init.headers || {}) - if (!headers.has("Content-Type")) headers.set("Content-Type", "application/json") - if (jwt && !headers.has("Authorization")) headers.set("Authorization", `Bearer ${jwt}`) - - if (process.env.DEBUG_FETCH === "true") { - const redacted = new Headers(headers) - if (redacted.has("Authorization")) redacted.set("Authorization", "Bearer ***") - } - - const res = await fetch(url.toString(), {...init, headers}) - const contentType = res.headers.get("content-type") || "" - - if (!res.ok) { - let parsedBody: any = undefined - try { - parsedBody = contentType.includes("application/json") - ? await res.clone().json() - : await res.clone().text() - } catch { - parsedBody = undefined - } - - const detail = - (parsedBody as any)?.detail || - (parsedBody as any)?.error || - (typeof parsedBody === "string" ? parsedBody : undefined) - - const errorMessage = - detail && typeof detail === "string" - ? `${detail}` - : `${init.method || "GET"} ${url.pathname} failed: ${res.status}` - - const error = new Error(errorMessage) - ;(error as any).status = res.status - ;(error as any).statusText = res.statusText - ;(error as any).data = parsedBody - throw error - } - - if (contentType.includes("application/json")) return res.json() - return res.text() -} diff --git a/web/oss/src/lib/api/queryClient.ts b/web/oss/src/lib/api/queryClient.ts deleted file mode 100644 index 171daa635b..0000000000 --- a/web/oss/src/lib/api/queryClient.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {QueryClient} from "@tanstack/react-query" - -// Shared singleton QueryClient so non-React utilities (e.g., API helpers) can -// invalidate / refetch queries after server-side mutations. -// _app.tsx and any hook/component should import this instance. - -export const queryClient = new QueryClient() - -queryClient.setDefaultOptions({ - queries: { - experimental_prefetchInRender: true, - }, -}) diff --git a/web/oss/src/lib/atoms/breadcrumb/README.md b/web/oss/src/lib/atoms/breadcrumb/README.md deleted file mode 100644 index 7925039eeb..0000000000 --- a/web/oss/src/lib/atoms/breadcrumb/README.md +++ /dev/null @@ -1,215 +0,0 @@ -# Breadcrumb System - -A flexible, atom-based breadcrumb system that provides both automatic URL-based breadcrumbs and custom breadcrumb control. - -## Overview - -The breadcrumb system uses Jotai atoms to manage breadcrumb state, allowing pages and components to override the default URL-based breadcrumbs with custom, contextual navigation paths. - -## Key Features - -- **Hybrid Approach**: Falls back to URL-based breadcrumbs when no custom breadcrumbs are set -- **Full Backward Compatibility**: Existing pages continue working without changes -- **Flexible Control**: Pages can set static or dynamic breadcrumbs -- **Component Integration**: Child components can append to existing breadcrumbs -- **Automatic Cleanup**: Breadcrumbs reset to URL-based when components unmount -- **Icon Support**: Breadcrumb items can include icons -- **Link Support**: Items can be clickable links or plain text -- **Disabled State**: Items can be disabled for conditional navigation - -## API Reference - -### BreadcrumbItem Interface - -```typescript -interface BreadcrumbItem { - label: string // Display text - href?: string // Optional link URL - icon?: ReactNode // Optional icon component - disabled?: boolean // Optional disabled state - menu?: BreadcrumbAtom // Optional menu items - value?: string // Optional value for dynamic(especially useful for uuids) -} -``` - -### Hooks - -#### `useBreadcrumbs()` - -Returns breadcrumb control functions: - -```typescript -const { - setBreadcrumbs, // Set complete breadcrumb array - appendBreadcrumb, // Add item to end - prependBreadcrumb, // Add item to beginning - clearBreadcrumbs, // Reset to URL-based -} = useBreadcrumbs() -``` - -#### `useBreadcrumbsEffect({breadcrumbs, type, condition}, deps?)` - -Sets breadcrumbs and automatically clears them on component unmount: - -```typescript -useBreadcrumbsEffect( - { - breadcrumbs: [{label: "Home", href: "/"}, {label: "Settings"}], - type: "new", - condition: true, - }, - [dependency], -) -``` - -## Usage Examples - -### 1. Simple Static Breadcrumbs - -```typescript -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" -import {Settings} from "@phosphor-icons/react" - -export const SettingsPage = () => { - const breadcrumbs = [ - {label: "Home", href: "/"}, - {label: "Settings", icon: }, - ] - - useBreadcrumbsEffect({breadcrumbs}, []) - - return
    Settings Page Content
    -} -``` - -### 2. Dynamic Breadcrumbs Based on Data - -```typescript -import {useEffect, useState} from "react" -import {useBreadcrumbs} from "@/oss/lib/hooks/useBreadcrumbs" -import {Users} from "@phosphor-icons/react" - -export const UserProfilePage = ({userId}: {userId: string}) => { - const [userName, setUserName] = useState("") - const {setBreadcrumbs} = useBreadcrumbs() - - useEffect(() => { - const fetchUser = async () => { - const user = await api.getUser(userId) - setUserName(user.name) - - setBreadcrumbs([ - {label: "Home", href: "/"}, - {label: "Users", href: "/users", icon: }, - {label: user.name}, - ]) - } - - fetchUser() - }, [userId, setBreadcrumbs]) - - return
    User Profile for {userName}
    -} -``` - -### 3. Child Component Appending Breadcrumbs - -```typescript -import {useEffect} from "react" -import {useBreadcrumbs} from "@/oss/lib/hooks/useBreadcrumbs" -import {TestTube} from "@phosphor-icons/react" - -export const TestResultsTab = ({testId}: {testId: string}) => { - const {appendBreadcrumb} = useBreadcrumbs() - - useEffect(() => { - appendBreadcrumb({ - label: "Test Results", - icon: , - }) - }, [testId, appendBreadcrumb]) - - return
    Test Results Content
    -} -``` - -### 4. Conditional Breadcrumbs - -```typescript -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" - -export const AdminDashboard = ({hasPermission}: {hasPermission: boolean}) => { - const breadcrumbs = [ - {label: "Home", href: "/"}, - { - label: "Admin", - href: hasPermission ? "/admin" : undefined, - disabled: !hasPermission - }, - ...(hasPermission ? [{label: "Dashboard"}] : []), - ] - - useBreadcrumbsEffect(breadcrumbs, [hasPermission]) - - return
    Admin Dashboard
    -} -``` - -### 5. Manual Control - -```typescript -import {useBreadcrumbs} from "@/oss/lib/hooks/useBreadcrumbs" - -export const CustomControlPage = () => { - const {setBreadcrumbs, clearBreadcrumbs} = useBreadcrumbs() - - const handleSetCustomBreadcrumbs = () => { - setBreadcrumbs([ - {label: "Custom", href: "/custom"}, - {label: "Manual Control"}, - ]) - } - - const handleResetToUrlBased = () => { - clearBreadcrumbs() // Falls back to URL-based breadcrumbs - } - - return ( -
    - - -
    - ) -} -``` - -## Migration Guide - -### For Existing Pages - -No changes required! Pages will continue using URL-based breadcrumbs automatically. - -### For New Pages Needing Custom Breadcrumbs - -1. Import the hook: `import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs"` -2. Define your breadcrumbs array -3. Call `useBreadcrumbsEffect(breadcrumbs)` in your component - -### For Dynamic Breadcrumbs - -1. Use `useBreadcrumbs()` hook for manual control -2. Call `setBreadcrumbs()` when data loads -3. Breadcrumbs will automatically reset when the component unmounts - -## Best Practices - -- Use `useBreadcrumbsEffect()` for simple static or dependency-based breadcrumbs -- Use `useBreadcrumbs()` for complex dynamic scenarios -- Include icons for better visual hierarchy -- Make intermediate breadcrumbs clickable with `href` when appropriate -- Use the `disabled` prop for conditional navigation states -- Keep breadcrumb labels concise and meaningful diff --git a/web/oss/src/lib/atoms/breadcrumb/index.ts b/web/oss/src/lib/atoms/breadcrumb/index.ts deleted file mode 100644 index f32ee2c155..0000000000 --- a/web/oss/src/lib/atoms/breadcrumb/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {atom} from "jotai" - -import {appsAtom} from "@/oss/state/app" -import {appStateSnapshotAtom} from "@/oss/state/appState" -import {selectedOrgAtom} from "@/oss/state/org" -import {projectsAtom} from "@/oss/state/project" - -import {buildBreadcrumbSegments} from "../../helpers/buildBreadcrumbs" - -import type {BreadcrumbAtom, BreadcrumbItem} from "./types" - -const breadcrumbOverridesAtom = atom({}) - -export const defaultBreadcrumbAtom = atom((get) => { - const appState = get(appStateSnapshotAtom) - const apps = get(appsAtom) - const selectedOrg = get(selectedOrgAtom) - const projects = get(projectsAtom) - const projectId = appState.projectId - const project = projectId ? projects.find((p) => p.project_id === projectId) || null : null - - return buildBreadcrumbSegments({ - uriPath: appState.asPath || appState.pathname, - apps, - workspaceId: appState.workspaceId ?? selectedOrg?.id ?? null, - workspaceName: selectedOrg?.name ?? "", - projectId, - projectName: project?.project_name ?? null, - projectIsPending: !!projectId && !project, - }) -}) - -export const breadcrumbAtom = atom((get) => { - const base = get(defaultBreadcrumbAtom) - const overrides = get(breadcrumbOverridesAtom) - if (!overrides) return base - const keys = Object.keys(overrides) - if (!keys.length) return base - return {...base, ...overrides} -}) - -// Helper atom to set breadcrumbs -export const setBreadcrumbsAtom = atom(null, (get, set, breadcrumbs: BreadcrumbAtom | null) => { - set(breadcrumbOverridesAtom, breadcrumbs ?? {}) -}) - -// Helper atom to append a breadcrumb item -export const appendBreadcrumbAtom = atom(null, (get, set, item: BreadcrumbAtom) => { - const current = get(breadcrumbOverridesAtom) || {} - set(breadcrumbOverridesAtom, {...current, ...item}) -}) - -// Helper atom to prepend a breadcrumb item -export const prependBreadcrumbAtom = atom(null, (get, set, item: BreadcrumbAtom) => { - const current = get(breadcrumbOverridesAtom) || {} - set(breadcrumbOverridesAtom, {...item, ...current}) -}) - -// Helper atom to clear breadcrumbs (reset to URL-based) -export const clearBreadcrumbsAtom = atom(null, (get, set) => { - set(breadcrumbOverridesAtom, {}) -}) - -export type {BreadcrumbAtom, BreadcrumbItem} from "./types" diff --git a/web/oss/src/lib/atoms/breadcrumb/types.ts b/web/oss/src/lib/atoms/breadcrumb/types.ts deleted file mode 100644 index 5d2faae2ca..0000000000 --- a/web/oss/src/lib/atoms/breadcrumb/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {ReactNode} from "react" - -export interface BreadcrumbItem { - label: string - href?: string - icon?: ReactNode - disabled?: boolean - menu?: BreadcrumbAtom - value?: string -} - -export type BreadcrumbAtom = Record diff --git a/web/oss/src/lib/atoms/sidebar.ts b/web/oss/src/lib/atoms/sidebar.ts deleted file mode 100644 index 3c6c076058..0000000000 --- a/web/oss/src/lib/atoms/sidebar.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {atomWithStorage} from "jotai/utils" - -export const sidebarCollapsedAtom = atomWithStorage("sidebarCollapsed", false) diff --git a/web/oss/src/lib/enums.ts b/web/oss/src/lib/enums.ts index 5016abe24e..d012bae032 100644 --- a/web/oss/src/lib/enums.ts +++ b/web/oss/src/lib/enums.ts @@ -8,8 +8,6 @@ export enum EvaluationFlow { export enum EvaluationType { human = "human", - online = "online", - automatic = "automatic", human_a_b_testing = "human_a_b_testing", human_scoring = "human_scoring", auto_exact_match = "auto_exact_match", diff --git a/web/oss/src/lib/evalRunner/fetchRunMetrics.worker.ts b/web/oss/src/lib/evalRunner/fetchRunMetrics.worker.ts deleted file mode 100644 index a196ebbea0..0000000000 --- a/web/oss/src/lib/evalRunner/fetchRunMetrics.worker.ts +++ /dev/null @@ -1,165 +0,0 @@ -/* -Web Worker: Fetch run-level metrics for a single evaluation run. -Receives a message of form: - { requestId: string, payload: { apiUrl: string; jwt: string; projectId: string; runId: string } } -Responds with: - { requestId, ok: true, data: metrics[] } or { requestId, ok:false, error } -*/ - -interface WorkerRequest { - requestId: string - payload: { - apiUrl: string - jwt: string - projectId: string - runId: string - evaluatorSlugs?: string[] - revisionSlugs?: string[] - annotationSlugMap?: Record - } -} - -interface WorkerResponse { - requestId: string - ok: boolean - data?: any[] - stats?: Record - error?: string -} - -self.onmessage = async (e: MessageEvent) => { - const {requestId, payload} = e.data - try { - const { - apiUrl, - jwt, - projectId, - runId, - evaluatorSlugs = [], - revisionSlugs = [], - annotationSlugMap = {}, - } = payload - const url = `${apiUrl}/preview/evaluations/metrics/query?project_id=${projectId}` - const body: Record = { - metrics: {run_ids: [runId]}, - windowing: {}, - } - const resp = await fetch(url, { - method: "POST", - headers: { - Authorization: jwt ? `Bearer ${jwt}` : "", - "Content-Type": "application/json", - }, - body: JSON.stringify(body), - }) - if (!resp.ok) throw new Error(`fetch ${resp.status}`) - const json = (await resp.json()) as {metrics?: any[]} - const camel = Array.isArray(json.metrics) ? json.metrics.map((m) => m) : [] - - // Utility to extract slug and category from stepKey - const classifyKey = ( - key: string, - ): {type: "invocation" | "evaluator" | "revision"; slug?: string} => { - const mappedSlug = annotationSlugMap[key] - if (mappedSlug) { - return {type: "evaluator", slug: mappedSlug} - } - - const parts = key.split(".") - if (parts.length === 1 && !evaluatorSlugs.includes(parts[0])) - return {type: "invocation"} - const slug = parts[1] - if (evaluatorSlugs.includes(slug)) return {type: "evaluator", slug} - if (revisionSlugs.includes(slug)) return {type: "revision", slug} - // default treat as evaluator - return {type: "evaluator", slug: slug ?? parts[0]} - } - const transformData = (data: Record): Record => { - const flat: Record = {} - Object.entries(data || {}).forEach(([stepKey, metrics]) => { - // // Pass-through for analytics keys like ag.metrics.* - // if (stepKey.startsWith("ag.")) { - // const raw = metrics - // let value: any = raw - // if (typeof raw === "object" && raw !== null) { - // if ("mean" in raw) value = (raw as any).mean - // else if ("value" in raw) value = (raw as any).value - // } - // flat[stepKey] = value - // return - // } - - const {type, slug} = classifyKey(stepKey) - Object.entries(metrics as Record).forEach(([metricKey, raw]) => { - let value: any = structuredClone(raw) - if (typeof raw === "object" && raw !== null) { - if ("mean" in raw) { - value = (raw as any).mean - } else if ("freq" in raw) { - value.frequency = raw.freq - // value.rank = raw.freq - value.unique = raw.uniq - - delete value.freq - delete value.uniq - } else if ("value" in raw) { - value = (raw as any).value - } - } - if (stepKey.startsWith("attributes.ag.")) { - const normalizedKey = `${stepKey}.${metricKey}` - flat[normalizedKey] = value - return - } - // Map invocation-level metrics - if (type === "invocation") { - let newKey = metricKey - if (metricKey.startsWith("tokens.")) { - newKey = metricKey.slice(7) + "Tokens" // tokens.prompt -> promptTokens - } else if (metricKey.startsWith("cost")) { - newKey = "totalCost" // cost or costs.total -> totalCost - } - flat[newKey] = value - } else { - const pref = slug ? `${slug}.` : "" - flat[`${pref}${metricKey}`] = value - } - }) - }) - return flat - } - - camel.forEach((entry: any) => { - // removing the run level metrics from the scenario metrics - if (!entry?.scenario_id) { - // Object.entries(entry.data || {}).forEach(([stepKey, metrics]) => { - // const {type, slug} = classifyKey(stepKey) - // Object.entries(metrics as Record).forEach(([metricKey, raw]) => { - // let value: any = raw - // if (typeof raw === "object" && raw !== null) { - // if ("freq" in raw) { - // value.frequency = raw.freq - // value.rank = raw.freq - // delete value.freq - // entry.data[`${slug}.${metricKey}`] = value - // } - // } - // }) - // }) - return - } - entry.data = transformData(entry.data || {}) - }) - - // Dynamically import to keep worker bundle lean until needed - const {computeRunMetrics} = await import("@/oss/services/runMetrics/api") - const stats = computeRunMetrics(camel.map((m: any) => ({data: m.data || {}}))) - const res: WorkerResponse = {requestId, ok: true, data: camel, stats} - // @ts-ignore - self.postMessage(res) - } catch (err: any) { - const res: WorkerResponse = {requestId, ok: false, error: err.message || "unknown"} - // @ts-ignore - self.postMessage(res) - } -} diff --git a/web/oss/src/lib/evalRunner/pureEnrichment.ts b/web/oss/src/lib/evalRunner/pureEnrichment.ts deleted file mode 100644 index a88fec2675..0000000000 --- a/web/oss/src/lib/evalRunner/pureEnrichment.ts +++ /dev/null @@ -1,682 +0,0 @@ -/* - * Worker-friendly clone of `hooks/useEvaluationRunData/assets/enrichment`. - * It removes React / cookie / axios dependencies and relies solely on data - * passed from the main thread via the worker context. - */ - -import {uuidToTraceId, uuidToSpanId} from "@/oss/lib/hooks/useAnnotations/assets/helpers" -import {transformApiData} from "@/oss/lib/hooks/useAnnotations/assets/transformer" -import type {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import type {RunIndex} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" -import type { - IStepResponse, - StepResponseStep, - UseEvaluationRunScenarioStepsFetcherResult, -} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import type {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {constructPlaygroundTestUrl} from "@/oss/lib/shared/variant/stringUtils" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import type {PreviewTestset, WorkspaceMember} from "@/oss/lib/Types" - -function collectTraceIds({steps, invocationKeys}: {steps: any[]; invocationKeys: Set}) { - const traceIds: string[] = [] - steps.forEach((st: any) => { - if (invocationKeys.has(st.stepKey) && st.traceId) traceIds.push(st.traceId) - }) - return traceIds -} - -function buildAnnotationLinks({ - annotationSteps, - uuidToTraceId: toTrace, - uuidToSpanId: toSpan, -}: { - annotationSteps: any[] - uuidToTraceId: (uuid: string) => string | undefined - uuidToSpanId: (uuid: string) => string | undefined -}) { - return annotationSteps - .filter((s) => s.traceId) - .map((s) => ({trace_id: toTrace(s.traceId) || s.traceId, span_id: toSpan(s.traceId)})) -} - -export function buildAnnotationMap({ - rawAnnotations, - members, -}: { - rawAnnotations: any[] - members?: any[] -}): Map { - const map = new Map() - if (!rawAnnotations?.length) return map - const normalized = rawAnnotations.map((ann: any) => - transformApiData({data: ann, members: members || []}), - ) - normalized.forEach((a: any) => { - if (a?.trace_id) map.set(a.trace_id, a) - }) - return map -} - -/** Simple dot-path resolver ("a.b.c"). Supports literal keys that contain dots. */ -export function resolvePath(obj: any, path: string): any { - if (!obj || typeof obj !== "object" || !path) return undefined - - const parts = path.split(".") - let current: any = obj - - for (let i = 0; i < parts.length; i++) { - if (current === undefined || current === null) return undefined - - const part = parts[i] - - if (Object.prototype.hasOwnProperty.call(current, part)) { - current = current[part] - continue - } - - let combined = part - let found = false - - for (let j = i + 1; j < parts.length; j++) { - combined += `.${parts[j]}` - if (Object.prototype.hasOwnProperty.call(current, combined)) { - current = current[combined] - i = j - found = true - break - } - } - - if (!found) return undefined - } - - return current -} - -export function computeInputsAndGroundTruth({ - testcase, - mappings, - inputKey, - inputParamNames, -}: { - testcase: any - mappings: any[] - inputKey: string - inputParamNames: string[] -}) { - const isRevisionKnown = Array.isArray(inputParamNames) && inputParamNames.length > 0 - - // Heuristic fallback names for ground truth columns when revision input params are unknown - const GT_NAMES = new Set(["correct_answer", "expected_output", "ground_truth", "label"]) - - const inputMappings = (mappings ?? []).filter((m) => { - if (m.step.key !== inputKey) return false - const name = m.column?.name - if (isRevisionKnown) return inputParamNames.includes(name) - // Fallback: treat testset columns not matching GT names as inputs - return m.column?.kind === "testset" && !GT_NAMES.has(name) - }) - - const groundTruthMappings = (mappings ?? []).filter((m) => { - if (m.step.key !== inputKey) return false - const name = m.column?.name - if (isRevisionKnown) return m.column?.kind === "testset" && !inputParamNames.includes(name) - // Fallback: treat well-known GT names as ground truth - return m.column?.kind === "testset" && GT_NAMES.has(name) - }) - - const objFor = (filtered: any[]) => - filtered.reduce((acc: any, m: any) => { - let val = resolvePath(testcase, m.step.path) - if (val === undefined && m.step.path.startsWith("data.")) { - val = resolvePath(testcase, m.step.path.slice(5)) - } - if (val !== undefined) acc[m.column?.name || m.name] = val - return acc - }, {}) - - let inputs = objFor(inputMappings) - let groundTruth = objFor(groundTruthMappings) - - // Fallback: if no mappings for inputs, derive directly from testcase.data keys - if (!Object.keys(inputs).length && testcase && typeof testcase === "object") { - const dataObj = (testcase as any).data || {} - if (dataObj && typeof dataObj === "object") { - Object.keys(dataObj).forEach((k) => { - if (!GT_NAMES.has(k) && k !== "messages") { - inputs[k] = dataObj[k] - } - }) - // Ground truth fallback: pick a known GT field if present - if (!Object.keys(groundTruth).length) { - for (const name of Array.from(GT_NAMES)) { - if (name in dataObj) { - ;(groundTruth as any)[name] = dataObj[name] - break - } - } - } - } - } - - return {inputs, groundTruth} -} - -export function identifyScenarioSteps({ - steps, - runIndex, - evaluators, -}: { - steps: StepResponseStep[] - runIndex?: {inputKeys: Set; invocationKeys: Set; steps: Record} - evaluators: EvaluatorDto[] -}) { - const inputSteps = steps.filter((s) => runIndex?.inputKeys?.has(s.stepKey)) - - const invocationKeys = runIndex?.invocationKeys ?? new Set() - const invocationSteps = steps.filter((s) => invocationKeys.has(s.stepKey)) - - const evaluatorIds = new Set( - (evaluators || []).map((e) => (typeof e.id === "string" ? e.id : "")).filter(Boolean), - ) - const evaluatorSlugs = new Set( - (evaluators || []).map((e) => (typeof e.slug === "string" ? e.slug : "")).filter(Boolean), - ) - - const annotationSteps = steps.filter((step) => { - const meta = runIndex?.steps?.[step.stepKey] - const refEvaluator = meta?.refs?.evaluator ?? (step as any)?.references?.evaluator - const candidateSlug: string | undefined = - typeof refEvaluator?.slug === "string" - ? refEvaluator.slug - : typeof (step as any)?.evaluator_slug === "string" - ? (step as any).evaluator_slug - : undefined - const candidateId: string | undefined = - typeof refEvaluator?.id === "string" ? refEvaluator.id : undefined - - let matched = false - - if (candidateId) { - if (evaluatorIds.has(candidateId)) { - matched = true - } else { - matched = true - } - } - - if (!matched && candidateSlug) { - matched = evaluatorSlugs.has(candidateSlug) - if (!matched) { - matched = true - } - } - - if (!matched) { - const keyParts = (step.stepKey || "").split(".") - const fallbackSlug = keyParts.length > 1 ? keyParts[keyParts.length - 1] : undefined - if (fallbackSlug && evaluatorSlugs.has(fallbackSlug)) { - matched = true - } - } - - return matched - }) - - return {inputSteps, invocationSteps, annotationSteps} -} - -export function deriveTestsetAndRevision({ - inputSteps, - invocationSteps, - runIndex, - testsets, - variants, -}: { - inputSteps: any[] - invocationSteps: any[] - runIndex?: {steps: Record} - testsets: PreviewTestset[] - variants: EnhancedVariant[] -}): {testsets: PreviewTestset[]; revisions: EnhancedVariant[]} { - const referencedTestsetIds = new Set() - const referencedRevisionIds = new Set() - - if (runIndex) { - inputSteps.forEach((step) => { - const meta = runIndex.steps[step.stepKey] - const tsId = meta?.refs?.testset?.id - if (tsId) referencedTestsetIds.add(tsId) - }) - invocationSteps.forEach((step) => { - const meta = runIndex.steps[step.stepKey] - const revId = meta?.refs?.applicationRevision?.id - if (revId) referencedRevisionIds.add(revId) - }) - } - - const resolvedTestsets = testsets.filter((t: any) => { - const id = (t as any).id ?? (t as any)._id - return referencedTestsetIds.has(id as string) - }) - const resolvedRevisions = variants.filter((v) => referencedRevisionIds.has(v.id)) - - return {testsets: resolvedTestsets, revisions: resolvedRevisions} -} - -export function enrichInputSteps({ - inputSteps, - testsets, - revisions, - mappings, -}: { - inputSteps: any[] - testsets?: any[] - revisions?: any[] - mappings?: any -}) { - const findTestsetForTestcase = (tcId: string) => - testsets?.find( - (ts: any) => - Array.isArray(ts.data?.testcases) && - ts.data.testcases.some((tc: any) => tc.id === tcId), - ) - - const enrichStep = (step: any) => { - const ts = findTestsetForTestcase(step.testcaseId) - - let inputs = step.inputs ? {...step.inputs} : {} - const groundTruth = step.groundTruth ?? {} - - const canComputeFromTestset = - mappings && Array.isArray(testsets) && testsets.length > 0 && ts - if (canComputeFromTestset) { - const testcase = ts?.data?.testcases?.find((tc: any) => tc.id === step.testcaseId) - if (testcase) { - // We no longer rely on revision.inputParams in worker context. - // Passing an empty list will trigger heuristic fallback in computeInputsAndGroundTruth. - const inputParamNames: string[] = [] - const computed = computeInputsAndGroundTruth({ - testcase, - mappings, - inputKey: step.stepKey, - inputParamNames, - }) - for (const [k, v] of Object.entries(computed.inputs)) { - if (!(k in inputs)) (inputs as Record)[k] = v - } - } - } - - const testcase = testsets - ?.flatMap((t: any) => t.data?.testcases || []) - .find((tc: any) => tc.id === step.testcaseId) - return {...step, inputs, groundTruth, testcase} - } - - const richInputSteps = inputSteps.map((s) => enrichStep(s)) - return {richInputSteps, richInputStep: richInputSteps[0]} -} - -export const prepareRequest = ({ - revision, - inputParametersDict, - uriObject, - precomputedParameters, - appType, -}: { - revision: EnhancedVariant - inputParametersDict: Record - uriObject?: {runtimePrefix: string; routePath?: string} - /** Parameters computed on main thread via transformedPromptsAtomFamily({useStableParams: true}) */ - precomputedParameters?: any -}) => { - if (!revision || !inputParametersDict) return null - - // We no longer store chat flags on the revision; infer from inputs - const isChatVariant = Object.prototype.hasOwnProperty.call( - inputParametersDict || {}, - "messages", - ) - const isCustomVariant = !!appType && appType === "custom" - - const mainInputParams: Record = {} - const secondaryInputParams: Record = {} - - // Derive splitting without relying on deprecated revision.inputParams: - // - messages => top-level (main) param for chat variants - // - everything else => goes under `inputs` - Object.keys(inputParametersDict).forEach((key) => { - const val = inputParametersDict[key] - if (key === "messages") { - mainInputParams[key] = val - } else { - secondaryInputParams[key] = val - } - }) - - // Start from stable precomputed parameters (main-thread transformed prompts) - const baseParams = (precomputedParameters as Record) || {} - const requestBody: Record = { - ...baseParams, - ...mainInputParams, - } - - if (isCustomVariant) { - for (const key of Object.keys(inputParametersDict)) { - if (key !== "inputs") requestBody[key] = inputParametersDict[key] - } - } else { - requestBody["inputs"] = {...(requestBody["inputs"] || {}), ...secondaryInputParams} - } - - if (isChatVariant) { - if (typeof requestBody["messages"] === "string") { - try { - requestBody["messages"] = JSON.parse(requestBody["messages"]) - } catch { - throw new Error("content not valid for messages") - } - } - } - - // Ensure we never crash on missing uriObject; default to empty values - const safeUri = uriObject ?? {runtimePrefix: "", routePath: ""} - - return { - requestBody, - endpoint: constructPlaygroundTestUrl(safeUri, "/test", true), - } -} - -export function buildInvocationParameters({ - invocationSteps, - inputSteps, - uriObject, - parametersByRevisionId, - appType, -}: { - invocationSteps: (IStepResponse & {revision?: any})[] - inputSteps: (IStepResponse & {inputs?: Record})[] - uriObject?: {runtimePrefix: string; routePath?: string} - /** Map of revisionId -> transformed prompts (stable) */ - parametersByRevisionId?: Record -}) { - const map: Record = {} - invocationSteps.forEach((step) => { - const revision = (step as any).revision - const matchInput = inputSteps.find((r) => r.testcaseId === step.testcaseId && r.inputs) - if (step.status !== "success") { - const pre = revision?.id ? parametersByRevisionId?.[revision.id] : undefined - - const params = prepareRequest({ - revision, - inputParametersDict: matchInput?.inputs ?? {}, - uriObject, - precomputedParameters: pre?.ag_config ? pre : pre, - appType, - }) - map[step.stepKey] = params - ;(step as any).invocationParameters = params - } else { - map[step.stepKey] = undefined - ;(step as any).invocationParameters = undefined - } - }) - return map -} - -// ------------------- public worker-friendly funcs ------------------- - -export function computeTraceAndAnnotationRefs({ - steps, - runIndex, - evaluators, -}: { - steps: StepResponseStep[] - runIndex?: {invocationKeys: Set; annotationKeys: Set} - evaluators: EvaluatorDto[] -}) { - const invocationKeys = runIndex?.invocationKeys ?? new Set() - const annotationKeys = runIndex?.annotationKeys ?? new Set() - - const traceIds = collectTraceIds({steps, invocationKeys}) - - // simple evaluator-based identification - const annotationSteps = steps.filter((s) => annotationKeys.has(s.stepKey)) - - const annotationLinks = buildAnnotationLinks({ - annotationSteps, - uuidToTraceId, - uuidToSpanId, - }) - return {traceIds, annotationSteps, annotationLinks} -} - -export async function fetchTraceAndAnnotationMaps({ - traceIds, - annotationLinks, - members, - invocationSteps, - apiUrl, - jwt, - projectId, -}: { - traceIds: string[] - annotationLinks: {trace_id: string; span_id?: string}[] - members: WorkspaceMember[] - invocationSteps: any[] - apiUrl: string - jwt: string - projectId: string -}): Promise<{traceMap: Map; annotationMap: Map}> { - const traceMap = new Map() - const annotationMap = new Map() - - if (traceIds.length) { - try { - const filtering = JSON.stringify({ - conditions: [{key: "tree.id", operator: "in", value: traceIds}], - }) - const params = new URLSearchParams() - params.append("filtering", filtering) - params.append("project_id", projectId) - const resp = await fetch(`${apiUrl}/observability/v1/traces?${params.toString()}`, { - headers: {Authorization: `Bearer ${jwt}`}, - }) - if (resp.ok) { - const data = await resp.json() - const trees = data?.trees || [] - trees.forEach((t: any) => { - if (t.tree?.id) traceMap.set(t.tree.id, t) - }) - } - } catch (err) { - console.error("[pureEnrichment] trace fetch error", err) - } - } - - if (annotationLinks && annotationLinks.length > 0) { - try { - const resp = await fetch( - `${apiUrl}/preview/annotations/query?project_id=${projectId}`, - { - method: "POST", - headers: {"Content-Type": "application/json", Authorization: `Bearer ${jwt}`}, - body: JSON.stringify({annotation_links: annotationLinks}), - }, - ) - if (resp.ok) { - const data = await resp.json() - const annMap = buildAnnotationMap({ - rawAnnotations: data?.annotations || [], - members, - }) - annMap.forEach((v, k) => annotationMap.set(k, v)) - } - } catch (err) { - console.error("[pureEnrichment] annotation fetch error", err) - } - } - - return {traceMap, annotationMap} -} - -// ------------------- pure implementations ------------------- - -export function buildScenarioCore({ - steps, - runIndex, - evaluators, - testsets, - variants, - mappings, - uriObject, - parametersByRevisionId, - appType, -}: { - steps: StepResponseStep[] - runIndex?: RunIndex - evaluators: EvaluatorDto[] - testsets: PreviewTestset[] - variants: EnhancedVariant[] - mappings?: unknown - uriObject?: {runtimePrefix: string; routePath?: string} - parametersByRevisionId?: Record - appType?: string -}): UseEvaluationRunScenarioStepsFetcherResult { - const {inputSteps, invocationSteps, annotationSteps} = identifyScenarioSteps({ - steps, - runIndex, - evaluators, - }) - - const {testsets: derivedTestsets, revisions} = deriveTestsetAndRevision({ - inputSteps, - invocationSteps, - runIndex, - testsets, - variants, - }) - - const {richInputSteps: enrichedInputSteps} = enrichInputSteps({ - inputSteps, - testsets: derivedTestsets, - revisions, - mappings, - }) - - // Attach revision object to each invocation step - const revisionMap: Record = {} - revisions.forEach((rev: any) => { - revisionMap[rev.id] = rev - }) - const enrichedInvocationSteps = invocationSteps.map((inv) => { - let revObj: any - if (runIndex) { - const meta = (runIndex as any).steps?.[inv.stepKey] - const revId = meta?.refs?.applicationRevision?.id - if (revId) revObj = revisionMap[revId] - } - return revObj ? {...inv, revision: revObj} : inv - }) - - buildInvocationParameters({ - invocationSteps: enrichedInvocationSteps, - inputSteps: enrichedInputSteps, - uriObject, - parametersByRevisionId, - appType, - }) - - return { - inputSteps: enrichedInputSteps, - invocationSteps: enrichedInvocationSteps, - annotationSteps, - } -} - -export function decorateScenarioResult({ - result, - traceMap, - annotationMap, - runIndex, - uuidToTraceId: _uuidToTraceId, -}: { - result: any - traceMap: Map - annotationMap: Map - runIndex?: {invocationKeys: Set; annotationKeys: Set; inputKeys?: Set} - uuidToTraceId: (uuid: string) => string | undefined -}) { - const invocationKeys = runIndex?.invocationKeys ?? new Set() - result.steps?.forEach((st: any) => { - const rawTrace = st.traceId ?? st.trace_id - const traceKey = rawTrace - const traceHex = rawTrace?.includes("-") ? _uuidToTraceId(rawTrace) : rawTrace - - // Invocation steps - if (invocationKeys.has(st.stepKey) || Boolean(st.references?.application)) { - st.isInvocation = true - if (traceKey) { - const tw = traceMap.get(traceKey) - if (tw) { - st.trace = tw.trees ? tw.trees[0] : tw - } - } - } - - // Annotation steps - if (runIndex?.annotationKeys?.has(st.stepKey)) { - if (traceHex) { - st.annotation = annotationMap.get(traceHex) - const tw = traceMap.get(traceKey) - if (tw) { - st.trace = tw.trees ? tw.trees[0] : tw - } - } - } - - // Input steps - if (runIndex?.inputKeys?.has(st.stepKey) && Array.isArray(result.inputSteps)) { - const enriched = result.inputSteps.find( - (inp: any) => inp.stepKey === st.stepKey && inp.inputs, - ) - if (enriched) { - st.inputs = enriched.inputs - st.groundTruth = enriched.groundTruth - if (st.testcaseId && enriched.testcase) { - st.testcase = enriched.testcase - } - } - } - }) - - // Ensure invocationSteps have trace - if (Array.isArray(result.invocationSteps)) { - result.invocationSteps.forEach((inv: any) => { - if (!inv.trace) { - const tid = inv.traceId || inv.trace_id - const tw = tid ? traceMap.get(tid) : undefined - if (tw) { - inv.trace = tw.trees ? tw.trees[0] : tw - } - } - }) - } - // Propagate testcase objects - if (Array.isArray(result.inputSteps)) { - result.inputSteps.forEach((inp: any) => { - if (inp.testcaseId && inp.testcase) { - const testcaseMap: Record = {} - testcaseMap[inp.testcaseId] = inp.testcase - result.steps?.forEach((st: any) => { - if (st.testcaseId && testcaseMap[st.testcaseId]) { - st.testcase = testcaseMap[st.testcaseId] - } - }) - } - }) - } -} diff --git a/web/oss/src/lib/evalRunner/scenarioListWorker.ts b/web/oss/src/lib/evalRunner/scenarioListWorker.ts deleted file mode 100644 index 44c740bfa5..0000000000 --- a/web/oss/src/lib/evalRunner/scenarioListWorker.ts +++ /dev/null @@ -1,196 +0,0 @@ -/* -Web Worker: Fetch full scenario list for a preview evaluation run in the background. -It expects a message of shape: -{ - requestId: string; - payload: { - apiUrl: string; - jwt: string; - projectId: string; - runId: string; - } -} -It will paginate through the /preview/evaluations/scenarios/ endpoint and post back: -{ requestId, ok: true, data: scenarios[] } or { requestId, ok:false, error } -*/ - -import type {IScenario} from "@/oss/lib/hooks/useEvaluationRunScenarios/types" - -interface WorkerRequest { - requestId: string - payload: { - apiUrl: string - jwt: string - projectId: string - runId: string - order?: "ascending" | "descending" - } -} - -interface WorkerResponse { - requestId: string - ok: boolean - data?: IScenario[] - error?: string -} - -// Backend supports cursor-based pagination (windowing with `next`) but not -// an explicit numeric `offset`. Fetch scenarios in smaller batches to -// reduce main-thread work when large evaluations load. -const PAGE_SIZE = 100 - -interface FetchArgs { - apiUrl: string - jwt: string - projectId: string - runId: string - next?: string | null - limit: number - order?: "ascending" | "descending" -} - -async function fetchPage({ - apiUrl, - jwt, - projectId, - runId, - next, - limit, - order, -}: FetchArgs): Promise<{scenarios: IScenario[]; next?: string}> { - // POST to query endpoint - const url = `${apiUrl}/preview/evaluations/scenarios/query?project_id=${encodeURIComponent(projectId)}` - const body: Record = { - scenario: { - ...(runId ? {run_ids: [runId]} : {}), - }, - windowing: { - limit, - ...(next ? {next} : {}), - ...(order ? {order} : {}), - }, - } - - const res = await fetch(url, { - method: "POST", - headers: { - Authorization: `Bearer ${jwt}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(body), - }) - if (!res.ok) throw new Error(`fetch ${res.status}`) - const json = (await res.json()) as {scenarios?: IScenario[]; next?: string} - - const scenarios = json.scenarios ?? [] - const nextCursor = - json.next ?? - (scenarios.length === limit ? (scenarios[scenarios.length - 1]?.id ?? null) : null) - return {scenarios, next: nextCursor} -} - -self.onmessage = async (e: MessageEvent) => { - const {requestId, payload} = e.data - try { - const scenarios: IScenario[] = [] - let next: string | null | undefined = null - let _batch = 0 - do { - const page = await fetchPage({ - ...payload, - next, - limit: PAGE_SIZE, - order: payload.order, - }) - scenarios.push(...page.scenarios) - _batch += 1 - next = page.next ?? null - } while (next) - - // Deduplicate scenarios by id in case backend returned duplicates - const seen = new Set() - const uniqueScenarios = scenarios.filter((s) => { - if (seen.has(s.id)) return false - seen.add(s.id) - return true - }) - - const shouldSortDescending = payload.order === "descending" - - const toNumericValue = (value: unknown): number | null => { - if (value === null || value === undefined) { - return null - } - if (typeof value === "number") { - return Number.isFinite(value) ? value : null - } - if (typeof value === "string") { - const parsedDate = Date.parse(value) - if (!Number.isNaN(parsedDate)) { - return parsedDate - } - const parsedNumber = Number(value) - if (!Number.isNaN(parsedNumber)) { - return parsedNumber - } - } - return null - } - - const getScenarioSortValue = (scenario: Record): number => { - const primaryCandidates = [ - scenario?.timestamp, - scenario?.createdAt, - scenario?.created_at, - scenario?.meta?.timestamp, - scenario?.meta?.createdAt, - scenario?.meta?.created_at, - scenario?.meta?.updatedAt, - scenario?.meta?.updated_at, - ] - - for (const candidate of primaryCandidates) { - const numeric = toNumericValue(candidate) - if (numeric !== null) { - return numeric - } - } - - const indexCandidates = [ - scenario?.meta?.index, - scenario?.meta?.order, - scenario?.meta?.order_index, - scenario?.index, - ] - - for (const candidate of indexCandidates) { - const numeric = toNumericValue(candidate) - if (numeric !== null) { - return numeric - } - } - - return Number.MIN_SAFE_INTEGER - } - - const orderedScenarios = shouldSortDescending - ? [...uniqueScenarios].sort((a, b) => { - const diff = getScenarioSortValue(b) - getScenarioSortValue(a) - if (diff !== 0) { - return diff - } - const idA = typeof a?.id === "string" ? a.id : "" - const idB = typeof b?.id === "string" ? b.id : "" - return idB.localeCompare(idA) - }) - : uniqueScenarios - - const resp: WorkerResponse = {requestId, ok: true, data: orderedScenarios} - // @ts-ignore - self.postMessage(resp) - } catch (err: any) { - const resp: WorkerResponse = {requestId, ok: false, error: err.message || "unknown"} - // @ts-ignore - self.postMessage(resp) - } -} diff --git a/web/oss/src/lib/evalRunner/types.ts b/web/oss/src/lib/evalRunner/types.ts deleted file mode 100644 index 16f1173255..0000000000 --- a/web/oss/src/lib/evalRunner/types.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {EvaluationStatus} from "@/oss/lib/Types" - -import {IStepResponse} from "@agenta/oss/src/lib/hooks/useEvaluationRunScenarioSteps/types" - -export interface RunEvalMessage { - type: "run-invocation" - jwt: string - appId: string - scenarioId: string - runId: string - apiUrl: string - requestBody: Record - projectId: string - endpoint: string - invocationKey?: string - invocationStepTarget?: IStepResponse -} - -export interface ResultMessage { - type: "result" - scenarioId: string - status: EvaluationStatus - result?: any - error?: string - invocationStepTarget?: IStepResponse - invocationKey?: string -} - -export interface JwtUpdateMessage { - type: "UPDATE_JWT" - jwt: string -} - -export interface ConfigMessage { - type: "config" - maxConcurrent: number -} - -export type WorkerMessage = RunEvalMessage | ConfigMessage | JwtUpdateMessage diff --git a/web/oss/src/lib/evalRunner/workerFetch.ts b/web/oss/src/lib/evalRunner/workerFetch.ts deleted file mode 100644 index 2cf69dc70b..0000000000 --- a/web/oss/src/lib/evalRunner/workerFetch.ts +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Web-worker compatible utilities for fetching & enriching scenario steps in bulk. - * - * These functions mirror the logic in `fetchScenarioStepsBulk` but avoid any - * main-thread specifics (Jotai atoms, React hooks). They can be executed inside - * a dedicated Web Worker to offload CPU-heavy enrichment for thousands of - * scenarios. - */ - -import {snakeToCamelCaseKeys} from "@/oss/lib/helpers/casing" -import {uuidToTraceId} from "@/oss/lib/hooks/useAnnotations/assets/helpers" // relative to this file -import type { - IStepResponse, - StepResponse, - StepResponseStep, - UseEvaluationRunScenarioStepsFetcherResult, -} from "@/oss/lib/hooks/useEvaluationRunScenarioSteps/types" -import {PreviewTestcase, PreviewTestset} from "@/oss/lib/Types" - -import { - deserializeRunIndex, - RunIndex, -} from "@agenta/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" -import {EvalRunDataContextType} from "@agenta/oss/src/lib/hooks/useEvaluationRunData/types" - -import { - buildScenarioCore, - computeTraceAndAnnotationRefs, - decorateScenarioResult, - fetchTraceAndAnnotationMaps, -} from "./pureEnrichment" - -export const DEFAULT_BATCH_SIZE = 100 -export const DEFAULT_BATCH_CONCURRENCY = 2 - -/** - * Simplified, serialisable context passed from main thread to the worker. - * (It extends the original `EvalRunDataContextType` but removes any functions - * and non-cloneable structures.) - */ -export interface WorkerEvalContext extends Omit { - runIndex: RunIndex - jwt: string - apiUrl: string - projectId: string - /** IDs of variants that are chat-based (hasMessages in request schema) */ - chatVariantIds?: string[] - uriObject?: {runtimePrefix: string; routePath?: string} - /** Stable transformed parameters keyed by revision id */ - parametersByRevisionId?: Record -} - -// ------------- helpers ------------- -function chunkArray(arr: T[], size: number): T[][] { - return Array.from({length: Math.ceil(arr.length / size)}, (_, i) => - arr.slice(i * size, i * size + size), - ) -} - -/** - * Fetch & enrich steps for one batch of scenarios. - * Pure function without side-effects beyond network requests. - */ -async function processScenarioBatchWorker( - scenarioIds: string[], - context: WorkerEvalContext, -): Promise> { - const {runId, members, jwt, apiUrl, projectId, appType} = context - - // Validate required parameters - if (!runId || !projectId || !jwt || !apiUrl) { - throw new Error("Missing required parameters for worker fetch") - } - - // Validate scenario IDs and filter out skeleton/placeholder IDs - const validScenarioIds = scenarioIds.filter((id) => { - if (!id || typeof id !== "string") return false - - // Skip skeleton/placeholder IDs gracefully - if (id.startsWith("skeleton-") || id.startsWith("placeholder-")) { - return false - } - - const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i - return uuidRegex.test(id) - }) - - if (validScenarioIds.length === 0) { - return new Map() - } - - // POST to results query endpoint with body { result: { run_id, run_ids, scenario_ids }, windowing: {} } - const resultsUrl = `${apiUrl}/preview/evaluations/results/query?project_id=${encodeURIComponent( - projectId, - )}` - const body: Record = { - result: { - run_id: runId, - run_ids: [runId], - scenario_ids: validScenarioIds, - }, - windowing: {}, - } - - const resp = await fetch(resultsUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: jwt ? `Bearer ${jwt}` : "", - }, - credentials: "include", - body: JSON.stringify(body), - }) - - if (!resp.ok) { - throw new Error(`Worker fetch failed ${resp.status}`) - } - - const raw = (await resp.json()) as StepResponse - - // Convert to camelCase once - const camelStepsAll = (raw.results ?? []).map((st) => - snakeToCamelCaseKeys(st), - ) - - // Group steps by scenarioId - const perScenarioSteps = new Map() - for (const step of camelStepsAll) { - const sid = (step as any).scenarioId as string - if (!perScenarioSteps.has(sid)) perScenarioSteps.set(sid, []) - perScenarioSteps.get(sid)!.push(step) - } - - // Collect testcase ids - const testcaseIds = new Set() - for (const [_, stepsArr] of perScenarioSteps.entries()) { - for (const s of stepsArr) { - if (s.testcaseId) testcaseIds.add(s.testcaseId) - } - } - - // Fetch testcase data (updated endpoint) - let updatedTestsets: PreviewTestset[] = Array.isArray(context.testsets) - ? [...context.testsets] - : [] - - if (testcaseIds.size > 0 && updatedTestsets.length > 0) { - const testcaseResp = await fetch( - `${apiUrl}/preview/testcases/query?project_id=${encodeURIComponent(projectId)}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: jwt ? `Bearer ${jwt}` : "", - }, - credentials: "include", - body: JSON.stringify({testcase_ids: Array.from(testcaseIds)}), - }, - ) - - if (testcaseResp.ok) { - const testcases = (await testcaseResp.json()) as { - count: number - testcases: PreviewTestcase[] - } - - // Group testcases by their testset_id for easier lookup - const testcasesByTestsetId = (testcases.testcases || []).reduce( - (acc, testcase) => { - if (!acc[testcase.testset_id]) { - acc[testcase.testset_id] = [] - } - acc[testcase.testset_id].push(testcase) - return acc - }, - {} as Record, - ) - - updatedTestsets = updatedTestsets.map((testset) => { - const matchingTestcases = testcasesByTestsetId[testset.id] || [] - - if (matchingTestcases.length > 0) { - return { - ...testset, - data: { - ...testset.data, - testcase_ids: matchingTestcases.map((tc) => tc.id), - testcases: matchingTestcases, - }, - } - } - - return testset - }) as PreviewTestset[] - } - } - - context.testsets = updatedTestsets - - const scenarioMap = new Map() - - const runIndex = deserializeRunIndex(context.runIndex) - const safeEvaluators = Array.isArray(context.evaluators) ? context.evaluators : [] - const safeTestsets = Array.isArray(context.testsets) ? context.testsets : [] - const safeVariants = Array.isArray(context.variants) ? context.variants : [] - const safeMappings = Array.isArray(context.mappings) ? context.mappings : context.mappings || [] - - for (const [sid, stepsArr] of perScenarioSteps.entries()) { - const core = buildScenarioCore({ - steps: stepsArr, - runIndex: runIndex, - evaluators: safeEvaluators, - testsets: safeTestsets, - variants: safeVariants, - mappings: safeMappings, - uriObject: context.uriObject, - parametersByRevisionId: context.parametersByRevisionId, - appType: appType, - }) - - const result: UseEvaluationRunScenarioStepsFetcherResult = { - ...core, - steps: stepsArr, - count: stepsArr.length, - next: undefined, - mappings: context.mappings, - } as any - scenarioMap.set(sid, result) - } - - // Enrich traces / annotations - const {traceIds, annotationLinks} = computeTraceAndAnnotationRefs({ - steps: camelStepsAll, - runIndex: runIndex, - evaluators: context.evaluators || [], - }) - - const invocationStepsList = (raw.steps ?? []).filter((s: any) => - runIndex?.invocationKeys?.has?.(s.stepKey), - ) - - const {traceMap, annotationMap} = await fetchTraceAndAnnotationMaps({ - traceIds, - annotationLinks, - members, - invocationSteps: invocationStepsList, - apiUrl, - jwt, - projectId, - }) - - for (const result of scenarioMap.values()) { - decorateScenarioResult({ - result, - traceMap, - annotationMap, - runIndex: runIndex, - uuidToTraceId, - }) - } - - return scenarioMap -} - -/** - * Process all batches with limited concurrency. Returns a merged Map. - */ -async function processAllBatchesWorker( - scenarioIds: string[], - context: WorkerEvalContext, - concurrency: number, - batchSize: number, -): Promise> { - const batches = chunkArray(scenarioIds, batchSize) - const results: Map[] = [] - let idx = 0 - while (idx < batches.length) { - const running = batches - .slice(idx, idx + concurrency) - .map((batch) => processScenarioBatchWorker(batch, context)) - const batchResults = await Promise.all(running) - results.push(...batchResults) - idx += concurrency - } - - return mergeMaps(results) -} - -// Helper: merge many Maps into one. -function mergeMaps(maps: Map[]): Map { - const merged = new Map() - for (const m of maps) { - for (const [k, v] of m) merged.set(k, v) - } - return merged -} - -/** - * Public API for worker usage. Returns a serialisable array of entries. - */ -export async function fetchScenarioStepsBulkWorker( - scenarioIds: string[], - context: WorkerEvalContext, - options?: {batchSize?: number; concurrency?: number}, -): Promise> { - if (scenarioIds.length === 0) - return new Map() - const batchSize = options?.batchSize ?? DEFAULT_BATCH_SIZE - const concurrency = options?.concurrency ?? DEFAULT_BATCH_CONCURRENCY - const map = await processAllBatchesWorker(scenarioIds, context, concurrency, batchSize) - return map -} diff --git a/web/oss/src/lib/helpers/analytics/AgPosthogProvider.tsx b/web/oss/src/lib/helpers/analytics/AgPosthogProvider.tsx index 7fd52ec58e..35111d5d25 100644 --- a/web/oss/src/lib/helpers/analytics/AgPosthogProvider.tsx +++ b/web/oss/src/lib/helpers/analytics/AgPosthogProvider.tsx @@ -1,4 +1,4 @@ -import {useCallback, useEffect, useRef, useState} from "react" +import {useCallback, useEffect, useState} from "react" import {useAtom} from "jotai" import {useRouter} from "next/router" @@ -10,18 +10,14 @@ import {CLOUD_CONFIG, OSS_CONFIG} from "./assets/constants" import {posthogAtom, type PostHogConfig} from "./store/atoms" import {CustomPosthogProviderType} from "./types" -const MAX_POSTHOG_INIT_ATTEMPTS = 3 - const CustomPosthogProvider: CustomPosthogProviderType = ({children}) => { const router = useRouter() const [loadingPosthog, setLoadingPosthog] = useState(false) const [posthogClient, setPosthogClient] = useAtom(posthogAtom) - const failedAttemptsRef = useRef(0) const initPosthog = useCallback(async () => { if (posthogClient) return if (loadingPosthog) return - if (failedAttemptsRef.current >= MAX_POSTHOG_INIT_ATTEMPTS) return if (!getEnv("NEXT_PUBLIC_POSTHOG_API_KEY")) return setLoadingPosthog(true) @@ -36,17 +32,11 @@ const CustomPosthogProvider: CustomPosthogProviderType = ({children}) => { // Enable debug mode in development loaded: (posthog) => { setPosthogClient(posthog) - failedAttemptsRef.current = 0 if (process.env.NODE_ENV === "development") posthog.debug() }, capture_pageview: false, ...((isDemo() ? CLOUD_CONFIG : OSS_CONFIG) as Partial), }) - } catch (error) { - failedAttemptsRef.current += 1 - if (failedAttemptsRef.current >= MAX_POSTHOG_INIT_ATTEMPTS) { - console.warn("PostHog failed to initialize after maximum attempts", error) - } } finally { setLoadingPosthog(false) } diff --git a/web/oss/src/lib/helpers/analytics/hooks/usePostHogAg.ts b/web/oss/src/lib/helpers/analytics/hooks/usePostHogAg.ts index 1383421f32..dd16b40cdc 100644 --- a/web/oss/src/lib/helpers/analytics/hooks/usePostHogAg.ts +++ b/web/oss/src/lib/helpers/analytics/hooks/usePostHogAg.ts @@ -3,9 +3,9 @@ import {useCallback} from "react" import {useAtom} from "jotai" import {type PostHog} from "posthog-js" +import {useProfileData} from "@/oss/contexts/profile.context" import useIsomorphicLayoutEffect from "@/oss/hooks/useIsomorphicLayoutEffect" import {generateOrRetrieveDistinctId, isDemo} from "@/oss/lib/helpers/utils" -import {useProfileData} from "@/oss/state/profile" import {getEnv} from "../../dynamicEnv" import {posthogAtom} from "../store/atoms" diff --git a/web/oss/src/lib/helpers/analytics/hooks/useSurvey.ts b/web/oss/src/lib/helpers/analytics/hooks/useSurvey.ts index 855c9e082a..d8e3cee6e3 100644 --- a/web/oss/src/lib/helpers/analytics/hooks/useSurvey.ts +++ b/web/oss/src/lib/helpers/analytics/hooks/useSurvey.ts @@ -1,142 +1,62 @@ -import {useEffect, useMemo, useRef, useState} from "react" +import {useEffect, useMemo, useState, useCallback} from "react" +import {useRouter} from "next/router" import {Survey} from "posthog-js" -import useSWR from "swr" -import {getEnv} from "../../dynamicEnv" +import {shortPoll} from "../../utils" import {usePostHogAg} from "./usePostHogAg" -type SurveyErrorCode = - | "posthog-not-configured" - | "posthog-unavailable" - | "survey-fetch-error" - | "survey-unavailable" - -export interface SurveyError extends Error { - code: SurveyErrorCode -} - -const SURVEY_TIMEOUT_MS = 6000 - -const createSurveyError = (code: SurveyErrorCode, message: string): SurveyError => { - const error = new Error(message) as SurveyError - error.code = code - return error -} - export const useSurvey = (surveyName: string) => { - const posthog = usePostHogAg() - const trackingConfigured = getEnv("NEXT_PUBLIC_POSTHOG_API_KEY") !== "" - const [manualError, setManualError] = useState(null) - const timeoutRef = useRef(null) - - const posthogLoaded = Boolean((posthog as any)?.__loaded) - - useEffect(() => { - if (!trackingConfigured) { - setManualError((prev) => { - if (prev?.code === "posthog-not-configured") return prev - return createSurveyError( - "posthog-not-configured", - "PostHog analytics is not configured", - ) - }) - return - } - - setManualError((prev) => (prev?.code === "posthog-not-configured" ? null : prev)) - }, [trackingConfigured]) + const [survey, setSurvey] = useState(null) + const [isFetching, setIsFetching] = useState(false) - useEffect(() => { - if (!trackingConfigured) return - if (posthogLoaded) { - setManualError((prev) => (prev?.code === "posthog-unavailable" ? null : prev)) - if (timeoutRef.current) { - window.clearTimeout(timeoutRef.current) - timeoutRef.current = null - } - return - } + const posthog = usePostHogAg() + const router = useRouter() - if (timeoutRef.current) return + const loading = useMemo(() => { + return isFetching || !posthog?.__loaded + }, [isFetching, posthog?.__loaded]) - timeoutRef.current = window.setTimeout(() => { - setManualError((prev) => - prev?.code - ? prev - : createSurveyError("posthog-unavailable", "PostHog failed to load"), - ) - }, SURVEY_TIMEOUT_MS) + const fetchSurvey = useCallback(async () => { + if (!!survey || isFetching || !posthog?.__loaded) return - return () => { - if (!timeoutRef.current) return - window.clearTimeout(timeoutRef.current) - timeoutRef.current = null - } - }, [posthogLoaded, trackingConfigured]) + setIsFetching(true) - useEffect(() => { - return () => { - if (!timeoutRef.current) return - window.clearTimeout(timeoutRef.current) - timeoutRef.current = null - } - }, []) + const {stopper, promise} = shortPoll( + () => { + if (posthog?.__loaded) { + stopper() + } + }, + {delayMs: 500, timeoutMs: 2000}, + ) - const swr = useSWR( - posthogLoaded && !manualError ? ["survey", surveyName] : null, - async () => { - return await new Promise((resolve, reject) => { - try { + promise + .then(() => { + if (posthog?.__loaded) { posthog?.surveys?.getActiveMatchingSurveys?.((surveys) => { - const found = surveys?.find((s) => s.name?.includes(surveyName)) - if (!found) { - reject( - createSurveyError( - "survey-unavailable", - `Survey "${surveyName}" is not available`, - ), - ) - return - } - resolve(found) + const found = surveys?.find((s) => s.name.includes(surveyName)) ?? null + setSurvey(found) }, false) - } catch (e: unknown) { - const error = - e instanceof Error - ? createSurveyError("survey-fetch-error", e.message) - : createSurveyError("survey-fetch-error", "Failed to load survey") - reject(error) + + setIsFetching(false) } }) - }, - { - revalidateOnFocus: false, - shouldRetryOnError: false, - }, - ) - - const swrError = swr.error as SurveyError | undefined - - const combinedError = useMemo(() => { - if (manualError) return manualError - if (swrError) return swrError - return null - }, [manualError, swrError]) - - const loading = useMemo(() => { - if (combinedError) return false - if (!trackingConfigured) return false - if (!posthogLoaded) return true - return swr.isLoading || swr.isValidating - }, [combinedError, posthogLoaded, swr.isLoading, swr.isValidating, trackingConfigured]) + .catch((error) => { + console.error(error) + router.push("/apps") + setIsFetching(false) + }) + }, [isFetching, surveyName, posthog?.__loaded]) - const survey = combinedError ? null : (swr.data ?? null) + useEffect(() => { + fetchSurvey() + }, [fetchSurvey]) return { survey, loading, - error: combinedError, + mutate: fetchSurvey, } } diff --git a/web/oss/src/lib/helpers/api.ts b/web/oss/src/lib/helpers/api.ts deleted file mode 100644 index e71eca1647..0000000000 --- a/web/oss/src/lib/helpers/api.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {getEnv} from "./dynamicEnv" - -export const getAgentaApiUrl = () => { - const apiUrl = getEnv("NEXT_PUBLIC_AGENTA_API_URL") - - if (!apiUrl && typeof window !== "undefined") { - return `${window.location.protocol}//${window.location.hostname}` - } - - return apiUrl -} diff --git a/web/oss/src/lib/helpers/buildBreadcrumbs.ts b/web/oss/src/lib/helpers/buildBreadcrumbs.ts deleted file mode 100644 index 5b36db44eb..0000000000 --- a/web/oss/src/lib/helpers/buildBreadcrumbs.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {BreadcrumbAtom} from "@/oss/lib/atoms/breadcrumb/types" -import {isUuid} from "@/oss/lib/helpers/utils" -import {ListAppsItem} from "@/oss/lib/Types" - -const IGNORE_PATHS = new Set(["testsets", "evaluations", "settings"]) - -export interface BreadcrumbContext { - uriPath: string - apps: ListAppsItem[] - workspaceId: string | null - workspaceName: string - projectId: string | null - projectName?: string | null - projectIsPending?: boolean -} - -export const buildBreadcrumbSegments = ({ - uriPath, - apps, - workspaceId, - workspaceName, - projectId, - projectName, - projectIsPending, -}: BreadcrumbContext): BreadcrumbAtom => { - const items: BreadcrumbAtom = {} - const segments = uriPath.split("?")[0].split("/").filter(Boolean) - const appSlugIndex = segments.indexOf("apps") - - const wsIndex = segments.indexOf("w") - const projectIndex = segments.indexOf("p") - - const workspaceIdFromPath = wsIndex !== -1 ? segments[wsIndex + 1] : null - const projectIdFromPath = projectIndex !== -1 ? segments[projectIndex + 1] : null - const resolvedWorkspaceId = workspaceId || workspaceIdFromPath - const resolvedProjectId = projectId || projectIdFromPath - - if (wsIndex !== -1) { - const hasWorkspaceId = Boolean(resolvedWorkspaceId) - const wsLabel = workspaceName || "Workspace" - const wsHref = hasWorkspaceId ? `/w/${encodeURIComponent(resolvedWorkspaceId!)}` : undefined - items["workspace"] = {label: wsLabel, ...(wsHref ? {href: wsHref} : {})} - } - - if (projectIndex !== -1 && resolvedProjectId) { - const projectLabel = projectName || (projectIsPending ? "Loading project..." : "Project") - const projectHref = resolvedWorkspaceId - ? `/w/${encodeURIComponent(resolvedWorkspaceId)}/p/${encodeURIComponent(resolvedProjectId)}/apps` - : `/p/${encodeURIComponent(resolvedProjectId)}/apps` - items["project"] = {label: projectLabel, href: projectHref} - } - - if (appSlugIndex !== -1) { - const appId = segments[appSlugIndex + 1] - const baseAppsPath = - resolvedWorkspaceId && resolvedProjectId - ? `/w/${encodeURIComponent(resolvedWorkspaceId)}/p/${encodeURIComponent(resolvedProjectId)}/apps` - : `/${segments.slice(0, appSlugIndex + 1).join("/")}` - - items["apps"] = {label: "Apps", href: baseAppsPath} - - const slicedSegments = segments.slice(appSlugIndex + 2) - - if (appId) { - const app = apps.find((appItem) => appItem.app_id === appId) - - items["app"] = { - label: app?.app_name ?? "App", - href: `${baseAppsPath}/${appId}/overview`, - } - } - - let cumulative = `${baseAppsPath}/${appId}` - - for (let i = 0; i < slicedSegments.length; i++) { - const seg = slicedSegments[i] - const next = slicedSegments[i + 1] - - if (seg === "evaluations") { - const hasResults = next === "results" - const evaluationsHref = `${baseAppsPath}/${appId}/evaluations` - items["appPage"] = {label: "auto evaluation", href: evaluationsHref} - - if (hasResults) { - i++ - const idSeg = slicedSegments[i + 1] - const nameSeg = slicedSegments[i + 2] - if (idSeg && isUuid(idSeg)) { - if (nameSeg && !isUuid(nameSeg)) { - const detailHref = `${baseAppsPath}/${appId}/evaluations/results/${idSeg}/${nameSeg}` - items["appPageDetail"] = {label: nameSeg, href: detailHref} - } - } - } - break - } - - if (isUuid(seg)) { - if (next && !isUuid(next)) { - cumulative += `/${seg}/${next}` - const isLastPair = i + 1 === slicedSegments.length - 1 - items["appPageDetail"] = { - label: next, - ...(isLastPair ? {href: cumulative} : {}), - } - i++ - continue - } - break - } - - cumulative += `/${seg}` - const isLast = i === slicedSegments.length - 1 - items["appPage"] = { - label: seg, - ...(isLast ? {href: cumulative} : {}), - } - } - } else { - let cumulative = "" - segments.forEach((seg) => { - cumulative += `/${seg}` - if (IGNORE_PATHS.has(seg) || isUuid(seg) || seg === "w" || seg === "p") { - return - } - items[seg] = {label: seg, ...(segments.length === 1 ? {} : {href: cumulative})} - }) - } - - return items -} diff --git a/web/oss/src/lib/helpers/dateTimeHelper/dayjs.ts b/web/oss/src/lib/helpers/dateTimeHelper/dayjs.ts index 8161ba59dd..b8772662bc 100644 --- a/web/oss/src/lib/helpers/dateTimeHelper/dayjs.ts +++ b/web/oss/src/lib/helpers/dateTimeHelper/dayjs.ts @@ -1,8 +1,6 @@ import dayjs from "dayjs" import customParseFormat from "dayjs/plugin/customParseFormat" -import utc from "dayjs/plugin/utc" dayjs.extend(customParseFormat) -dayjs.extend(utc) export default dayjs diff --git a/web/oss/src/lib/helpers/dateTimeHelper/index.ts b/web/oss/src/lib/helpers/dateTimeHelper/index.ts index 3a7dc454c0..591e8bf5a3 100644 --- a/web/oss/src/lib/helpers/dateTimeHelper/index.ts +++ b/web/oss/src/lib/helpers/dateTimeHelper/index.ts @@ -1,18 +1,5 @@ import dayjs from "./dayjs" -const FALLBACK_FORMATS = [ - "YYYY-MM-DD H:mm:ssAZ", - "YYYY-MM-DD H:mm:sssAZ", - "YYYY-MM-DD HH:mm:ss.SSSZ", - "YYYY-MM-DD HH:mm:ss.SSS", - "YYYY-MM-DD HH:mm:ssZ", - "YYYY-MM-DD HH:mm:ss", - "YYYY-MM-DDTHH:mm:ss.SSSSSS", - "YYYY-MM-DDTHH:mm:ss.SSSZ", - "YYYY-MM-DDTHH:mm:ssZ", - "YYYY-MM-DDTHH:mm:ss", -] - export const formatDate = (date: dayjs.ConfigType): string => { return dayjs(date).format("DD MMM YYYY | h:mm a") } @@ -21,10 +8,6 @@ export const formatDate24 = (date: dayjs.ConfigType, includeSeconds = false): st return dayjs(date).format("DD MMM YY, HH:mm" + (includeSeconds ? ":ss" : "")) } -export const parseDate = ({date, inputFormat = "YYYY-MM-DD H:mm:sssAZ"}) => { - return dayjs(date, inputFormat) -} - export const formatDay = ({ date, inputFormat = "YYYY-MM-DD H:mm:ssAZ", @@ -34,17 +17,5 @@ export const formatDay = ({ inputFormat?: string outputFormat?: string }): string => { - const formatsToTry = inputFormat - ? [inputFormat, ...FALLBACK_FORMATS.filter((format) => format !== inputFormat)] - : FALLBACK_FORMATS - - for (const format of formatsToTry) { - const parsed = dayjs.utc(date, format) - if (parsed.isValid()) { - return parsed.format(outputFormat) - } - } - - const direct = dayjs.utc(date) - return direct.isValid() ? direct.format(outputFormat) : "" + return dayjs(date, inputFormat).format(outputFormat) } diff --git a/web/oss/src/lib/helpers/dynamicEnv.ts b/web/oss/src/lib/helpers/dynamicEnv.ts index 6b7c9c808a..19e76d9c9b 100644 --- a/web/oss/src/lib/helpers/dynamicEnv.ts +++ b/web/oss/src/lib/helpers/dynamicEnv.ts @@ -4,10 +4,6 @@ export const processEnv = { NEXT_PUBLIC_AGENTA_API_URL: process.env.NEXT_PUBLIC_AGENTA_API_URL, NEXT_PUBLIC_POSTHOG_API_KEY: process.env.NEXT_PUBLIC_POSTHOG_API_KEY, NEXT_PUBLIC_CRISP_WEBSITE_ID: process.env.NEXT_PUBLIC_CRISP_WEBSITE_ID, - NEXT_PUBLIC_LOG_APP_ATOMS: "true", - // process.env.NEXT_PUBLIC_LOG_APP_ATOMS, - NEXT_PUBLIC_ENABLE_ATOM_LOGS: "true", - // process.env.NEXT_PUBLIC_ENABLE_ATOM_LOGS, } export const getEnv = (envKey: string) => { diff --git a/web/oss/src/lib/helpers/errorHandler.ts b/web/oss/src/lib/helpers/errorHandler.ts index f64ab6b751..8389005f04 100644 --- a/web/oss/src/lib/helpers/errorHandler.ts +++ b/web/oss/src/lib/helpers/errorHandler.ts @@ -2,12 +2,15 @@ import {message} from "antd" export const getErrorMessage = (error: any, fallback = "An unknown error occurred!") => { let message = fallback - if (error == null) return message - error?.preventDefault && error.preventDefault() - if (typeof error === "string") message = error - else if (error.message) message = error.message - else if (error && typeof error === "object") message = getErrorMessage(Object.values(error)[0]) - else message = JSON.stringify(error) + try { + error?.preventDefault && error.preventDefault() + if (typeof error === "string") message = error + else if (error.message) message = error.message + else if (error && typeof error === "object") + message = getErrorMessage(Object.values(error)[0]) + else message = JSON.stringify(error) + } catch {} + return message } @@ -16,47 +19,3 @@ export const globalErrorHandler = (error: any) => { console.error(errorMsg, error) message.error(errorMsg) } - -export type AnyErr = unknown - -const getLower = (v: unknown) => (typeof v === "string" ? v.toLowerCase() : "") - -export const isNetworkIssue = (err: AnyErr): boolean => { - const name = typeof (err as any)?.name === "string" ? (err as any).name : "" - const code = typeof (err as any)?.code === "string" ? (err as any).code : "" - const msg = getLower((err as any)?.message) - - // Guard navigator in SSR - const offline = - typeof navigator !== "undefined" && typeof navigator.onLine === "boolean" - ? !navigator.onLine - : false - - return ( - offline || - code === "NETWORK_ERROR" || - name === "NetworkError" || - (name === "TypeError" && - msg && - /network|fetch|connection|timeout|failed to fetch/i.test( - msg, - )) /* more specific network-related TypeError check */ || - msg.includes("network") || - msg.includes("refused") || - msg.includes("timeout") || - msg.includes("unreachable") - ) -} - -export const isServerError = (err: AnyErr): boolean => { - const status = (err as any)?.status - if (typeof status === "number") { - return (status >= 500 && status <= 504) || status === 404 - } - // Avoid brittle message parsing; keep minimal fallback if you must: - const msg = getLower((err as any)?.message) - return ["500", "502", "503", "504", "404"].some((c) => msg.includes(c)) -} - -export const isBackendAvailabilityIssue = (err: AnyErr): boolean => - isNetworkIssue(err) || isServerError(err) diff --git a/web/oss/src/lib/helpers/evaluate.ts b/web/oss/src/lib/helpers/evaluate.ts index c3c280f3e1..b172237700 100644 --- a/web/oss/src/lib/helpers/evaluate.ts +++ b/web/oss/src/lib/helpers/evaluate.ts @@ -1,341 +1,3 @@ -import {EvaluationType} from "@agenta/oss/src/lib/enums" -import {convertToCsv, downloadCsv} from "@agenta/oss/src/lib/helpers/fileManipulations" -import {formatCurrency, formatLatency} from "@agenta/oss/src/lib/helpers/formatters" -import {isDemo} from "@agenta/oss/src/lib/helpers/utils" -import { - Evaluation, - GenericObject, - TypedValue, - Variant, - _Evaluation, - EvaluationScenario, -} from "@agenta/oss/src/lib/Types" -import dayjs from "dayjs" -import capitalize from "lodash/capitalize" -import round from "lodash/round" - -import AlertPopup from "@/oss/components/AlertPopup/AlertPopup" -import {runningStatuses} from "@/oss/components/pages/evaluations/cellRenderers/cellRenderers" -import { - HumanEvaluationListTableDataType, - SingleModelEvaluationListTableDataType, -} from "@/oss/lib/Types" -import {fetchEvaluatonIdsByResource} from "@/oss/services/evaluations/api" - -export const exportABTestingEvaluationData = ( - evaluation: Evaluation, - scenarios: EvaluationScenario[], - rows: GenericObject[], -) => { - const exportRow = rows.map((data, ix) => { - const inputColumns = evaluation.testset.testsetChatColumn - ? {Input: evaluation.testset.csvdata[ix]?.[evaluation.testset.testsetChatColumn]} - : data.inputs.reduce( - (columns: any, input: {input_name: string; input_value: string}) => { - columns[`${input.input_name}`] = input.input_value - return columns - }, - {}, - ) - return { - ...inputColumns, - [`App Variant ${evaluation.variants[0].variantName} Output 0`]: data?.columnData0 - ? data?.columnData0 - : data.outputs[0]?.variant_output, - [`App Variant ${evaluation.variants[1].variantName} Output 1`]: data?.columnData1 - ? data?.columnData1 - : data.outputs[1]?.variant_output, - ["Vote"]: - evaluation.variants.find((v: Variant) => v.variantId === data.vote)?.variantName || - data.vote, - ["Expected Output"]: - scenarios[ix]?.correctAnswer || evaluation.testset.csvdata[ix].correct_answer, - ["Additional notes"]: scenarios[ix]?.note, - } - }) - const exportCol = Object.keys(exportRow[0]) - - const csvData = convertToCsv(exportRow, exportCol) - const filename = `${evaluation.appName}_${evaluation.variants[0].variantName}_${evaluation.variants[1].variantName}_${evaluation.evaluationType}.csv` - downloadCsv(csvData, filename) -} - -export const exportSingleModelEvaluationData = ( - evaluation: Evaluation, - scenarios: EvaluationScenario[], - rows: GenericObject[], -) => { - const exportRow = rows.map((data, ix) => { - const inputColumns = evaluation.testset.testsetChatColumn - ? {Input: evaluation.testset.csvdata[ix]?.[evaluation.testset.testsetChatColumn]} - : data.inputs.reduce( - (columns: any, input: {input_name: string; input_value: string}) => { - columns[`${input.input_name}`] = input.input_value - return columns - }, - {}, - ) - const numericScore = parseInt(data.score) - return { - ...inputColumns, - [`App Variant ${evaluation.variants[0].variantName} Output 0`]: data?.columnData0 - ? data?.columnData0 - : data.outputs[0]?.variant_output, - ["Score"]: isNaN(numericScore) ? "-" : numericScore, - ["Expected Output"]: - scenarios[ix]?.correctAnswer || evaluation.testset.csvdata[ix].correct_answer, - ["Additional notes"]: scenarios[ix]?.note, - } - }) - const exportCol = Object.keys(exportRow[0]) - - const csvData = convertToCsv(exportRow, exportCol) - const filename = `${evaluation.appName}_${evaluation.variants[0].variantName}_${evaluation.evaluationType}.csv` - downloadCsv(csvData, filename) -} - -export const calculateResultsDataAvg = (resultsData: Record, multiplier = 10) => { - const obj = {...resultsData} - Object.keys(obj).forEach((key) => { - if (isNaN(+key)) delete obj[key] - }) - - const count = Object.values(obj).reduce((acc, value) => acc + +value, 0) - const sum = Object.keys(obj).reduce((acc, key) => acc + (parseFloat(key) || 0) * +obj[key], 0) - return (sum / count) * multiplier -} - -export const getVotesPercentage = (record: HumanEvaluationListTableDataType, index: number) => { - const variant = record.votesData.variants[index] - return record.votesData.variants_votes_data[variant]?.percentage -} - -export const checkIfResourceValidForDeletion = async ( - data: Omit[0], "appId">, -) => { - if (isDemo()) { - const response = await fetchEvaluatonIdsByResource(data) - if (response.data.length > 0) { - const name = - (data.resourceType === "testset" - ? "Testset" - : data.resourceType === "evaluator_config" - ? "Evaluator" - : "Variant") + (data.resourceIds.length > 1 ? "s" : "") - - const suffix = response.data.length > 1 ? "s" : "" - AlertPopup({ - title: `${name} is in use`, - message: `The ${name} is currently in used by ${response.data.length} evaluation${suffix}. Please delete the evaluation${suffix} first.`, - cancelText: null, - okText: "Ok", - }) - return false - } - } +export const checkIfResourceValidForDeletion = async (data: any) => { return true } - -export function getTypedValue(res?: TypedValue) { - const {value, type, error} = res || {} - if (type === "error") { - return error?.message - } - - if (value === undefined) return "-" - - switch (type) { - case "number": - return round(Number(value), 2) - case "boolean": - case "bool": - return capitalize(value?.toString()) - case "cost": - return formatCurrency(Number(value)) - case "latency": - return formatLatency(Number(value)) - case "string": - case "text": - return value?.toString() ?? "-" - case "code": - case "regex": - return value?.toString() ?? "-" - case "object": - return typeof value === "object" - ? JSON.stringify(value, null, 2) - : (value?.toString() ?? "-") - case "messages": - return Array.isArray(value) - ? value - .map((msg) => (typeof msg === "string" ? msg : JSON.stringify(msg))) - .join("\n") - : (value?.toString() ?? "-") - case "multiple_choice": - return Array.isArray(value) ? value.join(", ") : (value?.toString() ?? "-") - case "hidden": - return "-" - default: - return value?.toString() ?? "-" - } -} - -type CellDataType = "number" | "text" | "date" -export function getFilterParams(type: CellDataType) { - const filterParams: GenericObject = {} - if (type == "date") { - filterParams.comparator = function ( - filterLocalDateAtMidnight: Date, - cellValue: string | null, - ) { - if (cellValue == null) return -1 - const cellDate = dayjs(cellValue).startOf("day").toDate() - if (filterLocalDateAtMidnight.getTime() === cellDate.getTime()) { - return 0 - } - if (cellDate < filterLocalDateAtMidnight) { - return -1 - } - if (cellDate > filterLocalDateAtMidnight) { - return 1 - } - } - } - - return { - sortable: true, - floatingFilter: true, - filter: - type === "number" - ? "agNumberColumnFilter" - : type === "date" - ? "agDateColumnFilter" - : "agTextColumnFilter", - cellDataType: type === "number" ? "text" : type, - filterParams, - comparator: getCustomComparator(type), - } -} - -export const calcEvalDuration = (evaluation: _Evaluation) => { - return dayjs( - runningStatuses.includes(evaluation.status.value) ? Date.now() : evaluation.updated_at, - ).diff(dayjs(evaluation.created_at), "milliseconds") -} - -const getCustomComparator = (type: CellDataType) => (valueA: string, valueB: string) => { - const getNumber = (val: string) => { - const num = parseFloat(val || "0") - return isNaN(num) ? 0 : num - } - - valueA = String(valueA) - valueB = String(valueB) - - switch (type) { - case "date": - return dayjs(valueA).diff(dayjs(valueB)) - case "text": - return valueA.localeCompare(valueB) - case "number": - return getNumber(valueA) - getNumber(valueB) - default: - return 0 - } -} - -export const removeCorrectAnswerPrefix = (str: string) => { - return str.replace(/^correctAnswer_/, "") -} - -export const mapTestcaseAndEvalValues = ( - settingsValues: Record, - selectedTestcase: Record, -) => { - const testcaseObj: Record = {} - const evalMapObj: Record = {} - - Object.entries(settingsValues).forEach(([key, value]) => { - if (typeof value === "string" && value.startsWith("testcase.")) { - testcaseObj[key] = selectedTestcase[value.split(".")[1]] - } else { - evalMapObj[key] = value - } - }) - - return {testcaseObj, evalMapObj} -} - -export const transformTraceKeysInSettings = ( - settingsValues: Record, -): Record => { - return Object.keys(settingsValues).reduce( - (acc, curr) => { - if ( - !acc[curr] && - typeof settingsValues[curr] === "string" && - settingsValues[curr].startsWith("trace.") - ) { - acc[curr] = settingsValues[curr].replace("trace.", "") - } else { - acc[curr] = settingsValues[curr] - } - - return acc - }, - {} as Record, - ) -} - -export const getEvaluatorTags = () => { - const evaluatorTags = [ - { - label: "Classifiers", - value: "classifiers", - }, - { - label: "Similarity", - value: "similarity", - }, - { - label: "AI / LLM", - value: "ai_llm", - }, - { - label: "Functional", - value: "functional", - }, - ] - - if (isDemo()) { - evaluatorTags.unshift({ - label: "RAG", - value: "rag", - }) - } - - return evaluatorTags -} - -export const calculateAvgScore = (evaluation: SingleModelEvaluationListTableDataType) => { - let score = 0 - if (evaluation.scoresData) { - score = - ((evaluation.scoresData.correct?.length || evaluation.scoresData.true?.length || 0) / - evaluation.scoresData.nb_of_rows) * - 100 - } else if (evaluation.resultsData) { - const multiplier = { - [EvaluationType.auto_webhook_test]: 100, - [EvaluationType.single_model_test]: 1, - } - score = calculateResultsDataAvg( - evaluation.resultsData, - multiplier[evaluation.evaluationType as keyof typeof multiplier], - ) - score = isNaN(score) ? 0 : score - } else if (evaluation.avgScore) { - score = evaluation.avgScore * 100 - } - - return score -} diff --git a/web/oss/src/lib/helpers/isEE.ts b/web/oss/src/lib/helpers/isEE.ts deleted file mode 100644 index d720297fc5..0000000000 --- a/web/oss/src/lib/helpers/isEE.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {getEnv} from "./dynamicEnv" - -export const isEE = () => { - const license = getEnv("NEXT_PUBLIC_AGENTA_LICENSE")?.toLowerCase() - - if (!license) return false - - return license === "ee" || license.startsWith("cloud") -} diff --git a/web/oss/src/lib/helpers/llmProviders.ts b/web/oss/src/lib/helpers/llmProviders.ts index 7d307d994c..ccde79ce89 100644 --- a/web/oss/src/lib/helpers/llmProviders.ts +++ b/web/oss/src/lib/helpers/llmProviders.ts @@ -1,4 +1,4 @@ -import {StandardSecretDTO, CustomSecretDTO, SecretDTOKind, PROVIDER_KINDS} from "../Types" +import {StandardSecretDTO, CustomSecretDTO, SecretDTOKind} from "../Types" export const llmAvailableProvidersToken = "llmAvailableProvidersToken" @@ -10,12 +10,9 @@ export interface LlmProvider { apiKey?: string apiBaseUrl?: string version?: string - region?: string - vertexProject?: string - vertexLocation?: string - vertexCredentials?: string accessKeyId?: string accessKey?: string + region?: string sessionToken?: string models?: string[] modelKeys?: string[] @@ -65,13 +62,10 @@ export const transformSecret = (secrets: CustomSecretDTO[] | StandardSecretDTO[] provider: secret.data?.kind, apiKey: secret.data.provider.extras?.api_key || "", apiBaseUrl: secret.data.provider.url || "", - region: secret.data.provider.extras?.aws_region_name || "", - vertexProject: secret.data.provider.extras?.vertex_ai_project || "", - vertexLocation: secret.data.provider.extras?.vertex_ai_location || "", - vertexCredentials: secret.data.provider.extras?.vertex_ai_credentials || "", accessKeyId: secret.data.provider.extras?.aws_access_key_id || "", accessKey: secret.data.provider.extras?.aws_secret_access_key || "", sessionToken: secret.data.provider.extras?.aws_session_token || "", + region: secret.data.provider.extras?.aws_region_name || "", models: secret?.data.models.map((model) => model.slug), modelKeys: secret?.data.model_keys, version: secret.data.provider?.version || "", @@ -90,21 +84,14 @@ export const llmAvailableProviders: LlmProvider[] = [ {title: "Anyscale", key: "", name: "ANYSCALE_API_KEY"}, {title: "Perplexity AI", key: "", name: "PERPLEXITYAI_API_KEY"}, {title: "DeepInfra", key: "", name: "DEEPINFRA_API_KEY"}, - {title: "Together AI", key: "", name: "TOGETHERAI_API_KEY"}, + {title: "TogetherAI", key: "", name: "TOGETHERAI_API_KEY"}, {title: "Aleph Alpha", key: "", name: "ALEPHALPHA_API_KEY"}, {title: "OpenRouter", key: "", name: "OPENROUTER_API_KEY"}, {title: "Groq", key: "", name: "GROQ_API_KEY"}, - {title: "Google Gemini", key: "", name: "GEMINI_API_KEY"}, + {title: "Gemini", key: "", name: "GEMINI_API_KEY"}, ] export const transformCustomProviderPayloadData = (values: LlmProvider) => { - const providerInput = values.provider?.trim() ?? "" - const providerKind = providerInput - ? (PROVIDER_KINDS[providerInput] ?? - PROVIDER_KINDS[providerInput.toLowerCase()] ?? - providerInput.toLowerCase()) - : "" - return { header: { name: values.name, @@ -113,19 +100,16 @@ export const transformCustomProviderPayloadData = (values: LlmProvider) => { secret: { kind: SecretDTOKind.CUSTOM_PROVIDER_KEY, data: { - kind: providerKind, + kind: values.provider?.toLowerCase(), provider: { url: values.apiBaseUrl, version: values.version, extras: { - api_key: values.apiKey, - vertex_ai_location: values.vertexLocation, - vertex_ai_project: values.vertexProject, - vertex_ai_credentials: values.vertexCredentials, - aws_region_name: values.region, aws_access_key_id: values.accessKeyId, aws_secret_access_key: values.accessKey, aws_session_token: values.sessionToken, + api_key: values.apiKey, + aws_region_name: values.region, }, }, models: values.models?.map((slug) => ({slug})), diff --git a/web/oss/src/lib/helpers/observability_helpers.ts b/web/oss/src/lib/helpers/observability_helpers.ts index b02ed174a4..e52c151a81 100644 --- a/web/oss/src/lib/helpers/observability_helpers.ts +++ b/web/oss/src/lib/helpers/observability_helpers.ts @@ -1,5 +1,4 @@ -import {isDraft, isDraftable} from "immer" - +import {TracesWithAnnotations} from "@/oss/components/pages/observability/ObservabilityDashboard" import { _AgentaRootsResponse, AgentaNodeDTO, @@ -7,66 +6,34 @@ import { } from "@/oss/services/observability/types" import {uuidToSpanId, uuidToTraceId} from "../hooks/useAnnotations/assets/helpers" -import {TraceSpanNode} from "@/oss/services/tracing/types" -import {sortSpansByStartTime} from "./tracing" - -const normalizeContentFields = (obj: any): void => { - if (Array.isArray(obj)) { - obj.forEach(normalizeContentFields) - return - } - - if (obj && typeof obj === "object") { - for (const [key, value] of Object.entries(obj)) { - if ( - key === "content" && - Array.isArray(value) && - value.length === 1 && - value[0]?.type === "text" - ) { - if (Array.isArray(obj[key])) { - for (const item of obj[key]) { - normalizeContentFields(item) - } - } else { - obj[key] = value[0].text - } - } else { - normalizeContentFields(value) - } - } - } -} export const observabilityTransformer = ( item: AgentaTreeDTO | AgentaNodeDTO, ): _AgentaRootsResponse[] => { const buildData = (node: AgentaNodeDTO) => { - normalizeContentFields(node) - - const key = node?.node?.id || node?.span_id - const hasChildren = node?.nodes && Object.keys(node.nodes).length > 0 + const key = node.node.id + const hasChildren = node.nodes && Object.keys(node.nodes).length > 0 return { ...node, key, // Added annotation here to make the clean up version of the annotations feature invocationIds: { - trace_id: uuidToTraceId(node?.root?.id) || node?.trace_id, - span_id: uuidToSpanId(node?.node?.id) || node?.span_id, + trace_id: uuidToTraceId(node.root.id), + span_id: uuidToSpanId(node.node.id), }, ...(hasChildren ? {children: observabilityTransformer(node)} : undefined), } } if (item.nodes) { - const children = Object.entries(item.nodes) + return Object.entries(item.nodes) .flatMap(([_, value]) => { if (Array.isArray(value)) { - return value.map((childNode, index) => + return value.map((item, index) => buildData({ - ...childNode, - node: {...childNode.node, name: `${childNode.node.name}[${index}]`}, + ...item, + node: {...item.node, name: `${item.node.name}[${index}]`}, }), ) } else { @@ -74,24 +41,21 @@ export const observabilityTransformer = ( } }) .filter((node): node is _AgentaRootsResponse => node !== null && node !== undefined) - - // Sort children at this hierarchy level by start_time - return sortSpansByStartTime(children) } return [] } export const buildNodeTree = ({parent, ...node}: AgentaNodeDTO) => ({ - tree: node?.tree?.id || node?.trace_id, + tree: node.tree.id, nodes: [{...node}], }) export const getNodeById = ( - nodes: TraceSpanNode[] | TraceSpanNode, + nodes: TracesWithAnnotations[] | TracesWithAnnotations, id: string, -): TraceSpanNode | null => { - if (nodes && !Array.isArray(nodes) && nodes.span_id === id) { +): TracesWithAnnotations | null => { + if (nodes && !Array.isArray(nodes) && nodes.key === id) { return nodes } @@ -99,7 +63,7 @@ export const getNodeById = ( for (const value of Object.values(nodes)) { if (Array.isArray(value)) { for (const node of value) { - if (node.span_id === id) { + if (node.key === id) { return node } @@ -109,7 +73,7 @@ export const getNodeById = ( } } } else { - if (value.span_id === id) { + if (value.key === id) { return value } diff --git a/web/oss/src/lib/helpers/serviceValidations.ts b/web/oss/src/lib/helpers/serviceValidations.ts deleted file mode 100644 index 6e86ae9e39..0000000000 --- a/web/oss/src/lib/helpers/serviceValidations.ts +++ /dev/null @@ -1,17 +0,0 @@ -const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i -const MONGO_OBJECT_ID_RE = /^[0-9a-f]{24}$/i - -export function isValidId(id: unknown): id is string { - if (typeof id !== "string") return false - const s = id.trim() - if (!s) return false - if (s.includes("/") || s.includes("\\") || s.includes("..")) return false - return UUID_RE.test(s) || MONGO_OBJECT_ID_RE.test(s) -} - -export function assertValidId(id: unknown, label = "id"): string { - if (!isValidId(id)) { - throw new TypeError(`Invalid ${label}: must be a UUID or 24-hex ObjectId`) - } - return (id as string).trim() -} diff --git a/web/oss/src/lib/helpers/traceUtils.ts b/web/oss/src/lib/helpers/traceUtils.ts deleted file mode 100644 index 536a7b5bc6..0000000000 --- a/web/oss/src/lib/helpers/traceUtils.ts +++ /dev/null @@ -1,216 +0,0 @@ -import {uuidToTraceId} from "@/oss/lib/hooks/useAnnotations/assets/helpers" - -import {TraceData, TraceTree} from "@agenta/oss/src/lib/hooks/useEvaluationRunScenarioSteps/types" - -export function findTraceForStep(traces: any[] | undefined, traceId?: string): any | undefined { - if (!traces?.length || !traceId) return undefined - const noDash = uuidToTraceId(traceId) - - return traces.find((t) => { - // Case 1: wrapper with trees array (new shape) - if (t?.trees?.length) { - const firstTree = t.trees[0] - if (firstTree?.tree?.id === traceId) return true - if (firstTree?.nodes?.[0]?.trace_id === noDash) return true - } - // Case 2: flat shape { tree, nodes } - if (t?.tree?.id === traceId) return true - if (t?.nodes?.[0]?.trace_id === noDash) return true - return false - }) -} - -// generic safe path resolver -export function resolvePath(obj: any, path: string): any { - const parts = path.split(".") - let current: any = obj - for (let i = 0; i < parts.length && current !== undefined; i++) { - const key = parts[i] - if (key in current) { - current = current[key] - continue - } - // if the exact key not found, try joining the remaining parts as a whole key (to support dots inside actual key names) - const remainder = parts.slice(i).join(".") - if (remainder in current) { - current = current[remainder] - return current - } - return undefined - } - return current -} - -// Unified helper to obtain trace and response value for a specific invocation step -// Manual mapping for legacy/compatibility keys to canonical keys -const INVOCATION_OUTPUT_KEY_MAP: Record = { - "attributes.ag.data.outputs": "data.outputs", - "attributes.ag.data": "data", - // Add more mappings here if needed -} - -export function readInvocationResponse({ - scenarioData, - stepKey, - path, - optimisticResult, - forceTrace, - scenarioId, - evalType, -}: { - scenarioData: any - stepKey: string - path?: string - optimisticResult?: any - forceTrace?: TraceTree - scenarioId?: string - evalType?: "auto" | "online" | "human" -}): {trace?: any; value?: any; rawValue?: any; testsetId?: string; testcaseId?: string} { - if (!scenarioData) return {} - - const invocationSteps: any[] = Array.isArray(scenarioData.invocationSteps) - ? scenarioData.invocationSteps - : [] - const stepByKey = stepKey ? invocationSteps.find((s: any) => s?.stepKey === stepKey) : undefined - const stepByScenario = - !stepByKey && scenarioId - ? invocationSteps.find((s: any) => s?.scenarioId === scenarioId) - : undefined - const invocationStep = stepByKey ?? stepByScenario ?? invocationSteps[0] - const effectiveStepKey = invocationStep?.stepKey ?? stepKey - - // --- PATH RESOLUTION LOGIC --- - const candidatePaths: string[] = [] - const registerPath = (targetPath?: string) => { - if (!targetPath || typeof targetPath !== "string") return - const trimmed = targetPath.trim() - if (!trimmed) return - candidatePaths.push(trimmed) - const canonical = INVOCATION_OUTPUT_KEY_MAP[trimmed] - if (canonical) { - candidatePaths.push(canonical) - } - if (trimmed === "attributes.ag.data.outputs") { - candidatePaths.push("attributes.ag.data.outputs.outputs") - candidatePaths.push("data.outputs") - candidatePaths.push("outputs") - } else if (trimmed.startsWith("attributes.ag.data.outputs.")) { - const suffix = trimmed.slice("attributes.ag.data.outputs.".length) - if (suffix) { - candidatePaths.push(`data.outputs.${suffix}`) - candidatePaths.push(`outputs.${suffix}`) - } - } else if (trimmed.startsWith("data.outputs.")) { - const suffix = trimmed.slice("data.outputs.".length) - if (suffix) { - candidatePaths.push(`outputs.${suffix}`) - } - } - } - - if (path) { - registerPath(path) - } - - if (scenarioData.mappings && Array.isArray(scenarioData.mappings) && effectiveStepKey) { - const mapEntry = scenarioData.mappings.find((m: any) => m.step?.key === effectiveStepKey) - if (mapEntry?.step?.path) { - registerPath(mapEntry.step.path) - } - } - - if (!candidatePaths.length) { - registerPath("attributes.ag.data.outputs") - } - - const resolvedCandidates = Array.from( - new Set(candidatePaths.filter((p): p is string => typeof p === "string" && p.length)), - ) - // --- END PATH RESOLUTION LOGIC --- - - // --- MAPPING LOGIC FOR TESTSET/TESTCASE INFERENCE --- - let testsetId: string | undefined = undefined - let testcaseId: string | undefined = undefined - if (scenarioData.mappings && Array.isArray(scenarioData.mappings) && effectiveStepKey) { - const mapping = scenarioData.mappings.find( - (m: any) => - m.invocationStep?.stepKey === effectiveStepKey || - m.step?.stepKey === effectiveStepKey, - ) - if (mapping && mapping.inputStep?.stepKey) { - const inputStep = scenarioData.inputSteps?.find( - (s: any) => s.stepKey === mapping.inputStep.stepKey, - ) - if (inputStep) { - testsetId = inputStep.testsetId - testcaseId = inputStep.testcaseId - } - } - } - // ----------------------------------------------------- - - // Access trace directly attached to the invocation step (set during enrichment) - const invocationTrace = forceTrace || invocationStep?.trace - const candidateNodes: any[] = [] - if (invocationTrace) { - if (Array.isArray(invocationTrace?.nodes)) { - candidateNodes.push(...invocationTrace.nodes) - } - if (Array.isArray(invocationTrace?.tree?.nodes)) { - candidateNodes.push(...invocationTrace.tree.nodes) - } - if (invocationTrace?.tree) { - candidateNodes.push(invocationTrace.tree) - } - candidateNodes.push(invocationTrace) - } - const primaryNode = candidateNodes[0] - const trace = - Array.isArray(candidateNodes) && candidateNodes.length ? candidateNodes[0] : undefined - - // First priority: optimistic result override (e.g., UI enqueue) - let rawValue = optimisticResult - - if (rawValue === undefined && resolvedCandidates.length) { - const sources = [ - ...candidateNodes, - invocationStep?.data, - invocationStep?.result, - invocationStep, - ].filter(Boolean) - - for (const candidate of resolvedCandidates) { - for (const source of sources) { - const resolved = resolvePath(source, candidate) - if (resolved !== undefined) { - rawValue = resolved - break - } - } - if (rawValue !== undefined) { - break - } - } - } - - // Convert raw value to displayable string where possible - let value: any = rawValue - if ( - typeof rawValue === "string" || - typeof rawValue === "number" || - typeof rawValue === "boolean" - ) { - value = String(rawValue) - } else if (rawValue && typeof rawValue === "object") { - if (typeof (rawValue as any).content === "string") { - value = (rawValue as any).content - } else { - try { - value = JSON.stringify(rawValue, null, 2) - } catch { - value = String(rawValue as any) - } - } - } - return {trace, value, rawValue, testsetId, testcaseId} -} diff --git a/web/oss/src/lib/helpers/tracing.ts b/web/oss/src/lib/helpers/tracing.ts deleted file mode 100644 index 3bd829041e..0000000000 --- a/web/oss/src/lib/helpers/tracing.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Sorts an array of spans by their start_time in ascending order (earliest first). - * - * This function ensures hierarchical tree structures display spans in chronological order. - * It only sorts spans at the same level - parent/child relationships are maintained. - * - * Sorting logic: - * - Primary: start_time (ascending - earliest first) - * - Secondary: span_id (for concurrent spans with identical start times) - * - Spans without start_time are placed at the end - * - * @param spans - Array of spans to sort - * @returns New sorted array (does not mutate input) - */ -export const sortSpansByStartTime = ( - spans: T[], -): T[] => { - return [...spans].sort((a, b) => { - const aTime = a.start_time - const bTime = b.start_time - - // Handle missing start_time - push to end - if (!aTime && !bTime) return 0 - if (!aTime) return 1 - if (!bTime) return -1 - - // Convert to milliseconds for comparison - const aMs = typeof aTime === "number" ? aTime : new Date(aTime).getTime() - const bMs = typeof bTime === "number" ? bTime : new Date(bTime).getTime() - - // Primary sort: by start_time - if (aMs !== bMs) { - return aMs - bMs - } - - // Secondary sort: by span_id for concurrent spans - const aId = a.span_id || "" - const bId = b.span_id || "" - return aId.localeCompare(bId) - }) -} diff --git a/web/oss/src/lib/helpers/url.ts b/web/oss/src/lib/helpers/url.ts deleted file mode 100644 index 579fd74570..0000000000 --- a/web/oss/src/lib/helpers/url.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const sanitizeRevisionIds = (ids: (string | null | undefined)[]): string[] => { - const filtered = (ids || []) - .map((id) => (typeof id === "string" ? id.trim() : id)) - .filter((id): id is string => !!id && id !== "null" && id !== "undefined") - return Array.from(new Set(filtered)) -} - -export const buildRevisionsQueryParam = ( - ids: (string | null | undefined)[], -): string | undefined => { - const clean = sanitizeRevisionIds(ids) - return clean.length ? JSON.stringify(clean) : undefined -} diff --git a/web/oss/src/lib/helpers/useSubscriptionDataWrapper.ts b/web/oss/src/lib/helpers/useSubscriptionDataWrapper.ts index f334db6ed1..9e5a57458d 100644 --- a/web/oss/src/lib/helpers/useSubscriptionDataWrapper.ts +++ b/web/oss/src/lib/helpers/useSubscriptionDataWrapper.ts @@ -1,24 +1,9 @@ -import {isDemo} from "./utils" - -const DEFAULT_SUBSCRIPTION_STATE = { - subscription: undefined, - isSubLoading: false, - mutateSubscription: () => undefined, - error: undefined, - isError: false, - isSuccess: false, -} as const - export function useSubscriptionDataWrapper() { - if (!isDemo()) { - return DEFAULT_SUBSCRIPTION_STATE - } - try { // eslint-disable-next-line @typescript-eslint/no-require-imports const mod = require("@/agenta-oss-common/services/billing") return mod.useSubscriptionData() } catch { - return DEFAULT_SUBSCRIPTION_STATE + return {subscription: undefined} } } diff --git a/web/oss/src/lib/helpers/utils.ts b/web/oss/src/lib/helpers/utils.ts index 85e57051a8..91095a8214 100644 --- a/web/oss/src/lib/helpers/utils.ts +++ b/web/oss/src/lib/helpers/utils.ts @@ -9,26 +9,20 @@ import {v4 as uuidv4} from "uuid" import {tryParsePartialJson} from "@/oss/components/Editor/plugins/code/tryParsePartialJson" import {LlmProvider} from "@/oss/lib/helpers/llmProviders" -import {waitForValidURL} from "@/oss/state/url" import {EvaluationType} from "../enums" import {GenericObject} from "../Types" import {getEnv} from "./dynamicEnv" import {getErrorMessage} from "./errorHandler" -import {isEE} from "./isEE" if (typeof window !== "undefined") { - // @ts-ignore + //@ts-ignore if (!window.Cypress) { dayjs.extend(utc) } } -export const isDemo = () => { - return isEE() -} - export const renameVariables = (name: string) => { if (name === "inputs") { return "Prompt Variables" @@ -79,6 +73,16 @@ export const capitalize = (s: string) => { .join(" ") } +export const randString = (len = 8) => + window + .btoa( + Array.from(window.crypto.getRandomValues(new Uint8Array(len * 2))) + .map((b) => String.fromCharCode(b)) + .join(""), + ) + .replace(/[+/]/g, "") + .substring(0, len) + export const isAppNameInputValid = (input: string) => { return /^[a-zA-Z0-9_-]+$/.test(input) } @@ -108,6 +112,13 @@ export const stringToNumberInRange = (text: string, min: number, max: number) => return result } +export const isDemo = () => { + if (getEnv("NEXT_PUBLIC_AGENTA_LICENSE")) { + return ["cloud", "ee", "cloud-dev"].includes(getEnv("NEXT_PUBLIC_AGENTA_LICENSE")) + } + return false +} + export const removeKeys = (obj: GenericObject, keys: string[]) => { const newObj = Object.assign({}, obj) for (const key of keys) { @@ -182,6 +193,16 @@ const formatMessages = (messages: any) => { : [] } +export const getAgentaApiUrl = () => { + const apiUrl = getEnv("NEXT_PUBLIC_AGENTA_API_URL") + + if (!apiUrl && typeof window !== "undefined") { + return `${window.location.protocol}//${window.location.hostname}` + } + + return apiUrl +} + export function promisifyFunction(fn: Function, ...args: any[]) { return async () => { return fn(...args) @@ -269,7 +290,9 @@ export const shortPoll = ( const executor = async () => { while (shouldContinue && Date.now() - startTime < timeoutMs) { - await func() + try { + await func() + } catch {} await delay(delayMs) } if (Date.now() - startTime >= timeoutMs) throw new Error("timeout") @@ -338,9 +361,7 @@ export const redirectIfNoLLMKeys = async ({secrets: providerKeys}: {secrets: Llm description: "Please provide at least one LLM key to access this feature.", duration: 5, }) - // Ensure project-scoped URL is ready, then redirect to project settings (secrets tab) - const {projectURL} = await waitForValidURL({requireProject: true}) - Router.push(`${projectURL}/settings?tab=secrets`) + Router.push("/settings?tab=secrets") return true } return false @@ -411,7 +432,6 @@ export const formatVariantIdWithHash = (variantId: string) => { export const collectKeyPathsFromObject = (obj: any, prefix = ""): string[] => { const paths: string[] = [] - if (!obj || typeof obj !== "object") return paths for (const [key, value] of Object.entries(obj)) { const fullPath = prefix ? `${prefix}.${key}` : key @@ -455,20 +475,6 @@ export const removeEmptyFromObjects = (obj: any): any => { return obj } -export const isUuid = (id: string) => { - // Check for full UUID format (8-4-4-4-12) - const fullUuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i - // Check for just the last segment of a UUID (12 hex characters) - const uuidSegmentRegex = /^[0-9a-f]{12}$/i - - return fullUuidRegex.test(id) || uuidSegmentRegex.test(id) -} - -export const getUniquePartOfId = (id: string) => { - const parts = id.split("-") - return parts[parts.length - 1] -} - export const convertToStringOrJson = (value: any) => { return typeof value === "string" ? value : JSON.stringify(value) } diff --git a/web/oss/src/lib/helpers/variantHelper.ts b/web/oss/src/lib/helpers/variantHelper.ts index a9833630e7..967618d75e 100644 --- a/web/oss/src/lib/helpers/variantHelper.ts +++ b/web/oss/src/lib/helpers/variantHelper.ts @@ -64,6 +64,7 @@ export const getAllVariantParameters = async ( "variant" in _variant && _variant.variant ? _variant.variant : (_variant as Variant) try { + console.log("getAllVariantParameters !!") const {initOptParams, inputParams, isChatVariant} = await fetchVariantParametersFromOpenAPI( appId, variant.variantId, @@ -93,6 +94,7 @@ export const getAllVariantParameters = async ( } export const getVariantInputParameters = async (appId: string, variant: Variant) => { + console.log("getVariantInputParameters") const {parameters, inputs} = await getAllVariantParameters(appId, variant) return updateInputParams(parameters, inputs || []) || inputs } @@ -111,35 +113,26 @@ export const variantNameWithRev = (variant: { export const groupVariantsByParent = (variants: Variant[], showOnlyParents = false) => { const parentMap = {} - variants.forEach((item) => { - if (item._parentVariant) { - const parentId = - typeof item._parentVariant === "string" - ? item._parentVariant - : item._parentVariant.id - - if (!parentMap[parentId]) { - parentMap[parentId] = { - id: parentId, - name: item.variantName, - variantName: item.variantName, - variantId: item.variantId, - // fallback values; detailed parent info should be fetched via selectors - revision: item.revision ?? 0, - createdAt: item.createdAt, - updatedAt: item.updatedAt ?? item.createdAt, - createdBy: item.createdBy, - children: showOnlyParents ? undefined : [], - revisions: [], + variants + ?.sort((a, b) => b.createdAtTimestamp - a.createdAtTimestamp) + .forEach((item) => { + if (item._parentVariant) { + const parentId = item._parentVariant.id + + if (!parentMap[parentId]) { + parentMap[parentId] = { + ...item._parentVariant, + children: showOnlyParents ? undefined : [], + revisions: [], + } } - } - if (!showOnlyParents) { - parentMap[parentId].children.push(item) + if (!showOnlyParents) { + parentMap[parentId].children.push(item) + } + parentMap[parentId].revisions.push(item) } - parentMap[parentId].revisions.push(item) - } - }) + }) return Object.values(parentMap) } diff --git a/web/oss/src/lib/hooks/useAnnotations/assets/helpers.ts b/web/oss/src/lib/hooks/useAnnotations/assets/helpers.ts index 600d55126a..c64cfa886e 100644 --- a/web/oss/src/lib/hooks/useAnnotations/assets/helpers.ts +++ b/web/oss/src/lib/hooks/useAnnotations/assets/helpers.ts @@ -168,21 +168,11 @@ export const groupAnnotationsByReferenceId = ( export function attachAnnotationsToTraces(traces: any[], annotations: AnnotationDto[] = []) { function attach(trace: any): any { - const invocationIds = trace.invocationIds - - const matchingAnnotations = annotations.filter((annotation: AnnotationDto) => { - // Check if annotation links to this trace via ANY link key (including "invocation" and dynamic keys like "test-xxx") - if (annotation.links && typeof annotation.links === "object") { - const linkValues = Object.values(annotation.links) - return linkValues.some( - (link: any) => - link?.trace_id === (invocationIds?.trace_id || "") && - link?.span_id === (invocationIds?.span_id || ""), - ) - } - return false - }) - + const matchingAnnotations = annotations.filter( + (annotation: AnnotationDto) => + annotation.links?.invocation?.trace_id === (trace.invocationIds?.trace_id || "") && + annotation.links?.invocation?.span_id === (trace.invocationIds?.span_id || ""), + ) return { ...trace, annotations: matchingAnnotations, diff --git a/web/oss/src/lib/hooks/useAnnotations/index.ts b/web/oss/src/lib/hooks/useAnnotations/index.ts index e3b14dd40c..2243b5575d 100644 --- a/web/oss/src/lib/hooks/useAnnotations/index.ts +++ b/web/oss/src/lib/hooks/useAnnotations/index.ts @@ -1,8 +1,8 @@ import useSWR from "swr" +import {useOrgData} from "@/oss/contexts/org.context" +import {getCurrentProject} from "@/oss/contexts/project.context" import {queryAllAnnotations} from "@/oss/services/annotations/api" -import {useOrgData} from "@/oss/state/org" -import {getProjectValues} from "@/oss/state/project" import {transformApiData} from "./assets/transformer" import {AnnotationDto} from "./types" @@ -15,7 +15,7 @@ const useAnnotations = ({ waitUntil?: boolean } = {}) => { const {selectedOrg} = useOrgData() - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const workspace = selectedOrg?.default_workspace const members = workspace?.members || [] diff --git a/web/oss/src/lib/hooks/useAppVariantRevisions.ts b/web/oss/src/lib/hooks/useAppVariantRevisions.ts deleted file mode 100644 index 3d68c0c1bd..0000000000 --- a/web/oss/src/lib/hooks/useAppVariantRevisions.ts +++ /dev/null @@ -1,168 +0,0 @@ -import {useMemo} from "react" - -import {useQuery} from "@tanstack/react-query" -import {useAtomValue} from "jotai" - -import {formatDay, parseDate} from "@/oss/lib/helpers/dateTimeHelper" -import {adaptRevisionToVariant} from "@/oss/lib/shared/variant" -import {fetchRevisions} from "@/oss/lib/shared/variant/api" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import type { - ParentVariantObject, - RevisionObject, -} from "@/oss/lib/shared/variant/transformer/types/variant" -import type {Variant, ApiRevision} from "@/oss/lib/Types" -import {fetchVariants} from "@/oss/services/api" -import {projectIdAtom} from "@/oss/state/project/selectors/project" - -const REVISION_INPUT_FORMAT = "YYYY-MM-DD HH:mm:ss.SSSZ" - -const toParentVariant = (variant: Variant): ParentVariantObject => ({ - id: variant.variantId, - variantId: variant.variantId, - variantName: variant.variantName, - baseId: variant.baseId, - baseName: variant.baseName, - configName: variant.configName, - appId: variant.appId, - uri: variant.uri, - parameters: variant.parameters, - createdAtTimestamp: variant.createdAtTimestamp, - updatedAtTimestamp: variant.updatedAtTimestamp, - modifiedBy: variant.modifiedBy, -}) - -const toRevisionObject = (revision: ApiRevision): RevisionObject => { - const parsedCreated = parseDate({date: revision.created_at, inputFormat: REVISION_INPUT_FORMAT}) - return { - id: revision.id, - revision: revision.revision, - config: revision.config, - createdAt: formatDay({ - date: revision.created_at, - inputFormat: REVISION_INPUT_FORMAT, - outputFormat: "DD MMM YYYY | h:mm a", - }), - createdAtTimestamp: parsedCreated.toDate().valueOf(), - updatedAtTimestamp: parsedCreated.toDate().valueOf(), - modifiedBy: revision.modified_by, - modifiedById: revision.modified_by, - commitMessage: revision.commit_message, - } -} - -const getRevisionNumber = (revision: EnhancedVariant | RevisionObject | ApiRevision): number => { - const value = - (revision as any).revision ?? - (revision as any).revisionNumber ?? - (revision as any).revision_label ?? - (revision as any).revisionLabel - const parsed = Number(value) - return Number.isNaN(parsed) ? 0 : parsed -} - -const buildEnhancedRevisions = async ( - variant: Variant, - projectId: string, -): Promise => { - const parent = toParentVariant(variant) - const revisions = await fetchRevisions(variant.variantId, projectId) - - if (!Array.isArray(revisions) || revisions.length === 0) { - const fallback: RevisionObject = { - id: variant.id || variant.variantId, - revision: variant.revision, - config: { - config_name: variant.configName, - parameters: variant.parameters, - }, - createdAt: variant.createdAt, - createdAtTimestamp: variant.createdAtTimestamp, - updatedAtTimestamp: variant.updatedAtTimestamp, - modifiedBy: variant.modifiedBy, - modifiedById: undefined, - commitMessage: variant.commitMessage, - } - const enhanced = adaptRevisionToVariant(fallback, parent) - enhanced.uri = variant.uri - enhanced.appId = variant.appId - enhanced.baseId = variant.baseId - enhanced.baseName = variant.baseName - enhanced.configName = variant.configName - enhanced.variantName = variant.variantName - enhanced.commitMessage = variant.commitMessage - enhanced.createdAt = variant.createdAt - enhanced.updatedAt = variant.updatedAt - enhanced.createdAtTimestamp = variant.createdAtTimestamp - enhanced.updatedAtTimestamp = variant.updatedAtTimestamp - return getRevisionNumber(enhanced) > 0 ? [enhanced] : [] - } - - return revisions - .map((revision) => { - const revisionObject = toRevisionObject(revision) - const enhanced = adaptRevisionToVariant(revisionObject, parent) - // Ensure core metadata is preserved - enhanced.uri = variant.uri - enhanced.appId = variant.appId - enhanced.baseId = variant.baseId - enhanced.baseName = variant.baseName - enhanced.configName = variant.configName - enhanced.variantName = variant.variantName - enhanced.commitMessage = revision.commit_message ?? enhanced.commitMessage - enhanced.createdAt = revisionObject.createdAt - enhanced.createdAtTimestamp = - revisionObject.createdAtTimestamp ?? variant.createdAtTimestamp - enhanced.updatedAtTimestamp = - revisionObject.updatedAtTimestamp ?? variant.updatedAtTimestamp - return getRevisionNumber(enhanced) > 0 ? enhanced : null - }) - .filter((rev): rev is EnhancedVariant => Boolean(rev)) -} - -export const useAppVariantRevisions = (appId?: string | null) => { - const projectId = useAtomValue(projectIdAtom) - - const query = useQuery({ - queryKey: ["appVariantRevisions", projectId, appId], - staleTime: 60_000, - enabled: Boolean(appId && projectId), - queryFn: async () => { - if (!appId || !projectId) return [] as EnhancedVariant[] - const variants = await fetchVariants(appId, false) - if (!variants.length) return [] - - const enhancedLists = await Promise.all( - variants.map((variant) => buildEnhancedRevisions(variant, projectId)), - ) - - return enhancedLists - .flat() - .sort((a, b) => (b.updatedAtTimestamp ?? 0) - (a.updatedAtTimestamp ?? 0)) - }, - }) - - const revisionMap = useMemo(() => { - const data = query.data ?? [] - return data.reduce>((acc, revision) => { - const key = revision.variantId - if (!acc[key]) { - acc[key] = [] - } - acc[key].push(revision) - return acc - }, {}) - }, [query.data]) - - const variants = query.data ?? [] - const isInitialLoading = query.isLoading || (!variants.length && (query.isFetching ?? false)) - - return { - variants, - revisionMap, - isLoading: isInitialLoading, - refetch: query.refetch, - } -} - -export default useAppVariantRevisions diff --git a/web/oss/src/lib/hooks/useBreadcrumbs.ts b/web/oss/src/lib/hooks/useBreadcrumbs.ts deleted file mode 100644 index ace4c83327..0000000000 --- a/web/oss/src/lib/hooks/useBreadcrumbs.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {useEffect} from "react" - -import {useSetAtom} from "jotai" - -import { - appendBreadcrumbAtom, - clearBreadcrumbsAtom, - prependBreadcrumbAtom, - setBreadcrumbsAtom, - type BreadcrumbAtom, -} from "@/oss/lib/atoms/breadcrumb" - -export const useBreadcrumbs = () => { - const setBreadcrumbs = useSetAtom(setBreadcrumbsAtom) - const appendBreadcrumb = useSetAtom(appendBreadcrumbAtom) - const prependBreadcrumb = useSetAtom(prependBreadcrumbAtom) - const clearBreadcrumbs = useSetAtom(clearBreadcrumbsAtom) - - return { - setBreadcrumbs, - appendBreadcrumb, - prependBreadcrumb, - clearBreadcrumbs, - } -} - -/** - * Hook to manage breadcrumbs with automatic cleanup on unmount - * - * @param {BreadcrumbAtom} breadcrumbs - Object containing breadcrumb items to set - * @param {'prepend' | 'append' | 'new'} [type='new'] - How to apply the breadcrumbs: - * - 'prepend': Add breadcrumbs before existing ones - * - 'append': Add breadcrumbs after existing ones - * - 'new': Replace all existing breadcrumbs (default) - * @param {boolean} [condition=true] - Whether to apply the breadcrumbs - * @param {React.DependencyList} deps - Dependencies array to re-run the effect when changed - */ -export const useBreadcrumbsEffect = ( - { - breadcrumbs = {}, - type = "new", - condition = true, - }: {breadcrumbs: BreadcrumbAtom; type?: "prepend" | "append" | "new"; condition?: boolean}, - deps: React.DependencyList = [], -) => { - const {setBreadcrumbs, clearBreadcrumbs, appendBreadcrumb, prependBreadcrumb} = useBreadcrumbs() - - useEffect(() => { - if (condition) { - if (type === "prepend") { - prependBreadcrumb(breadcrumbs) - } else if (type === "append") { - appendBreadcrumb(breadcrumbs) - } else { - setBreadcrumbs(breadcrumbs) - } - } - - // Cleanup: reset to URL-based breadcrumbs when component unmounts - return () => { - if (type === "new") { - clearBreadcrumbs() - } - } - }, deps) -} diff --git a/web/oss/src/lib/hooks/useEvalScenarioQueue/index.ts b/web/oss/src/lib/hooks/useEvalScenarioQueue/index.ts deleted file mode 100644 index 4250637c7d..0000000000 --- a/web/oss/src/lib/hooks/useEvalScenarioQueue/index.ts +++ /dev/null @@ -1,347 +0,0 @@ -import {useCallback, useEffect, useMemo, useRef} from "react" - -import {loadable} from "jotai/utils" - -// import {triggerScenarioRevalidation} from "@/oss/components/EvalRunDetails/assets/annotationUtils" -// import {getCurrentProject} from "@/oss/contexts/project.context" -// import {useAppId} from "@/oss/hooks/useAppId" -// import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -// import {evalAtomStore} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -// Import EE run-scoped atoms for multi-run support -import {triggerScenarioRevalidation} from "@/oss/components/EvalRunDetails/HumanEvalRun/assets/annotationUtils" -import {setOptimisticStepData} from "@/oss/components/EvalRunDetails/HumanEvalRun/assets/optimisticUtils" -import {useAppId} from "@/oss/hooks/useAppId" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {evaluationRunStateFamily} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runScopedAtoms" -import {useJwtRefresher} from "@/oss/lib/hooks/useJWT" -import {EvaluationStatus} from "@/oss/lib/Types" -import {slugify} from "@/oss/lib/utils/slugify" -import type {ConfigMessage, ResultMessage, RunEvalMessage} from "@/oss/lib/evalRunner/types" -import {getProjectValues} from "@/oss/state/project" - -// import {setOptimisticStepData} from "../../../components/EvalRunDetails/assets/optimisticUtils" -import {evalAtomStore} from "../useEvaluationRunData/assets/atoms" -import {triggerMetricsFetch} from "../useEvaluationRunData/assets/atoms/runScopedMetrics" -import {scenarioStepFamily} from "../useEvaluationRunData/assets/atoms/runScopedScenarios" -import {IInvocationStep} from "../useEvaluationRunScenarioSteps/types" - -import {BatchingQueue} from "./responseQueue" - -let sharedWorker: Worker | null = null -let isWorkerInitialized = false - -const MAX_RETRIES = 1 - -export function useEvalScenarioQueue(options?: {concurrency?: number; runId?: string}) { - const {jwt} = useJwtRefresher() - const {runId: optionsRunId} = options || {} - - /* -------- helpers that read atoms lazily -------- */ - const getRunMeta = useCallback(() => { - const store = evalAtomStore() - const effectiveRunId = optionsRunId - if (!effectiveRunId) { - console.warn("[useEvalScenarioQueue] No runId provided, cannot get run metadata") - return {runId: undefined, revision: undefined} - } - const runState = store.get(evaluationRunStateFamily(effectiveRunId)) - const run = runState?.enrichedRun - return { - runId: effectiveRunId, - revision: run?.variants?.[0], - } - }, [optionsRunId]) - - const workerRef = useRef(null) - const retryCountRef = useRef>(new Map()) - const abortedRef = useRef>(new Set()) - // New refs for timestamps and transitions - const timestampsRef = useRef>(new Map()) - const transitionsRef = useRef>(new Map()) - const appId = useAppId() - - // placeholder for batching queue ref – will init after handleResult - const queueRef = useRef>(undefined) - - // ---- handle single worker message ---- - const handleResult = useCallback( - (data: ResultMessage) => { - const {runId} = getRunMeta() - const {invocationStepTarget, invocationKey, scenarioId, status, result} = data - - if (abortedRef.current.has(scenarioId)) return - if (!invocationStepTarget) return - - if (status === EvaluationStatus.FAILURE) { - const retryCount = retryCountRef.current.get(scenarioId) ?? 0 - if (retryCount < MAX_RETRIES) { - if (!runId) return - const nextRetry = retryCount + 1 - retryCountRef.current.set(scenarioId, nextRetry) - setOptimisticStepData( - scenarioId, - [ - { - ...structuredClone(invocationStepTarget), - status: EvaluationStatus.RUNNING, - }, - ], - runId, - ) - - workerRef.current?.postMessage({ - type: "run-invocation", - jwt, - appId, - scenarioId, - runId, - requestBody: result?.requestBody ?? {}, - endpoint: result?.endpoint ?? "", - apiUrl: getAgentaApiUrl(), - projectId: getProjectValues().projectId, - invocationKey, - invocationStepTarget, - }) - return - } - } else { - retryCountRef.current.delete(scenarioId) - } - - try { - const optimisticData: IInvocationStep = { - ...structuredClone(invocationStepTarget), - status, - traceId: result.traceId, - } - - if ("invocationParameters" in invocationStepTarget) { - optimisticData.invocationParameters = - status === EvaluationStatus.SUCCESS - ? undefined - : (invocationStepTarget as IInvocationStep).invocationParameters - } - - if (runId) { - // Apply optimistic updates directly to maintain loading state continuity - setOptimisticStepData(scenarioId, [optimisticData], runId) - } - - // Delay the server revalidation to allow optimistic state to be visible - // This prevents immediate overwrite of the "running" status - triggerScenarioRevalidation(runId, scenarioId, [optimisticData]) - } catch (err) { - console.error("Failed to trigger scenario step refetch", err) - } - - const now = Date.now() - const existingTransitions = transitionsRef.current.get(scenarioId) ?? [] - transitionsRef.current.set(scenarioId, [ - ...existingTransitions, - {status, timestamp: now}, - ]) - const existingTimestamps = timestampsRef.current.get(scenarioId) ?? {} - if (status === "pending" && existingTimestamps.startedAt === undefined) { - timestampsRef.current.set(scenarioId, {...existingTimestamps, startedAt: now}) - } - if ( - (status === EvaluationStatus.SUCCESS || status === EvaluationStatus.FAILURE) && - existingTimestamps.endedAt === undefined - ) { - timestampsRef.current.set(scenarioId, {...existingTimestamps, endedAt: now}) - - // Trigger metrics refresh when scenario completes (success or failure) - if (runId) { - triggerMetricsFetch(runId) - } - } - }, - [jwt, retryCountRef, abortedRef, appId], - ) - - // initialize queue after we have stable handleResult - if (!queueRef.current) { - queueRef.current = new BatchingQueue((batch) => { - batch.forEach((item) => handleResult(item.payload)) - }) - } - - useEffect(() => { - if (!sharedWorker) { - sharedWorker = new Worker( - new URL("@/oss/lib/evalRunner/evalRunner.worker.ts", import.meta.url), - ) - } - - workerRef.current = sharedWorker - - if (!isWorkerInitialized) { - const concurrency = options?.concurrency ?? 5 - const configMsg: ConfigMessage = {type: "config", maxConcurrent: concurrency} - sharedWorker.postMessage(configMsg) - isWorkerInitialized = true - } - - sharedWorker.onmessage = (e: MessageEvent) => { - handleResult(e.data) - // if (e.data.type === "result") { - // queueRef.current?.push(e.data) - // } - } - }, [jwt, options?.concurrency, appId]) - - const enqueueScenario = useCallback( - (scenarioId: string, stepKey?: string) => { - const store = evalAtomStore() - // Use run-scoped atom - runId should always be available in EE version - if (!optionsRunId) { - console.warn( - "[useEvalScenarioQueue] No runId provided, cannot get scenario step data", - ) - return undefined - } - - const stepLoadable = store.get( - loadable(scenarioStepFamily({scenarioId, runId: optionsRunId})), - ) - - if (stepLoadable.state === "hasData") { - const stepData = stepLoadable.data - // use data safely here - const invSteps = stepData?.invocationSteps ?? [] - const target = stepKey - ? invSteps.find((s) => s.stepKey === stepKey) - : invSteps.find((s) => s.invocationParameters) - - if (!target?.invocationParameters) return - const {runId, revision} = getRunMeta() - if (!jwt || !runId) return - - const invocationSteps: any[] | undefined = stepData?.invocationSteps - let requestBody: any, endpoint: string | undefined - let invocationStepTarget: any | undefined - if (invocationSteps) { - if (stepKey) { - invocationStepTarget = invocationSteps.find((s) => s.stepKey === stepKey) - } else { - invocationStepTarget = invocationSteps.find((s) => s.invocationParameters) - } - if (invocationStepTarget?.invocationParameters) { - requestBody = structuredClone( - invocationStepTarget.invocationParameters?.requestBody, - ) - endpoint = invocationStepTarget.invocationParameters?.endpoint - } - } - // Optimistic running override using shared helper - queueMicrotask(() => { - setOptimisticStepData( - scenarioId, - [ - { - ...structuredClone(invocationStepTarget), - status: EvaluationStatus.RUNNING, - }, - ], - runId, - ) - }) - retryCountRef.current.set(scenarioId, 0) - abortedRef.current.delete(scenarioId) - - let invocationKey: string | undefined - if (revision) { - invocationKey = slugify( - revision.name ?? revision.variantName ?? "invocation", - revision.id, - ) - } - - // Append required references to invocation request body before sending to worker - // invocationStepTarget is defined above in this scope - try { - if (requestBody && typeof requestBody === "object") { - const references: Record = - (requestBody.references as any) || {} - - // Testset id – derive from graph: find input step with same testcaseId - let testsetId: string | undefined - const inputSteps: any[] | undefined = stepData?.inputSteps - if (Array.isArray(inputSteps) && invocationStepTarget) { - const matchingInput = inputSteps.find( - (s) => s.testcaseId === (invocationStepTarget as any).testcaseId, - ) - testsetId = - matchingInput?.testcase?.testset_id || - matchingInput?.references?.testset?.id || - matchingInput?.refs?.testset?.id - } - if (testsetId) { - references.testset = {id: testsetId} - } - - // Application related references - if (appId) references.application = {id: appId} - const variantId = revision?.variantId || revision?.id || undefined - if (variantId) references.application_variant = {id: String(variantId)} - if (revision?.id) - references.application_revision = {id: String(revision.id)} - - requestBody.references = references - } - } catch (err) { - console.error("Failed to append references to invocation payload", err) - } - - if (endpoint) { - const message: RunEvalMessage = { - type: "run-invocation", - appId: appId, - jwt, - scenarioId, - runId, - requestBody, - endpoint, - invocationKey, - invocationStepTarget, - apiUrl: getAgentaApiUrl(), - projectId: getProjectValues().projectId, - } - - workerRef.current?.postMessage(message) - - // Update timestamps and transitions on enqueue - const now = Date.now() - const existingTransitions = transitionsRef.current.get(scenarioId) ?? [] - transitionsRef.current.set(scenarioId, [ - ...existingTransitions, - {status: "pending", timestamp: now}, - ]) - const existingTimestamps = timestampsRef.current.get(scenarioId) ?? {} - if (existingTimestamps.startedAt === undefined) { - timestampsRef.current.set(scenarioId, { - ...existingTimestamps, - startedAt: now, - }) - } - } - } - }, - [jwt, getRunMeta], - ) - - const cancelScenario = useCallback((scenarioId: string) => { - if (process.env.NODE_ENV !== "production") { - console.debug(`[EvalQueue] Cancelling scenario ${scenarioId}`) - } - abortedRef.current.add(scenarioId) - }, []) - - return useMemo( - () => ({ - enqueueScenario, - cancelScenario, - }), - [enqueueScenario, cancelScenario], - ) -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/bulkFetch.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/bulkFetch.ts deleted file mode 100644 index 72163eae08..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/bulkFetch.ts +++ /dev/null @@ -1,114 +0,0 @@ -import {createStore} from "jotai" - -import {UseEvaluationRunScenarioStepsFetcherResult} from "../../../useEvaluationRunScenarioSteps/types" -import {fetchScenarioViaWorkerAndCache} from "../helpers/fetchScenarioViaWorker" - -import { - bulkStepsStatusFamily, - bulkStepsCacheFamily, - evaluationRunStateFamily, - enrichedRunFamily, -} from "./runScopedAtoms" - -/* - Bulk scenario-step prefetching for Evaluation Run screen. - Updated to work with run-scoped atom families instead of global atoms. - This allows multiple evaluation runs to have independent bulk fetch states. -*/ - -// Legacy exports for backward compatibility during migration -// These will be removed once all components are migrated -export const bulkStepsStatusAtom = bulkStepsStatusFamily("__legacy__") - -// Bulk fetch logic updated to work with run-scoped atom families -export async function runBulkFetch( - store: ReturnType, - runId: string, - scenarioIds: string[], - opts: { - force?: boolean - onComplete?: (map: Map) => void - silent?: boolean - } = {}, -): Promise> { - if (!scenarioIds || !scenarioIds.length) { - return new Map() - } - - const status = store.get(bulkStepsStatusFamily(runId)) - - if (!opts.force && (status === "loading" || status === "done")) { - const cachedData = store.get(bulkStepsCacheFamily(runId)) - - return cachedData - } - - const enrichedRun = store.get(enrichedRunFamily(runId)) - const evaluationRunState = store.get(evaluationRunStateFamily(runId)) - const runIndex = evaluationRunState?.runIndex - - // Validate scenario IDs and filter out skeleton/placeholder IDs - const validScenarioIds = scenarioIds.filter((id) => { - if (!id || typeof id !== "string") return false - - // Skip skeleton/placeholder IDs gracefully - if (id.startsWith("skeleton-") || id.startsWith("placeholder-")) { - return false - } - - const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i - return uuidRegex.test(id) - }) - - // Use filtered valid IDs - scenarioIds = validScenarioIds - - // Early return if no valid scenario IDs remain after filtering - if (scenarioIds.length === 0) { - return store.get(bulkStepsCacheFamily(runId)) - } - - if (!runId || !enrichedRun || !runIndex) { - return store.get(bulkStepsCacheFamily(runId)) - } - - if (!opts.silent) { - store.set(bulkStepsStatusFamily(runId), "loading") - } - // return - try { - const params = {runId, evaluation: enrichedRun, runIndex} - - const workerResult = - (await fetchScenarioViaWorkerAndCache(params, scenarioIds)) || new Map() - - // Write all results to the bulk cache atom at once - store.set(bulkStepsCacheFamily(runId), (draft) => { - const next = draft ? new Map(draft) : new Map() - for (const [scenarioId, scenarioSteps] of workerResult?.entries() || []) { - if (scenarioSteps) { - next.set(scenarioId, scenarioSteps) - } - } - return next - }) - - if (!opts.silent) { - store.set(bulkStepsStatusFamily(runId), "done") - } - - if (typeof opts.onComplete === "function") { - opts.onComplete(workerResult) - } - - return workerResult - } catch (err) { - console.error("[bulk-steps] bulk fetch ERROR", err) - if (!opts.silent) { - store.set(bulkStepsStatusFamily(runId), "error") - } - return store.get(bulkStepsCacheFamily(runId)) - } - - return store.get(bulkStepsCacheFamily(runId)) -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/index.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/index.ts deleted file mode 100644 index 474aab8bef..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {atom} from "jotai" - -// New run-scoped atoms -export * from "./runScopedAtoms" -export * from "./runScopedScenarios" - -// Migration helper for backward compatibility - only export specific functions -export {getCurrentRunId} from "./migrationHelper" - -// Legacy atoms and functions (for backward compatibility during migration) -import {evalAtomStore, initializeRun} from "./store" - -// re-export legacy store helpers (will be deprecated) -export {evalAtomStore, initializeRun} - -export * from "./utils" -export * from "./bulkFetch" -export * from "./progress" -export * from "./cache" diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/migrationHelper.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/migrationHelper.ts deleted file mode 100644 index 52e43467c5..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/migrationHelper.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Migration helper for gradual transition from global atoms to run-scoped atoms - * - * This provides compatibility layers that allow existing components to work - * while we gradually migrate them to use the new run-scoped atom families. - */ - -// Current active run ID - this is a temporary bridge during migration -let currentRunId: string | null = null - -export const getCurrentRunId = (): string => { - if (!currentRunId) { - throw new Error( - "No current run ID set. Make sure to call setCurrentRunId() before using legacy atoms.", - ) - } - return currentRunId -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/progress.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/progress.ts deleted file mode 100644 index bcf78a493b..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/progress.ts +++ /dev/null @@ -1,303 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {Atom, atom} from "jotai" -import {atomFamily, loadable, selectAtom} from "jotai/utils" -import {eagerAtom} from "jotai-eager" -import {atomWithImmer} from "jotai-immer" - -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" - -import {EvaluationLoadingState} from "../../types" -import {defaultLoadingState} from "../constants" - -// import {bulkStepsCacheAtom} from "./bulkFetch" - -import {evaluationRunStateFamily} from "./runScopedAtoms" -import { - displayedScenarioIdsFamily, - scenarioIdsFamily, - scenarioStepFamily, - scenarioStepLocalFamily, -} from "./runScopedScenarios" -import {ScenarioCounts, StatusCounters} from "./types" - -// ---------------- Shared counter helper ---------------- -const emptyCounters = (): StatusCounters => ({ - pending: 0, - running: 0, - completed: 0, - cancelled: 0, - unannotated: 0, - failed: 0, -}) - -const tallyStatus = (counters: StatusCounters, status: string): void => { - switch (status) { - case "pending": - case "revalidating": - counters.pending += 1 - break - case "running": - counters.running += 1 - break - case "success": - case "done": - counters.completed += 1 - break - case "incomplete": - counters.unannotated += 1 - break - case "failed": - case "failure": - case "error": - counters.failed += 1 - break - case "cancelled": - counters.cancelled += 1 - break - default: - counters.pending += 1 - } -} - -export const progressFamily = atomFamily( - (runId: string) => - eagerAtom((get) => { - const scenarios = get(evaluationRunStateFamily(runId)).scenarios || [] - const counters = emptyCounters() - - scenarios.forEach((s) => { - const statusLoadable = get( - loadable(scenarioStatusFamily({scenarioId: s.id, runId})), - ) - const status = - statusLoadable.state === "hasData" ? statusLoadable.data.status : "pending" - tallyStatus(counters, status) - }) - - const percentComplete = - counters.completed + counters.failed + counters.cancelled + counters.unannotated > 0 - ? Math.round((counters.completed / scenarios.length) * 100) - : 0 - - return { - total: scenarios.length, - pending: counters.pending, - inProgress: counters.running, - completed: counters.completed, - error: counters.failed, - cancelled: counters.cancelled, - percentComplete, - } - }), - deepEqual, -) - -export const loadingStateAtom = atomWithImmer(defaultLoadingState) - -// Run-scoped atom family to compute scenario step progress for displayedScenarioIds -export const scenarioStepProgressFamily = atomFamily( - (runId: string) => - atom((get) => { - const loadingStates = get(loadingStateAtom) - // If we're still fetching the evaluation or scenarios list, reflect that first - if ( - loadingStates.activeStep && - ["eval-run", "scenarios"].includes(loadingStates.activeStep) - ) { - return { - completed: 0, - total: 0, - percent: 0, - loadingStep: loadingStates.activeStep, - } - } - const loadableIds = get(loadable(displayedScenarioIdsFamily(runId))) - - if (loadableIds.state !== "hasData") { - return {completed: 0, total: 0, percent: 0, loadingStep: null} - } - const scenarioIds: string[] = Array.isArray(loadableIds.data) ? loadableIds.data : [] - const total = scenarioIds.length - - let completed = 0 - scenarioIds.forEach((scenarioId: string) => { - if (get(scenarioStepLocalFamily({runId, scenarioId}))) completed++ - }) - const percent = total > 0 ? Math.round((completed / total) * 100) : 0 - return { - completed, - total, - percent, - allStepsFetched: completed === total && total > 0, - loadingStep: completed < total ? "scenario-steps" : null, - } - }), - deepEqual, -) - -export const scenarioStatusFamily = atomFamily((params: {scenarioId: string; runId: string}) => { - return atom(async (get) => { - const data = await get(scenarioStepFamily(params)) - const evalType = get(evalTypeAtom) - - const normalizeStatus = (status: unknown) => { - if (typeof status === "string") return status.toLowerCase() - if (status === null || status === undefined) return "" - return String(status).toLowerCase() - } - - const hasStatus = (steps: any[] | undefined, matcher: (status: string) => boolean) => { - if (!Array.isArray(steps)) return false - return steps.some((step) => matcher(normalizeStatus(step?.status))) - } - - const everyStatus = (steps: any[] | undefined, matcher: (status: string) => boolean) => { - if (!Array.isArray(steps) || steps.length === 0) return false - return steps.every((step) => matcher(normalizeStatus(step?.status))) - } - - const isSuccessStatus = (status: string) => - status === "success" || - status === "succeeded" || - status === "successful" || - status === "completed" || - status === "complete" || - status === "done" || - status === "finished" - - const isFailureStatus = (status: string) => - status === "failure" || status === "failed" || status === "error" - - const isRunningStatus = (status: string) => - status === "running" || - status === "in_progress" || - status === "in progress" || - status === "processing" || - status === "queued" || - status === "started" || - status === "starting" - - const isAnnotatingStatus = (status: string) => status === "annotating" - const isRevalidatingStatus = (status: string) => status === "revalidating" - - const invocationSteps: any[] = Array.isArray(data?.invocationSteps) - ? data.invocationSteps - : [] - const annotationSteps: any[] = Array.isArray(data?.annotationSteps) - ? data.annotationSteps - : [] - - const isRunning = - hasStatus(data?.invocationSteps, isRunningStatus) || - hasStatus(data?.annotationSteps, isRunningStatus) || - hasStatus(data?.inputSteps, isRunningStatus) - - const isAnnotating = hasStatus(data?.annotationSteps, isAnnotatingStatus) - const isRevalidating = hasStatus(data?.annotationSteps, isRevalidatingStatus) - - // Determine scenario status based on step outcomes - let computedStatus = "pending" - const allInvSucceeded = everyStatus(invocationSteps, isSuccessStatus) - const allAnnSucceeded = everyStatus(annotationSteps, isSuccessStatus) - const anyFailed = - hasStatus(data?.invocationSteps, isFailureStatus) || - hasStatus(data?.annotationSteps, isFailureStatus) || - hasStatus(data?.inputSteps, isFailureStatus) - - if (isRunning) { - computedStatus = "running" - } else if (isAnnotating) { - computedStatus = "annotating" - } else if (isRevalidating) { - computedStatus = "revalidating" - } else if (allAnnSucceeded) { - computedStatus = "success" - } else if (allInvSucceeded) { - // Auto and online evals treat successful invocations as completion - const isAutoLikeEval = - evalType === "auto" || evalType === "online" || evalType === "custom" - computedStatus = isAutoLikeEval ? "success" : "incomplete" - } else if (anyFailed) { - computedStatus = "failure" - } else { - computedStatus = "pending" - } - - return { - status: computedStatus, - isAnnotating, - isRevalidating, - } - }) -}, deepEqual) - -export const scenarioStatusAtomFamily = atomFamily((params: {scenarioId: string; runId: string}) => - atom((get) => { - const loadableStatus = get(loadable(scenarioStatusFamily(params))) - return loadableStatus.state === "hasData" ? loadableStatus.data : {status: "pending"} - }), -) - -// Aggregate all scenario steps into a single object keyed by scenarioId (loadable) -// Convenience wrapper so components can safely read status without suspending -export const loadableScenarioStatusFamily = atomFamily( - (params: {scenarioId: string; runId: string}) => loadable(scenarioStatusFamily(params)), - deepEqual, -) - -// Lightweight UI flags derived from scenario status -export const scenarioUiFlagsFamily = atomFamily((params: {scenarioId: string; runId: string}) => { - return atom((get) => { - const statusLoadable = get(loadable(scenarioStatusFamily(params))) - if (statusLoadable.state !== "hasData") { - return {isAnnotating: false, isRevalidating: false} - } - const {isAnnotating, isRevalidating, status} = statusLoadable.data as any - return { - isAnnotating: isAnnotating ?? status === "annotating", - isRevalidating: isRevalidating ?? status === "revalidating", - } - }) -}, deepEqual) - -export const scenarioCountsFamily = atomFamily((runId: string) => { - return atom((get) => { - const ids = get(scenarioIdsFamily(runId)) - const c = emptyCounters() - for (const id of ids) { - const st = get(scenarioStatusAtomFamily({scenarioId: id, runId})) as any - tallyStatus(c, st?.status ?? "pending") - } - return { - total: ids.length, - pending: c.pending, - unannotated: c.unannotated, - failed: c.failed, - } - }) -}, deepEqual) - -// Run-scoped count atoms -export const pendingCountFamily = atomFamily((runId: string) => { - return selectAtom( - scenarioCountsFamily(runId), - (c) => c.pending, - deepEqual, - ) -}, deepEqual) - -export const unannotatedCountFamily = atomFamily((runId: string) => { - return selectAtom( - scenarioCountsFamily(runId), - (c) => c.unannotated, - deepEqual, - ) -}, deepEqual) - -export const failedCountFamily = atomFamily((runId: string) => { - return selectAtom( - scenarioCountsFamily(runId), - (c) => c.failed, - deepEqual, - ) -}, deepEqual) diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedAtoms.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedAtoms.ts deleted file mode 100644 index 73ab0aeeff..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedAtoms.ts +++ /dev/null @@ -1,106 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" -import {atomWithImmer} from "jotai-immer" - -import {UseEvaluationRunScenarioStepsFetcherResult} from "../../../useEvaluationRunScenarioSteps/types" -import {EvaluationRunState} from "../../types" -import {initialState} from "../constants" -import type {BasicStats} from "../types" - -/** - * Run-scoped atom families - * - * These atoms replace the global atoms that were previously tied to a single "active" run. - * Each atom family is keyed by runId, allowing multiple evaluation runs to coexist - * without interfering with each other. - */ - -// Core evaluation run state - replaces global evaluationRunStateAtom -export const evaluationRunStateFamily = atomFamily((runId: string) => { - if (runId === undefined || runId === null || runId === "") { - console.error(`[evaluationRunStateFamily] ERROR: Invalid runId received: ${runId}`) - console.trace("Stack trace for invalid runId:") - } - return atomWithImmer(initialState) -}, deepEqual) - -// Bulk fetch status - replaces global bulkStepsStatusAtom -export const bulkStepsStatusFamily = atomFamily( - (runId: string) => atom<"idle" | "loading" | "done" | "error">("idle"), - deepEqual, -) - -// Bulk fetch cache - replaces global bulkStepsCacheAtom -export const bulkStepsCacheFamily = atomFamily( - (runId: string) => atom>(new Map()), - deepEqual, -) - -// Bulk fetch requested flag - for tracking if bulk fetch has been initiated -export const bulkStepsRequestedFamily = atomFamily((runId: string) => atom(false), deepEqual) - -// Bulk started flag - guard so init fires once per run -export const bulkStartedFamily = atomFamily((runId: string) => atom(false), deepEqual) - -// Derived atoms that depend on run state -export const enrichedRunFamily = atomFamily( - (runId: string) => atom((get) => get(evaluationRunStateFamily(runId)).enrichedRun), - deepEqual, -) - -export const runIndexFamily = atomFamily( - (runId: string) => atom((get) => get(evaluationRunStateFamily(runId)).runIndex), - deepEqual, -) - -export const evaluationRunIdFamily = atomFamily( - (runId: string) => - atom(() => { - // Use runId directly since it's the identifier we need - return runId - }), - deepEqual, -) - -// Loading state family - replaces global loadingStateAtom -export const loadingStateFamily = atomFamily( - (runId: string) => - atomWithImmer({ - isLoadingEvaluation: false, - isLoadingScenarios: false, - isLoadingMetrics: false, - isRefreshingMetrics: false, - activeStep: null as string | null, - }), - deepEqual, -) - -// Run-scoped metric atom families - replaces global metric atoms -export const runMetricsRefreshFamily = atomFamily((runId: string) => atom(0), deepEqual) - -export const runMetricsCacheFamily = atomFamily((runId: string) => atom([]), deepEqual) - -export const runMetricsStatsCacheFamily = atomFamily( - (runId: string) => atom>({}), - deepEqual, -) - -/** - * Helper type for accessing all run-scoped atoms for a specific run - */ -export interface RunScopedAtoms { - runId: string - evaluationRunState: ReturnType - bulkStepsStatus: ReturnType - bulkStepsCache: ReturnType - bulkStepsRequested: ReturnType - bulkStarted: ReturnType - enrichedRun: ReturnType - runIndex: ReturnType - evaluationRunId: ReturnType - loadingState: ReturnType - runMetricsRefresh: ReturnType - runMetricsCache: ReturnType - runMetricsStatsCache: ReturnType -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics.ts deleted file mode 100644 index 4cea5caa76..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedMetrics.ts +++ /dev/null @@ -1,657 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {Atom} from "jotai" -import {atomFamily, selectAtom} from "jotai/utils" -import {eagerAtom} from "jotai-eager" - -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {BasicStats, canonicalizeMetricKey, getMetricValueWithAliases} from "@/oss/lib/metricUtils" -import {slugify} from "@/oss/lib/utils/slugify" -import {getJWT} from "@/oss/services/api" -import {getProjectValues} from "@/oss/state/project" - -import type {EvaluationRunState} from "../../types" - -import { - evaluationRunStateFamily, - loadingStateFamily, - runMetricsCacheFamily, - runMetricsRefreshFamily, - runMetricsStatsCacheFamily, -} from "./runScopedAtoms" -import {evalAtomStore} from "./store" - -// Re-export the atom families for external use -export {runMetricsCacheFamily, runMetricsStatsCacheFamily} - -import {fetchRunMetricsViaWorker} from "@/agenta-oss-common/lib/evalRunner/runMetricsWorker" - -// Helper: flatten acc object and nested metrics similar to legacy mergedMetricsAtom -export function flattenMetrics(raw: Record): Record { - const flat: Record = {} - Object.entries(raw || {}).forEach(([k, v]) => { - if (k === "acc" && v && typeof v === "object") { - const acc: any = v - if (acc?.costs?.total !== undefined) flat.totalCost = acc.costs.total - if (acc?.duration?.total !== undefined) - flat["duration.total"] = Number((acc.duration.total / 1000).toFixed(6)) - if (acc?.tokens?.total !== undefined) flat.totalTokens = acc.tokens.total - if (acc?.tokens?.prompt !== undefined) flat.promptTokens = acc.tokens.prompt - if (acc?.tokens?.completion !== undefined) flat.completionTokens = acc.tokens.completion - } else if (v && typeof v === "object" && !Array.isArray(v)) { - Object.entries(v).forEach(([sub, sv]) => { - flat[`${k}.${sub}`] = sv - }) - } else { - flat[k] = v - } - }) - return flat -} - -// Deduplicate inflight requests per runId -const inFlight = new Map>() - -const buildAnnotationSlugMap = (state?: EvaluationRunState): Record => { - if (!state?.runIndex?.steps) return {} - - const map: Record = {} - Object.values(state.runIndex.steps).forEach((meta: any) => { - const key = meta?.key - const slug = meta?.refs?.evaluator?.slug - if (meta?.kind !== "annotation") return - if ( - typeof key === "string" && - key.startsWith("evaluator-") && - typeof slug === "string" && - slug.length - ) { - map[key] = key - } - }) - - return map -} - -const runFetchMetrics = async ( - store: any, - runId: string, - evaluatorSlugs: string[] = [], - revisionSlugs: string[] = [], -) => { - if (inFlight.has(runId)) return inFlight.get(runId)! as Promise - - const existingMetrics = (() => { - try { - const value = store?.get ? store.get(runMetricsCacheFamily(runId)) : [] - return Array.isArray(value) ? value : [] - } catch { - return [] - } - })() - - const hasCachedMetrics = existingMetrics.length > 0 - - const promise = (async () => { - evalAtomStore().set(loadingStateFamily(runId), (draft) => { - if (hasCachedMetrics) { - draft.isRefreshingMetrics = true - } else { - draft.isLoadingMetrics = true - } - }) - try { - const state = store?.get ? store.get(evaluationRunStateFamily(runId)) : undefined - - const annotationSlugMap = buildAnnotationSlugMap(state) - - const effectiveEvaluatorSlugs = - evaluatorSlugs.length > 0 - ? evaluatorSlugs - : (() => { - if (!state?.enrichedRun?.evaluators) return [] - const list = Array.isArray(state.enrichedRun.evaluators) - ? state.enrichedRun.evaluators - : Object.values(state.enrichedRun.evaluators) - return list - .map((ev: any) => ev?.slug || ev?.id || ev?.name) - .filter(Boolean) as string[] - })() - - const effectiveRevisionSlugs = - revisionSlugs.length > 0 - ? revisionSlugs - : (() => { - const revisions = state?.enrichedRun?.variants - if (!Array.isArray(revisions)) return [] - return revisions - .map((v: any) => slugify(v?.name, v?.id)) - .filter(Boolean) as string[] - })() - - const apiUrl = getAgentaApiUrl() - const jwt = await getJWT() - const proj = getProjectValues() as any - const projectId = (proj?.id ?? proj?.projectId ?? "") as string - - if (!projectId || !jwt || !apiUrl) { - console.error(`[runScopedMetrics] Missing context for runId: ${runId}`, { - hasProjectId: !!projectId, - hasJwt: !!jwt, - hasApiUrl: !!apiUrl, - }) - throw new Error("Project ID, JWT or API URL not found") - } - - const {metrics, stats} = await fetchRunMetricsViaWorker(runId, { - apiUrl, - jwt, - projectId, - evaluatorSlugs: effectiveEvaluatorSlugs, - revisionSlugs: effectiveRevisionSlugs, - annotationSlugMap, - }) - - const scenarioMetrics = Array.isArray(metrics) ? metrics : [] - - // Update run-scoped cache atoms - store.set(runMetricsCacheFamily(runId), scenarioMetrics) - store.set(runMetricsStatsCacheFamily(runId), stats || {}) - - // Reset refresh counter back to 0 - store.set(runMetricsRefreshFamily(runId), 0) - } catch (err) { - console.error(`[runScopedMetrics] Error fetching metrics for runId: ${runId}:`, err) - } finally { - inFlight.delete(runId) // cleanup - evalAtomStore().set(loadingStateFamily(runId), (draft) => { - draft.isLoadingMetrics = false - draft.isRefreshingMetrics = false - }) - } - })() - inFlight.set(runId, promise) - return promise -} - -// Run-scoped metrics atom family that fetches metrics for a specific runId -export const runMetricsFamily = atomFamily>((runId: string) => { - return eagerAtom((get) => { - if (!runId) { - return [] - } - - // Depend on refresh signal - const refresh = get(runMetricsRefreshFamily(runId)) - - const cached = get(runMetricsCacheFamily(runId)) - - // Normal path: no refresh requested - if (refresh === 0) { - return cached || [] - } - - // Refresh requested (stale-while-revalidate) - if (cached && cached.length > 0) { - // Kick off background revalidation if not already running - if (!inFlight.has(runId)) { - runFetchMetrics(evalAtomStore(), runId) - } - return cached // serve stale data while revalidating - } - - // No cached data → start background fetch and return empty list (no suspense) - if (!inFlight.has(runId)) { - const state = get(evaluationRunStateFamily(runId)) - const evaluators = state?.enrichedRun?.evaluators - if (!evaluators) return [] - - // Handle both array and object formats - const evaluatorsList = Array.isArray(evaluators) - ? evaluators - : Object.values(evaluators) - - const evaluatorSlugs = evaluatorsList.map((ev: any) => ev.slug || ev.id || ev.name) - - const revisions = state?.enrichedRun?.variants - const revisionSlugs = revisions ? revisions.map((v: any) => slugify(v.name, v.id)) : [] - - const p = runFetchMetrics(evalAtomStore(), runId, evaluatorSlugs, revisionSlugs) - inFlight.set(runId, p) - } - return [] - }) -}, deepEqual) - -// Run-scoped scenario metrics map atom family -const scenarioMetricsCache = new WeakMap>>() - -const normalizeStatValue = (value: any) => { - if (!value || typeof value !== "object" || Array.isArray(value)) return value - const next: any = {...value} - - if (Array.isArray(next.freq)) { - next.frequency = next.freq - delete next.freq - } - if (Array.isArray(next.uniq)) { - next.unique = next.uniq - delete next.uniq - } - - if (Array.isArray(next.frequency)) { - next.frequency = next.frequency.map((entry: any) => ({ - value: entry?.value, - count: entry?.count ?? entry?.frequency ?? 0, - })) - - const sorted = [...next.frequency].sort( - (a, b) => b.count - a.count || (a.value === true ? -1 : 1), - ) - next.rank = sorted - if (!Array.isArray(next.unique) || !next.unique.length) { - next.unique = sorted.map((entry) => entry.value) - } - } else if (Array.isArray(next.rank)) { - next.rank = next.rank.map((entry: any) => ({ - value: entry?.value, - count: entry?.count ?? entry?.frequency ?? 0, - })) - } - - return next -} - -export const scenarioMetricsMapFamily = atomFamily< - string, - Atom>> ->((runId: string) => { - return eagerAtom>>((get) => { - // Explicitly depend on refresh signal to ensure reactivity - const refresh = get(runMetricsRefreshFamily(runId)) - - const arr = get(runMetricsFamily(runId)) as any[] - - if (!arr) { - return {} - } - - const cached = scenarioMetricsCache.get(arr) - if (cached && refresh === 0) { - return cached - } - - const map: Record> = {} - arr.forEach((entry: any, index: number) => { - const sid = entry?.scenarioId || entry?.scenario_id || entry?.scenarioID || entry?.id - if (!sid) { - return - } - // The data might already be processed/flattened or still nested - const rawData = entry?.data || {} - - // Check if data is already flat (has direct metric values) or nested (has variant objects) - const firstNonEmptyKey = Object.keys(rawData).find((key) => { - const value = rawData[key] - return ( - value !== null && - value !== undefined && - (typeof value === "object" ? Object.keys(value).length > 0 : true) - ) - }) - - // If you want the first non-empty value: - const firstValue = firstNonEmptyKey ? rawData[firstNonEmptyKey] : undefined - const isAlreadyFlat = - typeof firstValue === "number" || - (typeof firstValue === "object" && (firstValue?.mean || firstValue?.unique)) - - if (isAlreadyFlat) { - // Data is already flat, ensure canonical aliases are present - const normalized: Record = {...rawData} - Object.keys(rawData).forEach((rawKey) => { - normalized[rawKey] = normalizeStatValue(normalized[rawKey]) - const canonical = canonicalizeMetricKey(rawKey) - if (canonical !== rawKey && normalized[canonical] === undefined) { - normalized[canonical] = normalizeStatValue(rawData[rawKey]) - } - }) - map[String(sid)] = normalized - } else { - // Data is nested, process it - const processedData: Record = {} - - // Extract metrics from all variants (usually just one) - Object.values(rawData).forEach((variantData: any) => { - if (variantData && typeof variantData === "object") { - Object.entries(variantData).forEach( - ([metricKey, metricValue]: [string, any]) => { - // Extract the mean value from metric objects like {"mean": 0.000059} - const value = metricValue?.mean ?? metricValue - - // Apply key mapping for common metrics - let mappedKey = metricKey - if (metricKey === "costs.total") mappedKey = "totalCost" - else if (metricKey === "tokens.total") mappedKey = "totalTokens" - else if (metricKey === "tokens.prompt") mappedKey = "promptTokens" - else if (metricKey === "tokens.completion") - mappedKey = "completionTokens" - - const canonical = canonicalizeMetricKey(mappedKey) - processedData[mappedKey] = normalizeStatValue(value) - if (canonical !== mappedKey) { - processedData[canonical] = processedData[canonical] ?? value - } - }, - ) - } - }) - - map[String(sid)] = processedData - } - }) - - scenarioMetricsCache.set(arr, map) - return map - }) -}, deepEqual) - -/** - * Run-scoped scenario metrics selector - * Returns a single metric primitive for a given scenario without triggering wide re-renders. - * Specialized for the case where you only need a single metric value. like table cells - */ -export const scenarioMetricSelectorFamily = atomFamily< - {runId: string; scenarioId: string}, - Atom>> ->(({runId, scenarioId}) => { - return selectAtom(scenarioMetricsMapFamily(runId), (s) => s?.[scenarioId], deepEqual) -}, deepEqual) - -const OUTPUT_PREFIX = "attributes.ag.data.outputs." -const METRICS_PREFIX = "attributes.ag.metrics." - -const stripPrefixVariants = (value: string, ...prefixes: string[]): string => { - let next = value - prefixes.forEach((prefix) => { - if (next.startsWith(prefix)) { - next = next.slice(prefix.length) - } - }) - return next -} - -const appendOutputCandidates = ( - push: (candidate?: string) => void, - seed: string, - slug?: string, -) => { - if (!seed) return - const tail = stripPrefixVariants(seed, OUTPUT_PREFIX, "outputs.") - if (!tail) return - push(`${OUTPUT_PREFIX}${tail}`) - if (slug) { - push(`${slug}.${OUTPUT_PREFIX}${tail}`) - push(`${OUTPUT_PREFIX}${slug}.${tail}`) - } -} - -const appendMetricCandidates = ( - push: (candidate?: string) => void, - seed: string, - slug?: string, -) => { - if (!seed) return - const tail = stripPrefixVariants(seed, METRICS_PREFIX, "metrics.") - if (!tail) return - push(`${METRICS_PREFIX}${tail}`) - if (slug) { - push(`${slug}.${METRICS_PREFIX}${tail}`) - push(`${METRICS_PREFIX}${slug}.${tail}`) - } -} - -/** - * Run-scoped single metric value selector - * Mirrors the legacy scenarioMetricValueFamily but adds runId and optional stepSlug support. - * Returns a single metric primitive for a given scenario without triggering wide re-renders. - */ -export const scenarioMetricValueFamily = atomFamily( - ({ - runId, - scenarioId, - metricKey, - stepSlug, - }: { - runId: string - scenarioId: string - metricKey: string - stepSlug?: string - }) => - selectAtom( - scenarioMetricsMapFamily(runId), - (map) => { - const metrics = map?.[scenarioId] || {} - - const buildCandidateKeys = (base: string): string[] => { - const candidates: string[] = [] - const push = (candidate?: string) => { - if (!candidate) return - if (candidates.includes(candidate)) return - candidates.push(candidate) - } - - push(base) - - const slug = stepSlug || base.split(".")[0] - const withoutSlug = - slug && base.startsWith(`${slug}.`) ? base.slice(slug.length + 1) : base - - if (slug) { - push(`${slug}.${withoutSlug}`) - } - - appendOutputCandidates(push, withoutSlug, slug) - appendMetricCandidates(push, withoutSlug, slug) - appendOutputCandidates(push, base, slug) - appendMetricCandidates(push, base, slug) - - return candidates - } - - const needsPrefix = Boolean(stepSlug && !metricKey.startsWith(`${stepSlug}.`)) - const key = needsPrefix ? `${stepSlug}.${metricKey}` : metricKey - const candidateKeys = Array.from( - new Set([...buildCandidateKeys(metricKey), ...buildCandidateKeys(key)]), - ) - - for (const candidate of candidateKeys) { - const resolved = getMetricValueWithAliases(metrics, candidate) - if (resolved !== undefined) { - return resolved - } - } - return undefined - }, - deepEqual, - ), -) - -// Helper function to trigger metric fetch for a specific runId -export const triggerMetricsFetch = (targetRunId: string) => { - const store = evalAtomStore() - store.set(runMetricsRefreshFamily(targetRunId), (prev) => prev + 1) -} - -/** - * Run-scoped metrics prefetch attachment - * This replaces the legacy attachRunMetricsPrefetch for multi-run support - */ -export function attachRunMetricsPrefetchForRun( - runId: string, - store: ReturnType, -) { - const fetched = new Set() - - // Subscribe to changes in evaluation run state for this specific run - const unsubscribe = store.sub(evaluationRunStateFamily(runId), () => { - const state = store.get(evaluationRunStateFamily(runId)) - const currentRunId = runId - - if (!currentRunId) { - return - } - - if (!state?.enrichedRun?.evaluators) { - return // wait until evaluators are loaded - } - - // Check if metrics are already cached using the actual currentRunId - const cached = store.get(runMetricsCacheFamily(currentRunId)) - if (cached && cached.length > 0) { - if (!fetched.has(currentRunId)) { - fetched.add(currentRunId) // Mark as fetched since cache exists - } - return - } - - // Check if we're already in the process of fetching - if (fetched.has(currentRunId)) { - return - } - - fetched.add(currentRunId) - - // Trigger metrics fetch for the actual currentRunId - triggerMetricsFetch(currentRunId) - }) - - return unsubscribe -} - -/** - * Run-scoped metric data family - * This replaces the legacy metricDataFamily for multi-run support - * Returns { value, distInfo } for a specific metric key on a scenario within a run - */ -export const runScopedMetricDataFamily = atomFamily( - ({ - runId, - scenarioId, - stepSlug, - metricKey, - }: { - runId: string - scenarioId: string - stepSlug?: string - metricKey: string - }) => - eagerAtom<{value: any; distInfo?: any}>((get) => { - // Get the scenario metrics map for this run - const scenarioMetricsMap = get(scenarioMetricsMapFamily(runId)) - // Get the metrics for this specific scenario - const scenarioMetrics = scenarioMetricsMap[scenarioId] - - if (!scenarioMetrics) { - return {value: undefined, distInfo: undefined} - } - - const metricPath = stepSlug ? `${stepSlug}.${metricKey}` : metricKey - - const buildCandidateKeys = (base: string): string[] => { - const candidates: string[] = [] - const push = (candidate?: string) => { - if (!candidate) return - if (candidates.includes(candidate)) return - candidates.push(candidate) - } - - push(base) - - const slug = stepSlug || base.split(".")[0] - const withoutSlug = - slug && base.startsWith(`${slug}.`) ? base.slice(slug.length + 1) : base - - if (slug) { - push(`${slug}.${withoutSlug}`) - push(`${slug}.attributes.ag.data.outputs.${withoutSlug}`) - push(`${slug}.attributes.ag.metrics.${withoutSlug}`) - } - - push(`attributes.ag.data.outputs.${withoutSlug}`) - push(`attributes.ag.metrics.${withoutSlug}`) - - return candidates - } - - const candidateKeys = Array.from( - new Set([...buildCandidateKeys(metricKey), ...buildCandidateKeys(metricPath)]), - ) - - const resolveFromSource = (source?: Record) => { - if (!source) return undefined - for (const candidate of candidateKeys) { - const resolved = getMetricValueWithAliases(source, candidate) - if (resolved !== undefined) return resolved - } - return undefined - } - - const value = resolveFromSource(scenarioMetrics) - - // Get distribution info from stats cache (if available) - const statsCache = get(runMetricsStatsCacheFamily(runId)) - const distInfo = resolveFromSource(statsCache) - - return {value, distInfo} - }), -) - -// Cache for computed stats maps (adds binSize lazily) to preserve identity per raw object -const computedStatsCache = new WeakMap, Record>() - -// Atom family to read the entire stats map for a run, lazily adding binSize per entry. -// IMPORTANT: It also subscribes to runMetricsFamily(runId) to ensure that refresh triggers -// fetching even when only stats are being read by the UI. -export const runMetricStatsFamily = atomFamily( - ({runId}: {runId: string}) => - eagerAtom>((get) => { - // Wire up to metrics array to drive fetching on refresh - // This ensures that setting runMetricsRefreshFamily(runId) will cause - // runMetricsFamily(runId) to evaluate and kick off the background fetch. - // We ignore its value here and continue to return the stats map. - get(runMetricsFamily(runId)) - - const obj = get(runMetricsStatsCacheFamily(runId)) as Record - if (!obj) return obj - - const cached = computedStatsCache.get(obj) - if (cached) return cached - - let mutated = false - const result: Record = {} - for (const [key, s] of Object.entries(obj)) { - if ( - s && - (s as any).binSize === undefined && - (s as any).distribution && - (s as any).distribution.length - ) { - const bins = (s as any).distribution.length - const range = ((s as any).max ?? 0) - ((s as any).min ?? 0) - result[key] = { - ...(s as any), - binSize: bins ? (range !== 0 ? range / bins : 1) : 1, - } as BasicStats - mutated = true - } else { - result[key] = s as BasicStats - } - } - - const finalMap = mutated ? result : obj - // memoize for this raw object identity - computedStatsCache.set(obj, finalMap) - return finalMap - }), - deepEqual, -) diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios.ts deleted file mode 100644 index 231a4fc111..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/runScopedScenarios.ts +++ /dev/null @@ -1,412 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {Atom, atom} from "jotai" -import {atomFamily, loadable} from "jotai/utils" -import {Loadable} from "jotai/vanilla/utils/loadable" -import {atomWithImmer} from "jotai-immer" - -import {urlStateAtom} from "@/oss/components/EvalRunDetails/state/urlState" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import { - evalAtomStore, - evalScenarioFilterAtom, -} from "@/oss/lib/hooks/useEvaluationRunData/assets/atoms" -import {getJWT} from "@/oss/services/api" -import {getProjectValues} from "@/oss/state/project" - -import {UseEvaluationRunScenarioStepsFetcherResult} from "../../../useEvaluationRunScenarioSteps/types" -import {fetchScenarioListViaWorker} from "../helpers/fetchScenarioListViaWorker" -import {fetchScenarioViaWorkerAndCache} from "../helpers/fetchScenarioViaWorker" - -import {scenarioStatusAtomFamily} from "./progress" -import {bulkStepsStatusFamily, enrichedRunFamily, evaluationRunStateFamily} from "./runScopedAtoms" - -/** - * Run-scoped scenario atoms - * - * These atoms replace the global scenario atoms and are scoped to specific evaluation runs. - * Each atom family is keyed by runId, allowing multiple evaluation runs to have - * independent scenario state. - */ - -// Atom family to force refetch of scenario steps - now scoped by runId -export const scenarioStepRefreshFamily = atomFamily( - (params: {runId: string; scenarioId: string}) => atom(0), - deepEqual, -) - -// Per-scenario local cache that can be mutated independently - now scoped by runId -export const scenarioStepLocalFamily = atomFamily( - (params: {runId: string; scenarioId: string}) => - atomWithImmer({}), - deepEqual, -) - -// Deduplicate in-flight fetches for scenario steps - now per runId -const scenarioStepInFlightMap = new Map>>() - -export const scenarioStepFamily = atomFamily< - {runId: string; scenarioId: string}, - Atom> ->((params) => { - const {runId, scenarioId} = params - return atom(async (get): Promise => { - // Depend on refresh version so that incrementing it triggers refetch - const refresh = get(scenarioStepRefreshFamily(params)) - - // Access data directly from run-scoped atom instead of derived atoms - const runState = get(evaluationRunStateFamily(runId)) - const evaluation = runState?.enrichedRun - const runIndex = runState?.runIndex - - const inferEvaluationType = (): string | undefined => { - const candidates = [ - runState?.rawRun && (runState.rawRun as any).evaluation_type, - (runState?.rawRun as any)?.data?.evaluation_type, - (runState?.rawRun as any)?.data?.evaluationType, - (evaluation as any)?.evaluationType, - (evaluation as any)?.evaluation_type, - (evaluation as any)?.data?.evaluationType, - (evaluation as any)?.data?.evaluation_type, - (evaluation as any)?.meta?.evaluation_type, - (evaluation as any)?.flags?.evaluation_type, - ] - for (const candidate of candidates) { - if (typeof candidate === "string" && candidate.trim().length > 0) { - return candidate - } - } - return undefined - } - - const evaluationType = inferEvaluationType() - const isOnlineEval = - (evaluationType && evaluationType.toLowerCase() === "online") || - Boolean((evaluation as any)?.flags?.isLive) || - Boolean((runState?.rawRun as any)?.flags?.is_live) - - const testsetData = evaluation?.testsets?.[0] - if (!runId || !evaluation || !runIndex) { - console.warn(`[scenarioStepFamily] Missing runId/evaluation/runIndex for ${scenarioId}`) - return undefined - } - - if (!isOnlineEval && !testsetData) { - console.warn( - `[scenarioStepFamily] Missing testset data for ${scenarioId} (evaluationType=${evaluationType ?? "unknown"})`, - ) - return undefined - } - - // Wait if bulk fetch in-flight to avoid duplicate per-scenario fetches - const status = get(bulkStepsStatusFamily(runId)) - if (status === "loading") { - while (get(bulkStepsStatusFamily(runId)) === "loading") { - await new Promise((r) => setTimeout(r, 16)) - } - } - - const fetchParams = { - runId, - evaluation, - runIndex, - } - - // Get or create in-flight map for this runId - if (!scenarioStepInFlightMap.has(runId)) { - scenarioStepInFlightMap.set(runId, new Map()) - } - const inFlightMap = scenarioStepInFlightMap.get(runId)! - - // Local cached value first - const local = get(scenarioStepLocalFamily(params)) - if (local && Object.keys(local).length > 0) { - if (refresh > 0 && !inFlightMap.has(scenarioId)) { - const bgPromise = (async () => { - await fetchScenarioViaWorkerAndCache(fetchParams, [scenarioId]) - evalAtomStore().set(scenarioStepRefreshFamily(params), 0) - })() - inFlightMap.set(scenarioId, bgPromise) - bgPromise.finally(() => inFlightMap.delete(scenarioId)) - } - return local - } - - // Fallback to bulk cache - return undefined if not cached - return undefined - }) -}, deepEqual) - -// Loadable version of scenario step family - scoped by runId -export const loadableScenarioStepFamily = atomFamily( - (params: {runId: string; scenarioId: string}) => loadable(scenarioStepFamily(params)), - deepEqual, -) - -// Scenarios atom - scoped by runId -export const scenariosFamily = atomFamily( - (runId: string) => - atom((get) => { - const state = get(evaluationRunStateFamily(runId)) - const scenarios = state.scenarios || [] - return scenarios - }), - deepEqual, -) - -// Scenario IDs atom - scoped by runId -export const scenarioIdsFamily = atomFamily( - (runId: string) => - atom((get) => { - const scenarios = get(scenariosFamily(runId)) - return scenarios.map((s) => s.id) - }), - deepEqual, -) - -// Total count atom - scoped by runId -export const totalCountFamily = atomFamily( - (runId: string) => - atom((get) => { - const scenarios = get(scenariosFamily(runId)) - return scenarios.length - }), - deepEqual, -) - -// Scenario steps atom - aggregates all scenario steps for a run -export const scenarioStepsFamily = atomFamily( - (runId: string) => - atom((get) => { - const scenarioIds = get(scenarioIdsFamily(runId)) - const stepsMap: Record< - string, - Loadable - > = {} - - scenarioIds.forEach((scenarioId) => { - stepsMap[scenarioId] = get(loadableScenarioStepFamily({runId, scenarioId})) - }) - - return stepsMap - }), - deepEqual, -) - -// Displayed scenario IDs with filtering - scoped by runId -export const displayedScenarioIdsFamily = atomFamily( - (runId: string) => - atom((get) => { - const scenarios = get(scenariosFamily(runId)) - const scenarioIds = scenarios.map((s: any) => s.id || s._id) - - // Get the current filter value from the global filter atom - // Note: evalScenarioFilterAtom is global but that's OK since filter preference is shared across runs - const filter = get(evalScenarioFilterAtom) - - // If filter is "all", return all scenarios - if (filter === "all") { - return scenarioIds - } - - // Filter scenarios based on their status - const filteredScenarioIds = scenarioIds.filter((scenarioId: string) => { - const statusData = get(scenarioStatusAtomFamily({scenarioId, runId})) - const status = statusData?.status || "pending" - - switch (filter) { - case "pending": - return status === "pending" || status === "revalidating" - case "unannotated": - return status === "incomplete" - case "failed": - return status === "failure" - default: - return true - } - }) - return filteredScenarioIds - }), - deepEqual, -) - -/** - * Helper functions for run-scoped scenario operations - */ - -// Revalidate scenario function - now requires runId -export async function revalidateScenarioForRun( - runId: string, - scenarioId: string, - store: ReturnType, - updatedSteps?: UseEvaluationRunScenarioStepsFetcherResult["steps"], -) { - // Apply optimistic override if requested - - // Bump refresh counter so the specific scenario refetches - try { - store.set(scenarioStepRefreshFamily({runId, scenarioId}), (v = 0) => v + 1) - } catch (err) { - console.error("[atoms] failed to bump scenario refresh counter", err) - } - - // Return a promise that resolves when the refreshed data is available - return store.get(scenarioStepFamily({runId, scenarioId})) -} - -// Bulk prefetch function for run-scoped scenarios -export function attachBulkPrefetchForRun( - runId: string, - store: ReturnType, -) { - // Subscribe to changes in displayed scenario IDs for this specific run - const unsubscribe = store.sub(displayedScenarioIdsFamily(runId), () => { - const scenarioIds = store.get(displayedScenarioIdsFamily(runId)) - if (scenarioIds.length > 0) { - // Trigger bulk fetch for this specific run - // The bulk fetch logic should work with run-scoped atoms - try { - // Import the bulk fetch function - import("./bulkFetch").then(({runBulkFetch}) => { - runBulkFetch(store, runId, scenarioIds) - }) - } catch (error) { - console.error( - `attachBulkPrefetchForRun: Error triggering bulk fetch for ${runId.slice(0, 8)}:`, - error, - ) - } - } - }) - - return unsubscribe -} - -// Scenario list prefetch function for run-scoped scenarios -// This fetches the scenarios for a run when the enriched run becomes available -export function attachScenarioListPrefetchForRun( - runId: string, - store: ReturnType, -) { - const inferIsOnline = (runState: any, enrichedRun: any): boolean => { - const candidates = [ - enrichedRun?.evaluationType, - enrichedRun?.evaluation_type, - enrichedRun?.meta?.evaluationType, - enrichedRun?.meta?.evaluation_type, - runState?.rawRun?.evaluation_type, - runState?.rawRun?.data?.evaluation_type, - runState?.rawRun?.data?.evaluationType, - ] - const hasOnlineType = candidates.some( - (candidate) => typeof candidate === "string" && candidate.toLowerCase() === "online", - ) - if (hasOnlineType) return true - return Boolean( - enrichedRun?.flags?.isLive || - enrichedRun?.flags?.is_live || - runState?.rawRun?.flags?.isLive || - runState?.rawRun?.flags?.is_live, - ) - } - - // Subscribe to changes in enriched run for this specific run - const unsubscribe = store.sub(enrichedRunFamily(runId), () => { - const enrichedRun = store.get(enrichedRunFamily(runId)) - const currentScenarios = store.get(scenariosFamily(runId)) - const runState = store.get(evaluationRunStateFamily(runId)) - - // Only fetch scenarios if we have an enriched run but no scenarios yet - if (enrichedRun && currentScenarios.length === 0) { - const fetchScenarios = async () => { - try { - const {projectId} = getProjectValues() - const apiUrl = getAgentaApiUrl() - const jwt = await getJWT() - - if (!jwt) { - console.warn( - `[attachScenarioListPrefetchForRun] No JWT available for ${runId}`, - ) - return - } - - const scenarios = await fetchScenarioListViaWorker({ - apiUrl, - jwt, - projectId, - runId, - order: inferIsOnline(runState, enrichedRun) ? "descending" : undefined, - }) - store.set(evaluationRunStateFamily(runId), (draft: any) => { - draft.scenarios = scenarios.map((s, idx) => ({ - ...s, - scenarioIndex: idx + 1, - })) - }) - } catch (error) { - console.error( - `[attachScenarioListPrefetchForRun] Error fetching scenarios for ${runId}:`, - error, - ) - } - } - - fetchScenarios() - } - }) - - return unsubscribe -} - -// Neighbor prefetch function for run-scoped scenarios -export function attachNeighbourPrefetchForRun( - runId: string, - store: ReturnType, -) { - let lastScenarioId: string | null = null - let latestUrl = store.get(urlStateAtom) - let latestIds = store.get(scenarioIdsFamily(runId)) - - const maybePrefetch = () => { - const {view, scenarioId} = latestUrl - if (view !== "focus" || !scenarioId) return - if (!latestIds.length) return - if (scenarioId === lastScenarioId) return - - const idx = latestIds.indexOf(scenarioId) - if (idx === -1) return - - lastScenarioId = scenarioId - const neighbours = latestIds.filter((_, i) => Math.abs(i - idx) === 1) - const allIds = [scenarioId, ...neighbours] - const toFetch = allIds.filter( - (id) => !store.get(scenarioStepLocalFamily({runId, scenarioId: id})), - ) - if (!toFetch.length) { - return - } - - // Import and use run-scoped bulk fetch - import("./bulkFetch").then(({runBulkFetch}) => { - runBulkFetch(store, runId, toFetch, {force: true}) - }) - } - - // Subscribe to URL changes - const unsubscribeUrl = store.sub(urlStateAtom, () => { - latestUrl = store.get(urlStateAtom) - maybePrefetch() - }) - - // Subscribe to scenario IDs availability/changes for this specific run - const unsubscribeScenarios = store.sub(scenarioIdsFamily(runId), () => { - latestIds = store.get(scenarioIdsFamily(runId)) - maybePrefetch() - }) - - // Return cleanup function that unsubscribes from both subscriptions - return () => { - unsubscribeUrl() - unsubscribeScenarios() - } -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/store.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/store.ts deleted file mode 100644 index 00c6548473..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/store.ts +++ /dev/null @@ -1,74 +0,0 @@ -import {createStore, getDefaultStore} from "jotai" - -import {attachRunMetricsPrefetchForRun} from "./runScopedMetrics" -import { - attachBulkPrefetchForRun, - attachNeighbourPrefetchForRun, - attachScenarioListPrefetchForRun, -} from "./runScopedScenarios" - -/** - * Single global Jotai store for all evaluation runs. - * Uses run-scoped atom families instead of multiple stores. - * This is the proper Jotai pattern for multi-entity state management. - */ -const globalStoreKey = "__agenta_globalEvalStore__" - -// Create or retrieve the single global store -function createGlobalStore() { - const store = getDefaultStore() - - return store -} - -// Global singleton store that persists across HMR -const globalStore: ReturnType = - (globalThis as any)[globalStoreKey] || createGlobalStore() -;(globalThis as any)[globalStoreKey] = globalStore - -// Track which runs have been initialized to avoid duplicate subscriptions -const initializedRuns = new Set() - -/** - * Returns the single global Jotai store. - * All evaluation runs use the same store with run-scoped atom families. - */ -export function evalAtomStore(): ReturnType { - return getDefaultStore() -} - -/** - * Initialize a run in the global store. - * This ensures that run-scoped atoms are properly set up for the given runId. - * Sets up run-specific subscriptions for prefetching. - */ -export function initializeRun(runId: string): void { - if (!runId) { - console.warn("[initializeRun] No runId provided") - return - } - - // Avoid duplicate initialization - if (initializedRuns.has(runId)) { - return - } - - // Mark as initialized - initializedRuns.add(runId) - - // Set up run-specific subscriptions for prefetching - // These will work with run-scoped atom families - try { - // Attach scenario list prefetch to fetch scenarios when enriched run is available - attachScenarioListPrefetchForRun(runId, globalStore) - attachBulkPrefetchForRun(runId, globalStore) - attachNeighbourPrefetchForRun(runId, globalStore) - - // Attach metrics prefetch to auto-fetch metrics when evaluators are available - attachRunMetricsPrefetchForRun(runId, globalStore) - } catch (error) { - console.error(`[initializeRun] Error setting up subscriptions for ${runId}:`, error) - // Remove from initialized set if setup failed - initializedRuns.delete(runId) - } -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/utils.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/utils.ts deleted file mode 100644 index b2fe9b2218..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/atoms/utils.ts +++ /dev/null @@ -1,24 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {Atom, atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" - -import {evaluationRunStateFamily} from "./runScopedAtoms" - -type HumanEvalViewTypes = "focus" | "list" | "table" | "results" -type AutoEvalViewTypes = "overview" | "testcases" | "prompt" - -// UI atom to track current scenario view type ("focus" or "table") -// export const runViewTypeAtom = atom("focus") - -export const evaluationEvaluatorsFamily = atomFamily( - (runId: string) => - atom((get) => get(evaluationRunStateFamily(runId)).enrichedRun?.evaluators) as Atom< - EvaluatorDto[] - >, - deepEqual, -) - -export type ScenarioFilter = "all" | "pending" | "unannotated" | "failed" -export const evalScenarioFilterAtom = atom("all") diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/constants.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/constants.ts deleted file mode 100644 index 38166a1c43..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/constants.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type {EvaluationLoadingState, EvaluationRunState, IStatusMeta} from "../types" - -export const initialState: EvaluationRunState = { - rawRun: undefined, - isPreview: undefined, - enrichedRun: undefined, - isComparison: false, - isBase: false, - compareIndex: undefined, - colorIndex: undefined, - scenarios: undefined, - statusMeta: {} as IStatusMeta, - steps: undefined, - metrics: undefined, - isLoading: {run: false, scenarios: false, steps: false, metrics: false}, - isError: {run: false, scenarios: false, steps: false, metrics: false}, -} - -export const defaultLoadingState: EvaluationLoadingState = { - isLoadingEvaluation: true, - isLoadingScenarios: false, - isLoadingSteps: false, - isLoadingMetrics: false, - isRefreshingMetrics: false, - activeStep: null, - scenarioStepProgress: {completed: 0, total: 0, percent: 0}, -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex.ts deleted file mode 100644 index bff8b3681c..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex.ts +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Step roles we care about in the evaluation workflow. - */ -export type StepKind = "input" | "invocation" | "annotation" - -/** Mapping entry for a single column extracted from a step */ -export interface ColumnDef { - /** Column (human-readable) name e.g. "country" or "outputs" */ - name: string - /** "input" | "invocation" | "annotation" */ - kind: StepKind - /** Optional marker for where the column originated (auto/custom/human/etc.) */ - origin?: string - /** Optional evaluator metric primitive type ("number", "boolean", etc.) */ - metricType?: string - /** Dot-path used to resolve the value inside the owning step payload / testcase */ - path: string - /** Key of the step that owns this column */ - stepKey: string - /** Unique column key used by UI tables */ - key?: string -} - -/** Metadata we store per step key */ -export interface StepMeta { - key: string - kind: StepKind - origin?: string - /** List of upstream step keys declared in `inputs` */ - upstream: string[] - /** Raw references blob – may contain application, evaluator, etc. */ - refs: Record -} - -export interface RunIndex { - /** Map stepKey -> meta */ - steps: Record - /** Map stepKey -> array of ColumnDefs */ - columnsByStep: Record - /** Convenience sets for quick lookup */ - invocationKeys: Set - annotationKeys: Set - inputKeys: Set -} - -/** - * Build a ready-to-use index for an evaluation run. - * Call this **once** right after fetching the raw run and cache the result. - * The index can then be shared by single-scenario and bulk fetchers. - */ -export function buildRunIndex(rawRun: any): RunIndex { - const steps: Record = {} - const columnsByStep: Record = {} - - // Build evaluator slug->key set later - const evaluatorSlugToId = new Map() - - // 1️⃣ Index steps ------------------------------------------------------- - const shouldLog = - process.env.NODE_ENV !== "production" && - typeof window !== "undefined" && - (rawRun?.evaluation_type === "online" || - rawRun?.data?.evaluation_type === "online" || - rawRun?.meta?.evaluation_type === "online") - - for (const s of rawRun?.data?.steps ?? []) { - let kind: StepKind = "annotation" - const refs = s.references ?? {} - const hasInvocationReference = - Boolean(refs.applicationRevision) || - Boolean(refs.application) || - Boolean(refs.query) || - Boolean(refs.query_revision) || - Boolean(refs.queryRevision) || - Boolean(refs.query_variant) || - Boolean(refs.queryVariant) - if (refs.testset) { - kind = "input" - } else if (refs.evaluator) { - kind = "annotation" - if (refs.evaluator.slug) { - evaluatorSlugToId.set(refs.evaluator.slug, refs.evaluator.id) - } - } else if (hasInvocationReference) { - kind = "invocation" - } - - if (shouldLog) { - console.debug("[EvalRun][buildRunIndex] Step classified", { - key: s.key, - refs: Object.keys(refs || {}), - kind, - }) - } - - steps[s.key] = { - key: s.key, - kind, - origin: typeof s.origin === "string" ? s.origin : undefined, - upstream: (s.inputs ?? []).map((i: any) => i.key), - refs: s.references ?? {}, - } - } - - // 2️⃣ Group column defs by step --------------------------------------- - for (const m of rawRun?.data?.mappings ?? []) { - const stepKind = steps[m.step.key]?.kind - const rawKind = typeof m.column.kind === "string" ? m.column.kind.toLowerCase() : "" - const colKind: StepKind = - stepKind || - (rawKind === "testset" || rawKind.includes("testset") || rawKind.includes("input") - ? "input" - : rawKind === "invocation" || - rawKind.includes("invocation") || - rawKind.includes("application") || - rawKind.includes("query") - ? "invocation" - : "annotation") - - if (shouldLog) { - console.debug("[EvalRun][buildRunIndex] Column mapping", { - column: m.column?.name, - rawKind: m.column?.kind, - resolvedKind: colKind, - stepKey: m.step?.key, - }) - } - - const metaForStep = steps[m.step.key] - const col: ColumnDef = { - name: m.column.name, - kind: colKind, - origin: metaForStep?.origin, - path: m.step.path, - stepKey: m.step.key, - } - ;(columnsByStep[col.stepKey] ||= []).push(col) - } - - // 3️⃣ Precompute key sets by role ---------------------- - const invocationKeys = new Set() - const annotationKeys = new Set() - const inputKeys = new Set() - - for (const meta of Object.values(steps)) { - if (meta.kind === "invocation") invocationKeys.add(meta.key) - if (meta.kind === "annotation") annotationKeys.add(meta.key) - if (meta.kind === "input") inputKeys.add(meta.key) - } - - return {steps, columnsByStep, invocationKeys, annotationKeys, inputKeys} -} - -export function serializeRunIndex(idx: RunIndex) { - return { - ...idx, - invocationKeys: [...idx.invocationKeys], - annotationKeys: [...idx.annotationKeys], - inputKeys: [...idx.inputKeys], - } -} - -export function deserializeRunIndex(idx: any): RunIndex { - return { - ...idx, - invocationKeys: new Set(idx.invocationKeys), - annotationKeys: new Set(idx.annotationKeys), - inputKeys: new Set(idx.inputKeys), - } -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/fetchScenarioViaWorker.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/fetchScenarioViaWorker.ts deleted file mode 100644 index 2b81ed1826..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/fetchScenarioViaWorker.ts +++ /dev/null @@ -1,184 +0,0 @@ -import {UseEvaluationRunScenarioStepsFetcherResult} from "../../../useEvaluationRunScenarioSteps/types" -import {evalAtomStore} from "../atoms" - -import {buildAuthContext, buildEvalWorkerContext} from "./workerContext" - -/** - * Fetch one or more scenarios' steps via the Web-Worker in bulk and cache the - * results inside `bulkStepsCacheAtom`. - * - * The helper returns the `Map` produced by the worker where each key is a - * `scenarioId` and the value is the enriched steps result for that scenario. - * If the worker fails to return data for a given scenario the entry will be - * missing from the map – callers should handle that case by falling back to a - * direct network request. - */ -// Deduplication cache to prevent multiple simultaneous calls for the same run -const inFlightFetches = new Map< - string, - Promise> ->() - -export const fetchScenarioViaWorkerAndCache = async ( - params: { - runId: string - evaluation: any - runIndex: any - }, - scenarioIds: string[], -): Promise> => { - // Safety checks for parameters - if (!params || !params.runId) { - return new Map() - } - - // Ensure scenarioIds is an array - const scenarioIdsArray = Array.isArray(scenarioIds) ? scenarioIds : [] - const cacheKey = `${params.runId}-${scenarioIdsArray.join(",")}` - - if (scenarioIdsArray.length === 0) { - return new Map() - } - - // Check if there's already an in-flight fetch for this exact request - if (inFlightFetches.has(cacheKey)) { - return inFlightFetches.get(cacheKey)! - } - - // Create the promise and cache it immediately - const fetchPromise = performFetch(params, scenarioIdsArray) - inFlightFetches.set(cacheKey, fetchPromise) - - try { - const result = await fetchPromise - return result - } finally { - // Clean up the cache entry when done - inFlightFetches.delete(cacheKey) - } -} - -const performFetch = async ( - params: { - runId: string - evaluation: any - runIndex: any - }, - scenarioIds: string[], -): Promise> => { - // Import run-scoped atoms at the top level - - const {scenarioStepLocalFamily: runScopedLocalFamily} = await import( - "../atoms/runScopedScenarios" - ) - - let context - try { - context = buildEvalWorkerContext({ - runId: params.runId, - evaluation: params.evaluation, - runIndex: params.runIndex, - }) - } catch (error) { - throw error - } - - const {jwt, apiUrl, projectId} = await buildAuthContext() - const {fetchStepsViaWorker} = await import( - "@/oss/lib/evalRunner/bulkWorker" - ) - - const store = evalAtomStore() - - // Create a map to collect processed data for return - const processedResults = new Map() - - await fetchStepsViaWorker({ - context: { - ...context, - jwt, - apiUrl, - projectId, - }, - scenarioIds, - onChunk: (chunk) => { - chunk.forEach((val, key) => { - // Save to individual scenario atoms - store.set(runScopedLocalFamily({runId: params.runId, scenarioId: key}), (draft) => { - if (!draft) { - draft = { - steps: [], - annotationSteps: [], - invocationSteps: [], - inputSteps: [], - } - } - - // Store existing optimistic step statuses before overwriting - const preserveOptimisticStatuses = (existingSteps: any[], newSteps: any[]) => { - if (!existingSteps || !newSteps) return newSteps - - const shouldHoldOptimistic = ( - existingStatus: string, - serverStatus?: string, - ) => { - if (!existingStatus) return false - const optimisticStates = ["running", "revalidating"] - if (!optimisticStates.includes(existingStatus)) return false - - if (!serverStatus) return true - - // Only keep optimistic states while the server still reports a non-final status - const transitionalStates = new Set([ - "pending", - "running", - "annotating", - "revalidating", - ]) - - return transitionalStates.has(serverStatus) - } - - return newSteps.map((newStep: any) => { - const existingStep = existingSteps.find( - (s: any) => s.stepKey === newStep.stepKey, - ) - if ( - existingStep?.status && - shouldHoldOptimistic(existingStep.status, newStep.status) - ) { - return {...newStep, status: existingStep.status} - } - return newStep - }) - } - - // Merge server data while preserving optimistic statuses - for (const [k, v] of Object.entries(val)) { - if ( - k === "invocationSteps" || - k === "annotationSteps" || - k === "inputSteps" - ) { - ;(draft as any)[k] = preserveOptimisticStatuses( - (draft as any)[k], - v as any[], - ) - } else { - ;(draft as any)[k] = v - } - } - }) - - // Also collect the processed data for bulk cache return - processedResults.set(key, { - state: "hasData", - data: val, - }) - }) - }, - }) - - // Return the aggregated results map so callers receive data - return processedResults -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/workerContext/index.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/workerContext/index.ts deleted file mode 100644 index 5328207590..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/workerContext/index.ts +++ /dev/null @@ -1,145 +0,0 @@ -import {getDefaultStore} from "jotai" - -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {EnrichedEvaluationRun} from "@/oss/lib/hooks/usePreviewEvaluations/types" -import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" -import type {WorkspaceMember} from "@/oss/lib/Types" -import {getJWT} from "@/oss/services/api" -import {currentAppAtom} from "@/oss/state/app" -import {currentAppContextAtom} from "@/oss/state/app/selectors/app" -import {transformedPromptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {requestSchemaMetaAtomFamily} from "@/oss/state/newPlayground/core/requestSchemaMeta" -import {getOrgValues} from "@/oss/state/org" -import {getProjectValues} from "@/oss/state/project" -import {appUriInfoAtom, appSchemaAtom} from "@/oss/state/variant/atoms/fetcher" - -import {RunIndex} from "../buildRunIndex" - -import {EvalWorkerContextBase, WorkerAuthContext} from "./types" - -/** - * Build the evaluation-specific context for a worker fetch based on the current jotai store state. - */ -export const buildEvalWorkerContext = (params: { - runId: string - evaluation: EnrichedEvaluationRun - runIndex: RunIndex -}): EvalWorkerContextBase => { - const {selectedOrg} = getOrgValues() - const members = (selectedOrg?.default_workspace?.members as WorkspaceMember[]) || [] - - const store = getDefaultStore() - const appType = store.get(currentAppAtom)?.app_type - - const chatVariantIds: string[] = (params.evaluation?.variants || []) - .filter(Boolean) - .map((v: any) => { - const routePath = store.get(appUriInfoAtom)?.routePath - const meta = store.get(requestSchemaMetaAtomFamily({variant: v as any, routePath})) - return meta?.hasMessages ? (v as any).id : undefined - }) - .filter(Boolean) as string[] - - // Build a stable parameters map per revision using transformedPromptsAtomFamily(useStableParams) - const parametersByRevisionId: Record = {} - const revisionIds = (params.evaluation?.variants || []) - .map((v: any) => v?.id) - .filter(Boolean) as string[] - for (const rid of revisionIds) { - const stable = store.get( - transformedPromptsAtomFamily({revisionId: rid, useStableParams: true}), - ) - if (stable) parametersByRevisionId[rid] = stable - } - - return { - runId: params.runId, - mappings: params.evaluation?.data?.mappings ?? [], - members, - appType, - evaluators: params.evaluation?.evaluators || [], - testsets: params.evaluation?.testsets || [], - variants: (params.evaluation?.variants || []).map((v) => { - try { - const routePath = store.get(appUriInfoAtom)?.routePath - const spec = store.get(appSchemaAtom) - const meta = store.get(requestSchemaMetaAtomFamily({variant: v as any, routePath})) - // Custom workflow detection: - // - no messages container, and no `inputs` container => top-level custom inputs - // Completion apps usually have `inputs`; treat them as non-custom. - const hasInputsContainer = Array.isArray(meta?.inputKeys) - ? meta.inputKeys.includes("inputs") - : false - const isCustom = Boolean(!meta?.hasMessages && !hasInputsContainer) - const appType = (store.get(currentAppContextAtom)?.appType as any) || undefined - const rid = (v as any)?.id as string | undefined - const stableOptional = rid - ? store.get( - transformedPromptsAtomFamily({ - revisionId: rid, - useStableParams: true, - }), - ) - : undefined - return { - ...v, - isCustom, - // precompute optionalParameters to avoid metadata lookup in worker - optionalParameters: - stableOptional || - transformToRequestBody({ - variant: v, - isChat: meta?.hasMessages, - isCustom, - appType, - spec: spec as any, - routePath, - }), - } - } catch { - return { - ...v, - optionalParameters: transformToRequestBody({ - variant: v, - appType: - ((() => { - try { - return store.get(currentAppContextAtom)?.appType as any - } catch { - return undefined - } - })() as any) || undefined, - spec: ((): any => { - try { - return store.get(appSchemaAtom) - } catch { - return undefined - } - })(), - routePath: ((): any => { - try { - return store.get(appUriInfoAtom)?.routePath - } catch { - return undefined - } - })(), - }), - } - } - }), - runIndex: params.runIndex, - chatVariantIds, - uriObject: store.get(appUriInfoAtom) || undefined, - parametersByRevisionId, - } -} - -/** - * Resolve JWT, apiUrl and projectId in a single place. - */ -export const buildAuthContext = async (): Promise => { - const jwt = (await getJWT()) || "" - const apiUrl = getAgentaApiUrl() - const {projectId} = getProjectValues() ?? "" - return {jwt, apiUrl, projectId} -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/workerContext/types.ts b/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/workerContext/types.ts deleted file mode 100644 index 76a69ab835..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/assets/helpers/workerContext/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import type {PreviewTestset, WorkspaceMember} from "@/oss/lib/Types" - -import {RunIndex} from "../buildRunIndex" - -/** - * Minimal context object that the evaluation worker expects for enrichment. - * It purposefully contains only clone-safe data (no functions, Dates, etc.). - */ -export interface EvalWorkerContextBase { - runId: string - mappings: unknown[] - members: WorkspaceMember[] - evaluators: EvaluatorDto[] - testsets: PreviewTestset[] - variants: EnhancedVariant[] - runIndex: RunIndex - uriObject?: {runtimePrefix: string; routePath?: string} - /** Stable transformed parameters keyed by revision id */ - parametersByRevisionId?: Record -} - -/** - * Authentication / environment info passed separately to the worker. - */ -export interface WorkerAuthContext { - jwt: string - apiUrl: string - projectId: string -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/index.ts b/web/oss/src/lib/hooks/useEvaluationRunData/index.ts deleted file mode 100644 index 7be13af806..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/index.ts +++ /dev/null @@ -1,303 +0,0 @@ -import {useCallback, useMemo, useRef} from "react" - -import deepEqual from "fast-deep-equal" -import {type WritableDraft} from "immer" -import {atom, useAtomValue, useSetAtom} from "jotai" -import {selectAtom} from "jotai/utils" -import useSWR from "swr" - -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {useAppId} from "@/oss/hooks/useAppId" -import axios from "@/oss/lib/api/assets/axiosConfig" -import {snakeToCamelCaseKeys} from "@/oss/lib/helpers/casing" -import {isDemo} from "@/oss/lib/helpers/utils" -import useEnrichEvaluationRun from "@/oss/lib/hooks/usePreviewEvaluations/assets/utils" -import {Evaluation, GenericObject, PreviewTestset} from "@/oss/lib/Types" -import { - fetchAllEvaluationScenarios as fetchAllLegacyAutoEvaluationScenarios, - fetchEvaluation as fetchLegacyAutoEvaluation, -} from "@/oss/services/evaluations/api" -import { - fetchAllLoadEvaluationsScenarios, - fetchLoadEvaluation as fetchLegacyEvaluationData, -} from "@/oss/services/human-evaluations/api" -import {fetchTestset} from "@/oss/services/testsets/api" -import {userAtom} from "@/oss/state/profile/selectors/user" -import {projectIdAtom} from "@/oss/state/project/selectors/project" -import { - prefetchProjectVariantConfigs, - setProjectVariantReferencesAtom, -} from "@/oss/state/projectVariantConfig" - -import {collectProjectVariantReferences} from "../usePreviewEvaluations/projectVariantConfigs" - -import {evalAtomStore, evaluationRunStateFamily, loadingStateAtom} from "./assets/atoms" -import {buildRunIndex} from "./assets/helpers/buildRunIndex" - -const fetchLegacyScenariosData = async ( - evaluationId: string, - evaluationObj: Evaluation, - type: "auto" | "human" | null, -): Promise => { - if (type === "auto") { - return fetchAllLegacyAutoEvaluationScenarios(evaluationId) - } else { - return new Promise((resolve) => { - fetchAllLoadEvaluationsScenarios(evaluationId, evaluationObj).then((data) => { - resolve( - data.map((item: GenericObject) => { - const numericScore = parseInt(item.score) - return {...item, score: isNaN(numericScore) ? null : numericScore} - }), - ) - }) - }) - } -} - -/** - * Hook to manage and fetch evaluation run data and scenarios. - * - * This hook supports both preview and legacy evaluation runs, providing - * functionality to fetch, enrich, and manage the state of evaluation data. - * It utilizes SWR for data fetching and caching, and Jotai for state management. - * - * @param {string | null} evaluationTableId - The ID of the evaluation table to fetch data for. - * @param {boolean} [debug=false] - Flag for enabling debug mode, which might provide additional logging or behavior. - * @param {() => void} [onScenariosLoaded] - Optional callback to be invoked when scenarios are successfully loaded. - * - * @returns {object} An object containing SWR mutate functions and methods to refetch evaluation and scenarios data. - */ -const useEvaluationRunData = (evaluationTableId: string | null, debug = false, runId?: string) => { - const evalType = useAtomValue(evalTypeAtom) - const routeAppId = useAppId() - // Get isPreview from run-scoped atom if runId is available - const isPreviewSelector = useCallback((state: any) => state.isPreview, []) - const isPreview = useAtomValue( - useMemo(() => { - if (!runId) return atom(false) - return selectAtom(evaluationRunStateFamily(runId), isPreviewSelector, deepEqual) - }, [runId, isPreviewSelector]), - ) - - const projectId = useAtomValue(projectIdAtom) - const setProjectVariantReferences = useSetAtom(setProjectVariantReferencesAtom) - const user = useAtomValue(userAtom) - const requireUser = true - const enrichRun = useEnrichEvaluationRun({debug, evalType}) - const suppressLoadingRef = useRef(false) - - // New fetcher for preview runs that fetches and enriches with testsetData - const fetchAndEnrichPreviewRun = useCallback(async () => { - const suppressLoading = suppressLoadingRef.current - if (!evaluationTableId || !projectId || (requireUser && !user?.id)) { - if (!suppressLoading) { - evalAtomStore().set(loadingStateAtom, (draft) => { - draft.isLoadingEvaluation = false - draft.activeStep = null - }) - } - suppressLoadingRef.current = false - return null - } - - if (!suppressLoading) { - evalAtomStore().set(loadingStateAtom, (draft) => { - draft.isLoadingEvaluation = true - draft.activeStep = "eval-run" - }) - } - - try { - const runRes = await axios.get( - `/preview/evaluations/runs/${evaluationTableId}?project_id=${projectId}`, - ) - const rawRun = snakeToCamelCaseKeys(runRes.data?.run) - - const runIndex = buildRunIndex(rawRun) - - const testsetIds = Array.from( - Object.values(runIndex.steps || {}) - .map((m: any) => m?.refs?.testset?.id) - .filter(Boolean) - .reduce((acc: Set, id: string) => acc.add(id), new Set()), - ) as string[] - - const fetchedTestsets = ( - await Promise.all( - testsetIds.map((tid) => fetchTestset(tid, true).catch(() => null)), - ) - ).filter(Boolean) as PreviewTestset[] - - if (!fetchedTestsets.length && (evalType === "auto" || evalType === "custom")) { - evalAtomStore().set( - evaluationRunStateFamily(runId || evaluationTableId), - (draft: any) => { - draft.rawRun = runRes.data?.run - draft.enrichedRun = rawRun - draft.runIndex = runIndex - draft.isPreview = true - }, - ) - return rawRun - } - - if (!rawRun) { - if (runId) { - evalAtomStore().set(evaluationRunStateFamily(runId), (draft) => { - draft.isPreview = false - }) - } - return null - } - - const enrichedRun = enrichRun ? enrichRun(rawRun, fetchedTestsets, runIndex) : null - if (enrichedRun && (runId || evaluationTableId)) { - const effectiveRunId = runId || evaluationTableId - evalAtomStore().set( - evaluationRunStateFamily(effectiveRunId), - (draft: WritableDraft) => { - draft.rawRun = runRes.data?.run - draft.isPreview = true - draft.enrichedRun = enrichedRun - draft.runIndex = runIndex - }, - ) - } - - if (!routeAppId && projectId && enrichedRun) { - if (evalType !== "online") { - const references = collectProjectVariantReferences([enrichedRun], projectId) - setProjectVariantReferences(references) - prefetchProjectVariantConfigs(references) - } - } - - return enrichedRun - } catch (error: any) { - if (axios.isCancel?.(error) || error?.code === "ERR_CANCELED") { - return null - } - throw error - } finally { - if (!suppressLoading) { - evalAtomStore().set(loadingStateAtom, (draft) => { - draft.isLoadingEvaluation = false - draft.activeStep = null - }) - } - suppressLoadingRef.current = false - } - }, [enrichRun, evaluationTableId, projectId, runId, user?.id, requireUser]) - - const swrKey = - !!enrichRun && evaluationTableId && (!requireUser || !!user?.id) - ? [ - "previewRun", - evaluationTableId, - evalType, - projectId ?? "none", - requireUser ? (user?.id ?? "anon") : "no-user", - ] - : null - - const previewRunSwr = useSWR(swrKey, fetchAndEnrichPreviewRun, { - revalidateIfStale: false, - revalidateOnFocus: false, - revalidateOnReconnect: false, - }) - - // New fetcher for legacy runs that fetches and enriches with testsetData - const fetchAndEnrichLegacyRun = async () => { - const rawRun = - evalType === "auto" - ? await fetchLegacyAutoEvaluation(evaluationTableId as string) - : await fetchLegacyEvaluationData(evaluationTableId as string) - if (!rawRun) return null - - if (evalType === "auto" || evalType === "custom") { - return rawRun - } - - const testsetId = (rawRun?.testset as any)?._id - let testsetData = testsetId ? await fetchTestset(testsetId) : null - - if (testsetData) { - // @ts-ignore - rawRun.testset = testsetData - } - return rawRun - } - - // Legacy: Use SWR to load evaluation data if not a preview - const legacyEvaluationSWR = useSWR( - !!enrichRun && previewRunSwr.data === null && evaluationTableId - ? ["legacyEval", evaluationTableId, evalType] - : null, - fetchAndEnrichLegacyRun, - { - onSuccess(data, key, config) { - if (!data) return - // Populate run-scoped atoms - if (runId) { - evalAtomStore().set(evaluationRunStateFamily(runId), (draft) => { - draft.rawRun = data - draft.isPreview = false - // @ts-ignore - draft.enrichedRun = data - }) - } - }, - }, - ) - - // Legacy: Load scenarios once legacyEvaluation is available - const legacyScenariosSWR = useSWR( - !(isPreview ?? true) && legacyEvaluationSWR.data?.id && !!projectId - ? ["legacyScenarios", evaluationTableId, projectId] - : null, - () => - fetchLegacyScenariosData( - evaluationTableId as string, - legacyEvaluationSWR.data as Evaluation, - evalType, - ), - ) - - return { - // Mutate functions - legacyEvaluationSWR, - legacyScenariosSWR, - refetchEvaluation(options?: {background?: boolean}) { - const background = Boolean(options?.background) - if (background) { - suppressLoadingRef.current = true - } - const mutatePromise = isPreview - ? previewRunSwr.mutate(undefined, {revalidate: true}) - : legacyEvaluationSWR.mutate(undefined, {revalidate: true}) - - if (mutatePromise && typeof (mutatePromise as any)?.finally === "function") { - return (mutatePromise as Promise).finally(() => { - if (background) { - suppressLoadingRef.current = false - } - }) - } - - if (background) { - suppressLoadingRef.current = false - } - - return Promise.resolve(mutatePromise as any) - }, - refetchScenarios() { - if (!isPreview) { - return legacyScenariosSWR.mutate(undefined, {revalidate: true}) - } - return Promise.resolve(null) - }, - } -} - -export default useEvaluationRunData diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/refreshLiveRun.ts b/web/oss/src/lib/hooks/useEvaluationRunData/refreshLiveRun.ts deleted file mode 100644 index 2d9a63f16b..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/refreshLiveRun.ts +++ /dev/null @@ -1,92 +0,0 @@ -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {getJWT} from "@/oss/services/api" -import {getProjectValues} from "@/oss/state/project" - -import {evalAtomStore} from "./assets/atoms" -import {runBulkFetch} from "./assets/atoms/bulkFetch" -import {bulkStepsStatusFamily, evaluationRunStateFamily} from "./assets/atoms/runScopedAtoms" -import {triggerMetricsFetch} from "./assets/atoms/runScopedMetrics" -import {fetchScenarioListViaWorker} from "./assets/helpers/fetchScenarioListViaWorker" - -interface RefreshResult { - scenarioCount: number -} - -const normalizeProjectId = (projectValues: any): string | null => { - if (!projectValues) return null - const candidates = [ - projectValues.projectId, - projectValues.id, - projectValues.project_id, - projectValues.projectID, - ] - for (const candidate of candidates) { - if (typeof candidate === "string" && candidate.length > 0) { - return candidate - } - if (typeof candidate === "number") { - return String(candidate) - } - } - return null -} - -export const refreshLiveEvaluationRun = async (runId: string): Promise => { - if (!runId) { - throw new Error("refreshLiveEvaluationRun requires a runId") - } - - const store = evalAtomStore() - - try { - const projectValues = getProjectValues() - const projectId = normalizeProjectId(projectValues) - if (!projectId) { - throw new Error("Project context not available") - } - - const jwt = await getJWT() - if (!jwt) { - throw new Error("Authentication token not found") - } - - const apiUrl = getAgentaApiUrl() - if (!apiUrl) { - throw new Error("API URL not configured") - } - - const scenarios = await fetchScenarioListViaWorker({ - apiUrl, - jwt, - projectId, - runId, - order: "descending", - }) - - store.set(evaluationRunStateFamily(runId), (draft: any) => { - draft.scenarios = scenarios.map((scenario, index) => ({ - ...scenario, - scenarioIndex: index + 1, - })) - }) - - store.set(bulkStepsStatusFamily(runId), "idle") - - const scenarioIds = scenarios - .map((scenario) => scenario?.id) - .filter((id): id is string => typeof id === "string" && id.length > 0) - - if (scenarioIds.length > 0) { - await runBulkFetch(store, runId, scenarioIds, {force: true, silent: true}) - } - - triggerMetricsFetch(runId) - - return {scenarioCount: scenarioIds.length} - } catch (error) { - console.error("[refreshLiveEvaluationRun] Failed to refresh run %s", runId, error) - throw error - } -} - -export default refreshLiveEvaluationRun diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/types.ts b/web/oss/src/lib/hooks/useEvaluationRunData/types.ts deleted file mode 100644 index ad919b2835..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/types.ts +++ /dev/null @@ -1,144 +0,0 @@ -import {EvaluationStatus, PreviewTestset, WorkspaceMember} from "@/oss/lib/Types" - -import {Evaluation} from "../../Types" -import type {Metric} from "../useEvaluationRunMetrics/types" -import type {IScenario} from "../useEvaluationRunScenarios/types" -import type { - IStepResponse, - UseEvaluationRunScenarioStepsFetcherResult, -} from "../useEvaluationRunScenarioSteps/types" -import {EvaluatorDto} from "../useEvaluators/types" -import type {EnrichedEvaluationRun, EvaluationRun} from "../usePreviewEvaluations/types" - -import {RunIndex} from "./assets/helpers/buildRunIndex" - -export interface ScenarioStatus { - status: - | "pending" - | "running" - | "revalidating" - | "success" - | "error" - | "cancelled" - | "done" - | "failed" - result?: { - data?: unknown - } - error?: string -} - -export interface ScenarioStatusCounts { - total: number - pending: number - running: number - done: number - success: number - failed: number - cancelled: number -} - -export type ScenarioStatusMap = Record - -export interface IStatusMeta { - total: number - completed: number - pending: number - inProgress: number - error: number - cancelled: number - success: number - percentComplete: number - statusSummary: Record - timeline: {scenarioId: string; status: string}[] - timestamps: Record - transitions: Record - durations: Record - statusDurations: Record> -} - -export interface EvaluationRunState { - rawRun?: EvaluationRun | Evaluation - isPreview?: boolean - enrichedRun?: EnrichedEvaluationRun - /** Whether this evaluation is being used for comparison */ - isComparison?: boolean - /** Whether this is the base evaluation being compared against */ - isBase?: boolean - /** Position in comparison view (1 for base, 2+ for comparisons) */ - compareIndex?: number - /** Stable color index used for UI styling independent of baseline swaps */ - colorIndex?: number - scenarios?: IScenario[] - /** Summary of scenario statuses and timings */ - statusMeta: IStatusMeta - steps?: { - inputStep?: IStepResponse - invocationStep?: IStepResponse - annotationSteps?: IStepResponse[] - mainInputParams: any - secondaryInputParams: any - scenarioIndex: string - count: number - next?: string - } - metrics?: { - data: Metric[] - count: number - next?: string - } - isLoading: {run: boolean; scenarios: boolean; steps: boolean; metrics: boolean} - isError: {run: boolean; scenarios: boolean; steps: boolean; metrics: boolean} - /** - * Map of scenarioId to scenario steps and related data - */ - scenarioSteps?: Record - /** Pre-computed index of steps and mappings for this run */ - runIndex?: import("./assets/helpers/buildRunIndex").RunIndex -} - -export type LoadingStep = "eval-run" | "scenarios" | "scenario-steps" | null -export interface ScenarioStepProgress { - completed: number - total: number - percent: number -} - -export interface EvaluationLoadingState { - isLoadingEvaluation: boolean - isLoadingScenarios: boolean - isLoadingSteps: boolean - isLoadingMetrics: boolean - isRefreshingMetrics: boolean - activeStep: LoadingStep - scenarioStepProgress: ScenarioStepProgress -} - -export interface OptimisticScenarioOverride { - status: EvaluationStatus - /** - * UI-only status used to indicate intermediate states like - * "revalidating" or "annotating" that are not recognised by the backend - */ - uiStatus?: "revalidating" | "annotating" - result?: any -} - -export interface EvalRunDataContextType { - runId: string - mappings: any - members: WorkspaceMember[] - evaluators: EvaluatorDto[] - testsets: PreviewTestset[] - variants: any[] - /** - * Given an array of scenario IDs, fetches step data for each, and then - * enriches each step list with inputStep, invocationStep, trace, annotationSteps, - * and invocationParameters. Caches the results in `bulkStepsCacheAtom`. - * - * @param scenarioIds array of scenario IDs - * @param context the `EvalRunDataContextType` object containing runId, mappings, members, evaluators, testsets, and variants - * @param set the jotai `set` callback - */ - runIndex?: RunIndex -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/useEvalRunScenarioData.tsx b/web/oss/src/lib/hooks/useEvaluationRunData/useEvalRunScenarioData.tsx deleted file mode 100644 index b64715f5ef..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/useEvalRunScenarioData.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import {useMemo} from "react" - -import {getCurrentRunId} from "./assets/atoms/migrationHelper" -import {hasScenarioStepData, useScenarioStepSnapshot} from "./useScenarioStepSnapshot" - -const useEvalRunScenarioData = (scenarioId: string, runId?: string) => { - // Memoize runId calculation to prevent infinite loops - const effectiveRunId = useMemo(() => { - if (runId) return runId - try { - return getCurrentRunId() - } catch (error) { - console.warn("[useEvalRunScenarioData] No run ID available:", error) - return null - } - }, [runId]) - - const snapshot = useScenarioStepSnapshot(scenarioId, effectiveRunId) - - return useMemo(() => { - const data = snapshot.data - if (hasScenarioStepData(data)) return data - return undefined - }, [snapshot]) -} - -export default useEvalRunScenarioData diff --git a/web/oss/src/lib/hooks/useEvaluationRunData/useScenarioStepSnapshot.ts b/web/oss/src/lib/hooks/useEvaluationRunData/useScenarioStepSnapshot.ts deleted file mode 100644 index 0f8f58e28c..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunData/useScenarioStepSnapshot.ts +++ /dev/null @@ -1,82 +0,0 @@ -import {useMemo} from "react" - -import {atom, useAtomValue} from "jotai" -import {loadable} from "jotai/utils" -import type {Loadable} from "jotai/vanilla/utils/loadable" - -import {scenarioStepFamily, scenarioStepLocalFamily} from "./assets/atoms/runScopedScenarios" -import {UseEvaluationRunScenarioStepsFetcherResult} from "./useEvaluationRunScenarioSteps/types" - -export type ScenarioStepSnapshotState = Loadable["state"] - -export const hasScenarioStepData = ( - data?: Partial | null, -): data is UseEvaluationRunScenarioStepsFetcherResult => { - if (!data) return false - const withContent = - (Array.isArray((data as any).invocationSteps) && - (data as any).invocationSteps.length > 0) || - (Array.isArray((data as any).inputSteps) && (data as any).inputSteps.length > 0) || - (Array.isArray((data as any).annotationSteps) && - (data as any).annotationSteps.length > 0) || - (Array.isArray((data as any).steps) && (data as any).steps.length > 0) || - Boolean((data as any).trace) - - if (withContent) return true - return Object.keys(data).length > 0 -} - -export const useScenarioStepSnapshot = ( - scenarioId: string, - runId?: string | null, -): { - data?: UseEvaluationRunScenarioStepsFetcherResult - state: ScenarioStepSnapshotState - rawState: ScenarioStepSnapshotState - error?: unknown -} => { - const loadableAtom = useMemo(() => { - if (!runId) { - return atom>({ - state: "loading", - } as Loadable) - } - return loadable(scenarioStepFamily({scenarioId, runId})) - }, [runId, scenarioId]) - - const localAtom = useMemo(() => { - if (!runId) { - return atom(undefined) - } - return scenarioStepLocalFamily({scenarioId, runId}) - }, [runId, scenarioId]) - - const loadableStep = useAtomValue(loadableAtom) - const localData = useAtomValue(localAtom) as - | UseEvaluationRunScenarioStepsFetcherResult - | undefined - - const resolvedData = useMemo(() => { - const remoteData = loadableStep.state === "hasData" ? loadableStep.data : undefined - if (hasScenarioStepData(remoteData)) { - return remoteData - } - if (hasScenarioStepData(localData)) { - return localData - } - return remoteData - }, [loadableStep, localData]) - - const state: ScenarioStepSnapshotState = hasScenarioStepData(resolvedData) - ? "hasData" - : loadableStep.state - - const error = loadableStep.state === "hasError" ? loadableStep.error : undefined - - return { - data: resolvedData, - state, - rawState: loadableStep.state, - error, - } -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunMetrics/index.ts b/web/oss/src/lib/hooks/useEvaluationRunMetrics/index.ts deleted file mode 100644 index 3f5f158ef0..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunMetrics/index.ts +++ /dev/null @@ -1,112 +0,0 @@ -import {useMemo} from "react" - -import useSWR from "swr" - -import { - METRICS_ENDPOINT, - createScenarioMetrics, - updateMetric, - updateMetrics, - computeRunMetrics, -} from "@/oss/services/runMetrics/api" - -import {fetcher} from "./assets/utils" -import type { - MetricResponse, - Metric, - UseEvaluationRunMetricsOptions, - UseEvaluationRunMetricsResult, -} from "./types" - -/** - * Hook to fetch and create metrics for a specific evaluation run (and optionally scenario). - * - * @param runId The UUID of the evaluation run. If falsy, fetching is skipped. - * @param options Optional filters/pagination: { limit, next, scenarioIds, statuses }. - */ -const useEvaluationRunMetrics = ( - runIds: string | string[] | null | undefined, - scenarioId?: string | null, - options?: UseEvaluationRunMetricsOptions, -): UseEvaluationRunMetricsResult => { - // Build query parameters - const queryParams = new URLSearchParams() - - // Append one or many run_ids query params - if (runIds) { - if (Array.isArray(runIds) && runIds.length > 0) { - // Ensure deterministic ordering for SWR key stability - const sorted = [...runIds].sort() - sorted.forEach((id) => queryParams.append("run_ids", id)) - } else { - queryParams.append("run_ids", runIds) - } - } - if (options?.limit !== undefined) { - queryParams.append("limit", options.limit.toString()) - } - if (options?.next) { - queryParams.append("next", options.next) - } - if (scenarioId) { - queryParams.append("scenario_ids", scenarioId) - } else if (options?.scenarioIds) { - options.scenarioIds.forEach((sid) => queryParams.append("scenario_ids", sid)) - } - if (options?.statuses) { - options.statuses.forEach((st) => queryParams.append("status", st)) - } - - const swrKey = useMemo(() => { - const queryRunIds = queryParams.getAll("run_ids").filter((a) => a !== "undefined" && !!a) - const queryScenarioIds = queryParams - .getAll("scenario_ids") - .filter((a) => a !== "undefined" && !!a) - - return queryRunIds.length > 0 || queryScenarioIds.length > 0 - ? `${METRICS_ENDPOINT}?${queryParams.toString()}` - : null - }, [queryParams]) - - // SWR response typed to raw MetricResponse[] - const swrData = useSWR<{ - metrics: MetricResponse[] - count: number - next?: string - }>(swrKey, fetcher) - - // Convert raw MetricResponse[] to camelCase Metric[] - const rawMetrics = swrData.data?.metrics - const camelMetrics: Metric[] | undefined = rawMetrics - ? rawMetrics.map((item) => item) - : undefined - - const totalCount = swrData.data?.count - const nextToken = swrData.data?.next - - return { - get metrics() { - return camelMetrics - }, - get count() { - return totalCount - }, - get next() { - return nextToken - }, - get isLoading() { - return !swrData.error && !swrData.data - }, - get isError() { - return !!swrData.error - }, - swrData, - mutate: () => swrData.mutate(), - createScenarioMetrics, - updateMetric, - updateMetrics, - computeRunMetrics, - } -} - -export default useEvaluationRunMetrics diff --git a/web/oss/src/lib/hooks/useEvaluationRunMetrics/types.ts b/web/oss/src/lib/hooks/useEvaluationRunMetrics/types.ts deleted file mode 100644 index 20de372a60..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunMetrics/types.ts +++ /dev/null @@ -1,75 +0,0 @@ -import {EvaluationStatus, SnakeToCamelCaseKeys} from "@/oss/lib/Types" - -// Raw API response type for one metric (snake_case) -export interface MetricResponse { - id: string - run_id: string - scenario_id?: string - status?: EvaluationStatus - data: { - outputs: Record - } - created_at?: string - // …other fields in snake_case if backend adds more… -} - -// CamelCased version of MetricResponse -export type Metric = SnakeToCamelCaseKeys - -// Options for fetching metrics (pagination & filters) -export interface UseEvaluationRunMetricsOptions { - limit?: number - next?: string - scenarioIds?: string[] - statuses?: string[] -} - -// Result returned by useEvaluationRunMetrics hook -export interface UseEvaluationRunMetricsResult { - metrics: Metric[] | undefined - count?: number - next?: string - isLoading: boolean - isError: boolean - swrData: import("swr").SWRResponse< - { - metrics: MetricResponse[] - count: number - next?: string - }, - any - > - mutate: () => Promise - createScenarioMetrics: ( - apiUrl: string, - jwt: string, - runId: string, - entries: { - scenarioId: string - data: Record - }[], - ) => Promise - updateMetric: ( - apiUrl: string, - jwt: string, - metricId: string, - changes: { - data?: Record - status?: string - tags?: Record - meta?: Record - }, - ) => Promise - updateMetrics: ( - apiUrl: string, - jwt: string, - metrics: { - id: string - data?: Record - status?: string - tags?: Record - meta?: Record - }[], - ) => Promise - computeRunMetrics: (metrics: {data: Record}[]) => Record -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunScenarioSteps/types.ts b/web/oss/src/lib/hooks/useEvaluationRunScenarioSteps/types.ts deleted file mode 100644 index c5dfc42c3f..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunScenarioSteps/types.ts +++ /dev/null @@ -1,162 +0,0 @@ -import {SWRResponse, SWRConfiguration} from "swr" - -import type {PreviewTestset, SnakeToCamelCaseKeys} from "../../Types" -import {AnnotationDto} from "../useAnnotations/types" -import {RunIndex} from "../useEvaluationRunData/assets/helpers/buildRunIndex" - -// Step type for useEvaluationRunScenarioSteps fetcher result (camelCase, derived from StepResponseStep) -// Options for fetching steps (pagination, filters) -export interface UseEvaluationRunScenarioStepsOptions { - limit?: number - next?: string - keys?: string[] - statuses?: string[] -} - -// Result type returned by the hook -export interface UseEvaluationRunScenarioStepsResult { - isLoading: boolean - swrData: SWRResponse - // Function to revalidate - mutate: () => Promise -} - -export interface UseEvaluationRunScenarioStepsConfig extends SWRConfiguration { - concurrency?: number -} - -// --- Types for useEvaluationRunScenarioSteps fetcher result --- -export interface StepResponse { - steps: StepResponseStep[] - count: number - next?: string -} -export interface StepResponseStep { - id: string - // - run_id: string - scenario_id: string - step_key: string - repeat_idx?: number - timestamp?: string - interval?: number - // - status: string - // - // hash_id?: string - trace_id?: string - testcase_id?: string - error?: Record - // - created_at?: string - created_by_id?: string - // - is_legacy?: boolean - inputs?: Record - ground_truth?: Record -} -export type IStepResponse = SnakeToCamelCaseKeys - -export interface TraceNode { - trace_id: string - span_id: string - lifecycle: { - created_at: string - } - root: { - id: string - } - tree: { - id: string - } - node: { - id: string - name: string - type: string - } - parent?: { - id: string - } - time: { - start: string - end: string - } - status: { - code: string - } - data: Record - metrics: Record - refs: Record - otel: { - kind: string - attributes: Record - } - nodes?: Record -} - -export interface TraceData { - trees: TraceTree[] - version: string - count: number -} - -export interface TraceTree { - tree: { - id: string - } - nodes: TraceNode[] -} - -export type InvocationParameters = Record< - string, - { - requestBody: { - ag_config: { - prompt: { - messages: {role: string; content: string}[] - template_format: string - input_keys: string[] - llm_config: { - model: string - tools: any[] - } - } - } - inputs: Record - } - endpoint: string - } | null -> - -export interface IInvocationStep extends IStepResponse { - trace?: TraceTree - invocationParameters?: InvocationParameters -} - -export interface IInputStep extends IStepResponse { - inputs?: Record - groundTruth?: Record - testcase?: PreviewTestset["data"]["testcases"][number] -} -export interface IAnnotationStep extends IStepResponse { - annotation?: AnnotationDto -} - -export interface UseEvaluationRunScenarioStepsFetcherResult { - steps: IStepResponse[] - mappings?: any[] - - // Single primary steps (kept for backward compatibility) - // invocationStep?: IStepResponse - annotationSteps: IAnnotationStep[] - invocationSteps: IInvocationStep[] - inputSteps: IInputStep[] - annotations?: AnnotationDto[] | null - - // NEW: support multiple role steps per scenario - inputStep?: IStepResponse - scenarioId?: string - trace?: TraceTree | TraceData | null - // annotation?: AnnotationDto | null - invocationParameters?: InvocationParameters -} diff --git a/web/oss/src/lib/hooks/useEvaluationRunScenarios/index.ts b/web/oss/src/lib/hooks/useEvaluationRunScenarios/index.ts deleted file mode 100644 index 5b4396480b..0000000000 --- a/web/oss/src/lib/hooks/useEvaluationRunScenarios/index.ts +++ /dev/null @@ -1,133 +0,0 @@ -import {useCallback} from "react" - -import {useSetAtom} from "jotai" -import useSWR, {SWRConfiguration} from "swr" - -import axios from "@/oss/lib/api/assets/axiosConfig" -import {snakeToCamelCaseKeys} from "@/oss/lib/helpers/casing" - -import {evalAtomStore, loadingStateAtom} from "../useEvaluationRunData/assets/atoms" -import {evaluationRunStateFamily} from "../useEvaluationRunData/assets/atoms/runScopedAtoms" - -import {IScenario, ScenarioResponse, UseEvaluationRunScenariosOptions} from "./types" - -// Fetcher factory that posts a query to the new endpoint and syncs atoms of current store -const makeFetcher = ( - endpoint: string, - syncAtom: boolean, - setLoading: ReturnType, - runId?: string | null, - params?: UseEvaluationRunScenariosOptions, -): (() => Promise<{ - scenarios: IScenario[] - count: number - next?: string -}>) => { - return () => { - if (syncAtom) { - setLoading((draft) => { - draft.isLoadingScenarios = true - draft.isLoadingEvaluation = false - draft.activeStep = "scenarios" - }) - } - - // Build request body for /preview/evaluations/scenarios/query - const body: Record = { - scenario: { - ...(runId ? {run_ids: [runId]} : {}), - }, - windowing: { - ...(params?.limit !== undefined ? {limit: params.limit} : {}), - ...(params?.next ? {next: params.next} : {}), - }, - } - - return axios.post(endpoint, body).then((res) => { - const raw = res.data - const scenarios = Array.isArray(raw.scenarios) - ? (raw.scenarios.map((scenario: ScenarioResponse, index: number) => ({ - ...snakeToCamelCaseKeys(scenario), - scenarioIndex: (scenario.meta?.index || 0) + 1, - })) as IScenario[]) - : ([] as IScenario[]) - - if (syncAtom) { - setLoading((draft) => { - draft.isLoadingScenarios = false - draft.activeStep = null - }) - // Only sync to run-scoped atom if runId is available - if (runId) { - evalAtomStore().set(evaluationRunStateFamily(runId), (draft) => { - draft.scenarios = scenarios - }) - } - } - return { - scenarios, - count: raw.count as number, - next: raw.next as string | undefined, - } - }) - } -} - -/** - * @deprecated - * @param runId - * @param params - * @returns - */ -export const getEvaluationRunScenariosKey = ( - runId?: string | null | undefined, - params?: UseEvaluationRunScenariosOptions, -) => { - if (!runId) return null - const parts: string[] = ["scenarios-query", `run:${runId}`] - if (params?.limit !== undefined) parts.push(`limit:${params.limit}`) - if (params?.next) parts.push(`next:${params.next}`) - return parts.join("|") -} -/** - * @deprecated - * Hook to fetch scenarios belonging to a specific evaluation run, - * plus some “progress” aggregates (pending vs. completed). - * - * @param runId The UUID of the run. If falsy, fetching is skipped. - * @param params Optional pagination: { limit, next }. - */ - -interface UseEvaluationRunScenariosHookOptions extends SWRConfiguration { - syncAtom?: boolean -} -const useEvaluationRunScenarios = ( - runId: string | null | undefined, - params?: UseEvaluationRunScenariosOptions, - {syncAtom = true, ...options}: UseEvaluationRunScenariosHookOptions = {}, -) => { - const setLoading = useSetAtom(loadingStateAtom) - - // Build query string only if runId is provided - const swrKey = getEvaluationRunScenariosKey(runId, params) - - const fetcher = useCallback( - makeFetcher("/preview/evaluations/scenarios/query", syncAtom, setLoading, runId, params), - [syncAtom, setLoading, runId, params?.limit, params?.next], - ) - - const swrData = useSWR<{ - scenarios: IScenario[] - count: number - next?: string - }>(swrKey ? `${swrKey}-${syncAtom}` : null, swrKey ? fetcher : null, { - ...options, - revalidateIfStale: false, - revalidateOnFocus: false, - revalidateOnReconnect: false, - }) - - return swrData -} - -export default useEvaluationRunScenarios diff --git a/web/oss/src/lib/hooks/useEvaluations.ts b/web/oss/src/lib/hooks/useEvaluations.ts deleted file mode 100644 index abd1e09a49..0000000000 --- a/web/oss/src/lib/hooks/useEvaluations.ts +++ /dev/null @@ -1,385 +0,0 @@ -import {useMemo, useCallback} from "react" - -// import {useAppId} from "@/oss/hooks/useAppId" - -import axios from "@agenta/oss/src/lib/api/assets/axiosConfig" -import {EvaluationType} from "@agenta/oss/src/lib/enums" -import { - abTestingEvaluationTransformer, - fromEvaluationResponseToEvaluation, - singleModelTestEvaluationTransformer, -} from "@agenta/oss/src/lib/transformers" -import {Evaluation, EvaluationResponseType, ListAppsItem} from "@agenta/oss/src/lib/Types" -import {useAtomValue} from "jotai" -import useSWR from "swr" - -import {useAppId} from "@/oss/hooks/useAppId" -import {deleteEvaluations as deleteAutoEvaluations} from "@/oss/services/evaluations/api" -import {fetchAllEvaluations} from "@/oss/services/evaluations/api" -import {deleteEvaluations as deleteHumanEvaluations} from "@/oss/services/human-evaluations/api" -import {fetchAllLoadEvaluations, fetchEvaluationResults} from "@/oss/services/human-evaluations/api" -import {useAppsData} from "@/oss/state/app" -import {getProjectValues, projectIdAtom} from "@/oss/state/project" - -import usePreviewEvaluations from "./usePreviewEvaluations" - -const deleteRuns = async (ids: string[]) => { - const {projectId} = getProjectValues() - await axios.delete(`/preview/evaluations/runs/?project_id=${projectId}`, { - data: { - run_ids: ids, - }, - }) - - return ids -} - -/** - * Custom hook to manage evaluations, combining legacy evaluations and preview evaluations. - * - * @param {Object} params - Configuration object. - * @param {boolean} [params.withPreview] - Whether to include preview evaluations. - * @param {EvaluationType[]} params.types - List of evaluation types to filter. - * - * @returns {Object} An object containing: - * - `legacyEvaluations`: SWR object with data, error, and loading state for legacy evaluations. - * - `previewEvaluations`: Object with data and loading state for preview evaluations. - * - `mergedEvaluations`: Combined list of legacy and preview evaluations. - * - `isLoadingLegacy`: Loading state of legacy evaluations. - * - `isLoadingPreview`: Loading state of preview evaluations. - * - `refetch`: Function to refetch both legacy and preview evaluations. - * - `handleDeleteEvaluations`: Function to delete evaluations by IDs. - */ -const useEvaluations = ({ - withPreview, - types, - evalType, - appId: appIdOverride, -}: { - withPreview?: boolean - types: EvaluationType[] - evalType?: "human" | "auto" | "custom" - appId?: string | null -}) => { - const routeAppId = useAppId() - const appId = (appIdOverride ?? routeAppId) || undefined - const {apps: availableApps = []} = useAppsData() - const projectId = useAtomValue(projectIdAtom) - - const appIdsForScope = useMemo(() => { - if (appId) return [appId] - return (availableApps as ListAppsItem[]) - .map((application) => application.app_id) - .filter((id): id is string => typeof id === "string" && id.length > 0) - }, [appId, availableApps]) - - /** - * Fetches legacy evaluations for the given appId and transforms them into the required format. - * Also fetches auto evaluations if the selected types require it. - * Returns an object containing human and auto evaluations. - */ - const legacyFetcher = useCallback(async () => { - if (!projectId || appIdsForScope.length === 0) { - return { - humanEvals: [], - autoEvals: [], - } - } - - const needsAutoEvaluations = types.some((type) => - [ - EvaluationType.human_a_b_testing, - EvaluationType.single_model_test, - EvaluationType.human_scoring, - EvaluationType.auto_exact_match, - EvaluationType.automatic, - ].includes(type), - ) - - const responses = await Promise.all( - appIdsForScope.map(async (targetAppId) => { - const rawEvaluations: EvaluationResponseType[] = await fetchAllLoadEvaluations( - targetAppId, - projectId, - ) - - const preparedEvaluations = rawEvaluations - .map((evaluationResponse) => ({ - evaluation: { - ...fromEvaluationResponseToEvaluation(evaluationResponse), - appId: targetAppId, - }, - raw: evaluationResponse, - })) - .filter(({evaluation}) => types.includes(evaluation.evaluationType)) - - const results = await Promise.all( - preparedEvaluations.map(({evaluation}) => - fetchEvaluationResults(evaluation.id), - ), - ) - - const humanEvaluations = results - .map((result, index) => { - const {evaluation, raw} = preparedEvaluations[index] - if (!result) return undefined - - if (evaluation.evaluationType === EvaluationType.single_model_test) { - const transformed = singleModelTestEvaluationTransformer({ - item: evaluation, - result, - }) - return { - ...transformed, - appId: targetAppId, - appName: evaluation.appName, - } - } - - if (evaluation.evaluationType === EvaluationType.human_a_b_testing) { - if (Object.keys(result.votes_data || {}).length > 0) { - const transformed = abTestingEvaluationTransformer({ - item: raw, - results: result.votes_data, - }) - return { - ...transformed, - appId: targetAppId, - appName: evaluation.appName, - } - } - } - - return undefined - }) - .filter((item): item is Record => Boolean(item)) - .filter( - (item: any) => - item.resultsData !== undefined || - !(Object.keys(item.scoresData || {}).length === 0) || - item.avgScore !== undefined, - ) - - const autoEvaluations = needsAutoEvaluations - ? (await fetchAllEvaluations(targetAppId)) - .sort( - (a, b) => - new Date(b.created_at || 0).getTime() - - new Date(a.created_at || 0).getTime(), - ) - .map((evaluation) => ({ - ...evaluation, - appId: targetAppId, - })) - : [] - - return { - humanEvals: humanEvaluations, - autoEvals: autoEvaluations, - } - }), - ) - - const humanEvals = responses - .flatMap((response) => response.humanEvals) - .sort( - (a, b) => - new Date(b?.createdAt ?? 0).getTime() - new Date(a?.createdAt ?? 0).getTime(), - ) - const autoEvals = responses.flatMap((response) => response.autoEvals) - - return { - humanEvals, - autoEvals, - } - }, [appIdsForScope, projectId, types]) - - /** - * SWR hook for fetching and caching legacy evaluations using the legacyFetcher. - */ - const legacyEvaluations = useSWR( - !projectId || appIdsForScope.length === 0 - ? null - : ["legacy-evaluations", projectId, ...appIdsForScope], - legacyFetcher, - ) - - /** - * Hook for fetching preview evaluations if withPreview is enabled. - */ - const previewFlags = useMemo(() => { - if (evalType === "custom") { - return {is_live: false} - } - return undefined - }, [evalType]) - - const previewEvaluations = usePreviewEvaluations({ - skip: !withPreview, - types, - appId, - flags: previewFlags, - }) - - // Extract runs from preview evaluations - const {runs} = previewEvaluations || {} - - /** - * Lazily combines legacy and preview evaluations into a single array. - * Returns an empty array if either source is not yet loaded. - */ - const computeMergedEvaluations = useCallback( - (evalType?: "human" | "auto") => { - const legacyData = legacyEvaluations.data || {autoEvals: [], humanEvals: []} - const legacyAuto = legacyData.autoEvals || [] - const legacyHuman = legacyData.humanEvals || [] - let filteredLegacy = [] - if (types.includes(EvaluationType.single_model_test)) { - filteredLegacy = legacyHuman - } else { - filteredLegacy = legacyAuto - } - - if (!runs || !Array.isArray(runs)) { - return filteredLegacy - } - - // Filtering out evaluations based on eval type - let filteredRuns = [] - if (evalType === "human") { - filteredRuns = runs.filter((run) => - run?.data?.steps.some( - (step) => step.type === "annotation" && step.origin === "human", - ), - ) - if (filteredLegacy.length > 0) { - const autoEvalLagecyRuns = filteredLegacy.filter( - (run) => run?.evaluation_type === "single_model_test", - ) - - filteredRuns = [...filteredRuns, ...autoEvalLagecyRuns] - } - } else if (evalType === "auto") { - filteredRuns = runs - .filter((run) => - run?.data?.steps.every( - (step) => - step.type !== "annotation" || - step.origin === "auto" || - step.origin === undefined, - ), - ) - .filter((run) => { - const isLive = run?.flags?.isLive === true || run?.flags?.is_live === true - const source = - typeof run?.meta?.source === "string" - ? run.meta.source.toLowerCase() - : undefined - const isOnlineSource = source === "online_evaluation_drawer" - return !isLive && !isOnlineSource - }) - if (filteredLegacy.length > 0) { - const autoEvalLagecyRuns = filteredLegacy.filter( - (run) => "aggregated_results" in run, - ) - - filteredRuns = [...filteredRuns, ...autoEvalLagecyRuns] - } - } else if (evalType === "custom") { - filteredRuns = runs.filter((run) => { - const steps = Array.isArray(run?.data?.steps) ? run.data.steps : [] - const hasCustomStep = steps.some( - (step: any) => - step?.origin === "custom" || - step?.type === "custom" || - step?.metadata?.origin === "custom", - ) - if (!hasCustomStep) return false - - const source = - typeof run?.meta?.source === "string" - ? run.meta.source.toLowerCase() - : undefined - const isOnlineSource = source === "online_evaluation_drawer" - const isLive = run?.flags?.isLive === true || run?.flags?.is_live === true - - return hasCustomStep && !isOnlineSource && !isLive - }) - } else { - filteredRuns = [...filteredLegacy, ...runs] - } - - return filteredRuns.sort((a, b) => { - return b.createdAtTimestamp - a.createdAtTimestamp - }) - }, - [legacyEvaluations.data, runs, types, evalType], - ) - - /** - * Refetches both legacy and preview evaluations in parallel. - * Use this after mutations that affect evaluation data. - */ - const refetchAll = useCallback(async () => { - await Promise.all([legacyEvaluations.mutate(), previewEvaluations.swrData.mutate()]) - }, [legacyEvaluations, previewEvaluations]) - - /** - * Deletes evaluations by IDs, handling both legacy and preview evaluations. - * Determines which IDs correspond to legacy or preview runs, deletes them accordingly, and refetches all data. - * @param _ids - Single ID or array of IDs to delete - */ - const handleDeleteEvaluations = useCallback( - async (_ids: string[] | string) => { - const ids = Array.isArray(_ids) ? _ids : typeof _ids === "string" ? [_ids] : [] - const listOfLegacyEvals = - evalType === "auto" - ? legacyEvaluations.data?.autoEvals || [] - : evalType === "human" - ? legacyEvaluations.data?.humanEvals || [] - : [] - - // Determine which IDs are legacy evaluations - const legacyEvals = listOfLegacyEvals - .filter((e) => ids.includes(e.key || e.id)) - .map((e) => e.key || e.id) - - // IDs that are preview runs - const runsIds = ids.filter((id) => !legacyEvals.includes(id)) - try { - if (legacyEvals.length > 0) { - if (evalType === "auto") { - await deleteAutoEvaluations(ids) - } else { - await deleteHumanEvaluations(ids) - } - } - - if (runsIds.length > 0) { - await deleteRuns(runsIds) - } - await refetchAll() - } catch (error) { - console.error(error) - } - }, - [legacyEvaluations, refetchAll], - ) - - const mergedEvaluations = useMemo( - () => computeMergedEvaluations(evalType), - [computeMergedEvaluations, evalType], - ) - - return { - legacyEvaluations, - previewEvaluations, - mergedEvaluations, - isLoadingLegacy: legacyEvaluations.isLoading, - isLoadingPreview: previewEvaluations?.swrData?.isLoading ?? false, - refetch: refetchAll, - handleDeleteEvaluations, - } -} - -export default useEvaluations diff --git a/web/oss/src/lib/hooks/useEvaluatorConfigs/index.ts b/web/oss/src/lib/hooks/useEvaluatorConfigs/index.ts index 00c1ec5f83..224cc7cfa0 100644 --- a/web/oss/src/lib/hooks/useEvaluatorConfigs/index.ts +++ b/web/oss/src/lib/hooks/useEvaluatorConfigs/index.ts @@ -1,10 +1,11 @@ -import {useEffect, useMemo} from "react" +import {useCallback} from "react" -import {useAtomValue} from "jotai" +import useSWR from "swr" import {SWRConfiguration} from "swr" +import {DEFAULT_UUID, getCurrentProject} from "@/oss/contexts/project.context" import {useAppId} from "@/oss/hooks/useAppId" -import {evaluatorConfigsQueryAtomFamily} from "@/oss/state/evaluators" +import {fetchAllEvaluatorConfigs} from "@/oss/services/evaluators" import {EvaluatorConfig} from "../../Types" @@ -12,71 +13,29 @@ type EvaluatorConfigResult = Preview extends true ? undefined : EvaluatorConfig[] -type EvaluatorConfigsOptions = { - preview?: Preview - appId?: string | null -} & Pick - -export type UseEvaluatorConfigsReturn = { - data: EvaluatorConfigResult | undefined - error: unknown - isLoading: boolean - isPending: boolean - isError: boolean - isSuccess: boolean - refetch: () => Promise - mutate: () => Promise -} - -const useEvaluatorConfigs = ( - { - preview, - appId: appIdOverride, - onSuccess, - onError, - }: EvaluatorConfigsOptions = {} as EvaluatorConfigsOptions, -): UseEvaluatorConfigsReturn => { - const routeAppId = useAppId() - const appId = appIdOverride ?? routeAppId - - const atomParams = useMemo( - () => ({ - appId: appId ?? null, - preview: Boolean(preview), - }), - [appId, preview], +const useEvaluatorConfigs = ({ + preview, + ...options +}: {preview?: Preview} & SWRConfiguration) => { + const {projectId} = getCurrentProject() + const appId = useAppId() + + const fetcher = useCallback(async () => { + const data = await fetchAllEvaluatorConfigs(appId) + return data as EvaluatorConfigResult + }, [projectId, appId]) + + return useSWR, any>( + !preview && appId && projectId !== DEFAULT_UUID + ? `/api/preview/evaluator_configs/?project_id=${projectId}&app_id=${appId}` + : null, + fetcher, + { + revalidateOnFocus: false, + shouldRetryOnError: false, + ...options, + }, ) - - const queryAtom = useMemo(() => evaluatorConfigsQueryAtomFamily(atomParams), [atomParams]) - - const queryResult = useAtomValue(queryAtom) - - useEffect(() => { - if (!onSuccess || preview) return - if (!queryResult.isSuccess) return - onSuccess( - queryResult.data as EvaluatorConfigResult, - queryResult.queryKey ?? [], - undefined, - ) - }, [onSuccess, preview, queryResult.data, queryResult.isSuccess, queryResult.queryKey]) - - useEffect(() => { - if (!onError || preview) return - if (!queryResult.isError) return - onError(queryResult.error) - }, [onError, preview, queryResult.error, queryResult.isError]) - - return { - data: queryResult.data as EvaluatorConfigResult | undefined, - error: queryResult.error, - isLoading: queryResult.isPending, - isPending: queryResult.isPending, - isError: queryResult.isError, - isSuccess: queryResult.isSuccess, - refetch: queryResult.refetch, - mutate: queryResult.refetch, - } } export default useEvaluatorConfigs diff --git a/web/oss/src/lib/hooks/useEvaluators/index.ts b/web/oss/src/lib/hooks/useEvaluators/index.ts index 2444832a55..213ac33d13 100644 --- a/web/oss/src/lib/hooks/useEvaluators/index.ts +++ b/web/oss/src/lib/hooks/useEvaluators/index.ts @@ -1,84 +1,82 @@ -import {useEffect, useMemo} from "react" +import {useCallback} from "react" -import {useAtomValue} from "jotai" -import {SWRConfiguration} from "swr" +import useSWR, {SWRResponse} from "swr" -import {evaluatorsQueryAtomFamily} from "@/oss/state/evaluators" +import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" +import {useOrgData} from "@/oss/contexts/org.context" +import {DEFAULT_UUID, getCurrentProject} from "@/oss/contexts/project.context" +import {fetchAllEvaluators} from "@/oss/services/evaluators" +import axios from "../../api/assets/axiosConfig" import {Evaluator} from "../../Types" +import {transformApiData} from "../useAnnotations/assets/transformer" -import {EvaluatorPreviewDto, UseEvaluatorsOptions} from "./types" +import { + EvaluatorDto, + EvaluatorsResponseDto, + EvaluatorPreviewDto, + UseEvaluatorsOptions, +} from "./types" -export interface UseEvaluatorsReturn { - data: (Preview extends true ? EvaluatorPreviewDto[] : Evaluator[]) | undefined - error: unknown - isLoading: boolean - isPending: boolean - isError: boolean - isSuccess: boolean - refetch: () => Promise - mutate: () => Promise -} +type UseEvaluatorsReturn = SWRResponse< + Preview extends true ? EvaluatorPreviewDto[] : Evaluator[], + any +> const useEvaluators = ({ preview, queries, - onSuccess, - onError, - projectId, + ...options }: UseEvaluatorsOptions & { preview?: Preview queries?: {is_human: boolean} - onSuccess?: ( - data: (Preview extends true ? EvaluatorPreviewDto[] : Evaluator[]) | undefined, - key: readonly unknown[], - config: SWRConfiguration | undefined, - ) => void - onError?: (error: unknown) => void -} = {}): UseEvaluatorsReturn => { - const queriesKey = useMemo(() => JSON.stringify(queries ?? null), [queries]) - - const atomParams = useMemo( - () => ({ - projectId: projectId ?? null, - preview: Boolean(preview), - queriesKey, - }), - [projectId, preview, queriesKey], - ) +}): UseEvaluatorsReturn => { + const {selectedOrg} = useOrgData() + const projectId = options?.projectId || getCurrentProject()?.projectId || "" + const workspace = selectedOrg?.default_workspace + const members = workspace?.members || [] - const queryAtom = useMemo(() => evaluatorsQueryAtomFamily(atomParams), [atomParams]) + type Data = Preview extends true ? EvaluatorPreviewDto[] : Evaluator[] - const queryResult = useAtomValue(queryAtom) + const fetcher = useCallback(async (): Promise => { + if (preview) { + const response = await axios.post( + `/preview/simple/evaluators/query?project_id=${projectId}`, + queries + ? { + evaluator: { + flags: queries, + }, + } + : {}, + ) + const data = + (response?.data?.evaluators || []).map((evaluator) => + transformApiData({data: evaluator, members}), + ) || [] + const withMetrics = data.map((d) => ({ + ...d, + metrics: getMetricsFromEvaluator(d as EvaluatorDto), + })) + return withMetrics as unknown as Data + } else { + // Non-preview mode returns full Evaluator objects + const data = await fetchAllEvaluators() + return data as Data + } + }, [projectId, preview, queries]) - useEffect(() => { - if (!onSuccess || !queryResult.isSuccess) return - onSuccess( - queryResult.data as - | (Preview extends true ? EvaluatorPreviewDto[] : Evaluator[]) - | undefined, - queryResult.queryKey ?? [], - undefined, - ) - }, [onSuccess, queryResult.data, queryResult.isSuccess, queryResult.queryKey]) - - useEffect(() => { - if (!onError || !queryResult.isError) return - onError(queryResult.error) - }, [onError, queryResult.error, queryResult.isError]) - - return { - data: queryResult.data as - | (Preview extends true ? EvaluatorPreviewDto[] : Evaluator[]) - | undefined, - error: queryResult.error, - isLoading: queryResult.isPending, - isPending: queryResult.isPending, - isError: queryResult.isError, - isSuccess: queryResult.isSuccess, - refetch: queryResult.refetch, - mutate: queryResult.refetch, - } + return useSWR( + projectId && projectId !== DEFAULT_UUID + ? `/api${preview ? "/preview" : ""}/evaluators/?project_id=${projectId}` + : null, + fetcher, + { + revalidateOnFocus: false, + shouldRetryOnError: false, + ...options, + }, + ) } export default useEvaluators diff --git a/web/oss/src/lib/hooks/useEvaluators/types.ts b/web/oss/src/lib/hooks/useEvaluators/types.ts index acd165910d..91bdb1a244 100644 --- a/web/oss/src/lib/hooks/useEvaluators/types.ts +++ b/web/oss/src/lib/hooks/useEvaluators/types.ts @@ -18,46 +18,21 @@ export interface EvaluatorData { } } -export interface EvaluatorRevisionDto { - id?: string - slug?: string - evaluator_id?: string - evaluator_variant_id?: string - version?: string - data?: Record - flags?: Record - meta?: Record - tags?: Record +export type EvaluatorPreviewDto = EvaluatorDto & { + /** + * Computed metrics schema derived from EvaluatorDto.data + */ + metrics: Record } -export interface EvaluatorRevisionsResponseDto { - count?: number - evaluator_revisions?: EvaluatorRevisionDto[] -} - -export type EvaluatorPreviewDto = EvaluatorDto<"payload"> & - EvaluatorDto<"response"> & { - /** - * Computed metrics schema derived from EvaluatorDto.data - */ - metrics: Record - revision?: EvaluatorRevisionDto - } - -type EvaluatorDtoBase = { +export type EvaluatorDto = { name: string slug: string - key?: string description: string data: EvaluatorData - tags?: string[] | Record | string - flags?: Record - meta?: Record - requires_llm_api_keys?: boolean -} - -export type EvaluatorDto = EvaluatorDtoBase & - (T extends "response" ? {id: string; created_at: string; created_by_id: string} : {id?: string}) +} & (T extends "response" + ? {id: string; created_at: string; created_by_id: string} + : {meta: Record; flags: Record}) export type EvaluatorResponseDto = T extends "response" @@ -73,3 +48,4 @@ export interface UseEvaluatorsOptions extends SWRConfiguration { preview?: boolean projectId?: string } + diff --git a/web/oss/src/lib/hooks/useFetchEvaluatorsData/index.tsx b/web/oss/src/lib/hooks/useFetchEvaluatorsData/index.tsx index 497dbd8994..acbc63fd9b 100644 --- a/web/oss/src/lib/hooks/useFetchEvaluatorsData/index.tsx +++ b/web/oss/src/lib/hooks/useFetchEvaluatorsData/index.tsx @@ -1,11 +1,12 @@ import {useCallback} from "react" import {useSetAtom} from "jotai" +import {SWRResponse} from "swr" import {evaluatorConfigsAtom, evaluatorsAtom} from "../../atoms/evaluation" import {Evaluator, EvaluatorConfig} from "../../Types" -import useEvaluatorConfigs, {UseEvaluatorConfigsReturn} from "../useEvaluatorConfigs" -import useEvaluators, {UseEvaluatorsReturn} from "../useEvaluators" +import useEvaluatorConfigs from "../useEvaluatorConfigs" +import useEvaluators from "../useEvaluators" import {EvaluatorPreviewDto} from "../useEvaluators/types" interface EvaluatorsData { @@ -14,16 +15,12 @@ interface EvaluatorsData { refetchEvaluators: () => Promise refetchEvaluatorConfigs: () => Promise refetchAll: () => Promise - evaluatorsSwr: UseEvaluatorsReturn - evaluatorConfigsSwr: UseEvaluatorConfigsReturn + evaluatorsSwr: SWRResponse + evaluatorConfigsSwr: SWRResponse } const useFetchEvaluatorsData = ( - { - preview, - queries, - appId, - }: {preview?: Preview; queries?: {is_human: boolean}; appId?: string | null} = { + {preview, queries}: {preview?: Preview; queries?: {is_human: boolean}} = { preview: false as Preview, }, ): EvaluatorsData => { @@ -43,7 +40,6 @@ const useFetchEvaluatorsData = ( setEvaluatorConfigs(data) }, preview, - appId, }) const refetchAll = useCallback(async () => { diff --git a/web/oss/src/lib/hooks/useInvocationResult/index.ts b/web/oss/src/lib/hooks/useInvocationResult/index.ts deleted file mode 100644 index 201f709a48..0000000000 --- a/web/oss/src/lib/hooks/useInvocationResult/index.ts +++ /dev/null @@ -1,277 +0,0 @@ -import {useEffect, useMemo, useState} from "react" - -import {useAtomValue} from "jotai" - -import {renderChatMessages} from "@/oss/components/EvalRunDetails/assets/renderChatMessages" -import {evalTypeAtom} from "@/oss/components/EvalRunDetails/state/evalType" -import {useRunId} from "@agenta/oss/src/contexts/RunIdContext" -import axios from "@/oss/lib/api/assets/axiosConfig" -import {snakeToCamelCaseKeys} from "@/oss/lib/helpers/casing" -import {readInvocationResponse} from "@/oss/lib/helpers/traceUtils" -import {projectIdAtom} from "@/oss/state/project/selectors/project" - -import {getCurrentRunId} from "../useEvaluationRunData/assets/atoms/migrationHelper" -import {scenarioStatusAtomFamily} from "../useEvaluationRunData/assets/atoms/progress" -import useEvalRunScenarioData from "../useEvaluationRunData/useEvalRunScenarioData" - -import type {UseInvocationResult, UseInvocationResultArgs} from "./types" - -export function useInvocationResult({ - scenarioId, - stepKey, - runId: maybeRunId, - editorType = "shared", - viewType = "single", -}: UseInvocationResultArgs): UseInvocationResult { - // Use provided runId or fallback to current run context (memoized to prevent infinite loops) - const contextRunId = useRunId() - const runId = useMemo(() => { - if (maybeRunId) return maybeRunId - if (contextRunId) return contextRunId - try { - return getCurrentRunId() - } catch (error) { - console.warn("[useInvocationResult] No run ID available:", error) - return null - } - }, [maybeRunId, contextRunId]) - - const evalType = useAtomValue(evalTypeAtom) - const projectId = useAtomValue(projectIdAtom) - // Call all hooks before any early returns - const data = useEvalRunScenarioData(scenarioId, runId || "") - - // Read from the same global store that writes are going to - const status = useAtomValue( - useMemo( - () => scenarioStatusAtomFamily({scenarioId, runId: runId || ""}), - [scenarioId, runId], - ), - ) as any - - // Early return if no runId is available - if (!runId) { - return { - trace: undefined, - value: undefined, - rawValue: undefined, - messageNodes: null, - status: undefined, - } - } - - const [remoteStep, setRemoteStep] = useState(null) - const [remoteError, setRemoteError] = useState(null) - const [remoteTrace, setRemoteTrace] = useState(null) - const [remoteTraceError, setRemoteTraceError] = useState(null) - - useEffect(() => { - if (!runId || !scenarioId || !stepKey || !projectId) return - if (remoteStep || remoteError) return - if (status?.trace) return - - const existing = data?.invocationSteps?.find((step) => step.stepKey === stepKey) - if (existing && (existing.trace || existing.data)) return - - let aborted = false - ;(async () => { - try { - const response = await axios.post( - `/preview/evaluations/results/query?project_id=${projectId}`, - { - result: { - run_ids: [runId], - scenario_ids: [scenarioId], - step_keys: [stepKey], - }, - windowing: {limit: 1}, - }, - ) - if (aborted) return - const payload = response.data || {} - const list: any[] = Array.isArray(payload.results) - ? payload.results - : Array.isArray(payload.steps) - ? payload.steps - : [] - const match = list.find((item) => { - const key = item?.step_key || item?.stepKey - const sid = item?.scenario_id || item?.scenarioId - return (!key || key === stepKey) && (!sid || sid === scenarioId) - }) - if (match) { - const normalized = snakeToCamelCaseKeys(match) - normalized.stepKey = normalized.stepKey || stepKey - normalized.scenarioId = normalized.scenarioId || scenarioId - setRemoteStep(normalized) - } else { - setRemoteError(new Error("No invocation result found")) - } - } catch (error) { - if (!aborted) setRemoteError(error) - } - })() - return () => { - aborted = true - } - }, [ - runId, - scenarioId, - stepKey, - projectId, - data?.invocationSteps, - status?.trace, - remoteStep, - remoteError, - ]) - - useEffect(() => { - if (!remoteStep || remoteStep.trace) return - if (remoteTrace || remoteTraceError) return - const traceId: string | undefined = remoteStep.traceId || remoteStep.trace_id - if (!traceId || !projectId) return - - let cancelled = false - ;(async () => { - try { - const filtering = JSON.stringify({ - conditions: [{key: "tree.id", operator: "in", value: [traceId]}], - }) - const response = await axios.get("/observability/v1/traces", { - params: {project_id: projectId, filtering, limit: 1}, - }) - if (cancelled) return - const tree = response?.data?.trees?.[0] - if (tree) { - setRemoteTrace(tree) - } else { - setRemoteTraceError(new Error("Trace not found")) - } - } catch (error) { - if (!cancelled) setRemoteTraceError(error) - } - })() - - return () => { - cancelled = true - } - }, [remoteStep, remoteTrace, remoteTraceError, projectId]) - - const scenarioDataWithFallback = useMemo(() => { - const baseData = data || {} - if (!remoteStep) return baseData - - const existingSteps = Array.isArray(baseData.invocationSteps) - ? baseData.invocationSteps - : [] - const matchedIndex = existingSteps.findIndex((step) => step.stepKey === remoteStep.stepKey) - - const remoteTraceValue = remoteStep.trace || remoteTrace - if (matchedIndex >= 0) { - if (remoteTraceValue && !existingSteps[matchedIndex]?.trace) { - const mergedStep = { - ...existingSteps[matchedIndex], - trace: remoteTraceValue, - } - const mergedSteps = [...existingSteps] - mergedSteps[matchedIndex] = mergedStep - return { - ...baseData, - invocationSteps: mergedSteps, - } - } - return baseData - } - - const enriched = remoteTraceValue ? {...remoteStep, trace: remoteTraceValue} : remoteStep - return { - ...baseData, - invocationSteps: [enriched, ...existingSteps], - } - }, [data, remoteStep, remoteTrace]) - - const { - trace: _trace, - value: derivedVal, - rawValue, - } = readInvocationResponse({ - scenarioData: scenarioDataWithFallback, - stepKey, - forceTrace: status?.trace, - optimisticResult: status?.result, - scenarioId, - evalType, - }) - - const trace = status?.trace || _trace - // For auto evaluation only - const errorMessage = useMemo(() => { - if (evalType !== "auto") return "" - const findInvocation = scenarioDataWithFallback?.invocationSteps?.find( - (d) => d.scenarioId === scenarioId, - ) - return findInvocation?.error?.stacktrace ?? "" - }, [scenarioDataWithFallback, scenarioId, evalType]) - - const {messageNodes, value, hasError} = useMemo(() => { - // Determine chat vs primitive - let messageNodes: React.ReactNode[] | null = null - let value: string | object | undefined = undefined - let hasError = false - - if (trace?.exception) { - value = trace?.exception?.message - hasError = true - } else if (errorMessage) { - value = errorMessage - hasError = true - } else { - const processChat = (jsonStr: string) => { - try { - const arr = JSON.parse(jsonStr) - if ( - Array.isArray(arr) && - arr.every((m: any) => "role" in m && "content" in m) - ) { - return renderChatMessages({ - keyPrefix: `${scenarioId}-${stepKey}`, - rawJson: jsonStr, - view: viewType, - editorType, - }) - } - - return null - } catch (err) {} - } - - if (rawValue) { - if (typeof rawValue === "string") { - messageNodes = processChat(rawValue) - if (!messageNodes) value = rawValue - } else if ( - typeof rawValue === "object" && - "role" in rawValue && - "content" in rawValue - ) { - messageNodes = renderChatMessages({ - keyPrefix: `${scenarioId}-${stepKey}-${trace?.trace_id ?? ""}`, - rawJson: JSON.stringify([rawValue]), - view: viewType, - editorType, - }) - } else { - value = rawValue as any - } - } - - if (!messageNodes) { - value = value ?? derivedVal - } - } - - return {messageNodes, value, hasError} - }, [trace, errorMessage, rawValue, derivedVal, scenarioId, stepKey, viewType, editorType]) - - return {trace, value, rawValue, messageNodes, status, hasError} -} diff --git a/web/oss/src/lib/hooks/useInvocationResult/types.ts b/web/oss/src/lib/hooks/useInvocationResult/types.ts deleted file mode 100644 index 32646e425f..0000000000 --- a/web/oss/src/lib/hooks/useInvocationResult/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {ScenarioStatusMap} from "../useEvaluationRunData/types" - -export interface UseInvocationResultArgs { - scenarioId: string - stepKey: string - runId?: string // Optional: for multi-run support - editorType?: "simple" | "shared" - viewType?: "single" | "table" -} - -export interface UseInvocationResult { - trace?: any - value?: string | object - rawValue?: any - messageNodes: React.ReactNode[] | null - status?: ScenarioStatusMap[string] - hasError?: boolean -} diff --git a/web/oss/src/lib/hooks/useLegacyVariant.ts b/web/oss/src/lib/hooks/useLegacyVariant.ts new file mode 100644 index 0000000000..68f44926ac --- /dev/null +++ b/web/oss/src/lib/hooks/useLegacyVariant.ts @@ -0,0 +1,292 @@ +// @ts-nocheck +import {useState, useEffect, useRef, useCallback} from "react" + +import {getAllVariantParameters, updateInputParams} from "@/oss/lib/helpers/variantHelper" +import {Variant, Parameter} from "@/oss/lib/Types" +import {fetchVariants} from "@/oss/services/api" +import { + createNewVariant, + fetchVariantLogs, + updateVariantParams, +} from "@/oss/services/playground/api" + +import {PERMISSION_ERR_MSG} from "../api/assets/axiosConfig" + +/** + * Hook for using the variant. + * @param appId + * @param variantName + * @param sourceVariantName The original variant name, this is important for determining the URI path + * @returns + */ +export function useLegacyVariant(options: {appId: string}, variant: Variant) { + const {appId} = options + const [historyStatus, setHistoryStatus] = useState({loading: false, error: false}) + const [promptOptParams, setPromptOptParams] = useState(null) + const [inputParams, setInputParams] = useState(null) + const [URIPath, setURIPath] = useState(null) + const [isLoading, setIsLoading] = useState(true) + const [isError, setIsError] = useState(false) + const [error, setError] = useState(null) + const [isParamSaveLoading, setIsParamSaveLoading] = useState(false) + const [isChatVariant, setIsChatVariant] = useState(null) + const [isLogsLoading, setIsLogsLoading] = useState(false) + const [variantErrorLogs, setVariantErrorLogs] = useState("") + const onClickShowLogs = useRef(false) + + console.log("useLegacyVariant") + const getVariantLogs = async () => { + try { + setIsLogsLoading(true) + const logs = await fetchVariantLogs(variant.variantId) + setVariantErrorLogs(logs) + } catch (error) { + console.error(error) + } finally { + setIsLogsLoading(false) + } + } + + const fetchParameters = async () => { + setIsLoading(true) + setIsError(false) + setHistoryStatus({loading: true, error: false}) + try { + const {parameters, inputs, URIPath, isChatVariant} = await getAllVariantParameters( + appId, + variant, + ) + setPromptOptParams(parameters) + setInputParams(inputs) + setURIPath(URIPath) + setIsChatVariant(isChatVariant) + setHistoryStatus({loading: false, error: false}) + } catch (error: any) { + if (error.message !== PERMISSION_ERR_MSG) { + console.error(error) + setIsError(true) + setError(error) + setHistoryStatus({loading: false, error: true}) + } + } finally { + setIsLoading(false) + } + } + + useEffect(() => { + if (variant?.variantName && appId) fetchParameters() + }, [variant?.variantName]) + + useEffect(() => { + const updatedInputParams = updateInputParams(promptOptParams, inputParams || []) + setInputParams(updatedInputParams) + }, [promptOptParams]) + + /** + * Saves new values for the optional parameters of the variant. + * @param updatedOptParams + * @param persist + */ + const saveOptParams = async ( + updatedOptParams: Parameter[], + persist: boolean, + updateVariant: boolean, + onSuccess?: (isNew: boolean) => void, + ) => { + setIsParamSaveLoading(true) + setIsError(false) + try { + if (persist) { + if (!updateVariant) { + await createNewVariant( + variant.baseId, + variant.variantName, + variant.configName, + updatedOptParams, + ) + } else if (updateVariant) { + await updateVariantParams(variant.variantId, updatedOptParams) + } + if (onSuccess) onSuccess(!updateVariant) + variant.parameters = updatedOptParams.reduce((acc, param) => { + return {...acc, [param.name]: param.default} + }, {}) + } + setPromptOptParams(updatedOptParams) + } catch (error: any) { + if (error.message !== PERMISSION_ERR_MSG) { + setIsError(true) + } + } finally { + setIsParamSaveLoading(false) + } + } + + return { + inputParams, + promptOptParams, + URIPath, + isLoading, + isError, + error, + isParamSaveLoading, + saveOptParams, + refetch: fetchParameters, + isChatVariant, + historyStatus, + setPromptOptParams, + setHistoryStatus, + getVariantLogs, + isLogsLoading, + variantErrorLogs, + setIsLogsLoading, + onClickShowLogs, + } +} + +// array version of useLegacyVariant +export function useLegacyVariants(options: {appId?: string}, propsVariants: Variant[] = []) { + const appId = options.appId + const [isVariantsLoading, setIsVariantsLoading] = useState(false) + const [state, setState] = useState[]>([]) + const [isVariantsError, setIsVariantsError] = useState(false) + + const fetchDetails = useCallback( + async (variants: Variant[]) => { + const res = await Promise.all( + variants.map(async (variant) => { + try { + const data = await getAllVariantParameters(appId, variant) + return { + data: { + ...data, + variant, + }, + error: null, + } + } catch (error) { + return {data: null, error} + } + }), + ) + + const newState = res.map(({data, error}) => { + const {variant, parameters, inputs, URIPath, isChatVariant} = data || {} + return { + variant: variant, + promptOptParams: parameters, + inputParams: inputs, + URIPath, + isLoading: false, + isError: !!error, + error, + isParamSaveLoading: false, + isChatVariant, + } + }) + return newState + }, + [appId], + ) + + useEffect(() => { + if (isVariantsLoading) return + if (state.length) return + + const fetchData = async () => { + setIsVariantsLoading(true) + try { + const variants = propsVariants.length ? propsVariants : await fetchVariants(appId) + if (variants.length > 0) { + const newState = await fetchDetails(variants) + setState(newState) + } + } catch (error) { + setIsVariantsError(error) + } finally { + setIsVariantsLoading(false) + } + } + fetchData() + }, [appId, fetchDetails, isVariantsLoading, state.length, propsVariants]) + + const getSaveOptParams = + (ix: number) => + async (updatedOptParams: Parameter[], persist: boolean, updateVariant: boolean) => { + setState((prevState) => { + return prevState.map((prev, i) => { + if (i === ix) { + return { + ...prev, + isParamSaveLoading: true, + isError: false, + } + } + return prev + }) + }) + const variant = variants[ix] + try { + if (persist) { + if (!updateVariant) { + await createNewVariant( + variant.baseId, + variant.variantName, + variant.configName, + updatedOptParams, + ) + } else if (updateVariant) { + await updateVariantParams(variant.variantId, updatedOptParams) + } + variant.parameters = updatedOptParams.reduce((acc, param) => { + return {...acc, [param.name]: param.default} + }, {}) + } + + setState((prevState) => { + return prevState.map((prev, i) => { + if (i === ix) { + return { + ...prev, + promptOptParams: updatedOptParams, + } + } + return prev + }) + }) + } catch (error) { + setState((prevState) => { + return prevState.map((prev, i) => { + if (i === ix) { + return { + ...prev, + isError: true, + } + } + return prev + }) + }) + } finally { + setState((prevState) => { + return prevState.map((prev, i) => { + if (i === ix) { + return { + ...prev, + isParamSaveLoading: false, + } + } + return prev + }) + }) + } + } + + return { + getSaveOptParams, + error: isVariantsError, + isLoading: isVariantsLoading, + data: { + variants: state, + }, + } +} diff --git a/web/oss/src/lib/hooks/usePreviewEvaluations/assets/utils.ts b/web/oss/src/lib/hooks/usePreviewEvaluations/assets/utils.ts deleted file mode 100644 index 57230b6c89..0000000000 --- a/web/oss/src/lib/hooks/usePreviewEvaluations/assets/utils.ts +++ /dev/null @@ -1,627 +0,0 @@ -import {useCallback, useMemo} from "react" - -import {getDefaultStore} from "jotai" - -import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" -import {useAppId} from "@/oss/hooks/useAppId" -import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" -import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" -import {RunIndex, StepMeta} from "@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex" -import useEvaluators from "@/oss/lib/hooks/useEvaluators" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import { - EnrichedEvaluationRun, - EvaluationRun, - IEvaluationRunDataStep, -} from "@/oss/lib/hooks/usePreviewEvaluations/types" -import useStatelessVariants from "@/oss/lib/hooks/useStatelessVariants" -import {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" -import {AgentaConfigPrompt, EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {WorkspaceMember, SnakeToCamelCaseKeys, PreviewTestset} from "@/oss/lib/Types" -import {useAppList} from "@/oss/state/app/hooks" -import {transformedPromptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {useOrgData} from "@/oss/state/org" -// import {getProjectValues} from "@/oss/state/project" - -const pickString = (...values: unknown[]): string | undefined => { - for (const value of values) { - if (typeof value !== "string") continue - const trimmed = value.trim() - if (!trimmed) continue - return trimmed - } - return undefined -} - -const deriveInvocationMetadata = (runIndex?: RunIndex) => { - if (!runIndex) return null - const [firstInvocationKey] = Array.from(runIndex.invocationKeys) - if (!firstInvocationKey) return null - const meta = runIndex.steps[firstInvocationKey] - if (!meta) return null - const refs = meta.refs ?? {} - - const applicationRevision = - refs.applicationRevision || refs.application_revision || refs.revision - const applicationRef = - refs.application || - applicationRevision?.application || - refs.applicationRef || - refs.application_ref - const variantRef = - refs.variant || - refs.variantRef || - refs.variant_ref || - refs.applicationVariant || - refs.application_variant - - const appId = pickString( - applicationRef?.id, - applicationRef?.app_id, - applicationRef?.appId, - applicationRevision?.application_id, - applicationRevision?.applicationId, - refs.application?.id, - refs.application?.app_id, - refs.application?.appId, - ) - - const appName = pickString( - applicationRef?.name, - applicationRef?.slug, - refs.application?.name, - refs.application?.slug, - ) - - const variantName = pickString( - variantRef?.name, - variantRef?.slug, - variantRef?.variantName, - variantRef?.variant_name, - applicationRef?.name, - applicationRef?.slug, - refs.application?.name, - refs.application?.slug, - meta.key, - ) - - const revisionId = pickString( - variantRef?.id, - variantRef?.revisionId, - variantRef?.revision_id, - applicationRevision?.id, - applicationRevision?.revisionId, - applicationRevision?.revision_id, - ) - - const revisionLabel = - pickString( - variantRef?.version, - variantRef?.revision, - variantRef?.revisionLabel, - applicationRevision?.revision, - applicationRevision?.version, - applicationRevision?.name, - ) ?? null - - return { - appId, - appName, - variantName, - revisionId, - revisionLabel: revisionLabel ?? undefined, - } -} - -export const enrichEvaluationRun = ({ - run: _run, - testsets, - variantsData, - evaluators, - members, - runIndex, - extras, - appNameById: _appNameById, - projectScope = false, -}: { - run: SnakeToCamelCaseKeys - testsets: PreviewTestset[] - variantsData: any - evaluators: EvaluatorDto[] - members: WorkspaceMember[] - runIndex?: RunIndex - extras?: { - parametersByRevisionId?: Record - flagsByRevisionId?: Record - variantConfigs?: Record - } - appNameById?: Map - projectScope?: boolean -}) => { - const run: Partial = _run - const appNameById = _appNameById ?? new Map() - // Robust createdAt handling: accept known format or ISO/date-like fallback - const parsedTs = dayjs(run.createdAt, "YYYY/MM/DD H:mm:ssAZ", true).valueOf() - const fallbackTs = Number.isNaN(parsedTs) ? dayjs(run.createdAt as any).valueOf() : parsedTs - run.createdAtTimestamp = Number.isNaN(fallbackTs) ? Date.now() : fallbackTs - // Format creation date for display - run.createdAt = formatDay({ - date: dayjs(run.createdAtTimestamp).toISOString(), - outputFormat: "DD MMM YYYY | h:mm a", - }) - // Derive potential ids via runIndex – allow multiple - const testsetIds: string[] = [] - const revisionIds: string[] = [] - - if (runIndex) { - for (const meta of Object.values(runIndex.steps) as StepMeta[]) { - if (meta.refs?.testset) { - testsetIds.push(meta.refs.testset.id) - } - if (meta.refs?.applicationRevision) { - revisionIds.push(meta.refs.applicationRevision.id) - } - } - } - - const uniqueTestsetIds = Array.from(new Set(testsetIds)) - const uniqueRevisionIds = Array.from(new Set(revisionIds)) - - // Resolve testset objects - const resolvedTestsets = testsets - ? (uniqueTestsetIds - .flatMap((id) => - testsets - ?.filter((ts) => ts.id === id) - .map((ts) => ({ - ...ts, - name: ts.name, - createdAt: ts.created_at, - createdAtTimestamp: dayjs( - ts.created_at, - "YYYY/MM/DD H:mm:ssAZ", - ).valueOf(), - })), - ) - .filter(Boolean) as PreviewTestset[]) - : [] - - // Support both shapes: array or { variants: [...] } - const variantList: EnhancedVariant>[] = Array.isArray( - variantsData, - ) - ? variantsData - : (variantsData?.variants as EnhancedVariant>[]) || - [] - - const configVariants: EnhancedVariant>[] = - extras?.variantConfigs - ? Object.entries(extras.variantConfigs) - .map(([key, config]) => { - if (!config) return null - const variantRef = config.variant_ref || {} - const applicationRef = config.application_ref || {} - const id = variantRef.id || key - if (!id) return null - return { - id, - variantId: variantRef.id || id, - variantName: - variantRef.slug || - variantRef.id || - variantRef.name || - config?.service_ref?.slug || - key, - name: - variantRef.slug || - variantRef.id || - variantRef.name || - config?.service_ref?.slug || - key, - configName: variantRef.slug || variantRef.name, - appId: applicationRef?.id, - appSlug: applicationRef?.slug, - appStatus: undefined, - uri: config.url, - revision: variantRef.version ?? null, - revisionLabel: variantRef.version ?? null, - createdAtTimestamp: run.createdAtTimestamp, - createdAt: run.createdAt, - configParams: config.params, - } as any - }) - .filter(Boolean) - : [] - - const variantMap = new Map() - variantList.forEach((variant: any) => { - if (!variant?.id) return - variantMap.set(String(variant.id), variant) - }) - configVariants.forEach((variant: any) => { - if (!variant?.id) return - const key = String(variant.id) - if (!variantMap.has(key)) { - variantMap.set(key, variant) - return - } - const existing = variantMap.get(key) - variantMap.set(key, { - ...existing, - ...variant, - variantName: variant.variantName || existing?.variantName, - configName: variant.configName || existing?.configName, - name: variant.name || existing?.name, - }) - }) - const combinedVariantList: EnhancedVariant>[] = - Array.from(variantMap.values()) - - const filteredVariants = combinedVariantList.filter((v) => uniqueRevisionIds.includes(v.id)) - - const invocationMetadata = deriveInvocationMetadata(runIndex) - - const fallbackVariants = - filteredVariants.length || !runIndex - ? [] - : Array.from(runIndex.invocationKeys) - .map((key) => { - const meta = runIndex.steps[key] - if (!meta) return null - const refs = meta.refs || {} - const application = - refs.application || refs.applicationRevision?.application || {} - const revision = refs.applicationRevision || {} - - const appId = - application?.id || - application?.app_id || - application?.application_id || - revision?.application_id || - undefined - - const variantName = - application?.name || application?.slug || refs.variant?.name || meta.key - - const revisionId = - revision?.id || revision?.revision_id || revision?.revisionId || meta.key - - const revisionLabel = - revision?.name || revision?.revision || revision?.version || undefined - - return { - id: revisionId, - variantId: revisionId, - appId, - appName: application?.name, - variantName, - revision: revisionLabel, - revisionLabel, - createdAt: run.createdAt, - createdAtTimestamp: run.createdAtTimestamp, - } - }) - .filter((item): item is Record => Boolean(item)) - - // Note: projectId not needed for enrichment; kept resolvers local to run data - - const baseVariants = filteredVariants.length ? filteredVariants : [] - const combinedVariants = ( - baseVariants.length ? baseVariants : fallbackVariants - ) as typeof fallbackVariants - - const normalizedVariants = combinedVariants - .map((variant) => { - const fallbackId = - variant.id || variant.variantId || (variant as any).revisionId || undefined - if (fallbackId && variant.id !== fallbackId) { - return { - ...variant, - id: fallbackId, - variantId: variant.variantId || fallbackId, - } - } - return variant.id - ? variant - : { - ...variant, - variantId: variant.variantId || fallbackId, - id: fallbackId, - } - }) - .filter((variant) => Boolean(variant.id)) - - const originalVariants = Array.isArray((run as any)?.variants) - ? ((run as any)?.variants as any[]) - : [] - const originalPrimaryVariant = originalVariants.length ? originalVariants[0] : undefined - - const invocationAppId = - typeof invocationMetadata?.appId === "string" && invocationMetadata.appId - ? invocationMetadata.appId - : undefined - const invocationAppName = - invocationAppId && invocationMetadata?.appName ? invocationMetadata.appName : undefined - - const runAppId = - typeof (run as any)?.appId === "string" && (run as any).appId.trim() - ? (run as any).appId.trim() - : undefined - const runAppName = - typeof (run as any)?.appName === "string" && (run as any).appName.trim() - ? (run as any).appName.trim() - : undefined - - const originalVariantAppIds = originalVariants - .map( - (variant: any) => - (typeof variant?.appId === "string" && variant.appId.trim()) || - (typeof variant?.app_id === "string" && variant.app_id.trim()) || - undefined, - ) - .filter((value): value is string => Boolean(value)) - - const normalizedVariantAppIds = normalizedVariants - .map( - (variant: any) => - (typeof variant?.appId === "string" && variant.appId.trim()) || - (typeof variant?.applicationId === "string" && variant.applicationId.trim()) || - undefined, - ) - .filter((value): value is string => Boolean(value)) - - const finalAppId = pickString( - invocationAppId, - runAppId, - ...originalVariantAppIds, - ...normalizedVariantAppIds, - ) - - const variantForFinalApp = - finalAppId && - (normalizedVariants.find((variant: any) => variant?.appId === finalAppId) || - originalVariants.find( - (variant: any) => variant?.appId === finalAppId || variant?.app_id === finalAppId, - )) - - const finalAppName = pickString( - invocationAppId && invocationAppId === finalAppId ? invocationAppName : undefined, - finalAppId ? appNameById.get(finalAppId) : undefined, - runAppId && runAppId === finalAppId ? runAppName : undefined, - variantForFinalApp?.appName, - variantForFinalApp?.appSlug, - originalPrimaryVariant?.variantName, - invocationMetadata?.variantName, - runAppName, - ((run as any)?.name as string) || undefined, - ) - - const returnValue = { - ...run, - appId: finalAppId, - appName: finalAppName, - variants: normalizedVariants, - testsets: resolvedTestsets, - createdBy: members.find((member) => member.user.id === run.createdById), - parametersByRevisionId: extras?.parametersByRevisionId || {}, - flagsByRevisionId: extras?.flagsByRevisionId || {}, - } - - normalizedVariants.forEach((variant: any) => { - const revisionKey = variant.id || variant.variantId - if (!revisionKey) return - if (variant.configParams) { - returnValue.parametersByRevisionId[revisionKey] = - returnValue.parametersByRevisionId[revisionKey] || variant.configParams - } - if (!returnValue.appId && variant.appId) { - returnValue.appId = variant.appId - } - if ( - !returnValue.appName && - variant.appName && - (!returnValue.appId || variant.appId === returnValue.appId) - ) { - returnValue.appName = variant.appName - } - }) - if (!returnValue.appName && returnValue.appId) { - const mappedName = appNameById.get(returnValue.appId) - if (mappedName) { - returnValue.appName = mappedName - } - } - if (runIndex) { - // Find all annotation steps via index if available - const annotationSteps = Array.from(runIndex.annotationKeys) - .map((k) => { - // locate original step for richer data - return (run.data?.steps || []).find((s) => s.key === k) as - | IEvaluationRunDataStep - | undefined - }) - .filter(Boolean) - - const evaluatorRefs = new Set() - annotationSteps.forEach((step) => { - const ref = step?.references?.evaluator - if (!ref) return - if (ref.id) evaluatorRefs.add(ref.id) - if (ref.slug) evaluatorRefs.add(ref.slug) - if (ref.key) evaluatorRefs.add(ref.key) - }) - - const matchedEvaluators: EvaluatorDto[] = [] - const seenIds = new Set() - const seenSlugs = new Set() - const seenKeys = new Set() - - Array.from(evaluatorRefs).forEach((reference) => { - const match = evaluators?.find( - (e) => e.id === reference || e.slug === reference || e.key === reference, - ) - if (!match) return - - const normalizedMatch = { - ...match, - metrics: - (match as any).metrics && Object.keys((match as any).metrics || {}).length > 0 - ? (match as any).metrics - : getMetricsFromEvaluator(match as EvaluatorDto), - } - - const id = typeof normalizedMatch.id === "string" ? normalizedMatch.id : undefined - const slug = typeof normalizedMatch.slug === "string" ? normalizedMatch.slug : undefined - const key = typeof normalizedMatch.key === "string" ? normalizedMatch.key : undefined - const fallbackKey = reference - - if (id && seenIds.has(id)) return - if (!id && slug && seenSlugs.has(slug)) return - if (!id && !slug && key && seenKeys.has(key)) return - if (!id && !slug && !key && seenKeys.has(fallbackKey)) return - - if (id) seenIds.add(id) - if (slug) seenSlugs.add(slug) - if (key) { - seenKeys.add(key) - } else if (!id && !slug) { - seenKeys.add(fallbackKey) - } - - matchedEvaluators.push(normalizedMatch as EvaluatorDto) - }) - - returnValue.evaluators = matchedEvaluators - } - - return returnValue as EnrichedEvaluationRun -} - -const useEnrichEvaluationRun = ({ - evalType = "human", -}: { - evalType?: "human" | "auto" | "online" | "custom" -} = {}): - | (( - run: SnakeToCamelCaseKeys, - testsetData?: PreviewTestset[], - runIndex?: RunIndex, - ) => EnrichedEvaluationRun) - | undefined => { - const {selectedOrg} = useOrgData() - const members = selectedOrg?.default_workspace?.members || [] - const routeAppId = useAppId() - const isProjectScope = !routeAppId - const appList = useAppList() - const appNames = useMemo(() => { - return new Map((appList || []).map((item) => [item.app_id, item.app_name])) - }, [appList]) - - const {data: evaluators, isLoading: loadingEvaluators} = useEvaluators({ - preview: true, - queries: - evalType === "human" - ? {is_human: true} - : evalType === "custom" - ? {is_evaluator: true} - : {}, - }) - - const combinedEvaluators = useMemo(() => { - const list: EvaluatorDto[] = [] - const seenIds = new Set() - const seenSlugs = new Set() - const seenKeys = new Set() - - const pushEvaluator = (ev: any) => { - if (!ev) return - const id = typeof ev.id === "string" ? ev.id : undefined - const slug = typeof ev.slug === "string" ? ev.slug : undefined - const key = typeof ev.key === "string" ? ev.key : undefined - if (id && seenIds.has(id)) return - if (!id && slug && seenSlugs.has(slug)) return - if (!id && !slug && key && seenKeys.has(key)) return - if (id) seenIds.add(id) - if (slug) seenSlugs.add(slug) - if (!id && !slug && key) seenKeys.add(key) - const metrics = - (ev as any)?.metrics && Object.keys((ev as any).metrics || {}).length > 0 - ? (ev as any).metrics - : getMetricsFromEvaluator(ev as EvaluatorDto) - list.push({...ev, metrics} as EvaluatorDto) - } - ;(Array.isArray(evaluators) ? evaluators : []).forEach(pushEvaluator) - return list - }, [evaluators]) - - const {revisions: variantsData, isLoading: _variantsLoading} = useStatelessVariants({ - lightLoading: true, - }) - // For online evaluations, do not use variants data (no variant/testset context) - const effectiveVariantsData = - evalType === "online" ? [] : isProjectScope ? (variantsData ?? []) : variantsData - - const enrichRun = useCallback( - ( - run: SnakeToCamelCaseKeys, - testsetData?: PreviewTestset[], - runIndex?: RunIndex, - options?: {variantConfigs?: Record}, - ) => { - // Derive transformed parameters and flags per revision on-demand from atoms - const store = getDefaultStore() - const revisionIds: string[] = runIndex - ? Array.from( - new Set( - Object.values(runIndex.steps) - .map((m: any) => m?.refs?.applicationRevision?.id) - .filter(Boolean) as string[], - ), - ) - : [] - - const parametersByRevisionId: Record = {} - const flagsByRevisionId: Record = {} - for (const rid of revisionIds) { - parametersByRevisionId[rid] = store.get( - transformedPromptsAtomFamily({revisionId: rid, useStableParams: true}), - ) - flagsByRevisionId[rid] = store.get(variantFlagsAtomFamily({revisionId: rid})) - } - - const result = enrichEvaluationRun({ - run, - testsets: testsetData || [], - variantsData: effectiveVariantsData || [], - evaluators: (combinedEvaluators as EvaluatorDto[]) || [], - members, - runIndex, - extras: { - parametersByRevisionId, - flagsByRevisionId, - variantConfigs: options?.variantConfigs, - }, - projectScope: isProjectScope, - appNameById: appNames, - }) as EnrichedEvaluationRun - - // For online evaluations, explicitly drop variants and testsets (no variant/testset context) - if (evalType === "online") { - ;(result as any).variants = [] - ;(result as any).testsets = [] - } - - // Optional: add debug logs here if needed - - return result - }, - [effectiveVariantsData, combinedEvaluators, members, isProjectScope, appNames], - ) - - const evaluatorsReady = !loadingEvaluators && Array.isArray(combinedEvaluators) - - return !_variantsLoading && evaluatorsReady ? enrichRun : undefined -} - -export default useEnrichEvaluationRun diff --git a/web/oss/src/lib/hooks/usePreviewEvaluations/index.ts b/web/oss/src/lib/hooks/usePreviewEvaluations/index.ts deleted file mode 100644 index dbba797840..0000000000 --- a/web/oss/src/lib/hooks/usePreviewEvaluations/index.ts +++ /dev/null @@ -1,499 +0,0 @@ -import {useCallback, useEffect, useMemo} from "react" - -import {useAtomValue, useSetAtom} from "jotai" -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" -import {useSWRConfig} from "swr" -import {v4 as uuidv4} from "uuid" - -import {useAppId} from "@/oss/hooks/useAppId" -import axios from "@/oss/lib/api/assets/axiosConfig" -import {EvaluationType} from "@/oss/lib/enums" -import {snakeToCamelCaseKeys} from "@/oss/lib/helpers/casing" -import {EvaluationStatus, SnakeToCamelCaseKeys, Testset} from "@/oss/lib/Types" -import {slugify} from "@/oss/lib/utils/slugify" -import {createEvaluationRunConfig} from "@/oss/services/evaluationRuns/api" -import {CreateEvaluationRunInput} from "@/oss/services/evaluationRuns/api/types" -import {fetchTestset} from "@/oss/services/testsets/api" -import {getProjectValues} from "@/oss/state/project" -import { - prefetchProjectVariantConfigs, - setProjectVariantReferencesAtom, -} from "@/oss/state/projectVariantConfig" -import {usePreviewTestsetsData, useTestsetsData} from "@/oss/state/testset" - -import {buildRunIndex} from "../useEvaluationRunData/assets/helpers/buildRunIndex" -import {getEvaluationRunScenariosKey} from "../useEvaluationRunScenarios" - -import useEnrichEvaluationRun from "./assets/utils" -import {collectProjectVariantReferences} from "./projectVariantConfigs" - -const EMPTY_RUNS: any[] = [] -interface PreviewEvaluationRunsData { - runs: SnakeToCamelCaseKeys[] - count: number -} - -interface RunFlagsFilter { - is_live?: boolean - is_active?: boolean - is_closed?: boolean -} - -interface PreviewEvaluationRunsQueryParams { - projectId?: string - appId?: string - searchQuery?: string - references: any[] - typesKey: string - debug: boolean - enabled: boolean - flags?: RunFlagsFilter -} - -const previewEvaluationRunsQueryAtomFamily = atomFamily((serializedParams: string) => - atomWithQuery(() => { - const params = JSON.parse(serializedParams) as PreviewEvaluationRunsQueryParams - const {projectId, appId, searchQuery, references, typesKey, enabled, flags} = params - - return { - queryKey: [ - "previewEvaluationRuns", - projectId ?? "none", - appId ?? "all", - typesKey, - searchQuery ?? "", - JSON.stringify(references ?? []), - JSON.stringify(flags ?? {}), - ], - enabled, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - queryFn: async () => { - if (!projectId) { - return {runs: [], count: 0} - } - - const payload: Record = { - run: {}, - } - payload.run.references = references ?? [] - if (searchQuery) { - payload.run.search = searchQuery - } - if (flags && Object.keys(flags).length) { - payload.run.flags = flags - } - - const queryParams: Record = {project_id: projectId} - if (appId) { - queryParams.app_id = appId - } - - const response = await axios.post(`/preview/evaluations/runs/query`, payload, { - params: queryParams, - }) - - return { - runs: (response.data?.runs || []).map((run: EvaluationRun) => - snakeToCamelCaseKeys(run), - ), - count: response.data?.count || 0, - } - }, - } - }), -) - -interface PreviewEvaluationsQueryState { - data?: PreviewEvaluationRunsData - mutate: () => Promise - refetch: () => Promise - isLoading: boolean - isPending: boolean - isError: boolean - error: unknown -} -import {searchQueryAtom} from "./states/queryFilterAtoms" -import {EnrichedEvaluationRun, EvaluationRun} from "./types" - -const SCENARIOS_ENDPOINT = "/preview/evaluations/scenarios/" - -/** - * Custom hook to manage and enrich preview evaluation runs. - * Fetches preview runs via a shared atom query, enriches them with related metadata (testset, variant, evaluators), - * and sorts them by creation timestamp descending. - * - * @param skip - Optional flag to skip fetching preview evaluations. - * @returns Object containing SWR response, enriched runs, and a function to trigger new evaluation creation. - */ -const usePreviewEvaluations = ({ - skip, - types: propsTypes = [], - debug, - flags, - appId: appIdOverride, -}: { - skip?: boolean - types?: EvaluationType[] - debug?: boolean - appId?: string | null - flags?: RunFlagsFilter -} = {}): { - swrData: PreviewEvaluationsQueryState - createNewRun: (paramInputs: CreateEvaluationRunInput) => Promise - runs: EnrichedEvaluationRun[] -} => { - // atoms - const searchQuery = useAtomValue(searchQueryAtom) - const projectId = getProjectValues().projectId - - const debugEnabled = debug ?? process.env.NODE_ENV !== "production" - - const types = useMemo(() => { - return propsTypes.map((type) => { - switch (type) { - case EvaluationType.single_model_test: - case EvaluationType.human: - return EvaluationType.human - case EvaluationType.auto_exact_match: - case EvaluationType.automatic: - case EvaluationType.online: - return EvaluationType.automatic - default: - return type - } - }) - }, [propsTypes]) - - const {mutate: globalMutate} = useSWRConfig() - const routeAppId = useAppId() - const appId = (appIdOverride ?? routeAppId) || undefined - - // Derive effective flags based on types (e.g., online implies is_live=true by default) - const effectiveFlags = useMemo(() => { - const base = {...(flags || {})} - if (propsTypes.includes(EvaluationType.online) && base.is_live === undefined) { - base.is_live = true - } - return base - }, [flags, propsTypes]) - - const referenceFilters = useMemo(() => { - const filters: any[] = [] - if (appId) { - filters.push({ - application: {id: appId}, - }) - } - return filters - }, [appId]) - - const effectiveEvalType = useMemo(() => { - if (propsTypes.includes(EvaluationType.online)) return "online" as const - if (types.includes(EvaluationType.automatic)) return "auto" as const - if (types.includes(EvaluationType.custom_code_run)) return "custom" as const - return "human" as const - }, [propsTypes, types]) - - const enrichRun = useEnrichEvaluationRun({ - evalType: effectiveEvalType, - }) - - const typesKey = useMemo(() => types.slice().sort().join("|"), [types]) - const queryEnabled = !skip && Boolean(projectId) - const isEnrichmentPending = queryEnabled && !enrichRun - - const serializedQueryParams = useMemo( - () => - JSON.stringify({ - projectId, - appId, - searchQuery, - references: referenceFilters, - typesKey, - debug: debugEnabled, - enabled: queryEnabled, - flags: effectiveFlags, - }), - [ - projectId, - appId, - searchQuery, - referenceFilters, - typesKey, - debugEnabled, - queryEnabled, - effectiveFlags, - ], - ) - - const evaluationRunsAtom = useMemo( - () => previewEvaluationRunsQueryAtomFamily(serializedQueryParams), - [serializedQueryParams], - ) - - const evaluationRunsQuery = useAtomValue(evaluationRunsAtom) - - const rawRuns = queryEnabled ? (evaluationRunsQuery.data?.runs ?? EMPTY_RUNS) : EMPTY_RUNS - - const evaluationRunsState = useMemo(() => { - const isPending = (evaluationRunsQuery as any).isPending ?? false - const isLoading = - (evaluationRunsQuery as any).isLoading ?? - (evaluationRunsQuery as any).isFetching ?? - isPending - const combinedPending = isPending || isEnrichmentPending - const combinedLoading = isLoading || isEnrichmentPending - const data = queryEnabled ? evaluationRunsQuery.data : {runs: [], count: 0} - return { - data, - mutate: async () => evaluationRunsQuery.refetch(), - refetch: evaluationRunsQuery.refetch, - isLoading: combinedLoading, - isPending: combinedPending, - isError: queryEnabled ? ((evaluationRunsQuery as any).isError ?? false) : false, - error: queryEnabled ? evaluationRunsQuery.error : undefined, - } - }, [evaluationRunsQuery, queryEnabled, isEnrichmentPending]) - const setProjectVariantReferences = useSetAtom(setProjectVariantReferencesAtom) - - useEffect(() => { - if (!projectId) { - setProjectVariantReferences([]) - return - } - if (appId) { - setProjectVariantReferences([]) - return - } - const references = collectProjectVariantReferences(rawRuns, projectId) - setProjectVariantReferences(references) - prefetchProjectVariantConfigs(references) - }, [appId, projectId, rawRuns, setProjectVariantReferences]) - /** - * Hook to fetch testsets data. - */ - const {testsets} = useTestsetsData() - const {testsets: previewTestsets} = usePreviewTestsetsData() - - /** - * Helper to create scenarios for a given run and testset. - * Each CSV row becomes its own scenario. - */ - const createScenarios = useCallback( - async ( - runId: string, - testset: Testset & {data: {testcaseIds?: string[]; testcases?: {id: string}[]}}, - ): Promise => { - if (!testset?.id) { - throw new Error(`Testset with id ${testset.id} not found.`) - } - - // 1. Build payload: each row becomes a scenario - const payload = { - scenarios: ( - testset.data.testcaseIds ?? - testset.data.testcases?.map((tc) => tc.id) ?? - [] - ).map((_id, index) => ({ - run_id: runId, - // meta: {index}, - })), - } - - // 2. Invoke the scenario endpoint - const response = await axios.post(SCENARIOS_ENDPOINT, payload) - - // Extract and return new scenario IDs - return response.data.scenarios.map((s: any) => s.id) - }, - [testsets, debug], - ) - - /** - * Helper to compute enriched and sorted runs (lazy) when accessed. - */ - const computeRuns = useCallback((): EnrichedEvaluationRun[] => { - if (!rawRuns.length || !enrichRun) return [] - const isOnline = propsTypes.includes(EvaluationType.online) - const enriched: EnrichedEvaluationRun[] = rawRuns - .map((_run) => { - const runClone = structuredClone(_run) - const runIndex = buildRunIndex(runClone) - const result = enrichRun(runClone, previewTestsets?.testsets || [], runIndex) - if (result) { - result.runIndex = runIndex - } - if (result && isOnline) { - const flags = (result as any).flags || {} - - if (flags?.isActive === false) { - ;(result as any).status = EvaluationStatus.CANCELLED - if (result.data) { - ;(result.data as any).status = EvaluationStatus.CANCELLED - } - } - } - return result - }) - .filter((run): run is EnrichedEvaluationRun => Boolean(run)) - - // Sort enriched runs by timestamp, descending - return enriched.sort((a, b) => { - const tA = new Date(a.createdAtTimestamp || 0).getTime() - const tB = new Date(b.createdAtTimestamp || 0).getTime() - return tB - tA - }) - }, [rawRuns, previewTestsets, enrichRun, debug, propsTypes]) - - const createNewRun = useCallback( - async (paramInputs: CreateEvaluationRunInput) => { - // JIT migrate old testsets before creating a new run - if (!paramInputs.testset || !paramInputs.testset._id) { - throw new Error("Testset is required and must have an _id for migration.") - } - try { - // 1. Converts the old testset to the new format - const existingPreviewQuery = await axios.get( - `/preview/simple/testsets/${paramInputs.testset._id}`, - ) - const _existingQuery = await fetchTestset(paramInputs.testset._id, false) - const existingPreview = existingPreviewQuery.data?.testset - let testset - if (!existingPreview) { - const result = await axios.post( - `/preview/simple/testsets/${paramInputs.testset._id}/transfer`, - ) - testset = result.data.testset - } else { - testset = existingPreview - } - - if (testset) { - paramInputs.testset = snakeToCamelCaseKeys(testset) - } - } catch (migrationErr: any) { - throw new Error( - `Failed to migrate testset before creating run: ${migrationErr?.message || migrationErr}`, - ) - } - - // 2. Creates the the payload schema - const params = createEvaluationRunConfig(paramInputs) - - // 3. Invokes run endpoint - const response = await axios.post("/preview/evaluations/runs/", params) - - // Extract the newly created runId - const runId = response.data.runs?.[0]?.id - if (!runId) { - throw new Error("createNewRun: runId not returned in response.") - } - // Now create scenarios for each row in the specified testset - if (!paramInputs.testset) { - throw new Error("Testset is required to create scenarios") - } - // 4. Creates the scenarios - const scenarioIds = await createScenarios(runId, paramInputs.testset) - - // Fire off input, invocation, and annotation steps together in one request (non-blocking) - try { - // const repeatId = uuidv4() - // const retryId = uuidv4() - // 5. First generate step keys & IDs per scenario - const revision = paramInputs.revisions?.[0] - const evaluators = paramInputs.evaluators || [] - const inputKey = slugify( - paramInputs.testset.name ?? paramInputs.testset.slug ?? "testset", - paramInputs.testset.id, - ) - const invocationKey = revision - ? slugify( - (revision as any).name ?? - (revision as any).variantName ?? - (revision as any)._parentVariant?.variantName ?? - "invocation", - revision.id, - ) - : "invocation" - - const scenarioStepsData = scenarioIds.map((scenarioId, index) => { - const hashId = uuidv4() - return { - testcaseId: - paramInputs.testset?.data?.testcaseIds?.[index] ?? - paramInputs.testset?.data?.testcases?.[index]?.id, - scenarioId, - hashId, - } - }) - - // 6. Build a single steps array combining input, invocation, and evaluator steps - const allSteps = scenarioStepsData.flatMap( - ({scenarioId, testcaseId, repeatId, retryIdInput, hashId}) => { - const base = { - testcase_id: testcaseId, - scenario_id: scenarioId, - run_id: runId, - } - const stepsArray: any[] = [ - { - ...base, - status: EvaluationStatus.SUCCESS, - step_key: inputKey, - }, - { - ...base, - step_key: invocationKey, - }, - ] - - evaluators.forEach((ev) => { - stepsArray.push({ - ...base, - step_key: `${invocationKey}.${ev.slug}`, - }) - }) - return stepsArray - }, - ) - // 7. Invoke the /results endpoint - await axios - .post(`/preview/evaluations/results/?project_id=${projectId}`, { - results: allSteps, - }) - .then((res) => { - // Revalidate scenarios data - globalMutate(getEvaluationRunScenariosKey(runId)) - }) - .catch((err) => { - console.error( - "[usePreviewEvaluations] createNewRun: failed to create steps", - err, - ) - }) - } catch (err) { - console.error("[usePreviewEvaluations] createNewRun: error scheduling steps", err) - } - // 8. Refresh SWR data for runs - await evaluationRunsState.mutate() - // Return both run response and scenario IDs - return { - run: response.data, - scenarios: scenarioIds, - } - }, - [debug, createScenarios, globalMutate, evaluationRunsState, projectId, appId], - ) - - return { - swrData: evaluationRunsState, - createNewRun, - get runs() { - return enrichRun ? computeRuns() : [] - }, - } -} - -export default usePreviewEvaluations diff --git a/web/oss/src/lib/hooks/usePreviewEvaluations/projectVariantConfigs.ts b/web/oss/src/lib/hooks/usePreviewEvaluations/projectVariantConfigs.ts deleted file mode 100644 index 1961184254..0000000000 --- a/web/oss/src/lib/hooks/usePreviewEvaluations/projectVariantConfigs.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {ProjectVariantConfigKey} from "@/oss/state/projectVariantConfig" - -interface InvocationReference { - appId?: string - appSlug?: string - revisionId?: string - revisionVersion?: number | null - variantSlug?: string - fallbackKey?: string -} - -const normalizeReference = (refs: any, fallbackKey?: string): InvocationReference | null => { - if (!refs) return null - - const applicationRevision = - refs.applicationRevision || refs.application_revision || refs.application_ref?.revision - const applicationRef = - refs.application || - applicationRevision?.application || - refs.application_ref || - refs.applicationRef - const variantRef = refs.variant || refs.variant_ref || refs.variantRef - - const appId = - applicationRef?.id || - applicationRevision?.application_id || - applicationRevision?.applicationId - const appSlug = applicationRef?.slug || applicationRef?.name - - const revisionId = - applicationRevision?.id || - applicationRevision?.revisionId || - applicationRevision?.revision_id || - variantRef?.id || - variantRef?.revisionId || - variantRef?.revision_id - const revisionVersion = - applicationRevision?.revision ?? - applicationRevision?.version ?? - variantRef?.version ?? - variantRef?.revision - let variantSlug = - variantRef?.slug || variantRef?.name || variantRef?.variantName || variantRef?.variant_name - - if (!variantSlug) { - variantSlug = - refs.application?.slug || - refs.application?.name || - refs.applicationRef?.slug || - refs.applicationRef?.name || - fallbackKey - } - - if (!appId && !appSlug) return null - - return { - appId, - appSlug, - revisionId: revisionId || fallbackKey, - revisionVersion, - variantSlug: variantSlug || fallbackKey, - fallbackKey, - } -} - -const extractInvocationReference = (run: any): InvocationReference | null => { - const steps: any[] = run?.data?.steps || [] - const invocationStep = steps.find((step: any) => { - if (step?.type === "invocation") return true - const refs = step?.references ?? step - return Boolean( - refs?.application || - refs?.applicationRevision || - refs?.application_revision || - refs?.applicationRef || - refs?.application_ref, - ) - }) - - if (!invocationStep) return null - const refs = invocationStep.references ?? invocationStep - return normalizeReference(refs, invocationStep.key) -} - -export const collectProjectVariantReferences = ( - runs: any[], - projectId?: string, -): ProjectVariantConfigKey[] => { - if (!Array.isArray(runs) || !projectId) return [] - const collected = new Map() - - runs.forEach((run) => { - const invocation = extractInvocationReference(run) - let reference: ProjectVariantConfigKey | undefined - - if (invocation) { - reference = { - projectId, - appId: invocation.appId, - appSlug: invocation.appSlug, - variantId: invocation.revisionId, - variantSlug: invocation.variantSlug, - variantVersion: invocation.revisionVersion ?? null, - } - } else if (Array.isArray((run as any)?.variants) && (run as any).variants.length) { - const variant = (run as any).variants[0] - reference = { - projectId, - appId: variant?.appId || variant?.app_id, - appSlug: variant?.appSlug || variant?.app_slug, - variantId: variant?.id || variant?.revisionId || variant?.revision_id, - variantSlug: - variant?.variantSlug || variant?.variantName || variant?.slug || variant?.name, - variantVersion: - (variant?.revision as number | null | undefined) ?? - (variant?.revisionLabel as number | string | null | undefined) ?? - null, - } - } - - if (!reference) return - if (!reference.variantId && !reference.variantSlug) return - - const key = JSON.stringify(reference) - if (!collected.has(key)) { - collected.set(key, reference) - } - }) - - return Array.from(collected.values()) -} diff --git a/web/oss/src/lib/hooks/usePreviewEvaluations/states/queryFilterAtoms.ts b/web/oss/src/lib/hooks/usePreviewEvaluations/states/queryFilterAtoms.ts deleted file mode 100644 index 5a99f2bcf5..0000000000 --- a/web/oss/src/lib/hooks/usePreviewEvaluations/states/queryFilterAtoms.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {atom} from "jotai" - -// search query atom -export const searchQueryAtom = atom("") - -// pagination atom -export const paginationAtom = atom({size: 20, page: 1}) diff --git a/web/oss/src/lib/hooks/usePreviewEvaluations/types.ts b/web/oss/src/lib/hooks/usePreviewEvaluations/types.ts deleted file mode 100644 index b59763bed1..0000000000 --- a/web/oss/src/lib/hooks/usePreviewEvaluations/types.ts +++ /dev/null @@ -1,84 +0,0 @@ -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {PreviewTestset, SnakeToCamelCaseKeys, WorkspaceMember} from "@/oss/lib/Types" - -/** - * Interface representing a single evaluation run as returned from the backend API. - * Contains metadata and structured evaluation logic steps including input, - * invocation (application), and annotation (evaluation) stages. - */ - -export type EvaluationRunDataStep = - | { - /** First step: define the test input and optionally the testset variant/revision */ - key: string - type: "input" - /** References to testset and optionally its variant/revision */ - references: Record - } - | { - /** Invocation step: connects the application variant to the input */ - key: string - type: "invocation" - /** Defines which previous steps this step takes input from */ - inputs: {key: string}[] - /** References to application, variant, and revision IDs */ - references: Record - } - | { - /** Annotation step: applies an evaluator to the input + invocation results */ - key: string - type: "annotation" - /** Usually takes input from both the "input" and "invocation" steps */ - inputs: {key: string}[] - /** References to evaluator slug and evaluator variant ID */ - references: Record - } - -export type IEvaluationRunDataStep = SnakeToCamelCaseKeys -export interface EvaluationRun { - /** Unique identifier for the evaluation run */ - id: string - /** Display name for the run */ - name: string - /** Optional description text for the run */ - description: string - /** ISO timestamp of when the run was created */ - created_at: string - /** ID of the user who created the run */ - created_by_id: string - /** Optional metadata object (arbitrary key-value pairs) */ - meta: Record - /** Flags associated with the run (internal use) */ - flags: Record - /** Current status of the run (e.g., "pending", "completed") */ - status: string - data: { - /** Array of evaluation steps that define execution flow */ - steps: EvaluationRunDataStep[] - /** Mappings define how to extract values from steps for display or evaluation */ - mappings: { - /** Type of the mapping, determines what the value represents */ - kind: "input" | "ground_truth" | "application" | "evaluator" - /** Display name for the mapped value */ - name: string - /** Path reference to the data inside a step */ - step: { - /** The step key this mapping belongs to */ - key: string - /** Path within the step data (e.g., 'country' or 'data.outputs.metric') */ - path: string - } - }[] - } -} - -export interface EnrichedEvaluationRun extends SnakeToCamelCaseKeys { - /** All distinct testsets referenced in this run */ - testsets: PreviewTestset[] - createdBy?: WorkspaceMember - createdAtTimestamp?: number - /** All distinct application revisions (variants) referenced */ - variants?: EnhancedVariant[] - evaluators?: EvaluatorDto[] -} diff --git a/web/oss/src/lib/hooks/usePreviewRunningEvaluations/index.ts b/web/oss/src/lib/hooks/usePreviewRunningEvaluations/index.ts deleted file mode 100644 index d73f381a85..0000000000 --- a/web/oss/src/lib/hooks/usePreviewRunningEvaluations/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import axios from "@/oss/lib/api/assets/axiosConfig" -import {EvaluationStatus} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" - -import {EnrichedEvaluationRun} from "../usePreviewEvaluations/types" - -const REFETCH_INTERVAL = 10000 - -export const resourceStatusQueryFamily = atomFamily((id) => - atomWithQuery((get) => { - const projectId = getProjectValues().projectId - - return { - queryKey: ["resourceStatus", id, projectId], - queryFn: async () => { - const res = await axios.get( - `/preview/evaluations/runs/${id}?project_id=${projectId}`, - ) - return res.data - }, - - // Poll every 5s until success; then stop polling. - refetchInterval: (query) => { - const data = query.state.data as EnrichedEvaluationRun | undefined - - if ( - ![ - EvaluationStatus.PENDING, - EvaluationStatus.RUNNING, - EvaluationStatus.CANCELLED, - EvaluationStatus.INITIALIZED, - ].includes(data?.run?.status) - ) - return false // stop polling - return REFETCH_INTERVAL // keep polling - }, - - enabled: Boolean(id) && Boolean(projectId), - - // Avoid accidental refetches after success - refetchOnWindowFocus: false, - refetchOnReconnect: false, - - // Reasonable cache/stale settings - staleTime: 10_000, - gcTime: 5 * 60 * 1000, - } - }), -) - -// export const allResourceStatusesAtom = atom((get) => { -// const ids = get(runningEvaluationIdsAtom) -// const uniqueIds = Array.from(new Set(ids)) -// return uniqueIds.map((id) => get(resourceStatusQueryFamily(id))) -// }) diff --git a/web/oss/src/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom.ts b/web/oss/src/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom.ts deleted file mode 100644 index 058724f731..0000000000 --- a/web/oss/src/lib/hooks/usePreviewRunningEvaluations/states/runningEvalAtom.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {atom} from "jotai" - -import {EnrichedEvaluationRun} from "../../usePreviewEvaluations/types" - -// Collect all the running evaluation ids -export const runningEvaluationIdsAtom = atom([]) - -// This atom collects the running evaluations a store it temporarily -// until we fix the issue on backend -export const tempEvaluationAtom = atom([]) diff --git a/web/oss/src/lib/hooks/useRunMetricsMap/index.ts b/web/oss/src/lib/hooks/useRunMetricsMap/index.ts deleted file mode 100644 index 968cdb47b6..0000000000 --- a/web/oss/src/lib/hooks/useRunMetricsMap/index.ts +++ /dev/null @@ -1,190 +0,0 @@ -import useSWR from "swr" - -import axios from "@/oss/lib/api/assets/axiosConfig" -import {METRICS_ENDPOINT, computeRunMetrics} from "@/oss/services/runMetrics/api" -import {BasicStats} from "@/oss/services/runMetrics/api/types" - -import type {MetricResponse} from "../useEvaluationRunMetrics/types" - -// Returns aggregated advanced stats per run -const fetchRunMetricsMap = async ( - runIds: string[], - evaluatorSlugs: Set | undefined, -): Promise>> => { - // POST to query endpoint with body { metrics: { run_ids: [...] }, windowing: {...} } - const endpoint = `${METRICS_ENDPOINT}query` - const body: Record = { - metrics: { - ...(Array.isArray(runIds) && runIds.length ? {run_ids: runIds} : {}), - }, - windowing: {}, - } - const res = await axios.post(endpoint, body) - - const rawMetrics: MetricResponse[] = Array.isArray(res.data?.metrics) ? res.data.metrics : [] - - // Process evaluator metrics to ensure they have the correct prefix important for auto eval - const processedMetrics = rawMetrics.map((metric) => { - if (!metric.data) return metric - - const processedData: Record = {} - - // add evaluator metrics to processed data - Object.entries(metric.data as Record>).forEach( - ([stepKey, stepData]) => { - const parts = stepKey.split(".") - if (parts.length === 1) { - const slug = parts[0] - try { - if (evaluatorSlugs?.has(slug)) { - // This is an evaluator metric, ensure all keys are prefixed - const newStepData: Record = {} - Object.entries(stepData).forEach(([key, value]) => { - const prefixedKey = key.startsWith(`${slug}.`) - ? key - : `${slug}.${key}` - newStepData[prefixedKey] = value - }) - processedData[stepKey] = newStepData - } else { - // Keep non-evaluator data as is - processedData[stepKey] = stepData - } - } catch (e) { - if (evaluatorSlugs?.includes(slug)) { - // This is an evaluator metric, ensure all keys are prefixed - const newStepData: Record = {} - Object.entries(stepData).forEach(([key, value]) => { - const prefixedKey = key.startsWith(`${slug}.`) - ? key - : `${slug}.${key}` - newStepData[prefixedKey] = value - }) - processedData[stepKey] = newStepData - } else { - // Keep non-evaluator data as is - processedData[stepKey] = stepData - } - } - } else { - // Keep invocation data as is - processedData[stepKey] = stepData - } - }, - ) - - return { - ...metric, - data: processedData, - } - }) - - // Helper to classify & flatten metric payload (mirrors fetchRunMetrics.worker) - const transformData = (data: Record): Record => { - const flat: Record = {} - Object.entries(data || {}).forEach(([stepKey, metrics]) => { - // Pass-through for analytics keys like ag.metrics.* - if (stepKey.startsWith("ag.")) { - const raw = metrics - let value: any = raw - if (typeof raw === "object" && raw !== null) { - if ("mean" in raw) value = (raw as any).mean - else if ("value" in raw) value = (raw as any).value - } - flat[stepKey] = value - return - } - - const isAnalyticsPath = stepKey.startsWith("attributes.ag.") - - const parts = stepKey.split(".") - const isInvocation = parts.length === 1 - const slug = isInvocation ? undefined : parts[1] - Object.entries(metrics as Record).forEach(([metricKey, raw]) => { - let value: any = raw - if (typeof raw === "object" && raw !== null) { - if ("mean" in raw) { - value = (raw as any).mean - } else if ("value" in raw) { - value = (raw as any).value - } else if ("freq" in raw || "uniq" in raw) { - const mapped: any = {...raw} - if (Array.isArray(mapped.freq)) { - mapped.frequency = mapped.freq.map((entry: any) => ({ - value: entry?.value, - count: entry?.count ?? entry?.frequency ?? 0, - })) - mapped.frequency.sort( - (a: any, b: any) => - b.count - a.count || (a.value === true ? -1 : 1), - ) - delete mapped.freq - mapped.rank = mapped.frequency - } - if (Array.isArray(mapped.uniq)) { - mapped.unique = mapped.uniq - delete mapped.uniq - } - if (!Array.isArray(mapped.unique) && Array.isArray(mapped.frequency)) { - mapped.unique = mapped.frequency.map((entry: any) => entry.value) - } - value = mapped - } - } - if (isAnalyticsPath) { - const canonicalKey = `${stepKey}.${metricKey}` - flat[canonicalKey] = value - // Legacy fallback for evaluator display (last segment only) - const legacyKey = metricKey - if (!(legacyKey in flat)) { - flat[legacyKey] = value - } - } else if (isInvocation) { - let newKey = metricKey - if (metricKey.startsWith("tokens.")) { - newKey = metricKey.slice(7) + "Tokens" // tokens.prompt -> promptTokens - } else if (metricKey.startsWith("cost")) { - newKey = "totalCost" - } - flat[newKey] = value - } else { - const pref = slug ? `${slug}.` : "" - flat[`${pref}${metricKey}`] = value - } - }) - }) - return flat - } - - const buckets: Record}[]> = {} - processedMetrics.forEach((m) => { - const metric = m - if (!metric.scenario_id || !metric.run_id) return - const key = metric.run_id - if (!buckets[key]) buckets[key] = [] - const flattened = transformData(metric.data as any) - buckets[key].push({data: flattened}) - }) - - const result: Record> = {} - Object.entries(buckets).forEach(([runId, entries]) => { - const agg = computeRunMetrics(entries) - result[runId] = agg - }) - - return result -} - -const useRunMetricsMap = ( - runIds: string[] | undefined, - evaluatorSlugs: Set | undefined, -) => { - const swrKey = runIds && runIds.length ? ["runMetricsMap", ...runIds] : null - const {data, error, isLoading} = useSWR>>( - swrKey, - () => fetchRunMetricsMap(runIds!, evaluatorSlugs!), - ) - return {data, isLoading, isError: !!error} -} - -export default useRunMetricsMap diff --git a/web/oss/src/lib/hooks/useStatelessVariants/assets/comparisonHelpers.ts b/web/oss/src/lib/hooks/useStatelessVariants/assets/comparisonHelpers.ts index 530fb3d5f2..3909746c3f 100644 --- a/web/oss/src/lib/hooks/useStatelessVariants/assets/comparisonHelpers.ts +++ b/web/oss/src/lib/hooks/useStatelessVariants/assets/comparisonHelpers.ts @@ -1,4 +1,7 @@ +import {hashMetadata} from "@/oss/lib/hooks/useStatelessVariants/assets/hash" import type {EnhancedConfigValue} from "@/oss/lib/shared/variant/genericTransformer/types" +import {createInputRow, createInputSchema} from "@/oss/lib/shared/variant/inputHelpers" +import {generateId} from "@/oss/lib/shared/variant/stringUtils" import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" /** @@ -20,3 +23,21 @@ export const getUniqueInputKeys = (variants: EnhancedVariant[]): EnhancedConfigV return Array.from(uniqueKeys) } + +// TODO: DEPRECATE @ardaerzin +export const initializeComparisonInputs = (variants: EnhancedVariant[]) => { + // Get all unique input keys across all variants + const uniqueInputKeys = getUniqueInputKeys(variants) + + const inputStrings = Array.from(uniqueInputKeys).map((enhancedKey) => enhancedKey.value) + const inputSchema = createInputSchema(inputStrings) + const initialInputRow = createInputRow(inputStrings, inputSchema.itemMetadata) + + const metadataHash = hashMetadata(inputSchema) + + return { + __id: generateId(), + __metadata: metadataHash, + value: [initialInputRow], + } +} diff --git a/web/oss/src/lib/hooks/useStatelessVariants/assets/helpers.ts b/web/oss/src/lib/hooks/useStatelessVariants/assets/helpers.ts new file mode 100644 index 0000000000..50de1c42b0 --- /dev/null +++ b/web/oss/src/lib/hooks/useStatelessVariants/assets/helpers.ts @@ -0,0 +1,171 @@ +import isEqual from "fast-deep-equal" + +// import { +// initializeVariantInputs, +// updateVariantPromptKeys, +// } from "@/oss/lib/shared/variant/inputHelpers" +import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" + +import type {InitialStateType} from "../state/types" + +export const isPlaygroundEqual = (a?: any, b?: any): boolean => { + return isEqual(a, b) +} + +/** + * COMPARE FUNCTIONS + */ + +/** + * Finds a variant by its ID in the application state + * @param state - Current application state + * @param variantId - ID of the variant to find + * @returns The found variant or undefined + */ +export const findVariantById = ( + state: InitialStateType | undefined, + variantId: string, +): EnhancedVariant | undefined => state?.variants?.find((v) => v.id === variantId) + +/** + * Creates a comparison function for base state objects + * Falls back to deep equality if no custom compare function provided + * @param customCompare - Optional custom comparison function + * @returns Function that compares two state objects + */ +export const createBaseCompare = ( + customCompare?: (a?: InitialStateType, b?: InitialStateType) => boolean, +) => { + return (a?: InitialStateType, b?: InitialStateType): boolean => { + if (!a || !b) return false + if (customCompare) return customCompare(a, b) + return isPlaygroundEqual(a, b) + } +} + +/** + * Creates a comparison function specifically for variant states + * Compares variants by their IDs and falls back to deep equality + * @param customCompare - Optional custom comparison function + * @returns Function that compares two variant states + */ +export const createVariantsCompare = ( + customCompare?: (a?: InitialStateType, b?: InitialStateType) => boolean, +) => { + return (a?: InitialStateType, b?: InitialStateType): boolean => { + const test = () => { + const variantsA = a?.variants + const variantsB = b?.variants + + if (!!variantsA && !!variantsB && !isPlaygroundEqual(variantsA, variantsB)) { + const keysA = variantsA.map((v) => v.id) + const keysB = variantsB.map((v) => v.id) + + return keysA.length === keysB.length && keysA.every((key) => keysB.includes(key)) + } + return isPlaygroundEqual(a, b) + } + + return customCompare ? customCompare(a, b) : test() + } +} + +/** + * Creates a comparison function specifically for variant states + * Compares variants by their IDs and falls back to deep equality + * @param customCompare - Optional custom comparison function + * @returns Function that compares two variant states + */ +export const createVariantCompare = ( + customCompare?: (a?: InitialStateType, b?: InitialStateType) => boolean, +) => { + return (a?: InitialStateType, b?: InitialStateType): boolean => { + const test = () => { + const variantsA = a?.variants + const variantsB = b?.variants + + if (!!variantsA && !!variantsB && !isPlaygroundEqual(variantsA, variantsB)) { + const keysA = variantsA.map((v) => v.id) + const keysB = variantsB.map((v) => v.id) + + return isPlaygroundEqual(keysA, keysB) + } + return isPlaygroundEqual(a, b) + } + + return customCompare ? customCompare(a, b) : test() + } +} + +/** Recursively finds a property in an object by its ID */ +export const findPropertyInObject = (obj: any, propertyId: string): any => { + if (!obj || typeof obj !== "object") return undefined + + // Check if current object has __id + if ("__id" in obj && obj.__id === propertyId) { + return obj + } + + // Recursively search through object properties + for (const key in obj) { + const value = obj[key] + if (typeof value === "object") { + const found = findPropertyInObject(value, propertyId) + if (found) return found + } + } + + return undefined +} + +// Update findPropertyInVariant to use the new utility +const findPropertyInVariant = (variant: EnhancedVariant, propertyId?: string) => { + if (!propertyId || !variant) return undefined + + for (const prompt of variant.prompts || []) { + const found = findPropertyInObject(prompt, propertyId) + if (found) return found + } + return undefined +} + +/** + * Compares two variants based on a specific property + */ +export const compareVariantProperty = ( + variantA: EnhancedVariant | undefined, + variantB: EnhancedVariant | undefined, + propertyId: string, +): boolean => { + if (!variantA || !variantB) return variantA === variantB + + const propA = findPropertyInVariant(variantA, propertyId) + const propB = findPropertyInVariant(variantB, propertyId) + + return isPlaygroundEqual(propA?.value, propB?.value) +} + +/** + * Compares specific variants within state objects + */ +export const compareVariant = ( + a: InitialStateType | undefined, + b: InitialStateType | undefined, + variantId: string, + customCompare?: (a?: InitialStateType, b?: InitialStateType) => boolean, + propertyId?: string, +): boolean => { + const variantA = findVariantById(a, variantId) + const variantB = findVariantById(b, variantId) + + const variantsEqual = isPlaygroundEqual(variantA, variantB) + if (!!variantA && !!variantB && !variantsEqual) { + if (propertyId) { + return compareVariantProperty(variantA, variantB, propertyId) + } + return variantsEqual + } else if (!!variantA && !!variantB && variantsEqual) { + return true + } + return createBaseCompare(customCompare)(a, b) +} diff --git a/web/oss/src/lib/hooks/useStatelessVariants/index.ts b/web/oss/src/lib/hooks/useStatelessVariants/index.ts index 18e3b5b56c..9538f8e7c4 100644 --- a/web/oss/src/lib/hooks/useStatelessVariants/index.ts +++ b/web/oss/src/lib/hooks/useStatelessVariants/index.ts @@ -1,134 +1,79 @@ -/* - * useStatelessVariants – Stateless hook that surfaces the variants bundle directly - * from Jotai atoms (replaces the removed `useVariantsBundle`). - */ -import {useQueryClient} from "@tanstack/react-query" -import {getDefaultStore} from "jotai" -import {useAtomValue} from "jotai/react" - -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {routerAppIdAtom} from "@/oss/state/app/atoms/fetcher" -import {projectIdAtom} from "@/oss/state/project/selectors/project" -import { - projectScopedVariantsAtom, - projectVariantConfigQueryKey, - projectVariantReferenceCountAtom, -} from "@/oss/state/projectVariantConfig" -import { - appSchemaAtom, - appUriInfoAtom, - variantsAtom, - // centralized derived atoms - revisionMapAtom, - sortedEnhancedRevisionsAtom, - allVariantsLoadingAtom, - variantsLoadingAtom, - revisionsPendingAtom, - enhancedVariantsLoadableAtom, -} from "@/oss/state/variant/atoms/fetcher" - -export interface VariantsBundle { - variants: EnhancedVariant[] - revisionMap: Record - specMap: Record - uriMap: Record - isLoading: boolean - refetch: () => Promise - revisions: EnhancedVariant[] +// @ts-nocheck +import {useCallback, useMemo} from "react" + +import Router from "next/router" +import useSWR, {useSWRConfig, type Middleware} from "swr" + +import {getAppValues, useAppsData} from "@/oss/contexts/app.context" +import {DEFAULT_UUID, getCurrentProject} from "@/oss/contexts/project.context" +import {Variant} from "@/oss/lib/Types" + +import appSchemaMiddleware from "./middlewares/appSchema" +import type { + PlaygroundStateData, + UsePlaygroundStateOptions, + UsePlaygroundReturn, + VariantSelector, +} from "./types" + +const getKey = ( + appId: string | undefined = getAppValues().currentApp?.app_id, + projectId: string = getCurrentProject().projectId, +) => { + return !!appId && !!projectId && projectId !== DEFAULT_UUID + ? `/api/apps/${appId}/variants?project_id=${projectId}&v=2` + : null } -export interface UseStatelessVariantsOptions { - // When true, excludes OpenAPI/spec readiness from loading computation. - // Useful for flows (e.g., evaluation preview) that don't require the spec. - lightLoading?: boolean +export const useGlobalVariantsRefetch = () => { + const {mutate} = useSWRConfig() + const key = useMemo(() => getKey(), []) + const refetchVariants = useCallback(async () => { + await mutate(key) + }, []) + return refetchVariants } -// Use centralized derived atoms from fetcher (no local re-definition) - -function useStatelessVariants(options: UseStatelessVariantsOptions = {}): VariantsBundle { - const {lightLoading = false} = options - const rootStore = getDefaultStore() - // Synthesize legacy revisionMap shape from normalized atoms for compatibility - const revisionMap = useAtomValue(revisionMapAtom, {store: rootStore}) - const appSchema = useAtomValue(appSchemaAtom, {store: rootStore}) - const appUriInfo = useAtomValue(appUriInfoAtom, {store: rootStore}) - const heavyLoading = useAtomValue(allVariantsLoadingAtom, {store: rootStore}) - const variantsLoading = useAtomValue(variantsLoadingAtom, {store: rootStore}) - const revisionsPending = useAtomValue(revisionsPendingAtom, {store: rootStore}) - const enhancedLoadable = useAtomValue(enhancedVariantsLoadableAtom, {store: rootStore}) - - // Determine if variants query is enabled (same conditions as variantsQueryAtom) - const projectId = useAtomValue(projectIdAtom, {store: rootStore}) as string | undefined - const routerAppId = useAtomValue(routerAppIdAtom, {store: rootStore}) as - | string - | null - | undefined - const enabled = !!routerAppId && routerAppId !== null && !!projectId - const isProjectScope = !enabled - const projectReferenceCount = useAtomValue(projectVariantReferenceCountAtom, { - store: rootStore, +const useStatelessVariants = ( + { + appId = (Router.query.app_id as string) || "", + projectId = getCurrentProject().projectId, + ...rest + }: Omit & { + stateSelector?: (state: PlaygroundStateData) => Selected + variantSelector?: VariantSelector + } = { + appId: (Router.query.app_id as string) || "", + projectId: getCurrentProject().projectId, + }, + variants: Variant[], +) => { + const {apps} = useAppsData() + const currentApp = apps.find((app) => app.app_id === appId) + /** + * Key for the SWR cache + */ + const key = useMemo(() => getKey(appId, projectId), [appId, projectId]) + + const middlewares = useMemo(() => { + return [appSchemaMiddleware as Middleware] + }, []) + + const swr = useSWR< + PlaygroundStateData, + Error, + UsePlaygroundStateOptions + >(key, { + use: middlewares, + projectId, + appId, + compare: undefined, + initialVariants: variants, + appType: currentApp?.app_type, + ...rest, }) - const projectScoped = useAtomValue(projectScopedVariantsAtom, {store: rootStore}) - - // If there are no variants and we're not actively loading variants, do not block on revisions - const noVariants = useAtomValue(variantsAtom, {store: rootStore}).length === 0 - const effectiveRevisionsPending = noVariants && !variantsLoading ? false : revisionsPending - - // Treat disabled query as not-loading for light mode - const variantsLoadingEff = enabled ? variantsLoading : false - const enhancedPendingEff = enabled ? enhancedLoadable.state !== "hasData" : false - - const lightLoadingState = variantsLoadingEff || effectiveRevisionsPending || enhancedPendingEff - - const refetch = useGlobalVariantsRefetch() - const projectRefetch = useProjectScopedVariantsRefetch() - const vars = useAtomValue(sortedEnhancedRevisionsAtom, {store: rootStore}) - if (isProjectScope || projectReferenceCount > 0) { - return { - variants: projectScoped.variants, - revisionMap: projectScoped.revisionMap, - specMap: projectScoped.specMap, - uriMap: projectScoped.uriMap, - isLoading: projectScoped.isLoading, - revisions: projectScoped.revisions, - refetch: projectRefetch, - } - } - - // Synthesize per-variant maps from app-level atoms to preserve API shape - const variantIds = Array.from(new Set(vars.map((v: EnhancedVariant) => v.variantId))) - const specMap: Record = {} - const uriMap: Record = {} - variantIds.forEach((id) => { - specMap[id] = appSchema - uriMap[id] = appUriInfo - ? { - runtimePrefix: appUriInfo.runtimePrefix, - routePath: appUriInfo.routePath, - } - : undefined - }) - - return { - variants: vars, - revisionMap, - revisions: Object.values(revisionMap).flat(), - specMap, - uriMap, - isLoading: lightLoading ? lightLoadingState : heavyLoading, - refetch, - } + return swr as UsePlaygroundReturn } export default useStatelessVariants - -export const useGlobalVariantsRefetch = () => { - const queryClient = useQueryClient() - return () => queryClient.invalidateQueries({queryKey: ["variants"]}) -} - -export const useProjectScopedVariantsRefetch = () => { - const queryClient = useQueryClient() - return () => queryClient.invalidateQueries({queryKey: [projectVariantConfigQueryKey]}) -} diff --git a/web/oss/src/lib/hooks/useStatelessVariants/middlewares/appSchema/index.ts b/web/oss/src/lib/hooks/useStatelessVariants/middlewares/appSchema/index.ts new file mode 100644 index 0000000000..ddb679e54e --- /dev/null +++ b/web/oss/src/lib/hooks/useStatelessVariants/middlewares/appSchema/index.ts @@ -0,0 +1,901 @@ +import {useCallback, useRef} from "react" + +import isEqual from "fast-deep-equal" +import {type Key, type SWRHook, useSWRConfig} from "swr" + +import {type FetcherOptions} from "@/oss/lib/api/types" +import {type EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" +import {type OpenAPISpec} from "@/oss/lib/shared/variant/types" +import {fetchAndProcessRevisions, adaptRevisionToVariant} from "@/oss/lib/shared/variant/utils" + +import {initialState, getIsFetching, startFetch, endFetch} from "../../state" +import { + type PlaygroundMiddlewareParams, + type PlaygroundMiddleware, + type PlaygroundStateData, +} from "../../types" +import {type PlaygroundSWRConfig} from "../../types/playground" + +// Add TypeScript interface for revalidation batches +interface RevalidationBatch { + batch: any[] + isLastBatch: boolean + spec?: OpenAPISpec + uri?: { + routePath: string + runtimePrefix: string + } +} + +// Use Record type instead of index signature as per linting rule +type RevalidationBatches = Record + +// Declare the global property +declare global { + interface Window { + __revalidationBatches?: RevalidationBatches + } +} + +const appSchemaMiddleware: PlaygroundMiddleware = (useSWRNext: SWRHook) => { + return ( + key: Key, + fetcher: ((url: string, options?: FetcherOptions) => Promise) | null, + config: PlaygroundSWRConfig, + ) => { + const {fetcher: globalFetcher, mutate: globalMutate} = useSWRConfig() + const useImplementation = ({key, fetcher, config}: PlaygroundMiddlewareParams) => { + // Use refs to maintain values across renders and make them accessible in callbacks + const controllerRef = useRef(null) + const fetchKeyRef = useRef("") + + const openApiSchemaFetcher = useCallback( + async (url: string, options?: FetcherOptions): Promise => { + const cache = config.cache || new Map() + if (!url || !globalFetcher) { + return initialState as Data + } + const cachedValue = cache.get(url)?.data + + const state = structuredClone(cachedValue || initialState) as Data + + if (!fetcher) { + return state + } + + try { + const appId = config.appId + const projectId = config.projectId + + if (!appId || !projectId) { + throw new Error("Missing required app_id or project_id parameters") + } + + // Generate a unique key for this fetch operation + fetchKeyRef.current = `${JSON.stringify(key)}` + + // Check if we're already fetching data for this key + if (getIsFetching(fetchKeyRef.current)) { + return state + } + + state.fetching = true + state.appType = config.appType + // Start a new fetch and get the abort controller + controllerRef.current = startFetch(fetchKeyRef.current) + // Get the signal from the controller to pass to fetch operations + const signal = controllerRef.current.signal + + /** + * IMPORTANT ARCHITECTURAL SHIFT (March 2025): + * We now process all revisions individually rather than just the latest revision. + * The data model shifts from variant-centric to revision-centric while maintaining + * backward compatibility with existing components. + * + * What appears as "variants" to components are actually individual revisions + * that have been adapted to maintain the expected variant-like interface. + */ + + // Note: latestVariantId detection was previously used here + // Now all revision and variant flags are set in fetchAndProcessRevisions + + // Use the consolidated function that handles the entire fetch & process flow + // We're now using the batched parallel processing approach + // console.log("Starting parallel batched processing of revisions") + + // Import the transformVariants function + const {transformVariants} = await import( + "@/oss/lib/shared/variant/transformer" + ) + + // Generate a unique key for this revalidation session based on appId + const revalidationKey = `${appId}` + + // Initialize revalidation batches if not already done + if (!window.__revalidationBatches) { + window.__revalidationBatches = {} + } + + // Initialize the array for this revalidation key if it doesn't exist + if (!window.__revalidationBatches[revalidationKey]) { + window.__revalidationBatches[revalidationKey] = [] + } + + // Create a reference to track batch processing + interface BatchTracker { + totalBatches: number + processedBatches: number + isComplete: boolean + batchesArray: EnhancedVariant[][] + processedVariantIds: Set // Track processed variant IDs to avoid duplicates + } + + const batchTracker: BatchTracker = { + totalBatches: 0, + processedBatches: 0, + isComplete: false, + batchesArray: [], + processedVariantIds: new Set(), // Track processed variant IDs to avoid duplicates + } + + // Define a callback function for incremental state updates + const updateStateWithBatch = async ( + batchResults: EnhancedVariant[], + spec: OpenAPISpec, + uri: { + routePath: string + runtimePrefix: string + }, + isLastBatch = false, + ) => { + // console.log( + // `updateStateWithBatch - Incrementally updating state with ${batchResults.length} variants${isLastBatch ? " (FINAL BATCH)" : ""}`, + // ) + + try { + batchResults = batchResults.map((variant) => ({ + ...variant, + uriObject: uri, + })) + // Apply transformVariants to the batch results if we have a schema + let transformedBatchResults = batchResults + if (spec) { + try { + transformedBatchResults = transformVariants( + batchResults, + spec, + config.appType, + ) + } catch (error) { + console.error( + "Error transforming batch with schema:", + error, + ) + // Continue with untransformed batch if transformation fails + transformedBatchResults = batchResults + } + } + + // Store this batch with transformed variants + if ( + window.__revalidationBatches && + window.__revalidationBatches[revalidationKey] + ) { + window.__revalidationBatches[revalidationKey].push({ + batch: transformedBatchResults, // Store transformed variants + isLastBatch, + spec, + uri, + }) + } + // Trigger a SWR mutation to refresh the UI with the new data + globalMutate( + key, + (currentState: Data | undefined) => { + if (!currentState) return currentState + + // Create a deep clone of the current state + const clonedState = structuredClone(currentState) + + // Helper function to extract app ID from fetch key + const getAppIdFromKey = (key: Key) => { + // Assuming key format includes the app ID + // e.g., ["variants", { appId: "123", ... }] + if ( + Array.isArray(key) && + typeof key[1] === "object" && + key[1] !== null + ) { + return ( + (key[1] as Record).appId || "" + ) + } + return "" // Default empty app ID if not found + } + + // Get app ID from the fetch key for URI construction + const appId = getAppIdFromKey(key) + + // We need to match how fetchAndProcessRevisions handles URIs + // It uses findCustomWorkflowPath which returns an object with routePath and runtimePrefix + // First, get the URI from the first variant if available + const firstVariant = batchResults[0] + const defaultUri = firstVariant?.uri + + // 1. Process each batch result using the same transformation as in fetchAndProcessRevisions + // This ensures consistency with the final result + const flattenedRevisions: EnhancedVariant[] = + transformedBatchResults.flatMap((variant) => { + const revs = transformVariants( + structuredClone(variant.revisions), + spec, + config.appType, + ) + const _revisions = + revs + ?.filter((rev) => rev.revision > 0) + ?.map((revision) => { + // Get user profiles (would normally come from userProfilesMap) + const revisionUserProfile = null + const variantUserProfile = null + + // Use the same utility function as in fetchAndProcessRevisions + const adapted = adaptRevisionToVariant( + { + ...revision, + userProfile: + revisionUserProfile, + }, + { + ...variant, + appId: variant.appId || appId, + uri: variant.uri || defaultUri, + // Create a uriObject with the routePath and runtimePrefix properties + // that match what findCustomWorkflowPath would return + uriObject: { + routePath: "", + runtimePrefix: + variant.uri || + defaultUri, + }, + userProfile: variantUserProfile, + isStatelessVariant: true, + }, + ) + return adapted + }) || [] + + return _revisions + }) + + // 2. Sort the flattened revisions by createdAtTimestamp + const sortedRevisions = flattenedRevisions.sort( + (a, b) => b.createdAtTimestamp - a.createdAtTimestamp, + ) + + // If this is the last batch, we need to set isLatestRevision flag properly + if (isLastBatch && sortedRevisions.length > 0) { + // Get all existing variants from the current state + const existingVariants = clonedState.variants || [] + + // Combine existing variants with the new batch + const allVariants = [ + ...existingVariants, + ...sortedRevisions, + ] + + // Find the latest revision timestamp across all variants + const latestTimestamp = Math.max( + ...allVariants.map( + (r) => r.createdAtTimestamp || 0, + ), + ) + + // Reset isLatestRevision flag for all variants + allVariants.forEach((revision) => { + revision.isLatestRevision = + revision.createdAtTimestamp === latestTimestamp + }) + + // Update sortedRevisions to include only the current batch with updated flags + // This ensures we don't duplicate variants in the state + const revisedSortedRevisions = sortedRevisions.map( + (newVariant) => { + // Find the existing variant in allVariants + const existingVariant = existingVariants.find( + (v) => v.id === newVariant.id, + ) + + if (existingVariant) { + // If we found an existing variant, merge them properly + // Start with the new variant as the base to preserve new fields like deployedIn + const mergedVariant = { + ...newVariant, + // Set the isLatestRevision flag from allVariants + isLatestRevision: + newVariant.createdAtTimestamp === + latestTimestamp, + } + + return mergedVariant + } + + // If no existing variant, just use the new one with updated flag + return { + ...newVariant, + isLatestRevision: + newVariant.createdAtTimestamp === + latestTimestamp, + } + }, + ) + + // Replace sortedRevisions with the updated version + sortedRevisions.splice( + 0, + sortedRevisions.length, + ...revisedSortedRevisions, + ) + } + + // 3. Update the state with the flattened and sorted revisions + // Check if we need to update variants by comparing with existing state + if ( + clonedState.variants && + clonedState.variants.length > 0 + ) { + // Create maps for quick lookup + const existingVariantsMap = new Map() + clonedState.variants.forEach((variant) => { + existingVariantsMap.set(variant.id, variant) + }) + + const newVariantsMap = new Map() + sortedRevisions.forEach((variant) => { + newVariantsMap.set(variant.id, variant) + }) + + // Check if there are any differences + let hasChanges = false + const changedKeys = [] + let changedVariantId = "" + + // Check for new or updated variants + for (const [ + id, + newVariant, + ] of newVariantsMap.entries()) { + const existingVariant = existingVariantsMap.get(id) + + // If this is a new variant that doesn't exist in current state + if (!existingVariant) { + hasChanges = true + changedVariantId = id + break + } + + // Create copies without the prompts key for comparison + const existingVariantForComparison = { + ...existingVariant, + } + const newVariantForComparison = {...newVariant} + + // Remove prompts from both objects before comparison + if (existingVariantForComparison?.prompts) { + delete existingVariantForComparison.prompts + delete existingVariantForComparison.isLatestRevision + } + if (newVariantForComparison.prompts) { + delete newVariantForComparison.prompts + delete newVariantForComparison.isLatestRevision + } + + // Compare the objects without prompts + if ( + JSON.stringify(existingVariantForComparison) !== + JSON.stringify(newVariantForComparison) + ) { + // Find which keys are different + const allKeys = new Set([ + ...Object.keys( + existingVariantForComparison || {}, + ), + ...Object.keys( + newVariantForComparison || {}, + ), + ]) + + for (const key of allKeys) { + // Skip prompts key as we're ignoring it + if (key === "prompts") continue + + const existingValue = + existingVariantForComparison?.[key] + const newValue = + newVariantForComparison?.[key] + + if ( + JSON.stringify(existingValue) !== + JSON.stringify(newValue) + ) { + changedKeys.push(key) + } + } + + hasChanges = true + changedVariantId = id + break + } + } + + // Check for removed variants only if we're on the last batch + if (!hasChanges && isLastBatch) { + for (const id of existingVariantsMap.keys()) { + if (!newVariantsMap.has(id)) { + hasChanges = true + changedVariantId = id + break + } + } + } + + // During revalidation (when we already have data), we'll only update on the last batch + if ( + currentState?.variants?.length > 0 && + !isLastBatch + ) { + // console.log( + // "Collecting batch for later update (not the last batch)", + // ) + // Return current state unchanged until we get the last batch + return currentState + } + + // If this is the last batch during revalidation, process all collected batches + if ( + // Removed the condition requiring existing variants + isLastBatch && + window?.__revalidationBatches?.[revalidationKey] && + window?.__revalidationBatches?.[revalidationKey] + ?.length > 0 + ) { + // console.log( + // "Processing all collected batches", + // window.__revalidationBatches?.[revalidationKey] + // ?.length, + // ) + + // Use the already correct newVariantsMap data to populate our allBatchVariants + // This ensures we're using the properly transformed variants + const allBatchVariantsMap = new Map() + + // Use sortedRevisions which already contains the properly transformed variants + sortedRevisions.forEach((variant) => { + if (variant && variant.id) { + allBatchVariantsMap.set(variant.id, variant) + } + }) + + // Clear the batches after processing to prevent reprocessing them + if ( + isLastBatch && + window.__revalidationBatches?.[revalidationKey] + ) { + // console.log( + // "Clearing processed batches to prevent reprocessing", + // ) + // Store the number of batches before clearing for logging + const batchesCleared = + window.__revalidationBatches[ + revalidationKey + ].length + // Clear the batches + window.__revalidationBatches[revalidationKey] = + [] + // console.log( + // `Cleared ${batchesCleared} processed batches`, + // ) + } + + // Log information about our allBatchVariantsMap + // console.log( + // "allBatchVariantsMap size:", + // allBatchVariantsMap.size, + // "keys:", + // Array.from(allBatchVariantsMap.keys()), + // ) + + // Now compare with existing variants + const existingVariantsMap = new Map() + clonedState.variants.forEach((variant) => { + if (variant.id) { + existingVariantsMap.set(variant.id, variant) + } + }) + + // Check for changes between existing and all batched variants + let hasChanges = false + let changedVariantId = null + const changedKeys = [] + + // Check for new or modified variants + for (const [ + id, + newVariant, + ] of allBatchVariantsMap.entries()) { + const existingVariant = + existingVariantsMap.get(id) + + if (!existingVariant) { + // New variant found + hasChanges = true + changedVariantId = id + break + } + + // Deep compare existing and new variants + const existingVariantForComparison = { + ...existingVariant, + } + const newVariantForComparison = {...newVariant} + + // Remove prompts and isLatestRevision from both objects before comparison + if (existingVariantForComparison?.prompts) { + delete existingVariantForComparison.prompts + delete existingVariantForComparison.isLatestRevision + } + if (newVariantForComparison.prompts) { + delete newVariantForComparison.prompts + delete newVariantForComparison.isLatestRevision + } + + // Compare the objects + if ( + JSON.stringify( + existingVariantForComparison, + ) !== + JSON.stringify(newVariantForComparison) + ) { + // Find which keys are different + const allKeys = new Set([ + ...Object.keys( + existingVariantForComparison || {}, + ), + ...Object.keys( + newVariantForComparison || {}, + ), + ]) + + for (const key of allKeys) { + if ( + key === "prompts" || + key === "isLatestRevision" + ) + continue + + const existingValue = + existingVariantForComparison?.[key] + const newValue = + newVariantForComparison?.[key] + + if ( + JSON.stringify(existingValue) !== + JSON.stringify(newValue) + ) { + changedKeys.push(key) + } + } + + hasChanges = true + changedVariantId = id + break + } + } + + // Check for removed variants + if (!hasChanges) { + for (const id of existingVariantsMap.keys()) { + if (!allBatchVariantsMap.has(id)) { + hasChanges = true + changedVariantId = id + break + } + } + } + + if (hasChanges) { + if (changedVariantId) { + // console.log( + // `Detected changes in variants. Changed variant ID: ${changedVariantId}`, + // ) + } + if (changedKeys.length > 0) { + // console.log( + // `Detected changes in variants. Changed keys: ${changedKeys.join(", ")}`, + // ) + } + + // Create a merged set of variants, ensuring no duplicates + // First, create a map of existing variants by ID + const existingVariantsById = new Map() + clonedState.variants.forEach((variant) => { + if (variant && variant.id) { + existingVariantsById.set( + variant.id, + variant, + ) + } + }) + + // Keep existing variants that aren't in the new batches + const filteredExistingVariants = + clonedState.variants.filter( + (v) => + v.id && + !allBatchVariantsMap.has(v.id), + ) + + // Add all unique variants from the batches + const newVariantsArray = Array.from( + allBatchVariantsMap.values(), + ) + + const mergedVariants = [ + ...filteredExistingVariants, + ...newVariantsArray, + ] + // Sort by timestamp + mergedVariants.sort( + (a, b) => + b.createdAtTimestamp - + a.createdAtTimestamp, + ) + + clonedState.variants = mergedVariants + } else { + // console.log( + // "No changes detected in variants, keeping existing state", + // ) + // Keep existing variants to preserve any additional data they might have + } + } else if (hasChanges) { + if (changedVariantId) { + // console.log( + // `Detected changes in variants. Changed variant ID: ${changedVariantId}`, + // ) + } + if (changedKeys.length > 0) { + // console.log( + // `Detected changes in variants. Changed keys: ${changedKeys.join(", ")}`, + // ) + } + clonedState.variants = sortedRevisions + } else { + // console.log( + // "No changes detected in variants, keeping existing state", + // ) + // Keep existing variants to preserve any additional data they might have + } + } else { + // No existing variants, just set the new ones + clonedState.variants = sortedRevisions + } + + // Always update spec and uri if they're provided + // But for revalidation, only do this on the last batch + if ( + (!currentState?.variants?.length || isLastBatch) && + spec + ) { + clonedState.spec = spec + } + if ( + (!currentState?.variants?.length || isLastBatch) && + uri + ) { + clonedState.uri = uri + } + + if (isLastBatch) { + clonedState.fetching = false + } + return clonedState + }, + {revalidate: false}, + ) + } catch (error) { + console.error("Error updating state with batch:", error) + } + } + + // Instead of awaiting the fetch promise here, we'll just let it run and use the batch updates + // The batch updates will handle updating the state incrementally + // and the .then() handler will end the fetch when everything is done + + fetchAndProcessRevisions({ + appId, + projectId, + appType: config.appType, + // TODO: Revisit this implementation @ardaerzin + // initialVariants: config.initialVariants, + // Enable parallel batched processing + batchSize: 20, // Process 10 revisions at a time + parallelProcessing: true, + // This callback is called before any batches are processed to set the total + onBeforeBatchProcessing: (totalBatches) => { + batchTracker.totalBatches = totalBatches + // console.log( + // `Starting batch processing with ${totalBatches} total batches`, + // ) + }, + // Provide the callback for incremental state updates + onBatchProcessed: (batchResults, spec, uri) => { + // Filter out any variants we've already processed to avoid duplicates + const uniqueResults = batchResults.filter((variant) => { + // Skip variants without IDs or those we've already processed + if (!variant.id) { + // console.log("Skipping variant without ID") + return false + } + + if (batchTracker.processedVariantIds.has(variant.id)) { + // console.log(`Skipping duplicate variant: ${variant.id}`) + return false + } + + // Add this variant ID to our tracking set + batchTracker.processedVariantIds.add(variant.id) + return true + }) + + // Store unique batch results for reference + batchTracker.batchesArray.push(uniqueResults) + + // Increment the processed batches counter + batchTracker.processedBatches++ + + // console.log( + // `onBatchProcessed: ${batchTracker.processedBatches}/${batchTracker.totalBatches}`, + // ) + + // Check if this is the last batch based on the counter + const isLastBatch = + batchTracker.processedBatches === batchTracker.totalBatches + + // If this is the last batch, mark the batch tracker as complete + if (isLastBatch) { + batchTracker.isComplete = true + // console.log( + // `Batch processing complete. Processed ${batchTracker.processedVariantIds.size} unique variants.`, + // ) + } + + // Call the original updateStateWithBatch with the isLastBatch flag + // We need to handle the async nature of updateStateWithBatch + updateStateWithBatch(batchResults, spec, uri, isLastBatch).catch( + (error) => { + console.error("Error in updateStateWithBatch:", error) + }, + ) + }, + // Pass the abort signal to allow cancellation + signal, + }) + .then(({revisions, spec, uri}) => { + // This will run after all batches are processed + // console.log( + // `All batches processed, total revisions: ${revisions.length}`, + // revisions, + // ) + + // Mark the batch processing as complete + batchTracker.isComplete = true + + // For the final update, we need to get all variants from the current state + // and properly set the isLatestRevision flag across all of them + globalMutate( + key, + (state: Data | undefined) => { + if (!state) return state + const currentState = structuredClone(state) + + // Get all existing variants + const allVariants = [...(currentState.variants || [])] + + // Find the latest timestamp across all variants + if (allVariants.length > 0) { + const latestTimestamp = Math.max( + ...allVariants.map( + (r) => r.createdAtTimestamp || 0, + ), + ) + + // Set isLatestRevision flag only for the latest revision(s) + allVariants.forEach((revision) => { + revision.isLatestRevision = + revision.createdAtTimestamp === latestTimestamp + }) + } + + // Update the state with the corrected variants + currentState.variants = allVariants + currentState.fetching = false + + return currentState + }, + {revalidate: false}, + ) + + // End the fetch for this key when everything is complete + endFetch(fetchKeyRef.current) + }) + .catch((error) => { + // Handle errors in the fetch promise + if (error.name !== "AbortError") { + console.error("Error in fetch promise:", error) + } else { + // console.log("Fetch operation was aborted") + } + + // End the fetch on error + endFetch(fetchKeyRef.current) + + globalMutate( + key, + (currentState: Data | undefined) => { + if (!currentState) return currentState + const clonedState = structuredClone(currentState) + clonedState.fetching = false + clonedState.error = error + return clonedState + }, + {revalidate: false}, + ) + }) + + // We don't need to update the state here anymore + // The batch updates will handle updating the state incrementally + // and the .then() handler will end the fetch when everything is done + + // console.log( + // "Returning initial state while batch updates happen in background", + // ) + + return state + } catch (error: unknown) { + // Handle AbortError specially + if ( + controllerRef.current?.signal?.aborted || + (error instanceof Error && error.name === "AbortError") || + (error instanceof Error && error.message === "Operation was aborted") + ) { + // console.log("Fetch operation was aborted") + } else { + console.error("Error in openApiSchemaFetcher:", error) + state.error = error instanceof Error ? error : new Error(String(error)) + } + + // End the fetch on error if we have a valid fetchKey + if (fetchKeyRef.current) { + endFetch(fetchKeyRef.current) + } + + return state + } + }, + [config, fetcher, globalFetcher], + ) + + return useSWRNext(key, openApiSchemaFetcher, { + ...config, + compare: (a, b) => { + return isEqual(a, b) + }, + }) + } + + return useImplementation({key, fetcher, config}) + } +} + +export default appSchemaMiddleware diff --git a/web/oss/src/lib/hooks/useStatelessVariants/state/index.tsx b/web/oss/src/lib/hooks/useStatelessVariants/state/index.tsx index ec0d28c5ad..5564b6eeba 100644 --- a/web/oss/src/lib/hooks/useStatelessVariants/state/index.tsx +++ b/web/oss/src/lib/hooks/useStatelessVariants/state/index.tsx @@ -1,11 +1,12 @@ -import {atom, getDefaultStore} from "jotai" -import {atomFamily, selectAtom} from "jotai/utils" +import {atom, createStore} from "jotai" import {ConfigMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" -import {TestResult} from "@/oss/lib/shared/variant/transformer/types" +import {EnhancedVariant, TestResult} from "@/oss/lib/shared/variant/transformer/types" + +import {InitialStateType} from "./types" // Create an atom store -export const atomStore = getDefaultStore() +export const atomStore = createStore() // Atom to store responses export const responseAtom = atom>({}) @@ -22,47 +23,27 @@ export const getResponseLazy = ( export const getAllResponses = (): Record => { return atomStore.get(responseAtom) || {} } -let pendingResponseUpdates: Record = {} -let pendingMetadataUpdates: Record = {} -let flushScheduled = false +export const updateResponseAtom = async (metadata: Record) => { + atomStore.set(responseAtom, (prev) => ({...prev, ...metadata})) +} -const flushPendingUpdates = () => { - flushScheduled = false +class TaskQueue { + private queue: Promise = Promise.resolve() - if (Object.keys(pendingResponseUpdates).length > 0) { - const updates = pendingResponseUpdates - pendingResponseUpdates = {} - atomStore.set(responseAtom, (prev) => ({...prev, ...updates})) - } - - if (Object.keys(pendingMetadataUpdates).length > 0) { - const updates = pendingMetadataUpdates - pendingMetadataUpdates = {} - atomStore.set(metadataAtom, (prev) => ({...prev, ...updates})) + enqueue(task: () => Promise): Promise { + // Chain the task to the existing queue + const nextTask = this.queue.then(() => task()) + this.queue = nextTask.catch((error) => { + console.error("TaskQueue error:", error) + }) // Catch errors to avoid breaking the chain + return nextTask } } -const scheduleFlush = () => { - if (flushScheduled) return - flushScheduled = true - queueMicrotask(flushPendingUpdates) -} - -export const updateResponseAtom = (metadata: Record) => { - pendingResponseUpdates = {...pendingResponseUpdates, ...metadata} - scheduleFlush() -} +const metadataQueue = new TaskQueue() // Atom to store metadata export const metadataAtom = atom>({}) -// Per-key selector family to avoid re-renders on unrelated keys -export const metadataSelectorFamily = atomFamily((hash: string | undefined) => - selectAtom( - metadataAtom, - (m) => (hash ? (m[hash] as ConfigMetadata | undefined) : undefined), - Object.is, - ), -) // Lazy reader for metadata export const getMetadataLazy = (hash?: string | T): T | null => { if (!hash) return null @@ -76,7 +57,98 @@ export const getAllMetadata = (): Record => { return atomStore.get(metadataAtom) || {} } -export const updateMetadataAtom = (metadata: Record) => { - pendingMetadataUpdates = {...pendingMetadataUpdates, ...metadata} - scheduleFlush() +export const updateMetadataAtom = async (metadata: Record) => { + atomStore.set(metadataAtom, (prev) => ({...prev, ...metadata})) + await metadataQueue.enqueue( + () => + new Promise((resolve) => { + atomStore.set(metadataAtom, (prev) => ({...prev, ...metadata})) + resolve() + }), + ) +} + +// Atom to store variantsRef +export const variantsRefAtom = atom>({}) +// Lazy reader for variantsRef +export const getVariantsLazy = (hash?: string): T | null => { + if (!hash) return null + + return (atomStore.get(variantsRefAtom)[hash] as T) || null +} +export const getAllVariants = (): Record => { + return atomStore.get(variantsRefAtom) || {} +} + +export const updateVariantsRefAtom = async (metadata: Record) => { + atomStore.set(variantsRefAtom, (prev) => ({...prev, ...metadata})) +} + +// Atom to store all transformed revisions +export const allRevisionsAtom = atom([]) +// Lazy reader for all revisions +export const getAllRevisionsLazy = () => { + return atomStore.get(allRevisionsAtom) || [] +} + +// Atom to store openapi spec json +export const specAtom = atom(undefined) +// Lazy reader for spec +export const getSpecLazy = () => { + return atomStore.get(specAtom) || null +} + +// Atom to track global loading state with key references +export const activeFetchesAtom = atom>({}) +// Getter and setter for the key-specific loading state +export const getIsFetching = (key: string) => { + const activeFetches = atomStore.get(activeFetchesAtom) || {} + return !!activeFetches[key] +} + +export const startFetch = (key: string) => { + const activeFetches = atomStore.get(activeFetchesAtom) || {} + + // Cancel any existing fetch for this key + if (activeFetches[key]) { + console.log(`Cancelling previous fetch for key: ${key}`) + activeFetches[key].abort() + } + + // Create a new abort controller for this fetch + const controller = new AbortController() + + // Update the active fetches + atomStore.set(activeFetchesAtom, { + ...activeFetches, + [key]: controller, + }) + + return controller +} + +export const endFetch = (key: string) => { + const activeFetches = atomStore.get(activeFetchesAtom) || {} + + // Create a new object without the key + const updatedFetches = {...activeFetches} + delete updatedFetches[key] + + // Update the atom + atomStore.set(activeFetchesAtom, updatedFetches) +} + +// SWR Cache State +export const initialState: InitialStateType = { + variants: [], + selected: [], + uri: undefined, + dirtyStates: {}, + fetching: false, + availableRevisions: [], + appStatus: false, + generationData: { + messages: {} as InitialStateType["generationData"]["messages"], + inputs: {} as InitialStateType["generationData"]["inputs"], + } as InitialStateType["generationData"], } diff --git a/web/oss/src/lib/hooks/useVariants.ts b/web/oss/src/lib/hooks/useVariants.ts index 02c22907c0..d69bb0137b 100644 --- a/web/oss/src/lib/hooks/useVariants.ts +++ b/web/oss/src/lib/hooks/useVariants.ts @@ -1,39 +1,7 @@ -import {useCallback, useMemo} from "react" +import {ListAppsItem} from "../Types" -import {useQueryClient} from "@tanstack/react-query" -import {useAtomValue} from "jotai" +import useStatelessVariants from "./useStatelessVariants" -import {variantsAtom} from "@/oss/state/variant/atoms/fetcher" - -import type {ListAppsItem, Variant} from "../Types" -export interface VariantsHookResult { - data: Variant[] | undefined - mutate: () => Promise - isLoading: boolean +export const useVariants = (app: Pick | null) => { + return useStatelessVariants } - -export const useVariants = ( - _app: Pick | null, - initialVariants?: Variant[], -) => { - const data = useAtomValue(variantsAtom) - const queryClient = useQueryClient() - - const mutate = useCallback(async () => { - await queryClient.invalidateQueries({queryKey: ["variants"]}) - }, []) - - const filteredData = useMemo(() => { - if (!initialVariants) return data - const initialIds = initialVariants.map((v) => v.id) - return data.filter((v) => initialIds.includes(v.id)) - }, [data, initialVariants]) - - return { - data: filteredData, - mutate, - isLoading: data === undefined, - } -} - -export default useVariants diff --git a/web/oss/src/lib/metricColumnFactory.tsx b/web/oss/src/lib/metricColumnFactory.tsx deleted file mode 100644 index 0d9fc5c1e0..0000000000 --- a/web/oss/src/lib/metricColumnFactory.tsx +++ /dev/null @@ -1,480 +0,0 @@ -import React from "react" - -import {ColumnsType} from "antd/es/table" - -import {MetricDetailsPopoverWrapper} from "@/oss/components/HumanEvaluations/assets/MetricDetailsPopover" -import {USEABLE_METRIC_TYPES} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/constants" -import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {buildMetricSorter} from "@/oss/lib/metricSorter" -import { - isSortableMetricType, - BasicStats, - canonicalizeMetricKey, - getMetricValueWithAliases, -} from "@/oss/lib/metricUtils" - -const METRIC_OUTPUT_PREFIX = "attributes.ag.data.outputs." -const METRIC_ANALYTICS_PREFIX = "attributes.ag.metrics." - -const toTitleCase = (value: string): string => - value - .replace(/[_\-.]/g, " ") - .replace(/\s+/g, " ") - .trim() - .replace(/\b\w/g, (char) => char.toUpperCase()) - -const normalizeMetricLabel = (raw: unknown): string => { - if (typeof raw !== "string") return "Metric" - const trimmed = raw.trim() - if (!trimmed) return "Metric" - - const stripPrefix = (value: string, prefix: string): string => { - if (value === prefix) return "" - return value.startsWith(prefix) ? value.slice(prefix.length) : value - } - - let label = stripPrefix(trimmed, METRIC_OUTPUT_PREFIX) - label = stripPrefix(label, "outputs.") - label = stripPrefix(label, "outputs") - label = stripPrefix(label, METRIC_ANALYTICS_PREFIX) - label = stripPrefix(label, "metrics.") - label = stripPrefix(label, "metrics") - label = label.replace(/^attributes\.ag\./, "") - - label = label.replace(/\[(.+?)\]/g, "$1") - - if (!label) { - label = trimmed - } - - if (label.includes(".")) { - return label - } - - const titled = toTitleCase(label) - return titled || trimmed -} - -const resolveMetricStats = ( - metrics: Record | undefined, - candidates: (string | undefined)[], - fallbackSuffix?: string, -): BasicStats | undefined => { - if (!metrics) return undefined - const allCandidates = [...candidates] - if (fallbackSuffix) { - candidates.forEach((key) => { - if (!key || key.endsWith(fallbackSuffix)) return - allCandidates.push(`${key}.${fallbackSuffix}`) - }) - } - - for (const key of allCandidates) { - if (!key) continue - if (metrics[key]) return metrics[key] - const canonical = canonicalizeMetricKey(key) - if (canonical !== key && metrics[canonical]) return metrics[canonical] - const alias = getMetricValueWithAliases(metrics, key) - if (alias) return alias - } - return undefined -} - -import {EvaluationRow} from "../components/HumanEvaluations/types" - -export interface BuildEvaluatorMetricColumnsParams { - evaluator: EvaluatorDto - runMetricsMap?: Record> - hidePrimitiveTable?: boolean - debug?: boolean - resolveStepSlugs?: (params: { - record: EvaluationRow - evaluator: EvaluatorDto - }) => string[] | undefined - additionalSlugCandidates?: string[] -} - -const deriveRunId = (record: EvaluationRow): string | undefined => { - if (!record) return undefined - if ("id" in record && typeof record.id === "string") return record.id - if ("run_id" in record && typeof (record as any).run_id === "string") - return (record as any).run_id - if ("runId" in record && typeof (record as any).runId === "string") return (record as any).runId - if ("key" in record && typeof record.key === "string") return record.key - return undefined -} - -const normalizeSlugList = (candidates?: (string | undefined)[]): string[] => { - const unique = new Set( - (candidates || []) - .map((candidate) => (typeof candidate === "string" ? candidate.trim() : "")) - .filter((candidate) => Boolean(candidate)), - ) - return Array.from(unique) as string[] -} - -export const buildMetricKeyCandidates = (metricKey: string, slugCandidates: string[]): string[] => { - const resolvedSlugs = normalizeSlugList(slugCandidates) - const variants = new Set() - - const addOutputVariants = (key: string) => { - if (!key) return - if (key.startsWith("attributes.ag.data.outputs.")) { - variants.add(key) - const tail = key.slice("attributes.ag.data.outputs.".length) - if (tail) variants.add(`outputs.${tail}`) - else variants.add("outputs") - return - } - if (key.startsWith("outputs.")) { - variants.add(key) - const tail = key.slice("outputs.".length) - variants.add(`attributes.ag.data.outputs.${tail}`) - return - } - if (key === "outputs") { - variants.add(key) - variants.add("attributes.ag.data.outputs") - return - } - variants.add(`attributes.ag.data.outputs.${key}`) - } - - const addAnalyticsVariants = (key: string) => { - if (!key) return - if (key.startsWith("attributes.ag.metrics.")) { - variants.add(key) - const tail = key.slice("attributes.ag.metrics.".length) - if (tail) variants.add(`metrics.${tail}`) - else variants.add("metrics") - return - } - if (key.startsWith("metrics.")) { - variants.add(key) - const tail = key.slice("metrics.".length) - variants.add(`attributes.ag.metrics.${tail}`) - return - } - if (key === "metrics") { - variants.add(key) - variants.add("attributes.ag.metrics") - return - } - variants.add(`attributes.ag.metrics.${key}`) - } - - const registerVariants = (key: string) => { - if (!key) return - variants.add(key) - addOutputVariants(key) - addAnalyticsVariants(key) - } - - registerVariants(metricKey) - - const baseVariants = Array.from(variants) - - resolvedSlugs.forEach((slug) => { - if (!slug) return - baseVariants.forEach((variant) => { - variants.add(`${slug}.${variant}`) - }) - }) - - return Array.from(variants) -} - -const flattenMetricDefinitions = ( - schema: Record | undefined, - prefix?: string, - acc: Record = {}, -): Record => { - if (!schema || typeof schema !== "object") return acc - - Object.entries(schema).forEach(([key, rawValue]) => { - if (!rawValue || typeof rawValue !== "object") return - const value = rawValue.anyOf?.[0] || rawValue - const name = prefix ? `${prefix}.${key}` : key - const type = value?.type as string | undefined - - if (type === "object" && value?.properties && typeof value.properties === "object") { - flattenMetricDefinitions(value.properties, name, acc) - return - } - - if (type === "array") { - acc[name] = {...value, type} - return - } - - if (type && USEABLE_METRIC_TYPES.includes(type)) { - acc[name] = {...value, type} - } - }) - - return acc -} - -const inferMetricTypeFromStats = (stats: BasicStats | undefined): string | undefined => { - if (!stats) return undefined - const numericCandidates = [(stats as any).mean, (stats as any).sum, (stats as any).max] - if (numericCandidates.some((value) => typeof value === "number")) { - return "number" - } - - const frequency = Array.isArray((stats as any).frequency) - ? ((stats as any).frequency as any[]) - : undefined - - if (frequency && frequency.length) { - const sampleEntry = frequency.find((entry) => entry?.value !== undefined) - const sample = sampleEntry?.value - const sampleType = typeof sample - if (sampleType === "boolean" || sampleType === "string") return sampleType - if (sampleType === "number") return "number" - } - - return undefined -} - -const extractOutputsTail = (key: string): string | undefined => { - if (!key) return undefined - const lower = key.toLowerCase() - if (lower.includes(METRIC_ANALYTICS_PREFIX)) return undefined - const idx = lower.lastIndexOf(METRIC_OUTPUT_PREFIX) - if (idx >= 0) { - const tail = key.slice(idx + METRIC_OUTPUT_PREFIX.length) - return tail || undefined - } - if (lower.startsWith("outputs.")) { - return key.slice("outputs.".length) - } - if (!lower.startsWith("attributes.ag.metrics")) { - return key - } - return undefined -} - -const inferMetricDefinitionsFromStats = ( - runMetricsMap: Record> | undefined, - slugCandidates: string[], -): Record => { - if (!runMetricsMap) return {} - - const normalizedSlugs = normalizeSlugList(slugCandidates) - const derived = new Map>() - - const includesSlug = (rawKey: string): boolean => { - if (!normalizedSlugs.length) return true - return normalizedSlugs.some((slug) => { - if (!slug) return false - const slugPrefix = `${slug}.` - if (rawKey.startsWith(slugPrefix)) return true - return rawKey.includes(`.${slug}.`) - }) - } - - const recordMetric = (metricKey: string, stats: BasicStats | undefined) => { - if ( - !metricKey || - metricKey.startsWith(METRIC_ANALYTICS_PREFIX) || - metricKey.startsWith("metrics.") || - metricKey === "metrics" || - metricKey.startsWith("metric.") || - metricKey === "metric" - ) - return - const existing = derived.get(metricKey) ?? {} - if (!existing.type) { - const inferred = inferMetricTypeFromStats(stats) - if (inferred) existing.type = inferred - } - derived.set(metricKey, existing) - } - - Object.values(runMetricsMap).forEach((metrics) => { - Object.entries(metrics || {}).forEach(([rawKey, stats]) => { - if (typeof rawKey !== "string") return - if (!includesSlug(rawKey)) return - - let stripped = rawKey - for (const slug of normalizedSlugs) { - if (!slug) continue - const slugPrefix = `${slug}.` - if (stripped.startsWith(slugPrefix)) { - stripped = stripped.slice(slugPrefix.length) - break - } - } - - const tail = extractOutputsTail(stripped) - if (!tail) return - recordMetric(tail, stats) - }) - }) - - return Object.fromEntries(derived.entries()) -} - -export function buildEvaluatorMetricColumns({ - evaluator, - runMetricsMap, - hidePrimitiveTable = false, - debug = false, - resolveStepSlugs, - additionalSlugCandidates = [], -}: BuildEvaluatorMetricColumnsParams): ColumnsType { - const defaultSlugCandidates = normalizeSlugList([ - evaluator.slug, - (evaluator as any)?.slug, - (evaluator as any)?.id, - (evaluator as any)?.key, - ...(additionalSlugCandidates || []), - ]) - - const normalizedMetrics: Record = {} - - const extractType = (candidate: any): string | undefined => { - if (!candidate) return undefined - if (typeof candidate === "string") return candidate - if (Array.isArray(candidate)) { - const str = candidate.find((value) => typeof value === "string") - return typeof str === "string" ? str : undefined - } - if (typeof candidate?.type === "string") return candidate.type - return undefined - } - - const mergeMetricDefinition = (key: string, definition: any) => { - if (!key || !definition) return - const entry = normalizedMetrics[key] || {} - const candidateType = extractType(definition.type ?? definition) - if (candidateType && !entry.type) { - entry.type = candidateType - } - const candidateLabel = definition.label ?? definition.title - if (candidateLabel && !entry.label) { - entry.label = candidateLabel - } - if (definition.description && !entry.description) { - entry.description = definition.description - } - normalizedMetrics[key] = entry - } - - const schemaFields = getMetricsFromEvaluator(evaluator) as Record - Object.entries(schemaFields || {}).forEach(([key, definition]) => { - mergeMetricDefinition(key, definition) - }) - - const schemaDefinitions = flattenMetricDefinitions( - evaluator.data?.service?.format?.properties?.outputs?.properties, - ) - Object.entries(schemaDefinitions).forEach(([key, definition]) => { - mergeMetricDefinition(key, definition) - }) - - const settingsValuesDefinitions = flattenMetricDefinitions( - (evaluator as any)?.settings_values?.outputs, - ) - Object.entries(settingsValuesDefinitions).forEach(([key, definition]) => { - mergeMetricDefinition(key, definition) - }) - - const settingsDefinitions = flattenMetricDefinitions((evaluator as any)?.settings?.outputs) - Object.entries(settingsDefinitions).forEach(([key, definition]) => { - mergeMetricDefinition(key, definition) - }) - - const inferredMetricDefinitions = inferMetricDefinitionsFromStats( - runMetricsMap, - defaultSlugCandidates, - ) - Object.entries(inferredMetricDefinitions).forEach(([key, definition]) => { - mergeMetricDefinition(key, definition) - }) - - Object.entries(normalizedMetrics).forEach(([key, entry]) => { - const candidate = - typeof entry.label === "string" && entry.label.trim().length ? entry.label : undefined - entry.label = normalizeMetricLabel(candidate ?? key) - }) - - const metricKeys = Object.keys(normalizedMetrics) - const enrichedEvaluator = {...evaluator, metrics: normalizedMetrics} - - const resolveSlugsForRecord = (record: EvaluationRow | undefined): string[] => { - if (!record) return defaultSlugCandidates - const resolved = resolveStepSlugs?.({record, evaluator}) - const normalized = normalizeSlugList(resolved) - if (normalized.length) return normalized - return defaultSlugCandidates - } - - const resolveMetricsForRecord = ( - record: EvaluationRow, - metricKey: string, - ): {runId?: string; candidates: string[]} => { - const runId = deriveRunId(record) - const slugCandidates = resolveSlugsForRecord(record) - const candidates = buildMetricKeyCandidates(metricKey, slugCandidates) - return {runId, candidates} - } - - return metricKeys - .map((metricKey) => { - const schemaType = normalizedMetrics?.[metricKey]?.type - const sortable = isSortableMetricType(schemaType) - - if (schemaType === "object") return null - if (schemaType === "string") return null - const definition = normalizedMetrics[metricKey] || {} - const columnLabel = normalizeMetricLabel(definition.label ?? metricKey) - - return { - key: `${evaluator.slug}:${metricKey}`, - dataIndex: metricKey, - title: ( -
    - {columnLabel} -
    - ), - sorter: sortable - ? buildMetricSorter((row) => { - const {runId, candidates} = resolveMetricsForRecord(row, metricKey) - const metrics = runMetricsMap?.[runId || ""] - return resolveMetricStats(metrics, candidates) - }) - : undefined, - render: (_: any, record: EvaluationRow) => { - const {runId, candidates} = resolveMetricsForRecord(record, metricKey) - const hasEvaluator = Array.isArray((record as any).evaluators) - ? (record as any).evaluators.some( - (e: EvaluatorDto) => e.slug === evaluator.slug, - ) - : false - - const effectiveRunId = runId || "" - const runMetric = runMetricsMap?.[effectiveRunId] - const stats = resolveMetricStats(runMetric, candidates) - const [effectiveSlug] = resolveSlugsForRecord(record) - const popoverSlug = effectiveSlug || evaluator.slug || metricKey - return hasEvaluator ? ( - - ) : ( -
    - ) - }, - } as any - }) - .filter(Boolean) as ColumnsType -} diff --git a/web/oss/src/lib/metricUtils.ts b/web/oss/src/lib/metricUtils.ts deleted file mode 100644 index ba1907f96a..0000000000 --- a/web/oss/src/lib/metricUtils.ts +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Shared metric-handling utilities for Agenta Cloud front-end. - * --------------------------------------------------------------------------- - * These helpers consolidate common logic that previously lived in multiple - * table utilities (HumanEvaluations, VirtualizedScenarioTable, MetricCell …). - * Any future change to the metric data shape (e.g. new statistical fields) can - * now be implemented in a single place. - */ - -// --------------------------------------------------------------------------- -// Type definitions -// --------------------------------------------------------------------------- - -/** Simple histogram entry returned by backend */ -export interface FrequencyEntry { - value: T - count: number -} - -/** Stats object returned by backend `GET /runs/:id/metrics` */ -export interface BasicStats { - mean?: number - sum?: number - /** Ordered frequency list (most common first) */ - frequency?: FrequencyEntry[] - /** Total sample count */ - count?: number - // backend may add extra fields – index signature keeps type-safety while - // allowing unknown additions. - [key: string]: unknown -} - -/** Metric primitive or stats wrapper */ -export type MetricValue = BasicStats | unknown - -/** Union of recognised primitive metric types */ -export type PrimitiveMetricType = "number" | "boolean" | "string" | "array" | "object" | "null" - -/** - * An explicit metric type coming from evaluator schema can be either a single - * string or a JSON-Schema union array (e.g. ["string","null"]). - */ -export type SchemaMetricType = PrimitiveMetricType | PrimitiveMetricType[] - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -const METRIC_KEY_SYNONYMS: string[][] = [ - [ - "attributes.ag.metrics.costs.cumulative.total", - "totalCost", - "costs.total", - "cost", - "ag.metrics.unit.costs.total", - "attributes.ag.metrics.unit.costs.total", - "otel.attributes.ag.metrics.unit.costs.total", - ], - [ - "attributes.ag.metrics.duration.cumulative", - "duration", - "duration.total", - "ag.metrics.unit.duration.total", - "attributes.ag.metrics.unit.duration.total", - "otel.attributes.ag.metrics.unit.duration.total", - ], - [ - "attributes.ag.metrics.tokens.cumulative.total", - "totalTokens", - "tokens.total", - "tokens", - "ag.metrics.unit.tokens.total", - "attributes.ag.metrics.unit.tokens.total", - "otel.attributes.ag.metrics.unit.tokens.total", - ], - ["attributes.ag.metrics.errors.cumulative", "errors"], -] - -const aliasToCanonical = new Map() -const canonicalToGroup = new Map() - -METRIC_KEY_SYNONYMS.forEach((group) => { - const [canonical] = group - canonicalToGroup.set(canonical, group) - group.forEach((alias) => { - aliasToCanonical.set(alias, canonical) - }) -}) - -/** - * Return the canonical metric key for the provided alias. If the key is not a - * recognised alias it is returned unchanged. - */ -export const canonicalizeMetricKey = (key: string): string => { - return aliasToCanonical.get(key) ?? key -} - -const resolveMetricCandidates = (key: string): string[] => { - const canonical = canonicalizeMetricKey(key) - const group = canonicalToGroup.get(canonical) - return group ? group : [canonical] -} - -/** - * Fetch a metric value from a flat metrics map using canonical aliases. - * Returns the first non-undefined candidate. - */ -export const getMetricValueWithAliases = ( - metrics: Record, - key: string, -): T | undefined => { - if (!metrics) return undefined - const candidates = resolveMetricCandidates(key) - for (const candidate of candidates) { - if (candidate in metrics && metrics[candidate] !== undefined) { - return metrics[candidate] as T - } - } - return undefined -} - -/** - * Helper used by table headers to provide a human friendly label for well known - * metrics regardless of whether we receive the legacy or the new analytics key. - */ -export const getMetricDisplayName = (key: string): string => { - const canonical = canonicalizeMetricKey(key) - switch (canonical) { - case "attributes.ag.metrics.costs.cumulative.total": - return "Cost (Total)" - case "attributes.ag.metrics.duration.cumulative": - return "Duration (Total)" - case "attributes.ag.metrics.tokens.cumulative.total": - return "Tokens (Total)" - case "attributes.ag.metrics.errors.cumulative": - return "Errors" - default: { - const cleaned = canonical - .replace(/[_\.]/g, " ") - .replace(/\s+/g, " ") - .trim() - .toLowerCase() - return cleaned.replace(/\b\w/g, (c) => c.toUpperCase()) - } - } -} - -/** - * Extract a single primitive value from a metric payload. - * - * The backend may return either: - * • a plain primitive (number | string | boolean | array) - * • a {@link BasicStats} object containing statistical fields. - * - * This helper applies the heuristics used in several places: - * 1. mean - * 2. sum - * 3. first frequency value - * 4. fallback to raw object - */ -export function extractPrimitive(metric: MetricValue): T | undefined { - if (metric === null || metric === undefined) return undefined as any - - // Plain primitives / arrays are returned verbatim. - if (typeof metric !== "object" || Array.isArray(metric)) return metric as any - - const stats = metric as BasicStats - if (stats.mean !== undefined) return stats.mean as any - if (stats.sum !== undefined) return stats.sum as any - if (stats.frequency?.length) return stats.frequency[0].value as any - - // As a last resort return the object itself (caller decides what to do). - return metric as any -} - -/** - * Infer the metric primitive type when evaluator schema does not provide one. - * - * Mainly used by table renderers to decide formatting & sorter eligibility. - */ -export function inferMetricType(raw: unknown, schemaType?: SchemaMetricType): PrimitiveMetricType { - if (schemaType) { - // When evaluator schema provides a union array we choose the first non-null type. - if (Array.isArray(schemaType)) { - const withoutNull = schemaType.filter((t) => t !== "null") - return (withoutNull[0] ?? "string") as PrimitiveMetricType - } - return schemaType as PrimitiveMetricType - } - - if (raw === null) return "null" - if (Array.isArray(raw)) return "array" - const t = typeof raw - if (t === "number" || t === "boolean" || t === "string") return t - return "object" -} - -/** - * Determine if a column with the given metric type should expose sorting. - * - * Current UX policy: only numeric and boolean primitives are sortable. - */ -export function isSortableMetricType(metricType: SchemaMetricType | undefined): boolean { - if (!metricType) return true // fallback - - const types = Array.isArray(metricType) ? metricType : [metricType] - return !types.includes("string") && !types.includes("array") -} - -/** - * Generic comparator function used by AntD Table sorter. - * Returns negative / zero / positive like `Array.prototype.sort` expects. - */ -export function summarizeMetric( - stats: BasicStats | undefined, - schemaType?: SchemaMetricType, -): string | number | undefined { - if (!stats) return undefined - - // 1. mean for numeric metrics (latency etc.) - if (typeof (stats as any).mean === "number") { - return (stats as any).mean - } - - // 2. boolean metrics – proportion of true (percentage) - if (schemaType === "boolean" && Array.isArray((stats as any).frequency)) { - const trueEntry = (stats as any).frequency.find((f: any) => f.value === true) - const total = (stats as any).count ?? 0 - if (total) { - return ((trueEntry?.count ?? 0) / total) * 100 - } - } - - // 3. ranked categorical metrics – show top value and count - if (Array.isArray((stats as any).rank) && (stats as any).rank.length) { - const top = (stats as any).rank[0] - return `${top.value} (${top.count})` - } - - // 4. plain count fallback - if (typeof (stats as any).count === "number") { - return (stats as any).count - } - - return undefined -} - -export function metricCompare(a: unknown, b: unknown): number { - // undefined / null handling – push to bottom - if (a === undefined || a === null) return 1 - if (b === undefined || b === null) return -1 - - // Normalize boolean-like values so categorical metrics sort correctly. - // Accept true/false, "true"/"false" (case-insensitive), and 1/0. - const normalizeBool = (v: unknown): boolean | undefined => { - if (typeof v === "boolean") return v - if (typeof v === "number") { - if (v === 1) return true - if (v === 0) return false - return undefined - } - if (typeof v === "string") { - const s = v.trim().toLowerCase() - if (s === "true") return true - if (s === "false") return false - if (s === "1") return true - if (s === "0") return false - } - return undefined - } - - const boolA = normalizeBool(a) - const boolB = normalizeBool(b) - if (boolA !== undefined && boolB !== undefined) { - // false < true when sorting ascending - return Number(boolA) - Number(boolB) - } - - const numA = Number(a as any) - const numB = Number(b as any) - const bothNumeric = !Number.isNaN(numA) && !Number.isNaN(numB) - if (bothNumeric) return numA - numB - - return String(a).localeCompare(String(b)) -} - -/** - * Compute maximum width among children columns. Used when a metrics group is - * collapsed into one column. - */ -export function maxChildWidth( - children: {key?: string; dataIndex?: string; width?: number}[], - distMap: Record, - fallback = 160, -): number { - return Math.max( - ...children.map( - (ch) => distMap[ch.key ?? ch.dataIndex ?? ""]?.width ?? ch.width ?? fallback, - ), - ) -} diff --git a/web/oss/src/lib/metrics/utils.ts b/web/oss/src/lib/metrics/utils.ts deleted file mode 100644 index e3255eed26..0000000000 --- a/web/oss/src/lib/metrics/utils.ts +++ /dev/null @@ -1,93 +0,0 @@ -import {canonicalizeMetricKey, getMetricDisplayName} from "../metricUtils" - -// Shared helpers for metric key humanisation and sorting -// ------------------------------------------------------ -// This centralises the logic used in various tables (virtualised scenario table, -// human-evaluation runs table, etc.) so we have a single source of truth when we -// add new invocation-level metrics. - -export interface MetricConfig { - /** Which field in BasicStats to use when sorting / displaying primary value */ - primary: string - /** Human-readable column title */ - label: string -} - -const TOKEN_ORDER = ["promptTokens", "completionTokens", "totalTokens"] as const - -/** - * Given a flattened invocation metric key (e.g. "latency", "totalCost", - * "duration.total", "promptTokens" …) return: - * 1. primary aggregation key to read from BasicStats - * 2. human-friendly title string used for column headers - */ -export const getMetricConfig = (key: string): MetricConfig => { - const canonical = canonicalizeMetricKey(key) - if (canonical === "attributes.ag.metrics.costs.cumulative.total") { - return {primary: "sum", label: getMetricDisplayName(canonical)} - } - if (canonical === "attributes.ag.metrics.duration.cumulative") { - return {primary: "mean", label: getMetricDisplayName(canonical)} - } - if (canonical === "attributes.ag.metrics.tokens.cumulative.total") { - return {primary: "sum", label: getMetricDisplayName(canonical)} - } - if (canonical === "attributes.ag.metrics.errors.cumulative") { - return {primary: "count", label: getMetricDisplayName(canonical)} - } - - if (canonical !== key) { - return getMetricConfig(canonical) - } - - // Common most-used names first for performance/readability - if (key === "latency") { - return {primary: "mean", label: "Latency (mean)"} - } - if (key === "totalCost" || key === "cost") { - return {primary: "sum", label: "Cost (total)"} - } - - // Token counts (camelCase like promptTokens -> "Prompt tokens (total)") - if (key.endsWith("Tokens")) { - const words = key - .replace(/Tokens$/, " tokens") - .replace(/([A-Z])/g, " $1") - .trim() - const capitalised = words.charAt(0).toUpperCase() + words.slice(1) - return {primary: "sum", label: `${capitalised} (total)`} - } - - // Dotted keys from step summariser e.g. duration.total => Duration (total) - if (key.includes(".")) { - const [base, sub] = key.split(".") - const capitalised = base.charAt(0).toUpperCase() + base.slice(1) - const primary = sub === "total" ? "sum" : sub - return {primary, label: `${capitalised} (${sub})`} - } - - // Fallback – treat as numeric mean - const capitalised = getMetricDisplayName(key) - const primary = key === "errors" ? "count" : "mean" - return {primary, label: `${capitalised} (${primary})`} -} - -/** - * Provide a stable sort priority for invocation metric keys so that tables show - * them in a predictable order: - * 0. cost - * 1. duration.* - * 2. token metrics (prompt, completion, total, then any other token key) - * 3. others alphabetical - */ -export const metricPriority = (key: string): [number, number] => { - const canonical = canonicalizeMetricKey(key) - const target = canonical ?? key - const lc = target.toLowerCase() - if (lc.includes("cost")) return [0, 0] - if (lc.includes("duration")) return [1, 0] - const tokenIdx = TOKEN_ORDER.indexOf(target as (typeof TOKEN_ORDER)[number]) - if (tokenIdx !== -1) return [2, tokenIdx] - if (target.endsWith("Tokens") || lc.includes("token")) return [2, 99] - return [3, 0] -} diff --git a/web/oss/src/lib/shared/variant/api.ts b/web/oss/src/lib/shared/variant/api.ts index 0c6d93000d..6a358915a7 100644 --- a/web/oss/src/lib/shared/variant/api.ts +++ b/web/oss/src/lib/shared/variant/api.ts @@ -1,4 +1,6 @@ -import {type ApiRevision} from "@/oss/lib/Types" +import {type Environment, type CamelCaseEnvironment, type ApiRevision} from "@/oss/lib/Types" +import {fetchSingleProfile} from "@/oss/services/api" +import {fetchEnvironments} from "@/oss/services/deployment/api" import {fetchAllPromptVersioning} from "@/oss/services/promptVersioning/api" /** @@ -11,3 +13,34 @@ export const fetchRevisions = async ( const response = await fetchAllPromptVersioning(variantId) return response as ApiRevision[] } + +/** + * Fetches and transforms deployment environments for an app + */ +export const fetchAndTransformEnvironments = async ( + appId: string, +): Promise => { + return fetchEnvironments(appId).then((environments) => + environments.map( + (env: Environment): CamelCaseEnvironment => ({ + name: env.name, + appId: env.app_id, + deployedAppVariantId: env.deployed_app_variant_id, + deployedVariantName: env.deployed_variant_name, + deployedAppVariantRevisionId: env.deployed_app_variant_revision_id, + revision: env.revision, + }), + ), + ) +} + +/** + * Fetches user profile and revisions data in parallel + */ +export const fetchVariantMetadata = async ( + variantId: string, + projectId: string, + modifiedById: string, +) => { + return Promise.all([fetchRevisions(variantId, projectId), fetchSingleProfile(modifiedById)]) +} diff --git a/web/oss/src/lib/shared/variant/genericTransformer/helpers/objects.ts b/web/oss/src/lib/shared/variant/genericTransformer/helpers/objects.ts index 1fcbee804a..ef83701b1b 100644 --- a/web/oss/src/lib/shared/variant/genericTransformer/helpers/objects.ts +++ b/web/oss/src/lib/shared/variant/genericTransformer/helpers/objects.ts @@ -93,12 +93,8 @@ export function processObjectSchema( } // Simplified object processing - const additionalProperties = - "additionalProperties" in schema ? schema.additionalProperties !== false : false - return { ...buildObjectBase(schema), properties: schema.properties ? processObjectProperties(schema.properties) : {}, - additionalProperties, } } diff --git a/web/oss/src/lib/shared/variant/genericTransformer/index.ts b/web/oss/src/lib/shared/variant/genericTransformer/index.ts index a04fd02c64..d26cc73f80 100644 --- a/web/oss/src/lib/shared/variant/genericTransformer/index.ts +++ b/web/oss/src/lib/shared/variant/genericTransformer/index.ts @@ -22,8 +22,8 @@ function transformObjectValue>( value: T, properties: Record, parentMetadata?: ConfigMetadata, // Add this parameter -): Record { - const result = Object.entries(properties).reduce( +): Record> { + return Object.entries(properties).reduce( (acc, [key, propSchema]) => { const camelKey = toCamelCase(key) const val = value?.[key] ?? null @@ -37,19 +37,8 @@ function transformObjectValue>( acc[camelKey] = transformValue(val, propSchema, propertyMetadata) return acc }, - {} as Record, + {} as Record>, ) - - // Preserve any keys that are present in the value but not described in the schema - if (value && typeof value === "object") { - Object.keys(value).forEach((originalKey) => { - const camelKey = toCamelCase(originalKey) - if (camelKey in result) return - result[camelKey] = (value as Record)[originalKey] - }) - } - - return result } function metadataToSchema(metadata: ConfigMetadata): SchemaProperty { @@ -219,6 +208,15 @@ function transformValue( value: transformedValue?.value || transformedValue, } as Enhanced + // console.log("TRANSFORMING COMPOUND", { + // value, + // metadata, + // transformed, + // transformedMetadata: getMetadataLazy(transformed.value.__metadata), + // subMetadata, + // subSchema, + // }) + return transformed } @@ -234,7 +232,7 @@ function transformValue( return { __id: generateId(), __metadata: metadataHash, - ...transformObjectValue(value, properties, metadata), + ...transformObjectValue(value, properties), } as Enhanced } @@ -308,7 +306,6 @@ export function mergeWithSchema( schemaProperty, (defaultValues[propertyKey] || {}) as any, savedValues[propertyKey] as any, - ignoreKeys, ) } else if (schemaProperty.type === "array") { // Handle arrays - prefer saved values, fallback to defaults @@ -322,25 +319,5 @@ export function mergeWithSchema( } } - // Preserve unknown keys from the saved config so they are not discarded when users - // edit JSON directly (e.g. adding new prompt properties). - for (const key of Object.keys(savedValues)) { - if (ignoreKeys?.includes(key)) continue - if (key in schemaProperties) continue - - const propertyKey = key as keyof T - result[propertyKey] = savedValues[propertyKey] as T[keyof T] - } - - // Ensure defaults remain available for non-schema keys when no saved value exists. - for (const key of Object.keys(defaultValues || {})) { - if (ignoreKeys?.includes(key)) continue - if (key in schemaProperties) continue - if (key in result) continue - - const propertyKey = key as keyof T - result[propertyKey] = defaultValues[propertyKey] as T[keyof T] - } - return result as T } diff --git a/web/oss/src/lib/shared/variant/inputHelpers.ts b/web/oss/src/lib/shared/variant/inputHelpers.ts index fd49f48502..4058623254 100644 --- a/web/oss/src/lib/shared/variant/inputHelpers.ts +++ b/web/oss/src/lib/shared/variant/inputHelpers.ts @@ -1,17 +1,27 @@ +import {GenerationInputRow} from "@/oss/components/Playground/state/types" +import {hashMetadata} from "@/oss/lib/hooks/useStatelessVariants/assets/hash" + +import {getSpecLazy} from "../../hooks/useStatelessVariants/state" +import {PlaygroundStateData} from "../../hooks/useStatelessVariants/types" + import {transformPrimitive} from "./genericTransformer" import {ArrayMetadata, ObjectMetadata, StringMetadata} from "./genericTransformer/types" -import {getRequestSchema} from "./openapiUtils" +import {constructPlaygroundTestUrl, generateId} from "./stringUtils" import {EnhancedVariant} from "./transformer/types" import {OpenAPISpec} from "./types/openapi" export const extractInputKeysFromSchema = (spec: OpenAPISpec, routePath = "") => { - const requestSchema = getRequestSchema(spec, {routePath}) + const requestSchema = + spec?.paths?.[ + `${constructPlaygroundTestUrl({ + routePath, + })}` + ]?.post?.requestBody?.content?.["application/json"]?.schema if (!requestSchema || !("properties" in requestSchema)) { console.error("Invalid OpenAPI schema") } const expectedProperties = requestSchema?.properties || {} const expectedPropertyKeys = Object.keys(expectedProperties).filter( - // Exclude reserved container keys; call sites decide whether to include schema keys for custom/non-custom (key) => !["ag_config", "messages"].includes(key), ) return expectedPropertyKeys @@ -23,16 +33,13 @@ export const extractInputKeysFromSchema = (spec: OpenAPISpec, routePath = "") => * @returns Array of variable names found in the string */ export function extractVariables(input: string): string[] { - const variablePattern = /\{\{((?:\\.|[^\}\\])*)\}\}/g + const variablePattern = /\{\{\s*((?:\\.|[^\}\\])*)\s*\}\}/g const variables: string[] = [] let match: RegExpExecArray | null while ((match = variablePattern.exec(input)) !== null) { - const variable = match[1].replaceAll(/\\(.)/g, "$1").trim() - if (variable) { - variables.push(variable) - } + variables.push(match[1].replaceAll(/\\(.)/g, "$1")) } return variables @@ -97,6 +104,42 @@ export function createInputSchema(inputKeys: string[]): ArrayMetadata { + const metadataHash = hashMetadata(metadata.properties[key]) + + return [ + key, + { + __id: generateId(), + __metadata: metadataHash, + value: "", + }, + ] + }), + ) + + const metadataHash = hashMetadata(metadata) + + // Return object with properties spread at root level and initialize __result as undefined + return { + __id: generateId(), + __metadata: metadataHash, + __runs: {}, + ...enhancedValues, + } +} +/** + * Prompt Key Management + * -------------------- + */ + /** * Updates input keys for a single prompt based on its messages * @param prompt - Prompt configuration to update @@ -152,26 +195,182 @@ export function updateVariantPromptKeys(variant: EnhancedVariant) { * ----------------------- */ +/** + * Initialize variant inputs with a single empty row + * @param variant - Variant to initialize inputs for + * @returns Updated variant with initialized inputs + */ +export function initializeVariantInputs(variant: EnhancedVariant, spec: OpenAPISpec) { + const allInputKeys = Array.from( + new Set( + (variant.prompts || []).flatMap((prompt) => { + return prompt.inputKeys?.value || [] + }), + ), + ) + + const inputStrings: string[] = [] + if (variant.isCustom) { + // @ts-ignore + inputStrings.push(...extractInputKeysFromSchema(spec, variant.uriObject?.routePath)) + } else { + inputStrings.push(...Array.from(allInputKeys).map((enhancedKey) => enhancedKey.value)) + } + const inputSchema = createInputSchema(inputStrings) + const initialInputRow = createInputRow(inputStrings, inputSchema.itemMetadata) + + const _metadataHash = hashMetadata(inputSchema) + + // @ts-ignore + variant.inputs = { + __id: generateId(), + __metadata: inputSchema, + value: [initialInputRow], + } + + // @ts-ignore + variant.inputParams = inputStrings.map((inputString) => { + const schema = inputSchema.itemMetadata.properties[inputString] + + return { + name: inputString, + ...schema, + } + }) + + variant.requestSchema.inputKeys = inputStrings + + return variant +} + +/** + * Synchronizes variant inputs structure with current prompt variables + */ +export function syncVariantInputs( + variants: EnhancedVariant[], + generationInputData: PlaygroundStateData["generationData"]["inputs"], + spec: OpenAPISpec | null = getSpecLazy(), + routePath?: string, +) { + const isCustomWorkflow = variants.some((variant) => variant.isCustom) + let inputStrings: string[] = [] + if (isCustomWorkflow && spec) { + inputStrings = extractInputKeysFromSchema( + spec, + variants[0]?.uriObject?.routePath || routePath, + ) + } else { + const currentInputKeys = new Set( + variants.flatMap((variant) => + (variant.prompts || []).flatMap((prompt) => prompt.inputKeys?.value || []), + ), + ) + inputStrings = Array.from(currentInputKeys).map((enhancedKey) => enhancedKey.value) + } + + const inputSchema = createInputSchema(inputStrings) + + const existingInputsId = generationInputData?.__id || generateId() + + // Create metadata with ID properly typed + const metadata = { + ...inputSchema, + __id: existingInputsId, + } + + // Update each row while preserving all IDs + // @ts-ignore + const updatedRows = (generationInputData?.value || []).map((row) => { + const keys = [...inputStrings] as const + const metadataHash = hashMetadata(metadata.itemMetadata) + + type T = PlaygroundStateData["generationData"]["inputs"]["value"][number] & + Record<(typeof keys)[number], any> + + const newRow = { + __id: row.__id, + __metadata: metadataHash, + __result: row.__runs, + __runs: row.__runs, + } as T + + const _row = row as T + // For each current input key + keys.forEach((key) => { + if (key in _row) { + // If key existed before, preserve entire value object including ID + if (!!key && _row[key]) { + const _key = key as keyof typeof newRow + if (typeof _key === "string") { + newRow[_key] = _row[_key] + } + } + } else { + // Only create new ID for truly new keys + const _key = key as keyof typeof newRow + + const metadataHash = hashMetadata(inputSchema.itemMetadata.properties[key]) + + if (typeof _key === "string") { + newRow[_key] = { + __id: generateId(), + __metadata: metadataHash, + } as T[typeof _key] + } + } + }) + + return newRow + }) + + // Ensure at least one row exists + if (updatedRows.length === 0) { + updatedRows.push(createInputRow(inputStrings, inputSchema.itemMetadata)) + } + + const metadataHash = hashMetadata(metadata) + + generationInputData = { + __id: existingInputsId, + __metadata: metadataHash, + value: updatedRows, + } + + return generationInputData +} + +/** + * Gets the current input keys from all prompts in a variant + * @param variant - Variant to get input keys from + * @returns Set of unique input keys + */ +export function getVariantInputKeys(variant: EnhancedVariant): string[] { + const inputKeys = new Set( + (variant.prompts || []).flatMap((prompt) => prompt.inputKeys?.value || []) || [], + ) + return Array.from(new Set(Array.from(inputKeys).map((key) => key.value))) +} + /** * Extract input values from an enhanced input row */ export function extractInputValues( - _variant: EnhancedVariant, + variant: EnhancedVariant, inputRow: Record, ): Record { - // Derive inputs directly from the provided inputRow. - // We avoid relying on variant.inputParams (deprecated) and instead - // include any root-level fields that look like enhanced primitive objects - // (i.e., have a `value` property), excluding metadata fields. - + const variantInputs = (variant.prompts || []).flatMap((prompt) => { + return (prompt.inputKeys?.value || []).map((keyValue) => keyValue.value) + }) return Object.entries(inputRow).reduce( (acc, [key, value]) => { - if (key === "__id" || key === "__metadata" || key === "__result") { - return acc - } - - if (value && typeof value === "object" && "value" in value) { - acc[key] = (value as {value: string}).value + // Skip metadata, id, and result fields + if ( + key !== "__id" && + key !== "__metadata" && + key !== "__result" && + variantInputs.includes(key) + ) { + acc[key] = value.value } return acc }, diff --git a/web/oss/src/lib/shared/variant/openapiUtils.ts b/web/oss/src/lib/shared/variant/openapiUtils.ts deleted file mode 100644 index f9f48b9d6b..0000000000 --- a/web/oss/src/lib/shared/variant/openapiUtils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {constructPlaygroundTestUrl} from "./stringUtils" -import type {EnhancedVariant} from "./transformer/types" -import type {OpenAPISpec} from "./types/openapi" - -export function getRequestSchema( - spec: OpenAPISpec | undefined, - opts: {variant?: EnhancedVariant; routePath?: string}, -): any | undefined { - if (!spec) return undefined - const routePath = opts.routePath ?? (opts.variant as any)?.routePath - - // Prefer endpoints that typically include rich ag_config definitions. - // Fallback order mirrors common LLM app patterns. - const candidates = ["/run", "/test", "/generate", "/generate_deployed"] as const - - // First pass: pick the first schema that exposes ag_config - for (const endpoint of candidates) { - const p = constructPlaygroundTestUrl({routePath}, endpoint, false) - const s = spec?.paths?.[p]?.post?.requestBody?.content?.["application/json"]?.schema - if (s && typeof s === "object" && (s as any)?.properties?.ag_config) { - return s - } - } - - // Second pass: return the first available request schema - for (const endpoint of candidates) { - const p = constructPlaygroundTestUrl({routePath}, endpoint, false) - const s = spec?.paths?.[p]?.post?.requestBody?.content?.["application/json"]?.schema - if (s) return s - } - - return undefined -} diff --git a/web/oss/src/lib/shared/variant/transformer.ts b/web/oss/src/lib/shared/variant/transformer.ts index 24a1f5106b..660b95da5a 100644 --- a/web/oss/src/lib/shared/variant/transformer.ts +++ b/web/oss/src/lib/shared/variant/transformer.ts @@ -1,8 +1,12 @@ import {dereference} from "@scalar/openapi-parser" +import {getCurrentProject} from "@/oss/contexts/project.context" import {getJWT} from "@/oss/services/api" -import {getProjectValues} from "@/oss/state/project" +import {initializeVariantInputs, updateVariantPromptKeys} from "./inputHelpers" +import {transformToEnhancedVariant} from "./transformer/transformer" +import {EnhancedVariant} from "./transformer/types" +import {OpenAPISpec} from "./types/openapi" import {uriFixer} from "./utils" /** @@ -13,24 +17,19 @@ import {uriFixer} from "./utils" export const fetchOpenApiSchemaJson = async (uri: string) => { const jwt = await getJWT() try { - const ts = Date.now() - const base = `${uriFixer(uri)}/openapi.json${jwt ? `?project_id=${getProjectValues().projectId}` : ""}` - const url = `${base}${base.includes("?") ? "&" : "?"}_ts=${ts}` - const openapiJsonResponse = await fetch(url, { - // Prevent the browser or proxies from caching this request - cache: "no-store", - headers: { - "ngrok-skip-browser-warning": "1", - "Cache-Control": "no-cache, no-store, must-revalidate", - Pragma: "no-cache", - Expires: "0", - ...(jwt - ? { - Authorization: `Bearer ${jwt}`, - } - : {}), + const openapiJsonResponse = await fetch( + `${uriFixer(uri)}/openapi.json${jwt ? `?project_id=${getCurrentProject().projectId}` : ""}`, + { + headers: { + "ngrok-skip-browser-warning": "1", + ...(jwt + ? { + Authorization: `Bearer ${jwt}`, + } + : {}), + }, }, - }) + ) if (openapiJsonResponse.ok) { const responseJson = await openapiJsonResponse.json() const {schema, errors} = await dereference(responseJson) @@ -74,10 +73,6 @@ export const findCustomWorkflowPath = async ( const removedPath = paths.pop() const newPath = paths.join("/") - // Guard against pathological recursion (protocol-only like "http:" or empty) - if (!newPath || newPath.endsWith(":") || newPath === "http:" || newPath === "https:") { - return undefined - } return newPath ? await findCustomWorkflowPath( newPath, @@ -91,73 +86,79 @@ export const findCustomWorkflowPath = async ( } try { - // Normalize relative URIs to absolute using window origin when available - let normalizedUri = uri - if (typeof normalizedUri === "string" && normalizedUri.startsWith("/")) { - const origin = (globalThis as any)?.location?.origin - if (origin) normalizedUri = `${origin}${normalizedUri}` - } - // Trim trailing slashes to avoid '//openapi.json' - normalizedUri = normalizedUri.replace(/\/+$/, "") - // Strip trailing openapi.json if provided as base - if (normalizedUri.endsWith("/openapi.json")) { - normalizedUri = normalizedUri.replace(/\/openapi\.json$/, "") - } - if (!normalizedUri || typeof normalizedUri !== "string") { - return undefined - } - // Guard: avoid fetching protocol-only strings like "http:" which produce http://openapi.json - if (!normalizedUri.includes("//")) { - return undefined + if (!uri || !uri.includes("//")) { + throw new Error("No uri found") } - const endpointPath = normalizedUri.endsWith("/openapi.json") ? "" : endpoint - const url = `${normalizedUri}${endpointPath}${jwt ? `?project_id=${getProjectValues().projectId}` : ""}` - let openapiJsonResponse: Response | undefined - try { - openapiJsonResponse = await fetch(url, { + const openapiJsonResponse = await fetch( + `${uri}${endpoint}${jwt ? `?project_id=${getCurrentProject().projectId}` : ""}`, + { headers: { "ngrok-skip-browser-warning": "1", - "Cache-Control": "no-cache, no-store, must-revalidate", - Pragma: "no-cache", - Expires: "0", ...(jwt ? { Authorization: `Bearer ${jwt}`, } : {}), }, - cache: "no-store", signal, - }) - } catch { - openapiJsonResponse = undefined - } + }, + ) - const data = await openapiJsonResponse?.json() - if (!data || !openapiJsonResponse?.ok) { - return await handleIncorrectUri(normalizedUri) + const data = await openapiJsonResponse.json() + if (!data || !openapiJsonResponse.ok) { + return await handleIncorrectUri(uri) } else { return { routePath: removedPaths || "", - runtimePrefix: normalizedUri, - status: openapiJsonResponse?.ok, + runtimePrefix: uri, + status: openapiJsonResponse.ok, } } } catch (err) { - if (typeof uri === "string") { - // If relative without leading slash, attempt origin + '/' + uri - if (!uri.includes("//") && !uri.startsWith("/")) { - const origin = (globalThis as any)?.location?.origin - if (origin) return await handleIncorrectUri(`${origin}/${uri}`) - return undefined - } - if (!uri.includes("//")) { - const origin = (globalThis as any)?.location?.origin - if (origin) return await handleIncorrectUri(`${origin}${uri}`) - return undefined - } + if (!uri.includes("//")) { + return undefined + } else { + return await handleIncorrectUri(uri) } - return await handleIncorrectUri(uri) + } +} + +/** + * Transform a single variant using OpenAPI schema + */ +export const transformVariant = ( + variant: EnhancedVariant, + schema: OpenAPISpec, + appType?: string, +) => { + try { + const enhancedVariant = transformToEnhancedVariant(variant, schema, appType) + // Update prompt keys and initialize inputs + // @ts-ignore + updateVariantPromptKeys(enhancedVariant) + // @ts-ignore + initializeVariantInputs(enhancedVariant, schema) + return enhancedVariant + } catch (err) { + console.error("Error transforming variant:", err) + throw err + } +} + +/** + * Transform multiple variants using OpenAPI schema + */ +export const transformVariants = ( + variants: EnhancedVariant[], + schema: OpenAPISpec, + appType?: string, +): EnhancedVariant[] => { + try { + // @ts-ignore + return (variants || []).map((variant) => transformVariant(variant, schema, appType)) + } catch (error) { + console.error("Error transforming variants:", error) + throw error } } diff --git a/web/oss/src/lib/shared/variant/transformer/transformToRequestBody.ts b/web/oss/src/lib/shared/variant/transformer/transformToRequestBody.ts index ae6298a3ab..31ebdbf0b6 100644 --- a/web/oss/src/lib/shared/variant/transformer/transformToRequestBody.ts +++ b/web/oss/src/lib/shared/variant/transformer/transformToRequestBody.ts @@ -1,14 +1,8 @@ -import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" +import {getAllMetadata, getSpecLazy} from "@/oss/lib/hooks/useStatelessVariants/state" import {PlaygroundStateData} from "../../../hooks/useStatelessVariants/types" import {ConfigMetadata, EnhancedObjectConfig, OpenAPISpec} from "../genericTransformer/types" -import { - extractInputKeysFromSchema, - extractInputValues, - extractVariables, - extractVariablesFromJson, -} from "../inputHelpers" -import {getRequestSchema} from "../openapiUtils" +import {extractInputKeysFromSchema, extractInputValues} from "../inputHelpers" import {extractValueByMetadata} from "../valueHelpers" import {EnhancedVariant, Message, VariantParameters} from "./types" @@ -16,7 +10,6 @@ import {EnhancedVariant, Message, VariantParameters} from "./types" /** * Transform EnhancedVariant back to API request shape */ -// Deprecated: keep as thin wrapper while migrating to explicit helpers. export function transformToRequestBody({ variant, inputRow, @@ -26,14 +19,6 @@ export function transformToRequestBody({ spec: _spec, routePath = "", commitType, - prompts, - customProperties, - revisionId: _revisionId, - isChat, - isCustom, - appType, - variables, - variableValues, }: { variant: EnhancedVariant inputRow?: PlaygroundStateData["generationData"]["inputs"]["value"][number] @@ -43,77 +28,10 @@ export function transformToRequestBody({ spec?: OpenAPISpec routePath?: string commitType?: "prompt" | "parameters" - prompts?: any[] - customProperties?: Record - revisionId?: string - isChat?: boolean - isCustom?: boolean - appType?: string - variables?: string[] - variableValues?: Record }): Record & VariantParameters { const data = {} as Record - const spec = _spec - // Inspect request schema to determine how to map inputs for custom workflows - const reqSchema = spec ? getRequestSchema(spec, {routePath}) : undefined - const hasInputsProperty = Boolean((reqSchema as any)?.properties?.inputs) - const hasMessagesProperty = Boolean((reqSchema as any)?.properties?.messages) - const isCustomBySchema = Boolean(spec) && !hasInputsProperty && !hasMessagesProperty - const isCustomByAppType = (appType || "").toLowerCase() === "custom" - const isCustomFinal = Boolean(isCustom) || isCustomBySchema || isCustomByAppType - - // Helper: infer if a property schema expects a string - const _isStringSchema = (node: any): boolean => { - if (!node || typeof node !== "object") return false - const t = (node as any).type - if (typeof t === "string") return t === "string" - if (Array.isArray(t)) return t.includes("string") - const alts = (node as any).anyOf || (node as any).oneOf || (node as any).allOf - if (Array.isArray(alts)) return alts.some((n) => _isStringSchema(n)) - return false - } - const _isNullable = (node: any): boolean => { - if (!node || typeof node !== "object") return false - if ((node as any).nullable === true) return true - const t = (node as any).type - if (t === "null") return true - if (Array.isArray(t) && t.includes("null")) return true - const alts = (node as any).anyOf || (node as any).oneOf || (node as any).allOf - if (Array.isArray(alts)) return alts.some((n) => _isNullable(n)) - return false - } - const _getPropertySchema = (key: string): any => { - try { - const top = (reqSchema as any)?.properties?.[key] - if (top) return top - const inputs = (reqSchema as any)?.properties?.inputs?.properties?.[key] - if (inputs) return inputs - } catch {} - return undefined - } - const _defaultForKey = (key: string): any => { - try { - const prop = _getPropertySchema(key) - if (!prop) { - // Unknown schema; prefer empty string for safety when not explicitly nullable - return "" - } - if (_isStringSchema(prop)) return "" - // If type is unknown/unspecified but not explicitly nullable, send empty string - const hasType = - Boolean((prop as any).type) || - Boolean((prop as any).anyOf) || - Boolean((prop as any).oneOf) || - Boolean((prop as any).allOf) - if (!hasType && !_isNullable(prop)) return "" - // Fallback: default to null for non-string or explicitly nullable types - return null - } catch { - return null - } - } - const enhancedPrompts = (prompts || variant?.prompts || []) as any[] - const promptConfigs = (enhancedPrompts || []).reduce( + const spec = _spec || getSpecLazy() + const promptConfigs = (variant.prompts || []).reduce( (acc, prompt) => { const extracted = extractValueByMetadata(prompt, allMetadata) const name = prompt.__name @@ -125,42 +43,8 @@ export function transformToRequestBody({ {} as Record, ) - // Fallback: if extraction produced empty messages but enhanced prompts contain messages, - // build a minimal messages array from the enhanced structure (role/content only) - try { - for (const p of enhancedPrompts || []) { - const key = p?.__name - if (!key) continue - const cfg = promptConfigs[key] || (promptConfigs[key] = {}) - const hasMsgs = Array.isArray(cfg?.messages) && cfg.messages.length > 0 - const enhancedMsgs = (p as any)?.messages?.value - if (!hasMsgs && Array.isArray(enhancedMsgs) && enhancedMsgs.length > 0) { - cfg.messages = enhancedMsgs.map((m: any) => { - const role = m?.role?.value ?? m?.role ?? "user" - const content = (() => { - const c = m?.content?.value ?? m?.content - if (Array.isArray(c)) { - // Join text parts to a simple string; keep simple for fallback - const texts = c - .map((part: any) => part?.text?.value ?? part?.text ?? "") - .filter(Boolean) - return texts.join("\n\n") - } - return c - })() - return {role, content} - }) - } - } - } catch { - // best-effort only - } - const customConfigs = - (extractValueByMetadata( - customProperties || variant?.customProperties, - allMetadata, - ) as Record) || {} + (extractValueByMetadata(variant.customProperties, allMetadata) as Record) || {} let ag_config = { ...promptConfigs, @@ -169,217 +53,34 @@ export function transformToRequestBody({ // Fallback: if ag_config is empty, // but variant.parameters exists, use that - // if ( - // (Object.keys(ag_config).length === 0 && variant.parameters) || - // commitType === "parameters" - // ) { - // ag_config = variant.parameters?.ag_config || variant.parameters || {} - // } - - // Sanitize response_format within each prompt's llm_config to avoid backend validation errors - const sanitizeResponseFormat = (cfg: Record) => { - const allowedTypes = new Set(["text", "json_object", "json_schema"]) as Set - Object.values(cfg || {}).forEach((promptCfg: any) => { - if (!promptCfg || typeof promptCfg !== "object") return - const llmCfg = promptCfg.llm_config - if (!llmCfg || typeof llmCfg !== "object") return - const rf = llmCfg.response_format - if (!rf || typeof rf !== "object") return - const t = rf.type - // If type missing or not allowed, drop response_format to default to text - if (!t || typeof t !== "string" || !allowedTypes.has(t)) { - delete llmCfg.response_format - return - } - if (t === "text") { - // Normalize to minimal shape - llmCfg.response_format = {type: "text"} - return - } - if (t === "json_object") { - // Nothing else required; ensure no stray fields - llmCfg.response_format = {type: "json_object"} - return - } - if (t === "json_schema") { - // Require json_schema field; if missing, drop response_format to avoid validation error - if (!rf.json_schema || typeof rf.json_schema !== "object") { - delete llmCfg.response_format - return - } - // Keep only required fields - llmCfg.response_format = { - type: "json_schema", - json_schema: rf.json_schema, - } - } - }) + if ( + (Object.keys(ag_config).length === 0 && variant.parameters) || + commitType === "parameters" + ) { + ag_config = variant.parameters?.ag_config || variant.parameters || {} } - sanitizeResponseFormat(ag_config) - data.ag_config = ag_config - // Resolve variables (input_keys) - // For custom workflows, do NOT infer from prompts; stick to request schema input keys. - let resolvedVariables: string[] | undefined = variables - try { - if (isCustomFinal) { - const inputKeys = spec ? extractInputKeysFromSchema(spec, routePath) : [] - resolvedVariables = inputKeys - } else if (!resolvedVariables || resolvedVariables.length === 0) { - const vars = new Set() - for (const cfg of Object.values(promptConfigs || {})) { - const msgs = Array.isArray((cfg as any)?.messages) ? (cfg as any).messages : [] - for (const m of msgs) { - const content = (m as any)?.content - if (typeof content === "string") { - extractVariables(content).forEach((v) => vars.add(v)) - } else if (content && (Array.isArray(content) || typeof content === "object")) { - extractVariablesFromJson(content).forEach((v) => vars.add(v)) - } - } - const respFmt = (cfg as any)?.llm_config?.response_format - if (respFmt) { - extractVariablesFromJson(respFmt).forEach((v) => vars.add(v)) - } - } - resolvedVariables = Array.from(vars) - } - } catch { - // best-effort; ignore extraction errors - } - if (inputRow) { - if (isCustomFinal) { - // Custom workflow: put inputs at top-level according to schema input keys - const inputKeys = spec ? extractInputKeysFromSchema(spec, routePath) : [] + if (!variant.isCustom) { + data.inputs = extractInputValues(variant, inputRow) + } else if (spec) { + const inputKeys = extractInputKeysFromSchema(spec, routePath) for (const key of inputKeys) { - const node = inputRow?.[key as keyof typeof inputRow] as - | EnhancedObjectConfig - | undefined - const value = (node as any)?.value - if (value !== undefined) { + const value = ( + inputRow?.[key as keyof typeof inputRow] as EnhancedObjectConfig + ).value + if (value) { data[key] = value - } else { - // Fill with placeholder so backends see the field present - if (!(key in data)) data[key] = _defaultForKey(key) - } - } - } else { - // Non-custom (completion): place under inputs - if (!(isChat ?? variant?.isChat)) { - data.inputs = extractInputValues(variant, inputRow) - } else if (isChat ?? variant?.isChat) { - data.inputs = extractInputValues(variant, inputRow) - } - } - // Merge provided variableValues on top of extracted inputs (if any) - if (variableValues && Object.keys(variableValues).length > 0) { - if (isCustomFinal) { - // For custom workflows, only include keys present in the request schema - const keys = spec ? extractInputKeysFromSchema(spec, routePath) : [] - const allowed = new Set(keys) - Object.entries(variableValues).forEach(([k, v]) => { - if (allowed.has(k)) { - data[k] = v - } - }) - // Ensure all schema keys are present; use default when missing - keys.forEach((k) => { - if (!(k in data)) data[k] = _defaultForKey(k) - }) - } else if (!(isChat ?? variant?.isChat)) { - data.inputs = {...(data.inputs || {}), ...variableValues} - } - } - // Attach input_keys only for non-custom prompts (custom workflows have no prompt configs) - if (!isCustomFinal) { - const keys = resolvedVariables ?? (variableValues ? Object.keys(variableValues) : []) - if (keys && keys.length > 0) { - const promptKey = Object.keys(ag_config || {})[0] - const target = promptKey ? (ag_config as any)[promptKey] : undefined - if (target && typeof target === "object") { - target.input_keys = keys - } - } - } - } else if (resolvedVariables || variableValues) { - // If no inputRow is provided, still include inputs and (optionally) input_keys - const keys = isCustomByAppType - ? spec - ? extractInputKeysFromSchema(spec, routePath) - : [] - : (resolvedVariables ?? Object.keys(variableValues || {})) - // Try to set input_keys on the first prompt config if present (non-custom only) - if (!isCustomFinal && keys && keys.length > 0) { - const promptKey = Object.keys(ag_config || {})[0] - const target = promptKey ? (ag_config as any)[promptKey] : undefined - if (target && typeof target === "object") { - target.input_keys = keys - } - } - if (variableValues && Object.keys(variableValues).length > 0) { - if (isCustomByAppType) { - const keys = spec ? extractInputKeysFromSchema(spec, routePath) : [] - const allowed = new Set(keys) - Object.entries(variableValues).forEach(([k, v]) => { - if (allowed.has(k)) { - data[k] = v - } - }) - // Ensure all schema keys are present (use null for missing) - keys.forEach((k) => { - if (!(k in data)) data[k] = null - }) - } else { - data.inputs = {...(data.inputs || {}), ...variableValues} - } - } else if (isCustomByAppType) { - // No variable values provided; still include all schema input keys with default - const keys = spec ? extractInputKeysFromSchema(spec, routePath) : [] - keys.forEach((k) => { - if (!(k in data)) data[k] = _defaultForKey(k) - }) - } - } - - // Final guards - // 1) Ensure inputs present when variableValues exist (completion-style) - if (!isCustomByAppType) { - if (!data.inputs && variableValues && Object.keys(variableValues).length > 0) { - data.inputs = {...variableValues} - } - } - // 2) For non-custom schemas that declare an `inputs` property, - // always include an `inputs` object (may be empty) to satisfy backends - // that require the container field. Applies to both completion and chat - // variants if the schema declares it. - if (!isCustomByAppType && hasInputsProperty) { - if (!("inputs" in data)) { - data.inputs = {} - } - // Include all discovered variable keys with default when no value provided - const keys: string[] = - Array.isArray(resolvedVariables) && resolvedVariables.length - ? resolvedVariables - : Array.isArray(variables) - ? variables - : [] - if (Array.isArray(keys) && keys.length > 0) { - for (const k of keys) { - if (!k || typeof k !== "string") continue - if (!Object.prototype.hasOwnProperty.call(data.inputs as any, k)) { - const vv = variableValues ? (variableValues as any)[k] : undefined - ;(data.inputs as any)[k] = vv !== undefined ? vv : _defaultForKey(k) } } } } - if (isChat ?? variant?.isChat) { + if (variant.isChat) { data.messages = [] - if (chatHistory && chatHistory.length > 0) { + if (chatHistory) { data.messages.push(...chatHistory) } else { const messageHistory = messageRow?.history.value || [] @@ -389,12 +90,11 @@ export function transformToRequestBody({ .flatMap((historyMessage) => { const messages = [extractValueByMetadata(historyMessage, allMetadata)] if (historyMessage.__runs) { - const revisionId = _revisionId ?? variant?.id const runMessages = - historyMessage.__runs[revisionId]?.message && - Array.isArray(historyMessage.__runs[revisionId]?.message) - ? historyMessage.__runs[revisionId]?.message - : [historyMessage.__runs[revisionId]?.message] + historyMessage.__runs[variant.id]?.message && + Array.isArray(historyMessage.__runs[variant.id]?.message) + ? historyMessage.__runs[variant.id]?.message + : [historyMessage.__runs[variant.id]?.message] if (runMessages && Array.isArray(runMessages)) { for (const runMessage of runMessages) { @@ -416,91 +116,3 @@ export function transformToRequestBody({ return data as Record & VariantParameters } - -/** - * Pure helper for completion-style request bodies. - * Accepts optional `inputRow` and/or `variableValues` to populate inputs. - */ -export function toRequestBodyCompletion(args: { - prompts?: any[] - customProperties?: Record - appType?: string - variables?: string[] - variableValues?: Record - spec?: OpenAPISpec - routePath?: string - variant?: EnhancedVariant - inputRow?: PlaygroundStateData["generationData"]["inputs"]["value"][number] -}): Record & VariantParameters { - const { - prompts, - customProperties, - appType, - variables, - variableValues, - spec, - routePath, - variant, - inputRow, - } = args - - return transformToRequestBody({ - variant: (variant || ({} as any)) as EnhancedVariant, - inputRow, - allMetadata: getAllMetadata(), - spec, - routePath, - prompts, - customProperties, - isChat: false, - isCustom: undefined, - appType, - variables, - variableValues, - }) -} - -/** - * Pure helper for chat-style request bodies. - * Provide `chatHistory` directly for derived histories, or a `messageRow` to extract from. - */ -export function toRequestBodyChat(args: { - prompts?: any[] - customProperties?: Record - appType?: string - variables?: string[] - spec?: OpenAPISpec - routePath?: string - revisionId?: string - variant?: EnhancedVariant - chatHistory?: Message[] - messageRow?: PlaygroundStateData["generationData"]["messages"]["value"][number] -}): Record & VariantParameters { - const { - prompts, - customProperties, - appType, - variables, - spec, - routePath, - revisionId, - variant, - chatHistory, - messageRow, - } = args - - return transformToRequestBody({ - variant: (variant || ({} as any)) as EnhancedVariant, - messageRow, - allMetadata: getAllMetadata(), - chatHistory, - spec, - routePath, - prompts, - customProperties, - revisionId, - isChat: true, - isCustom: undefined, - appType, - }) -} diff --git a/web/oss/src/lib/shared/variant/transformer/transformer.ts b/web/oss/src/lib/shared/variant/transformer/transformer.ts index 10e7274d34..275a98f706 100644 --- a/web/oss/src/lib/shared/variant/transformer/transformer.ts +++ b/web/oss/src/lib/shared/variant/transformer/transformer.ts @@ -15,8 +15,7 @@ import type { Enhanced, EnhancedObjectConfig, } from "../genericTransformer/types" -import {getRequestSchema} from "../openapiUtils" -import {generateId} from "../stringUtils" +import {constructPlaygroundTestUrl} from "../stringUtils" import type {EnhancedVariant, BaseVariant, AgentaConfigSchema, AgentaConfigPrompt} from "./types" @@ -40,139 +39,12 @@ function mergeWithSavedConfig( } : undefined - // Merge saved into defaults following schema, ignoring legacy keys we translate below - const merged = mergeWithSchema( + return mergeWithSchema( schema, defaultConfig, validatedConfig, ["input_keys", "system_prompt", "user_prompt"], ) - - // Backfill messages from legacy fields if not present - try { - const hasMessages = - Array.isArray((merged as any)?.messages) && - ((merged as any).messages as any[]).length > 0 - const sys = (validatedConfig as any)?.system_prompt - const usr = (validatedConfig as any)?.user_prompt - - if (!hasMessages && (sys || usr)) { - const messages: any[] = [] - if (sys) { - messages.push({role: "system", content: sys}) - } - if (usr) { - messages.push({role: "user", content: usr}) - } - ;(merged as any).messages = messages - } - } catch { - // noop – best effort backfill - } - - return merged -} - -/** - * Derive prompt configs from OpenAPI spec + saved parameters without mutating input - */ -export function derivePromptsFromSpec( - variant: EnhancedVariant, - openApiSpec: OpenAPISpec, - routePath?: string, -): EnhancedObjectConfig[] { - const requestSchema = getRequestSchema(openApiSpec, {variant, routePath}) - - const agConfig = requestSchema?.properties?.ag_config as AgentaConfigSchema - const properties = agConfig?.properties || {} - - const prompts = Object.keys(properties) - .map((key) => { - const property = properties[key] as Record - const hasXParams = - "x-parameters" in property && - typeof property["x-parameters"] === "object" && - Boolean(property["x-parameters"]) - const isPrompt = hasXParams && Boolean(property["x-parameters"]?.prompt) - return isPrompt ? {...property, key} : null - }) - .filter(Boolean) as ObjectSchema[] - - // Merge schema defaults with saved configuration - const mergedPromptData = prompts.reduce( - (acc, cur) => { - if (!cur || !cur?.key) return acc - const key = cur.key - acc[key] = mergeWithSavedConfig(cur, variant) - return acc - }, - {} as Record, - ) - - const transformedPrompts = prompts - .map((prompt) => { - if (!prompt || !prompt.key) return null - const transformed = createEnhancedConfig(mergedPromptData[prompt.key], prompt) - return { - ...transformed, - __name: prompt?.key, - } - }) - .filter(Boolean) as EnhancedObjectConfig[] - - return transformedPrompts -} - -/** - * Derive custom properties (non-prompt) from OpenAPI spec + saved parameters - */ -export function deriveCustomPropertiesFromSpec( - variant: EnhancedVariant, - openApiSpec: OpenAPISpec, - routePath?: string, -): Record> { - const parameters = - variant.parameters && (variant.parameters as any).ag_config - ? (variant.parameters as any).ag_config - : (variant.parameters ?? (variant as any).config?.parameters ?? {}) - - const requestSchema = getRequestSchema(openApiSpec, {variant, routePath}) - - const agConfig = requestSchema?.properties?.ag_config as AgentaConfigSchema - const properties = agConfig?.properties || {} - - const promptKeys = Object.keys(properties).filter((key) => { - const property = properties[key] as Record - const hasXParams = - "x-parameters" in property && - typeof property["x-parameters"] === "object" && - Boolean(property["x-parameters"]) - return hasXParams && Boolean(property["x-parameters"]?.prompt) - }) - - const customPropertyKeys = Object.keys(properties).filter((property) => { - return !!property && !promptKeys.includes(property) - }) - - const customProperties = customPropertyKeys.reduce( - (acc, key) => { - const savedValue = (parameters as any)?.[key] as any - const node = createEnhancedConfig( - savedValue || agConfig?.default?.[key] || "", - properties[key], - key, - ) as any - // Stabilize IDs for custom properties to avoid re-mount loops - // Use deterministic ID based on property key - node.__id = `custom:${key}` - node.__test = generateId() - acc[key] = node - return acc - }, - {} as Record>, - ) - - return customProperties } /** @@ -184,5 +56,118 @@ export function transformToEnhancedVariant( appType?: string, routePath?: string, ): EnhancedVariant { - return variant + try { + if (variant.parameters) { + variant.parameters = variant.parameters.ag_config || variant.parameters + } + + const path = constructPlaygroundTestUrl( + variant.uriObject || { + routePath, + }, + undefined, + false, + ) + const requestSchema = + openApiSpec?.paths?.[`${path}`]?.post?.requestBody?.content?.["application/json"] + ?.schema + + if (!requestSchema || !("properties" in requestSchema)) { + console.error("Invalid OpenAPI schema 2") + } + + const agConfig = requestSchema?.properties?.ag_config as AgentaConfigSchema + + const properties = agConfig?.properties || {} + + const prompts = Object.keys(properties) + .map((key) => { + const property = properties[key] + return property.hasOwnProperty("x-parameters") && + typeof property["x-parameters"] === "object" && + property["x-parameters"]?.prompt + ? {...property, key} + : null + }) + .filter(Boolean) as ObjectSchema[] + + // Merge schema defaults with saved configuration + const mergedPromptData = prompts.reduce( + (acc, cur) => { + if (!cur || !cur?.key) return acc + + const key = cur.key + acc[key] = mergeWithSavedConfig(cur, variant) + return acc + }, + {} as Record, + ) + + const isChat = + !!requestSchema && !!requestSchema.properties && !!requestSchema.properties.messages + + const transformedPrompts = prompts + .map((prompt) => { + if (!prompt || !prompt.key) return null + const transformed = createEnhancedConfig(mergedPromptData[prompt.key], prompt) + return { + ...transformed, + __name: prompt?.key, + } + }) + .filter(Boolean) as EnhancedObjectConfig[] + + const promptKeys = prompts.map((prompt) => prompt?.key) + const customPropertyKeys = Object.keys(properties).filter((property) => { + return !!property && !promptKeys.includes(property) + }) + + const customProperties = customPropertyKeys.reduce( + (acc, key) => { + const savedValue = (variant.parameters?.agConfig || + variant.parameters?.ag_config || + variant.parameters || + variant.config?.parameters || + {})?.[key] as any + + acc[key] = createEnhancedConfig( + savedValue || agConfig.default[key] || "", + properties[key], + key, + ) + return acc + }, + {} as Record>, + ) + + const isCustom = + appType === "custom" || (customProperties && Object.keys(customProperties).length > 0) + + return { + ...variant, + isChat, + isCustom, + prompts: transformedPrompts, + customProperties, + // @ts-ignore + isStatelessVariant: true, + // @ts-ignore + isChatVariant: isChat, + // @ts-ignore + isCustom, + // @ts-ignore + inputs: {} as EnhancedVariant["inputs"], + // @ts-ignore + messages: {} as EnhancedVariant["messages"], + // NEW + requestSchema: { + required: requestSchema.required, + title: requestSchema.title, + type: requestSchema.type, + }, + } + } catch (err) { + console.error("Error transforming variant:", err) + throw err + } } diff --git a/web/oss/src/lib/shared/variant/transformer/types/transformedVariant.d.ts b/web/oss/src/lib/shared/variant/transformer/types/transformedVariant.d.ts index 57900fdddb..50780b57d8 100644 --- a/web/oss/src/lib/shared/variant/transformer/types/transformedVariant.d.ts +++ b/web/oss/src/lib/shared/variant/transformer/types/transformedVariant.d.ts @@ -8,6 +8,9 @@ import type {AgentaConfigPrompt, BaseVariant} from "./variant" export interface EnhancedVariant< T extends Enhanced = Enhanced, > extends BaseVariant { + isChat: boolean + isChatVariant: boolean + inputParams?: Record[] appStatus?: boolean isCustom: boolean prompts: T[] @@ -24,5 +27,19 @@ export interface EnhancedVariant< routePath?: string runtimePrefix: string } - _parentVariant?: string + _parentVariant: { + name: string + id: string + variantName: string + variantId: string + baseId: string + baseName: string + configName: string + parameters: Record + createdAt: string + updatedAt: string + createdBy: User + templateVariantName: string + revision: number + } } diff --git a/web/oss/src/lib/shared/variant/transformer/types/variant.d.ts b/web/oss/src/lib/shared/variant/transformer/types/variant.d.ts index b4e6cedb38..dcc3d49d09 100644 --- a/web/oss/src/lib/shared/variant/transformer/types/variant.d.ts +++ b/web/oss/src/lib/shared/variant/transformer/types/variant.d.ts @@ -100,6 +100,7 @@ export interface ParentVariantObject { isChat?: boolean isCustom?: boolean isChatVariant?: boolean + isStatelessVariant?: boolean parameters?: any prompts?: any customProperties?: any diff --git a/web/oss/src/lib/shared/variant/types/index.ts b/web/oss/src/lib/shared/variant/types/index.ts index 865b543706..198ece48eb 100644 --- a/web/oss/src/lib/shared/variant/types/index.ts +++ b/web/oss/src/lib/shared/variant/types/index.ts @@ -19,6 +19,10 @@ export interface Variant { templateVariantName: string variantName: string parameters?: Record | null + uriObject?: { + routePath?: string + runtimePrefix: string + } routePath?: string runtimePrefix: string modifiedBy: string diff --git a/web/oss/src/lib/shared/variant/utils.ts b/web/oss/src/lib/shared/variant/utils.ts index 639a9233c0..a32a510e7d 100644 --- a/web/oss/src/lib/shared/variant/utils.ts +++ b/web/oss/src/lib/shared/variant/utils.ts @@ -1,10 +1,38 @@ // @ts-nocheck +import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" +import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" +import {getIsFetching, startFetch, endFetch} from "@/oss/lib/hooks/useStatelessVariants/state" +import {User} from "@/oss/lib/Types" +import {fetchVariants, fetchSingleProfile} from "@/oss/services/api" import {CamelCaseEnvironment} from "../../Types" +import {fetchAndTransformEnvironments, fetchVariantMetadata} from "./api" import {Enhanced} from "./genericTransformer/types" +import {fetchOpenApiSchemaJson, findCustomWorkflowPath, transformVariants} from "./transformer" import {EnhancedVariant} from "./transformer/types/transformedVariant" import {RevisionObject, ParentVariantObject} from "./transformer/types/variant" +import {SharedEnrichmentOptions} from "./types/enriched" + +/** + * Recursively omit specified keys from an object + */ +export const omitDeep = (obj: any, keys: string[]): any => { + if (!obj || typeof obj !== "object") return obj + + if (Array.isArray(obj)) { + return obj.map((item) => omitDeep(item, keys)) + } + + return Object.entries(obj).reduce( + (acc, [key, value]) => { + if (keys.includes(key)) return acc + acc[key] = typeof value === "object" ? omitDeep(value, keys) : value + return acc + }, + {} as Record, + ) +} /** * Remove trailing slash from a URI @@ -26,6 +54,19 @@ export const uriFixer = (uri: string) => { return removeTrailingSlash(uri) } +/** + * Construct variant URL for testing + */ +export const constructVariantUrl = ( + uri: {routePath?: string; runtimePrefix?: string}, + endpoint = "/test", + withPrefix = true, +) => { + const {routePath = "", runtimePrefix = ""} = uri + const prefix = withPrefix ? runtimePrefix : "" + return `${prefix}${routePath}${endpoint}` +} + /** * Finds all environments where a specific revision is deployed */ @@ -33,9 +74,7 @@ export const findRevisionDeployment = ( revisionId: string, environments: CamelCaseEnvironment[], ): CamelCaseEnvironment[] => { - return environments.filter((env) => { - return env.deployedAppVariantRevisionId === revisionId - }) + return environments.filter((env) => env.deployedAppVariantRevisionId === revisionId) } /** Enhanced property utilities */ @@ -51,6 +90,807 @@ export const getEnhancedProperties = (obj: Record | undefined, excl }, [] as Enhanced[]) } +/** + * Creates batches from an array of items for processing + * + * @param items Array of items to split into batches + * @param batchSize Number of items per batch + * @returns Array of batches + */ +export const createBatches = (items: T[], batchSize: number): T[][] => { + return Array.from({length: Math.ceil(items.length / batchSize)}, (_, i) => + items.slice(i * batchSize, (i + 1) * batchSize), + ) +} + +/** + * Process batches sequentially with optional callback after each batch + * + * @param batches Array of batches to process + * @param processFn Function to process each batch + * @param onBatchProcessed Optional callback after each batch is processed + * @returns Array of all processed results + */ +export const processBatchesSequentially = async ( + batches: T[][], + processFn: (batch: T[]) => Promise, + onBatchProcessed?: (results: R[], batchIndex: number, totalBatches: number) => void, +): Promise => { + const allResults: R[] = [] + + for (let i = 0; i < batches.length; i++) { + const batch = batches[i] + const results = await processFn(batch) + allResults.push(...results) + + if (onBatchProcessed) { + onBatchProcessed(results, i, batches.length) + } + } + + return allResults +} + +/** + * Standardized error handling for variant processing operations + * + * @param error The error that occurred + * @param fetchKey The fetch key to end if needed + * @param logger Optional logging function + * @throws The original error or a wrapped error + */ +export const handleVariantProcessingError = (error: any, fetchKey: string, logger) => { + if (error.name === "AbortError") { + logger?.("Fetch aborted by user") + endFetch(fetchKey) + throw new Error("AbortError") + } + + logger?.("Error in variant processing:", error) + endFetch(fetchKey) + throw error +} + +/** + * Process variants and their revisions with common error handling and logging + */ +async function processVariantsWithMetadata({ + appType, + variants, + spec, + uri, + fetchKey, + batchSize = 5, + parallelProcessing = false, + onBatchProcessed = null, + onBeforeBatchProcessing = null, +}: { + variants: any[] + appType: string + spec: any + uri: any + fetchKey: string + batchSize?: number + parallelProcessing?: boolean + onBatchProcessed?: ((batchResults: any[], spec: any, uri: any) => void) | null + onBeforeBatchProcessing?: ((totalBatches: number) => void) | null +}) { + try { + // Extract revisions from variants + const allRevisions = variants.flatMap((variant) => { + if (!variant.revisions?.length) { + console.warn(`No revisions found for variant ${variant.variantId}`, variant) + return [] + } + return variant.revisions.map((rev) => ({...rev, uriObject: uri})) + }) + + // Process revisions in batches + const batches = createBatches(allRevisions, batchSize) + + if (onBeforeBatchProcessing) { + onBeforeBatchProcessing(batches.length) + } + + const processedVariants = await processBatchesSequentially(batches, async (batch) => { + const transformed = await transformVariants(batch, spec, appType) + + if (onBatchProcessed) { + onBatchProcessed(transformed, spec, uri) + } + return transformed + }) + + return processedVariants + } catch (error) { + endFetch(fetchKey) + throw error + } +} + +export async function fetchPriorityRevisions({ + appId, + projectId, + revisionIds, + fallbackToLatest = true, + appType, +}: SharedEnrichmentOptions & { + revisionIds?: string[] + fallbackToLatest?: boolean + appType: string +}): Promise<{ + revisions: any[] + spec: any + uri: any +}> { + const fetchKey = `priority_${appId}}` + const returnData = { + revisions: [], + spec: null, + uri: null, + } + try { + // 1. Fetch variants and environments in parallel + const [rawVariants, environments] = await Promise.all([ + fetchVariants(appId), + fetchAndTransformEnvironments(appId), + ]) + + // 2. Get URI information + const uri = rawVariants[0].uri ? await findCustomWorkflowPath(rawVariants[0].uri) : null + if (!uri) { + console.error("Failed to find URI path") + returnData.appStatus = false + } else { + returnData.uri = uri + returnData.appStatus = true + } + + // 3. Fetch OpenAPI schema + const spec = uri ? (await fetchOpenApiSchemaJson(uri.runtimePrefix))?.schema : null + if (!spec) { + console.error("Failed to fetch OpenAPI schema") + returnData.appStatus = false + } + + // Skip if no variants or no revisions needed + if (!rawVariants.length || (!revisionIds?.length && !fallbackToLatest)) { + endFetch(fetchKey) + return {revisions: [], spec, uri} + } + + // Group revisions by variant + const variantMap = new Map() + const toSort = structuredClone(rawVariants).sort( + (a, b) => b.updatedAtTimestamp - a.updatedAtTimestamp, + ) + + for (const variant of toSort) { + const [revisions] = await fetchVariantMetadata( + variant.variantId, + projectId, + variant.modifiedById, + ) + // Get variant-specific environments + const variantEnvironments = environments.filter( + (env) => env.deployedAppVariantId === variant.variantId, + ) + + // Filter and transform revisions + const filteredRevisions = revisions + .filter((rev) => !!revisionIds && revisionIds.includes(rev.id)) + .map((rev) => { + const adapted = adaptRevisionToVariant( + { + ...rev, + id: rev.id, + revision: rev.revision, + modifiedBy: rev.modified_by, + commitMessage: rev.commit_message || null, + parameters: rev.config.parameters, + createdAt: formatDay({date: rev.created_at}), + createdAtTimestamp: dayjs( + rev.created_at, + "YYYY/MM/DD H:mm:ssAZ", + ).valueOf(), + deployedIn: findRevisionDeployment(rev.id, variantEnvironments), + }, + variant, + ) + + return adapted + }) + + if (filteredRevisions.length > 0) { + variantMap.set(variant.variantId, { + ...variant, + deployedIn: variantEnvironments, + revisions: filteredRevisions, + }) + } + } + + // Process the variants with their revisions + const processedRevisions = await processVariantsWithMetadata({ + variants: Array.from(variantMap.values()), + spec, + uri, + fetchKey, + prefix: "PRIORITY", + batchSize: 5, + appType, + }) + + // End the fetch for this key when complete + endFetch(fetchKey) + + returnData.revisions = processedRevisions + returnData.spec = spec + return returnData + } catch (error) { + endFetch(fetchKey) + throw error + } +} + +/** + * Core function for processing variants and revisions + * This is used by other specialized fetch functions to avoid code duplication + * + * @param options Processing options including variants, revisions, and callbacks + * @returns Processed variants/revisions with spec and URI information + */ +export const processVariantsCore = async ({ + rawVariants, + targetRevisions, + spec, + uri, + signal, + batchSize = 5, + parallelProcessing = false, + onBatchProcessed = null, + onBeforeBatchProcessing = null, + logger, + fetchKey, + appType, +}: { + rawVariants: any[] + targetRevisions: any[] + spec: any + uri: any + signal?: AbortSignal + batchSize?: number + parallelProcessing?: boolean + onBatchProcessed?: ((batchResults: any[], spec: any, uri: any) => void) | null + onBeforeBatchProcessing?: ((totalBatches: number) => void) | null + logger?: (message?: any, ...optionalParams: any[]) => void + fetchKey: string + appType?: string +}): Promise<{ + revisions: any[] + spec: any + uri: any +}> => { + try { + // Create batches for processing + const batches = createBatches(targetRevisions, batchSize) + + if (onBeforeBatchProcessing) { + onBeforeBatchProcessing(batches.length) + } + + logger?.(`Processing ${targetRevisions.length} revisions in ${batches.length} batches`) + + // Process batches sequentially + const processedRevisions = await processBatchesSequentially( + batches, + async (batch) => { + batch = batch.map((rev) => ({...rev, uriObject: uri})) + // Transform the batch of revisions + const transformedBatch = await transformVariants(batch, spec, appType) + + if (onBatchProcessed) { + onBatchProcessed(transformedBatch, spec, uri) + } + + return transformedBatch + }, + (results, batchIndex, totalBatches) => { + logger?.( + `Processed batch ${batchIndex + 1}/${totalBatches} with ${results.length} revisions`, + ) + }, + ) + + return { + revisions: processedRevisions, + spec, + uri, + } + } catch (error) { + return handleVariantProcessingError(error, fetchKey, logger) + } +} + +export async function fetchAndProcessRevisions({ + appId, + appType, + projectId, + initialVariants, + initialSpec, + forceRefresh = false, + keyParts, + excludeRevisionIds = [], + signal, + logger, + priorityMode = false, // New flag to indicate if this is a priority fetch + batchSize = 5, // Default batch size for parallel processing + parallelProcessing = false, // Flag to enable parallel processing + onBatchProcessed = null, // Callback for incremental state updates + onBeforeBatchProcessing = null, // Callback to notify about total batches before processing starts +}: SharedEnrichmentOptions & { + forceRefresh?: boolean + excludeRevisionIds?: string[] + signal?: AbortSignal + priorityMode?: boolean // Flag to control early termination behavior + batchSize?: number // Number of variants to process in parallel + parallelProcessing?: boolean // Whether to use parallel processing + onBatchProcessed?: ((batchResults: any[], spec: any, uri: any) => void) | null // Callback for incremental state updates + onBeforeBatchProcessing?: ((totalBatches: number) => void) | null // Callback to notify about total batches before processing starts + keyParts?: string + appType: string +}): Promise<{ + revisions: any[] + spec: any + uri: any +}> { + // Generate a unique key for this fetch operation + const fetchKey = JSON.stringify({ + appId, + projectId, + priorityMode, + excludeRevisionIds: excludeRevisionIds.length, + keyParts: keyParts || "", + }) + + // Check if we're already fetching data for this key + if (getIsFetching(fetchKey)) { + logger?.(`Already fetching data for key: ${fetchKey}, skipping this request`) + return { + revisions: [], + } + throw new Error("Already fetching data for this key") + } + + // Start a new fetch and get the abort controller + const controller = startFetch(fetchKey) + // Create a composite abort signal that combines our controller with any passed signal + const abortController = new AbortController() + const compositeSignal = abortController.signal + + // If the passed signal aborts, abort our controller too + if (signal) { + signal.addEventListener("abort", () => { + abortController.abort() + }) + } + + // If our controller aborts, abort the composite signal + controller.signal.addEventListener("abort", () => { + abortController.abort() + }) + + try { + // 1. Fetch variants and environments in parallel + const [rawVariants, environments] = await Promise.all([ + !forceRefresh && initialVariants?.length ? initialVariants : fetchVariants(appId), + fetchAndTransformEnvironments(appId), + ]) + + if (!rawVariants.length) { + return { + revisions: [], + } + } + + // Check for abort signal + if (compositeSignal.aborted) { + throw new Error("Operation was aborted") + } + + // 2. Find correct URI path early (needed for OpenAPI schema) + // But don't throw if we can't find it - we'll handle it gracefully + let uri = null + try { + uri = rawVariants[0].uri ? await findCustomWorkflowPath(rawVariants[0].uri) : null + if (!uri) { + logger?.("Warning: Failed to find URI path, some functionality may be limited") + } + } catch (error) { + logger?.("Warning: Error finding URI path, some functionality may be limited", error) + } + + // 3. Fetch OpenAPI schema (always fetch if forceRefresh is true) + let spec = null + // Track app status based on whether we can fetch the schema + let appStatus = false + + if (uri?.runtimePrefix) { + try { + spec = + !forceRefresh && initialSpec + ? initialSpec + : (await fetchOpenApiSchemaJson(uri.runtimePrefix))?.schema + + if (spec) { + // If we successfully fetched the schema, set appStatus to true + appStatus = true + } else { + logger?.( + "Warning: Failed to fetch OpenAPI schema, some functionality may be limited", + ) + } + } catch (error) { + logger?.( + "Warning: Error fetching OpenAPI schema, some functionality may be limited", + error, + ) + } + } else { + logger?.("Skipping OpenAPI schema fetch due to missing URI") + } + + // Check for abort signal + if (compositeSignal.aborted) { + throw new Error("Operation was aborted") + } + + // 4. Minimal processing to get revision data (without unnecessary transformations) + // This fetches revision history and environment deployments, but doesn't transform variants + // Log if we're in background mode + const isBackgroundMode = excludeRevisionIds.length > 0 + if (isBackgroundMode) { + logger?.( + `Processing in background mode, excluding ${excludeRevisionIds.length} already loaded revisions`, + ) + } + + // Set up for parallel processing + // Use custom batch size if parallel processing is enabled + const actualBatchSize = parallelProcessing ? batchSize : 5 + const variantsWithRevisions = [] + + // Process variants in parallel batches + logger?.( + `Starting parallel processing of ${rawVariants.length} variants in batches of ${actualBatchSize}`, + ) + + // Calculate total number of batches + const totalBatches = Math.ceil(rawVariants.length / actualBatchSize) + + // Call the onBeforeBatchProcessing callback if provided + if (typeof onBeforeBatchProcessing === "function") { + logger?.(`Calling onBeforeBatchProcessing with totalBatches: ${totalBatches}`) + onBeforeBatchProcessing(totalBatches) + } + + // Split variants into batches + for (let i = 0; i < rawVariants.length; i += actualBatchSize) { + // Check for abort signal before processing each batch + if (compositeSignal.aborted) { + throw new Error("Operation was aborted") + } + + const variantBatch = rawVariants.slice(i, i + actualBatchSize) + logger?.( + `Processing batch ${Math.floor(i / actualBatchSize) + 1} with ${variantBatch.length} variants`, + ) + + // Process each batch in parallel + const batchResults = await Promise.all( + variantBatch.map(async (variant) => { + // Fetch revisions and deployments for this variant + + logger?.( + `[Batch ${Math.floor(i / actualBatchSize) + 1}] Fetching metadata for variant ${variant.variantId}`, + ) + + try { + const [revisions] = await fetchVariantMetadata( + variant.variantId, + projectId, + variant.modifiedById, + ) + + // Filter out excluded revisions + const filteredRevisions = revisions.filter( + (rev) => !excludeRevisionIds.includes(rev.id), + ) + + // Get variant-specific environments + const variantEnvironments = environments.filter( + (env) => env.deployedAppVariantId === variant.variantId, + ) + + const updated = { + ...variant, + appStatus, + deployedIn: variantEnvironments, + revisions: filteredRevisions.map((rev) => ({ + id: rev.id, + appStatus, + revision: rev.revision, + modifiedBy: rev.modified_by, + variantId: variant.variantId, + commitMessage: rev.commit_message || null, + config: { + configName: rev.config.config_name, + parameters: rev.config.parameters, + }, + createdAt: formatDay({date: rev.created_at}), + createdAtTimestamp: dayjs( + rev.created_at, + "YYYY/MM/DD H:mm:ssAZ", + ).valueOf(), + deployedIn: findRevisionDeployment(rev.id, variantEnvironments), + })), + } + + return updated + } catch (error) { + logger?.( + `[Batch ${Math.floor(i / actualBatchSize) + 1}] Error fetching metadata for variant ${variant.variantId}: ${error.message}`, + ) + // Return variant with empty revisions to avoid breaking the entire process + return { + ...variant, + appStatus, + deployedIn: [], + revisions: [], + } + } + }), + ) + + // Add batch results to our collection + variantsWithRevisions.push(...batchResults) + // // Call the callback function if provided to update state incrementally + if (onBatchProcessed) { + onBatchProcessed([...variantsWithRevisions], spec, uri) + } + } + + // 5. Collect all user IDs for revisions and variants + const userIds = new Set() + variantsWithRevisions.forEach((variant) => { + if (variant.modifiedBy) userIds.add(variant.modifiedBy) + variant.revisions?.forEach((revision) => { + if (revision.modifiedBy) userIds.add(revision.modifiedBy) + }) + }) + + // 6. Fetch all user profiles in one batch + const userProfilesMap = new Map() + try { + const userProfiles = await Promise.all( + Array.from(userIds).map(async (userId) => { + try { + return await fetchSingleProfile(userId, true) + } catch (e) { + return null + } + }), + ) + userProfiles.forEach((profile) => { + if (profile && profile.id) { + userProfilesMap.set(profile.id, profile) + } + }) + } catch (error) { + console.error("Error fetching user profiles:", error) + } + + // 7. Flatten variants to revisions and adapt each revision to look like a variant + const adaptedRevisions = variantsWithRevisions.flatMap((_variant) => { + const variant = _variant + const _revisions = structuredClone(variant.revisions) + return ( + _revisions?.map((revision) => { + // Get user profiles for both variant and revision + const revisionUserProfile = revision.modifiedBy + ? userProfilesMap.get(revision.modifiedBy) + : null + const variantUserProfile = variant.modifiedBy + ? userProfilesMap.get(variant.modifiedBy) + : null + + // Create a variant-like object from the revision + const adapted = adaptRevisionToVariant( + { + ...revision, + userProfile: revisionUserProfile, + }, + { + ...variant, + userProfile: variantUserProfile, + // Add URI for proper transformation if available, otherwise use a default + uriObject: uri || { + routePath: "", + runtimePrefix: variant.uri, + }, + }, + ) + + variant.createdBy = adapted._parentVariant?.createdBy + + return adapted + }) || [] + ) + }) + + // 8. Mark latest revision and variant revision flags + if (adaptedRevisions.length > 0) { + // We no longer need to find the latest variant since we're using timestamps directly + // This code has been removed as it's no longer needed + + // Find the single latest revision across all variants + let latestRevisionTimestamp = 0 + let latestRevisionId = null + + // First pass: find the latest revision timestamp across all revisions + adaptedRevisions.forEach((revision) => { + if (revision.createdAtTimestamp > latestRevisionTimestamp) { + latestRevisionTimestamp = revision.createdAtTimestamp + latestRevisionId = revision.id + } + }) + + // Second pass: set isLatestRevision flag for all revisions + adaptedRevisions.forEach((revision) => { + // Only the single latest revision gets isLatestRevision = true + revision.isLatestRevision = revision.id === latestRevisionId + + // We no longer need to set isLatestVariantRevision as we're using timestamps directly + // Keep this property for backward compatibility but set it to false + revision.isLatestVariantRevision = false + }) + + logger?.("Applied latest revision flag to a single revision across the app") + } + + // 9. Use core processing utility for transformation + try { + // Use our core processing function + const result = await processVariantsCore({ + rawVariants, + targetRevisions: adaptedRevisions, + spec, + uri, + signal: compositeSignal, + batchSize, + parallelProcessing, + onBatchProcessed, + onBeforeBatchProcessing: null, // We've already called this earlier + logger, + fetchKey, + appType, + }) + + // Add appStatus to each variant + result.revisions.forEach((revision) => { + revision.appStatus = appStatus + }) + + // End the fetch for this key when complete + endFetch(fetchKey) + + return { + ...result, + // Include the overall app status in the return value + appStatus, + } + } catch (error) { + logger?.("Error in core processing:", error) + + // Add appStatus to each variant even if transformation failed + adaptedRevisions.forEach((revision) => { + revision.appStatus = appStatus + }) + + // End the fetch for this key when complete + endFetch(fetchKey) + + return { + revisions: adaptedRevisions, + // Return whatever spec and uri we have, even if they're null + spec, + uri, + // Include the overall app status in the return value + appStatus, + } + } + } catch (error) { + // Handle AbortError specially + if ( + compositeSignal.aborted || + error.name === "AbortError" || + error.message === "Operation was aborted" + ) { + logger?.("Fetch operation was aborted") + // End the fetch on abort + endFetch(fetchKey) + throw new Error("AbortError") + } + + logger?.("Error in fetchAndProcessRevisions:", error) + // End the fetch on any other error + endFetch(fetchKey) + throw error + } +} + +/** + * Validates a variant or revision object has all required fields + * + * @param object The variant or revision object to validate + * @param requiredFields Array of field names that must exist + * @param objectType Name of the object type for logging purposes + * @returns boolean indicating if the object is valid + */ +export const validateVariantObject = ( + object: any, + requiredFields: string[] = ["id"], + objectType = "object", +): boolean => { + if (!object) { + console.warn(`Missing ${objectType}`) + return false + } + + const missingFields = requiredFields.filter((field) => !object[field]) + if (missingFields.length > 0) { + console.warn( + `Missing required fields in ${objectType}: ${missingFields.join(", ")}`, + object, + ) + return false + } + + return true +} + +/** + * Merges a variant with new data, ensuring critical fields are preserved + * + * @param existingVariant The existing variant in the state + * @param newVariant The new variant data to merge + * @returns The merged variant with all fields properly preserved + */ +export const mergeVariantData = (existingVariant: any, newVariant: any): any => { + if (!existingVariant) return newVariant + if (!newVariant) return existingVariant + + // Start with the new variant data as the base + const result = { + ...existingVariant, + ...newVariant, + } + + // Special handling for critical fields that need to be preserved + // deployedIn is especially important to preserve from the new variant + result.deployedIn = newVariant.deployedIn || existingVariant.deployedIn || [] + + // Preserve nested objects with special merging logic if needed + if (existingVariant.parameters && newVariant.parameters) { + result.parameters = { + ...existingVariant.parameters, + ...newVariant.parameters, + } + } + + return result +} + /** * Adapts a revision to appear as a variant for UI/API compatibility * @@ -67,46 +907,106 @@ export const adaptRevisionToVariant = ( parentVariant: ParentVariantObject, ): EnhancedVariant => { // Validate input objects - // validateVariantObject(revision, ["id", "_id"], "revision") - // validateVariantObject(parentVariant, ["id", "variantId"], "parent variant") + validateVariantObject(revision, ["id", "_id"], "revision") + validateVariantObject(parentVariant, ["id", "variantId"], "parent variant") // Ensure we have a valid parent variant ID const parentId = parentVariant.id || parentVariant.variantId + if (!parentId) { + console.warn("Missing parent variant ID in adaptRevisionToVariant", parentVariant) + } // Ensure revision ID exists const revisionId = revision.id || revision._id + if (!revisionId) { + console.warn("Missing revision ID in adaptRevisionToVariant", revision) + } - // Do not mutate parentVariant; compute any derived fields locally + if (revision.revision === 0) { + parentVariant.createdBy = revision.createdBy || revision.modifiedBy + } else if (revision.revision === 1 && !parentVariant.createdBy) { + parentVariant.createdBy = revision.modifiedBy + } return { - // Minimal identifiers + // Core variant properties needed for compatibility id: revisionId, + name: parentVariant.name || parentVariant.variantName, // Fallback to variantName if name is missing + variantName: parentVariant.variantName, + baseId: parentVariant.baseId, + baseName: parentVariant.baseName, + configName: parentVariant.configName, + appId: parentVariant.appId, + appStatus: revision.appStatus || parentVariant.appStatus, + uri: parentVariant.uri, + uriObject: parentVariant.uriObject, + inputs: parentVariant.inputs, + inputParams: revision.inputParams || [], + + // Copy variant essential properties for UI components + isChat: parentVariant.isChat, + isCustom: parentVariant.isCustom, + isChatVariant: parentVariant.isChatVariant, + isStatelessVariant: parentVariant.isStatelessVariant, + + // These are the fields we want to prioritize from the revision, NOT from parent variant + // Each revision has its own unique configuration values + parameters: revision.parameters || revision.config?.parameters, + prompts: revision.prompts || [], + customProperties: revision.customProperties || parentVariant.customProperties, + + // Variant ID for backwards compatibility with APIs variantId: parentId, - // Strictly revision-derived fields + // Revision-specific fields _revisionId: revisionId, revision: revision.revision, - parameters: revision.parameters || revision.config?.parameters, - customProperties: revision.customProperties, - createdAt: revision.createdAt || revision.created_at, - updatedAt: revision.updatedAt || revision.createdAt, - createdAtTimestamp: revision.createdAtTimestamp, - updatedAtTimestamp: revision.updatedAtTimestamp || revision.createdAtTimestamp, - modifiedById: revision.modifiedById, - modifiedBy: revision.modifiedBy ?? revision.modified_by ?? null, - commitMessage: (revision as any).commitMessage ?? (revision as any).commit_message ?? null, - variantName: parentVariant.variantName, - // Inherit parent-variant level identifiers required by downstream APIs/UI - baseId: (parentVariant as any).baseId, - baseName: (parentVariant as any).baseName, - configName: (parentVariant as any).configName, - // Parent reference by ID only; consumers must use selector-family atoms - _parentVariant: parentId, + updatedAt: revision.createdAt || parentVariant.createdAt, + createdAt: revision.createdAt || parentVariant.createdAt, + updatedAtTimestamp: revision.createdAtTimestamp || parentVariant.createdAtTimestamp, + createdAtTimestamp: revision.createdAtTimestamp || parentVariant.createdAtTimestamp, + modifiedById: revision.modifiedById || parentVariant.modifiedById, + modifiedBy: revision.modifiedBy || parentVariant.modifiedBy || null, + userProfile: revision.userProfile || parentVariant.userProfile || null, // Store full user profile object + commitMessage: revision.commitMessage || null, + + // Status flags - ensure they're boolean values + isLatestRevision: revision.isLatestRevision, + isLatestVariantRevision: !!revision.isLatestVariantRevision, + _isRevisionBased: true, // Internal flag for documentation + + // Deployment information - essential for showing environment badges + deployedIn: revision.deployedIn || [], + + requestSchema: revision.requestSchema, + + // Preserve full parent variant reference for component access + _parentVariant: { + id: parentId, + name: parentVariant.name || parentVariant.variantName, + variantName: parentVariant.name || parentVariant.variantName, // TODO: Deprecate later @ardaerzi + variantId: parentId, + revision: parentVariant.revision, + isLatestRevision: revision.isLatestRevision, + baseId: parentVariant.baseId, + baseName: parentVariant.baseName, + configName: parentVariant.configName, + parameters: parentVariant.parameters, + createdAt: parentVariant.createdAt, + updatedAt: parentVariant.updatedAt, + createdBy: parentVariant.createdBy, + templateVariantName: parentVariant.templateVariantName, + commitMessage: (parentVariant.revisions || []).sort( + (a, b) => b.revision - a.revision, + )[0]?.commitMessage, + inputs: parentVariant.inputs, + inputParams: parentVariant.inputParams, + }, } } // TODO: DEPRECATE @ardaerzin -export const setVariant = (variant: any, uri): EnhancedVariant => { +export const setVariant = (variant: any): EnhancedVariant => { // TEMPORARY FIX FOR PREVIOUSLY CREATED AGENTA_CONFIG // TODO: REMOVE THIS BEFORE RELEASE. if (variant.parameters?.agenta_config) { @@ -114,20 +1014,21 @@ export const setVariant = (variant: any, uri): EnhancedVariant => { delete variant.parameters.agenta_config } - // Source priority: variant.parameters, variant.config?.parameters - const rawParameters = variant.parameters ?? variant.config?.parameters ?? {} - const parameters = rawParameters.ag_config ?? rawParameters.agConfig ?? rawParameters + const parameters = + variant.parameters?.ag_config || variant.parameters?.agConfig || variant.parameters if (variant.variantId) { variant.id = variant.variantId - variant.parameters = parameters ?? {} + variant.parameters = { + parameters, + } return variant } return { id: variant.variant_id, - uri: uri || uriFixer(variant.uri), + uri: uriFixer(variant.uri), appId: variant.app_id, baseId: variant.base_id, baseName: variant.base_name, diff --git a/web/oss/src/lib/shared/variant/valueHelpers.ts b/web/oss/src/lib/shared/variant/valueHelpers.ts index aa360764bc..b5855717a9 100644 --- a/web/oss/src/lib/shared/variant/valueHelpers.ts +++ b/web/oss/src/lib/shared/variant/valueHelpers.ts @@ -7,9 +7,7 @@ export function shouldIncludeValue(value: unknown): boolean { if (value === null || value === undefined) return false // Handle empty strings - if (value === "") { - return false - } + if (value === "") return false // Handle empty arrays if (Array.isArray(value) && value.length === 0) return false @@ -65,10 +63,8 @@ export const checkValidity = (obj: Record, metadata: ConfigMetadata export function extractValueByMetadata( _enhanced: Record | null | undefined, allMetadata: Record, - debug = false, ): unknown { const enhanced = structuredClone(_enhanced) - // Handle null/undefined if (enhanced === null || enhanced === undefined) return null @@ -87,13 +83,13 @@ export function extractValueByMetadata( metadata.type === "number" || metadata.type === "boolean") ) { - return shouldIncludeValue(enhanced.value, metadata) ? enhanced.value : undefined + return shouldIncludeValue(enhanced.value) ? enhanced.value : undefined } if (!metadata) { if (Array.isArray(enhanced)) { return enhanced - .map((item) => extractValueByMetadata(item, allMetadata, debug)) + .map((item) => extractValueByMetadata(item, allMetadata)) .filter(shouldIncludeValue) } @@ -102,7 +98,7 @@ export function extractValueByMetadata( .filter(([key]) => !key.startsWith("__")) .reduce( (acc, [key, val]) => { - const extracted = extractValueByMetadata(val, allMetadata, debug) + const extracted = extractValueByMetadata(val, allMetadata) if (shouldIncludeValue(extracted)) { acc[key] = extracted } @@ -116,117 +112,78 @@ export function extractValueByMetadata( return obj } - const extract = () => { - switch (metadata.type) { - case "function": { - return undefined - } - case "array": { - if (!Array.isArray(enhanced.value)) return undefined - const arr = enhanced.value - .map((item: Record) => { - return extractValueByMetadata(item, allMetadata, debug) - }) - .filter(shouldIncludeValue) - .filter(Boolean) - - return arr.length > 0 ? arr : undefined - } - case "object": { - const obj = Object.entries(enhanced) - .filter(([key]) => !key.startsWith("__")) - .reduce( - (acc, [key, val]) => { - if (key === "tools") { - acc[key] = val.value - } else if ( - key === "toolCalls" && - val.value && - Array.isArray(val.value) - ) { - const cloned = (structuredClone(val.value) || []).map( - (call: Record) => { - call.id = call.id - delete call.__id - delete call.__metadata - - call.function.parameters = JSON.stringify( - call.function.parameters, - ) - return call - }, - ) - delete cloned.__id - delete cloned.__metadata - acc[toSnakeCase(key)] = cloned - } else { - const extracted = extractValueByMetadata(val, allMetadata, debug) - if (shouldIncludeValue(extracted)) { - acc[toSnakeCase(key)] = extracted - } - } - if (key === "tools") { - acc[key] = (acc[key] || []).map((tool) => { - return tool.value - }) - } - return acc - }, - {} as Record, - ) - - if (obj.role === "tool") { - if (!obj.content) { - obj.content = "" - } else if (Array.isArray(obj.content)) { - obj.content = obj.content.map((item: any) => { - if (!item) return item - const typeValue = - typeof item.type === "object" && item.type - ? (item.type.value ?? item.type) - : item.type - const textValue = - typeof item.text === "object" && item.text - ? (item.text.value ?? item.text) - : (item.text ?? item.content ?? "") - return { - type: typeValue || "text", - text: - typeof textValue === "string" - ? textValue - : String(textValue ?? ""), + switch (metadata.type) { + case "function": { + return undefined + } + case "array": { + if (!Array.isArray(enhanced.value)) return undefined + const arr = enhanced.value + .map((item: Record) => { + return extractValueByMetadata(item, allMetadata) + }) + .filter(shouldIncludeValue) + .filter(Boolean) + + return arr.length > 0 ? arr : undefined + } + case "object": { + const obj = Object.entries(enhanced) + .filter(([key]) => !key.startsWith("__")) + .reduce( + (acc, [key, val]) => { + if (key === "tools") { + acc[key] = val.value + } else if (key === "toolCalls" && val.value && Array.isArray(val.value)) { + const cloned = (structuredClone(val.value) || []).map( + (call: Record) => { + call.id = call.id + delete call.__id + delete call.__metadata + + call.function.parameters = JSON.stringify( + call.function.parameters, + ) + return call + }, + ) + delete cloned.__id + delete cloned.__metadata + acc[toSnakeCase(key)] = cloned + } else { + const extracted = extractValueByMetadata(val, allMetadata) + if (shouldIncludeValue(extracted)) { + acc[toSnakeCase(key)] = extracted } - }) - } + } + if (key === "tools") { + acc[key] = (acc[key] || []).map((tool) => { + return tool.value + }) + } + return acc + }, + {} as Record, + ) - if ((obj as any).toolCallId && typeof (obj as any).toolCallId === "string") { - obj.tool_call_id = (obj as any).toolCallId - delete (obj as any).toolCallId - } else if ( - (obj as any).tool_call_id && - typeof (obj as any).tool_call_id !== "string" - ) { - obj.tool_call_id = String((obj as any).tool_call_id ?? "") - } + if (obj.role === "tool") { + if (!obj.content) { + obj.content = "" } - - return Object.keys(obj).length > 0 && - checkValidity(obj, allMetadata[enhanced.__metadata]) - ? obj - : undefined } - case "compound": { - const option = metadata.options.find( - (o) => o.value === (enhanced.selected || metadata.options[0].value), - ) - if (!option) return undefined - return extractValueByMetadata(enhanced.value, allMetadata, debug) - } - default: - return shouldIncludeValue(enhanced.value, metadata) ? enhanced.value : undefined + return Object.keys(obj).length > 0 && + checkValidity(obj, allMetadata[enhanced.__metadata]) + ? obj + : undefined + } + case "compound": { + const option = metadata.options.find( + (o) => o.value === (enhanced.selected || metadata.options[0].value), + ) + if (!option) return undefined + return extractValueByMetadata(enhanced.value, allMetadata) } + default: + return shouldIncludeValue(enhanced.value) ? enhanced.value : undefined } - - const extracted = extract() - return extracted } diff --git a/web/oss/src/lib/transformers.ts b/web/oss/src/lib/transformers.ts index 047a3dc914..594d813fc0 100644 --- a/web/oss/src/lib/transformers.ts +++ b/web/oss/src/lib/transformers.ts @@ -1,9 +1,8 @@ +import {getAppValues} from "@/oss/contexts/app.context" import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" import {TraceSpan} from "@/oss/lib/Types" import {AgentaNodeDTO} from "@/oss/services/observability/types" -import {getAppValues} from "../state/app" - import {EvaluationType} from "./enums" import {formatDay} from "./helpers/dateTimeHelper" import {snakeToCamel} from "./helpers/utils" diff --git a/web/oss/src/pages/_app.tsx b/web/oss/src/pages/_app.tsx index 92dfb3e135..a06689a8b7 100644 --- a/web/oss/src/pages/_app.tsx +++ b/web/oss/src/pages/_app.tsx @@ -1,11 +1,81 @@ import "@ant-design/v5-patch-for-react-19" import "@/oss/styles/globals.css" -import "@/oss/assets/custom-resize-handle.css" -import "react-resizable/css/styles.css" -import "@ag-grid-community/styles/ag-grid.css" -import "@ag-grid-community/styles/ag-theme-alpine.css" -import "jotai-devtools/styles.css" +import {App as AppComponent} from "antd" +import {enableMapSet} from "immer" +import {Provider} from "jotai" +import type {AppProps} from "next/app" +import dynamic from "next/dynamic" +import {Inter} from "next/font/google" -import AppPage from "@/oss/components/pages/_app" +import ThemeContextProvider from "@/oss/components/Layout/ThemeContextProvider" +import {traceDrawerJotaiStore} from "@/oss/components/Playground/Components/Drawers/TraceDrawer/store/traceDrawerStore" +import GlobalScripts from "@/oss/components/Scripts/GlobalScripts" +import AppContextProvider from "@/oss/contexts/app.context" +import OrgContextProvider from "@/oss/contexts/org.context" +import ProfileContextProvider from "@/oss/contexts/profile.context" +import ProjectContextProvider from "@/oss/contexts/project.context" +import AgSWRConfig from "@/oss/lib/api/SWRConfig" +import AuthProvider from "@/oss/lib/helpers/auth/AuthProvider" -export default AppPage +import AppContextComponent from "../components/AppMessageContext" + +enableMapSet() + +const NoMobilePageWrapper = dynamic( + () => import("@/oss/components/NoMobilePageWrapper/NoMobilePageWrapper"), + { + ssr: false, + }, +) +const TraceDrawer = dynamic( + () => import("@/oss/components/Playground/Components/Drawers/TraceDrawer/TraceDrawer"), + {ssr: false}, +) +const CustomPosthogProvider = dynamic(() => import("@/oss/lib/helpers/analytics/AgPosthogProvider")) +const Layout = dynamic(() => import("@/oss/components/Layout/Layout"), { + ssr: false, +}) + +const inter = Inter({ + subsets: ["latin"], + variable: "--font-inter", +}) + +export default function App({Component, pageProps, ...rest}: AppProps) { + return ( + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + ) +} diff --git a/web/oss/src/pages/apps/[app_id]/deployments/index.tsx b/web/oss/src/pages/apps/[app_id]/deployments/index.tsx new file mode 100644 index 0000000000..faac59cdb6 --- /dev/null +++ b/web/oss/src/pages/apps/[app_id]/deployments/index.tsx @@ -0,0 +1,111 @@ +// @ts-nocheck +import {useEffect, useMemo, useState} from "react" + +import {Flex, Spin, Typography} from "antd" +import {createUseStyles} from "react-jss" + +import DeploymentCard from "@/oss/components/DeploymentCard" +import DeploymentsDashboard from "@/oss/components/DeploymentsDashboard" +import {useAppsData} from "@/oss/contexts/app.context" +import {useAppId} from "@/oss/hooks/useAppId" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import {JSSTheme} from "@/oss/lib/Types" +import {DeploymentRevisions} from "@/oss/lib/types_ee" +import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" +import {fetchAllDeploymentRevisions} from "@/oss/services/deploymentVersioning/api" + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + container: { + display: "flex", + flexDirection: "column", + gap: theme.marginLG, + }, + title: { + fontSize: theme.fontSizeHeading4, + fontWeight: theme.fontWeightMedium, + lineHeight: theme.lineHeightHeading4, + }, +})) + +const DeploymentsPage = () => { + const classes = useStyles() + const [selectedEnv, setSelectedEnv] = useQueryParam("selectedEnvName", "development") + + const {currentApp} = useAppsData() + const appId = useAppId() + const {environments, isEnvironmentsLoading, mutate: loadEnvironments} = useEnvironments({appId}) + const { + data, + isLoading: isVariantLoading, + mutate: loadVariants, + } = useVariants(currentApp)({appId}) + + const [isLoadingEnvRevisions, setIsLoadingEnvRevisions] = useState(false) + const [envRevisions, setEnvRevisions] = useState() + + const variants = useMemo(() => data?.variants || [], [data]) + + const deployedVariant = useMemo(() => { + return ( + (variants || []).find( + (variant) => variant?.id === envRevisions?.deployed_app_variant_revision_id, + ) || null + ) + }, [variants, envRevisions?.deployed_app_variant_revision_id]) + + const handleFetchAllDeploymentRevisions = async (envName: string) => { + try { + setIsLoadingEnvRevisions(true) + setSelectedEnv(envName) + const data = await fetchAllDeploymentRevisions(appId, envName) + setEnvRevisions(data) + loadEnvironments() + loadVariants() + } catch (error) { + console.error("Error fetching deployment revisions:", error) + } finally { + setIsLoadingEnvRevisions(false) + } + } + + useEffect(() => { + handleFetchAllDeploymentRevisions(selectedEnv) + }, []) + + return ( + +
    + Deployment + + + {environments.map((env, index) => { + const selectedDeployedVariant = variants?.find( + (variant) => variant?.id === env.deployed_app_variant_revision_id, + ) + + return ( + handleFetchAllDeploymentRevisions(env.name)} + selectedDeployedVariant={selectedDeployedVariant} + env={env} + selectedEnv={selectedEnv} + loading={isEnvironmentsLoading} + /> + ) + })} + + + +
    +
    + ) +} + +export default DeploymentsPage diff --git a/web/oss/src/pages/apps/[app_id]/endpoints/index.tsx b/web/oss/src/pages/apps/[app_id]/endpoints/index.tsx new file mode 100644 index 0000000000..9a1bf21471 --- /dev/null +++ b/web/oss/src/pages/apps/[app_id]/endpoints/index.tsx @@ -0,0 +1,278 @@ +// @ts-nocheck +import {useEffect, useState} from "react" + +import {ApiOutlined, AppstoreOutlined, HistoryOutlined} from "@ant-design/icons" +import {Alert, Collapse, CollapseProps, Empty, Radio, Tabs, Tooltip, Typography} from "antd" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" +import {createUseStyles} from "react-jss" + +import fetchConfigcURLCode from "@/oss/code_snippets/endpoints/fetch_config/curl" +import fetchConfigpythonCode from "@/oss/code_snippets/endpoints/fetch_config/python" +import fetchConfigtsCode from "@/oss/code_snippets/endpoints/fetch_config/typescript" +import invokeLlmAppcURLCode from "@/oss/code_snippets/endpoints/invoke_llm_app/curl" +import invokeLlmApppythonCode from "@/oss/code_snippets/endpoints/invoke_llm_app/python" +import invokeLlmApptsCode from "@/oss/code_snippets/endpoints/invoke_llm_app/typescript" +import DynamicCodeBlock from "@/oss/components/DynamicCodeBlock/DynamicCodeBlock" +import ResultComponent from "@/oss/components/ResultComponent/ResultComponent" +import {useAppsData} from "@/oss/contexts/app.context" +import {useQueryParam} from "@/oss/hooks/useQuery" +import {isDemo} from "@/oss/lib/helpers/utils" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import { + Environment, + GenericObject, + JSSTheme, + ListAppsItem, + Parameter, + Variant, +} from "@/oss/lib/Types" +import {fetchAppContainerURL} from "@/oss/services/api" +import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" + +const DeploymentHistory: any = dynamic( + () => import("@/oss/components/DeploymentHistory/DeploymentHistory"), +) + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + container: { + display: "flex", + flexDirection: "column", + rowGap: 20, + }, + envButtons: { + "& .ant-radio-button-wrapper-checked": { + backgroundColor: theme.colorPrimary, + color: theme.colorWhite, + "&:hover": { + color: theme.colorWhite, + }, + }, + }, +})) + +const {Text, Title} = Typography + +export const createParams = ( + inputParams: Parameter[] | null, + environmentName: string, + value: string | number, + isChatVariant: boolean | null, + app: ListAppsItem | null, +) => { + const mainParams: GenericObject = {} + const secondaryParams: GenericObject = {} + + inputParams?.forEach((item) => { + if (item.input) { + mainParams[item.name] = item.default || value + } else { + secondaryParams[item.name] = item.default || value + } + }) + if (isChatVariant) { + mainParams["messages"] = [ + { + role: "user", + content: "Example message", + }, + ] + mainParams["inputs"] = secondaryParams + } else if (Object.keys(secondaryParams).length > 0) { + mainParams["inputs"] = secondaryParams + } + + mainParams["environment"] = environmentName + if (app) { + mainParams["app"] = app.app_name + } + return JSON.stringify(mainParams, null, 2) +} + +export default function VariantEndpoint() { + const classes = useStyles() + const router = useRouter() + const appId = router.query.app_id as string + const [tab, setTab] = useQueryParam("tab", "overview") + const isOss = !isDemo() + const {currentApp} = useAppsData() + + // Load URL for the given environment + const [uri, setURI] = useState(null) + const loadURL = async (environment: Environment) => { + if (environment.deployed_app_variant_id) { + const url = await fetchAppContainerURL(appId, environment.deployed_app_variant_id) + setURI(`${url}/run`) + } + } + + // Load environments for the given app + const [selectedEnvironment, setSelectedEnvironment] = useState(null) + const {environments} = useEnvironments({ + appId, + onSuccess: (data: Environment[]) => { + const loadProductionEnv = data.find((env) => env.name === "production") + if (loadProductionEnv) { + setSelectedEnvironment(loadProductionEnv) + loadURL(loadProductionEnv) + } else { + setSelectedEnvironment(data[0]) + loadURL(data[0]) + } + }, + }) + + const handleEnvironmentClick = ({key}: {key: string}) => { + const chosenEnvironment = environments.find((env) => env.name === key) + if (!chosenEnvironment) return + setSelectedEnvironment(chosenEnvironment) + loadURL(chosenEnvironment) + } + + const {data, isLoading, error} = useVariants(currentApp)({ + appId: currentApp?.app_id, + }) + + const variants = data?.variants + + // Set the variant to the variant deployed in the selected environment + const [variant, setVariant] = useState(null) + useEffect(() => { + if (!selectedEnvironment) return + const variant = (variants || []).find( + (variant) => variant.variantId === selectedEnvironment.deployed_app_variant_revision_id, + ) + if (!variant) return + + setVariant(variant) + }, [selectedEnvironment, variants]) + + useEffect(() => { + if (variants && variants.length > 0) { + setVariant(variants[0]) + } + }, [variants, appId]) + + const {inputParams, isChatVariant} = variant || {} + + if (isLoading) { + return + } + if (!variant) { + return + } + if (error) { + return ( + + ) + } + + const params = createParams( + inputParams, + selectedEnvironment?.name || "none", + "add_a_value", + isChatVariant, + ) + const invokeLlmAppCodeSnippet: Record = { + Python: invokeLlmApppythonCode(uri!, params), + cURL: invokeLlmAppcURLCode(uri!, params), + TypeScript: invokeLlmApptsCode(uri!, params), + } + + const fetchConfigCodeSnippet: Record = { + Python: fetchConfigpythonCode(variant.baseId, selectedEnvironment?.name!), + cURL: fetchConfigcURLCode(variant.baseId, selectedEnvironment?.name!), + TypeScript: fetchConfigtsCode(variant.baseId, selectedEnvironment?.name!), + } + + const items: CollapseProps["items"] = [ + { + key: "1", + label: "Invoke LLM App", + children: , + }, + { + key: "2", + label: "Fetch Prompt/Config", + children: , + }, + ] + + return ( +
    + + <ApiOutlined /> + API endpoint + + + Select an environment then use this endpoint to send requests to the LLM app. + + +
    + Environment: + handleEnvironmentClick({key: e.target.value})} + className={classes.envButtons} + > + {environments + .map((env) => ( + + {env.name} + + )) + .reverse()} + +
    + + {selectedEnvironment?.deployed_app_variant_id ? ( + <> + , + children: ( + + ), + }, + { + key: "history", + label: !isOss ? ( + "History" + ) : ( + + History + + ), + icon: , + children: ( + + ), + disabled: isOss, + }, + ]} + onChange={setTab} + /> + + ) : ( + + )} +
    + ) +} diff --git a/web/oss/src/pages/apps/[app_id]/overview/index.tsx b/web/oss/src/pages/apps/[app_id]/overview/index.tsx new file mode 100644 index 0000000000..d9400c0a46 --- /dev/null +++ b/web/oss/src/pages/apps/[app_id]/overview/index.tsx @@ -0,0 +1,202 @@ +// @ts-nocheck +import {useCallback, useState, useMemo} from "react" + +import {MoreOutlined} from "@ant-design/icons" +import {PencilLine, PencilSimple, Trash} from "@phosphor-icons/react" +import {Button, Dropdown, Space, Typography} from "antd" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" +import {createUseStyles} from "react-jss" + +import AbTestingEvaluation from "@/oss/components/HumanEvaluations/AbTestingEvaluation" +import SingleModelEvaluation from "@/oss/components/HumanEvaluations/SingleModelEvaluation" +import useCustomWorkflowConfig from "@/oss/components/pages/app-management/modals/CustomWorkflowModal/hooks/useCustomWorkflowConfig" +// import AutomaticEvalOverview from "@/oss/components/pages/overview/automaticEvaluation/AutomaticEvalOverview" +import DeploymentOverview from "@/oss/components/pages/overview/deployments/DeploymentOverview" +import VariantsOverview from "@/oss/components/pages/overview/variants/VariantsOverview" +import {useAppsData} from "@/oss/contexts/app.context" +import {useAppId} from "@/oss/hooks/useAppId" +import {isDemo} from "@/oss/lib/helpers/utils" +import {useVariants} from "@/oss/lib/hooks/useVariants" +import type {JSSTheme} from "@/oss/lib/Types" +import {deleteApp} from "@/oss/services/app-selector/api" +import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" + +const CustomWorkflowHistory: any = dynamic( + () => import("@/oss/components/pages/app-management/drawers/CustomWorkflowHistory"), +) +const ObservabilityOverview: any = dynamic( + () => import("@/oss/components/pages/overview/observability/ObservabilityOverview"), +) +const DeleteAppModal: any = dynamic( + () => import("@/oss/components/pages/app-management/modals/DeleteAppModal"), +) +const EditAppModal: any = dynamic( + () => import("@/oss/components/pages/app-management/modals/EditAppModal"), +) + +const {Title} = Typography + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + container: { + display: "flex", + flexDirection: "column", + gap: 40, + "& h1": { + fontSize: theme.fontSizeHeading4, + fontWeight: theme.fontWeightMedium, + lineHeight: theme.lineHeightHeading4, + }, + }, +})) + +const OverviewPage = () => { + const router = useRouter() + const appId = useAppId() + const classes = useStyles() + const {currentApp, mutate: mutateApps} = useAppsData() + const [isDeleteAppModalOpen, setIsDeleteAppModalOpen] = useState(false) + const [isDelAppLoading, setIsDelAppLoading] = useState(false) + const [isEditAppModalOpen, setIsEditAppModalOpen] = useState(false) + + const [isCustomWorkflowHistoryDrawerOpen, setIsCustomWorkflowHistoryDrawerOpen] = + useState(false) + + const {data, mutate, isLoading: isVariantLoading} = useVariants(currentApp)({appId}) + const {CustomWorkflowModal, openModal} = useCustomWorkflowConfig({ + afterConfigSave: mutate, + }) + const sortedVariants = useMemo(() => { + if (!data) return [] + + return data.variants.sort((a, b) => { + return b.createdAtTimestamp - a.createdAtTimestamp + }) + }, [data]) + const { + environments, + isEnvironmentsLoading: isDeploymentLoading, + mutate: loadEnvironments, + } = useEnvironments({appId}) + + const handleDeleteOk = useCallback(async () => { + if (!currentApp) return + + setIsDelAppLoading(true) + try { + await deleteApp(currentApp.app_id) + await mutateApps() + router.push("/apps") + } catch (error) { + console.error(error) + } finally { + localStorage.removeItem(`tabIndex_${currentApp.app_id}`) + setIsDeleteAppModalOpen(false) + } + }, [currentApp, router]) + + return ( + <> +
    + + {currentApp?.app_name || ""} + + , + onClick: openModal, + }, + // { + // key: "history", + // label: "History", + // icon: , + // onClick: () => + // setIsCustomWorkflowHistoryDrawerOpen(true), + // }, + ] + : [ + { + key: "rename_app", + label: "Rename", + icon: , + onClick: () => setIsEditAppModalOpen(true), + }, + ]), + { + key: "delete_app", + label: "Delete", + icon: , + danger: true, + onClick: () => setIsDeleteAppModalOpen(true), + }, + ], + }} + > +
    + {currentApp && ( + setIsDeleteAppModalOpen(false)} + confirmLoading={isDelAppLoading} + appDetails={currentApp} + /> + )} + + {currentApp && ( + setIsEditAppModalOpen(false)} + appDetails={currentApp} + /> + )} + + {CustomWorkflowModal} + + setIsCustomWorkflowHistoryDrawerOpen(false)} + /> + + ) +} + +export default OverviewPage diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/playground/index.tsx b/web/oss/src/pages/apps/[app_id]/playground/index.tsx similarity index 100% rename from web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/playground/index.tsx rename to web/oss/src/pages/apps/[app_id]/playground/index.tsx diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/traces/index.tsx b/web/oss/src/pages/apps/[app_id]/traces/index.tsx similarity index 100% rename from web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/traces/index.tsx rename to web/oss/src/pages/apps/[app_id]/traces/index.tsx diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/variants/index.tsx b/web/oss/src/pages/apps/[app_id]/variants/index.tsx similarity index 100% rename from web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/variants/index.tsx rename to web/oss/src/pages/apps/[app_id]/variants/index.tsx diff --git a/web/oss/src/pages/apps/index.tsx b/web/oss/src/pages/apps/index.tsx new file mode 100644 index 0000000000..631a2e93a9 --- /dev/null +++ b/web/oss/src/pages/apps/index.tsx @@ -0,0 +1,10 @@ +import AppManagement from "@/oss/components/pages/app-management" +import ProtectedRoute from "@/oss/components/ProtectedRoute/ProtectedRoute" + +export default function Apps() { + return ( + + + + ) +} diff --git a/web/oss/src/pages/auth/[[...path]].tsx b/web/oss/src/pages/auth/[[...path]].tsx index 2d93bdfcf7..68c5f515fd 100644 --- a/web/oss/src/pages/auth/[[...path]].tsx +++ b/web/oss/src/pages/auth/[[...path]].tsx @@ -10,7 +10,6 @@ import {getLoginAttemptInfo} from "supertokens-auth-react/recipe/passwordless" import {useLocalStorage} from "usehooks-ts" import useLazyEffect from "@/oss/hooks/useLazyEffect" -import {isBackendAvailabilityIssue} from "@/oss/lib/helpers/errorHandler" import {isDemo} from "@/oss/lib/helpers/utils" import {AuthErrorMsgType} from "@/oss/lib/Types" @@ -23,6 +22,7 @@ const SideBanner = dynamic(() => import("@/oss/components/pages/auth/SideBanner" const {Text, Title} = Typography const Auth = () => { + const [email, setEmail] = useState("") const [isAuthLoading, setIsAuthLoading] = useState(false) const [isSocialAuthLoading, setIsSocialAuthLoading] = useState(false) const [isLoginCodeVisible, setIsLoginCodeVisible] = useState(false) @@ -30,52 +30,30 @@ const Auth = () => { const [invite, setInvite] = useLocalStorage("invite", {}) const router = useRouter() - const firstString = (value: string | string[] | undefined): string | undefined => { - if (Array.isArray(value)) return value[0] - return typeof value === "string" ? value : undefined - } - - const token = firstString(router.query.token) - const organizationId = firstString(router.query.organization_id) - const projectId = firstString(router.query.project_id) - const workspaceId = firstString(router.query.workspace_id) - const emailFromQuery = firstString(router.query.email) + const token = router.query.token as string + const orgId = router.query.org_id as string + const projectId = router.query.project_id as string + const workspaceId = router.query.workspace_id as string + const _email = router.query.email as string const {redirectToPath, ...queries} = router.query const isInvitedUser = Object.keys(queries.token ? queries : invite).length > 0 - const [email, setEmail] = useState(emailFromQuery ?? "") - useEffect(() => { if (isInvitedUser && Object.keys(invite).length === 0) { setInvite({ token, - organization_id: organizationId, + org_id: orgId, project_id: projectId, workspace_id: workspaceId, - email: emailFromQuery, + email: _email, }) } - }, [ - isInvitedUser, - invite, - setInvite, - token, - organizationId, - projectId, - workspaceId, - emailFromQuery, - ]) + }, [isInvitedUser, invite]) const authErrorMsg = (error: any) => { if (error.isSuperTokensGeneralError === true) { // this may be a custom error message sent from the API by you. setMessage({message: error.message, type: "error"}) - } else if (isBackendAvailabilityIssue(error)) { - setMessage({ - message: "Unable to connect to the authentication service", - sub: "Please check if the backend is running and accessible. If you're self-hosting, ensure all services are started properly.", - type: "error", - }) } else { setMessage({ message: "Oops, something went wrong. Please try again", @@ -123,7 +101,7 @@ const Auth = () => { )} > { message={message} setMessage={setMessage} authErrorMsg={authErrorMsg} - initialEmail={emailFromQuery} /> ) : !isLoginCodeVisible ? ( <> diff --git a/web/oss/src/pages/auth/callback/[[...callback]].tsx b/web/oss/src/pages/auth/callback/[[...callback]].tsx index b34cfc8756..1731d70808 100644 --- a/web/oss/src/pages/auth/callback/[[...callback]].tsx +++ b/web/oss/src/pages/auth/callback/[[...callback]].tsx @@ -4,48 +4,59 @@ import {Alert, Spin} from "antd" import dynamic from "next/dynamic" import {useRouter} from "next/router" import {signInAndUp} from "supertokens-auth-react/recipe/thirdparty" +import {useLocalStorage} from "usehooks-ts" +import {LS_ORG_KEY} from "@/oss/contexts/org.context" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProfileData} from "@/oss/contexts/profile.context" +import {useProjectData} from "@/oss/contexts/project.context" import useLazyEffect from "@/oss/hooks/useLazyEffect" -import usePostAuthRedirect from "@/oss/hooks/usePostAuthRedirect" -import {isBackendAvailabilityIssue} from "@/oss/lib/helpers/errorHandler" +import {isDemo} from "@/oss/lib/helpers/utils" import {AuthErrorMsgType} from "@/oss/lib/Types" -import {buildPostLoginPath, waitForWorkspaceContext} from "@/oss/state/url/postLoginRedirect" const Auth = dynamic(() => import("../[[...path]]"), {ssr: false}) const Callback = () => { + const {reset: resetProfileData} = useProfileData() + const {reset: resetOrgData} = useOrgData() + const {reset: resetProjectData} = useProjectData() const router = useRouter() const [message, setMessage] = useState({} as AuthErrorMsgType) - const {handleAuthSuccess} = usePostAuthRedirect() + + const [invite] = useLocalStorage("invite", {}) + const isInvitedUser = invite && Object.keys(invite).length > 0 const state = router.query.state as string const code = router.query.code as string - const handleAuthError = (err: unknown) => { - if ((err as any)?.isSuperTokensGeneralError === true) { - setMessage({message: (err as any).message, type: "error"}) - } else if (isBackendAvailabilityIssue(err)) { - setMessage({ - message: - "Unable to connect to the authentication service. Please check if the backend is running and accessible.", - type: "error", - }) - } else { - setMessage({ - message: "Oops, something went wrong. Please try again", - type: "error", - }) - } - } - const handleGoogleCallback = async () => { try { const response = await signInAndUp() if (response.status === "OK") { + resetProfileData() + resetOrgData() + resetProjectData() + localStorage.setItem(LS_ORG_KEY, "") setMessage({message: "Verification successful", type: "success"}) - const {createdNewRecipeUser, user} = response - await handleAuthSuccess({createdNewRecipeUser, user}) + const isNewUser = + isDemo() && + response.createdNewRecipeUser && + response.user.loginMethods.length === 1 + + if (isNewUser) { + if (isInvitedUser) { + await router.push("/workspaces/accept?survey=true") + } else { + await router.push("/post-signup") + } + } else { + if (isInvitedUser) { + await router.push("/workspaces/accept") + } else { + await router.push("/apps") + } + } } else if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { setMessage({message: response.reason, type: "error"}) await router.push("/auth") @@ -57,7 +68,14 @@ const Callback = () => { await router.push("/auth") } } catch (err: any) { - handleAuthError(err) + if (err.isSuperTokensGeneralError === true) { + setMessage({message: err.message, type: "error"}) + } else { + setMessage({ + message: "Oops, something went wrong. Please try again", + type: "error", + }) + } } } @@ -66,9 +84,28 @@ const Callback = () => { const response = await signInAndUp() if (response.status === "OK") { + resetProfileData() + resetOrgData() + resetProjectData() setMessage({message: "Verification successful", type: "success"}) - const {createdNewRecipeUser, user} = response - await handleAuthSuccess({createdNewRecipeUser, user}) + const isNewUser = + isDemo() && + response.createdNewRecipeUser && + response.user.loginMethods.length === 1 + + if (isNewUser) { + if (isInvitedUser) { + await router.push("/workspaces/accept?survey=true") + } else { + await router.push("/post-signup") + } + } else { + if (isInvitedUser) { + await router.push("/workspaces/accept") + } else { + await router.push("/apps") + } + } } else if (response.status === "SIGN_IN_UP_NOT_ALLOWED") { setMessage({message: response.reason, type: "error"}) await router.push("/auth") @@ -80,17 +117,20 @@ const Callback = () => { await router.push("/auth") } } catch (err: any) { - handleAuthError(err) + if (err.isSuperTokensGeneralError === true) { + setMessage({message: err.message, type: "error"}) + } else { + setMessage({ + message: "Oops, something went wrong. Please try again", + type: "error", + }) + } } } useEffect(() => { if (router.isReady && !state && !code) { - ;(async () => { - const context = await waitForWorkspaceContext() - const nextPath = buildPostLoginPath(context) - router.replace(nextPath) - })() + router.push("/apps") } }, [state, code, router.isReady]) diff --git a/web/oss/src/pages/index.tsx b/web/oss/src/pages/index.tsx new file mode 100644 index 0000000000..77b78025f9 --- /dev/null +++ b/web/oss/src/pages/index.tsx @@ -0,0 +1,3 @@ +export default function Dashboard() { + return
    Homepage
    +} diff --git a/web/oss/src/pages/observability/index.tsx b/web/oss/src/pages/observability/index.tsx new file mode 100644 index 0000000000..8fdce78dbe --- /dev/null +++ b/web/oss/src/pages/observability/index.tsx @@ -0,0 +1,12 @@ +import ObservabilityDashboard from "@/oss/components/pages/observability/ObservabilityDashboard" +import ProtectedRoute from "@/oss/components/ProtectedRoute/ProtectedRoute" + +const GlobalObservability = () => { + return +} + +export default () => ( + + + +) diff --git a/web/oss/src/pages/settings/index.tsx b/web/oss/src/pages/settings/index.tsx new file mode 100644 index 0000000000..31fb7d3007 --- /dev/null +++ b/web/oss/src/pages/settings/index.tsx @@ -0,0 +1,63 @@ +import {useEffect, useMemo} from "react" + +import {Typography} from "antd" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" + +import ProtectedRoute from "@/oss/components/ProtectedRoute/ProtectedRoute" +import {useProjectData} from "@/oss/contexts/project.context" +import {useQueryParam} from "@/oss/hooks/useQuery" + +const Secrets = dynamic(() => import("@/oss/components/pages/settings/Secrets/Secrets"), { + ssr: false, +}) +const WorkspaceManage = dynamic( + () => import("@/oss/components/pages/settings/WorkspaceManage/WorkspaceManage"), + {ssr: false}, +) +const APIKeys = dynamic(() => import("@/oss/components/pages/settings/APIKeys/APIKeys"), { + ssr: false, +}) +const Billing = dynamic(() => import("@/oss/components/pages/settings/Billing"), { + ssr: false, +}) + +const Settings: React.FC = () => { + const [tab] = useQueryParam("tab", "workspace", "replace") + const router = useRouter() + const {project} = useProjectData() + + useEffect(() => { + if (project?.is_demo) { + router.push("/apps") + } + }, [project, router]) + + const {content, title} = useMemo(() => { + switch (tab) { + case "secrets": + return {content: , title: "Model Hub"} + case "apiKeys": + return {content: , title: "API Keys"} + case "billing": + return {content: , title: "Usage & Billing"} + default: + return {content: , title: "Workspace"} + } + }, [tab]) + + return ( +
    + + {title} + + {content} +
    + ) +} + +export default () => ( + + + +) diff --git a/web/oss/src/pages/testsets/[testset_id]/index.tsx b/web/oss/src/pages/testsets/[testset_id]/index.tsx new file mode 100644 index 0000000000..634aadec8d --- /dev/null +++ b/web/oss/src/pages/testsets/[testset_id]/index.tsx @@ -0,0 +1,9 @@ +import TestsetTable from "@/oss/components/TestSetTable/TestsetTable" +import "@ag-grid-community/styles/ag-grid.css" +import "@ag-grid-community/styles/ag-theme-alpine.css" + +const testsetDisplay = () => { + return +} + +export default testsetDisplay diff --git a/web/oss/src/pages/testsets/index.tsx b/web/oss/src/pages/testsets/index.tsx new file mode 100644 index 0000000000..f9dc6a4005 --- /dev/null +++ b/web/oss/src/pages/testsets/index.tsx @@ -0,0 +1,284 @@ +import {useMemo, useState} from "react" + +import {MoreOutlined, PlusOutlined} from "@ant-design/icons" +import {Copy, GearSix, Note, PencilSimple, Trash} from "@phosphor-icons/react" +import {Button, Dropdown, Input, Spin, Table, Typography} from "antd" +import {ColumnsType} from "antd/es/table/interface" +import dayjs from "dayjs" +import dynamic from "next/dynamic" +import {useRouter} from "next/router" +import {createUseStyles} from "react-jss" + +import NoResultsFound from "@/oss/components/NoResultsFound/NoResultsFound" +import {useAppsData} from "@/oss/contexts/app.context" +import {formatDate} from "@/oss/lib/helpers/dateTimeHelper" +import {JSSTheme, TestSet, testset, TestsetCreationMode} from "@/oss/lib/Types" +import {useLoadTestsetsList} from "@/oss/services/testsets/api" + +const TestsetModal: any = dynamic(() => import("@/oss/components/pages/testset/modals")) +const DeleteTestsetModal: any = dynamic( + () => import("@/oss/components/pages/testset/modals/DeleteTestset"), +) + +const useStyles = createUseStyles((theme: JSSTheme) => ({ + modal: { + transition: "width 0.3s ease", + "& .ant-modal-content": { + overflow: "hidden", + borderRadius: 16, + "& > .ant-modal-close": { + top: 16, + }, + }, + }, + headerText: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + "& > .ant-typography": { + fontSize: theme.fontSizeHeading4, + lineHeight: theme.lineHeightHeading4, + fontWeight: theme.fontWeightMedium, + margin: 0, + }, + }, + button: { + display: "flex", + alignItems: "center", + }, + table: { + "& table": { + border: "1px solid", + borderColor: theme.colorBorderSecondary, + }, + "& .ant-table-expanded-row-fixed": { + width: "100% !important", + }, + }, +})) + +const Testset = () => { + const classes = useStyles() + const router = useRouter() + const {isLoading: isAppsLoading} = useAppsData() + const [selectedRowKeys, setSelectedRowKeys] = useState([]) + const {testsets, isTestsetsLoading, mutate} = useLoadTestsetsList() + const [isCreateTestsetModalOpen, setIsCreateTestsetModalOpen] = useState(false) + const [searchTerm, setSearchTerm] = useState("") + const [testsetCreationMode, setTestsetCreationMode] = useState("create") + const [editTestsetValues, setEditTestsetValues] = useState(null) + const [current, setCurrent] = useState(0) + const [selectedTestsetToDelete, setSelectedTestsetToDelete] = useState([]) + const [isDeleteTestsetModalOpen, setIsDeleteTestsetModalOpen] = useState(false) + + const filteredTestset = useMemo(() => { + let allTestsets = testsets.sort( + (a: TestSet, b: TestSet) => + dayjs(b.updated_at).valueOf() - dayjs(a.updated_at).valueOf(), + ) + if (searchTerm) { + allTestsets = testsets.filter((item: TestSet) => + item.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) + } + return allTestsets + }, [searchTerm, testsets]) + + const columns: ColumnsType = [ + { + title: "Name", + dataIndex: "name", + key: "name", + onHeaderCell: () => ({ + style: {minWidth: 220}, + }), + }, + { + title: "Date Modified", + dataIndex: "updated_at", + key: "updated_at", + onHeaderCell: () => ({ + style: {minWidth: 220}, + }), + render: (date: string) => { + return formatDate(date) + }, + }, + { + title: "Date created", + dataIndex: "created_at", + key: "created_at", + render: (date: string) => { + return formatDate(date) + }, + onHeaderCell: () => ({ + style: {minWidth: 220}, + }), + }, + { + title: , + key: "key", + width: 56, + fixed: "right", + align: "center", + render: (_, record) => { + return ( + , + onClick: (e) => { + e.domEvent.stopPropagation() + router.push(`/testsets/${record._id}`) + }, + }, + { + key: "clone", + label: "Clone", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + setTestsetCreationMode("clone") + setEditTestsetValues(record) + setCurrent(1) + setIsCreateTestsetModalOpen(true) + }, + }, + {type: "divider"}, + { + key: "rename", + label: "Rename", + icon: , + onClick: (e) => { + e.domEvent.stopPropagation() + setTestsetCreationMode("rename") + setEditTestsetValues(record) + setCurrent(1) + setIsCreateTestsetModalOpen(true) + }, + }, + { + key: "delete", + label: "Delete", + icon: , + danger: true, + onClick: (e) => { + e.domEvent.stopPropagation() + setSelectedTestsetToDelete([record]) + setIsDeleteTestsetModalOpen(true) + }, + }, + ], + }} + > + +
    +
    + setSearchTerm(e.target.value)} + /> + +
    + + + +
    { + setSelectedRowKeys(selectedRows) + }, + }} + className={`ph-no-capture ${classes.table}`} + columns={columns} + dataSource={filteredTestset} + rowKey="_id" + loading={isTestsetsLoading || isAppsLoading} + scroll={{x: true}} + pagination={false} + onRow={(record) => { + return { + onClick: () => router.push(`/testsets/${record._id}`), + style: {cursor: "pointer"}, + } + }} + locale={{emptyText: }} + /> + + + {selectedTestsetToDelete.length > 0 && ( + { + setIsDeleteTestsetModalOpen(false) + setSelectedRowKeys([]) + }} + /> + )} + + { + setIsCreateTestsetModalOpen(false) + }} + /> + + ) +} + +export default Testset diff --git a/web/oss/src/pages/w/[workspace_id]/index.tsx b/web/oss/src/pages/w/[workspace_id]/index.tsx deleted file mode 100644 index 24b7e01d2e..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import WorkspaceRedirect from "@/oss/components/pages/WorkspaceRedirect" - -export default WorkspaceRedirect diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx deleted file mode 100644 index 46265127dc..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx +++ /dev/null @@ -1,102 +0,0 @@ -// @ts-nocheck -import {useMemo, useState, useEffect} from "react" - -import {Flex, Typography} from "antd" -import {useAtomValue} from "jotai" -import {useRouter} from "next/router" -import {createUseStyles} from "react-jss" - -import EnvironmentCardRow from "@/oss/components/DeploymentCard/EnvironmentCardRow" -import DeploymentsDashboard from "@/oss/components/DeploymentsDashboard" -import {useAppId} from "@/oss/hooks/useAppId" -import {useQueryParam} from "@/oss/hooks/useQuery" -import {JSSTheme} from "@/oss/lib/Types" -import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" -import {deploymentRevisionsWithAppIdQueryAtomFamily} from "@/oss/state/deployment/atoms/revisions" -import {deployedVariantByEnvironmentAtomFamily} from "@/oss/state/variant/atoms/fetcher" - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - container: { - display: "flex", - flexDirection: "column", - gap: theme.marginLG, - }, - title: { - fontSize: theme.fontSizeHeading4, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeightHeading4, - }, -})) - -const DeploymentsPage = () => { - const classes = useStyles() - const router = useRouter() - const [initialEnv, setInitialEnv] = useQueryParam("selectedEnvName", "development") - const [selectedEnv, setSelectedEnvLocal] = useState(initialEnv) - - useEffect(() => { - const fromUrl = router.query.selectedEnvName - if (!fromUrl && !!selectedEnv) { - setInitialEnv(selectedEnv) - } - }, [selectedEnv]) - // Sync local state with URL on mount and when URL changes - useEffect(() => { - setSelectedEnvLocal((prev) => (prev === initialEnv ? prev : initialEnv)) - }, [initialEnv]) - - // Function to update both local state and URL (shallow) - const setSelectedEnv = (envName: string) => { - setSelectedEnvLocal(envName) - // Update URL with shallow routing to prevent page reload - router.push( - { - pathname: router.pathname, - query: {...router.query, selectedEnvName: envName}, - }, - undefined, - {shallow: true}, - ) - } - - const appId = useAppId() - const {environments, isEnvironmentsLoading} = useEnvironments({appId}) - const selectedDeployedVariantAtom = deployedVariantByEnvironmentAtomFamily(selectedEnv) - const selectedDeployedVariant = useAtomValue(selectedDeployedVariantAtom) - - // Use atom for deployment revisions instead of manual state - const deploymentRevisionsAtom = useMemo( - () => deploymentRevisionsWithAppIdQueryAtomFamily({appId, envName: selectedEnv}), - [appId, selectedEnv], - ) - const {data: envRevisions} = useAtomValue(deploymentRevisionsAtom) - - const deployedVariant = useMemo(() => { - // Use per-environment selector exclusively - return selectedDeployedVariant ?? null - }, [selectedDeployedVariant]) - - return ( -
    - Deployment - - - setSelectedEnv(env.name)} - /> - - - -
    - ) -} - -export default DeploymentsPage diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/endpoints/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/endpoints/index.tsx deleted file mode 100644 index 39e443869e..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/endpoints/index.tsx +++ /dev/null @@ -1,274 +0,0 @@ -// @ts-nocheck -import {useEffect, useState} from "react" - -import {ApiOutlined, AppstoreOutlined, HistoryOutlined} from "@ant-design/icons" -import {Alert, Collapse, CollapseProps, Empty, Radio, Tabs, Tooltip, Typography} from "antd" -import {useAtomValue} from "jotai" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" -import {createUseStyles} from "react-jss" - -import fetchConfigcURLCode from "@/oss/code_snippets/endpoints/fetch_config/curl" -import fetchConfigpythonCode from "@/oss/code_snippets/endpoints/fetch_config/python" -import fetchConfigtsCode from "@/oss/code_snippets/endpoints/fetch_config/typescript" -import invokeLlmAppcURLCode from "@/oss/code_snippets/endpoints/invoke_llm_app/curl" -import invokeLlmApppythonCode from "@/oss/code_snippets/endpoints/invoke_llm_app/python" -import invokeLlmApptsCode from "@/oss/code_snippets/endpoints/invoke_llm_app/typescript" -import DynamicCodeBlock from "@/oss/components/DynamicCodeBlock/DynamicCodeBlock" -import ResultComponent from "@/oss/components/ResultComponent/ResultComponent" -import {useQueryParam} from "@/oss/hooks/useQuery" -import {isDemo} from "@/oss/lib/helpers/utils" -import {useVariants} from "@/oss/lib/hooks/useVariants" -import { - Environment, - GenericObject, - JSSTheme, - ListAppsItem, - Parameter, - Variant, -} from "@/oss/lib/Types" -import {fetchAppContainerURL} from "@/oss/services/api" -import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" -import {currentAppAtom} from "@/oss/state/app" - -const DeploymentHistory: any = dynamic( - () => import("@/oss/components/DeploymentHistory/DeploymentHistory"), -) - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - container: { - display: "flex", - flexDirection: "column", - rowGap: 20, - }, - envButtons: { - "& .ant-radio-button-wrapper-checked": { - backgroundColor: theme.colorPrimary, - color: theme.colorWhite, - "&:hover": { - color: theme.colorWhite, - }, - }, - }, -})) - -const {Text, Title} = Typography - -export const createParams = ( - inputParams: Parameter[] | null, - environmentName: string, - value: string | number, - app?: ListAppsItem | null, -) => { - const mainParams: GenericObject = {} - const secondaryParams: GenericObject = {} - - inputParams?.forEach((item) => { - if (item.input) { - mainParams[item.name] = item.default || value - } else { - secondaryParams[item.name] = item.default || value - } - }) - const isChat = Array.isArray(inputParams) - ? inputParams.some((p) => p?.name === "messages") - : false - if (isChat) { - mainParams["messages"] = [ - { - role: "user", - content: "Example message", - }, - ] - mainParams["inputs"] = secondaryParams - } else if (Object.keys(secondaryParams).length > 0) { - mainParams["inputs"] = secondaryParams - } - - mainParams["environment"] = environmentName - if (app) { - mainParams["app"] = app.app_name - } - return JSON.stringify(mainParams, null, 2) -} - -export default function VariantEndpoint() { - const classes = useStyles() - const router = useRouter() - const appId = router.query.app_id as string - const [tab, setTab] = useQueryParam("tab", "overview") - const isOss = !isDemo() - const currentApp = useAtomValue(currentAppAtom) - - // Load URL for the given environment - const [uri, setURI] = useState(null) - const loadURL = async (environment: Environment) => { - if (environment.deployed_app_variant_id) { - const url = await fetchAppContainerURL(appId, environment.deployed_app_variant_id) - setURI(`${url}/run`) - } - } - - // Load environments for the given app - const [selectedEnvironment, setSelectedEnvironment] = useState(null) - const {environments} = useEnvironments({ - appId, - onSuccess: (data: Environment[]) => { - const loadProductionEnv = data.find((env) => env.name === "production") - if (loadProductionEnv) { - setSelectedEnvironment(loadProductionEnv) - loadURL(loadProductionEnv) - } else { - setSelectedEnvironment(data[0]) - loadURL(data[0]) - } - }, - }) - - const handleEnvironmentClick = ({key}: {key: string}) => { - const chosenEnvironment = environments.find((env) => env.name === key) - if (!chosenEnvironment) return - setSelectedEnvironment(chosenEnvironment) - loadURL(chosenEnvironment) - } - - const {data, isLoading, error} = useVariants(currentApp) - - const variants = data?.variants - - // Set the variant to the variant deployed in the selected environment - const [variant, setVariant] = useState(null) - useEffect(() => { - if (!selectedEnvironment) return - const variant = (variants || []).find( - (variant) => variant.variantId === selectedEnvironment.deployed_app_variant_revision_id, - ) - if (!variant) return - - setVariant(variant) - }, [selectedEnvironment, variants]) - - useEffect(() => { - if (variants && variants.length > 0) { - setVariant(variants[0]) - } - }, [variants, appId]) - - const {inputParams} = variant || {} - - if (isLoading) { - return - } - if (!variant) { - return - } - if (error) { - return ( - - ) - } - - const params = createParams(inputParams, selectedEnvironment?.name || "none", "add_a_value") - const invokeLlmAppCodeSnippet: Record = { - Python: invokeLlmApppythonCode(uri!, params), - cURL: invokeLlmAppcURLCode(uri!, params), - TypeScript: invokeLlmApptsCode(uri!, params), - } - - const fetchConfigCodeSnippet: Record = { - Python: fetchConfigpythonCode(variant.baseId, selectedEnvironment?.name!), - cURL: fetchConfigcURLCode(variant.baseId, selectedEnvironment?.name!), - TypeScript: fetchConfigtsCode(variant.baseId, selectedEnvironment?.name!), - } - - const items: CollapseProps["items"] = [ - { - key: "1", - label: "Invoke LLM App", - children: , - }, - { - key: "2", - label: "Fetch Prompt/Config", - children: , - }, - ] - - return ( -
    - - <ApiOutlined /> - API endpoint - - - Select an environment then use this endpoint to send requests to the LLM app. - - -
    - Environment: - handleEnvironmentClick({key: e.target.value})} - className={classes.envButtons} - > - {environments - .map((env) => ( - - {env.name} - - )) - .reverse()} - -
    - - {selectedEnvironment?.deployed_app_variant_id ? ( - <> - , - children: ( - - ), - }, - { - key: "history", - label: !isOss ? ( - "History" - ) : ( - - History - - ), - icon: , - children: ( - - ), - disabled: isOss, - }, - ]} - onChange={setTab} - /> - - ) : ( - - )} -
    - ) -} diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/human_a_b_testing/[evaluation_id]/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/human_a_b_testing/[evaluation_id]/index.tsx deleted file mode 100644 index 76e6526898..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/human_a_b_testing/[evaluation_id]/index.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import {useEffect, useState} from "react" - -import {useAtom, useAtomValue} from "jotai" -import dynamic from "next/dynamic" -import {useRouter} from "next/router" - -// Avoid SSR for this heavy component to prevent server-side ReferenceErrors from client-only libs -const ABTestingEvaluationTable = dynamic( - () => import("@/oss/components/EvaluationTable/ABTestingEvaluationTable"), - {ssr: false}, -) -import useURL from "@/oss/hooks/useURL" -import {evaluationAtom, evaluationScenariosAtom} from "@/oss/lib/atoms/evaluation" -import {getTestsetChatColumn} from "@/oss/lib/helpers/testset" -import {useBreadcrumbsEffect} from "@/oss/lib/hooks/useBreadcrumbs" -import type {Evaluation} from "@/oss/lib/Types" -import { - fetchLoadEvaluation, - fetchAllLoadEvaluationsScenarios, -} from "@/oss/services/human-evaluations/api" -import {fetchTestset} from "@/oss/services/testsets/api" -import {projectIdAtom} from "@/oss/state/project" -import {variantsAtom} from "@/oss/state/variant/atoms/fetcher" - -export default function Evaluation() { - const router = useRouter() - const projectId = useAtomValue(projectIdAtom) - const evaluationTableId = router.query.evaluation_id - ? router.query.evaluation_id.toString() - : "" - const [evaluationScenarios, setEvaluationScenarios] = useAtom(evaluationScenariosAtom) - const [evaluation, setEvaluation] = useAtom(evaluationAtom) - const [isLoading, setIsLoading] = useState(true) - const appId = router.query.app_id as string - const columnsCount = 2 - const {baseAppURL} = useURL() - // variants from global store - const variantsStore = useAtomValue(variantsAtom) - - useEffect(() => { - if (!evaluation || !projectId) { - return - } - const init = async () => { - setIsLoading(true) - try { - const data = await fetchAllLoadEvaluationsScenarios(evaluationTableId, evaluation) - setEvaluationScenarios(data) - } finally { - setTimeout(() => setIsLoading(false), 1000) - } - } - init() - }, [evaluation, projectId]) - - useEffect(() => { - if (!evaluationTableId) { - return - } - const init = async () => { - const evaluation: Evaluation = await fetchLoadEvaluation(evaluationTableId) - const backendVariants = variantsStore - const testset = await fetchTestset(evaluation.testset._id) - // Create a map for faster access to first array elements - const backendVariantsMap = new Map() - backendVariants.forEach((obj) => backendVariantsMap.set(obj.variantId, obj)) - - // Update variants in second object - evaluation.variants = evaluation.variants.map((variant) => { - const backendVariant = backendVariantsMap.get(variant.variantId) - return backendVariant ? backendVariant : variant - }) - evaluation.testset = { - ...evaluation.testset, - ...testset, - testsetChatColumn: getTestsetChatColumn(testset.csvdata), - } - setEvaluation(evaluation) - } - - init() - }, [evaluationTableId]) - - // breadcrumbs - useBreadcrumbsEffect( - { - breadcrumbs: { - appPage: { - label: "human ab testing", - href: `${baseAppURL}/${appId}/evaluations?selectedEvaluation=human_ab_testing`, - }, - "eval-detail": { - label: evaluationTableId, - value: evaluationTableId, - }, - }, - type: "append", - condition: !!evaluationTableId, - }, - [evaluationTableId], - ) - - return ( -
    - {evaluationTableId && evaluationScenarios && evaluation && ( - - )} -
    - ) -} diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/index.tsx deleted file mode 100644 index 5f9c0ce406..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import EvaluationsView from "@/oss/components/pages/evaluations/EvaluationsView" - -const AppEvaluationsPage = () => { - return -} - -export default AppEvaluationsPage diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/results/[evaluation_id]/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/results/[evaluation_id]/index.tsx deleted file mode 100644 index 8a3e7e4523..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/results/[evaluation_id]/index.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import {useRouter} from "next/router" - -import EvalRunDetailsPage from "@/oss/components/EvalRunDetails" - -const AppEvaluationResultsPage = () => { - const router = useRouter() - const rawType = - (Array.isArray(router.query.eval_type) - ? router.query.eval_type[0] - : router.query.eval_type) || - (Array.isArray(router.query.type) ? router.query.type[0] : router.query.type) - const normalized = - rawType === "online" - ? "online" - : rawType === "human" - ? "human" - : rawType === "custom" - ? "custom" - : "auto" - return -} - -export default AppEvaluationResultsPage diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/results/compare/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/results/compare/index.tsx deleted file mode 100644 index 9a24e505d7..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/results/compare/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import EvaluationCompare from "@/oss/components/pages/evaluations/evaluationCompare/EvaluationCompare" - -const EvaluationCompareDetails = () => { - return -} - -export default EvaluationCompareDetails diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/single_model_test/[evaluation_id]/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/single_model_test/[evaluation_id]/index.tsx deleted file mode 100644 index 209e1772ec..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/evaluations/single_model_test/[evaluation_id]/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import EvalRunDetailsPage from "@/oss/components/EvalRunDetails" - -const EvaluationPage = () => { - return -} - -export default EvaluationPage diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/overview/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/overview/index.tsx deleted file mode 100644 index 9afd259da5..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/overview/index.tsx +++ /dev/null @@ -1,142 +0,0 @@ -// @ts-nocheck -import {memo, useState} from "react" - -import {MoreOutlined} from "@ant-design/icons" -import {PencilLine, PencilSimple, Trash} from "@phosphor-icons/react" -import {Button, Dropdown, Space, Typography} from "antd" -import clsx from "clsx" -import {useSetAtom} from "jotai" -import dynamic from "next/dynamic" -import {createUseStyles} from "react-jss" - -import useCustomWorkflowConfig from "@/oss/components/pages/app-management/modals/CustomWorkflowModal/hooks/useCustomWorkflowConfig" -import {openDeleteAppModalAtom} from "@/oss/components/pages/app-management/modals/DeleteAppModal/store/deleteAppModalStore" -import {openEditAppModalAtom} from "@/oss/components/pages/app-management/modals/EditAppModal/store/editAppModalStore" -import DeploymentOverview from "@/oss/components/pages/overview/deployments/DeploymentOverview" -import VariantsOverview from "@/oss/components/pages/overview/variants/VariantsOverview" -import useURL from "@/oss/hooks/useURL" -import type {JSSTheme} from "@/oss/lib/Types" -import {deleteApp} from "@/oss/services/app-selector/api" -import {useEnvironments} from "@/oss/services/deployment/hooks/useEnvironments" -import {useAppsData} from "@/oss/state/app" - -const CustomWorkflowHistory: any = dynamic( - () => import("@/oss/components/pages/app-management/drawers/CustomWorkflowHistory"), -) -const ObservabilityOverview: any = dynamic( - () => import("@/oss/components/pages/overview/observability/ObservabilityOverview"), -) - -const AutoEvaluation = dynamic( - () => import("@/oss/components/pages/evaluations/autoEvaluation/AutoEvaluation"), - {ssr: false}, -) - -const AbTestingEvaluation = dynamic( - () => import("@/oss/components/HumanEvaluations/AbTestingEvaluation"), - {ssr: false}, -) - -const SingleModelEvaluation = dynamic( - () => import("@/oss/components/HumanEvaluations/SingleModelEvaluation"), - {ssr: false}, -) - -const {Title, Text} = Typography - -const useStyles = createUseStyles((theme: JSSTheme) => ({ - container: { - "& h1": { - fontSize: theme.fontSizeHeading4, - fontWeight: theme.fontWeightMedium, - lineHeight: theme.lineHeightHeading4, - }, - }, -})) - -const AppDetailsSection = memo(() => { - const openDeleteAppModal = useSetAtom(openDeleteAppModalAtom) - const openEditAppModal = useSetAtom(openEditAppModalAtom) - const {currentApp, mutate: mutateApps} = useAppsData() - const {openModal} = useCustomWorkflowConfig({ - afterConfigSave: mutateApps, - configureWorkflow: true, - }) - return ( - <> - - {currentApp?.app_name || ""} - - , - onClick: openModal, - }, - // { - // key: "history", - // label: "History", - // icon: , - // onClick: () => - // setIsCustomWorkflowHistoryDrawerOpen(true), - // }, - ] - : [ - { - key: "rename_app", - label: "Rename", - icon: , - onClick: () => openEditAppModal(currentApp!), - }, - ]), - { - key: "delete_app", - label: "Delete", - icon: , - danger: true, - onClick: () => openDeleteAppModal(currentApp!), - }, - ], - }} - > - - -
    - setSearchTerm(e.target.value)} - /> - -
    - - - -
    { - setSelectedRowKeys(selectedRows) - }, - }} - className={`ph-no-capture ${classes.table}`} - columns={columns} - dataSource={filteredTestset} - rowKey="_id" - loading={isTestsetsLoading || isAppsLoading} - scroll={{x: true}} - pagination={false} - onRow={(record) => { - return { - onClick: () => router.push(`${projectURL}/testsets/${record._id}`), - style: {cursor: "pointer"}, - } - }} - locale={{emptyText: }} - /> - - - {selectedTestsetToDelete.length > 0 && ( - { - setIsDeleteTestsetModalOpen(false) - setSelectedRowKeys([]) - }} - /> - )} - - { - setIsCreateTestsetModalOpen(false) - }} - /> - - ) -} - -export default Testset diff --git a/web/oss/src/pages/w/[workspace_id]/p/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/index.tsx deleted file mode 100644 index 06971bcc49..0000000000 --- a/web/oss/src/pages/w/[workspace_id]/p/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import WorkspaceProjectRedirect from "@/oss/components/pages/WorkspaceProjectRedirect" - -export default WorkspaceProjectRedirect diff --git a/web/oss/src/pages/w/index.tsx b/web/oss/src/pages/w/index.tsx deleted file mode 100644 index b5851d5745..0000000000 --- a/web/oss/src/pages/w/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import WorkspaceSelection from "../../components/pages/WorkspaceSelection" - -export default WorkspaceSelection diff --git a/web/oss/src/pages/workspaces/accept.tsx b/web/oss/src/pages/workspaces/accept.tsx index 1a45a69423..db05342806 100644 --- a/web/oss/src/pages/workspaces/accept.tsx +++ b/web/oss/src/pages/workspaces/accept.tsx @@ -1,189 +1,83 @@ import {useEffect, useRef, type FC} from "react" -import {getDefaultStore, useAtomValue} from "jotai" +import {message} from "antd" import {useRouter} from "next/router" import {useLocalStorage} from "usehooks-ts" -import {message} from "@/oss/components/AppMessageContext" +import ProtectedRoute from "@/oss/components/ProtectedRoute/ProtectedRoute" import ContentSpinner from "@/oss/components/Spinner/ContentSpinner" +import {useOrgData} from "@/oss/contexts/org.context" +import {useProjectData} from "@/oss/contexts/project.context" +import {isDemo} from "@/oss/lib/helpers/utils" import {acceptWorkspaceInvite} from "@/oss/services/workspace/api" -import {useOrgData} from "@/oss/state/org" -import {cacheWorkspaceOrgPair} from "@/oss/state/org/selectors/org" -import {useProjectData} from "@/oss/state/project" -import {jwtReadyAtom} from "@/oss/state/session/jwt" -import {buildPostLoginPath} from "@/oss/state/url/postLoginRedirect" -import {activeInviteAtom} from "@/oss/state/url/test" - -const processedTokens = new Set() const Accept: FC = () => { const [invite, , removeInvite] = useLocalStorage("invite", {}) - const inviteFromState = useAtomValue(activeInviteAtom) - const {refetch: refetchOrganization, loading: loadingOrgs} = useOrgData() + const { + refetch: refetchOrganization, + changeSelectedOrg, + orgs, + loading: loadingOrgs, + } = useOrgData() const {refetch: refetchProject, isLoading: loadingProjects} = useProjectData() const router = useRouter() const accept = useRef(false) - const firstString = (value: unknown): string | undefined => { - if (Array.isArray(value)) return typeof value[0] === "string" ? value[0] : undefined - return typeof value === "string" ? value : undefined - } - - const source = router.query.token - ? router.query - : inviteFromState - ? { - token: inviteFromState.token, - email: inviteFromState.email, - organization_id: inviteFromState.organization_id, - workspace_id: inviteFromState.workspace_id, - project_id: inviteFromState.project_id, - survey: inviteFromState.survey, - } - : invite - const token = firstString(source?.token) as string | undefined - const organizationId = firstString(source?.organization_id) as string | undefined - const projectId = firstString(source?.project_id) as string | undefined - const workspaceId = firstString(source?.workspace_id) as string | undefined - const email = firstString(source?.email) as string | undefined + const _invite = router.query.token ? router.query : invite + const token = _invite?.token as string + const orgId = _invite?.org_id as string + const projectId = _invite?.project_id as string + const workspaceId = _invite?.workspace_id as string + const email = _invite?.email as string const isSurvey = Boolean(router.query.survey) const onAcceptInvite = async () => { - if (!organizationId || !token) return - if (processedTokens.has(token)) return - - if (!accept.current) { + if (!loadingOrgs && !loadingProjects && !accept.current && orgId && token) { accept.current = true - processedTokens.add(token) - const store = getDefaultStore() try { - await new Promise((resolve) => { - let unsub: () => void = () => {} - const check = () => { - const ready = (store.get(jwtReadyAtom) as any)?.data ?? false - if (ready) { - unsub() - resolve() - } - } - unsub = store.sub(jwtReadyAtom, check) - check() - }) - - try { - await acceptWorkspaceInvite( - { - token, - organizationId, - workspaceId, - projectId, - email, - }, - true, - ) + await acceptWorkspaceInvite({token, orgId, workspaceId, projectId, email}) - message.success("Joined workspace!") + refetchOrganization() + refetchProject() - await refetchOrganization() - await refetchProject() - - const targetWorkspace = workspaceId || organizationId - cacheWorkspaceOrgPair(targetWorkspace, organizationId) - store.set(activeInviteAtom, null) - removeInvite() - if (isSurvey) { - const redirect = encodeURIComponent(`/w/${targetWorkspace}`) - await router.replace(`/post-signup?redirect=${redirect}`) - } else if (targetWorkspace && projectId) { - const nextPath = buildPostLoginPath({ - workspaceId: targetWorkspace, - projectId, - }) - await router.replace(nextPath) - } else if (targetWorkspace) { - const nextPath = buildPostLoginPath({ - workspaceId: targetWorkspace, - projectId: null, - }) - await router.replace(nextPath) - } else { - await router.replace("/w") - } - } catch (error) { - if (error?.response?.status === 409) { - message.error("You're already a member of this workspace") - const targetWorkspace = workspaceId || organizationId - cacheWorkspaceOrgPair(targetWorkspace, organizationId) - store.set(activeInviteAtom, null) - removeInvite() - - console.log("Redirect to", { - targetWorkspace, - projectId, - route: `/w/${encodeURIComponent(targetWorkspace)}/p/${encodeURIComponent(projectId)}/apps`, - }) - const nextPath = buildPostLoginPath({ - workspaceId: targetWorkspace, - projectId, - }) - await router.replace(nextPath) - } else { - message.error("Failed to accept invite") - return - } + if (orgs.find((item) => item.id === orgId)) { + isDemo() && changeSelectedOrg(orgId) } - } catch (error: any) { - // Treat idempotent scenarios (already a member / already accepted) as success - const alreadyMember = - error?.response?.status === 409 || - /already a member/i.test(error?.response?.data?.detail || "") || - /already a member/i.test(error?.message || "") || - /already accepted/i.test(error?.response?.data?.detail || "") - const detailRaw = - (error?.response?.data?.detail as string | undefined) || - (error?.message as string | undefined) || - "Failed to accept invite" - const normalizedDetail = detailRaw.trim().toLowerCase() - const isGenericServerError = - normalizedDetail === "an internal error has occurred." || - normalizedDetail === "internal server error" - const detailMessage = isGenericServerError - ? "We couldn't finish joining this workspace, but you may already be a member." - : detailRaw + accept.current = true - if (alreadyMember) { - message.info("You are already a member of this workspace") - cacheWorkspaceOrgPair(workspaceId || organizationId, organizationId) + message.success("Joined workspace!") + if (isSurvey) { + await router.push("/post-signup") + } else if (!isDemo()) { + await router.push("/auth") } else { - console.error("[invite] accept failed", error) - message.error(detailMessage) + await router.push("/apps") } - - store.set(activeInviteAtom, null) - removeInvite() + } catch (error) { + console.error(error) if (isSurvey) { - const redirect = encodeURIComponent(`/w/${workspaceId || organizationId || ""}`) - await router.replace(`/post-signup?redirect=${redirect}`) - } else if (workspaceId || organizationId) { - const nextPath = buildPostLoginPath({ - workspaceId: workspaceId || organizationId || null, - projectId: null, - }) - await router.replace(nextPath) + await router.push("/post-signup") + } else if (!isDemo()) { + await router.push("/auth") } else { - await router.replace("/") + await router.push("/apps") } + } finally { + removeInvite() } } } useEffect(() => { onAcceptInvite() - // We only need to react to organizationId/token presence; jwt readiness awaited inside - }, [organizationId, token]) + }, [orgId, loadingOrgs, loadingProjects, accept]) return } -export default () => +export default () => ( + + + +) diff --git a/web/oss/src/services/annotations/api/index.ts b/web/oss/src/services/annotations/api/index.ts index 39425e0e1a..1e21c1be73 100644 --- a/web/oss/src/services/annotations/api/index.ts +++ b/web/oss/src/services/annotations/api/index.ts @@ -1,12 +1,11 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {fetchJson, getBaseUrl, ensureProjectId} from "@/oss/lib/api/assets/fetchClient" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import { AnnotationDto, AnnotationEditPayloadDto, AnnotationsResponse, } from "@/oss/lib/hooks/useAnnotations/types" -import {getProjectValues} from "@/oss/state/project" //Prefix convention: // - fetch: GET single entity from server @@ -18,16 +17,18 @@ import {getProjectValues} from "@/oss/state/project" export const queryAllAnnotations = async ( queries?: Record, ): Promise => { - const projectId = ensureProjectId() - const base = getBaseUrl() - const url = new URL(`${base}/preview/annotations/query`) - if (projectId) url.searchParams.set("project_id", projectId) - const body = queries && Object.keys(queries).length > 0 ? queries : {} - return fetchJson(url, {method: "POST", body: JSON.stringify(body)}) + const {projectId} = getCurrentProject() + + const response = await axios.post( + `${getAgentaApiUrl()}/preview/annotations/query?project_id=${projectId}`, + queries && Object.keys(queries).length > 0 ? queries : {}, + ) + + return response.data } export const createAnnotation = async (annotationPayload: AnnotationDto) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return await axios.post( `${getAgentaApiUrl()}/preview/annotations/?project_id=${projectId}`, @@ -44,7 +45,7 @@ export const updateAnnotation = async ({ traceId: string spanId: string }) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return await axios.patch( `${getAgentaApiUrl()}/preview/annotations/${traceId}/${spanId}?project_id=${projectId}`, @@ -61,7 +62,7 @@ export const fetchAnnotation = async ({ spanId?: string signal?: AbortSignal }): Promise => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return new Promise((resolve) => { if (!traceId || !spanId) { @@ -80,7 +81,7 @@ export const fetchAnnotation = async ({ } export const deleteAnnotation = async ({traceId, spanId}: {traceId: string; spanId: string}) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return await axios.delete( `${getAgentaApiUrl()}/preview/annotations/${traceId}/${spanId}?project_id=${projectId}`, diff --git a/web/oss/src/services/api.ts b/web/oss/src/services/api.ts index 1e38b89a1e..7697a286e9 100644 --- a/web/oss/src/services/api.ts +++ b/web/oss/src/services/api.ts @@ -1,14 +1,14 @@ import Session from "supertokens-auth-react/recipe/session" +import {DEFAULT_UUID, getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" import dayjs from "@/oss/lib/helpers/dateTimeHelper/dayjs" import { detectChatVariantFromOpenAISchema, openAISchemaToParameters, } from "@/oss/lib/helpers/openapi_parser" -import {shortPoll} from "@/oss/lib/helpers/utils" +import {getAgentaApiUrl, shortPoll} from "@/oss/lib/helpers/utils" import { Variant, Parameter, @@ -18,7 +18,6 @@ import { BaseResponse, User, } from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" import {findCustomWorkflowPath, uriFixer} from "../lib/shared/variant" import {constructPlaygroundTestUrl} from "../lib/shared/variant/stringUtils" @@ -37,9 +36,9 @@ import {constructPlaygroundTestUrl} from "../lib/shared/variant/stringUtils" export const axiosFetcher = (url: string) => axios.get(url).then((res) => res.data) export async function fetchVariants(appId: string, ignoreAxiosError = false): Promise { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() - if (!projectId) { + if (!projectId || projectId === DEFAULT_UUID) { return [] } @@ -88,15 +87,7 @@ export const getJWT = async () => { return jwt } } catch (error) { - console.error("Failed to fetch JWT", process.env.NODE_ENV) - } - - // In test environment, fall back to test JWT if available - if (typeof process !== "undefined" && process.env.NODE_ENV === "test") { - const testJWT = process.env.VITEST_TEST_JWT || process.env.TEST_JWT - if (testJWT) { - return testJWT - } + console.error("Failed to fetch JWT") } return undefined @@ -176,13 +167,7 @@ export async function callVariant( } } } else { - const inputs = {...secondaryInputParams} - for (const x of inputParamDefinition) { - if (!inputs[x.name]) { - inputs[x.name] = null - } - } - requestBody["inputs"] = inputs + requestBody["inputs"] = secondaryInputParams } if (uriObject) { @@ -216,7 +201,7 @@ export async function callVariant( return response?.data } else { const appContainerURI = await fetchAppContainerURL(appId, variantId, baseId) - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const jwt = await getJWT() const base_url = `${appContainerURI}/test?application_id=${appId}` @@ -272,8 +257,9 @@ export const fetchVariantParametersFromOpenAPI = async ( baseId?: string, ignoreAxiosError = false, ) => { + console.log("fetchVariantParametersFromOpenAPI !!") const appContainerURI = await fetchAppContainerURL(appId, variantId, baseId) - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const jwt = await getJWT() const base_url = `${appContainerURI}/openapi.json` @@ -356,14 +342,11 @@ export const fetchAppContainerURL = async ( if (!getAgentaApiUrl()) { throw new Error("Environment variable NEXT_PUBLIC_AGENTA_API_URL is not set.") } - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() // Retrieve container URL from backend const {data} = await axios.get( `${getAgentaApiUrl()}/variants/${variantId}?project_id=${projectId}`, - { - _ignoreError: true, - } as any, ) const uriObject = await findCustomWorkflowPath(data.uri) if (uriObject) { @@ -431,6 +414,3 @@ export const waitForAppToStart = async ({ return {stopper: () => {}, promise: Promise.reject(new Error("Variant not found"))} } } - -// Re-export profile mutations for backward compatibility with older imports -export {updateProfile, changePassword} from "./profile" diff --git a/web/oss/src/services/apiKeys/api/index.ts b/web/oss/src/services/apiKeys/api/index.ts index e69edc600e..8105531194 100644 --- a/web/oss/src/services/apiKeys/api/index.ts +++ b/web/oss/src/services/apiKeys/api/index.ts @@ -1,6 +1,6 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {getProjectValues} from "@/oss/state/project" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" //Prefix convention: // - fetch: GET single entity from server @@ -10,7 +10,7 @@ import {getProjectValues} from "@/oss/state/project" // - delete: DELETE data from server export const fetchAllListApiKeys = (workspaceId: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.get( `${getAgentaApiUrl()}/keys/?workspace_id=${workspaceId}&project_id=${projectId}`, @@ -21,7 +21,7 @@ export const fetchAllListApiKeys = (workspaceId: string, ignoreAxiosError = fals } export const createApiKey = (workspaceId: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.post( `${getAgentaApiUrl()}/keys?workspace_id=${workspaceId}&project_id=${projectId}`, @@ -33,7 +33,7 @@ export const createApiKey = (workspaceId: string, ignoreAxiosError = false) => { } export const deleteApiKey = (prefix: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.delete(`${getAgentaApiUrl()}/keys/${prefix}?project_id=${projectId}`, { _ignoreError: ignoreAxiosError, diff --git a/web/oss/src/services/app-selector/api/index.ts b/web/oss/src/services/app-selector/api/index.ts index 58c17d66b9..5ab232517b 100644 --- a/web/oss/src/services/app-selector/api/index.ts +++ b/web/oss/src/services/app-selector/api/index.ts @@ -1,15 +1,18 @@ -import Router from "next/router" - -import useURL from "@/oss/hooks/useURL" +// @ts-nocheck +import {getOrgValues} from "@/oss/contexts/org.context" +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {fetchJson} from "@/oss/lib/api/assets/fetchClient" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" import {LlmProvider} from "@/oss/lib/helpers/llmProviders" -import {buildRevisionsQueryParam} from "@/oss/lib/helpers/url" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" +import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" +import { + fetchOpenApiSchemaJson, + findCustomWorkflowPath, + setVariant, + transformVariant, +} from "@/oss/lib/shared/variant" +import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" import {AppTemplate} from "@/oss/lib/Types" -import {getOrgValues} from "@/oss/state/org" -import {getProjectValues} from "@/oss/state/project" -import {waitForValidURL} from "@/oss/state/url" //Prefix convention: // - fetch: GET single entity from server @@ -19,14 +22,15 @@ import {waitForValidURL} from "@/oss/state/url" // - delete: DELETE data from server export const fetchAllTemplates = async () => { - const {projectId} = getProjectValues() - const url = new URL(`${getAgentaApiUrl()}/containers/templates?project_id=${projectId}`) - const response = await fetchJson(url) - return response + const {projectId} = getCurrentProject() + const response = await axios.get( + `${getAgentaApiUrl()}/containers/templates?project_id=${projectId}`, + ) + return response.data } export async function deleteApp(appId: string) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() await axios.delete(`${getAgentaApiUrl()}/apps/${appId}?project_id=${projectId}`, { data: {app_id: appId}, @@ -53,18 +57,14 @@ export const createApp = async ({ templateKey: ServiceType }) => { const {selectedOrg} = getOrgValues() - const {projectId} = getProjectValues() - const url = new URL(`${getAgentaApiUrl()}/apps?project_id=${projectId}`) - const response = await fetchJson(url, { - method: "POST", - body: JSON.stringify({ - app_name: appName, - template_key: templateKey, - organization_id: selectedOrg?.id, - workspace_id: selectedOrg?.default_workspace.id, - }), + const {projectId} = getCurrentProject() + const response = await axios.post(`${getAgentaApiUrl()}/apps?project_id=${projectId}`, { + app_name: appName, + template_key: templateKey, + organization_id: selectedOrg?.id, + workspace_id: selectedOrg?.default_workspace.id, }) - return response + return response.data } export const createVariant = async ({ @@ -99,7 +99,7 @@ export const createVariant = async ({ throw new Error("Either serviceUrl or templateKey should be provided") } - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const endpoint = `${getAgentaApiUrl()}/apps/${appId}/variant/${ serviceUrl ? "from-service" : "from-template" @@ -129,7 +129,7 @@ export const updateVariant = async ( {serviceUrl, variantId}: {serviceUrl: string; variantId: string}, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.put( `${getAgentaApiUrl()}/variants/${variantId}/service?project_id=${projectId}`, { @@ -143,7 +143,7 @@ export const updateVariant = async ( } export const createAppFromTemplate = async (templateObj: AppTemplate, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( `${getAgentaApiUrl()}/apps/app_and_variant_from_template?project_id=${projectId}`, @@ -154,7 +154,7 @@ export const createAppFromTemplate = async (templateObj: AppTemplate, ignoreAxio } export const updateAppName = async (appId: string, appName: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.patch( `${getAgentaApiUrl()}/apps/${appId}?project_id=${projectId}`, @@ -184,46 +184,58 @@ export const createAndStartTemplate = async ({ appId?: string, ) => void }) => { - // Import the atom-based app creation system - const {getDefaultStore} = await import("jotai") - const {createAppMutationAtom} = await import("@/oss/components/Playground/state/atoms") - const store = getDefaultStore() - try { - // Use the atom-based app creation system - const result = await store.set(createAppMutationAtom, { - appName, - templateKey, - serviceUrl, - providerKey, - isCustomWorkflow, - onStatusChange, - }) - - const baseAppURL = (await waitForValidURL({requireApp: true}))?.baseAppURL - if (!result.success) { - // If the atom-based creation failed, propagate the error - onStatusChange?.("error", new Error(result.error || "App creation failed")) - } else if (result.appId && result.revisionId) { - await Router.push({ - pathname: `${baseAppURL}/${result.appId}/playground`, - query: { - revisions: buildRevisionsQueryParam([result.revisionId]), - }, + onStatusChange?.("creating_app") + let app + try { + app = await createApp({ + appName, + templateKey, }) - } else if (result.appId) { - // Navigate to the newly created app's playground using Next.js router - if (typeof window !== "undefined") { - try { - await Router.push(`${baseAppURL}/${result.appId}/playground`) - } catch (navigationError) { - console.error("❌ [createAndStartTemplate] Navigation failed:", navigationError) - // Don't fail the entire operation if navigation fails - } + let _variant + if (templateKey === ServiceType.Custom && serviceUrl) { + _variant = await createVariant({ + appId: app.app_id, + serviceUrl, + isCustomWorkflow, + }) + } else { + _variant = await createVariant({ + appId: app.app_id, + templateKey, + }) + } + const uri = await findCustomWorkflowPath(_variant.uri) + const {schema} = await fetchOpenApiSchemaJson(uri?.runtimePrefix) + + if (!schema) { + throw new Error("No schema found") + } + + // TODO: HANDLE NEW UPDATE -> NEW REVISION MOUNT + const variant = transformVariant(setVariant(_variant, uri), schema, _variant.appType) + + const parameters = transformToRequestBody({ + variant, + allMetadata: getAllMetadata(), + routePath: uri.routePath, + }) + await axios.put( + `/api/variants/${variant.id}/parameters?project_id=${getCurrentProject().projectId}`, + { + parameters: parameters.ag_config, + }, + ) + + onStatusChange?.("success", "", app?.app_id) + } catch (error: any) { + if (error?.response?.status === 400) { + onStatusChange?.("bad_request", error) + return } + throw error } } catch (error) { - // Fallback to original implementation if atom system fails - console.warn("Atom-based app creation failed, falling back to direct API:", error) + onStatusChange?.("error", error) } } diff --git a/web/oss/src/services/app-selector/hooks/useTemplates.ts b/web/oss/src/services/app-selector/hooks/useTemplates.ts index 3b441aae6d..25ca38e5f7 100644 --- a/web/oss/src/services/app-selector/hooks/useTemplates.ts +++ b/web/oss/src/services/app-selector/hooks/useTemplates.ts @@ -1,2 +1,35 @@ -// Re-export the new atom-based useTemplates hook -export {useTemplates as default} from "@/oss/state/app" +import {useState} from "react" + +import isEqual from "lodash/isEqual" +import useSWR, {SWRConfiguration} from "swr" + +import {getCurrentProject} from "@/oss/contexts/project.context" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" + +const useTemplates = (config?: SWRConfiguration) => { + const [noTemplateMessage, setNoTemplateMessage] = useState("") + const {projectId} = getCurrentProject() + + const swr = useSWR(`${getAgentaApiUrl()}/containers/templates?project_id=${projectId}`, { + ...config, + compare(a, b) { + if (!!a && !!b && a.length === b.length) { + return true + } else { + return isEqual(a, b) + } + }, + revalidateOnFocus: false, + revalidateOnReconnect: false, + revalidateIfStale: false, // Disable revalidation if data is stale + onSuccess: (data) => { + if (typeof data !== "object") { + setNoTemplateMessage(data) + } + }, + }) + + return [swr, noTemplateMessage] as const +} + +export default useTemplates diff --git a/web/oss/src/services/app/index.ts b/web/oss/src/services/app/index.ts deleted file mode 100644 index 0a36702939..0000000000 --- a/web/oss/src/services/app/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {ListAppsItem} from "@/oss/lib/Types" - -export const fetchAllApps = async (): Promise => { - try { - const response = await axios.get(`${getAgentaApiUrl()}/apps`) - return response.data - } catch (error) { - console.log("failed to fetch all apps", error) - return [] - } -} diff --git a/web/oss/src/services/deployment/api/index.ts b/web/oss/src/services/deployment/api/index.ts index 0278c5cccf..77a0bfc300 100644 --- a/web/oss/src/services/deployment/api/index.ts +++ b/web/oss/src/services/deployment/api/index.ts @@ -1,10 +1,8 @@ -import {getDefaultStore} from "jotai" - +import {getAppValues} from "@/oss/contexts/app.context" +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {fetchJson, getBaseUrl} from "@/oss/lib/api/assets/fetchClient" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import {Environment} from "@/oss/lib/Types" -import {selectedAppIdAtom} from "@/oss/state/app/selectors/app" -import {getProjectValues} from "@/oss/state/project" //Prefix convention: // - fetch: GET single entity from server @@ -15,39 +13,13 @@ import {getProjectValues} from "@/oss/state/project" export const fetchEnvironments = async (appId: string): Promise => { try { - // Test mode detection and URL construction - const testApiUrl = process.env.VITEST_TEST_API_URL - const testProjectId = process.env.VITEST_TEST_PROJECT_ID - const isTestMode = !!testApiUrl - - let base: string - let projectId: string | undefined - - if (isTestMode) { - base = testApiUrl - projectId = testProjectId - console.log("🧪 Test mode detected:", {testApiUrl, testProjectId}) - } else { - const projectValues = getProjectValues() - base = getBaseUrl() - projectId = projectValues.projectId - console.log("🏭 Production mode:", {base, projectId}) - } - - const urlString = `${base}/apps/${appId}/environments?project_id=${projectId}` - const url = new URL(urlString) - - console.log("🔍 Environments fetcher debug:", {base, urlString, isTestMode}) - console.log("🚀 Calling fetchJson with URL:", urlString) + const {projectId} = getCurrentProject() - const environments = await fetchJson(url) - - console.log("✅ Environments fetcher success:", {count: environments.length}) - console.log("📋 Fetched environments successfully:", environments.length) - - return environments + const response = await axios.get( + `${getAgentaApiUrl()}/apps/${appId}/environments?project_id=${projectId}`, + ) + return response.data } catch (error) { - console.error("❌ Environments fetcher error:", error) throw new Error("Failed to fetch environments") } } @@ -58,9 +30,9 @@ export const createPublishVariant = async (payload: { environment_name: string note?: string }) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const {note, revision_id, ..._payload} = payload - await axios.post(`/environments/deploy?project_id=${projectId}`, { + await axios.post(`${getAgentaApiUrl()}/environments/deploy?project_id=${projectId}`, { ..._payload, commit_message: note, }) @@ -73,17 +45,12 @@ export const createPublishRevision = async (payload: { revision_number?: number note?: string }) => { - const {projectId} = getProjectValues() - const store = getDefaultStore() - const applicationId = payload.application_id || store.get(selectedAppIdAtom) - - if (!applicationId) { - throw new Error("No application id available for publishRevision") - } + const {projectId} = getCurrentProject() + const {currentApp} = getAppValues() - await axios.post(`/variants/configs/deploy?project_id=${projectId}`, { + await axios.post(`${getAgentaApiUrl()}/variants/configs/deploy?project_id=${projectId}`, { application_ref: { - id: applicationId, + id: payload.application_id || currentApp?.app_id, version: null, slug: null, }, diff --git a/web/oss/src/services/deployment/hooks/useEnvironments/index.tsx b/web/oss/src/services/deployment/hooks/useEnvironments/index.tsx index 57b89af9bd..e199fc546a 100644 --- a/web/oss/src/services/deployment/hooks/useEnvironments/index.tsx +++ b/web/oss/src/services/deployment/hooks/useEnvironments/index.tsx @@ -1,35 +1,42 @@ -import deepEqual from "fast-deep-equal" -import {useAtomValue} from "jotai" -import {selectAtom} from "jotai/utils" - -import type {Environment} from "@/oss/lib/Types" -import { - environmentsAtom as _environmentsAtom, - environmentsLoadableAtom, -} from "@/oss/state/environment/atoms/fetcher" - -interface UseEnvironmentOptions { - // kept for backward-compatibility, currently unused +import {useMemo} from "react" + +import Router from "next/router" +import type {SWRConfiguration} from "swr" +import useSWR from "swr" + +import {getCurrentProject} from "@/oss/contexts/project.context" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" +import {Environment} from "@/oss/lib/Types" + +interface UseEnvironmentOptions extends SWRConfiguration { appId?: string } const DEFAULT_ENVIRONMENTS: Environment[] = [] -export const environmentsAtom = selectAtom( - _environmentsAtom, - (envs) => envs ?? DEFAULT_ENVIRONMENTS, - deepEqual, -) +export const useEnvironments = ({appId: propsAppId, ...rest}: UseEnvironmentOptions = {}) => { + const {projectId} = getCurrentProject() + const appId = propsAppId || (Router.query.app_id as string) + + const {data, error, mutate, isLoading} = useSWR( + appId && projectId + ? `${getAgentaApiUrl()}/apps/${appId}/environments?project_id=${projectId}` + : null, + { + ...rest, + revalidateOnFocus: false, + shouldRetryOnError: false, + }, + ) -export const useEnvironments = ({}: UseEnvironmentOptions = {}) => { - // atom selectors already scope to current app / project, so we can ignore appId here - const environments = useAtomValue(environmentsAtom) - const loadable = useAtomValue(environmentsLoadableAtom) as any + const environments = useMemo(() => { + return (data || DEFAULT_ENVIRONMENTS) as Environment[] + }, [data]) return { environments, - isEnvironmentsLoading: loadable.isLoading ?? loadable.isFetching, - isEnvironmentsLoadingError: loadable.isError ?? loadable.error, - mutate: loadable.refetch, + isEnvironmentsLoading: isLoading, + isEnvironmentsLoadingError: error, + mutate, } } diff --git a/web/oss/src/services/deploymentVersioning/api/index.ts b/web/oss/src/services/deploymentVersioning/api/index.ts index 4010458302..3b8395e9ec 100644 --- a/web/oss/src/services/deploymentVersioning/api/index.ts +++ b/web/oss/src/services/deploymentVersioning/api/index.ts @@ -1,7 +1,7 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import {DeploymentRevisionConfig, DeploymentRevisions} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" //Prefix convention: // - fetch: GET single entity from server @@ -15,7 +15,7 @@ export const fetchAllDeploymentRevisionConfig = async ( signal?: AbortSignal, ignoreAxiosError = true, ): Promise => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const {data} = await axios( `${getAgentaApiUrl()}/configs/deployment/${deploymentRevisionId}?project_id=${projectId}`, @@ -30,7 +30,7 @@ export const fetchAllDeploymentRevisions = async ( environmentName: string, ignoreAxiosError = false, ): Promise => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const {data} = await axios.get( `${getAgentaApiUrl()}/apps/${appId}/revisions/${environmentName}?project_id=${projectId}`, @@ -45,7 +45,7 @@ export const createRevertDeploymentRevision = async ( deploymentRevisionId: string, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( `${getAgentaApiUrl()}/configs/deployment/${deploymentRevisionId}/revert?project_id=${projectId}`, diff --git a/web/oss/src/services/evaluationRuns/api/index.ts b/web/oss/src/services/evaluationRuns/api/index.ts deleted file mode 100644 index cbdf93e9ef..0000000000 --- a/web/oss/src/services/evaluationRuns/api/index.ts +++ /dev/null @@ -1,332 +0,0 @@ -import {getDefaultStore} from "jotai" - -import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {extractInputKeysFromSchema} from "@/oss/lib/shared/variant/inputHelpers" -import {getRequestSchema} from "@/oss/lib/shared/variant/openapiUtils" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {slugify} from "@/oss/lib/utils/slugify" -import {getAppValues} from "@/oss/state/app" -import {stablePromptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import {appSchemaAtom, appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" - -import {CreateEvaluationRunInput, Testset} from "./types" - -const extractColumnsFromTestset = (testset?: Testset): string[] => { - if (!testset) return [] - - const columns = new Set() - - const addColumnsFromObject = (obj?: Record) => { - if (!obj || typeof obj !== "object") return - Object.keys(obj).forEach((key) => { - if (!key || typeof key !== "string") return - if (key.startsWith("__")) return - columns.add(key) - }) - } - - const csvRows = (testset as any)?.csvdata - if (Array.isArray(csvRows) && csvRows.length > 0) { - addColumnsFromObject(csvRows[0] as Record) - } - - const data = (testset as any)?.data - if (data) { - const testcases = data.testcases || data.testcases - if (Array.isArray(testcases) && testcases.length > 0) { - addColumnsFromObject( - (testcases[0] && (testcases[0].data || testcases[0])) as Record, - ) - } - - const columnsList = data.columns || data.columnNames - if (Array.isArray(columnsList)) { - columnsList.forEach((col: any) => { - if (typeof col === "string" && col && !col.startsWith("__")) { - columns.add(col) - } - }) - } - } - - return Array.from(columns) -} - -/** - * Constructs the input step for a given testset, pulling variantId and revisionId - * directly from the testset object. Any undefined reference keys are omitted. - */ - -const buildInputStep = (testset?: Testset) => { - if (!testset) return - const inputKey = slugify(testset.name ?? (testset as any).slug ?? "testset", testset.id) - if (!testset) { - return - } - - const references: Record = { - testset: {id: testset.id}, - } - - // TODO: after new testsets - // if (testset.variantId) { - // references.testset_variant = {id: testset.variantId} - // } - // if (testset.revisionId) { - // references.testset_revision = {id: testset.revisionId} - // } - - return { - key: inputKey, - type: "input", - origin: "auto", - references, - } -} - -/** - * Constructs the invocation step for a given revision. - * Only includes reference keys if their IDs are defined. - */ -const buildInvocationStep = (revision: EnhancedVariant, inputKey: string) => { - const invocationKey = slugify( - (revision as any).name ?? (revision as any).variantName ?? "invocation", - revision.id, - ) - const references: Record = {} - - const {currentApp} = getAppValues() - const appId = currentApp?.app_id as string - references.application = {id: appId} - - if (revision.variantId !== undefined) { - references.application_variant = {id: revision.variantId} - } - if (revision.id !== undefined) { - references.application_revision = {id: revision.id} - } - return { - key: invocationKey, - type: "invocation", - origin: "human", - references, - inputs: [{key: inputKey}], - } -} - -/** - * Constructs annotation steps for all evaluators. - * Uses each evaluator's slug and id for references. - */ -const buildAnnotationStepsFromEvaluators = ( - evaluators: EvaluatorDto[] | undefined, - inputKey: string, - invocationKey: string, -) => { - if (!evaluators) return [] - return evaluators.map((evaluator) => { - const references: Record = {} - if (evaluator.slug !== undefined) { - references.evaluator = {id: evaluator.id} - } - - // TODO: Enable when we have this information - // if (evaluator.id !== undefined) { - // references.evaluator_variant = {id: evaluator.id} - // } - return { - key: `${invocationKey}.${evaluator.slug}`, - references, - type: "annotation", - origin: "human", - inputs: [{key: inputKey}, {key: invocationKey}], - } - }) -} - -/** - * Constructs the array of mappings for extracting data from steps. - * Uses the revision's inputParams to generate "input" mappings automatically. - * - * @param revision - The EnhancedVariant object containing inputParams. - * @param correctAnswerColumn - The property name in the input step for ground truth. - * @param evaluators - Optional list of evaluators to generate evaluator mappings. - * @param testset - The testset object to conditionally add mappings based on variantId and revisionId. - * @returns An array of mapping objects. - */ -const buildMappings = ( - revision: EnhancedVariant, - correctAnswerColumn: string, - evaluators: EvaluatorDto[] | undefined, - testset?: Testset, -) => { - const testsetKey = testset - ? slugify(testset.name ?? (testset as any).slug ?? "testset", testset.id) - : "input" - const invocationKey = slugify( - (revision as any).name ?? - (revision as any).variantName ?? - ((revision as any)._parentVariant as any)?.variantName ?? - "invocation", - revision.id, - ) - const mappings: { - column: {kind: "testset" | "invocation" | "evaluator"; name: string} - step: {key: string; path: string} - }[] = [] - const pushedTestsetColumns = new Set() - - // Generate input mappings aligned with Playground (schema + initial prompt vars for custom; prompt tokens for non-custom) - { - const store = getDefaultStore() - const flags = store.get(variantFlagsAtomFamily({revisionId: revision.id})) as any - const isCustom = Boolean(flags?.isCustom) - const spec = store.get(appSchemaAtom) as any - const routePath = store.get(appUriInfoAtom)?.routePath || "" - - let variableNames: string[] = [] - if (isCustom) { - // Custom workflows: strictly use schema-defined input keys - variableNames = spec ? extractInputKeysFromSchema(spec as any, routePath) : [] - } else { - // Non-custom: use stable variables from saved parameters (ignore live prompt edits) - variableNames = store.get(stablePromptVariablesAtomFamily(revision.id)) || [] - } - - variableNames.forEach((name) => { - if (!name || typeof name !== "string") return - pushedTestsetColumns.add(name) - mappings.push({ - column: {kind: "testset", name}, - step: {key: testsetKey, path: `data.${name}`}, - }) - }) - - const req = spec ? (getRequestSchema as any)(spec, {routePath}) : undefined - if (req?.properties?.messages && !pushedTestsetColumns.has("messages")) { - pushedTestsetColumns.add("messages") - mappings.push({ - column: {kind: "testset", name: "messages"}, - step: {key: testsetKey, path: "data.messages"}, - }) - } - } - - if (testset && pushedTestsetColumns.size === 0) { - const normalizedCorrectAnswer = (correctAnswerColumn || "") - .replace(/[\W_]/g, "") - .toLowerCase() - const derivedColumns = extractColumnsFromTestset(testset) - derivedColumns.forEach((name) => { - if (!name || typeof name !== "string") return - const normalized = name.trim() - if (!normalized || normalized.startsWith("__")) return - const normalizedSafe = normalized.replace(/[\W_]/g, "").toLowerCase() - if (normalizedSafe === normalizedCorrectAnswer) return - if (normalizedSafe.includes("correctanswer")) return - if (normalizedSafe.startsWith("testcase") || normalizedSafe.includes("dedup")) return - if (pushedTestsetColumns.has(name) || pushedTestsetColumns.has(normalizedSafe)) return - pushedTestsetColumns.add(name) - pushedTestsetColumns.add(normalizedSafe) - mappings.push({ - column: {kind: "testset", name}, - step: {key: testsetKey, path: `data.${name}`}, - }) - }) - } - - // Application output mapping should use canonical column name "outputs" to align with backend - mappings.push({ - column: {kind: "invocation", name: "outputs"}, - step: {key: invocationKey, path: "attributes.ag.data.outputs"}, - }) - - // Add mappings for testset variantId and revisionId if available - // Additional metadata mappings if available - if (testset?.variantId !== undefined) { - mappings.push({ - column: {kind: "testset", name: "testset_variant_id"}, - step: {key: testsetKey, path: "data.variantId"}, - }) - } - if (testset?.revisionId !== undefined) { - mappings.push({ - column: {kind: "testset", name: "testset_revision_id"}, - step: {key: testsetKey, path: "data.revisionId"}, - }) - } - - // Evaluator output mappings generated dynamically per evaluator - if (evaluators && evaluators.length > 0) { - evaluators?.forEach((evaluator) => { - const metrics = getMetricsFromEvaluator(evaluator) - Object.keys(metrics).forEach((key) => { - mappings.push({ - column: {kind: "evaluator", name: `${evaluator.slug}.${key}`}, - step: {key: `${invocationKey}.${evaluator.slug}`, path: `data.outputs.${key}`}, - }) - }) - }) - } - - return mappings -} - -/** - * Builds the payload required for submitting multiple evaluation runs to the backend. - * Each revision will be wrapped in its own run configuration. - * This function returns an object with a `runs` array that can be sent to - * the POST `/preview/evaluations/runs/` endpoint. - * - * @param name - Base name used in each run - * @param testset - The testset being used in this evaluation (must include variantId & revisionId). - * @param revisions - List of enhanced variant revisions; one run will be generated per revision. - * @param evaluators - List of available evaluators used in annotation. - * @param correctAnswerColumn - The property name in the input step that holds the ground truth value. - * @param meta - Optional metadata object to attach to each run. - * @returns Object containing `runs` array, ready to be POSTed to the backend. - */ -export const createEvaluationRunConfig = ({ - name, - testset, - revisions, - evaluators, - correctAnswerColumn, - meta = {}, // Default to empty object if not provided -}: CreateEvaluationRunInput) => { - // Pre-build the input step (which now includes variantId & revisionId) and mappings - const inputStep = buildInputStep(testset) - const inputKey = slugify(testset?.name ?? (testset as any)?.slug ?? "testset", testset!.id) - const invocationKeysCache: Record = {} - - // Create one run configuration per revision - const runs = revisions.map((revision) => { - const invocationKey = - invocationKeysCache[revision.id] ?? - slugify( - (revision as any).name ?? (revision as any).variantName ?? "invocation", - revision.id, - ) - - invocationKeysCache[revision.id] = invocationKey - - const steps = [ - inputStep, - buildInvocationStep(revision, inputKey), - ...buildAnnotationStepsFromEvaluators(evaluators, inputKey, invocationKey), - ] - // Build mappings for this revision, passing testset as well - const mappings = buildMappings(revision, correctAnswerColumn, evaluators, testset) - return { - key: `evaluation-${revision.variantId}`, - name: `${name}`, - description: "auto-generated evaluation run", - meta, // Include the passed-in meta object - data: {steps, mappings}, - } - }) - - return {runs} -} diff --git a/web/oss/src/services/evaluationRuns/api/types.ts b/web/oss/src/services/evaluationRuns/api/types.ts deleted file mode 100644 index 3a91b09033..0000000000 --- a/web/oss/src/services/evaluationRuns/api/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {EvaluatorDto} from "@/oss/lib/hooks/useEvaluators/types" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import type {Testset as BaseTestset} from "@/oss/lib/Types" - -// Extend the base Testset to include optional variantId and revisionId -export interface Testset extends BaseTestset { - variantId?: string - revisionId?: string -} - -export interface CreateEvaluationRunInput { - name: string - testset: Testset | testset | undefined - revisions: EnhancedVariant[] - evaluators?: EvaluatorDto[] - correctAnswerColumn: string - meta?: Record // Optional meta object to include in each run -} diff --git a/web/oss/src/services/evaluations/api/index.ts b/web/oss/src/services/evaluations/api/index.ts index 82bbf8be4d..62af150f3f 100644 --- a/web/oss/src/services/evaluations/api/index.ts +++ b/web/oss/src/services/evaluations/api/index.ts @@ -1,187 +1,30 @@ import uniqBy from "lodash/uniqBy" import {v4 as uuidv4} from "uuid" +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getTagColors} from "@/oss/lib/helpers/colors" -import {calcEvalDuration} from "@/oss/lib/helpers/evaluate" -import {assertValidId, isValidId} from "@/oss/lib/helpers/serviceValidations" -import {isDemo, stringToNumberInRange} from "@/oss/lib/helpers/utils" import { ComparisonResultRow, EvaluationStatus, - Evaluator, - EvaluatorConfig, KeyValuePair, LLMRunRateLimit, - Testset, + TestSet, _Evaluation, _EvaluationScenario, } from "@/oss/lib/Types" -import aiImg from "@/oss/media/artificial-intelligence.png" -import bracketCurlyImg from "@/oss/media/bracket-curly.png" -import codeImg from "@/oss/media/browser.png" -import webhookImg from "@/oss/media/link.png" -import regexImg from "@/oss/media/programming.png" -import exactMatchImg from "@/oss/media/target.png" -import similarityImg from "@/oss/media/transparency.png" import {fetchTestset} from "@/oss/services/testsets/api" -import {getProjectValues} from "@/oss/state/project" - -//Prefix convention: -// - fetch: GET single entity from server -// - fetchAll: GET all entities from server -// - create: POST data to server -// - update: PUT data to server -// - delete: DELETE data from server - -const evaluatorIconsMap = { - auto_exact_match: exactMatchImg, - auto_similarity_match: similarityImg, - auto_regex_test: regexImg, - field_match_test: exactMatchImg, - auto_webhook_test: webhookImg, - auto_ai_critique: aiImg, - auto_custom_code_run: codeImg, - auto_json_diff: bracketCurlyImg, - auto_semantic_similarity: similarityImg, - auto_contains_json: bracketCurlyImg, - rag_faithfulness: codeImg, - rag_context_relevancy: codeImg, -} - -//Evaluators -// export const fetchAllEvaluators = async () => { -// const tagColors = getTagColors() -// const {projectId} = getProjectValues() - -// const response = await axios.get(`/evaluators?project_id=${projectId}`) -// const evaluators = (response.data || []) -// .filter((item: Evaluator) => !item.key.startsWith("human")) -// .filter((item: Evaluator) => isDemo() || item.oss) -// .map((item: Evaluator) => ({ -// ...item, -// icon_url: evaluatorIconsMap[item.key as keyof typeof evaluatorIconsMap], -// color: tagColors[stringToNumberInRange(item.key, 0, tagColors.length - 1)], -// })) as Evaluator[] - -// return evaluators -// } - -// Evaluator Configs -export const fetchAllEvaluatorConfigs = async ( - appId?: string | null, - projectIdOverride?: string | null, -) => { - const tagColors = getTagColors() - const {projectId: projectIdFromStore} = getProjectValues() - const projectId = projectIdOverride ?? projectIdFromStore - - if (!projectId) { - return [] as EvaluatorConfig[] - } - - const response = await axios.get("/evaluators/configs", { - params: { - project_id: projectId, - ...(appId ? {app_id: appId} : {}), - }, - }) - const evaluatorConfigs = (response.data || []).map((item: EvaluatorConfig) => ({ - ...item, - icon_url: evaluatorIconsMap[item.evaluator_key as keyof typeof evaluatorIconsMap], - color: tagColors[stringToNumberInRange(item.evaluator_key, 0, tagColors.length - 1)], - })) as EvaluatorConfig[] - return evaluatorConfigs -} - -export type CreateEvaluationConfigData = Omit -export const createEvaluatorConfig = async ( - appId: string | null | undefined, - config: CreateEvaluationConfigData, -) => { - const {projectId} = getProjectValues() - void appId - - return axios.post(`/evaluators/configs?project_id=${projectId}`, { - ...config, - }) -} - -export const updateEvaluatorConfig = async ( - configId: string, - config: Partial, -) => { - const {projectId} = getProjectValues() - - return axios.put(`/evaluators/configs/${configId}?project_id=${projectId}`, config) -} - -export const deleteEvaluatorConfig = async (configId: string) => { - const {projectId} = getProjectValues() - - return axios.delete(`/evaluators/configs/${configId}?project_id=${projectId}`) -} - -// Evaluations -const evaluationTransformer = (item: any) => ({ - id: item.id, - appId: item.app_id, - created_at: item.created_at, - updated_at: item.updated_at, - duration: calcEvalDuration(item), - status: item.status, - testset: { - id: item.testset_id, - name: item.testset_name, - }, - user: { - id: item.user_id, - username: item.user_username, - }, - variants: item.variant_ids.map((id: string, ix: number) => ({ - variantId: id, - variantName: item.variant_names[ix], - })), - aggregated_results: item.aggregated_results || [], - revisions: item.revisions, - variant_revision_ids: item.variant_revision_ids, - variant_ids: item.variant_ids, - average_cost: item.average_cost, - total_cost: item.total_cost, - average_latency: item.average_latency, -}) -export const fetchAllEvaluations = async (appId: string) => { - const {projectId} = getProjectValues() - - const response = await axios.get(`/evaluations?project_id=${projectId}`, { - params: {app_id: appId}, - }) - return response.data.map(evaluationTransformer) as _Evaluation[] -} export const fetchEvaluation = async (evaluationId: string) => { - if (!isValidId(evaluationId)) { - throw new Error("Invalid evaluationId parameter") - } - const {projectId} = getProjectValues() - const id = assertValidId(evaluationId) + const {projectId} = getCurrentProject() - const response = await axios.get(`/evaluations/${encodeURIComponent(id)}`, { - params: {project_id: projectId}, - }) + const response = await axios.get(`/evaluations/${evaluationId}?project_id=${projectId}`) return evaluationTransformer(response.data) as _Evaluation } export const fetchEvaluationStatus = async (evaluationId: string) => { - if (!isValidId(evaluationId)) { - throw new Error("Invalid evaluationId parameter") - } - const {projectId} = getProjectValues() - const id = assertValidId(evaluationId) + const {projectId} = getCurrentProject() - const response = await axios.get(`/evaluations/${encodeURIComponent(id)}/status`, { - params: {project_id: projectId}, - }) + const response = await axios.get(`/evaluations/${evaluationId}/status?project_id=${projectId}`) return response.data as {status: _Evaluation["status"]} } @@ -201,21 +44,20 @@ export type CreateEvaluationData = rate_limit: LLMRunRateLimit lm_providers_keys?: KeyValuePair correct_answer_column: string - name: string } export const createEvaluation = async (appId: string, evaluation: CreateEvaluationData) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() // TODO: new AUTO-EVAL trigger - return await axios.post(`/evaluations/preview/start?project_id=${projectId}`, { - ...evaluation, - app_id: appId, - }) - // return await axios.post(`/evaluations?project_id=${projectId}`, {...evaluation, app_id: appId}) + // axios.post(`/api/evaluations/preview/start?project_id=${projectId}`, { + // ...evaluation, + // app_id: appId, + // }) + return axios.post(`/evaluations?project_id=${projectId}`, {...evaluation, app_id: appId}) } export const deleteEvaluations = async (evaluationsIds: string[]) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.delete(`/evaluations?project_id=${projectId}`, { data: {evaluations_ids: evaluationsIds}, @@ -224,17 +66,11 @@ export const deleteEvaluations = async (evaluationsIds: string[]) => { // Evaluation Scenarios export const fetchAllEvaluationScenarios = async (evaluationId: string) => { - if (!isValidId(evaluationId)) { - throw new Error("Invalid evaluationId parameter") - } - const {projectId} = getProjectValues() - const id = assertValidId(evaluationId) + const {projectId} = getCurrentProject() const [{data: evaluationScenarios}, evaluation] = await Promise.all([ - axios.get(`/evaluations/${encodeURIComponent(id)}/evaluation_scenarios`, { - params: {project_id: projectId}, - }), - fetchEvaluation(id), + axios.get(`/evaluations/${evaluationId}/evaluation_scenarios?project_id=${projectId}`), + fetchEvaluation(evaluationId), ]) evaluationScenarios.forEach((scenario: _EvaluationScenario) => { @@ -250,7 +86,7 @@ export const updateScenarioStatus = async ( scenario: _EvaluationScenario, status: EvaluationStatus, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.patch(`/preview/evaluations/scenarios/?project_id=${projectId}`, { scenarios: [{...scenario, status}], }) @@ -258,13 +94,8 @@ export const updateScenarioStatus = async ( // Comparison export const fetchAllComparisonResults = async (evaluationIds: string[]) => { - // Defensive check: Only accept valid UUIDs - const validIds = evaluationIds.filter((id) => isValidId(id)) - if (validIds.length === 0) { - throw new Error("No valid evaluation IDs provided") - } - const scenarioGroups = await Promise.all(validIds.map(fetchAllEvaluationScenarios)) - const testset: Testset = await fetchTestset(scenarioGroups[0][0].evaluation?.testset?.id) + const scenarioGroups = await Promise.all(evaluationIds.map(fetchAllEvaluationScenarios)) + const testset: TestSet = await fetchTestset(scenarioGroups[0][0].evaluation?.testset?.id) const inputsNameSet = new Set() scenarioGroups.forEach((group) => { @@ -341,7 +172,7 @@ export const fetchEvaluatonIdsByResource = async ({ resourceIds: string[] resourceType: "testset" | "evaluator_config" | "variant" }) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.get(`/evaluations/by_resource?project_id=${projectId}`, { params: {resource_ids: resourceIds, resource_type: resourceType}, diff --git a/web/oss/src/services/evaluations/api_ee/index.ts b/web/oss/src/services/evaluations/api_ee/index.ts deleted file mode 100644 index cab7fe809b..0000000000 --- a/web/oss/src/services/evaluations/api_ee/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {getProjectValues} from "@/oss/state/project" - -//Prefix convention: -// - fetch: GET single entity from server -// - fetchAll: GET all entities from server -// - create: POST data to server -// - update: PUT data to server -// - delete: DELETE data from server - -import { - EvaluatorInputInterface, - EvaluatorMappingInput, - EvaluatorMappingOutput, - EvaluatorOutputInterface, -} from "@agenta/oss/src/lib/types_ee" - -export const createEvaluatorDataMapping = async ( - config: EvaluatorMappingInput, -): Promise => { - const {projectId} = getProjectValues() - - const response = await axios.post( - `${getAgentaApiUrl()}/evaluators/map?project_id=${projectId}`, - {...config}, - ) - return response.data -} - -export const createEvaluatorRunExecution = async ( - evaluatorKey: string, - config: EvaluatorInputInterface, -): Promise => { - const {projectId} = getProjectValues() - - const response = await axios.post( - `${getAgentaApiUrl()}/evaluators/${evaluatorKey}/run?project_id=${projectId}`, - { - ...config, - }, - ) - return response.data -} diff --git a/web/oss/src/services/evaluations/workerUtils.ts b/web/oss/src/services/evaluations/workerUtils.ts deleted file mode 100644 index f48a2cba9e..0000000000 --- a/web/oss/src/services/evaluations/workerUtils.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {EvaluationStatus} from "@/oss/lib/Types" - -/** - * Update scenario status from a WebWorker / non-axios context. - */ -export async function updateScenarioStatusRemote( - apiUrl: string, - jwt: string, - scenarioId: string, - status: EvaluationStatus, - projectId: string, - runId?: string, -): Promise { - try { - // 1. Query results to validate scenario context (scenarios GET is deprecated) - const res = await fetch( - `${apiUrl}/preview/evaluations/results/query?project_id=${projectId}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify({ - result: { - scenario_ids: [scenarioId], - ...(runId ? {run_ids: [runId]} : {}), - }, - windowing: {}, - }), - }, - ) - let scenarioFull: any | null = null - if (res.ok) { - // We no longer rely on the scenario payload; server requires id for PATCH - // Keep minimal object; if server returns extra data in future, parse here - scenarioFull = {id: scenarioId} - } - if (!scenarioFull) scenarioFull = {id: scenarioId} - scenarioFull.status = status - await fetch(`${apiUrl}/preview/evaluations/scenarios/?project_id=${projectId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify({scenarios: [scenarioFull]}), - }) - } catch { - /* swallow */ - } -} - -/** - * Upsert (create or update) a generic scenario step. Can be used for invocation or annotation steps. - */ -export async function upsertScenarioStep(params: { - apiUrl: string - jwt: string - runId: string - scenarioId: string - status: EvaluationStatus - projectId: string - key: string - traceId?: string | null - spanId?: string | null - references?: Record -}): Promise { - const { - apiUrl, - jwt, - runId, - scenarioId, - status, - projectId, - key, - traceId, - spanId, - references = {}, - } = params - try { - const res = await fetch( - `${apiUrl}/preview/evaluations/results/query?project_id=${projectId}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify({ - result: { - run_ids: [runId], - scenario_ids: [scenarioId], - step_keys: [key], - }, - windowing: {}, - }), - }, - ) - if (res.ok) { - const data = await res.json() - const list = Array.isArray(data.results) - ? data.results - : Array.isArray(data.steps) - ? data.steps - : [] - const existing = list.find((s: any) => s.step_key === key || s.stepKey === key) - if (existing) { - const updated = { - ...existing, - status, - trace_id: traceId, - span_id: spanId, - references: {...((existing as any)?.references || {}), ...references}, - } - await fetch(`${apiUrl}/preview/evaluations/results/?project_id=${projectId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - // API expects bulk-style body: { results: [ { id, ...fields } ] } - body: JSON.stringify({results: [updated]}), - }) - return - } - } - } catch { - /* fallthrough to creation */ - } - - const body = { - results: [ - { - status, - step_key: key, - trace_id: traceId, - span_id: spanId, - scenario_id: scenarioId, - run_id: runId, - references, - }, - ], - } - try { - await fetch(`${apiUrl}/preview/evaluations/results/?project_id=${projectId}`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify(body), - }) - } catch { - /* ignore */ - } -} diff --git a/web/oss/src/services/evaluators/index.ts b/web/oss/src/services/evaluators/index.ts index d7fee39243..2f705d3def 100644 --- a/web/oss/src/services/evaluators/index.ts +++ b/web/oss/src/services/evaluators/index.ts @@ -1,6 +1,7 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" import {getTagColors} from "@/oss/lib/helpers/colors" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import {isDemo, stringToNumberInRange} from "@/oss/lib/helpers/utils" import {EvaluatorResponseDto} from "@/oss/lib/hooks/useEvaluators/types" import {Evaluator, EvaluatorConfig} from "@/oss/lib/Types" @@ -11,12 +12,11 @@ import webhookImg from "@/oss/media/link.png" import regexImg from "@/oss/media/programming.png" import exactMatchImg from "@/oss/media/target.png" import similarityImg from "@/oss/media/transparency.png" -import {getProjectValues} from "@/oss/state/project" //Prefix convention: // - create: POST data to server export const createEvaluator = async (evaluatorPayload: EvaluatorResponseDto<"payload">) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() try { const data = await axios.post( @@ -30,38 +30,6 @@ export const createEvaluator = async (evaluatorPayload: EvaluatorResponseDto<"pa } } -export const updateEvaluator = async ( - evaluatorId: string, - evaluatorPayload: EvaluatorResponseDto<"payload">, -) => { - const {projectId} = getProjectValues() - - try { - const data = await axios.put( - `${getAgentaApiUrl()}/preview/simple/evaluators/${evaluatorId}?project_id=${projectId}`, - evaluatorPayload, - ) - - return data - } catch (error) { - throw error - } -} - -export const fetchEvaluatorById = async (evaluatorId: string) => { - const {projectId} = getProjectValues() - if (!projectId) { - return null - } - - const response = await axios.get( - `${getAgentaApiUrl()}/preview/simple/evaluators/${evaluatorId}?project_id=${projectId}`, - ) - const payload = (response?.data as any)?.evaluator ?? response?.data ?? null - if (!payload) return null - return payload as EvaluatorResponseDto<"response">["evaluator"] -} - const evaluatorIconsMap = { auto_exact_match: exactMatchImg, auto_similarity_match: similarityImg, @@ -80,7 +48,7 @@ const evaluatorIconsMap = { //Evaluators export const fetchAllEvaluators = async () => { const tagColors = getTagColors() - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.get(`/evaluators?project_id=${projectId}`) const evaluators = (response.data || []) @@ -96,23 +64,12 @@ export const fetchAllEvaluators = async () => { } // Evaluator Configs -export const fetchAllEvaluatorConfigs = async ( - appId?: string | null, - projectIdOverride?: string | null, -) => { +export const fetchAllEvaluatorConfigs = async (appId: string) => { const tagColors = getTagColors() - const {projectId: projectIdFromStore} = getProjectValues() - const projectId = projectIdOverride ?? projectIdFromStore + const {projectId} = getCurrentProject() - if (!projectId) { - return [] as EvaluatorConfig[] - } - - const response = await axios.get("/evaluators/configs", { - params: { - project_id: projectId, - ...(appId ? {app_id: appId} : {}), - }, + const response = await axios.get(`/evaluators/configs?project_id=${projectId}`, { + params: {app_id: appId}, }) const evaluatorConfigs = (response.data || []).map((item: EvaluatorConfig) => ({ ...item, @@ -123,15 +80,12 @@ export const fetchAllEvaluatorConfigs = async ( } export type CreateEvaluationConfigData = Omit -export const createEvaluatorConfig = async ( - _appId: string | null | undefined, - config: CreateEvaluationConfigData, -) => { - const {projectId} = getProjectValues() - void _appId +export const createEvaluatorConfig = async (appId: string, config: CreateEvaluationConfigData) => { + const {projectId} = getCurrentProject() return axios.post(`/evaluators/configs?project_id=${projectId}`, { ...config, + app_id: appId, }) } @@ -139,21 +93,13 @@ export const updateEvaluatorConfig = async ( configId: string, config: Partial, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.put(`/evaluators/configs/${configId}?project_id=${projectId}`, config) } export const deleteEvaluatorConfig = async (configId: string) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.delete(`/evaluators/configs/${configId}?project_id=${projectId}`) } - -export const deleteHumanEvaluator = async (evaluatorId: string) => { - const {projectId} = getProjectValues() - - return axios.post( - `${getAgentaApiUrl()}/preview/simple/evaluators/${evaluatorId}/archive?project_id=${projectId}`, - ) -} diff --git a/web/oss/src/services/human-evaluations/api/index.ts b/web/oss/src/services/human-evaluations/api/index.ts deleted file mode 100644 index e7df71b25c..0000000000 --- a/web/oss/src/services/human-evaluations/api/index.ts +++ /dev/null @@ -1,353 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {EvaluationFlow, EvaluationType} from "@/oss/lib/enums" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {assertValidId} from "@/oss/lib/helpers/serviceValidations" -import { - abTestingEvaluationTransformer, - fromEvaluationResponseToEvaluation, - fromEvaluationScenarioResponseToEvaluationScenario, - singleModelTestEvaluationTransformer, -} from "@/oss/lib/transformers" -import { - EvaluationResponseType, - Evaluation, - GenericObject, - CreateCustomEvaluation, - ExecuteCustomEvalCode, - AICritiqueCreate, -} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" - -//Prefix convention: -// - fetch: GET single entity from server -// - fetchAll: GET all entities from server -// - create: POST data to server -// - update: PUT data to server -// - delete: DELETE data from server - -export const fetchAllLoadEvaluations = async ( - appId: string, - projectId: string, - ignoreAxiosError = false, -) => { - const app = assertValidId(appId, "appId") - const project = assertValidId(projectId, "projectId") - - const response = await axios.get(`${getAgentaApiUrl()}/human-evaluations`, { - params: {project_id: project, app_id: app}, - _ignoreError: ignoreAxiosError, - } as any) - return response.data -} - -export const fetchLoadEvaluation = async (evaluationId: string) => { - const {projectId} = getProjectValues() - const id = assertValidId(evaluationId, "evaluationId") - const project = assertValidId(projectId, "projectId") - try { - return await axios - .get(`${getAgentaApiUrl()}/human-evaluations/${encodeURIComponent(id)}`, { - params: {project_id: project}, - }) - .then((responseData) => { - return fromEvaluationResponseToEvaluation(responseData.data) - }) - } catch (error) { - if (axios.isCancel?.(error) || (error as any)?.code === "ERR_CANCELED") { - return null - } - console.error(`Error fetching evaluation ${id}:`, error) - return null - } -} - -export const deleteEvaluations = async (ids: string[]) => { - const {projectId} = getProjectValues() - const project = assertValidId(projectId, "projectId") - - const response = await axios({ - method: "delete", - url: `${getAgentaApiUrl()}/human-evaluations`, - params: {project_id: project}, - data: {evaluations_ids: ids}, - }) - return response.data -} - -export const fetchAllLoadEvaluationsScenarios = async ( - evaluationTableId: string, - evaluation: Evaluation, -) => { - const {projectId} = getProjectValues() - const tableId = assertValidId(evaluationTableId, "evaluationTableId") - const project = assertValidId(projectId, "projectId") - - return await axios - .get( - `${getAgentaApiUrl()}/human-evaluations/${encodeURIComponent( - tableId, - )}/evaluation_scenarios`, - {params: {project_id: project}}, - ) - .then((responseData) => { - const evaluationsRows = responseData.data.map((item: any) => { - return fromEvaluationScenarioResponseToEvaluationScenario(item, evaluation) - }) - - return evaluationsRows - }) -} - -export const createNewEvaluation = async ( - { - appId, - variant_ids, - evaluationType, - evaluationTypeSettings, - inputs, - llmAppPromptTemplate, - selectedCustomEvaluationID, - testsetId, - }: { - appId: string - variant_ids: string[] - evaluationType: string - evaluationTypeSettings: Partial - inputs: string[] - llmAppPromptTemplate?: string - selectedCustomEvaluationID?: string - testsetId: string - }, - ignoreAxiosError = false, -) => { - const app = assertValidId(appId, "appId") - const testset = assertValidId(testsetId, "testsetId") - const customId = selectedCustomEvaluationID - ? assertValidId(selectedCustomEvaluationID, "customEvaluationId") - : undefined - - const data = { - variant_ids, - inputs: inputs, - app_id: appId, - evaluation_type: evaluationType, - evaluation_type_settings: { - ...evaluationTypeSettings, - custom_code_evaluation_id: customId, - llm_app_prompt_template: llmAppPromptTemplate, - }, - testset_id: testset, - status: EvaluationFlow.EVALUATION_INITIALIZED, - } - - const {projectId} = getProjectValues() - const project = assertValidId(projectId, "projectId") - - const response = await axios.post(`${getAgentaApiUrl()}/human-evaluations`, data, { - params: {project_id: project}, - _ignoreError: ignoreAxiosError, - } as any) - return response.data.id -} - -export const updateEvaluation = async (evaluationId: string, data: GenericObject) => { - const {projectId} = getProjectValues() - const id = assertValidId(evaluationId, "evaluationId") - const project = assertValidId(projectId, "projectId") - - const response = await axios.put( - `${getAgentaApiUrl()}/human-evaluations/${encodeURIComponent(id)}`, - data, - {params: {project_id: project}}, - ) - return response.data -} - -export const updateEvaluationScenario = async ( - evaluationTableId: string, - evaluationScenarioId: string, - data: GenericObject, - evaluationType: EvaluationType, -) => { - const {projectId} = getProjectValues() - const tableId = assertValidId(evaluationTableId, "evaluationTableId") - const scenarioId = assertValidId(evaluationScenarioId, "evaluationScenarioId") - const project = assertValidId(projectId, "projectId") - - const response = await axios.put( - `${getAgentaApiUrl()}/human-evaluations/${encodeURIComponent( - tableId, - )}/evaluation_scenario/${encodeURIComponent(scenarioId)}/${encodeURIComponent( - evaluationType, - )}`, - data, - {params: {project_id: project}}, - ) - return response.data -} - -export const createEvaluationScenario = async (evaluationTableId: string, data: GenericObject) => { - const {projectId} = getProjectValues() - const tableId = assertValidId(evaluationTableId, "evaluationTableId") - const project = assertValidId(projectId, "projectId") - - const response = await axios.post( - `${getAgentaApiUrl()}/human-evaluations/${encodeURIComponent(tableId)}/evaluation_scenario`, - data, - {params: {project_id: project}}, - ) - return response.data -} - -export const createEvaluateAICritiqueForEvalScenario = async ( - data: AICritiqueCreate, - ignoreAxiosError = false, -) => { - const {projectId} = getProjectValues() - const project = assertValidId(projectId, "projectId") - - const response = await axios.post( - `${getAgentaApiUrl()}/human-evaluations/evaluation_scenario/ai_critique`, - data, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} - -export const fetchEvaluationResults = async (evaluationId: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() - const id = assertValidId(evaluationId, "evaluationId") - const project = assertValidId(projectId, "projectId") - - const response = await axios.get( - `${getAgentaApiUrl()}/human-evaluations/${encodeURIComponent(id)}/results`, - { - params: {project_id: project}, - _ignoreError: ignoreAxiosError, - } as any, - ) - return response.data as EvaluationResponseType -} - -export const fetchEvaluationScenarioResults = async (evaluation_scenario_id: string) => { - const {projectId} = getProjectValues() - const scenarioId = assertValidId(evaluation_scenario_id, "evaluation_scenario_id") - const project = assertValidId(projectId, "projectId") - - const response = await axios.get( - `${getAgentaApiUrl()}/human-evaluations/evaluation_scenario/${encodeURIComponent( - scenarioId, - )}/score`, - {params: {project_id: project}}, - ) - return response -} - -export const createCustomCodeEvaluation = async ( - payload: CreateCustomEvaluation, - ignoreAxiosError = false, -) => { - const {projectId} = getProjectValues() - const project = assertValidId(projectId, "projectId") - - const response = await axios.post( - `${getAgentaApiUrl()}/human-evaluations/custom_evaluation`, - payload, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} - -export const updateCustomEvaluationDetail = async ( - id: string, - payload: CreateCustomEvaluation, - ignoreAxiosError = false, -) => { - const {projectId} = getProjectValues() - const customId = assertValidId(id, "custom_evaluation_id") - const project = assertValidId(projectId, "projectId") - - const response = await axios.put( - `${getAgentaApiUrl()}/human-evaluations/custom_evaluation/${encodeURIComponent(customId)}`, - payload, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} - -export const fetchCustomEvaluations = async (app_id: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() - const appId = assertValidId(app_id, "app_id") - const project = assertValidId(projectId, "projectId") - - const response = await axios.get( - `${getAgentaApiUrl()}/human-evaluations/custom_evaluation/list/${encodeURIComponent( - appId, - )}`, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} - -export const fetchCustomEvaluationDetail = async (id: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() - const customId = assertValidId(id, "custom_evaluation_id") - const project = assertValidId(projectId, "projectId") - - const response = await axios.get( - `${getAgentaApiUrl()}/human-evaluations/custom_evaluation/${encodeURIComponent(customId)}`, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response.data -} - -export const fetchCustomEvaluationNames = async (app_id: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() - const appId = assertValidId(app_id, "app_id") - const project = assertValidId(projectId, "projectId") - - const response = await axios.get( - `${getAgentaApiUrl()}/human-evaluations/custom_evaluation/${encodeURIComponent( - appId, - )}/names`, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} - -export const createExecuteCustomEvaluationCode = async ( - payload: ExecuteCustomEvalCode, - ignoreAxiosError = false, -) => { - const {projectId} = getProjectValues() - const project = assertValidId(projectId, "projectId") - const evalId = assertValidId(payload.evaluation_id, "evaluation_id") - - const response = await axios.post( - `${getAgentaApiUrl()}/human-evaluations/custom_evaluation/execute/${encodeURIComponent( - evalId, - )}`, - payload, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} - -export const updateEvaluationScenarioScore = async ( - evaluation_scenario_id: string, - score: number, - ignoreAxiosError = false, -) => { - const {projectId} = getProjectValues() - const scenarioId = assertValidId(evaluation_scenario_id, "evaluation_scenario_id") - const project = assertValidId(projectId, "projectId") - - const response = await axios.put( - `${getAgentaApiUrl()}/human-evaluations/evaluation_scenario/${encodeURIComponent( - scenarioId, - )}/score`, - {score}, - {params: {project_id: project}, _ignoreError: ignoreAxiosError} as any, - ) - return response -} diff --git a/web/oss/src/services/observability/core/index.ts b/web/oss/src/services/observability/core/index.ts new file mode 100644 index 0000000000..1cea11c7de --- /dev/null +++ b/web/oss/src/services/observability/core/index.ts @@ -0,0 +1,28 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" +import axios from "@/oss/lib/api/assets/axiosConfig" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" + +//Prefix convention: +// - fetch: GET single entity from server +// - fetchAll: GET all entities from server +// - create: POST data to server +// - update: PUT data to server +// - delete: DELETE data from server + +export const fetchAllTraces = async (params = {}, appId: string) => { + const {projectId} = getCurrentProject() + + const response = await axios.get( + `/observability/v1/traces?project_id=${projectId}&application_id=${appId}`, + {params}, + ) + return response.data +} + +export const deleteTrace = async (nodeId: string) => { + const {projectId} = getCurrentProject() + + return axios.delete( + `${getAgentaApiUrl()}/observability/v1/traces?project_id=${projectId}&node_id=${nodeId}`, + ) +} diff --git a/web/oss/src/services/observability/hooks/useTraces.ts b/web/oss/src/services/observability/hooks/useTraces.ts new file mode 100644 index 0000000000..8eda77eb54 --- /dev/null +++ b/web/oss/src/services/observability/hooks/useTraces.ts @@ -0,0 +1,144 @@ +import {useEffect, useMemo} from "react" + +import useSWR, {preload} from "swr" + +import {buildNodeTree, observabilityTransformer} from "@/oss/lib/helpers/observability_helpers" + +import {fetchAllTraces} from "../core" +import {_AgentaRootsResponse, AgentaNodeDTO, AgentaRootsDTO, AgentaTreeDTO} from "../types" + +export const useTraces = ( + { + pagination, + sort, + filters, + traceTabs, + autoPrefetch, + waitUntil, + }: { + pagination: {size: number; page: number} + sort: {type: string; sorted: string; customRange?: {startTime: string; endTime: string}} + filters: any[] + traceTabs: string + autoPrefetch?: boolean + waitUntil?: boolean + }, + appId: string, +) => { + const queryParams = useMemo(() => { + const params: Record = { + size: pagination.size, + page: pagination.page, + focus: traceTabs === "chat" ? "node" : traceTabs, + } + + if (filters.length > 0) { + const sanitizedFilters = filters.map(({isPermanent, ...rest}) => rest) + + params.filtering = JSON.stringify({conditions: sanitizedFilters}) + } + + if (sort) { + if (sort.type === "standard") { + params.oldest = sort.sorted + } else if ( + sort.type === "custom" && + (sort.customRange?.startTime || sort.customRange?.endTime) + ) { + const {startTime, endTime} = sort.customRange + + if (startTime) params.oldest = startTime + if (endTime) params.newest = endTime + } + } + + return params + }, [traceTabs, pagination.size, pagination.page, filters, sort]) + + const fetcher = async () => { + const data = await fetchAllTraces(queryParams, appId) + + const transformedTraces: _AgentaRootsResponse[] = [] + + if (data?.roots) { + transformedTraces.push( + ...data.roots.flatMap((item: AgentaRootsDTO) => + observabilityTransformer(item.trees[0]), + ), + ) + } + + if (data?.trees) { + transformedTraces.push( + ...data.trees.flatMap((item: AgentaTreeDTO) => observabilityTransformer(item)), + ) + } + + if (data?.nodes) { + transformedTraces.push( + ...data.nodes + .flatMap((node: AgentaNodeDTO) => buildNodeTree(node)) + .flatMap((item: AgentaTreeDTO) => observabilityTransformer(item)), + ) + } + + return { + traces: transformedTraces, + traceCount: data?.count, + } + } + + const prefetchPage = async (pageNumber: number) => { + const nextParams = { + ...queryParams, + page: pageNumber, + } + const key = ["traces", appId, JSON.stringify(nextParams)] + await preload(key, async () => { + const data = await fetchAllTraces(nextParams, appId) + + const transformedTraces: _AgentaRootsResponse[] = [] + + if (data?.roots) { + transformedTraces.push( + ...data.roots.flatMap((item: AgentaRootsDTO) => + observabilityTransformer(item.trees[0]), + ), + ) + } + + if (data?.trees) { + transformedTraces.push( + ...data.trees.flatMap((item: AgentaTreeDTO) => observabilityTransformer(item)), + ) + } + + if (data?.nodes) { + transformedTraces.push( + ...data.nodes + .flatMap((node: AgentaNodeDTO) => buildNodeTree(node)) + .flatMap((item: AgentaTreeDTO) => observabilityTransformer(item)), + ) + } + + return { + traces: transformedTraces, + traceCount: data?.count, + } + }) + } + + useEffect(() => { + if (autoPrefetch && !waitUntil) { + prefetchPage(pagination.page + 1) + } + }, [autoPrefetch, pagination.page, JSON.stringify(queryParams), appId, waitUntil]) + + const swrKey = waitUntil ? null : ["traces", appId, JSON.stringify(queryParams)] + const swr = useSWR(swrKey, fetcher, { + revalidateOnFocus: false, + revalidateOnReconnect: false, + }) + + return swr +} diff --git a/web/oss/src/services/onlineEvaluations/api.ts b/web/oss/src/services/onlineEvaluations/api.ts deleted file mode 100644 index e0650b45d9..0000000000 --- a/web/oss/src/services/onlineEvaluations/api.ts +++ /dev/null @@ -1,188 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {getProjectValues} from "@/oss/state/project" - -type LogicalOperator = "and" | "or" | "not" | "nand" | "nor" - -export interface QueryConditionPayload { - field: string - key?: string - value?: unknown - operator?: string - options?: Record -} - -export interface QueryFilteringPayload { - operator?: LogicalOperator - conditions: (QueryConditionPayload | QueryFilteringPayload)[] -} - -export interface QueryWindowingPayload { - newest?: string - oldest?: string - next?: string - limit?: number - order?: "ascending" | "descending" - interval?: number - rate?: number -} - -export interface QueryRevisionDataPayload { - filtering?: QueryFilteringPayload - windowing?: QueryWindowingPayload -} - -export interface SimpleQueryCreatePayload { - slug: string - name?: string - description?: string - flags?: Record - tags?: Record - meta?: Record - data?: QueryRevisionDataPayload -} - -export interface SimpleQueryCreateRequest { - query: SimpleQueryCreatePayload -} - -export interface SimpleQueryResponse { - count: number - query?: { - id: string - slug?: string - data?: QueryRevisionDataPayload - meta?: Record - } | null -} - -export interface QueryRevisionRetrieveRequest { - query_ref?: {id?: string; slug?: string} | null - query_variant_ref?: {id?: string; slug?: string} | null - query_revision_ref?: {id?: string; slug?: string} | null -} - -export interface QueryRevisionResponse { - count: number - query_revision?: { - id?: string - slug?: string - variant_id?: string - version?: string | number - data?: QueryRevisionDataPayload - } | null -} - -export interface SimpleEvaluationFlagsPayload { - is_live?: boolean - is_closed?: boolean - is_active?: boolean -} - -export interface SimpleEvaluationDataPayload { - status?: string - query_steps?: string[] | Record - testset_steps?: Record - application_steps?: Record - evaluator_steps?: string[] | Record - repeats?: number - // Structured references for online evaluations - query_ref?: {id?: string; slug?: string} | null - query_revision_ref?: {id?: string; slug?: string} | null - evaluator_ref?: {id?: string; slug?: string} | null - configuration?: Record -} - -export interface SimpleEvaluationCreatePayload { - name?: string - description?: string - flags?: SimpleEvaluationFlagsPayload - tags?: Record - meta?: Record - data: SimpleEvaluationDataPayload -} - -export interface SimpleEvaluationCreateRequest { - evaluation: SimpleEvaluationCreatePayload -} - -export interface SimpleEvaluationResponse { - count: number - evaluation?: SimpleEvaluationPayload | null -} - -export interface SimpleEvaluationPayload { - id?: string - slug?: string - name?: string - description?: string - created_at?: string - updated_at?: string - created_by_id?: string - updated_by_id?: string - flags?: SimpleEvaluationFlagsPayload - data?: SimpleEvaluationDataPayload - meta?: Record - tags?: Record -} - -export interface SimpleEvaluationsResponse { - count: number - evaluations: SimpleEvaluationPayload[] -} - -export interface SimpleEvaluationsQueryRequest { - evaluation?: { - flags?: SimpleEvaluationFlagsPayload - ids?: string[] - } - tags?: Record - meta?: Record -} - -const getProjectUrl = (path: string) => { - const {projectId} = getProjectValues() - return `${getAgentaApiUrl()}${path}?project_id=${projectId}` -} - -export const createSimpleQuery = async ( - payload: SimpleQueryCreateRequest, -): Promise => { - const {data} = await axios.post(getProjectUrl("/preview/simple/queries/"), payload) - return data as SimpleQueryResponse -} - -export const retrieveQueryRevision = async ( - payload: QueryRevisionRetrieveRequest, -): Promise => { - const {data} = await axios.post(getProjectUrl("/preview/queries/revisions/retrieve"), payload) - return data as QueryRevisionResponse -} - -export const createSimpleEvaluation = async ( - payload: SimpleEvaluationCreateRequest, -): Promise => { - const {data} = await axios.post(getProjectUrl("/preview/simple/evaluations/"), payload) - return data as SimpleEvaluationResponse -} - -export const querySimpleEvaluations = async ( - payload?: SimpleEvaluationsQueryRequest, -): Promise => { - const url = getProjectUrl("/preview/simple/evaluations/query") - const body = payload ?? {} - const {data} = await axios.post(url, body) - return data as SimpleEvaluationsResponse -} - -export const stopSimpleEvaluation = async (evaluationId: string) => { - const url = getProjectUrl(`/preview/simple/evaluations/${evaluationId}/stop`) - const {data} = await axios.post(url) - return data -} - -export const startSimpleEvaluation = async (evaluationId: string) => { - const url = getProjectUrl(`/preview/simple/evaluations/${evaluationId}/start`) - const {data} = await axios.post(url) - return data -} diff --git a/web/oss/src/services/organization/api/index.ts b/web/oss/src/services/organization/api/index.ts index ee9329af9f..540ae1a669 100644 --- a/web/oss/src/services/organization/api/index.ts +++ b/web/oss/src/services/organization/api/index.ts @@ -1,92 +1,31 @@ import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" - -import {fetchJson, getBaseUrl} from "../../../lib/api/assets/fetchClient" -import {Org, OrgDetails} from "../../../lib/Types" - -/** - * Fetch all organizations using modern fetchJson - * Replaces the old axios-based fetchAllOrgsList - */ -export const fetchAllOrgsList = async (): Promise => { - const base = getBaseUrl() - const url = new URL("api/organizations", base) - - console.log("🔍 Organizations fetcher debug:", { - base, - url: url.toString(), - }) - - try { - console.log("🚀 Calling fetchJson with URL:", url.toString()) - const data = await fetchJson(url) - console.log("✅ Organizations fetcher success:", { - count: data?.length || 0, - }) - return data || [] - } catch (error: any) { - console.error("❌ Organizations fetcher failed:", { - message: error?.message, - status: error?.status, - statusText: error?.statusText, - url: url.toString(), - stack: error?.stack?.split("\n").slice(0, 3).join("\n"), - }) - // Return empty array instead of throwing to prevent test failures - return [] - } +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" +import {Org, OrgDetails} from "@/oss/lib/Types" + +//Prefix convention: +// - fetch: GET single entity from server +// - fetchAll: GET all entities from server +// - create: POST data to server +// - update: PUT data to server +// - delete: DELETE data from server + +export const fetchAllOrgsList = async (ignoreAxiosError = false) => { + const response = await axios.get(`${getAgentaApiUrl()}/organizations/`, { + _ignoreError: ignoreAxiosError, + } as any) + return response.data as Org[] } -/** - * Fetch single organization details using modern fetchJson - * Replaces the old axios-based fetchSingleOrg - */ -export const fetchSingleOrg = async ({ - organizationId, -}: { - organizationId: string -}): Promise => { - const base = getBaseUrl() - const url = new URL(`api/organizations/${organizationId}`, base) - - console.log("🔍 Single organization fetcher debug:", { - base, - organizationId, - url: url.toString(), - }) - - try { - console.log("🚀 Calling fetchJson with URL:", url.toString()) - const data = await fetchJson(url) - console.log("✅ Single organization fetcher success:", { - organizationId, - name: data?.name, - }) - return data - } catch (error: any) { - console.error("❌ Single organization fetcher failed:", { - message: error?.message, - status: error?.status, - statusText: error?.statusText, - url: url.toString(), - stack: error?.stack?.split("\n").slice(0, 3).join("\n"), - }) - // Return null instead of throwing to prevent test failures - return null - } +export const fetchSingleOrg = async ({orgId}: {orgId: string}, ignoreAxiosError = false) => { + const response = await axios.get(`${getAgentaApiUrl()}/organizations/${orgId}/`, { + _ignoreError: ignoreAxiosError, + } as any) + return response.data as OrgDetails } -export const updateOrganization = async ( - organizationId: string, - name: string, - ignoreAxiosError = false, -) => { - const response = await axios.put( - `${getAgentaApiUrl()}/organizations/${organizationId}/`, - {name}, - { - _ignoreError: ignoreAxiosError, - } as any, - ) +export const updateOrganization = async (orgId: string, name: string, ignoreAxiosError = false) => { + const response = await axios.put(`${getAgentaApiUrl()}/organizations/${orgId}/`, {name}, { + _ignoreError: ignoreAxiosError, + } as any) return response.data } diff --git a/web/oss/src/services/playground/api/index.ts b/web/oss/src/services/playground/api/index.ts index 0260ad3df1..fde1b2dc34 100644 --- a/web/oss/src/services/playground/api/index.ts +++ b/web/oss/src/services/playground/api/index.ts @@ -1,7 +1,7 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import {Parameter} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" //Prefix convention: // - fetch: GET single entity from server @@ -11,7 +11,7 @@ import {getProjectValues} from "@/oss/state/project" // - delete: DELETE data from server export function restartAppVariantContainer(variantId: string) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return axios.post(`${getAgentaApiUrl()}/containers/restart_container?project_id=${projectId}`, { variant_id: variantId, @@ -19,13 +19,13 @@ export function restartAppVariantContainer(variantId: string) { } export async function deleteSingleVariant(variantId: string) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() await axios.delete(`${getAgentaApiUrl()}/variants/${variantId}?project_id=${projectId}`) } export async function deleteSingleVariantRevision(variantId: string, revisionId: string) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() await axios.delete( `${getAgentaApiUrl()}/variants/${variantId}/revisions/${revisionId}/?project_id=${projectId}`, @@ -33,7 +33,7 @@ export async function deleteSingleVariantRevision(variantId: string, revisionId: } export async function updateVariantParams(variantId: string, parameters: Parameter[]) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() await axios.put( `${getAgentaApiUrl()}/variants/${variantId}/parameters?project_id=${projectId}`, @@ -54,7 +54,7 @@ export async function createNewVariant( newConfigName: string, parameters: Parameter[], ) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() await axios.post(`${getAgentaApiUrl()}/variants/from-base?project_id=${projectId}`, { base_id: baseId, @@ -67,7 +67,7 @@ export async function createNewVariant( } export const fetchVariantLogs = async (variantId: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.get( `${getAgentaApiUrl()}/variants/${variantId}/logs?project_id=${projectId}`, diff --git a/web/oss/src/services/profile/index.ts b/web/oss/src/services/profile/index.ts deleted file mode 100644 index 84005b8f4e..0000000000 --- a/web/oss/src/services/profile/index.ts +++ /dev/null @@ -1,79 +0,0 @@ -// web/oss/src/services/profile/index.ts -/** - * Profile Service - Modern fetchJson Implementation - * - * Aligned with working patterns from projects, variants, and revisions. - * Uses standard fetchJson for consistency and reliability. - */ - -import {fetchJson, getBaseUrl} from "../../lib/api/assets/fetchClient" -import {User} from "../../lib/Types" - -/** - * Fetch user profile using modern fetchJson - * Replaces the old axios-based fetchProfile - */ -export const fetchProfile = async (): Promise => { - const base = getBaseUrl() - const url = new URL("api/profile", base) - - console.log("🔍 Profile fetcher debug:", { - base, - url: url.toString(), - }) - - try { - console.log("🚀 Calling fetchJson with URL:", url.toString()) - const data = await fetchJson(url) - console.log("✅ Profile fetcher success:", { - username: data?.username, - email: data?.email, - }) - return data - } catch (error: any) { - console.error("❌ Profile fetcher failed:", { - message: error?.message, - status: error?.status, - statusText: error?.statusText, - url: url.toString(), - stack: error?.stack?.split("\n").slice(0, 3).join("\n"), - }) - throw error - } -} - -/** - * Update user profile via REST - * Returns an axios-like object with `data` for compatibility - */ -export const updateProfile = async ( - payload: Partial> & { - preferences?: Record - }, -): Promise<{data: User}> => { - const base = getBaseUrl() - const url = new URL("api/profile", base) - const data = await fetchJson(url, { - method: "PUT", - body: JSON.stringify(payload), - }) - return {data} -} - -/** - * Change user password via REST - * OSS note: backend may restrict direct password change; this endpoint is - * structured for compatibility and can be wired to the appropriate route. - */ -export const changePassword = async (payload: { - currentPassword: string - newPassword: string -}): Promise => { - const base = getBaseUrl() - // Prefer an auth-scoped route; adjust if backend differs - const url = new URL("api/auth/change-password", base) - await fetchJson(url, { - method: "POST", - body: JSON.stringify(payload), - }) -} diff --git a/web/oss/src/services/project/index.ts b/web/oss/src/services/project/index.ts index 350a18d7f4..0b45387a40 100644 --- a/web/oss/src/services/project/index.ts +++ b/web/oss/src/services/project/index.ts @@ -1,4 +1,5 @@ -import {fetchJson, getBaseUrl} from "@/oss/lib/api/assets/fetchClient" +import axios from "@/oss/lib/api/assets/axiosConfig" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" import {ProjectsResponse} from "./types" @@ -10,55 +11,6 @@ import {ProjectsResponse} from "./types" // - delete: DELETE data from server export const fetchAllProjects = async (): Promise => { - const base = getBaseUrl() - const url = new URL("api/projects", base) - - console.log("🔍 Project fetcher debug:", { - base, - url: url.toString(), - }) - - try { - console.log("🚀 Calling fetchJson with URL:", url.toString()) - const data = await fetchJson(url) - console.log("✅ Project fetcher success:", { - count: data?.length || 0, - data: data?.slice(0, 2), // Show first 2 projects for debugging - }) - return data || [] - } catch (error) { - console.error("❌ Project fetcher failed:", { - message: error?.message, - status: error?.status, - statusText: error?.statusText, - url: url.toString(), - stack: error?.stack?.split("\n").slice(0, 3).join("\n"), - }) - // Return empty array instead of throwing to prevent test failures - return [] - } -} - -export const createProject = async (data: { - project_name: string - workspace_id?: string - description?: string -}): Promise => { - const response = await axios.post(`${getAgentaApiUrl()}/projects`, data) + const response = await axios.get(`${getAgentaApiUrl()}/projects`) return response.data } - -export const updateProject = async ( - projectId: string, - data: { - project_name?: string - description?: string - }, -): Promise => { - const response = await axios.put(`${getAgentaApiUrl()}/projects/${projectId}`, data) - return response.data -} - -export const deleteProject = async (projectId: string): Promise => { - await axios.delete(`${getAgentaApiUrl()}/projects/${projectId}`) -} diff --git a/web/oss/src/services/project/types.ts b/web/oss/src/services/project/types.ts index c68c9a3518..aec63f40c7 100644 --- a/web/oss/src/services/project/types.ts +++ b/web/oss/src/services/project/types.ts @@ -1,5 +1,6 @@ export interface ProjectsResponse { workspace_id?: string | null + workspace_name?: string | null project_id: string project_name: string user_role?: string | null diff --git a/web/oss/src/services/promptVersioning/api/index.ts b/web/oss/src/services/promptVersioning/api/index.ts index 60c94b6fdb..12f8b95bd4 100644 --- a/web/oss/src/services/promptVersioning/api/index.ts +++ b/web/oss/src/services/promptVersioning/api/index.ts @@ -1,6 +1,6 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {getProjectValues} from "@/oss/state/project" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" //Prefix convention: // - fetch: GET single entity from server @@ -11,7 +11,7 @@ import {getProjectValues} from "@/oss/state/project" // versioning export const fetchAllPromptVersioning = async (variantId: string, ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const {data} = await axios.get( `${getAgentaApiUrl()}/variants/${variantId}/revisions?project_id=${projectId}`, @@ -27,7 +27,7 @@ export const fetchPromptRevision = async ( revisionNumber: number, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const {data} = await axios.get( `${getAgentaApiUrl()}/variants/${variantId}/revisions/${revisionNumber}?project_id=${projectId}`, diff --git a/web/oss/src/services/queries/api/index.ts b/web/oss/src/services/queries/api/index.ts deleted file mode 100644 index 3b3c5bf674..0000000000 --- a/web/oss/src/services/queries/api/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {getProjectValues} from "@/oss/state/project" - -import type { - QueryCreateRequest, - QueryEditRequest, - QueryQueryRequest, - QueryResponse, - QueriesResponse, -} from "./types" - -const base = () => `${getAgentaApiUrl()}/preview/queries` - -export async function createQuery(payload: QueryCreateRequest): Promise { - const {projectId} = getProjectValues() - const {data} = await axios.post(`${base()}/?project_id=${projectId}`, payload) - return data as QueryResponse -} - -export async function fetchQuery(queryId: string): Promise { - const {projectId} = getProjectValues() - const {data} = await axios.get(`${base()}/${queryId}?project_id=${projectId}`) - return data as QueryResponse -} - -export async function editQuery( - queryId: string, - payload: QueryEditRequest, -): Promise { - const {projectId} = getProjectValues() - const {data} = await axios.put(`${base()}/${queryId}?project_id=${projectId}`, payload) - return data as QueryResponse -} - -export async function archiveQuery(queryId: string): Promise { - const {projectId} = getProjectValues() - const {data} = await axios.post(`${base()}/${queryId}/archive?project_id=${projectId}`) - return data as QueryResponse -} - -export async function unarchiveQuery(queryId: string): Promise { - const {projectId} = getProjectValues() - const {data} = await axios.post(`${base()}/${queryId}/unarchive?project_id=${projectId}`) - return data as QueryResponse -} - -export async function queryQueries(payload: QueryQueryRequest = {}): Promise { - const {projectId} = getProjectValues() - const {data} = await axios.post(`${base()}/query?project_id=${projectId}`, payload) - return data as QueriesResponse -} diff --git a/web/oss/src/services/queries/api/types.ts b/web/oss/src/services/queries/api/types.ts deleted file mode 100644 index 8f31459989..0000000000 --- a/web/oss/src/services/queries/api/types.ts +++ /dev/null @@ -1,42 +0,0 @@ -export interface Query { - id: string - name?: string - description?: string - slug?: string - flags?: string[] - tags?: string[] - meta?: Record | null - archived?: boolean - created_at?: string - updated_at?: string -} - -export interface QueryResponse { - count: number - query?: Query | null -} - -export interface QueriesResponse { - count: number - queries: Query[] -} - -export interface QueryCreateRequest { - query: Partial & {id?: string} -} - -export interface QueryEditRequest { - query: Query -} - -export interface QueryRef { - id?: string - slug?: string -} - -export interface QueryQueryRequest { - query?: Partial - query_refs?: QueryRef[] - include_archived?: boolean - windowing?: any -} diff --git a/web/oss/src/services/runMetrics/api/index.ts b/web/oss/src/services/runMetrics/api/index.ts deleted file mode 100644 index 7d7d097a55..0000000000 --- a/web/oss/src/services/runMetrics/api/index.ts +++ /dev/null @@ -1,703 +0,0 @@ -import {iqrsLevels, PERCENTILE_STOPS} from "./assets/contants" -import {BasicStats} from "./types" - -export const METRICS_ENDPOINT = "/preview/evaluations/metrics/" - -const fetchJSON = async (url: string, options: RequestInit) => { - const res = await fetch(url, options) - if (!res.ok) throw new Error(res.statusText) - return res.json() -} - -// /** -// * Create a new run-level metric entry. -// * -// * @param apiUrl The URL of the API service to create the metric against. -// * @param jwt The JWT token to authenticate the request. -// * @param runId The UUID of the evaluation run to associate with the metric. -// * @param data A dictionary of string keys to numeric values representing the -// * metric data. -// * -// * @returns The newly created metric object (snake_case). -// */ -// export const createRunMetrics = async ( -// apiUrl: string, -// jwt: string, -// runId: string, -// data: Record, -// projectId: string, -// ) => { -// const payload = {metrics: [{run_id: runId, data}]} -// return fetchJSON(`${apiUrl}${METRICS_ENDPOINT}?project_id=${projectId}`, { -// method: "POST", -// headers: { -// "Content-Type": "application/json", -// Authorization: `Bearer ${jwt}`, -// }, -// body: JSON.stringify(payload), -// }) -// } - -/** - * Creates a new run-level metric or updates an existing one. - * - * This function will first attempt to fetch the existing metric associated - * with the given runId. If a metric is found, it will be updated with the - * new data. If no existing metric is found, a new metric entry will be - * created. - * - * @param apiUrl The base URL of the API service. - * @param jwt The JWT token used for authenticating the request. - * @param runId The UUID of the evaluation run to associate with the metrics. - * @param data A dictionary of string keys to numeric values representing the - * metric data. - * - * @returns The newly created or updated metric object (snake_case). - */ -// export const upsertRunMetrics = async ( -// apiUrl: string, -// jwt: string, -// runId: string, -// data: Record, -// projectId: string, -// ) => { -// try { -// const params = new URLSearchParams({ -// run_ids: runId, -// }) -// const res = await fetchJSON(`${apiUrl}${METRICS_ENDPOINT}?${params.toString()}`, { -// headers: {Authorization: `Bearer ${jwt}`}, -// }) -// const existing = Array.isArray(res.metrics) ? res.metrics[0] : undefined -// if (existing) { -// const merged = {...(existing.data || {}), ...data} -// return updateMetric(apiUrl, jwt, existing.id, { -// data: merged, -// status: existing.status || "finished", -// tags: existing.tags, -// meta: existing.meta, -// }) -// } -// } catch { -// /* ignore lookup errors and fall back to creation */ -// } -// return createRunMetrics(apiUrl, jwt, runId, data, projectId) -// } - -/** - * Create or update scenario-level metrics for a specific evaluation run. - * - * This function takes a list of scenario metric entries and attempts to - * either create new metrics or update existing ones based on the provided - * runId and scenarioId. If a metric already exists for a given scenario, - * it is updated with the new data. If no existing metric is found, a new - * metric entry is created. - * - * @param apiUrl The base URL of the API service. - * @param jwt The JWT token used for authenticating the request. - * @param runId The UUID of the evaluation run to associate with the metrics. - * @param entries An array of objects containing scenarioId and data to - * be stored as metrics. - * - * @returns A promise that resolves when all create or update operations - * have been completed. - */ -export const createScenarioMetrics = async ( - apiUrl: string, - jwt: string, - runId: string, - entries: {scenarioId: string; data: Record}[], - projectId: string, -) => { - const toCreate: {run_id: string; scenario_id: string; data: Record}[] = [] - const toUpdate: { - id: string - data: Record - status?: string - tags?: Record - meta?: Record - }[] = [] - - const queryUrl = `${apiUrl}${METRICS_ENDPOINT}query?project_id=${projectId}` - const existingByScenario: Record = {} - - try { - const payload = { - metrics: { - run_ids: [runId], - scenario_ids: entries.map((entry) => entry.scenarioId), - }, - windowing: {}, - } - - const queryResponse = await fetchJSON(queryUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify(payload), - }) - - const existingMetrics = Array.isArray(queryResponse?.metrics) ? queryResponse.metrics : [] - - existingMetrics.forEach((metric: any) => { - const scenarioId = metric?.scenario_id || metric?.scenarioId - if (scenarioId) { - existingByScenario[scenarioId] = metric - } - }) - } catch (error) { - console.warn("[createScenarioMetrics] Failed to query existing metrics", error) - } - - for (const entry of entries) { - const existing = existingByScenario[entry.scenarioId] - if (existing) { - const mergedData = { - ...(existing.data || {}), - ...entry.data, - } - if (existing.id) { - toUpdate.push({ - id: existing.id, - data: mergedData, - status: existing.status, - tags: existing.tags, - meta: existing.meta, - }) - continue - } - } - toCreate.push({run_id: runId, scenario_id: entry.scenarioId, data: entry.data}) - } - - const promises: Promise[] = [] - if (toCreate.length) { - promises.push( - fetchJSON(`${apiUrl}${METRICS_ENDPOINT}?project_id=${projectId}`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify({metrics: toCreate}), - }), - ) - } - if (toUpdate.length) { - promises.push( - fetchJSON(`${apiUrl}${METRICS_ENDPOINT}?project_id=${projectId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify({metrics: toUpdate}), - }), - ) - } - return Promise.all(promises) -} - -/** - * Update a single metric entry. - * - * @param apiUrl The URL of the API service to create the metric against. - * @param jwt The JWT token to authenticate the request. - * @param metricId The UUID of the metric to update. - * @param changes A dictionary of changes to apply to the metric. - * - * @returns The updated metric object (snake_case). - */ -export const updateMetric = async ( - apiUrl: string, - jwt: string, - metricId: string, - changes: { - data?: Record - status?: string - tags?: Record - meta?: Record - }, - projectId: string, -) => { - const payload = {metric: {id: metricId, ...changes}} - return fetchJSON(`${apiUrl}${METRICS_ENDPOINT}${metricId}?project_id=${projectId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify(payload), - }) -} - -/** - * Update multiple metric entries. - * - * @param apiUrl The URL of the API service to update the metrics against. - * @param jwt The JWT token to authenticate the request. - * @param metrics An array of metric objects to update. Each object should contain - * at least an 'id' property and may contain additional properties - * to update ('data', 'status', 'tags', 'meta'). - * - * @returns An array of the updated metric objects (snake_case). - */ -export const updateMetrics = async ( - apiUrl: string, - jwt: string, - metrics: { - id: string - data?: Record - status?: string - tags?: Record - meta?: Record - }[], - projectId: string, -) => { - return fetchJSON(`${apiUrl}${METRICS_ENDPOINT}?project_id=${projectId}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${jwt}`, - }, - body: JSON.stringify({metrics}), - }) -} - -// --- Statistics helpers -------------------------------------------------- - -/** - * Calculates the p-th percentile of a sorted array of numbers. - * - * @param sorted - An array of numbers sorted in ascending order. - * @param p - The percentile to calculate (between 0 and 100). - * @returns The calculated percentile value. - * If the array is empty, returns 0. - */ -function percentile(sorted: number[], p: number): number { - if (sorted.length === 0) return 0 - const idx = (p / 100) * (sorted.length - 1) - const lower = Math.floor(idx) - const upper = Math.ceil(idx) - if (lower === upper) return sorted[lower] - const weight = idx - lower - return sorted[lower] * (1 - weight) + sorted[upper] * weight -} - -// Helper: round to 'p' decimal places (default 6) and coerce back to number -// Smart rounding: for numbers < 0.001 use significant–figure precision to -// avoid long binary tails; otherwise use fixed decimal rounding. -const round = (v: number, p = 6, sig = 6): number => { - if (Number.isNaN(v)) return v - const abs = Math.abs(v) - if (abs !== 0 && abs < 1e-3) { - return Number(v.toPrecision(sig)) - } - return Number(v.toFixed(p)) -} - -/** - * Builds a histogram distribution from an array of numbers. - * - * This function calculates a histogram by determining the optimal number of bins - * based on the square root of the number of input values. It then computes the - * bin size and assigns each number to a bin. The resulting histogram is returned - * as an array of objects, each containing a bin start value and the count of - * numbers in that bin. - * - * @param values - An array of numbers to create the distribution from. - * @returns An array of objects where each object represents a bin with the - * 'value' as the bin start and 'count' as the number of elements - * in that bin. If all values are the same, returns a single bin - * with the value and the count of elements. - */ -function buildDistribution(values: number[]): {value: number; count: number}[] { - if (!values.length) return [] - - const n = values.length - const bins = Math.ceil(Math.sqrt(n)) - const min = Math.min(...values) - const max = Math.max(...values) - - if (min === max) { - return [{value: round(min, 6), count: n}] - } - - const binSize = (max - min) / bins - // precision = number of decimal places required to keep bin starts stable - const precision = binSize ? Math.max(0, -Math.floor(Math.log10(binSize))) : 0 - - const hist = new Map() - - values.forEach((v) => { - let binIndex = Math.floor((v - min) / binSize) - if (binIndex === bins) binIndex -= 1 // edge case when v === max - const binStart = Number((min + binIndex * binSize).toFixed(precision)) - hist.set(binStart, (hist.get(binStart) ?? 0) + 1) - }) - - return Array.from(hist.entries()) - .sort((a, b) => a[0] - b[0]) - .map(([value, count]) => ({value, count})) -} - -/** - * Computes various statistical measures for a given array of numbers. - * - * @param values - An array of numbers for which statistics are to be computed. - * @returns An object containing the following statistical measures: - * - count: The number of elements in the array. - * - sum: The total sum of the elements. - * - mean: The average value of the elements. - * - min: The minimum value in the array. - * - max: The maximum value in the array. - * - range: The difference between the maximum and minimum values. - * - distribution: A histogram representation of the values. - * - percentiles: An object containing percentile values for defined stops. - * - iqrs: An object containing inter-quartile ranges as per backend mapping. - */ -function computeStats(values: number[]): BasicStats { - const count = values.length - if (count === 0) { - return { - count: 0, - sum: 0, - mean: 0, - min: 0, - max: 0, - range: 0, - distribution: [], - percentiles: {}, - iqrs: {}, - } - } - - const sorted = [...values].sort((a, b) => a - b) - const sum = values.reduce((acc, v) => acc + v, 0) - const mean = sum / count - const min = sorted[0] - const max = sorted[sorted.length - 1] - const range = max - min - - // Percentiles with rounded output - const percentiles: Record = {} - PERCENTILE_STOPS.forEach((p) => { - percentiles[`p${p}`] = round(percentile(sorted, p), 4) - }) - - const iqrs: Record = {} - Object.entries(iqrsLevels).forEach(([label, [low, high]]) => { - iqrs[label] = round(percentiles[high] - percentiles[low], 4) - }) - - const distribution = buildDistribution(values) - const bins = distribution.length - const binSize = bins ? (range !== 0 ? range / bins : 1) : undefined - - return { - count, - sum: round(sum, 6), - mean: round(mean, 6), - min: round(min, 6), - max: round(max, 6), - range: round(range, 6), - distribution, - percentiles, - iqrs, - binSize: binSize !== undefined ? round(binSize, 6) : undefined, - } -} - -// --- Additional helpers for non-numeric metrics ------------------------- - -// Count of values -function count(values: unknown[]): number { - return values.length -} - -// Build frequency list [{value,count}] -function buildFrequency(values: unknown[]): {value: any; count: number}[] { - const freqMap = new Map() - values.forEach((v) => freqMap.set(v, (freqMap.get(v) ?? 0) + 1)) - return Array.from(freqMap.entries()).map(([value, count]) => ({value, count})) -} - -function buildRank(values: unknown[], topK = 10): {value: any; count: number}[] { - return buildFrequency(values) - .sort((a, b) => b.count - a.count) - .slice(0, topK) -} - -function processBinary(values: (boolean | null)[]): BasicStats { - const filtered = values.map((v) => (v === null || v === undefined ? null : v)) - return { - count: count(filtered), - frequency: buildFrequency(filtered), - unique: Array.from(new Set(filtered)), - rank: buildRank(filtered), - } -} - -function processClass(values: (string | number | boolean | null)[]): BasicStats { - return { - count: count(values), - frequency: buildFrequency(values), - unique: Array.from(new Set(values)), - rank: buildRank(values), - } -} - -function processLabels(values: ((string | number | boolean | null)[] | null)[]): BasicStats { - // Flatten labels list - const flat: (string | number | boolean | null)[] = [] - values.forEach((arr) => { - if (Array.isArray(arr)) flat.push(...arr) - else flat.push(null) - }) - // Additionally compute distribution of label counts per record - // const labelCounts = values.map((arr) => (Array.isArray(arr) ? arr.length : 0)) - // const distStats = computeStats(labelCounts) - // const labelValueDistribution = buildFrequency(flat).map((f) => ({ - // value: f.value, - // count: f.count, - // })) - const returnData = { - count: count(flat), - frequency: buildFrequency(flat), - unique: Array.from(new Set(flat)), - rank: buildRank(flat), - } - return returnData -} - -// TODO: Clean this up Ashraf -// Implemented this to handle boolean metric for auto eval -interface BoolCount { - count: number - value: boolean -} -interface ItemShape { - rank?: BoolCount[] - frequency?: BoolCount[] - count?: number // not required for aggregation - unique?: boolean[] // not required for aggregation -} - -interface Summary { - rank: BoolCount[] - count: number - unique: boolean[] - frequency: BoolCount[] -} - -export function aggregateBooleanSummaryByVote(items: ItemShape[]): Summary { - let totalItems = 0 - let votesTrue = 0 - let votesFalse = 0 - - for (const item of items) { - // Prefer rank if present, else fall back to frequency - const source = (item.rank?.length ? item.rank : item.frequency) ?? [] - - if (!source.length) continue - - // Pick the winner for THIS item: - // - If item.rank was provided, assume it's already sorted (winner is source[0]) - // - Otherwise, find the max by count from frequency - let winner: BoolCount | undefined - - if (item.rank?.length) { - winner = source[0] - } else { - winner = source.reduce((best, cur) => { - if (!best) return cur - if (cur.count > best.count) return cur - if (cur.count === best.count) { - // Tie-break: prefer the one that appears first (stable), or prefer true. - // To prefer true on ties, use the following line instead: - // return cur.value === true ? cur : best; - return best - } - return best - }, undefined) - } - - if (winner && typeof winner.value === "boolean") { - totalItems += 1 // this item contributes exactly one vote - if (winner.value) votesTrue += 1 - else votesFalse += 1 - } - } - - // Build totals; keep rank/frequency consistent and sorted by count desc (tie: true first) - const totals: BoolCount[] = [ - {value: true, count: votesTrue}, - {value: false, count: votesFalse}, - ].sort((a, b) => b.count - a.count || (a.value === true ? -1 : 1)) - - return { - rank: totals, - count: totalItems, // <= items.length - unique: [true, false], - frequency: totals, - } -} - -// ------------------------------------------------------------------------ - -/** - * Computes a map of metrics to their computed statistics, given a list of - * objects with `data` properties containing key-value pairs of metric names - * to their respective values. - * - * It will group values by metric key, and compute the following statistics - * for each key: - * - * - `count`: The number of values. - * - `sum`: The sum of all values. - * - `mean`: The mean of all values. - * - `min`: The minimum value. - * - `max`: The maximum value. - * - `range`: The difference between the maximum and minimum values. - * - `distribution`: An array of 11 values representing the distribution of - * values between the minimum and maximum. - * - `percentiles`: An object with keys `pX` where `X` is a percentile (e.g. - * `p25`, `p50`, `p75`), and values that are the corresponding percentiles - * of the values. - * - `iqrs`: An object with keys that are the names of interquartile ranges - * (e.g. `iqr25`, `iqr50`, `iqr75`), and values that are the corresponding - * interquartile ranges of the values. - * - * @param metrics An array of objects with `data` properties containing key-value pairs of metric names to their respective values. - * @returns An object with metric names as keys, and their computed statistics as values. - */ -export const computeRunMetrics = (metrics: {data: Record}[]): Record => { - if (!metrics?.length) return {} - - const result: Record = {} - const valueBuckets: Record = {} - - metrics.forEach((m) => { - Object.entries(m.data || {}).forEach(([k, v]) => { - if (v !== undefined) { - valueBuckets[k] = valueBuckets[k] || [] - valueBuckets[k].push(v) - } - }) - }) - - // Process non-special keys - Object.entries(valueBuckets).forEach(([k, values]) => { - const allNumbers = values.every((v) => typeof v === "number" && !isNaN(v)) - const allBooleans = values.every((v) => typeof v === "boolean" || v === null) - const proccesdBooleans = values.every( - (v) => v?.unique?.length && typeof v?.unique?.[0] === "boolean", - ) - const allArrays = values.every((v) => Array.isArray(v)) - const allStatsObjects = values.every( - (v) => - v && - typeof v === "object" && - !Array.isArray(v) && - ("mean" in (v as any) || - "sum" in (v as any) || - "count" in (v as any) || - "frequency" in (v as any) || - "rank" in (v as any)), - ) - - if (allNumbers) { - result[k] = computeStats(values as number[]) - } else if (allBooleans) { - result[k] = processBinary(values as (boolean | null)[]) - } else if (proccesdBooleans) { - result[k] = aggregateBooleanSummaryByVote(values) - } else if (allArrays) { - result[k] = processLabels(values as any[][]) // treat as labels metric - } else if (allStatsObjects) { - const merged = values.reduce((acc: any, current: any) => { - if (!acc) return current - const next: any = {...acc} - if (typeof current.mean === "number") next.mean = current.mean - if (typeof current.sum === "number") next.sum = current.sum - if (typeof current.count === "number") { - next.count = (next.count ?? 0) + (current.count ?? 0) - } - if (Array.isArray(current.frequency)) next.frequency = current.frequency - if (Array.isArray(current.rank)) next.rank = current.rank - if (Array.isArray(current.unique)) next.unique = current.unique - if (Array.isArray(current.distribution)) next.distribution = current.distribution - if (current.percentiles) next.percentiles = current.percentiles - if (current.iqrs) next.iqrs = current.iqrs - if (typeof current.binSize === "number") next.binSize = current.binSize - return next - }, null) - const finalStats = merged ?? values[0] - if (finalStats && Array.isArray(finalStats.frequency)) { - finalStats.frequency = finalStats.frequency.map((entry: any) => ({ - value: entry?.value, - count: entry?.count ?? entry?.frequency ?? 0, - })) - finalStats.frequency.sort( - (a: any, b: any) => b.count - a.count || (a.value === true ? -1 : 1), - ) - finalStats.rank = finalStats.frequency - if (!Array.isArray(finalStats.unique) || !finalStats.unique.length) { - finalStats.unique = finalStats.frequency.map((entry: any) => entry.value) - } - } - result[k] = finalStats - } else if ( - values.every( - (v) => - v === null || - typeof v === "string" || - typeof v === "number" || - typeof v === "boolean", - ) - ) { - result[k] = processClass(values as any[]) - } - }) - - return result -} - -export interface MetricDistribution { - distribution: {value: number; count: number}[] - mean: number - min: number - max: number - binSize: number -} - -export const computeMetricDistribution = ( - values: number[], - stats?: BasicStats, -): MetricDistribution | undefined => { - let computed = stats - if (!computed) { - if (!values.length) return undefined - const tmpKey = "__metric" - const agg = computeRunMetrics(values.map((v) => ({data: {[tmpKey]: v}}))) - computed = agg[tmpKey] - } - if (!computed?.distribution || !computed.distribution.length) { - return computed - } - let binSize = computed.binSize - if (binSize === undefined) { - const bins = computed.distribution.length - const range = computed.range ?? (computed.max ?? 0) - (computed.min ?? 0) - binSize = bins ? (range !== 0 ? range / bins : 1) : 1 - } - return { - distribution: computed.distribution, - mean: computed.mean ?? 0, - min: computed.min ?? 0, - max: computed.max ?? 0, - binSize, - } -} diff --git a/web/oss/src/services/testsets/api/index.ts b/web/oss/src/services/testsets/api/index.ts index 93b205cb98..bcb2fea9bc 100644 --- a/web/oss/src/services/testsets/api/index.ts +++ b/web/oss/src/services/testsets/api/index.ts @@ -1,9 +1,10 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {Testset, PreviewTestset} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" +import useSWR from "swr" +import type {SWRResponse} from "swr" -import {PreviewTestsetsQueryPayload} from "./types" +import {getCurrentProject} from "@/oss/contexts/project.context" +import axios from "@/oss/lib/api/assets/axiosConfig" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" +import {PreviewTestSet, TestSet, testset} from "@/oss/lib/Types" //Prefix convention: // - fetch: GET single entity from server @@ -12,27 +13,61 @@ import {PreviewTestsetsQueryPayload} from "./types" // - update: PUT data to server // - delete: DELETE data from server -export const fetchTestsets = async () => { - const {projectId} = getProjectValues() +// Overloads for accurate type inference +export function useTestset( + testsetId?: string, + preview?: T, +): SWRResponse +export function useTestset(testsetId?: string, preview?: T) { + const {projectId} = getCurrentProject() + return useSWR( + !testsetId + ? null + : `/api/${preview ? "preview/simple/" : ""}testsets/${testsetId}?project_id=${projectId}`, + () => fetchTestset(testsetId!, preview), + { + revalidateOnFocus: false, + shouldRetryOnError: false, + }, + ) +} - const response = await axios.get(`${getAgentaApiUrl()}/testsets?project_id=${projectId}`) +export const useTestsets = (preview?: boolean, skip?: boolean) => { + const {projectId} = getCurrentProject() - return response.data + return useSWR( + skip + ? null + : preview + ? `${getAgentaApiUrl()}/preview/simple/testsets/?project_id=${projectId}` + : `${getAgentaApiUrl()}/testsets?project_id=${projectId}`, + { + revalidateOnFocus: false, + shouldRetryOnError: false, + }, + ) +} +export const useLoadTestsetsList = () => { + const {data, error, mutate, isLoading} = useTestsets() + + return { + testsets: data || [], + isTestsetsLoading: isLoading, + isTestsetsLoadingError: error, + mutate, + } } -export const fetchPreviewTestsets = async (payload: PreviewTestsetsQueryPayload = {}) => { - const {projectId} = getProjectValues() +export const fetchTestsets = async () => { + const {projectId} = getCurrentProject() - const response = await axios.post( - `${getAgentaApiUrl()}/preview/simple/testsets/query?project_id=${projectId}`, - payload, - ) + const response = await axios.get(`${getAgentaApiUrl()}/testsets?project_id=${projectId}`) return response.data } export async function createNewTestset(testsetName: string, testsetData: any) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post(`${getAgentaApiUrl()}/testsets?project_id=${projectId}`, { name: testsetName, @@ -43,7 +78,7 @@ export async function createNewTestset(testsetName: string, testsetData: any) { } export async function updateTestset(testsetId: string, testsetName: string, testsetData: any) { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.put( `${getAgentaApiUrl()}/testsets/${testsetId}?project_id=${projectId}`, @@ -58,25 +93,25 @@ export async function updateTestset(testsetId: string, testsetName: string, test export async function fetchTestset( testsetId: string, preview?: T, -): Promise { +): Promise { if (!testsetId) { return null as any } - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const url = preview ? `${getAgentaApiUrl()}/preview/simple/testsets/${testsetId}?project_id=${projectId}` : `${getAgentaApiUrl()}/testsets/${testsetId}?project_id=${projectId}` const response = await axios.get(url) if (!preview) { - return response?.data as T extends true ? PreviewTestset : Testset + return response?.data as T extends true ? PreviewTestSet : TestSet } else { - return response?.data?.testset as T extends true ? PreviewTestset : Testset + return response?.data?.testset as T extends true ? PreviewTestSet : TestSet } } export const uploadTestsets = async (formData: FormData) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( `${getAgentaApiUrl()}/testsets/upload?project_id=${projectId}`, @@ -93,7 +128,7 @@ export const uploadTestsets = async (formData: FormData) => { } export const importTestsetsViaEndpoint = async (formData: FormData) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( `${getAgentaApiUrl()}/testsets/endpoint?project_id=${projectId}`, @@ -106,7 +141,7 @@ export const importTestsetsViaEndpoint = async (formData: FormData) => { } export const deleteTestsets = async (ids: string[]) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios({ method: "delete", diff --git a/web/oss/src/services/testsets/api/types.ts b/web/oss/src/services/testsets/api/types.ts deleted file mode 100644 index 2e1ec20e92..0000000000 --- a/web/oss/src/services/testsets/api/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Types for testsets API - -export interface PreviewTestsetsQueryPayload { - testset?: { - flags?: { - has_testcases?: boolean - has_traces?: boolean - } - meta?: Record - tags?: Record - } - testset_refs?: { - version?: string - slug?: string - id?: string - }[] - include_archived?: boolean - windowing?: { - newest?: string - oldest?: string - next?: string - limit?: number - order?: "ascending" | "descending" - interval?: number - rate?: number - } -} diff --git a/web/oss/src/services/tracing/api/index.ts b/web/oss/src/services/tracing/api/index.ts deleted file mode 100644 index b5c61178dd..0000000000 --- a/web/oss/src/services/tracing/api/index.ts +++ /dev/null @@ -1,123 +0,0 @@ -import {getBaseUrl, fetchJson, ensureProjectId, ensureAppId} from "@/oss/lib/api/assets/fetchClient" -import {getProjectValues} from "@/oss/state/project" -import {rangeToIntervalMinutes, tracingToGeneration} from "../lib/helpers" -import {GenerationDashboardData, TracingDashboardData} from "../types" - -export const fetchAllPreviewTraces = async (params: Record = {}, appId: string) => { - const base = getBaseUrl() - const projectId = ensureProjectId() - const applicationId = ensureAppId(appId) - - // New query endpoint expects POST with JSON body - const url = new URL(`${base}/preview/tracing/spans/query`) - if (projectId) url.searchParams.set("project_id", projectId) - if (applicationId) url.searchParams.set("application_id", applicationId) - - const payload: Record = {} - Object.entries(params).forEach(([key, value]) => { - if (value === undefined || value === null) return - if (key === "size") { - payload.limit = Number(value) - } else if (key === "filter" && typeof value === "string") { - try { - payload.filter = JSON.parse(value) - } catch { - payload.filter = value - } - } else { - payload[key] = value - } - }) - - return fetchJson(url, { - method: "POST", - headers: {"Content-Type": "application/json"}, - body: JSON.stringify(payload), - }) -} - -export const fetchPreviewTrace = async (traceId: string) => { - const base = getBaseUrl() - const projectId = ensureProjectId() - - const url = new URL(`${base}/preview/tracing/traces/${traceId}`) - if (projectId) url.searchParams.set("project_id", projectId) - - return fetchJson(url) -} - -export const deletePreviewTrace = async (traceId: string) => { - const base = getBaseUrl() - const projectId = ensureProjectId() - - const url = new URL(`${base}/preview/tracing/traces/${traceId}`) - if (projectId) url.searchParams.set("project_id", projectId) - - return fetchJson(url, {method: "DELETE"}) -} - -export const fetchGenerationsDashboardData = async ( - appId: string | null | undefined, - _options: { - range: string - environment?: string - variant?: string - projectId?: string - signal?: AbortSignal - }, -): Promise => { - const {projectId: propsProjectId, signal, ...options} = _options - const {projectId: stateProjectId} = getProjectValues() - - const base = getBaseUrl() - const projectId = propsProjectId || stateProjectId - const applicationId = ensureAppId(appId || undefined) - - if (signal?.aborted) { - throw new DOMException("Aborted", "AbortError") - } - - const url = new URL(`${base}/preview/tracing/spans/analytics`) - if (projectId) url.searchParams.set("project_id", projectId) - if (applicationId) url.searchParams.set("application_id", applicationId) - - const conditions: any[] = [] - - if (applicationId) { - conditions.push({ - field: "references", - operator: "in", - value: [{id: applicationId}], - }) - } - if (options.environment) { - conditions.push({ - field: "environment", - operator: "eq", - value: options.environment, - }) - } - if (options.variant) { - conditions.push({ - field: "variant", - operator: "eq", - value: options.variant, - }) - } - - const payload: Record = { - focus: "trace", - interval: rangeToIntervalMinutes(options.range), - ...(conditions.length ? {filter: {conditions}} : {}), - } - - const response = await fetchJson(url, { - method: "POST", - headers: {"Content-Type": "application/json"}, - body: JSON.stringify(payload), - signal, - }) - - const valTracing = response as TracingDashboardData - return tracingToGeneration(valTracing, options.range) as GenerationDashboardData -} diff --git a/web/oss/src/services/tracing/lib/helpers.ts b/web/oss/src/services/tracing/lib/helpers.ts deleted file mode 100644 index 8898c5b8bc..0000000000 --- a/web/oss/src/services/tracing/lib/helpers.ts +++ /dev/null @@ -1,132 +0,0 @@ -import dayjs from "dayjs" -import {sortSpansByStartTime} from "@/oss/lib/helpers/tracing" - -import { - TraceSpanNode, - TracesResponse, - SpansResponse, - TracingDashboardData, - GenerationDashboardData, -} from "../types" - -export const isTracesResponse = (data: any): data is TracesResponse => { - return typeof data === "object" && "traces" in data -} - -export const isSpansResponse = (data: any): data is SpansResponse => { - return typeof data === "object" && "spans" in data -} - -export const transformTracesResponseToTree = (data: TracesResponse): TraceSpanNode[] => { - const buildTree = (spans: Record | any[]): TraceSpanNode[] => { - if (!spans) { - return [] - } - - const spanArray = Object.values(spans).flatMap((span: any) => { - if (Array.isArray(span)) { - return buildTree(span) - } - - const node: TraceSpanNode = { - ...span, - } - - if (span?.spans && Object.keys(span.spans).length > 0) { - node.children = buildTree(span.spans) - } - - return node - }) - - // Sort spans at this hierarchy level by start_time - return sortSpansByStartTime(spanArray) - } - - return Object.values(data.traces).flatMap((trace: any) => buildTree(trace.spans)) -} - -export const transformTracingResponse = (data: TraceSpanNode[]): TraceSpanNode[] => { - const enhance = (span: TraceSpanNode): TraceSpanNode => ({ - ...span, - key: span.span_id, - invocationIds: { - trace_id: span.trace_id, - span_id: span.span_id, - }, - children: span.children?.map(enhance), - }) - - return data.map(enhance) -} - -export const rangeToIntervalMinutes = (range: string): number => { - switch (range) { - case "1h": - return 60 - case "24h": - return 60 - case "7d": - return 360 - case "30d": - return 720 - default: - return 720 - } -} - -export const normalizeDurationSeconds = (d = 0) => d / 1_000 - -export const formatTick = (ts: number | string, range: string) => - dayjs(ts).format(range === "24_hours" ? "h:mm a" : range === "7_days" ? "ddd" : "D MMM") - -export function tracingToGeneration(tracing: TracingDashboardData, range: string) { - const buckets = tracing.buckets ?? [] - - let successCount = 0 - let errorCount = 0 - let totalCost = 0 - let totalTokens = 0 - let totalSuccessDuration = 0 - - const data = buckets.map((b) => { - const succC = b.total?.count ?? 0 - const errC = b.errors?.count ?? 0 - - const succCost = b.total?.costs ?? 0 - const errCost = b.errors?.costs ?? 0 - - const succTok = b.total?.tokens ?? 0 - const errTok = b.errors?.tokens ?? 0 - - const succDurS = normalizeDurationSeconds(b.total?.duration ?? 0) - - successCount += succC - errorCount += errC - totalCost += succCost + errCost - totalTokens += succTok + errTok - totalSuccessDuration += succDurS - - return { - timestamp: formatTick(b.timestamp, range), - success_count: succC, - failure_count: errC, - cost: succCost + errCost, - latency: succC ? succDurS / Math.max(succC, 1) : 0, // avg latency per success in the bucket - total_tokens: succTok + errTok, - } - }) - - const totalCount = successCount + errorCount - - return { - data, - total_count: totalCount, - failure_rate: totalCount ? errorCount / totalCount : 0, - total_cost: totalCost, - avg_cost: totalCount ? totalCost / totalCount : 0, - avg_latency: successCount ? totalSuccessDuration / successCount : 0, - total_tokens: totalTokens, - avg_tokens: totalCount ? totalTokens / totalCount : 0, - } -} diff --git a/web/oss/src/services/tracing/types/index.ts b/web/oss/src/services/tracing/types/index.ts deleted file mode 100644 index ecefd52148..0000000000 --- a/web/oss/src/services/tracing/types/index.ts +++ /dev/null @@ -1,164 +0,0 @@ -// --- ENUMS ------------------------------------------------------------------- - -export enum TraceType { - INVOCATION = "invocation", - ANNOTATION = "annotation", - UNDEFINED = "undefined", -} - -export enum SpanCategory { - AGENT = "agent", - CHAIN = "chain", - WORKFLOW = "workflow", - TASK = "task", - TOOL = "tool", - EMBEDDING = "embedding", - QUERY = "query", - LLM = "llm", - COMPLETION = "completion", - CHAT = "chat", - RERANK = "rerank", - UNDEFINED = "undefined", -} - -export enum SpanKind { - SPAN_KIND_UNSPECIFIED = "SPAN_KIND_UNSPECIFIED", - SPAN_KIND_INTERNAL = "SPAN_KIND_INTERNAL", - SPAN_KIND_SERVER = "SPAN_KIND_SERVER", - SPAN_KIND_CLIENT = "SPAN_KIND_CLIENT", - SPAN_KIND_PRODUCER = "SPAN_KIND_PRODUCER", - SPAN_KIND_CONSUMER = "SPAN_KIND_CONSUMER", -} - -export enum StatusCode { - STATUS_CODE_UNSET = "STATUS_CODE_UNSET", - STATUS_CODE_OK = "STATUS_CODE_OK", - STATUS_CODE_ERROR = "STATUS_CODE_ERROR", -} - -// --- SUB-ENTITIES ------------------------------------------------------------ - -export type SpanAttributes = Record - -export type SpanEvent = { - name: string - timestamp: string | number - attributes?: SpanAttributes -} - -export type SpanLink = { - trace_id: string - span_id: string - attributes?: SpanAttributes -} - -export type SpanHash = { - id: string - attributes?: SpanAttributes -} - -export type SpanReference = { - id?: string - type?: string - attributes?: SpanAttributes -} - -// --- MAIN SPAN ENTITY -------------------------------------------------------- - -export type TraceSpan = { - trace_id: string - span_id: string - parent_id?: string - - span_type?: SpanCategory - trace_type?: TraceType - - span_kind?: SpanKind - span_name?: string - - start_time?: string | number - end_time?: string | number - - status_code?: StatusCode - status_message?: string - - attributes?: SpanAttributes - references?: SpanReference[] - links?: SpanLink[] - hashes?: SpanHash[] - events?: SpanEvent[] - - created_at?: string - updated_at?: string - deleted_at?: string - - created_by_id?: string - updated_by_id?: string - deleted_by_id?: string -} - -export interface TraceSpanNode extends TraceSpan { - key?: string - invocationIds?: { - trace_id: string - span_id: string - } - children?: TraceSpan[] -} - -// --- RESPONSE WRAPPER -------------------------------------------------------- - -export type TracesResponse = { - version?: string - count: number - traces: Record}> -} - -export type SpansResponse = { - version?: string - count: number - spans: TraceSpan[] -} - -export interface TracingDashboardData { - buckets: { - errors: { - costs: number - count: number - duration: number - tokens: number - } - timestamp: string - total: { - costs: number - count: number - duration: number - tokens: number - } - window: number - }[] - count: number - version: string -} - -export interface GenerationDashboardData { - data: { - timestamp: number | string - success_count: number - failure_count: number - cost: number - latency: number - total_tokens: number - prompt_tokens: number - completion_tokens: number - enviornment: string - variant: string - }[] - total_count: number - failure_rate: number - total_cost: number - avg_cost: number - avg_latency: number - total_tokens: number - avg_tokens: number -} diff --git a/web/oss/src/services/variant/api.ts b/web/oss/src/services/variant/api.ts deleted file mode 100644 index 8ef6ca8ca1..0000000000 --- a/web/oss/src/services/variant/api.ts +++ /dev/null @@ -1,17 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" -import type {ApiVariant, VariantRevision} from "@/oss/lib/Types" - -export const fetchAppVariants = async (appId: string, projectId?: string) => { - const {data} = await axios.get(`/api/apps/${appId}/variants`, { - params: { - project_id: projectId, - v: 2, - }, - }) - return data -} - -export const fetchVariantRevisions = async (variantId: string) => { - const {data} = await axios.get(`/api/variants/${variantId}/revisions`) - return data -} diff --git a/web/oss/src/services/variantConfigs/api/index.ts b/web/oss/src/services/variantConfigs/api/index.ts deleted file mode 100644 index 1190123367..0000000000 --- a/web/oss/src/services/variantConfigs/api/index.ts +++ /dev/null @@ -1,77 +0,0 @@ -import axios from "@/oss/lib/api/assets/axiosConfig" - -export interface VariantReferenceRequest { - projectId: string - application: { - id?: string - slug?: string - } - variant: { - id?: string - slug?: string - version?: number | null - } -} - -export interface VariantConfigResponse { - params?: Record - url?: string | null - application_ref?: { - id?: string - slug?: string - } - variant_ref?: { - id?: string - slug?: string - version?: number | null - } - service_ref?: { - id?: string - slug?: string - version?: number | null - } -} - -const isEmpty = (obj: Record) => - Object.values(obj).every((value) => value === undefined || value === null) - -export const fetchVariantConfig = async ({ - projectId, - application, - variant, -}: VariantReferenceRequest): Promise => { - if (!projectId) { - throw new Error("Project id is required to fetch variant config") - } - - const payload: Record = {} - - if (!isEmpty(application)) { - payload.application_ref = application - } - - if (!isEmpty(variant)) { - payload.variant_ref = variant - } - - if (!payload.variant_ref) { - throw new Error("Variant reference is required to fetch variant config") - } - - try { - const response = await axios.post( - `/variants/configs/fetch?project_id=${projectId}`, - payload, - { - _ignoreError: true, - } as any, - ) - - return (response.data as VariantConfigResponse) ?? null - } catch (error: any) { - if (error?.response?.status === 404) { - return null - } - throw error - } -} diff --git a/web/oss/src/services/vault/api/index.ts b/web/oss/src/services/vault/api/index.ts index 09acc739f6..597f148627 100644 --- a/web/oss/src/services/vault/api/index.ts +++ b/web/oss/src/services/vault/api/index.ts @@ -1,8 +1,8 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" import {transformSecret} from "@/oss/lib/helpers/llmProviders" -import {CustomSecretDTO, StandardSecretDTO} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" +import {StandardSecretDTO, CustomSecretDTO} from "@/oss/lib/Types" //Prefix convention: // - fetch: GET single entity from server @@ -12,17 +12,17 @@ import {getProjectValues} from "@/oss/state/project" // - delete: DELETE data from server export const fetchVaultSecret = async () => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.get( - `${getAgentaApiUrl()}/vault/v1/secrets/?project_id=${projectId}`, + `${getAgentaApiUrl()}/vault/v1/secrets?project_id=${projectId}`, ) return transformSecret(response.data as StandardSecretDTO[] | CustomSecretDTO[]) } export const createVaultSecret = async ({payload}: {payload: T}) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( - `${getAgentaApiUrl()}/vault/v1/secrets/?project_id=${projectId}`, + `${getAgentaApiUrl()}/vault/v1/secrets?project_id=${projectId}`, payload, ) return response.data as T @@ -35,7 +35,7 @@ export const updateVaultSecret = async ({ secret_id: string payload: T }) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.put( `${getAgentaApiUrl()}/vault/v1/secrets/${secret_id}?project_id=${projectId}`, payload, @@ -44,7 +44,7 @@ export const updateVaultSecret = async ({ } export const deleteVaultSecret = async ({secret_id}: {secret_id: string}) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() return await axios.delete( `${getAgentaApiUrl()}/vault/v1/secrets/${secret_id}?project_id=${projectId}`, ) diff --git a/web/oss/src/services/workspace/api/index.ts b/web/oss/src/services/workspace/api/index.ts index a5ded23d8b..78e7278872 100644 --- a/web/oss/src/services/workspace/api/index.ts +++ b/web/oss/src/services/workspace/api/index.ts @@ -1,7 +1,7 @@ +import {getCurrentProject} from "@/oss/contexts/project.context" import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {WorkspaceRole, Workspace, WorkspaceMember} from "@/oss/lib/Types" -import {getProjectValues} from "@/oss/state/project" +import {getAgentaApiUrl} from "@/oss/lib/helpers/utils" +import {WorkspaceRole} from "@/oss/lib/Types" //Prefix convention: // - fetch: GET single entity from server @@ -11,7 +11,7 @@ import {getProjectValues} from "@/oss/state/project" // - delete: DELETE data from server export const fetchAllWorkspaceRoles = async (ignoreAxiosError = false) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.get( `${getAgentaApiUrl()}/workspaces/roles?project_id=${projectId}`, @@ -24,18 +24,18 @@ export const fetchAllWorkspaceRoles = async (ignoreAxiosError = false) => { export const assignWorkspaceRole = async ( { - organizationId, + orgId, workspaceId, email, role, - }: {organizationId: string; workspaceId: string; email: string; role: string}, + }: {orgId: string; workspaceId: string; email: string; role: string}, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( `${getAgentaApiUrl()}/workspaces/${workspaceId}/roles?project_id=${projectId}`, - {email, organization_id: organizationId, role}, + {email, organization_id: orgId, role}, { _ignoreError: ignoreAxiosError, } as any, @@ -45,19 +45,19 @@ export const assignWorkspaceRole = async ( export const unAssignWorkspaceRole = async ( { - organizationId, + orgId, workspaceId, email, role, - }: {organizationId: string; workspaceId: string; email: string; role: string}, + }: {orgId: string; workspaceId: string; email: string; role: string}, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.delete( `${getAgentaApiUrl()}/workspaces/${workspaceId}/roles?project_id=${projectId}`, { - params: {email, organization_id: organizationId, role}, + params: {email, org_id: orgId, role}, _ignoreError: ignoreAxiosError, } as any, ) @@ -68,19 +68,19 @@ export const unAssignWorkspaceRole = async ( export const inviteToWorkspace = async ( { data, - organizationId, + orgId, workspaceId, }: { - organizationId: string + orgId: string workspaceId: string data: {email: string; roles?: string[]}[] }, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( - `${getAgentaApiUrl()}/organizations/${organizationId}/workspaces/${workspaceId}/invite?project_id=${projectId}`, + `${getAgentaApiUrl()}/organizations/${orgId}/workspaces/${workspaceId}/invite?project_id=${projectId}`, data, { _ignoreError: ignoreAxiosError, @@ -90,17 +90,13 @@ export const inviteToWorkspace = async ( } export const resendInviteToWorkspace = async ( - { - email, - organizationId, - workspaceId, - }: {organizationId: string; workspaceId: string; email: string}, + {email, orgId, workspaceId}: {orgId: string; workspaceId: string; email: string}, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.post( - `${getAgentaApiUrl()}/organizations/${organizationId}/workspaces/${workspaceId}/invite/resend?project_id=${projectId}`, + `${getAgentaApiUrl()}/organizations/${orgId}/workspaces/${workspaceId}/invite/resend?project_id=${projectId}`, {email}, { _ignoreError: ignoreAxiosError, @@ -112,21 +108,15 @@ export const resendInviteToWorkspace = async ( export const acceptWorkspaceInvite = async ( { token, - organizationId, + orgId, workspaceId, projectId, email, - }: { - token: string - organizationId: string - workspaceId: string - projectId: string - email?: string - }, + }: {token: string; orgId: string; workspaceId: string; projectId: string; email?: string}, ignoreAxiosError = false, ) => { const response = await axios.post( - `${getAgentaApiUrl()}/organizations/${organizationId}/workspaces/${workspaceId}/invite/accept?project_id=${projectId}`, + `${getAgentaApiUrl()}/organizations/${orgId}/workspaces/${workspaceId}/invite/accept?project_id=${projectId}`, {token, ...(email ? {email} : {})}, { _ignoreError: ignoreAxiosError, @@ -136,66 +126,28 @@ export const acceptWorkspaceInvite = async ( } export const removeFromWorkspace = async ( - { - organizationId, - workspaceId, - email, - }: {organizationId: string; workspaceId: string; email: string}, + {orgId, workspaceId, email}: {orgId: string; workspaceId: string; email: string}, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.delete( `${getAgentaApiUrl()}/workspaces/${workspaceId}/users?project_id=${projectId}`, - {params: {email, organization_id: organizationId}, _ignoreError: ignoreAxiosError} as any, + {params: {email, org_id: orgId}, _ignoreError: ignoreAxiosError} as any, ) return response.data } export const updateWorkspace = async ( - { - organizationId, - workspaceId, - name, - }: {organizationId: string; workspaceId: string; name: string}, + {orgId, workspaceId, name}: {orgId: string; workspaceId: string; name: string}, ignoreAxiosError = false, ) => { - const {projectId} = getProjectValues() + const {projectId} = getCurrentProject() const response = await axios.put( - `${getAgentaApiUrl()}/organizations/${organizationId}/workspaces/${workspaceId}/?project_id=${projectId}`, + `${getAgentaApiUrl()}/organizations/${orgId}/workspaces/${workspaceId}/?project_id=${projectId}`, {name}, {_ignoreError: ignoreAxiosError} as any, ) return response.data } - -export const fetchWorkspaceDetails = async ( - workspaceId: string, - ignoreAxiosError = false, -): Promise => { - const {projectId} = getProjectValues() - - const response = await axios.get( - `${getAgentaApiUrl()}/workspaces/${workspaceId}?project_id=${projectId}`, - { - _ignoreError: ignoreAxiosError, - } as any, - ) - return response.data as Workspace -} - -export const fetchWorkspaceMembers = async ( - workspaceId: string, - ignoreAxiosError = false, -): Promise => { - const {projectId} = getProjectValues() - - const response = await axios.get( - `${getAgentaApiUrl()}/workspaces/${workspaceId}/members?project_id=${projectId}`, - { - _ignoreError: ignoreAxiosError, - } as any, - ) - return response.data as WorkspaceMember[] -} diff --git a/web/oss/src/services/workspace/index.ts b/web/oss/src/services/workspace/index.ts deleted file mode 100644 index 3485998528..0000000000 --- a/web/oss/src/services/workspace/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Workspace Service - Modern fetchJson Implementation - * - * Aligned with working patterns from projects, variants, and revisions. - * Uses standard fetchJson for consistency and reliability. - */ - -import {fetchJson, getBaseUrl} from "../../lib/api/assets/fetchClient" -import {WorkspaceMember} from "../../lib/Types" - -/** - * Fetch all workspace members for a given workspace - */ -export const fetchWorkspaceMembers = async (workspaceId: string): Promise => { - const base = getBaseUrl() - const url = new URL(`api/workspaces/${workspaceId}/members`, base) - - console.log("🔍 Workspace members fetcher debug:", {base, url: url.toString(), workspaceId}) - - try { - console.log("🚀 Calling fetchJson with URL:", url.toString()) - const data = await fetchJson(url) - console.log("✅ Workspace members fetcher success:", { - count: data?.length || 0, - data: data?.slice(0, 2), // Show first 2 members for debugging - }) - return data || [] - } catch (error) { - console.error("❌ Workspace members fetcher failed:", { - message: error?.message, - status: error?.status, - statusText: error?.statusText, - url: url.toString(), - stack: error?.stack?.split("\n").slice(0, 3).join("\n"), - }) - return [] - } -} diff --git a/web/oss/src/state/Providers.tsx b/web/oss/src/state/Providers.tsx deleted file mode 100644 index f6e67441ce..0000000000 --- a/web/oss/src/state/Providers.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import {PropsWithChildren} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {Provider, getDefaultStore} from "jotai" -import {useHydrateAtoms} from "jotai/react/utils" -import {queryClientAtom} from "jotai-tanstack-query" - -import WebWorkerProvider from "../components/Playground/Components/WebWorkerProvider" -import AgSWRConfig from "../lib/api/SWRConfig" - -import {SessionListener} from "./session" - -const HydrateAtoms = ({children}: PropsWithChildren) => { - const queryClient = useQueryClient() - useHydrateAtoms([[queryClientAtom, queryClient]]) - return children -} - -const GlobalStateProvider = ({children}: PropsWithChildren) => { - const sharedStore = getDefaultStore() - return ( - - - - - - {children} - - - - - ) -} - -export default GlobalStateProvider diff --git a/web/oss/src/state/app/assets/constants.ts b/web/oss/src/state/app/assets/constants.ts deleted file mode 100644 index 36306b3db9..0000000000 --- a/web/oss/src/state/app/assets/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const LS_APP_KEY = "recentlyVisitedApp" diff --git a/web/oss/src/state/app/atoms/fetcher.ts b/web/oss/src/state/app/atoms/fetcher.ts deleted file mode 100644 index abfbea516f..0000000000 --- a/web/oss/src/state/app/atoms/fetcher.ts +++ /dev/null @@ -1,154 +0,0 @@ -import {atom} from "jotai" -import {atomFamily, atomWithStorage} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {ListAppsItem, User} from "@/oss/lib/Types" -import {fetchAppContainerURL} from "@/oss/services/api" -import {fetchAllApps} from "@/oss/services/app" -import {appIdentifiersAtom, appStateSnapshotAtom, requestNavigationAtom} from "@/oss/state/appState" -import {activeInviteAtom} from "@/oss/state/url/auth" - -import {selectedOrgIdAtom} from "../../org" -import {userAtom, profileQueryAtom} from "../../profile/selectors/user" -import {projectIdAtom} from "../../project/selectors/project" -import {jwtReadyAtom} from "../../session/jwt" -import {devLog} from "../../utils/devLog" -import {stringStorage} from "../../utils/stringStorage" -import {LS_APP_KEY} from "../assets/constants" - -const baseRouterAppIdAtom = atom(null) - -export const routerAppIdAtom = atom( - (get) => { - const derived = get(appIdentifiersAtom).appId - if (derived) return derived - const fallback = get(baseRouterAppIdAtom) - if (fallback) return fallback - if (typeof process !== "undefined" && process.env.NODE_ENV === "test") { - return process.env.VITEST_TEST_APP_ID || process.env.TEST_APP_ID || null - } - return null - }, - (get, set, update: string | null) => { - const next = - typeof update === "function" ? (update as any)(get(baseRouterAppIdAtom)) : update - set(baseRouterAppIdAtom, next) - }, -) - -export const routerAppNavigationAtom = atom(null, (get, set, next: string | null) => { - const identifiers = get(appIdentifiersAtom) - const {workspaceId, projectId, appId: current} = identifiers - if (!workspaceId || !projectId) return - - if (!next) { - const href = `/w/${encodeURIComponent(workspaceId)}/p/${encodeURIComponent(projectId)}/apps` - set(requestNavigationAtom, {type: "href", href, method: "replace"}) - return - } - - if (next === current) return - - const base = `/w/${encodeURIComponent(workspaceId)}/p/${encodeURIComponent(projectId)}/apps/${encodeURIComponent(next)}` - const snapshot = get(appStateSnapshotAtom) - const rest = snapshot.routeLayer === "app" ? snapshot.restPath : [] - const href = rest.length ? `${base}/${rest.join("/")}` : `${base}/overview` - set(requestNavigationAtom, {type: "href", href, method: "push"}) -}) - -export const recentAppIdAtom = atomWithStorage(LS_APP_KEY, null, stringStorage) - -export const appsQueryAtom = atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const profileState = get(profileQueryAtom) - const user = get(userAtom) as User | null - const isProj = !!projectId - const jwtReady = get(jwtReadyAtom).data ?? false - const organizationId = get(selectedOrgIdAtom) - const activeInvite = get(activeInviteAtom) - const enabled = - profileState.isSuccess && - jwtReady && - !!user?.id && - isProj && - !!projectId && - !!organizationId && - !activeInvite - - return { - queryKey: ["apps", projectId], - queryFn: async () => { - const data = await fetchAllApps() - return data.filter((app) => app.app_type !== "custom (sdk)") - }, - staleTime: 1000 * 60, // 1 minute - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled, - } -}) - -/** - * Atom family for fetching app container URIs - * Creates focused atoms for specific app+variant combinations - */ -export const uriQueryAtomFamily = atomFamily((params: {appId: string; variantId?: string}) => - atomWithQuery((get) => { - const {appId, variantId} = params - const projectId = get(projectIdAtom) - - return { - queryKey: ["uri", appId, variantId], - queryFn: async () => { - const url = await fetchAppContainerURL(appId, variantId) - return `${url}/run` - }, - staleTime: 1000 * 60 * 5, // 5 minutes - URIs don't change often - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!projectId && !!variantId, // Only fetch when variantId is provided - retry: (failureCount, error) => { - // Don't retry if it's a 404 or similar client error - if ( - (error as any)?.response?.status >= 400 && - (error as any)?.response?.status < 500 - ) { - return false - } - return failureCount < 3 - }, - } - }), -) - -export const appDetailQueryAtomFamily = atomFamily((appId: string | null) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - - return { - queryKey: ["app", appId, projectId], - queryFn: async () => { - if (!appId) return null - const {data} = await axios.get( - `${getAgentaApiUrl()}/apps/${encodeURIComponent(appId)}?project_id=${projectId}`, - ) - return data as ListAppsItem - }, - staleTime: 1000 * 60, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!projectId && !!appId, - } - }), -) - -const logApps = process.env.NEXT_PUBLIC_LOG_APP_ATOMS === "true" - -;[appsQueryAtom, routerAppIdAtom, recentAppIdAtom].forEach((a, i) => - devLog(a as any, ["appsQueryAtom", "routerAppIdAtom", "recentAppIdAtom"][i], logApps), -) diff --git a/web/oss/src/state/app/atoms/templates.ts b/web/oss/src/state/app/atoms/templates.ts deleted file mode 100644 index 0f2184f102..0000000000 --- a/web/oss/src/state/app/atoms/templates.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {atom} from "jotai" -import {atomWithQuery} from "jotai-tanstack-query" - -import {fetchAllTemplates} from "@/oss/services/app-selector/api" - -import {projectIdAtom} from "../../project/selectors/project" - -/** - * Atom for fetching container templates - */ -export const templatesQueryAtom = atomWithQuery((get) => { - const projectId = get(projectIdAtom) - - return { - queryKey: ["templates", projectId], - queryFn: async () => { - const data = await fetchAllTemplates() - return data - }, - staleTime: 1000 * 60 * 5, // 5 minutes - templates don't change often - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!projectId, - retry: (failureCount, error) => { - // Don't retry if it's a 404 or similar client error - if ((error as any)?.response?.status >= 400 && (error as any)?.response?.status < 500) { - return false - } - return failureCount < 3 - }, - } -}) - -/** - * Atom for tracking no template message state - */ -export const noTemplateMessageAtom = atom("") - -/** - * Derived atom that handles the templates data and error states - */ -export const templatesDataAtom = atom((get) => { - const queryResult = get(templatesQueryAtom) - - // Handle the case where data is a string (error message) - if (typeof queryResult.data === "string") { - return { - templates: [], - noTemplateMessage: queryResult.data, - isLoading: queryResult.isPending, - error: queryResult.error, - refetch: queryResult.refetch, - } - } - - return { - templates: queryResult.data ?? [], - noTemplateMessage: "", - isLoading: queryResult.isPending, - error: queryResult.error, - refetch: queryResult.refetch, - } -}) diff --git a/web/oss/src/state/app/atoms/vault.ts b/web/oss/src/state/app/atoms/vault.ts deleted file mode 100644 index fd66d7b967..0000000000 --- a/web/oss/src/state/app/atoms/vault.ts +++ /dev/null @@ -1,265 +0,0 @@ -import {atom} from "jotai" -import {atomWithMutation, atomWithQuery} from "jotai-tanstack-query" - -import { - llmAvailableProviders, - llmAvailableProvidersToken, - LlmProvider, - transformCustomProviderPayloadData, -} from "@/oss/lib/helpers/llmProviders" -import {removeEmptyFromObjects} from "@/oss/lib/helpers/utils" -import {SecretDTOProvider, SecretDTOKind} from "@/oss/lib/Types" -import { - fetchVaultSecret, - createVaultSecret, - updateVaultSecret, - deleteVaultSecret, -} from "@/oss/services/vault/api" - -import {userAtom} from "../../profile/selectors/user" -import {projectIdAtom} from "../../project" - -/** - * Atom for tracking vault key migration status - * Used to ensure migration only happens once and track its progress - */ -export const vaultMigrationAtom = atom({ - migrating: false, - migrated: false, -}) - -/** - * Query atom for fetching vault secrets - * Only enabled when user is authenticated and migration is complete - */ -export const vaultSecretsQueryAtom = atomWithQuery((get) => { - const user = get(userAtom) - const migrationStatus = get(vaultMigrationAtom) - const projectId = get(projectIdAtom) - - return { - queryKey: ["vault", "secrets", user?.id], - queryFn: fetchVaultSecret, - staleTime: 1000 * 60 * 5, // 5 minutes - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: true, - enabled: !!user && !!projectId, - // && migrationStatus.migrated, // Only fetch when user exists and migration is done - } -}) - -/** - * Derived atom for standard provider secrets - * Maps vault data to available providers with their keys - */ -export const standardSecretsAtom = atom((get) => { - const queryResult = get(vaultSecretsQueryAtom) - const data = queryResult.data || [] - - return llmAvailableProviders.map((secret) => { - const match = data.find((item: LlmProvider) => item.name === secret.name) - if (match) { - return { - ...secret, - key: match.key, - id: match.id, - created_at: match.created_at, - } - } else { - return secret - } - }) -}) - -/** - * Derived atom for custom provider secrets - * Filters vault data for custom provider configurations - */ -export const customSecretsAtom = atom((get) => { - const queryResult = get(vaultSecretsQueryAtom) - const data = queryResult.data || [] - - return data.filter((secret) => secret.type === SecretDTOKind.CUSTOM_PROVIDER_KEY) -}) - -/** - * Mutation atom for creating vault secrets - */ -export const createVaultSecretMutationAtom = atomWithMutation(() => ({ - mutationFn: async (payload: any) => { - return await createVaultSecret({payload}) - }, - onSuccess: () => { - // Invalidate and refetch vault secrets - // This will be handled by the hook - }, -})) - -/** - * Mutation atom for updating vault secrets - */ -export const updateVaultSecretMutationAtom = atomWithMutation(() => ({ - mutationFn: async ({secret_id, payload}: {secret_id: string; payload: any}) => { - return await updateVaultSecret({secret_id, payload}) - }, - onSuccess: () => { - // Invalidate and refetch vault secrets - // This will be handled by the hook - }, -})) - -/** - * Mutation atom for deleting vault secrets - */ -export const deleteVaultSecretMutationAtom = atomWithMutation(() => ({ - mutationFn: async (secret_id: string) => { - return await deleteVaultSecret({secret_id}) - }, - onSuccess: () => { - // Invalidate and refetch vault secrets - // This will be handled by the hook - }, -})) - -/** - * Helper function to get environment name mapping for providers - * Maps environment variable names to their SecretDTOProvider enum values - * This matches the original working implementation - */ -const getEnvNameMap = (): Record => ({ - OPENAI_API_KEY: SecretDTOProvider.OPENAI, - COHERE_API_KEY: SecretDTOProvider.COHERE, - ANYSCALE_API_KEY: SecretDTOProvider.ANYSCALE, - DEEPINFRA_API_KEY: SecretDTOProvider.DEEPINFRA, - ALEPHALPHA_API_KEY: SecretDTOProvider.ALEPHALPHA, - GROQ_API_KEY: SecretDTOProvider.GROQ, - MISTRAL_API_KEY: SecretDTOProvider.MISTRALAI, - ANTHROPIC_API_KEY: SecretDTOProvider.ANTHROPIC, - PERPLEXITYAI_API_KEY: SecretDTOProvider.PERPLEXITYAI, - TOGETHERAI_API_KEY: SecretDTOProvider.TOGETHERAI, - OPENROUTER_API_KEY: SecretDTOProvider.OPENROUTER, - GEMINI_API_KEY: SecretDTOProvider.GEMINI, -}) - -/** - * Atom for creating standard provider vault secrets - * Handles the complex payload creation and provider mapping - */ -export const createStandardSecretAtom = atom(null, async (get, set, provider: LlmProvider) => { - const envNameMap = getEnvNameMap() - const standardSecrets = get(standardSecretsAtom) - const createMutation = get(createVaultSecretMutationAtom) - const updateMutation = get(updateVaultSecretMutationAtom) - - try { - // Match the original working payload structure exactly - const payload = { - header: { - name: provider.title, - description: "", - }, - secret: { - kind: SecretDTOKind.PROVIDER_KEY, - data: { - kind: envNameMap[provider.name as string], - provider: { - key: provider.key, - }, - }, - }, - } - - const findSecret = standardSecrets.find((s) => s.name === provider.name) - - if (findSecret && provider.id) { - await updateMutation.mutateAsync({secret_id: provider.id, payload}) - } else { - await createMutation.mutateAsync(payload) - } - } catch (error) { - console.error("Failed to create/update standard secret:", error) - throw error - } -}) - -/** - * Atom for creating custom provider vault secrets - * Handles custom provider payload transformation and cleanup - */ -export const createCustomSecretAtom = atom(null, async (get, set, provider: LlmProvider) => { - const customSecrets = get(customSecretsAtom) - const createMutation = get(createVaultSecretMutationAtom) - const updateMutation = get(updateVaultSecretMutationAtom) - - try { - const rawPayload = transformCustomProviderPayloadData(provider) - const payload = removeEmptyFromObjects(rawPayload) - - const findSecret = customSecrets.find((s) => s.id === provider.id) - - if (findSecret && provider.id) { - await updateMutation.mutateAsync({secret_id: provider.id, payload}) - } else { - await createMutation.mutateAsync(payload) - } - } catch (error) { - console.error("Failed to create/update custom secret:", error) - throw error - } -}) - -/** - * Atom for deleting vault secrets - */ -export const deleteSecretAtom = atom(null, async (get, set, provider: LlmProvider) => { - const deleteMutation = get(deleteVaultSecretMutationAtom) - - try { - if (provider.id) { - await deleteMutation.mutateAsync(provider.id) - } - } catch (error) { - console.error("Failed to delete secret:", error) - throw error - } -}) - -/** - * Migration atom for handling localStorage to vault migration - * This is a write-only atom that performs the migration process - */ -export const migrateVaultKeysAtom = atom(null, async (get, set) => { - const migrationStatus = get(vaultMigrationAtom) - - if (migrationStatus.migrating || migrationStatus.migrated) { - return - } - - set(vaultMigrationAtom, {migrating: true, migrated: false}) - - try { - const localStorageProviders = localStorage.getItem(llmAvailableProvidersToken) - - if (localStorageProviders) { - const _providers = JSON.parse(localStorageProviders) - const providers = JSON.parse(_providers) - - for (const provider of providers) { - if (provider.key) { - await set(createStandardSecretAtom, provider as LlmProvider) - } - } - - // Create backup and cleanup - localStorage.setItem(`${llmAvailableProvidersToken}Backup`, localStorageProviders) - localStorage.removeItem(llmAvailableProvidersToken) - } - - set(vaultMigrationAtom, {migrating: false, migrated: true}) - } catch (error) { - console.error("Migration failed:", error) - set(vaultMigrationAtom, {migrating: false, migrated: false}) - throw error - } -}) diff --git a/web/oss/src/state/app/hooks.ts b/web/oss/src/state/app/hooks.ts deleted file mode 100644 index f86fff801d..0000000000 --- a/web/oss/src/state/app/hooks.ts +++ /dev/null @@ -1,63 +0,0 @@ -import {useCallback, useEffect} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {useAtom, useAtomValue} from "jotai" - -import {ListAppsItem} from "@/oss/lib/Types" -import {useAppState} from "@/oss/state/appState" - -import {appsQueryAtom, recentAppIdAtom} from "./atoms/fetcher" -import {currentAppAtom, appsAtom} from "./selectors/app" - -export const useApps = () => useAtom(appsQueryAtom) - -export const useAppsData = () => { - const [{data: apps, isPending, isLoading, error, refetch}] = useAtom(appsQueryAtom) - const currentApp = useAtomValue(currentAppAtom) - const [recentAppId, setRecentAppId] = useAtom(recentAppIdAtom) - const queryClient = useQueryClient() - const {appId} = useAppState() - - useEffect(() => { - // Only set recent app from URL when it exists in the filtered apps list - // This avoids enabling app-sidebar for SDK evaluation apps (filtered out) - if (!appId) return - if (Array.isArray(apps)) { - const exists = (apps as ListAppsItem[]).some((app) => app.app_id === appId) - if (exists) { - if (recentAppId !== appId) setRecentAppId(appId) - } else { - if (recentAppId) setRecentAppId(null) - } - } - // If apps haven't loaded yet, do nothing here; the fallback effect below will enforce validity once loaded - }, [appId, apps, recentAppId, setRecentAppId]) - - useEffect(() => { - if (recentAppId && Array.isArray(apps)) { - const exists = (apps as ListAppsItem[]).some((app) => app.app_id === recentAppId) - if (!exists) setRecentAppId(null) - } - }, [apps, recentAppId, setRecentAppId]) - - const reset = useCallback(() => { - queryClient.removeQueries({queryKey: ["apps"]}) - }, [queryClient]) - - return { - currentApp: currentApp ?? null, - apps: apps ?? [], - error, - isLoading, - isPending, - mutate: refetch, - reset, - recentlyVisitedAppId: recentAppId, - } -} - -export const useCurrentApp = () => useAtomValue(currentAppAtom) -export const useAppList = () => useAtomValue(appsAtom) -export default function AppListener() { - return null -} diff --git a/web/oss/src/state/app/hooks/useTemplates.ts b/web/oss/src/state/app/hooks/useTemplates.ts deleted file mode 100644 index be03ad9f79..0000000000 --- a/web/oss/src/state/app/hooks/useTemplates.ts +++ /dev/null @@ -1,30 +0,0 @@ -import {useMemo} from "react" - -import {useAtomValue} from "jotai" - -import {templatesDataAtom} from "../atoms/templates" - -/** - * Hook for fetching container templates using Jotai atoms - * Replaces the SWR-based useTemplates hook - */ -const EMPTY_TEMPLATES = [] -export const useTemplates = () => { - const {templates, noTemplateMessage, isLoading, error, refetch} = - useAtomValue(templatesDataAtom) - - const returnValue = useMemo(() => { - return [ - { - data: templates || EMPTY_TEMPLATES, - error, - isLoading, - isValidating: isLoading, - mutate: refetch, - }, - noTemplateMessage, - ] as const - }, [templates, noTemplateMessage, isLoading, error, refetch]) - - return returnValue -} diff --git a/web/oss/src/state/app/hooks/useURI.ts b/web/oss/src/state/app/hooks/useURI.ts deleted file mode 100644 index 346e70207a..0000000000 --- a/web/oss/src/state/app/hooks/useURI.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {useMemo} from "react" - -import {useAtomValue} from "jotai" - -import {uriQueryAtomFamily} from "../atoms/fetcher" - -/** - * Hook for fetching app container URIs using Jotai atoms - * Replaces the SWR-based useURI hook - */ -export const useURI = (appId: string, variantId?: string) => { - const uriAtom = useMemo(() => uriQueryAtomFamily({appId, variantId}), [appId, variantId]) - - const queryResult = useAtomValue(uriAtom) - - // Return the same interface as the original SWR hook for compatibility - return { - data: queryResult.data, - error: queryResult.error, - isLoading: queryResult.isPending, - isValidating: queryResult.isPending, - mutate: queryResult.refetch, - } -} diff --git a/web/oss/src/state/app/hooks/useVaultSecret.ts b/web/oss/src/state/app/hooks/useVaultSecret.ts deleted file mode 100644 index 1944b82194..0000000000 --- a/web/oss/src/state/app/hooks/useVaultSecret.ts +++ /dev/null @@ -1,123 +0,0 @@ -import {useCallback, useEffect, useMemo} from "react" - -import {useAtom, useAtomValue, useSetAtom} from "jotai" - -import {LlmProvider} from "@/oss/lib/helpers/llmProviders" -import {useProfileData} from "@/oss/state/profile" - -import { - vaultMigrationAtom, - vaultSecretsQueryAtom, - standardSecretsAtom, - customSecretsAtom, - createStandardSecretAtom, - createCustomSecretAtom, - deleteSecretAtom, - migrateVaultKeysAtom, -} from "../atoms/vault" - -/** - * Hook for managing vault secrets and LLM provider keys using Jotai atoms - * Replaces the SWR-based useVaultSecret hook - * - * Features: - * - Handles migration from localStorage to vault system - * - Manages CRUD operations for provider keys using atoms - * - Provides real-time synchronization using React Query via Jotai - * - Supports both standard and custom provider configurations - * - * @returns { - * loading: boolean - Loading state including migration - * secrets: LlmProvider[] - List of standard provider configurations - * customRowSecrets: LlmProvider[] - List of custom provider configurations - * mutate: Function - Function to refresh vault data - * handleModifyVaultSecret: Function - Update/create standard provider - * handleDeleteVaultSecret: Function - Delete provider configuration - * handleModifyCustomVaultSecret: Function - Update/create custom provider - * } - */ -export const useVaultSecret = () => { - const {user} = useProfileData() - - // Atoms for state management - const [migrationStatus, setMigrationStatus] = useAtom(vaultMigrationAtom) - const vaultQuery = useAtomValue(vaultSecretsQueryAtom) - const standardSecrets = useAtomValue(standardSecretsAtom) - const customSecrets = useAtomValue(customSecretsAtom) - - // Action atoms - const createStandardSecret = useSetAtom(createStandardSecretAtom) - const createCustomSecret = useSetAtom(createCustomSecretAtom) - const deleteSecret = useSetAtom(deleteSecretAtom) - const migrateKeys = useSetAtom(migrateVaultKeysAtom) - - /** - * Handle migration when user is available and migration hasn't been attempted - */ - useEffect(() => { - if (user && !migrationStatus.migrating && !migrationStatus.migrated) { - migrateKeys() - } else if (!user && (migrationStatus.migrated || migrationStatus.migrating)) { - // Reset migration status when user logs out - setMigrationStatus({migrating: false, migrated: false}) - } - }, [user, migrationStatus.migrating, migrationStatus.migrated, migrateKeys, setMigrationStatus]) - - /** - * Handle standard provider secret creation/update - * This matches the original implementation pattern - */ - const handleModifyVaultSecret = useCallback( - async (provider: LlmProvider) => { - await createStandardSecret(provider) - vaultQuery.refetch() // Refresh data after mutation - }, - [createStandardSecret, vaultQuery], - ) - - /** - * Handle custom provider secret creation/update - */ - const handleModifyCustomVaultSecret = useCallback( - async (provider: LlmProvider) => { - await createCustomSecret(provider) - vaultQuery.refetch() // Refresh data after mutation - }, - [createCustomSecret, vaultQuery], - ) - - /** - * Handle provider secret deletion - */ - const handleDeleteVaultSecret = useCallback( - async (provider: LlmProvider) => { - await deleteSecret(provider) - vaultQuery.refetch() // Refresh data after mutation - }, - [deleteSecret, vaultQuery], - ) - - /** - * Manual refresh function for vault data - */ - const mutate = useCallback(() => { - vaultQuery.refetch() - }, [vaultQuery]) - - /** - * Computed loading state considering both data fetching and migration - */ - const loading = useMemo(() => { - return vaultQuery.isPending || migrationStatus.migrating || !migrationStatus.migrated - }, [vaultQuery.isPending, migrationStatus.migrating, migrationStatus.migrated]) - - return { - loading, - secrets: standardSecrets, - customRowSecrets: customSecrets, - mutate, - handleModifyVaultSecret, - handleDeleteVaultSecret, - handleModifyCustomVaultSecret, - } -} diff --git a/web/oss/src/state/app/index.ts b/web/oss/src/state/app/index.ts deleted file mode 100644 index b80c1876a1..0000000000 --- a/web/oss/src/state/app/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -export * from "./atoms/fetcher" -export * from "./atoms/templates" -export * from "./atoms/vault" -export * from "./selectors/app" -export * from "./hooks" -export * from "./hooks/useTemplates" -export * from "./hooks/useURI" -export * from "./hooks/useVaultSecret" - -import {getDefaultStore} from "jotai" -import {loadable} from "jotai/vanilla/utils" -import {queryClientAtom} from "jotai-tanstack-query" - -import {ListAppsItem} from "@/oss/lib/Types" - -import {appIdentifiersAtom} from "../appState" - -import { - appsQueryAtom, - routerAppIdAtom, - routerAppNavigationAtom, - recentAppIdAtom, -} from "./atoms/fetcher" - -export const getAppValues = () => { - const store = getDefaultStore() - const appsState = store.get(loadable(appsQueryAtom)) - const rawApps = appsState.state === "hasData" ? appsState.data.data : [] - const apps: ListAppsItem[] = Array.isArray(rawApps) ? rawApps : [] - const identifiers = store.get(appIdentifiersAtom) - const appId = identifiers.appId || store.get(recentAppIdAtom) - const currentApp = apps.find((a) => a.app_id === appId) || null - return {apps, currentApp} -} - -export const resetAppData = () => { - const store = getDefaultStore() - const queryClient = store.get(queryClientAtom) - queryClient.removeQueries({queryKey: ["apps"]}) - store.set(routerAppIdAtom, null) - store.set(routerAppNavigationAtom, null) -} diff --git a/web/oss/src/state/app/selectors/app.ts b/web/oss/src/state/app/selectors/app.ts deleted file mode 100644 index 577878e99f..0000000000 --- a/web/oss/src/state/app/selectors/app.ts +++ /dev/null @@ -1,76 +0,0 @@ -import {eagerAtom} from "jotai-eager" - -import {ListAppsItem} from "@/oss/lib/Types" -import {appStatusAtom} from "@/oss/state/variant/atoms/appStatus" -import {appStatusLoadingAtom} from "@/oss/state/variant/atoms/fetcher" - -import {appsQueryAtom, routerAppIdAtom, recentAppIdAtom} from "../atoms/fetcher" - -const EmptyApps: ListAppsItem[] = [] -export const appsAtom = eagerAtom((get) => { - const res = (get(appsQueryAtom) as any)?.data - return res ?? EmptyApps -}) - -export const selectedAppIdAtom = eagerAtom((get) => { - return get(routerAppIdAtom) || get(recentAppIdAtom) || null -}) - -export const currentAppAtom = eagerAtom((get) => { - const apps = get(appsAtom) as ListAppsItem[] - const appId = get(routerAppIdAtom) || get(recentAppIdAtom) - if (!appId) return null - return apps.find((a) => a.app_id === appId) || null -}) - -// Convenience re-exports for consumers needing raw ID atoms -export {routerAppIdAtom, recentAppIdAtom} - -// Centralized selector to determine if Playground should render for current app -export const shouldRenderPlaygroundAtom = eagerAtom((get) => { - const appId = get(routerAppIdAtom) || get(recentAppIdAtom) - const q: any = get(appsQueryAtom) - const isPending = Boolean(q?.isPending) - const data: ListAppsItem[] = (q?.data as any) ?? [] - const app = appId ? data.find((item) => item.app_id === appId) : null - - // If apps list hasn't loaded yet, allow render (components can handle skeletons) - if (isPending) return true - - // Block entirely for invalid/legacy apps - const isInvalid = app && (!app.app_type || String(app.app_type).includes(" (old)")) - if (isInvalid) return false - - // If no app found, do not block rendering - if (!app) return true - - // Leverage app service status to decide rendering for custom apps - const isLoading = get(appStatusLoadingAtom) - const isUp = get(appStatusAtom) - - // For non-custom apps, render regardless of status checks - if (app.app_type !== "custom") return true - - // For custom apps: render while loading or if up; block only when definitively down - if (isLoading) return true - return Boolean(isUp) -}) - -/** - * Current app context - provides full context for current app - * Used by: Components that need current app info - */ -export const currentAppContextAtom = eagerAtom((get) => { - const currentApp = get(currentAppAtom) - const selectedId = get(selectedAppIdAtom) - const {isLoading} = get(appsQueryAtom) - - return { - app: currentApp, - appId: selectedId, - appName: currentApp?.app_name || null, - appType: currentApp?.app_type || null, - hasApp: !!currentApp, - loading: isLoading, - } -}) diff --git a/web/oss/src/state/appCreation/status.ts b/web/oss/src/state/appCreation/status.ts deleted file mode 100644 index 411f511013..0000000000 --- a/web/oss/src/state/appCreation/status.ts +++ /dev/null @@ -1,81 +0,0 @@ -import {atom} from "jotai" -import {atomWithImmer} from "jotai-immer" - -export interface AppCreationStatus { - status: string - details?: unknown - appId?: string -} - -export interface AppCreationMessage { - type: "error" | "success" | "loading" - message: string - errorMessage?: string -} - -export const appCreationInitialStatus: AppCreationStatus = { - status: "", - details: undefined, - appId: undefined, -} -const statusAtom = atomWithImmer(appCreationInitialStatus) - -export type AppCreationStatusUpdate = - | Partial - | ((prev: AppCreationStatus) => AppCreationStatus) - -export const appCreationStatusAtom = atom( - (get) => get(statusAtom), - (_get, set, update: AppCreationStatusUpdate) => { - if (typeof update === "function") { - set(statusAtom, (draft) => { - const result = update({...draft}) - if (result) { - draft.status = result.status - draft.details = result.details - draft.appId = result.appId - } - }) - } else if (update) { - set(statusAtom, (draft) => { - if (update.status !== undefined) draft.status = update.status - if (update.details !== undefined) draft.details = update.details - if (update.appId !== undefined) draft.appId = update.appId - }) - } else { - set(statusAtom, () => appCreationInitialStatus) - } - }, -) - -const messagesAtom = atomWithImmer>({}) - -export type AppCreationMessagesUpdate = - | Record - | ((prev: Record) => Record) - -export const appCreationMessagesAtom = atom( - (get) => get(messagesAtom), - (_get, set, update: AppCreationMessagesUpdate) => { - if (typeof update === "function") { - set(messagesAtom, update) - } else { - set(messagesAtom, () => update) - } - }, -) - -const navigationAtom = atom(null) - -export const appCreationNavigationAtom = atom( - (get) => get(navigationAtom), - (_get, set, next: string | null) => { - set(navigationAtom, next) - }, -) - -export const resetAppCreationAtom = atom(null, (_get, set) => { - set(statusAtom, () => appCreationInitialStatus) - set(messagesAtom, () => ({})) - set(navigationAtom, null) -}) diff --git a/web/oss/src/state/appState/atoms.ts b/web/oss/src/state/appState/atoms.ts deleted file mode 100644 index f669aeec5d..0000000000 --- a/web/oss/src/state/appState/atoms.ts +++ /dev/null @@ -1,46 +0,0 @@ -import {atom} from "jotai" - -import {createInitialParsedLocation} from "./parse" -import type { - AppIdentifiers, - AppStateSnapshot, - NavigationCommand, - ParsedAppLocation, - RouteLayer, -} from "./types" - -const initialParsedLocation = createInitialParsedLocation() - -const initialSnapshot: AppStateSnapshot = { - ...initialParsedLocation, - timestamp: Date.now(), -} - -export const appStateSnapshotAtom = atom(initialSnapshot) - -export const setLocationAtom = atom(null, (_get, set, location: ParsedAppLocation) => { - set(appStateSnapshotAtom, { - ...location, - timestamp: Date.now(), - }) -}) - -export const appIdentifiersAtom = atom((get) => { - const snapshot = get(appStateSnapshotAtom) - return { - workspaceId: snapshot.workspaceId, - projectId: snapshot.projectId, - appId: snapshot.appId, - } -}) - -export const routeLayerAtom = atom((get) => get(appStateSnapshotAtom).routeLayer) - -export const navigationRequestAtom = atom(null) - -export const requestNavigationAtom = atom( - (get) => get(navigationRequestAtom), - (_get, set, command: NavigationCommand | null) => { - set(navigationRequestAtom, command) - }, -) diff --git a/web/oss/src/state/appState/hooks.ts b/web/oss/src/state/appState/hooks.ts deleted file mode 100644 index ed06e3d0c6..0000000000 --- a/web/oss/src/state/appState/hooks.ts +++ /dev/null @@ -1,147 +0,0 @@ -import {useCallback, useMemo} from "react" - -import {useAtomValue, useSetAtom} from "jotai" - -import {appStateSnapshotAtom, requestNavigationAtom} from "./atoms" -import type {AppStateSnapshot, NavigationCommand, NavigationMethod, QueryValue} from "./types" - -interface NavigateOptions { - shallow?: boolean -} - -interface QueryNavigationOptions extends NavigateOptions { - method?: NavigationMethod - preserveHash?: boolean -} - -const arraysEqual = (a?: string[] | null, b?: string[] | null) => { - if (a === b) return true - if (!a || !b) return false - if (a.length !== b.length) return false - for (let i = 0; i < a.length; i += 1) { - if (a[i] !== b[i]) return false - } - return true -} - -const toPatchValue = (value: QueryValue): string | string[] | undefined => { - if (value === null || value === undefined) return undefined - if (Array.isArray(value)) return value - return String(value) -} - -export const useAppState = (): AppStateSnapshot => useAtomValue(appStateSnapshotAtom) - -export const useAppQuery = () => useAtomValue(appStateSnapshotAtom).query - -export const useAppNavigation = () => { - const setNavigation = useSetAtom(requestNavigationAtom) - - const queue = useCallback( - (command: NavigationCommand | null) => { - setNavigation(command) - }, - [setNavigation], - ) - - const push = useCallback( - (href: string, options?: NavigateOptions) => { - queue({ - type: "href", - href, - method: "push", - ...(options?.shallow !== undefined ? {shallow: options.shallow} : {}), - }) - }, - [queue], - ) - - const replace = useCallback( - (href: string, options?: NavigateOptions) => { - queue({ - type: "href", - href, - method: "replace", - ...(options?.shallow !== undefined ? {shallow: options.shallow} : {}), - }) - }, - [queue], - ) - - const patchQuery = useCallback( - ( - patch: Record, - options?: QueryNavigationOptions, - ) => { - queue({ - type: "patch-query", - patch, - ...(options?.method ? {method: options.method} : {}), - ...(options?.shallow !== undefined ? {shallow: options.shallow} : {}), - ...(options?.preserveHash ? {preserveHash: true} : {}), - }) - }, - [queue], - ) - - const setQueryParam = useCallback( - (key: string, value: QueryValue, options?: QueryNavigationOptions) => { - patchQuery({[key]: toPatchValue(value)}, options) - }, - [patchQuery], - ) - - const removeQueryParam = useCallback( - (key: string, options?: QueryNavigationOptions) => { - patchQuery({[key]: undefined}, options) - }, - [patchQuery], - ) - - return useMemo( - () => ({push, replace, patchQuery, setQueryParam, removeQueryParam, queue}), - [push, replace, patchQuery, setQueryParam, removeQueryParam, queue], - ) -} - -export const useQueryParamState = ( - key: string, -): readonly [ - QueryValue, - ( - value: QueryValue | ((prev: QueryValue) => QueryValue), - options?: QueryNavigationOptions, - ) => void, -] => { - const snapshot = useAtomValue(appStateSnapshotAtom) - const setNavigation = useSetAtom(requestNavigationAtom) - const currentValue = Object.prototype.hasOwnProperty.call(snapshot.query, key) - ? (snapshot.query[key] as QueryValue) - : undefined - - const setValue = useCallback( - ( - value: QueryValue | ((prev: QueryValue) => QueryValue), - options?: QueryNavigationOptions, - ) => { - const resolved = typeof value === "function" ? (value as any)(currentValue) : value - - if (Array.isArray(resolved) && Array.isArray(currentValue)) { - if (arraysEqual(resolved, currentValue)) return - } else if (!Array.isArray(resolved) && !Array.isArray(currentValue)) { - if (resolved === currentValue) return - } - - setNavigation({ - type: "patch-query", - patch: {[key]: toPatchValue(resolved)}, - ...(options?.method ? {method: options.method} : {}), - ...(options?.shallow !== undefined ? {shallow: options.shallow} : {}), - ...(options?.preserveHash ? {preserveHash: true} : {}), - }) - }, - [currentValue, key, setNavigation], - ) - - return useMemo(() => [currentValue, setValue] as const, [currentValue, setValue]) -} diff --git a/web/oss/src/state/appState/index.ts b/web/oss/src/state/appState/index.ts deleted file mode 100644 index d56046a767..0000000000 --- a/web/oss/src/state/appState/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -export type { - AppIdentifiers, - AppStateSnapshot, - NavigationCommand, - NavigationMethod, - ParsedAppLocation, - QueryRecord, - QueryValue, - RouteLayer, -} from "./types" - -export {parseRouterState} from "./parse" - -export { - appStateSnapshotAtom, - appIdentifiersAtom, - routeLayerAtom, - setLocationAtom, - navigationRequestAtom, - requestNavigationAtom, -} from "./atoms" - -export {useAppState, useAppQuery, useAppNavigation, useQueryParamState} from "./hooks" diff --git a/web/oss/src/state/appState/parse.ts b/web/oss/src/state/appState/parse.ts deleted file mode 100644 index ce8341db91..0000000000 --- a/web/oss/src/state/appState/parse.ts +++ /dev/null @@ -1,196 +0,0 @@ -import type {ParsedUrlQuery} from "querystring" - -import type {ParsedAppLocation, QueryRecord, RouteLayer} from "./types" - -const isBrowser = typeof window !== "undefined" - -const sanitizeId = (value: string | null | undefined): string | null => { - if (value === undefined || value === null) return null - const trimmed = String(value).trim() - if (!trimmed || trimmed === "null" || trimmed === "undefined") return null - return trimmed -} - -const decodeSegment = (segment: string): string => { - try { - return decodeURIComponent(segment) - } catch { - return segment - } -} - -const toQueryRecord = (query: ParsedUrlQuery | undefined): QueryRecord => { - const record: QueryRecord = {} - if (!query) return record - - Object.entries(query).forEach(([key, value]) => { - if (value === undefined || value === null) return - if (Array.isArray(value)) { - record[key] = value.map((item) => String(item)) - return - } - record[key] = String(value) - }) - - return record -} - -const getPathFromAsPath = (asPath: string): string => { - if (!asPath) return "/" - const hashIndex = asPath.indexOf("#") - const trimmed = hashIndex >= 0 ? asPath.slice(0, hashIndex) : asPath - const queryIndex = trimmed.indexOf("?") - const path = queryIndex >= 0 ? trimmed.slice(0, queryIndex) : trimmed - if (!path) return "/" - return path.startsWith("/") ? path : `/${path}` -} - -const extractHash = (asPath: string): string | null => { - const index = asPath.indexOf("#") - if (index === -1) return null - const hash = asPath.slice(index + 1) - return hash || null -} - -const getFirstQueryValue = (value: string | string[] | undefined): string | null => { - if (value === undefined || value === null) return null - if (Array.isArray(value)) { - const first = value[0] - return first !== undefined ? sanitizeId(first) : null - } - return sanitizeId(value) -} - -interface ParseRouterStateArgs { - pathname?: string - asPath?: string - query?: ParsedUrlQuery -} - -export const parseRouterState = ({ - pathname = "/", - asPath = "/", - query, -}: ParseRouterStateArgs): ParsedAppLocation => { - const normalizedAsPath = asPath || pathname || "/" - const pathOnly = getPathFromAsPath(normalizedAsPath) - const segments = pathOnly - .split("/") - .filter(Boolean) - .map((segment) => decodeSegment(segment)) - - const hash = extractHash(normalizedAsPath) - const normalizedQuery = toQueryRecord(query) - - let routeLayer: RouteLayer = segments.length === 0 ? "root" : "unknown" - let workspaceId: string | null = null - let projectId: string | null = null - let appId: string | null = null - let restStartIndex = 0 - - if (segments[0] === "w") { - const maybeWorkspace = sanitizeId(segments[1]) - if (maybeWorkspace) { - workspaceId = maybeWorkspace - routeLayer = "workspace" - restStartIndex = 2 - - if (segments[2] === "p") { - const maybeProject = sanitizeId(segments[3]) - if (maybeProject) { - projectId = maybeProject - routeLayer = "project" - restStartIndex = 4 - - if (segments[4] === "apps") { - const maybeApp = sanitizeId(segments[5]) - if (maybeApp) { - appId = maybeApp - routeLayer = "app" - restStartIndex = 6 - } else { - restStartIndex = 5 - } - } - } else { - restStartIndex = 3 - } - } - } - } - - if (!workspaceId) { - workspaceId = - getFirstQueryValue(normalizedQuery.workspaceId) || - getFirstQueryValue(normalizedQuery.workspace_id) || - null - } - if (!projectId) { - projectId = - getFirstQueryValue(normalizedQuery.projectId) || - getFirstQueryValue(normalizedQuery.project_id) || - null - } - if (!appId) { - appId = - getFirstQueryValue(normalizedQuery.appId) || - getFirstQueryValue(normalizedQuery.app_id) || - null - } - - const restPath = segments.slice(restStartIndex) - - return { - pathname: pathOnly, - asPath: normalizedAsPath || pathOnly, - hash, - segments, - query: normalizedQuery, - routeLayer, - restPath, - workspaceId, - projectId, - appId, - } -} - -export const createInitialParsedLocation = (): ParsedAppLocation => { - if (isBrowser) { - try { - const url = new URL(window.location.href) - const query: ParsedUrlQuery = {} - url.searchParams.forEach((value, key) => { - if (query[key] === undefined) { - query[key] = value - return - } - const current = query[key] - if (Array.isArray(current)) { - current.push(value) - return - } - query[key] = [current as string, value] - }) - return parseRouterState({ - pathname: url.pathname, - asPath: `${url.pathname}${url.search}${url.hash}`, - query, - }) - } catch { - // fall through to default below - } - } - - return { - pathname: "/", - asPath: "/", - hash: null, - segments: [], - query: {}, - routeLayer: "root", - restPath: [], - workspaceId: null, - projectId: null, - appId: null, - } -} diff --git a/web/oss/src/state/appState/types.ts b/web/oss/src/state/appState/types.ts deleted file mode 100644 index 527d624e02..0000000000 --- a/web/oss/src/state/appState/types.ts +++ /dev/null @@ -1,45 +0,0 @@ -export type RouteLayer = "unknown" | "root" | "workspace" | "project" | "app" - -export interface AppIdentifiers { - workspaceId: string | null - projectId: string | null - appId: string | null -} - -export type QueryRecord = Partial> - -export type QueryValue = string | string[] | undefined - -export interface ParsedAppLocation extends AppIdentifiers { - pathname: string - asPath: string - hash: string | null - segments: string[] - query: QueryRecord - routeLayer: RouteLayer - restPath: string[] -} - -export interface AppStateSnapshot extends ParsedAppLocation { - timestamp: number -} - -export type NavigationMethod = "push" | "replace" - -export interface BaseNavigationCommand { - method?: NavigationMethod - shallow?: boolean -} - -export interface HrefNavigationCommand extends BaseNavigationCommand { - type: "href" - href: string -} - -export interface QueryPatchNavigationCommand extends BaseNavigationCommand { - type: "patch-query" - patch: Record - preserveHash?: boolean -} - -export type NavigationCommand = HrefNavigationCommand | QueryPatchNavigationCommand diff --git a/web/oss/src/state/customWorkflow/modalAtoms.ts b/web/oss/src/state/customWorkflow/modalAtoms.ts deleted file mode 100644 index 7f1f50f936..0000000000 --- a/web/oss/src/state/customWorkflow/modalAtoms.ts +++ /dev/null @@ -1,126 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" -import {atomWithImmer} from "jotai-immer" - -import {CustomWorkflowModalProps} from "@/oss/components/pages/app-management/modals/CustomWorkflowModal/types" -import {appsAtom, currentAppAtom} from "@/oss/state/app" -import {variantsAtom} from "@/oss/state/variant/atoms/fetcher" - -// Centralized state for the Custom Workflow Modal -export const customWorkflowModalPropsAtom = atom({ - customWorkflowAppValues: {appName: "", appUrl: "", appDesc: ""}, - setCustomWorkflowAppValues: () => {}, - handleCreateApp: () => {}, - configureWorkflow: false, - variants: [], - allVariantsDataMutate: undefined, - appNameExist: false, - mutate: async () => {}, - open: false, - onCancel: () => {}, -}) - -// Dedicated atom for live form values used inside the modal content -export interface CustomWorkflowValues { - appName: string - appUrl: string - appDesc: string -} -// Family of form atoms keyed by appId ("configure" mode when appId is provided; otherwise "create" mode) -export const customWorkflowValuesAtomFamily = atomFamily((appId: string | null) => - atomWithImmer({ - appName: "", - appUrl: "", - appDesc: "", - }), -) - -// Seed values from current app and first variant -export const customWorkflowSeedAtom = atom((get) => { - const app: any = get(currentAppAtom) - const vars: any[] = (get(variantsAtom) as any[]) || [] - const first = Array.isArray(vars) && vars.length > 0 ? (vars[0] as any) : null - return { - appName: (app?.app_name as string) || "", - appUrl: (first?.uri as string) || "", - appDesc: "", - } satisfies CustomWorkflowValues -}) - -export const setCustomWorkflowModalPropsAtom = atom( - null, - (get, set, props: Partial) => { - const prev = get(customWorkflowModalPropsAtom) - set(customWorkflowModalPropsAtom, {...prev, ...props}) - }, -) - -export const openCustomWorkflowModalAtom = atom( - null, - (get, set, props?: Partial) => { - const prev = get(customWorkflowModalPropsAtom) - // Normalize key: null/undefined/"" => "new-app" (create mode) - const normalizeKey = (id?: string) => (id && id.trim().length ? id : "new-app") - // Preferred signal is appId; fallback inference by currentApp presence (deprecated) - const appKeyFromProps = normalizeKey(props?.appId as any) - const inferredConfigure = - props?.appId !== undefined - ? appKeyFromProps !== "new-app" - : (props?.configureWorkflow ?? Boolean(get(currentAppAtom))) - const next = { - ...prev, - ...(props || {}), - configureWorkflow: inferredConfigure, - open: true, - } - set(customWorkflowModalPropsAtom, next) - // Seed the atom family instance for this modal by normalized key - const appKey = appKeyFromProps - const valuesAtom = customWorkflowValuesAtomFamily(appKey) - // Explicit values take precedence ONLY if non-empty - const v = props?.customWorkflowAppValues - const hasExplicit = v && Boolean((v.appName || v.appUrl || v.appDesc || "").trim()) - if (hasExplicit && v) { - set(valuesAtom, v as any) - return - } - - if (appKey !== "new-app") { - // Configure: hydrate from specific app id - const apps = get(appsAtom) as any[] - const app = Array.isArray(apps) ? apps.find((a) => a.app_id === appKey) : null - const providedVars: any[] = (props?.variants as any[]) || [] - const globalVars: any[] = (get(variantsAtom) as any[]) || [] - const vars = providedVars.length ? providedVars : globalVars - const first = Array.isArray(vars) && vars.length > 0 ? (vars[0] as any) : null - set(valuesAtom, { - appName: (app?.app_name as string) || "", - appUrl: (first?.uri as string) || "", - appDesc: "", - }) - } else { - // Create: empty state - set(valuesAtom, {appName: "", appUrl: "", appDesc: ""}) - } - }, -) - -export const closeCustomWorkflowModalAtom = atom(null, (get, set) => { - const prev = get(customWorkflowModalPropsAtom) - set(customWorkflowModalPropsAtom, {...prev, open: false}) -}) - -// Ephemeral UI state atoms for the modal -export interface TestConnectionStatus { - success: boolean - error: boolean - loading: boolean -} - -export const customWorkflowTestStatusAtom = atom({ - success: false, - error: false, - loading: false, -}) - -export const customWorkflowConfiguringAtom = atom(false) diff --git a/web/oss/src/state/deployment/atoms/publish.ts b/web/oss/src/state/deployment/atoms/publish.ts deleted file mode 100644 index 6d2d6e6644..0000000000 --- a/web/oss/src/state/deployment/atoms/publish.ts +++ /dev/null @@ -1,62 +0,0 @@ -import {message} from "antd" -import {atomWithMutation} from "jotai-tanstack-query" -import posthog from "posthog-js" - -import {queryClient} from "@/oss/lib/api/queryClient" -import {createPublishRevision, createPublishVariant} from "@/oss/services/deployment/api" - -export interface PublishRevisionPayload { - type: "revision" - revision_id: string - environment_ref: string - note?: string - revision_number?: number - // Optional metadata for success messaging and analytics - variantName?: string - appId?: string - deploymentType?: "deploy" | "revert" // For different analytics events -} - -export interface PublishVariantPayload { - type: "variant" - variant_id: string - revision_id?: string - environment_name: string - note?: string -} - -export type PublishPayload = PublishRevisionPayload | PublishVariantPayload - -export const publishMutationAtom = atomWithMutation(() => ({ - mutationFn: async (payload) => { - if (payload.type === "revision") { - const {type, variantName, appId, ...rest} = payload - await createPublishRevision(rest) - } else { - const {type, ...rest} = payload - await createPublishVariant(rest) - } - }, - onSuccess: (_, payload) => { - // refresh dependent queries (only environments needed here) - // Environments drive deployed status badges - queryClient.invalidateQueries({queryKey: ["environments"]}) - // Ensure deployment history tables refresh - queryClient.invalidateQueries({queryKey: ["deploymentRevisions"]}) - - // Success messaging and analytics (centralized) - if (payload.type === "revision" && payload.variantName && payload.environment_ref) { - message.success(`Published ${payload.variantName} to ${payload.environment_ref}`) - - if (payload.appId) { - const analyticsEvent = - payload.deploymentType === "revert" ? "app_deployment_reverted" : "app_deployed" - - posthog?.capture?.(analyticsEvent, { - app_id: payload.appId, - environment: payload.environment_ref, - }) - } - } - }, -})) diff --git a/web/oss/src/state/deployment/atoms/revisions.ts b/web/oss/src/state/deployment/atoms/revisions.ts deleted file mode 100644 index 5cf96a519f..0000000000 --- a/web/oss/src/state/deployment/atoms/revisions.ts +++ /dev/null @@ -1,59 +0,0 @@ -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import {fetchAllDeploymentRevisions} from "@/oss/services/deploymentVersioning/api" -import {DeploymentRevisions} from "@/oss/services/deploymentVersioning/types" - -import {userAtom} from "../../profile" -import {projectIdAtom} from "../../project" -import {sessionExistsAtom} from "../../session" - -/** - * Atom family for fetching deployment revisions with both appId and environment name. - * This is the main atom to use for deployment revisions. - * - * @param params - Object with appId and envName - * @returns Atom with query for deployment revisions - */ -export const deploymentRevisionsWithAppIdQueryAtomFamily = atomFamily( - ({appId, envName}: {appId: string; envName: string}) => { - return atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const sessionExists = get(sessionExistsAtom) - const user = get(userAtom) - const userId = user?.id - console.log("user", {user, sessionExists, userId, projectId, appId, envName}) - return { - queryKey: ["deploymentRevisions", appId, envName], - queryFn: async (): Promise => { - console.log("deploymentRevisionsWithAppIdQueryAtomFamily 1") - if (!appId || !envName) { - return {} - } - - console.log("deploymentRevisionsWithAppIdQueryAtomFamily 2") - try { - const data = await fetchAllDeploymentRevisions(appId, envName) - console.log("deploymentRevisionsWithAppIdQueryAtomFamily 3", data) - return data - } catch (error) { - console.warn(`Error fetching deployment revisions for ${envName}:`, { - error, - projectId, - sessionExists, - userId, - }) - return {} - } - }, - enabled: !!userId && sessionExists && !!projectId && !!appId && !!envName, - staleTime: 1000 * 60 * 5, // 5 minutes - refetchInterval: 1000 * 60 * 10, // 10 minutes - refetchOnWindowFocus: false, - refetchOnReconnect: true, - } - }) - }, - // Custom equality function for the parameter object - (a, b) => a.appId === b.appId && a.envName === b.envName, -) diff --git a/web/oss/src/state/environment/atoms/fetcher.ts b/web/oss/src/state/environment/atoms/fetcher.ts deleted file mode 100644 index de3d25bd8a..0000000000 --- a/web/oss/src/state/environment/atoms/fetcher.ts +++ /dev/null @@ -1,75 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {selectAtom, unwrap} from "jotai/utils" -import {eagerAtom} from "jotai-eager" -import {atomWithQuery} from "jotai-tanstack-query" - -import {snakeToCamel} from "@/oss/lib/helpers/utils" -import {Environment} from "@/oss/lib/Types" -import {fetchEnvironments} from "@/oss/services/deployment/api" -import {routerAppIdAtom, currentAppAtom} from "@/oss/state/app/selectors/app" -import {projectIdAtom} from "@/oss/state/project/selectors/project" -import {jwtReadyAtom} from "@/oss/state/session/jwt" -import {devLog} from "@/oss/state/utils/devLog" - -// -------- Query atom -------------------------------------------------------- - -export const environmentsQueryAtom = atomWithQuery((get) => { - const appIdFromRoute = get(routerAppIdAtom) - const currentApp = get(currentAppAtom) - const appId = appIdFromRoute || currentApp?.app_id || null - - const projectId = get(projectIdAtom) - const jwtReady = get(jwtReadyAtom).data ?? false - - const enabled = !!appId && !!projectId && jwtReady - - return { - queryKey: ["environments", appId, projectId], - queryFn: async () => { - if (!appId) return [] - const data = await fetchEnvironments(appId) - const camel = (data ?? []).map((env: any) => - Object.fromEntries(Object.entries(env).map(([k, v]) => [snakeToCamel(k), v])), - ) as Environment[] - return camel - }, - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled, - } -}) - -const logEnv = process.env.NEXT_PUBLIC_LOG_ENV_ATOMS === "true" - -devLog(environmentsQueryAtom as any, "environmentsQueryAtom", logEnv) - -// -------- Derived atoms ----------------------------------------------------- - -const EmptyEnvs: Environment[] = [] - -export const environmentsAtom = selectAtom( - unwrap(environmentsQueryAtom), - (res) => (res as any)?.data ?? EmptyEnvs, - deepEqual, -) - -export const environmentsLoadableAtom = atom((get) => get(environmentsQueryAtom)) - -// Quick lookup map: env name -> environment object -export const environmentMapAtom = eagerAtom>((get) => { - const envs = get(environmentsAtom) as Environment[] - const map: Record = {} - envs.forEach((e) => { - map[e.name] = e - }) - return map -}) - -// Utility refetch atom (mount once to keep environments fresh when variants ready) -export const environmentsPrefetchAtom = atom((get) => { - const loadable = get(environmentsLoadableAtom) - return loadable -}) diff --git a/web/oss/src/state/evaluators/atoms.ts b/web/oss/src/state/evaluators/atoms.ts deleted file mode 100644 index aafd2b52f9..0000000000 --- a/web/oss/src/state/evaluators/atoms.ts +++ /dev/null @@ -1,320 +0,0 @@ -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms" -import axios from "@/oss/lib/api/assets/axiosConfig" -import {transformApiData} from "@/oss/lib/hooks/useAnnotations/assets/transformer" -import { - EvaluatorDto, - EvaluatorPreviewDto, - EvaluatorRevisionDto, - EvaluatorRevisionsResponseDto, - EvaluatorsResponseDto, -} from "@/oss/lib/hooks/useEvaluators/types" -import {Evaluator, EvaluatorConfig} from "@/oss/lib/Types" -import {fetchAllEvaluators, fetchAllEvaluatorConfigs} from "@/oss/services/evaluators" -import {selectedAppIdAtom} from "@/oss/state/app" -import {selectedOrgAtom} from "@/oss/state/org" -import {userAtom} from "@/oss/state/profile" -import {projectIdAtom} from "@/oss/state/project" - -import {NO_APP_KEY, NO_PROJECT_KEY} from "./constant" -import {parseQueries} from "./parse" -import {EvaluatorConfigsParams, EvaluatorsParams} from "./types" - -const extractKeyFromUri = (uri: unknown): string | undefined => { - if (typeof uri !== "string") return undefined - const match = uri.match(/[:/](auto_[a-z0-9_]+)/i) - if (match?.[1]) return match[1] - const parts = uri.split(":").filter(Boolean) - if (parts.length) { - const candidate = parts[parts.length - 1] - if (candidate) { - return candidate.replace(/-v\d+$/i, "") - } - } - return undefined -} - -const isPlainObject = (value: unknown): value is Record => { - return typeof value === "object" && value !== null && !Array.isArray(value) -} - -const mergePlainObjects = (primary: any, fallback: any): any => { - if (isPlainObject(primary) && isPlainObject(fallback)) { - const result: Record = {...fallback} - Object.entries(primary).forEach(([key, value]) => { - result[key] = mergePlainObjects(value, fallback[key]) - }) - return result - } - - if (primary === undefined || primary === null) { - return isPlainObject(fallback) ? {...fallback} : fallback - } - - return primary -} - -const normalizeTags = (candidate: unknown): string[] => { - if (!candidate) return [] - if (Array.isArray(candidate)) { - return candidate - .map((value) => (typeof value === "string" ? value.trim() : String(value))) - .filter(Boolean) - } - if (typeof candidate === "object") { - return Object.entries(candidate as Record) - .filter(([, value]) => Boolean(value)) - .map(([key]) => key.trim()) - .filter(Boolean) - } - if (typeof candidate === "string") { - const trimmed = candidate.trim() - return trimmed ? [trimmed] : [] - } - return [] -} - -const mergeTags = (...sources: unknown[]): string[] => { - const set = new Set() - sources.forEach((source) => { - normalizeTags(source).forEach((tag) => set.add(tag)) - }) - return Array.from(set) -} - -const extractRequiresLlmApiKeys = (source: unknown): boolean | undefined => { - if (!source || typeof source !== "object") return undefined - const direct = (source as any).requires_llm_api_keys - if (direct !== undefined) return Boolean(direct) - - const fromFlags = (source as any).flags?.requires_llm_api_keys - if (fromFlags !== undefined) return Boolean(fromFlags) - - const fromMeta = (source as any).meta?.requires_llm_api_keys - if (fromMeta !== undefined) return Boolean(fromMeta) - - return undefined -} - -export const evaluatorConfigsQueryAtomFamily = atomFamily( - ({projectId: overrideProjectId, appId: overrideAppId, preview}: EvaluatorConfigsParams = {}) => - atomWithQuery((get) => { - const projectId = overrideProjectId ?? get(projectIdAtom) - const appId = overrideAppId ?? get(selectedAppIdAtom) - const user = get(userAtom) as {id?: string} | null - - const enabled = !preview && Boolean(projectId && user?.id) - const projectKey = projectId ?? NO_PROJECT_KEY - const appKey = appId ?? NO_APP_KEY - - return { - queryKey: [ - "evaluator-configs", - preview ? "preview" : "regular", - projectKey, - appKey, - ] as const, - queryFn: async () => fetchAllEvaluatorConfigs(appId, projectId), - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - retry: false, - enabled, - } - }), -) - -export const evaluatorsQueryAtomFamily = atomFamily( - ({projectId: overrideProjectId, preview, queriesKey}: EvaluatorsParams) => - atomWithQuery((get) => { - const projectId = overrideProjectId ?? get(projectIdAtom) - const user = get(userAtom) as {id?: string} | null - const selectedOrg = get(selectedOrgAtom) - const members = selectedOrg?.default_workspace?.members ?? [] - const projectKey = projectId ?? NO_PROJECT_KEY - - const enabled = Boolean(projectId && user?.id) - const queryKey = preview - ? (["evaluators", "preview", projectKey, queriesKey] as const) - : (["evaluators", projectKey] as const) - - return { - queryKey, - queryFn: async () => { - if (preview) { - if (!projectId) return [] - const flags = parseQueries(queriesKey) - const requestBody = flags - ? { - evaluator: {flags}, - } - : {} - - const response = await axios.post( - `/preview/simple/evaluators/query?project_id=${projectId}`, - requestBody, - ) - let evaluators = (response?.data?.evaluators ?? []).map((item) => { - const transformed = transformApiData({ - data: item, - members, - }) - - const tags = mergeTags(item?.tags, transformed?.tags) - - const rawKey = - item?.flags?.evaluator_key ?? - item?.meta?.evaluator_key ?? - item?.key ?? - transformed?.key ?? - undefined - const derivedKey = - typeof rawKey === "string" && rawKey.trim() - ? rawKey.trim() - : extractKeyFromUri( - (item as any)?.data?.uri || - (item as any)?.data?.service?.uri, - ) - const requiresLlmApiKeys = - extractRequiresLlmApiKeys(item) ?? - extractRequiresLlmApiKeys(transformed) ?? - false - - return { - ...transformed, - tags, - key: derivedKey, - requires_llm_api_keys: Boolean(requiresLlmApiKeys), - metrics: getMetricsFromEvaluator(transformed as EvaluatorDto), - } - }) as EvaluatorPreviewDto[] - - if (evaluators.length) { - const revisionRefs = evaluators - .map((ev) => { - const version = - (ev as any)?.version ?? - (ev.meta as any)?.version ?? - undefined - const ref = { - id: ev.id, - slug: ev.slug, - version, - } - if (ref.id || ref.slug || ref.version) return ref - return null - }) - .filter(Boolean) as { - id?: string - slug?: string - version?: string - }[] - - if (revisionRefs.length) { - try { - const revisionResponse = - await axios.post( - `/preview/evaluators/revisions/query?project_id=${projectId}`, - { - evaluator_refs: revisionRefs, - }, - ) - - const revisions = - revisionResponse?.data?.evaluator_revisions ?? [] - - if (revisions.length) { - const byEvaluatorId = new Map< - string, - EvaluatorRevisionDto - >() - const bySlug = new Map() - const byRevisionId = new Map() - - revisions.forEach((revision) => { - if (revision.evaluator_id) { - byEvaluatorId.set(revision.evaluator_id, revision) - } - if (revision.slug) { - bySlug.set(revision.slug, revision) - } - if (revision.id) { - byRevisionId.set(revision.id, revision) - } - }) - - evaluators = evaluators.map((ev) => { - const revision = - (ev.id && byEvaluatorId.get(ev.id)) || - (ev.slug && bySlug.get(ev.slug)) || - (typeof ev.meta?.evaluator_revision_id === - "string" && - byRevisionId.get( - ev.meta.evaluator_revision_id, - )) || - undefined - - if (!revision) return ev - - const mergedData = mergePlainObjects( - ev.data, - revision.data, - ) - const mergedFlags = mergePlainObjects( - ev.flags, - revision.flags, - ) - const mergedMeta = mergePlainObjects( - ev.meta, - revision.meta, - ) - const mergedTags = mergeTags(ev.tags, revision.tags) - - const withRevision: EvaluatorPreviewDto = { - ...ev, - data: mergedData, - flags: mergedFlags, - meta: mergedMeta, - tags: mergedTags, - revision, - } - - const requiresLlmApiKeys = - extractRequiresLlmApiKeys(withRevision) ?? - extractRequiresLlmApiKeys(revision) ?? - extractRequiresLlmApiKeys(ev) ?? - false - - return { - ...withRevision, - requires_llm_api_keys: Boolean(requiresLlmApiKeys), - metrics: getMetricsFromEvaluator( - withRevision as EvaluatorDto, - ), - } - }) - } - } catch (error) { - console.warn("Failed to fetch evaluator revisions", error) - } - } - } - - return evaluators - } - - const data = await fetchAllEvaluators() - return data - }, - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - retry: false, - enabled, - } - }), -) diff --git a/web/oss/src/state/evaluators/constant.ts b/web/oss/src/state/evaluators/constant.ts deleted file mode 100644 index ae583bb3cd..0000000000 --- a/web/oss/src/state/evaluators/constant.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const NO_PROJECT_KEY = "__no-project__" -export const NO_APP_KEY = "__no-app__" diff --git a/web/oss/src/state/evaluators/index.ts b/web/oss/src/state/evaluators/index.ts deleted file mode 100644 index 89eeef800a..0000000000 --- a/web/oss/src/state/evaluators/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./atoms" diff --git a/web/oss/src/state/evaluators/parse.ts b/web/oss/src/state/evaluators/parse.ts deleted file mode 100644 index 4bb367bc66..0000000000 --- a/web/oss/src/state/evaluators/parse.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const parseQueries = (serialized: string) => { - if (!serialized || serialized === "null") return undefined - try { - return JSON.parse(serialized) as {is_human?: boolean} - } catch { - return undefined - } -} diff --git a/web/oss/src/state/evaluators/types.ts b/web/oss/src/state/evaluators/types.ts deleted file mode 100644 index 1fa1bd7460..0000000000 --- a/web/oss/src/state/evaluators/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type EvaluatorConfigsParams = { - projectId?: string | null - appId?: string | null - preview?: boolean -} - -export type EvaluatorsParams = { - projectId?: string | null - preview: boolean - queriesKey: string -} diff --git a/web/oss/src/state/generation/compat.ts b/web/oss/src/state/generation/compat.ts deleted file mode 100644 index 894ba8bf3e..0000000000 --- a/web/oss/src/state/generation/compat.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Compatibility selectors for existing UI expectations (read-only) -// These provide shapes similar to legacy selectors but read from normalized state. - -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {appTypeAtom} from "@/oss/components/Playground/state/atoms/app" -import {displayedVariantsAtom} from "@/oss/components/Playground/state/atoms/variants" - -import { - inputRowIdsAtom, - chatSessionIdsAtom, - chatSessionsByIdAtom, - chatTurnIdsAtom, -} from "./entities" -import { - rowVariablesAtomFamily, - rowResponsesAtomFamily, - assistantMessageAtomFamily, -} from "./selectors" - -// Unifies row ids used for generation rendering across modes -// - completion: inputRowIdsAtom -// - chat: flatten of turnIds across sessions (ordered by sessionIds) -export const generationRowIdsCompatAtom = atom((get) => { - const appType = get(appTypeAtom) - if (appType !== "chat") { - return get(inputRowIdsAtom) - } - const sessionIds = get(chatSessionIdsAtom) - const sessions = get(chatSessionsByIdAtom) - const turnIds: string[] = [] - for (const id of sessionIds) { - const s = sessions[id] - if (s?.turnIds?.length) turnIds.push(...s.turnIds) - } - return turnIds -}) - -// Logical turn ids (one per shared turn across revisions) for comparison view -export const generationLogicalTurnIdsAtom = atom((get) => { - const appType = get(appTypeAtom) - if (appType !== "chat") { - return get(inputRowIdsAtom) - } - const ids = (get(chatTurnIdsAtom) || []) as string[] - return ids -}) - -// Input row ids compat: return all input rows for now (normalized InputRow is not a PropertyNode) -export const inputRowIdsWithPropertiesCompatAtom = atom((get) => get(inputRowIdsAtom)) diff --git a/web/oss/src/state/generation/entities.ts b/web/oss/src/state/generation/entities.ts deleted file mode 100644 index c47fe0ee35..0000000000 --- a/web/oss/src/state/generation/entities.ts +++ /dev/null @@ -1,632 +0,0 @@ -// Normalized generation state entities -// Core types and top-level entity maps - -import {produce} from "immer" -import {atom, getDefaultStore} from "jotai" -import {atomFamily, selectAtom} from "jotai/utils" -import {atomFamily as jotaiAtomFamily} from "jotai/utils" - -import {appChatModeAtom} from "@/oss/components/Playground/state/atoms" -import {generationRowIdsAtom} from "@/oss/components/Playground/state/atoms/generationProperties" -import { - displayedVariantsVariablesAtom, - isComparisonViewAtom, -} from "@/oss/components/Playground/state/atoms/variants" -import {displayedVariantsAtom} from "@/oss/components/Playground/state/atoms/variants" -import { - getAllMetadata, - getMetadataLazy, - metadataAtom, - metadataSelectorFamily, -} from "@/oss/lib/hooks/useStatelessVariants/state" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {buildUserMessage} from "@/oss/state/newPlayground/helpers/messageFactory" - -import {selectedAppIdAtom} from "../app" - -import {mergeRowVariables, PropertyNode} from "./utils" - -export interface InputRow { - id: string - // Variables and responses are revision-scoped to unify single/compare - // Variables are represented as a PropertyNode tree/array to align with UI helpers - variables: PropertyNode[] - // Completion responses are an array/tree of PropertyNodes (LLM messages) - responsesByRevision: Record - meta?: Record -} - -export interface ChatSession { - id: string - // Session-level variables (e.g., system variables) also revision-scoped - variables: PropertyNode[] - turnIds: string[] - meta?: Record -} - -export interface ChatTurn { - id: string - sessionId: string - // User message follows PropertyNode structure - userMessage: PropertyNode - // Assistant message is revision-scoped and uses PropertyNode - assistantMessageByRevision: Record - toolResponsesByRevision?: Record - meta?: Record -} - -// Entity maps + id lists -export const inputRowIdsAtom = atom([]) -export const inputRowsByIdCacheAtom = atom>({}) -export const inputRowsByIdAtom = inputRowsByIdCacheAtom - -export const chatSessionsByIdAtom = atom>({}) -export const chatSessionIdsAtom = atom([]) -// Backing storage for chat turns; do not export directly -export const chatTurnsByIdStorageAtom = atom>({}) - -// Cache for per-row overrides (e.g., fast reads or provisional states) -export const chatTurnsByIdCacheAtom = atom>({}) - -// Cache variable values by row and variable name to preserve context across revisions -export const inputRowVariableValueCacheAtom = atom>>({}) - -export const allChatTurnIdsMapAtom = atom>({}) -// Master list of logical chat turn ids, independent of displayed revisions set -// Global canonical list scoped by baseline revision (first displayed id) -export const chatTurnIdsByBaselineAtom = atom>({}) -// Flat list of chat turn ids (session turn ids like `turn--`) -// Mutating this list will cause derived selectors to expose new chat rows. -export const chatTurnIdsAtom = atom( - (get) => { - const displayed = (get(displayedVariantsAtom) || []) as string[] - // Stable key independent of displayed order - const key = `set:${[...displayed].sort().join("|")}` - const map = get(allChatTurnIdsMapAtom) - const baseline = (displayed[0] || "") as string - const byBaseline = get(chatTurnIdsByBaselineAtom) || {} - const existing = map[key] - if (Array.isArray(existing) && existing.length > 0) return existing - - // Fallback to baseline-scoped list when switching displayed sets (e.g., unloading/replacing revisions) - const baselineList = (baseline && byBaseline[baseline]) || [] - if (Array.isArray(baselineList) && baselineList.length > 0) { - // Seed per-set entry from baseline-scoped history - getDefaultStore().set(allChatTurnIdsMapAtom, {...map, [key]: baselineList}) - return baselineList - } - - // Nothing yet: initialize a first logical id and seed both map and master - const generated = `lt-${generateId()}` - const nextList = [generated] - if (baseline) { - getDefaultStore().set(chatTurnIdsByBaselineAtom, {...byBaseline, [baseline]: nextList}) - } - getDefaultStore().set(allChatTurnIdsMapAtom, {...map, [key]: nextList}) - return [generated] - }, - (get, set, update: string[] | ((prev: string[]) => string[] | void)) => { - const displayed = (get(displayedVariantsAtom) || []) as string[] - const key = `set:${[...displayed].sort().join("|")}` - - const prevMap = get(allChatTurnIdsMapAtom) - const baseline = (displayed[0] || "") as string - const byBaseline = get(chatTurnIdsByBaselineAtom) || {} - const prevList = prevMap[key] || (baseline ? byBaseline[baseline] || [] : []) - const next = update instanceof Function ? update(prevList) : update - // Persist to both the per-set map and the baseline-scoped history - if (baseline) set(chatTurnIdsByBaselineAtom, {...byBaseline, [baseline]: next as string[]}) - set(allChatTurnIdsMapAtom, {...prevMap, [key]: next as string[]}) - }, -) - -export const messageSchemaMetadataAtom = selectAtom( - metadataAtom, - (all) => { - const entry = Object.entries((all || {}) as Record).find( - ([, v]) => v && v.title === "Message" && v.type === "object", - ) - return (entry?.[1] as any) || null - }, - Object.is, -) - -// Helper: synthesize a ChatTurn for a given rowId using prompts metadata when possible -function synthesizeTurn( - rowId: string, - metadata: any, - get: (anAtom: {read: (get: any) => T}) => T, -): ChatTurn { - const match = /^turn-(.+)-(lt-.+)$/.exec(String(rowId)) - const revisionId = match?.[1] || "" - const sessionId = revisionId ? `session-${revisionId}` : "session-" - - let userMsg: any = null - - if (metadata) { - userMsg = buildUserMessage(metadata) - } - - return { - id: rowId, - sessionId, - userMessage: userMsg || null, - assistantMessageByRevision: revisionId ? {[revisionId]: null} : {}, - toolResponsesByRevision: {}, - meta: {}, - } -} - -function messageHasContent(node: any): boolean { - if (!node) return false - - const rawContent = node?.content?.value ?? node?.content - - if (typeof rawContent === "string") { - return rawContent.trim().length > 0 - } - - if (Array.isArray(rawContent)) { - return rawContent.some((part: any) => { - if (!part) return false - if (typeof part === "string") return part.trim().length > 0 - const text = part?.text?.value ?? part?.text - if (typeof text === "string" && text.trim().length > 0) return true - const url = - part?.image_url?.url?.value ?? - part?.image_url?.url ?? - part?.imageUrl?.url?.value ?? - part?.imageUrl?.url - if (typeof url === "string" && url.trim().length > 0) return true - return false - }) - } - - if (rawContent && typeof rawContent === "object") { - const nested = (rawContent as any).value ?? rawContent - if (typeof nested === "string") return nested.trim().length > 0 - if (Array.isArray(nested)) return nested.length > 0 - } - - const fallback = node?.value ?? node?.text?.value ?? node?.text - if (typeof fallback === "string") return fallback.trim().length > 0 - - return false -} - -function messageHasToolCalls(node: any): boolean { - if (!node) return false - const direct = node?.toolCalls?.value ?? node?.toolCalls - if (Array.isArray(direct) && direct.length > 0) return true - const snake = node?.tool_calls?.value ?? node?.tool_calls - if (Array.isArray(snake) && snake.length > 0) return true - const fnCall = node?.function_call?.value ?? node?.function_call - if (fnCall && typeof fnCall === "object") return true - return false -} - -// Family reader/writer for cache entries by rowId -export const chatTurnsByIdFamilyAtom = atomFamily((rowId: string) => - atom( - (get) => { - // React to visible row structure - const meta = get(messageSchemaMetadataAtom) as any - const cache = get(chatTurnsByIdCacheAtom) || {} - if (rowId in cache) return cache[rowId] - const base = get(chatTurnsByIdStorageAtom) || {} - const existing = base[rowId] - if (existing) return existing - // Try immediate synthesis via existing metadata - let newTurn = meta ? synthesizeTurn(rowId, meta, get) : null - - if (newTurn) { - getDefaultStore().set(chatTurnsByIdCacheAtom, {...cache, [rowId]: newTurn}) - return newTurn - } - - return null - }, - ( - get, - set, - update: ChatTurn | null | ((prev: ChatTurn | null) => ChatTurn | null | void), - ) => { - const currentCache = get(chatTurnsByIdCacheAtom) || {} - const currentBase = get(chatTurnsByIdStorageAtom) || {} - // Seed a synthesized turn when missing so Immer draft is never undefined - const prevExisting = ( - rowId in currentCache ? currentCache[rowId] : currentBase[rowId] - ) as ChatTurn | null - - const meta = get(messageSchemaMetadataAtom) as any - // Try existing or synthesized; if metadata wasn't ready earlier, attempt an on-demand synthesis now - let prevVal = prevExisting ?? (meta ? synthesizeTurn(rowId, meta, get) : null) - if (!prevVal) { - return - } - // If still no base turn and the updater is a function expecting a draft, skip safely - if (!prevVal && typeof update === "function") { - return - } - - let nextVal: ChatTurn | null - if (typeof update === "function") { - // Support both Immer-style mutating updater and pure function returning next - const maybe = produce(prevVal as any, (draft: any) => { - const ret = (update as any)(draft) - if (ret !== undefined) return ret - }) as unknown as ChatTurn | null - nextVal = maybe - } else { - nextVal = update - } - - set(chatTurnsByIdCacheAtom, (prev) => { - const next = {...(prev || {})} - if (nextVal) next[rowId] = nextVal - else if (rowId in next) delete next[rowId] - return next - }) - - // Derived removal: if user message content is effectively empty, drop this id from chatTurnIdsAtom - const assistantEntries = Object.keys(nextVal?.assistantMessageByRevision || {}) - const toolEntries = Object.keys(nextVal?.toolResponsesByRevision || {}) - const isEmpty = - !nextVal?.userMessage && assistantEntries.length === 0 && toolEntries.length === 0 - if (isEmpty) { - set(chatTurnIdsAtom, (prev) => { - const turnIndex = (prev || []).indexOf(rowId) - if (turnIndex === -1) return prev - return [...prev.slice(0, turnIndex)] - }) - } else { - const match = /^turn-(.+)-(lt-.+)$/.exec(String(rowId)) - const revisionId = match?.[1] - const logicalId = match?.[2] || rowId - - const userHasContent = messageHasContent(nextVal?.userMessage) - if (!userHasContent || !logicalId) return - - const assistantMapKeys = Object.keys(nextVal?.assistantMessageByRevision || {}) - const activeRevisionId = revisionId || assistantMapKeys[0] - - const assistantNode = activeRevisionId - ? nextVal?.assistantMessageByRevision?.[activeRevisionId] - : null - const toolResponsesByRevision = (nextVal as any)?.toolResponsesByRevision || {} - const revisionToolResponses = activeRevisionId - ? toolResponsesByRevision?.[activeRevisionId] - : undefined - const hasToolResponses = Array.isArray(revisionToolResponses) - ? revisionToolResponses.length > 0 - : false - const hasToolCallsForRevision = - hasToolResponses || messageHasToolCalls(assistantNode) - - const assistantHasContent = messageHasContent(assistantNode) - - const shouldAppendToolTurn = hasToolCallsForRevision - const shouldAppendBlankTurn = !shouldAppendToolTurn && assistantHasContent - - if (!shouldAppendToolTurn && !shouldAppendBlankTurn) return - - const ids = (get(chatTurnIdsAtom) || []) as string[] - const idx = ids.indexOf(String(logicalId)) - const isLast = idx >= 0 && idx === ids.length - 1 - if (!isLast) return - - let appendedId: string | null = null - let appendedTurn: ChatTurn | null = null - - set(chatTurnIdsAtom, (prev) => { - const prevIds = prev || [] - if (prevIds[prevIds.length - 1] !== logicalId) return prev - const nextLogicalId = `lt-${generateId()}` - if (shouldAppendToolTurn) { - appendedId = nextLogicalId - const sessionId = - nextVal?.sessionId || - (activeRevisionId ? `session-${activeRevisionId}` : "session-") - appendedTurn = { - id: nextLogicalId, - sessionId, - userMessage: null, - assistantMessageByRevision: activeRevisionId - ? {[activeRevisionId]: null} - : {}, - toolResponsesByRevision: {}, - meta: {}, - } - } - return [...prevIds, nextLogicalId] - }) - - if (appendedId && appendedTurn) { - const turnIdToAdd = appendedId - const turnValue = appendedTurn - set(chatTurnsByIdCacheAtom, (prev) => { - if (prev && prev[turnIdToAdd]) return prev - return { - ...(prev || {}), - [turnIdToAdd]: turnValue, - } - }) - } - } - }, - ), -) - -export const chatTurnsByIdAtom = atom( - (get) => { - // React to visible row structure - const logicalIds = (get(generationRowIdsAtom) as string[]) || [] - const base = get(chatTurnsByIdStorageAtom) || {} - const cache = get(chatTurnsByIdCacheAtom) || {} - const merged: Record = {...base, ...cache} - - // Pull any family-cached entries for the visible ids - for (const id of logicalIds) { - try { - const val = get(chatTurnsByIdFamilyAtom(id)) as any - if (val) merged[id] = val as ChatTurn - } catch {} - } - return merged - }, - (get, set, update: Record | ((prev: Record) => any)) => { - // Forward writes to backing storage to preserve existing mutation behavior - if (typeof update === "function") { - set(chatTurnsByIdStorageAtom, update as any) - } else { - set(chatTurnsByIdStorageAtom, update) - } - }, -) - -// Helper: synthesize an InputRow with variables seeded from prompt variables -function synthesizeInputRow( - rowId: string, - get: (anAtom: {read: (get: any) => T}) => T, -): InputRow { - // Determine target revision ids to seed - // const idx = get(rowIdIndexAtom) - // const latest = idx?.[rowId]?.latestRevisionId as string | undefined - // const displayed = (get(displayedVariantsAtom) || []) as string[] - // const revisionIds = Array.from(new Set([latest, ...displayed].filter(Boolean))) as string[] - - let variables: PropertyNode[] = [] - const allNames = get(displayedVariantsVariablesAtom) - // revisionIds.map((revId) => get(promptVariablesAtomFamily(revId)) || []) - // const test = get(displayedVariantsVariablesAtom) - - variables = allNames.map((name) => ({ - __id: generateId(), - key: name, - __metadata: { - type: "string", - title: name, - description: `Template variable: {{${name}}}`, - }, - value: "", - content: {value: ""}, - })) - - return { - id: rowId, - variables, - responsesByRevision: {}, - meta: {}, - } -} - -// Family reader/writer for input rows by id, with synthesis fallback -export const inputRowsByIdFamilyAtom = atomFamily((rowId: string) => - atom( - (get) => { - const cache = get(inputRowsByIdCacheAtom) || {} - const base = get(inputRowsByIdAtom) || {} - const existing = (rowId in cache ? cache[rowId] : base[rowId]) as InputRow | undefined - if (existing) { - // Complete variables for displayed/active revisions using prompt-derived names - const idx = get(rowIdIndexAtom) - const latest = idx?.[rowId]?.latestRevisionId as string | undefined - const displayed = (get(displayedVariantsAtom) || []) as string[] - const isChat = get(appChatModeAtom) - const isComparison = get(isComparisonViewAtom) - const revisionIds = ( - !isChat && !isComparison - ? displayed - : Array.from(new Set([latest, ...displayed].filter(Boolean))) - ) as string[] - - const valueCache = (get(inputRowVariableValueCacheAtom) || {})[rowId] || {} - const merged = mergeRowVariables( - get as any, - existing.variables as any[], - revisionIds, - valueCache, - ) as PropertyNode[] - // If variables changed (added/removed/reordered), sync to cache for consistency - try { - const prevVars = Array.isArray(existing.variables) - ? (existing.variables as any[]) - : [] - const hasDiff = - prevVars.length !== merged.length || - (() => { - const a = prevVars.map((n: any) => n?.key ?? n?.__id) - const b = merged.map((n: any) => n?.key ?? n?.__id) - if (a.length !== b.length) return true - for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return true - return false - })() - if (hasDiff) { - const updated = {...existing, variables: merged} - getDefaultStore().set(inputRowsByIdCacheAtom, {...cache, [rowId]: updated}) - return updated - } - } catch {} - return {...existing, variables: merged} - } else { - const newTurn = synthesizeInputRow(rowId, get) - getDefaultStore().set(inputRowsByIdCacheAtom, {...cache, [rowId]: newTurn}) - return newTurn - } - }, - ( - get, - set, - update: InputRow | null | ((prev: InputRow | null) => InputRow | null | void), - ) => { - const currentCache = get(inputRowsByIdCacheAtom) || {} - const currentBase = get(inputRowsByIdAtom) || {} - - const prevExisting = ( - rowId in currentCache ? currentCache[rowId] : currentBase[rowId] - ) as InputRow | null - // Start from existing or synthesized base - const baseVal = prevExisting - // synthesizeInputRow(rowId, get) - // Re-sync variables against current prompt variables for active revisions - const idx = get(rowIdIndexAtom) - const latest = idx?.[rowId]?.latestRevisionId as string | undefined - const displayed = (get(displayedVariantsAtom) || []) as string[] - const isChat = get(appChatModeAtom) - const isComparison = get(isComparisonViewAtom) - const revisionIds = ( - !isChat && !isComparison - ? displayed - : Array.from(new Set([latest, ...displayed].filter(Boolean))) - ) as string[] - const valueCache = (get(inputRowVariableValueCacheAtom) || {})[rowId] || {} - const merged = mergeRowVariables( - get as any, - baseVal?.variables as any[], - revisionIds, - valueCache, - ) as PropertyNode[] - - const prevVal: InputRow = {...(baseVal as any), variables: merged} - - let nextVal: InputRow | null - if (typeof update === "function") { - const maybe = produce(prevVal as any, (draft: any) => { - const ret = (update as any)(draft) - if (ret !== undefined) return ret - }) as unknown as InputRow | null - nextVal = maybe - } else { - nextVal = update - } - - // Update variable value cache first (ensures merges use latest values) - try { - if (nextVal && Array.isArray((nextVal as any).variables)) { - const latestVars = ((nextVal as any).variables || []) as any[] - const map: Record = {} - for (const n of latestVars) { - const k = (n as any)?.key ?? (n as any)?.__id - if (!k) continue - const v = (n as any)?.content?.value ?? (n as any)?.value - const s = v !== undefined && v !== null ? String(v) : "" - if (s.length > 0) map[String(k)] = s - } - if (Object.keys(map).length > 0) { - set(inputRowVariableValueCacheAtom, (prev) => ({ - ...(prev || {}), - [rowId]: {...((prev || {})[rowId] || {}), ...map}, - })) - } - } - } catch {} - - // Persist synthesized/edited row into cache for visibility via computed map - set(inputRowsByIdCacheAtom, (prev) => { - const next = {...(prev || {})} - if (nextVal) next[rowId] = nextVal - else if (rowId in next) delete next[rowId] - return next - }) - }, - ), -) - -// Computed map merging base rows and synthesized cache for visible ids -export const inputRowsByIdComputedAtom = atom((get) => { - const logicalIds = (get(generationRowIdsAtom) as string[]) || [] - const base = get(inputRowsByIdAtom) || {} - const cache = get(inputRowsByIdCacheAtom) || {} - const merged: Record = {...base, ...cache} - for (const id of logicalIds) { - try { - const val = get(inputRowsByIdFamilyAtom(id)) as any - if (val) merged[id] = val as InputRow - } catch {} - } - return merged -}) - -// Indexes for bridging legacy rowIds to normalized context during migration -export interface RowIdIndexEntry { - latestRevisionId?: string - chatTurnIds?: string[] -} - -export const rowIdIndexAtom = atom>({}) -// Mapping of logical (shared) turn ids to per-revision session turn ids -// logicalTurnId -> { [revisionId]: sessionTurnId } -const logicalTurnIndexByAppAtom = atom>>>({}) - -export const logicalTurnIndexAtom = atom( - (get) => { - const appId = get(selectedAppIdAtom) - const all = get(logicalTurnIndexByAppAtom) - return all[appId] ?? {} - }, - ( - get, - set, - next: - | Record> - | (( - prev: Record>, - ) => Record>), - ) => { - const appId = get(selectedAppIdAtom) - const all = get(logicalTurnIndexByAppAtom) - const prev = all[appId] ?? {} - const value = typeof next === "function" ? (next as any)(prev) : next - set(logicalTurnIndexByAppAtom, {...all, [appId]: value}) - }, -) - -// Normalized run status per row + revision -// Keyed by `${rowId}:${revisionId}` to avoid nested structures churn -const runStatusByAppAtom = atom< - Record> ->({}) - -export const runStatusByRowRevisionAtom = atom( - (get) => { - const appId = get(selectedAppIdAtom) - const all = get(runStatusByAppAtom) - return all[appId] ?? {} - }, - ( - get, - set, - next: - | Record - | (( - prev: Record, - ) => Record), - ) => { - const appId = get(selectedAppIdAtom) - const all = get(runStatusByAppAtom) - const prev = all[appId] ?? {} - const value = typeof next === "function" ? (next as any)(prev) : next - set(runStatusByAppAtom, {...all, [appId]: value}) - }, -) diff --git a/web/oss/src/state/generation/selectors.ts b/web/oss/src/state/generation/selectors.ts deleted file mode 100644 index 7519009e43..0000000000 --- a/web/oss/src/state/generation/selectors.ts +++ /dev/null @@ -1,120 +0,0 @@ -// Normalized generation selectors -// Narrow, composable selectors for normalized generation state -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {atomFamily, selectAtom} from "jotai/utils" - -import { - inputRowsByIdComputedAtom, - // inputRowIdsAtom, - chatSessionsByIdAtom, - chatTurnsByIdAtom, - rowIdIndexAtom, - type InputRow, - type ChatTurn, -} from "./entities" - -// Collections -// Keep this a pure read to avoid write-on-read render loops - -// Entity readers (stable projections) -export const inputRowAtomFamily = atomFamily((rowId: string) => - selectAtom(inputRowsByIdComputedAtom, (m) => m[rowId] || null, deepEqual), -) - -export const chatSessionAtomFamily = atomFamily((sessionId: string) => - selectAtom( - chatSessionsByIdAtom, - (m) => m[sessionId] || null, - (a, b) => a === b, - ), -) - -export const chatTurnAtomFamily = atomFamily((turnId: string) => - selectAtom( - chatTurnsByIdAtom, - (m) => m[turnId] || null, - (a, b) => a === b, - ), -) - -// Compat: Get chat turn ids for a row via index -export const rowChatTurnIdsAtomFamily = atomFamily((rowId: string) => - selectAtom( - rowIdIndexAtom, - (idx) => idx[rowId]?.chatTurnIds || [], - (a, b) => a === b, - ), -) - -// Compat: Get chat turn for a row and turn id (validates membership in index) -export const rowChatTurnAtomFamily = atomFamily((p: {rowId: string; turnId: string}) => - atom((get) => { - const ids = get(rowChatTurnIdsAtomFamily(p.rowId)) as string[] - if (!ids.includes(p.turnId)) return null - return get(chatTurnAtomFamily(p.turnId)) as ChatTurn | null - }), -) - -// Row-scoped variables for a revision -export const rowVariablesAtomFamily = atomFamily((p: {rowId: string; revisionId: string}) => - atom((get) => { - const row = get(inputRowAtomFamily(p.rowId)) as InputRow | null - console.log("rowVariablesAtomFamily", row) - return row?.variables ?? [] - }), -) - -// Row-scoped responses for a revision -export const rowResponsesAtomFamily = atomFamily((p: {rowId: string; revisionId: string}) => - atom((get) => { - const row = get(inputRowAtomFamily(p.rowId)) as InputRow | null - return row?.responsesByRevision?.[p.revisionId] || [] - }), -) - -// Assistant message for a revision at a turn (chat) -export const assistantMessageAtomFamily = atomFamily((p: {turnId: string; revisionId: string}) => - atom((get) => { - const turn = get(chatTurnAtomFamily(p.turnId)) as ChatTurn | null - return turn?.assistantMessageByRevision?.[p.revisionId] ?? null - }), -) - -// Lightweight compatibility selectors (to be used for incremental migration) -// Note: not wired to any component yet; these mirror common read patterns. - -// Get minimal display data for a row variables panel -export const rowVariablesForDisplayAtomFamily = atomFamily( - (p: {rowId: string; revisionId: string}) => - selectAtom( - // Use stable empty object to avoid identity thrash - atom((get) => get(rowVariablesAtomFamily(p)) || EMPTY_OBJECT), - (vars) => vars, - (a, b) => { - // shallow compare keys + primitive values - const aKeys = Object.keys(a || {}) - const bKeys = Object.keys(b || {}) - if (aKeys.length !== bKeys.length) return false - for (const k of aKeys) { - if (a[k] !== (b as any)[k]) return false - } - return true - }, - ), -) - -// Get minimal display data for a row responses panel -export const rowResponsesForDisplayAtomFamily = atomFamily( - (p: {rowId: string; revisionId: string}) => - selectAtom( - // Use stable empty array to avoid identity thrash - atom((get) => get(rowResponsesAtomFamily(p)) || EMPTY_ARRAY), - (arr) => arr, - (a, b) => a === b, - ), -) - -// Stable empty containers to prevent re-render loops on missing data -const EMPTY_ARRAY: any[] = [] -const EMPTY_OBJECT: Record = {} diff --git a/web/oss/src/state/generation/utils.ts b/web/oss/src/state/generation/utils.ts deleted file mode 100644 index 49ef038786..0000000000 --- a/web/oss/src/state/generation/utils.ts +++ /dev/null @@ -1,222 +0,0 @@ -import type {Getter, Setter} from "jotai" - -import {displayedVariantsVariablesAtom} from "@/oss/components/Playground/state/atoms" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import { - chatTurnIdsAtom, - chatTurnIdsByBaselineAtom, - allChatTurnIdsMapAtom, - chatTurnsByIdAtom, - chatTurnsByIdCacheAtom, - runStatusByRowRevisionAtom, -} from "@/oss/state/generation/entities" -import {responseByRowRevisionAtomFamily} from "@/oss/state/newPlayground/generation/runtime" - -// PropertyNode is the shared structure used by variables and messages throughout UI -// Matches legacy format: __id-based nodes with optional __metadata and nested children/content -export interface PropertyNode { - __id: string - __metadata?: Record - content?: {value: any} | any - value?: any - children?: PropertyNode[] - role?: string - [k: string]: any -} - -/** - * Merge existing row variables with dynamic variable names for the provided revisions. - * - Reuses existing nodes by key/name when present - * - Creates new nodes for missing names with normalized metadata and empty values - * - Deduplicates across revisions preserving first-seen order - */ -export function mergeRowVariables( - get: (anAtom: {read: (get: any) => T}) => T, - existing: any[] | undefined, - _revisionIds: string[], - valueByName?: Record, -): any[] { - const existingFlat: any[] = Array.isArray(existing) ? existing : [] - const byName = new Map() - for (const n of existingFlat) { - const k = (n as any)?.key ?? (n as any)?.__id - if (typeof k === "string" && k) byName.set(k, n) - } - const seen = new Set() - const merged: any[] = [] - const allNames = (get(displayedVariantsVariablesAtom) || []) as string[] - for (const name of allNames || []) { - if (!name || seen.has(name)) continue - seen.add(name) - const existingNode = byName.get(name) - if (existingNode) { - const meta = (existingNode as any)?.__metadata || { - type: "string", - title: name, - description: `Template variable: {{${name}}}`, - } - // Clone node and nested content to avoid mutating frozen objects - const node: any = { - ...existingNode, - key: name, - __metadata: meta, - } - if ( - (existingNode as any)?.content && - typeof (existingNode as any).content === "object" - ) { - node.content = {...(existingNode as any).content} - } - - const cached = valueByName?.[name] - const curVal = (existingNode as any)?.content?.value ?? (existingNode as any)?.value - if (typeof cached === "string" && (!curVal || String(curVal).length === 0)) { - if (node.content && typeof node.content === "object") node.content.value = cached - node.value = cached - } - merged.push(node) - } else { - const cached = valueByName?.[name] - merged.push({ - __id: generateId(), - key: name, - __metadata: { - type: "string", - title: name, - description: `Template variable: {{${name}}}`, - }, - value: cached ?? "", - content: {value: cached ?? ""}, - }) - } - } - return merged -} - -interface DuplicateChatHistoryParams { - get: Getter - set: Setter - sourceRevisionId?: string | null - targetRevisionId: string - displayedVariantsAfterSwap?: string[] -} - -export function duplicateChatHistoryForRevision({ - get, - set, - sourceRevisionId, - targetRevisionId, - displayedVariantsAfterSwap, -}: DuplicateChatHistoryParams) { - if (!sourceRevisionId || !targetRevisionId || sourceRevisionId === targetRevisionId) return - - try { - const baselineMap = get(chatTurnIdsByBaselineAtom) || {} - let logicalIds: string[] = [] - if ( - Array.isArray(baselineMap[sourceRevisionId]) && - baselineMap[sourceRevisionId].length > 0 - ) - logicalIds = [...baselineMap[sourceRevisionId]] - else { - const currentLogical = get(chatTurnIdsAtom) - logicalIds = Array.isArray(currentLogical) ? [...currentLogical] : [] - } - - if (logicalIds.length === 0) return - - const persistedTurns = get(chatTurnsByIdAtom) as Record - const cachedTurns = get(chatTurnsByIdCacheAtom) as Record - const mergedTurns: Record = { - ...(persistedTurns || {}), - ...(cachedTurns || {}), - } - - const updatedEntries: Record = {} - - for (const [turnId, turnValue] of Object.entries(mergedTurns)) { - if (!turnValue) continue - const assistantMap = turnValue.assistantMessageByRevision || {} - const toolMap = turnValue.toolResponsesByRevision || {} - const hasAssistant = sourceRevisionId in assistantMap - const hasTool = sourceRevisionId in toolMap - if (!hasAssistant && !hasTool) continue - - const clonedTurn = structuredClone(turnValue) - clonedTurn.id = turnId - - if (!clonedTurn.assistantMessageByRevision) clonedTurn.assistantMessageByRevision = {} - if (hasAssistant && !(targetRevisionId in clonedTurn.assistantMessageByRevision)) { - const assistantNode = clonedTurn.assistantMessageByRevision[sourceRevisionId] - clonedTurn.assistantMessageByRevision[targetRevisionId] = assistantNode - ? structuredClone(assistantNode) - : null - } - - if (!clonedTurn.toolResponsesByRevision) clonedTurn.toolResponsesByRevision = {} - if (hasTool && !(targetRevisionId in clonedTurn.toolResponsesByRevision)) { - const toolNodes = clonedTurn.toolResponsesByRevision[sourceRevisionId] - clonedTurn.toolResponsesByRevision[targetRevisionId] = toolNodes - ? structuredClone(toolNodes) - : toolNodes - } - - updatedEntries[turnId] = clonedTurn - } - - if (Object.keys(updatedEntries).length > 0) { - set(chatTurnsByIdCacheAtom, (prev) => ({ - ...(prev || {}), - ...updatedEntries, - })) - } - - for (const logicalId of logicalIds) { - try { - const sourceResponse = get( - responseByRowRevisionAtomFamily({ - rowId: logicalId, - revisionId: sourceRevisionId, - }), - ) - if (sourceResponse !== undefined && sourceResponse !== null) { - set( - responseByRowRevisionAtomFamily({ - rowId: logicalId, - revisionId: targetRevisionId, - }), - structuredClone(sourceResponse), - ) - } - } catch {} - - try { - const runStatusMap = get(runStatusByRowRevisionAtom) as Record - const sourceKey = `${logicalId}:${sourceRevisionId}` - const targetKey = `${logicalId}:${targetRevisionId}` - const sourceStatus = runStatusMap?.[sourceKey] - if (sourceStatus) { - set(runStatusByRowRevisionAtom, (prev: Record) => ({ - ...(prev || {}), - [targetKey]: {...sourceStatus}, - })) - } - } catch {} - } - - set(chatTurnIdsByBaselineAtom, (prev) => ({ - ...(prev || {}), - [targetRevisionId]: [...logicalIds], - })) - - if (Array.isArray(displayedVariantsAfterSwap) && displayedVariantsAfterSwap.length > 0) { - const newKey = `set:${[...displayedVariantsAfterSwap].sort().join("|")}` - set(allChatTurnIdsMapAtom, (prev) => ({ - ...(prev || {}), - [newKey]: [...logicalIds], - })) - } - } catch (error) { - console.warn("Failed to duplicate chat history", error) - } -} diff --git a/web/oss/src/state/loadingSelectors.ts b/web/oss/src/state/loadingSelectors.ts deleted file mode 100644 index 078c3d6693..0000000000 --- a/web/oss/src/state/loadingSelectors.ts +++ /dev/null @@ -1,50 +0,0 @@ -import {atom} from "jotai" -import {selectAtom, atomFamily} from "jotai/utils" - -import {appsQueryAtom} from "@/oss/state/app/atoms/fetcher" -import {orgsQueryAtom, selectedOrgQueryAtom} from "@/oss/state/org/selectors/org" -import {profileQueryAtom} from "@/oss/state/profile/selectors/user" -import {projectsQueryAtom} from "@/oss/state/project/selectors/project" - -import {variantsQueryAtom, variantRevisionsQueryFamily} from "./variant/atoms/fetcher" - -// Centralised, reuse-safe status atoms. These are created once at module load -// and can be imported anywhere without recreating selector instances each render. - -export const profilePendingAtom = selectAtom(profileQueryAtom, (q) => q.isPending) -export const appsPendingAtom = selectAtom(appsQueryAtom, (q) => q.isPending) -export const projectsPendingAtom = selectAtom(projectsQueryAtom, (q) => q.isPending) -export const orgsListPendingAtom = selectAtom(orgsQueryAtom, (q) => q.isPending) -export const orgDetailsPendingAtom = selectAtom(selectedOrgQueryAtom, (q) => q.isPending) -export const variantsPendingAtom = selectAtom(variantsQueryAtom, (q) => q.isPending) - -// For atom families, we need to create a family of pending atoms -// Usage: get(variantRevisionsPendingFamily(variantId)) -export const variantRevisionsPendingFamily = atomFamily((variantId: string) => - selectAtom(variantRevisionsQueryFamily(variantId), (q) => q.isPending), -) - -// Convenience atom to check if ANY variant revisions are currently loading -// This is useful for global loading states -export const anyVariantRevisionsPendingAtom = atom((get) => { - const variantsQuery = get(variantsQueryAtom) - if (variantsQuery.isPending) return true - - const variants = variantsQuery.data || [] - return variants.some((variant) => { - const revisionsPending = get(variantRevisionsPendingFamily(variant.variantId)) - return revisionsPending - }) -}) - -// Playground loading state - true if variants OR any revisions are loading -// This is the main loading state for playground components -export const playgroundLoadingAtom = atom((get) => { - // If variants are still loading, playground is loading - const variantsQuery = get(variantsQueryAtom) - if (variantsQuery.isPending) return true - - // If any revisions are loading, playground is loading - const anyRevisionsPending = get(anyVariantRevisionsPendingAtom) - return anyRevisionsPending -}) diff --git a/web/oss/src/state/newObservability/atoms/controls.ts b/web/oss/src/state/newObservability/atoms/controls.ts deleted file mode 100644 index 6ad0400b04..0000000000 --- a/web/oss/src/state/newObservability/atoms/controls.ts +++ /dev/null @@ -1,100 +0,0 @@ -// Query control atoms for the observability module -import type {Key} from "react" - -import dayjs from "dayjs" -import {atom} from "jotai" - -import type {SortResult} from "@/oss/components/Filters/Sort" -import type {TestsetTraceData} from "@/oss/components/pages/observability/drawer/TestsetDrawer/assets/types" -import type {Filter} from "@/oss/lib/Types" - -import {routerAppIdAtom} from "../../app" - -export type TraceTabTypes = "trace" | "span" | "chat" - -export const DEFAULT_SORT: SortResult = { - type: "standard", - sorted: dayjs().utc().subtract(24, "hours").toISOString().split(".")[0], -} - -// UI-level query controls ---------------------------------------------------- -export const searchQueryAtom = atom("") -export const traceTabsAtom = atom("trace") -export const limitAtom = atom(50) - -// Keep user-defined filters separately, and always merge the permanent app filter on read. -const userFiltersAtom = atom([]) - -// Tracks whether the soft default should be auto-inserted. -const traceTypeDefaultEnabledAtom = atom(true) - -const isTraceType = (f: Filter) => (f.key ?? f.field) === "trace_type" - -export const filtersAtom = atom( - (get) => { - const appId = get(routerAppIdAtom) - const userFilters = get(userFiltersAtom) - const defaultEnabled = get(traceTypeDefaultEnabledAtom) - - const hasUserTraceType = userFilters.some(isTraceType) - - const softDefaults: Filter[] = [] - if (defaultEnabled && !hasUserTraceType) { - softDefaults.push({ - field: "trace_type", - operator: "is", - value: "invocation", - }) - } - - const appScope: Filter[] = appId - ? [ - { - field: "references", - operator: "in", - value: [ - { - id: String(appId), - "attributes.key": "application", - }, - ], - isPermanent: true, - }, - ] - : [] - - return [...appScope, ...softDefaults, ...userFilters] - }, - (get, set, update: Filter[] | ((prev: Filter[]) => Filter[])) => { - const currentCombined = get(filtersAtom) - const nextCombined = - typeof update === "function" ? (update as any)(currentCombined) : update - const normalizedNext = nextCombined || [] - - // Persist only non-permanent filters - const nextUser = normalizedNext.filter((f) => !(f as any).isPermanent) - set(userFiltersAtom, nextUser) - - // If only permanent filters remain (or none at all), keep the soft default disabled - if (!normalizedNext.some((f) => !(f as any).isPermanent)) { - set(traceTypeDefaultEnabledAtom, false) - return - } - - // If trace_type was present and now is not, the user explicitly cleared it. - const hadTraceType = currentCombined.some(isTraceType) - const hasTraceTypeNext = normalizedNext.some(isTraceType) - if (hadTraceType && !hasTraceTypeNext) { - set(traceTypeDefaultEnabledAtom, false) - } - }, -) -export const sortAtom = atom(DEFAULT_SORT as SortResult) - -// Table/UI controls ----------------------------------------------------------- -export const selectedTraceIdAtom = atom("") -export const selectedNodeAtom = atom("") -export const editColumnsAtom = atom(["span_type", "key", "usage", "tag"]) -export const selectedRowKeysAtom = atom([]) -export const testsetDrawerDataAtom = atom([]) -export const isAnnotationsSectionOpenAtom = atom(true) diff --git a/web/oss/src/state/newObservability/atoms/queries.ts b/web/oss/src/state/newObservability/atoms/queries.ts deleted file mode 100644 index 49dfed8c72..0000000000 --- a/web/oss/src/state/newObservability/atoms/queries.ts +++ /dev/null @@ -1,602 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {selectAtom, atomFamily} from "jotai/utils" -import {eagerAtom} from "jotai-eager" -import {atomWithInfiniteQuery, atomWithQuery} from "jotai-tanstack-query" - -import { - normalizeReferenceValue, - parseReferenceKey, -} from "@/oss/components/pages/observability/assets/filters/referenceUtils" -import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" -import {formatLatency, formatCurrency, formatTokenUsage} from "@/oss/lib/helpers/formatters" -import {getNodeById} from "@/oss/lib/helpers/observability_helpers" -import { - attachAnnotationsToTraces, - groupAnnotationsByReferenceId, -} from "@/oss/lib/hooks/useAnnotations/assets/helpers" -import {transformApiData} from "@/oss/lib/hooks/useAnnotations/assets/transformer" -import type {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -import {queryAllAnnotations} from "@/oss/services/annotations/api" -import type {_AgentaRootsResponse} from "@/oss/services/observability/types" -import {fetchAllPreviewTraces} from "@/oss/services/tracing/api" -import { - isSpansResponse, - isTracesResponse, - transformTracesResponseToTree, - transformTracingResponse, -} from "@/oss/services/tracing/lib/helpers" -import {TraceSpanNode} from "@/oss/services/tracing/types" -import {selectedAppIdAtom} from "@/oss/state/app/selectors/app" -import {getOrgValues} from "@/oss/state/org" -import {projectIdAtom} from "@/oss/state/project" - -import {sessionExistsAtom} from "../../session" - -import { - sortAtom, - filtersAtom, - traceTabsAtom, - selectedTraceIdAtom, - selectedNodeAtom, - limitAtom, -} from "./controls" - -// Traces query ---------------------------------------------------------------- -export const tracesQueryAtom = atomWithInfiniteQuery((get) => { - const appId = get(selectedAppIdAtom) - const sort = get(sortAtom) - const filters = get(filtersAtom) - const traceTabs = get(traceTabsAtom) - const projectId = get(projectIdAtom) - const limit = get(limitAtom) - - const params: Record = { - size: limit, - focus: traceTabs === "chat" ? "span" : traceTabs, - } - - interface Condition { - field: string - operator: string - value?: any - key?: string - } - - const isHasAnnotationSelected = filters.findIndex((f) => f.field === "has_annotation") - const hasAnnotationOperator = - isHasAnnotationSelected === -1 ? undefined : filters[isHasAnnotationSelected]?.operator - let hasAnnotationConditions: Condition[] = [] - - const buildAnnotationConditions = (value: any, operator: string): Condition[] => { - const v = Array.isArray(value) ? value[0] : value || {} - const out: Condition[] = [] - - const evaluatorSlug = v.evaluator - const feedback = v.feedback - - if (evaluatorSlug) { - out.push({ - field: "references", - operator, - value: [{slug: evaluatorSlug, "attributes.key": "evaluator"}], - }) - } - - if (feedback) { - out.push({ - field: "attributes", - key: `ag.data.outputs.${feedback.field}`, - operator: feedback.operator, - value: feedback.value, - }) - } - - return out - } - - if (filters.length > 0) { - const sanitized = filters.flatMap(({field, key, operator, value}) => { - if (field === "has_annotation") { - hasAnnotationConditions = [ - ...hasAnnotationConditions, - ...buildAnnotationConditions(value, operator), - ] - return [] - } - - if (field === "references") { - const {category, property} = parseReferenceKey(key, value) - const arrayValue = normalizeReferenceValue(value, property, category) - return {field, operator, value: arrayValue} - } - - if (field === "custom" || field === "input_keys" || field === "output_keys") { - const attributeKey = key?.slice("attributes.".length) - return {field: "attributes", key: attributeKey, operator, value} - } - - if (field?.startsWith("attributes.")) { - const attributeKey = field.slice("attributes.".length) - - return {field: "attributes", key: attributeKey, operator, value} - } - - if (field === "status_code" && value === "STATUS_CODE_OK") { - if (operator === "is") { - return {field, operator: "is_not", value: "STATUS_CODE_ERROR"} - } - - if (operator === "is_not") { - return {field, operator: "is", value: "STATUS_CODE_ERROR"} - } - } - - if (field.includes("annotation")) { - return buildAnnotationConditions(value, operator) - } - - return {field, operator, value} - }) - - params.filter = JSON.stringify({conditions: sanitized}) - } - - if (sort?.type === "standard" && sort.sorted) { - params.oldest = sort.sorted - } else if ( - sort?.type === "custom" && - (sort.customRange?.startTime || sort.customRange?.endTime) - ) { - const {startTime, endTime} = sort.customRange - if (startTime) params.oldest = startTime - if (endTime) params.newest = endTime - } - - const toFilterString = (conditions?: Condition[]) => - conditions && conditions.length ? JSON.stringify({conditions}) : undefined - - const parseFilterJSON = (filterStr?: string): Condition[] => { - if (!filterStr) return [] - try { - const obj = JSON.parse(filterStr) - return Array.isArray(obj?.conditions) ? obj.conditions : [] - } catch { - return [] - } - } - - const buildFiltersForHasAnnotation = ( - windowParams: Record, - annotationConditions: Condition[], - operator?: string, - ) => { - const originalConditions = parseFilterJSON(windowParams.filter) - - const annotationConditionsForStep1 = - operator === "not_in" - ? annotationConditions.map((condition) => - condition.field === "references" ? {...condition, operator: "in"} : condition, - ) - : annotationConditions - - const annotationOnlyFilter = toFilterString([ - {field: "trace_type", operator: "is", value: "annotation"}, - ...annotationConditionsForStep1, - ]) - const originalFilter = toFilterString(originalConditions) - return {originalFilter, annotationOnlyFilter} - } - - const extractLinkedIds = (data: any) => { - const traceIds = new Set() - const spanIds = new Set() - - // shape 1: { traces: { [id]: { spans: { [id]: { links }}}}} - if (data?.traces && typeof data.traces === "object") { - for (const trace of Object.values(data.traces)) { - if (!trace?.spans) continue - for (const span of Object.values(trace.spans)) { - const links = Array.isArray(span?.links) - ? span.links - : span?.links && typeof span.links === "object" - ? Object.values(span.links) - : [] - for (const l of links) { - if (l?.trace_id) traceIds.add(String(l.trace_id)) - if (l?.span_id) spanIds.add(String(l.span_id)) - } - } - } - } - - // shape 2: { spans: { [id]: {...} } } or { spans: Span[] } - const spansContainer = data?.spans - const spansIterable = Array.isArray(spansContainer) - ? spansContainer - : spansContainer && typeof spansContainer === "object" - ? Object.values(spansContainer) - : [] - for (const span of spansIterable) { - const links = Array.isArray(span?.links) - ? span.links - : span?.links && typeof span.links === "object" - ? Object.values(span.links) - : [] - for (const l of links) { - if (l?.trace_id) traceIds.add(String(l.trace_id)) - if (l?.span_id) spanIds.add(String(l.span_id)) - } - } - - return {traceIds: [...traceIds], spanIds: [...spanIds]} - } - - const extractEarliestTimestamp = (data: any): string | undefined => { - const getTs = (n: any) => - n?.start_time ?? n?.startTime ?? n?.timestamp ?? n?.ts ?? n?.created_at ?? null - - const spans = data?.spans - const list = Array.isArray(spans) - ? spans - : spans && typeof spans === "object" - ? Object.values(spans) - : [] - - const times = list - .map(getTs) - .map((v) => (typeof v === "number" ? v : typeof v === "string" ? Date.parse(v) : NaN)) - .filter((n) => Number.isFinite(n)) as number[] - - if (!times.length) return undefined - const minVal = times.reduce((a, b) => (a < b ? a : b)) - const d = new Date(minVal) - return Number.isNaN(d.getTime()) ? undefined : d.toISOString() - } - - const mergeConditions = (baseFilterJSON: string | undefined, extra: Condition[]) => { - const base = parseFilterJSON(baseFilterJSON) - const cleaned = extra.filter( - (c) => c.operator !== "in" || (Array.isArray(c.value) && c.value.length > 0), - ) - const keyOf = (c: Condition) => - `${c.field}|${c.operator}|${c.key ?? ""}|${JSON.stringify(c.value)}` - const seen = new Set(base.map(keyOf)) - const merged = [...base] - for (const c of cleaned) if (!seen.has(keyOf(c))) merged.push(c) - return toFilterString(merged) - } - - const sessionExists = get(sessionExistsAtom) - - return { - queryKey: ["traces", projectId, appId, params], - initialPageParam: {newest: params.newest as string | undefined}, - - queryFn: async ({pageParam}: {pageParam?: {newest?: string}}) => { - const windowParams = {...params} - let data: any = [] - let annotationPageSize: number | undefined - let nextCursorFromStep1: string | undefined - - if (isHasAnnotationSelected !== -1) { - const {originalFilter, annotationOnlyFilter} = buildFiltersForHasAnnotation( - windowParams, - hasAnnotationConditions, - hasAnnotationOperator, - ) - - // STEP 1: paginated annotations only - const firstParams = {...windowParams} - firstParams.focus = "span" - firstParams.filter = annotationOnlyFilter - if (pageParam?.newest) firstParams.newest = pageParam.newest - - const data1 = await fetchAllPreviewTraces(firstParams, appId as string) - - // page size for pagination decision - const countEntries = (container: unknown) => { - if (!container) return 0 - if (Array.isArray(container)) return container.length - if (typeof container === "object") return Object.keys(container).length - return 0 - } - const spansPageSize = countEntries((data1 as any)?.spans) - const tracesPageSize = countEntries((data1 as any)?.traces) - annotationPageSize = spansPageSize || tracesPageSize - - // cursor from step 1 only - nextCursorFromStep1 = extractEarliestTimestamp(data1) - if (nextCursorFromStep1 && typeof params.oldest === "string") { - const lb = Date.parse(params.oldest) - const nc = Date.parse(nextCursorFromStep1) - if (!Number.isNaN(lb) && !Number.isNaN(nc) && nc <= lb) - nextCursorFromStep1 = undefined - } - - // IDs from step 1 - const {traceIds, spanIds} = extractLinkedIds(data1) - - const shouldExcludeAnnotations = hasAnnotationOperator === "not_in" - - if (!shouldExcludeAnnotations && (traceIds.length === 0 || spanIds.length === 0)) { - return { - traces: [], - traceCount: 0, - nextCursor: nextCursorFromStep1, - annotationPageSize, - } - } - - if (shouldExcludeAnnotations && traceIds.length === 0 && spanIds.length === 0) { - if (pageParam?.newest) windowParams.newest = pageParam.newest - data = await fetchAllPreviewTraces(windowParams, appId as string) - } else { - // STEP 2: not paginated, fetch matches with inclusion/exclusion conditions - const extraConditions: Condition[] = shouldExcludeAnnotations - ? [ - ...(traceIds.length - ? [{field: "trace_id", operator: "not_in", value: traceIds}] - : []), - ...(spanIds.length - ? [{field: "span_id", operator: "not_in", value: spanIds}] - : []), - ] - : [ - {field: "trace_id", operator: "in", value: traceIds}, - {field: "span_id", operator: "in", value: spanIds}, - ] - - const secondParams: Record = {...params} - delete secondParams.newest - delete secondParams.oldest - if (!shouldExcludeAnnotations) { - secondParams.size = Math.max(traceIds.length, spanIds.length) - } - secondParams.filter = mergeConditions(originalFilter, extraConditions) - - data = await fetchAllPreviewTraces(secondParams, appId as string) - } - } else { - // normal flow - if (pageParam?.newest) windowParams.newest = pageParam.newest - data = await fetchAllPreviewTraces(windowParams, appId as string) - } - - // transform to tree - const transformed: TraceSpanNode[] = [] - if (isTracesResponse(data)) { - transformed.push(...transformTracingResponse(transformTracesResponseToTree(data))) - } else if (isSpansResponse(data)) { - transformed.push(...transformTracingResponse(data.spans)) - } - - // cursor - let nextCursor: string | undefined = nextCursorFromStep1 - if (isHasAnnotationSelected === -1) { - const getTs = (n: any) => - n?.start_time ?? n?.startTime ?? n?.timestamp ?? n?.ts ?? n?.created_at ?? null - const times = transformed - .map(getTs) - .map((value) => { - if (typeof value === "number") return value - const parsed = typeof value === "string" ? Date.parse(value) : NaN - return Number.isNaN(parsed) ? null : parsed - }) - .filter((value): value is number => value !== null) - - if (times.length) { - const minVal = times.reduce((min, cur) => (cur < min ? cur : min)) - const cursorDate = new Date(minVal) - const lowerBound = - params.oldest && typeof params.oldest === "string" - ? Date.parse(params.oldest) - : undefined - - if (!Number.isNaN(cursorDate.getTime())) { - if (lowerBound !== undefined && minVal <= lowerBound) { - nextCursor = undefined - } else { - nextCursor = cursorDate.toISOString() - } - } - } - } - - return { - traces: transformed, - traceCount: (data as any)?.count ?? 0, - nextCursor, - annotationPageSize, - } - }, - enabled: sessionExists && Boolean(appId || projectId), - - getNextPageParam: (lastPage, _pages) => { - const page = lastPage as any - const pageSize = page.annotationPageSize ?? page.traces.length - return pageSize === limit && page.nextCursor - ? {newest: page.nextCursor as string} - : undefined - }, - - refetchOnWindowFocus: false, - } -}) - -// Base traces atom ------------------------------------------------------------- -export const tracesAtom = selectAtom( - tracesQueryAtom, - (query) => { - const pages = query.data?.pages ?? [] - if (!pages.length) return [] - - const seen = new Set() - const deduped: TraceSpanNode[] = [] - - pages.forEach((page) => { - page.traces.forEach((trace: TraceSpanNode) => { - const key = trace.span_id || trace.key - if (!key || seen.has(key)) return - seen.add(key) - deduped.push(trace) - }) - }) - - return deduped - }, - deepEqual, -) - -export const traceCountAtom = selectAtom( - tracesQueryAtom, - (query) => query.data?.pages?.[0]?.traceCount ?? 0, -) - -// Annotation links ------------------------------------------------------------- -const collectInvocationLinks = (nodes: TraceSpanNode[] = []) => { - const links: {trace_id: string; span_id: string}[] = [] - const seen = new Set() - - const visit = (node?: TraceSpanNode) => { - if (!node) return - - const ids = node.invocationIds - if (ids?.trace_id && ids?.span_id) { - const key = `${ids.trace_id}:${ids.span_id}` - if (!seen.has(key)) { - seen.add(key) - links.push(ids) - } - } - - node.children?.forEach((child) => visit(child as TraceSpanNode)) - } - - nodes.forEach((node) => visit(node)) - return links -} - -export const annotationLinksAtom = eagerAtom((get) => - collectInvocationLinks(get(tracesAtom) as TraceSpanNode[]), -) - -// Annotations query ------------------------------------------------------------ -export const annotationsQueryAtom = atomWithQuery((get) => { - const links = get(annotationLinksAtom) - const {selectedOrg} = getOrgValues() - const members = selectedOrg?.default_workspace?.members || [] - - return { - queryKey: ["annotations", links], - queryFn: async () => { - if (Array.isArray(links) && !links.length) return [] as AnnotationDto[] - const res = await queryAllAnnotations({annotation: {links}}) - return ( - res.annotations?.map((a) => transformApiData({data: a, members})) || - [] - ) - }, - enabled: Array.isArray(links) && links.length > 0, - refetchOnWindowFocus: false, - } -}) - -export const annotationsAtom = selectAtom(annotationsQueryAtom, (q) => q.data ?? [], deepEqual) - -// Combined traces with annotations -------------------------------------------- -export const tracesWithAnnotationsAtom = eagerAtom((get) => - attachAnnotationsToTraces( - get(tracesAtom) as TraceSpanNode[], - get(annotationsAtom) as AnnotationDto[], - ), -) - -// Loading state ---------------------------------------------------------------- -export const observabilityLoadingAtom = eagerAtom((get) => { - const tracesQuery = get(tracesQueryAtom) - const annotationsLoading = get(annotationsQueryAtom).isLoading - if (tracesQuery.isFetchingNextPage) return false - return tracesQuery.isLoading || annotationsLoading -}) - -// Derived selection helpers ---------------------------------------------------- -export const activeTraceIndexAtom = eagerAtom((get) => { - const traces = get(tracesWithAnnotationsAtom) - const selectedId = get(selectedTraceIdAtom) - const tab = get(traceTabsAtom) - return traces.findIndex((item) => - tab === "span" ? item.span_id === selectedId : item.trace_id === selectedId, - ) -}) - -export const activeTraceAtom = eagerAtom((get) => { - const traces = get(tracesWithAnnotationsAtom) - const idx = get(activeTraceIndexAtom) - return idx >= 0 ? traces[idx] : null -}) - -export const selectedItemAtom = eagerAtom((get) => { - const traces = get(tracesWithAnnotationsAtom) - const selected = get(selectedNodeAtom) - if (!traces.length || !selected) return null - return getNodeById(traces, selected) || null -}) - -// Annotation helpers ---------------------------------------------------------- -export const annotationEvaluatorSlugsAtom = selectAtom( - annotationsAtom, - (anns: AnnotationDto[]) => - Array.from( - new Set(anns.map((a) => a.references?.evaluator?.slug).filter(Boolean)), - ) as string[], - deepEqual, -) - -export const traceAnnotationInfoAtomFamily = atomFamily((key: string) => - atom((get) => { - const [traceId = "", spanId = ""] = key.split(":") - const anns = get(annotationsAtom) as AnnotationDto[] - const matching = anns.filter((annotation) => { - if (!annotation.links || typeof annotation.links !== "object") { - return false - } - - return Object.values(annotation.links).some( - (link) => link?.trace_id === traceId && link?.span_id === spanId, - ) - }) - return { - annotations: matching, - aggregatedEvaluatorMetrics: groupAnnotationsByReferenceId(matching), - } - }, deepEqual), -) - -// Formatting helpers ---------------------------------------------------------- -export const nodeDisplayNameAtomFamily = atomFamily((name: string) => - atom(() => { - const truncated = name.length >= 15 - return { - text: truncated ? `${name.slice(0, 15)}...` : name, - full: name, - truncated, - } - }), -) - -export const formattedTimestampAtomFamily = atomFamily((ts?: string) => - atom(() => formatDay({date: ts, outputFormat: "HH:mm:ss DD MMM YYYY"})), -) - -export const formattedDurationAtomFamily = atomFamily((ms?: number) => - atom(() => formatLatency(ms ? ms / 1000 : null)), -) - -export const formattedCostAtomFamily = atomFamily((cost?: number) => - atom(() => formatCurrency(cost)), -) - -export const formattedUsageAtomFamily = atomFamily((tokens?: number) => - atom(() => formatTokenUsage(tokens)), -) diff --git a/web/oss/src/state/newObservability/helpers/index.ts b/web/oss/src/state/newObservability/helpers/index.ts deleted file mode 100644 index e430435b88..0000000000 --- a/web/oss/src/state/newObservability/helpers/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -export const parseNumericString = (raw: string) => { - const trimmed = raw.trim() - if (!trimmed) return raw - - const parsed = Number(trimmed) - return Number.isNaN(parsed) ? raw : parsed -} - -export const coerceNumericValue = (value: FilterItem["value"]): Filter["value"] => { - if (Array.isArray(value)) { - return value.map((item) => - typeof item === "string" - ? parseNumericString(item) - : Array.isArray(item) - ? coerceNumericValue(item) - : typeof item === "object" && item !== null - ? coerceNumericValue(item as any) - : item, - ) - } - - if (typeof value === "object" && value !== null) { - return Object.entries(value).reduce>((acc, [key, val]) => { - if (typeof val === "string") { - acc[key] = parseNumericString(val) - } else if (Array.isArray(val) || (typeof val === "object" && val !== null)) { - acc[key] = coerceNumericValue(val as any) - } else { - acc[key] = val - } - - return acc - }, {}) - } - - if (typeof value === "string") { - return parseNumericString(value) - } - - return value -} diff --git a/web/oss/src/state/newObservability/hooks/index.ts b/web/oss/src/state/newObservability/hooks/index.ts deleted file mode 100644 index fede7734a8..0000000000 --- a/web/oss/src/state/newObservability/hooks/index.ts +++ /dev/null @@ -1,113 +0,0 @@ -import {useCallback} from "react" - -import {useAtom, useAtomValue} from "jotai" - -import { - searchQueryAtom, - traceTabsAtom, - filtersAtom, - sortAtom, - selectedTraceIdAtom, - selectedRowKeysAtom, - editColumnsAtom, - testsetDrawerDataAtom, - isAnnotationsSectionOpenAtom, - selectedNodeAtom, - DEFAULT_SORT, - limitAtom, -} from "../atoms/controls" -import { - tracesQueryAtom, - annotationsQueryAtom, - tracesWithAnnotationsAtom, - observabilityLoadingAtom, - activeTraceIndexAtom, - activeTraceAtom, - selectedItemAtom, -} from "../atoms/queries" - -export const useObservability = () => { - const [searchQuery, setSearchQuery] = useAtom(searchQueryAtom) - const [traceTabs, setTraceTabs] = useAtom(traceTabsAtom) - const [filters, setFilters] = useAtom(filtersAtom) - const [sort, setSort] = useAtom(sortAtom) - const [selectedTraceId, setSelectedTraceId] = useAtom(selectedTraceIdAtom) - const [selectedRowKeys, setSelectedRowKeys] = useAtom(selectedRowKeysAtom) - const [editColumns, setEditColumns] = useAtom(editColumnsAtom) - const [testsetDrawerData, setTestsetDrawerData] = useAtom(testsetDrawerDataAtom) - const [isAnnotationsSectionOpen, setIsAnnotationsSectionOpen] = useAtom( - isAnnotationsSectionOpenAtom, - ) - const [selectedNode, setSelectedNode] = useAtom(selectedNodeAtom) - const [limit] = useAtom(limitAtom) - - const [{refetch: refetchTraces, fetchNextPage, hasNextPage, isFetchingNextPage}] = - useAtom(tracesQueryAtom) - const [{data: annotationsData, refetch: refetchAnnotations}] = useAtom(annotationsQueryAtom) - const traces = useAtomValue(tracesWithAnnotationsAtom) - const isLoading = useAtomValue(observabilityLoadingAtom) - const activeTraceIndex = useAtomValue(activeTraceIndexAtom) - const activeTrace = useAtomValue(activeTraceAtom) - const selectedItem = useAtomValue(selectedItemAtom) - const annotations = annotationsData ?? [] - - const fetchTraces = useCallback(async () => { - const res = await refetchTraces() - return res.data - }, [refetchTraces]) - - const fetchAnnotations = useCallback(async () => { - const res = await refetchAnnotations() - return res.data - }, [refetchAnnotations]) - - const fetchMoreTraces = useCallback(async () => { - if (!hasNextPage) return [] - const res = await fetchNextPage() - const pages = res.data?.pages || [] - return pages.length ? pages[pages.length - 1].traces : [] - }, [fetchNextPage, hasNextPage]) - - const clearQueryStates = useCallback(() => { - setSearchQuery("") - setTraceTabs("trace") - setFilters([]) - setSort(DEFAULT_SORT) - }, [setSearchQuery, setTraceTabs, setFilters, setSort]) - - return { - traces, - annotations, - isLoading, - fetchMoreTraces, - hasMoreTraces: hasNextPage, - isFetchingMore: isFetchingNextPage, - fetchTraces, - fetchAnnotations, - clearQueryStates, - searchQuery, - setSearchQuery, - traceTabs, - setTraceTabs, - filters, - setFilters, - sort, - setSort, - selectedTraceId, - setSelectedTraceId, - limit, - selectedRowKeys, - setSelectedRowKeys, - editColumns, - setEditColumns, - testsetDrawerData, - setTestsetDrawerData, - isAnnotationsSectionOpen, - setIsAnnotationsSectionOpen, - selectedNode, - setSelectedNode, - activeTraceIndex, - activeTrace, - selectedItem, - } -} diff --git a/web/oss/src/state/newObservability/index.ts b/web/oss/src/state/newObservability/index.ts deleted file mode 100644 index 5a9052ec48..0000000000 --- a/web/oss/src/state/newObservability/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./atoms/controls" -export * from "./atoms/queries" -export * from "./selectors/tracing" -export * from "./hooks" -export * from "./helpers" diff --git a/web/oss/src/state/newObservability/selectors/tracing.ts b/web/oss/src/state/newObservability/selectors/tracing.ts deleted file mode 100644 index 0994411829..0000000000 --- a/web/oss/src/state/newObservability/selectors/tracing.ts +++ /dev/null @@ -1,133 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {formatCurrency, formatLatency, formatTokenUsage} from "@/oss/lib/helpers/formatters" -import {TraceSpanNode} from "@/oss/services/tracing/types/index" -import dayjs from "dayjs" -import {getStringOrJson} from "@/oss/lib/helpers/utils" - -// Metric extraction helpers ---------------------------------------------------- -const getTokenMetrics = (span?: TraceSpanNode) => span?.attributes?.ag?.metrics?.tokens ?? null - -export const getTokens = (span?: TraceSpanNode) => { - const tokens = getTokenMetrics(span) - return tokens?.cumulative?.total ?? tokens?.incremental?.total ?? null -} - -export const getPromptTokens = (span?: TraceSpanNode) => { - const tokens = getTokenMetrics(span) - return tokens?.cumulative?.prompt ?? tokens?.incremental?.prompt ?? null -} - -export const getCompletionTokens = (span?: TraceSpanNode) => { - const tokens = getTokenMetrics(span) - return tokens?.cumulative?.completion ?? tokens?.incremental?.completion ?? null -} - -export const getCost = (span?: TraceSpanNode) => { - const costs = span?.attributes?.ag?.metrics?.costs - return costs?.cumulative?.total ?? costs?.incremental?.total ?? null -} - -export const getLatency = (span?: TraceSpanNode) => - span?.attributes?.ag?.metrics?.duration?.cumulative ?? null - -export const getTraceInputs = (span?: TraceSpanNode) => span?.attributes?.ag?.data?.inputs ?? null - -export const getTraceOutputs = (span?: TraceSpanNode) => span?.attributes?.ag?.data?.outputs ?? null - -// General attribute helpers ---------------------------------------------------- -export const getAgMetaConfiguration = (span?: TraceSpanNode) => - span?.attributes?.ag?.meta?.configuration ?? null - -export const getAgData = (span?: TraceSpanNode) => span?.attributes?.ag?.data ?? null - -export const getAgDataInputs = (span?: TraceSpanNode) => getAgData(span)?.inputs ?? null - -export const getAgDataOutputs = (span?: TraceSpanNode) => getAgData(span)?.outputs ?? null - -export const getAgDataInternals = (span?: TraceSpanNode) => getAgData(span)?.internals ?? null - -export const getAgNodeType = (span?: TraceSpanNode) => span?.attributes?.ag?.node?.type ?? null - -export const getSpanException = (span?: TraceSpanNode) => - span?.events?.find((event) => event.name === "exception") ?? null - -// Raw metric selectors --------------------------------------------------------- -export const spanTokensAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getTokens(span)), -) - -export const spanCostAtomFamily = atomFamily((span?: TraceSpanNode) => atom(() => getCost(span))) - -export const spanLatencyAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getLatency(span)), -) - -export const spanStartTimeAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => dayjs(span?.start_time).utc().format("DD/MM/YYYY, hh:mm:ss A")), -) - -export const spanEndTimeAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => dayjs(span?.end_time).utc().format("DD/MM/YYYY, hh:mm:ss A")), -) - -export const spanTraceInputsAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getStringOrJson(getTraceInputs(span))), -) - -export const spanTraceOutputsAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getStringOrJson(getTraceOutputs(span))), -) - -export const spanMetaConfigurationAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getAgMetaConfiguration(span)), -) - -export const spanAgDataAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getAgData(span)), -) - -export const spanDataInputsAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getAgDataInputs(span)), -) - -export const spanDataOutputsAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getAgDataOutputs(span)), -) - -export const spanDataInternalsAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getAgDataInternals(span)), -) - -export const spanNodeTypeAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getAgNodeType(span)), -) - -export const spanExceptionAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => getSpanException(span)), -) - -// Formatted metric selectors --------------------------------------------------- -export const formattedSpanTokensAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => formatTokenUsage(getTokens(span))), -) - -export const formattedSpanPromptTokensAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => formatTokenUsage(getPromptTokens(span))), -) - -export const formattedSpanCompletionTokensAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => formatTokenUsage(getCompletionTokens(span))), -) - -export const formattedSpanCostAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => formatCurrency(getCost(span))), -) - -export const formattedSpanLatencyAtomFamily = atomFamily((span?: TraceSpanNode) => - atom(() => { - const latency = getLatency(span) - return formatLatency(latency != null ? latency / 1000 : null) - }), -) diff --git a/web/oss/src/state/newObservability/utils/buildTraceQueryParams.ts b/web/oss/src/state/newObservability/utils/buildTraceQueryParams.ts deleted file mode 100644 index ed56345e1f..0000000000 --- a/web/oss/src/state/newObservability/utils/buildTraceQueryParams.ts +++ /dev/null @@ -1,124 +0,0 @@ -import {Filter} from "@/oss/lib/Types" -import {SortResult} from "@/oss/components/Filters/Sort" -import {TraceTabTypes} from "../atoms/controls" - -const toNumber = (value: unknown): number | undefined => { - if (value === null || value === undefined) return undefined - const num = Number(value) - return Number.isFinite(num) ? num : undefined -} - -const toNumberArray = (value: unknown): number[] => { - if (Array.isArray(value)) { - return value.map(toNumber).filter((entry): entry is number => entry !== undefined) - } - - if (typeof value === "string") { - const trimmed = value.trim() - if (!trimmed) return [] - - if (trimmed.startsWith("[") && trimmed.endsWith("]")) { - try { - const parsed = JSON.parse(trimmed) - if (Array.isArray(parsed)) { - return parsed - .map(toNumber) - .filter((entry): entry is number => entry !== undefined) - } - } catch (error) { - console.warn("Failed to parse numeric array filter", error) - } - } - - return trimmed - .split(/[\s,;]+/g) - .map(toNumber) - .filter((entry): entry is number => entry !== undefined) - } - - const single = toNumber(value) - return single === undefined ? [] : [single] -} - -const toBetweenPair = (value: unknown): number[] => { - const values = toNumberArray(value) - return values.length >= 2 ? values.slice(0, 2) : [] -} - -const isListOperator = (operator?: string) => operator === "in" || operator === "not_in" -const isBetweenOperator = (operator?: string) => operator === "btwn" - -export interface BuildTraceQueryParamsArgs { - focus: TraceTabTypes - filters: Filter[] - sort: SortResult - limit: number -} - -export const buildTraceQueryParams = ({ - focus, - filters, - sort, - limit, -}: BuildTraceQueryParamsArgs): Record => { - const params: Record = { - size: limit, - focus: focus === "chat" ? "span" : focus, - } - - if (filters.length) { - const sanitised = filters.map(({field, key, operator, value}) => { - if (field === "references") { - const refKey = key || "id" - const normalisedArray = Array.isArray(value) - ? value.map((entry) => - typeof entry === "object" && entry !== null ? entry : {[refKey]: entry}, - ) - : [{[refKey]: value}] - return {field, operator, value: normalisedArray} - } - - if (field?.startsWith("attributes.")) { - const attributeKey = field.slice("attributes.".length) - let normalisedValue: unknown = value - - if (isBetweenOperator(operator)) { - normalisedValue = toBetweenPair(value) - } else if (isListOperator(operator)) { - normalisedValue = toNumberArray(value) - } else { - const numericValue = toNumber(value) - normalisedValue = numericValue === undefined ? undefined : numericValue - } - - return {field: "attributes", key: attributeKey, operator, value: normalisedValue} - } - - if (field === "status_code" && value === "STATUS_CODE_OK") { - if (operator === "is") { - return {field, operator: "is_not", value: "STATUS_CODE_ERROR"} - } - - if (operator === "is_not") { - return {field, operator: "is", value: "STATUS_CODE_ERROR"} - } - } - - return {field, operator, value} - }) - - params.filter = JSON.stringify({conditions: sanitised}) - } - - if (sort?.type === "standard" && sort.sorted) { - params.oldest = sort.sorted - } else if (sort?.type === "custom" && sort.customRange) { - const {startTime, endTime} = sort.customRange - if (startTime) params.oldest = startTime - if (endTime) params.newest = endTime - } - - return params -} - -export default buildTraceQueryParams diff --git a/web/oss/src/state/newPlayground/chat/actions.ts b/web/oss/src/state/newPlayground/chat/actions.ts deleted file mode 100644 index ef43047222..0000000000 --- a/web/oss/src/state/newPlayground/chat/actions.ts +++ /dev/null @@ -1,200 +0,0 @@ -import {produce} from "immer" -import {atom} from "jotai" - -import {createMessageFromSchema} from "@/oss/components/Playground/hooks/usePlayground/assets/messageHelpers" -import { - displayedVariantsAtom, - // displayedVariantsVariablesAtom, -} from "@/oss/components/Playground/state/atoms" -// import {updateGenerationDataPropertyMutationAtom} from "@/oss/components/Playground/state/atoms/propertyMutations" -import {getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import { - chatSessionsByIdAtom, - // chatSessionIdsAtom, - chatTurnsByIdAtom, - // chatTurnsByIdFamilyAtom, - chatTurnIdsAtom, - // logicalTurnIndexAtom, - runStatusByRowRevisionAtom, -} from "@/oss/state/generation/entities" -import {promptsAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {cancelTestAtom} from "@/oss/state/newPlayground/mutations/execution" -import {triggerWebWorkerTestAtom} from "@/oss/state/newPlayground/mutations/webWorkerIntegration" - -/** - * Chat actions: centralized, explicit side effects for chat turns. - * These bridge to existing worker/test execution while we migrate fully. - */ - -export const addChatTurnAtom = atom(null, (get, set) => { - set(chatTurnIdsAtom, (prev) => { - const setIds = new Set(prev || []) - setIds.add(`lt-${generateId()}`) - return Array.from(setIds) - }) -}) - -// Set the user content for the last turn (baseline or provided revisions[0]) -export const setLastUserContentAtom = atom( - null, - (get, set, params: {content: any; revisions?: string[]}) => { - const displayedRevIds = (get(displayedVariantsAtom) || []) as string[] - const revisions = - Array.isArray(params?.revisions) && params.revisions.length > 0 - ? params.revisions - : displayedRevIds - if (!Array.isArray(revisions) || revisions.length === 0) return - const baseline = revisions[0] - - const sid = `session-${baseline}` - const sessions = get(chatSessionsByIdAtom) as Record - const turns = get(chatTurnsByIdAtom) as Record - const lastTurnId = (sessions?.[sid]?.turnIds || []).slice(-1)[0] - if (!lastTurnId) return - const userId = turns?.[lastTurnId]?.userMessage?.__id - const contentId = turns?.[lastTurnId]?.userMessage?.content?.__id - if (userId && contentId) { - // set(updateGenerationDataPropertyMutationAtom, { - // rowId: lastTurnId, - // propertyId: contentId, - // messageId: userId, - // revisionId: baseline, - // value: Array.isArray(params.content) - // ? params.content - // : String(params.content ?? ""), - // } as any) - } - }, -) - -// Attach an assistant message to the last turn for displayed revisions (or provided revisions) -export const attachAssistantToLastTurnAtom = atom( - null, - (get, set, params: {content: any; revisions?: string[]}) => { - const displayedRevIds = (get(displayedVariantsAtom) || []) as string[] - const targetRevs = - Array.isArray(params?.revisions) && params.revisions.length > 0 - ? params.revisions - : displayedRevIds - if (!Array.isArray(targetRevs) || targetRevs.length === 0) return - - const baseline = targetRevs[0] - const sid = `session-${baseline}` - const sessions = get(chatSessionsByIdAtom) as Record - const sess = sessions[sid] - const lastTurnId = (sess?.turnIds || []).slice(-1)[0] - if (!lastTurnId) return - - // Build assistant message using baseline metadata if available - let node: any - try { - const revPrompts = (get(promptsAtomFamily(baseline)) || []) as any[] - const sample = revPrompts - .flatMap((p: any) => p?.messages?.value || []) - .find(Boolean) as any - const metaId = sample?.__metadata as string | undefined - if (metaId) - node = createMessageFromSchema( - getMetadataLazy(metaId) as any, - {role: "assistant", content: params.content} as any, - ) - } catch {} - if (!node) { - node = { - __id: `assistant-${generateId()}`, - role: {__id: `role-${generateId()}`, value: "assistant"}, - content: {__id: `content-${generateId()}`, value: params.content}, - } - } - - set(chatTurnsByIdAtom, (prev) => - produce(prev, (draft: any) => { - const t = draft[lastTurnId] - if (!t) return - if (!t.assistantMessageByRevision) t.assistantMessageByRevision = {} - for (const revId of targetRevs) { - t.assistantMessageByRevision[revId] = node - } - }), - ) - }, -) - -export const runChatTurnAtom = atom( - null, - async ( - get, - set, - params: {turnId: string; variantId?: string; revisions?: string[]; messageId?: string}, - ) => { - const {turnId, variantId, revisions, messageId} = params - const displayed = revisions ?? (get(displayedVariantsAtom) || []) - - const ids = (get(chatTurnIdsAtom) || []) as string[] - const idx = ids.indexOf(turnId) - const isLast = idx >= 0 && idx === ids.length - 1 - if (!isLast && messageId) { - set(chatTurnIdsAtom, (prev) => { - const list = prev || [] - const i = list.indexOf(turnId) - return i >= 0 ? list.slice(0, i + 1) : list - }) - } - - if (variantId) { - const rowId = turnId - // map[variantId] || `turn-${variantId}-${turnId}` - set(triggerWebWorkerTestAtom, {rowId, variantId, messageId}) - return - } - - const x = get(chatTurnIdsAtom) - const currentIndex = x.indexOf(turnId) - - set(chatTurnIdsAtom, (prev) => { - const newIds = [...prev] - newIds.slice(0, currentIndex + 1) - return newIds.slice(0, currentIndex + 1) - }) - - if (Array.isArray(displayed) && displayed.length > 0) { - for (const rev of displayed) { - const rowId = turnId - // map[rev] || `turn-${rev}-${turnId}` - set(triggerWebWorkerTestAtom, {rowId, variantId: rev, messageId}) - } - } else { - // Single run without variant and no displayed revisions: let worker resolve baseline - set(triggerWebWorkerTestAtom, {rowId: turnId, messageId}) - } - }, -) - -// Run the last runnable chat row (logical turn) across displayed revisions -// Runnable means the user message has non-empty text or an image_url with a url -export const runAllChatAtom = atom(null, (get, set) => { - const turnIds = (get(chatTurnIdsAtom) || []) as string[] - if (!Array.isArray(turnIds) || turnIds.length === 0) return - - // Always target the last logical turn id. - const targetId = turnIds[turnIds.length - 1] - if (!targetId) return - set(runChatTurnAtom, {turnId: targetId}) -}) - -export const cancelChatTurnAtom = atom( - null, - async (get, set, params: {turnId: string; variantId?: string}) => { - const {turnId, variantId} = params - if (variantId) { - set(cancelTestAtom, {rowId: turnId, variantId}) - return - } - // Cancel across displayed variants - const displayed = (get(displayedVariantsAtom) || []) as string[] - for (const rev of displayed) { - set(cancelTestAtom, {rowId: turnId, variantId: rev}) - } - }, -) diff --git a/web/oss/src/state/newPlayground/chat/history.ts b/web/oss/src/state/newPlayground/chat/history.ts deleted file mode 100644 index d1cd5087e0..0000000000 --- a/web/oss/src/state/newPlayground/chat/history.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {getAllMetadata} from "@/oss/lib/hooks/useStatelessVariants/state" -import {extractValueByMetadata} from "@/oss/lib/shared/variant/valueHelpers" -import {chatSessionsByIdAtom, chatTurnsByIdAtom} from "@/oss/state/generation/entities" - -/** - * Build full chat history for a revision by folding session turns in order. - * Returns simplified message objects (role/content) extracted via metadata. - */ -export const historyByRevisionAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - const sessions = get(chatSessionsByIdAtom) as Record - const turns = get(chatTurnsByIdAtom) as Record - const allMeta = getAllMetadata() - const sid = `session-${revisionId}` - const ids: string[] = (sessions?.[sid]?.turnIds || []).filter(Boolean) - const messages: {role: string; content: any}[] = [] - for (const id of ids) { - const t = turns?.[id] - if (!t) continue - const user = t?.userMessage - if (user) { - try { - const u = extractValueByMetadata(user, allMeta) as any - if (u?.role && u?.content !== undefined) - messages.push({role: u.role, content: u.content}) - } catch { - const content = user?.content?.value ?? user?.content ?? "" - const role = user?.role?.value ?? user?.role ?? "user" - messages.push({role, content}) - } - } - const a = t?.assistantMessageByRevision?.[revisionId] - if (a) { - try { - const ar = extractValueByMetadata(a, allMeta) as any - if (ar?.role && ar?.content !== undefined) - messages.push({role: ar.role, content: ar.content}) - } catch { - const content = a?.content?.value ?? a?.content ?? "" - const role = a?.role?.value ?? a?.role ?? "assistant" - messages.push({role, content}) - } - } - - const toolResponses = t?.toolResponsesByRevision?.[revisionId] - if (Array.isArray(toolResponses)) { - for (const toolNode of toolResponses) { - try { - const toolVal = extractValueByMetadata(toolNode, allMeta) as any - messages.push(toolVal as any) - } catch { - const content = toolNode?.content?.value ?? toolNode?.content ?? "" - const role = toolNode?.role?.value ?? toolNode?.role ?? "tool" - messages.push({role, content}) - } - } - } - } - return messages - }), -) diff --git a/web/oss/src/state/newPlayground/chat/parsers.ts b/web/oss/src/state/newPlayground/chat/parsers.ts deleted file mode 100644 index f049fe349f..0000000000 --- a/web/oss/src/state/newPlayground/chat/parsers.ts +++ /dev/null @@ -1,138 +0,0 @@ -// Shared helpers for parsing/normalizing chat message shapes and tool-call arrays - -import JSON5 from "json5" - -export interface NormalizedMessage { - role: string - content: any -} - -// Try to parse a JSON array or object string into an array. Returns null if not an array. -export function tryParseArrayFromString(s: string): any[] | null { - try { - const t = s.trim() - if (!t.startsWith("[") && !t.startsWith("{")) return null - const parsed = JSON5.parse(s) - return Array.isArray(parsed) ? parsed : null - } catch { - return null - } -} - -// Normalize a single row's messages field (array or JSON string) into messages list -export function normalizeMessagesFromField(raw: any): NormalizedMessage[] { - const out: NormalizedMessage[] = [] - if (!raw) return out - const pushFrom = (m: any) => { - const role = String(m?.role || m?.role?.value || "user").toLowerCase() - const rc = m?.content - const content = Array.isArray(rc) - ? rc - : rc && typeof rc === "object" && "value" in rc - ? (rc as any).value - : rc - - const toolCalls = - m?.tool_calls ?? - m?.toolCalls ?? - m?.toolCalls?.value ?? - m?.tool_calls?.value ?? - undefined - - const functionCall = - m?.function_call ?? - m?.functionCall ?? - m?.function_call?.value ?? - m?.functionCall?.value ?? - undefined - - const toolCallId = - m?.tool_call_id ?? - m?.toolCallId ?? - m?.toolCallId?.value ?? - m?.tool_call_id?.value ?? - undefined - - const toolName = - m?.name ?? m?.tool_name ?? m?.name?.value ?? m?.tool_name?.value ?? undefined - - const payload: any = {role, content} - if (toolCalls !== undefined) payload.tool_calls = toolCalls - if (functionCall !== undefined) payload.function_call = functionCall - if (toolCallId !== undefined) - payload.tool_call_id = - typeof toolCallId === "object" && toolCallId !== null - ? (toolCallId.value ?? toolCallId) - : toolCallId - if (toolName !== undefined) - payload.name = - typeof toolName === "object" && toolName !== null - ? (toolName.value ?? toolName) - : toolName - - out.push(payload) - } - if (Array.isArray(raw)) { - for (const m of raw) pushFrom(m) - return out - } - if (typeof raw === "string") { - try { - const parsed = JSON5.parse(raw) - if (Array.isArray(parsed)) for (const m of parsed) pushFrom(m) - } catch {} - } - return out -} - -// Aggregate normalized messages across many rows (using a field accessor) -export function extractAllMessagesFromRows( - rows: Record[], - field = "messages", -): NormalizedMessage[] { - const result: NormalizedMessage[] = [] - for (const row of rows || []) { - const raw = (row as any)?.[field] - if (!raw) continue - result.push(...normalizeMessagesFromField(raw)) - } - return result -} - -// Derive a unified view model for rendering generation responses. -// Returns a potential toolData array (for ToolCallView), and a fallback text with JSON pretty-print flag. -export function deriveToolViewModelFromResult(result: any): { - toolData: any[] | null - isJSON: boolean - displayValue: string -} { - const rawData = (result as any)?.response?.data - const contentCandidate = - typeof rawData === "string" - ? rawData - : rawData && typeof rawData === "object" - ? ((rawData as any).content ?? (rawData as any).data ?? "") - : "" - - // Tool-call candidates - let arr: any[] | null = null - if (typeof contentCandidate === "string") arr = tryParseArrayFromString(contentCandidate) - if (!arr && Array.isArray(contentCandidate)) arr = contentCandidate - if (!arr && typeof rawData === "string") arr = tryParseArrayFromString(rawData) - if (!arr && Array.isArray(rawData)) arr = rawData - - // Fallback editor content - let isJSON = false - let displayValue = - typeof contentCandidate === "string" ? contentCandidate : String(contentCandidate ?? "") - if (typeof contentCandidate === "string") { - try { - const parsed = JSON5.parse(contentCandidate) - isJSON = true - displayValue = JSON.stringify(parsed, null, 2) - } catch { - isJSON = false - } - } - return {toolData: arr, isJSON, displayValue} -} diff --git a/web/oss/src/state/newPlayground/chat/view.ts b/web/oss/src/state/newPlayground/chat/view.ts deleted file mode 100644 index f4fb3098bf..0000000000 --- a/web/oss/src/state/newPlayground/chat/view.ts +++ /dev/null @@ -1,55 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {displayedVariantsAtom} from "@/oss/components/Playground/state/atoms" -import {logicalTurnIndexAtom, runStatusByRowRevisionAtom} from "@/oss/state/generation/entities" -import {pendingWebWorkerRequestsAtom} from "@/oss/state/newPlayground/mutations/webWorkerIntegration" - -/** - * Derived chat view atoms: single source of truth for mapping and run status. - */ - -// Resolve session turn id for a given logical turn and revision -export const sessionTurnIdForVariantAtomFamily = atomFamily( - (p: {logicalId: string; revisionId: string}) => - atom((get) => { - const displayed = (get(displayedVariantsAtom) || []) as string[] - // If revision is not currently displayed, do not resolve a session turn id - if ( - Array.isArray(displayed) && - displayed.length > 0 && - !displayed.includes(p.revisionId) - ) - return "" - const map = (get(logicalTurnIndexAtom)?.[p.logicalId] || {}) as Record - return (map[p.revisionId] || "") as string - }), -) - -// Is the cell (logicalId, revisionId) running (either status map or pending worker)? -export const isCellRunningAtomFamily = atomFamily((p: {logicalId: string; revisionId: string}) => - atom((get) => { - const sessionTurnId = get(sessionTurnIdForVariantAtomFamily(p)) || p.logicalId - const key = `${sessionTurnId}:${p.revisionId}` - const statusMap = get(runStatusByRowRevisionAtom) as any - const statusRunning = Boolean(statusMap?.[key]?.isRunning) - const pending = (get(pendingWebWorkerRequestsAtom) || {}) as Record< - string, - {rowId: string; variantId: string} - > - const pendingRunning = Object.values(pending).some( - (r) => r?.variantId === p.revisionId && String(r?.rowId || "") === sessionTurnId, - ) - return statusRunning || pendingRunning - }), -) - -// Is any cell for this logical row running across displayed revisions? -export const isAnyRunningForLogicalAtomFamily = atomFamily((logicalId: string) => - atom((get) => { - const displayed = (get(displayedVariantsAtom) || []) as string[] - return (displayed || []).some((rev) => - get(isCellRunningAtomFamily({logicalId, revisionId: rev})), - ) - }), -) diff --git a/web/oss/src/state/newPlayground/core/config.ts b/web/oss/src/state/newPlayground/core/config.ts deleted file mode 100644 index 1b8d58479c..0000000000 --- a/web/oss/src/state/newPlayground/core/config.ts +++ /dev/null @@ -1,37 +0,0 @@ -import {produce} from "immer" -import {atom} from "jotai" - -import {generateId} from "@/oss/lib/shared/variant/stringUtils" - -import type {PlaygroundConfig, PlaygroundVariantConfig} from "../types" - -/** - * Core Config Atoms - * - * These atoms manage the mutable playground configuration independently from revisions. - * No more sync overhead - configs are managed directly. - */ - -// Core config state - mutable and independent from revisions -export const playgroundConfigAtom = atom({ - variants: {}, - selectedVariantId: "", - displayedVariantIds: [], -}) - -// Displayed variants atom - for comparison mode -export const displayedVariantsAtom = atom( - (get) => { - const config = get(playgroundConfigAtom) - return config.displayedVariantIds.map((id) => config.variants[id]).filter(Boolean) - }, - (get, set, variantIds: string[]) => { - set( - playgroundConfigAtom, - produce((draft) => { - // Only include variants that exist - draft.displayedVariantIds = variantIds.filter((id) => draft.variants[id]) - }), - ) - }, -) diff --git a/web/oss/src/state/newPlayground/core/customProperties.ts b/web/oss/src/state/newPlayground/core/customProperties.ts deleted file mode 100644 index 8c08cde176..0000000000 --- a/web/oss/src/state/newPlayground/core/customProperties.ts +++ /dev/null @@ -1,162 +0,0 @@ -import {produce} from "immer" -import {atom} from "jotai" -import {RESET, atomFamily} from "jotai/utils" - -import type {Enhanced} from "@/oss/lib/shared/variant/genericTransformer/types" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import {deriveCustomPropertiesFromSpec} from "@/oss/lib/shared/variant/transformer/transformer" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import { - appSchemaAtom, - appUriInfoAtom, - getEnhancedRevisionById, -} from "@/oss/state/variant/atoms/fetcher" - -/** - * Writable custom properties selector - * - Read: derives custom properties from OpenAPI spec + saved parameters (pure) - * - Write: forwards updates via `onUpdateParameters` callback or keeps local Playground cache - */ -export interface CustomPropsAtomParams { - variant?: EnhancedVariant - routePath?: string - // revision this write should target; required for local cache updates - revisionId?: string - // Called on writes; receives a delta or next parameters snapshot as provided by caller - onUpdateParameters?: (update: any) => void -} - -// Internal local cache keyed by revisionId (Playground-only live edits) -const localCustomPropsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom> | undefined>(undefined), -) - -const regenerateEnhancedIds = (value: any): any => { - if (Array.isArray(value)) { - return value.map((item) => regenerateEnhancedIds(item)) - } - - if (value && typeof value === "object") { - const clone: Record = {} - Object.keys(value).forEach((key) => { - clone[key] = regenerateEnhancedIds(value[key]) - }) - - if ("__test" in clone) { - clone.__test = generateId() - } - - return clone - } - - return value -} - -// Derived custom properties from spec + saved variant parameters for a revision -export const derivedCustomPropsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom>>((get) => { - const variant = getEnhancedRevisionById(get as any, revisionId) - const spec = get(appSchemaAtom) - if (!variant || !spec) return {} - const routePath = get(appUriInfoAtom)?.routePath - return deriveCustomPropertiesFromSpec(variant as any, spec as any, routePath) - }), -) - -export const customPropertiesAtomFamily = atomFamily((params: CustomPropsAtomParams) => - atom>, any>( - (get) => { - // If a revision is provided and local props exist, prefer them for live edits - if (params.revisionId) { - const local = get(localCustomPropsByRevisionAtomFamily(params.revisionId)) - if (local !== undefined) return local - return get(derivedCustomPropsByRevisionAtomFamily(params.revisionId)) - } - - // Otherwise derive from spec + saved config (pure) - const spec = get(appSchemaAtom) - const routePath = params.routePath ?? get(appUriInfoAtom)?.routePath - if (!spec || !params.variant) return {} - return deriveCustomPropertiesFromSpec(params.variant, spec, routePath) - }, - (get, set, update) => { - const {revisionId} = params - - // Prefer local revision cache update to keep Playground behavior - if (revisionId) { - if (update === RESET) { - set(localCustomPropsByRevisionAtomFamily(revisionId), undefined) - return - } - - const base = - get(localCustomPropsByRevisionAtomFamily(revisionId)) ?? - get(derivedCustomPropsByRevisionAtomFamily(revisionId)) - - let next: any - if (typeof update === "function") { - const fn: any = update - if (fn.length >= 1) { - const source = base === undefined ? {} : base - next = produce(source, (draft: any) => { - const res = fn(draft) - if (res !== undefined) { - return res - } - }) - } else { - const res = fn(base) - next = res === undefined ? base : res - } - } else { - next = update - } - - set(localCustomPropsByRevisionAtomFamily(revisionId), next) - return - } - - // Fallback: forward to external handler if provided - if (typeof params.onUpdateParameters === "function") { - params.onUpdateParameters(update) - } - }, - ), -) - -/** - * Stable wrapper: derive custom properties by revisionId only (avoids unstable object params) - */ -export const customPropertiesByRevisionAtomFamily = atomFamily((revisionId: string) => - atom>>((get) => { - const routePath = get(appUriInfoAtom)?.routePath - return get( - customPropertiesAtomFamily({ - revisionId, - routePath, - }), - ) - }), -) - -export const customPropertyIdsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - const local = get(localCustomPropsByRevisionAtomFamily(revisionId)) - const source = local ?? get(derivedCustomPropsByRevisionAtomFamily(revisionId)) - if (!source) { - return [] - } - return Object.keys(source) - }), -) - -/** - * Clears the local custom properties cache for a given revisionId. - * Use this when discarding draft changes so custom workflow properties revert to saved state. - */ -export const clearLocalCustomPropsForRevisionAtomFamily = atomFamily((revisionId: string) => - atom(null, (get, set) => { - const derived = get(derivedCustomPropsByRevisionAtomFamily(revisionId)) - set(localCustomPropsByRevisionAtomFamily(revisionId), regenerateEnhancedIds(derived)) - }), -) diff --git a/web/oss/src/state/newPlayground/core/inputParams.ts b/web/oss/src/state/newPlayground/core/inputParams.ts deleted file mode 100644 index a87681c164..0000000000 --- a/web/oss/src/state/newPlayground/core/inputParams.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import type {StringMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" - -import {requestSchemaMetaAtomFamily} from "./requestSchemaMeta" - -export interface InputParamsAtomParams { - variant: EnhancedVariant - routePath?: string -} - -export interface InputParam extends StringMetadata { - name: string -} - -export const inputParamsAtomFamily = atomFamily((params: InputParamsAtomParams) => - atom((get) => { - const {variant, routePath} = params - const meta = get(requestSchemaMetaAtomFamily({variant, routePath})) - // Map each input key to a default string metadata. If we later infer richer types - // from the OpenAPI schema, we can enhance this mapping. - return meta.inputKeys.map((key) => ({ - name: key, - type: "string", - title: key, - nullable: false, - allowFreeform: true, - })) - }), -) diff --git a/web/oss/src/state/newPlayground/core/metadata.ts b/web/oss/src/state/newPlayground/core/metadata.ts deleted file mode 100644 index 20937ecfa5..0000000000 --- a/web/oss/src/state/newPlayground/core/metadata.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import { - getAllMetadata, - getMetadataLazy, - metadataSelectorFamily, -} from "@/oss/lib/hooks/useStatelessVariants/state" -import type {ConfigMetadata} from "@/oss/lib/shared/variant/genericTransformer/types" -import {getSpecLazy} from "@/oss/state/variant/atoms/fetcher" - -/** - * Metadata Management Atoms - * - * Centralized metadata handling for the new playground state. - * Reuses existing metadata utilities while providing clean atom-based access. - */ - -// Metadata atoms - canonical selectors for playground code -export const allMetadataAtom = atom>(() => { - try { - return getAllMetadata() - } catch (error) { - console.error("❌ Error getting all metadata:", error) - return {} - } -}) - -// Per-hash reactive selector (leverages metadataSelectorFamily from the stateless store) -export const metadataByHashAtomFamily = atomFamily((hash?: string) => - atom((get) => { - if (!hash) return null - // Directly read the per-key selector to minimize re-renders - return get(metadataSelectorFamily(hash)) ?? null - }), -) - -// Metadata validation utilities -export const validateMetadata = (metadata: Record): boolean => { - try { - return Object.keys(metadata).length > 0 - } catch { - return false - } -} - -export const getMetadataForVariant = ( - variantId: string, - allMetadata: Record, -): Record => { - // Filter metadata relevant to this variant - // This could be enhanced based on specific variant metadata requirements - return allMetadata -} diff --git a/web/oss/src/state/newPlayground/core/prompts.ts b/web/oss/src/state/newPlayground/core/prompts.ts deleted file mode 100644 index 1a3a75a716..0000000000 --- a/web/oss/src/state/newPlayground/core/prompts.ts +++ /dev/null @@ -1,365 +0,0 @@ -import {produce} from "immer" -import {atom} from "jotai" -import {RESET, atomFamily} from "jotai/utils" - -import {metadataAtom} from "@/oss/lib/hooks/useStatelessVariants/state" -import type {EnhancedObjectConfig} from "@/oss/lib/shared/variant/genericTransformer/types" -import {extractVariables} from "@/oss/lib/shared/variant/inputHelpers" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import {derivePromptsFromSpec} from "@/oss/lib/shared/variant/transformer/transformer" -import {transformToRequestBody} from "@/oss/lib/shared/variant/transformer/transformToRequestBody" -import type {AgentaConfigPrompt, EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {currentAppContextAtom} from "@/oss/state/app/selectors/app" -import { - appSchemaAtom, - appUriInfoAtom, - getEnhancedRevisionById, -} from "@/oss/state/variant/atoms/fetcher" - -import { - customPropertiesByRevisionAtomFamily, - derivedCustomPropsByRevisionAtomFamily, -} from "./customProperties" -import {variantFlagsAtomFamily} from "./variantFlags" - -/** - * Writable prompts selector - * - Read: derives prompts from OpenAPI spec + saved parameters (pure; no mutation) - * - Write: forwards updates via `onUpdateParameters` callback to persist playground mutations - */ -export interface PromptsAtomParams { - // Prefer passing only revisionId; variant will be resolved internally if not provided - variant?: EnhancedVariant - // revision this prompts write should target; required for local cache updates and variant resolution - revisionId?: string - // Called on writes; receives a delta or next parameters snapshot as provided by caller - onUpdateParameters?: (update: any) => void -} - -// Derived prompts reactively recompute from variant + schema for a revision -const derivedPromptsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom[]>((get) => { - const variant = getEnhancedRevisionById(get as any, revisionId) - const spec = get(appSchemaAtom) - if (!variant || !spec) return [] - const routePath = get(appUriInfoAtom)?.routePath - return derivePromptsFromSpec(variant as any, spec as any, routePath) - }), -) - -const localTransformedPromptsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom(undefined), -) - -const derivedTransformedPromptsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - const prompts = get(derivedPromptsByRevisionAtomFamily(revisionId)) - const customProps = get(derivedCustomPropsByRevisionAtomFamily(revisionId)) - const variables = get(stablePromptVariablesAtomFamily(revisionId)) - const appType = get(currentAppContextAtom)?.appType || undefined - const isChat = get(variantFlagsAtomFamily({revisionId}))?.isChat - const metadata = get(metadataAtom) - return transformToRequestBody({ - prompts, - customProperties: customProps, - allMetadata: metadata, - isChat, - revisionId, - appType, - variables, - }) - }), -) - -export const clearLocalTransformedPromptsForRevisionAtomFamily = atomFamily((revisionId: string) => - atom(null, (_get, set) => { - set(localTransformedPromptsByRevisionAtomFamily(revisionId), undefined) - }), -) - -const buildLiveTransformedPrompts = (get: any, revisionId: string) => { - const promptsForTransform = get(promptsAtomFamily(revisionId)) as any[] - const variables = get(promptVariablesAtomFamily(revisionId)) - const customProps = get(customPropertiesByRevisionAtomFamily(revisionId)) - const appType = get(currentAppContextAtom)?.appType || undefined - const isChat = get(variantFlagsAtomFamily({revisionId}))?.isChat - const metadata = get(metadataAtom) - - const transformed = transformToRequestBody({ - prompts: promptsForTransform, - customProperties: customProps, - allMetadata: metadata, - isChat, - revisionId, - appType, - variables, - }) - - return transformed -} - -const regenerateEnhancedPromptIds = (value: any): any => { - if (Array.isArray(value)) { - return value.map((item) => regenerateEnhancedPromptIds(item)) - } - - if (value && typeof value === "object") { - const clone: Record = {} - Object.keys(value).forEach((key) => { - clone[key] = regenerateEnhancedPromptIds(value[key]) - }) - - if ("__id" in clone) { - clone.__id = generateId() - } - - if ("__test" in clone) { - clone.__test = generateId() - } - - return clone - } - - return value -} - -const collectVariablesFromPrompts = (prompts: any[]): string[] => { - const vars = new Set() - - ;(prompts || []).forEach((prompt) => { - const messages = (prompt as any)?.messages?.value || [] - messages.forEach((message: any) => { - const content = message?.content?.value - if (typeof content === "string") { - extractVariables(content).forEach((v) => vars.add(v)) - } else if (Array.isArray(content)) { - content.forEach((part: any) => { - const text = part?.text?.value ?? part?.text ?? "" - if (typeof text === "string") { - extractVariables(text).forEach((v) => vars.add(v)) - } - }) - } - }) - }) - - return Array.from(vars) -} - -const localPromptVariablesByRevisionAtomFamily = atomFamily((revisionId: string) => - atom(undefined), -) - -const derivedStablePromptVariablesAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - try { - const variant = getEnhancedRevisionById(get as any, revisionId) - const spec = get(appSchemaAtom) - const routePath = get(appUriInfoAtom)?.routePath - if (!variant || !spec) return [] as string[] - const prompts = derivePromptsFromSpec(variant as any, spec as any, routePath) - const vars = collectVariablesFromPrompts(prompts as any[]) - if (process.env.NODE_ENV !== "production") { - // eslint-disable-next-line no-console - console.debug("derivedStablePromptVariables", {revisionId, routePath, vars}) - } - return vars - } catch (error) { - if (process.env.NODE_ENV !== "production") { - // eslint-disable-next-line no-console - console.warn("derivedStablePromptVariables error", {revisionId, error}) - } - return [] as string[] - } - }), -) - -const buildLivePromptVariables = (get: any, revisionId: string): string[] => { - const flags = get(variantFlagsAtomFamily({revisionId})) - if (flags?.isCustom) return [] as string[] - const prompts = get(promptsAtomFamily(revisionId)) - return collectVariablesFromPrompts(Array.isArray(prompts) ? prompts : []) -} - -// Local prompts cache keyed by revisionId (Playground-only live edits) -const localPromptsByRevisionAtomFamily = atomFamily((revisionId: string) => - atom[] | null>(null), -) - -/** - * Stable prompts selector keyed ONLY by revisionId (prevents unstable atomFamily keys) - * - Read: derives prompts from OpenAPI spec + saved parameters (reactive) - * - Write: updates local revision cache for live edits - */ -export const promptsAtomFamily = atomFamily((revisionId: string) => - atom[], any, void>( - (get) => { - // Prefer local prompts cache when available - if (!revisionId) return [] - const local = get(localPromptsByRevisionAtomFamily(revisionId)) - if (Array.isArray(local)) return local - return get(derivedPromptsByRevisionAtomFamily(revisionId)) - }, - (get, set, update) => { - if (update === RESET) { - set(localPromptsByRevisionAtomFamily(revisionId), null) - return - } - const base = - get(localPromptsByRevisionAtomFamily(revisionId)) ?? - get(derivedPromptsByRevisionAtomFamily(revisionId)) - - let next: any - if (typeof update === "function") { - const fn: any = update - if (fn.length >= 1) { - next = produce(base, fn) - } else { - const res = fn(base) - next = res === undefined ? base : res - } - } else { - next = update - } - - set(localPromptsByRevisionAtomFamily(revisionId), next) - // No explicit sync; variable selectors derive live state from prompts and rows - }, - ), -) - -/** - * Clears the local prompts cache for a given revisionId. - * Use this after a successful commit to ensure the previous revision's local edits are discarded. - */ -export const clearLocalPromptsForRevisionAtomFamily = atomFamily((revisionId: string) => - atom(null, (get, set) => { - const derived = get(derivedPromptsByRevisionAtomFamily(revisionId)) - const regenerated = regenerateEnhancedPromptIds(derived) - set( - localPromptsByRevisionAtomFamily(revisionId), - Array.isArray(regenerated) ? (regenerated as any) : null, - ) - }), -) - -/** - * Transformed prompts to API request body - * Backwards compatible signature: accepts either revisionId (string) - * or an object with a flag to use stable revision parameters instead of local mutated prompts. - */ -export const transformedPromptsAtomFamily = atomFamily( - (p: string | {revisionId: string; useStableParams?: boolean}) => - atom( - (get, set, update) => { - const revisionId = typeof p === "string" ? p : p.revisionId - const useStable = typeof p === "object" && !!p.useStableParams - - if (useStable) { - return get(derivedTransformedPromptsByRevisionAtomFamily(revisionId)) - } - - const local = get(localTransformedPromptsByRevisionAtomFamily(revisionId)) - if (local !== undefined) return local - - return buildLiveTransformedPrompts(get, revisionId) - }, - (get, set, update) => { - const revisionId = typeof p === "string" ? p : p.revisionId - const useStable = typeof p === "object" && !!p.useStableParams - - if (useStable) return - - if (update === RESET) { - set(localTransformedPromptsByRevisionAtomFamily(revisionId), undefined) - return - } - - const base = - get(localTransformedPromptsByRevisionAtomFamily(revisionId)) ?? - buildLiveTransformedPrompts(get, revisionId) - - let next: any - if (typeof update === "function") { - const fn: any = update - if (fn.length >= 1) { - next = produce(base, fn) - } else { - const res = fn(base) - next = res === undefined ? base : res - } - } else { - next = update - } - - set(localTransformedPromptsByRevisionAtomFamily(revisionId), next) - }, - ), -) - -/** - * Derived: variables used in prompts' messages for a given revision - * - Read-only (no setter) - * - Extracts tokens like {{variable}} from message content (string or array parts) - */ -export const promptVariablesAtomFamily = atomFamily((revisionId: string) => - atom( - (get, set, update) => { - const local = get(localPromptVariablesByRevisionAtomFamily(revisionId)) - if (local !== undefined) return local - return buildLivePromptVariables(get, revisionId) - }, - (get, set, update) => { - if (update === RESET) { - set(localPromptVariablesByRevisionAtomFamily(revisionId), undefined) - return - } - - const base = - get(localPromptVariablesByRevisionAtomFamily(revisionId)) ?? - buildLivePromptVariables(get, revisionId) - - let next: string[] - if (typeof update === "function") { - const fn: any = update - const res = fn(base) - next = res === undefined ? base : res - } else { - next = update - } - - set(localPromptVariablesByRevisionAtomFamily(revisionId), next) - }, - ), -) - -/** - * Stable prompt variables (from saved revision parameters only) - * - Ignores local edits; derives prompts from saved parameters + schema - * - Used for custom workflows to keep only initial variables - */ -export const stablePromptVariablesAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - return get(derivedStablePromptVariablesAtomFamily(revisionId)) - }), -) - -/** - * Variables for a specific prompt within a revision. - * Reuses the same extraction logic but scopes to a single prompt (__name or __id match). - */ -export const promptVariablesByPromptAtomFamily = atomFamily( - (p: {revisionId: string; promptId: string}) => - atom((get) => { - // Do not derive variables from prompt messages for custom workflows - const flags = get(variantFlagsAtomFamily({revisionId: p.revisionId})) - if (flags?.isCustom) return [] as string[] - const prompts = get(promptsAtomFamily(p.revisionId)) - const list = Array.isArray(prompts) ? prompts : [] - const target = - list.find((pr: any) => pr?.__name === p.promptId) || - list.find((pr: any) => pr?.__id === p.promptId) - if (!target) return [] as string[] - return collectVariablesFromPrompts([target]) - }), -) diff --git a/web/oss/src/state/newPlayground/core/requestSchemaMeta.ts b/web/oss/src/state/newPlayground/core/requestSchemaMeta.ts deleted file mode 100644 index f0d528c7f7..0000000000 --- a/web/oss/src/state/newPlayground/core/requestSchemaMeta.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {getRequestSchema} from "@/oss/lib/shared/variant/openapiUtils" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {getSpecLazy} from "@/oss/state/variant/atoms/fetcher" - -export interface RequestSchemaMetaParams { - variant: EnhancedVariant - routePath?: string -} - -export interface RequestSchemaMeta { - required: string[] - inputKeys: string[] - hasMessages: boolean -} - -export const requestSchemaMetaAtomFamily = atomFamily((params: RequestSchemaMetaParams) => - atom(() => { - const {variant, routePath} = params - const spec = getSpecLazy() - - const meta: RequestSchemaMeta = {required: [], inputKeys: [], hasMessages: false} - if (!spec) return meta - - const requestSchema: any = getRequestSchema(spec as any, {variant, routePath}) - if (!requestSchema || typeof requestSchema !== "object") return meta - - const properties = requestSchema.properties || {} - const required = Array.isArray(requestSchema.required) ? requestSchema.required : [] - - // inputKeys are all expected properties except reserved ones like ag_config and messages - const inputKeys = Object.keys(properties).filter( - (k) => !["ag_config", "messages"].includes(k), - ) - - const hasMessages = Boolean(properties?.messages) - - return {required, inputKeys, hasMessages} - }), -) diff --git a/web/oss/src/state/newPlayground/core/variantFlags.ts b/web/oss/src/state/newPlayground/core/variantFlags.ts deleted file mode 100644 index 1f11ac4ae6..0000000000 --- a/web/oss/src/state/newPlayground/core/variantFlags.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {currentAppContextAtom} from "@/oss/state/app/selectors/app" -import {requestSchemaMetaAtomFamily} from "@/oss/state/newPlayground/core/requestSchemaMeta" - -import {getEnhancedRevisionById} from "../../variant/atoms/fetcher" - -export interface VariantFlagsParams { - revisionId: string - routePath?: string -} - -export const variantFlagsAtomFamily = atomFamily((params: VariantFlagsParams) => - atom((get) => { - const {routePath, revisionId} = params - const variant = getEnhancedRevisionById(get as any, revisionId) as any - const meta = get(requestSchemaMetaAtomFamily({variant, routePath})) - const appType = get(currentAppContextAtom)?.appType || undefined - const isChat = appType ? appType === "chat" : Boolean(meta?.hasMessages) - - const isCustom = (get(currentAppContextAtom)?.appType || undefined) === "custom" - - return {isChat, isCustom} - }), -) diff --git a/web/oss/src/state/newPlayground/generation/runtime.ts b/web/oss/src/state/newPlayground/generation/runtime.ts deleted file mode 100644 index 0b558256de..0000000000 --- a/web/oss/src/state/newPlayground/generation/runtime.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -// Generic test result shape used by Playground UIs -export interface PlaygroundTestResult { - response?: any - error?: string - metadata?: any -} - -// Per (rowId, revisionId) response store for both completion and chat -// Key format: `${rowId}:${revisionId}` to ensure stable identity across callers -type RowRevisionKey = string | {rowId: string; revisionId: string} - -// Internal, string-keyed family to ensure stable caching -const responseByRowRevisionAtomByKey = atomFamily((key: string) => - atom(null), -) - -// Public family: accepts either string key or {rowId, revisionId} -export const responseByRowRevisionAtomFamily = ((param: RowRevisionKey) => { - const key = typeof param === "string" ? param : `${param.rowId}:${param.revisionId}` - return responseByRowRevisionAtomByKey(key) -}) as (param: RowRevisionKey) => ReturnType - -// Per (rowId, revisionId) loading state (true while a run is in-flight) -// Internal, string-keyed family to ensure stable caching -const loadingByRowRevisionAtomByKey = atomFamily((key: string) => atom(false)) - -// Public family: accepts either string key or {rowId, revisionId} -export const loadingByRowRevisionAtomFamily = ((param: RowRevisionKey) => { - const key = typeof param === "string" ? param : `${param.rowId}:${param.revisionId}` - return loadingByRowRevisionAtomByKey(key) -}) as (param: RowRevisionKey) => ReturnType diff --git a/web/oss/src/state/newPlayground/generation/selectors.ts b/web/oss/src/state/newPlayground/generation/selectors.ts deleted file mode 100644 index 2be043eac0..0000000000 --- a/web/oss/src/state/newPlayground/generation/selectors.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {inputRowsByIdFamilyAtom} from "../../generation/entities" - -// Unified variable ids for a row + revision considering app mode and view -export const variableIdsUnifiedAtomFamily = atomFamily((p: {rowId: string; revisionId: string}) => - atom((get) => { - const inputRow = get(inputRowsByIdFamilyAtom(p.rowId)) - return (inputRow.variables || []).map((v: any) => v.__id) - }), -) diff --git a/web/oss/src/state/newPlayground/helpers/messageFactory.ts b/web/oss/src/state/newPlayground/helpers/messageFactory.ts deleted file mode 100644 index b0429b762c..0000000000 --- a/web/oss/src/state/newPlayground/helpers/messageFactory.ts +++ /dev/null @@ -1,152 +0,0 @@ -import {hashResponse} from "@/oss/components/Playground/assets/hash" -import {createMessageFromSchema} from "@/oss/components/Playground/hooks/usePlayground/assets/messageHelpers" -import {getAllMetadata, getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" - -export function buildAssistantMessage(messageSchema: any | undefined, testResult: any) { - // If we have a schema (from user message or generic), build via schema helper - if (messageSchema) { - if (testResult?.error) { - const tree = testResult?.metadata?.rawError?.detail?.tree - const trace = tree?.nodes?.[0] - const messageStr = trace?.status?.message ?? String(testResult.error) - return createMessageFromSchema(messageSchema, {role: "Error", content: messageStr}) - } - - const raw = (testResult as any)?.response?.data - const inner = raw && typeof raw === "object" ? ((raw as any).data ?? raw) : raw - const content = - inner && typeof inner === "object" - ? ((inner as any).content ?? (inner as any).data) - : undefined - - let finalText: string | undefined - if (typeof content === "string") finalText = content - else if (Array.isArray(content)) { - const texts = content - .map((p: any) => - (p?.type?.value ?? p?.type) === "text" - ? (p?.text?.value ?? p?.text ?? "") - : undefined, - ) - .filter(Boolean) - finalText = texts.join("\n\n") - } - if (finalText) { - const createdMsg = createMessageFromSchema(messageSchema, { - role: "assistant", - content: finalText, - }) - return createdMsg - } - - return createMessageFromSchema(messageSchema, inner) - } - - return { - __id: generateId(), - role: {value: testResult?.error ? "Error" : "assistant", __id: generateId()}, - content: {value: contentValue, __id: generateId()}, - } -} - -export function buildToolMessages(messageSchema: any | undefined, testResult: any) { - if (!messageSchema) return [] as any[] - - try { - const raw = (testResult as any)?.response?.data - if (!raw) return [] - const inner = - raw && typeof raw === "object" - ? (raw as any).data !== undefined - ? (raw as any).data - : raw - : raw - - const toolCalls = (inner as any)?.tool_calls ?? (inner as any)?.toolCalls - if (!Array.isArray(toolCalls) || toolCalls.length === 0) return [] - - return toolCalls - .map((toolCall: any, index: number) => { - const name = - toolCall?.function?.name || toolCall?.name || `tool_${index + 1}` || undefined - const toolCallId = - toolCall?.id || toolCall?.__id || toolCall?.tool_call_id || undefined - - let contentValue: string | undefined - const rawArgs = toolCall?.function?.arguments ?? toolCall?.arguments - const rawResponse = toolCall?.response ?? toolCall?.output ?? toolCall?.content - - const pickValue = rawResponse !== undefined ? rawResponse : rawArgs - - if (typeof pickValue === "string") { - contentValue = pickValue - } else if (pickValue !== undefined) { - try { - contentValue = JSON.stringify(pickValue, null, 2) - } catch { - contentValue = String(pickValue) - } - } - - return createMessageFromSchema(messageSchema, { - role: "tool", - name, - toolCallId, - content: "", - }) - }) - .filter(Boolean) - } catch { - return [] - } -} - -// Build a user message node using a schema if available; otherwise fallback to minimal shape -export function buildUserMessage( - messageSchema: any | undefined, - init?: {role?: string; content?: any}, -) { - const role = init?.role ?? "user" - const content = init?.content ?? "" - - // Fallback: discover a generic Message schema like synthesizeTurn - if (!messageSchema) { - try { - const all = getAllMetadata() - const entries = Object.entries(all as Record) - const found = entries.find(([, v]) => v?.title === "Message" && v?.type === "object") - const messageMetaId = found?.[0] - if (messageMetaId) messageSchema = getMetadataLazy(messageMetaId) - } catch {} - } - - if (messageSchema) { - const createdMessage = createMessageFromSchema(messageSchema, {role, content}) - return createdMessage - } - - // Minimal fallback - return { - __id: generateId(), - role: {__id: generateId(), value: role}, - content: {__id: generateId(), value: content}, - } -} - -export function buildCompletionResponseText(testResult: any): string { - let normalized = testResult - try { - if (testResult?.error) { - const tree = testResult?.metadata?.rawError?.detail?.tree - const trace = tree?.nodes?.[0] - const messageStr = trace?.status?.message ?? String(testResult.error) - normalized = { - response: {data: messageStr, tree}, - error: messageStr, - metadata: testResult?.metadata, - } - } - } catch {} - return hashResponse(normalized) -} diff --git a/web/oss/src/state/newPlayground/index.ts b/web/oss/src/state/newPlayground/index.ts deleted file mode 100644 index e40f0a9929..0000000000 --- a/web/oss/src/state/newPlayground/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * New Playground State Architecture - * - * This module provides a clean, optimized state management system for the playground - * that eliminates sync overhead and separates concerns properly. - * - * Key Benefits: - * 1. No sync logic - configs are independent from revisions - * 2. Derived state - request bodies always calculated from current config - * 3. Clean separation - config vs generation data - * 4. Optimized mutations - direct updates without transformations - * 5. Better performance - targeted updates and efficient equality checks - */ - -// Core atoms -export {playgroundConfigAtom, displayedVariantsAtom} from "./core/config" - -export {pendingWebWorkerRequestsAtom} from "./mutations/execution" - -// Types -export type { - PlaygroundVariantConfig, - PlaygroundConfig, - TestInput, - ChatMessage, - ChatHistoryItem, - TestRun, - GenerationData, - PlaygroundState, - UpdateConfigParams, - AddTestcaseParams, - RunTestParams, - DeleteMessageParams, - DerivedRequestBody, - DirtyState, -} from "./types" diff --git a/web/oss/src/state/newPlayground/mutations/config.ts b/web/oss/src/state/newPlayground/mutations/config.ts deleted file mode 100644 index 9ed1b2a9bf..0000000000 --- a/web/oss/src/state/newPlayground/mutations/config.ts +++ /dev/null @@ -1,296 +0,0 @@ -import {produce} from "immer" -import {atom} from "jotai" - -import {playgroundConfigAtom, updateVariantConfigAtom} from "../core/config" -import type {UpdateConfigParams} from "../types" - -/** - * Config Mutation Atoms - * - * These atoms handle direct configuration updates without sync overhead. - * Clean, optimized mutations for variant prompts and parameters. - */ - -// Update variant prompt property -export const updateVariantPromptAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - propertyId: string - value: any - }, - ) => { - const {variantId, propertyId, value} = params - - // Update property by ID - delegates to generic property update - set(updateVariantPropertyAtom, { - variantId, - propertyId, - value, - }) - }, -) - -// Update variant parameter -export const updateVariantParameterAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - propertyId: string - value: any - }, - ) => { - const {variantId, propertyId, value} = params - - // Update property by ID - delegates to generic property update - set(updateVariantPropertyAtom, { - variantId, - propertyId, - value, - }) - }, -) - -// Update variant name -export const updateVariantNameAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - name: string - }, - ) => { - const {variantId, name} = params - - set(updateVariantConfigAtom, { - variantId, - path: ["name"], - value: name, - }) - }, -) - -// Bulk update variant config -export const bulkUpdateVariantAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - updates: { - path: string[] - value: any - }[] - }, - ) => { - const {variantId, updates} = params - - set( - playgroundConfigAtom, - produce((draft) => { - const variant = draft.variants[variantId] - if (!variant) return - - // Apply all updates - updates.forEach(({path, value}) => { - let target: any = variant - for (let i = 0; i < path.length - 1; i++) { - if (!target[path[i]]) target[path[i]] = {} - target = target[path[i]] - } - target[path[path.length - 1]] = value - }) - - variant.metadata.updatedAt = Date.now() - }), - ) - }, -) - -// Reset variant to original revision state -export const resetVariantAtom = atom(null, (get, set, variantId: string) => { - // TODO: Implement reset to original revision - // This would require access to the original revisions atom - console.warn("resetVariantAtom not yet implemented - requires original revisions data") -}) - -// Duplicate variant configuration -export const duplicateVariantConfigAtom = atom( - null, - ( - get, - set, - params: { - sourceVariantId: string - targetVariantId: string - }, - ) => { - const {sourceVariantId, targetVariantId} = params - const config = get(playgroundConfigAtom) - const sourceVariant = config.variants[sourceVariantId] - - if (!sourceVariant) return - - set( - playgroundConfigAtom, - produce((draft) => { - const targetVariant = draft.variants[targetVariantId] - if (!targetVariant) return - - // Copy prompts and parameters - targetVariant.prompts = structuredClone(sourceVariant.prompts) - targetVariant.parameters = structuredClone(sourceVariant.parameters) - targetVariant.isChatVariant = sourceVariant.isChatVariant - targetVariant.metadata.updatedAt = Date.now() - }), - ) - }, -) - -// Generic property update (for complex nested updates) -export const updateVariantPropertyAtom = atom(null, (get, set, params: UpdateConfigParams) => { - set(updateVariantConfigAtom, params) -}) - -// Purpose-specific mutation atoms for complex operations - -// Add new message to prompt messages array -export const addPromptMessageAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - promptId: string - messageTemplate?: any // Optional template for new message - }, - ) => { - const {variantId, promptId, messageTemplate} = params - const config = get(playgroundConfigAtom) - const variant = config.variants[variantId] - - if (!variant) { - console.warn("Cannot add message: variant not found") - return - } - - const prompt = variant.prompts.find((p) => p.__id === promptId) - if (!prompt?.messages?.__id) { - console.warn("Cannot add message: messages property ID not found") - return - } - - set( - playgroundConfigAtom, - produce((draft) => { - const draftVariant = draft.variants[variantId] - const draftPrompt = draftVariant.prompts.find((p) => p.__id === promptId) - - if (!draftPrompt) return - - const currentMessages = draftPrompt.messages.value || [] - - // Use provided template or create default message structure - const newMessage = messageTemplate || { - __id: crypto.randomUUID(), - __metadata: "default_message_metadata", - role: {value: "user", __id: crypto.randomUUID(), __metadata: "role_metadata"}, - content: {value: "", __id: crypto.randomUUID(), __metadata: "content_metadata"}, - name: {value: null, __id: crypto.randomUUID(), __metadata: "name_metadata"}, - toolCalls: { - value: null, - __id: crypto.randomUUID(), - __metadata: "tool_calls_metadata", - }, - toolCallId: { - value: null, - __id: crypto.randomUUID(), - __metadata: "tool_call_id_metadata", - }, - } - - draftPrompt.messages.value = [...currentMessages, newMessage] - draftVariant.metadata.updatedAt = Date.now() - }), - ) - }, -) - -// Delete message from prompt messages array -export const deletePromptMessageAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - promptId: string - messageId: string - }, - ) => { - const {variantId, promptId, messageId} = params - - set( - playgroundConfigAtom, - produce((draft) => { - const variant = draft.variants[variantId] - if (!variant) return - - const prompt = variant.prompts.find((p) => p.__id === promptId) - if (!prompt?.messages?.value) return - - // Filter out the message with the specified ID - prompt.messages.value = prompt.messages.value.filter( - (message) => message.__id !== messageId, - ) - - variant.metadata.updatedAt = Date.now() - }), - ) - }, -) - -// Reorder messages in prompt messages array -export const reorderPromptMessagesAtom = atom( - null, - ( - get, - set, - params: { - variantId: string - promptId: string - fromIndex: number - toIndex: number - }, - ) => { - const {variantId, promptId, fromIndex, toIndex} = params - - set( - playgroundConfigAtom, - produce((draft) => { - const variant = draft.variants[variantId] - if (!variant) return - - const prompt = variant.prompts.find((p) => p.__id === promptId) - if (!prompt?.messages?.value) return - - const messages = [...prompt.messages.value] - const [movedMessage] = messages.splice(fromIndex, 1) - messages.splice(toIndex, 0, movedMessage) - - prompt.messages.value = messages - variant.metadata.updatedAt = Date.now() - }), - ) - }, -) diff --git a/web/oss/src/state/newPlayground/mutations/execution.ts b/web/oss/src/state/newPlayground/mutations/execution.ts deleted file mode 100644 index 5c99173b6e..0000000000 --- a/web/oss/src/state/newPlayground/mutations/execution.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {atom} from "jotai" - -// Use local bridge to decouple from legacy folder -import {cancelTestsMutationAtom} from "@/oss/components/Playground/state/atoms" - -/** - * Test Execution Atoms - * - * These atoms handle test execution via web worker integration. - * Clean separation from config management with optimized execution flow. - */ - -// Store pending web worker requests for tracking -export const pendingWebWorkerRequestsAtom = atom< - Record< - string, - { - rowId: string - variantId: string - runId: string - timestamp: number - } - > ->({}) - -// Cancel specific test -export const cancelTestAtom = atom(null, (get, set, params: {rowId: string; variantId: string}) => { - set(cancelTestsMutationAtom, params) -}) diff --git a/web/oss/src/state/newPlayground/mutations/webWorkerIntegration.ts b/web/oss/src/state/newPlayground/mutations/webWorkerIntegration.ts deleted file mode 100644 index 38e275cf23..0000000000 --- a/web/oss/src/state/newPlayground/mutations/webWorkerIntegration.ts +++ /dev/null @@ -1,725 +0,0 @@ -import {produce} from "immer" -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" -import {queryClientAtom} from "jotai-tanstack-query" - -import {hashResponse} from "@/oss/components/Playground/assets/hash" -import {generationRowIdsAtom} from "@/oss/components/Playground/state/atoms" -import {generationInputRowIdsAtom} from "@/oss/components/Playground/state/atoms/generationProperties" -import {variantByRevisionIdAtomFamily} from "@/oss/components/Playground/state/atoms/propertySelectors" -import { - revisionListAtom, - displayedVariantsAtom, -} from "@/oss/components/Playground/state/atoms/variants" -import {getAllMetadata, getMetadataLazy} from "@/oss/lib/hooks/useStatelessVariants/state" -import {extractInputKeysFromSchema, extractVariables} from "@/oss/lib/shared/variant/inputHelpers" -import {generateId} from "@/oss/lib/shared/variant/stringUtils" -import {extractValueByMetadata} from "@/oss/lib/shared/variant/valueHelpers" -import {getJWT} from "@/oss/services/api" -import {currentAppContextAtom} from "@/oss/state/app/selectors/app" -import { - rowIdIndexAtom, - runStatusByRowRevisionAtom, - inputRowsByIdAtom, - chatTurnsByIdAtom, - inputRowsByIdFamilyAtom, - chatTurnsByIdFamilyAtom, - inputRowIdsAtom, - chatTurnIdsAtom, - messageSchemaMetadataAtom, -} from "@/oss/state/generation/entities" -import {inputRowAtomFamily, rowVariablesAtomFamily} from "@/oss/state/generation/selectors" -import {customPropertiesByRevisionAtomFamily} from "@/oss/state/newPlayground/core/customProperties" -import {promptsAtomFamily, promptVariablesAtomFamily} from "@/oss/state/newPlayground/core/prompts" -import {variantFlagsAtomFamily} from "@/oss/state/newPlayground/core/variantFlags" -import { - responseByRowRevisionAtomFamily, - loadingByRowRevisionAtomFamily, -} from "@/oss/state/newPlayground/generation/runtime" -import { - buildAssistantMessage, - buildCompletionResponseText, - buildToolMessages, - buildUserMessage, -} from "@/oss/state/newPlayground/helpers/messageFactory" -import {variableValuesSelectorFamily} from "@/oss/state/newPlayground/selectors/variables" -import {getProjectValues} from "@/oss/state/project" -import {getSpecLazy, appUriInfoAtom} from "@/oss/state/variant/atoms/fetcher" - -import {selectedAppIdAtom} from "../../app" - -// Atom to store pending web worker requests -export const pendingWebWorkerRequestsAtom = atom< - Record< - string, - { - rowId: string - variantId: string - runId: string - timestamp: number - preserveExistingAssistant?: boolean - previousStatus?: {isRunning?: string | false; resultHash?: string | null} - } - > ->({}) - -export const ignoredWebWorkerRunIdsAtom = atom>({}) - -const cloneNodeDeep = (value: any) => { - if (value === null || value === undefined) return value - try { - return JSON.parse(JSON.stringify(value)) - } catch { - return value - } -} - -function resolveEffectiveRevisionId( - get: any, - requestedVariantId: string | undefined, -): string | null { - const revisions = (get(revisionListAtom) || []) as any[] - const displayed = (get(displayedVariantsAtom) || []) as string[] - const effectiveId = - requestedVariantId || - (Array.isArray(displayed) && displayed.length > 0 - ? (displayed[0] as string | undefined) - : undefined) || - (revisions[0]?.id as string | undefined) - return effectiveId || null -} - -function detectIsChatVariant(get: any, rowId: string): boolean { - const spec = getSpecLazy() - const appUri = get(appUriInfoAtom) - if (spec) { - const properties = ( - spec.paths[(appUri?.routePath || "") + "/run"] || - spec.paths[(appUri?.routePath || "") + "/test"] - )?.post?.requestBody?.content["application/json"]?.schema?.properties - return properties?.messages !== undefined - } - return false -} - -type ResolvedVariableKeys = {ordered: string[]; set: Set} - -function computeVariableValues( - get: any, - isChatVariant: boolean, - rowId: string, - effectiveId: string, - resolvedKeys?: ResolvedVariableKeys, -): Record { - let variableValues: Record = {} - if (!isChatVariant) { - const nodes = get(rowVariablesAtomFamily({rowId, revisionId: effectiveId})) as any[] - for (const n of nodes || []) { - const name = (n as any)?.key ?? (n as any)?.__id - if (!name) continue - const v = (n as any)?.content?.value ?? (n as any)?.value - variableValues[name] = v !== undefined && v !== null ? String(v) : "" - } - if (Object.keys(variableValues).length === 0) { - variableValues = get(variableValuesSelectorFamily({revisionId: effectiveId})) as Record< - string, - string - > - } - } else { - variableValues = get(variableValuesSelectorFamily({revisionId: effectiveId})) as Record< - string, - string - > - } - if (isChatVariant) { - const rowsById = get(inputRowsByIdAtom) as Record - for (const row of Object.values(rowsById || {})) { - const edited = (row as any)?.variables || [] - for (const node of edited) { - const name = (node as any)?.key ?? (node as any)?.__id - if (!name) continue - const v = (node as any)?.content?.value ?? (node as any)?.value - const s = v !== undefined && v !== null ? String(v) : "" - if (s && s.trim().length > 0) variableValues[name] = s - } - } - if (Object.keys(variableValues).length === 0) { - const displayed = (get(displayedVariantsAtom) || []) as string[] - const baseline = displayed?.[0] - if (baseline && baseline !== effectiveId) { - for (const row of Object.values(rowsById || {})) { - const edited = ((row as any)?.variablesByRevision || {})[baseline] || [] - for (const node of edited) { - const name = (node as any)?.key ?? (node as any)?.__id - if (!name) continue - const v = (node as any)?.content?.value ?? (node as any)?.value - const s = v !== undefined && v !== null ? String(v) : "" - if (s && s.trim().length > 0) variableValues[name] = s - } - } - } - } - } - try { - const allowed = resolvedKeys ?? resolveAllowedVariableKeys(get, effectiveId) - if (allowed.ordered.length > 0) { - const filtered: Record = {} - for (const key of allowed.ordered) { - const value = variableValues[key] - filtered[key] = value !== undefined && value !== null ? String(value) : "" - } - return filtered - } - - return Object.fromEntries( - Object.entries(variableValues || {}).filter(([k]) => allowed.set.has(k)), - ) as Record - } catch {} - return variableValues -} - -// Resolve the set of allowed variable keys for a given revision -function resolveAllowedVariableKeys(get: any, revisionId: string): ResolvedVariableKeys { - const ordered: string[] = [] - const seen = new Set() - const trimmedToKey = new Map() - const addKey = (rawKey: unknown, preferNew: boolean) => { - if (typeof rawKey !== "string" || rawKey.length === 0) return - const key = rawKey - const trimmed = key.trim() - let insertionIndex = ordered.length - if (trimmed.length > 0) { - const existing = trimmedToKey.get(trimmed) - if (existing && existing !== key) { - if (!preferNew) return - if (seen.has(existing)) { - seen.delete(existing) - const idx = ordered.indexOf(existing) - if (idx >= 0) { - ordered.splice(idx, 1) - insertionIndex = idx - } - } - } else if (existing === key) { - return - } - } - if (seen.has(key)) return - if (insertionIndex < ordered.length) { - ordered.splice(insertionIndex, 0, key) - } else { - ordered.push(key) - } - seen.add(key) - if (trimmed.length > 0) trimmedToKey.set(trimmed, key) - } - - const flags = get(variantFlagsAtomFamily({revisionId})) as any - const isCustom = !!flags?.isCustom - if (isCustom) { - const spec = getSpecLazy() - const routePath = get(appUriInfoAtom)?.routePath - const keys = extractInputKeysFromSchema(spec, routePath) || [] - keys.forEach((key) => addKey(key, true)) - return {ordered, set: new Set(ordered)} - } - const promptVars = (get(promptVariablesAtomFamily(revisionId)) || []) as string[] - const livePrompts = (get(promptsAtomFamily(revisionId)) || []) as any[] - const scanned: string[] = [] - const scannedSeen = new Set() - const recordScanned = (value: string) => { - if (!scannedSeen.has(value)) { - scannedSeen.add(value) - scanned.push(value) - } - } - try { - for (const p of livePrompts || []) { - const msgs = (p as any)?.messages?.value || [] - for (const m of msgs) { - const content = m?.content?.value - if (typeof content === "string") { - extractVariables(content).forEach((v) => recordScanned(v)) - } else if (Array.isArray(content)) { - for (const part of content) { - const text = part?.text?.value ?? part?.text ?? "" - if (typeof text === "string") - extractVariables(text).forEach((v) => recordScanned(v)) - } - } - } - } - } catch {} - if (scanned.length > 0) { - scanned.forEach((value) => addKey(value, true)) - } - if (ordered.length === 0) { - ;(promptVars || []).forEach((value) => addKey(value, true)) - } else { - ;(promptVars || []).forEach((value) => addKey(value, false)) - } - return {ordered, set: new Set(ordered)} -} - -export const triggerWebWorkerTestAtom = atom( - null, - async (get, set, params: {rowId: string; variantId?: string; messageId?: string}) => { - const {rowId} = params - const requestedVariantId = params.variantId - const messageId = params.messageId - - const webWorker = (window as any).__playgroundWebWorker - if (!webWorker) return - const {postMessageToWorker, createWorkerMessage} = webWorker - - const displayed = (get(displayedVariantsAtom) || []) as string[] - const effectiveId = resolveEffectiveRevisionId(get, requestedVariantId) - if (!effectiveId) return - - // Derive logicalId from provided rowId (session id: turn-- or logical id itself) - const sessionMatch = /^turn-([^-]+)-(lt-.+)$/.exec(String(rowId)) - const logicalIdFromRow = - sessionMatch?.[2] || (String(rowId).startsWith("lt-") ? String(rowId) : "") - - if (!requestedVariantId) { - if (Array.isArray(displayed) && displayed.length > 1) { - const lid = logicalIdFromRow || String(rowId) - for (const revId of displayed) { - if (!revId) continue - const rid = `turn-${revId}-${lid}` - set(triggerWebWorkerTestAtom, {rowId: rid, variantId: revId}) - } - return - } - } - - const variant = get(variantByRevisionIdAtomFamily(effectiveId)) as any - const prompts = get(promptsAtomFamily(effectiveId)) - // const promptVars = get(promptVariablesAtomFamily(effectiveId)) - const customProps = variant - ? get(customPropertiesByRevisionAtomFamily(effectiveId)) - : undefined - const currentVariant = variant - ? ({...variant, prompts, customProperties: customProps} as any) - : undefined - const isChatVariant = detectIsChatVariant(get, rowId) - - const runId = generateId() - - // Mark active revision for this row so selectors resolve consistently during the run - set(rowIdIndexAtom, (prev) => ({ - ...prev, - [rowId]: {...(prev[rowId] || {}), latestRevisionId: effectiveId}, - })) - - // Mark loading + running for UI feedback (chat and completion) - const currentStatusMap = get(runStatusByRowRevisionAtom) as Record< - string, - {isRunning?: string | false; resultHash?: string | null} - > - const previousStatusEntry = currentStatusMap?.[`${rowId}:${effectiveId}`] - - set(runStatusByRowRevisionAtom, (prev) => ({ - ...prev, - [`${rowId}:${effectiveId}`]: {isRunning: runId, resultHash: null}, - })) - set(loadingByRowRevisionAtomFamily({rowId, revisionId: effectiveId}), true) - - const turnsMap = get(chatTurnsByIdAtom) as Record - const sourceTurn = turnsMap?.[rowId] - const existingAssistantNode = sourceTurn?.assistantMessageByRevision?.[effectiveId] ?? null - const existingToolResponses = sourceTurn?.toolResponsesByRevision?.[effectiveId] - const preserveExistingAssistant = - !messageId && - (existingAssistantNode !== null && existingAssistantNode !== undefined - ? true - : Array.isArray(existingToolResponses) && existingToolResponses.length > 0) - - set(pendingWebWorkerRequestsAtom, (prev) => ({ - ...prev, - [runId]: { - rowId, - variantId: effectiveId, - runId, - timestamp: Date.now(), - preserveExistingAssistant, - previousStatus: previousStatusEntry, - }, - })) - - const allMetadata = getAllMetadata() - - const allowedKeys = resolveAllowedVariableKeys(get, effectiveId) - - let inputRow, chatHistory: any - if (isChatVariant) { - const allTurnIds = get(generationRowIdsAtom) - const turnindex = allTurnIds.indexOf(rowId) - const turnHistoryIds = allTurnIds.slice(0, turnindex + 1) - const historyTurns = turnHistoryIds.map((id) => get(chatTurnsByIdAtom)[id]) - - chatHistory = historyTurns - .map((t) => { - const x = [] - if (t.userMessage) { - x.push(extractValueByMetadata(t.userMessage, allMetadata)) - } - if (t.assistantMessageByRevision?.[effectiveId]) { - x.push( - extractValueByMetadata( - t.assistantMessageByRevision[effectiveId], - allMetadata, - ), - ) - const toolMessages = t.toolResponsesByRevision?.[effectiveId] - if (Array.isArray(toolMessages) && toolMessages.length > 0) { - for (const toolMsg of toolMessages) { - try { - const y = get(messageSchemaMetadataAtom) as any - x.push( - extractValueByMetadata(toolMsg, { - [toolMsg.__metadata]: y, - }), - ) - } catch (err) { - x.push({ - role: "tool", - content: - toolMsg?.content?.value ?? - toolMsg?.content ?? - toolMsg?.response ?? - "", - }) - } - } - } - } - return x - }) - .flat() - .filter(Boolean) - } - - inputRow = (() => { - const rowIds = get(generationInputRowIdsAtom) as string[] - if (!Array.isArray(rowIds) || rowIds.length === 0) return undefined - // Prefer the requested rowId when present; fallback to first - const rid = rowIds.includes(rowId) ? rowId : rowIds[0] - const row = get(inputRowsByIdFamilyAtom(rid)) as any - const sharedVars = (row?.variables || []) as any[] - const revVars = (((row || {}).variablesByRevision || {})[effectiveId] || []) as any[] - // Merge shared + revision-specific, with revision-specific overriding when duplicate keys - const mergedByKey = new Map() - for (const node of sharedVars || []) { - const k = (node?.key ?? node?.__id) as string | undefined - if (!k) continue - mergedByKey.set(k, node) - } - for (const node of revVars || []) { - const k = (node?.key ?? node?.__id) as string | undefined - if (!k) continue - mergedByKey.set(k, node) - } - // Filter to allowed keys for the active revision - const enhanced: Record = {__id: rid} - const allowedNames = allowedKeys.ordered.length - ? allowedKeys.ordered - : Array.from(allowedKeys.set) - for (const name of allowedNames) { - const node = mergedByKey.get(name) - const v = node?.content?.value ?? node?.value - enhanced[name] = {value: v !== undefined && v !== null ? String(v) : ""} - } - return enhanced - })() - - const {projectId} = getProjectValues() || ({} as any) - const appId = get(selectedAppIdAtom) - const {appType} = get(currentAppContextAtom) || ({} as any) - const jwt = await getJWT() - const uri = get(appUriInfoAtom) || ({} as any) - - // Build headers for worker fetch - const headers: Record = {} - if (jwt) headers.Authorization = `Bearer ${jwt}` - - // Compose worker payload in the schema it expects - const payload = { - variant: currentVariant, - allMetadata: allMetadata, - inputRow, - rowId, - messageId, - appId, - uri: { - runtimePrefix: uri?.runtimePrefix, - routePath: uri?.routePath, - status: uri?.status, - }, - headers, - projectId, - chatHistory, - spec: getSpecLazy(), - runId, - prompts, - // variables: promptVars, - variables: allowedKeys.ordered, - variableValues: computeVariableValues( - get, - isChatVariant, - rowId, - effectiveId, - allowedKeys, - ), - revisionId: effectiveId, - variantId: effectiveId, - isChat: isChatVariant, - isCustom: get(variantFlagsAtomFamily({revisionId: effectiveId}))?.isCustom || false, - appType, - } - console.debug("[WW] post runVariantInputRow", { - rowId, - variantId: effectiveId, - isChatVariant, - hasJwt: Boolean(jwt), - }) - postMessageToWorker(createWorkerMessage("runVariantInputRow", payload)) - }, -) - -export const handleWebWorkerResultAtom = atom( - null, - ( - get, - set, - payload: { - rowId: string - variantId: string - runId: string - result?: any - error?: any - messageId?: string - }, - ) => { - const {rowId, variantId, runId, result: testResult, error, messageId} = payload - - const pendingRequests = get(pendingWebWorkerRequestsAtom) - const pendingEntry = pendingRequests?.[runId] - set(pendingWebWorkerRequestsAtom, (prev) => { - const {[runId]: _removed, ...rest} = prev - return rest - }) - - const ignored = get(ignoredWebWorkerRunIdsAtom) - if (runId && ignored?.[runId]) { - set(ignoredWebWorkerRunIdsAtom, (prev) => { - const {[runId]: _omit, ...rest} = prev - return rest - }) - set(loadingByRowRevisionAtomFamily({rowId, revisionId: variantId}), false) - return - } - - if (error && !testResult) { - set(runStatusByRowRevisionAtom, (prev) => ({ - ...prev, - [`${rowId}:${variantId}`]: {isRunning: false, resultHash: null}, - })) - set(loadingByRowRevisionAtomFamily({rowId, revisionId: variantId}), false) - return - } - - const isChat = detectIsChatVariant(get, rowId) - const preserveExistingAssistant = - Boolean(pendingEntry?.preserveExistingAssistant) && !messageId - const previousStatus = pendingEntry?.previousStatus - - if (isChat) { - let normalizedResult = testResult - if (testResult?.error) { - const tree = testResult?.metadata?.rawError?.detail?.tree - const trace = tree?.nodes?.[0] - const messageStr = trace?.status?.message ?? String(testResult.error) - normalizedResult = { - response: {data: messageStr, tree}, - error: messageStr, - metadata: testResult?.metadata, - } - } - const responseHash = hashResponse(normalizedResult) - const writeKey = String(rowId) - let targetRowId = writeKey - - if (preserveExistingAssistant) { - const turnsMap = get(chatTurnsByIdAtom) as Record - const baseTurn = turnsMap?.[writeKey] - if (baseTurn) { - const forkId = `lt-${generateId()}` - const sessionId = - baseTurn.sessionId || (variantId ? `session-${variantId}` : `session-`) - - const assistantClone = (() => { - const existing = cloneNodeDeep( - baseTurn.assistantMessageByRevision, - ) as Record - const map = existing && typeof existing === "object" ? existing : {} - map[variantId] = null - return map - })() - - let toolResponsesClone: Record | undefined - if (baseTurn.toolResponsesByRevision) { - toolResponsesClone = {} - for (const [revId, nodes] of Object.entries( - baseTurn.toolResponsesByRevision, - )) { - if (revId === variantId) continue - if (Array.isArray(nodes)) { - toolResponsesClone[revId] = nodes.map((n) => cloneNodeDeep(n)) - } else if (nodes) { - toolResponsesClone[revId] = cloneNodeDeep(nodes) as any - } - } - if (toolResponsesClone && Object.keys(toolResponsesClone).length === 0) - toolResponsesClone = undefined - } - - const forkTurn: any = { - id: forkId, - sessionId, - userMessage: null, - assistantMessageByRevision: assistantClone, - meta: cloneNodeDeep(baseTurn.meta) || {}, - } - if (toolResponsesClone) forkTurn.toolResponsesByRevision = toolResponsesClone - - set(chatTurnsByIdAtom, (prev) => ({...(prev || {}), [forkId]: forkTurn})) - set(chatTurnIdsAtom, (prev) => { - const list = prev || [] - const position = list.indexOf(writeKey) - if (position === -1) return [...list, forkId] - return [...list.slice(0, position + 1), forkId, ...list.slice(position + 1)] - }) - - targetRowId = forkId - } - } - - let hasToolCalls = false - set(chatTurnsByIdFamilyAtom(targetRowId), (draft: any) => { - if (!draft) return - if (!draft.assistantMessageByRevision) draft.assistantMessageByRevision = {} - // const metaId = draft?.userMessage?.__metadata as string | undefined - const messageSchema = get(messageSchemaMetadataAtom) - // metaId ? getMetadataLazy(metaId) : undefined - const incoming = buildAssistantMessage(messageSchema, testResult) || {} - const toolMessages = buildToolMessages(messageSchema, testResult) - const existingToolMessages = draft?.toolResponsesByRevision?.[variantId] ?? null - const hasExistingToolResponses = - Array.isArray(existingToolMessages) && existingToolMessages.length > 0 - const hasNewToolCalls = Array.isArray(toolMessages) && toolMessages.length > 0 - draft.assistantMessageByRevision[variantId] = incoming - - if (hasNewToolCalls) { - if (!draft.toolResponsesByRevision) draft.toolResponsesByRevision = {} - draft.toolResponsesByRevision[variantId] = toolMessages - } else if (!hasExistingToolResponses && draft?.toolResponsesByRevision) { - if (variantId in draft.toolResponsesByRevision) { - delete draft.toolResponsesByRevision[variantId] - } - if (Object.keys(draft.toolResponsesByRevision).length === 0) { - delete draft.toolResponsesByRevision - } - } - - hasToolCalls = hasNewToolCalls - }) - - set(loadingByRowRevisionAtomFamily({rowId, revisionId: variantId}), false) - if (targetRowId !== writeKey) { - set( - loadingByRowRevisionAtomFamily({rowId: targetRowId, revisionId: variantId}), - false, - ) - } - - set(runStatusByRowRevisionAtom, (prev) => { - const next = {...prev} - next[`${targetRowId}:${variantId}`] = {isRunning: false, resultHash: responseHash} - if (preserveExistingAssistant && targetRowId !== writeKey) { - next[`${writeKey}:${variantId}`] = { - isRunning: false, - resultHash: - previousStatus && previousStatus.resultHash !== undefined - ? previousStatus.resultHash - : null, - } - } - return next - }) - - set( - responseByRowRevisionAtomFamily({rowId: targetRowId, revisionId: variantId}), - normalizedResult as any, - ) - - // Append a new turn id once when the handled rowId is currently last in chatTurnIdsAtom - const ids = (get(chatTurnIdsAtom) || []) as string[] - const idx = ids.indexOf(String(targetRowId)) - const isLast = idx >= 0 && idx === ids.length - 1 - if (isLast && !hasToolCalls) { - set(chatTurnIdsAtom, (prev) => [...(prev || []), `lt-${generateId()}`]) - } - - return - } - - const responseHash = buildCompletionResponseText(testResult) - set(inputRowsByIdAtom, (prev) => - produce(prev, (draft: any) => { - const row = draft?.[rowId] - if (!row) return - if (!row.responsesByRevision) row.responsesByRevision = {} - const arr: any[] = Array.isArray(row.responsesByRevision[variantId]) - ? row.responsesByRevision[variantId] - : [] - const exists = arr.some((m: any) => m?.content?.value === responseHash) - if (!exists) - arr.push({ - __id: generateId(), - role: "assistant", - content: {value: responseHash}, - }) - row.responsesByRevision[variantId] = arr - }), - ) - set(runStatusByRowRevisionAtom, (prev) => ({ - ...prev, - [`${rowId}:${variantId}`]: {isRunning: false, resultHash: responseHash}, - })) - set(loadingByRowRevisionAtomFamily({rowId, revisionId: variantId}), false) - console.debug("[WW] completion result", {rowId, variantId, responseHash}) - set(responseByRowRevisionAtomFamily({rowId, revisionId: variantId}), testResult as any) - const queryClient = get(queryClientAtom) - queryClient.invalidateQueries({queryKey: ["tracing"]}) - }, -) - -export const lastRunTurnForVariantAtomFamily = atomFamily( - (p: {logicalId: string; revisionId: string}) => { - const base = atom(null) - return atom( - (get) => get(base), - (get, set, next: string | null) => set(base, next), - ) - }, -) - -export const setLastRunTurnForVariantAtom = atom( - null, - (get, set, params: {logicalId: string; revisionId: string; rowId: string}) => { - const {logicalId, revisionId, rowId} = params - set(lastRunTurnForVariantAtomFamily({logicalId, revisionId}), rowId) - }, -) diff --git a/web/oss/src/state/newPlayground/selectors/variables.ts b/web/oss/src/state/newPlayground/selectors/variables.ts deleted file mode 100644 index 45fc9a3854..0000000000 --- a/web/oss/src/state/newPlayground/selectors/variables.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {inputRowsByIdAtom} from "@/oss/state/generation/entities" - -/** - * Variables Selectors (newPlayground) - * Canonical variables are sourced from normalized input rows only. - */ -export const variablesByRevisionSelectorFamily = atomFamily((params: {revisionId: string}) => - atom((get) => { - const {revisionId} = params - const rows = get(inputRowsByIdAtom) as Record - const all: any[] = [] - for (const row of Object.values(rows || {})) { - const nodes = (row?.variables || []) as any[] - if (Array.isArray(nodes) && nodes.length > 0) all.push(...nodes) - } - return all - }), -) - -export const variableValuesSelectorFamily = atomFamily((params: {revisionId: string}) => - atom((get) => { - const nodes = get(variablesByRevisionSelectorFamily(params)) as any[] - const values: Record = {} - for (const n of nodes || []) { - const key = (n as any)?.key ?? (n as any)?.__id - if (!key) continue - const v = (n as any)?.content?.value ?? (n as any)?.value - values[key] = v !== undefined && v !== null ? String(v) : "" - } - return values - }), -) diff --git a/web/oss/src/state/newPlayground/types.ts b/web/oss/src/state/newPlayground/types.ts deleted file mode 100644 index 86c6d3394d..0000000000 --- a/web/oss/src/state/newPlayground/types.ts +++ /dev/null @@ -1,111 +0,0 @@ -/** - * New Playground State Architecture - * - * This architecture separates concerns and eliminates sync overhead: - * 1. Config management (mutable, independent from revisions) - * 2. Generation data (test inputs, messages, results) - * 3. Derived state (request bodies, validation) - */ - -export interface PlaygroundVariantConfig { - id: string - name: string - isChatVariant: boolean - prompts: Record - parameters: Record - metadata: { - createdAt: number - updatedAt: number - originalRevisionId?: string - } -} - -export interface PlaygroundConfig { - variants: Record - selectedVariantId: string - displayedVariantIds: string[] -} - -export interface TestInput { - __id: string - __metadata: Record - __runs: Record - [variableName: string]: any -} - -export interface ChatMessage { - __id: string - __metadata: Record - __runs: Record - history: { - value: ChatHistoryItem[] - __metadata: Record - } - [variableName: string]: any -} - -export interface ChatHistoryItem { - __id: string - role: "user" | "assistant" | "system" - content: any - __runs?: Record - __metadata?: Record -} - -export interface TestRun { - __isRunning?: string | boolean - __result?: any - __error?: any - __timestamp?: number -} - -export interface GenerationData { - inputs: TestInput[] - messages: ChatMessage[] - metadata: { - lastUpdated: number - totalRuns: number - } -} - -export interface PlaygroundState { - config: PlaygroundConfig - generation: GenerationData -} - -// Mutation parameter types -export interface UpdateConfigParams { - variantId: string - path: string[] - value: any -} - -export interface AddTestcaseParams { - mode: "completion" | "chat" - variables?: Record -} - -export interface RunTestParams { - rowId: string - variantId: string -} - -export interface DeleteMessageParams { - rowId: string - messageId: string - variantId?: string -} - -// Derived state types -export interface DerivedRequestBody { - variantId: string - requestBody: any - isValid: boolean - validationErrors: string[] -} - -export interface DirtyState { - variantId: string - isDirty: boolean - changes: string[] -} diff --git a/web/oss/src/state/org/hooks.ts b/web/oss/src/state/org/hooks.ts deleted file mode 100644 index e8a91df867..0000000000 --- a/web/oss/src/state/org/hooks.ts +++ /dev/null @@ -1,146 +0,0 @@ -import {useCallback} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {useAtom, useSetAtom, useAtomValue} from "jotai" - -import {OrgDetails} from "@/oss/lib/Types" -import {fetchSingleOrg} from "@/oss/services/organization/api" -import type {ProjectsResponse} from "@/oss/services/project/types" -import {requestNavigationAtom} from "@/oss/state/appState" - -import {projectsAtom} from "../project/selectors/project" - -import { - cacheWorkspaceOrgPair, - orgsQueryAtom, - selectedOrgQueryAtom, - selectedOrgIdAtom, - orgsAtom, - selectedOrgAtom, -} from "./selectors/org" - -const EmptyOrgs: OrgDetails[] = [] - -const projectMatchesWorkspace = ( - project: {workspace_id?: string | null; organization_id?: string | null}, - workspaceId: string, -) => { - if (!workspaceId) return false - if (project.workspace_id && project.workspace_id === workspaceId) return true - if (project.organization_id && project.organization_id === workspaceId) return true - return false -} - -export const useOrgData = () => { - const queryClient = useQueryClient() - const [{data: orgs, isPending: loadingOrgs, refetch: refetchOrgs}] = useAtom(orgsQueryAtom) - const [{data: selectedOrg, isPending: loadingDetails, refetch: refetchSelectedOrg}] = - useAtom(selectedOrgQueryAtom) - const navigate = useSetAtom(requestNavigationAtom) - const selectedOrgId = useAtomValue(selectedOrgIdAtom) - - const projects = useAtomValue(projectsAtom) - - const resolveWorkspaceForOrg = useCallback( - async ( - organizationId: string, - ): Promise<{workspaceId: string | null; preferredProject: ProjectsResponse | null}> => { - const matchingProject = projects.find((project) => - projectMatchesWorkspace(project, organizationId), - ) - - if (matchingProject) { - return { - workspaceId: matchingProject.workspace_id || organizationId, - preferredProject: matchingProject, - } - } - - const cachedDetails = queryClient.getQueryData([ - "selectedOrg", - organizationId, - ]) - - const resolvedDetails = - cachedDetails ?? - (await queryClient.fetchQuery({ - queryKey: ["selectedOrg", organizationId], - queryFn: () => fetchSingleOrg({organizationId}), - })) - - const workspaceId = resolvedDetails?.default_workspace?.id ?? organizationId - - if (resolvedDetails?.default_workspace?.id) { - cacheWorkspaceOrgPair(resolvedDetails.default_workspace.id, resolvedDetails.id) - } - - return { - workspaceId, - preferredProject: null, - } - }, - [projects, queryClient], - ) - - const changeSelectedOrg = useCallback( - async (organizationId: string, onSuccess?: () => void) => { - if (loadingOrgs) return - if (!organizationId) { - navigate({type: "href", href: "/w", method: "replace"}) - return - } - - if (organizationId === selectedOrgId) { - onSuccess?.() - return - } - - queryClient.removeQueries({queryKey: ["selectedOrg", selectedOrgId]}) - - try { - const {workspaceId, preferredProject} = await resolveWorkspaceForOrg(organizationId) - if (!workspaceId) return - - if (preferredProject?.organization_id) { - cacheWorkspaceOrgPair( - preferredProject.workspace_id ?? workspaceId, - preferredProject.organization_id, - ) - } - - const href = preferredProject - ? `/w/${encodeURIComponent(workspaceId)}/p/${encodeURIComponent(preferredProject.project_id)}/apps` - : `/w/${encodeURIComponent(workspaceId)}` - - navigate({type: "href", href, method: "push", shallow: false}) - onSuccess?.() - } catch (error) { - console.error("Failed to change workspace:", error) - } - }, - [loadingOrgs, navigate, queryClient, resolveWorkspaceForOrg, selectedOrgId], - ) - - const reset = useCallback(async () => { - await queryClient.removeQueries({queryKey: ["orgs"]}) - await queryClient.removeQueries({queryKey: ["selectedOrg"]}) - navigate({type: "href", href: "/w", method: "replace"}) - }, [navigate, queryClient]) - - const refetch = useCallback(async () => { - await refetchOrgs() - await refetchSelectedOrg() - }, [refetchOrgs, refetchSelectedOrg]) - - return { - orgs: orgs ?? EmptyOrgs, - selectedOrg: selectedOrg ?? null, - loading: loadingOrgs || loadingDetails, - changeSelectedOrg, - reset, - refetch, - } -} - -export const useSelectedOrg = () => useAtomValue(selectedOrgAtom) -export const useOrgList = () => useAtomValue(orgsAtom) diff --git a/web/oss/src/state/org/index.ts b/web/oss/src/state/org/index.ts deleted file mode 100644 index c424009bb8..0000000000 --- a/web/oss/src/state/org/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -export * from "./selectors/org" -export * from "./hooks" -import {getDefaultStore} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" - -import {resetOrgDataAtom} from "./selectors/org" - -export const getOrgValues = () => { - const store = getDefaultStore() - const queryClient = store.get(queryClientAtom) - - // keys defined in selectors - const orgsKey = ["orgs"] - const selectedOrgKey = ["selectedOrg"] - - const orgsData = queryClient.getQueryData(orgsKey) - const orgsState = queryClient.getQueryState(orgsKey) - - // selectedOrg is keyed as ["selectedOrg", id] in selectors; prefer any matching entry - let selectedData = queryClient.getQueryData(selectedOrgKey) - let selectedState = queryClient.getQueryState(selectedOrgKey) - const multi = queryClient.getQueriesData({queryKey: selectedOrgKey}) || [] - const fromList = multi.find(([, data]) => !!data)?.[1] - if (fromList) selectedData = fromList - // No direct API for combined state; best-effort: if any matching query is pending, treat as pending - const anyPending = (queryClient.getQueryCache().findAll({queryKey: selectedOrgKey}) || []).some( - (q: any) => q.state.status === "pending", - ) - if (anyPending) selectedState = {status: "pending"} as any - - return { - orgs: orgsData ?? [], - selectedOrg: selectedData ?? null, - isLoading: orgsState?.status === "pending" || selectedState?.status === "pending", - } -} - -export const resetOrgData = () => { - const store = getDefaultStore() - store.set(resetOrgDataAtom, null) -} diff --git a/web/oss/src/state/org/selectors/org.ts b/web/oss/src/state/org/selectors/org.ts deleted file mode 100644 index 6dada4bf9d..0000000000 --- a/web/oss/src/state/org/selectors/org.ts +++ /dev/null @@ -1,268 +0,0 @@ -import {atom} from "jotai" -import {eagerAtom} from "jotai-eager" -import {atomWithQuery} from "jotai-tanstack-query" - -import {queryClient} from "@/oss/lib/api/queryClient" -import {Org, OrgDetails} from "@/oss/lib/Types" -import type {User} from "@/oss/lib/Types" -import {fetchAllOrgsList, fetchSingleOrg} from "@/oss/services/organization/api" -import {appIdentifiersAtom, appStateSnapshotAtom, requestNavigationAtom} from "@/oss/state/appState" -import {userAtom} from "@/oss/state/profile/selectors/user" -import {sessionExistsAtom} from "@/oss/state/session" -import {logAtom} from "@/oss/state/utils/logAtom" - -const WORKSPACE_ORG_MAP_KEY = "workspaceOrgMap" -const LAST_USED_WORKSPACE_ID_KEY = "lastUsedWorkspaceId" - -const readWorkspaceOrgMap = (): Record => { - if (typeof window === "undefined") return {} - try { - const raw = window.localStorage.getItem(WORKSPACE_ORG_MAP_KEY) - if (!raw) return {} - const parsed = JSON.parse(raw) - return typeof parsed === "object" && parsed !== null ? parsed : {} - } catch { - return {} - } -} - -const readLastUsedWorkspaceId = (): string | null => { - if (typeof window === "undefined") return null - try { - const raw = window.localStorage.getItem(LAST_USED_WORKSPACE_ID_KEY) - if (!raw) return null - const trimmed = raw.trim() - return trimmed || null - } catch { - return null - } -} - -const cacheLastWorkspaceId = (workspaceId: string | null) => { - if (typeof window === "undefined") return - if (!workspaceId) return - try { - window.localStorage.setItem(LAST_USED_WORKSPACE_ID_KEY, workspaceId) - } catch { - // ignore storage exceptions - } -} - -export const cacheWorkspaceOrgPair = ( - workspaceId: string | null, - organizationId: string | null, -) => { - if (typeof window === "undefined") return - if (!workspaceId || !organizationId) return - cacheLastWorkspaceId(workspaceId) - const map = readWorkspaceOrgMap() - map[workspaceId] = organizationId - try { - window.localStorage.setItem(WORKSPACE_ORG_MAP_KEY, JSON.stringify(map)) - } catch { - // ignore storage exceptions - } -} - -const resolveOrgId = (workspaceId: string | null): string | null => { - if (!workspaceId) return null - const map = readWorkspaceOrgMap() - return map[workspaceId] ?? null -} - -export const orgsQueryAtom = atomWithQuery((get) => { - const userId = (get(userAtom) as User | null)?.id - return { - queryKey: ["orgs", userId || ""], - queryFn: async () => fetchAllOrgsList(), - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!userId, - } -}) - -const logOrgs = process.env.NEXT_PUBLIC_LOG_ORG_ATOMS === "true" -const debugOrgSelection = process.env.NEXT_PUBLIC_APP_STATE_DEBUG === "true" -logAtom(orgsQueryAtom, "orgsQueryAtom", logOrgs) - -export const orgsAtom = eagerAtom((get) => { - const res = (get(orgsQueryAtom) as any)?.data - return res ?? [] -}) - -export const selectedOrgIdAtom = atom((get) => { - const snapshot = get(appStateSnapshotAtom) - const queryOrgId = snapshot.query["organization_id"] - if (typeof queryOrgId === "string" && queryOrgId) return queryOrgId - const {workspaceId} = get(appIdentifiersAtom) - const userId = (get(userAtom) as User | null)?.id - const orgs = get(orgsAtom) - - // helper: validate a candidate workspace/org id against current org list - const isValidForUser = (candidate: string | null): boolean => { - if (!candidate) return false - - // direct org match - if (orgs && Array.isArray(orgs) && orgs.some((org) => org.id === candidate)) return true - - // mapped org match - const mappedOrgId = resolveOrgId(candidate) - if ( - mappedOrgId && - orgs && - Array.isArray(orgs) && - orgs.some((org) => org.id === mappedOrgId) - ) { - return true - } - - return false - } - - // 1. If we already have a workspaceId from runtime state, prefer it. - // This respects direct navigation (/w/:id) even if we haven't cached a mapping yet. - if (workspaceId) { - const resolvedNow = resolveOrgId(workspaceId) ?? workspaceId - return resolvedNow - } - - // 2. Fallback: use lastUsedWorkspaceId from localStorage, - // but ONLY if it's still valid for this signed-in user. - const cachedLast = readLastUsedWorkspaceId() - if (cachedLast && isValidForUser(cachedLast)) { - const resolved = resolveOrgId(cachedLast) ?? cachedLast - return resolved - } - - // 3. Final fallback: pick a "preferred" workspace/org for this user - // (owned orgs first, then non-demo, etc), and normalize it to orgId if we can. - const preferred = resolvePreferredWorkspaceId(userId ?? null, orgs) - if (preferred) { - const resolved = resolveOrgId(preferred) ?? preferred - return resolved - } - - return null -}) - -export const selectedOrgNavigationAtom = atom(null, (get, set, next: string | null) => { - const {workspaceId} = get(appIdentifiersAtom) - const target = typeof next === "function" ? (next as any)(workspaceId) : next - if (!target) { - set(requestNavigationAtom, {type: "href", href: "/w", method: "replace"}) - return - } - if (target === workspaceId) return - const href = `/w/${encodeURIComponent(target)}` - set(requestNavigationAtom, {type: "href", href, method: "push"}) -}) - -const isDemoOrg = (org?: Partial): boolean => { - if (!org) return false - if (org.is_demo === true) return true - const type = org.type?.toLowerCase?.() ?? "" - if (type === "view-only" || type === "demo") return true - const name = org.name?.toLowerCase?.() ?? "" - const description = org.description?.toLowerCase?.() ?? "" - return name.includes("demo") || description.includes("demo") -} - -const pickFirstNonDemoOrg = (orgs?: Org[]) => { - if (!Array.isArray(orgs) || orgs.length === 0) return null - const nonDemo = orgs.find((org) => !isDemoOrg(org)) - return nonDemo ?? orgs[0] -} - -export const pickOwnedOrg = (userId: string | null, orgs?: Org[], nonDemoOnly = false) => { - if (!userId || !Array.isArray(orgs)) return null - const owned = orgs.filter((org) => org.owner === userId) - if (!owned.length) return null - if (!nonDemoOnly) return owned[0] - const firstNonDemoOwned = owned.find((org) => !isDemoOrg(org)) - return firstNonDemoOwned ?? null -} - -export const resolvePreferredWorkspaceId = (userId: string | null, orgs?: Org[]) => { - if (!Array.isArray(orgs) || orgs.length === 0) return null - - const lastWorkspaceId = readLastUsedWorkspaceId() - if (lastWorkspaceId) { - const hasDirectOrgMatch = orgs.some((org) => org.id === lastWorkspaceId) - if (hasDirectOrgMatch) { - return lastWorkspaceId - } - const mappedOrgId = resolveOrgId(lastWorkspaceId) - if (mappedOrgId) { - const orgExists = orgs.some((org) => org.id === mappedOrgId) - if (orgExists) { - return lastWorkspaceId - } - } - } - - const ownedPreferred = pickOwnedOrg(userId, orgs, true) ?? pickOwnedOrg(userId, orgs, false) - if (ownedPreferred?.id) { - return ownedPreferred.id - } - - const fallback = pickFirstNonDemoOrg(orgs) - return fallback?.id ?? null -} - -export const selectedOrgQueryAtom = atomWithQuery((get) => { - const snapshot = get(appStateSnapshotAtom) - const queryOrgId = snapshot.query["organization_id"] - const id = (typeof queryOrgId === "string" && queryOrgId) || get(selectedOrgIdAtom) - const userId = (get(userAtom) as User | null)?.id - const isWorkspaceRoute = - snapshot.routeLayer === "workspace" || - snapshot.routeLayer === "project" || - snapshot.routeLayer === "app" - const isAcceptRoute = snapshot.pathname.startsWith("/workspaces/accept") - const enabled = - !!id && - id !== null && - get(sessionExistsAtom) && - !!userId && - isWorkspaceRoute && - !isAcceptRoute - - return { - queryKey: ["selectedOrg", id], - queryFn: async () => { - if (!id) return null - const org = await fetchSingleOrg({organizationId: id}) - return org - }, - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - retry: (failureCount, error: any) => { - const status = error?.response?.status - if (status && status >= 400 && status < 500) return false - return failureCount < 2 - }, - onSuccess: () => { - if (process.env.NEXT_PUBLIC_LOG_ORG_ATOMS === "true") { - console.debug("[org] selectedOrg fetched", id) - } - }, - enabled, - } -}) - -logAtom(selectedOrgQueryAtom, "selectedOrgQueryAtom", logOrgs) - -export const selectedOrgAtom = eagerAtom((get) => { - const res = (get(selectedOrgQueryAtom) as any)?.data - return res ?? null -}) - -export const resetOrgDataAtom = atom(null, async (get) => { - const qc = queryClient - await qc.removeQueries({queryKey: ["orgs"]}) - await qc.removeQueries({queryKey: ["selectedOrg"]}) -}) diff --git a/web/oss/src/state/profile/hooks.ts b/web/oss/src/state/profile/hooks.ts deleted file mode 100644 index 6f54aae7b8..0000000000 --- a/web/oss/src/state/profile/hooks.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {useCallback} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {useAtom, useAtomValue} from "jotai" - -import {profileQueryAtom, userAtom} from "./selectors/user" - -export const useProfileData = () => { - const [{data, isLoading, refetch}] = useAtom(profileQueryAtom) - const queryClient = useQueryClient() - - const reset = useCallback(async () => { - await queryClient.invalidateQueries({queryKey: ["profile"]}) - await queryClient.invalidateQueries({queryKey: ["orgs"]}) - }, [queryClient]) - - return { - user: data ?? null, - loading: isLoading, - reset, - refetch, - } -} - -export const useUser = () => useAtomValue(userAtom) diff --git a/web/oss/src/state/profile/index.ts b/web/oss/src/state/profile/index.ts deleted file mode 100644 index 63b22f9371..0000000000 --- a/web/oss/src/state/profile/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -export * from "./selectors/user" -export * from "./hooks" -import {getDefaultStore} from "jotai" -import {loadable} from "jotai/vanilla/utils" -import {queryClientAtom} from "jotai-tanstack-query" - -import {profileQueryAtom} from "./selectors/user" - -export const getProfileValues = () => { - const state = getDefaultStore().get(loadable(profileQueryAtom)) - if (state.state === "hasData") { - return {user: state.data ?? null, loading: false} - } - return {user: null, loading: true} -} - -export const resetProfileData = () => { - const store = getDefaultStore() - const queryClient = store.get(queryClientAtom) - queryClient.removeQueries({queryKey: ["profile"]}) -} diff --git a/web/oss/src/state/profile/selectors/user.ts b/web/oss/src/state/profile/selectors/user.ts deleted file mode 100644 index 23d597a7fc..0000000000 --- a/web/oss/src/state/profile/selectors/user.ts +++ /dev/null @@ -1,50 +0,0 @@ -import {eagerAtom} from "jotai-eager" -import {atomWithQuery} from "jotai-tanstack-query" -import Router from "next/router" - -import type {AxiosError} from "axios" - -import {User} from "@/oss/lib/Types" -import {fetchProfile} from "@/oss/services/api" -import {logAtom} from "@/oss/state/utils/logAtom" - -import {sessionExistsAtom} from "../../session" - -export const profileQueryAtom = atomWithQuery((get) => ({ - queryKey: ["profile"], - queryFn: async () => { - try { - const res = await fetchProfile() - return (res?.data as User) ?? null - } catch (error) { - if ((error as AxiosError)?.response?.status === 401) { - return null - } - throw error - } - }, - throwOnError(error, query) { - Router.replace("/auth") - return false - }, - experimental_prefetchInRender: true, - enabled: get(sessionExistsAtom), -})) - -const logProfile = process.env.NEXT_PUBLIC_LOG_PROFILE_ATOMS === "true" -logAtom(profileQueryAtom, "profileQueryAtom", logProfile) - -export const userAtom = eagerAtom((get) => { - const res = get(profileQueryAtom).data - - // In test environment, provide a mock user if no real user is available - if (!res && typeof process !== "undefined" && process.env.NODE_ENV === "test") { - return { - id: process.env.VITEST_TEST_USER_ID || "test-user-id", - username: "test-user", - email: "test@agenta.ai", - } as User - } - - return res ?? null -}) diff --git a/web/oss/src/state/project/hooks.ts b/web/oss/src/state/project/hooks.ts deleted file mode 100644 index fddcefa1b9..0000000000 --- a/web/oss/src/state/project/hooks.ts +++ /dev/null @@ -1,37 +0,0 @@ -import {useCallback} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {useAtom, useAtomValue} from "jotai" - -import {projectsQueryAtom} from "./selectors/project" -import {projectAtom, projectsAtom, projectIdAtom} from "./selectors/project" - -export const useProjectData = () => { - const [{data: projects, isPending, isLoading, refetch}] = useAtom(projectsQueryAtom) - const project = useAtomValue(projectAtom) - const projectId = useAtomValue(projectIdAtom) - const isProjectId = !!projectId - const queryClient = useQueryClient() - - const reset = useCallback(async () => { - return await queryClient.removeQueries({queryKey: ["projects"]}) - }, [queryClient]) - - const invalidate = useCallback(async () => { - return await queryClient.invalidateQueries({queryKey: ["projects"]}) - }, [queryClient]) - - return { - project: project ?? null, - projects: projects ?? [], - isProjectId, - projectId, - // isLoading: isPending, - isLoading: isLoading, - reset, - refetch: invalidate, - } -} - -export const useProject = () => useAtomValue(projectAtom) -export const useProjectList = () => useAtomValue(projectsAtom) diff --git a/web/oss/src/state/project/index.ts b/web/oss/src/state/project/index.ts deleted file mode 100644 index 2c4dd8faa5..0000000000 --- a/web/oss/src/state/project/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -export * from "./selectors/project" -export * from "./hooks" - -import {getDefaultStore} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" - -import {ProjectsResponse} from "@/oss/services/project/types" - -import {getOrgValues} from "../org" - -import {projectAtom, projectIdAtom, resetProjectDataAtom} from "./selectors/project" - -export const getProjectValues = () => { - const store = getDefaultStore() - const queryClient = store.get(queryClientAtom) - const {selectedOrg} = getOrgValues() - const organizationId = selectedOrg?.id - - const queryKey = ["projects", organizationId] - const queryData = queryClient.getQueryData(queryKey) - const queryState = queryClient.getQueryState(queryKey) - - const projects: ProjectsResponse[] = queryData ?? [] - const project = store.get(projectAtom) - - const projectId = store.get(projectIdAtom) - const isProjectId = !!projectId - - const isLoading = queryState?.status === "pending" - return { - project, - projects, - projectId, - isProjectId: !isLoading && isProjectId, - isLoading, - } -} - -export const resetProjectData = () => { - const store = getDefaultStore() - store.set(resetProjectDataAtom, null) -} diff --git a/web/oss/src/state/project/selectors/project.ts b/web/oss/src/state/project/selectors/project.ts deleted file mode 100644 index fe6a848fca..0000000000 --- a/web/oss/src/state/project/selectors/project.ts +++ /dev/null @@ -1,116 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom} from "jotai" -import {selectAtom, unwrap} from "jotai/utils" -import {eagerAtom} from "jotai-eager" -import {atomWithQuery} from "jotai-tanstack-query" - -import {queryClient} from "@/oss/lib/api/queryClient" -import {User} from "@/oss/lib/Types" -import {fetchAllProjects} from "@/oss/services/project" -import {ProjectsResponse} from "@/oss/services/project/types" -import {appIdentifiersAtom, appStateSnapshotAtom, requestNavigationAtom} from "@/oss/state/appState" -import {selectedOrgAtom, selectedOrgIdAtom} from "@/oss/state/org/selectors/org" -import {profileQueryAtom} from "@/oss/state/profile" -import {sessionExistsAtom} from "@/oss/state/session" -import {logAtom} from "@/oss/state/utils/logAtom" - -export const projectsQueryAtom = atomWithQuery((get) => { - const workspaceId = get(selectedOrgIdAtom) - const snapshot = get(appStateSnapshotAtom) - const isAcceptRoute = snapshot.pathname.startsWith("/workspaces/accept") - return { - queryKey: ["projects", workspaceId || ""], - queryFn: async () => fetchAllProjects(), - experimental_prefetchInRender: true, - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: - get(sessionExistsAtom) && - !!(get(profileQueryAtom)?.data as User)?.id && - !isAcceptRoute && - !!workspaceId, - } -}) - -const logProjects = process.env.NEXT_PUBLIC_LOG_PROJECT_ATOMS === "true" -const debugProjectSelection = process.env.NEXT_PUBLIC_APP_STATE_DEBUG === "true" -logAtom(projectsQueryAtom, "projectsQueryAtom", logProjects) - -const EmptyProjects: ProjectsResponse[] = [] -export const projectsAtom = selectAtom( - unwrap(projectsQueryAtom), - (res) => (res as any)?.data ?? EmptyProjects, - deepEqual, -) - -const projectBelongsToWorkspace = (project: ProjectsResponse, workspaceId: string) => { - if (project.workspace_id && project.workspace_id === workspaceId) return true - if (project.organization_id && project.organization_id === workspaceId) return true - return false -} - -const projectMatchesWorkspace = (project: ProjectsResponse, workspaceId: string) => { - if (!workspaceId) return false - if (project.workspace_id && project.workspace_id === workspaceId) return true - if (project.organization_id && project.organization_id === workspaceId) return true - return false -} - -const pickPreferredProject = (projects: ProjectsResponse[], workspaceId: string | null) => { - if (!projects.length) return null - - const nonDemo = projects.filter((project) => !project.is_demo) - if (workspaceId) { - const workspaceMatch = projects.find( - (project) => projectMatchesWorkspace(project, workspaceId) && !project.is_demo, - ) - if (workspaceMatch) return workspaceMatch - - const workspaceAny = projects.find((project) => - projectMatchesWorkspace(project, workspaceId), - ) - if (workspaceAny) return workspaceAny - } - - if (nonDemo.length) return nonDemo[0] - return projects[0] -} - -export const projectAtom = eagerAtom((get) => { - const projects = get(projectsAtom) as ProjectsResponse[] - const org = get(selectedOrgAtom) - const workspaceId = org?.default_workspace?.id ?? null - - if (!projects.length) return null - - const preferred = pickPreferredProject(projects, workspaceId) - if (preferred) return preferred - - return projects[0] ?? null -}) - -export const projectIdAtom = atom((get) => get(appIdentifiersAtom).projectId) - -export const projectNavigationAtom = atom(null, (get, set, next: string | null) => { - const {workspaceId, projectId} = get(appIdentifiersAtom) - const target = typeof next === "function" ? (next as any)(projectId) : next - - if (!workspaceId) return - - if (!target) { - const base = `/w/${encodeURIComponent(workspaceId)}` - set(requestNavigationAtom, {type: "href", href: base, method: "replace"}) - return - } - - if (target === projectId) return - - const href = `/w/${encodeURIComponent(workspaceId)}/p/${encodeURIComponent(target)}/apps` - set(requestNavigationAtom, {type: "href", href, method: "push"}) -}) - -export const resetProjectDataAtom = atom(null, async () => { - await queryClient.removeQueries({queryKey: ["projects"]}) -}) diff --git a/web/oss/src/state/projectVariantConfig/atoms.ts b/web/oss/src/state/projectVariantConfig/atoms.ts deleted file mode 100644 index 2ea7ba6ad7..0000000000 --- a/web/oss/src/state/projectVariantConfig/atoms.ts +++ /dev/null @@ -1,286 +0,0 @@ -import {atom, getDefaultStore} from "jotai" -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" -import {queryClientAtom} from "jotai-tanstack-query" - -import {adaptRevisionToVariant} from "@/oss/lib/shared/variant" -import {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types/transformedVariant" -import { - RevisionObject, - ParentVariantObject, -} from "@/oss/lib/shared/variant/transformer/types/variant" -import {fetchVariantConfig, VariantConfigResponse} from "@/oss/services/variantConfigs/api" -import {appsAtom} from "@/oss/state/app/selectors/app" - -export interface ProjectVariantConfigKey { - projectId?: string - appId?: string - appSlug?: string - variantId?: string - variantSlug?: string - variantVersion?: number | null -} - -export const serializeProjectVariantConfigKey = (key: ProjectVariantConfigKey): string => - JSON.stringify({ - projectId: key.projectId ?? "", - appId: key.appId ?? "", - appSlug: key.appSlug ?? "", - variantId: key.variantId ?? "", - variantSlug: key.variantSlug ?? "", - variantVersion: key.variantVersion ?? null, - }) - -const parseKey = (serialized: string): ProjectVariantConfigKey => { - try { - const parsed = JSON.parse(serialized) - return { - projectId: parsed.projectId || undefined, - appId: parsed.appId || undefined, - appSlug: parsed.appSlug || undefined, - variantId: parsed.variantId || undefined, - variantSlug: parsed.variantSlug || undefined, - variantVersion: parsed.variantVersion ?? undefined, - } - } catch (error) { - console.warn("Failed to parse project variant config key", error) - return {} - } -} - -export const projectVariantConfigQueryFamily = atomFamily((serializedKey: string) => - atomWithQuery((get) => { - const params = parseKey(serializedKey) - const {projectId, appId, appSlug, variantId, variantSlug, variantVersion} = params - const enabled = Boolean(projectId) && (Boolean(variantId) || Boolean(variantSlug)) - - return { - queryKey: [ - "projectVariantConfig", - projectId ?? "", - appId ?? "", - appSlug ?? "", - variantId ?? "", - variantSlug ?? "", - variantVersion ?? "", - ], - queryFn: async () => { - if (!enabled) return null - return fetchVariantConfig({ - projectId: projectId as string, - application: { - id: appId, - slug: appSlug, - }, - variant: { - id: variantId, - slug: variantSlug, - version: variantVersion ?? null, - }, - }) - }, - refetchOnReconnect: false, - refetchOnMount: false, - refetchOnWindowFocus: false, - staleTime: 60_000, - enabled, - } - }), -) - -const projectVariantReferenceMapAtom = atom>(new Map()) - -export const projectVariantReferenceCountAtom = atom( - (get) => get(projectVariantReferenceMapAtom).size, -) - -export const setProjectVariantReferencesAtom = atom( - null, - (get, set, references: ProjectVariantConfigKey[]) => { - const next = new Map() - references.forEach((reference) => { - if (!reference?.projectId) return - const serialized = serializeProjectVariantConfigKey(reference) - next.set(serialized, { - projectId: reference.projectId, - appId: reference.appId, - appSlug: reference.appSlug, - variantId: reference.variantId, - variantSlug: reference.variantSlug, - variantVersion: reference.variantVersion ?? null, - }) - }) - set(projectVariantReferenceMapAtom, next) - }, -) - -export interface ProjectScopedVariantsState { - variants: EnhancedVariant[] - revisionMap: Record - specMap: Record - uriMap: Record - isLoading: boolean - revisions: EnhancedVariant[] -} - -const buildRevisionFromConfig = ( - projectId: string, - params: ProjectVariantConfigKey, - response: VariantConfigResponse | null, - appNameLookup: Map, -): EnhancedVariant => { - const variantId = - response?.variant_ref?.id || params.variantId || params.variantSlug || "unknown" - const variantSlug = response?.variant_ref?.slug || params.variantSlug || variantId - const revisionValue = response?.variant_ref?.version ?? params.variantVersion ?? null - const appId = response?.application_ref?.id || params.appId || "" - const appSlug = response?.application_ref?.slug || params.appSlug || "" - const appName = appNameLookup.get(appId) || appSlug - const configParams = response?.params ? {...response.params} : undefined - - const revision: RevisionObject = { - id: variantId, - revision: revisionValue ?? "", - config: { - parameters: configParams ?? {}, - }, - createdAtTimestamp: Date.now(), - updatedAtTimestamp: Date.now(), - modifiedById: "", - modifiedBy: null, - } - - const parentVariant: ParentVariantObject = { - variantId, - variantName: variantSlug, - configName: variantSlug, - appId, - baseId: variantId, - baseName: variantSlug, - parameters: configParams ?? {}, - createdAtTimestamp: Date.now(), - updatedAtTimestamp: Date.now(), - } - - const adapted = adaptRevisionToVariant(revision, parentVariant) - - return { - ...adapted, - appId, - appName, - projectId, - uri: response?.url || "", - configParams: configParams, - revisionLabel: revisionValue ?? null, - } as EnhancedVariant & { - configParams?: Record - revisionLabel?: number | string | null - } -} - -export const projectScopedVariantsAtom = atom((get) => { - const referenceMap = get(projectVariantReferenceMapAtom) - - if (referenceMap.size === 0) { - return { - variants: [], - revisionMap: {}, - specMap: {}, - uriMap: {}, - isLoading: false, - revisions: [], - } - } - - const apps = get(appsAtom) || [] - const appNameLookup = new Map(apps.map((item) => [item.app_id, item.app_name])) - - const variants: EnhancedVariant[] = [] - const revisionMap: Record = {} - const uriMap: Record = {} - const specMap: Record = {} - - let isLoading = false - - referenceMap.forEach((params, serialized) => { - if (!params.projectId) return - const queryResult = get(projectVariantConfigQueryFamily(serialized)) - if (queryResult.isPending || queryResult.isLoading) { - isLoading = true - } - const response = queryResult.data - const enhanced = buildRevisionFromConfig(params.projectId, params, response, appNameLookup) - - variants.push(enhanced) - const revisionList = revisionMap[enhanced.variantId] || [] - revisionList.push(enhanced) - revisionMap[enhanced.variantId] = revisionList - - if (enhanced.uri) { - uriMap[enhanced.variantId] = { - runtimePrefix: enhanced.uri, - } - } - }) - - return { - variants, - revisionMap, - specMap, - uriMap, - isLoading, - revisions: variants.slice(), - } -}) - -export const clearProjectVariantReferencesAtom = atom(null, (get, set) => { - if (get(projectVariantReferenceMapAtom).size === 0) return - set(projectVariantReferenceMapAtom, new Map()) -}) - -export const projectVariantConfigQueryKey = "projectVariantConfig" - -export const prefetchProjectVariantConfigs = (references: ProjectVariantConfigKey[]) => { - if (!Array.isArray(references) || references.length === 0) return - const store = getDefaultStore() - const queryClient = store.get(queryClientAtom) - references.forEach((reference) => { - if (!reference?.projectId) return - const serialized = serializeProjectVariantConfigKey(reference) - const params = parseKey(serialized) - if (!params.projectId || (!params.variantId && !params.variantSlug)) return - - queryClient - .ensureQueryData({ - queryKey: [ - projectVariantConfigQueryKey, - params.projectId ?? "", - params.appId ?? "", - params.appSlug ?? "", - params.variantId ?? "", - params.variantSlug ?? "", - params.variantVersion ?? "", - ], - queryFn: async () => { - const res = await fetchVariantConfig({ - projectId: params.projectId as string, - application: { - id: params.appId, - slug: params.appSlug, - }, - variant: { - id: params.variantId, - slug: params.variantSlug, - version: params.variantVersion ?? null, - }, - }) - return (res ?? {}) as VariantConfigResponse - }, - }) - .catch((error) => { - if (process.env.NODE_ENV !== "production") { - console.error("[projectVariantConfig] prefetch error", error) - } - }) - }) -} diff --git a/web/oss/src/state/projectVariantConfig/index.ts b/web/oss/src/state/projectVariantConfig/index.ts deleted file mode 100644 index 89eeef800a..0000000000 --- a/web/oss/src/state/projectVariantConfig/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./atoms" diff --git a/web/oss/src/state/queries/atoms/fetcher.ts b/web/oss/src/state/queries/atoms/fetcher.ts deleted file mode 100644 index fcc07d273b..0000000000 --- a/web/oss/src/state/queries/atoms/fetcher.ts +++ /dev/null @@ -1,124 +0,0 @@ -import {atom} from "jotai" -import {atomFamily, selectAtom} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import {queryClient} from "@/oss/lib/api/queryClient" -import { - archiveQuery, - createQuery, - editQuery, - fetchQuery, - queryQueries, - unarchiveQuery, -} from "@/oss/services/queries/api" -import type { - QueriesResponse, - QueryCreateRequest, - QueryEditRequest, - QueryQueryRequest, - QueryResponse, -} from "@/oss/services/queries/api/types" -import {projectIdAtom} from "@/oss/state/project" - -/** - * List queries with optional filters (payload) using atom family - */ -export const queriesQueryAtomFamily = atomFamily( - ({payload = {}, enabled = true}: {payload?: QueryQueryRequest; enabled?: boolean} = {}) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const payloadKey = JSON.stringify(payload || {}) - return { - queryKey: ["queries", projectId, payloadKey], - queryFn: () => queryQueries(payload), - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: enabled && !!projectId, - } - }), -) - -/** - * Fetch a single query by id - */ -export const queryByIdQueryAtomFamily = atomFamily((queryId?: string) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - return { - queryKey: ["query", projectId, queryId], - queryFn: () => - queryId ? fetchQuery(queryId) : Promise.resolve({count: 0} as QueryResponse), - staleTime: 60_000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!projectId && !!queryId, - } - }), -) - -/** - * Mutations as writable atoms - */ -export const invalidateQueriesAtom = atom(null, async () => { - await Promise.all([ - queryClient.invalidateQueries({queryKey: ["queries"]}), - queryClient.invalidateQueries({queryKey: ["query"]}), - ]) -}) - -export const createQueryAtom = atom( - null, - async (_get, _set, payload: QueryCreateRequest): Promise => { - const res = await createQuery(payload) - await queryClient.invalidateQueries({queryKey: ["queries"]}) - return res - }, -) - -export const editQueryAtom = atom( - null, - async ( - _get, - _set, - params: {queryId: string; payload: QueryEditRequest}, - ): Promise => { - const res = await editQuery(params.queryId, params.payload) - await Promise.all([ - queryClient.invalidateQueries({queryKey: ["queries"]}), - queryClient.invalidateQueries({queryKey: ["query", undefined, params.queryId]}), - ]) - return res - }, -) - -export const archiveQueryAtom = atom( - null, - async (_get, _set, queryId: string): Promise => { - const res = await archiveQuery(queryId) - await queryClient.invalidateQueries({queryKey: ["queries"]}) - return res - }, -) - -export const unarchiveQueryAtom = atom( - null, - async (_get, _set, queryId: string): Promise => { - const res = await unarchiveQuery(queryId) - await queryClient.invalidateQueries({queryKey: ["queries"]}) - return res - }, -) - -/** - * Small selectors - */ -export const queriesListAtomFamily = atomFamily((payload?: QueryQueryRequest) => - selectAtom(queriesQueryAtomFamily({payload}), (q) => q.data?.queries ?? []), -) - -export const queriesCountAtomFamily = atomFamily((payload?: QueryQueryRequest) => - selectAtom(queriesQueryAtomFamily({payload}), (q) => q.data?.count ?? 0), -) diff --git a/web/oss/src/state/queries/index.ts b/web/oss/src/state/queries/index.ts deleted file mode 100644 index aa3ca31fb8..0000000000 --- a/web/oss/src/state/queries/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./atoms/fetcher" diff --git a/web/oss/src/state/router.ts b/web/oss/src/state/router.ts deleted file mode 100644 index db4a975df5..0000000000 --- a/web/oss/src/state/router.ts +++ /dev/null @@ -1,28 +0,0 @@ -import {atom} from "jotai" - -/** - * Router State Atom - * Provides access to current route information including query parameters - */ - -export interface RouterState { - pathname: string - query: Record - asPath: string -} - -// Mock router state for testing and development -const defaultRouterState: RouterState = { - pathname: "/", - query: {}, - asPath: "/", -} - -// Router atom - in real app this would be connected to Next.js router -export const routerAtom = atom(defaultRouterState) - -// Action atom to update router state -export const updateRouterAtom = atom(null, (get, set, update: Partial) => { - const current = get(routerAtom) - set(routerAtom, {...current, ...update}) -}) diff --git a/web/oss/src/state/session/atoms.ts b/web/oss/src/state/session/atoms.ts deleted file mode 100644 index bc0d615c85..0000000000 --- a/web/oss/src/state/session/atoms.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {atom} from "jotai" -import {withImmer} from "jotai-immer" - -import {logAtom} from "../utils/logAtom" - -const baseSessionExistsAtom = atom(false) -export const sessionExistsAtom = withImmer(baseSessionExistsAtom) - -const baseSessionLoadingAtom = atom(true) -export const sessionLoadingAtom = withImmer(baseSessionLoadingAtom) - -const logSession = process.env.NEXT_PUBLIC_LOG_SESSION_ATOMS === "true" -logAtom(sessionExistsAtom, "sessionExistsAtom", logSession) diff --git a/web/oss/src/state/session/hooks.ts b/web/oss/src/state/session/hooks.ts deleted file mode 100644 index 2c273c5b14..0000000000 --- a/web/oss/src/state/session/hooks.ts +++ /dev/null @@ -1,21 +0,0 @@ -"use client" - -import {useEffect} from "react" - -import {useSetAtom, useAtomValue} from "jotai" -import {useSessionContext} from "supertokens-auth-react/recipe/session" - -import {sessionExistsAtom} from "./atoms" - -export const useSessionExists = () => useAtomValue(sessionExistsAtom) - -const SessionListener = () => { - const {doesSessionExist} = useSessionContext() as any - const setExists = useSetAtom(sessionExistsAtom) - useEffect(() => { - setExists(doesSessionExist) - }, [doesSessionExist, setExists]) - return null -} - -export default SessionListener diff --git a/web/oss/src/state/session/index.ts b/web/oss/src/state/session/index.ts deleted file mode 100644 index 6ac15f3fb3..0000000000 --- a/web/oss/src/state/session/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./atoms" -export {default as SessionListener, useSessionExists} from "./hooks" diff --git a/web/oss/src/state/session/jwt.ts b/web/oss/src/state/session/jwt.ts deleted file mode 100644 index 300a380f52..0000000000 --- a/web/oss/src/state/session/jwt.ts +++ /dev/null @@ -1,31 +0,0 @@ -import {atomWithQuery} from "jotai-tanstack-query" - -import {getJWT} from "@/oss/services/api" - -import {sessionExistsAtom} from "./atoms" - -/** - * jwtReadyAtom becomes `true` once a non-empty JWT is available in SuperTokens storage. - * We poll it once on mount; the value is cached as it has an infinite staleTime. - * Whenever the session starts (sessionExistsAtom true) but JWT is still empty, - * the query function runs again and resolves when the token appears. - */ -export const jwtReadyAtom = atomWithQuery((get) => ({ - queryKey: ["jwt-ready"], - queryFn: async () => { - const token = await getJWT() - - // In test environment, consider JWT ready if test JWT is available - if (!token && typeof process !== "undefined" && process.env.NODE_ENV === "test") { - return !!(process.env.VITEST_TEST_JWT || process.env.TEST_JWT) - } - - return !!token - }, - enabled: - get(sessionExistsAtom) || - (typeof process !== "undefined" && process.env.NODE_ENV === "test"), - experimental_prefetchInRender: true, - // JWT rarely changes; cache for a while to avoid extra lookups - staleTime: 1000 * 60 * 10, -})) diff --git a/web/oss/src/state/testset/atoms/fetcher.ts b/web/oss/src/state/testset/atoms/fetcher.ts deleted file mode 100644 index eea4b7f12c..0000000000 --- a/web/oss/src/state/testset/atoms/fetcher.ts +++ /dev/null @@ -1,109 +0,0 @@ -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import {testset} from "@/oss/lib/Types" -import {fetchTestsets, fetchPreviewTestsets} from "@/oss/services/testsets/api" -import {PreviewTestsetsQueryPayload} from "@/oss/services/testsets/api/types" - -import {userAtom} from "../../profile" -import {projectIdAtom} from "../../project" - -// Local options type for enabling/disabling queries -interface TestsetsQueryOptions { - enabled?: boolean -} - -/** - * Atom for fetching regular/legacy testsets - */ -export const testsetsQueryAtom = atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const user = get(userAtom) - - return { - queryKey: ["testsets", projectId], - queryFn: () => { - return fetchTestsets() - }, - staleTime: 5 * 60 * 1000, - gcTime: 30 * 60 * 1000, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!user?.id && !!projectId, - } -}) - -/** - * Atom family for fetching preview testsets with filters - */ -export const previewTestsetsQueryAtomFamily = atomFamily( - ({ - payload = {}, - enabled = true, - }: {payload?: PreviewTestsetsQueryPayload; enabled?: boolean} = {}) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const user = get(userAtom) - - const payloadKey = JSON.stringify(payload || {}) - - return { - queryKey: ["preview-testsets", projectId, payloadKey], - queryFn: () => fetchPreviewTestsets(payload), - staleTime: 1000 * 60, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!user?.id && enabled && !!projectId, - } - }), - (a, b) => { - const aEnabled = a?.enabled ?? true - const bEnabled = b?.enabled ?? true - const aKey = JSON.stringify(a?.payload ?? {}) - const bKey = JSON.stringify(b?.payload ?? {}) - return aEnabled === bEnabled && aKey === bKey - }, -) - -export const testsetsQueryAtomFamily = atomFamily( - ({enabled = true}: TestsetsQueryOptions = {}) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const user = get(userAtom) - - return { - queryKey: ["testsets", projectId], - queryFn: fetchTestsets, - staleTime: 1000 * 60, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!user?.id && enabled && !!projectId, - } - }), - (a, b) => (a?.enabled ?? true) === (b?.enabled ?? true), -) - -/** - * Atom for fetching preview testsets - */ -export const previewTestsetsQueryAtom = atomWithQuery((get) => { - const projectId = get(projectIdAtom) - - return { - queryKey: ["preview-testsets", projectId], - queryFn: () => { - if (process.env.NODE_ENV === "development") { - console.log("previewTestsetsQueryAtom") - } - return fetchPreviewTestsets() - }, - staleTime: 1000 * 60, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!projectId, - } -}) diff --git a/web/oss/src/state/testset/hooks/index.ts b/web/oss/src/state/testset/hooks/index.ts deleted file mode 100644 index b79600080d..0000000000 --- a/web/oss/src/state/testset/hooks/index.ts +++ /dev/null @@ -1,85 +0,0 @@ -import {useAtom} from "jotai" - -import {PreviewTestsetsQueryPayload} from "@/oss/services/testsets/api/types" - -import { - previewTestsetsQueryAtom, - previewTestsetsQueryAtomFamily, - testsetsQueryAtom, -} from "../atoms/fetcher" - -export {useTestset, testsetQueryAtomFamily} from "./useTestset" - -/** - * Hook for regular/legacy testsets. - * - * @param options.enabled - Whether the query is enabled (default: true) - * @returns Object with `testsets`, `isError`, `error`, `isLoading`, `mutate` - */ -export const useTestsetsData = ({enabled = true} = {}) => { - const [{data: testsets, isPending, refetch, error, isError}] = useAtom(testsetsQueryAtom) - - return { - testsets: testsets ?? [], - isError, - error, - isLoading: isPending, - mutate: refetch, - } -} - -/** - * Hook for preview testsets (no filters). - * - * @returns Object with `testsets`, `isError`, `error`, `isLoading`, `mutate` - */ -export const usePreviewTestsetsData = () => { - const [{data: testsets, isPending, refetch, error, isError}] = useAtom(previewTestsetsQueryAtom) - - return { - testsets: testsets ?? [], - isError, - error, - isLoading: isPending, - mutate: refetch, - } -} - -/** - * Hook for preview testsets with filters. - * - * Use `useMemo` to pass a stable `payload` object so the query key remains stable. - * - * @param payload - Filter payload matching PreviewTestsetsQueryPayload - * @param options.enabled - Whether the query is enabled (default: true) - * @returns Object with `testsets`, `isError`, `error`, `isLoading`, `mutate` - */ -export const usePreviewTestsetsDataWithFilters = ( - payload: PreviewTestsetsQueryPayload = {}, - {enabled = true}: {enabled?: boolean} = {}, -) => { - const [{data: testsets, isPending, refetch, error, isError}] = useAtom( - previewTestsetsQueryAtomFamily({payload, enabled}), - ) - - return { - testsets: testsets ?? [], - isError, - error, - isLoading: isPending, - mutate: refetch, - } -} - -/** - * Combined hook that supports both regular and preview testsets. - * - * @param preview - If true, returns preview testsets; otherwise regular testsets - * @returns Same shape as the underlying hook - */ -export const useTestsetsDataWithPreview = (preview = false) => { - const regularData = useTestsetsData() - const previewData = usePreviewTestsetsData() - - return preview ? previewData : regularData -} diff --git a/web/oss/src/state/testset/hooks/useTestset.ts b/web/oss/src/state/testset/hooks/useTestset.ts deleted file mode 100644 index f0d0475e8a..0000000000 --- a/web/oss/src/state/testset/hooks/useTestset.ts +++ /dev/null @@ -1,79 +0,0 @@ -import {useAtomValue} from "jotai" -import {atomFamily} from "jotai/utils" -import {atomWithQuery} from "jotai-tanstack-query" - -import {Testset, PreviewTestset} from "@/oss/lib/Types" -import {fetchTestset} from "@/oss/services/testsets/api" - -import {projectIdAtom} from "../../project" - -/** - * Atom family for fetching individual testsets - * Supports both regular and preview testsets with proper typing - */ -export const testsetQueryAtomFamily = atomFamily( - ({testsetId, preview}: {testsetId: string; preview?: boolean}) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - - return { - queryKey: ["testset", testsetId, preview ? "preview" : "regular", projectId], - queryFn: () => fetchTestset(testsetId, preview), - staleTime: 1000 * 60 * 2, // 2 minutes - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: true, - enabled: !!testsetId && !!projectId, - retry: (failureCount, error) => { - // Don't retry on client errors (404, etc.) - if ( - (error as any)?.response?.status >= 400 && - (error as any)?.response?.status < 500 - ) { - return false - } - return failureCount < 2 - }, - } - }), -) - -/** - * Hook for fetching a single testset using Jotai atoms - * Replaces the SWR-based useTestset hook with the same interface - * - * @param testsetId - ID of the testset to fetch - * @param preview - Whether to fetch preview version (optional) - * @returns Query result with same interface as SWR hook - */ -export function useTestset( - testsetId?: string, - preview?: T, -): { - data: T extends true ? PreviewTestset : Testset - error: any - isLoading: boolean - isPending: boolean - isError: boolean - isSuccess: boolean - refetch: () => void - mutate: () => void -} { - const queryAtom = testsetQueryAtomFamily({ - testsetId: testsetId || "", - preview: preview || false, - }) - - const queryResult = useAtomValue(queryAtom) - - return { - data: queryResult.data as T extends true ? PreviewTestset : Testset, - error: queryResult.error, - isLoading: queryResult.isPending, - isPending: queryResult.isPending, - isError: queryResult.isError, - isSuccess: queryResult.isSuccess, - refetch: queryResult.refetch, - mutate: queryResult.refetch, // For SWR compatibility - } -} diff --git a/web/oss/src/state/testset/index.tsx b/web/oss/src/state/testset/index.tsx deleted file mode 100644 index 49ae59549d..0000000000 --- a/web/oss/src/state/testset/index.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import {useEffect, useMemo, useRef, useState} from "react" - -import {useQueryClient} from "@tanstack/react-query" -import {useAtom, getDefaultStore} from "jotai" - -import axios from "@/oss/lib/api/assets/axiosConfig" -import {getAgentaApiUrl} from "@/oss/lib/helpers/api" -import {Testset} from "@/oss/lib/Types" - -import {previewTestsetsQueryAtom, testsetsQueryAtomFamily} from "./atoms/fetcher" -import {useTestset} from "./hooks/useTestset" - -/** - * Hook for regular/legacy testsets - */ -export const useTestsetsData = ({enabled = true} = {}) => { - const [{data: testsets, isPending, isLoading, refetch, error, isError}] = useAtom( - testsetsQueryAtomFamily({enabled}), - ) - const queryClient = useQueryClient() - const [columnsFallback, setColumnsFallback] = useState>({}) - const [csvVersion, setCsvVersion] = useState(0) - const [isValidating, setIsValidating] = useState(false) - - // Keep a ref in sync so the effect can read the latest fallback columns without re-running. - const columnsFallbackRef = useRef(columnsFallback) - useEffect(() => { - columnsFallbackRef.current = columnsFallback - }, [columnsFallback]) - - // Track ids that we already attempted (success or non-cancel failure) and those in flight. - const triedRef = useRef>(new Set()) - const inFlightRef = useRef>(new Set()) - - // Extract CSV columns from the TanStack Query cache for any testset - const cachedColumnsByTestsetId = useMemo(() => { - if (!enabled) return {} - const result: Record = {} - ;(testsets ?? []).forEach((ts: any) => { - const csv = queryClient.getQueryData(["testsetCsvData", ts?._id]) - if (csv && Array.isArray(csv) && csv.length > 0) { - const firstRow = (csv as any[])[0] || {} - const source = - firstRow && - typeof firstRow === "object" && - (firstRow as any).data && - typeof (firstRow as any).data === "object" - ? ((firstRow as any).data as Record) - : (firstRow as Record) - result[ts._id] = Object.keys(source) - } else { - result[ts._id] = undefined - } - }) - return result - }, [queryClient, testsets, csvVersion, enabled]) - - // Merge cache with fallback (from preview single testcase query) - // Depend on `columnsFallback` so consumers re-render when we infer columns. - const columnsByTestsetId = useMemo(() => { - if (!enabled) return {} - const merged: Record = {...cachedColumnsByTestsetId} - Object.entries(columnsFallback).forEach(([id, cols]) => { - if (!merged[id] || (merged[id]?.length ?? 0) === 0) { - merged[id] = cols - } - }) - return merged - }, [cachedColumnsByTestsetId, enabled, columnsFallback]) - - // Background fill: for testsets without cached columns, fetch a single testcase to infer columns. - useEffect(() => { - if (!enabled) return - if (isPending || isLoading) return - - const controller = new AbortController() - - const getPending = () => { - const fallback = columnsFallbackRef.current - const pending = (testsets ?? []).filter((ts: any) => { - const id = ts?._id - if (!id) return false - // If cache already has columns, skip - if (cachedColumnsByTestsetId[id]?.length) return false - // If fallback already has columns, skip - if (fallback[id]?.length) return false - // Avoid double-starting work - if (inFlightRef.current.has(id)) return false - // Skip ids we already tried (success or hard failure) - if (triedRef.current.has(id)) return false - return true - }) - return pending - } - - const BATCH = 6 - let stopped = false - - const run = async () => { - // Process as many batches as needed in one effect run to avoid re-run storms. - setIsValidating(true) - try { - while (!stopped && !controller.signal.aborted) { - const pending = getPending() - if (pending.length === 0) break - - const toFetch = pending.slice(0, BATCH) - - await Promise.all( - toFetch.map(async (ts: any) => { - const id = ts._id - if (!id) return - - // Mark as in-flight before firing the request - inFlightRef.current.add(id) - try { - const url = `${getAgentaApiUrl()}/preview/testcases/query` - const {data} = await axios.post( - url, - { - testset_id: id, - windowing: {limit: 1}, - }, - {signal: controller.signal}, - ) - - const rows: any[] = Array.isArray(data?.testcases) - ? data.testcases - : Array.isArray(data) - ? data - : [] - const first = rows[0] - const dataObj = - first?.data && typeof first.data === "object" ? first.data : {} - const cols = Object.keys(dataObj as Record) - - if (cols.length) { - setColumnsFallback((prev) => { - const next = {...prev, [id]: cols} - // Keep ref in sync immediately for this loop - columnsFallbackRef.current = next - return next - }) - } - // Mark as tried after a completed call (success or empty) - triedRef.current.add(id) - } catch (e: any) { - // If aborted or axios-cancelled, allow retry in a future pass - const isCancelled = - e?.name === "CanceledError" || - e?.name === "AbortError" || - e?.code === "ERR_CANCELED" || - (typeof (axios as any).isCancel === "function" && - (axios as any).isCancel(e)) - if (!isCancelled) { - // Hard failure: mark as tried to avoid hot loops - triedRef.current.add(id) - } - } finally { - inFlightRef.current.delete(id) - } - }), - ) - - // Yield between batches so React can paint and we do not hog the tab - await new Promise((r) => setTimeout(r, 0)) - } - } finally { - setIsValidating(false) - } - } - - run() - return () => { - stopped = true - controller.abort() - } - // Re-run only when inputs truly change (not on fallback writes) - }, [enabled, isPending, isLoading, testsets, cachedColumnsByTestsetId]) - - // Scoped csvVersion bumps: only bump for testset ids we care about - useEffect(() => { - if (!enabled) return - const ids = new Set((testsets ?? []).map((t: any) => t?._id).filter(Boolean)) - - const unsubscribe = queryClient.getQueryCache().subscribe((event: any) => { - if (event?.type !== "updated") return - const q = event?.query - if (q?.queryKey?.[0] !== "testsetCsvData") return - const id = q?.queryKey?.[1] - if (!ids.has(id)) return - setCsvVersion((v) => v + 1) - }) - return unsubscribe - }, [enabled, queryClient, testsets]) - - return { - testsets: testsets ?? [], - isError, - error, - isLoading: isPending || isLoading || isValidating, - mutate: refetch, - // New helpers (non-breaking): - columnsByTestsetId, - getColumnsFor: (id?: string) => (id ? (columnsByTestsetId[id] ?? []) : []), - } -} - -/** - * Hook for preview testsets - */ -export const usePreviewTestsetsData = () => { - const store = getDefaultStore() - const [{data: testsets, isPending, refetch, error, isError}] = useAtom( - previewTestsetsQueryAtom, - {store}, - ) - - return { - testsets: testsets ?? [], - isError, - error, - isLoading: isPending, - mutate: refetch, - } -} - -/** - * Combined hook that supports both regular and preview testsets - * @param preview - Whether to fetch preview testsets (default: false) - */ -export const useTestsetsDataWithPreview = (preview = false) => { - const regularData = useTestsetsData() - const previewData = usePreviewTestsetsData() - - return preview ? previewData : regularData -} - -// Export the single testset hook -export {useTestset} diff --git a/web/oss/src/state/url/auth.ts b/web/oss/src/state/url/auth.ts deleted file mode 100644 index 184a1e0c8e..0000000000 --- a/web/oss/src/state/url/auth.ts +++ /dev/null @@ -1,229 +0,0 @@ -import {atom, getDefaultStore} from "jotai" -import Router from "next/router" - -import { - appIdentifiersAtom, - appStateSnapshotAtom, - navigationRequestAtom, - requestNavigationAtom, -} from "@/oss/state/appState" -import {orgsAtom, resolvePreferredWorkspaceId} from "@/oss/state/org" -import {userAtom} from "@/oss/state/profile/selectors/user" -import {sessionExistsAtom, sessionLoadingAtom} from "@/oss/state/session" -import {urlAtom} from "@/oss/state/url" - -const isBrowser = typeof window !== "undefined" - -export interface InvitePayload { - token: string - email?: string - organization_id?: string - workspace_id?: string - project_id?: string - survey?: string -} - -const INVITE_STORAGE_KEY = "invite" - -export const protectedRouteReadyAtom = atom(false) -export const activeInviteAtom = atom(null) - -export const parseInviteFromUrl = (url: URL): InvitePayload | null => { - const token = url.searchParams.get("token")?.trim() - if (!token) return null - - const invite: InvitePayload = {token} - const fields: (keyof InvitePayload)[] = [ - "email", - "organization_id", - "workspace_id", - "project_id", - "survey", - ] - - fields.forEach((field) => { - const value = url.searchParams.get(field)?.trim() - if (value) { - invite[field] = field === "email" ? value.toLowerCase() : value - } - }) - - return invite -} - -export const readInviteFromStorage = (): InvitePayload | null => { - if (!isBrowser) return null - try { - const raw = window.localStorage.getItem(INVITE_STORAGE_KEY) - if (!raw) return null - const parsed = JSON.parse(raw) - if (parsed && typeof parsed.token === "string" && parsed.token.trim()) { - return { - token: parsed.token.trim(), - email: typeof parsed.email === "string" ? parsed.email.toLowerCase() : undefined, - organization_id: - typeof parsed.organization_id === "string" ? parsed.organization_id : undefined, - workspace_id: - typeof parsed.workspace_id === "string" ? parsed.workspace_id : undefined, - project_id: typeof parsed.project_id === "string" ? parsed.project_id : undefined, - survey: typeof parsed.survey === "string" ? parsed.survey : undefined, - } - } - } catch (error) { - console.error("Failed to read invite from storage:", error) - } - return null -} - -export const persistInviteToStorage = (invite: InvitePayload | null) => { - if (!isBrowser) return - try { - if (invite && invite.token) { - window.localStorage.setItem(INVITE_STORAGE_KEY, JSON.stringify(invite)) - } else { - window.localStorage.removeItem(INVITE_STORAGE_KEY) - } - } catch (error) { - console.error("Failed to persist invite to storage:", error) - } -} - -export const isCurrentAcceptRouteForInvite = (appState: any, invite: InvitePayload) => { - if (!appState.pathname?.startsWith("/workspaces/accept")) return false - const tokenParam = appState.query?.token - const currentToken = Array.isArray(tokenParam) ? tokenParam[0] : tokenParam - return currentToken === invite.token -} - -export const syncAuthStateFromUrl = (nextUrl?: string) => { - if (!isBrowser) return - - try { - const store = getDefaultStore() - const url = new URL(nextUrl ?? window.location.href, window.location.origin) - const appState = store.get(appStateSnapshotAtom) - const sessionLoading = store.get(sessionLoadingAtom) - const isSignedIn = store.get(sessionExistsAtom) - const user = store.get(userAtom) - const urlState = store.get(urlAtom) - - const resolvedPath = nextUrl ? url.pathname : (appState.pathname ?? url.pathname) - const resolvedAsPath = nextUrl - ? `${url.pathname}${url.search}${url.hash}` - : (appState.asPath ?? `${url.pathname}${url.search}${url.hash}`) - const path = resolvedPath - const asPath = resolvedAsPath - const isAuthRoute = path.startsWith("/auth") - const isAcceptRoute = path.startsWith("/workspaces/accept") - const baseAppURL = urlState.baseAppURL || "/w" - - let invite = parseInviteFromUrl(url) - if (invite) { - persistInviteToStorage(invite) - } else { - const storedInvite = readInviteFromStorage() - if (storedInvite) { - invite = storedInvite - } - } - store.set(activeInviteAtom, invite ?? null) - - if (sessionLoading) { - store.set(protectedRouteReadyAtom, false) - return - } - - if (isSignedIn) { - if (invite && !isAcceptRoute) { - const inviteEmail = invite.email ?? undefined - const userEmail = user?.email?.toLowerCase() - if (!inviteEmail || !userEmail || inviteEmail === userEmail) { - if (!isCurrentAcceptRouteForInvite(appState, invite)) { - void Router.replace({pathname: "/workspaces/accept", query: invite}).catch( - (error) => { - console.error("Failed to redirect to invite acceptance:", error) - }, - ) - } - store.set(protectedRouteReadyAtom, false) - return - } - } - - if (isAuthRoute) { - if (!path.startsWith(baseAppURL)) { - void Router.replace(baseAppURL).catch((error) => { - console.error("Failed to redirect authenticated user to app:", error) - }) - } - store.set(protectedRouteReadyAtom, false) - return - } - - if (isAcceptRoute) { - if (!invite) { - if (!path.startsWith(baseAppURL)) { - void Router.replace(baseAppURL).catch((error) => { - console.error("Failed to redirect from empty invite route:", error) - }) - } - store.set(protectedRouteReadyAtom, false) - } else { - const inviteEmail = invite.email ?? undefined - const userEmail = user?.email?.toLowerCase() - if (inviteEmail && userEmail && inviteEmail !== userEmail) { - if (!path.startsWith(baseAppURL)) { - void Router.replace(baseAppURL).catch((error) => { - console.error( - "Failed to redirect due to invite email mismatch:", - error, - ) - }) - } - store.set(protectedRouteReadyAtom, false) - return - } - } - } - - if (path === "/w") { - const identifiers = store.get(appIdentifiersAtom) - if (!identifiers.workspaceId) { - const orgs = store.get(orgsAtom) - const targetWorkspaceId = resolvePreferredWorkspaceId(user?.id ?? null, orgs) - - if (targetWorkspaceId) { - const pendingCommand = store.get(navigationRequestAtom) - if (!pendingCommand) { - store.set(requestNavigationAtom, { - type: "href", - href: `/w/${encodeURIComponent(targetWorkspaceId)}`, - method: "replace", - }) - } - store.set(protectedRouteReadyAtom, false) - return - } - } - } - - store.set(protectedRouteReadyAtom, true) - return - } - - if (isAuthRoute) { - store.set(protectedRouteReadyAtom, true) - return - } - - const redirectToPath = `/auth?redirectToPath=${encodeURIComponent(asPath)}` - if (asPath !== redirectToPath) { - void Router.replace(redirectToPath).catch((error) => { - console.error("Failed to redirect unauthenticated user to auth:", error) - }) - } - store.set(protectedRouteReadyAtom, false) - } catch (err) { - console.error("Failed to sync auth state from URL:", nextUrl, err) - } -} diff --git a/web/oss/src/state/url/focusDrawer.ts b/web/oss/src/state/url/focusDrawer.ts deleted file mode 100644 index cd1188e9c0..0000000000 --- a/web/oss/src/state/url/focusDrawer.ts +++ /dev/null @@ -1,141 +0,0 @@ -import {getDefaultStore} from "jotai" -import Router from "next/router" - -import { - focusDrawerAtom, - openFocusDrawerAtom, - resetFocusDrawerAtom, - setFocusDrawerTargetAtom, -} from "@/oss/components/EvalRunDetails/state/focusScenarioAtom" -import {navigationRequestAtom, type NavigationCommand} from "@/oss/state/appState" - -const isBrowser = typeof window !== "undefined" - -export const FOCUS_SCENARIO_QUERY_KEY = "focusScenarioId" -export const FOCUS_RUN_QUERY_KEY = "focusRunId" - -const ensureCleanFocusParams = (url: URL) => { - let mutated = false - if (url.searchParams.get(FOCUS_SCENARIO_QUERY_KEY)?.trim() === "") { - url.searchParams.delete(FOCUS_SCENARIO_QUERY_KEY) - mutated = true - } - if (url.searchParams.get(FOCUS_RUN_QUERY_KEY)?.trim() === "") { - url.searchParams.delete(FOCUS_RUN_QUERY_KEY) - mutated = true - } - if (!mutated) return false - - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to normalize focus drawer query params:", error) - }) - return true -} - -export const syncFocusDrawerStateFromUrl = (nextUrl?: string) => { - if (!isBrowser) return - - try { - const store = getDefaultStore() - const url = new URL(nextUrl ?? window.location.href, window.location.origin) - - const rawScenario = url.searchParams.get(FOCUS_SCENARIO_QUERY_KEY) - const rawRun = url.searchParams.get(FOCUS_RUN_QUERY_KEY) - const pendingNav = store.get(navigationRequestAtom) as NavigationCommand | null - - const scenarioId = rawScenario?.trim() || undefined - const runId = rawRun?.trim() || undefined - - const currentState = store.get(focusDrawerAtom) - - // Clean up empty params before processing - if (ensureCleanFocusParams(url)) { - // After normalising the URL we bail out; the router callback will re-run with clean params - return - } - - if (!scenarioId) { - const pendingScenarioPatch = - pendingNav?.type === "patch-query" - ? pendingNav.patch[FOCUS_SCENARIO_QUERY_KEY] - : undefined - const hasPendingScenario = - pendingScenarioPatch !== undefined && - (Array.isArray(pendingScenarioPatch) - ? pendingScenarioPatch.length > 0 - : String(pendingScenarioPatch ?? "").length > 0) - if (hasPendingScenario) { - return - } - - const hasStoredTarget = - currentState.focusScenarioId != null || currentState.focusRunId != null - const urlProvided = typeof nextUrl === "string" && nextUrl.length > 0 - // Avoid racing against local open actions (no URL yet) while still reacting to - // deliberate URL transitions that remove the focus params. - const shouldReset = - currentState.isClosing || - (!currentState.open && hasStoredTarget) || - (urlProvided && currentState.open && hasStoredTarget && !currentState.isClosing) - - if (shouldReset) { - store.set(resetFocusDrawerAtom, null) - } - return - } - - const nextTarget = { - focusScenarioId: scenarioId, - focusRunId: runId ?? currentState.focusRunId ?? null, - } - - const alreadyOpen = - currentState.open && - currentState.focusScenarioId === nextTarget.focusScenarioId && - currentState.focusRunId === nextTarget.focusRunId - - if (alreadyOpen && !currentState.isClosing) { - return - } - - // Ensure target is up to date before opening (helps preserve data during transitions) - store.set(setFocusDrawerTargetAtom, nextTarget) - store.set(openFocusDrawerAtom, nextTarget) - } catch (err) { - console.error("Failed to sync focus drawer state from URL:", nextUrl, err) - } -} - -export const clearFocusDrawerQueryParams = () => { - if (!isBrowser) return - try { - const url = new URL(window.location.href) - let mutated = false - if (url.searchParams.has(FOCUS_SCENARIO_QUERY_KEY)) { - url.searchParams.delete(FOCUS_SCENARIO_QUERY_KEY) - mutated = true - } - if (url.searchParams.has(FOCUS_RUN_QUERY_KEY)) { - url.searchParams.delete(FOCUS_RUN_QUERY_KEY) - mutated = true - } - if (!mutated) return - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to clear focus drawer query params:", error) - }) - } catch (err) { - console.error("Failed to clear focus drawer query params:", err) - } -} - -export interface FocusDrawerPublicApi { - syncFocusDrawerStateFromUrl: (nextUrl?: string) => void - clearFocusDrawerQueryParams: () => void -} - -export default { - syncFocusDrawerStateFromUrl, - clearFocusDrawerQueryParams, -} satisfies FocusDrawerPublicApi diff --git a/web/oss/src/state/url/index.ts b/web/oss/src/state/url/index.ts deleted file mode 100644 index 94a74b005a..0000000000 --- a/web/oss/src/state/url/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -import {getDefaultStore} from "jotai" -import {eagerAtom} from "jotai-eager" - -import {appStateSnapshotAtom} from "@/oss/state/appState" -import {selectedOrgAtom} from "@/oss/state/org/selectors/org" - -import {recentAppIdAtom} from "../app" - -export interface URLState { - appId: string - workspaceId: string - workspaceName: string - projectId: string | null - baseOrgURL: string - orgURL: string - baseProjectURL: string - projectURL: string - baseAppURL: string - recentlyVisitedAppURL: string - appURL: string -} - -export const urlAtom = eagerAtom((get) => { - const snapshot = get(appStateSnapshotAtom) - const selectedOrg = get(selectedOrgAtom) - const recentlyVisitedAppId = get(recentAppIdAtom) - const {workspaceId, projectId, appId} = snapshot - - const workspaceName = selectedOrg?.name ?? "" - const resolvedWorkspaceId = workspaceId ?? selectedOrg?.id ?? "" - - const baseOrgURL = "/w" - // Build URLs with workspace id (not name) - const orgURL = resolvedWorkspaceId - ? `${baseOrgURL}/${encodeURIComponent(resolvedWorkspaceId)}` - : "" - const baseProjectURL = resolvedWorkspaceId ? `${orgURL}/p` : "" - const projectURL = - resolvedWorkspaceId && projectId ? `${baseProjectURL}/${encodeURIComponent(projectId)}` : "" - const baseAppURL = resolvedWorkspaceId && projectId ? `${projectURL}/apps` : "" - const appURL = - resolvedWorkspaceId && projectId && appId - ? `${baseAppURL}/${encodeURIComponent(appId)}` - : "" - - const recentlyVisitedAppURL = - resolvedWorkspaceId && projectId && recentlyVisitedAppId - ? `${baseAppURL}/${encodeURIComponent(recentlyVisitedAppId)}` - : "" - - return { - appId: appId ?? "", - workspaceId: resolvedWorkspaceId, - workspaceName, - projectId: projectId ?? null, - baseOrgURL, - orgURL, - baseProjectURL, - projectURL, - baseAppURL, - appURL, - recentlyVisitedAppURL, - } -}) - -export const getURLValues = () => { - const store = getDefaultStore() - return store.get(urlAtom) -} - -export interface WaitForUrlOptions { - // Wait until org is known - requireOrg?: boolean - // Wait until projectId-backed URLs are available - requireProject?: boolean - // Wait until appId-backed URLs are available - requireApp?: boolean - // Maximum time to wait before resolving with a best-effort URL - timeoutMs?: number -} - -const satisfies = (state: URLState, opts: WaitForUrlOptions) => { - const {requireOrg = false, requireProject = true, requireApp = false} = opts || {} - if (requireOrg && !state.workspaceName) return false - if (requireProject && !state.baseProjectURL) return false - if (requireApp && !state.appURL) return false - // For project-level readiness also ensure baseAppURL is known for convenience - if (requireProject && !state.baseAppURL) return false - return true -} - -// Promise that resolves when URL state becomes valid per options -export const waitForValidURL = (options: WaitForUrlOptions = {}): Promise => { - const store = getDefaultStore() - - return new Promise((resolve) => { - let unsub: () => void = () => {} - - const check = () => { - const current = store.get(urlAtom) - if (process.env.NEXT_PUBLIC_APP_STATE_DEBUG === "true") { - console.log("[url] waitForValidURL:tick", { - time: new Date().toISOString(), - current, - options, - }) - } - if (satisfies(current, options)) { - unsub() - resolve(current) - } - } - - unsub = store.sub(urlAtom, check) - check() - }) -} - -export {clearTraceParamAtom} from "./trace" diff --git a/web/oss/src/state/url/playground.ts b/web/oss/src/state/url/playground.ts deleted file mode 100644 index 82e3b90591..0000000000 --- a/web/oss/src/state/url/playground.ts +++ /dev/null @@ -1,198 +0,0 @@ -import {getDefaultStore} from "jotai" -import type {Store} from "jotai/vanilla" -import Router from "next/router" - -import { - selectedVariantsAtom, - viewTypeAtom, - urlRevisionsAtom, -} from "@/oss/components/Playground/state/atoms" -import {appStateSnapshotAtom} from "@/oss/state/appState" -import {revisionListAtom} from "@/oss/state/variant/selectors/variant" - -const isBrowser = typeof window !== "undefined" -const PLAYGROUND_PARAM = "playgroundRevisions" - -const sanitizeRevisionList = (values: (string | null | undefined)[]) => { - const seen = new Set() - const result: string[] = [] - values.forEach((value) => { - if (value === null || value === undefined) return - const str = String(value).trim() - if (!str || str === "null" || str === "undefined") return - if (seen.has(str)) return - seen.add(str) - result.push(str) - }) - return result -} - -const parseRevisionParam = (raw: string | null | undefined): string[] => { - if (!raw) return [] - const trimmed = raw.trim() - if (!trimmed) return [] - - const tryParse = (value: string): string[] => { - try { - const parsed = JSON.parse(value) - if (Array.isArray(parsed)) { - return sanitizeRevisionList( - parsed.map((item) => (item === null || item === undefined ? "" : String(item))), - ) - } - } catch { - // ignore - } - return [] - } - - const direct = tryParse(trimmed) - if (direct.length > 0) return direct - - try { - const decoded = tryParse(decodeURIComponent(trimmed)) - if (decoded.length > 0) return decoded - } catch { - // ignore decode failures - } - - if (trimmed.includes(",")) { - return sanitizeRevisionList(trimmed.split(",")) - } - - return sanitizeRevisionList([trimmed]) -} - -const arraysEqual = (a: string[], b: string[]) => { - if (a.length !== b.length) return false - for (let i = 0; i < a.length; i += 1) { - if (a[i] !== b[i]) return false - } - return true -} - -const serializeSelection = (selection: string[]) => - selection.length > 0 ? JSON.stringify(selection) : null - -export const writePlaygroundSelectionToQuery = async (selection: string[]) => { - if (!isBrowser) return - - try { - const sanitized = sanitizeRevisionList(selection) - const url = new URL(window.location.href) - const serialized = serializeSelection(sanitized) - const current = url.searchParams.get(PLAYGROUND_PARAM) - - if (serialized) { - if (current === serialized) return - url.searchParams.set(PLAYGROUND_PARAM, serialized) - } else if (current === null) { - return - } else { - url.searchParams.delete(PLAYGROUND_PARAM) - } - - const newPath = `${url.pathname}${url.search}${url.hash}` - await Router.replace(newPath, undefined, {shallow: true}) - } catch (error) { - console.error("Failed to write playground revisions to query:", error) - } -} - -const applyPlaygroundSelection = (store: Store, next: string[]) => { - const sanitized = sanitizeRevisionList(next) - const currentSelected = sanitizeRevisionList(store.get(selectedVariantsAtom)) - if (!arraysEqual(currentSelected, sanitized)) { - store.set(selectedVariantsAtom, sanitized) - } - - const currentUrlSelection = sanitizeRevisionList(store.get(urlRevisionsAtom)) - if (!arraysEqual(currentUrlSelection, sanitized)) { - store.set(urlRevisionsAtom, sanitized) - } - - const nextViewType = sanitized.length > 1 ? "comparison" : "single" - if (store.get(viewTypeAtom) !== nextViewType) { - store.set(viewTypeAtom, nextViewType) - } -} - -let lastPlaygroundAppId: string | null = null - -export const ensurePlaygroundDefaults = (store: Store) => { - if (!isBrowser) return - - const appState = store.get(appStateSnapshotAtom) - if (!appState.pathname?.includes("/playground")) return - - const selected = sanitizeRevisionList(store.get(selectedVariantsAtom)) - const urlSelection = sanitizeRevisionList(store.get(urlRevisionsAtom)) - if (selected.length > 0 || urlSelection.length > 0) return - - const revisions = store.get(revisionListAtom) as {id?: string}[] | undefined - if (!Array.isArray(revisions) || revisions.length === 0) return - - const latestRevisionId = revisions[0]?.id - if (!latestRevisionId) return - - applyPlaygroundSelection(store, [latestRevisionId]) -} - -export const syncPlaygroundStateFromUrl = (nextUrl?: string) => { - if (!isBrowser) return - - try { - const store = getDefaultStore() - const url = new URL(nextUrl ?? window.location.href, window.location.origin) - const isPlaygroundRoute = url.pathname.includes("/playground") - const appState = store.get(appStateSnapshotAtom) - const currentAppId = appState.appId ?? null - - const paramSelection = parseRevisionParam(url.searchParams.get(PLAYGROUND_PARAM)) - const currentSelected = sanitizeRevisionList(store.get(selectedVariantsAtom)) - const currentUrlSelection = sanitizeRevisionList(store.get(urlRevisionsAtom)) - - if (isPlaygroundRoute) { - if ( - lastPlaygroundAppId && - currentAppId && - lastPlaygroundAppId !== currentAppId && - paramSelection.length === 0 - ) { - if (currentSelected.length > 0) { - store.set(selectedVariantsAtom, []) - } - if (currentUrlSelection.length > 0) { - store.set(urlRevisionsAtom, []) - } - } - lastPlaygroundAppId = currentAppId - } else { - lastPlaygroundAppId = null - } - - let targetSelection: string[] = [] - // Apply precedence: explicit query param > pending urlRevisions state > persisted selection - if (paramSelection.length > 0) { - targetSelection = paramSelection - } else if (currentUrlSelection.length > 0) { - targetSelection = currentUrlSelection - } else if (currentSelected.length > 0) { - targetSelection = currentSelected - } - - if (isPlaygroundRoute) { - if (targetSelection.length > 0) { - applyPlaygroundSelection(store, targetSelection) - } - - ensurePlaygroundDefaults(store) - } else { - if (currentUrlSelection.length > 0) { - store.set(urlRevisionsAtom, []) - } - } - } catch (err) { - console.error("Failed to sync playground state from URL:", nextUrl, err) - } -} diff --git a/web/oss/src/state/url/postLoginRedirect.ts b/web/oss/src/state/url/postLoginRedirect.ts deleted file mode 100644 index e753d0f7e2..0000000000 --- a/web/oss/src/state/url/postLoginRedirect.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {getDefaultStore, type Store} from "jotai" - -import type {ProjectsResponse} from "@/oss/services/project/types" -import {appIdentifiersAtom} from "@/oss/state/appState" -import {orgsAtom, resolvePreferredWorkspaceId, selectedOrgIdAtom} from "@/oss/state/org" -import {userAtom} from "@/oss/state/profile/selectors/user" -import {projectAtom, projectsAtom} from "@/oss/state/project" - -const MAX_WAIT_MS = 4000 - -export interface WaitForWorkspaceContextOptions { - timeoutMs?: number - requireProjectId?: boolean - requireWorkspaceId?: boolean - requireOrgData?: boolean -} - -const projectMatchesWorkspace = (project: ProjectsResponse, workspaceId: string) => { - if (project.workspace_id && project.workspace_id === workspaceId) return true - if (project.organization_id && project.organization_id === workspaceId) return true - return false -} - -const pickPreferredProject = ( - projects: ProjectsResponse[], - workspaceId: string | null, -): ProjectsResponse | null => { - if (!Array.isArray(projects) || projects.length === 0) return null - - const scoped = workspaceId - ? projects.filter((project) => projectMatchesWorkspace(project, workspaceId)) - : projects - - const nonDemoScoped = scoped.find((project) => !project.is_demo) - if (nonDemoScoped) return nonDemoScoped - - if (scoped.length > 0) return scoped[0] - - const nonDemoAny = projects.find((project) => !project.is_demo) - return nonDemoAny ?? projects[0] -} - -export interface WorkspaceContext { - workspaceId: string | null - projectId: string | null -} - -const computeWorkspaceContext = (store: Store): WorkspaceContext => { - const identifiers = store.get(appIdentifiersAtom) - const userId = (store.get(userAtom) as {id?: string} | null)?.id ?? null - let workspaceId = identifiers.workspaceId - let projectId = identifiers.projectId - - if (!workspaceId) { - workspaceId = store.get(selectedOrgIdAtom) ?? null - } - - if (!workspaceId) { - const orgs = store.get(orgsAtom) - workspaceId = resolvePreferredWorkspaceId(userId, orgs) - } - - if (workspaceId && !projectId) { - const projects = store.get(projectsAtom) as ProjectsResponse[] - const preferred = pickPreferredProject(projects, workspaceId) - projectId = preferred?.project_id ?? null - if (!projectId) { - const fallbackProject = store.get(projectAtom) - projectId = fallbackProject?.project_id ?? null - } - } - - return {workspaceId: workspaceId ?? null, projectId: projectId ?? null} -} - -export const waitForWorkspaceContext = async ( - options: number | WaitForWorkspaceContextOptions = {}, -) => { - const store = getDefaultStore() - const normalizedOptions = - typeof options === "number" - ? { - timeoutMs: options, - requireProjectId: true, - requireWorkspaceId: true, - requireOrgData: false, - } - : { - timeoutMs: options.timeoutMs ?? MAX_WAIT_MS, - requireProjectId: options.requireProjectId ?? true, - requireWorkspaceId: options.requireWorkspaceId ?? true, - requireOrgData: options.requireOrgData ?? false, - } - - const {timeoutMs, requireProjectId, requireWorkspaceId, requireOrgData} = normalizedOptions - - return new Promise((resolve) => { - let settled = false - const start = Date.now() - const unsubscribers: (() => void)[] = [] - - const finalize = (value: WorkspaceContext) => { - if (settled) return - settled = true - unsubscribers.forEach((unsub) => unsub()) - resolve(value) - } - - const evaluate = () => { - const context = computeWorkspaceContext(store) - const orgs = store.get(orgsAtom) - const elapsed = Date.now() - start - - const hasWorkspace = Boolean(context.workspaceId) - const hasProject = Boolean(context.projectId) - const orgsReady = Array.isArray(orgs) && orgs.length > 0 - - const workspaceSatisfied = !requireWorkspaceId || hasWorkspace - const projectSatisfied = !requireProjectId || hasProject - const orgSatisfied = !requireOrgData || orgsReady || hasWorkspace - - if (workspaceSatisfied && projectSatisfied && orgSatisfied) { - finalize(context) - return true - } - - if (elapsed >= timeoutMs) { - finalize(context) - return true - } - - return false - } - - if (evaluate()) return - - unsubscribers.push( - store.sub(projectsAtom, evaluate), - store.sub(projectAtom, evaluate), - store.sub(selectedOrgIdAtom, evaluate), - store.sub(orgsAtom, evaluate), - store.sub(userAtom, evaluate), - ) - - setTimeout(() => finalize(computeWorkspaceContext(store)), timeoutMs) - }) -} - -export const buildPostLoginPath = ({workspaceId, projectId}: WorkspaceContext) => { - if (workspaceId && projectId) { - return `/w/${encodeURIComponent(workspaceId)}/p/${encodeURIComponent(projectId)}/apps` - } - if (workspaceId) { - return `/w/${encodeURIComponent(workspaceId)}` - } - return "/w" -} diff --git a/web/oss/src/state/url/routeMatchers.ts b/web/oss/src/state/url/routeMatchers.ts deleted file mode 100644 index a1f7cca639..0000000000 --- a/web/oss/src/state/url/routeMatchers.ts +++ /dev/null @@ -1,13 +0,0 @@ -const TRACE_ENABLED_PATH_MATCHERS = [ - "/observability", - "/traces", - "/playground", - "/evaluations", -] as const -const VARIANT_ENABLED_PATH_MATCHERS = ["/variants", "/deployments", "/overview"] as const - -export const isTraceSupportedRoute = (pathname: string) => - TRACE_ENABLED_PATH_MATCHERS.some((segment) => pathname.includes(segment)) - -export const isVariantSupportedRoute = (pathname: string) => - VARIANT_ENABLED_PATH_MATCHERS.some((segment) => pathname.includes(segment)) diff --git a/web/oss/src/state/url/test.ts b/web/oss/src/state/url/test.ts deleted file mode 100644 index 9888f62e69..0000000000 --- a/web/oss/src/state/url/test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import type {ParsedUrlQuery} from "querystring" - -import {atom, getDefaultStore} from "jotai" -import type {Store} from "jotai/vanilla" -import Router from "next/router" - -import {setLocationAtom, parseRouterState} from "@/oss/state/appState" -import {sessionLoadingAtom} from "@/oss/state/session" -import focusDrawerState from "@/oss/state/url/focusDrawer" - -import {syncAuthStateFromUrl} from "./auth" -import {syncPlaygroundStateFromUrl} from "./playground" -import {syncTraceStateFromUrl} from "./trace" -import {syncVariantStateFromUrl} from "./variant" - -export {protectedRouteReadyAtom, activeInviteAtom} from "./auth" -export {traceIdAtom, clearTraceQueryParam, clearTraceParamAtom} from "./trace" - -const isBrowser = typeof window !== "undefined" - -let lastLocationSignature: string | null = null - -const buildQueryFromUrl = (url: URL): ParsedUrlQuery => { - const query: ParsedUrlQuery = {} - url.searchParams.forEach((value, key) => { - if (query[key] === undefined) { - query[key] = value - return - } - if (Array.isArray(query[key])) { - ;(query[key] as string[]).push(value) - return - } - query[key] = [query[key] as string, value] - }) - return query -} - -const syncAppLocation = (store: Store, nextUrl?: string) => { - if (!isBrowser) return - try { - let pathname = Router.pathname - let asPath = Router.asPath - let query: ParsedUrlQuery = Router.query - - if (nextUrl) { - const url = new URL(nextUrl, window.location.origin) - pathname = url.pathname - asPath = `${url.pathname}${url.search}${url.hash}` - query = buildQueryFromUrl(url) - } - - const parsed = parseRouterState({pathname, asPath, query}) - const signature = `${parsed.pathname}|${parsed.asPath}` - if (signature === lastLocationSignature) return - lastLocationSignature = signature - store.set(setLocationAtom, parsed) - } catch (error) { - console.error("Failed to sync app location from URL:", nextUrl, error) - } -} - -const syncUrlState = (nextUrl?: string) => { - const store = getDefaultStore() - syncAppLocation(store, nextUrl) - syncTraceStateFromUrl(nextUrl) - syncVariantStateFromUrl(nextUrl) - - if (typeof focusDrawerState?.syncFocusDrawerStateFromUrl === "function") { - focusDrawerState.syncFocusDrawerStateFromUrl(nextUrl) - } - syncPlaygroundStateFromUrl(nextUrl) - syncAuthStateFromUrl(nextUrl) -} - -export const urlQuerySyncAtom = atom(0) - -urlQuerySyncAtom.onMount = (set) => { - if (!isBrowser) return - - const store = getDefaultStore() - - const notify = () => set((prev) => prev + 1) - - const handleRouteChange = (nextUrl: string) => { - syncUrlState(nextUrl) - notify() - } - - const handleHashChange = () => { - syncUrlState() - notify() - } - - let lastSessionLoading = store.get(sessionLoadingAtom) - const unsubSessionLoading = store.sub(sessionLoadingAtom, () => { - const current = store.get(sessionLoadingAtom) - if (lastSessionLoading && !current) { - syncAuthStateFromUrl() - } - lastSessionLoading = current - }) - syncUrlState() - - Router.events.on("beforeHistoryChange", handleRouteChange) - Router.events.on("routeChangeComplete", handleRouteChange) - window.addEventListener("hashchange", handleHashChange) - - return () => { - Router.events.off("beforeHistoryChange", handleRouteChange) - Router.events.off("routeChangeComplete", handleRouteChange) - window.removeEventListener("hashchange", handleHashChange) - unsubSessionLoading() - } -} - -export const clearVariantQueryParam = () => { - if (!isBrowser) return - try { - const url = new URL(window.location.href) - const hadRevisionParam = url.searchParams.has("revisionId") - const hadLegacyParam = url.searchParams.has("revisions") - const hadDrawerTypeParam = url.searchParams.has("drawerType") - if (!hadRevisionParam && !hadLegacyParam && !hadDrawerTypeParam) return - - if (hadRevisionParam) { - url.searchParams.delete("revisionId") - } - if (hadLegacyParam) { - url.searchParams.delete("revisions") - } - if (hadDrawerTypeParam) { - url.searchParams.delete("drawerType") - } - - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to clear variant drawer query params:", error) - }) - } catch (err) { - console.error("Failed to clear variant drawer query params:", err) - } -} diff --git a/web/oss/src/state/url/trace.ts b/web/oss/src/state/url/trace.ts deleted file mode 100644 index 536b6dff3d..0000000000 --- a/web/oss/src/state/url/trace.ts +++ /dev/null @@ -1,113 +0,0 @@ -import {atom, getDefaultStore} from "jotai" -import Router from "next/router" - -import { - initialTraceDrawerState, - openTraceDrawerAtom, - setTraceDrawerActiveSpanAtom, - traceDrawerAtom, -} from "@/oss/components/Playground/Components/Drawers/TraceDrawer/store/traceDrawerStore" -import {selectedNodeAtom, selectedTraceIdAtom} from "@/oss/state/newObservability/atoms/controls" - -import {isTraceSupportedRoute} from "./routeMatchers" - -const isBrowser = typeof window !== "undefined" - -export const traceIdAtom = atom(undefined) - -export const clearTraceDrawerState = () => { - const store = getDefaultStore() - const current = store.get(traceDrawerAtom) - - if (current.open || current.traceId || current.activeSpanId) { - store.set(traceDrawerAtom, () => ({...initialTraceDrawerState})) - } - - store.set(traceIdAtom, undefined) - store.set(selectedTraceIdAtom, "") - store.set(selectedNodeAtom, "") -} - -export const syncTraceStateFromUrl = (nextUrl?: string) => { - if (!isBrowser) return - - try { - const store = getDefaultStore() - const url = new URL(nextUrl ?? window.location.href, window.location.origin) - const traceParam = url.searchParams.get("trace") ?? undefined - const routeSupportsTrace = isTraceSupportedRoute(url.pathname) - const spanParam = url.searchParams.get("span") ?? undefined - const currentTraceId = store.get(traceIdAtom) - const currentDrawerState = store.get(traceDrawerAtom) - - if (!routeSupportsTrace) { - if (traceParam || url.searchParams.has("span")) { - if (traceParam) { - url.searchParams.delete("trace") - } - if (url.searchParams.has("span")) { - url.searchParams.delete("span") - } - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to remove unsupported trace query params:", error) - }) - } - if (currentTraceId !== undefined) { - clearTraceDrawerState() - } - return - } - - if (!traceParam) { - if (currentTraceId !== undefined) { - clearTraceDrawerState() - } - return - } - - if (currentDrawerState.open && currentTraceId === traceParam) { - return - } - - store.set(traceIdAtom, traceParam) - store.set(selectedTraceIdAtom, traceParam) - store.set(selectedNodeAtom, spanParam ?? "") - - store.set(openTraceDrawerAtom, { - traceId: traceParam, - activeSpanId: spanParam ?? null, - }) - - store.set(setTraceDrawerActiveSpanAtom, spanParam ?? null) - } catch (err) { - console.error("Failed to sync trace state from URL:", nextUrl, err) - } -} - -export const clearTraceQueryParam = () => { - if (!isBrowser) return - try { - const url = new URL(window.location.href) - let mutated = false - if (url.searchParams.has("trace")) { - url.searchParams.delete("trace") - mutated = true - } - if (url.searchParams.has("span")) { - url.searchParams.delete("span") - mutated = true - } - if (!mutated) return - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to clear trace query params:", error) - }) - } catch (err) { - console.error("Failed to clear trace query params:", err) - } -} - -export const clearTraceParamAtom = atom(null, (_get, _set) => { - clearTraceQueryParam() -}) diff --git a/web/oss/src/state/url/variant.ts b/web/oss/src/state/url/variant.ts deleted file mode 100644 index 5ab97d243e..0000000000 --- a/web/oss/src/state/url/variant.ts +++ /dev/null @@ -1,133 +0,0 @@ -import {getDefaultStore} from "jotai" -import Router from "next/router" - -import { - variantDrawerAtom, - drawerVariantIdAtom, -} from "@/oss/components/VariantsComponents/Drawers/VariantDrawer/store/variantDrawerStore" -import {revisionListAtom} from "@/oss/state/variant/selectors/variant" - -import {isVariantSupportedRoute} from "./routeMatchers" - -const isBrowser = typeof window !== "undefined" - -export const clearVariantDrawerState = () => { - const store = getDefaultStore() - const current = store.get(variantDrawerAtom) - - if (current.open || current.selectedVariantId) { - store.set(variantDrawerAtom, (draft) => { - draft.open = false - draft.selectedVariantId = undefined - draft.type = "variant" - }) - store.set(drawerVariantIdAtom, null) - } -} - -const resolveDrawerTypeForPath = (pathname: string): "variant" | "deployment" => { - if (pathname.includes("/deployments")) { - return "deployment" - } - return "variant" -} - -export const syncVariantStateFromUrl = (nextUrl?: string) => { - if (!isBrowser) return - - try { - const store = getDefaultStore() - const url = new URL(nextUrl ?? window.location.href, window.location.origin) - const revisionParam = url.searchParams.get("revisionId") - const resolvedRevisionId = revisionParam?.trim() || undefined - const drawerTypeParam = url.searchParams.get("drawerType") - const routeSupportsVariant = isVariantSupportedRoute(url.pathname) - const currentState = store.get(variantDrawerAtom) - - const sanitizeDrawerType = (value: string | null): "variant" | "deployment" | undefined => { - if (!value) return undefined - const normalized = value.trim().toLowerCase() - if (normalized === "deployment") return "deployment" - if (normalized === "variant") return "variant" - return undefined - } - - const ensureUrlClean = () => { - let mutated = false - if (url.searchParams.has("revisions")) { - url.searchParams.delete("revisions") - mutated = true - } - if (url.searchParams.has("drawerType")) { - const sanitized = sanitizeDrawerType(url.searchParams.get("drawerType")) - if (!sanitized) { - url.searchParams.delete("drawerType") - mutated = true - } else if (url.searchParams.get("drawerType") !== sanitized) { - url.searchParams.set("drawerType", sanitized) - mutated = true - } - } - if (mutated) { - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to normalize variant drawer query params:", error) - }) - } - } - - if (!routeSupportsVariant) { - if ( - (revisionParam && revisionParam.trim()) || - url.searchParams.has("revisions") || - url.searchParams.has("drawerType") - ) { - url.searchParams.delete("revisionId") - url.searchParams.delete("revisions") - url.searchParams.delete("drawerType") - const newPath = `${url.pathname}${url.search}${url.hash}` - void Router.replace(newPath, undefined, {shallow: true}).catch((error) => { - console.error("Failed to remove unsupported variant query params:", error) - }) - } - clearVariantDrawerState() - store.set(drawerVariantIdAtom, null) - return - } - - if (!resolvedRevisionId) { - ensureUrlClean() - if (currentState.open || currentState.selectedVariantId) { - clearVariantDrawerState() - } - store.set(drawerVariantIdAtom, null) - return - } - - ensureUrlClean() - - const desiredType = - sanitizeDrawerType(drawerTypeParam) ?? resolveDrawerTypeForPath(url.pathname) - - if ( - currentState.selectedVariantId === resolvedRevisionId && - currentState.open && - currentState.type === desiredType - ) { - store.set(drawerVariantIdAtom, resolvedRevisionId) - return - } - - store.set(variantDrawerAtom, (draft) => { - if (!draft.variantsAtom) { - draft.variantsAtom = revisionListAtom - } - draft.type = desiredType - draft.open = true - draft.selectedVariantId = resolvedRevisionId - }) - store.set(drawerVariantIdAtom, resolvedRevisionId) - } catch (err) { - console.error("Failed to sync variant drawer state from URL:", nextUrl, err) - } -} diff --git a/web/oss/src/state/utils/devLog.ts b/web/oss/src/state/utils/devLog.ts deleted file mode 100644 index e96f99b60b..0000000000 --- a/web/oss/src/state/utils/devLog.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type {PrimitiveAtom} from "jotai" - -import {logAtom} from "./logAtom" - -/** - * Conditionally wraps an atom with logAtom based on env flag. - * Usage: - * devLog(myAtom, 'myAtom', process.env.NEXT_PUBLIC_LOG_MY_FEATURE === 'true') - */ -export function devLog(atom: PrimitiveAtom, name: string, flag: boolean) { - if (flag) logAtom(atom, name) -} diff --git a/web/oss/src/state/utils/logAtom.ts b/web/oss/src/state/utils/logAtom.ts deleted file mode 100644 index 308a4b454b..0000000000 --- a/web/oss/src/state/utils/logAtom.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Atom, getDefaultStore} from "jotai" - -const globalEnabled = process.env.NEXT_PUBLIC_ENABLE_ATOM_LOGS === "true" - -export function logAtom(atom: Atom, label: string, enabled = globalEnabled) { - if (!enabled) return - const store = getDefaultStore() - queueMicrotask(() => { - store.sub(atom, () => { - console.debug(`[atom-log] ${label}`, store.get(atom)) - }) - }) -} diff --git a/web/oss/src/state/utils/projectUtils.ts b/web/oss/src/state/utils/projectUtils.ts deleted file mode 100644 index a75a26b69f..0000000000 --- a/web/oss/src/state/utils/projectUtils.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Project Utility Functions - * - * Shared utilities for project-related operations across the state management system - */ - -/** - * Get the current project ID from environment or context - * Used by API functions that need project scoping - */ -export const getProjectId = (): string | null => { - // In test environment, use test project ID - if (typeof process !== "undefined" && process.env.NODE_ENV === "test") { - return process.env.VITEST_TEST_PROJECT_ID || null - } - - // In browser environment, this would typically come from router or context - // For now, return null and let the calling code handle it - return null -} diff --git a/web/oss/src/state/utils/stringStorage.ts b/web/oss/src/state/utils/stringStorage.ts deleted file mode 100644 index 364e9628e1..0000000000 --- a/web/oss/src/state/utils/stringStorage.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const stringStorage = { - getItem: (key: string, initialValue: string | null) => { - if (typeof window === "undefined") return initialValue - const storedValue = localStorage.getItem(key) - return storedValue ?? initialValue - }, - setItem: (key: string, newValue: string | null) => { - if (typeof window === "undefined") return - if (newValue === null) { - localStorage.removeItem(key) - } else { - localStorage.setItem(key, newValue) - } - }, - removeItem: (key: string) => { - if (typeof window === "undefined") return - localStorage.removeItem(key) - }, -} diff --git a/web/oss/src/state/variant/atoms/appStatus.ts b/web/oss/src/state/variant/atoms/appStatus.ts deleted file mode 100644 index 3ebe08d7fc..0000000000 --- a/web/oss/src/state/variant/atoms/appStatus.ts +++ /dev/null @@ -1,37 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {currentAppAtom} from "@/oss/state/app" - -import {appUriStateQueryAtom, appStatusLoadingAtom} from "./fetcher" - -/** - * App Status Management (app-wide) - * - * Status is true when the app-level OpenAPI schema is available. - */ - -// Global app status for the current app (app-wide) -// True only when OpenAPI query is successful AND schema is present. -// This leverages polling on custom apps to keep status up to date. -export const appStatusAtom = atom((get) => { - const q: any = get(appUriStateQueryAtom) - const hasSchema = Boolean(q?.data?.schema ?? q?.schema) - return (q?.status ?? "loading") === "success" && hasSchema -}) - -// Legacy atom family for backwards compatibility (derives from query) -export const variantAppStatusAtomFamily = atomFamily((variantId: string) => - atom((get) => get(appStatusAtom)), -) - -// Derived atom to get app status for current variant (alias to app-wide status) -export const currentVariantAppStatusAtom = appStatusAtom - -// Single selector for CustomWorkflowBanner visibility (centralized) -export const customWorkflowBannerVisibleAtom = atom((get) => { - const currentApp = get(currentAppAtom) - const isAppUp = get(appStatusAtom) - const isLoading = get(appStatusLoadingAtom) - return currentApp?.app_type === "custom" && !isLoading && !isAppUp -}) diff --git a/web/oss/src/state/variant/atoms/fetcher.ts b/web/oss/src/state/variant/atoms/fetcher.ts deleted file mode 100644 index f9110a1248..0000000000 --- a/web/oss/src/state/variant/atoms/fetcher.ts +++ /dev/null @@ -1,526 +0,0 @@ -// type-only imports first (eslint import/order) -import deepEqual from "fast-deep-equal" -import {atom, getDefaultStore} from "jotai" -import {atomFamily, loadable, selectAtom} from "jotai/utils" -import {queryClientAtom} from "jotai-tanstack-query" -import {atomWithQuery} from "jotai-tanstack-query" - -import {formatDay, parseDate} from "@/oss/lib/helpers/dateTimeHelper" -import {snakeToCamel} from "@/oss/lib/helpers/utils" -import {adaptRevisionToVariant} from "@/oss/lib/shared/variant" -import {fetchRevisions} from "@/oss/lib/shared/variant/api" -import {fetchOpenApiSchemaJson} from "@/oss/lib/shared/variant/transformer" -import type {EnhancedVariant} from "@/oss/lib/shared/variant/transformer/types" -import {findRevisionDeployment} from "@/oss/lib/shared/variant/utils" -import type {Variant, VariantRevision} from "@/oss/lib/Types" -import {fetchSingleProfile} from "@/oss/services/api" -import {fetchVariants as fetchAppVariants} from "@/oss/services/api" -import {routerAppIdAtom, recentAppIdAtom} from "@/oss/state/app/atoms/fetcher" -import {environmentsAtom} from "@/oss/state/environment/atoms/fetcher" -import {currentAppContextAtom, selectedAppIdAtom} from "@/oss/state/app/selectors/app" -import {projectIdAtom} from "@/oss/state/project/selectors/project" - -// Utility: check if a string is a canonical UUID (v1–v5) -const isUuid = (val: string): boolean => - /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(val) - -// basic completeness check – treat stub objects (missing username/email) as incomplete -const isCompleteUser = (u: any): boolean => - !!u && typeof u.username === "string" && typeof u.email === "string" - -// -------- Variants list for current app ------------------------------------ -export const variantsQueryAtom = atomWithQuery((get) => { - const projectId = get(projectIdAtom) - const routerAppId = get(routerAppIdAtom) - const appId = routerAppId ?? get(recentAppIdAtom) ?? undefined - - // Enable query only when we resolved an app id (router or recent) and the project is known - const enabled = !!appId && !!projectId - - return { - queryKey: ["variants", appId, projectId], - queryFn: async () => { - const data = await fetchAppVariants(appId as string, false) - - return data - }, - staleTime: 1000 * 60, - refetchOnWindowFocus: true, - refetchOnReconnect: true, - refetchOnMount: false, - enabled, - } -}) - -// Expose variants list (resolved data) --------------------------------------- -const EmptyVariants: Variant[] = [] -export const variantsAtom = selectAtom( - variantsQueryAtom, - (res) => { - const raw: Variant[] = ((res as any)?.data ?? EmptyVariants) as Variant[] - if (raw.length === 0) return EmptyVariants - - // Deduplicate by variantId keeping newest timestamp - const byId = new Map() - for (const v of raw) { - const existing = byId.get(v.variantId) - if (!existing || existing.createdAtTimestamp < v.createdAtTimestamp) { - byId.set(v.variantId, v) - } - } - // Sort descending by createdAtTimestamp - return Array.from(byId.values()).sort((a, b) => b.createdAtTimestamp - a.createdAtTimestamp) - }, - deepEqual, -) - -// -------- Revisions per variant (atomFamily) -------------------------------- -export const variantRevisionsQueryFamily = atomFamily((variantId: string) => - atomWithQuery((get) => { - const projectId = get(projectIdAtom) - // Depend on variants query to ensure revisions refetch when variants change - const variantsQuery = get(variantsQueryAtom) - const enabled = !!variantId && !!projectId - return { - queryKey: ["variantRevisions", variantId, variantsQuery.dataUpdatedAt], - queryFn: async () => { - const parentVariant = variantsQuery.data?.find((v) => v.variantId === variantId) - const apiRevs = await fetchRevisions(variantId, projectId!) - - const revs = apiRevs.map((r, idx) => { - const rev = { - // spread retains camel-cased util outputs if any - ...r, - variantId, - variantName: parentVariant?.variantName, - createdAt: formatDay({ - date: r.created_at, - inputFormat: "YYYY-MM-DD HH:mm:ss.SSSZ", - }), - createdAtTimestamp: parseDate({ - date: r.created_at, - inputFormat: "YYYY-MM-DD HH:mm:ss.SSSZ", - }) - .toDate() - .valueOf(), - updatedAtTimestamp: - (r.updated_at ?? r.created_at) - ? parseDate({ - date: r.updated_at ?? r.created_at, - inputFormat: "YYYY-MM-DD HH:mm:ss.SSSZ", - }) - .toDate() - .valueOf() - : null, - } - - const adapted = adaptRevisionToVariant(rev, parentVariant) - adapted.uri = parentVariant?.uri ?? adapted?.uri - return adapted - }) as VariantRevision[] - - return revs - }, - staleTime: 1000 * 60, - refetchOnWindowFocus: true, - refetchOnReconnect: true, - refetchOnMount: false, - placeholderData: (previousData) => { - const previousVariantId = previousData?.map((v) => v.variantId) - if (previousVariantId?.includes(variantId)) { - return previousData - } - return [] - }, - enabled, - } - }), -) - -// Normalized: expose revisions array directly per variantId (new in Phase 2) -export const revisionsByVariantIdAtomFamily = atomFamily( - (variantId: string) => - selectAtom(variantRevisionsQueryFamily(variantId), (res) => { - const data = (res as any)?.data ?? res - return (Array.isArray(data) ? data : []) as VariantRevision[] - }), - deepEqual, -) - -// -------- Central: all revisions flattened across variants ------------------ -export const allRevisionsAtom = atom((get) => { - const vars = get(variantsAtom) - const out: EnhancedVariant[] = [] - vars.forEach((v) => { - const revs = (get(revisionsByVariantIdAtomFamily(v.variantId)) as any[]) || [] - revs.forEach((r: any) => { - if (r && Number(r.revision) > 0) out.push(r as EnhancedVariant) - }) - }) - - return out -}) - -// -------- Centralized enhanced revisions (flat + map) ------------------------ -// Build flattened enhanced revisions list using normalized atoms -export const enhancedRevisionsFlatAtom = atom((get) => { - const vars = get(variantsAtom) - const out: EnhancedVariant[] = [] - vars.forEach((v: any) => { - const revs = get(revisionsByVariantIdAtomFamily(v.variantId)) as any[] - ;(revs || []).forEach((r: any) => { - if (r && Number(r.revision) > 0) out.push(r as EnhancedVariant) - }) - }) - return out -}) - -// Sorted enhanced revisions newest-first -export const sortedEnhancedRevisionsAtom = selectAtom( - enhancedRevisionsFlatAtom, - (list: EnhancedVariant[]) => - list - .slice() - .sort( - (a: EnhancedVariant, b: EnhancedVariant) => - b.updatedAtTimestamp - a.updatedAtTimestamp, - ), -) - -// Revision map variantId -> enhanced revisions[] (newest-first) -export const revisionMapAtom = atom>((get) => { - const vars = get(variantsAtom) as any[] - const map: Record = {} - vars.forEach((v: any) => { - const revs = get(revisionsByVariantIdAtomFamily(v.variantId)) as any[] - const arr: EnhancedVariant[] = [] - ;(revs || []).forEach((r: any) => { - if (r && Number(r.revision) > 0) arr.push(r as EnhancedVariant) - }) - map[v.variantId] = arr.sort( - (a: EnhancedVariant, b: EnhancedVariant) => b.updatedAtTimestamp - a.updatedAtTimestamp, - ) - }) - return map -}) - -// -------- App-level OpenAPI spec/URI (single source of truth) --------------- - -// Unified query: fetch openapi.json ONCE for the app and derive uri info & schema -export interface UriState { - runtimePrefix: string - routePath?: string - schema: any -} - -export const appUriStateQueryAtom = atomWithQuery((get) => { - const variants = get(variantsAtom) - const firstUri = (variants[0] as any)?.uri as string | undefined - const appType = get(currentAppContextAtom)?.appType || null - const isCustomApp = appType === "custom" - - const fetchRecursive = async (current: string, removed = ""): Promise => { - const result = await fetchOpenApiSchemaJson(current) - if (result.schema) { - return { - runtimePrefix: current, - routePath: removed || undefined, - schema: result.schema, - } - } - const parts = current.split("/") - const popped = parts.pop()! - if (parts.length === 0) { - throw new Error("openapi.json not found") - } - return fetchRecursive(parts.join("/"), removed ? `${popped}/${removed}` : popped) - } - - const currentAppId = get(selectedAppIdAtom) - return { - queryKey: ["appSpec", currentAppId, firstUri ?? ""], - queryFn: () => (firstUri ? fetchRecursive(firstUri) : Promise.resolve(undefined)), - staleTime: isCustomApp ? undefined : 1000 * 60 * 5, - placeholderData: (previousData) => previousData, - enabled: !!firstUri, - refetchInterval: isCustomApp ? 1000 * 60 * 1 : false, - } -}) - -// appStatus is Loading atom family. by looking at the query atom loading status -export const appStatusLoadingAtom = selectAtom( - appUriStateQueryAtom, - (q: any) => !q?.isFetched, - Object.is, -) - -// Backwards-compatible app-level simple selector (runtimePrefix/routePath) -export const appUriStateAtom = selectAtom(appUriStateQueryAtom, (res) => (res as any)?.data ?? res) - -export const appSchemaAtom = selectAtom( - appUriStateQueryAtom, - (res) => (res as any)?.data?.schema ?? (res as any)?.schema, -) - -export const appUriInfoAtom = selectAtom(appUriStateQueryAtom, (res) => { - const data: any = (res as any)?.data ?? res - if (!data) return undefined - return {runtimePrefix: data.runtimePrefix, routePath: data.routePath} -}) - -// Centralized lazy getter for OpenAPI spec -export const getSpecLazy = () => { - try { - const store = getDefaultStore() - const schema = store.get(appSchemaAtom) as any - return schema || null - } catch { - return null - } -} - -// -------- User profiles ------------------------------------------------------ - -// Collect all user IDs appearing in variants or their revisions -const userIdsAtom = atom((get) => { - const variants = get(variantsAtom) as any[] - const ids = new Set() - - variants.forEach((v) => { - const modBy = - (v as any).modifiedById ?? - (v as any).modifiedBy ?? - (v as any).modified_by_id ?? - (v as any).modified_by - const crtBy = (v as any).createdBy ?? (v as any).created_by - if (modBy && isUuid(String(modBy))) ids.add(String(modBy)) - if (crtBy && isUuid(String(crtBy))) ids.add(String(crtBy)) - - // collect from revisions of this variant via normalized family - const revs = get(revisionsByVariantIdAtomFamily(v.variantId)) as any[] - revs.forEach((r) => { - const m = - (r as any).modifiedById ?? - r.modifiedBy ?? - (r as any).modified_by_id ?? - r.modified_by - const c = r.createdBy ?? r.created_by - if (m && isUuid(String(m))) ids.add(String(m)) - if (c && isUuid(String(c))) ids.add(String(c)) - }) - }) - return Array.from(ids) -}) - -// Normalized: global reverse index of revisions by id -> {variantId} -export const revisionIndexAtom = atom((get) => { - const variants = get(variantsAtom) - const index = new Map() - variants.forEach((v) => { - const revs = get(revisionsByVariantIdAtomFamily(v.variantId)) - ;(revs || []).forEach((r) => { - index.set(r.id, {variantId: v.variantId}) - }) - }) - return index -}) - -// ID routing map: revisionId -> variantId (built from revisionIndexAtom) -export const revisionIdToVariantIdAtom = atom((get) => { - const idx = get(revisionIndexAtom) as Map - const out: Record = {} - idx.forEach((val, key) => { - out[key] = val.variantId - }) - return out -}) - -// Cheap selector: per-revision data via routing to the correct variant slice -export const enhancedRevisionByIdAtomFamily = atomFamily( - (revisionId: string) => - atom((get) => { - const map = get(revisionIdToVariantIdAtom) - const variantId = map[revisionId] - if (!variantId) return undefined - const revs = get(revisionsByVariantIdAtomFamily(variantId)) as any[] - return revs?.find((r: any) => r.id === revisionId) as EnhancedVariant | undefined - }), - deepEqual, -) - -// Backwards-compatible helper using the routing map -export function getEnhancedRevisionById( - get: (an: any) => any, - revisionId: string, -): EnhancedVariant | undefined { - const map = get(revisionIdToVariantIdAtom) - const variantId = map[revisionId] - if (!variantId) return undefined - const revs = get(revisionsByVariantIdAtomFamily(variantId)) as any[] - return revs?.find((r: any) => r.id === revisionId) as EnhancedVariant | undefined -} - -export const userProfilesMapAtom = atomWithQuery>((get) => { - const ids = get(userIdsAtom) - return { - queryKey: ["user-profiles", ids], - enabled: ids.length > 0, - staleTime: 60_000, - placeholderData: (previousData) => previousData, - queryFn: async () => { - const map = new Map() - const missingSet = new Set(ids) - const qc = get(queryClientAtom) - - // 1. Check query cache for any User objects - qc.getQueryCache() - .getAll() - .forEach((q) => { - const data: any = q.state.data - if (!data) return - const add = (u: any) => { - if (u && u.id && ids.includes(String(u.id))) { - if (isCompleteUser(u)) { - map.set(String(u.id), u) - missingSet.delete(String(u.id)) - } - } - } - if (Array.isArray(data)) { - data.forEach((d) => { - // direct user objects - add(d) - // workspace entry shape {user: {...}} - if (d?.user) add(d.user) - }) - } else if (typeof data === "object") { - add(data) - if (data?.user) add(data.user) - if (Array.isArray(data?.users)) data.users.forEach(add) - } - }) - - // 2. Determine which ids are still missing after cache scan or incomplete profiles - const missing = Array.from(missingSet) - - // 3. Fetch remaining or incomplete profiles in batch - if (missing.length) { - const fetched = await Promise.all( - missing.map((id) => fetchSingleProfile(id, true).catch(() => null)), - ) - fetched.forEach((p) => p && map.set(String(p.id), p)) - } - return map - }, - } -}) - -// -------- Derived: enhanced variants --------------------------------------- - -// Loadable wrapper exposing {state, data, error} -export const enhancedVariantsLoadableAtom = loadable(variantsAtom) - -// -------- Composite loading state atoms ------------------------------------- -// Variants query loading state -export const variantsLoadingAtom = selectAtom( - variantsQueryAtom, - (res) => ((res as any)?.status ?? "loading") !== "success", -) - -// True while any revision query is not yet successful -// Map of variantId -> whether its revisions query has fetched at least once -export const revisionsFetchedMapAtom = atom((get) => { - const list = get(variantsAtom) as any[] - const map: Record = {} - list.forEach((v) => { - const q = get(variantRevisionsQueryFamily((v as any).variantId)) as any - const fetched = - Boolean(q?.isSuccess) || (typeof q?.dataUpdatedAt === "number" && q.dataUpdatedAt > 0) - map[(v as any).variantId] = fetched - }) - return map -}) - -export const revisionsPendingAtom = atom((get) => { - const list = get(variantsAtom) as any[] - if (!list || list.length === 0) return true - return list.some((v) => { - const q = get(variantRevisionsQueryFamily((v as any).variantId)) as any - const isSuccess = Boolean(q?.isSuccess) || (q?.status ?? "loading") === "success" - const fetchedOnce = - isSuccess || (typeof q?.dataUpdatedAt === "number" && q.dataUpdatedAt > 0) - return !fetchedOnce || q?.fetchStatus === "fetching" - }) -}) - -// True while any spec/schema for a variant is not yet available -export const specsPendingAtom = atom((get) => { - // In the new structure, OpenAPI spec is fetched once per app via appUriStateQueryAtom/appSchemaAtom - // Consider specs pending until the unified app schema is available - const schema = get(appSchemaAtom) - return !schema -}) - -// Aggregate loading state across variants, revisions, specs, and enhancement readiness -export const allVariantsLoadingAtom = atom((get) => { - const isVariantsLoading = get(variantsLoadingAtom) - const isRevisionsPending = get(revisionsPendingAtom) - const isSpecsPending = get(specsPendingAtom) - // Keep "enhanced" readiness simple in current structure: ensure base variants are loaded - // enhancedVariantsLoadableAtom wraps variantsAtom; if variants aren't ready, it's pending - const isEnhancedPending = get(enhancedVariantsLoadableAtom).state !== "hasData" - - return isVariantsLoading || isRevisionsPending || isSpecsPending || isEnhancedPending -}) - -// -------- Deployment Revisions with Variant Mapping ---------------------- - -// Optimized: per-environment deployed variant selector (proper atomFamily) -export const deployedVariantByEnvironmentAtomFamily = atomFamily((envName: string) => - atom((get) => { - const environments = get(environmentsAtom) - const targetEnv = environments.find((e: any) => e.name === envName) - if (!targetEnv) return null - - const enhancedVariants = get(variantsAtom) - const targetRevisionId = targetEnv.deployedAppVariantRevisionId - // Find the first variant whose revisions include the deployed revision - for (const variant of enhancedVariants) { - const revisions = get(revisionsByVariantIdAtomFamily(variant.variantId)) - if ( - Array.isArray(revisions) && - revisions.some((revision) => revision.id === targetRevisionId) - ) { - return variant - } - } - return null - }), -) - -export const deployedRevisionByEnvironmentAtomFamily = atomFamily((envName: string) => - atom((get) => { - const environments = get(environmentsAtom) - const targetEnv = environments.find((e: any) => e.name === envName) - if (!targetEnv) return null - - const targetRevisionId = targetEnv.deployedAppVariantRevisionId - const revision = get(enhancedRevisionByIdAtomFamily(targetRevisionId)) - - return revision - }), -) - -// -------- Derived: per-revision deployment info (no mutation) -------------- -export const revisionDeploymentAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - const envs = get(environmentsAtom) as any[] - const camel = envs.map((env: any) => - Object.fromEntries(Object.entries(env).map(([k, v]) => [snakeToCamel(k), v])), - ) as any[] - return findRevisionDeployment(revisionId, camel) - }), -) - -// Re-export app status atoms for centralized access -export {appStatusAtom, variantAppStatusAtomFamily, currentVariantAppStatusAtom} from "./appStatus" diff --git a/web/oss/src/state/variant/atoms/selection.ts b/web/oss/src/state/variant/atoms/selection.ts deleted file mode 100644 index 5edacd6802..0000000000 --- a/web/oss/src/state/variant/atoms/selection.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {recentRevisionsTableRowsAtom} from "@/oss/state/variant/selectors/variant" - -// Holds selected row keys for a given table scope -export const variantTableSelectionAtomFamily = atomFamily((scopeId: string) => - atom<(string | number)[]>([]), -) - -// Derives the selected variant objects for a given scope from the selected keys and the table rows source -export const selectedVariantsAtom = atomFamily((scopeId: string) => - atom((get) => { - const keys = get(variantTableSelectionAtomFamily(scopeId)) - const all = get(recentRevisionsTableRowsAtom) as any[] - return all.filter((v) => keys.includes(v.id)) - }), -) - -// Lightweight derived count to avoid subscribing to the full selected array when only length is needed -export const selectedVariantsCountAtom = atomFamily((scopeId: string) => - atom((get) => get(variantTableSelectionAtomFamily(scopeId)).length), -) diff --git a/web/oss/src/state/variant/mutable/README.md b/web/oss/src/state/variant/mutable/README.md deleted file mode 100644 index 8e2e956e5e..0000000000 --- a/web/oss/src/state/variant/mutable/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# Mutable Variant/Prompt Atoms (Shared) - -This folder documents the mutable atom architecture used across the app (not just Playground). It focuses on prompt-related state as the canonical example, but the patterns apply to any revision-scoped, variant-related mutable state. - -## Overview - -- **Single source of truth (prompts)**: `promptsAtomFamily(revisionId)` holds the full prompt tree for a given revision (variant revision ID). -- **Optimized reads**: Selector atoms read focused slices (e.g., a single property or metadata) to minimize re-renders. -- **Centralized writes**: Mutation atoms encapsulate write logic, side-effects, and revision resolution. -- **Facade atoms**: A simple read/write facade is available for prompts-only use cases, abstracting the underlying mutation. - -These atoms originated in the Playground, but are now shared across features that need consistent prompt state access. - -## Data Flow (from fetch to UI) - -1. **Variant/Revisions fetched** via server queries (outside this folder). -2. **Prompts cached per revision** in `promptsAtomFamily(revisionId)`. -3. **Components read** focused values via selector atoms: - - `unifiedPropertyValueAtomFamily({ revisionId?, propertyId, rowId? })` - - `unifiedPropertyMetadataAtomFamily({ revisionId?, propertyId, rowId? })` -4. **Components write** through mutation atoms (never write directly to objects): - - `updateVariantPropertyEnhancedMutationAtom({ variantId: revisionId, propertyId, value })` -5. **Optional facade** combines 3 and 4 into a single read/write API for prompts-only: - - `promptPropertyAtomFamily({ revisionId, propertyId })` - -## Key Atoms - -- **promptsAtomFamily(revisionId)** - - Source of truth for all prompt data per revision. - - Lives in: `@/oss/state/newPlayground/core/prompts`. - -- **updateVariantPropertyEnhancedMutationAtom** - - Centralized write path for prompt property updates. - - Resolves the correct target revision ID, updates nested property shapes, and maintains prompt key consistency. - - Lives in: `web/oss/src/components/Playground/state/atoms/propertyMutations.ts`. - -- **unifiedPropertyValueAtomFamily / unifiedPropertyMetadataAtomFamily** - - Read-only selectors. Provide value/metadata for a given property from either prompts or generation data based on params. - - Useful for components that should not subscribe to the full prompt tree. - - Lives in: `web/oss/src/components/Playground/state/atoms/propertySelectors.ts`. - -- **promptPropertyAtomFamily** (prompts-only facade) - - Read/write atom family for prompts-only scenarios. - - Read: selects `(property.content?.value ?? property.value)` from `promptsAtomFamily(revisionId)`. - - Write: delegates to `updateVariantPropertyEnhancedMutationAtom`. - - Lives in: `web/oss/src/components/Playground/state/atoms/propertySelectors.ts`. - -## Why selectors AND mutation atoms? - -- **Single source of truth** reduces duplication and drift. -- **Selectors** keep subscriptions narrow (component re-renders only when the specific slice changes). -- **Mutations** centralize write logic, handle nested property shapes, and prevent inconsistent updates spread across components. -- This split provides performance and maintainability while preserving a coherent data model. - -## Facade: prompts-only read/write - -For straightforward prompt edits where you have a `revisionId` and `propertyId`, use the facade: - -```ts -import {useAtom, useAtomValue} from "jotai" -import {promptPropertyAtomFamily} from "@/oss/src/components/Playground/state/atoms" - -const value = useAtomValue(promptPropertyAtomFamily({revisionId, propertyId})) -const [, setValue] = useAtom(promptPropertyAtomFamily({revisionId, propertyId})) -setValue(next) -``` - -- Internally writes through `updateVariantPropertyEnhancedMutationAtom`. -- Keeps all prompt updates consistent and testable. - -## Scope and Non-goals - -- **In scope**: Prompt-related atoms and mutation patterns, revision-local prompt updates. -- **Out of scope**: Generation data atoms and mutations (they use `playgroundStateAtom.generationData` as their source of truth and have separate mutations). - -## Notes - -- "revisionId" here always refers to the variant revision identifier (not the parent variant ID). -- If a consumer only needs to read, prefer selector atoms (`unifiedPropertyValueAtomFamily`, -- If a consumer needs to write, prefer the facade (`promptPropertyAtomFamily`) or call the mutation atom directly for advanced cases. diff --git a/web/oss/src/state/variant/selectors/variant.ts b/web/oss/src/state/variant/selectors/variant.ts deleted file mode 100644 index 2ecfead199..0000000000 --- a/web/oss/src/state/variant/selectors/variant.ts +++ /dev/null @@ -1,203 +0,0 @@ -import deepEqual from "fast-deep-equal" -import {atom, getDefaultStore} from "jotai" -import {selectAtom, atomFamily} from "jotai/utils" - -import {formatDate24} from "@/oss/lib/helpers/dateTimeHelper" - -import { - revisionsByVariantIdAtomFamily, - variantsAtom, - appUriInfoAtom, - userProfilesMapAtom, - getEnhancedRevisionById, - allRevisionsAtom, -} from "../atoms/fetcher" - -export const revisionListAtom = selectAtom( - allRevisionsAtom, - (revisions) => revisions.slice().sort((a, b) => b.createdAtTimestamp - a.createdAtTimestamp), - deepEqual, -) - -// Lightweight stable selector: direct display name by variantId from variants -export const variantDisplayNameByIdAtomFamily = atomFamily((variantId: string) => - selectAtom( - variantsAtom, - (variants) => { - const v: any = (variants as any[]).find((x: any) => x.variantId === variantId) - return ((v?.variantName ?? v?.name) as string) || "-" - }, - (a, b) => a === b, - ), -) - -// Optimized selector for the 5 most recently updated revisions -export const recentRevisionsAtom = selectAtom( - revisionListAtom, - (revisions) => revisions.slice(0, 5), - deepEqual, -) - -// Lean version: only expose minimal shape to reduce subscriptions in lightweight UIs -export const recentRevisionsTableRowsAtom = selectAtom( - revisionListAtom, - (revisions) => - revisions.slice(0, 5).map((r) => { - const modelName = getDefaultStore().get(modelNameByRevisionIdAtomFamily(r.id)) - const ts = r.updatedAtTimestamp ?? r.createdAtTimestamp - return { - id: r.id, - commitMessage: r.commitMessage, - createdAt: formatDate24(ts), - modifiedBy: r.modifiedBy, - modelName, - } - }), - deepEqual, -) - -// Latest revision id per variant -export const latestRevisionIdByVariantIdAtomFamily = atomFamily((variantId: string) => - selectAtom( - revisionsByVariantIdAtomFamily(variantId), - (revs: any[]) => { - if (!Array.isArray(revs) || revs.length === 0) return null - // Prefer createdAtTimestamp when available, fallback to numeric revision - const latest = revs.reduce((acc: any, r: any) => { - if (!acc) return r - const aTs = acc.createdAtTimestamp ?? acc.revision ?? 0 - const rTs = r.createdAtTimestamp ?? r.revision ?? 0 - return aTs >= rTs ? acc : r - }, null as any) - return latest?.id ?? null - }, - (a, b) => a === b, - ), -) - -// Latest revision object per variant (returns the full revision info or null) -export const latestRevisionInfoByVariantIdAtomFamily = atomFamily((variantId: string) => - selectAtom( - revisionsByVariantIdAtomFamily(variantId), - (revs: any[]) => { - if (!Array.isArray(revs) || revs.length === 0) return null - return revs.reduce((acc: any, r: any) => { - if (!acc) return r - const aTs = acc.createdAtTimestamp ?? acc.revision ?? 0 - const rTs = r.createdAtTimestamp ?? r.revision ?? 0 - return aTs >= rTs ? acc : r - }, null as any) - }, - deepEqual, - ), -) - -// Latest revision across the entire app -export const latestAppRevisionIdAtom = selectAtom( - revisionListAtom, - (revs) => (revs.length ? revs[0].id : null), - (a, b) => a === b, -) - -export const latestAppRevisionInfoAtom = selectAtom( - revisionListAtom, - (revs) => (revs.length ? revs[0] : null), - deepEqual, -) - -// --------------------------------------------------------------------------- -// On-demand enrichment selectors (lean, no duplication) - -// Derive the user profile associated with a revision's "modifiedBy*" field -export const variantUserProfileAtomFamily = atomFamily((revisionId: string) => - atom((get) => { - const rev: any = getEnhancedRevisionById(get as any, revisionId) - const profilesResult = get(userProfilesMapAtom) as any - const profilesMap: Map = - profilesResult && profilesResult.data - ? (profilesResult.data as Map) - : new Map() - - const modBy = - rev?.modifiedById ?? - rev?.modifiedBy ?? - rev?.modified_by_id ?? - rev?.modified_by ?? - rev?.createdBy ?? - rev?.created_by ?? - null - - const userProfile = - modBy && typeof modBy === "string" && profilesMap.has(modBy) - ? profilesMap.get(modBy) - : null - return {modifiedById: (modBy as string) ?? null, userProfile} - }), -) - -// Stable string selector for display name to avoid object identity churn -export const variantUserDisplayNameAtomFamily = atomFamily((revisionId: string) => - selectAtom( - variantUserProfileAtomFamily(revisionId), - ({userProfile, modifiedById}) => { - const up: any = userProfile as any - - const direct = up?.displayName || up?.name || up?.username || up?.email || null - if (direct && typeof direct === "string") return direct as string - - const id = (modifiedById as string) || "" - const looksLikeUuid = - /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id) - return looksLikeUuid ? "-" : id || "-" - }, - (a, b) => a === b, - ), -) - -// --------------------------------------------------------------------------- -// Parent Variant selectors for adapted revisions - -// Raw parent variant object by id (no deep cloning) -export const parentVariantByIdAtomFamily = atomFamily((variantId: string) => - atom((get) => { - const vars = get(variantsAtom) - return vars.find((x) => x.variantId === variantId) ?? null - }), -) - -// Latest commit message on parent variant (single pass, no array copy) -export const parentVariantLatestCommitMessageAtomFamily = atomFamily((variantId: string) => - atom((get) => { - const v = get(parentVariantByIdAtomFamily(variantId)) as any - const revs: any[] = (v?.revisions as any[]) || [] - if (revs.length === 0) return null - const latest = revs.reduce((acc, r) => (acc && acc.revision > r.revision ? acc : r), null) - return latest?.commitMessage ?? latest?.commit_message ?? null - }), -) - -// Stable display name string for a parent variant id -export const parentVariantDisplayNameAtomFamily = atomFamily((variantId: string) => - selectAtom( - parentVariantByIdAtomFamily(variantId), - (info) => (info?.variantName ?? info?.name ?? "-") as string, - deepEqual, - ), -) - -// --------------------------------------------------------------------------- -// Per-revision selectors - -// Model name (from parameters) -export const modelNameByRevisionIdAtomFamily = atomFamily((revisionId: string) => - selectAtom( - atom((get) => getEnhancedRevisionById(get as any, revisionId) as any), - (rev) => { - if (!rev) return "-" - const parameters = (rev.parameters?.prompt as any)?.llm_config || rev.parameters || {} - const model = (parameters as any)?.model as string | undefined - return model && typeof model === "string" && model.trim().length ? model : "-" - }, - (a, b) => a === b, - ), -) diff --git a/web/oss/src/state/workspace/atoms/mutations.ts b/web/oss/src/state/workspace/atoms/mutations.ts deleted file mode 100644 index 9c044932e6..0000000000 --- a/web/oss/src/state/workspace/atoms/mutations.ts +++ /dev/null @@ -1,117 +0,0 @@ -import {atom} from "jotai" -import {atomWithMutation, atomWithQuery} from "jotai-tanstack-query" - -import {message} from "@/oss/components/AppMessageContext" -import {WorkspaceRole} from "@/oss/lib/Types" -import {updateOrganization} from "@/oss/services/organization/api" -import {updateWorkspace, fetchAllWorkspaceRoles} from "@/oss/services/workspace/api" - -import {selectedOrgQueryAtom, orgsQueryAtom} from "../../org/selectors/org" -import {userAtom} from "../../profile/selectors/user" - -/** - * Mutation atom for updating workspace name - * Handles both workspace and organization updates, plus cache invalidation - */ -export const updateWorkspaceNameAtom = atomWithMutation< - void, - {organizationId: string; workspaceId: string; name: string} ->((get) => ({ - mutationKey: ["updateWorkspaceName"], - mutationFn: async ({organizationId, workspaceId, name}) => { - // Update both workspace and organization in parallel - await Promise.all([ - updateWorkspace({organizationId, workspaceId, name}), - updateOrganization(organizationId, name), - ]) - }, - onSuccess: (_, {name, organizationId}) => { - // Show success message - message.success("Workspace renamed") - - // Optimistically update the local cache with the new name - const selectedOrgQuery = get(selectedOrgQueryAtom) - - // Also trigger a refetch to ensure data consistency - if (selectedOrgQuery.refetch) { - selectedOrgQuery.refetch() - } - - // Refetch orgs list to ensure sidebar and org lists reflect the new name - const orgsQuery = get(orgsQueryAtom) - if (orgsQuery.refetch) { - orgsQuery.refetch() - } - }, - onError: (error) => { - console.error("Failed to update workspace name:", error) - message.error("Failed to rename workspace") - }, -})) - -/** - * Action atom for updating workspace name with UI state management - * This handles the complete flow including UI state updates - */ -export const updateWorkspaceNameActionAtom = atom( - null, - async ( - get, - _set, - { - organizationId, - workspaceId, - name, - onSuccess, - }: { - organizationId: string - workspaceId: string - name: string - onSuccess?: () => void - }, - ) => { - try { - // Execute the mutation using mutateAsync from the mutation atom - const {mutateAsync} = get(updateWorkspaceNameAtom) - await mutateAsync({organizationId, workspaceId, name}) - - // Call success callback if provided - if (onSuccess) { - onSuccess() - } - } catch (error) { - // Error handling is already done in the mutation atom - throw error - } - }, -) - -/** - * Query atom for fetching workspace roles - * Fetches all available workspace roles for the application - */ -export const workspaceRolesQueryAtom = atomWithQuery[]>( - (get) => { - const user = get(userAtom) - - return { - queryKey: ["workspaceRoles"], - queryFn: () => fetchAllWorkspaceRoles(), - staleTime: 1000 * 60 * 10, // 10 minutes - roles don't change often - refetchOnWindowFocus: false, - refetchOnReconnect: false, - refetchOnMount: false, - enabled: !!user?.id, - retry: (failureCount, error) => { - // Don't retry on client errors (404, etc.) - if ( - (error as any)?.response?.status >= 400 && - (error as any)?.response?.status < 500 - ) { - return false - } - return failureCount < 2 - }, - } - }, -) diff --git a/web/oss/src/state/workspace/atoms/selectors.ts b/web/oss/src/state/workspace/atoms/selectors.ts deleted file mode 100644 index c5795752de..0000000000 --- a/web/oss/src/state/workspace/atoms/selectors.ts +++ /dev/null @@ -1,48 +0,0 @@ -import {atom} from "jotai" -import {atomFamily} from "jotai/utils" - -import {WorkspaceMember} from "@/oss/lib/Types" - -import {selectedOrgAtom} from "../../org/selectors/org" - -/** - * Atom for the search term used to filter workspace members - */ -export const memberSearchTermAtom = atom("") - -/** - * Derived atom that provides all workspace members - */ -export const workspaceMembersAtom = atom((get) => { - const selectedOrg = get(selectedOrgAtom) - return selectedOrg?.default_workspace?.members || [] -}) - -/** - * Derived atom that provides filtered workspace members based on search term - */ -export const filteredWorkspaceMembersAtom = atom((get) => { - const members = get(workspaceMembersAtom) - const searchTerm = get(memberSearchTermAtom) - - if (!searchTerm.trim()) { - return members - } - - return members.filter((member) => - member.user.email.toLowerCase().includes(searchTerm.toLowerCase()), - ) -}) - -/** - * Atom family to access a workspace member by user ID - * Returns the WorkspaceMember for the given user id, or null if not found - */ -export const workspaceMemberByIdFamily = atomFamily((userId: string | null | undefined) => - atom((get) => { - const members = get(workspaceMembersAtom) - if (!userId) return null - const idStr = String(userId) - return members.find((m) => String(m.user?.id ?? "") === idStr) || null - }), -) diff --git a/web/oss/src/state/workspace/hooks.ts b/web/oss/src/state/workspace/hooks.ts deleted file mode 100644 index c9b97dd9e8..0000000000 --- a/web/oss/src/state/workspace/hooks.ts +++ /dev/null @@ -1,63 +0,0 @@ -import {useAtomValue, useSetAtom} from "jotai" - -import { - updateWorkspaceNameActionAtom, - updateWorkspaceNameAtom, - workspaceRolesQueryAtom, -} from "./atoms/mutations" -import { - filteredWorkspaceMembersAtom, - memberSearchTermAtom, - workspaceMembersAtom, -} from "./atoms/selectors" - -/** - * Hook for updating workspace name - * Returns mutation state and action function - */ -export const useUpdateWorkspaceName = () => { - const mutation = useAtomValue(updateWorkspaceNameAtom) - const updateWorkspaceName = useSetAtom(updateWorkspaceNameActionAtom) - - return { - updateWorkspaceName, - isPending: mutation.isPending, - isError: mutation.isError, - error: mutation.error, - isSuccess: mutation.isSuccess, - } -} - -/** - * Hook for fetching workspace roles - * Returns workspace roles data and loading state - */ -export const useWorkspaceRoles = () => { - const {data: roles, isPending, error, isError, refetch} = useAtomValue(workspaceRolesQueryAtom) - - return { - roles: roles ?? [], - isLoading: isPending, - error, - isError, - refetch, - } -} - -/** - * Hook for workspace members with search functionality - * Returns filtered members and search controls - */ -export const useWorkspaceMembers = () => { - const allMembers = useAtomValue(workspaceMembersAtom) - const filteredMembers = useAtomValue(filteredWorkspaceMembersAtom) - const setSearchTerm = useSetAtom(memberSearchTermAtom) - const searchTerm = useAtomValue(memberSearchTermAtom) - - return { - members: allMembers, - filteredMembers, - searchTerm, - setSearchTerm, - } -} diff --git a/web/oss/src/state/workspace/index.ts b/web/oss/src/state/workspace/index.ts deleted file mode 100644 index 57b1909cec..0000000000 --- a/web/oss/src/state/workspace/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Export workspace atoms -export * from "./atoms/mutations" -export * from "./atoms/selectors" - -// Export workspace hooks -export * from "./hooks" diff --git a/web/oss/src/styles/animations.css b/web/oss/src/styles/animations.css deleted file mode 100644 index 70d269754e..0000000000 --- a/web/oss/src/styles/animations.css +++ /dev/null @@ -1,61 +0,0 @@ -/* Human eval specific styles */ -/* Highlight animation for selected table row */ -@keyframes highlight { - 0% { - background-color: rgba(22, 119, 255, 0.1); - } - 50% { - background-color: rgba(22, 119, 255, 0.2); - } - 100% { - background-color: transparent; - } -} - -.highlight-row { - animation: highlight 2s ease-out; -} - - -@keyframes pulse { - 0% { - box-shadow: 0 0 0 0 rgba(255, 82, 82, 0.7); - } - - 70% { - box-shadow: 0 0 0 7px rgba(255, 82, 82, 0); - } - - 100% { - box-shadow: 0 0 0 0 rgba(255, 82, 82, 0); - } -} - -@keyframes colorChange { - 0%, - 25% { - stroke: #36cfc9; - } - 26%, - 100% { - stroke: #d6dee6; - } -} - -@keyframes errorPulse { - 0% { - background: rgba(220, 38, 38, 0.3); - transform: scale(1.02); - } - 50% { - background: rgba(220, 38, 38, 0.2); - } - 100% { - background: linear-gradient( - 135deg, - rgba(220, 38, 38, 0.08) 0%, - rgba(220, 38, 38, 0.12) 100% - ); - transform: scale(1); - } -} \ No newline at end of file diff --git a/web/oss/src/styles/code-editor-styles.css b/web/oss/src/styles/code-editor-styles.css deleted file mode 100644 index b35b1bf5bf..0000000000 --- a/web/oss/src/styles/code-editor-styles.css +++ /dev/null @@ -1,465 +0,0 @@ - -.code-editor { - /* === Editor container === */ - .editor-code { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; - position: relative; - white-space: pre; - tab-size: 2; - padding-left: 0 !important; - - /* Initialize CSS counter for line numbers */ - counter-reset: line-number; - - font-family: Menlo, Consolas, Monaco, monospace; - display: block; - line-height: 1.53; - font-size: 13px; - margin: 0; - margin-top: 8px; - margin-bottom: 8px; - - tab-size: 2; - padding: 0px; - - &:focus-visible { - outline: none; - } - - /* Light theme (default) */ - --editor-bg: #f8f9fb; - --editor-text: #2d2d2d; - --editor-line-number: #aaa; - --editor-gutter-bg: #f0f0f0; - --editor-gutter-border: #ddd; - --editor-selection-bg: rgb(171, 205, 252); - --editor-cursor: #000; - --editor-error-bg: rgba(255, 0, 0, 0.05); - --editor-error-border: #ff0000; - - /* Syntax highlighting - Light theme (GitHub-inspired) */ - --token-comment: #6a737d; /* muted gray */ - --token-string: #032f62; /* dark blue for strings */ - --token-keyword: #d73a49; /* red keywords */ - --token-number: #005cc5; /* bright blue numbers */ - --token-property: #6f42c1; /* purple mapping keys / properties */ - --token-operator: #d73a49; /* match keyword red */ - --token-punctuation: #24292e; /* near-black punctuation */ - --token-function: #005cc5; /* blue functions */ - --token-class-name: #e36209; /* orange classes */ - --token-variable: #116329; /* green variables */ - --token-plain: #2d2d2d; - - /* Apply light theme variables */ - background-color: var(--editor-bg); - color: var(--editor-text); - } - - /* use colors via css vars from this point on */ - - /* Add selection styling */ - ::selection { - background-color: var(--editor-selection-bg) !important; - color: var(--editor-text) !important; - text-shadow: none !important; - } - - .editor-code-highlight { - overflow-wrap: break-word; - text-wrap-mode: wrap; - display: inline !important; - vertical-align: top; - } - .editor-code-highlight.selected, - .editor-code-highlight::selection { - background-color: var(--editor-selection-bg) !important; - color: var(--editor-text) !important; - text-shadow: none !important; - } - - .editor-code-line { - overflow-wrap: break-word; - text-wrap-mode: wrap; - text-indent: -64px; - padding-left: 112px !important; - - &.diff-context, - &.diff-removed, - &.diff-added { - padding-left: 132px !important; - white-space: pre-wrap; - } - - > span { - text-indent: 0px !important; - } - - &:first-child { - &::before { - /* padding-top: theme("spacing.2"); */ - /* margin-top: calc(-1 * theme("spacing.2")); */ - } - } - /* Regular line numbers using CSS counters */ - &:not(.diff-context):not(.diff-added):not(.diff-removed)::before { - content: counter(line-number); - counter-increment: line-number; - z-index: 10; - position: absolute; - border-right: 1px solid var(--editor-gutter-border); - top: 0; - bottom: 0; - background-color: var(--editor-bg); - - left: 0; - padding: 0; - padding-right: 4px; - width: 2em; - text-align: right; - color: var(--editor-line-number); - user-select: none; - white-space: pre; - } - - /* Diff line numbers using data attributes - use ::after to avoid conflict with diff symbols */ - &.diff-context::after, - &.diff-added::after, - &.diff-removed::after { - content: attr(data-old-line-number) " " attr(data-new-line-number); - z-index: 10; - position: absolute; - border-right: 1px solid var(--editor-gutter-border); - top: 0; - bottom: 0; - background-color: var(--editor-bg); - - left: 0; - padding: 0; - padding-right: 4px; - width: 4em; /* Wider for two numbers */ - text-align: right; - color: var(--editor-line-number); - user-select: none; - white-space: pre; - font-size: 11px; /* Smaller font for two numbers */ - } - position: relative; - - z-index: 1; - @apply scrollbar scrollbar-h-0 scrollbar-thumb-[#ddd] scrollbar-track-[#f0f0f0]; - - &:hover { - @apply scrollbar-h-[2px]; - } - white-space: pre-wrap; - - &.flex { - .editor-code-highlight { - &:not(.token-property) { - white-space: pre-line; - } - &.token-plain { - white-space: break-spaces; - } - } - } - } - - .editor-code-line.folded { - display: none; - } - - /* GitHub-style dual line number gutter using both pseudo-elements */ - .editor-code.language-json .editor-code-line[data-old-line-number], - .editor-code.language-json .editor-code-line[data-new-line-number], - .editor-code.language-yaml .editor-code-line[data-old-line-number], - .editor-code.language-yaml .editor-code-line[data-new-line-number], - .editor-code.language-code .editor-code-line[data-old-line-number], - .editor-code.language-code .editor-code-line[data-new-line-number] { - padding-left: 64px; - } - - .editor-code.language-json .editor-code-line[data-old-line-number]::before, - .editor-code.language-yaml .editor-code-line[data-old-line-number]::before, - .editor-code.language-code .editor-code-line[data-old-line-number]::before { - content: attr(data-old-line-number) !important; - padding-right: 4px; - box-sizing: border-box; - position: absolute !important; - left: 0px !important; - top: 0 !important; - width: 30px !important; - text-align: right !important; - color: #6b7280 !important; - font-size: 10px !important; - line-height: inherit !important; - font-family: - "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace !important; - user-select: none !important; - pointer-events: none !important; - text-indent: 0 !important; - border-right: 1px solid var(--editor-gutter-border) !important; - } - - .editor-code.language-json .editor-code-line[data-new-line-number]::after, - .editor-code.language-yaml .editor-code-line[data-new-line-number]::after, - .editor-code.language-code .editor-code-line[data-new-line-number]::after { - content: attr(data-new-line-number) !important; - padding-right: 0px; - padding-left: 4px; - box-sizing: border-box; - position: absolute !important; - left: 30px !important; - top: 0 !important; - width: 30px !important; - text-align: left !important; - color: #6b7280 !important; - font-size: 10px !important; - line-height: inherit !important; - font-family: - "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace !important; - user-select: none !important; - pointer-events: none !important; - text-indent: 0 !important; - } - - /* Validation error highlighting for individual tokens */ - .editor-code-highlight.validation-error { - /* Subtle background with gradient */ - background: linear-gradient( - 135deg, - rgba(220, 38, 38, 0.08) 0%, - rgba(220, 38, 38, 0.12) 100% - ); - - /* Enhanced wavy underline */ - border-bottom: 2px wavy #dc2626; - - /* Subtle text color adjustment */ - color: #b91c1c; - - /* Positioning for pseudo-elements */ - position: relative; - - /* Smooth transitions */ - transition: all 0.2s ease; - - /* Subtle border radius for modern look */ - border-radius: 2px; - - /* Optional: subtle box shadow for depth */ - box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.1); - } - - /* Enhanced hover state */ - .editor-code-highlight.validation-error:hover { - background: linear-gradient( - 135deg, - rgba(220, 38, 38, 0.15) 0%, - rgba(220, 38, 38, 0.2) 100% - ); - - /* Stronger border on hover */ - box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.2); - - /* Slightly darker text */ - color: #991b1b; - } - - /* Focus state for accessibility */ - .editor-code-highlight.validation-error:focus { - outline: 2px solid rgba(220, 38, 38, 0.5); - outline-offset: 1px; - } - - /* Subtle animation for newly added errors */ - .editor-code-highlight.validation-error.newly-added { - animation: errorPulse 0.6s ease-out; - } - - - - /* Ensure parent containers don't clip tooltips */ - /* Token-level tooltip styling */ - .editor-code-highlight.validation-error[title] { - position: relative; - cursor: help; - z-index: 1; - overflow: visible; - } - - .editor-code-highlight.validation-error[title]:hover::after { - content: attr(title); - position: absolute; - bottom: calc(100% + 12px); - left: 50%; - /* transform: translateX(-50%); */ - background: rgba(0, 0, 0, 0.95); - color: white; - padding: 4px 8px; - border-radius: 6px; - font-size: 8px; - font-weight: 500; - white-space: nowrap; - z-index: 2147483647; - pointer-events: none; - } - - .editor-code-highlight.validation-error[title]:hover::before { - content: ""; - position: absolute; - bottom: calc(100% + 6px); - left: 50%; - border: 6px solid transparent; - border-top-color: rgba(0, 0, 0, 0.95); - z-index: 2147483646; - pointer-events: none; - } - - /* Separator pipe between line numbers */ - /* .editor-code.language-json .editor-code-line[data-old-line-number][data-new-line-number]::before { - content: attr(data-old-line-number) "|" !important; - } */ - - /* Hide original line numbers when diff gutter is active */ - /* .editor-code-line[data-old-line-number] .editor-line-number, - .editor-code-line[data-new-line-number] .editor-line-number { - display: none; - } */ - - /* Diff line backgrounds */ - /* .editor-code-line[data-old-line-number]:not([data-new-line-number]) { - background-color: rgba(239, 68, 68, 0.15); - border-left: 4px solid rgb(239, 68, 68); - } */ - - /* .editor-code-line[data-new-line-number]:not([data-old-line-number]) { - background-color: rgba(16, 185, 129, 0.15); - border-left: 4px solid rgb(16, 185, 129); - } */ - - .fold-toggle { - position: absolute; - left: 2.5em; - top: 0; - width: theme(spacing.3); - height: 100%; - display: flex; - align-items: center; - justify-content: center; - background: none; - border: none; - padding: 0; - cursor: pointer; - color: var(--editor-line-number); - font-size: 1em; - } - - .fold-toggle:hover { - color: var(--editor-text); - } - - /* === Prism token styling === */ - - .token-string, - .token-attr-value { - color: var(--token-string); - } - - .token-comment { - color: var(--token-comment); - font-style: italic; - } - - .token-punctuation { - color: var(--token-punctuation); - } - - .token-namespace { - opacity: 0.7; - } - - .token-key, - .token-property, - .token-tag, - .token-constant, - .token-symbol, - .token-deleted { - color: var(--token-property); - } - - .token-boolean, - .token-number { - color: var(--token-number); - } - - .token-selector, - .token-attr-name, - .token-char, - .token-builtin, - .token-inserted { - color: var(--token-string); - } - - .token-operator, - .token-entity, - .token-url, - .token-variable { - color: var(--token-operator); - } - - .token-atrule, - .token-attr-value, - .token-function, - .token-class-name { - color: var(--token-function); - } - - .token-keyword { - color: var(--token-keyword); - } - - .token-regex, - .token-important { - color: var(--token-string); - } - - .token-important, - .token-bold { - font-weight: bold; - } - - .token-italic { - font-style: italic; - } - - .token-plain { - color: var(--token-plain); - } - - /* Ensure empty tokens have a minimum width for caret visibility */ - .token-empty { - min-width: 1px; - display: inline-block; - caret-color: var(--editor-cursor); /* Ensure caret is visible */ - } - - /* Styling for tokens that have validation errors */ - .token-error { - position: relative; - border-bottom: 1px dashed var(--editor-error-border); - cursor: help; - } -} - - -.commit-diff, -.compare-diff { - background: #f9f9fa; - aspect-ratio: 1.5; - .editor-code { - margin-top: 0px; - margin-bottom: 0px; - font-size: 10px; - } -} diff --git a/web/oss/src/styles/editor-theme.css b/web/oss/src/styles/editor-theme.css deleted file mode 100644 index 14213d83dd..0000000000 --- a/web/oss/src/styles/editor-theme.css +++ /dev/null @@ -1,653 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -.other h2 { - font-size: 18px; - color: #444; - margin-bottom: 7px; -} - -.other a { - color: #777; - text-decoration: underline; - font-size: 14px; -} - -.other ul { - padding: 0; - margin: 0; - list-style-type: none; -} - -.App { - font-family: sans-serif; - text-align: center; -} - -h1 { - font-size: 24px; - color: #333; -} - -.editor-container { - /* margin: 20px auto 20px auto; */ - margin-left: 0px; - border-radius: 2px; - max-width: 600px; - color: #000; - position: relative; - line-height: 20px; - font-weight: 400; - text-align: left; - border-top-left-radius: 10px; - border-top-right-radius: 10px; -} - -.editor-inner { - background: inherit; - position: relative; -} - -.editor-input { - min-height: 150px; - resize: none; - /* font-size: 15px; */ - caret-color: rgb(5, 5, 5); - position: relative; - tab-size: 1; - outline: 0; - /* padding: 15px 10px; */ - caret-color: #444; -} - -.editor-placeholder { - color: #999; - overflow: hidden; - position: absolute; - text-overflow: ellipsis; - top: 0px; - left: 0px; - user-select: none; - display: inline-block; - pointer-events: none; -} - -.editor-text-bold { - font-weight: bold; -} - -.editor-text-italic { - font-style: italic; -} - -.editor-text-underline { - text-decoration: underline; -} - -.editor-text-strikethrough { - text-decoration: line-through; -} - -.editor-text-underlineStrikethrough { - text-decoration: underline line-through; -} - -.editor-text-code { - background-color: rgb(240, 242, 245); - padding: 1px 0.25rem; - font-family: Menlo, Consolas, Monaco, monospace; - font-size: 94%; -} - -.editor-link { - color: rgb(33, 111, 219); - text-decoration: none; -} - -.tree-view-output { - display: block; - background: #222; - color: #fff; - padding: 5px; - font-size: 12px; - white-space: pre-wrap; - margin: 1px auto 10px auto; - max-height: 250px; - position: relative; - border-bottom-left-radius: 10px; - border-bottom-right-radius: 10px; - overflow: auto; - line-height: 14px; -} - -.code-only .editor-code { - background-color: rgb(240, 242, 245); - font-family: Menlo, Consolas, Monaco, monospace; - display: block; - padding: 8px 8px 8px 52px; - line-height: 1.53; - font-size: 13px; - margin: 0; - margin-top: 8px; - margin-bottom: 8px; - tab-size: 2; - /* white-space: pre; */ - overflow-x: auto; - position: relative; -} - - -.editor-tokenComment { - color: slategray; -} - -.editor-tokenPunctuation { - color: #999; -} - -.editor-tokenProperty { - color: #905; -} - -.editor-tokenSelector { - color: #690; -} - -.editor-tokenOperator { - color: #9a6e3a; -} - -.editor-tokenAttr { - color: #07a; -} - -.editor-tokenVariable { - color: #e90; -} - -.editor-tokenFunction { - color: #dd4a68; -} - -.editor-paragraph { - margin: 0; - margin-bottom: 8px; - position: relative; -} - -.editor-paragraph:last-child { - margin-bottom: 0; -} - -.editor-heading-h1 { - font-size: 18px; - color: rgb(5, 5, 5); - font-weight: 400; - margin: 0; - margin-bottom: 12px; - padding: 0; - line-height: 1.5; -} - -.editor-heading-h2 { - font-size: 15px; - color: rgb(101, 103, 107); - font-weight: 700; - margin: 0; - margin-top: 10px; - padding: 0; - text-transform: uppercase; - line-height: 1.35; -} - -.editor-quote { - margin: 0; - margin-left: 20px; - font-size: 15px; - color: rgb(101, 103, 107); - border-left-color: rgb(206, 208, 212); - border-left-width: 4px; - border-left-style: solid; - padding-left: 16px; -} - -.editor-list-ol { - padding: 0; - margin: 0; - margin-left: 16px; -} - -.editor-list-ul { - padding: 0; - margin: 0; - margin-left: 0px; -} - -.editor-list-item { - margin: 8px 20px 8px 20px; -} - -.editor-list-item-checked, -.editor-list-item-unchecked { - position: relative; - margin-left: 0.5em; - margin-right: 0.5em; - padding-left: 1.5em; - padding-right: 1.5em; - list-style-type: none; - outline: none; - display: block; - min-height: 1.5em; -} -.editor-list-item-checked > *, -.editor-list-item-unchecked > * { - margin-left: 0.01em; -} -.editor-list-item-unchecked:before, -.editor-list-item-checked:before { - content: '\200B'; - width: 0.9em; - height: 0.9em; - top: 50%; - left: 0; - cursor: pointer; - display: block; - background-size: cover; - position: absolute; - transform: translateY(-50%); -} -.editor-list-item-checked { - text-decoration: line-through; -} -.editor-list-item-unchecked:focus:before, -.editor-list-item-checked:focus:before { - box-shadow: 0 0 0 2px #a6cdfe; - border-radius: 2px; -} -.editor-list-item-unchecked:before { - border: 1px solid #999; - border-radius: 2px; -} -.editor-list-item-checked:before { - border: 1px solid rgb(61, 135, 245); - border-radius: 2px; - background-color: #3d87f5; - background-repeat: no-repeat; -} -.editor-list-item-checked:after { - content: ''; - cursor: pointer; - border-color: #fff; - border-style: solid; - position: absolute; - display: block; - top: 45%; - width: 0.2em; - left: 0.35em; - height: 0.4em; - transform: translateY(-50%) rotate(45deg); - border-width: 0 0.1em 0.1em 0; -} - -.editor-nested-list-item { - list-style-type: none; -} - -pre::-webkit-scrollbar { - background: transparent; - width: 10px; -} - -pre::-webkit-scrollbar-thumb { - background: #999; -} - -.debug-timetravel-panel { - overflow: hidden; - padding: 0 0 10px 0; - margin: auto; - display: flex; -} - -.debug-timetravel-panel-slider { - padding: 0; - flex: 8; -} - -.debug-timetravel-panel-button { - padding: 0; - border: 0; - background: none; - flex: 1; - color: #fff; - font-size: 12px; -} - -.debug-timetravel-panel-button:hover { - text-decoration: underline; -} - -.debug-timetravel-button { - border: 0; - padding: 0; - font-size: 12px; - top: 10px; - right: 15px; - position: absolute; - background: none; - color: #fff; -} - -.debug-timetravel-button:hover { - text-decoration: underline; -} - -.toolbar { - display: flex; - margin-bottom: 1px; - background: #fff; - padding: 4px; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - vertical-align: middle; -} - -.toolbar button.toolbar-item { - border: 0; - display: flex; - background: none; - border-radius: 10px; - padding: 8px; - cursor: pointer; - vertical-align: middle; -} - -.toolbar button.toolbar-item:disabled { - cursor: not-allowed; -} - -.toolbar button.toolbar-item.spaced { - margin-right: 2px; -} - -.toolbar button.toolbar-item i.format { - background-size: contain; - display: inline-block; - height: 18px; - width: 18px; - margin-top: 2px; - vertical-align: -0.25em; - display: flex; - opacity: 0.6; -} - -.toolbar button.toolbar-item:disabled i.format { - opacity: 0.2; -} - -.toolbar button.toolbar-item.active { - background-color: rgba(223, 232, 250, 0.3); -} - -.toolbar button.toolbar-item.active i { - opacity: 1; -} - -.toolbar .toolbar-item:hover:not([disabled]) { - background-color: #eee; -} - -.toolbar .divider { - width: 1px; - background-color: #eee; - margin: 0 4px; -} - -.toolbar .toolbar-item .text { - display: flex; - line-height: 20px; - width: 200px; - vertical-align: middle; - font-size: 14px; - color: #777; - text-overflow: ellipsis; - width: 70px; - overflow: hidden; - height: 20px; - text-align: left; -} - -.toolbar .toolbar-item .icon { - display: flex; - width: 20px; - height: 20px; - user-select: none; - margin-right: 8px; - line-height: 16px; - background-size: contain; -} - - -.editor-tableScrollableWrapper { - overflow-x: auto; - margin: 0px 25px 30px 0px; -} -.editor-tableScrollableWrapper > .editor-table { - /* Remove the table's vertical margin and put it on the wrapper */ - margin-top: 0; - margin-bottom: 0; -} -.editor-tableAlignmentCenter { - margin-left: auto; - margin-right: auto; -} -.editor-tableAlignmentRight { - margin-left: auto; -} -.editor-table { - border-collapse: collapse; - border-spacing: 0; - overflow-y: scroll; - overflow-x: scroll; - table-layout: fixed; - width: fit-content; - margin-top: 25px; - margin-bottom: 30px; -} -.editor-tableScrollableWrapper.editor-tableFrozenRow { - /* position:sticky needs overflow:clip or visible - https://github.com/w3c/csswg-drafts/issues/865#issuecomment-350585274 */ - overflow-x: clip; -} -.editor-tableFrozenRow tr:nth-of-type(1) > td { - overflow: clip; - background-color: #ffffff; - position: sticky; - z-index: 2; - top: 44px; -} -.editor-tableFrozenRow tr:nth-of-type(1) > th { - overflow: clip; - background-color: #f2f3f5; - position: sticky; - z-index: 2; - top: 44px; -} -.editor-tableFrozenRow tr:nth-of-type(1) > th:after, -.editor-tableFrozenRow tr:nth-of-type(1) > td:after { - content: ''; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - border-bottom: 1px solid #bbb; -} -.editor-tableFrozenColumn tr > td:first-child { - background-color: #ffffff; - position: sticky; - z-index: 2; - left: 0; -} -.editor-tableFrozenColumn tr > th:first-child { - background-color: #f2f3f5; - position: sticky; - z-index: 2; - left: 0; -} -.editor-tableFrozenColumn tr > :first-child::after { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - height: 100%; - border-right: 1px solid #bbb; -} -.editor-tableRowStriping tr:nth-child(even), -.editor-tableFrozenColumn - .editor-table.editor-tableRowStriping - tr:nth-child(even) - > td:first-child { - background-color: #f2f5fb; -} -.editor-tableSelection *::selection { - background-color: transparent; -} -.editor-tableSelected { - outline: 2px solid rgb(60, 132, 244); -} -.editor-tableCell { - border: 1px solid #bbb; - width: 75px; - vertical-align: top; - text-align: start; - padding: 6px 8px; - position: relative; - outline: none; - overflow: auto; -} -/* - A firefox workaround to allow scrolling of overflowing table cell - ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1904159 -*/ -.editor-tableCell > * { - overflow: inherit; -} -.editor-tableCellResizer { - position: absolute; - right: -4px; - height: 100%; - width: 8px; - cursor: ew-resize; - z-index: 10; - top: 0; -} -.editor-tableCellHeader { - background-color: #f2f3f5; - text-align: start; -} -.editor-tableCellSelected { - caret-color: transparent; -} -.editor-tableCellSelected::after { - position: absolute; - left: 0; - right: 0; - bottom: 0; - top: 0; - background-color: highlight; - mix-blend-mode: multiply; - content: ''; - pointer-events: none; -} -.editor-tableAddColumns { - position: absolute; - background-color: #eee; - height: 100%; - animation: table-controls 0.2s ease; - border: 0; - cursor: pointer; -} -.editor-tableAddColumns:after { - /* background-image: url(../images/icons/plus.svg); */ - background-size: contain; - background-position: center; - background-repeat: no-repeat; - display: block; - content: ' '; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0.4; -} -.editor-tableAddColumns:hover, -.editor-tableAddRows:hover { - background-color: #c9dbf0; -} -.editor-tableAddRows { - position: absolute; - width: calc(100% - 25px); - background-color: #eee; - animation: table-controls 0.2s ease; - border: 0; - cursor: pointer; -} -.editor-tableAddRows:after { - /* background-image: url(../images/icons/plus.svg); */ - background-size: contain; - background-position: center; - background-repeat: no-repeat; - display: block; - content: ' '; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0.4; -} -@keyframes table-controls { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -.editor-tableCellResizeRuler { - display: block; - position: absolute; - width: 1px; - background-color: rgb(60, 132, 244); - height: 100%; - top: 0; -} -.editor-tableCellActionButtonContainer { - display: block; - right: 5px; - top: 6px; - position: absolute; - z-index: 4; - width: 20px; - height: 20px; -} -.editor-tableCellActionButton { - background-color: #eee; - display: block; - border: 0; - border-radius: 20px; - width: 20px; - height: 20px; - color: #222; - cursor: pointer; -} -.editor-tableCellActionButton:hover { - background-color: #ddd; -} diff --git a/web/oss/src/styles/globals.css b/web/oss/src/styles/globals.css index 210ce6a071..e0936c2b60 100644 --- a/web/oss/src/styles/globals.css +++ b/web/oss/src/styles/globals.css @@ -1,35 +1,26 @@ - -@import "./animations.css"; -@import "./editor-theme.css"; -@import "./code-editor-styles.css"; -@import "./human-evals.css"; -@import "./loading.css"; - @layer tailwind-base, antd; - /* === Custom styles for Ant Design Segmented Control === */ .evaluation-filters .ant-segmented-item-selected { - background: #1677ff !important; - color: #fff !important; - font-weight: 600; - border-radius: 6px; - box-shadow: 0 2px 8px rgba(22, 119, 255, 0.08); + background: #1677ff !important; + color: #fff !important; + font-weight: 600; + border-radius: 6px; + box-shadow: 0 2px 8px rgba(22, 119, 255, 0.08); } .evaluation-filters .ant-segmented-item { - background: white; - color: #2a2a2a; - font-weight: 400; + background: white; + color: #2a2a2a; + font-weight: 400; } @layer tailwind-base { - @tailwind base; + @tailwind base; } @tailwind components; @tailwind utilities; - html, body { padding: 0; @@ -73,6 +64,19 @@ body { margin-bottom: 4px !important; } +@keyframes pulse { + 0% { + box-shadow: 0 0 0 0 rgba(255, 82, 82, 0.7); + } + + 70% { + box-shadow: 0 0 0 7px rgba(255, 82, 82, 0); + } + + 100% { + box-shadow: 0 0 0 0 rgba(255, 82, 82, 0); + } +} .hover-button-wrapper { opacity: 0; @@ -118,6 +122,46 @@ body { margin: 0 auto; } +/* Custom loading circle for app creation proccess */ +.loading-circle { + display: flex; + justify-content: center; + align-items: center; + width: 160px; + height: 160px; +} +.loading-circle path { + stroke-width: 2; + animation: colorChange 1.6s infinite; + transition: + stroke 0.4s ease, + stroke-width 0.4s ease; + transition-duration: 0.5s; +} + +.loading-circle path:nth-child(1) { + animation-delay: 0s; +} +.loading-circle path:nth-child(2) { + animation-delay: 0.4s; +} +.loading-circle path:nth-child(3) { + animation-delay: 0.8s; +} +.loading-circle path:nth-child(4) { + animation-delay: 1.2s; +} +@keyframes colorChange { + 0%, + 25% { + stroke: #36cfc9; + } + 26%, + 100% { + stroke: #d6dee6; + } +} + .agenta-rich-text-editor { &.disabled { cursor: not-allowed; @@ -159,120 +203,613 @@ body { } .editor-inner:not(.code-editor) { + .editor-code:not([data-language]) { + background-color: rgb(240, 242, 245); + font-family: Menlo, Consolas, Monaco, monospace; + display: block; + padding: 8px; + line-height: 1.53; + font-size: 13px; + margin: 0; + margin-top: 8px; + margin-bottom: 8px; + overflow-x: auto; + position: relative; + tab-size: 2; + } + } + + +.editor-quote { + margin: 0; + margin-left: 20px; + margin-bottom: 10px; + color: rgb(101, 103, 107); + border-left-color: rgb(206, 208, 212); + border-left-width: 4px; + border-left-style: solid; + padding-left: 16px; +} + +.editor-textCode { + background-color: rgb(240, 242, 245); + padding: 1px 0.25rem; + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 94%; +} + +.editor-heading1 { + font-size: 20px; +} + +.editor-heading2 { + font-size: 18px; +} + +.editor-heading3 { + font-size: 16px; +} + +.editor-heading4 { + font-size: 14px; +} + +.editor-heading5 { + font-size: 12px; +} + +.editor-heading6 { + font-size: 10px; +} + + +.code-editor { + /* === Editor container === */ .editor-code { - background-color: rgb(240, 242, 245); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + position: relative; + white-space: pre; + tab-size: 2; + padding-left: 0 !important; + + /* Initialize CSS counter for line numbers */ + counter-reset: line-number; + font-family: Menlo, Consolas, Monaco, monospace; display: block; - padding: 8px; line-height: 1.53; font-size: 13px; margin: 0; margin-top: 8px; margin-bottom: 8px; - overflow-x: auto; - position: relative; + tab-size: 2; + padding: 0px; + + &:focus-visible { + outline: none; + } + + /* Light theme (default) */ + --editor-bg: #f8f9fb; + --editor-text: #2d2d2d; + --editor-line-number: #aaa; + --editor-gutter-bg: #f0f0f0; + --editor-gutter-border: #ddd; + --editor-selection-bg: rgb(171, 205, 252); + --editor-cursor: #000; + --editor-error-bg: rgba(255, 0, 0, 0.05); + --editor-error-border: #ff0000; + + /* Syntax highlighting - Light theme (GitHub-inspired) */ + --token-comment: #6a737d; /* muted gray */ + --token-string: #032f62; /* dark blue for strings */ + --token-keyword: #d73a49; /* red keywords */ + --token-number: #005cc5; /* bright blue numbers */ + --token-property: #6f42c1; /* purple mapping keys / properties */ + --token-operator: #d73a49; /* match keyword red */ + --token-punctuation: #24292e; /* near-black punctuation */ + --token-function: #005cc5; /* blue functions */ + --token-class-name: #e36209; /* orange classes */ + --token-variable: #116329; /* green variables */ + --token-plain: #2d2d2d; + + /* Apply light theme variables */ + background-color: var(--editor-bg); + color: var(--editor-text); + + /* Dark theme */ + &.dark-theme { + /* Enhanced dark theme with more contrast */ + --editor-bg: #1a1a1a; + --editor-text: #ffffff; + --editor-line-number: #a0a0a0; + --editor-gutter-bg: #252526; + --editor-gutter-border: #444; + --editor-selection-bg: rgba(97, 175, 239, 0.6); + --editor-cursor: #fff; + --editor-error-bg: rgba(255, 70, 70, 0.2); + --editor-error-border: #ff5555; + + /* Enhanced syntax highlighting for dark theme (VS Code Dark+) */ + --token-comment: #6a9955; /* soft green */ + --token-string: #ce9178; /* salmon */ + --token-keyword: #c586c0; /* mauve */ + --token-number: #b5cea8; /* light green */ + --token-property: #9cdcfe; /* light cyan */ + --token-operator: #d4d4d4; /* light gray */ + --token-punctuation: #d4d4d4; /* light gray */ + --token-function: #dcdcaa; /* pale yellow */ + --token-class-name: #4ec9b0; /* teal */ + --token-variable: #9cdcfe; /* light cyan */ + --token-plain: #ffffff; /* white */ + } + } + + /* use colors via css vars from this point on */ + + /* Add selection styling */ + ::selection { + background-color: var(--editor-selection-bg) !important; + color: var(--editor-text) !important; + text-shadow: none !important; } - > .editor-input.markdown-view > .editor-code { - background-color: transparent; + .editor-code-highlight { + overflow-wrap: break-word; + text-wrap-mode: wrap; + display: inline !important; + vertical-align: top; } - > .editor-input:not(.markdown-view) > .editor-code { - &:after { - content: attr(data-highlight-language); + .editor-code-highlight.selected, + .editor-code-highlight::selection { + background-color: var(--editor-selection-bg) !important; + color: var(--editor-text) !important; + text-shadow: none !important; + } + + .editor-code-line { + overflow-wrap: break-word; + text-wrap-mode: wrap; + text-indent: -64px; + padding-left: 112px !important; + + &.diff-context, &.diff-removed, &.diff-added { + padding-left: 132px !important; + white-space: pre-wrap; + } + + > span { + text-indent: 0px !important; + } + + &:first-child { + &::before { + /* padding-top: theme("spacing.2"); */ + /* margin-top: calc(-1 * theme("spacing.2")); */ + } + } + /* Regular line numbers using CSS counters */ + &:not(.diff-context):not(.diff-added):not(.diff-removed)::before { + content: counter(line-number); + counter-increment: line-number; + z-index: 10; + position: absolute; + border-right: 1px solid var(--editor-gutter-border); top: 0; - right: 3px; - padding: 3px; - font-size: 10px; - text-transform: uppercase; + bottom: 0; + background-color: var(--editor-bg); + + left: 0; + padding: 0; + padding-right: 4px; + width: 2em; + text-align: right; + color: var(--editor-line-number); + user-select: none; + white-space: pre; + } + + /* Diff line numbers using data attributes - use ::after to avoid conflict with diff symbols */ + &.diff-context::after, + &.diff-added::after, + &.diff-removed::after { + content: attr(data-old-line-number) " " attr(data-new-line-number); + z-index: 10; position: absolute; - color: rgba(0, 0, 0, 0.5); - } + border-right: 1px solid var(--editor-gutter-border); + top: 0; + bottom: 0; + background-color: var(--editor-bg); + + left: 0; + padding: 0; + padding-right: 4px; + width: 4em; /* Wider for two numbers */ + text-align: right; + color: var(--editor-line-number); + user-select: none; + white-space: pre; + font-size: 11px; /* Smaller font for two numbers */ + } + position: relative; + + + z-index: 1; + @apply scrollbar scrollbar-h-0 scrollbar-thumb-[#ddd] scrollbar-track-[#f0f0f0]; + + &:hover { + @apply scrollbar-h-[2px]; + } + white-space: pre-wrap; + + &.flex { + .editor-code-highlight { + &:not(.token-property) { + white-space: pre-line; + } + &.token-plain { + white-space: break-spaces; + } + } + } } -} -/** Align the input search with the search box **/ -.ant-input-group-wrapper { - .ant-input { - padding-top: 3.1px !important; - padding-bottom: 3.1px !important; + .editor-code-line.folded { + display: none; } -} -/* Comparison table styling fixes */ -.comparison-table .ant-table-expanded-row-fixed::after { - border-right: none !important; -} + /* GitHub-style dual line number gutter using both pseudo-elements */ + .editor-code.language-json .editor-code-line[data-old-line-number], + .editor-code.language-json .editor-code-line[data-new-line-number], + .editor-code.language-yaml .editor-code-line[data-old-line-number], + .editor-code.language-yaml .editor-code-line[data-new-line-number] { + padding-left: 64px; + } -.comparison-table .ant-table-tbody > tr.ant-table-expanded-row > td { - padding: 0 !important; - border-bottom: none !important; -} + .editor-code.language-json .editor-code-line[data-old-line-number]::before, + .editor-code.language-yaml .editor-code-line[data-old-line-number]::before { + content: attr(data-old-line-number) !important; + padding-right: 4px; + box-sizing: border-box; + position: absolute !important; + left: 0px !important; + top: 0 !important; + width: 30px !important; + text-align: right !important; + color: #6b7280 !important; + font-size: 10px !important; + line-height: inherit !important; + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace !important; + user-select: none !important; + pointer-events: none !important; + text-indent: 0 !important; + border-right: 1px solid var(--editor-gutter-border) !important; + } + + .editor-code.language-json .editor-code-line[data-new-line-number]::after, + .editor-code.language-yaml .editor-code-line[data-new-line-number]::after { + content: attr(data-new-line-number) !important; + padding-right: 0px; + padding-left: 4px; + box-sizing: border-box; + position: absolute !important; + left: 30px !important; + top: 0 !important; + width: 30px !important; + text-align: left !important; + color: #6b7280 !important; + font-size: 10px !important; + line-height: inherit !important; + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace !important; + user-select: none !important; + pointer-events: none !important; + text-indent: 0 !important; + } + -.comparison-table .ant-table-tbody > tr.ant-table-expanded-row .ant-table-tbody > tr > td { - border-bottom: 1px solid #f0f0f0 !important; -} + /* Validation error highlighting for individual tokens */ + .editor-code-highlight.validation-error { + /* Subtle background with gradient */ + background: linear-gradient(135deg, + rgba(220, 38, 38, 0.08) 0%, + rgba(220, 38, 38, 0.12) 100%); + + /* Enhanced wavy underline */ + border-bottom: 2px wavy #dc2626; + + /* Subtle text color adjustment */ + color: #b91c1c; + + /* Positioning for pseudo-elements */ + position: relative; + + /* Smooth transitions */ + transition: all 0.2s ease; + + /* Subtle border radius for modern look */ + border-radius: 2px; + + /* Optional: subtle box shadow for depth */ + box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.1); + } -.comparison-table .ant-table-tbody > tr.ant-table-expanded-row .ant-table { - margin: 0 !important; -} + /* Enhanced hover state */ + .editor-code-highlight.validation-error:hover { + background: linear-gradient(135deg, + rgba(220, 38, 38, 0.15) 0%, + rgba(220, 38, 38, 0.2) 100%); + + /* Stronger border on hover */ + box-shadow: inset 0 0 0 1px rgba(220, 38, 38, 0.2); + + /* Slightly darker text */ + color: #991b1b; + } -.comparison-table .ant-table-tbody > tr.ant-table-expanded-row .ant-table-tbody > tr:last-child > td { - border-bottom: none !important; -} + /* Focus state for accessibility */ + .editor-code-highlight.validation-error:focus { + outline: 2px solid rgba(220, 38, 38, 0.5); + outline-offset: 1px; + } -/* Styling for comparison rows (children) - light background for differentiation */ -.comparison-table .ant-table-tbody > tr[data-row-key*="-comp-"] { - background-color: #fafafa !important; -} + /* Subtle animation for newly added errors */ + .editor-code-highlight.validation-error.newly-added { + animation: errorPulse 0.6s ease-out; + } -.comparison-table .ant-table-tbody > tr[data-row-key*="-comp-"]:hover { - background-color: #f0f0f0 !important; -} + @keyframes errorPulse { + 0% { + background: rgba(220, 38, 38, 0.3); + transform: scale(1.02); + } + 50% { + background: rgba(220, 38, 38, 0.2); + } + 100% { + background: linear-gradient(135deg, + rgba(220, 38, 38, 0.08) 0%, + rgba(220, 38, 38, 0.12) 100%); + transform: scale(1); + } + } -/* Ensure child rows have subtle visual distinction */ -.comparison-table .ant-table-tbody > tr[data-row-key*="-comp-"] > td { - background-color: inherit !important; - border-left: 3px solid #e6f4ff !important; - padding-left: 12px !important; -} + /* Ensure parent containers don't clip tooltips */ + /* Token-level tooltip styling */ + .editor-code-highlight.validation-error[title] { + position: relative; + cursor: help; + z-index: 1; + overflow: visible; + } -.comparison-table { - .ant-table-row.comparison .ant-table-cell { - background-color: #ffdfdf; + .editor-code-highlight.validation-error[title]:hover::after { + content: attr(title); + position: absolute; + bottom: calc(100% + 12px); + left: 50%; + /* transform: translateX(-50%); */ + background: rgba(0, 0, 0, 0.95); + color: white; + padding: 4px 8px; + border-radius: 6px; + font-size: 8px; + font-weight: 500; + white-space: nowrap; + z-index: 2147483647; + pointer-events: none; } - .ant-table-cell:has(.ant-table-expanded-row-fixed) { - padding-left: 0 !important; - padding-right: 0 !important; + + .editor-code-highlight.validation-error[title]:hover::before { + content: ''; + position: absolute; + bottom: calc(100% + 6px); + left: 50%; + border: 6px solid transparent; + border-top-color: rgba(0, 0, 0, 0.95); + z-index: 2147483646; + pointer-events: none; + } + + + /* Separator pipe between line numbers */ + /* .editor-code.language-json .editor-code-line[data-old-line-number][data-new-line-number]::before { + content: attr(data-old-line-number) "|" !important; + } */ + + /* Hide original line numbers when diff gutter is active */ + /* .editor-code-line[data-old-line-number] .editor-line-number, + .editor-code-line[data-new-line-number] .editor-line-number { + display: none; + } */ + + + /* Diff line backgrounds */ + /* .editor-code-line[data-old-line-number]:not([data-new-line-number]) { + background-color: rgba(239, 68, 68, 0.15); + border-left: 4px solid rgb(239, 68, 68); + } */ + + /* .editor-code-line[data-new-line-number]:not([data-old-line-number]) { + background-color: rgba(16, 185, 129, 0.15); + border-left: 4px solid rgb(16, 185, 129); + } */ + + .fold-toggle { + position: absolute; + left: 2.5em; + top: 0; + width: theme(spacing.3); + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background: none; + border: none; + padding: 0; + cursor: pointer; + color: var(--editor-line-number); + font-size: 1em; } - .ant-table-expanded-row-fixed { - margin: 0 !important; + + .fold-toggle:hover { + color: var(--editor-text); } - - /* Fix expand button positioning and overflow */ - .ant-table-row-expand-icon-cell { - width: 120px !important; - min-width: 120px !important; - padding: 8px !important; - text-align: center !important; + + /* === Prism token styling === */ + + .token-string, + .token-attr-value { + color: var(--token-string); } - - /* Ensure first data column doesn't contain expand icon */ - .ant-table-tbody > tr > td:first-child:not(.ant-table-row-expand-icon-cell) { - padding-left: 12px !important; + + .token-comment { + color: var(--token-comment); + font-style: italic; } - - /* Style the expand icon container */ - .ant-table-row-expand-icon { - display: inline-block !important; - width: auto !important; - height: auto !important; - margin: 0 !important; - } - .ant-table-expanded-row-fixed { - padding-left: 0 !important; - thead { - display: none + + .token-punctuation { + color: var(--token-punctuation); + } + + .token-namespace { + opacity: 0.7; + } + + .token-key, + .token-property, + .token-tag, + .token-constant, + .token-symbol, + .token-deleted { + color: var(--token-property); + } + + .token-boolean, + .token-number { + color: var(--token-number); + } + + .token-selector, + .token-attr-name, + .token-char, + .token-builtin, + .token-inserted { + color: var(--token-string); + } + + .token-operator, + .token-entity, + .token-url, + .token-variable { + color: var(--token-operator); + } + + .token-atrule, + .token-attr-value, + .token-function, + .token-class-name { + color: var(--token-function); + } + + .token-keyword { + color: var(--token-keyword); + } + + .token-regex, + .token-important { + color: var(--token-string); + } + + .token-important, + .token-bold { + font-weight: bold; + } + + .token-italic { + font-style: italic; + } + + .token-plain { + color: var(--token-plain); + } + + /* Ensure empty tokens have a minimum width for caret visibility */ + .token-empty { + min-width: 1px; + display: inline-block; + caret-color: var(--editor-cursor); /* Ensure caret is visible */ + } + + /* Styling for tokens that have validation errors */ + .token-error { + position: relative; + border-bottom: 1px dashed var(--editor-error-border); + cursor: help; + } +} + +/* Human eval specific styles */ +body { + :has(.human-eval) { + height: 100dvh; + overflow: hidden; + } + + .eval-run-scenarios-table { + .table-cell-expandable { + } } -} \ No newline at end of file + .eval-runs-table { + .cell-expand-container { + display: flex; + align-items: center; + } + } + + .not-available-table-cell { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ffffff; + opacity: 1; + background: repeating-linear-gradient( + -45deg, + #eaeff5, + #eaeff5 2px, + #ffffff 2px, + #ffffff 12px + ); + } + .scenario-row { + .cell-expand-container { + interpolate-size: allow-keywords; + } + .cell-expander { + position: relative; + width: 100%; + height: 120%; + + /* background-color: white; + mask-image:linear-gradient( + to bottom, + transparent, + rgba(255,255,255,0.6) 40%, + #ffffff 100% + ); + backdrop-filter: blur(10px); */ + mask: linear-gradient(to bottom, transparent, black); + backdrop-filter: blur(18px); + } + /* &:hover { + .cell-expander { + background-color: inherit + } + } */ + } +} diff --git a/web/oss/src/styles/human-evals.css b/web/oss/src/styles/human-evals.css deleted file mode 100644 index 9c0904542a..0000000000 --- a/web/oss/src/styles/human-evals.css +++ /dev/null @@ -1,63 +0,0 @@ -body { - :has(.human-eval) { - height: 100dvh; - overflow: hidden; - } - - .eval-run-scenarios-table { - .table-cell-expandable { - } - } - .eval-runs-table { - .cell-expand-container { - display: flex; - align-items: center; - } - } - - .not-available-table-cell { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #ffffff; - opacity: 1; - background: repeating-linear-gradient( - -45deg, - #eaeff5, - #eaeff5 2px, - #ffffff 2px, - #ffffff 12px - ); - } - .scenario-row { - .cell-expand-container { - interpolate-size: allow-keywords; - } - .cell-expander { - position: relative; - width: 100%; - height: 120%; - - mask: linear-gradient(to bottom, transparent, black); - backdrop-filter: blur(18px); - } - } - - .agenta-scenario-table { - .ant-table-tbody > tr { - cursor: pointer; - } - .ant-table-row { - &.ant-table-row-hover, - &:hover { - > td { - background-color: #9ab7ff !important; - } - } - } - } -} diff --git a/web/oss/src/styles/loading.css b/web/oss/src/styles/loading.css deleted file mode 100644 index 37064ac045..0000000000 --- a/web/oss/src/styles/loading.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Custom loading circle for app creation proccess */ -.loading-circle { - display: flex; - justify-content: center; - align-items: center; - width: 160px; - height: 160px; -} -.loading-circle path { - stroke-width: 2; - animation: colorChange 1.6s infinite; - transition: - stroke 0.4s ease, - stroke-width 0.4s ease; - transition-duration: 0.5s; -} - -.loading-circle path:nth-child(1) { - animation-delay: 0s; -} -.loading-circle path:nth-child(2) { - animation-delay: 0.4s; -} -.loading-circle path:nth-child(3) { - animation-delay: 0.8s; -} -.loading-circle path:nth-child(4) { - animation-delay: 1.2s; -} diff --git a/web/oss/src/styles/tokens/antd-tailwind.json b/web/oss/src/styles/tokens/antd-tailwind.json deleted file mode 100644 index f24f82d83e..0000000000 --- a/web/oss/src/styles/tokens/antd-tailwind.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "blue": { - "1": "#e6f4ff", - "2": "#bae0ff", - "3": "#91caff", - "4": "#69b1ff", - "5": "#4096ff", - "6": "#1677ff", - "7": "#0958d9", - "8": "#003eb3", - "9": "#002c8c", - "10": "#001d66" - }, - "cyan": { - "1": "#e6fffb", - "2": "#b5f5ec", - "3": "#87e8de", - "4": "#5cdbd3", - "5": "#36cfc9", - "6": "#13c2c2", - "7": "#08979c", - "8": "#006d75", - "9": "#00474f", - "10": "#002329" - }, - "geekblue": { - "1": "#f0f5ff", - "2": "#d6e4ff", - "3": "#adc6ff", - "4": "#85a5ff", - "5": "#597ef7", - "6": "#2f54eb", - "7": "#1d39c4", - "8": "#10239e", - "9": "#061178", - "10": "#030852" - }, - "gold": { - "1": "#fffbe6", - "2": "#fff1b8", - "3": "#ffe58f", - "4": "#ffd666", - "5": "#ffc53d", - "6": "#faad14", - "7": "#d48806", - "8": "#ad6800", - "9": "#874d00", - "10": "#613400" - }, - "green": { - "1": "#f6ffed", - "2": "#d9f7be", - "3": "#b7eb8f", - "4": "#95de64", - "5": "#73d13d", - "6": "#52c41a", - "7": "#389e0d", - "8": "#237804", - "9": "#135200", - "10": "#092b00" - }, - "lime": { - "1": "#fcffe6", - "2": "#f4ffb8", - "3": "#eaff8f", - "4": "#d3f261", - "5": "#bae637", - "6": "#a0d911", - "7": "#7cb305", - "8": "#5b8c00", - "9": "#3f6600", - "10": "#254000" - }, - "magenta": { - "1": "#fff0f6", - "2": "#ffd6e7", - "3": "#ffadd2", - "4": "#ff85c0", - "5": "#f759ab", - "6": "#eb2f96", - "7": "#c41d7f", - "8": "#9e1068", - "9": "#780650", - "10": "#520339" - }, - "orange": { - "1": "#fff7e6", - "2": "#ffe7ba", - "3": "#ffd591", - "4": "#ffc069", - "5": "#ffa940", - "6": "#fa8c16", - "7": "#d46b08", - "8": "#ad4e00", - "9": "#873800", - "10": "#612500" - }, - "colorText": "#1c2c3d", - "colorTextSecondary": "#586673", - "colorTextTertiary": "#758391", - "colorTextQuaternary": "#bdc7d1", - "colorTextLightSolid": "#ffffff", - "colorTextHeading": "#1c2c3d", - "colorTextLabel": "#586673", - "colorTextDescription": "#758391", - "colorTextDisabled": "#bdc7d1", - "purple": { - "1": "#f9f0ff", - "2": "#efdbff", - "3": "#d3adf7", - "4": "#b37feb", - "5": "#9254de", - "6": "#722ed1", - "7": "#531dab", - "8": "#391085", - "9": "#22075e", - "10": "#120338" - }, - "colorTextPlaceholder": "#bdc7d1", - "colorIcon": "#758391", - "colorIconHover": "#1c2c3d", - "colorBgContainer": "#ffffff", - "colorBgElevated": "#ffffff", - "colorBgLayout": "#ffffff", - "colorBgMask": "rgba(5, 23, 41, 0.45)", - "colorBgSpotlight": "rgba(5, 23, 41, 0.9)", - "colorBorder": "#bdc7d1", - "colorBorderSecondary": "#eaeff5", - "red": { - "1": "#fbe7e7", - "2": "#f7cfcf", - "3": "#ef9f9f", - "4": "#e67070", - "5": "#de4040", - "6": "#d61010", - "7": "#ab0d0d", - "8": "#800a0a", - "9": "#560606", - "10": "#2b0303" - }, - "colorFill": "rgba(5, 23, 41, 0.15)", - "colorFillSecondary": "rgba(5, 23, 41, 0.06)", - "colorFillTertiary": "rgba(5, 23, 41, 0.04)", - "colorFillQuaternary": "rgba(5, 23, 41, 0.02)", - "colorWhite": "#ffffff", - "colorBgBase": "#ffffff", - "colorTextBase": "#000000", - "colorBgContainerDisabled": "rgba(5, 23, 41, 0.04)", - "colorBgTextActive": "rgba(5, 23, 41, 0.15)", - "colorBgTextHover": "rgba(5, 23, 41, 0.06)", - "volcano": { - "1": "#fff2e8", - "2": "#ffd8bf", - "3": "#ffbb96", - "4": "#ff9c6e", - "5": "#ff7a45", - "6": "#fa541c", - "7": "#d4380d", - "8": "#ad2102", - "9": "#871400", - "10": "#610b00" - }, - "colorBorderBg": "#ffffff", - "colorFillContent": "rgba(5, 23, 41, 0.06)", - "colorFillContentHover": "rgba(5, 23, 41, 0.15)", - "colorFillAlter": "rgba(5, 23, 41, 0.02)", - "transparent": "rgba(0, 0, 0, 0)", - "colorSplit": "rgba(5, 23, 41, 0.06)", - "yellow": { - "1": "#feffe6", - "2": "#ffffb8", - "3": "#fffb8f", - "4": "#fff566", - "5": "#ffec3d", - "6": "#fadb14", - "7": "#d4b106", - "8": "#ad8b00", - "9": "#876800", - "10": "#614700" - }, - "colorPrimary": "#1c2c3d", - "colorSuccess": "#389e0d", - "colorWarning": "#faad14", - "colorInfo": "#1c2c3d", - "colorError": "#d61010", - "colorLink": "#1c2c3d", - "colorErrorBg": "#fbe7e7", - "colorErrorBgHover": "#f7cfcf", - "colorErrorBorder": "#ef9f9f", - "colorErrorBorderHover": "#e67070", - "colorErrorHover": "#de4040", - "colorErrorActive": "#ab0d0d", - "colorErrorTextHover": "#de4040", - "colorErrorText": "#d61010", - "colorErrorTextActive": "#ab0d0d", - "colorLinkHover": "#394857", - "colorInfoBg": "#f5f7fa", - "colorInfoBgHover": "#eaeff5", - "colorInfoBorder": "#d6dee6", - "colorInfoBorderHover": "#97a4b0", - "colorInfoHover": "#394857", - "colorInfoActive": "#051729", - "colorInfoTextHover": "#586673", - "colorInfoText": "#1c2c3d", - "colorInfoTextActive": "#051729", - "colorLinkActive": "#051729", - "colorPrimaryBg": "#f5f7fa", - "colorPrimaryBgHover": "#eaeff5", - "colorPrimaryBorder": "#d6dee6", - "colorPrimaryBorderHover": "#97a4b0", - "colorPrimaryHover": "#394857", - "colorPrimaryActive": "#051729", - "colorPrimaryTextHover": "#586673", - "colorPrimaryText": "#1c2c3d", - "colorPrimaryTextActive": "#051729", - "colorSuccessBg": "#f6ffed", - "colorSuccessBgHover": "#d9f7be", - "colorSuccessBorder": "#b7eb8f", - "colorSuccessBorderHover": "#95de64", - "colorSuccessHover": "#95de64", - "colorSuccessActive": "#389e0d", - "colorSuccessTextHover": "#73d13d", - "colorSuccessText": "#389e0d", - "colorSuccessTextActive": "#237804", - "colorWarningBg": "#fffbe6", - "colorWarningBgHover": "#fff1b8", - "colorWarningBorder": "#ffe58f", - "colorWarningBorderHover": "#ffd666", - "colorWarningHover": "#ffd666", - "colorWarningActive": "#d48806", - "colorWarningTextHover": "#ffc53d", - "colorWarningText": "#faad14", - "colorWarningTextActive": "#d48806", - "colorErrorOutline": "rgba(214, 16, 16, 0.06)", - "colorWarningOutline": "rgba(255, 215, 5, 0.1)", - "controlItemBgActive": "#f5f7fa", - "controlItemBgActiveDisabled": "rgba(5, 23, 41, 0.15)", - "controlItemBgActiveHover": "#eaeff5", - "controlItemBgHover": "rgba(5, 23, 41, 0.04)", - "controlOutline": "rgba(5, 23, 41, 0.1)", - "controlTmpOutline": "rgba(5, 23, 41, 0.02)", - "colorFillAlterSolid": "#f5f7fa", - "zinc": { - "1": "#f5f7fa", - "2": "#eaeff5", - "3": "#d6dee6", - "4": "#bdc7d1", - "5": "#97a4b0", - "6": "#758391", - "7": "#586673", - "8": "#394857", - "9": "#1c2c3d", - "10": "#051729" - } -} diff --git a/web/oss/tailwind.config.ts b/web/oss/tailwind.config.ts index 8fcefcf94a..9be13b6736 100644 --- a/web/oss/tailwind.config.ts +++ b/web/oss/tailwind.config.ts @@ -1,7 +1,6 @@ import {theme} from "antd" import type {Config} from "tailwindcss" import colors from "tailwindcss/colors" -import antdTailwind from "./src/styles/tokens/antd-tailwind.json" const token = theme.getDesignToken() export const createConfig = (content: string[] = []): Config => { @@ -20,7 +19,6 @@ export const createConfig = (content: string[] = []): Config => { sans: ["var(--font-inter)"], }, colors: { - ...antdTailwind, // light mode tremor: { brand: { @@ -142,6 +140,7 @@ export const createConfig = (content: string[] = []): Config => { nocompatible: true, preferredStrategy: "pseudoelements", }), + require("@headlessui/tailwindcss"), // Use class strategy so Ant Design styles remain unaffected require("@tailwindcss/forms")({ strategy: "class", diff --git a/web/oss/tests/2-app/assets/README.md b/web/oss/tests/2-app/assets/README.md index ac021bb571..570188e044 100644 --- a/web/oss/tests/2-app/assets/README.md +++ b/web/oss/tests/2-app/assets/README.md @@ -13,15 +13,15 @@ #### Validations 1. UI Validation - - Navigation to apps dashboard - - Modal interactions - - Loading states - - Success indicators + - Navigation to apps dashboard + - Modal interactions + - Loading states + - Success indicators 2. API Validation - - Successful app creation request - - Valid response structure - - Correct app name in response + - Successful app creation request + - Valid response structure + - Correct app name in response ## Fixtures ([helpers/test.ts](helpers/test.ts)) @@ -31,32 +31,33 @@ Our tests use custom fixtures that extend Playwright's base functionality: - `navigateToApps()`: Navigates to apps dashboard and verifies page load - ```typescript - await navigateToApps() // Navigates and checks for "App Management" text - ``` + ```typescript + await navigateToApps(); // Navigates and checks for "App Management" text + ``` ### Create a new App - `createNewApp(name: string)`: Handles complete app creation flow - ```typescript - const response = await createNewApp("my-app") - // Returns CreateAppResponse with id, name, createdAt - ``` - - Manages modal interactions - - Validates API response - - Ensures successful navigation to playground + ```typescript + const response = await createNewApp("my-app"); + // Returns CreateAppResponse with id, name, createdAt + ``` + + - Manages modal interactions + - Validates API response + - Ensures successful navigation to playground ### Verification - `verifyAppCreation(name: string)`: Validates UI state after app creation - ```typescript - await verifyAppCreation("my-app") - // Checks loading states and app name visibility - ``` + ```typescript + await verifyAppCreation("my-app"); + // Checks loading states and app name visibility + ``` -## Testcases +## Test Cases ### App Creation @@ -69,12 +70,12 @@ Our tests use custom fixtures that extend Playwright's base functionality: ### Basic App Creation Flow ```typescript -test("create app", async ({navigateToApps, createNewApp, verifyAppCreation}) => { - await navigateToApps() - const appName = `test-app-${Date.now()}` - await createNewApp(appName) - await verifyAppCreation(appName) -}) +test('create app', async ({ navigateToApps, createNewApp, verifyAppCreation }) => { + await navigateToApps(); + const appName = `test-app-${Date.now()}`; + await createNewApp(appName); + await verifyAppCreation(appName); +}); ``` ## Types diff --git a/web/oss/tests/3-playground/assets/README.md b/web/oss/tests/3-playground/assets/README.md index 7d79e53405..1dc64f4b15 100644 --- a/web/oss/tests/3-playground/assets/README.md +++ b/web/oss/tests/3-playground/assets/README.md @@ -10,28 +10,28 @@ The main test fixture extends the base test fixture with Playground-specific fun ```typescript interface VariantFixtures { - // Navigate to the Playground for a specific app - navigateToPlayground: (appId: string) => Promise - - // Run a completion variant test with the given messages - runCompletionSingleViewVariant: (appId: string, messages: string[]) => Promise - - // Run a chat variant test with the given messages - runChatSingleViewVariant: (appId: string, messages: string[]) => Promise - - // Add a new prompt with the specified role and content - addNewPrompt: (promptMessages: {prompt: string; role: RoleType}[]) => Promise - - // Change variable keys in the Playground - changeVariableKeys: (variables: {oldKey: string; newKey: string}[]) => Promise - - // Save a variant or version - saveVariant: ( - type: "version" | "variant", - note?: string, - revisionId?: string, - variantName?: string, - ) => Promise + // Navigate to the Playground for a specific app + navigateToPlayground: (appId: string) => Promise; + + // Run a completion variant test with the given messages + runCompletionSingleViewVariant: (appId: string, messages: string[]) => Promise; + + // Run a chat variant test with the given messages + runChatSingleViewVariant: (appId: string, messages: string[]) => Promise; + + // Add a new prompt with the specified role and content + addNewPrompt: (promptMessages: {prompt: string; role: RoleType}[]) => Promise; + + // Change variable keys in the Playground + changeVariableKeys: (variables: {oldKey: string; newKey: string}[]) => Promise; + + // Save a variant or version + saveVariant: ( + type: "version" | "variant", + note?: string, + revisionId?: string, + variantName?: string, + ) => Promise; } ``` @@ -43,14 +43,14 @@ interface VariantFixtures { ## Usage Example ```typescript -import {test} from "./tests.spec" -import {COMPLETION_MESSAGES} from "./assets/constants" - -test("run completion variant", async ({navigateToPlayground, runCompletionSingleViewVariant}) => { - const appId = "your-app-id" - await navigateToPlayground(appId) - await runCompletionSingleViewVariant(appId, COMPLETION_MESSAGES) -}) +import {test} from "./tests.spec"; +import {COMPLETION_MESSAGES} from "./assets/constants"; + +test('run completion variant', async ({navigateToPlayground, runCompletionSingleViewVariant}) => { + const appId = "your-app-id"; + await navigateToPlayground(appId); + await runCompletionSingleViewVariant(appId, COMPLETION_MESSAGES); +}); ``` ## Test Structure diff --git a/web/oss/tests/3-playground/index.ts b/web/oss/tests/3-playground/index.ts index 9af773d8a8..af821ade30 100644 --- a/web/oss/tests/3-playground/index.ts +++ b/web/oss/tests/3-playground/index.ts @@ -9,7 +9,7 @@ import { } from "@agenta/web-tests/playwright/config/testTags" const playgroundTests = () => { - ;((basePlaygroundTest( + ;(basePlaygroundTest( "Should run single view variant for completion", { tag: [ @@ -84,7 +84,7 @@ const playgroundTests = () => { // 5. save variant await saveVariant("version") }, - )) + ) } export default playgroundTests diff --git a/web/oss/tests/3-playground/tests.spec.ts b/web/oss/tests/3-playground/tests.spec.ts index 6ec70f336c..0be2675422 100644 --- a/web/oss/tests/3-playground/tests.spec.ts +++ b/web/oss/tests/3-playground/tests.spec.ts @@ -49,10 +49,10 @@ const testWithVariantFixtures = baseTest.extend({ await uiHelpers.expectNoText("Click run to generate output") await expect(page.getByText("Error").first()).not.toBeVisible() - // 5. Add a new Testcase - const testcaseButton = page.getByRole("button", {name: "Testcase"}) - await testcaseButton.scrollIntoViewIfNeeded() - await testcaseButton.click() + // 5. Add a new Test case + const testCaseButton = page.getByRole("button", {name: "Test case"}) + await testCaseButton.scrollIntoViewIfNeeded() + await testCaseButton.click() } }) }, diff --git a/web/oss/tests/5-testsset/index.ts b/web/oss/tests/5-testsset/index.ts index 9826e99b47..032e887457 100644 --- a/web/oss/tests/5-testsset/index.ts +++ b/web/oss/tests/5-testsset/index.ts @@ -1,6 +1,6 @@ import {test} from "@agenta/web-tests/tests/fixtures/base.fixture" -import type {Testset} from "@/oss/lib/Types" +import type {TestSet} from "@/oss/lib/Types" import {expect} from "@agenta/web-tests/utils" import { createTagString, @@ -27,7 +27,7 @@ const testsetTests = () => { await uiHelpers.waitForPath("/testsets") const testsets = await apiHelpers.getTestsets() - await uiHelpers.expectText("Testsets", {role: "heading"}) + await uiHelpers.expectText("Test Sets", {role: "heading"}) // 3. Verify testset is visible in table const testsetId = testsets[0]._id @@ -46,14 +46,14 @@ const testsetTests = () => { await uiHelpers.clickTableRow(testsetName) // 5. Fetch testset from API - const testsetResponse = await apiHelpers.waitForApiResponse({ + const testsetResponse = await apiHelpers.waitForApiResponse({ route: `/api/testsets/${testsetId}`, method: "GET", }) // 6. Verify testset page await uiHelpers.waitForPath(`/testsets/${testsetId}`) - await uiHelpers.expectText("Create a new Testset", {role: "heading"}) + await uiHelpers.expectText("Create a new Test Set", {role: "heading"}) const testset = await testsetResponse expect(testset.name).toBe(testsetName) diff --git a/web/oss/tests/datalayer/test-apps.ts b/web/oss/tests/datalayer/test-apps.ts deleted file mode 100644 index 104aa49493..0000000000 --- a/web/oss/tests/datalayer/test-apps.ts +++ /dev/null @@ -1,278 +0,0 @@ -/** - * New Apps Atoms Test - Refactored with Shared Utilities - * - * Tests the optimized apps state management system: - * - Query atoms for fetching apps - * - Table data optimization - * - App selector functionality - * - Mutation atoms (create, delete, update, switch) - * - Performance and caching validation - */ - -import "dotenv/config" - -import {createStore} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" - -// Direct imports to test module resolution -import { - appsAtom, - appsCountAtom, - appsQueryAtom, - appTableDataAtom, - selectedAppIdAtom, - currentAppAtom, -} from "../../src/state/newApps/atoms/queries" -import {appStatsAtom} from "../../src/state/newApps/selectors/apps" - -import {NetworkRequestCounter, createTestQueryClient} from "./utils/shared-test-setup" - -async function runAppsTest() { - const networkCounter = new NetworkRequestCounter() - - console.log("🧪 === New Apps Atoms Test ===") - console.log(`🧪 === ${process.env.NODE_ENV} ===`) - - // Debug environment variables - console.log("🔍 DEBUG - Environment Variables:") - console.log(` NODE_ENV: ${process.env.NODE_ENV}`) - console.log(` NEXT_PUBLIC_AGENTA_API_URL: ${process.env.NEXT_PUBLIC_AGENTA_API_URL}`) - console.log(` VITEST_TEST_JWT: ${process.env.VITEST_TEST_JWT ? "***" : "undefined"}`) - console.log(` VITEST_TEST_APP_ID: ${process.env.VITEST_TEST_APP_ID}`) - console.log(` VITEST_TEST_PROJECT_ID: ${process.env.VITEST_TEST_PROJECT_ID}`) - - console.log("📋 Environment:", { - apiUrl: process.env.NEXT_PUBLIC_AGENTA_API_URL, - nodeEnv: process.env.NODE_ENV, - appId: process.env.VITEST_TEST_APP_ID, - projectId: process.env.VITEST_TEST_PROJECT_ID, - jwt: process.env.VITEST_TEST_JWT ? "***" : "undefined", - }) - - const queryClient = createTestQueryClient() - - // Create Jotai store - const store = createStore() - store.set(queryClientAtom, queryClient) - - console.log("\n🧪 === Apps Atoms Test Suite ===") - console.log("🔄 Testing Apps State Management...") - - // Debug atoms - console.log("🔍 DEBUG - Imported atoms:") - console.log(" appsQueryAtom:", typeof appsQueryAtom, appsQueryAtom) - console.log(" appsAtom:", typeof appsAtom, appsAtom) - console.log(" appsCountAtom:", typeof appsCountAtom, appsCountAtom) - console.log(" appStatsAtom:", typeof appStatsAtom, appStatsAtom) - - // ======================================================================== - // 1️⃣ Apps Query Testing - // ======================================================================== - - console.log("\n🔄 Phase: apps_query_testing") - console.log("1️⃣ Apps Query Testing") - console.log("🔄 Loading apps...") - - let _appsQueryResult: any = null - let queryCompleted = false - - // Subscribe to apps query with network request counting - const unsubscribe = store.sub(appsQueryAtom, () => { - const result = store.get(appsQueryAtom) - console.log("📊 Apps query status:", result.status) - - if (result.status === "success") { - console.log("✅ Apps query successful") - _appsQueryResult = result - queryCompleted = true - networkCounter.increment() - } else if (result.status === "error") { - console.log("❌ Apps query failed:", result.error?.message) - _appsQueryResult = result - queryCompleted = true - networkCounter.increment() - } - }) - - // Trigger the query by accessing the atom - store.get(appsQueryAtom) - - // Wait for query completion with timeout - const startTime = Date.now() - const timeout = 5000 // 5 seconds - - while (!queryCompleted && Date.now() - startTime < timeout) { - await new Promise((resolve) => setTimeout(resolve, 100)) - } - - unsubscribe() - - if (!queryCompleted) { - throw new Error("Apps query timed out") - } - - console.log(`✅ Apps query completed after ${Date.now() - startTime}ms`) - console.log("🔗 Atom: appsAtom (loaded) in apps_query_testing") - - const appsData = store.get(appsAtom) - console.log("✅ Apps loaded:", appsData.length, "apps") - console.log("🔗 Atom: appsCountAtom (loaded) in apps_query_testing") - console.log("📊 Apps count:", store.get(appsCountAtom)) - - // Log sample apps data - if (appsData && appsData.length > 0) { - console.log("Sample apps:") - appsData.slice(0, 3).forEach((app, i) => { - console.log(` ${i + 1}. ${app.app_name} (${app.app_id})`) - console.log(` • Type: ${app.app_type || "custom"}`) - console.log(` • Updated: ${app.updated_at}`) - }) - } - - // Phase 2: Table Data Optimization Testing - console.log("\n🔄 Phase: table_data_optimization") - console.log("2️⃣ Table Data Optimization Testing") - console.log("🔗 Atom: appsTableDataAtom (loaded) in table_data_optimization") - - const appsTableData = store.get(appTableDataAtom) - console.log("✅ Apps table data:", { - count: Array.isArray(appsTableData) ? appsTableData.length : 0, - data: appsTableData, - }) - - // Phase 3: App Selection Testing - console.log("\n🔄 Phase: app_selection_testing") - console.log("3️⃣ App Selection Testing") - console.log("🔗 Atom: selectedAppIdAtom (loaded) in app_selection_testing") - - const selectedAppId = store.get(selectedAppIdAtom) - console.log("✅ Selected app ID:", selectedAppId) - - // Set the first app as selected for testing - if (!selectedAppId && appsData.length > 0) { - store.set(selectedAppIdAtom, appsData[0].app_id) - console.log("🔄 Setting first app as selected:", appsData[0].app_id) - } - - const currentAppData = store.get(currentAppAtom) - console.log("✅ Current app data:", currentAppData) - - // Phase 4: App Statistics Testing - console.log("\n🔄 Phase: app_statistics_testing") - console.log("4️⃣ App Statistics Testing") - console.log("🔗 Atom: appStatsAtom (loaded) in app_statistics_testing") - - const appStatsData = store.get(appStatsAtom) - console.log("✅ App statistics:", { - hasStats: !!appStatsData.data, - }) - - // Complete test - networkCounter.logTotal() - console.log("🎉 Apps test completed successfully!") - - // Save test results - const fs = await import("fs") - const path = await import("path") - - const resultsDir = path.join(__dirname, "results") - fs.mkdirSync(resultsDir, {recursive: true}) - - const testResults = { - timestamp: new Date().toISOString(), - atomDumps: { - appsQueryAtom: store.get(appsQueryAtom), - appsAtom: appsData, - appsCountAtom: store.get(appsCountAtom), - appTableDataAtom: appsTableData, - selectedAppIdAtom: selectedAppId, - currentAppAtom: currentAppData, - appStatsAtom: appStatsData, - }, - apps: { - count: store.get(appsCountAtom), - loaded: Array.isArray(appsData) ? appsData.length : 0, - fullData: appsData, - }, - tableData: { - count: Array.isArray(appsTableData) ? appsTableData.length : 0, - hasData: Array.isArray(appsTableData) && appsTableData.length > 0, - fullData: appsTableData, - }, - selection: { - selectedAppId: selectedAppId, - hasCurrentApp: !!currentAppData, - currentAppName: currentAppData?.app_name || null, - currentAppData: currentAppData, - }, - statistics: { - hasStats: !!appStatsData, - fullStatsData: appStatsData, - }, - network: { - totalRequests: networkCounter.getCount(), - queryStatus: store.get(appsQueryAtom)?.status || "unknown", - queryResult: store.get(appsQueryAtom), - }, - phases: { - appsQueryTesting: "✅ completed", - tableDataOptimization: "✅ completed", - appSelectionTesting: "✅ completed", - appStatisticsTesting: "✅ completed", - }, - } - - const summaryContent = `# Apps Atoms Test Results - -## Test Summary -- **Timestamp**: ${testResults.timestamp} -- **Status**: ✅ PASSED -- **Total Network Requests**: ${testResults.network.totalRequests} - -## Apps Data -- **Apps Count**: ${testResults.apps.count} -- **Apps Loaded**: ${testResults.apps.loaded} -- **Sample App**: ${testResults.apps.fullData?.[0]?.app_name || "None"} - -## Table Data Optimization -- **Table Data Count**: ${testResults.tableData.count} -- **Has Data**: ${testResults.tableData.hasData ? "✅ Yes" : "❌ No"} - -## App Selection -- **Selected App ID**: ${testResults.selection.selectedAppId || "None"} -- **Has Current App**: ${testResults.selection.hasCurrentApp ? "✅ Yes" : "❌ No"} -- **Current App Name**: ${testResults.selection.currentAppName || "None"} - -## Test Phases -${Object.entries(testResults.phases) - .map(([phase, status]) => `- **${phase}**: ${status}`) - .join("\n")} - -## Network Performance -- **Query Status**: ${testResults.network.queryStatus} -- **Total Requests**: ${testResults.network.totalRequests} -` - - fs.writeFileSync( - path.join(resultsDir, "apps-test-run.json"), - JSON.stringify(testResults, null, 2), - ) - - fs.writeFileSync(path.join(resultsDir, "apps-test-run-summary.md"), summaryContent) - - console.log("💾 Enhanced results saved to: " + path.join(resultsDir, "apps-test-run.json")) - console.log("📄 Summary saved to: " + path.join(resultsDir, "apps-test-run-summary.md")) - - console.log("🏁 Test execution completed") -} - -// Run the test with error handling -runAppsTest() - .then(() => { - console.log("🏁 Test execution completed") - process.exit(0) - }) - .catch((error) => { - console.error("❌ Test failed:", error) - process.exit(1) - }) diff --git a/web/oss/tests/datalayer/test-observability.ts b/web/oss/tests/datalayer/test-observability.ts deleted file mode 100644 index 18fc2ac6cc..0000000000 --- a/web/oss/tests/datalayer/test-observability.ts +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Observability Atoms Test - * - * Minimal verification of observability state logic using Jotai atoms. - */ - -import "dotenv/config" - -import {createStore} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" -import {routerAppIdAtom} from "../../src/state/app/atoms/fetcher" - -import { - tracesQueryAtom, - tracesAtom, - traceCountAtom, - tracesWithAnnotationsAtom, - observabilityLoadingAtom, -} from "../../src/state/newObservability/atoms/queries" - -import { - createTestQueryClient, - NetworkRequestCounter, - setupTestEnvironment, - logEnvironmentDebug, -} from "./utils/shared-test-setup" - -process.env.NODE_ENV = "test" -const apiUrl = - process.env.VITEST_TEST_API_URL || - process.env.NEXT_PUBLIC_AGENTA_API_URL || - "http://localhost/api" -process.env.VITEST_TEST_API_URL = apiUrl -process.env.NEXT_PUBLIC_AGENTA_API_URL = apiUrl -process.env.VITEST_TEST_APP_ID = - process.env.VITEST_TEST_APP_ID || "01988515-0b61-7163-9f07-92b8b285ba58" -process.env.VITEST_TEST_PROJECT_ID = - process.env.VITEST_TEST_PROJECT_ID || "01988511-c871-71c2-97df-b12386ebe480" -process.env.VITEST_TEST_JWT = process.env.VITEST_TEST_JWT || "test-jwt" - -async function runObservabilityTest() { - const env = setupTestEnvironment({appId: true, projectId: true, jwt: true}) - logEnvironmentDebug(env, "Observability Atoms Test") - - process.env.VITEST_TEST_APP_ID = env.appId - process.env.VITEST_TEST_PROJECT_ID = env.projectId - process.env.VITEST_TEST_JWT = env.jwt - - const queryClient = createTestQueryClient() - const store = createStore() - store.set(queryClientAtom, queryClient) - if (env.appId) store.set(routerAppIdAtom, env.appId) - - const networkCounter = new NetworkRequestCounter() - - let completed = false - let result: any = null - - const unsubscribe = store.sub(tracesQueryAtom, () => { - const q = store.get(tracesQueryAtom) - if (q.status === "success" || q.status === "error") { - completed = true - result = q - networkCounter.increment() - } - }) - - // trigger query - store.get(tracesQueryAtom) - - const start = Date.now() - const timeout = 5000 - while (!completed && Date.now() - start < timeout) { - await new Promise((r) => setTimeout(r, 100)) - } - - unsubscribe() - if (!completed) throw new Error("traces query timed out") - - const traces = store.get(tracesAtom) as any[] - const traceCount = store.get(traceCountAtom) - const annotated = store.get(tracesWithAnnotationsAtom) - const loading = store.get(observabilityLoadingAtom) - - console.log("Traces fetched:", traces.length) - console.log("Trace count:", traceCount) - console.log("Has annotations:", Array.isArray(annotated) && annotated.length > 0) - console.log("Loading state:", loading) - networkCounter.logTotal() - - const fs = await import("fs") - const path = await import("path") - const resultsDir = path.join(__dirname, "results") - fs.mkdirSync(resultsDir, {recursive: true}) - fs.writeFileSync( - path.join(resultsDir, "observability-test-run.json"), - JSON.stringify( - { - timestamp: new Date().toISOString(), - traces: traces.length, - traceCount, - annotated: annotated.length, - loading, - networkRequests: networkCounter.getCount(), - queryStatus: result.status, - }, - null, - 2, - ), - ) -} - -runObservabilityTest() - .then(() => { - console.log("🏁 Test execution completed") - process.exit(0) - }) - .catch((error) => { - console.error("❌ Test failed:", error) - process.exit(1) - }) diff --git a/web/oss/tests/datalayer/utils/shared-test-setup.ts b/web/oss/tests/datalayer/utils/shared-test-setup.ts deleted file mode 100644 index 748e334b87..0000000000 --- a/web/oss/tests/datalayer/utils/shared-test-setup.ts +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Shared Testsetup Utilities - * - * Common functionality shared between test-apps.ts and test-revision-centric.ts: - * - Environment validation and setup - * - QueryClient configuration - * - Query tracking and API call recording - * - Jotai store initialization - * - Common test patterns and helpers - */ - -import {QueryClient} from "@tanstack/react-query" -import {createStore} from "jotai" -import {queryClientAtom} from "jotai-tanstack-query" -import path from "path" -import {mkdirSync} from "fs" - -import {EnhancedTestRecorder} from "./test-analysis" - -export interface TestEnvironment { - projectId?: string - appId?: string - apiUrl?: string | undefined - nodeEnv?: string | undefined - computedBaseUrl?: string - jwt?: string -} - -export interface QueryTrackingOptions { - enableLogging?: boolean - trackPendingQueries?: boolean - trackCompletedQueries?: boolean -} - -/** - * Validates and sets up test environment variables - */ -export function setupTestEnvironment( - requiredVars: { - appId?: boolean - projectId?: boolean - jwt?: boolean - } = {}, -): TestEnvironment { - const environment: TestEnvironment = { - apiUrl: process.env.NEXT_PUBLIC_AGENTA_API_URL, - nodeEnv: process.env.NODE_ENV, - } - - // Validate required variables - if (requiredVars.appId) { - const appId = process.env.VITEST_TEST_APP_ID - if (!appId) { - console.error("❌ Missing VITEST_TEST_APP_ID environment variable") - process.exit(1) - } - environment.appId = appId - } - - if (requiredVars.projectId) { - const projectId = - process.env.VITEST_TEST_PROJECT_ID || "01988511-c871-71c2-97df-b12386ebe480" - environment.projectId = projectId - } - - if (requiredVars.jwt) { - const jwt = process.env.VITEST_TEST_JWT - if (!jwt) { - console.error("❌ Missing VITEST_TEST_JWT environment variable") - process.exit(1) - } - environment.jwt = jwt - } - - return environment -} - -/** - * Logs environment debug information - */ -export function logEnvironmentDebug(environment: TestEnvironment, testName: string) { - console.log(`🧪 === ${testName} ===`) - console.log("🔍 DEBUG - Environment Variables:") - console.log(" NODE_ENV:", process.env.NODE_ENV) - console.log(" NEXT_PUBLIC_AGENTA_API_URL:", process.env.NEXT_PUBLIC_AGENTA_API_URL) - - if (environment.appId) { - console.log(" VITEST_TEST_APP_ID:", process.env.VITEST_TEST_APP_ID) - } - if (environment.projectId) { - console.log(" VITEST_TEST_PROJECT_ID:", process.env.VITEST_TEST_PROJECT_ID) - } - if (environment.computedBaseUrl) { - console.log("🔍 DEBUG - Computed Base URL:", environment.computedBaseUrl) - } - - console.log("📋 Environment:", environment) -} - -/** - * Creates a configured QueryClient for testing - */ -export function createTestQueryClient(): QueryClient { - return new QueryClient({ - defaultOptions: { - queries: {retry: false, staleTime: 0}, - }, - }) -} - -/** - * Sets up query tracking with the recorder - */ -export function setupQueryTracking( - queryClient: QueryClient, - recorder: EnhancedTestRecorder, - options: QueryTrackingOptions = {}, -): Set { - const {enableLogging = true, trackPendingQueries = true, trackCompletedQueries = true} = options - - const queryCache = queryClient.getQueryCache() - const trackedQueries = new Set() - - queryCache.subscribe((event) => { - if (event.type === "added" && trackPendingQueries) { - const query = event.query - const queryKey = query.queryKey - const endpoint = Array.isArray(queryKey) ? queryKey.join("/") : String(queryKey) - - if (!trackedQueries.has(endpoint)) { - trackedQueries.add(endpoint) - recorder.recordApiCall(endpoint, "GET", { - queryKey, - state: query.state.status, - timestamp: Date.now(), - status: "pending", - }) - - if (enableLogging) { - console.log(`🌐 API Call: ${endpoint}`) - } - } - } - - if (event.type === "updated" && trackCompletedQueries) { - const query = event.query - const queryKey = query.queryKey - const endpoint = Array.isArray(queryKey) ? queryKey.join("/") : String(queryKey) - - if (query.state.status === "success" || query.state.status === "error") { - recorder.recordApiCall(endpoint, "GET", { - queryKey, - state: query.state.status, - status: query.state.status, - dataUpdatedAt: query.state.dataUpdatedAt, - error: query.state.error, - }) - - if (enableLogging) { - console.log(`📡 Request completed: ${endpoint} (${query.state.status})`) - } - } - } - }) - - return trackedQueries -} - -/** - * Creates and configures a Jotai store with QueryClient - */ -export function createTestStore(queryClient: QueryClient) { - const store = createStore() - store.set(queryClientAtom, queryClient) - return store -} - -/** - * Common test phase setup - */ -export function startTestPhase( - recorder: EnhancedTestRecorder, - phaseNumber: string, - phaseName: string, - phaseId: string, -) { - console.log(`\n${phaseNumber} ${phaseName}`) - recorder.setPhase(phaseId) -} - -/** - * Common wait utility for async operations - */ -export async function waitForCompletion(ms = 2000): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -/** - * Common pattern for logging sample data - */ -export function logSampleData>( - data: T[], - title: string, - formatter: (item: T, index: number) => void, - maxItems = 3, -) { - if (data.length > 0) { - console.log(`🔍 ${title}:`) - data.slice(0, maxItems).forEach(formatter) - } -} - -/** - * Common pattern for testing atom subscriptions - */ -export function testAtomSubscription( - store: any, - atomName: string, - atom: any, - recorder: EnhancedTestRecorder, - logResult?: (result: any) => void, -) { - const result = store.get(atom) - recorder.recordAtomSubscription(atomName, "loaded", result) - - if (logResult) { - logResult(result) - } - - return result -} - -/** - * Common test completion and cleanup - */ -export async function completeTest( - recorder: EnhancedTestRecorder, - testName: string, - basePath: string, - summary: string, -) { - console.log(`\n✅ ${testName} completed successfully!`) - console.log(`\n📊 ${summary}`) - - // Save test results to the results directory - const resultsDir = path.join(__dirname, "..", "results") - mkdirSync(resultsDir, {recursive: true}) - const filename = path.join(resultsDir, `${basePath}.json`) - await recorder.save(filename) -} - -/** - * Common error handling wrapper - */ -export async function runTestWithErrorHandling( - testName: string, - testFn: () => Promise, -): Promise { - try { - return await testFn() - } catch (error) { - console.error(`❌ ${testName} failed:`, error) - return null - } -} - -/** - * Common skeleton detection logging helper - */ -export function logSkeletonDetection(atomName: string, data: any) { - // This pattern is used in both tests for skeleton detection - if (data && typeof data === "object" && data.length === 0) { - console.log(`🎭 ${atomName}: Skeleton data detected (${data.length} items)`) - } -} - -/** - * Network request counter utility - */ -export class NetworkRequestCounter { - private count = 0 - - increment() { - this.count++ - } - - getCount(): number { - return this.count - } - - logTotal() { - console.log(`🌐 Total network requests made: ${this.count}`) - } -} diff --git a/web/oss/tests/datalayer/utils/test-analysis.ts b/web/oss/tests/datalayer/utils/test-analysis.ts deleted file mode 100644 index 5c82ce59c1..0000000000 --- a/web/oss/tests/datalayer/utils/test-analysis.ts +++ /dev/null @@ -1,634 +0,0 @@ -/** - * Test Analysis and Reporting Utilities - * - * Reusable utilities for enhanced API tracking, timeline analysis, and HTML generation - * across all atom tests in the project. - */ - -import {writeFile} from "fs/promises" - -export interface TestEvent { - ts: number - type: string - payload: any - phase?: string -} - -export interface ApiCall { - endpoint: string - method: string - timestamp: number - phase: string -} - -export interface PhaseAnalysis { - duration: number - events: number - apiCalls: number - startTime: number - endTime: number - keyActions: string[] -} - -export interface TimelineAnalysis { - phases: Record - totalDuration: number - totalEvents: number - totalApiCalls: number -} - -export interface SkeletonStateAnalysis { - hasSkeletonData: boolean - skeletonItemCount: number - loadingStage: "initial" | "partial" | "complete" | "unknown" - skeletonToRealTransitions: number - immediateRenderTime: number - progressiveLoadingStages: string[] -} - -export interface TestAnalysis { - timeline: TimelineAnalysis - summary: { - totalDuration: number - totalEvents: number - networkRequests: number - atomSubscriptions: number - dataFetches: number - derivedComputations: number - } - performance: { - networkLatency: number - atomResponseTime: number - derivedAtomPerformance: { - deploymentAtoms: number - parentAtoms: number - } - } - skeletonAnalysis: Record - insights: string[] -} - -/** - * Enhanced Test Recorder with phase-based tracking and detailed API monitoring - */ -export class EnhancedTestRecorder { - private events: TestEvent[] = [] - private startTime = Date.now() - private networkRequestCount = 0 - private apiCalls: ApiCall[] = [] - private apiCallsMap = new Map() // endpoint -> index in apiCalls array - private currentPhase = "initialization" - - setPhase(phase: string) { - this.currentPhase = phase - this.record("phase:start", {phase, timestamp: Date.now() - this.startTime}) - console.log(`🔄 Phase: ${phase}`) - } - - record(type: string, payload: any) { - this.events.push({ - ts: Date.now() - this.startTime, - type, - payload, - phase: this.currentPhase, - }) - } - - recordApiCall(endpoint: string, method = "GET", details?: any) { - const timestamp = Date.now() - this.startTime - const existingIndex = this.apiCallsMap.get(endpoint) - - if (existingIndex !== undefined) { - // Update existing API call with new status/details - this.apiCalls[existingIndex] = { - ...this.apiCalls[existingIndex], - timestamp, // Update to latest timestamp - ...details, // Merge in status, error, duration, etc. - } - } else { - // New API call - const newCall = {endpoint, method, timestamp, phase: this.currentPhase, ...details} - this.apiCalls.push(newCall) - this.apiCallsMap.set(endpoint, this.apiCalls.length - 1) - this.networkRequestCount++ - } - - this.record("api:call", { - endpoint, - method, - phase: this.currentPhase, - count: this.networkRequestCount, - timestamp, - ...details, - }) - - const status = details?.status || "pending" - console.log(`🌐 API Call [${this.currentPhase}]: ${method} ${endpoint} (${status})`) - } - - /** - * Smart skeleton detection for any atom data - */ - private detectSkeletonState(data: any): SkeletonStateAnalysis { - const startTime = performance.now() - - // Check for skeleton metadata - const hasSkeletonMeta = data?.meta?.isSkeleton === true - const loadingStage = data?.meta?.loadingStage || "unknown" - - // Check for skeleton markers in array items - let skeletonItemCount = 0 - let hasSkeletonData = hasSkeletonMeta - - if (Array.isArray(data)) { - skeletonItemCount = data.filter( - (item: any) => - item?._skeleton?.isLoading === true || - item?.app_name?.includes?.("Loading") || - item?.displayName?.includes?.("████"), - ).length - hasSkeletonData = hasSkeletonData || skeletonItemCount > 0 - } else if (data?.data && Array.isArray(data.data)) { - // Handle wrapped data - skeletonItemCount = data.data.filter( - (item: any) => - item?._skeleton?.isLoading === true || - item?.app_name?.includes?.("Loading") || - item?.displayName?.includes?.("████"), - ).length - hasSkeletonData = hasSkeletonData || skeletonItemCount > 0 - } - - // Check for loading state indicators - const isLoading = data?.isLoading || data?.loading || false - const hasLoadingStage = ["initial", "partial", "complete"].includes(loadingStage) - - if (isLoading && !hasSkeletonData && !hasLoadingStage) { - // Likely has skeleton data but not detected by our patterns - hasSkeletonData = true - } - - const immediateRenderTime = performance.now() - startTime - - return { - hasSkeletonData, - skeletonItemCount, - loadingStage: hasLoadingStage ? (loadingStage as any) : "unknown", - skeletonToRealTransitions: 0, // Will be tracked over time - } - } - - recordAtomSubscription(atomName: string, status: string, data?: any) { - // Smart skeleton detection - const skeletonDetection = this.detectSkeletonState(data) - - this.record("atom:subscription", { - atom: atomName, - status, - phase: this.currentPhase, - dataCount: data?.length || 0, - hasSkeletonData: skeletonDetection.hasSkeletonData, - skeletonCount: skeletonDetection.skeletonItemCount, - }) - - if (skeletonDetection.hasSkeletonData) { - console.log( - `🎭 ${atomName}: Skeleton data detected (${skeletonDetection.skeletonItemCount} items)`, - ) - } - - console.log(`🔗 Atom: ${atomName} (${status}) in ${this.currentPhase}`) - } - - /** - * Simple skeleton data detection - */ - private isSkeletonData(data: any): boolean { - if (!data) return false - - // Check for skeleton metadata - if (data.meta?.isSkeleton === true) return true - if (data._skeleton?.isLoading === true) return true - - // Check for skeleton patterns in arrays - if (Array.isArray(data)) { - return data.some( - (item: any) => - item?._skeleton?.isLoading === true || - item?.app_name?.includes?.("Loading") || - item?.displayName?.includes?.("████") || - item?.app_id?.startsWith?.("skeleton-"), - ) - } - - // Check wrapped data - if (data.data && Array.isArray(data.data)) { - return this.isSkeletonData(data.data) - } - - return false - } - - /** - * Count skeleton items in data - */ - private countSkeletonItems(data: any): number { - if (!data) return 0 - - if (Array.isArray(data)) { - return data.filter( - (item: any) => - item?._skeleton?.isLoading === true || - item?.app_name?.includes?.("Loading") || - item?.displayName?.includes?.("████") || - item?.app_id?.startsWith?.("skeleton-"), - ).length - } - - if (data.data && Array.isArray(data.data)) { - return this.countSkeletonItems(data.data) - } - - return 0 - } - - incrementNetworkRequest() { - this.networkRequestCount++ - this.record("network:request", {count: this.networkRequestCount}) - } - - getNetworkRequestCount() { - return this.networkRequestCount - } - - getApiCalls() { - return this.apiCalls - } - - getEvents() { - return this.events - } - - /** - * Analyze timeline by grouping events into phases - */ - analyzeTimeline(): TimelineAnalysis { - const phases: Record = {} - - // Group events by phase - this.events.forEach((event) => { - const phase = event.phase || "unknown" - if (!phases[phase]) { - phases[phase] = { - duration: 0, - events: 0, - apiCalls: 0, - startTime: event.ts, - endTime: event.ts, - keyActions: [], - } - } - - phases[phase].events++ - phases[phase].endTime = Math.max(phases[phase].endTime, event.ts) - phases[phase].startTime = Math.min(phases[phase].startTime, event.ts) - - if (event.type === "api:call") { - phases[phase].apiCalls++ - phases[phase].keyActions.push(`${event.payload.method} ${event.payload.endpoint}`) - } - }) - - // Calculate durations - Object.keys(phases).forEach((phase) => { - phases[phase].duration = phases[phase].endTime - phases[phase].startTime - }) - - const totalDuration = Math.max(...Object.values(phases).map((p) => p.endTime)) - - return { - phases, - totalDuration, - totalEvents: this.events.length, - totalApiCalls: this.networkRequestCount, - } - } - - /** - * Generate comprehensive test analysis - */ - analyzeEvents(): TestAnalysis { - const timeline = this.analyzeTimeline() - - // Count different event types - const atomSubscriptions = this.events.filter((e) => e.type === "atom:subscription").length - const dataFetches = this.events.filter((e) => e.type === "data:loaded").length - const derivedComputations = this.events.filter((e) => e.type.includes("derived")).length - - // Calculate performance metrics - const networkEvents = this.events.filter((e) => e.type === "api:call") - const networkLatency = - networkEvents.length > 0 - ? networkEvents.reduce((sum, e) => sum + (e.payload.timestamp || 0), 0) / - networkEvents.length - : 0 - - const atomEvents = this.events.filter((e) => e.type === "atom:subscription") - const atomResponseTime = - atomEvents.length > 0 - ? atomEvents.reduce((sum, e) => sum + e.ts, 0) / atomEvents.length - : 0 - - const deploymentAtoms = this.events.filter((e) => - e.payload?.atom?.includes("deployment"), - ).length - const parentAtoms = this.events.filter((e) => e.payload?.atom?.includes("parent")).length - - // Generate insights - const insights: string[] = [] - - if (timeline.totalApiCalls > 5) { - insights.push( - `High API usage detected (${timeline.totalApiCalls} calls) - consider caching optimizations`, - ) - } - - if (networkLatency > 100) { - insights.push( - `Network latency is high (${networkLatency.toFixed(2)}ms avg) - check API performance`, - ) - } - - const longestPhase = Object.entries(timeline.phases).sort( - ([, a], [, b]) => b.duration - a.duration, - )[0] - if (longestPhase) { - insights.push(`Longest phase: ${longestPhase[0]} (${longestPhase[1].duration}ms)`) - } - - if (atomSubscriptions > timeline.totalApiCalls * 2) { - insights.push( - "Good atom reactivity - more subscriptions than API calls indicates efficient state management", - ) - } - - // Analyze skeleton data across all events - const skeletonEvents = this.events.filter( - (e) => e.type === "atom:subscription" && e.payload.hasSkeletonData, - ) - const skeletonAnalysis: Record = {} - - skeletonEvents.forEach((event) => { - const atomName = event.payload.atom - if (!skeletonAnalysis[atomName]) { - skeletonAnalysis[atomName] = { - hasSkeletonData: true, - skeletonItemCount: event.payload.skeletonCount || 0, - loadingStage: "unknown", - skeletonToRealTransitions: 0, - immediateRenderTime: event.payload.immediateRender || 0, - progressiveLoadingStages: [], - } - } - }) - - // Add skeleton insights - if (Object.keys(skeletonAnalysis).length > 0) { - insights.push(`Skeleton data detected in ${Object.keys(skeletonAnalysis).length} atoms`) - const totalSkeletonItems = Object.values(skeletonAnalysis).reduce( - (sum, analysis) => sum + analysis.skeletonItemCount, - 0, - ) - if (totalSkeletonItems > 0) { - insights.push(`Total skeleton items rendered: ${totalSkeletonItems}`) - } - } - - return { - timeline, - summary: { - totalDuration: timeline.totalDuration, - totalEvents: timeline.totalEvents, - networkRequests: this.networkRequestCount, - atomSubscriptions, - dataFetches, - derivedComputations, - }, - performance: { - networkLatency, - atomResponseTime, - derivedAtomPerformance: { - deploymentAtoms, - parentAtoms, - }, - }, - skeletonAnalysis, - insights, - } - } - - /** - * Generate enhanced markdown summary - */ - generateEnhancedSummary(): string { - const timeline = this.analyzeTimeline() - - let summary = `# Enhanced Test Execution Summary\n\n` - summary += `Generated: ${new Date().toISOString()}\n\n` - summary += `## 📊 Overview\n` - summary += `- **Total Duration**: ${timeline.totalDuration}ms\n` - summary += `- **Total Events**: ${timeline.totalEvents}\n` - summary += `- **API Calls**: ${timeline.totalApiCalls}\n` - summary += `- **Phases**: ${Object.keys(timeline.phases).length}\n\n` - - summary += `## 🌐 API Endpoints Called\n\n` - this.apiCalls.forEach((call, i) => { - summary += `${i + 1}. **${call.method} ${call.endpoint}**\n` - summary += ` - Phase: ${call.phase}\n` - summary += ` - Timestamp: ${call.timestamp}ms\n\n` - }) - - summary += `## ⏱️ Phase Timeline\n\n` - Object.entries(timeline.phases) - .sort(([, a], [, b]) => a.startTime - b.startTime) - .forEach(([phase, data]) => { - summary += `### ${phase}\n` - summary += `- **Duration**: ${data.duration}ms (${data.startTime}ms - ${data.endTime}ms)\n` - summary += `- **Events**: ${data.events}\n` - summary += `- **API Calls**: ${data.apiCalls}\n` - if (data.keyActions.length > 0) { - summary += `- **Key Actions**: ${data.keyActions.join(", ")}\n` - } - summary += `\n` - }) - - return summary - } - - /** - * Generate interactive HTML visualization - */ - generateVisualization(analysis: TestAnalysis): string { - const phaseData = Object.entries(analysis.timeline.phases) - .sort(([, a], [, b]) => a.startTime - b.startTime) - .map(([name, data]) => ({ - name, - duration: data.duration, - events: data.events, - apiCalls: data.apiCalls, - startTime: data.startTime, - })) - - return ` - - - Test Analysis Visualization - - - - -
    -

    🧪 Test Analysis Dashboard

    -

    Generated: ${new Date().toISOString()}

    - -
    -
    -

    Total Duration

    -
    ${analysis.timeline.totalDuration}ms
    -
    -
    -

    API Calls

    -
    ${analysis.timeline.totalApiCalls}
    -
    -
    -

    Atom Subscriptions

    -
    ${analysis.summary.atomSubscriptions}
    -
    -
    -

    Phases

    -
    ${Object.keys(analysis.timeline.phases).length}
    -
    -
    - -
    -

    Phase Duration Timeline

    - -
    - -
    -

    Events per Phase

    - -
    - -
    -

    🌐 API Endpoints Called

    -
      - ${this.apiCalls - .map( - (call) => - `
    1. ${call.method} ${call.endpoint} [${call.phase}] at ${call.timestamp}ms
    2. `, - ) - .join("")} -
    -
    - -
    -

    💡 Key Insights

    -
      - ${analysis.insights.map((insight) => `
    • ${insight}
    • `).join("")} -
    -
    -
    - - - -` - } - - /** - * Save comprehensive test results with analysis and visualization - */ - async save(filename: string) { - const analysis = this.analyzeEvents() - const summary = this.generateEnhancedSummary() - const visualization = this.generateVisualization(analysis) - - const data = { - generatedAt: new Date().toISOString(), - totalDuration: analysis.timeline.totalDuration, - totalNetworkRequests: this.networkRequestCount, - apiCalls: this.apiCalls, - timeline: analysis.timeline, - events: this.events, - analysis, - summary, - } - - await writeFile(filename, JSON.stringify(data, null, 2)) - await writeFile(filename.replace(".json", "-summary.md"), summary) - await writeFile(filename.replace(".json", "-visualization.html"), visualization) - - console.log(`💾 Enhanced results saved to: ${filename}`) - console.log(`📄 Summary saved to: ${filename.replace(".json", "-summary.md")}`) - console.log( - `🌐 Visualization saved to: ${filename.replace(".json", "-visualization.html")}`, - ) - } -} diff --git a/web/oss/tests/datalayer/utils/test-types.ts b/web/oss/tests/datalayer/utils/test-types.ts deleted file mode 100644 index 8e09908b69..0000000000 --- a/web/oss/tests/datalayer/utils/test-types.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Test Recording Types - * - * Shared interfaces and types for test recording and analysis - * Used across multiple test files for consistency - */ - -// Basic test event structure -export interface TestEvent { - ts: number - type: string - payload: any -} - -// Comprehensive analysis result structure -export interface AnalysisResult { - summary: { - totalDuration: number - totalEvents: number - networkRequests: number - atomSubscriptions: number - dataFetches: number - derivedComputations: number - } - timeline: { - phase: string - startTime: number - endTime: number - duration: number - events: TestEvent[] - keyActions: string[] - }[] - performance: { - networkLatency: number - atomResponseTime: number - derivedAtomPerformance: { - deploymentAtoms: number - parentAtoms: number - } - } - insights: string[] -} - -// API call tracking structure -export interface ApiCall { - endpoint: string - method: string - timestamp: number - phase: string - purpose?: string -} - -// Test phase configuration -export interface TestPhase { - name: string - description: string - startTime?: number - endTime?: number -} diff --git a/web/package.json b/web/package.json index f06cb54ce3..71296b07a6 100644 --- a/web/package.json +++ b/web/package.json @@ -1,17 +1,15 @@ { "name": "agenta-web", - "version": "0.62.0", + "version": "0.50.3", "workspaces": [ "ee", "oss", - "tests", - "variants-state" + "tests" ], "dependencies": { "ajv-formats": "^3.0.1", - "jotai-eager": "^0.2.3", "json5": "^2.2.3", - "next": "15.5.2" + "next": "^15.3.4" }, "devDependencies": { "@agenta/ee": "workspace:./ee", @@ -19,23 +17,19 @@ "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.29.0", "@lexical/eslint-plugin": "^0.33.1", - "@next/eslint-plugin-next": "15.5.2", + "@next/eslint-plugin-next": "^15.3.4", "@typescript-eslint/eslint-plugin": "^8.35.0", "@typescript-eslint/parser": "^8.35.0", - "eslint": "^9.32.0", - "eslint-config-next": "15.5.2", + "eslint": "^9.29.0", + "eslint-config-next": "^15.3.4", "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.5.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.1.0", "husky": "^9.1.7", - "node-fetch": "^3.3.2", "prettier": "3.6.0", "prettier-eslint": "^16.4.0", "prettier-plugin-tailwindcss": "^0.1", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "tsx": "^4.20.3", "turbo": "2.5.4", "typescript-eslint": "^8.34.1" }, @@ -47,21 +41,8 @@ "dev-oss": "turbo run dev --filter=@agenta/oss", "lint": "turbo run lint", "lint-fix": "turbo run lint -- --fix", - "test:revision-centric": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-revision-centric.ts", - "test:apps": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-apps.ts", - "test:environments": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-environments.ts", - "test:deployments": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-deployments.ts", - "test:orgs": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-orgs.ts", - "test:profile": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-profile.ts", - "test:workspace": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-workspace.ts", - "test:project": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-project.ts", - "test:newPlayground": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-newPlayground.ts", - "test:playground-dev": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/run-playground-tests.ts", - "test:observability": "tsx --tsconfig oss/tsconfig.json oss/tests/datalayer/test-observability.ts", - "test:datalayer": "pnpm test:revision-centric && pnpm test:apps && pnpm test:environments && pnpm test:deployments && pnpm test:orgs && pnpm test:profile && pnpm test:workspace && pnpm test:project && pnpm test:newPlayground && pnpm test:observability", "format": "prettier --check \"**/*.{js,jsx,cjs,mjs,ts,tsx,cts,mts,mdx}\" --ignore-path ./ee/.gitignore --ignore-path ./oss/.gitignore", - "format-fix": "prettier --write \"**/*.{js,jsx,cjs,mjs,ts,tsx,cts,mts,mdx}\" --ignore-path ./ee/.gitignore --ignore-path ./oss/.gitignore", - "generate:tailwind-tokens": "tsx scripts/generate-tailwind-tokens.ts" + "format-fix": "prettier --write \"**/*.{js,jsx,cjs,mjs,ts,tsx,cts,mts,mdx}\" --ignore-path ./ee/.gitignore --ignore-path ./oss/.gitignore" }, "pnpm": { "ignoredBuiltDependencies": [ diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 0057554c07..911d2b9310 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -15,15 +15,12 @@ importers: ajv-formats: specifier: ^3.0.1 version: 3.0.1(ajv@8.17.1) - jotai-eager: - specifier: ^0.2.3 - version: 0.2.3(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)) json5: specifier: ^2.2.3 version: 2.2.3 next: - specifier: 15.5.2 - version: 15.5.2(@playwright/test@1.53.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^15.3.4 + version: 15.3.4(@playwright/test@1.53.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) devDependencies: '@agenta/ee': specifier: workspace:./ee @@ -39,40 +36,37 @@ importers: version: 9.29.0 '@lexical/eslint-plugin': specifier: ^0.33.1 - version: 0.33.1(eslint@9.32.0(jiti@1.21.7)) + version: 0.33.1(eslint@9.29.0(jiti@1.21.7)) '@next/eslint-plugin-next': - specifier: 15.5.2 - version: 15.5.2 + specifier: ^15.3.4 + version: 15.3.4 '@typescript-eslint/eslint-plugin': specifier: ^8.35.0 - version: 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.35.0 - version: 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) eslint: - specifier: ^9.32.0 - version: 9.32.0(jiti@1.21.7) + specifier: ^9.29.0 + version: 9.29.0(jiti@1.21.7) eslint-config-next: - specifier: 15.5.2 - version: 15.5.2(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + specifier: ^15.3.4 + version: 15.3.4(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.32.0(jiti@1.21.7)) + version: 10.1.5(eslint@9.29.0(jiti@1.21.7)) eslint-plugin-prettier: specifier: ^5.5.0 - version: 5.5.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.32.0(jiti@1.21.7)))(eslint@9.32.0(jiti@1.21.7))(prettier@3.6.0) + version: 5.5.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.29.0(jiti@1.21.7)))(eslint@9.29.0(jiti@1.21.7))(prettier@3.6.0) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.32.0(jiti@1.21.7)) + version: 7.37.5(eslint@9.29.0(jiti@1.21.7)) eslint-plugin-react-hooks: specifier: ^5.1.0 - version: 5.2.0(eslint@9.32.0(jiti@1.21.7)) + version: 5.2.0(eslint@9.29.0(jiti@1.21.7)) husky: specifier: ^9.1.7 version: 9.1.7 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 prettier: specifier: 3.6.0 version: 3.6.0 @@ -82,21 +76,12 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.1 version: 0.1.13(prettier@3.6.0) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.19.19)(typescript@5.8.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - tsx: - specifier: ^4.20.3 - version: 4.20.3 turbo: specifier: 2.5.4 version: 2.5.4 typescript-eslint: specifier: ^8.34.1 - version: 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) ee: dependencies: @@ -130,21 +115,12 @@ importers: '@ant-design/v5-patch-for-react-19': specifier: ^1.0.3 version: 1.0.3(antd@5.26.1(date-fns@3.6.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/code-shiki': - specifier: ^0.35.0 - version: 0.35.0 '@monaco-editor/react': specifier: ^4.7.0-rc.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/query-core': - specifier: ^5.87.1 - version: 5.87.1 - '@tanstack/react-query': - specifier: ^5.87.1 - version: 5.87.1(react@19.0.0) '@tremor/react': specifier: ^3.18.7 version: 3.18.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -166,9 +142,6 @@ importers: '@types/react-window': specifier: ^1.8.8 version: 1.8.8 - '@types/recharts': - specifier: ^2.0.1 - version: 2.0.1(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0)(redux@5.0.1) '@types/uuid': specifier: ^10.0.0 version: 10.0.0 @@ -179,8 +152,8 @@ importers: specifier: 10.4.20 version: 10.4.20(postcss@8.5.6) axios: - specifier: ^1.12.2 - version: 1.12.2(debug@4.4.0) + specifier: ^1.7.7 + version: 1.8.2(debug@4.4.0) classnames: specifier: ^2.3.2 version: 2.5.1 @@ -199,30 +172,18 @@ importers: fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 - immer: - specifier: ^10.1.1 - version: 10.1.3 jotai: - specifier: ^2.13.1 - version: 2.13.1(@types/react@19.0.10)(react@19.0.0) - jotai-devtools: - specifier: ^0.12.0 - version: 0.12.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(redux@5.0.1)(storybook@8.6.14(prettier@3.6.0)) + specifier: ^2.12.5 + version: 2.12.5(@types/react@19.0.10)(react@19.0.0) jotai-eager: specifier: ^0.2.3 - version: 0.2.3(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)) + version: 0.2.3(jotai@2.12.5(@types/react@19.0.10)(react@19.0.0)) jotai-immer: specifier: ^0.4.1 - version: 0.4.1(immer@10.1.3)(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)) - jotai-tanstack-query: - specifier: ^0.11.0 - version: 0.11.0(@tanstack/query-core@5.87.1)(@tanstack/react-query@5.87.1(react@19.0.0))(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0))(react@19.0.0) + version: 0.4.1(immer@10.1.1)(jotai@2.12.5(@types/react@19.0.10)(react@19.0.0)) js-yaml: specifier: ^4.1.0 version: 4.1.0 - jsonrepair: - specifier: ^3.13.0 - version: 3.13.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -235,9 +196,6 @@ importers: posthog-js: specifier: ^1.223.3 version: 1.229.5 - rc-virtual-list: - specifier: ^3.19.1 - version: 3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: ^19.0.0 version: 19.0.0 @@ -253,12 +211,6 @@ importers: react-window: specifier: ^1.8.11 version: 1.8.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - recharts: - specifier: ^3.1.0 - version: 3.1.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0)(redux@5.0.1) - shiki: - specifier: ^3.12.2 - version: 3.12.2 supertokens-auth-react: specifier: ^0.47.0 version: 0.47.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(supertokens-web-js@0.13.1) @@ -267,13 +219,13 @@ importers: version: 21.1.0 swc-loader: specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.17))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))) + version: 0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.15))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15))) swr: specifier: ^2.3.0 version: 2.3.3(react@19.0.0) tailwindcss: specifier: ^3.4.4 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -290,12 +242,6 @@ importers: '@agenta/web-tests': specifier: workspace:../tests version: link:../tests - '@swc-jotai/debug-label': - specifier: ^0.2.0 - version: 0.2.0 - '@swc-jotai/react-refresh': - specifier: ^0.3.0 - version: 0.3.0 '@types/node': specifier: ^20.8.10 version: 20.17.24 @@ -307,7 +253,7 @@ importers: version: 1.17.2(@types/node@20.17.24) tailwind-scrollbar: specifier: ^3 - version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3))) + version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3))) oss: dependencies: @@ -364,55 +310,52 @@ importers: version: 1.7.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@headlessui/tailwindcss': specifier: ^0.2.1 - version: 0.2.2(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3))) + version: 0.2.2(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3))) '@lexical/code': - specifier: ^0.35.0 - version: 0.35.0 - '@lexical/code-shiki': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/hashtag': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/history': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/link': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/list': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/mark': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/markdown': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/overflow': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/react': - specifier: ^0.35.0 - version: 0.35.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.24) + specifier: ^0.33.1 + version: 0.33.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.24) '@lexical/rich-text': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/selection': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/table': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@lexical/utils': - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 '@monaco-editor/react': specifier: ^4.7.0-rc.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@next/bundle-analyzer': - specifier: 15.5.2 - version: 15.5.2 + specifier: ^15.3.4 + version: 15.3.4 '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -427,13 +370,10 @@ importers: version: 0.1.9 '@tailwindcss/container-queries': specifier: ^0.1.1 - version: 0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3))) + version: 0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3))) - '@tanstack/react-query': - specifier: ^5.87.1 - version: 5.87.1(react@19.0.0) + version: 0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3))) '@tremor/react': specifier: ^3.18.7 version: 3.18.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -483,8 +423,8 @@ importers: specifier: 10.4.20 version: 10.4.20(postcss@8.5.6) axios: - specifier: ^1.12.2 - version: 1.12.2(debug@4.4.0) + specifier: ^1.7.7 + version: 1.8.2(debug@4.4.0) blakejs: specifier: ^1.2.1 version: 1.2.1 @@ -510,35 +450,26 @@ importers: specifier: ^11.11.1 version: 11.11.1 immer: - specifier: ^10.1.3 - version: 10.1.3 + specifier: ^10.1.1 + version: 10.1.1 jotai: - specifier: ^2.13.1 - version: 2.13.1(@types/react@19.0.10)(react@19.0.0) - jotai-devtools: - specifier: ^0.12.0 - version: 0.12.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(redux@5.0.1)(storybook@8.6.14(prettier@3.6.0)) + specifier: ^2.12.5 + version: 2.12.5(@types/react@19.0.10)(react@19.0.0) jotai-eager: specifier: ^0.2.3 - version: 0.2.3(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)) + version: 0.2.3(jotai@2.12.5(@types/react@19.0.10)(react@19.0.0)) jotai-immer: specifier: ^0.4.1 - version: 0.4.1(immer@10.1.3)(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)) - jotai-tanstack-query: - specifier: ^0.11.0 - version: 0.11.0(@tanstack/query-core@5.87.1)(@tanstack/react-query@5.87.1(react@19.0.0))(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0))(react@19.0.0) + version: 0.4.1(immer@10.1.1)(jotai@2.12.5(@types/react@19.0.10)(react@19.0.0)) js-beautify: specifier: ^1.14.8 version: 1.15.4 js-yaml: specifier: ^4.1.0 version: 4.1.0 - jsonrepair: - specifier: ^3.13.0 - version: 3.13.0 lexical: - specifier: ^0.35.0 - version: 0.35.0 + specifier: ^0.33.1 + version: 0.33.1 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -546,8 +477,8 @@ importers: specifier: ^0.475.0 version: 0.475.0(react@19.0.0) next: - specifier: 15.5.2 - version: 15.5.2(@playwright/test@1.53.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^15.3.4 + version: 15.3.4(@playwright/test@1.53.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) papaparse: specifier: ^5.5.3 version: 5.5.3 @@ -566,9 +497,6 @@ importers: promise-retry: specifier: ^2.0.1 version: 2.0.1 - rc-virtual-list: - specifier: ^3.19.1 - version: 3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: ^19.0.0 version: 19.0.0 @@ -593,15 +521,9 @@ importers: react-window: specifier: ^1.8.11 version: 1.8.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - recharts: - specifier: ^3.1.0 - version: 3.1.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0)(redux@5.0.1) semver: specifier: ^7.7.2 version: 7.7.2 - shiki: - specifier: ^3.12.2 - version: 3.12.2 stable-hash: specifier: ^0.0.6 version: 0.0.6 @@ -613,7 +535,7 @@ importers: version: 21.1.0 swc-loader: specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.17))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10)) + version: 0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.15))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15))) swr: specifier: ^2.3.0 version: 2.3.3(react@19.0.0) @@ -622,7 +544,7 @@ importers: version: 1.3.2(react@19.0.0)(swr@2.3.3(react@19.0.0)) tailwindcss: specifier: ^3.4.4 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -639,12 +561,6 @@ importers: specifier: ^5.1.0 version: 5.1.0 devDependencies: - '@swc-jotai/debug-label': - specifier: ^0.2.0 - version: 0.2.0 - '@swc-jotai/react-refresh': - specifier: ^0.3.0 - version: 0.3.0 '@types/node': specifier: ^20.8.10 version: 20.17.24 @@ -659,13 +575,13 @@ importers: version: 1.17.2(@types/node@20.17.24) tailwind-scrollbar: specifier: ^3 - version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3))) + version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3))) tests: dependencies: axios: - specifier: ^1.12.2 - version: 1.12.2(debug@4.4.0) + specifier: ^1.7.9 + version: 1.8.2(debug@4.4.0) devDependencies: '@playwright/test': specifier: ^1.53.1 @@ -685,9 +601,6 @@ importers: packages: - '@adobe/css-tools@4.4.3': - resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} - '@ag-grid-community/client-side-row-model@32.3.4': resolution: {integrity: sha512-AZyLSemPyaCJi8wPJ/wvwow6v4MZKMkg9152TameKvaEf+m+N+gWJNKb1dQoqjgWCgEByqvM6SO8dJtYRrdr/A==} @@ -756,14 +669,6 @@ packages: react: '>=19.0.0' react-dom: '>=19.0.0' - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.0': resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} @@ -811,8 +716,8 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} @@ -829,306 +734,150 @@ packages: '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.5': resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.5': resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.5': resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.5': resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.5': resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.5': resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.5': resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.5': resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.5': resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.5': resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.5': resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.5': resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.5': resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.5': resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.5': resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.5': resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.5': resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.5': resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.5': resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.5': resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} @@ -1145,16 +894,20 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.3': + resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.0': + resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@2.1.4': @@ -1173,16 +926,12 @@ packages: resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.32.0': - resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.2': + resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.7.2': @@ -1273,124 +1022,118 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/sharp-darwin-arm64@0.34.3': - resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.3': - resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': - resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': - resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.0': - resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': - resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': - resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': - resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': - resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.3': - resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.3': - resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.3': - resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - - '@img/sharp-linux-s390x@0.34.3': - resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.3': - resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': - resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': - resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.3': - resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.3': - resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.3': - resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.3': - resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1403,9 +1146,6 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -1418,123 +1158,94 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@lexical/clipboard@0.35.0': - resolution: {integrity: sha512-ko7xSIIiayvDiqjNDX6fgH9RlcM6r9vrrvJYTcfGVBor5httx16lhIi0QJZ4+RNPvGtTjyFv4bwRmsixRRwImg==} + '@lexical/clipboard@0.33.1': + resolution: {integrity: sha512-Qd3/Cm3TW2DFQv58kMtLi86u5YOgpBdf+o7ySbXz55C613SLACsYQBB3X5Vu5hTx/t/ugYOpII4HkiatW6d9zA==} - '@lexical/code-shiki@0.35.0': - resolution: {integrity: sha512-DeMb1rbeddgLYqaf63kzUWUlTZT6AS16Ty1ff5a3QPuqa4ZILFIOHyUpqApmyoe6v2S8gQcdUPdRth1vEELRyQ==} + '@lexical/code@0.33.1': + resolution: {integrity: sha512-E0Y/+1znkqVpP52Y6blXGAduoZek9SSehJN+vbH+4iQKyFwTA7JB+jd5C5/K0ik55du9X7SN/oTynByg7lbcAA==} - '@lexical/code@0.35.0': - resolution: {integrity: sha512-ox4DZwETQ9IA7+DS6PN8RJNwSAF7RMjL7YTVODIqFZ5tUFIf+5xoCHbz7Fll0Bvixlp12hVH90xnLwTLRGpkKw==} - - '@lexical/devtools-core@0.35.0': - resolution: {integrity: sha512-C2wwtsMCR6ZTfO0TqpSM17RLJWyfHmifAfCTjFtOJu15p3M6NO/nHYK5Mt7YMQteuS89mOjB4ng8iwoLEZ6QpQ==} + '@lexical/devtools-core@0.33.1': + resolution: {integrity: sha512-3yHu5diNtjwhoe2q/x9as6n6rIfA+QO2CfaVjFRkam8rkAW6zUzQT1D0fQdE8nOfWvXBgY1mH/ZLP4dDXBdG5Q==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/dragon@0.35.0': - resolution: {integrity: sha512-SL6mT5pcqrt6hEbJ16vWxip5+r3uvMd0bQV5UUxuk+cxIeuP86iTgRh0HFR7SM2dRTYovL6/tM/O+8QLAUGTIg==} + '@lexical/dragon@0.33.1': + resolution: {integrity: sha512-UQ6DLkcDAr83wA1vz3sUgtcpYcMifC4sF0MieZAoMzFrna6Ekqj7OJ7g8Lo7m7AeuT4NETRVDsjIEDdrQMKLLA==} '@lexical/eslint-plugin@0.33.1': resolution: {integrity: sha512-8NpSBL3A3RZljPN1xScPHa7jwWFVP3mR0Q4iBIZNwu1lT7CqJTJgsiYaPNLURXjMBna9eUXCmgpLGS8qfrAT+w==} peerDependencies: eslint: '>=7.31.0 || ^8.0.0' - '@lexical/hashtag@0.35.0': - resolution: {integrity: sha512-LYJWzXuO2ZjKsvQwrLkNZiS2TsjwYkKjlDgtugzejquTBQ/o/nfSn/MmVx6EkYLOYizaJemmZbz3IBh+u732FA==} + '@lexical/hashtag@0.33.1': + resolution: {integrity: sha512-M3IsDe4cifggMBZgYAVT7hCLWcwQ3dIcUPdr9Xc6wDQQQdEqOQYB0PO//9bSYUVq+BNiiTgysc+TtlM7PiJfiw==} - '@lexical/history@0.35.0': - resolution: {integrity: sha512-onjDRLLxGbCfHexSxxrQaDaieIHyV28zCDrbxR5dxTfW8F8PxjuNyuaG0z6o468AXYECmclxkP+P4aT6poHEpQ==} + '@lexical/history@0.33.1': + resolution: {integrity: sha512-Bk0h3D6cFkJ7w3HKvqQua7n6Xfz7nR7L3gLDBH9L0nsS4MM9+LteSEZPUe0kj4VuEjnxufYstTc9HA2aNLKxnQ==} - '@lexical/html@0.35.0': - resolution: {integrity: sha512-rXGFE5S5rKsg3tVnr1s4iEgOfCApNXGpIFI3T2jGEShaCZ5HLaBY9NVBXnE9Nb49e9bkDkpZ8FZd1qokCbQXbw==} + '@lexical/html@0.33.1': + resolution: {integrity: sha512-t14vu4eKa6BWz1N7/rwXgXif1k4dj73dRvllWJgfXum+a36vn1aySNYOlOfqWXF7k1b3uJmoqsWK7n/1ASnimw==} - '@lexical/link@0.35.0': - resolution: {integrity: sha512-+0Wx6cBwO8TfdMzpkYFacsmgFh8X1rkiYbq3xoLvk3qV8upYxaMzK1s8Q1cpKmWyI0aZrU6z7fiK4vUqB7+69w==} + '@lexical/link@0.33.1': + resolution: {integrity: sha512-JCTu7Fft2J2kgfqJiWnGei+UMIXVKiZKaXzuHCuGQTFu92DeCyd02azBaFazZHEkSqCIFZ0DqVV2SpIJmd0Ygw==} - '@lexical/list@0.35.0': - resolution: {integrity: sha512-owsmc8iwgExBX8sFe8fKTiwJVhYULt9hD1RZ/HwfaiEtRZZkINijqReOBnW2mJfRxBzhFSWc4NG3ISB+fHYzqw==} + '@lexical/list@0.33.1': + resolution: {integrity: sha512-PXp56dWADSThc9WhwWV4vXhUc3sdtCqsfPD3UQNGUZ9rsAY1479rqYLtfYgEmYPc8JWXikQCAKEejahCJIm8OQ==} - '@lexical/mark@0.35.0': - resolution: {integrity: sha512-W0hwMTAVeexvpk9/+J6n1G/sNkpI/Meq1yeDazahFLLAwXLHtvhIAq2P/klgFknDy1hr8X7rcsQuN/bqKcKHYg==} + '@lexical/mark@0.33.1': + resolution: {integrity: sha512-tGdOf1e694lnm/HyWUKEkEWjDyfhCBFG7u8iRKNpsYTpB3M1FsJUXbphE2bb8MyWfhHbaNxnklupSSaSPzO88A==} - '@lexical/markdown@0.35.0': - resolution: {integrity: sha512-BlNyXZAt4gWidMw0SRWrhBETY1BpPglFBZI7yzfqukFqgXRh7HUQA28OYeI/nsx9pgNob8TiUduUwShqqvOdEA==} + '@lexical/markdown@0.33.1': + resolution: {integrity: sha512-p5zwWNF70pELRx60wxE8YOFVNiNDkw7gjKoYqkED23q5hj4mcqco9fQf6qeeZChjxLKjfyT6F1PpWgxmlBlxBw==} - '@lexical/offset@0.35.0': - resolution: {integrity: sha512-DRE4Df6qYf2XiV6foh6KpGNmGAv2ANqt3oVXpyS6W8hTx3+cUuAA1APhCZmLNuU107um4zmHym7taCu6uXW5Yg==} + '@lexical/offset@0.33.1': + resolution: {integrity: sha512-3YIlUs43QdKSBLEfOkuciE2tn9loxVmkSs/HgaIiLYl0Edf1W00FP4ItSmYU4De5GopXsHq6+Y3ry4pU/ciUiQ==} - '@lexical/overflow@0.35.0': - resolution: {integrity: sha512-B25YvnJQTGlZcrNv7b0PJBLWq3tl8sql497OHfYYLem7EOMPKKDGJScJAKM/91D4H/mMAsx5gnA/XgKobriuTg==} + '@lexical/overflow@0.33.1': + resolution: {integrity: sha512-3BDq1lOw567FeCk4rN2ellKwoXTM9zGkGuKnSGlXS1JmtGGGSvT+uTANX3KOOfqTNSrOkrwoM+3hlFv7p6VpiQ==} - '@lexical/plain-text@0.35.0': - resolution: {integrity: sha512-lwBCUNMJf7Gujp2syVWMpKRahfbTv5Wq+H3HK1Q1gKH1P2IytPRxssCHvexw9iGwprSyghkKBlbF3fGpEdIJvQ==} + '@lexical/plain-text@0.33.1': + resolution: {integrity: sha512-2HxdhAx6bwF8y5A9P0q3YHsYbhUo4XXm+GyKJO87an8JClL2W+GYLTSDbfNWTh4TtH95eG+UYLOjNEgyU6tsWA==} - '@lexical/react@0.35.0': - resolution: {integrity: sha512-uYAZSqumH8tRymMef+A0f2hQvMwplKK9DXamcefnk3vSNDHHqRWQXpiUo6kD+rKWuQmMbVa5RW4xRQebXEW+1A==} + '@lexical/react@0.33.1': + resolution: {integrity: sha512-ylnUmom5h8PY+Z14uDmKLQEoikTPN77GRM0NRCIdtbWmOQqOq/5BhuCzMZE1WvpL5C6n3GtK6IFnsMcsKmVOcw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/rich-text@0.35.0': - resolution: {integrity: sha512-qEHu8g7vOEzz9GUz1VIUxZBndZRJPh9iJUFI+qTDHj+tQqnd5LCs+G9yz6jgNfiuWWpezTp0i1Vz/udNEuDPKQ==} + '@lexical/rich-text@0.33.1': + resolution: {integrity: sha512-ZBIsj4LwmamRBCGjJiPSLj7N/XkUDv/pnYn5Rp0BL42WpOiQLvOoGLrZxgUJZEmRPQnx42ZgLKVgrWHsyjuoAA==} - '@lexical/selection@0.35.0': - resolution: {integrity: sha512-mMtDE7Q0nycXdFTTH/+ta6EBrBwxBB4Tg8QwsGntzQ1Cq//d838dpXpFjJOqHEeVHUqXpiuj+cBG8+bvz/rPRw==} + '@lexical/selection@0.33.1': + resolution: {integrity: sha512-KXPkdCDdVfIUXmkwePu9DAd3kLjL0aAqL5G9CMCFsj7RG9lLvvKk7kpivrAIbRbcsDzO44QwsFPisZHbX4ioXA==} - '@lexical/table@0.35.0': - resolution: {integrity: sha512-9jlTlkVideBKwsEnEkqkdg7A3mije1SvmfiqoYnkl1kKJCLA5iH90ywx327PU0p+bdnURAytWUeZPXaEuEl2OA==} + '@lexical/table@0.33.1': + resolution: {integrity: sha512-pzB11i1Y6fzmy0IPUKJyCdhVBgXaNOxJUxrQJWdKNYCh1eMwwMEQvj+8inItd/11aUkjcdHjwDTht8gL2UHKiQ==} - '@lexical/text@0.35.0': - resolution: {integrity: sha512-uaMh46BkysV8hK8wQwp5g/ByZW+2hPDt8ahAErxtf8NuzQem1FHG/f5RTchmFqqUDVHO3qLNTv4AehEGmXv8MA==} + '@lexical/text@0.33.1': + resolution: {integrity: sha512-CnyU3q3RytXXWVSvC5StOKISzFAPGK9MuesNDDGyZk7yDK+J98gV6df4RBKfqwcokFMThpkUlvMeKe1+S2y25A==} - '@lexical/utils@0.35.0': - resolution: {integrity: sha512-2H393EYDnFznYCDFOW3MHiRzwEO5M/UBhtUjvTT+9kc+qhX4U3zc8ixQalo5UmZ5B2nh7L/inXdTFzvSRXtsRA==} + '@lexical/utils@0.33.1': + resolution: {integrity: sha512-eKysPjzEE9zD+2af3WRX5U3XbeNk0z4uv1nXGH3RG15uJ4Huzjht82hzsQpCFUobKmzYlQaQs5y2IYKE2puipQ==} - '@lexical/yjs@0.35.0': - resolution: {integrity: sha512-3DSP7QpmTGYU9bN/yljP0PIao4tNIQtsR4ycauWNSawxs/GQCZtSmAPcLRnCm6qpqsDDjUtKjO/1Ej8FRp0m0w==} + '@lexical/yjs@0.33.1': + resolution: {integrity: sha512-Zx1rabMm/Zjk7n7YQMIQLUN+tqzcg1xqcgNpEHSfK1GA8QMPXCPvXWFT3ZDC4tfZOSy/YIqpVUyWZAomFqRa+g==} peerDependencies: yjs: '>=13.5.22' - '@mantine/code-highlight@7.17.8': - resolution: {integrity: sha512-KfdLi8MhpoeHiXkLMfuPQz1IDTUjvP2w3hbdx8Oz/hL0o+mbPYfgrU/w/D3ONjVQMoEbPpEL5vSA2eTYCmwVKg==} - peerDependencies: - '@mantine/core': 7.17.8 - '@mantine/hooks': 7.17.8 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x - - '@mantine/core@7.17.8': - resolution: {integrity: sha512-42sfdLZSCpsCYmLCjSuntuPcDg3PLbakSmmYfz5Auea8gZYLr+8SS5k647doVu0BRAecqYOytkX2QC5/u/8VHw==} - peerDependencies: - '@mantine/hooks': 7.17.8 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x - - '@mantine/hooks@7.17.8': - resolution: {integrity: sha512-96qygbkTjRhdkzd5HDU8fMziemN/h758/EwrFu7TlWrEP10Vw076u+Ap/sG6OT4RGPZYYoHrTlT+mkCZblWHuw==} - peerDependencies: - react: ^18.x || ^19.x - '@monaco-editor/loader@1.5.0': resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} @@ -1548,59 +1259,59 @@ packages: '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@next/bundle-analyzer@15.5.2': - resolution: {integrity: sha512-UWOFpy/NK5iSeIP0mgdq4VqGB4/z37uq5v5dEtvzmY/BlaPO6m4EtFUaH6RVI0w2wG5sh0TG86i/cA5wcaJtgg==} + '@next/bundle-analyzer@15.3.4': + resolution: {integrity: sha512-AN9H9S+4WaIIahyJBGe6arLj5kopvVZPLffAJsDhkbQPGqirYqaHhwO6vheytXtdq3xNjwJLpbmYNa5ZQnitSw==} - '@next/env@15.5.2': - resolution: {integrity: sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==} + '@next/env@15.3.4': + resolution: {integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==} - '@next/eslint-plugin-next@15.5.2': - resolution: {integrity: sha512-lkLrRVxcftuOsJNhWatf1P2hNVfh98k/omQHrCEPPriUypR6RcS13IvLdIrEvkm9AH2Nu2YpR5vLqBuy6twH3Q==} + '@next/eslint-plugin-next@15.3.4': + resolution: {integrity: sha512-lBxYdj7TI8phbJcLSAqDt57nIcobEign5NYIKCiy0hXQhrUbTqLqOaSDi568U6vFg4hJfBdZYsG4iP/uKhCqgg==} - '@next/swc-darwin-arm64@15.5.2': - resolution: {integrity: sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==} + '@next/swc-darwin-arm64@15.3.4': + resolution: {integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.2': - resolution: {integrity: sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==} + '@next/swc-darwin-x64@15.3.4': + resolution: {integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.2': - resolution: {integrity: sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==} + '@next/swc-linux-arm64-gnu@15.3.4': + resolution: {integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.2': - resolution: {integrity: sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==} + '@next/swc-linux-arm64-musl@15.3.4': + resolution: {integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.2': - resolution: {integrity: sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==} + '@next/swc-linux-x64-gnu@15.3.4': + resolution: {integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.2': - resolution: {integrity: sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==} + '@next/swc-linux-x64-musl@15.3.4': + resolution: {integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.2': - resolution: {integrity: sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==} + '@next/swc-win32-arm64-msvc@15.3.4': + resolution: {integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.2': - resolution: {integrity: sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==} + '@next/swc-win32-x64-msvc@15.3.4': + resolution: {integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1744,22 +1455,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@redux-devtools/extension@3.3.0': - resolution: {integrity: sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==} - peerDependencies: - redux: ^3.1.0 || ^4.0.0 || ^5.0.0 - - '@reduxjs/toolkit@2.8.2': - resolution: {integrity: sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==} - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 || ^19 - react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -1774,68 +1469,9 @@ packages: resolution: {integrity: sha512-HQQudOSQBU7ewzfnBW9LhDmBE2XOJgSfwrh5PlUB7zJup/kaRkBGNgV2wMjNz9Af/uztiU/xNrO179FysmUT+g==} engines: {node: '>=18'} - '@shikijs/core@3.12.2': - resolution: {integrity: sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==} - - '@shikijs/engine-javascript@3.12.2': - resolution: {integrity: sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==} - - '@shikijs/engine-oniguruma@3.12.2': - resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} - - '@shikijs/langs@3.12.2': - resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} - - '@shikijs/themes@3.12.2': - resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} - - '@shikijs/types@3.12.2': - resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - - '@storybook/core@8.6.14': - resolution: {integrity: sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==} - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - - '@storybook/instrumenter@8.6.14': - resolution: {integrity: sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/test@8.6.14': - resolution: {integrity: sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/theming@8.6.14': - resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@swc-jotai/debug-label@0.2.0': - resolution: {integrity: sha512-vlHfGuN+w3TMb8UUGFEoWWuC3a8xTz/cJWI/58gTwF7R0p8Z75fwiZpi62Sq8JhCYRGHnXCzJxaA1Oszdev3Xg==} - - '@swc-jotai/react-refresh@0.3.0': - resolution: {integrity: sha512-WIWesycqFWqFRlfMa/NYON7AX6zTtSwK7z+nVRgdlk2r5iIv2/BDTeRgg3on+YvYlKR7IipioRVswyPOTq/ZKA==} - '@swc/core-darwin-arm64@1.11.8': resolution: {integrity: sha512-rrSsunyJWpHN+5V1zumndwSSifmIeFQBK9i2RMQQp15PgbgUNxHK5qoET1n20pcUrmZeT6jmJaEWlQchkV//Og==} engines: {node: '>=10'} @@ -1911,11 +1547,8 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/types@0.1.23': + resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} '@tailwindcss/container-queries@0.1.1': resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} @@ -1927,14 +1560,6 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' - '@tanstack/query-core@5.87.1': - resolution: {integrity: sha512-HOFHVvhOCprrWvtccSzc7+RNqpnLlZ5R6lTmngb8aq7b4rc2/jDT0w+vLdQ4lD9bNtQ+/A4GsFXy030Gk4ollA==} - - '@tanstack/react-query@5.87.1': - resolution: {integrity: sha512-YKauf8jfMowgAqcxj96AHs+Ux3m3bWT1oSVKamaRPXSnW2HqSznnTCEkAVqctF1e/W9R/mPcyzzINIgpOH94qg==} - peerDependencies: - react: ^18 || ^19 - '@tanstack/react-virtual@3.13.2': resolution: {integrity: sha512-LceSUgABBKF6HSsHK2ZqHzQ37IKV/jlaWbHm+NyTa3/WNb/JZVcThDuTainf+PixltOOcFCYXwxbLpOX9sCx+g==} peerDependencies: @@ -1944,20 +1569,6 @@ packages: '@tanstack/virtual-core@3.13.2': resolution: {integrity: sha512-Qzz4EgzMbO5gKrmqUondCjiHcuu4B1ftHb0pjCut661lXZdGoHeze9f/M8iwsK1t5LGR6aNuNGU7mxkowaW6RQ==} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.5.0': - resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - '@tremor/react@3.18.7': resolution: {integrity: sha512-nmqvf/1m0GB4LXc7v2ftdfSLoZhy5WLrhV6HNf0SOriE6/l8WkYeWuhQq8QsBjRi94mUIKLJ/VC3/Y/pj6VubQ==} peerDependencies: @@ -1979,12 +1590,6 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/base16@1.0.5': - resolution: {integrity: sha512-OzOWrTluG9cwqidEzC/Q6FAmIPcnZfm8BFRlIx0+UIUqnuAmi5OS88O0RpT3Yz6qdmqObvUhasrbNsCofE4W9A==} - '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -2027,9 +1632,6 @@ packages: '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/js-beautify@1.14.3': resolution: {integrity: sha512-FMbQHz+qd9DoGvgLHxeqqVPaNRffpIu5ZjozwV8hf9JAGpIOzuAf4wGbRSo8LNITHqGjmmVjaMggTT5P4v4IHg==} @@ -2045,17 +1647,11 @@ packages: '@types/lodash@4.17.18': resolution: {integrity: sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==} - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/node@20.17.24': resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} - '@types/node@20.19.11': - resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==} - - '@types/node@20.19.19': - resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} + '@types/node@20.19.1': + resolution: {integrity: sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==} '@types/papaparse@5.3.15': resolution: {integrity: sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==} @@ -2083,10 +1679,6 @@ packages: '@types/react@19.0.10': resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} - '@types/recharts@2.0.1': - resolution: {integrity: sha512-/cFs7oiafzByUwBSWA1IzE6FW+ppPwQAWsDTadSgVOwzveY9MESpyLHyyHY0SfPPKLW4+4qVNYHPXd0rFiC8vg==} - deprecated: This is a stub types definition. recharts provides its own type definitions, so you do not need this installed. - '@types/retry@0.12.5': resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} @@ -2096,12 +1688,6 @@ packages: '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/use-sync-external-store@0.0.6': - resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -2352,24 +1938,6 @@ packages: cpu: [x64] os: [win32] - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -2539,9 +2107,6 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -2582,17 +2147,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -2615,8 +2172,8 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + axios@1.8.2: + resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -2625,20 +2182,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.13: - resolution: {integrity: sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==} - hasBin: true - - better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2656,9 +2202,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - browser-tabs-lock@1.3.0: resolution: {integrity: sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw==} @@ -2667,8 +2210,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.26.3: - resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2681,6 +2224,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2704,50 +2251,26 @@ packages: caniuse-lite@1.0.30001703: resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==} - caniuse-lite@1.0.30001734: - resolution: {integrity: sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==} - - caniuse-lite@1.0.30001748: - resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} + caniuse-lite@1.0.30001724: + resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2770,25 +2293,16 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -2800,9 +2314,6 @@ packages: comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -2875,9 +2386,6 @@ packages: css-vendor@2.0.8: resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2933,10 +2441,6 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -2984,22 +2488,9 @@ packages: supports-color: optional: true - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3007,10 +2498,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -3031,18 +2518,9 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -3066,12 +2544,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} @@ -3100,8 +2572,8 @@ packages: electron-to-chromium@1.5.113: resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} - electron-to-chromium@1.5.232: - resolution: {integrity: sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==} + electron-to-chromium@1.5.172: + resolution: {integrity: sha512-fnKW9dGgmBfsebbYognQSv0CGGLFH1a5iV9EDYTBwmAQn+whbzHbLFlC+3XbHc8xaNtpO0etm8LOcRXs1qMRkQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3109,8 +2581,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} err-code@2.0.3: @@ -3151,19 +2623,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.39.7: - resolution: {integrity: sha512-ek/wWryKouBrZIjkwW2BFf91CWOIMvoy2AE5YYgUrfWsJQM2Su1LoLtrw8uusEpN9RfqLlV/0FVNjT0WMv8Bxw==} - - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.12 <1' - - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.5: resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} @@ -3181,8 +2640,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.5.2: - resolution: {integrity: sha512-3hPZghsLupMxxZ2ggjIIrat/bPniM2yRpsVPVM40rp8ZMzKWOJp2CGWn7+EzoV2ddkUr5fxNfHpF+wU1hGt/3g==} + eslint-config-next@15.3.4: + resolution: {integrity: sha512-WqeumCq57QcTP2lYlV6BRUySfGiBYEXlQ1L0mQ+u4N4X4ZhUVSSQ52WtjqHv60pJ6dD7jn+YZc0d1/ZSsxccvg==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -3301,8 +2760,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.32.0: - resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + eslint@9.29.0: + resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3319,11 +2778,6 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -3340,9 +2794,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -3350,9 +2801,6 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -3398,10 +2846,6 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -3432,8 +2876,8 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3449,18 +2893,14 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -3491,18 +2931,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3597,12 +3029,6 @@ packages: hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} @@ -3622,9 +3048,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -3648,11 +3071,8 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immer@10.1.3: - resolution: {integrity: sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==} - - immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -3693,10 +3113,6 @@ packages: is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -3742,11 +3158,6 @@ packages: is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3763,10 +3174,6 @@ packages: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -3841,10 +3248,6 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3861,9 +3264,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -3875,12 +3275,6 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - jotai-devtools@0.12.0: - resolution: {integrity: sha512-tPsQHlx8/HKA9zVjzMGWXApOfcQAD/CDzYbBDu0Wsjfj8OCb9QfM9IQQ1rfpXcc+bH90r77aXEL5vo89B+5HOA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=17.0.0' - jotai-eager@0.2.3: resolution: {integrity: sha512-6kC1RnXRQ8QdESW+r6I3Ep5wKUYAfW7ERNyeNby0EgjgZB+Z3VgoNk4eUEEAgcGHFwz9IpA4RQQxwlnk+tLgJQ==} peerDependencies: @@ -3892,32 +3286,13 @@ packages: immer: '>=9.0.0' jotai: '>=2.0.0' - jotai-tanstack-query@0.11.0: - resolution: {integrity: sha512-Ys0u0IuuS6/okUJOulFTdCVfVaeKbm1+lKVSN9zHhIxtrAXl9FM4yu7fNvxM6fSz/NCE9tZOKR0MQ3hvplaH8A==} - peerDependencies: - '@tanstack/query-core': '*' - '@tanstack/react-query': '*' - jotai: '>=2.0.0' - react: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@tanstack/react-query': - optional: true - react: - optional: true - - jotai@2.13.1: - resolution: {integrity: sha512-cRsw6kFeGC9Z/D3egVKrTXRweycZ4z/k7i2MrfCzPYsL9SIWcPXTyqv258/+Ay8VUEcihNiE/coBLE6Kic6b8A==} + jotai@2.12.5: + resolution: {integrity: sha512-G8m32HW3lSmcz/4mbqx0hgJIQ0ekndKWiYP7kWVKi0p6saLXdSoye+FZiOFyonnd7Q482LCzm8sMDl7Ar1NWDw==} engines: {node: '>=12.20.0'} peerDependencies: - '@babel/core': '>=7.0.0' - '@babel/template': '>=7.0.0' '@types/react': '>=17.0.0' react: '>=17.0.0' peerDependenciesMeta: - '@babel/core': - optional: true - '@babel/template': - optional: true '@types/react': optional: true react: @@ -3939,10 +3314,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdoc-type-pratt-parser@4.8.0: - resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} - engines: {node: '>=12.0.0'} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -3970,19 +3341,10 @@ packages: engines: {node: '>=6'} hasBin: true - jsondiffpatch@0.5.0: - resolution: {integrity: sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw==} - engines: {node: '>=8.17.0'} - hasBin: true - jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - jsonrepair@3.13.0: - resolution: {integrity: sha512-5YRzlAQ7tuzV1nAJu3LvDlrKtBFIALHN2+a+I1MGJCt3ldRDBF/bZuvIPzae8Epot6KBXd0awRZZcuoeAsZ/mw==} - hasBin: true - jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -4057,11 +3419,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lexical@0.35.0: - resolution: {integrity: sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==} + lexical@0.33.1: + resolution: {integrity: sha512-+kiCS/GshQmCs/meMb8MQT4AMvw3S3Ef0lSCv2Xi6Itvs59OD+NjQWNfYkDteIbKtVE/w0Yiqh56VyGwIb8UcA==} - lib0@0.2.114: - resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==} + lib0@0.2.109: + resolution: {integrity: sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw==} engines: {node: '>=16'} hasBin: true @@ -4083,9 +3445,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -4127,9 +3486,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} - lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} @@ -4141,10 +3497,6 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -4155,9 +3507,6 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -4179,21 +3528,6 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -4211,10 +3545,6 @@ packages: engines: {node: '>=4'} hasBin: true - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -4274,13 +3604,13 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.2: - resolution: {integrity: sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==} + next@15.3.4: + resolution: {integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 + '@playwright/test': ^1.41.2 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -4295,11 +3625,6 @@ packages: sass: optional: true - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -4309,10 +3634,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-mocks-http@1.17.2: resolution: {integrity: sha512-HVxSnjNzE9NzoWMx9T9z4MLqwMpLwVvA0oVZ+L+gXskYXEJ6tFn3Kx4LargoB6ie7ZlCLplv7QbWO6N+MysWGA==} engines: {node: '>=14'} @@ -4328,9 +3649,6 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-releases@2.0.23: - resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} - nodemailer@6.10.0: resolution: {integrity: sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==} engines: {node: '>=6.0.0'} @@ -4387,16 +3705,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - - oniguruma-to-es@4.3.3: - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -4460,10 +3768,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4595,10 +3899,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4621,9 +3921,6 @@ packages: property-information@5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -4882,9 +4179,6 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - react-base16-styling@0.9.1: - resolution: {integrity: sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==} - react-day-picker@8.10.1: resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} peerDependencies: @@ -4916,11 +4210,6 @@ packages: peerDependencies: react: '>=16.13.1' - react-error-boundary@5.0.0: - resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} - peerDependencies: - react: '>=16.13.1' - react-icons@5.5.0: resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} peerDependencies: @@ -4929,72 +4218,19 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-json-tree@0.18.0: - resolution: {integrity: sha512-Qe6HKSXrr++n9Y31nkRJ3XvQMATISpqigH1vEKhLwB56+nk5thTP0ITThpjxY6ZG/ubpVq/aEHIcyLP/OPHxeA==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-jss@10.10.0: resolution: {integrity: sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ==} peerDependencies: react: '>=16.8.6' - react-number-format@5.4.4: - resolution: {integrity: sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==} - peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-qr-code@2.0.15: resolution: {integrity: sha512-MkZcjEXqVKqXEIMVE0mbcGgDpkfSdd8zhuzXEl9QzYeNcw8Hq2oVIzDLWuZN2PQBwM5PWjc2S31K8Q1UbcFMfw==} peerDependencies: react: '*' - react-redux@9.2.0: - resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} - peerDependencies: - '@types/react': ^18.2.25 || ^19 - react: ^18.0 || ^19 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.1: - resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-resizable-panels@2.1.7: - resolution: {integrity: sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==} - peerDependencies: - react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-resizable@3.0.5: resolution: {integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==} peerDependencies: @@ -5006,27 +4242,11 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - react-syntax-highlighter@15.6.1: resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} peerDependencies: react: '>= 0.14.0' - react-textarea-autosize@8.5.9: - resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -5057,10 +4277,6 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} - recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -5071,26 +4287,6 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - recharts@3.1.0: - resolution: {integrity: sha512-NqAqQcGBmLrfDs2mHX/bz8jJCQtG2FeXfE0GqpZmIuXIjkpIwj8sd9ad0WyvKiBKPd8ZgNG0hL85c8sFDwascw==} - engines: {node: '>=18'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - redux-thunk@3.1.0: - resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} - peerDependencies: - redux: ^5.0.0 - - redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -5101,15 +4297,6 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -5124,9 +4311,6 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - reselect@5.1.1: - resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} - resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -5180,8 +4364,8 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} scmp@2.1.0: @@ -5220,8 +4404,8 @@ packages: shallow-equal@1.2.1: resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} - sharp@0.34.3: - resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -5232,9 +4416,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.12.2: - resolution: {integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==} - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -5280,9 +4461,6 @@ packages: space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -5296,14 +4474,9 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - storybook@8.6.14: - resolution: {integrity: sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==} - hasBin: true - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -5339,9 +4512,6 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -5358,10 +4528,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5469,8 +4635,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} terser-webpack-plugin@5.3.14: @@ -5489,8 +4655,8 @@ packages: uglify-js: optional: true - terser@5.44.0: - resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -5524,14 +4690,6 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} - tldts-core@6.1.83: resolution: {integrity: sha512-I2wb9OJc6rXyh9d4aInhSNWChNI+ra6qDnFEGEwe9OoA68lE4Temw29bOkf1Uvwt8VZS079t1BFZdXVBmmB4dw==} @@ -5553,9 +4711,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -5588,10 +4743,6 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -5646,10 +4797,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -5692,21 +4839,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - unrs-resolver@1.9.1: resolution: {integrity: sha512-4AZVxP05JGN6DwqIkSP4VKLOcwQa5l37SWHF/ahcuqBMbfxbpN1L1QKafEhWCziHhzKex9H/AR09H0OuVyU+9g==} @@ -5727,53 +4859,6 @@ packages: peerDependencies: react: '>=16.8.0' - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-composed-ref@1.4.0: - resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-isomorphic-layout-effect@1.2.1: - resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-latest@1.3.0: - resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - use-sync-external-store@1.4.0: resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: @@ -5788,9 +4873,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true @@ -5802,18 +4884,9 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} - victory-vendor@37.3.6: - resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -5824,10 +4897,6 @@ packages: resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -5904,18 +4973,6 @@ packages: utf-8-validate: optional: true - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xmlbuilder@13.0.2: resolution: {integrity: sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==} engines: {node: '>=6.0'} @@ -5941,13 +4998,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: - '@adobe/css-tools@4.4.3': {} - '@ag-grid-community/client-side-row-model@32.3.4': dependencies: '@ag-grid-community/core': 32.3.4 @@ -6033,14 +5085,6 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/runtime@7.27.0': dependencies: regenerator-runtime: 0.14.1 @@ -6050,6 +5094,7 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true '@discoveryjs/json-ext@0.5.7': {} @@ -6091,7 +5136,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 optional: true @@ -6111,157 +5156,79 @@ snapshots: '@emotion/unitless@0.7.5': {} - '@esbuild/aix-ppc64@0.25.10': - optional: true - '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.25.10': - optional: true - '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm@0.25.10': - optional: true - '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.25.10': - optional: true - '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.25.10': - optional: true - '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.25.10': - optional: true - '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.25.10': - optional: true - '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.25.10': - optional: true - '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.25.10': - optional: true - '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.25.10': - optional: true - '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.25.10': - optional: true - '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-loong64@0.25.10': - optional: true - '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.25.10': - optional: true - '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-ppc64@0.25.10': - optional: true - '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.25.10': - optional: true - '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-s390x@0.25.10': - optional: true - '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-x64@0.25.10': - optional: true - '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.10': - optional: true - '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.25.10': - optional: true - '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.10': - optional: true - '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.25.10': - optional: true - '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/sunos-x64@0.25.5': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-arm64@0.25.10': - optional: true - - '@esbuild/win32-arm64@0.25.5': - optional: true - - '@esbuild/win32-ia32@0.25.10': - optional: true - - '@esbuild/win32-ia32@0.25.5': - optional: true - - '@esbuild/win32-x64@0.25.10': - optional: true - - '@esbuild/win32-x64@0.25.5': + '@esbuild/win32-x64@0.25.5': optional: true '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': @@ -6269,14 +5236,14 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@1.21.7))': dependencies: - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.20.1': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.1 @@ -6284,9 +5251,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.2.3': {} - '@eslint/core@0.15.1': + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.0': dependencies: '@types/json-schema': 7.0.15 @@ -6322,13 +5293,11 @@ snapshots: '@eslint/js@9.29.0': {} - '@eslint/js@9.32.0': {} - '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.2': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.0 levn: 0.4.1 '@floating-ui/core@1.7.2': @@ -6393,9 +5362,9 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)))': + '@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)))': dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) '@humanfs/core@0.19.1': {} @@ -6420,90 +5389,85 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/sharp-darwin-arm64@0.34.3': + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.34.3': + '@img/sharp-darwin-x64@0.34.2': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.0': + '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true - '@img/sharp-libvips-darwin-x64@1.2.0': + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm64@1.2.0': + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm@1.2.0': + '@img/sharp-libvips-linux-arm@1.1.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.0': + '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true - '@img/sharp-libvips-linux-s390x@1.2.0': + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true - '@img/sharp-libvips-linux-x64@1.2.0': + '@img/sharp-libvips-linux-x64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.0': + '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.34.3': + '@img/sharp-linux-arm64@0.34.2': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.34.3': + '@img/sharp-linux-arm@0.34.2': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-ppc64@0.34.3': + '@img/sharp-linux-s390x@0.34.2': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.34.3': + '@img/sharp-linux-x64@0.34.2': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linux-x64@0.34.3': + '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.34.3': + '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.34.3': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - optional: true - - '@img/sharp-wasm32@0.34.3': + '@img/sharp-wasm32@0.34.2': dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-arm64@0.34.3': + '@img/sharp-win32-arm64@0.34.2': optional: true - '@img/sharp-win32-ia32@0.34.3': + '@img/sharp-win32-ia32@0.34.2': optional: true - '@img/sharp-win32-x64@0.34.3': + '@img/sharp-win32-x64@0.34.2': optional: true '@isaacs/cliui@8.0.2': @@ -6519,233 +5483,184 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.11': + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.30': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.31': + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@lexical/clipboard@0.35.0': - dependencies: - '@lexical/html': 0.35.0 - '@lexical/list': 0.35.0 - '@lexical/selection': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@jridgewell/sourcemap-codec': 1.5.0 + optional: true - '@lexical/code-shiki@0.35.0': + '@lexical/clipboard@0.33.1': dependencies: - '@lexical/code': 0.35.0 - '@lexical/utils': 0.35.0 - '@shikijs/core': 3.12.2 - '@shikijs/engine-javascript': 3.12.2 - '@shikijs/langs': 3.12.2 - '@shikijs/themes': 3.12.2 - lexical: 0.35.0 - shiki: 3.12.2 + '@lexical/html': 0.33.1 + '@lexical/list': 0.33.1 + '@lexical/selection': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/code@0.35.0': + '@lexical/code@0.33.1': dependencies: - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 prismjs: 1.30.0 - '@lexical/devtools-core@0.35.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@lexical/devtools-core@0.33.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@lexical/html': 0.35.0 - '@lexical/link': 0.35.0 - '@lexical/mark': 0.35.0 - '@lexical/table': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/html': 0.33.1 + '@lexical/link': 0.33.1 + '@lexical/mark': 0.33.1 + '@lexical/table': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@lexical/dragon@0.35.0': + '@lexical/dragon@0.33.1': dependencies: - lexical: 0.35.0 + lexical: 0.33.1 - '@lexical/eslint-plugin@0.33.1(eslint@9.32.0(jiti@1.21.7))': + '@lexical/eslint-plugin@0.33.1(eslint@9.29.0(jiti@1.21.7))': dependencies: - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) - '@lexical/hashtag@0.35.0': + '@lexical/hashtag@0.33.1': dependencies: - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/history@0.35.0': + '@lexical/history@0.33.1': dependencies: - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/html@0.35.0': + '@lexical/html@0.33.1': dependencies: - '@lexical/selection': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/selection': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/link@0.35.0': + '@lexical/link@0.33.1': dependencies: - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/list@0.35.0': + '@lexical/list@0.33.1': dependencies: - '@lexical/selection': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/selection': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/mark@0.35.0': + '@lexical/mark@0.33.1': dependencies: - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/markdown@0.35.0': + '@lexical/markdown@0.33.1': dependencies: - '@lexical/code': 0.35.0 - '@lexical/link': 0.35.0 - '@lexical/list': 0.35.0 - '@lexical/rich-text': 0.35.0 - '@lexical/text': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/code': 0.33.1 + '@lexical/link': 0.33.1 + '@lexical/list': 0.33.1 + '@lexical/rich-text': 0.33.1 + '@lexical/text': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/offset@0.35.0': + '@lexical/offset@0.33.1': dependencies: - lexical: 0.35.0 + lexical: 0.33.1 - '@lexical/overflow@0.35.0': + '@lexical/overflow@0.33.1': dependencies: - lexical: 0.35.0 + lexical: 0.33.1 - '@lexical/plain-text@0.35.0': + '@lexical/plain-text@0.33.1': dependencies: - '@lexical/clipboard': 0.35.0 - '@lexical/selection': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/clipboard': 0.33.1 + '@lexical/selection': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/react@0.35.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.24)': + '@lexical/react@0.33.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.24)': dependencies: '@floating-ui/react': 0.27.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/devtools-core': 0.35.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/dragon': 0.35.0 - '@lexical/hashtag': 0.35.0 - '@lexical/history': 0.35.0 - '@lexical/link': 0.35.0 - '@lexical/list': 0.35.0 - '@lexical/mark': 0.35.0 - '@lexical/markdown': 0.35.0 - '@lexical/overflow': 0.35.0 - '@lexical/plain-text': 0.35.0 - '@lexical/rich-text': 0.35.0 - '@lexical/table': 0.35.0 - '@lexical/text': 0.35.0 - '@lexical/utils': 0.35.0 - '@lexical/yjs': 0.35.0(yjs@13.6.24) - lexical: 0.35.0 + '@lexical/devtools-core': 0.33.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/dragon': 0.33.1 + '@lexical/hashtag': 0.33.1 + '@lexical/history': 0.33.1 + '@lexical/link': 0.33.1 + '@lexical/list': 0.33.1 + '@lexical/mark': 0.33.1 + '@lexical/markdown': 0.33.1 + '@lexical/overflow': 0.33.1 + '@lexical/plain-text': 0.33.1 + '@lexical/rich-text': 0.33.1 + '@lexical/table': 0.33.1 + '@lexical/text': 0.33.1 + '@lexical/utils': 0.33.1 + '@lexical/yjs': 0.33.1(yjs@13.6.24) + lexical: 0.33.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 3.1.4(react@19.0.0) transitivePeerDependencies: - yjs - '@lexical/rich-text@0.35.0': + '@lexical/rich-text@0.33.1': dependencies: - '@lexical/clipboard': 0.35.0 - '@lexical/selection': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/clipboard': 0.33.1 + '@lexical/selection': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/selection@0.35.0': + '@lexical/selection@0.33.1': dependencies: - lexical: 0.35.0 + lexical: 0.33.1 - '@lexical/table@0.35.0': + '@lexical/table@0.33.1': dependencies: - '@lexical/clipboard': 0.35.0 - '@lexical/utils': 0.35.0 - lexical: 0.35.0 + '@lexical/clipboard': 0.33.1 + '@lexical/utils': 0.33.1 + lexical: 0.33.1 - '@lexical/text@0.35.0': + '@lexical/text@0.33.1': dependencies: - lexical: 0.35.0 + lexical: 0.33.1 - '@lexical/utils@0.35.0': + '@lexical/utils@0.33.1': dependencies: - '@lexical/list': 0.35.0 - '@lexical/selection': 0.35.0 - '@lexical/table': 0.35.0 - lexical: 0.35.0 + '@lexical/list': 0.33.1 + '@lexical/selection': 0.33.1 + '@lexical/table': 0.33.1 + lexical: 0.33.1 - '@lexical/yjs@0.35.0(yjs@13.6.24)': + '@lexical/yjs@0.33.1(yjs@13.6.24)': dependencies: - '@lexical/offset': 0.35.0 - '@lexical/selection': 0.35.0 - lexical: 0.35.0 + '@lexical/offset': 0.33.1 + '@lexical/selection': 0.33.1 + lexical: 0.33.1 yjs: 13.6.24 - '@mantine/code-highlight@7.17.8(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.17.8(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@mantine/core': 7.17.8(@mantine/hooks@7.17.8(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.17.8(react@19.0.0) - clsx: 2.1.1 - highlight.js: 11.11.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.17.8(react@19.0.0) - clsx: 2.1.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-number-format: 5.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-remove-scroll: 2.7.1(@types/react@19.0.10)(react@19.0.0) - react-textarea-autosize: 8.5.9(@types/react@19.0.10)(react@19.0.0) - type-fest: 4.41.0 - transitivePeerDependencies: - - '@types/react' - - '@mantine/hooks@7.17.8(react@19.0.0)': - dependencies: - react: 19.0.0 - '@monaco-editor/loader@1.5.0': dependencies: state-local: 1.0.7 @@ -6760,45 +5675,45 @@ snapshots: '@napi-rs/wasm-runtime@0.2.11': dependencies: '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 optional: true - '@next/bundle-analyzer@15.5.2': + '@next/bundle-analyzer@15.3.4': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@15.5.2': {} + '@next/env@15.3.4': {} - '@next/eslint-plugin-next@15.5.2': + '@next/eslint-plugin-next@15.3.4': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.2': + '@next/swc-darwin-arm64@15.3.4': optional: true - '@next/swc-darwin-x64@15.5.2': + '@next/swc-darwin-x64@15.3.4': optional: true - '@next/swc-linux-arm64-gnu@15.5.2': + '@next/swc-linux-arm64-gnu@15.3.4': optional: true - '@next/swc-linux-arm64-musl@15.5.2': + '@next/swc-linux-arm64-musl@15.3.4': optional: true - '@next/swc-linux-x64-gnu@15.5.2': + '@next/swc-linux-x64-gnu@15.3.4': optional: true - '@next/swc-linux-x64-musl@15.5.2': + '@next/swc-linux-x64-musl@15.3.4': optional: true - '@next/swc-win32-arm64-msvc@15.5.2': + '@next/swc-win32-arm64-msvc@15.3.4': optional: true - '@next/swc-win32-x64-msvc@15.5.2': + '@next/swc-win32-x64-msvc@15.3.4': optional: true '@nodelib/fs.scandir@2.1.5': @@ -6912,7 +5827,7 @@ snapshots: '@react-aria/interactions': 3.24.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@react-aria/utils': 3.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@react-types/shared': 3.28.0(react@19.0.0) - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -6923,13 +5838,13 @@ snapshots: '@react-aria/utils': 3.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@react-stately/flags': 3.1.0 '@react-types/shared': 3.28.0(react@19.0.0) - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) '@react-aria/ssr@3.9.7(react@19.0.0)': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 react: 19.0.0 '@react-aria/utils@3.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -6938,42 +5853,24 @@ snapshots: '@react-stately/flags': 3.1.0 '@react-stately/utils': 3.10.5(react@19.0.0) '@react-types/shared': 3.28.0(react@19.0.0) - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) '@react-stately/flags@3.1.0': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 '@react-stately/utils@3.10.5(react@19.0.0)': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 react: 19.0.0 '@react-types/shared@3.28.0(react@19.0.0)': dependencies: react: 19.0.0 - '@redux-devtools/extension@3.3.0(redux@5.0.1)': - dependencies: - '@babel/runtime': 7.27.6 - immutable: 4.3.7 - redux: 5.0.1 - - '@reduxjs/toolkit@2.8.2(react-redux@9.2.0(@types/react@19.0.10)(react@19.0.0)(redux@5.0.1))(react@19.0.0)': - dependencies: - '@standard-schema/spec': 1.0.0 - '@standard-schema/utils': 0.3.0 - immer: 10.1.3 - redux: 5.0.1 - redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.1.1 - optionalDependencies: - react: 19.0.0 - react-redux: 9.2.0(@types/react@19.0.10)(react@19.0.0)(redux@5.0.1) - '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.11.0': {} @@ -6989,93 +5886,8 @@ snapshots: '@scalar/openapi-types@0.1.9': {} - '@shikijs/core@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.3 - - '@shikijs/engine-oniguruma@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - - '@shikijs/themes@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - - '@shikijs/types@3.12.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.2': {} - '@sinclair/typebox@0.27.8': {} - '@standard-schema/spec@1.0.0': {} - - '@standard-schema/utils@0.3.0': {} - - '@storybook/core@8.6.14(prettier@3.6.0)(storybook@8.6.14(prettier@3.6.0))': - dependencies: - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.6.0)) - better-opn: 3.0.2 - browser-assert: 1.2.1 - esbuild: 0.25.10 - esbuild-register: 3.6.0(esbuild@0.25.10) - jsdoc-type-pratt-parser: 4.8.0 - process: 0.11.10 - recast: 0.23.11 - semver: 7.7.2 - util: 0.12.5 - ws: 8.18.3 - optionalDependencies: - prettier: 3.6.0 - transitivePeerDependencies: - - bufferutil - - storybook - - supports-color - - utf-8-validate - - '@storybook/global@5.0.0': {} - - '@storybook/instrumenter@8.6.14(storybook@8.6.14(prettier@3.6.0))': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.9 - storybook: 8.6.14(prettier@3.6.0) - - '@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.0))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@8.6.14(prettier@3.6.0)) - '@testing-library/dom': 10.4.0 - '@testing-library/jest-dom': 6.5.0 - '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/expect': 2.0.5 - '@vitest/spy': 2.0.5 - storybook: 8.6.14(prettier@3.6.0) - - '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.6.0))': - dependencies: - storybook: 8.6.14(prettier@3.6.0) - - '@swc-jotai/debug-label@0.2.0': {} - - '@swc-jotai/react-refresh@0.3.0': {} - '@swc/core-darwin-arm64@1.11.8': optional: true @@ -7106,10 +5918,10 @@ snapshots: '@swc/core-win32-x64-msvc@1.11.8': optional: true - '@swc/core@1.11.8(@swc/helpers@0.5.17)': + '@swc/core@1.11.8(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 + '@swc/types': 0.1.23 optionalDependencies: '@swc/core-darwin-arm64': 1.11.8 '@swc/core-darwin-x64': 1.11.8 @@ -7121,7 +5933,7 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.11.8 '@swc/core-win32-ia32-msvc': 1.11.8 '@swc/core-win32-x64-msvc': 1.11.8 - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} @@ -7129,29 +5941,18 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@swc/types@0.1.25': + '@swc/types@0.1.23': dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)))': + '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)))': dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) - '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)))': + '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) - - '@tanstack/query-core@5.87.1': {} - - '@tanstack/react-query@5.87.1(react@19.0.0)': - dependencies: - '@tanstack/query-core': 5.87.1 - react: 19.0.0 + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) '@tanstack/react-virtual@3.13.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -7161,31 +5962,6 @@ snapshots: '@tanstack/virtual-core@3.13.2': {} - '@testing-library/dom@10.4.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@6.5.0': - dependencies: - '@adobe/css-tools': 4.4.3 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - - '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - '@tremor/react@3.18.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react': 0.19.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -7198,23 +5974,23 @@ snapshots: recharts: 2.15.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tailwind-merge: 2.6.0 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.11': + optional: true - '@tsconfig/node12@1.0.11': {} + '@tsconfig/node12@1.0.11': + optional: true - '@tsconfig/node14@1.0.3': {} + '@tsconfig/node14@1.0.3': + optional: true - '@tsconfig/node16@1.0.4': {} + '@tsconfig/node16@1.0.4': + optional: true '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 optional: true - '@types/aria-query@5.0.4': {} - - '@types/base16@1.0.5': {} - '@types/d3-array@3.2.1': {} '@types/d3-color@3.1.3': {} @@ -7257,10 +6033,6 @@ snapshots: dependencies: '@types/unist': 2.0.11 - '@types/hast@3.0.4': - dependencies: - '@types/unist': 2.0.11 - '@types/js-beautify@1.14.3': {} '@types/js-yaml@4.0.9': {} @@ -7271,25 +6043,17 @@ snapshots: '@types/lodash@4.17.18': {} - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/node@20.17.24': dependencies: undici-types: 6.19.8 - '@types/node@20.19.11': - dependencies: - undici-types: 6.21.0 - - '@types/node@20.19.19': + '@types/node@20.19.1': dependencies: undici-types: 6.21.0 '@types/papaparse@5.3.15': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.17.24 '@types/prismjs@1.26.5': {} @@ -7317,37 +6081,23 @@ snapshots: dependencies: csstype: 3.1.3 - '@types/recharts@2.0.1(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0)(redux@5.0.1)': - dependencies: - recharts: 3.1.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0)(redux@5.0.1) - transitivePeerDependencies: - - '@types/react' - - react - - react-dom - - react-is - - redux - '@types/retry@0.12.5': {} '@types/semver@7.7.0': {} '@types/unist@2.0.11': {} - '@types/unist@3.0.3': {} - - '@types/use-sync-external-store@0.0.6': {} - '@types/uuid@10.0.0': {} - '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.34.1 - '@typescript-eslint/type-utils': 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -7356,15 +6106,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/type-utils': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.35.0 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -7386,26 +6136,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.34.1 '@typescript-eslint/types': 8.34.1 '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.1 debug: 4.4.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.35.0 '@typescript-eslint/types': 8.35.0 '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.35.0 debug: 4.4.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -7451,23 +6201,23 @@ snapshots: dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -7526,24 +6276,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/utils@8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.34.1 '@typescript-eslint/types': 8.34.1 '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/utils@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.35.0 '@typescript-eslint/types': 8.35.0 '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -7624,38 +6374,6 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.9.1': optional: true - '@vitest/expect@2.0.5': - dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.3.3 - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.0.5': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.1.9': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/spy@2.0.5': - dependencies: - tinyspy: 3.0.2 - - '@vitest/utils@2.0.5': - dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 - loupe: 3.2.0 - tinyrainbow: 1.2.0 - - '@vitest/utils@2.1.9': - dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.2.0 - tinyrainbow: 1.2.0 - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -7757,7 +6475,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -7873,7 +6591,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@4.1.3: {} + arg@4.1.3: + optional: true arg@5.0.2: {} @@ -7883,10 +6602,6 @@ snapshots: dependencies: tslib: 2.8.1 - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -7958,14 +6673,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - assertion-error@2.0.1: {} - ast-types-flow@0.0.8: {} - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - async-function@1.0.0: {} asynckit@0.4.0: {} @@ -7986,10 +6695,10 @@ snapshots: axe-core@4.10.3: {} - axios@1.12.2(debug@4.4.0): + axios@1.8.2(debug@4.4.0): dependencies: - follow-redirects: 1.15.11(debug@4.4.0) - form-data: 4.0.4 + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.2 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -7998,16 +6707,8 @@ snapshots: balanced-match@1.0.2: {} - base16@1.0.0: {} - base64-js@1.5.1: {} - baseline-browser-mapping@2.8.13: {} - - better-opn@3.0.2: - dependencies: - open: 8.4.2 - binary-extensions@2.3.0: {} blakejs@1.2.1: {} @@ -8025,8 +6726,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browser-assert@1.2.1: {} - browser-tabs-lock@1.3.0: dependencies: lodash: 4.17.21 @@ -8038,13 +6737,12 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) - browserslist@4.26.3: + browserslist@4.25.0: dependencies: - baseline-browser-mapping: 2.8.13 - caniuse-lite: 1.0.30001748 - electron-to-chromium: 1.5.232 - node-releases: 2.0.23 - update-browserslist-db: 1.1.3(browserslist@4.26.3) + caniuse-lite: 1.0.30001724 + electron-to-chromium: 1.5.172 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) buffer-equal-constant-time@1.0.1: {} @@ -8055,6 +6753,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -8078,19 +6780,7 @@ snapshots: caniuse-lite@1.0.30001703: {} - caniuse-lite@1.0.30001734: {} - - caniuse-lite@1.0.30001748: {} - - ccount@2.0.1: {} - - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.2.0 - pathval: 2.0.1 + caniuse-lite@1.0.30001724: {} chalk@1.1.3: dependencies: @@ -8100,28 +6790,17 @@ snapshots: strip-ansi: 3.0.1 supports-color: 2.0.0 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - character-entities-html4@2.1.0: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} character-reference-invalid@1.1.4: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -8144,27 +6823,17 @@ snapshots: clsx@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + optional: true color@4.2.3: dependencies: @@ -8178,8 +6847,6 @@ snapshots: comma-separated-tokens@1.0.8: {} - comma-separated-tokens@2.0.3: {} - commander@10.0.1: {} commander@2.20.3: {} @@ -8217,7 +6884,8 @@ snapshots: core-js@3.41.0: {} - create-require@1.1.1: {} + create-require@1.1.1: + optional: true crisp-sdk-web@1.0.25: {} @@ -8246,8 +6914,6 @@ snapshots: '@babel/runtime': 7.27.6 is-in-browser: 1.1.3 - css.escape@1.5.1: {} - cssesc@3.0.0: {} csstype@3.1.3: {} @@ -8292,8 +6958,6 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-uri-to-buffer@4.0.1: {} - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -8330,14 +6994,8 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.3: - dependencies: - ms: 2.1.3 - decimal.js-light@2.5.1: {} - deep-eql@5.0.2: {} - deep-is@0.1.4: {} define-data-property@1.1.4: @@ -8346,8 +7004,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -8363,17 +7019,10 @@ snapshots: detect-libc@2.0.4: optional: true - detect-node-es@1.1.0: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - didyoumean@1.2.2: {} - diff-match-patch@1.0.5: {} - - diff@4.0.2: {} + diff@4.0.2: + optional: true diff@5.2.0: {} @@ -8391,10 +7040,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} - - dom-accessibility-api@0.6.3: {} - dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.27.6 @@ -8425,16 +7070,16 @@ snapshots: electron-to-chromium@1.5.113: {} - electron-to-chromium@1.5.232: {} + electron-to-chromium@1.5.172: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - enhanced-resolve@5.18.3: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.2.2 err-code@2.0.3: {} @@ -8541,44 +7186,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.39.7: {} - - esbuild-register@3.6.0(esbuild@0.25.10): - dependencies: - debug: 4.4.3 - esbuild: 0.25.10 - transitivePeerDependencies: - - supports-color - - esbuild@0.25.10: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 - esbuild@0.25.5: optionalDependencies: '@esbuild/aix-ppc64': 0.25.5 @@ -8613,19 +7220,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.5.2(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3): + eslint-config-next@15.3.4(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3): dependencies: - '@next/eslint-plugin-next': 15.5.2 + '@next/eslint-plugin-next': 15.3.4 '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/parser': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - eslint: 9.32.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.29.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@1.21.7)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@1.21.7)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@1.21.7)) - eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@1.21.7)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.29.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.29.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.29.0(jiti@1.21.7)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -8633,9 +7240,9 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@10.1.5(eslint@9.32.0(jiti@1.21.7)): + eslint-config-prettier@10.1.5(eslint@9.29.0(jiti@1.21.7)): dependencies: - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) eslint-import-resolver-node@0.3.9: dependencies: @@ -8645,33 +7252,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@1.21.7)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.14 unrs-resolver: 1.9.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@1.21.7)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - eslint: 9.32.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.29.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@1.21.7)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8680,9 +7287,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@1.21.7)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8694,13 +7301,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.35.0(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.32.0(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.29.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -8710,7 +7317,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -8719,21 +7326,21 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@5.5.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.32.0(jiti@1.21.7)))(eslint@9.32.0(jiti@1.21.7))(prettier@3.6.0): + eslint-plugin-prettier@5.5.0(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.29.0(jiti@1.21.7)))(eslint@9.29.0(jiti@1.21.7))(prettier@3.6.0): dependencies: - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) prettier: 3.6.0 prettier-linter-helpers: 1.0.0 synckit: 0.11.8 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.5(eslint@9.32.0(jiti@1.21.7)) + eslint-config-prettier: 10.1.5(eslint@9.29.0(jiti@1.21.7)) - eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@1.21.7)): + eslint-plugin-react-hooks@5.2.0(eslint@9.29.0(jiti@1.21.7)): dependencies: - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) - eslint-plugin-react@7.37.5(eslint@9.32.0(jiti@1.21.7)): + eslint-plugin-react@7.37.5(eslint@9.29.0(jiti@1.21.7)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -8741,7 +7348,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.32.0(jiti@1.21.7) + eslint: 9.29.0(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -8817,16 +7424,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.32.0(jiti@1.21.7): + eslint@9.29.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.3 + '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.32.0 - '@eslint/plugin-kit': 0.3.4 + '@eslint/js': 9.29.0 + '@eslint/plugin-kit': 0.3.2 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -8871,8 +7478,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -8885,16 +7490,10 @@ snapshots: estraverse@5.3.0: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - esutils@2.0.3: {} eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} - events@3.3.0: {} fast-deep-equal@3.1.3: {} @@ -8937,11 +7536,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - fflate@0.4.8: {} file-entry-cache@6.0.1: @@ -8974,7 +7568,7 @@ snapshots: flatted@3.3.3: {} - follow-redirects@1.15.11(debug@4.4.0): + follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: debug: 4.4.0 @@ -8987,20 +7581,15 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.4: + form-data@4.0.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 mime-types: 2.1.35 format@0.2.2: {} - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - fraction.js@4.3.7: {} fresh@0.5.2: {} @@ -9026,8 +7615,6 @@ snapshots: functions-have-names@1.2.3: {} - generator-function@2.0.1: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9041,8 +7628,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-nonce@1.0.1: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -9144,24 +7729,6 @@ snapshots: hast-util-parse-selector@2.2.5: {} - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - hastscript@6.0.0: dependencies: '@types/hast': 2.3.10 @@ -9182,12 +7749,10 @@ snapshots: html-escaper@2.0.2: {} - html-void-elements@3.0.0: {} - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -9201,9 +7766,7 @@ snapshots: ignore@7.0.5: {} - immer@10.1.3: {} - - immutable@4.3.7: {} + immer@10.1.1: {} import-fresh@3.3.1: dependencies: @@ -9240,18 +7803,14 @@ snapshots: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.3.2: {} + is-arrayish@0.3.2: + optional: true is-async-function@2.1.1: dependencies: @@ -9297,8 +7856,6 @@ snapshots: is-decimal@1.0.4: {} - is-docker@2.2.1: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -9314,14 +7871,6 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -9386,10 +7935,6 @@ snapshots: is-what@4.1.16: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - isarray@2.0.5: {} isexe@2.0.0: {} @@ -9411,11 +7956,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - javascript-stringify@2.1.0: {} - jest-worker@27.5.1: dependencies: - '@types/node': 20.19.19 + '@types/node': 20.19.1 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9423,50 +7966,18 @@ snapshots: jose@4.15.9: {} - jotai-devtools@0.12.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(redux@5.0.1)(storybook@8.6.14(prettier@3.6.0)): - dependencies: - '@mantine/code-highlight': 7.17.8(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.17.8(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/core': 7.17.8(@mantine/hooks@7.17.8(react@19.0.0))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.17.8(react@19.0.0) - '@redux-devtools/extension': 3.3.0(redux@5.0.1) - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.6.0)) - clsx: 2.1.1 - javascript-stringify: 2.1.0 - jotai: 2.13.1(@types/react@19.0.10)(react@19.0.0) - jsondiffpatch: 0.5.0 - react: 19.0.0 - react-base16-styling: 0.9.1 - react-error-boundary: 5.0.0(react@19.0.0) - react-json-tree: 0.18.0(@types/react@19.0.10)(react@19.0.0) - react-resizable-panels: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - transitivePeerDependencies: - - '@babel/core' - - '@babel/template' - - '@types/react' - - react-dom - - redux - - storybook - - jotai-eager@0.2.3(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)): + jotai-eager@0.2.3(jotai@2.12.5(@types/react@19.0.10)(react@19.0.0)): dependencies: - jotai: 2.13.1(@types/react@19.0.10)(react@19.0.0) + jotai: 2.12.5(@types/react@19.0.10)(react@19.0.0) - jotai-immer@0.4.1(immer@10.1.3)(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0)): + jotai-immer@0.4.1(immer@10.1.1)(jotai@2.12.5(@types/react@19.0.10)(react@19.0.0)): dependencies: - immer: 10.1.3 - jotai: 2.13.1(@types/react@19.0.10)(react@19.0.0) + immer: 10.1.1 + jotai: 2.12.5(@types/react@19.0.10)(react@19.0.0) - jotai-tanstack-query@0.11.0(@tanstack/query-core@5.87.1)(@tanstack/react-query@5.87.1(react@19.0.0))(jotai@2.13.1(@types/react@19.0.10)(react@19.0.0))(react@19.0.0): - dependencies: - '@tanstack/query-core': 5.87.1 - jotai: 2.13.1(@types/react@19.0.10)(react@19.0.0) + jotai@2.12.5(@types/react@19.0.10)(react@19.0.0): optionalDependencies: - '@tanstack/react-query': 5.87.1(react@19.0.0) - react: 19.0.0 - - jotai@2.13.1(@types/react@19.0.10)(react@19.0.0): - optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.0.10 react: 19.0.0 js-beautify@1.15.4: @@ -9485,8 +7996,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@4.8.0: {} - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -9507,15 +8016,8 @@ snapshots: json5@2.2.3: {} - jsondiffpatch@0.5.0: - dependencies: - chalk: 3.0.0 - diff-match-patch: 1.0.5 - jsonpointer@5.0.1: {} - jsonrepair@3.13.0: {} - jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -9656,9 +8158,9 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lexical@0.35.0: {} + lexical@0.33.1: {} - lib0@0.2.114: + lib0@0.2.109: dependencies: isomorphic.js: 0.2.5 @@ -9674,8 +8176,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.curry@4.1.1: {} - lodash.debounce@4.0.8: {} lodash.includes@4.3.0: {} @@ -9707,8 +8207,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.2.0: {} - lowlight@1.20.0: dependencies: fault: 1.0.4 @@ -9720,26 +8218,13 @@ snapshots: dependencies: react: 19.0.0 - lz-string@1.5.0: {} - - make-error@1.3.6: {} + make-error@1.3.6: + optional: true make-synchronized@0.4.2: {} math-intrinsics@1.1.0: {} - mdast-util-to-hast@13.2.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - media-typer@0.3.0: {} memoize-one@5.2.1: {} @@ -9752,23 +8237,6 @@ snapshots: methods@1.1.2: {} - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-encode@2.0.1: {} - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -9782,8 +8250,6 @@ snapshots: mime@1.6.0: {} - min-indent@1.0.1: {} - mini-svg-data-uri@1.4.4: {} minimatch@3.1.2: @@ -9828,42 +8294,36 @@ snapshots: neo-async@2.6.2: {} - next@15.5.2(@playwright/test@1.53.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.3.4(@playwright/test@1.53.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.5.2 + '@next/env': 15.3.4 + '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001734 + busboy: 1.6.0 + caniuse-lite: 1.0.30001724 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.2 - '@next/swc-darwin-x64': 15.5.2 - '@next/swc-linux-arm64-gnu': 15.5.2 - '@next/swc-linux-arm64-musl': 15.5.2 - '@next/swc-linux-x64-gnu': 15.5.2 - '@next/swc-linux-x64-musl': 15.5.2 - '@next/swc-win32-arm64-msvc': 15.5.2 - '@next/swc-win32-x64-msvc': 15.5.2 + '@next/swc-darwin-arm64': 15.3.4 + '@next/swc-darwin-x64': 15.3.4 + '@next/swc-linux-arm64-gnu': 15.3.4 + '@next/swc-linux-arm64-musl': 15.3.4 + '@next/swc-linux-x64-gnu': 15.3.4 + '@next/swc-linux-x64-musl': 15.3.4 + '@next/swc-win32-arm64-msvc': 15.3.4 + '@next/swc-win32-x64-msvc': 15.3.4 '@playwright/test': 1.53.1 - sharp: 0.34.3 + sharp: 0.34.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-domexception@1.0.0: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-mocks-http@1.17.2(@types/node@20.17.24): dependencies: accepts: 1.3.8 @@ -9881,8 +8341,6 @@ snapshots: node-releases@2.0.19: {} - node-releases@2.0.23: {} - nodemailer@6.10.0: {} nopt@7.2.1: @@ -9941,20 +8399,6 @@ snapshots: dependencies: wrappy: 1.0.2 - oniguruma-parser@0.12.1: {} - - oniguruma-to-es@4.3.3: - dependencies: - oniguruma-parser: 0.12.1 - regex: 6.0.1 - regex-recursion: 6.0.2 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - opener@1.5.2: {} optionator@0.9.4: @@ -10016,8 +8460,6 @@ snapshots: path-type@4.0.0: {} - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -10058,13 +8500,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3) postcss-nested@6.2.0(postcss@8.5.6): dependencies: @@ -10129,12 +8571,6 @@ snapshots: prettier@3.6.0: {} - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -10160,8 +8596,6 @@ snapshots: dependencies: xtend: 4.0.2 - property-information@7.1.0: {} - proto-list@1.2.4: {} proxy-from-env@1.1.0: {} @@ -10504,16 +8938,6 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-base16-styling@0.9.1: - dependencies: - '@babel/runtime': 7.27.6 - '@types/base16': 1.0.5 - '@types/lodash': 4.17.18 - base16: 1.0.0 - color: 3.2.1 - csstype: 3.1.3 - lodash.curry: 4.1.1 - react-day-picker@8.10.1(date-fns@3.6.0)(react@19.0.0): dependencies: date-fns: 3.6.0 @@ -10543,29 +8967,14 @@ snapshots: '@babel/runtime': 7.27.0 react: 19.0.0 - react-error-boundary@5.0.0(react@19.0.0): - dependencies: - '@babel/runtime': 7.27.6 - react: 19.0.0 - react-icons@5.5.0(react@19.0.0): dependencies: react: 19.0.0 react-is@16.13.1: {} - react-is@17.0.2: {} - react-is@18.3.1: {} - react-json-tree@0.18.0(@types/react@19.0.10)(react@19.0.0): - dependencies: - '@babel/runtime': 7.27.6 - '@types/lodash': 4.17.18 - '@types/react': 19.0.10 - react: 19.0.0 - react-base16-styling: 0.9.1 - react-jss@10.10.0(react@19.0.0): dependencies: '@babel/runtime': 7.27.0 @@ -10581,50 +8990,12 @@ snapshots: theming: 3.3.0(react@19.0.0) tiny-warning: 1.0.3 - react-number-format@5.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-qr-code@2.0.15(react@19.0.0): dependencies: prop-types: 15.8.1 qr.js: 0.0.0 react: 19.0.0 - react-redux@9.2.0(@types/react@19.0.10)(react@19.0.0)(redux@5.0.1): - dependencies: - '@types/use-sync-external-store': 0.0.6 - react: 19.0.0 - use-sync-external-store: 1.4.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.10 - redux: 5.0.1 - - react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): - dependencies: - react: 19.0.0 - react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.10 - - react-remove-scroll@2.7.1(@types/react@19.0.10)(react@19.0.0): - dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.10 - - react-resizable-panels@2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-resizable@3.0.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: prop-types: 15.8.1 @@ -10641,14 +9012,6 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0): - dependencies: - get-nonce: 1.0.1 - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.10 - react-syntax-highlighter@15.6.1(react@19.0.0): dependencies: '@babel/runtime': 7.27.0 @@ -10659,15 +9022,6 @@ snapshots: react: 19.0.0 refractor: 3.6.0 - react-textarea-autosize@8.5.9(@types/react@19.0.10)(react@19.0.0): - dependencies: - '@babel/runtime': 7.27.6 - react: 19.0.0 - use-composed-ref: 1.4.0(@types/react@19.0.10)(react@19.0.0) - use-latest: 1.3.0(@types/react@19.0.10)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime': 7.27.6 @@ -10699,14 +9053,6 @@ snapshots: dependencies: picomatch: 2.3.1 - recast@0.23.11: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -10724,37 +9070,6 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 - recharts@3.1.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react-is@18.3.1)(react@19.0.0)(redux@5.0.1): - dependencies: - '@reduxjs/toolkit': 2.8.2(react-redux@9.2.0(@types/react@19.0.10)(react@19.0.0)(redux@5.0.1))(react@19.0.0) - clsx: 2.1.1 - decimal.js-light: 2.5.1 - es-toolkit: 1.39.7 - eventemitter3: 5.0.1 - immer: 10.1.3 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-is: 18.3.1 - react-redux: 9.2.0(@types/react@19.0.10)(react@19.0.0)(redux@5.0.1) - reselect: 5.1.1 - tiny-invariant: 1.3.3 - use-sync-external-store: 1.4.0(react@19.0.0) - victory-vendor: 37.3.6 - transitivePeerDependencies: - - '@types/react' - - redux - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - redux-thunk@3.1.0(redux@5.0.1): - dependencies: - redux: 5.0.1 - - redux@5.0.1: {} - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -10774,16 +9089,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regex-recursion@6.0.2: - dependencies: - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@6.0.1: - dependencies: - regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -10799,8 +9104,6 @@ snapshots: requires-port@1.0.0: {} - reselect@5.1.1: {} - resize-observer-polyfill@1.5.1: {} resolve-from@4.0.0: {} @@ -10854,7 +9157,7 @@ snapshots: scheduler@0.25.0: {} - schema-utils@4.3.3: + schema-utils@4.3.2: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -10901,34 +9204,33 @@ snapshots: shallow-equal@1.2.1: {} - sharp@0.34.3: + sharp@0.34.2: dependencies: color: 4.2.3 detect-libc: 2.0.4 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.3 - '@img/sharp-darwin-x64': 0.34.3 - '@img/sharp-libvips-darwin-arm64': 1.2.0 - '@img/sharp-libvips-darwin-x64': 1.2.0 - '@img/sharp-libvips-linux-arm': 1.2.0 - '@img/sharp-libvips-linux-arm64': 1.2.0 - '@img/sharp-libvips-linux-ppc64': 1.2.0 - '@img/sharp-libvips-linux-s390x': 1.2.0 - '@img/sharp-libvips-linux-x64': 1.2.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 - '@img/sharp-libvips-linuxmusl-x64': 1.2.0 - '@img/sharp-linux-arm': 0.34.3 - '@img/sharp-linux-arm64': 0.34.3 - '@img/sharp-linux-ppc64': 0.34.3 - '@img/sharp-linux-s390x': 0.34.3 - '@img/sharp-linux-x64': 0.34.3 - '@img/sharp-linuxmusl-arm64': 0.34.3 - '@img/sharp-linuxmusl-x64': 0.34.3 - '@img/sharp-wasm32': 0.34.3 - '@img/sharp-win32-arm64': 0.34.3 - '@img/sharp-win32-ia32': 0.34.3 - '@img/sharp-win32-x64': 0.34.3 + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 optional: true shebang-command@2.0.0: @@ -10937,17 +9239,6 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.12.2: - dependencies: - '@shikijs/core': 3.12.2 - '@shikijs/engine-javascript': 3.12.2 - '@shikijs/engine-oniguruma': 3.12.2 - '@shikijs/langs': 3.12.2 - '@shikijs/themes': 3.12.2 - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -10981,6 +9272,7 @@ snapshots: simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 + optional: true sirv@2.0.4: dependencies: @@ -11001,8 +9293,6 @@ snapshots: space-separated-tokens@1.1.5: {} - space-separated-tokens@2.0.2: {} - stable-hash@0.0.5: {} stable-hash@0.0.6: {} @@ -11014,15 +9304,7 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@8.6.14(prettier@3.6.0): - dependencies: - '@storybook/core': 8.6.14(prettier@3.6.0)(storybook@8.6.14(prettier@3.6.0)) - optionalDependencies: - prettier: 3.6.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + streamsearch@1.1.0: {} string-convert@0.2.1: {} @@ -11088,11 +9370,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 @@ -11107,10 +9384,6 @@ snapshots: strip-bom@3.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@3.1.1: {} styled-jsx@5.1.6(react@19.0.0): @@ -11189,17 +9462,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swc-loader@0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.17))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10)): + swc-loader@0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.15))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15))): dependencies: - '@swc/core': 1.11.8(@swc/helpers@0.5.17) + '@swc/core': 1.11.8(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 - webpack: 5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10) - - swc-loader@0.2.6(@swc/core@1.11.8(@swc/helpers@0.5.17))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))): - dependencies: - '@swc/core': 1.11.8(@swc/helpers@0.5.17) - '@swc/counter': 0.1.3 - webpack: 5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17)) + webpack: 5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15)) swr-devtools@1.3.2(react@19.0.0)(swr@2.3.3(react@19.0.0)): dependencies: @@ -11223,11 +9490,11 @@ snapshots: tailwind-merge@2.6.0: {} - tailwind-scrollbar@3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3))): + tailwind-scrollbar@3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -11246,7 +9513,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -11254,34 +9521,22 @@ snapshots: transitivePeerDependencies: - ts-node - tapable@2.3.0: {} + tapable@2.2.2: {} - terser-webpack-plugin@5.3.14(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10)(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10)): + terser-webpack-plugin@5.3.14(@swc/core@1.11.8(@swc/helpers@0.5.15))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15))): dependencies: - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 4.3.3 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10) + terser: 5.43.1 + webpack: 5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15)) optionalDependencies: - '@swc/core': 1.11.8(@swc/helpers@0.5.17) - esbuild: 0.25.10 + '@swc/core': 1.11.8(@swc/helpers@0.5.15) - terser-webpack-plugin@5.3.14(@swc/core@1.11.8(@swc/helpers@0.5.17))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))): + terser@5.43.1: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17)) - optionalDependencies: - '@swc/core': 1.11.8(@swc/helpers@0.5.17) - - terser@5.44.0: - dependencies: - '@jridgewell/source-map': 0.3.11 + '@jridgewell/source-map': 0.3.6 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -11315,10 +9570,6 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinyrainbow@1.2.0: {} - - tinyspy@3.0.2: {} - tldts-core@6.1.83: {} tldts@6.1.83: @@ -11335,8 +9586,6 @@ snapshots: tr46@0.0.3: {} - trim-lines@3.0.1: {} - ts-api-utils@1.4.3(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -11347,7 +9596,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.17.24)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@20.17.24)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -11365,29 +9614,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.11.8(@swc/helpers@0.5.17) + '@swc/core': 1.11.8(@swc/helpers@0.5.15) optional: true - ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.17))(@types/node@20.19.19)(typescript@5.8.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.19 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.8.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.11.8(@swc/helpers@0.5.17) - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -11395,12 +9624,6 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@2.8.1: {} tsx@4.20.3: @@ -11439,7 +9662,7 @@ snapshots: twilio@4.23.0(debug@4.4.0): dependencies: - axios: 1.12.2(debug@4.4.0) + axios: 1.8.2(debug@4.4.0) dayjs: 1.11.13 https-proxy-agent: 5.0.1 jsonwebtoken: 9.0.2 @@ -11457,8 +9680,6 @@ snapshots: type-fest@0.20.2: {} - type-fest@4.41.0: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -11497,12 +9718,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3): + typescript-eslint@8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/parser': 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.32.0(jiti@1.21.7))(typescript@5.8.3) - eslint: 9.32.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@1.21.7))(typescript@5.8.3) + eslint: 9.29.0(jiti@1.21.7) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -11520,29 +9741,6 @@ snapshots: undici-types@6.21.0: {} - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - unrs-resolver@1.9.1: dependencies: napi-postinstall: 0.2.4 @@ -11573,9 +9771,9 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.3(browserslist@4.26.3): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.26.3 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -11592,40 +9790,6 @@ snapshots: dependencies: react: 19.0.0 - use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): - dependencies: - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.10 - - use-composed-ref@1.4.0(@types/react@19.0.10)(react@19.0.0): - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.10 - - use-isomorphic-layout-effect@1.2.1(@types/react@19.0.10)(react@19.0.0): - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.10 - - use-latest@1.3.0(@types/react@19.0.10)(react@19.0.0): - dependencies: - react: 19.0.0 - use-isomorphic-layout-effect: 1.2.1(@types/react@19.0.10)(react@19.0.0) - optionalDependencies: - '@types/react': 19.0.10 - - use-sidecar@1.1.3(@types/react@19.0.10)(react@19.0.0): - dependencies: - detect-node-es: 1.1.0 - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.0.10 - use-sync-external-store@1.4.0(react@19.0.0): dependencies: react: 19.0.0 @@ -11637,29 +9801,12 @@ snapshots: util-deprecate@1.0.2: {} - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - uuid@11.1.0: {} uuidjs@5.1.0: {} - v8-compile-cache-lib@3.0.1: {} - - vfile-message@4.0.3: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 + v8-compile-cache-lib@3.0.1: + optional: true victory-vendor@36.9.2: dependencies: @@ -11678,23 +9825,6 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - victory-vendor@37.3.6: - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-ease': 3.0.2 - '@types/d3-interpolate': 3.0.4 - '@types/d3-scale': 4.0.9 - '@types/d3-shape': 3.1.7 - '@types/d3-time': 3.0.4 - '@types/d3-timer': 3.0.2 - d3-array: 3.2.4 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-scale: 4.0.2 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-timer: 3.0.1 - vue-eslint-parser@9.4.3(eslint@8.57.1): dependencies: debug: 4.4.1 @@ -11713,8 +9843,6 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - web-streams-polyfill@3.3.3: {} - web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} @@ -11740,37 +9868,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17)): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - browserslist: 4.26.3 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.8(@swc/helpers@0.5.17))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10): + webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -11778,9 +9876,9 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.26.3 + browserslist: 4.25.0 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.18.1 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -11790,9 +9888,9 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10)(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.17))(esbuild@0.25.10)) + schema-utils: 4.3.2 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(@swc/core@1.11.8(@swc/helpers@0.5.15))(webpack@5.98.0(@swc/core@1.11.8(@swc/helpers@0.5.15))) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -11868,8 +9966,6 @@ snapshots: ws@7.5.10: {} - ws@8.18.3: {} - xmlbuilder@13.0.2: {} xtend@4.0.2: {} @@ -11878,10 +9974,9 @@ snapshots: yjs@13.6.24: dependencies: - lib0: 0.2.114 + lib0: 0.2.109 - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} - - zwitch@2.0.4: {} diff --git a/web/tests/README.md b/web/tests/README.md index 7dbcd62b94..50161f1459 100644 --- a/web/tests/README.md +++ b/web/tests/README.md @@ -153,7 +153,7 @@ Tests can be filtered using the following tags: - `@path:` - Test path type (happy, grumpy) - `@feature-scope:` - Feature availability (ee, common) - `@lens:` - Test lens (functional, performance, security) -- `@case:` - Testcase type (typical, edge) +- `@case:` - Test case type (typical, edge) - `@speed:` - Test speed type (fast, slow) Tags affect user authentication requirements. For example: diff --git a/web/tests/package.json b/web/tests/package.json index 957993a5df..fe2a35192e 100644 --- a/web/tests/package.json +++ b/web/tests/package.json @@ -18,6 +18,6 @@ "typescript": "^5.8.3" }, "dependencies": { - "axios": "^1.12.2" + "axios": "^1.7.9" } } diff --git a/web/tests/playwright/config/testTags.ts b/web/tests/playwright/config/testTags.ts index bdf255a8f4..487e90c33e 100644 --- a/web/tests/playwright/config/testTags.ts +++ b/web/tests/playwright/config/testTags.ts @@ -11,7 +11,7 @@ export const TestScope = { EVALUATIONS: "evaluations", // Evaluation flows SETTINGS: "settings", // Settings flows DEPLOYMENT: "deployment", // Deployment flows - OBSERVABILITY: "observability", + OBSERVABILITY: "observability" } as const /** @@ -74,7 +74,7 @@ export const TestLensType = { SECURITY: "security", } as const -export const TestcaseType = { +export const TestCaseType = { TYPICAL: "typical", EDGE: "edge", } as const diff --git a/web/tests/tests/fixtures/base.fixture/apiHelpers/README.md b/web/tests/tests/fixtures/base.fixture/apiHelpers/README.md index 536cc52ba3..f4c3b7d4aa 100644 --- a/web/tests/tests/fixtures/base.fixture/apiHelpers/README.md +++ b/web/tests/tests/fixtures/base.fixture/apiHelpers/README.md @@ -50,7 +50,7 @@ getTestsets(): Promise const testsets = await apiHelpers.getTestsets() ``` -Retrieves all available testsets. +Retrieves all available test sets. ### getVariants diff --git a/web/tsconfig.tsbuildinfo b/web/tsconfig.tsbuildinfo deleted file mode 100644 index 37609d3f66..0000000000 --- a/web/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/global.d.ts","./node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts","./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/amp.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/get-page-files.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/retry-handler.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/retry-agent.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/util.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/eventsource.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@6.19.8/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/dom-events.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/sea.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@20.17.24/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/canary.d.ts","./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/experimental.d.ts","./node_modules/.pnpm/@types+react-dom@19.0.4_@types+react@19.0.10/node_modules/@types/react-dom/index.d.ts","./node_modules/.pnpm/@types+react-dom@19.0.4_@types+react@19.0.10/node_modules/@types/react-dom/canary.d.ts","./node_modules/.pnpm/@types+react-dom@19.0.4_@types+react@19.0.10/node_modules/@types/react-dom/experimental.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/fallback.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/body-streams.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/worker.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/constants.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/require-hook.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/page-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/node-environment.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-kind.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/load-components.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/render-result.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/with-router.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/router.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/route-loader.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/page-loader.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/templates/pages.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/jsx-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/react-dev-overlay/pages/pages-dev-overlay.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/render.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/base-server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/next-url.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/adapter.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/clean-async-snapshot-instance.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/clean-async-snapshot.external.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/server-inserted-metadata.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/client-page.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/search-params.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/metadata/metadata-boundary.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/http.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/utils.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/export/routes/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/export/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/export/worker.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/worker.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/after/after.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/after/after-context.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/params.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request-meta.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/cli/next-test.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/config-shared.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/base-http/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/base-http/node.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/.pnpm/sharp@0.34.2/node_modules/sharp/lib/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/next-server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/trace/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/trace/trace.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/trace/shared.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/trace/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/webpack-config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/build/swc/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/react-dev-overlay/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/telemetry/storage.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/next.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/.pnpm/@next+env@15.3.4/node_modules/@next/env/dist/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/pages/_app.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/app.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/cache.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/config.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/pages/_document.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/document.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dynamic.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/pages/_error.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/error.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/head.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/head.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/cookies.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/headers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/headers.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/image-component.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/image.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/link.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/link.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/redirect.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/not-found.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/components/navigation.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/navigation.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/router.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/client/script.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/script.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/after/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/root-params.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/server/request/connection.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/server.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/types/global.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/types/compiled.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/image-types/global.d.ts","./ee/next-env.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/responsiveobserver.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/type.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/throttlebyanimationframe.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/affix/index.d.ts","./node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-util/lib/portal.d.ts","./node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-util/lib/dom/scrolllocker.d.ts","./node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-util/lib/portalwrapper.d.ts","./node_modules/.pnpm/rc-dialog@9.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-dialog/lib/idialogproptypes.d.ts","./node_modules/.pnpm/rc-dialog@9.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-dialog/lib/dialogwrap.d.ts","./node_modules/.pnpm/rc-dialog@9.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-dialog/lib/dialog/content/panel.d.ts","./node_modules/.pnpm/rc-dialog@9.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-dialog/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/aria-data-attrs.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/hooks/useclosable.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/alert/alert.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/alert/errorboundary.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/alert/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/anchor/anchorlink.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/anchor/anchor.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/anchor/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/message/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/config-provider/sizecontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/button/button-group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/button/buttonhelpers.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/button/button.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/warning.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/namepathtype.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/useform.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/interface.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/generate/index.d.ts","./node_modules/.pnpm/rc-motion@2.9.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-motion/es/interface.d.ts","./node_modules/.pnpm/rc-motion@2.9.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-motion/es/cssmotion.d.ts","./node_modules/.pnpm/rc-motion@2.9.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-motion/es/util/diff.d.ts","./node_modules/.pnpm/rc-motion@2.9.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-motion/es/cssmotionlist.d.ts","./node_modules/.pnpm/rc-motion@2.9.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-motion/es/context.d.ts","./node_modules/.pnpm/rc-motion@2.9.5_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-motion/es/index.d.ts","./node_modules/.pnpm/@rc-component+trigger@2.2.7_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/trigger/lib/interface.d.ts","./node_modules/.pnpm/@rc-component+trigger@2.2.7_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/trigger/lib/index.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/interface.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/pickerinput/selector/rangeselector.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/pickerinput/rangepicker.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/pickerinput/singlepicker.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/pickerpanel/index.d.ts","./node_modules/.pnpm/rc-picker@4.11.3_date-fns@3.6.0_dayjs@1.11.13_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-picker/lib/index.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/field.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/namepathtype.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/useform.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/interface.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/field.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/list.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/form.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/formcontext.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/fieldcontext.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/listcontext.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/usewatch.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/es/index.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/form.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/grid/col.d.ts","./node_modules/.pnpm/compute-scroll-into-view@3.1.1/node_modules/compute-scroll-into-view/dist/index.d.ts","./node_modules/.pnpm/scroll-into-view-if-needed@3.1.0/node_modules/scroll-into-view-if-needed/dist/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/hooks/useform.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/form.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/formiteminput.d.ts","./node_modules/.pnpm/rc-tooltip@6.4.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tooltip/lib/placements.d.ts","./node_modules/.pnpm/rc-tooltip@6.4.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tooltip/lib/tooltip.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/cache.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/hooks/useglobalcache.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/util/css-variables.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/extractstyle.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/interface.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/theme.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/hooks/usecachetoken.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/hooks/usecssvarregister.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/keyframes.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/interface.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/contentquoteslinter.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/hashedanimationlinter.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/legacynotselectorlinter.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/logicalpropertieslinter.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/nanlinter.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/parentselectorlinter.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/linters/index.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/transformers/interface.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/stylecontext.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/hooks/usestyleregister.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/calc/calculator.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/calc/csscalculator.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/calc/numcalculator.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/calc/index.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/createtheme.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/themecache.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/theme/index.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/transformers/legacylogicalproperties.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/transformers/px2rem.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/util/index.d.ts","./node_modules/.pnpm/@ant-design+cssinjs@1.23.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/presetcolors.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/seeds.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/maps/colors.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/maps/font.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/maps/size.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/maps/style.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/maps/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/alias.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/interface/components.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/interface/index.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/util/calc/calculator.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/hooks/usecsp.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/hooks/useprefix.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/hooks/usetoken.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/util/genstyleutils.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/util/calc/csscalculator.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/util/calc/numcalculator.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/util/calc/index.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/util/statistic.d.ts","./node_modules/.pnpm/@ant-design+cssinjs-utils@1.1.3_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/cssinjs-utils/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/themes/shared/genfontsizes.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/themes/default/theme.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/usetoken.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/util/genstyleutils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/util/genpresetcolor.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/util/usereseticonstyle.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/internal.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/wave/style.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/affix/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/alert/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/anchor/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/app/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/avatar/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/back-top/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/badge/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/breadcrumb/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/button/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/button/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/select/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/style/roundedarrow.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/style/panel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/calendar/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/card/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/carousel/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/cascader/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/checkbox/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/collapse/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/color-picker/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/descriptions/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/divider/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/drawer/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/style/placementarrow.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/dropdown/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/empty/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/flex/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/grid/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/image/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input-number/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input-number/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/layout/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/list/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/mentions/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/message/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/notification/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/pagination/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/popconfirm/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/popover/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/progress/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/qr-code/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/radio/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/rate/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/result/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/segmented/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/select/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/slider/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/space/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/spin/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/statistic/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/steps/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/switch/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tabs/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tag/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/timeline/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tooltip/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tour/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tree/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tree-select/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/upload/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/splitter/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/components.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/cssinjs-utils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/interface/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/colors.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/getrenderpropvalue.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/placements.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tooltip/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tooltip/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/formitemlabel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/hooks/useformitemstatus.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/formitem/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/statusutils.d.ts","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/locale/types.d.ts","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/locale/index.d.ts","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/time-picker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/generatepicker/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/button/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/generatepicker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/empty/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/locale.d.ts","./node_modules/.pnpm/rc-pagination@5.1.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-pagination/lib/options.d.ts","./node_modules/.pnpm/rc-pagination@5.1.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-pagination/lib/interface.d.ts","./node_modules/.pnpm/rc-pagination@5.1.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-pagination/lib/pagination.d.ts","./node_modules/.pnpm/rc-pagination@5.1.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-pagination/lib/index.d.ts","./node_modules/.pnpm/rc-virtual-list@3.19.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-virtual-list/lib/filler.d.ts","./node_modules/.pnpm/rc-virtual-list@3.19.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-virtual-list/lib/interface.d.ts","./node_modules/.pnpm/rc-virtual-list@3.19.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-virtual-list/lib/utils/cachemap.d.ts","./node_modules/.pnpm/rc-virtual-list@3.19.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-virtual-list/lib/hooks/usescrollto.d.ts","./node_modules/.pnpm/rc-virtual-list@3.19.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-virtual-list/lib/scrollbar.d.ts","./node_modules/.pnpm/rc-virtual-list@3.19.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-virtual-list/lib/list.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/interface.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/baseselect/index.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/optgroup.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/option.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/select.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/hooks/usebaseprops.d.ts","./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/motion.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/select/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/pagination/pagination.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/popconfirm/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/popconfirm/purepanel.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/constant.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/namepathtype.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/interface.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/footer/row.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/footer/cell.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/footer/summary.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/footer/index.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/sugar/column.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/sugar/columngroup.d.ts","./node_modules/.pnpm/@rc-component+context@1.4.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/context/lib/immutable.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/table.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/utils/legacyutil.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/virtualtable/index.d.ts","./node_modules/.pnpm/rc-table@7.51.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-table/lib/index.d.ts","./node_modules/.pnpm/rc-checkbox@3.5.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-checkbox/es/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/checkbox/checkbox.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/checkbox/groupcontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/checkbox/group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/checkbox/index.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/interface.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/menu.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/menuitem.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/submenu/index.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/menuitemgroup.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/context/pathcontext.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/divider.d.ts","./node_modules/.pnpm/rc-menu@9.16.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-menu/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/layout/sider.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/menucontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/menu.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/menudivider.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/menuitem.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/submenu.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/menu/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/dropdown/dropdown.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/dropdown/dropdown-button.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/dropdown/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/pagination/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/hooks/useselection.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/spin/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/internaltable.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/interface.d.ts","./node_modules/.pnpm/@rc-component+tour@1.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/tour/es/placements.d.ts","./node_modules/.pnpm/@rc-component+tour@1.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/tour/es/hooks/usetarget.d.ts","./node_modules/.pnpm/@rc-component+tour@1.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/tour/es/tourstep/defaultpanel.d.ts","./node_modules/.pnpm/@rc-component+tour@1.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/tour/es/interface.d.ts","./node_modules/.pnpm/@rc-component+tour@1.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/tour/es/tour.d.ts","./node_modules/.pnpm/@rc-component+tour@1.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/tour/es/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tour/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/listbody.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/list.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/operation.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/search.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/transfer/index.d.ts","./node_modules/.pnpm/rc-upload@4.9.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-upload/lib/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/progress/progress.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/progress/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/upload/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/locale/uselocale.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/locale/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/_util/wave/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/badge/ribbon.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/badge/scrollnumber.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/badge/index.d.ts","./node_modules/.pnpm/rc-tabs@15.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tabs/lib/hooks/useindicator.d.ts","./node_modules/.pnpm/rc-tabs@15.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tabs/lib/tabnavlist/index.d.ts","./node_modules/.pnpm/rc-tabs@15.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tabs/lib/tabpanellist/tabpane.d.ts","./node_modules/.pnpm/rc-dropdown@4.2.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-dropdown/lib/placements.d.ts","./node_modules/.pnpm/rc-dropdown@4.2.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-dropdown/lib/dropdown.d.ts","./node_modules/.pnpm/rc-tabs@15.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tabs/lib/interface.d.ts","./node_modules/.pnpm/rc-tabs@15.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tabs/lib/tabs.d.ts","./node_modules/.pnpm/rc-tabs@15.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tabs/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tabs/tabpane.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tabs/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/card/card.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/card/grid.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/card/meta.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/card/index.d.ts","./node_modules/.pnpm/rc-cascader@3.34.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-cascader/lib/panel.d.ts","./node_modules/.pnpm/rc-cascader@3.34.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-cascader/lib/utils/commonutil.d.ts","./node_modules/.pnpm/rc-cascader@3.34.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-cascader/lib/cascader.d.ts","./node_modules/.pnpm/rc-cascader@3.34.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-cascader/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/cascader/panel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/cascader/index.d.ts","./node_modules/.pnpm/rc-collapse@3.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-collapse/es/interface.d.ts","./node_modules/.pnpm/rc-collapse@3.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-collapse/es/collapse.d.ts","./node_modules/.pnpm/rc-collapse@3.9.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-collapse/es/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/collapse/collapsepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/collapse/collapse.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/collapse/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/descriptions/descriptionscontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/descriptions/item.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/descriptions/index.d.ts","./node_modules/.pnpm/@rc-component+portal@1.1.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/portal/es/portal.d.ts","./node_modules/.pnpm/@rc-component+portal@1.1.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/portal/es/mock.d.ts","./node_modules/.pnpm/@rc-component+portal@1.1.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/portal/es/index.d.ts","./node_modules/.pnpm/rc-drawer@7.3.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-drawer/lib/drawerpanel.d.ts","./node_modules/.pnpm/rc-drawer@7.3.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-drawer/lib/inter.d.ts","./node_modules/.pnpm/rc-drawer@7.3.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-drawer/lib/drawerpopup.d.ts","./node_modules/.pnpm/rc-drawer@7.3.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-drawer/lib/drawer.d.ts","./node_modules/.pnpm/rc-drawer@7.3.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-drawer/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/drawer/drawerpanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/drawer/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/flex/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/group.d.ts","./node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input/lib/utils/commonutils.d.ts","./node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input/lib/utils/types.d.ts","./node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input/lib/interface.d.ts","./node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input/lib/baseinput.d.ts","./node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input/lib/input.d.ts","./node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/input.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/otp/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/password.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/search.d.ts","./node_modules/.pnpm/rc-textarea@1.10.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-textarea/lib/interface.d.ts","./node_modules/.pnpm/rc-textarea@1.10.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-textarea/lib/textarea.d.ts","./node_modules/.pnpm/rc-textarea@1.10.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-textarea/lib/resizabletextarea.d.ts","./node_modules/.pnpm/rc-textarea@1.10.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-textarea/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/textarea.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input/index.d.ts","./node_modules/.pnpm/@rc-component+mini-decimal@1.1.0/node_modules/@rc-component/mini-decimal/es/interface.d.ts","./node_modules/.pnpm/@rc-component+mini-decimal@1.1.0/node_modules/@rc-component/mini-decimal/es/bigintdecimal.d.ts","./node_modules/.pnpm/@rc-component+mini-decimal@1.1.0/node_modules/@rc-component/mini-decimal/es/numberdecimal.d.ts","./node_modules/.pnpm/@rc-component+mini-decimal@1.1.0/node_modules/@rc-component/mini-decimal/es/minidecimal.d.ts","./node_modules/.pnpm/@rc-component+mini-decimal@1.1.0/node_modules/@rc-component/mini-decimal/es/numberutil.d.ts","./node_modules/.pnpm/@rc-component+mini-decimal@1.1.0/node_modules/@rc-component/mini-decimal/es/index.d.ts","./node_modules/.pnpm/rc-input-number@9.5.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input-number/es/inputnumber.d.ts","./node_modules/.pnpm/rc-input-number@9.5.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input-number/es/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/input-number/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/grid/row.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/grid/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/list/item.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/list/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/list/index.d.ts","./node_modules/.pnpm/rc-mentions@2.20.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-mentions/lib/option.d.ts","./node_modules/.pnpm/rc-mentions@2.20.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-mentions/lib/util.d.ts","./node_modules/.pnpm/rc-mentions@2.20.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-mentions/lib/mentions.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/mentions/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/modal.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/notification/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/popover/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/popover/index.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/interface.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/handles/handle.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/handles/index.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/marks/index.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/slider.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/context.d.ts","./node_modules/.pnpm/rc-slider@11.1.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-slider/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/slider/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/space/compact.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/space/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/space/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/column.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/columngroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/table.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tag/checkabletag.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tag/index.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/interface.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/contexttypes.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/dropindicator.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/nodelist.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/tree.d.ts","./node_modules/.pnpm/rc-tree-select@5.27.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree-select/lib/interface.d.ts","./node_modules/.pnpm/rc-tree-select@5.27.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree-select/lib/treenode.d.ts","./node_modules/.pnpm/rc-tree-select@5.27.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree-select/lib/utils/strategyutil.d.ts","./node_modules/.pnpm/rc-tree-select@5.27.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree-select/lib/treeselect.d.ts","./node_modules/.pnpm/rc-tree-select@5.27.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree-select/lib/index.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/treenode.d.ts","./node_modules/.pnpm/rc-tree@5.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-tree/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tree/tree.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tree/directorytree.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tree/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tree-select/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/config-provider/defaultrenderempty.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/config-provider/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/config-provider/hooks/useconfig.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/config-provider/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/confirm.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/modal/usemodal/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/app/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/app/app.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/app/useapp.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/app/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/auto-complete/autocomplete.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/auto-complete/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/avatar/avatarcontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/avatar/avatar.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/avatar/avatargroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/avatar/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/back-top/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/breadcrumb/breadcrumbitem.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/breadcrumb/breadcrumb.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/breadcrumb/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/date-picker/locale/en_us.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/calendar/locale/en_us.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/calendar/generatecalendar.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/calendar/index.d.ts","./node_modules/.pnpm/@ant-design+react-slick@1.1.2_react@19.0.0/node_modules/@ant-design/react-slick/types.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/carousel/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/col/index.d.ts","./node_modules/.pnpm/@ant-design+fast-color@2.0.6/node_modules/@ant-design/fast-color/lib/types.d.ts","./node_modules/.pnpm/@ant-design+fast-color@2.0.6/node_modules/@ant-design/fast-color/lib/fastcolor.d.ts","./node_modules/.pnpm/@ant-design+fast-color@2.0.6/node_modules/@ant-design/fast-color/lib/index.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/color.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/interface.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/components/slider.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/hooks/usecomponent.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/colorpicker.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/components/colorblock.d.ts","./node_modules/.pnpm/@rc-component+color-picker@2.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/color-picker/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/color-picker/color.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/color-picker/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/color-picker/colorpicker.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/color-picker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/divider/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/flex/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/backtop.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/floatbuttongroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/floatbutton.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/float-button/index.d.ts","./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/formcontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/errorlist.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/formlist.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/hooks/useforminstance.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/form/index.d.ts","./node_modules/.pnpm/rc-image@7.12.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-image/lib/hooks/useimagetransform.d.ts","./node_modules/.pnpm/rc-image@7.12.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-image/lib/preview.d.ts","./node_modules/.pnpm/rc-image@7.12.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-image/lib/interface.d.ts","./node_modules/.pnpm/rc-image@7.12.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-image/lib/previewgroup.d.ts","./node_modules/.pnpm/rc-image@7.12.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-image/lib/image.d.ts","./node_modules/.pnpm/rc-image@7.12.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-image/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/image/previewgroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/image/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/layout/layout.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/layout/index.d.ts","./node_modules/.pnpm/rc-notification@5.6.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-notification/lib/interface.d.ts","./node_modules/.pnpm/rc-notification@5.6.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-notification/lib/notice.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/message/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/message/usemessage.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/message/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/notification/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/notification/usenotification.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/notification/index.d.ts","./node_modules/.pnpm/@rc-component+qrcode@1.0.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/qrcode/lib/libs/qrcodegen.d.ts","./node_modules/.pnpm/@rc-component+qrcode@1.0.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/qrcode/lib/interface.d.ts","./node_modules/.pnpm/@rc-component+qrcode@1.0.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/qrcode/lib/utils.d.ts","./node_modules/.pnpm/@rc-component+qrcode@1.0.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/qrcode/lib/qrcodecanvas.d.ts","./node_modules/.pnpm/@rc-component+qrcode@1.0.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/qrcode/lib/qrcodesvg.d.ts","./node_modules/.pnpm/@rc-component+qrcode@1.0.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@rc-component/qrcode/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/qr-code/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/qr-code/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/radio/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/radio/group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/radio/radio.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/radio/radiobutton.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/radio/index.d.ts","./node_modules/.pnpm/rc-rate@2.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-rate/lib/star.d.ts","./node_modules/.pnpm/rc-rate@2.13.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-rate/lib/rate.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/rate/index.d.ts","./node_modules/.pnpm/@ant-design+icons-svg@4.4.2/node_modules/@ant-design/icons-svg/lib/types.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/components/icon.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/components/twotoneprimarycolor.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/components/antdicon.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/result/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/row/index.d.ts","./node_modules/.pnpm/rc-segmented@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-segmented/es/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/segmented/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/element.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/avatar.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/button.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/image.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/input.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/node.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/paragraph.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/title.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/skeleton.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/skeleton/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/statistic/utils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/statistic/statistic.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/statistic/countdown.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/statistic/timer.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/statistic/index.d.ts","./node_modules/.pnpm/rc-steps@6.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-steps/lib/interface.d.ts","./node_modules/.pnpm/rc-steps@6.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-steps/lib/step.d.ts","./node_modules/.pnpm/rc-steps@6.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-steps/lib/steps.d.ts","./node_modules/.pnpm/rc-steps@6.0.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-steps/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/steps/index.d.ts","./node_modules/.pnpm/rc-switch@4.1.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-switch/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/switch/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/themes/default/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/theme/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/timeline/timelineitem.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/timeline/timeline.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/timeline/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tour/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/tour/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/typography.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/base/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/link.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/paragraph.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/text.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/title.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/typography/index.d.ts","./node_modules/.pnpm/rc-upload@4.9.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-upload/lib/ajaxuploader.d.ts","./node_modules/.pnpm/rc-upload@4.9.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-upload/lib/upload.d.ts","./node_modules/.pnpm/rc-upload@4.9.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-upload/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/upload/upload.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/upload/dragger.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/upload/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/version/version.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/version/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/watermark/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/splitter/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/splitter/panel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/splitter/splitter.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/splitter/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/config-provider/unstablecontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/index.d.ts","./ee/src/components/evalrundetails/components/modals/types.d.ts","./ee/src/components/evalrundetails/components/modals/savedatamodal/assets/types.d.ts","./ee/src/components/evaluationtable/types.d.ts","./ee/src/components/evaluations/evaluationcardview/types.d.ts","./ee/src/components/humanevaluationmodal/types.d.ts","./ee/src/components/postsignupform/assets/types.d.ts","./ee/src/components/savetestsetmodal/types.d.ts","./ee/src/components/pages/settings/billing/modals/autorenewalcancelmodal/assets/types.d.ts","./ee/src/components/pages/settings/billing/modals/pricingmodal/assets/types.d.ts","./ee/src/components/pages/settings/billing/assets/types.d.ts","./ee/src/services/billing/types.d.ts","./oss/next-env.d.ts","./oss/src/components/banners/oldappdeprecationbanner/types.d.ts","./oss/src/components/customworkflowbanner/types.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicalelementnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicaltextnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalselection.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicalrootnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicaleditorstate.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicaleditor.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalconstants.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalnodestate.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/caret/lexicalcaret.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/caret/lexicalcaretutils.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalcommands.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalevents.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalnormalization.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalupdates.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/lexicalutils.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/artificialnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicaldecoratornode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicallinebreaknode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicalparagraphnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/nodes/lexicaltabnode.d.ts","./node_modules/.pnpm/lexical@0.30.0/node_modules/lexical/index.d.ts","./oss/src/components/editor/types.d.ts","./oss/src/components/editor/state/types.d.ts","./oss/src/components/enhanceduis/drawer/types.d.ts","./oss/src/components/enhanceduis/modal/types.d.ts","./oss/src/components/genericdrawer/types.d.ts","./oss/src/components/llmicons/assets/types.d.ts","./oss/src/components/modelregistry/drawers/configureproviderdrawer/assets/types.d.ts","./oss/src/components/modelregistry/modals/configureprovidermodal/assets/types.d.ts","./oss/src/components/modelregistry/modals/deleteprovidermodal/assets/types.d.ts","./oss/src/components/modelregistry/assets/labelinput/types.d.ts","./oss/src/lib/shared/variant/transformer/types/message.d.ts","./oss/src/lib/shared/variant/transformer/types/variant.d.ts","./oss/src/lib/shared/variant/generictransformer/types/base.d.ts","./oss/src/lib/shared/variant/generictransformer/types/options.d.ts","./oss/src/lib/shared/variant/generictransformer/types/transformed.d.ts","./oss/src/lib/shared/variant/generictransformer/types/schema.d.ts","./oss/src/lib/shared/variant/generictransformer/types/metadata.d.ts","./oss/src/lib/shared/variant/generictransformer/types/openapispec.d.ts","./oss/src/lib/shared/variant/generictransformer/types/index.d.ts","./oss/src/lib/shared/variant/transformer/types/transformedvariant.d.ts","./oss/src/lib/shared/variant/transformer/types/testrun.d.ts","./oss/src/lib/shared/variant/transformer/types/input.d.ts","./oss/src/lib/shared/variant/transformer/types/playground.d.ts","./oss/src/lib/shared/variant/transformer/types/index.d.ts","./oss/src/components/playground/components/types.d.ts","./oss/src/components/playground/assets/enhancedbutton.tsx","./oss/src/components/playground/components/drawers/testsetdrawer/types.d.ts","./oss/src/components/playground/components/drawers/tracedrawer/types.d.ts","./oss/src/components/playground/components/menus/playgroundcreatenewvariant/types.d.ts","./oss/src/components/playground/components/menus/playgroundcreatenewvariant/assets/types.d.ts","./oss/src/components/playground/components/menus/playgroundgenerationvariablemenu/types.d.ts","./oss/src/components/playground/components/menus/playgroundvariantheadermenu/types.d.ts","./oss/src/components/playground/components/menus/selectvariant/types.d.ts","./oss/src/components/playground/components/modals/commitvariantchangesmodal/assets/types.d.ts","./oss/src/components/playground/components/modals/createvariantmodal/types.d.ts","./oss/src/components/playground/components/modals/createvariantmodal/assets/types.d.ts","./oss/src/components/playground/components/modals/deletevariantmodal/types.d.ts","./oss/src/components/playground/components/modals/deletevariantmodal/assets/deletevariantbutton/types.d.ts","./oss/src/components/playground/components/modals/deployvariantmodal/types.d.ts","./oss/src/components/playground/components/modals/deployvariantmodal/assets/deployvariantbutton/types.d.ts","./oss/src/components/playground/components/modals/deployvariantmodal/assets/deployvariantmodalcontent/types.d.ts","./oss/src/components/playground/components/modals/loadtestsetmodal/types.d.ts","./oss/src/components/playground/components/modals/loadtestsetmodal/assets/loadtestsetbutton/types.d.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisonchatoutput/types.d.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisoncompletionoutput/types.d.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisonheader/types.d.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/assets/generationcomparisoninputheader/types.d.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/assets/generationcomparisonoutputheader/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationchat/types.d.ts","./oss/src/components/playground/components/sharededitor/types.d.ts","./oss/src/components/playground/components/promptmessageconfig/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationchatrow/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationcompletion/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationcompletionrow/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationheader/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationoutputtext/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationresultutils/types.d.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationvariableoptions/types.d.ts","./oss/src/components/playground/components/playgroundpromptcomparisonview/promptcomparisonvariantnavigation/types.d.ts","./oss/src/components/playground/components/playgroundpromptcomparisonview/promptcomparisonvariantnavigation/assets/variantnavigationcard/types.d.ts","./oss/src/components/playground/components/playgroundvariantconfig/types.d.ts","./oss/src/components/playground/components/playgroundvariantconfig/assets/types.d.ts","./oss/src/components/playground/components/playgroundvariantconfigprompt/types.d.ts","./oss/src/components/playground/components/playgroundvariantcustomproperties/types.d.ts","./oss/src/components/playground/components/playgroundvariantmodelconfig/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/booleancontrol/types.d.ts","./node_modules/.pnpm/swr@2.3.3_react@19.0.0/node_modules/swr/dist/_internal/events.d.mts","./node_modules/.pnpm/swr@2.3.3_react@19.0.0/node_modules/swr/dist/_internal/types.d.mts","./node_modules/.pnpm/swr@2.3.3_react@19.0.0/node_modules/swr/dist/_internal/constants.d.mts","./node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/index.d.ts","./node_modules/.pnpm/swr@2.3.3_react@19.0.0/node_modules/swr/dist/_internal/index.d.mts","./node_modules/.pnpm/swr@2.3.3_react@19.0.0/node_modules/swr/dist/index/index.d.mts","./oss/src/components/playground/state/types.d.ts","./oss/src/components/playground/hooks/useplayground/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/compoundcontrol/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/grouptab/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/minmaxcontrol/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/multiselectcontrol/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptimageupload/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptmessagecontent/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptmessagecontent/assets/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptmessageuserselect/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/simpledropdownselect/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/simpleinput/types.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/textcontrol/types.d.ts","./oss/src/components/playground/assets/utilities/errors/types.d.ts","./oss/src/components/playground/hooks/useplayground/middlewares/hooks/useplaygroundutilities/types.d.ts","./oss/src/components/playground/hooks/usewebworker/types.d.ts","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/types.d.ts","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/assets/generationfocusdrawerbutton/types.d.ts","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/assets/generationfocusdrawerheader/types.d.ts","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/assets/generationoutputnavigator/types.d.ts","./oss/src/components/playground/v2/components/drawers/promptcomparisonfocusdrawer/types.d.ts","./oss/src/components/playground/v2/components/drawers/promptcomparisonfocusdrawer/assets/promptcomparisonfocusbutton/types.d.ts","./oss/src/components/playground/v2/components/drawers/promptfocusdrawer/types.d.ts","./oss/src/components/playground/v2/components/drawers/promptfocusdrawer/assets/promptfocusbutton/types.d.ts","./oss/src/components/playground/v2/components/drawers/promptfocusdrawer/assets/promptfocusdrawerheader/types.d.ts","./oss/src/components/playground/v2/components/menus/playgroundprompttoolmenu/types.d.ts","./oss/src/components/playground/v2/components/menus/playgroundvarianthistoryheadermenu/types.d.ts","./oss/src/components/playground/v2/components/modals/variantrenamemodal/types.d.ts","./oss/src/components/playground/v2/components/modals/variantresetchangesmodal/types.d.ts","./oss/src/components/playground/v2/components/playgroundprompttool/assets/types.d.ts","./oss/src/components/playground/v2/components/playgroundvarianthistory/types.d.ts","./oss/src/components/playground/v2/components/playgroundvarianthistory/assets/types.d.ts","./oss/src/components/resulttag/types.d.ts","./oss/src/components/selectllmprovider/types.d.ts","./oss/src/components/sidebar/types.d.ts","./oss/src/components/sidebar/hooks/usedropdownitems/types.d.ts","./oss/src/components/tooltipwithcopyaction/types.d.ts","./oss/src/components/variantscomponents/drawers/variantdrawer/assets/types.d.ts","./oss/src/components/variantscomponents/dropdown/types.d.ts","./oss/src/components/pages/app-management/drawers/customworkflowhistory/types.d.ts","./oss/src/components/pages/app-management/modals/addappfromtemplatemodal/types.d.ts","./oss/src/components/pages/app-management/modals/customworkflowmodal/types.d.ts","./oss/src/components/pages/app-management/modals/customworkflowmodal/hooks/types.d.ts","./oss/src/components/pages/auth/assets/types.d.ts","./oss/src/components/pages/observability/assets/types.d.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/enum.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/types.d.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/annotate/assets/types.d.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/createevaluator/assets/types.d.ts","./node_modules/.pnpm/tailwindcss@3.4.17_ts-node@10.9.2_@swc+core@1.11.8_@swc+helpers@0.5.15__@types+node@20.17.24_typescript@5.8.3_/node_modules/tailwindcss/types/generated/corepluginlist.d.ts","./node_modules/.pnpm/tailwindcss@3.4.17_ts-node@10.9.2_@swc+core@1.11.8_@swc+helpers@0.5.15__@types+node@20.17.24_typescript@5.8.3_/node_modules/tailwindcss/types/generated/colors.d.ts","./node_modules/.pnpm/tailwindcss@3.4.17_ts-node@10.9.2_@swc+core@1.11.8_@swc+helpers@0.5.15__@types+node@20.17.24_typescript@5.8.3_/node_modules/tailwindcss/types/config.d.ts","./oss/src/components/pages/observability/drawer/testsetdrawer/assets/types.d.ts","./oss/src/components/pages/observability/drawer/traceheader/assets/types.d.ts","./oss/src/components/pages/observability/drawer/tracetree/assets/types.d.ts","./oss/src/components/pages/observability/drawer/tracetreesettings/assets/types.d.ts","./oss/src/components/pages/overview/deployments/deploymentdrawer/types.d.ts","./oss/src/components/pages/settings/workspacemanage/modals/assets/types.d.ts","./node_modules/.pnpm/posthog-js@1.229.5/node_modules/posthog-js/dist/module.d.ts","./oss/src/lib/helpers/analytics/types.d.ts","./oss/src/lib/helpers/auth/types.d.ts","./oss/src/lib/hooks/useevaluatorconfigs/types.d.ts","./oss/src/lib/hooks/usestatelessvariants/state/types.d.ts","./tests/playwright/config/testtags.ts","./tests/playwright/config/types.d.ts","./tests/tests/fixtures/types.d.ts","./oss/src/lib/enums.ts","./oss/src/lib/types.ts","./tests/tests/fixtures/base.fixture/apihelpers/types.d.ts","./node_modules/.pnpm/playwright-core@1.53.1/node_modules/playwright-core/types/protocol.d.ts","./node_modules/.pnpm/playwright-core@1.53.1/node_modules/playwright-core/types/structs.d.ts","./node_modules/.pnpm/playwright-core@1.53.1/node_modules/playwright-core/types/types.d.ts","./node_modules/.pnpm/playwright-core@1.53.1/node_modules/playwright-core/index.d.ts","./node_modules/.pnpm/playwright@1.53.1/node_modules/playwright/types/test.d.ts","./node_modules/.pnpm/playwright@1.53.1/node_modules/playwright/test.d.ts","./node_modules/.pnpm/@playwright+test@1.53.1/node_modules/@playwright/test/index.d.ts","./tests/tests/fixtures/base.fixture/uihelpers/types.d.ts","./tests/tests/fixtures/base.fixture/types.ts","./tests/tests/fixtures/user.fixture/authhelpers/types.d.ts","./tests/utils/testmail/types.d.ts","./oss/next.config.ts","./ee/next.config.ts","./node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/previous-map.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/input.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/declaration.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/root.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/warning.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/lazy-result.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/no-work-result.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/processor.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/result.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/document.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/rule.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/node.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/comment.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/container.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/at-rule.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/list.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.ts","./node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.mts","./node_modules/.pnpm/tailwindcss@3.4.17_ts-node@10.9.2_@swc+core@1.11.8_@swc+helpers@0.5.15__@types+node@20.17.24_typescript@5.8.3_/node_modules/tailwindcss/types/index.d.ts","./node_modules/.pnpm/tailwindcss@3.4.17_ts-node@10.9.2_@swc+core@1.11.8_@swc+helpers@0.5.15__@types+node@20.17.24_typescript@5.8.3_/node_modules/tailwindcss/colors.d.ts","./oss/tailwind.config.ts","./ee/tailwind.config.ts","./ee/src/components/autoevalrundetails/assets/types.ts","./ee/src/components/autoevalrundetails/assets/utils.ts","./ee/src/components/autoevalrundetails/components/evalrunviewselector/assets/constants.ts","./ee/src/components/deleteevaluationmodal/types.ts","./node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.d.ts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/internals.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/store.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/atom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/typeutils.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/provider.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/useatomvalue.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/usesetatom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/useatom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/index.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/constants.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithreset.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithreducer.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomfamily.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/selectatom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/freezeatom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/splitatom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithdefault.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithstorage.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithobservable.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/loadable.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/unwrap.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithrefresh.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils/atomwithlazy.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/vanilla/utils.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/utils/useresetatom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/utils/usereduceratom.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/utils/useatomcallback.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/utils/usehydrateatoms.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/react/utils.d.mts","./node_modules/.pnpm/jotai@2.12.5_@types+react@19.0.10_react@19.0.0/node_modules/jotai/esm/utils.d.mts","./node_modules/.pnpm/immer@10.1.1/node_modules/immer/dist/immer.d.ts","./node_modules/.pnpm/jotai-immer@0.4.1_immer@10.1.1_jotai@2.12.5_@types+react@19.0.10_react@19.0.0_/node_modules/jotai-immer/dist/atomwithimmer.d.ts","./node_modules/.pnpm/jotai-immer@0.4.1_immer@10.1.1_jotai@2.12.5_@types+react@19.0.10_react@19.0.0_/node_modules/jotai-immer/dist/withimmer.d.ts","./node_modules/.pnpm/jotai-immer@0.4.1_immer@10.1.1_jotai@2.12.5_@types+react@19.0.10_react@19.0.0_/node_modules/jotai-immer/dist/useimmeratom.d.ts","./node_modules/.pnpm/jotai-immer@0.4.1_immer@10.1.1_jotai@2.12.5_@types+react@19.0.10_react@19.0.0_/node_modules/jotai-immer/dist/usesetimmeratom.d.ts","./node_modules/.pnpm/jotai-immer@0.4.1_immer@10.1.1_jotai@2.12.5_@types+react@19.0.10_react@19.0.0_/node_modules/jotai-immer/dist/index.d.ts","./ee/src/lib/hooks/useevaluationrundata/assets/helpers/buildrunindex.ts","./ee/src/lib/hooks/useevaluationrunscenariosteps/types.ts","./ee/src/lib/hooks/useevaluationrunmetrics/types.ts","./ee/src/lib/hooks/useevaluationrunscenarios/types.ts","./ee/src/lib/hooks/usepreviewevaluations/types.ts","./ee/src/lib/hooks/useevaluationrundata/types.ts","./ee/src/lib/hooks/useevaluationrundata/assets/constants.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/runscopedatoms.ts","./node_modules/.pnpm/jotai-eager@0.2.3_jotai@2.12.5_@types+react@19.0.10_react@19.0.0_/node_modules/jotai-eager/dist/index.d.mts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/evaluationrunstateatom.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/derived.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/runmetricscache.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/types.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/max.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/nil.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/parse.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v1.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v1tov6.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v35.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v3.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v5.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v6.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v6tov1.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v7.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/validate.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/version.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/index.d.ts","./ee/src/lib/hooks/useevaluationrundata/assets/helpers/fetchscenariolistviaworker.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/scenariolist.ts","./ee/src/lib/hooks/useevaluationrundata/assets/helpers/scenariofilters.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/bulkfetch.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/utils.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/scenarios.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/store.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/useevaluationrunstore.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/migrationhelper.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/types.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/progress.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/cache.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/index.ts","./ee/src/lib/hooks/useevaluationrundata/assets/helpers/workercontext/types.ts","./ee/src/lib/hooks/useevaluationrundata/assets/helpers/workercontext/index.ts","./ee/src/lib/hooks/useevaluationrundata/assets/helpers/fetchscenarioviaworker.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/runscopedscenarios.ts","./ee/src/components/evalrundetails/assets/optimisticutils.ts","./ee/src/components/evalrundetails/assets/stepsmetricsutils.ts","./ee/src/components/evalrundetails/assets/annotationutils.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/constants.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/transforms.ts","./ee/src/components/evalrundetails/assets/helpers.ts","./ee/src/components/evalrundetails/assets/runnableselectors.ts","./ee/src/components/evalrundetails/assets/types.ts","./ee/src/components/evalrundetails/components/annotatescenariobutton/types.ts","./ee/src/components/evalrundetails/components/evalrunscenariocard/types.ts","./ee/src/components/evalrundetails/components/evalrunscenario/types.ts","./ee/src/components/evalrundetails/components/evalrunscenariocardtitle/types.ts","./ee/src/components/evalrundetails/components/evalrunscenariocards/assets/constants.ts","./ee/src/components/evalrundetails/components/evalrunscenariosviewselector/assets/constants.ts","./ee/src/components/evalrundetails/components/runevalscenariobutton/types.ts","./ee/src/components/evalrundetails/components/scenarioannotationpanel/types.ts","./ee/src/components/evalrundetails/components/scenarioloadingindicator/assets/constants.ts","./ee/src/components/evalrundetails/components/singlescenarioviewer/types.ts","./ee/src/components/evalrundetails/components/virtualizedscenariotable/types.ts","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/constants.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/common.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/array.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/collection.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/date.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/function.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/lang.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/math.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/number.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/object.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/seq.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/string.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/common/util.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/index.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/groupby.d.ts","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/datasourcebuilder.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/lib/types.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/lib/context.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/lib/iconbase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/lib/ssrbase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/lib/index.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/acorn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/addressbook.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/addressbooktabs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airtrafficcontrol.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplaneinflight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplanelanding.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplanetakeoff.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplanetaxiing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplanetilt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/airplay.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alarm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alien.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alignbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alignbottomsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aligncenterhorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aligncenterhorizontalsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aligncentervertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aligncenterverticalsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alignleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alignleftsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alignright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/alignrightsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aligntop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aligntopsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/amazonlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ambulance.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/anchor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/anchorsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/androidlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/angle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/angularlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/aperture.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/appstorelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/appwindow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/applelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/applepodcastslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/approximateequals.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/archive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/armchair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowarcleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowarcright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbenddoubleupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbenddoubleupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbenddownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbenddownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbendleftdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbendleftup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbendrightdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbendrightup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbendupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowbendupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircledownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircledownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircleupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcircleupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowcounterclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowdownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowdownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowdownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowdownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowleftdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowleftup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowrightdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowrightup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowelbowupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlineleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlineright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlinesdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlinesleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlinesright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatlinesup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowfatup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlinedownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlinedownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlineleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlineright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlineupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowlineupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquaredown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquaredownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquaredownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquarein.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquareleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquareout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquareright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquareup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquareupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsquareupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowudownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowudownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowuleftdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowuleftup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowurightdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowurightup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowuupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowuupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowscounterclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsdownup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowshorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsincardinal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsinlinehorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsinlinevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsinsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsleftright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsmerge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsoutcardinal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsoutlinehorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsoutlinevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsoutsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowssplit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/arrowsvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/article.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/articlemedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/articlenytimes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/asclepius.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/asterisk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/asterisksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/at.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/atom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/avocado.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/axe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/baby.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/babycarriage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/backpack.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/backspace.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bagsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/balloon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bandaids.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/barbell.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/barcode.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/barn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/barricade.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/baseball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/baseballcap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/baseballhelmet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/basket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/basketball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bathtub.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batterycharging.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batterychargingvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryempty.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryfull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batterylow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batterymedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryplusvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryverticalempty.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryverticalfull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryverticalhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryverticallow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batteryverticalmedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batterywarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/batterywarningvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/beachball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/beanie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/beerbottle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/beerstein.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/behancelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bell.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellringing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellsimpleringing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellsimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellsimplez.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bellz.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/belt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/beziercurve.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bicycle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/binary.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/binoculars.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/biohazard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bird.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/blueprint.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bluetooth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bluetoothconnected.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bluetoothslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bluetoothx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bomb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/book.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookbookmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookopentext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookopenuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookmarksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookmarks.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bookmarkssimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/books.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boules.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boundingbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bowlfood.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bowlsteam.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bowlingball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boxarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boxarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/boxingglove.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bracketsangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bracketscurly.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bracketsround.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bracketssquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/brain.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/brandy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bread.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bridge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/briefcase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/briefcasemetal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/broadcast.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/broom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/browser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/browsers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bugbeetle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bug.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bugdroid.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/buildingapartment.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/building.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/buildingoffice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/buildings.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bulldozer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/bus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/butterfly.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cablecar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cactus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cake.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calculator.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarblank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendardot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendardots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarheart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/calendarx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/callbell.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/camera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cameraplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/camerarotate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cameraslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/campfire.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/carbattery.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/car.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/carprofile.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/carsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cardholder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cards.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cardsthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircledoubledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircledoubleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircledoubleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircledoubleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretcircleupdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretdoubledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretdoubleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretdoubleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretdoubleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretlineleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretlineright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/caretupdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/carrot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cashregister.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cassettetape.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/castleturret.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignalfull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignalhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignallow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignalmedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignalnone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignalslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cellsignalx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/celltower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/certificate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chalkboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chalkboardsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chalkboardteacher.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/champagne.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chargingstation.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartbar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartbarhorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartdonut.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartpie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartpieslice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartpolar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chartscatter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcentered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcentereddots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcenteredslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcenteredtext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcircledots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcircleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatcircletext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatdots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatteardrop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatteardropdots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatteardropslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatteardroptext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chattext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chats.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatscircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chatsteardrop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/check.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/checkcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/checkfat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/checksquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/checksquareoffset.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/checkerboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/checks.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cheers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cheese.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/chefhat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cherries.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/church.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cigarette.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cigaretteslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circlehalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circlehalftilt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circlenotch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circlesfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circlesthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circlesthreeplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/circuitry.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/city.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clipboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clipboardtext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clockafternoon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clockclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clockcountdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clockcounterclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clockuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/closedcaptioning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloud.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudfog.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudlightning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudmoon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudrain.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudsnow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudsun.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudwarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cloudx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/clover.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/club.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/coathanger.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/codalogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/codeblock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/code.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/codesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/codepenlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/codesandboxlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/coffeebean.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/coffee.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/coin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/coinvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/coins.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/columns.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/columnsplusleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/columnsplusright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/command.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/compass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/compassrose.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/compasstool.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/computertower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/confetti.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/contactlesspayment.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/control.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cookie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cookingpot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/copy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/copysimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/copyleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/copyright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cornersin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cornersout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/couch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/courtbasketball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cowboyhat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cpu.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cranetower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/creditcard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cricket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cross.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crosshair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crosshairsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crowncross.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/crownsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cube.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cubefocus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cubetransparent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencybtc.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencycircledollar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencycny.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencydollar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencydollarsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencyeth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencyeur.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencygbp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencyinr.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencyjpy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencykrw.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencykzt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencyngn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/currencyrub.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cursor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cursorclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cursortext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/cylinder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/database.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/desk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/desktop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/desktoptower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/detective.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devtologo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicemobile.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicemobilecamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicemobileslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicemobilespeaker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicerotate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicetablet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicetabletcamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devicetabletspeaker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/devices.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/diamond.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/diamondsfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dicefive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dicefour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/diceone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dicesix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dicethree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dicetwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/disc.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/discoball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/discordlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/divide.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dna.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dog.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/door.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dooropen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotoutline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsnine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotssix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotssixvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsthreecircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsthreecirclevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsthreeoutline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsthreeoutlinevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dotsthreevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/download.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/downloadsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dress.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dresser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dribbblelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/drone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/drop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/drophalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/drophalfbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dropsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dropslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/dropboxlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/earslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/egg.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eggcrack.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eject.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ejectsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/elevator.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/empty.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/engine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/envelope.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/envelopeopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/envelopesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/envelopesimpleopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/equalizer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/equals.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eraser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/escalatordown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/escalatorup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/exam.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/exclamationmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/exclude.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/excludesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/export.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eye.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eyeclosed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eyeslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eyedropper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eyedroppersample.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eyeglasses.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/eyes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/facemask.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/facebooklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/factory.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/faders.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fadershorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/falloutshelter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/farm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fastforward.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fastforwardcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/feather.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fediverselogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/figmalogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filearchive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filearrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filearrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fileaudio.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/file.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filec.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filecsharp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filecloud.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filecode.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filecpp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filecss.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filecsv.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filedashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filedoc.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filehtml.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fileimage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fileini.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filejpg.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filejs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filejsx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filelock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filemagnifyingglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filemd.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fileminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filepdf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fileplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filepng.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fileppt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filepy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filesql.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filesvg.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filetext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filets.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filetsx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filetxt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filevideo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filevue.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filexls.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filezip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/files.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filmreel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filmscript.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filmslate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/filmstrip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fingerprint.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fingerprintsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/finnthehuman.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fire.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fireextinguisher.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/firesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/firetruck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/firstaid.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/firstaidkit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fish.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fishsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flagbanner.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flagbannerfold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flagcheckered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flagpennant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flame.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flashlight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flask.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fliphorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flipvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/floppydiskback.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/floppydisk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flowarrow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flowerlotus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flowertulip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/flyingsaucer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderdashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderlock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimpledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimplelock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimpleminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimpleplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimplestar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/foldersimpleuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folderuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/folders.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/football.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/footballhelmet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/footprints.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/forkknife.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/fourk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/framecorners.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/framerlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/function.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/funnel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/funnelsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/funnelsimplex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/funnelx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gamecontroller.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/garage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gascan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gaspump.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gauge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gavel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gearfine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gearsix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/genderfemale.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/genderintersex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gendermale.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/genderneuter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gendernonbinary.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gendertransgender.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ghost.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gif.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gift.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitbranch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitcommit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitdiff.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitfork.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitmerge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitpullrequest.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/githublogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitlablogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gitlablogosimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globehemisphereeast.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globehemispherewest.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globesimplex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globestand.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/globex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/goggles.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/golf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/goodreadslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googlecardboardlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googlechromelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googledrivelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googlelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googlephotoslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googleplaylogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/googlepodcastslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gps.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gpsfix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gpsslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gradient.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/graduationcap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/grains.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/grainsslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/graph.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/graphicscard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/greaterthan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/greaterthanorequal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gridfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/gridnine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/guitar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hairdryer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hamburger.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hammer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hand.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handcoins.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handdeposit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handeye.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handfist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handgrabbing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handheart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handpalm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handpeace.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handpointing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handsoap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handswipeleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handswiperight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handtap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handwaving.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handwithdraw.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handbag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handbagsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handsclapping.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handspraying.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/handshake.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/harddrive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/harddrives.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hardhat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hashstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/headcircuit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/headlights.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/headphones.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/headset.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/heart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/heartbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hearthalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/heartstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/heartstraightbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/heartbeat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hexagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/highdefinition.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/highheel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/highlighter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/highlightercircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hockey.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hoodie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/horse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hospital.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglasshigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglasslow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglassmedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglasssimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglasssimplehigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglasssimplelow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hourglasssimplemedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/house.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/houseline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/housesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/hurricane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/icecream.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/identificationbadge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/identificationcard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/image.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/imagebroken.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/imagesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/images.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/imagessquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/infinity.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/info.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/instagramlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/intersect.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/intersectsquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/intersectthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/intersection.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/invoice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/island.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/jar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/jarlabel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/jeep.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/joystick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/kanban.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/key.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/keyreturn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/keyboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/keyhole.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/knife.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ladder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/laddersimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lamp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lamppendant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/laptop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lasso.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lastfmlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/layout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/leaf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lectern.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lego.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/legosmiley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lessthan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lessthanorequal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lettercircleh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lettercirclep.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lettercirclev.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lifebuoy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lightbulb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lightbulbfilament.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lighthouse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lightninga.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lightning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lightningslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linesegment.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linesegments.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/link.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linkbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linksimplebreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linksimplehorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linksimplehorizontalbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linkedinlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linktreelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/linuxlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/list.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listbullets.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listchecks.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listdashes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listheart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listmagnifyingglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listnumbers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/listplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/liststar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lockkey.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lockkeyopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/locklaminated.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/locklaminatedopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lockopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/locksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/locksimpleopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/lockers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/log.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/magicwand.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/magnet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/magnetstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/magnifyingglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/magnifyingglassminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/magnifyingglassplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mailbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappinarea.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappinline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappinplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappinsimplearea.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappinsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mappinsimpleline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/maptrifold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/markdownlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/markercircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/martini.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/maskhappy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/masksad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mastodonlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mathoperations.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/matrixlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/medal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/medalmilitary.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mediumlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/megaphone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/megaphonesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/memberof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/memory.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/messengerlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/metalogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/meteor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/metronome.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microphone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microphoneslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microphonestage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microscope.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microsoftexcellogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microsoftoutlooklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microsoftpowerpointlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microsoftteamslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/microsoftwordlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/minus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/minuscircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/minussquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/money.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/moneywavy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/monitorarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/monitor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/monitorplay.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/moon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/moonstars.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/moped.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mopedfront.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mosque.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/motorcycle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mountains.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mouse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mouseleftclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mousemiddleclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mouserightclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mousescroll.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/mousesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/musicnote.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/musicnotesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/musicnotes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/musicnotesminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/musicnotesplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/musicnotessimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/navigationarrow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/needle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/network.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/networkslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/networkx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/newspaper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/newspaperclipping.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notequals.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notmemberof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notsubsetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notsupersetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notches.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/noteblank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/note.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notepencil.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notebook.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notepad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notification.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/notionlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/nuclearplant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercircleeight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercirclefive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercirclefour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercirclenine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercircleone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercircleseven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercirclesix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercirclethree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercircletwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbercirclezero.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbereight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numberfive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numberfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbernine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numberone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numberseven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquareeight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquarefive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquarefour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquarenine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquareone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquareseven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquaresix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquarethree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquaretwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbersquarezero.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numberthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numbertwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numberzero.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/numpad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/nut.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/nytimeslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/octagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/officechair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/onigiri.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/openailogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/option.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/orange.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/orangeslice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/oven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/package.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paintbrush.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paintbrushbroad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paintbrushhousehold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paintbucket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paintroller.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/palette.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/panorama.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pants.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paperplane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paperplaneright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paperplanetilt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paperclip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/papercliphorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/parachute.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paragraph.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/parallelogram.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/park.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/password.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/path.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/patreonlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pause.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pausecircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pawprint.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/paypallogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/peace.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pennib.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pennibstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencil.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilruler.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilsimpleline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilsimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pencilslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pentagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pentagram.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pepper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/percent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personarmsspread.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/person.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplebike.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplecircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplehike.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplerun.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimpleski.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplesnowboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimpleswim.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimpletaichi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplethrow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/personsimplewalk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/perspective.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phonecall.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phonedisconnect.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phoneincoming.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phonelist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phoneoutgoing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phonepause.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phoneplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phoneslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phonetransfer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phonex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/phosphorlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pianokeys.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/picnictable.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pictureinpicture.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/piggybank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pill.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pingpong.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pintglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pinterestlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pinwheel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pipe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pipewrench.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pixlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pizza.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/placeholder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/planet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/play.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/playcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/playpause.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/playlist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plug.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plugcharging.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plugs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plugsconnected.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pluscircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plusminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/plussquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pokerchip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/policecar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/polygon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/popcorn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/popsicle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pottedplant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/power.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/prescription.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/presentation.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/presentationchart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/printer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/prohibit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/prohibitinset.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/projectorscreen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/projectorscreenchart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pulse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pushpin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pushpinsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pushpinsimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/pushpinslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/puzzlepiece.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/qrcode.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/question.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/questionmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/queue.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/quotes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rabbit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/racquet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/radical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/radio.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/radiobutton.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/radioactive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rainbow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rainbowcloud.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ranking.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/readcvlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/receipt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/receiptx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/record.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rectangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rectangledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/recycle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/redditlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/repeat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/repeatonce.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/replitlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/resize.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rewind.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rewindcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/roadhorizon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/robot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rocket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rocketlaunch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rows.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rowsplusbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rowsplustop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rss.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rsssimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/rug.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ruler.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sailboat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scales.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scansmiley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scissors.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scooter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/screencast.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/screwdriver.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scribble.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scribbleloop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/scroll.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/seal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sealcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sealpercent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sealquestion.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sealwarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/seat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/seatbelt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/securitycamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selectionall.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selectionbackground.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selection.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selectionforeground.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selectioninverse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selectionplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/selectionslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shapes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/share.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sharefat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sharenetwork.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shield.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldcheckered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldchevron.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shieldwarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shippingcontainer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shirtfolded.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shootingstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shoppingbag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shoppingbagopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shoppingcart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shoppingcartsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shovel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shrimp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shuffleangular.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shuffle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/shufflesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sidebar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sidebarsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sigma.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/signin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/signout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/signature.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/signpost.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/simcard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/siren.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sketchlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/skipback.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/skipbackcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/skipforward.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/skipforwardcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/skull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/skypelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/slacklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sliders.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/slidershorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/slideshow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileyangry.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileyblank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smiley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileymeh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileymelting.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileynervous.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileysad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileysticker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileywink.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/smileyxeyes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/snapchatlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sneaker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sneakermove.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/snowflake.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/soccerball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/solarpanel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/solarroof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sortascending.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sortdescending.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/soundcloudlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spade.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sparkle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakerhifi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakerhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakerlow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakernone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakersimplehigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakersimplelow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakersimplenone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakersimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakersimplex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakerslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speakerx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/speedometer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sphere.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spinnerball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spinner.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spinnergap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spiral.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/splithorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/splitvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spotifylogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/spraybottle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/square.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/squarehalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/squarehalfbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/squarelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/squaresplithorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/squaresplitvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/squaresfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stack.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stackminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stackoverflowlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stackplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stacksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stairs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stamp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/standarddefinition.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/starandcrescent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/star.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/starfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/starhalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/starofdavid.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/steamlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/steeringwheel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/steps.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stethoscope.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sticker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stool.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stopcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/storefront.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/strategy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/stripelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/student.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subsetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subsetproperof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subtitles.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subtitlesslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subtract.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subtractsquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/subway.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/suitcase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/suitcaserolling.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/suitcasesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sun.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sundim.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sunhorizon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sunglasses.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/supersetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/supersetproperof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/swap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/swatches.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/swimmingpool.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/sword.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/synagogue.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/syringe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tshirt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/table.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tabs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tagchevron.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tagsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/target.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/taxi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/teabag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/telegramlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/television.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/televisionsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tennisball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/terminal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/terminalwindow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/testtube.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textaunderline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textaa.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textaligncenter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textalignjustify.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textalignleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textalignright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textcolumns.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texthfive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texthfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texthone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texthsix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texththree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texthtwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textindent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textitalic.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textoutdent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textstrikethrough.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textsubscript.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textsuperscript.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/texttslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textunderline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/textbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/thermometer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/thermometercold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/thermometerhot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/thermometersimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/threadslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/threed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/thumbsdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/thumbsup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/ticket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tidallogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tiktoklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tilde.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/timer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tipjar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tipi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tire.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/toggleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/toggleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/toilet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/toiletpaper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/toolbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tooth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tornado.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tote.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/totesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/towel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tractor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trademark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trademarkregistered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trafficcone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trafficsign.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trafficsignal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/train.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trainregional.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trainsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tram.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/translate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trashsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trayarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trayarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tray.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/treasurechest.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/treeevergreen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/treepalm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/treestructure.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/treeview.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trenddown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trendup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/triangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/triangledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trolley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trolleysuitcase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trophy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/truck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/trucktrailer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/tumblrlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/twitchlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/twitterlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/umbrella.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/umbrellasimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/union.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/unite.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/unitesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/upload.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/uploadsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/user.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercirclecheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercircledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercirclegear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercircleminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usercircleplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/userfocus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usergear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/userlist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/userminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/userplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/userrectangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usersound.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usersquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/userswitch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/users.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usersfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/usersthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/van.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/vault.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/vectorthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/vectortwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/vibrate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/video.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/videocamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/videocameraslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/videoconference.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/vignette.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/vinylrecord.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/virtualreality.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/virus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/visor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/voicemail.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/volleyball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wall.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wallet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/warehouse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/warning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/warningcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/warningdiamond.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/warningoctagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/washingmachine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/watch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wavesawtooth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wavesine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wavesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wavetriangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/waveform.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/waveformslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/waves.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/webcam.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/webcamslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/webhookslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wechatlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/whatsapplogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wheelchair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wheelchairmotion.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wifihigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wifilow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wifimedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wifinone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wifislash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wifix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wind.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/windmill.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/windowslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/wrench.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/x.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/xcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/xlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/xsquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/yarn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/yinyang.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/youtubelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/ssr/index.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/acorn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/addressbook.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/addressbooktabs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airtrafficcontrol.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplaneinflight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplanelanding.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplanetakeoff.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplanetaxiing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplanetilt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/airplay.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alarm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alien.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alignbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alignbottomsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aligncenterhorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aligncenterhorizontalsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aligncentervertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aligncenterverticalsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alignleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alignleftsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alignright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/alignrightsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aligntop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aligntopsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/amazonlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ambulance.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/anchor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/anchorsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/androidlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/angle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/angularlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/aperture.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/appstorelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/appwindow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/applelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/applepodcastslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/approximateequals.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/archive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/armchair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowarcleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowarcright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbenddoubleupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbenddoubleupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbenddownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbenddownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbendleftdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbendleftup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbendrightdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbendrightup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbendupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowbendupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircledownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircledownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircleupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcircleupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowcounterclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowdownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowdownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowdownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowdownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowleftdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowleftup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowrightdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowrightup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowelbowupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlineleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlineright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlinesdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlinesleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlinesright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatlinesup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowfatup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlinedownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlinedownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlineleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlineright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlineupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowlineupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquaredown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquaredownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquaredownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquarein.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquareleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquareout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquareright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquareup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquareupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsquareupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowudownleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowudownright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowuleftdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowuleftup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowurightdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowurightup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowuupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowuupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowupleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowupright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowscounterclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsdownup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowshorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsincardinal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsinlinehorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsinlinevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsinsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsleftright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsmerge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsoutcardinal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsoutlinehorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsoutlinevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsoutsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowssplit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/arrowsvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/article.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/articlemedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/articlenytimes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/asclepius.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/asterisk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/asterisksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/at.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/atom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/avocado.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/axe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/baby.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/babycarriage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/backpack.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/backspace.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bagsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/balloon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bandaids.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/barbell.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/barcode.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/barn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/barricade.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/baseball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/baseballcap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/baseballhelmet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/basket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/basketball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bathtub.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batterycharging.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batterychargingvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryempty.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryfull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batterylow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batterymedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryplusvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryverticalempty.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryverticalfull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryverticalhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryverticallow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batteryverticalmedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batterywarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/batterywarningvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/beachball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/beanie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/beerbottle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/beerstein.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/behancelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bell.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellringing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellsimpleringing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellsimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellsimplez.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bellz.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/belt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/beziercurve.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bicycle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/binary.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/binoculars.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/biohazard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bird.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/blueprint.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bluetooth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bluetoothconnected.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bluetoothslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bluetoothx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bomb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/book.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookbookmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookopentext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookopenuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookmarksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookmarks.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bookmarkssimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/books.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boules.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boundingbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bowlfood.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bowlsteam.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bowlingball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boxarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boxarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/boxingglove.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bracketsangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bracketscurly.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bracketsround.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bracketssquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/brain.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/brandy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bread.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bridge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/briefcase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/briefcasemetal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/broadcast.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/broom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/browser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/browsers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bugbeetle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bug.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bugdroid.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/buildingapartment.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/building.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/buildingoffice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/buildings.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bulldozer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/bus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/butterfly.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cablecar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cactus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cake.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calculator.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarblank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendardot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendardots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarheart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/calendarx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/callbell.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/camera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cameraplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/camerarotate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cameraslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/campfire.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/carbattery.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/car.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/carprofile.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/carsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cardholder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cards.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cardsthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircledoubledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircledoubleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircledoubleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircledoubleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretcircleupdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretdoubledown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretdoubleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretdoubleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretdoubleup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretlineleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretlineright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/caretupdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/carrot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cashregister.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cassettetape.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/castleturret.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignalfull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignalhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignallow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignalmedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignalnone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignalslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cellsignalx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/celltower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/certificate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chalkboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chalkboardsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chalkboardteacher.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/champagne.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chargingstation.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartbar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartbarhorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartdonut.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartlinedown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartlineup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartpie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartpieslice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartpolar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chartscatter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcentered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcentereddots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcenteredslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcenteredtext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcircledots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcircleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatcircletext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatdots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatteardrop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatteardropdots.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatteardropslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatteardroptext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chattext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chats.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatscircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chatsteardrop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/check.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/checkcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/checkfat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/checksquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/checksquareoffset.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/checkerboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/checks.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cheers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cheese.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/chefhat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cherries.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/church.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cigarette.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cigaretteslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circlehalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circlehalftilt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circlenotch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circlesfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circlesthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circlesthreeplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/circuitry.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/city.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clipboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clipboardtext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clockafternoon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clockclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clockcountdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clockcounterclockwise.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clockuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/closedcaptioning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloud.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudfog.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudlightning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudmoon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudrain.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudsnow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudsun.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudwarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cloudx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/clover.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/club.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/coathanger.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/codalogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/codeblock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/code.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/codesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/codepenlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/codesandboxlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/coffeebean.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/coffee.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/coin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/coinvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/coins.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/columns.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/columnsplusleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/columnsplusright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/command.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/compass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/compassrose.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/compasstool.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/computertower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/confetti.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/contactlesspayment.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/control.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cookie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cookingpot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/copy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/copysimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/copyleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/copyright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cornersin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cornersout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/couch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/courtbasketball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cowboyhat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cpu.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cranetower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/creditcard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cricket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cross.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crosshair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crosshairsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crowncross.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/crownsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cube.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cubefocus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cubetransparent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencybtc.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencycircledollar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencycny.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencydollar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencydollarsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencyeth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencyeur.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencygbp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencyinr.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencyjpy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencykrw.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencykzt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencyngn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/currencyrub.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cursor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cursorclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cursortext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/cylinder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/database.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/desk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/desktop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/desktoptower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/detective.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devtologo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicemobile.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicemobilecamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicemobileslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicemobilespeaker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicerotate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicetablet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicetabletcamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devicetabletspeaker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/devices.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/diamond.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/diamondsfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dicefive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dicefour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/diceone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dicesix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dicethree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dicetwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/disc.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/discoball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/discordlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/divide.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dna.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dog.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/door.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dooropen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotoutline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsnine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotssix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotssixvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsthreecircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsthreecirclevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsthreeoutline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsthreeoutlinevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dotsthreevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/download.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/downloadsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dress.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dresser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dribbblelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/drone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/drop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/drophalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/drophalfbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dropsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dropslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/dropboxlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/earslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/egg.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eggcrack.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eject.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ejectsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/elevator.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/empty.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/engine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/envelope.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/envelopeopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/envelopesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/envelopesimpleopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/equalizer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/equals.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eraser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/escalatordown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/escalatorup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/exam.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/exclamationmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/exclude.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/excludesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/export.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eye.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eyeclosed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eyeslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eyedropper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eyedroppersample.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eyeglasses.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/eyes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/facemask.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/facebooklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/factory.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/faders.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fadershorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/falloutshelter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/farm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fastforward.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fastforwardcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/feather.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fediverselogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/figmalogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filearchive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filearrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filearrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fileaudio.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/file.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filec.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filecsharp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filecloud.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filecode.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filecpp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filecss.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filecsv.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filedashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filedoc.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filehtml.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fileimage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fileini.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filejpg.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filejs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filejsx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filelock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filemagnifyingglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filemd.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fileminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filepdf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fileplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filepng.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fileppt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filepy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filesql.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filesvg.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filetext.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filets.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filetsx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filetxt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filevideo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filevue.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filexls.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filezip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/files.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filmreel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filmscript.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filmslate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/filmstrip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fingerprint.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fingerprintsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/finnthehuman.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fire.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fireextinguisher.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/firesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/firetruck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/firstaid.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/firstaidkit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fish.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fishsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flagbanner.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flagbannerfold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flagcheckered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flagpennant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flame.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flashlight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flask.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fliphorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flipvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/floppydiskback.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/floppydisk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flowarrow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flowerlotus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flowertulip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/flyingsaucer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderdashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderlock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimpledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimplelock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimpleminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimpleplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimplestar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/foldersimpleuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folderuser.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/folders.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/football.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/footballhelmet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/footprints.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/forkknife.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/fourk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/framecorners.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/framerlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/function.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/funnel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/funnelsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/funnelsimplex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/funnelx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gamecontroller.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/garage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gascan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gaspump.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gauge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gavel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gearfine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gearsix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/genderfemale.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/genderintersex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gendermale.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/genderneuter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gendernonbinary.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gendertransgender.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ghost.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gif.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gift.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitbranch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitcommit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitdiff.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitfork.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitmerge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitpullrequest.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/githublogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitlablogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gitlablogosimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globehemisphereeast.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globehemispherewest.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globesimplex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globestand.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/globex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/goggles.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/golf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/goodreadslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googlecardboardlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googlechromelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googledrivelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googlelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googlephotoslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googleplaylogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/googlepodcastslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gps.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gpsfix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gpsslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gradient.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/graduationcap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/grains.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/grainsslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/graph.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/graphicscard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/greaterthan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/greaterthanorequal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gridfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/gridnine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/guitar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hairdryer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hamburger.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hammer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hand.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handcoins.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handdeposit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handeye.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handfist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handgrabbing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handheart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handpalm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handpeace.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handpointing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handsoap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handswipeleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handswiperight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handtap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handwaving.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handwithdraw.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handbag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handbagsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handsclapping.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handspraying.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/handshake.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/harddrive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/harddrives.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hardhat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hashstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/headcircuit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/headlights.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/headphones.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/headset.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/heart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/heartbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hearthalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/heartstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/heartstraightbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/heartbeat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hexagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/highdefinition.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/highheel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/highlighter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/highlightercircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hockey.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hoodie.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/horse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hospital.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglasshigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglasslow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglassmedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglasssimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglasssimplehigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglasssimplelow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hourglasssimplemedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/house.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/houseline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/housesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/hurricane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/icecream.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/identificationbadge.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/identificationcard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/image.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/imagebroken.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/imagesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/images.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/imagessquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/infinity.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/info.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/instagramlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/intersect.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/intersectsquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/intersectthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/intersection.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/invoice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/island.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/jar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/jarlabel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/jeep.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/joystick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/kanban.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/key.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/keyreturn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/keyboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/keyhole.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/knife.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ladder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/laddersimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lamp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lamppendant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/laptop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lasso.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lastfmlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/layout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/leaf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lectern.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lego.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/legosmiley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lessthan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lessthanorequal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lettercircleh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lettercirclep.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lettercirclev.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lifebuoy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lightbulb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lightbulbfilament.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lighthouse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lightninga.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lightning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lightningslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linesegment.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linesegments.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linevertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/link.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linkbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linksimplebreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linksimplehorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linksimplehorizontalbreak.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linkedinlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linktreelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/linuxlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/list.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listbullets.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listchecks.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listdashes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listheart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listmagnifyingglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listnumbers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/listplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/liststar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lockkey.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lockkeyopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/locklaminated.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/locklaminatedopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lockopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/locksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/locksimpleopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/lockers.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/log.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/magicwand.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/magnet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/magnetstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/magnifyingglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/magnifyingglassminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/magnifyingglassplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mailbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappinarea.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappinline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappinplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappinsimplearea.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappinsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mappinsimpleline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/maptrifold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/markdownlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/markercircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/martini.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/maskhappy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/masksad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mastodonlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mathoperations.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/matrixlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/medal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/medalmilitary.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mediumlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/megaphone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/megaphonesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/memberof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/memory.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/messengerlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/metalogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/meteor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/metronome.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microphone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microphoneslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microphonestage.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microscope.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microsoftexcellogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microsoftoutlooklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microsoftpowerpointlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microsoftteamslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/microsoftwordlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/minus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/minuscircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/minussquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/money.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/moneywavy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/monitorarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/monitor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/monitorplay.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/moon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/moonstars.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/moped.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mopedfront.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mosque.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/motorcycle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mountains.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mouse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mouseleftclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mousemiddleclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mouserightclick.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mousescroll.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/mousesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/musicnote.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/musicnotesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/musicnotes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/musicnotesminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/musicnotesplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/musicnotessimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/navigationarrow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/needle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/network.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/networkslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/networkx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/newspaper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/newspaperclipping.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notequals.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notmemberof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notsubsetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notsupersetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notches.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/noteblank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/note.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notepencil.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notebook.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notepad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notification.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/notionlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/nuclearplant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercircleeight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercirclefive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercirclefour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercirclenine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercircleone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercircleseven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercirclesix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercirclethree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercircletwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbercirclezero.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbereight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numberfive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numberfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbernine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numberone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numberseven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquareeight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquarefive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquarefour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquarenine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquareone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquareseven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquaresix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquarethree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquaretwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbersquarezero.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numberthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numbertwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numberzero.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/numpad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/nut.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/nytimeslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/octagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/officechair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/onigiri.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/openailogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/option.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/orange.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/orangeslice.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/oven.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/package.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paintbrush.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paintbrushbroad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paintbrushhousehold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paintbucket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paintroller.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/palette.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/panorama.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pants.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paperplane.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paperplaneright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paperplanetilt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paperclip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/papercliphorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/parachute.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paragraph.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/parallelogram.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/park.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/password.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/path.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/patreonlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pause.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pausecircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pawprint.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/paypallogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/peace.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pennib.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pennibstraight.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencil.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilruler.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilsimpleline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilsimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pencilslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pentagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pentagram.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pepper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/percent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personarmsspread.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/person.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplebike.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplecircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplehike.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplerun.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimpleski.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplesnowboard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimpleswim.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimpletaichi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplethrow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/personsimplewalk.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/perspective.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phonecall.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phonedisconnect.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phoneincoming.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phonelist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phoneoutgoing.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phonepause.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phoneplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phoneslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phonetransfer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phonex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/phosphorlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pianokeys.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/picnictable.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pictureinpicture.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/piggybank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pill.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pingpong.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pintglass.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pinterestlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pinwheel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pipe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pipewrench.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pixlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pizza.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/placeholder.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/planet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/play.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/playcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/playpause.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/playlist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plug.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plugcharging.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plugs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plugsconnected.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pluscircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plusminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/plussquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pokerchip.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/policecar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/polygon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/popcorn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/popsicle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pottedplant.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/power.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/prescription.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/presentation.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/presentationchart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/printer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/prohibit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/prohibitinset.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/projectorscreen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/projectorscreenchart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pulse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pushpin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pushpinsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pushpinsimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/pushpinslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/puzzlepiece.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/qrcode.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/question.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/questionmark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/queue.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/quotes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rabbit.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/racquet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/radical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/radio.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/radiobutton.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/radioactive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rainbow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rainbowcloud.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ranking.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/readcvlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/receipt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/receiptx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/record.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rectangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rectangledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/recycle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/redditlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/repeat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/repeatonce.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/replitlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/resize.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rewind.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rewindcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/roadhorizon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/robot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rocket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rocketlaunch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rows.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rowsplusbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rowsplustop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rss.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rsssimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/rug.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ruler.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sailboat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scales.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scan.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scansmiley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scissors.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scooter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/screencast.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/screwdriver.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scribble.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scribbleloop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/scroll.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/seal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sealcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sealpercent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sealquestion.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sealwarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/seat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/seatbelt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/securitycamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selectionall.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selectionbackground.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selection.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selectionforeground.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selectioninverse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selectionplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/selectionslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shapes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/share.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sharefat.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sharenetwork.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shield.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldcheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldcheckered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldchevron.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shieldwarning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shippingcontainer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shirtfolded.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shootingstar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shoppingbag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shoppingbagopen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shoppingcart.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shoppingcartsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shovel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shower.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shrimp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shuffleangular.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shuffle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/shufflesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sidebar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sidebarsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sigma.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/signin.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/signout.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/signature.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/signpost.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/simcard.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/siren.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sketchlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/skipback.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/skipbackcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/skipforward.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/skipforwardcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/skull.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/skypelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/slacklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sliders.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/slidershorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/slideshow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileyangry.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileyblank.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smiley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileymeh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileymelting.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileynervous.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileysad.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileysticker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileywink.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/smileyxeyes.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/snapchatlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sneaker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sneakermove.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/snowflake.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/soccerball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sock.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/solarpanel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/solarroof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sortascending.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sortdescending.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/soundcloudlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spade.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sparkle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakerhifi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakerhigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakerlow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakernone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakersimplehigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakersimplelow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakersimplenone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakersimpleslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakersimplex.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakerslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speakerx.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/speedometer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sphere.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spinnerball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spinner.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spinnergap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spiral.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/splithorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/splitvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spotifylogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/spraybottle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/square.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/squarehalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/squarehalfbottom.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/squarelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/squaresplithorizontal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/squaresplitvertical.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/squaresfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stack.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stackminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stackoverflowlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stackplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stacksimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stairs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stamp.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/standarddefinition.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/starandcrescent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/star.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/starfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/starhalf.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/starofdavid.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/steamlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/steeringwheel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/steps.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stethoscope.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sticker.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stool.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stop.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stopcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/storefront.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/strategy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/stripelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/student.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subsetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subsetproperof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subtitles.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subtitlesslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subtract.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subtractsquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/subway.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/suitcase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/suitcaserolling.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/suitcasesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sun.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sundim.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sunhorizon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sunglasses.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/supersetof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/supersetproperof.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/swap.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/swatches.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/swimmingpool.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/sword.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/synagogue.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/syringe.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tshirt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/table.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tabs.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tagchevron.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tagsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/target.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/taxi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/teabag.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/telegramlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/television.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/televisionsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tennisball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/terminal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/terminalwindow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/testtube.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textaunderline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textaa.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textaligncenter.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textalignjustify.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textalignleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textalignright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textcolumns.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texthfive.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texthfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texthone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texthsix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texththree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texthtwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textindent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textitalic.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textoutdent.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textstrikethrough.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textsubscript.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textsuperscript.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textt.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/texttslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textunderline.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/textbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/thermometer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/thermometercold.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/thermometerhot.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/thermometersimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/threadslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/threed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/thumbsdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/thumbsup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/ticket.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tidallogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tiktoklogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tilde.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/timer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tipjar.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tipi.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tire.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/toggleleft.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/toggleright.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/toilet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/toiletpaper.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/toolbox.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tooth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tornado.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tote.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/totesimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/towel.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tractor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trademark.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trademarkregistered.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trafficcone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trafficsign.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trafficsignal.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/train.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trainregional.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trainsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tram.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/translate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trashsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trayarrowdown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trayarrowup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tray.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/treasurechest.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/treeevergreen.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/treepalm.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/treestructure.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/treeview.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trenddown.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trendup.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/triangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/triangledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trolley.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trolleysuitcase.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trophy.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/truck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/trucktrailer.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/tumblrlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/twitchlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/twitterlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/umbrella.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/umbrellasimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/union.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/unite.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/unitesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/upload.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/uploadsimple.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usb.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/user.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercirclecheck.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercircledashed.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercirclegear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercircleminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usercircleplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/userfocus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usergear.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/userlist.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/userminus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/userplus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/userrectangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usersound.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usersquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/userswitch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/users.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usersfour.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/usersthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/van.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/vault.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/vectorthree.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/vectortwo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/vibrate.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/video.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/videocamera.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/videocameraslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/videoconference.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/vignette.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/vinylrecord.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/virtualreality.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/virus.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/visor.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/voicemail.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/volleyball.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wall.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wallet.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/warehouse.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/warning.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/warningcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/warningdiamond.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/warningoctagon.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/washingmachine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/watch.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wavesawtooth.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wavesine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wavesquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wavetriangle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/waveform.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/waveformslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/waves.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/webcam.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/webcamslash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/webhookslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wechatlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/whatsapplogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wheelchair.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wheelchairmotion.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wifihigh.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wifilow.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wifimedium.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wifinone.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wifislash.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wifix.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wind.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/windmill.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/windowslogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wine.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/wrench.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/x.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/xcircle.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/xlogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/xsquare.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/yarn.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/yinyang.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/csr/youtubelogo.d.ts","./node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@phosphor-icons/react/dist/index.d.ts","./oss/src/components/playground/assets/runbutton.tsx","./ee/src/components/evalrundetails/components/runevalscenariobutton/index.tsx","./node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts","./ee/src/lib/hooks/useinvocationresult/types.ts","./ee/src/lib/hooks/useinvocationresult/index.ts","./ee/src/components/evalrundetails/components/common/renderchatmessages.tsx","./oss/src/components/playground/components/drawers/tracedrawer/store/tracedrawerstore.ts","./oss/src/components/playground/components/drawers/tracedrawer/tracedrawer.tsx","./oss/src/components/playground/components/drawers/tracedrawer/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationresultutils/index.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/cellcomponents.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/actioncell.tsx","./ee/src/components/evalrundetails/components/evalrunscenariostatustag/assets/index.tsx","./ee/src/components/evalrundetails/components/evalrunscenariostatustag/index.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/statuscell.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/flatdatasourcebuilder.ts","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/metriccell/types.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/accountbookfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/accountbookoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/accountbooktwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/aimoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alertfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alertoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alerttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alibabaoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/aligncenteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alignleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alignrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alipaycirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alipaycircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alipayoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/alipaysquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/aliwangwangfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/aliwangwangoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/aliyunoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/amazoncirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/amazonoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/amazonsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/androidfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/androidoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/antcloudoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/antdesignoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/apartmentoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/apifilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/apioutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/apitwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/applefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/appleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/appstoreaddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/appstorefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/appstoreoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/appstoretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/areachartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/arrowdownoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/arrowleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/arrowrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/arrowupoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/arrowsaltoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/audiofilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/audiomutedoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/audiooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/audiotwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/auditoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/backwardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/backwardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/baiduoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bankfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bankoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/banktwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/barchartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/barcodeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/barsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/behancecirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/behanceoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/behancesquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/behancesquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bellfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/belloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/belltwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bgcolorsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bilibilifilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bilibilioutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/blockoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/boldoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bookfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bookoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/booktwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderbottomoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderhorizontaloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderinneroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderouteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bordertopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderverticleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/borderlesstableoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/boxplotfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/boxplotoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/boxplottwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/branchesoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bugfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bugoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bugtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/buildfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/buildoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/buildtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bulbfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bulboutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/bulbtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/calculatorfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/calculatoroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/calculatortwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/calendarfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/calendaroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/calendartwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/camerafilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cameraoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cameratwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/carfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cartwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretdownfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretdownoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretleftfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretrightfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretupfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/caretupoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/carryoutfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/carryoutoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/carryouttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checkcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checkcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checkcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checksquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checksquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/checksquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/chromefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/chromeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cicirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cicircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cicircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cioutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/citwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clearoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clockcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clockcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clockcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closecirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closecircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closecircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closesquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closesquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/closesquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clouddownloadoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cloudfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cloudoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cloudserveroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cloudsyncoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/cloudtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clouduploadoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/clusteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codesandboxcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codesandboxoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codesandboxsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codepencirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codepencircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codepenoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/codepensquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/coffeeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/columnheightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/columnwidthoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/commentoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/compassfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/compassoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/compasstwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/compressoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/consolesqloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/contactsfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/contactsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/contactstwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/containerfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/containeroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/containertwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/controlfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/controloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/controltwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copytwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyrightcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyrightcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyrightcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/copyrighttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/creditcardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/creditcardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/creditcardtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/crownfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/crownoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/crowntwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/customerservicefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/customerserviceoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/customerservicetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dashoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dashboardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dashboardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dashboardtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/databasefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/databaseoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/databasetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deletecolumnoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deletefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deleteoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deleterowoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deletetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deliveredprocedureoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/deploymentunitoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/desktopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/difffilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/diffoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/difftwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dingdingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dingtalkcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dingtalkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dingtalksquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/disconnectoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/discordfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/discordoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dislikefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dislikeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/disliketwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dockeroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dollarcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dollarcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dollarcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dollaroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dollartwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dotchartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dotnetoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/doubleleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/doublerightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downsquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downsquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/downloadoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dragoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dribbblecirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dribbbleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dribbblesquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dribbblesquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dropboxcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dropboxoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/dropboxsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/editfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/editoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/edittwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/ellipsisoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/enteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/environmentfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/environmentoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/environmenttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eurocirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eurocircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eurocircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eurooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eurotwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/exceptionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/exclamationcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/exclamationcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/exclamationcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/exclamationoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/expandaltoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/expandoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/experimentfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/experimentoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/experimenttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/exportoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eyefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eyeinvisiblefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eyeinvisibleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eyeinvisibletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eyeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/eyetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/facebookfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/facebookoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/falloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fastbackwardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fastbackwardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fastforwardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fastforwardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fieldbinaryoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fieldnumberoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fieldstringoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fieldtimeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileaddfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileaddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileaddtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filedoneoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileexcelfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileexceloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileexceltwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileexclamationfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileexclamationoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileexclamationtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filegifoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileimagefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileimageoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileimagetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filejpgoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filemarkdownfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filemarkdownoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filemarkdowntwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filepdffilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filepdfoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filepdftwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filepptfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filepptoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileppttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileprotectoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filesearchoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filesyncoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filetextfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filetextoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filetexttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileunknownfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileunknownoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileunknowntwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filewordfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filewordoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filewordtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filezipfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filezipoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fileziptwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filterfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/filtertwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/firefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fireoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/firetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/flagfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/flagoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/flagtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderaddfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderaddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderaddtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderopenfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderopenoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderopentwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/foldertwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/folderviewoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fontcolorsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fontsizeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/forkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/formoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/formatpainterfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/formatpainteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/forwardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/forwardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/frownfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/frownoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/frowntwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fullscreenexitoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fullscreenoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/functionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fundfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fundoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fundprojectionscreenoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fundtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/fundviewoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/funnelplotfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/funnelplotoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/funnelplottwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/gatewayoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/gifoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/giftfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/giftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/gifttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/githubfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/githuboutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/gitlabfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/gitlaboutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/globaloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/goldfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/goldoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/goldtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/goldenfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/googlecirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/googleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/googlepluscirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/googleplusoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/googleplussquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/googlesquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/groupoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/harmonyosoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hddfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hddtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/heartfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/heartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hearttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/heatmapoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/highlightfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/highlightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/highlighttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/historyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/holderoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/homefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/homeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hometwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hourglassfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hourglassoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/hourglasstwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/html5filled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/html5outlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/html5twotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/idcardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/idcardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/idcardtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/iecirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/ieoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/iesquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/importoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/inboxoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/infocirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/infocircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/infocircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/infooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insertrowaboveoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insertrowbelowoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insertrowleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insertrowrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/instagramfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/instagramoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insurancefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insuranceoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/insurancetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/interactionfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/interactionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/interactiontwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/issuescloseoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/italicoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/javaoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/javascriptoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/keyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/kubernetesoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/laptopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/layoutfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/layoutoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/layouttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftsquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/leftsquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/likefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/likeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/liketwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/linechartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/lineheightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/lineoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/linkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/linkedinfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/linkedinoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/linuxoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/loading3quartersoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/loadingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/lockfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/lockoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/locktwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/loginoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/logoutoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/maccommandfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/maccommandoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mailfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mailoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mailtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/manoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/medicineboxfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/medicineboxoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/medicineboxtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mediumcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mediumoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mediumsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mediumworkmarkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mehfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mehoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mehtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/menufoldoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/menuoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/menuunfoldoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mergecellsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mergefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mergeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/messagefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/messageoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/messagetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minuscirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minuscircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minuscircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minusoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minussquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minussquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/minussquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mobilefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mobileoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mobiletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/moneycollectfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/moneycollectoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/moneycollecttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/monitoroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/moonfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/moonoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/moreoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mutedfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/mutedoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/nodecollapseoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/nodeexpandoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/nodeindexoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/notificationfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/notificationoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/notificationtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/numberoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/onetooneoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/openaifilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/openaioutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/orderedlistoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/paperclipoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/partitionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pausecirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pausecircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pausecircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pauseoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/paycirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/paycircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/percentageoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/phonefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/phoneoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/phonetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/piccenteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/picleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/picrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/picturefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pictureoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/picturetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/piechartfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/piechartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/piecharttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pinterestfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pinterestoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/playcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/playcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/playcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/playsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/playsquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/playsquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pluscirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pluscircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pluscircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/plusoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/plussquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/plussquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/plussquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/poundcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/poundcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/poundcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/poundoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/poweroffoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/printerfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/printeroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/printertwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/productfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/productoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/profilefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/profileoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/profiletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/projectfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/projectoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/projecttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/propertysafetyfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/propertysafetyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/propertysafetytwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pullrequestoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pushpinfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pushpinoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pushpintwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/pythonoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/qqcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/qqoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/qqsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/qrcodeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/questioncirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/questioncircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/questioncircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/questionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/radarchartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/radiusbottomleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/radiusbottomrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/radiussettingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/radiusupleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/radiusuprightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/readfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/readoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/reconciliationfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/reconciliationoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/reconciliationtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redenvelopefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redenvelopeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redenvelopetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redditcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redditoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redditsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/redooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/reloadoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/restfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/restoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/resttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/retweetoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightsquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rightsquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/riseoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/robotfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/robotoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rocketfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rocketoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rockettwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rollbackoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rotateleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rotaterightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/rubyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/safetycertificatefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/safetycertificateoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/safetycertificatetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/safetyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/savefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/saveoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/savetwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/scanoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/schedulefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/scheduleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/scheduletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/scissoroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/searchoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/securityscanfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/securityscanoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/securityscantwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/selectoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sendoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/settingfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/settingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/settingtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shakeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sharealtoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shopfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shoptwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shoppingcartoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shoppingfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shoppingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shoppingtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/shrinkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/signalfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/signaturefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/signatureoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sisternodeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sketchcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sketchoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sketchsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/skinfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/skinoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/skintwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/skypefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/skypeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/slackcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/slackoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/slacksquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/slacksquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/slidersfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/slidersoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sliderstwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/smalldashoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/smilefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/smileoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/smiletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/snippetsfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/snippetsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/snippetstwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/solutionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sortascendingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sortdescendingoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/soundfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/soundoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/soundtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/splitcellsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/spotifyfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/spotifyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/starfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/staroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/startwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stepbackwardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stepbackwardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stepforwardfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stepforwardoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stockoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stopfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/stoptwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/strikethroughoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/subnodeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sunfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/sunoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/swapleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/swapoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/swaprightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/switcherfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/switcheroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/switchertwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/syncoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tableoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tabletfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tabletoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tablettwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tagfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tagoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tagtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tagsfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tagsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tagstwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/taobaocirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/taobaocircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/taobaooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/taobaosquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/teamoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/thunderboltfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/thunderboltoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/thunderbolttwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tiktokfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tiktokoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/totopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/toolfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tooloutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/tooltwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trademarkcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trademarkcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trademarkcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trademarkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/transactionoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/translationoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trophyfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trophyoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/trophytwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/truckfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/truckoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/twitchfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/twitchoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/twittercirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/twitteroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/twittersquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/underlineoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/undooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/ungroupoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/unlockfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/unlockoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/unlocktwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/unorderedlistoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upcirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upcircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upcircletwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upsquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upsquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/upsquaretwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/uploadoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/usbfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/usboutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/usbtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/useraddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/userdeleteoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/useroutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/userswitchoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/usergroupaddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/usergroupdeleteoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/verifiedoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/verticalalignbottomoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/verticalalignmiddleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/verticalaligntopoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/verticalleftoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/verticalrightoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/videocameraaddoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/videocamerafilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/videocameraoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/videocameratwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/walletfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/walletoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/wallettwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/warningfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/warningoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/warningtwotone.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/wechatfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/wechatoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/wechatworkfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/wechatworkoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/weibocirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/weibocircleoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/weibooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/weibosquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/weibosquareoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/whatsappoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/wifioutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/windowsfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/windowsoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/womanoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/xfilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/xoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/yahoofilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/yahoooutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/youtubefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/youtubeoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/yuquefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/yuqueoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/zhihucirclefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/zhihuoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/zhihusquarefilled.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/zoominoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/zoomoutoutlined.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/icons/index.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/components/iconfont.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/components/context.d.ts","./node_modules/.pnpm/@ant-design+icons@5.6.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ant-design/icons/lib/index.d.ts","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/metriccell/collapsedannotationvaluecell.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/metriccell/collapsedmetricvaluecell.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/metriccell/metriccell.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/evaluationcell.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/utils.tsx","./node_modules/.pnpm/usehooks-ts@3.1.1_react@19.0.0/node_modules/usehooks-ts/dist/index.d.ts","./ee/src/components/evalrundetails/components/virtualizedscenariotable/hooks/usetabledatasource.ts","./ee/src/components/evalrundetails/state/urlstate.ts","./ee/src/components/evalrundetailspage/state/evaltype.ts","./node_modules/.pnpm/jss@10.10.0/node_modules/jss/src/index.d.ts","./node_modules/.pnpm/theming@3.3.0_react@19.0.0/node_modules/theming/src/index.d.ts","./node_modules/.pnpm/react-jss@10.10.0_react@19.0.0/node_modules/react-jss/src/index.d.ts","./ee/src/components/evaluationtable/assets/styles.ts","./ee/src/components/evaluations/evaluationcardview/assets/styles.ts","./ee/src/components/humanevaluationmodal/assets/styles.ts","./ee/src/components/humanevaluations/types.ts","./ee/src/components/humanevaluations/assets/styles.ts","./ee/src/components/humanevaluations/assets/metricdetailspopover/types.ts","./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/chartutils.ts","./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/utils.ts","./ee/src/components/postsignupform/assets/styles.ts","./ee/src/components/pages/evaluations/newevaluation/types.ts","./ee/src/components/pages/evaluations/newevaluation/assets/constants.ts","./ee/src/components/pages/evaluations/newevaluation/assets/styles.ts","./ee/src/components/pages/evaluations/newevaluation/assets/tablabel/types.ts","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/types.ts","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/assets/styles.ts","./ee/src/components/pages/evaluations/autoevaluation/assets/styles.ts","./ee/src/components/pages/evaluations/autoevaluation/assets/types.ts","./ee/src/components/pages/settings/billing/modals/autorenewalcancelmodal/assets/constants.ts","./ee/src/components/pages/settings/billing/modals/pricingmodal/assets/constants.ts","./node_modules/.pnpm/crisp-sdk-web@1.0.25/node_modules/crisp-sdk-web/dist/crisp.d.ts","./ee/src/hooks/usecrispchat.ts","./ee/src/lib/metricutils.ts","./ee/src/lib/metricsorter.ts","./ee/src/lib/tableutils.ts","./ee/src/lib/types_ee.ts","./node_modules/.pnpm/@types+papaparse@5.3.15/node_modules/@types/papaparse/index.d.ts","./oss/src/lib/helpers/filemanipulations.ts","./oss/src/lib/helpers/formatters.ts","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.d.ts","./node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.ts","./node_modules/.pnpm/@types+js-yaml@4.0.9/node_modules/@types/js-yaml/index.d.mts","./node_modules/.pnpm/json5@2.2.3/node_modules/json5/lib/parse.d.ts","./node_modules/.pnpm/json5@2.2.3/node_modules/json5/lib/stringify.d.ts","./node_modules/.pnpm/json5@2.2.3/node_modules/json5/lib/index.d.ts","./node_modules/.pnpm/@types+retry@0.12.5/node_modules/@types/retry/index.d.ts","./node_modules/.pnpm/@types+promise-retry@1.1.6/node_modules/@types/promise-retry/index.d.ts","./oss/src/lib/helpers/dynamicenv.ts","./oss/src/lib/helpers/errorhandler.ts","./oss/src/lib/helpers/utils.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/capitalize.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/round.d.ts","./ee/src/lib/helpers/evaluate.ts","./ee/src/lib/helpers/hashutils.ts","./ee/src/lib/helpers/traceutils.ts","./node_modules/.pnpm/axios@1.8.2_debug@4.4.0/node_modules/axios/index.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/isobject.d.ts","./node_modules/.pnpm/supertokens-js-override@0.0.4/node_modules/supertokens-js-override/lib/build/index.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/utils/cookiehandler/types.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/utils/windowhandler/types.d.ts","./node_modules/.pnpm/browser-tabs-lock@1.3.0/node_modules/browser-tabs-lock/index.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/utils/lockfactory/types.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/utils/dateprovider/types.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/types.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/claims/primitiveclaim.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/claims/primitivearrayclaim.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/claims/booleanclaim.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/lib/build/index.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/recipemodule/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/recipemodule/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/normalisedurlpath.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/normalisedurldomain.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/utils/cookiehandler/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/cookiehandler/types.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/utils/windowhandler/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/windowhandler/types.d.ts","./node_modules/.pnpm/supertokens-website@20.1.6/node_modules/supertokens-website/utils/dateprovider/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/dateprovider/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/session/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/session/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/recipe/session/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/utils/dateprovider/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/dateprovider/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/recipemodule/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/recipemodule/baserecipemodule.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/translation/translationhelpers.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/utils/cookiehandler/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/utils/normalisedurldomain.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/utils/normalisedurlpath.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/utils/windowhandler/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/claims/booleanclaim.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/claims/primitivearrayclaim.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/claims/primitiveclaim.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/session/components/themes/accessdeniedscreentheme/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/recipemodule/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/session/recipe.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/components/componentoverride/componentoverride.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/recipe/session/types/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/session/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/session/sessioncontext.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/session/sessionauth.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/session/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/recipe/session/index.d.ts","./oss/src/lib/api/assets/axiosconfig.ts","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/customparseformat.d.ts","./oss/src/lib/helpers/datetimehelper/dayjs.ts","./oss/src/lib/helpers/datetimehelper/index.ts","./oss/src/lib/transformers.ts","./ee/src/lib/hooks/useevaluationrunscenarios/index.ts","./ee/src/lib/hooks/usepreviewevaluations/assets/utils.ts","./ee/src/lib/hooks/usepreviewevaluations/states/queryfilteratoms.ts","./ee/src/lib/hooks/usepreviewevaluations/index.ts","./ee/src/lib/hooks/useevaluations.ts","./ee/src/lib/hooks/useevalscenarioqueue/responsequeue.ts","./ee/src/lib/hooks/useevalscenarioqueue/index.ts","./ee/src/lib/hooks/useevaluationrundata/index.ts","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/evaluationrunfamily.ts","./ee/src/lib/hooks/useevaluationrunmetrics/assets/utils.ts","./ee/src/lib/hooks/useevaluationrunmetrics/index.ts","./ee/src/lib/hooks/userunmetricsmap/index.ts","./ee/src/lib/metrics/utils.ts","./ee/src/lib/workers/evalrunner/pureenrichment.ts","./ee/src/lib/workers/evalrunner/workerfetch.ts","./ee/src/lib/workers/evalrunner/bulkworker.ts","./oss/src/lib/helpers/casing.ts","./ee/src/lib/workers/evalrunner/types.ts","./ee/src/lib/workers/evalrunner/evalrunner.worker.ts","./ee/src/lib/workers/evalrunner/fetchrunmetrics.worker.ts","./ee/src/lib/workers/evalrunner/fetchsteps.worker.ts","./ee/src/lib/workers/evalrunner/runmetricsworker.ts","./ee/src/lib/workers/evalrunner/scenariolistworker.ts","./ee/src/services/deploymentversioning/api/index.ts","./ee/src/services/evaluationruns/utils.ts","./ee/src/services/evaluationruns/api/types.ts","./ee/src/services/evaluationruns/api/index.ts","./ee/src/services/evaluations/workerutils.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/uniqby.d.ts","./ee/src/services/evaluations/api/index.ts","./ee/src/services/evaluations/api_ee/index.ts","./ee/src/services/human-evaluations/api/index.ts","./ee/src/services/human-evaluations/hooks/useevaluationresults.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/meanby.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/random.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/sumby.d.ts","./ee/src/services/observability/api/mock.ts","./ee/src/services/observability/api/index.ts","./ee/src/services/promptversioning/api/index.ts","./ee/src/services/runmetrics/api/assets/contants.ts","./ee/src/services/runmetrics/api/types.ts","./ee/src/services/runmetrics/api/index.ts","./tests/tests/fixtures/base.fixture/apihelpers/index.ts","./tests/tests/fixtures/base.fixture/uihelpers/helpers.ts","./tests/tests/fixtures/base.fixture/uihelpers/index.ts","./tests/tests/fixtures/base.fixture/index.ts","./tests/utils/index.ts","./oss/tests/1-settings/api-keys.ts","./ee/tests/1-settings/api-keys-management.spec.ts","./oss/tests/1-settings/model-hub.ts","./ee/tests/1-settings/model-hub.spec.ts","./oss/tests/2-app/assets/types.ts","./oss/tests/2-app/test.ts","./oss/tests/2-app/index.ts","./ee/tests/2-app/create.spec.ts","./oss/tests/3-playground/assets/types.ts","./oss/tests/3-playground/assets/constants.ts","./oss/tests/3-playground/tests.spec.ts","./oss/tests/3-playground/index.ts","./ee/tests/3-playground/run-variant.spec.ts","./oss/tests/4-prompt-registry/index.ts","./ee/tests/4-prompt-registry/prompt-registry-flow.spec.ts","./oss/tests/5-testsset/index.ts","./ee/tests/5-testsset/testset.spec.ts","./ee/tests/6-auto-evaluation/assets/types.ts","./ee/tests/6-auto-evaluation/tests.ts","./ee/tests/6-auto-evaluation/index.ts","./ee/tests/6-auto-evaluation/run-auto-evaluation.spec.ts","./oss/tests/7-observability/index.ts","./ee/tests/7-observability/observability.spec.ts","./oss/tests/8-deployment/index.ts","./ee/tests/8-deployment/deploy-variant.spec.ts","./ee/tests/9-human-annotation/assets/types.ts","./ee/tests/9-human-annotation/tests.ts","./ee/tests/9-human-annotation/index.ts","./ee/tests/9-human-annotation/human-annotation.spec.ts","./oss/src/code_snippets/endpoints/fetch_config/curl.ts","./oss/src/code_snippets/endpoints/fetch_config/python.ts","./node_modules/.pnpm/@types+js-beautify@1.14.3/node_modules/@types/js-beautify/index.d.ts","./oss/src/code_snippets/endpoints/fetch_config/typescript.ts","./oss/src/code_snippets/endpoints/invoke_llm_app/curl.ts","./oss/src/code_snippets/endpoints/invoke_llm_app/python.ts","./oss/src/code_snippets/endpoints/invoke_llm_app/typescript.ts","./oss/src/code_snippets/testsets/create_with_json/curl.ts","./oss/src/code_snippets/testsets/create_with_json/python.ts","./oss/src/code_snippets/testsets/create_with_json/typescript.ts","./oss/src/code_snippets/testsets/create_with_upload/curl.ts","./oss/src/code_snippets/testsets/create_with_upload/python.ts","./oss/src/code_snippets/testsets/create_with_upload/typescript.ts","./oss/src/components/banners/oldappdeprecationbanner/assets/constants.ts","./oss/src/components/editor/assets/theme.ts","./oss/src/components/editor/hooks/useeditorinvariant.ts","./oss/src/components/editor/hooks/useeditorresize.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalcomposer.d.ts","./oss/src/components/editor/plugins/token/tokeninputnode.tsx","./oss/src/components/editor/plugins/token/tokennode.ts","./oss/src/components/editor/plugins/code/nodes/codeblocknode.ts","./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","./oss/src/components/editor/plugins/code/nodes/codelinenode.ts","./oss/src/components/editor/plugins/code/components/codeblockerrorindicator.tsx","./oss/src/components/editor/plugins/code/nodes/codeblockerrorindicatornode.tsx","./node_modules/.pnpm/@lexical+code@0.30.0/node_modules/@lexical/code/codehighlightnode.d.ts","./node_modules/.pnpm/@lexical+code@0.30.0/node_modules/@lexical/code/codehighlighter.d.ts","./node_modules/.pnpm/@lexical+code@0.30.0/node_modules/@lexical/code/codenode.d.ts","./node_modules/.pnpm/@lexical+code@0.30.0/node_modules/@lexical/code/index.d.ts","./node_modules/.pnpm/@lexical+rich-text@0.30.0/node_modules/@lexical/rich-text/index.d.ts","./node_modules/.pnpm/@lexical+list@0.30.0/node_modules/@lexical/list/lexicallistitemnode.d.ts","./node_modules/.pnpm/@lexical+list@0.30.0/node_modules/@lexical/list/lexicallistnode.d.ts","./node_modules/.pnpm/@lexical+list@0.30.0/node_modules/@lexical/list/checklist.d.ts","./node_modules/.pnpm/@lexical+list@0.30.0/node_modules/@lexical/list/formatlist.d.ts","./node_modules/.pnpm/@lexical+list@0.30.0/node_modules/@lexical/list/utils.d.ts","./node_modules/.pnpm/@lexical+list@0.30.0/node_modules/@lexical/list/index.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltablecellnode.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltablecommands.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltableselection.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltableselectionhelpers.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltableobserver.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltablenode.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltablepluginhelpers.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltablerownode.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/lexicaltableutils.d.ts","./node_modules/.pnpm/@lexical+table@0.30.0/node_modules/@lexical/table/index.d.ts","./node_modules/.pnpm/@lexical+hashtag@0.30.0/node_modules/@lexical/hashtag/lexicalhashtagnode.d.ts","./node_modules/.pnpm/@lexical+hashtag@0.30.0/node_modules/@lexical/hashtag/index.d.ts","./node_modules/.pnpm/@lexical+link@0.30.0/node_modules/@lexical/link/index.d.ts","./node_modules/.pnpm/@lexical+overflow@0.30.0/node_modules/@lexical/overflow/index.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalhorizontalrulenode.d.ts","./node_modules/.pnpm/@lexical+mark@0.30.0/node_modules/@lexical/mark/marknode.d.ts","./node_modules/.pnpm/@lexical+mark@0.30.0/node_modules/@lexical/mark/index.d.ts","./oss/src/components/editor/hooks/useeditorconfig/index.ts","./oss/src/components/editor/plugins/code/utils/createlogger.ts","./oss/src/components/editor/plugins/code/tryparsepartialjson.ts","./oss/src/components/editor/plugins/code/plugins/horizontalnavigationutils.ts","./oss/src/components/editor/plugins/code/utils/getdiffrange.ts","./oss/src/components/editor/plugins/code/utils/indentationutils.ts","./oss/src/components/editor/plugins/code/utils/language.ts","./oss/src/components/editor/plugins/code/utils/movecarettostart.ts","./oss/src/components/editor/plugins/code/utils/pasteutils.backup.ts","./node_modules/.pnpm/@types+prismjs@1.26.5/node_modules/@types/prismjs/index.d.ts","./oss/src/components/editor/plugins/code/utils/tokenizer.ts","./oss/src/components/editor/plugins/code/utils/pasteutils.ts","./oss/src/components/editor/plugins/code/utils/pluginlocks.ts","./oss/src/components/editor/state/assets/atoms.ts","./oss/src/components/enhanceduis/table/types.ts","./oss/src/components/filters/editcolumns/assets/helper.ts","./oss/src/components/filters/editcolumns/assets/types.ts","./oss/src/components/layout/assets/styles.ts","./oss/src/components/modelregistry/drawers/configureproviderdrawer/assets/constants.ts","./oss/src/components/nomobilepagewrapper/assets/constants.ts","./oss/src/components/playground/components/drawers/tracedrawer/store/atoms.ts","./oss/src/components/playground/components/menus/playgroundcreatenewvariant/assets/styles.ts","./oss/src/components/playground/components/modals/deletevariantmodal/styles.ts","./oss/src/components/playground/components/modals/loadtestsetmodal/styles.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/styles.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisonheader/styles.ts","./oss/src/components/playground/components/playgroundgenerationcomparisonview/assets/styles.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationcompletionrow/styles.ts","./oss/src/components/playground/components/playgroundgenerations/assets/generationheader/styles.ts","./oss/src/components/playground/components/playgroundheader/styles.ts","./oss/src/components/playground/components/playgroundpromptcomparisonview/promptcomparisonvariantnavigation/assets/variantnavigationcard/styles.ts","./oss/src/components/playground/components/playgroundtool/assets/index.ts","./oss/src/components/playground/components/playgroundvariantconfig/assets/styles.ts","./oss/src/components/playground/components/playgroundvariantconfigprompt/styles.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/multiselectcontrol/constants.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/playgroundoutputcontrol/normalizejsonstring.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptimageupload/assets/helpers.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptimageupload/assets/styles.ts","./node_modules/.pnpm/stable-hash@0.0.6/node_modules/stable-hash/dist/index.d.ts","./oss/src/components/playground/assets/hash.ts","./oss/src/components/playground/assets/utilities/componentlogger.ts","./oss/src/components/playground/assets/utilities/errors/constants.ts","./oss/src/components/playground/assets/utilities/errors/utils.ts","./oss/src/components/playground/assets/utilities/errors/index.ts","./oss/src/components/playground/assets/utilities/utilityfunctions/index.ts","./oss/src/components/playground/hooks/usedrawerwidth/index.ts","./oss/src/components/playground/hooks/useplayground/assets/helpers.ts","./oss/src/lib/hooks/usestatelessvariants/state/index.tsx","./oss/src/lib/hooks/usestatelessvariants/types/playground.ts","./oss/src/lib/hooks/usestatelessvariants/types/index.ts","./oss/src/lib/shared/variant/stringutils.ts","./oss/src/lib/shared/variant/generictransformer/helpers/schema.ts","./oss/src/lib/shared/variant/generictransformer/helpers/schemaextractors.ts","./oss/src/lib/shared/variant/generictransformer/helpers/objects.ts","./oss/src/lib/shared/variant/generictransformer/helpers/anyof.ts","./oss/src/lib/shared/variant/generictransformer/helpers/arrays.ts","./oss/src/lib/shared/variant/generictransformer/helpers/primitives.ts","./oss/src/lib/shared/variant/generictransformer/helpers/metadata.ts","./oss/src/lib/shared/variant/generictransformer/index.ts","./oss/src/lib/shared/variant/types/openapi.ts","./oss/src/lib/shared/variant/inputhelpers.ts","./oss/src/components/playground/hooks/useplayground/assets/messagehelpers.ts","./oss/src/components/playground/hooks/useplayground/assets/generationhelpers.ts","./oss/src/components/playground/hooks/useplayground/assets/statehelpers.ts","./oss/src/components/playground/hooks/useplayground/assets/urlhelpers.ts","./oss/src/components/playground/hooks/useplayground/middlewares/hooks/useplaygroundutilities/index.ts","./oss/src/components/playground/hooks/useplayground/middlewares/appschemamiddleware.ts","./oss/src/components/playground/hooks/useplayground/middlewares/isvariantdirtymiddleware.ts","./oss/src/components/playground/hooks/useplayground/middlewares/playgrounduimiddleware.ts","./oss/src/components/playground/hooks/usewebworker/state/index.ts","./oss/src/components/playground/hooks/usewebworker/index.ts","./oss/src/components/playground/hooks/useplayground/middlewares/playgroundvariantmiddleware.ts","./oss/src/components/playground/hooks/useplayground/middlewares/playgroundvariantsmiddleware.ts","./oss/src/components/playground/hooks/useplayground/middlewares/selectormiddleware.ts","./oss/src/components/playground/hooks/useplayground/index.ts","./oss/src/lib/shared/variant/valuehelpers.ts","./oss/src/lib/shared/variant/transformer/transformtorequestbody.ts","./oss/src/components/playground/hooks/usewebworker/assets/playground.worker.ts","./oss/src/components/playground/state/messagecontext.ts","./oss/src/components/playground/v2/components/drawers/promptcomparisonfocusdrawer/styles.ts","./oss/src/components/playground/v2/components/playgroundvarianthistory/styles.ts","./oss/src/components/resizabletitle/styles.ts","./oss/src/components/resulttag/assets/styles.ts","./oss/src/components/sidebar/assets/styles.ts","./oss/src/components/variantscomponents/drawers/variantdrawer/assets/styles.ts","./oss/src/components/variantscomponents/drawers/variantdrawer/utils/index.ts","./oss/src/components/variantscomponents/assets/styles.ts","./oss/src/components/pages/app-management/assets/helpers.ts","./oss/src/components/pages/app-management/assets/styles.ts","./oss/src/components/pages/app-management/modals/addappfromtemplatemodal/assets/styles.ts","./oss/src/components/pages/app-management/modals/customworkflowmodal/assets/styles.ts","./oss/src/components/pages/auth/assets/style.ts","./oss/src/components/pages/observability/assets/constants.ts","./oss/src/components/pages/observability/assets/utils.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/utils.ts","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/createevaluator/assets/helper.ts","./oss/src/components/pages/observability/drawer/testsetdrawer/assets/styles.ts","./oss/src/components/pages/observability/drawer/tracecontent/assets/styles.ts","./oss/src/components/pages/observability/drawer/tracecontent/utils/index.ts","./oss/src/components/pages/observability/drawer/traceheader/assets/styles.ts","./oss/src/components/pages/observability/drawer/tracesidepanel/traceannotations/assets/styles.ts","./oss/src/components/pages/observability/drawer/tracesidepanel/tracedetails/assets/styles.ts","./oss/src/components/pages/observability/drawer/tracetree/assets/styles.ts","./oss/src/components/pages/observability/drawer/tracetreesettings/assets/styles.ts","./oss/src/components/pages/overview/deployments/deploymentdrawer/assets/styles.ts","./oss/src/components/pages/overview/deployments/deploymentdrawer/hooks/useuri.ts","./oss/src/components/pages/settings/apikeys/assets/constants.ts","./oss/src/components/ui/customtreecomponent/assets/styles.ts","./oss/src/config/appinfo.ts","./oss/src/config/constants.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/authrecipe/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/emailpassword/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/emailpassword/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/recipe/emailpassword/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/components/library/input.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/components/themes/resetpasswordusingtoken/resetpasswordemail.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/components/themes/resetpasswordusingtoken/submitnewpassword.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/types/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/components/themes/signin/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/components/themes/signup/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/authrecipe/components/theme/authpage/authpagecomponentlist.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/authrecipe/components/theme/authpage/authpagefooter.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/authrecipe/components/theme/authpage/authpageheader.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/authrecipe/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/emailpassword/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/recipe/emailpassword/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/passwordless/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/passwordless/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/recipe/passwordless/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/continuewithpasswordless/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/linkclickedscreen/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/linksent/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/mfa/loadingscreen.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/mfa/mfafooter.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/mfa/mfaheader.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/mfa/mfaotpfooter.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/mfa/mfaotpheader.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/signinup/emailform.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/signinup/emailorphoneform.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/signinup/phoneform.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/signinupepcombo/emailform.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/signinupepcombo/emailorphoneform.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/userinputcodeform/userinputcodeformfooter.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/userinputcodeform/userinputcodeformheader.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/components/themes/userinputcodeform/userinputcodeformscreen.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/recipe/passwordless/types/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/passwordless/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/recipe/passwordless/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/thirdparty/types.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/lib/build/recipe/thirdparty/index.d.ts","./node_modules/.pnpm/supertokens-web-js@0.13.1/node_modules/supertokens-web-js/recipe/thirdparty/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/activedirectory.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/apple.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/bitbucket.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/boxysaml.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/discord.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/facebook.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/github.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/gitlab.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/google.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/googleworkspaces.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/linkedin.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/okta.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/providers/twitter.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/components/themes/signinandup/providersform.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/components/themes/signinandupcallback/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/types.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/recipe/thirdparty/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/recipe/thirdparty/index.d.ts","./oss/src/config/frontendconfig.ts","./oss/src/hooks/useappid.ts","./oss/src/hooks/useblocknavigation.ts","./oss/src/hooks/usecrispchat.ts","./oss/src/hooks/uselazyeffect.ts","./oss/src/hooks/usedebounceinput.ts","./oss/src/hooks/usedurationcounter.ts","./oss/src/hooks/usefocusinput.ts","./oss/src/hooks/useforceremount.ts","./oss/src/hooks/useisomorphiclayouteffect.ts","./oss/src/hooks/useloading.ts","./oss/src/hooks/usepagination.ts","./oss/src/hooks/usequery.ts","./oss/src/hooks/useresizeobserver.ts","./oss/src/hooks/usesession.ts","./oss/src/hooks/usestatecallback.ts","./oss/src/contexts/profile.context.tsx","./oss/src/hooks/usevaultsecret.ts","./oss/src/lib/api/types.ts","./oss/src/lib/atoms/evaluation.ts","./oss/src/lib/atoms/organization.ts","./oss/src/lib/atoms/virtualtable.ts","./oss/src/lib/constants/statuslabels.ts","./oss/src/lib/helpers/colors.ts","./oss/src/lib/helpers/copytoclipboard.ts","./oss/src/lib/helpers/evaluate.ts","./oss/src/lib/helpers/llmproviders.ts","./node_modules/.pnpm/uuidjs@5.1.0/node_modules/uuidjs/dist/uuid.d.ts","./oss/src/lib/hooks/useannotations/types/index.ts","./oss/src/lib/hooks/useannotations/assets/helpers.ts","./oss/src/lib/helpers/observability_helpers.ts","./oss/src/lib/helpers/openapi_parser.ts","./oss/src/lib/helpers/playgroundresp.ts","./oss/src/lib/helpers/testset.ts","./oss/src/lib/helpers/usesubscriptiondatawrapper.ts","./oss/src/lib/helpers/validators.ts","./oss/src/lib/helpers/varianthelper.ts","./oss/src/lib/helpers/analytics/assets/constants.ts","./oss/src/lib/helpers/analytics/store/atoms.ts","./oss/src/lib/helpers/analytics/hooks/useposthogag.ts","./oss/src/lib/helpers/analytics/hooks/usesurvey.ts","./oss/src/lib/hooks/usejwt.ts","./oss/src/lib/hooks/uselegacyvariant.ts","./oss/src/lib/hooks/usestatelessvariants/middlewares/appschema/index.ts","./oss/src/lib/hooks/usestatelessvariants/index.ts","./oss/src/lib/hooks/usevariants.ts","./oss/src/lib/hooks/useevaluators/types.ts","./oss/src/lib/hooks/useannotations/assets/transformer.ts","./oss/src/lib/hooks/useannotations/index.ts","./oss/src/lib/hooks/useevaluatorconfigs/index.ts","./oss/src/lib/hooks/useevaluators/index.ts","./oss/src/lib/hooks/usestatelessvariants/assets/comparisonhelpers.ts","./oss/src/lib/hooks/usestatelessvariants/assets/hash.ts","./oss/src/lib/hooks/usestatelessvariants/assets/helpers.ts","./oss/src/lib/shared/variant/api.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/configuration/index.d.ts","./node_modules/.pnpm/fast-uri@3.0.6/node_modules/fast-uri/types/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/code.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/scope.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/rules.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/util.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/subschema.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/errors.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/datatype.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/not.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/if.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/required.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/const.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/enum.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/format/format.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/errors.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/types/json-schema.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/validation_error.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/ref_error.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/ajv.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/resolve.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/types/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/types/jtd-schema.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/core.d.ts","./node_modules/.pnpm/ajv-draft-04@1.0.0_ajv@8.17.1/node_modules/ajv-draft-04/dist/index.d.ts","./node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/2020.d.ts","./node_modules/.pnpm/@scalar+openapi-types@0.1.9/node_modules/@scalar/openapi-types/dist/openapi-types.d.ts","./node_modules/.pnpm/@scalar+openapi-types@0.1.9/node_modules/@scalar/openapi-types/dist/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/types/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/lib/validator/validator.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/resolvereferences.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/lib/validator/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/lib/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/dereference.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/details.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/escapejsonpointer.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/filter.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/getentrypoint.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/getlistofreferences.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/getsegmentsfrompath.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/isfilesystem.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/isjson.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/isobject.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/isyaml.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/load/load.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/load/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/normalize.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/openapi/openapi.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/openapi/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/tojson.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/toyaml.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/transformerrors.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/traverse.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/unescapejsonpointer.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/upgrade.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/upgradefromthreetothreeone.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/upgradefromtwotothree.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/validate.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/transform/utils/addlatestopenapiversion.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/transform/utils/addinfoobject.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/transform/sanitize.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/transform/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/utils/index.d.ts","./node_modules/.pnpm/@scalar+openapi-parser@0.9.0/node_modules/@scalar/openapi-parser/dist/index.d.ts","./oss/src/lib/shared/variant/transformer/transformer.ts","./oss/src/lib/shared/variant/types/enriched.ts","./oss/src/lib/shared/variant/utils.ts","./oss/src/lib/shared/variant/transformer.ts","./oss/src/lib/shared/variant/types/index.ts","./oss/src/lib/shared/variant/index.ts","./oss/src/lib/shared/variant/transformer/reversetransformer.ts","./oss/src/lib/shared/variant/types/variant.ts","./oss/src/lib/utils/abortcontrollers.ts","./oss/src/lib/utils/slugify.ts","./oss/src/services/api.ts","./oss/src/services/annotations/api/index.ts","./oss/src/services/apikeys/api/index.ts","./oss/src/services/app-selector/api/index.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/isequal.d.ts","./oss/src/services/app-selector/hooks/usetemplates.ts","./oss/src/services/deployment/api/index.ts","./oss/src/services/deploymentversioning/api/index.ts","./oss/src/services/evaluations/api/index.ts","./oss/src/services/evaluators/index.ts","./oss/src/services/observability/core/index.ts","./oss/src/services/observability/types/index.ts","./oss/src/services/observability/hooks/usetraces.ts","./oss/src/services/organization/api/index.ts","./oss/src/services/playground/api/index.ts","./oss/src/services/project/types.ts","./oss/src/services/project/index.ts","./oss/src/services/promptversioning/api/index.ts","./oss/src/services/testsets/api/index.ts","./oss/src/services/vault/api/index.ts","./oss/src/services/workspace/api/index.ts","./oss/tests/1-settings/api-keys-management.spec.ts","./oss/tests/1-settings/model-hub.spec.ts","./oss/tests/2-app/create.spec.ts","./oss/tests/3-playground/run-variant.spec.ts","./oss/tests/4-prompt-registry/prompt-registry-flow.spec.ts","./oss/tests/5-testsset/testset.spec.ts","./oss/tests/7-observability/observability.spec.ts","./oss/tests/8-deployment/deploy-variant.spec.ts","./node_modules/.pnpm/dotenv@16.5.0/node_modules/dotenv/lib/main.d.ts","./tests/playwright/config/deployments.ts","./tests/playwright/config/projects.ts","./tests/playwright.config.ts","./tests/utils/testmail/index.ts","./tests/tests/fixtures/user.fixture/types.ts","./tests/tests/fixtures/user.fixture/authhelpers/utilities.ts","./tests/playwright/global-setup.ts","./tests/playwright/global-teardown.ts","./tests/playwright/scripts/run-tests.ts","./tests/tests/fixtures/base.fixture/llmkeyssettingshelpers/index.ts","./tests/tests/fixtures/session.fixture/types.ts","./tests/tests/fixtures/session.fixture/index.ts","./tests/tests/fixtures/user.fixture/authhelpers/index.ts","./ee/src/components/evalrundetails/urlsync.tsx","./ee/src/components/autoevalrundetails/components/evalrunviewselector/index.tsx","./ee/src/components/autoevalrundetails/components/evalruncomparemenu/index.tsx","./ee/src/components/autoevalrundetails/components/evalrunheader/index.tsx","./ee/src/components/autoevalrundetails/components/evalruninfocard/assets/tracemetrics.tsx","./ee/src/components/autoevalrundetails/components/evalruninfocard/index.tsx","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/container/surface.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/container/layer.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/dot.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/synchronisation/types.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/types.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/defaulttooltipcontent.d.ts","./node_modules/.pnpm/@types+d3-path@3.1.1/node_modules/@types/d3-path/index.d.ts","./node_modules/.pnpm/@types+d3-shape@3.1.7/node_modules/@types/d3-shape/index.d.ts","./node_modules/.pnpm/victory-vendor@37.3.6/node_modules/victory-vendor/d3-shape.d.ts","./node_modules/.pnpm/redux@5.0.1/node_modules/redux/dist/redux.d.ts","./node_modules/.pnpm/reselect@5.1.1/node_modules/reselect/dist/reselect.d.ts","./node_modules/.pnpm/redux-thunk@3.1.0_redux@5.0.1/node_modules/redux-thunk/dist/redux-thunk.d.ts","./node_modules/.pnpm/@reduxjs+toolkit@2.8.2_react-redux@9.2.0_@types+react@19.0.10_react@19.0.0_redux@5.0.1__react@19.0.0/node_modules/@reduxjs/toolkit/dist/uncheckedindexed.ts","./node_modules/.pnpm/@reduxjs+toolkit@2.8.2_react-redux@9.2.0_@types+react@19.0.10_react@19.0.0_redux@5.0.1__react@19.0.0/node_modules/@reduxjs/toolkit/dist/index.d.mts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/legendslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/brushslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/chartdataslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/rectangle.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/label.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/barutils.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/selectors/barselectors.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/bar.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/curve.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/line.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/labellist.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/symbols.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/selectors/scatterselectors.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/scatter.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/errorbar.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/graphicalitemsslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/optionsslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/polaraxisslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/polaroptionsslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/ifoverflow.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/referenceelementsslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/rootpropsslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/store.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/getticks.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/cartesiangrid.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/selectors/axisselectors.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/chartutils.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/cartesianaxis.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/cartesianaxisslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/tooltipslice.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/types.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/defaultlegendcontent.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/payload/getuniqpayload.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/useelementoffset.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/legend.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/cursor.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/tooltip.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/responsivecontainer.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/cell.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/text.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/component/customized.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/sector.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/polygon.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/cross.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/polar/polargrid.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/polar/polarradiusaxis.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/polar/polarangleaxis.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/polar/pie.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/polar/radar.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/polar/radialbar.d.ts","./node_modules/.pnpm/@types+d3-time@3.0.4/node_modules/@types/d3-time/index.d.ts","./node_modules/.pnpm/@types+d3-scale@4.0.9/node_modules/@types/d3-scale/index.d.ts","./node_modules/.pnpm/victory-vendor@37.3.6/node_modules/victory-vendor/d3-scale.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/context/brushupdatecontext.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/brush.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/xaxis.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/yaxis.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/referenceline.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/referencedot.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/referencearea.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/state/selectors/areaselectors.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/area.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/zaxis.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/linechart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/barchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/piechart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/treemap.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/sankey.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/radarchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/scatterchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/areachart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/radialbarchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/composedchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/sunburstchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/shape/trapezoid.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/cartesian/funnel.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/chart/funnelchart.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/global.d.ts","./node_modules/.pnpm/decimal.js-light@2.5.1/node_modules/decimal.js-light/decimal.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/util/scale/getnicetickvalues.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/types.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/hooks.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/context/chartlayoutcontext.d.ts","./node_modules/.pnpm/recharts@3.1.0_@types+react@19.0.10_react-dom@19.0.0_react@19.0.0__react-is@18.3.1_react@19.0.0_redux@5.0.1/node_modules/recharts/types/index.d.ts","./ee/src/components/autoevalrundetails/components/evaluatormetircsspiderchart/index.tsx","./ee/src/components/autoevalrundetails/components/evaluatormetricschart/assets/barchart.tsx","./ee/src/components/autoevalrundetails/components/evaluatormetricschart/assets/histogramchart.tsx","./ee/src/components/autoevalrundetails/components/evaluatormetricschart/index.tsx","./ee/src/components/autoevalrundetails/components/evalrunoverviewviewer/index.tsx","./ee/src/components/autoevalrundetails/components/evalruntestcaseviewutilityoptions/index.tsx","./ee/src/components/autoevalrundetails/components/evalruntestcaseviewer/index.tsx","./ee/src/components/autoevalrundetails/index.tsx","./ee/src/components/banners/billingplanbanner/freeplanbanner.tsx","./ee/src/components/banners/billingplanbanner/freetrialbanner.tsx","./oss/src/components/enhanceduis/modal/index.tsx","./ee/src/components/deleteevaluationmodal/deleteevaluationmodal.tsx","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/duration.d.ts","./node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/relativetime.d.ts","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/debounce.d.ts","./ee/src/components/deploymenthistory/deploymenthistory.tsx","./ee/src/components/evalrundetails/components/modals/instructionmodal/index.tsx","./ee/src/components/evalrundetails/components/modals/instructionmodal/assets/instructionbutton.tsx","./ee/src/components/evalrundetails/components/modals/savedatamodal/assets/savedatamodalcontent.tsx","./ee/src/components/evalrundetails/components/modals/savedatamodal/index.tsx","./ee/src/components/evalrundetails/components/modals/savedatamodal/assets/savedatabutton.tsx","./ee/src/components/evalrundetails/components/evalrunbatchactions.tsx","./ee/src/components/evalrundetails/components/modals/renameevalmodal/assets/renameevalmodalcontent.tsx","./ee/src/components/evalrundetails/components/modals/renameevalmodal/index.tsx","./ee/src/components/evalrundetails/components/modals/renameevalmodal/assets/renameevalbutton.tsx","./ee/src/components/evalrundetails/components/evalrunname/index.tsx","./node_modules/.pnpm/@types+react-window@1.8.8/node_modules/@types/react-window/index.d.ts","./ee/src/components/evalrundetails/components/evalrunscenariocardtitle/index.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/assets/utils.tsx","./ee/src/lib/hooks/useevaluationrundata/useevalrunscenariodata.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/invocationinputs.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/invocationresponse.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/invocationrun.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/evalrunscenariocardbody.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/index.tsx","./ee/src/components/evalrundetails/components/annotatescenariobutton/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/annotate/assets/annotatecollapsecontent/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/annotate/index.tsx","./ee/src/components/evalrundetails/components/scenarioannotationpanel/index.tsx","./ee/src/components/evalrundetails/components/evalrunscenario/index.tsx","./ee/src/components/evalrundetails/components/scenarioloadingindicator/scenarioloadingindicator.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocards/evalrunscenariocards.tsx","./ee/src/components/evalrundetails/components/evalrunscenariofilters.tsx","./ee/src/components/evalrundetails/components/evalrunscenariosviewselector/index.tsx","./oss/src/components/appmessagecontext/index.tsx","./ee/src/components/evalrundetails/components/evalrunscenarionavigator.tsx","./ee/src/components/evalrundetails/components/singlescenarioviewer/index.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/virtualizedscenariotableannotatedrawer.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/index.tsx","./ee/src/components/evalrundetails/components/evalresultsview/evaluatormetricscard.tsx","./ee/src/components/evalrundetails/components/evalresultsview/index.tsx","./ee/src/components/evalrundetails/index.tsx","./ee/src/components/evalrundetails/components/evalrunscenariocard/assets/keyvalue.tsx","./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/metriccell/collapsedmetricscell.tsx","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/api/statetypes.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/types.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/commonoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/callbackoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/annotationsoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/api/initialstateoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/animationoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/backgroundoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/eventoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/legendoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/contextmenuoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/datasourceoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/axisoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/gradientlegendoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/localeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/dropshadowoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/labeloptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/tooltipoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/interpolationoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/markeroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/seriesoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/cartesianseriestooltipoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/areaoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/errorbaroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/baroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/boxplotoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/bubbleoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/ohlcbaseoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/candlestickoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/heatmapoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/histogramoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/lineoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/ohlcoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/rangeareaoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/rangebaroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/scatteroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/waterfalloptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/navigatoroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/icons.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/toolbaroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/zoomoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/chartoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/gauge/commonoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/gauge/lineargaugeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/gauge/radialgaugeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/bulletoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/crosslineoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/crosshairoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/conefunneloptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/funneloptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/cartesianseriestypes.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/cartesian/cartesianoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/flow-proportion/chordoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/flow-proportion/sankeyoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/flow-proportion/flowproportionoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/hierarchy/sunburstoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/hierarchy/treemapoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/hierarchy/hierarchyoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/donutoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/radialoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/radialcolumnoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/nightingaleoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/pieoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/polaraxisoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/radiusaxisoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/radaroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/radarareaoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/radarlineoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/radialbaroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/polar/polaroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/standalone/pyramidoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/standalone/standaloneoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/topology/maplinebackgroundoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/topology/maplineoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/topology/mapmarkeroptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/topology/mapshapebackgroundoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/topology/mapshapeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/series/topology/topologyoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chart/themeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/financial/pricevolumeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/financial/financialoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/gauge/gaugeoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/sparkline/sparklineoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/chartbuilderoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/api/agcharts.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/presets/presetoptions.d.ts","./node_modules/.pnpm/ag-charts-types@10.3.4/node_modules/ag-charts-types/dist/types/src/main.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ieventemitter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/irownode.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/agcolumngroup.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/agcolumn.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/agprovidedcolumngroup.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/brandedtype.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icolumn.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnapplystateservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/environment.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/eventtypes.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/modules/modulenames.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/propertykeys.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/numbersequence.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/serversidetransaction.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iserversidestore.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/rownode.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/irowmodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/validation/validationtypes.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/validation/rules/gridoptionsvalidations.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridoptionsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnmodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnsizeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/rowpositionutils.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/cellpositionutils.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/constants/direction.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/promise.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/context/genericbean.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/context/genericcontext.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ipopupcomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/popupcomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/tooltipcomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/component.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/draganddrop/draganddropimagecomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/draganddrop/draganddropservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/rowdragfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iafterguiattachedparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ifilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/floating/floatingfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/column/headercomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/columngroup/headergroupcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/iprovidedfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/isimplefilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/iscalarfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/date/idatefilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/datecomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cellrenderers/icellrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/groupcellrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iframeworkoverrides.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/agfieldparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icelleditorrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/irichcelleditorparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/isetfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rownodes/rownodesorter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/sortcontroller.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/advancedfiltermodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/selectionstate.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/gridstate.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/itoolpanel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/isidebar.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/istatuspanel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/common/headerposition.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ichartoptions.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icallbackparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/menuitem.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/overlays/overlaycomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/overlays/loadingoverlaycomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/overlays/norowsoverlaycomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/componenttypes.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/usercomponentfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/checkboxselectioncomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/dndsourcecomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/rowrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/gridbodyscrollfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/viewportsizefeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/rowcontainer/rowcontainerctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/row/rowctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/row/rowdragcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cell/cellctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/irangeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ichartservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/exportparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/changedpath.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/rowdatatransaction.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/rownodetransaction.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iclientsiderowmodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iclipboardservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icolumntoolpanel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ixmlfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iexcelcreator.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ifilterstoolpanel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rownodecache/rownodeblock.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rownodecache/irownodeblock.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icolumnvo.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iserversidedatasource.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iserversiderowmodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iserversideselection.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icolumnchooserfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/misc/menuservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/api/gridapi.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icommon.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/coldef.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/icolumnfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/events.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/autosizestrategy.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iadvancedfilterbuilderparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ialignedgrid.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/idatasource.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iviewportdatasource.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cellrenderers/loadingcellrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/datatype.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/gridoptions.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/eventservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/localeventservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/localeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/context/beanstub.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/alignedgridsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/api/iapifunction.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/api/apifunctionservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iinfiniterowmodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/api/rowmodelhelperservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/cellnavigationservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnautosizeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columndeffactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columneventdispatcher.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columngetstateservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columngroupstateservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnmoveservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnnameservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnviewportservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/controlscolservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/datatypeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/funccolsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/pivotresultcolsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/groupinstanceidcreator.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/visiblecolsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/agcomponentutils.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/componentmetadataprovider.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/frameworkcomponentwrapper.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/usercomponentregistry.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/ctrlsfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/abstractfakescrollcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/fakehscrollcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/fakevscrollcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/styling/layoutfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/gridbodyctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ifocusablecontainer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridcomp/gridctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/gridheaderctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/aria.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/column/resizefeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/column/headercellctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/focusservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/abstractcell/abstractheadercellctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/row/headerrowctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/row/headerrowcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/rowcontainer/headerrowcontainerctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/ctrlsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/draganddrop/dragservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/popupeditorwrapper.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/editservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/roweditservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/entities/rownodeeventthrottle.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/columnfilterservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/filtermanager.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/quickfilterservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/mouseeventservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/navigationservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/pinnedwidthservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/scrollvisibleservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/griddestroyservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/common/headernavigationservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/common/horizontalresizeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iadvancedfilterctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iadvancedfilterservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iaggfuncservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iautocolservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icontextmenufactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/icsvcreator.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/idetailgridapiservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iexpansionservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/imenufactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ipivotcoldefservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/irownodestage.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iselectionservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/ishowrowgroupcolsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/istatusbarservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/misc/animationframeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/misc/apieventservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/misc/resizeobserverservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/misc/state/stateservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/pagination/pageboundslistener.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/pagination/pageboundsservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/pagination/paginationautopagesizeservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/pagination/paginationservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/pinnedrowmodel/pinnedrowmodel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/ariaannouncementservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/autowidthcalculator.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/columnanimationservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/columnhoverservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/overlays/overlaywrappercomponent.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/overlays/overlayservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/row/rowcssclasscalculator.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/rowcontainerheightservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rownodecache/rownodeblockloader.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rownodes/selectableservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/styling/stylingservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/syncservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/undoredo/undoredoservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/validation/validationservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/valueservice/expressionservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/valueservice/valuecache.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/valueservice/valueservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/popupservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/context/context.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/context/bean.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnkeycreator.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/columns/columnutils.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/renderstatusservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/componentutil.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/emptybean.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/components/framework/unwrapusercomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/imultifilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/filterwrappercomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/filterlocaletext.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/providedfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agabstractlabel.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agabstractfield.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agabstractinputfield.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/aginputtextfield.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agcheckbox.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agradiobutton.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/aglist.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agpickerfield.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agselect.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/optionsfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/simplefilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/scalarfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/aginputnumberfield.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/number/numberfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/text/textfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/text/itextfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/number/inumberfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/date/datecompwrapper.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/date/datefilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/imodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/filtermodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/floating/provided/ifloatingfilterinputservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/simplefiltermodelformatter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/floating/provided/simplefloatingfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/floating/provided/textinputfloatingfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/provided/text/textfloatingfilter.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/abstractcell/abstractheadercellcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/floatingfilter/iheaderfiltercellcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/floatingfilter/headerfiltercellctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/floatingfilter/headerfiltercellcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/filter/floating/floatingfiltermapper.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/gridbodycomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridbodycomp/rowcontainer/rowcontainercomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/columndrag/bodydroptarget.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/columndrag/bodydroppivottarget.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/cssclassapplier.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/rowcontainer/headerrowcontainercomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/gridheadercomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/column/sortindicatorcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/columngroup/groupresizefeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/columngroup/headergroupcellctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/columndrag/movecolumnfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/headerrendering/cells/column/standardmenu.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iimmutableservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/misc/expansionservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/ilargetextcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/largetextcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/iselectcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/selectcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/itextcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/icelleditorinput.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/simplecelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/textcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/inumbercelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/numbercelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/idatecelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/aginputdatefield.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/datecelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/idatestringcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/datestringcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/celleditors/checkboxcelleditor.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/edit/editmodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cellrenderers/animateshowchangecellrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cellrenderers/animateslidecellrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/features/setleftfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/features/positionablefeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/tooltipstatemanager.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cell/cellcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cssclassmanager.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rendering/cellrenderers/checkboxcellrenderer.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/rownodecache/rownodeblockmodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/selection/rowrangeselectioncontext.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/agtogglebutton.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/aginputtextarea.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/managedfocusfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/tabguardctrl.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/tabguardfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/tabguardcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/touchlistener.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/masterdetail.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/autoscrollservice.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/vanillaframeworkoverrides.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/constants/keycode.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/grid.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/api/sharedapimodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/api/apimodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridoptionsutils.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridcomp/gridcomp.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/widgets/tooltipfeature.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iaggregationstage.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/iwatermark.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/array.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/browser.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/date.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/dom.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/event.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/function.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/icon.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/fuzzymatch.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/generic.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/keyboard.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/number.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/object.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/string.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/utils/focus.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/interfaces/isparklinecellrendererparams.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/modules/moduleregistry.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/gridcoremodule.d.ts","./node_modules/.pnpm/@ag-grid-community+core@32.3.4/node_modules/@ag-grid-community/core/dist/types/src/main.d.ts","./ee/src/components/pages/evaluations/cellrenderers/cellrenderers.tsx","./ee/src/components/pages/evaluations/evaluationerrorprops/evaluationerrormodal.tsx","./ee/src/components/pages/evaluations/evaluationerrorprops/evaluationerrortext.tsx","./ee/src/components/pages/evaluations/filtercolumns/filtercolumns.tsx","./ee/src/components/pages/evaluations/evaluationscenarios/evaluationscenarios.tsx","./ee/src/components/evalrundetailspage/index.tsx","./oss/src/components/secondarybutton/secondarybutton.tsx","./ee/src/components/evaluations/evaluationcardview/variantalphabet.tsx","./ee/src/components/evaluations/evaluationcardview/evaluationchatresponse.tsx","./ee/src/components/evaluations/evaluationcardview/evaluationvariantcard.tsx","./ee/src/components/evaluations/evaluationcardview/evaluationcard.tsx","./ee/src/components/evaluations/evaluationcardview/evaluationvotepanel.tsx","./ee/src/components/evaluations/evaluationcardview/index.tsx","./ee/src/components/evaluationtable/components/paramsformwithrun.tsx","./ee/src/components/evaluationtable/abtestingevaluationtable.tsx","./ee/src/components/savetestsetmodal/savetestsetmodal.tsx","./ee/src/components/evaluationtable/singlemodelevaluationtable.tsx","./ee/src/components/evaluations/evaluationerrormodal.tsx","./ee/src/components/evaluations/humanevaluationresult.tsx","./ee/src/components/evaluations/shareevaluationmodal.tsx","./ee/src/components/evaluations/evaluationcardview/evaluationinputs.tsx","./oss/src/components/variantdetailswithstatus/components/environmentstatus.tsx","./oss/src/components/variantdetailswithstatus/components/variantdetails.tsx","./oss/src/components/variantdetailswithstatus/index.tsx","./ee/src/components/humanevaluationmodal/humanevaluationmodal.tsx","./ee/src/components/humanevaluations/abtestingevaluation.tsx","./oss/src/components/avatar/avatar.tsx","./oss/src/components/ui/useravatartag.tsx","./ee/src/components/humanevaluations/assets/evaluationstatuscell.tsx","./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/chartaxis.tsx","./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/chartframe.tsx","./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/responsivefrequencychart.tsx","./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/responsivemetricchart.tsx","./ee/src/components/humanevaluations/assets/metricdetailspopover/index.tsx","./ee/src/components/pages/evaluations/evaluationerrorprops/evaluationerrorpopover.tsx","./ee/src/components/humanevaluations/assets/legacyevalresultcell.tsx","./ee/src/components/humanevaluations/assets/utils.tsx","./ee/src/components/pages/evaluations/newevaluation/assets/tablabel/index.tsx","./node_modules/.pnpm/monaco-editor@0.52.2/node_modules/monaco-editor/esm/vs/editor/editor.api.d.ts","./node_modules/.pnpm/@monaco-editor+loader@1.5.0/node_modules/@monaco-editor/loader/lib/types.d.ts","./node_modules/.pnpm/@monaco-editor+react@4.7.0_monaco-editor@0.52.2_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@monaco-editor/react/dist/index.d.ts","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/advancedsettings.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/messages.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/dynamicformfield.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/index.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/evaluators/deletemodal.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/evaluators/evaluatorcard.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/evaluators/evaluatorlist.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/evaluators/index.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/newevaluator/newevaluatorlist.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/newevaluator/index.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/evaluatorsmodal.tsx","./ee/src/components/pages/evaluations/newevaluation/components/selectevaluatorsection/selectevaluatorsection.tsx","./ee/src/components/pages/evaluations/newevaluation/components/selecttestsetsection.tsx","./ee/src/components/pages/evaluations/newevaluation/components/selectvariantsection.tsx","./ee/src/components/pages/evaluations/newevaluation/components/advancedsettings.tsx","./ee/src/components/pages/evaluations/newevaluation/components/newevaluationmodalcontent.tsx","./ee/src/components/pages/evaluations/newevaluation/index.tsx","./ee/src/components/humanevaluations/assets/singlemodelevaluationheader/index.tsx","./ee/src/components/humanevaluations/singlemodelevaluation.tsx","./ee/src/components/postsignupform/postsignupform.tsx","./ee/src/components/promptversioningdrawer/promptversioningdrawer.tsx","./ee/src/components/scripts/assets/cloudscripts.tsx","./ee/src/components/sidepanel/subscription.tsx","./ee/src/components/pages/app-management/components/apikeyinput.tsx","./ee/src/components/pages/app-management/components/demoapplicationssection.tsx","./node_modules/.pnpm/recharts@2.15.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/recharts/types/component/defaulttooltipcontent.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/fp/types.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/types.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/types.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/af.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ar.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ar-dz.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ar-eg.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ar-ma.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ar-sa.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ar-tn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/az.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/be.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/be-tarask.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/bg.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/bn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/bs.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ca.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ckb.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/cs.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/cy.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/da.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de-at.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/el.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-au.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-ca.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-gb.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-ie.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-in.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-nz.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-us.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-za.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/eo.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/es.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/et.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/eu.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fa-ir.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fi.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr-ca.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr-ch.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fy.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/gd.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/gl.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/gu.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/he.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/hi.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/hr.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ht.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/hu.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/hy.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/id.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/is.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it-ch.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ja.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ja-hira.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ka.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/kk.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/km.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/kn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ko.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/lb.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/lt.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/lv.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/mk.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/mn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ms.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/mt.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/nb.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/nl.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/nl-be.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/nn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/oc.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/pl.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/pt.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/pt-br.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ro.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ru.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/se.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/sk.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/sl.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/sq.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/sr.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/sr-latn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/sv.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ta.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/te.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/th.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/tr.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/ug.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/uk.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/uz.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/uz-cyrl.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/vi.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/zh-cn.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/zh-hk.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/zh-tw.d.ts","./node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale.d.mts","./node_modules/.pnpm/@tremor+react@3.18.7_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@tremor/react/dist/index.d.ts","./ee/src/components/pages/observability/dashboard/widgetcard.tsx","./ee/src/components/pages/app-management/components/observabilitydashboardsection.tsx","./ee/src/components/pages/evaluations/autoevaluation/assets/autoevaluationheader.tsx","./ee/src/components/pages/evaluations/autoevaluation/autoevaluation.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/evaluatortestcasemodal.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/evaluatorvariantmodal.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/configureevaluator/debugsection.tsx","./ee/src/components/pages/evaluations/autoevaluation/evaluatorsmodal/newevaluator/newevaluatorcard.tsx","./ee/src/components/pages/evaluations/autoevaluation/filters/searchfilter.tsx","./ee/src/components/pages/evaluations/cellrenderers/statusrenderer.tsx","./ee/src/components/pages/evaluations/evaluationcompare/evaluationcompare.tsx","./ee/src/components/pages/overview/automaticevaluation/automaticevaloverview.tsx","./ee/src/components/pages/overview/deployments/deploymentrevertmodal.tsx","./ee/src/components/pages/overview/deployments/historyconfig.tsx","./ee/src/components/pages/overview/deployments/deploymenthistorymodal.tsx","./ee/src/components/pages/overview/observability/observabilityoverview.tsx","./ee/src/components/pages/settings/billing/assets/usageprogressbar/index.tsx","./ee/src/components/pages/settings/billing/modals/autorenewalcancelmodal/assets/autorenewalcancelmodalcontent/index.tsx","./ee/src/components/pages/settings/billing/modals/autorenewalcancelmodal/index.tsx","./ee/src/components/pages/settings/billing/modals/pricingmodal/assets/pricingmodaltitle/index.tsx","./ee/src/components/pages/settings/billing/modals/pricingmodal/assets/pricingcard/index.tsx","./ee/src/components/pages/settings/billing/modals/pricingmodal/assets/pricingmodalcontent/index.tsx","./ee/src/components/pages/settings/billing/modals/pricingmodal/index.tsx","./ee/src/components/pages/settings/billing/modals/pricingmodal/assets/subscriptionplandetails/index.tsx","./ee/src/components/pages/settings/billing/index.tsx","./ee/src/lib/metriccolumnfactory.tsx","./ee/src/lib/hooks/useevaluationrundata/assets/atoms/examplemultiruncomponent.tsx","./node_modules/.pnpm/@ant-design+v5-patch-for-react-19@1.0.3_antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_rea_b55745d2bb5da47013d43142913a684d/node_modules/@ant-design/v5-patch-for-react-19/lib/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/.pnpm/next@15.3.4_@playwright+test@1.53.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/next/font/google/index.d.ts","./oss/src/pages/_app.tsx","./ee/src/pages/_app.tsx","./oss/src/pages/_document.tsx","./ee/src/pages/_document.tsx","./oss/src/pages/index.tsx","./ee/src/pages/index.tsx","./oss/src/pages/apps/index.tsx","./ee/src/pages/apps/index.tsx","./oss/src/pages/apps/[app_id]/deployments/index.tsx","./ee/src/pages/apps/[app_id]/deployments/index.tsx","./oss/src/pages/apps/[app_id]/endpoints/index.tsx","./ee/src/pages/apps/[app_id]/endpoints/index.tsx","./ee/src/pages/apps/[app_id]/evaluations/index.tsx","./ee/src/pages/apps/[app_id]/evaluations/human_a_b_testing/[evaluation_id]/index.tsx","./ee/src/pages/apps/[app_id]/evaluations/results/[evaluation_id]/index.tsx","./ee/src/pages/apps/[app_id]/evaluations/results/compare/index.tsx","./ee/src/pages/apps/[app_id]/evaluations/single_model_test/[evaluation_id]/index.tsx","./oss/src/pages/apps/[app_id]/overview/index.tsx","./ee/src/pages/apps/[app_id]/overview/index.tsx","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/spin/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/config-provider/sizecontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/button/button-group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/button/buttonhelpers.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/button/button.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/button/index.d.ts","./node_modules/.pnpm/use-animation-frame@0.2.1_react@19.0.0/node_modules/use-animation-frame/src/index.d.ts","./oss/src/components/playground/components/sharededitor/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/textcontrol/index.tsx","./node_modules/.pnpm/@lexical+utils@0.30.0/node_modules/@lexical/utils/markselection.d.ts","./node_modules/.pnpm/@lexical+utils@0.30.0/node_modules/@lexical/utils/mergeregister.d.ts","./node_modules/.pnpm/@lexical+utils@0.30.0/node_modules/@lexical/utils/positionnodeonrange.d.ts","./node_modules/.pnpm/@lexical+utils@0.30.0/node_modules/@lexical/utils/selectionalwaysondisplay.d.ts","./node_modules/.pnpm/@lexical+utils@0.30.0/node_modules/@lexical/utils/index.d.ts","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/playgroundvariantpropertycontrolwrapper.tsx","./oss/src/components/playground/components/drawers/testsetdrawer/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptmessagecontent/assets/promptmessagecontentoptions.tsx","./oss/src/components/playground/components/playgroundtool/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/booleancontrol/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/grouptab/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/minmaxcontrol/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/multiselectcontrol/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/playgroundoutputcontrol/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptmessagecontent/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/simpledropdownselect/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/simpleinput/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/helpers.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptimageupload/index.tsx","./oss/src/components/playground/components/promptmessageconfig/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationchatrow/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationoutputtext/index.tsx","./oss/src/components/playground/components/menus/playgroundgenerationvariablemenu/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationvariableoptions/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationcompletionrow/index.tsx","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisonchatoutput/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationcompletion/index.tsx","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisoncompletionoutput/index.tsx","./oss/src/components/playground/components/playgroundgenerationcomparisonview/index.tsx","./oss/src/components/playground/components/playgroundgenerationcomparisonview/assets/generationcomparisoninputheader/index..tsx","./oss/src/components/playground/components/playgroundgenerationcomparisonview/assets/generationcomparisonoutputheader/index.tsx","./oss/src/components/playground/components/modals/loadtestsetmodal/index.tsx","./oss/src/components/playground/components/modals/loadtestsetmodal/assets/loadtestsetbutton/index.tsx","./oss/src/components/playground/components/playgroundgenerationcomparisonview/generationcomparisonheader/index.tsx","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/usecombinedrefs.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/useevent.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/useisomorphiclayouteffect.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/useinterval.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/uselatestvalue.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/uselazymemo.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/usenoderef.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/useprevious.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/useuniqueid.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/hooks/index.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/adjustment.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/coordinates/types.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/coordinates/geteventcoordinates.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/coordinates/index.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/css.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/event/hasviewportrelativecoordinates.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/event/iskeyboardevent.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/event/istouchevent.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/event/index.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/execution-context/canusedom.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/execution-context/getownerdocument.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/execution-context/getwindow.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/execution-context/index.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/focus/findfirstfocusablenode.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/focus/index.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/type-guards/isdocument.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/type-guards/ishtmlelement.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/type-guards/isnode.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/type-guards/issvgelement.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/type-guards/iswindow.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/type-guards/index.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/types.d.ts","./node_modules/.pnpm/@dnd-kit+utilities@3.2.2_react@19.0.0/node_modules/@dnd-kit/utilities/dist/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/coordinates.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/direction.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/closestcenter.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/closestcorners.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/rectintersection.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/pointerwithin.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/helpers.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/algorithms/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/pointer/abstractpointersensor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/pointer/pointersensor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/pointer/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/usesensor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/usesensors.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/mouse/mousesensor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/mouse/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/touch/touchsensor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/touch/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/keyboard/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/keyboard/keyboardsensor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/keyboard/defaults.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/keyboard/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/sensors/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/events.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/other.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/react.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/rect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/types/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/useautoscroller.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usecachednode.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usesyntheticlisteners.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usecombineactivators.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usedroppablemeasuring.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/useinitialvalue.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/useinitialrect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/userect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/userectdelta.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/useresizeobserver.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usescrollableancestors.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usescrollintoviewifneeded.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usescrolloffsets.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usescrolloffsetsdelta.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usesensorsetup.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/userects.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usewindowrect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/usedragoverlaymeasuring.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/utilities/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/store/constructors.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/store/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/store/actions.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/store/context.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/store/reducer.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/store/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/accessibility/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/accessibility/accessibility.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/accessibility/components/restorefocus.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/accessibility/components/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/accessibility/defaults.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/accessibility/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/coordinates/constants.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/coordinates/distancebetweenpoints.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/coordinates/getrelativetransformorigin.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/coordinates/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/adjustscale.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/getrectdelta.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/rectadjustment.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/getrect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/getwindowclientrect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/rect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/rect/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/other/noop.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/other/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrollableancestors.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrollableelement.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrollcoordinates.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrolldirectionandspeed.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrollelementrect.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrolloffsets.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/getscrollposition.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/documentscrollingelement.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/isscrollable.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/scrollintoviewifneeded.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/scroll/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/utilities/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/modifiers/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/modifiers/applymodifiers.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/modifiers/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndcontext/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndcontext/dndcontext.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndcontext/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndmonitor/types.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndmonitor/context.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndmonitor/usedndmonitor.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndmonitor/usedndmonitorprovider.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dndmonitor/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/animationmanager/animationmanager.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/animationmanager/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/nullifiedcontextprovider/nullifiedcontextprovider.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/nullifiedcontextprovider/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/positionedoverlay/positionedoverlay.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/positionedoverlay/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/components/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/hooks/usedropanimation.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/hooks/usekey.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/hooks/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/dragoverlay.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/dragoverlay/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/components/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/usedraggable.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/usedndcontext.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/usedroppable.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/hooks/index.d.ts","./node_modules/.pnpm/@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@dnd-kit/core/dist/index.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/createsnapmodifier.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/restricttohorizontalaxis.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/restricttoparentelement.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/restricttofirstscrollableancestor.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/restricttoverticalaxis.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/restricttowindowedges.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/snapcentertocursor.d.ts","./node_modules/.pnpm/@dnd-kit+modifiers@9.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/modifiers/dist/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/types/disabled.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/types/data.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/types/strategies.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/types/type-guard.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/types/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/components/sortablecontext.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/components/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/hooks/types.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/hooks/usesortable.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/hooks/defaults.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/hooks/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/strategies/horizontallistsorting.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/strategies/rectsorting.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/strategies/rectswapping.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/strategies/verticallistsorting.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/strategies/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/sensors/keyboard/sortablekeyboardcoordinates.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/sensors/keyboard/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/sensors/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/arraymove.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/arrayswap.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/getsortedrects.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/isvalidindex.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/itemsequal.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/normalizedisabled.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/utilities/index.d.ts","./node_modules/.pnpm/@dnd-kit+sortable@10.0.0_@dnd-kit+core@6.3.1_react-dom@19.0.0_react@19.0.0__react@19.0.0__react@19.0.0/node_modules/@dnd-kit/sortable/dist/index.d.ts","./oss/src/components/playground/assets/version.tsx","./oss/src/components/playground/components/playgroundpromptcomparisonview/promptcomparisonvariantnavigation/assets/variantnavigationcard/index.tsx","./oss/src/components/playground/components/playgroundpromptcomparisonview/promptcomparisonvariantnavigation/index.tsx","./oss/src/components/playground/assets/addbutton.tsx","./oss/src/components/playground/components/playgroundvariantconfigprompt/assets/playgroundvariantconfigpromptcollapsecontent.tsx","./oss/src/components/playground/components/playgroundvariantmodelconfig/assets/modelconfigmodal.tsx","./oss/src/components/playground/components/playgroundvariantmodelconfig/assets/playgroundvariantmodelconfigtitle.tsx","./oss/src/components/playground/components/playgroundvariantmodelconfig/index.tsx","./oss/src/components/playground/components/playgroundvariantconfigprompt/assets/playgroundvariantconfigpromptcollapseheader.tsx","./oss/src/components/playground/components/playgroundvariantconfigprompt/index.tsx","./oss/src/components/playground/components/playgroundvariantcustomproperties/index.tsx","./oss/src/components/playground/components/modals/createvariantmodal/assets/createvariantmodalcontent/index.tsx","./oss/src/components/playground/components/modals/createvariantmodal/index.tsx","./oss/src/components/playground/components/modals/createvariantmodal/assets/newvariantbutton/index.tsx","./oss/src/components/playground/components/menus/selectvariant/assets/treeselectitemrenderer/index.tsx","./oss/src/components/playground/components/menus/selectvariant/index.tsx","./oss/src/components/playground/components/modals/commitvariantchangesmodal/assets/commitvariantchangesmodalcontent/index.tsx","./oss/src/components/playground/components/modals/commitvariantchangesmodal/index.tsx","./oss/src/components/playground/components/modals/commitvariantchangesmodal/assets/commitvariantchangesbutton/index.tsx","./oss/src/components/playground/components/modals/deployvariantmodal/assets/deployvariantmodalcontent/index.tsx","./oss/src/components/playground/components/modals/deployvariantmodal/index.tsx","./oss/src/components/playground/components/modals/deployvariantmodal/assets/deployvariantbutton/index.tsx","./oss/src/components/playground/components/modals/deletevariantmodal/index.tsx","./oss/src/components/playground/components/modals/deletevariantmodal/assets/deletevariantbutton/index.tsx","./oss/src/components/playground/components/menus/playgroundvariantheadermenu/index.tsx","./oss/src/components/playground/components/playgroundvariantconfig/assets/playgroundvariantconfigheader.tsx","./oss/src/components/playground/components/playgroundvariantconfig/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationchat/index.tsx","./oss/src/components/playground/components/playgroundgenerations/assets/generationheader/index.tsx","./oss/src/components/playground/components/playgroundgenerations/index.tsx","./oss/src/components/playground/components/mainlayout/index.tsx","./oss/src/components/playground/components/playgroundheader/index.tsx","./node_modules/.pnpm/swr-devtools@1.3.2_react@19.0.0_swr@2.3.3_react@19.0.0_/node_modules/swr-devtools/lib/createswrdevtools.d.ts","./node_modules/.pnpm/swr-devtools@1.3.2_react@19.0.0_swr@2.3.3_react@19.0.0_/node_modules/swr-devtools/lib/swrdevtools.d.ts","./node_modules/.pnpm/swr-devtools@1.3.2_react@19.0.0_swr@2.3.3_react@19.0.0_/node_modules/swr-devtools/lib/swr-cache.d.ts","./node_modules/.pnpm/swr-devtools@1.3.2_react@19.0.0_swr@2.3.3_react@19.0.0_/node_modules/swr-devtools/lib/index.d.ts","./oss/src/components/playground/playground.tsx","./oss/src/components/playgroundrouter/index.tsx","./ee/src/pages/apps/[app_id]/playground/index.tsx","./oss/src/pages/apps/[app_id]/traces/index.tsx","./ee/src/pages/apps/[app_id]/traces/index.tsx","./oss/src/pages/apps/[app_id]/variants/index.tsx","./ee/src/pages/apps/[app_id]/variants/index.tsx","./oss/src/components/protectedroute/protectedroute.tsx","./oss/src/pages/auth/[[...path]].tsx","./ee/src/pages/auth/[[...path]].tsx","./oss/src/pages/auth/callback/[[...callback]].tsx","./ee/src/pages/auth/callback/[[...callback]].tsx","./ee/src/pages/evaluations/share/index.tsx","./oss/src/pages/observability/index.tsx","./ee/src/pages/observability/index.tsx","./ee/src/pages/post-signup/index.tsx","./oss/src/pages/settings/index.tsx","./ee/src/pages/settings/index.tsx","./oss/src/pages/testsets/index.tsx","./ee/src/pages/testsets/index.tsx","./oss/src/pages/testsets/[testset_id]/index.tsx","./ee/src/pages/testsets/[testset_id]/index.tsx","./oss/src/pages/workspaces/accept.tsx","./ee/src/pages/workspaces/accept.tsx","./ee/src/services/billing/index.tsx","./oss/src/components/agcustomheader/agcustomheader.tsx","./oss/src/components/alertpopup/alertpopup.tsx","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/classes/semver.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/parse.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/valid.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/clean.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/inc.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/diff.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/major.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/minor.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/patch.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/prerelease.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/compare.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/rcompare.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/compare-loose.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/compare-build.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/sort.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/rsort.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/gt.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/lt.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/eq.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/neq.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/gte.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/lte.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/cmp.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/coerce.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/classes/comparator.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/classes/range.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/functions/satisfies.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/max-satisfying.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/min-satisfying.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/to-comparators.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/min-version.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/valid.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/outside.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/gtr.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/ltr.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/intersects.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/simplify.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/ranges/subset.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/internals/identifiers.d.ts","./node_modules/.pnpm/@types+semver@7.7.0/node_modules/@types/semver/index.d.ts","./oss/package.json","./oss/src/components/banners/oldappdeprecationbanner/index.tsx","./node_modules/.pnpm/@types+lodash@4.17.18/node_modules/@types/lodash/clonedeep.d.ts","./oss/src/components/copybutton/copybutton.tsx","./oss/src/components/layout/themecontextprovider.tsx","./oss/src/components/chatinputs/chatinputs.tsx","./oss/src/components/common/imagepreview.tsx","./node_modules/.pnpm/@types+diff@5.2.3/node_modules/@types/diff/index.d.ts","./node_modules/.pnpm/@types+diff@5.2.3/node_modules/@types/diff/index.d.mts","./oss/src/components/compareoutputdiff/compareoutputdiff.tsx","./oss/src/components/customworkflowbanner/index.tsx","./oss/src/components/environmenttaglabel/index.tsx","./oss/src/components/deploymentcard/index.tsx","./oss/src/components/variantscomponents/drawers/variantdrawer/assets/parameters/index.tsx","./oss/src/components/variantscomponents/drawers/variantdrawer/assets/variantdrawercontent/index.tsx","./oss/src/components/variantscomponents/drawers/variantdrawer/assets/variantdrawertitle/index.tsx","./oss/src/components/variantscomponents/drawers/variantdrawer/assets/deploymentdrawertitle/index.tsx","./oss/src/components/variantscomponents/drawers/variantdrawer/index.tsx","./oss/src/components/deploymentsdashboard/assets/useapicontent.tsx","./oss/src/components/deploymentsdashboard/assets/variantdetailsrenderer.tsx","./oss/src/components/deploymentsdashboard/components/drawer/index.tsx","./oss/src/components/deploymentsdashboard/components/modal/deploymentconfirmationmodal.tsx","./oss/src/components/deploymentsdashboard/components/modal/selectdeployvariantmodal.tsx","./oss/src/components/deploymentsdashboard/components/table/assets/getdeploymentcolumns.tsx","./oss/src/components/deploymentsdashboard/components/table/index.tsx","./oss/src/components/deploymentsdashboard/index.tsx","./oss/src/components/pages/overview/deployments/historyconfig.tsx","./oss/src/components/deploymentsdashboard/assets/deploymentdetails.tsx","./oss/src/components/draggabletabnode/draggabletabnode.tsx","./node_modules/.pnpm/@types+react-syntax-highlighter@15.5.13/node_modules/@types/react-syntax-highlighter/index.d.ts","./oss/src/components/dynamiccodeblock/codeblock.tsx","./oss/src/components/dynamiccodeblock/dynamiccodeblock.tsx","./node_modules/.pnpm/@lexical+markdown@0.30.0/node_modules/@lexical/markdown/markdowntransformers.d.ts","./node_modules/.pnpm/@lexical+markdown@0.30.0/node_modules/@lexical/markdown/markdownshortcuts.d.ts","./node_modules/.pnpm/@lexical+markdown@0.30.0/node_modules/@lexical/markdown/index.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalcomposercontext.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalautofocusplugin.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/shared/lexicalcontenteditableelement.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalcontenteditable.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalerrorboundary.d.ts","./node_modules/.pnpm/@lexical+history@0.30.0/node_modules/@lexical/history/index.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalhistoryplugin.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalonchangeplugin.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/shared/usedecorators.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicalrichtextplugin.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicaltabindentationplugin.d.ts","./node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/lucide-react.d.ts","./oss/src/components/editor/plugins/toolbar/toolbarplugin.tsx","./node_modules/.pnpm/@lexical+devtools-core@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@lexical/devtools-core/uselexicalcommandslog.d.ts","./node_modules/.pnpm/@lexical+devtools-core@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@lexical/devtools-core/generatecontent.d.ts","./node_modules/.pnpm/@lexical+devtools-core@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@lexical/devtools-core/treeview.d.ts","./node_modules/.pnpm/@lexical+devtools-core@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@lexical/devtools-core/index.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/lexicaltreeview.d.ts","./oss/src/components/editor/plugins/debug/debugplugin.tsx","./oss/src/components/editor/plugins/singleline/singlelineplugin.tsx","./oss/src/components/editor/plugins/code/plugins/autoclosebracketsplugin.tsx","./oss/src/components/editor/plugins/code/plugins/autoformatandvalidateonpasteplugin.tsx","./oss/src/components/editor/plugins/code/plugins/codeblockfoldingplugin.tsx","./oss/src/components/editor/plugins/code/plugins/emptynodetransformplugin.tsx","./oss/src/components/editor/plugins/code/plugins/horizontalnavigationplugin.tsx","./oss/src/components/editor/plugins/code/plugins/indentationplugin.tsx","./oss/src/components/editor/plugins/code/plugins/realtimevalidationplugin.tsx","./oss/src/components/editor/plugins/code/plugins/syntaxhighlightplugin.tsx","./oss/src/components/editor/plugins/code/plugins/verticalnavigationplugin.tsx","./oss/src/components/editor/plugins/code/index.tsx","./node_modules/.pnpm/@lexical+text@0.30.0/node_modules/@lexical/text/canshowplaceholder.d.ts","./node_modules/.pnpm/@lexical+text@0.30.0/node_modules/@lexical/text/findtextintersectionfromcharacters.d.ts","./node_modules/.pnpm/@lexical+text@0.30.0/node_modules/@lexical/text/isroottextcontentempty.d.ts","./node_modules/.pnpm/@lexical+text@0.30.0/node_modules/@lexical/text/registerlexicaltextentity.d.ts","./node_modules/.pnpm/@lexical+text@0.30.0/node_modules/@lexical/text/roottextcontent.d.ts","./node_modules/.pnpm/@lexical+text@0.30.0/node_modules/@lexical/text/index.d.ts","./node_modules/.pnpm/@lexical+react@0.30.0_react-dom@19.0.0_react@19.0.0__react@19.0.0_yjs@13.6.24/node_modules/@lexical/react/uselexicaltextentity.d.ts","./oss/src/components/editor/plugins/token/tokenplugin.tsx","./oss/src/components/editor/plugins/index.tsx","./oss/src/components/editor/editor.tsx","./oss/src/components/editor/plugins/code/components/codeblockerroricon.tsx","./oss/src/components/editor/state/index.tsx","./oss/src/components/emptycomponent/index.tsx","./oss/src/components/enhanceduis/drawer/index.tsx","./node_modules/.pnpm/@types+react-resizable@3.0.8/node_modules/@types/react-resizable/index.d.ts","./oss/src/components/enhanceduis/table/assets/customcells.tsx","./oss/src/components/enhanceduis/table/index.tsx","./oss/src/components/ui/customantdbadge.tsx","./oss/src/components/filters/filters.tsx","./oss/src/components/filters/sort.tsx","./oss/src/components/filters/editcolumns/index.tsx","./oss/src/components/genericdrawer/index.tsx","./oss/src/components/llmicons/assets/alephalpha.tsx","./oss/src/components/llmicons/assets/anthropic.tsx","./oss/src/components/llmicons/assets/anyscale.tsx","./oss/src/components/llmicons/assets/azure.tsx","./oss/src/components/llmicons/assets/bedrock.tsx","./oss/src/components/llmicons/assets/cerebus.tsx","./oss/src/components/llmicons/assets/deepinfra.tsx","./oss/src/components/llmicons/assets/fireworks.tsx","./oss/src/components/llmicons/assets/gemini.tsx","./oss/src/components/llmicons/assets/groq.tsx","./oss/src/components/llmicons/assets/lepton.tsx","./oss/src/components/llmicons/assets/mistral.tsx","./oss/src/components/llmicons/assets/openai.tsx","./oss/src/components/llmicons/assets/openrouter.tsx","./oss/src/components/llmicons/assets/perplexity.tsx","./oss/src/components/llmicons/assets/replicate.tsx","./oss/src/components/llmicons/assets/sagemaker.tsx","./oss/src/components/llmicons/assets/together.tsx","./oss/src/components/llmicons/assets/vertex.tsx","./oss/src/components/llmicons/assets/xai.tsx","./oss/src/components/llmicons/index.tsx","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/declarations/src/types.d.ts","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/declarations/src/errorboundarycontext.d.ts","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/declarations/src/errorboundary.d.ts","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/declarations/src/useerrorboundary.d.ts","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/declarations/src/witherrorboundary.d.ts","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/declarations/src/index.d.ts","./node_modules/.pnpm/react-error-boundary@4.1.2_react@19.0.0/node_modules/react-error-boundary/dist/react-error-boundary.cjs.d.mts","./oss/src/components/layout/errorfallback.tsx","./oss/src/components/pages/app-management/modals/customworkflowmodal/components/customworkflowmodalfooter.tsx","./oss/src/components/pages/app-management/modals/customworkflowmodal/index.tsx","./oss/src/components/pages/app-management/modals/customworkflowmodal/hooks/usecustomworkflowconfig.tsx","./oss/src/components/layout/assets/breadcrumbs.tsx","./oss/src/components/sidebar/components/sidebarmenu.tsx","./oss/src/components/sidebar/hooks/usedropdownitems/index.tsx","./oss/src/components/sidebar/hooks/usesidebarconfig/index.tsx","./oss/src/components/sidebar/settingssidebar.tsx","./oss/src/components/sidebar/sidebar.tsx","./oss/src/components/layout/layout.tsx","./oss/src/components/logo/logo.tsx","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/warning.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/type.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/responsiveobserver.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/grid/col.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/formiteminput.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/presetcolors.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/seeds.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/maps/colors.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/maps/font.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/maps/size.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/maps/style.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/maps/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/alias.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/themes/shared/genfontsizes.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/themes/default/theme.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/usetoken.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/util/genstyleutils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/util/genpresetcolor.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/util/usereseticonstyle.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/internal.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/wave/style.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/affix/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/alert/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/anchor/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/app/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/avatar/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/back-top/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/badge/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/breadcrumb/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/button/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/button/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/select/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/style/roundedarrow.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/style/panel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/calendar/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/card/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/carousel/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/cascader/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/checkbox/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/collapse/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/color-picker/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/descriptions/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/divider/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/drawer/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/style/placementarrow.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/dropdown/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/empty/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/flex/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/grid/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/image/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input-number/style/token.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input-number/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/layout/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/list/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/mentions/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/message/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/notification/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/pagination/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/popconfirm/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/popover/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/progress/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/qr-code/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/radio/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/rate/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/result/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/segmented/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/select/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/slider/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/space/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/spin/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/statistic/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/steps/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/switch/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tabs/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tag/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/timeline/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tooltip/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tour/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tree/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tree-select/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/upload/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/splitter/style/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/components.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/cssinjs-utils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/interface/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/colors.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/getrenderpropvalue.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/placements.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tooltip/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tooltip/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/formitemlabel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/hooks/useformitemstatus.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/formitem/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/statusutils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/time-picker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/generatepicker/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/generatepicker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/empty/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/locale.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/motion.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/select/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/pagination/pagination.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/popconfirm/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/popconfirm/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/checkbox/checkbox.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/checkbox/groupcontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/checkbox/group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/checkbox/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/layout/sider.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/menucontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/menu.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/menudivider.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/menuitem.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/submenu.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/menu/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/dropdown/dropdown.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/dropdown/dropdown-button.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/dropdown/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/pagination/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/hooks/useselection.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/internaltable.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tour/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/listbody.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/list.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/operation.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/search.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/transfer/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/progress/progress.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/progress/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/upload/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/locale/uselocale.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/locale/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/wave/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/aria-data-attrs.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/hooks/useclosable.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/alert/alert.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/alert/errorboundary.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/alert/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/badge/ribbon.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/badge/scrollnumber.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/badge/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tabs/tabpane.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tabs/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/card/card.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/card/grid.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/card/meta.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/card/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/cascader/panel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/cascader/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/collapse/collapsepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/collapse/collapse.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/collapse/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/descriptions/descriptionscontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/descriptions/item.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/descriptions/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/drawer/drawerpanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/drawer/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/flex/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/input.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/otp/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/password.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/search.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/textarea.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/input-number/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/grid/row.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/_util/throttlebyanimationframe.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/affix/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/anchor/anchorlink.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/anchor/anchor.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/anchor/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/message/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/confirm.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/usemodal/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/notification/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/app/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/app/app.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/app/useapp.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/app/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/auto-complete/autocomplete.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/auto-complete/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/avatar/avatarcontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/avatar/avatar.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/popover/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/popover/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/avatar/avatargroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/avatar/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/back-top/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/breadcrumb/breadcrumbitem.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/breadcrumb/breadcrumb.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/breadcrumb/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/date-picker/locale/en_us.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/calendar/locale/en_us.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/calendar/generatecalendar.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/calendar/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/carousel/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/col/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/color-picker/color.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/color-picker/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/color-picker/colorpicker.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/color-picker/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/divider/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/flex/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/backtop.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/floatbuttongroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/floatbutton.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/float-button/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/errorlist.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/formlist.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/hooks/useform.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/hooks/useforminstance.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/image/previewgroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/image/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/layout/layout.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/layout/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/mentions/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/message/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/message/usemessage.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/message/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/modal.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/modal/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/notification/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/notification/usenotification.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/notification/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/qr-code/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/qr-code/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/radio/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/radio/group.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/radio/radio.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/radio/radiobutton.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/radio/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/rate/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/result/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/row/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/segmented/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/element.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/avatar.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/button.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/image.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/input.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/node.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/paragraph.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/title.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/skeleton.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/skeleton/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/slider/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/space/compact.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/space/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/space/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/statistic/utils.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/statistic/statistic.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/statistic/countdown.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/statistic/timer.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/statistic/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/steps/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/switch/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/column.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/columngroup.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/table.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/table/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tag/checkabletag.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tag/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/themes/default/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/theme/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/timeline/timelineitem.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/timeline/timeline.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/timeline/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tour/purepanel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tour/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tree/tree.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tree/directorytree.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tree/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/tree-select/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/typography.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/base/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/link.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/paragraph.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/text.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/title.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/typography/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/upload/upload.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/upload/dragger.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/upload/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/version/version.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/version/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/watermark/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/splitter/interface.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/splitter/panel.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/splitter/splitter.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/splitter/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/config-provider/unstablecontext.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/grid/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/list/item.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/list/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/list/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/config-provider/defaultrenderempty.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/config-provider/context.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/config-provider/hooks/useconfig.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/config-provider/index.d.ts","./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/lib/form/form.d.ts","./oss/src/components/modelregistry/assets/labelinput/index.tsx","./oss/src/components/modelregistry/drawers/configureproviderdrawer/assets/modelnameinput.tsx","./oss/src/components/modelregistry/drawers/configureproviderdrawer/assets/configureproviderdrawercontent.tsx","./oss/src/components/modelregistry/drawers/configureproviderdrawer/assets/configureproviderdrawertitle.tsx","./oss/src/components/modelregistry/drawers/configureproviderdrawer/index.tsx","./oss/src/components/modelregistry/modals/configureprovidermodal/assets/configureprovidermodalcontent.tsx","./oss/src/components/modelregistry/modals/configureprovidermodal/index.tsx","./oss/src/components/modelregistry/modals/deleteprovidermodal/assets/deleteprovidermodalcontent.tsx","./oss/src/components/modelregistry/modals/deleteprovidermodal/index.tsx","./oss/src/components/nomobilepagewrapper/nomobilepagewrapper.tsx","./oss/src/components/noresultsfound/noresultsfound.tsx","./oss/src/components/nossrwrapper/nossrwrapper.tsx","./oss/src/components/paramsform/index.tsx","./oss/src/components/playground/components/menus/playgroundcreatenewvariant/assets/createnewvariantlist.tsx","./oss/src/components/playground/components/menus/playgroundcreatenewvariant/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/compoundcontrol/index.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptimageupload/assets/components/imagewithfallback.tsx","./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptmessageuserselect/index.tsx","./oss/src/components/playground/assets/commitnote.tsx","./oss/src/components/playground/assets/deploybutton.tsx","./oss/src/components/playground/assets/deploymenttag.tsx","./oss/src/components/playground/hooks/usedelaychildren/index.tsx","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/assets/generationfocusdrawerheader/index.tsx","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/assets/generationoutputnavigator/index.tsx","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/index.tsx","./oss/src/components/playground/v2/components/drawers/generationfocusdrawer/assets/generationfocusdrawerbutton/index.tsx","./oss/src/components/playground/v2/components/drawers/promptcomparisonfocusdrawer/index.tsx","./oss/src/components/playground/v2/components/drawers/promptcomparisonfocusdrawer/assets/promptcomparisonfocusbutton/index.tsx","./oss/src/components/playground/v2/components/drawers/promptfocusdrawer/assets/promptfocusdrawerheader/index.tsx","./oss/src/components/playground/v2/components/drawers/promptfocusdrawer/index.tsx","./oss/src/components/playground/v2/components/drawers/promptfocusdrawer/assets/promptfocusbutton/index.tsx","./oss/src/components/playground/v2/components/menus/playgroundprompttoolmenu/index.tsx","./oss/src/components/playground/v2/components/menus/playgroundvarianthistoryheadermenu/index.tsx","./oss/src/components/playground/v2/components/modals/variantrenamemodal/index.tsx","./oss/src/components/playground/v2/components/modals/variantresetchangesmodal/index.tsx","./oss/src/components/playground/v2/components/playgroundprompttool/assets/playgroundprompttoolsoptions.tsx","./oss/src/components/playground/v2/components/playgroundprompttool/index.tsx","./oss/src/components/playground/v2/components/playgroundprompttools/index.tsx","./oss/src/components/playground/v2/components/playgroundprompttoolsconfig/index.tsx","./oss/src/components/playground/v2/components/playgroundvarianthistory/assets/playgroundvarianthistoryheader.tsx","./oss/src/components/playground/v2/components/playgroundvarianthistory/index.tsx","./oss/src/components/resizabletitle/index.tsx","./oss/src/components/resultcomponent/resultcomponent.tsx","./oss/src/components/resulttag/resulttag.tsx","./oss/src/components/scripts/globalscripts.tsx","./oss/src/components/selectllmprovider/index.tsx","./oss/src/components/spinner/contentspinner.tsx","./oss/src/components/testsettable/editrowmodal.tsx","./oss/src/components/testsettable/inserttestsetnamemodal.tsx","./oss/src/components/testsettable/tablecellsrenderer.tsx","./oss/src/components/testsettable/testsettable.tsx","./oss/src/components/testsettable/tableheadercomponent.tsx","./oss/src/components/tooltipwithcopyaction/index.tsx","./oss/src/components/truncatedtooltiptag/index.tsx","./oss/src/components/variantscomponents/dropdown/variantdropdown/index.tsx","./oss/src/components/variantscomponents/table/assets/getvariantcolumns.tsx","./oss/src/components/variantscomponents/table/index.tsx","./oss/src/components/variantscomponents/modals/variantcomparisonmodal/index.tsx","./oss/src/components/variantscomponents/index.tsx","./oss/src/components/variantscomponents/dropdown/variantdrawertitlemenu/index.tsx","./oss/src/components/pages/app-management/components/appcard.tsx","./oss/src/components/pages/app-management/components/apptable.tsx","./oss/src/components/pages/app-management/components/emptyappview.tsx","./oss/src/components/pages/app-management/components/applicationmanagementsection.tsx","./oss/src/components/pages/app-management/components/getstartedsection.tsx","./oss/src/components/pages/app-management/components/helpandsupportsection.tsx","./oss/src/components/pages/app-management/index.tsx","./oss/src/components/pages/app-management/drawers/customworkflowhistory/components/configurationtable.tsx","./oss/src/components/pages/app-management/drawers/customworkflowhistory/components/configurationview.tsx","./oss/src/components/pages/app-management/drawers/customworkflowhistory/index.tsx","./oss/src/components/pages/app-management/modals/customappcreationloader.tsx","./oss/src/components/pages/app-management/modals/createappstatusmodal.tsx","./oss/src/components/pages/app-management/modals/deleteappmodal.tsx","./oss/src/components/pages/app-management/modals/editappmodal.tsx","./oss/src/components/pages/app-management/modals/maxappmodal.tsx","./oss/src/components/pages/app-management/modals/setuptracingmodal.tsx","./oss/src/components/pages/app-management/modals/addappfromtemplatemodal/index.tsx","./oss/src/components/pages/auth/assets/showerrormessage.tsx","./oss/src/components/pages/auth/emailpasswordauth/index.tsx","./oss/src/components/pages/auth/passwordlessauth/index.tsx","./oss/src/components/pages/auth/sendotp/index.tsx","./oss/src/components/pages/auth/sidebanner/index.tsx","./oss/src/components/pages/auth/socialauth/index.tsx","./oss/src/components/pages/observability/components/statusrenderer.tsx","./oss/src/components/pages/observability/assets/getobservabilitycolumns.tsx","./oss/src/components/pages/observability/components/accordiontreepanel.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/selectevaluators/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/createevaluator/assets/createnewmetric/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/createevaluator/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/annotatedrawertitle/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/index.tsx","./oss/src/components/pages/observability/drawer/annotatedrawer/assets/annotatedrawerbutton/index.tsx","./oss/src/components/pages/observability/drawer/tracesidepanel/traceannotations/components/notraceannotations.tsx","./oss/src/components/pages/observability/drawer/tracecontent/components/annotationtabitem/assets/getannotationtablecolumns.tsx","./oss/src/components/pages/observability/drawer/tracecontent/components/annotationtabitem/index.tsx","./oss/src/components/pages/observability/drawer/tracecontent/components/overviewtabitem/index.tsx","./oss/src/components/pages/observability/drawer/testsetdrawer/testsetdrawer.tsx","./oss/src/components/pages/observability/drawer/tracecontent/index.tsx","./oss/src/components/pages/observability/components/deletetracemodal.tsx","./oss/src/components/pages/observability/drawer/traceheader/index.tsx","./oss/src/components/pages/observability/drawer/tracesidepanel/traceannotations/index.tsx","./oss/src/components/pages/observability/components/avatartreecontent.tsx","./oss/src/components/pages/observability/drawer/tracesidepanel/tracedetails/index.tsx","./oss/src/components/pages/observability/drawer/tracesidepanel/index.tsx","./oss/src/components/pages/observability/drawer/tracetreesettings/index.tsx","./oss/src/components/pages/observability/drawer/tracetree/index.tsx","./oss/src/components/pages/observability/assets/observabilityheader/index.tsx","./oss/src/components/pages/observability/assets/emptyobservability/index.tsx","./oss/src/components/pages/observability/observabilitydashboard.tsx","./oss/src/components/pages/overview/deployments/deploymentmodal.tsx","./oss/src/components/pages/overview/deployments/changevariantmodal.tsx","./oss/src/components/pages/overview/deployments/deploymentoverview.tsx","./oss/src/components/pages/overview/deployments/deploymentdrawer/assets/languagecodeblock.tsx","./oss/src/components/pages/overview/deployments/deploymentdrawer/index.tsx","./oss/src/components/pages/overview/variants/variantpopover.tsx","./oss/src/components/pages/overview/variants/variantsoverview.tsx","./oss/src/components/pages/settings/apikeys/apikeys.tsx","./oss/src/components/pages/settings/secrets/secretprovidertable/index.tsx","./oss/src/components/pages/settings/secrets/secrets.tsx","./oss/src/components/pages/settings/workspacemanage/assets/avatarwithlabel.tsx","./oss/src/components/pages/settings/workspacemanage/cellrenderers.tsx","./oss/src/components/pages/settings/workspacemanage/modals/inviteduserlinkmodal.tsx","./oss/src/components/pages/settings/workspacemanage/modals/inviteusersmodal.tsx","./oss/src/components/pages/settings/workspacemanage/workspacemanage.tsx","./oss/src/components/pages/settings/workspacemanage/modals/generateresetlinkmodal.tsx","./oss/src/components/pages/settings/workspacemanage/modals/passwordresetlinkmodal.tsx","./oss/src/components/pages/testset/modals/createtestset.tsx","./oss/src/components/pages/testset/modals/createtestsetfromapi.tsx","./oss/src/components/pages/testset/modals/createtestsetfromscratch.tsx","./oss/src/components/pages/testset/modals/deletetestset.tsx","./oss/src/components/pages/testset/modals/uploadtestset.tsx","./oss/src/components/pages/testset/modals/index.tsx","./oss/src/components/ui/customantdtag.tsx","./oss/src/components/ui/labelvaluepill.tsx","./oss/src/components/ui/customtreecomponent/index.tsx","./oss/src/contexts/org.context.tsx","./oss/src/contexts/project.context.tsx","./oss/src/contexts/app.context.tsx","./oss/src/contexts/observability.context.tsx","./oss/src/lib/api/swrconfig.tsx","./node_modules/.pnpm/@ag-grid-community+react@32.3.4_@ag-grid-community+core@32.3.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ag-grid-community/react/dist/types/src/shared/interfaces.d.ts","./node_modules/.pnpm/@ag-grid-community+react@32.3.4_@ag-grid-community+core@32.3.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ag-grid-community/react/dist/types/src/aggridreact.d.ts","./node_modules/.pnpm/@ag-grid-community+react@32.3.4_@ag-grid-community+core@32.3.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ag-grid-community/react/dist/types/src/shared/customcomp/interfaces.d.ts","./node_modules/.pnpm/@ag-grid-community+react@32.3.4_@ag-grid-community+core@32.3.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ag-grid-community/react/dist/types/src/shared/customcomp/util.d.ts","./node_modules/.pnpm/@ag-grid-community+react@32.3.4_@ag-grid-community+core@32.3.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ag-grid-community/react/dist/types/src/shared/customcomp/customcontext.d.ts","./node_modules/.pnpm/@ag-grid-community+react@32.3.4_@ag-grid-community+core@32.3.4_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/@ag-grid-community/react/dist/types/src/index.d.ts","./node_modules/.pnpm/@ag-grid-community+client-side-row-model@32.3.4/node_modules/@ag-grid-community/client-side-row-model/dist/types/src/clientsiderowmodelmodule.d.ts","./node_modules/.pnpm/@ag-grid-community+client-side-row-model@32.3.4/node_modules/@ag-grid-community/client-side-row-model/dist/types/src/main.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/gridserializer.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/interfaces/index.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/basecreator.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/sessions/basegridserializingsession.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/sessions/csvserializingsession.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/csvcreator.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexportmodule.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/downloader.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/xmlfactory.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/csvexport/zipcontainer/zipcontainer.d.ts","./node_modules/.pnpm/@ag-grid-community+csv-export@32.3.4/node_modules/@ag-grid-community/csv-export/dist/types/src/main.d.ts","./oss/src/lib/helpers/aggrid.tsx","./oss/src/lib/helpers/analytics/agposthogprovider.tsx","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/components/supertokenswrapper.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/translation/translationcontext.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/usercontext/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/lib/build/index.d.ts","./node_modules/.pnpm/supertokens-auth-react@0.47.1_react-dom@19.0.0_react@19.0.0__react@19.0.0_supertokens-web-js@0.13.1/node_modules/supertokens-auth-react/index.d.ts","./oss/src/lib/helpers/auth/authprovider.tsx","./oss/src/lib/hooks/usefetchevaluatorsdata/index.tsx","./oss/src/lib/noop/index.tsx","./oss/src/pages/apps/[app_id]/playground/index.tsx","./oss/src/services/deployment/hooks/useenvironments/index.tsx"],"fileIdsList":[[97,140,473,474],[97,140,162,1237],[97,140],[83,97,140,1046,4417],[83,97,140,1046,1278,4417,4420,5879,5880],[83,97,140,457,1046,1278,4417,4420,5880,5882],[83,97,140,1264,1278,5883,5982,5985],[83,97,140,5987],[83,97,140,880,1046,4417],[83,97,140,1046,1263,1265,1278],[83,97,140,1046,4420,5981],[83,97,140,5981],[83,97,140],[83,97,140,1046,4420,5983,5984],[97,140,1263,1278,4420,5878,5881,5986,5988],[83,97,140,457,1046],[97,140,457,1046],[97,140,1046,1266,5269,5992],[97,140,1046],[83,97,140,688,1046,5281,5306,5994,5995,5996],[97,140,1351,1352,1353],[97,140,1354,1356],[97,140,1351],[97,140,1267,1278,1299,1343,1345,1351],[83,97,140,1046,1278,1345,1354,1357,1360],[83,97,140,1046,1267,1278,1299],[83,97,140,1267,1278,1299,6031],[83,97,140,1278,1343,1351,1358,4418,5388,5999,6002],[83,97,140,1046,1359,6006],[83,97,140,1362,4420,6016,6020],[97,140,1361],[83,97,140,1046,1361],[83,97,140,1046,1278,1299,1343,1351,6010,6014],[83,97,140,1046,1267,1278,1299,1361,4419,6009,6015],[83,97,140,4423,6011],[83,97,140,1046,1361,4419,4422],[83,97,140,1361,6012,6013],[83,97,140,1046],[83,97,140,1046,1278,1351,1364,4420,5275,6008,6021,6022],[83,97,140,1046,1363,4431],[83,97,140,1046,1278,1343,1345,1351],[83,97,140,457,1046,1278,1299,1357,4420,4431,5269,6026],[83,97,140,1046,1278,1299,1345,4420,4430],[83,97,140,1046,1278,1365,5277],[83,97,140,433,4417,5998],[97,140,457,1046,1047,4417],[83,97,140,433,1047,5269,6005],[97,140,1046,1047],[83,97,140,1046,1047,1156,1343,6004],[83,97,140,433,1048,4417,6001],[83,97,140,1046,1048],[83,97,140,433,1046,1048,6000],[83,97,140,1046,1278,1299,1343,1351,1366,4418],[83,97,140,433,1046,1267,1278,1299,1343,1351,1367,4419,4420,6017,6019],[83,97,140,1046,1278,1368],[83,97,140,457,1046,1278,1299,1369,4420,5277,6016,6020,6022,6027],[83,97,140,1046,1278,1299,1343,1351,4419,4428],[83,97,140,433,1046,1278,1299,1343,1351,4417,4420,4422,4423,4427],[97,140,1370,1371,1385],[83,97,140,1046,4428],[83,97,140,1370,1371,4428,4429,4432],[83,97,140,1267,1278,1299,4428,4434],[83,97,140,1278,4428],[83,97,140,1046,1278,4428,4434],[83,97,140,4428,4431],[97,140,880,1370,1371,4428,4429,4432,4433,5269,5270,5271,5272,5273],[83,97,140,1046,1278,4420,6020],[83,97,140,1267,1278,1299,1385,1386,5274,5275],[83,97,140,433,880,1046,1278,1370,5275,5276,6029],[83,97,140,433,1278,1359,5878,6003,6007,6023,6024,6025,6028,6030,6032],[97,140,1278],[83,97,140,457,1278,5277],[83,97,140,457,1046,1278,1343,4420,5278,5989,6464],[97,140,5281],[97,140,5281,6468,6469],[97,140,1046,1334,5281,5283,6467],[97,140,1046,5281],[97,140,445,1046,5281,5283],[97,140,1046,5269,5281,5283],[83,97,140,1046,1050,5269,5275,5283,5996,6470,6471],[97,140,1046,5281,5283],[97,140,166,457,1046,5281],[83,97,140,457,880,1046,1049,5282,5283,5996,6466,6467,6471,6472,6473],[97,140,1046,1049,5269,5282],[83,97,140,457,880,1046,1049,5282,5996,6471,6472,6473,6475],[83,97,140,433,457,1046,1051,4417,5284,5839,6483],[83,97,140,457,880,1046,4417,5269,5281,6483],[83,97,140,1046,1156,6460,6496],[83,97,140,1046,6494],[83,97,140,5289],[83,97,140,5275],[83,97,140,5288,6489,6490],[83,97,140,5287,5289,6489,6490],[97,140,5287],[83,97,140,1046,1267,1278,1299,4420,5287,5289,6491,6492],[83,97,140,433,1046,1156,4417,4420,5285,5286,6496,6517],[83,97,140,457,880,1046,4417,5269,5285,5289,5410,6483,6487,6488,6493,6495],[83,97,140,457,880,4420,5285,5286,6496,6518],[97,140,445,1046,5281],[83,97,140,1046,5281,5322,6626,6627],[83,97,140,433,457,880,1046,1278,4417,5297,5298,6460,6511,6517],[97,140,880],[83,97,140,457,880,1046,6629],[97,140,1046,5269,5281,6500],[83,97,140,1046,4417,5269,5281,5312,5558,6500,6631,6632],[97,140,447,953,1046,5269,5281,6500,6502],[83,97,140,880,1046,4417,5269,5295,5296],[83,97,140,1046,4417,5269,5281],[83,97,140,433,1046,4417,5269,5281,6501,6503],[83,97,140,1046,5269,5281,5839,6500],[83,97,140,1046,5269,5281],[83,97,140,1046,1278,4417,5269,5281,6505],[83,97,140,880,1046,1278,4417,5269,6505],[83,97,140,1046,1278,4417,5269,5281,6506,6507],[83,97,140,1046,1278,4420,5275,6504,6508,6510],[83,97,140,1046,4417,5269,5281,6509],[97,140,1046,4417,5281],[97,140,880,1046,4417,5281],[97,140,688,759,1046],[83,97,140,447,688,1046,5269,5281,5994,5995,6459],[97,140,1046,5269,5281,6460],[83,97,140,447,1046,1278,5269,5281,5410,6459,6460,6461,6462,6463],[97,140,1046,5269,5281],[83,97,140,457,1046,1278,5269,5281,5410,6459,6460,6461,6462,6463],[97,140,744,1046,5269,5281,6459],[83,97,140,1046,5269,5294],[83,97,140,1046,5269,5291],[83,97,140,433,1046,4420,5269,5291,5293,6497,6512,6513,6514,6515],[83,97,140,433,880,1046,4420,5269,5291,6511],[83,97,140,433,688,880,1046,4420,5291],[83,97,140,433,1046,4420,5291],[83,97,140,433,457,1267,5291,5292,5293,6516],[83,97,140,1046,5281],[83,97,140,457,880,1046,1278,4417,5269,5281,6460,6494,6517,6636],[83,97,140,457,880,1046,4417,5269,5281,6639,6640],[83,97,140,1046,1056,5269],[83,97,140,457,688,1046,6643,6645,6649,6650],[83,97,140,1046,1054,5299],[83,97,140,433,1046,1054,6644],[83,97,140,1046,1055],[83,97,140,1046,1055,6647],[97,140,688],[97,140,433,1055,4420,6646,6648],[83,97,140,445,457,1046,1052,1215,4417,5290],[97,140,688,1046,5281,5994,5995],[83,97,140,1046,1053,5992],[83,97,140,437,459,5301],[83,97,140,5301],[97,140,688,1223,1224,5308,5309,5320,5321,5322],[97,140,1307],[83,97,140,1299,1307,1351,1352,5387],[97,140,1278,1307,1313,1350],[97,140,1278,1307],[97,140,1278,1315],[97,140,1278,1299,1307],[97,140,1305,1311,1312],[83,97,140,1278,1342],[97,140,1278,1307,1313,1315,1316,1317,1338,1339,1340,1341,1342,1343,1345,1346,1351],[97,140,1278,1307,1313,1315,1338,1341,1351],[97,140,1267,1278,1299,1305,1311,1312,1314,1315,1340,1344,1351],[97,140,1267,1278,1299,1314,1315,1316,1347],[97,140,1267,1278,1299,1305,1307,1311,1312],[97,140,1267,1278,1289,1299,1305,1307,1313,1350],[97,140,1272,1278,1335,1347],[97,140,1267,1278,1289,1299,1305,1307,1309,1314,1315,1316,1337,1338,1339,1347,1350],[97,140,1278,1317,1336,1340],[97,140,1278,1313,1341],[97,140,1278,1314,1315],[97,140,1311],[97,140,1334],[97,140,1306,1307,1340,1347,1349,1351],[97,140,1278,1299,1340,1347],[97,140,1306,1348],[97,140,1306],[83,97,140,1156,1267,1278,1299,1306,1347],[97,140,1306,1307,1308,1309,1310],[83,97,140,1278,1299,1307,1343,1351],[97,140,1308],[83,97,140,1156,1308,5391],[97,140,1156],[83,97,140,1156,1278,1309,1347],[97,140,1156,1306],[83,97,140,1156,1223,1224,5377,5381,5385],[83,97,140,1278,4421],[83,97,140,1156,1278,1306,1310,1334,5382,5383,5384],[97,140,1156,1308],[83,97,140,880,5285],[97,140,5303],[97,140,5396],[97,140,1224,5398,5399],[97,140,1306,1311,5395],[97,140,6654,6658],[97,140,6660],[97,140,6666],[97,140,6668],[83,97,140,457,1278],[83,97,140,433,457,1046,4420,5275,5281],[97,140,6675],[97,140,6940],[97,140,6942],[97,140,6944],[97,140,6664],[97,140,6947],[97,140,6949],[83,97,140,457],[97,140,6662],[97,140,6952],[97,140,6955],[97,140,6959],[97,140,6957],[97,140,6961],[97,140,1057,1156],[97,140,5407],[97,140,474,1334,5410],[97,140,5306],[97,140,457,688,5322,5415,5416,5417,5418],[97,140,5421,5422],[97,140,1261],[97,140,5427,5429],[97,140,5427,5431],[97,140,5435],[97,140,5427,5440],[97,140,5427,5442],[97,140,5427,5444],[97,140,1234],[97,140,1220,5428,5447],[97,140,5427,5448],[97,140,5427,5428,5446],[97,140,5427,5450],[97,140,5427,5452],[97,140,1234,5428],[97,140,5427,5456],[97,140,1220,5455],[97,140,5424,5427,5428,5454],[97,140,6459],[97,140,7605],[97,140,6126,6227,6239,6338,6339],[97,140,6222,6239,6241,6338,6339],[97,140,6370],[97,140,6124,6129,6130,6132,6134,6136,6137,6139,6144,6146,6158,6160,6169,6178,6180,6181,6182,6183,6186,6195,6202,6203,6204,6206,6207,6208,6209,6210,6212,6213,6215,6218,6219,6221,6224,6225,6227,6235],[97,140,6222,6338],[97,140,6208,6218,6239,6243,6338,6339],[97,140,6145,6146,6239,6338,6339],[97,140,6126,6129,6225,6227,6239,6338,6339],[97,140,6125,6143,6227,6239,6338,6339],[97,140,6126,6225,6239,6339],[97,140,6125,6126,6127,6227,6239,6339],[97,140,6126,6127,6225,6227,6239,6338,6339],[97,140,6130,6239,6338,6339],[97,140,6227,6239,6338,6339],[97,140,6125,6126,6127,6129,6142,6225,6227,6239,6338,6339],[97,140,6126,6143,6227,6239,6338,6339],[97,140,6125,6126,6127,6225,6239,6338,6339],[97,140,6126,6129,6143,6227,6239,6338,6339],[97,140,6126,6127,6338],[97,140,6125,6126,6129,6138,6239,6338,6339],[97,140,6126,6239,6339],[97,140,6126,6225,6234,6239,6338,6339],[97,140,6126,6130,6143,6225,6227,6239,6338,6339],[97,140,6126,6143,6225,6227,6239,6338,6339],[97,140,6125,6126,6129,6138,6227,6239,6258,6338,6339],[97,140,6222,6235],[97,140,6239,6338],[97,140,6149,6169,6239,6338,6339],[97,140,6149,6239,6338,6339],[97,140,6149,6191],[97,140,6148,6154,6156,6160,6161,6162,6163,6168,6169,6170,6171,6174,6175,6181,6182,6183,6187,6189,6190,6191,6223,6224,6225,6235,6239,6338,6339],[97,140,6239,6338,6339],[97,140,6150,6338],[97,140,6123,6132,6142,6151,6171,6227,6235,6236,6237,6238,6338,6339],[97,140,6130,6131,6139,6142,6143,6144,6145,6146,6151,6157,6171,6176,6177,6182,6184,6192,6195,6202,6203,6209,6212,6218,6220,6221,6222,6227,6235,6236,6238,6240,6242,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6259,6260,6261,6262,6263,6264,6276,6281,6282,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6340],[97,140,6150],[97,140,6129,6198,6239,6266,6267,6269,6271,6272,6280,6338,6339],[97,140,6149,6155,6157,6223],[97,140,6124,6129,6147,6156,6158,6223,6225,6239,6338,6339],[97,140,6153,6224],[97,140,6402,6406,6407],[97,140,6338,6402,6407,6409],[97,140,6155,6224,6354],[97,140,6224],[97,140,6153,6224,6396],[97,140,6363,6402,6404],[97,140,6153,6224,6338,6398],[97,140,6153,6224,6354,6401],[97,140,6354,6400,6402],[97,140,6201,6224,6239,6283,6338,6339],[97,140,6199,6201,6239,6339],[97,140,6124,6125,6127,6129,6225,6227,6239,6338],[97,140,6126,6127,6129,6225,6239],[97,140,6126,6129,6225,6239],[97,140,6129,6145,6239,6339],[97,140,6124,6129,6154,6160,6169,6187,6200,6223,6224,6227,6235],[97,140,6124,6129,6225],[97,140,6122,6124,6129,6139,6146,6178,6180,6182,6183,6184,6185,6186,6187,6200,6204,6212,6217,6223,6225,6227,6228,6229,6230,6231,6232,6233,6234],[97,140,6123,6124,6126,6137,6222,6227,6338],[97,140,6124,6138,6239,6338,6339],[97,140,6122,6123,6124,6129,6132,6136,6160,6180,6185,6202,6207,6223,6225,6226,6235],[97,140,6123,6132,6227,6239,6338,6339],[97,140,6126,6138,6148,6160,6192,6225,6227,6234,6239,6338],[97,140,6126,6138,6160,6178,6192,6225,6227,6234,6239,6287,6338,6339],[97,140,6126,6148,6155,6159,6160,6226,6338],[97,140,6129,6149,6160,6223,6227],[97,140,6160,6171],[97,140,6339],[97,140,6155,6160,6161,6165,6227,6338,6360,6373],[97,140,6227,6366,6367,6372,6374],[97,140,6159,6168,6192,6223,6338],[97,140,6159,6165,6166,6167,6338,6349,6362,6368],[97,140,6160,6165,6166],[97,140,6160],[97,140,6160,6165],[97,140,6160,6161,6164],[97,140,6160,6165,6166,6366],[97,140,6165,6166,6354,6362,6363,6367],[97,140,6160,6166],[97,140,6124,6139,6148,6155,6159,6160,6164,6338,6349],[97,140,6165,6166,6354,6361],[97,140,6148,6155,6159,6160,6165,6350,6354,6356,6359,6360],[97,140,6160,6165,6238,6360],[97,140,6160,6161,6165,6225,6364,6365],[97,140,6160,6165,6354,6361,6366],[97,140,6366,6372,6373,6375],[97,140,6138,6239,6338,6339],[97,140,6124,6125,6126,6138,6146,6184,6186,6223,6227,6239,6270,6275,6338,6339],[97,140,6171,6222,6235,6338,6370],[97,140,6155,6196,6338],[97,140,6155,6265,6338],[97,140,6155,6338],[97,140,6144,6158,6196,6239,6268,6338],[97,140,6124,6239,6338],[97,140,6146,6157,6201,6239,6338,6339],[97,140,6145,6146,6199,6201,6239,6338,6339],[97,140,6129,6195,6196,6197,6199,6239,6338],[97,140,6157,6227,6239,6338],[97,140,6198,6239,6338],[97,140,6270,6428],[97,140,6155,6239,6268,6270,6338],[97,140,6133,6370],[97,140,6131,6132,6133,6134,6141,6223,6227,6235,6239,6338,6339],[97,140,6124,6142,6186,6223,6235],[97,140,6155,6277],[97,140,6125,6126,6127,6128,6129,6147,6157,6192,6221,6239,6276,6278,6281,6338],[97,140,6126,6147,6162,6184,6192,6239,6273,6274,6277,6278,6338],[97,140,6129,6149,6155,6223,6225,6338],[97,140,6126,6129,6239,6275,6277,6338],[97,140,6126,6155,6338],[97,140,6126,6159,6239,6305,6338,6339],[97,140,6125,6126,6129,6227,6239,6277,6338,6391],[97,140,6125,6129,6147,6157,6163,6192,6227,6239,6277,6278,6338,6390],[97,140,6129,6149,6155,6223,6338],[97,140,6125,6126,6127,6142,6201,6225,6259,6277],[97,140,6377,6379],[97,140,6126,6239,6277,6278,6338,6378],[97,140,6148,6161,6192,6277],[97,140,6129,6157,6239,6338,6384],[97,140,6129,6157,6239,6338],[97,140,6126,6129,6157,6227,6239,6338,6384],[97,140,6125,6126,6129,6184,6239,6338,6339],[97,140,6125,6126,6129,6239,6338,6339],[97,140,6155],[97,140,6155,6278],[97,140,6125,6126,6128,6129,6239,6277,6279,6338],[97,140,6129,6155],[97,140,6125,6126,6129,6196,6239,6278,6279,6338],[97,140,6149,6159,6167,6223],[97,140,6124,6129,6145,6223],[97,140,6145,6160,6177,6178,6179,6202],[97,140,6169,6192,6225],[97,140,6124,6178,6297],[97,140,6126,6225],[97,140,6225],[97,140,6222],[97,140,6126,6227],[97,140,6124,6129,6136,6146,6184,6185,6223],[97,140,6124,6129,6152,6223,6225],[97,140,6149,6223],[97,140,6122,6185,6202,6225,6235],[97,140,6124,6138,6139,6205,6206,6207],[97,140,6129],[97,140,6123,6124,6127,6128,6225,6227],[97,140,6180,6181,6225],[97,140,6148],[97,140,6126,6138],[97,140,6204],[97,140,6177],[97,140,6227],[97,140,6124,6129,6204,6211,6223],[97,140,6124],[97,140,6124,6129,6139,6148,6149,6159,6161,6223,6225],[97,140,6139,6231],[97,140,6126,6127,6159],[97,140,6139,6222,6241,6338],[97,140,6148,6160,6164],[97,140,6149],[97,140,6124,6129,6145,6146,6201,6339],[97,140,6172,6173,6224],[97,140,6138],[97,140,6123,6129,6227],[97,140,6138,6205,6207],[97,140,6138,6179,6205,6227],[97,140,6124,6160,6177,6178,6215,6216,6223],[97,140,6124,6136,6137,6139,6215,6217],[97,140,6179],[97,140,6124,6135,6136,6139,6339],[97,140,6129,6148,6154,6160,6164,6223,6225],[97,140,6126,6155],[97,140,6155,6180,6181],[97,140,6169],[97,140,6155,6183],[97,140,6149,6180,6223],[97,140,6124,6169,6222,6235,6339],[97,140,6149,6186,6223],[97,140,6239,6339],[97,140,6123,6171,6227],[97,140,6123,6124,6125,6126,6127,6129,6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6142,6143,6144,6145,6146,6147,6148,6149,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6189,6190,6191,6192,6193,6195,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6243,6244,6245,6246,6251,6252,6255,6256,6257,6258,6259,6262,6263,6266,6267,6268,6269,6270,6271,6272,6273,6275,6276,6277,6278,6279,6280,6281,6282,6283,6288,6290,6291,6293,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6313,6319,6320,6321,6324,6328,6329,6330,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6361,6362,6363,6364,6365,6366,6367,6369,6370,6371,6376,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6391,6392,6393,6394,6395,6396,6397,6398,6399,6400,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458],[97,140,6132,6227,6239,6339],[97,140,6124,6239,6304,6338,6339],[97,140,6124,6126,6127,6129,6138,6159,6220,6239,6338,6339],[97,140,6180,6239,6338,6339],[97,140,6138,6145,6155,6239,6338,6339],[97,140,6223,6235],[97,140,6125,6126,6239,6338,6339],[97,140,6155,6169,6199,6201,6224,6338,6417],[97,140,6124,6126,6128,6132,6138,6145,6146,6169,6192,6193,6194,6195,6199,6200,6224,6225,6227,6239,6338],[97,140,6155,6169,6338],[97,140,6155,6169],[97,140,6124,6129,6149,6223,6225],[97,140,6149,6155,6169],[97,140,6126,6138,6155,6170,6225],[97,140,6126,6138,6155],[97,140,6239,6337,6338],[97,140,6125,6126,6239,6338],[97,140,6188],[97,140,6149,6155,6223],[97,140,6239,6324,6338,6339],[97,140,6148,6155,6188,6235,6268,6338],[97,140,6129,6138,6239,6338,6339],[97,140,6123,6126,6128,6132,6138,6145,6169,6171,6186,6192,6198,6201,6227,6235,6239,6338],[97,140,6126,6138,6155,6157,6338],[97,140,6123,6124,6126,6129,6138,6145,6146,6169,6186,6199,6201,6224,6239,6338,6339],[97,140,6124,6129,6149,6153,6223,6225],[97,140,6214,6227],[97,140,6215,6239],[97,140,6214,6239,6338,6339],[97,140,6138,6139],[97,140,6126,6176,6225,6227,6239,6338,6339],[97,140,6239],[97,140,6225,6235,6239,6338,6339],[97,140,6148,6169,6225,6235],[97,140,6142,6171],[97,140,6155,6276],[97,140,6126,6142],[97,140,6124,6125,6126,6142],[97,140,6140,6235],[97,140,6235,6239,6241,6338,6339],[97,140,6133,6139,6235],[97,140,6138,6239,6339],[97,140,6124,6126,6239,6338,6339],[97,140,6148,6171],[97,140,6155,6172,6351],[97,140,6172,6352],[97,140,6155,6172],[97,140,6155,6172,6353],[97,140,6155,6354],[97,140,6155,6172,6337,6338,6352],[97,140,6172,6355],[97,140,6155,6172,6357,6358],[97,140,6155,6172,6355],[97,140,6125,6126,6151,6154,6223,6225,6227,6239,6338],[97,140,6152,6155],[97,140,6124,6126,6148,6159,6239,6338,6339],[97,140,6155,6427],[97,140,6155,6239,6426],[97,140,6125,6126,6138,6154,6223,6225,6239,6338],[97,140,6154,6223,6239,6338],[97,140,6123,6227],[97,140,6459,7608],[97,140,6459,7609,7611],[97,140,6459,7607],[97,140,6459,7608,7610],[97,140,7607,7608,7609,7610,7612,7613,7614,7615,7616],[83,97,140,6459,7599],[97,140,7599,7600,7601,7602,7603],[97,140,571,581],[97,140,581,582,586,589,590],[97,140,571],[83,97,140,580],[97,140,582],[97,140,582,587,588],[83,97,140,571,581,582,583,584,585],[97,140,581],[97,140,541,542,543],[97,140,542,546],[97,140,542,543],[97,140,541],[82,83,97,140,542,549,557,559,571],[97,140,543,544,547,548,549,557,558,559,560,567,568,569,570],[97,140,560],[97,140,550],[97,140,550,551,552,553,554,555,556],[83,97,140,541,550,558],[97,140,561],[97,140,561,562,563],[97,140,545,546],[97,140,545,546,561,564,565,566],[97,140,545],[97,140,558],[97,140,927],[97,140,927,928],[83,97,140,988,989,990],[83,97,140,989],[83,97,140,991],[97,140,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689,4690,4691,4692,4693,4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749,4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884,4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,5113,5114,5115,5116,5117,5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265],[83,97,140,989,990,5266,5267,5268],[83,97,140,6808],[97,140,6810],[97,140,6808],[97,140,6808,6809,6811,6812],[97,140,6807],[83,97,140,6753,6777,6782,6801,6813,6838,6841,6842],[97,140,6842,6843],[97,140,6782,6801],[83,97,140,6845],[97,140,6845,6846,6847,6848],[97,140,6782],[97,140,6845],[83,97,140,6782],[97,140,6850],[97,140,6851,6853,6855],[97,140,6852],[97,140,6854],[83,97,140,6753,6782],[83,97,140,6841,6856,6859],[97,140,6857,6858],[97,140,6753,6782,6807,6844],[97,140,6859,6860],[97,140,6813,6844,6849,6861],[97,140,6801,6863,6864,6865],[83,97,140,6807],[83,97,140,6753,6782,6801,6807],[83,97,140,6782,6807],[97,140,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794,6795,6796,6797,6798,6799,6800],[97,140,6782,6807],[97,140,6777,6785],[97,140,6782,6803],[97,140,6732,6782],[97,140,6753],[97,140,6777],[97,140,6867],[97,140,6777,6782,6807,6838,6841,6862,6866],[97,140,6753,6839],[97,140,6839,6840],[97,140,6753,6782,6807],[97,140,6765,6766,6767,6768,6770,6772,6776],[97,140,6773],[97,140,6773,6774,6775],[97,140,6766,6773],[97,140,6766,6782],[97,140,6769],[83,97,140,6765,6766],[97,140,6763,6764],[83,97,140,6763,6766],[97,140,6771],[83,97,140,6762,6765,6782,6807],[97,140,6766],[83,97,140,6803],[97,140,6803,6804,6805,6806],[97,140,6803,6804],[83,97,140,6753,6762,6782,6801,6802,6804,6862],[97,140,6754,6762,6777,6782,6807],[97,140,6754,6755,6778,6779,6780,6781],[83,97,140,6753],[97,140,6756],[97,140,6756,6782],[97,140,6756,6757,6758,6759,6760,6761],[97,140,6814,6815,6816],[97,140,6762,6817,6824,6826,6837],[97,140,6825],[97,140,6753,6782],[97,140,6818,6819,6820,6821,6822,6823],[97,140,6781],[97,140,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836],[97,140,6868,6869,6870,6871,6872,6873,6874],[97,140,6881],[83,97,140,6867,6880],[97,140,6883],[97,140,6883,6884,6885],[97,140,6753,6867],[83,97,140,6753,6801,6867,6880,6883],[97,140,6880,6882,6886,6891,6894,6901],[97,140,6893],[97,140,6892],[97,140,6880],[97,140,6887,6888,6889,6890],[97,140,6876,6877,6878,6879],[97,140,6867,6877],[97,140,6895,6896,6897,6898,6899,6900],[97,140,6732],[97,140,6732,6733],[97,140,6736,6737,6738],[97,140,6740,6741,6742],[97,140,6744],[97,140,6721,6722,6723,6724,6725,6726,6727,6728,6729],[97,140,6730,6731,6734,6735,6739,6743,6745,6751,6752],[97,140,6746,6747,6748,6749,6750],[97,140,1082,5483],[97,140,1082],[97,140,1082,5486],[97,140,5483,5484,5485],[97,140,1082,7054],[97,140,7054,7055,7056],[83,97,140,1082,7054],[97,140,5504],[97,140,5489,5493],[97,140,1082,5488,5489,5490,5491,5492],[97,140,1082,5493],[97,140,1082,5509],[97,140,1082,7038,7039],[97,140,1082,7038],[83,97,140,1082],[83,97,140,7043],[97,140,7046],[83,97,140,7049],[83,97,140,1082,7057],[97,140,1082,7076],[97,140,5494,5495,5496,5497,5498,5499,5500,5501,5502],[97,140,1082,5494,5498],[97,140,1082,5494,5496,5497,5499],[97,140,1082,5494,5499],[97,140,1082,5494,5496,5498,5499],[97,140,1082,5494,5496,5498,5499,5501,5503],[97,140,1082,7071,7072,7073,7074,7075],[97,140,1082,6686,6687,6688,6689],[97,140,6498],[83,97,140,6498,6499],[97,140,1387],[97,140,1391,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416],[83,97,140,1387],[97,140,1387,1388,1389,1390],[97,140,1390,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903],[97,140,1231],[97,140,929,931],[83,97,140,931,933],[83,97,140,930,931],[83,97,140,932],[97,140,930,931,932,934,935],[97,140,930],[97,140,842],[97,140,845,846],[97,140,842,843,844],[97,140,813,814],[97,140,973,974,975,976],[83,97,140,972],[83,97,140,973],[97,140,973],[97,140,765],[97,140,763,764],[83,97,140,512,760,761,762],[97,140,512],[83,97,140,763],[83,97,140,510,511],[83,97,140,510],[97,140,1300,5893,5894,5895,5896],[97,140,5739,5789,5793,5823],[97,140,5792],[97,140,5790,5791],[97,140,5739,5785,5786,5789],[97,140,5739,5788],[97,140,5789,5791],[97,140,5789],[97,140,5791,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5822],[97,140,5805],[97,140,5808],[97,140,5789,5806,5823,5824],[97,140,5788,5789],[97,140,5821],[97,140,5788,5789,5819,5820],[97,140,5787],[83,97,140,6526,6625],[97,140,5948],[97,140,5890],[97,140,7013],[97,140,5311],[97,140,1384],[97,140,1372,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384],[97,140,1372,1373,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384],[97,140,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384],[97,140,1372,1373,1374,1376,1377,1378,1379,1380,1381,1382,1383,1384],[97,140,1372,1373,1374,1375,1377,1378,1379,1380,1381,1382,1383,1384],[97,140,1372,1373,1374,1375,1376,1378,1379,1380,1381,1382,1383,1384],[97,140,1372,1373,1374,1375,1376,1377,1379,1380,1381,1382,1383,1384],[97,140,1372,1373,1374,1375,1376,1377,1378,1380,1381,1382,1383,1384],[97,140,1372,1373,1374,1375,1376,1377,1378,1379,1381,1382,1383,1384],[97,140,1372,1373,1374,1375,1376,1377,1378,1379,1380,1382,1383,1384],[97,140,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1383,1384],[97,140,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1384],[97,140,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383],[97,137,140],[97,139,140],[140],[97,140,145,174],[97,140,141,146,152,153,160,171,182],[97,140,141,142,152,160],[92,93,94,97,140],[97,140,143,183],[97,140,144,145,153,161],[97,140,145,171,179],[97,140,146,148,152,160],[97,139,140,147],[97,140,148,149],[97,140,152],[97,140,150,152],[97,139,140,152],[97,140,152,153,154,171,182],[97,140,152,153,154,167,171,174],[97,135,140,187],[97,140,148,152,155,160,171,182],[97,140,152,153,155,156,160,171,179,182],[97,140,155,157,171,179,182],[95,96,97,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[97,140,152,158],[97,140,159,182,187],[97,140,148,152,160,171],[97,140,161],[97,140,162],[97,139,140,163],[97,137,138,139,140,141,142,143,144,145,146,147,148,149,150,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],[97,140,165],[97,140,166],[97,140,152,167,168],[97,140,167,169,183,185],[97,140,152,171,172,174],[97,140,171,173],[97,140,171,172],[97,140,174],[97,140,175],[97,137,140,171],[97,140,152,177,178],[97,140,177,178],[97,140,145,160,171,179],[97,140,180],[97,140,160,181],[97,140,155,166,182],[97,140,145,183],[97,140,171,184],[97,140,159,185],[97,140,186],[97,140,145,152,154,163,171,182,185,187],[97,140,171,188],[97,140,171,189],[97,140,5316],[83,97,140,192,194],[83,87,97,140,190,191,192,193,417,465],[83,97,140,7035],[83,87,97,140,191,194,417,465],[83,87,97,140,190,194,417,465],[81,82,97,140],[97,140,6966,7005],[97,140,6966,6990,7005],[97,140,7005],[97,140,6966],[97,140,6966,6991,7005],[97,140,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984,6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7002,7003,7004],[97,140,6991,7005],[97,140,6119],[97,140,6040],[97,140,6037],[97,140,6036,6037,6038,6039],[97,140,6037,6039],[97,140,6037,6041,6042,6043,6044,6045,6046,6047,6049,6050,6053,6073,6075,6076],[97,140,6044,6045],[97,140,6037,6038,6039],[97,140,6037,6039,6045,6048],[97,140,6039],[97,140,6037,6039,6048,6058,6060,6061,6062,6064,6065,6066,6067,6068,6069,6070,6071,6072],[97,140,6037,6048,6082],[97,140,6037,6048,6082,6099],[97,140,6037,6040,6050,6058,6060,6061,6062,6064,6065,6066,6067,6068,6069,6070,6071,6072,6077,6079,6080,6081,6084,6085,6087,6088,6089,6090,6091,6092,6093,6094,6096,6097,6098,6101,6102,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113],[97,140,6038,6074],[97,140,6037,6075],[97,140,6037,6077,6079,6080,6087,6090,6093,6105,6107,6113,6114,6116,6117,6118],[97,140,6037,6038,6039,6040,6041,6044,6045,6046,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6119,6120,6121],[97,140,6115],[97,140,6037,6039,6044,6048,6056],[97,140,6079,6080],[97,140,6037,6038,6039,6052,6053,6078],[97,140,6116,6117,6118],[97,140,6058,6060,6067],[97,140,6038,6051,6052,6053,6054,6055,6056,6057],[97,140,6037,6038,6039,6051,6052,6053,6056,6057,6059],[97,140,6037,6038,6039,6053,6056],[97,140,6037,6039,6052,6053,6055,6056],[97,140,6037,6038,6053,6056,6060],[97,140,6037,6038,6039,6053,6056,6060,6063],[97,140,6037,6040,6048,6077,6082,6083,6086],[97,140,6053],[97,140,6058,6060,6061,6062,6064,6065,6066,6067,6068,6069,6070,6071,6072,6081,6084,6085],[97,140,6037,6038,6039,6048,6052,6053,6056],[97,140,6037,6038,6039,6048,6051,6052,6053,6056],[97,140,6037,6038,6039,6052,6053,6056],[97,140,6037,6038,6051,6052,6053,6056,6057],[97,140,6038,6052,6053,6054,6055,6056,6057,6059],[97,140,6038,6039],[97,140,6037,6038,6039,6053,6056,6063],[97,140,6037,6038,6051,6052,6053,6054,6055,6056,6057],[97,140,6037,6038,6039,6051,6052,6053,6056],[97,140,6037,6039,6052,6053,6055,6056,6057,6059],[97,140,6037,6038,6039,6051,6052,6053,6056,6057],[97,140,6077,6088,6089],[97,140,6077,6091,6092],[97,140,6037,6095,6096],[97,140,6077,6094,6096,6097,6098,6099,6100,6102,6103,6104],[97,140,6038,6101],[97,140,6101],[97,140,6038,6039,6052,6053,6055,6056,6095],[97,140,6056,6095],[97,140,6037,6056,6095],[97,140,6037,6038,6044],[97,140,6077,6106],[97,140,6037,6038],[97,140,6037,6077,6108,6109,6110,6111,6112],[97,140,5782,5784],[97,140,5743,5744,5748,5775,5776,5777,5778,5781,5782,5784],[97,140,5741,5742],[97,140,5741],[97,140,5743,5782],[97,140,5743,5744,5780,5782,5784],[97,140,5782],[97,140,5740,5779,5782],[97,140,5743,5744,5781,5782],[97,140,5743,5744,5746,5747,5781,5782],[97,140,5743,5744,5745,5781,5782],[97,140,5743,5744,5748,5775,5776,5777,5778,5781,5782,5783],[97,140,5740,5743,5744,5748,5781,5784],[97,140,5748,5782],[97,140,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5782],[97,140,5773,5782],[97,140,5749,5760,5768,5769,5770,5771,5772,5774],[97,140,5753,5782],[97,140,5761,5762,5763,5764,5765,5766,5767,5782],[97,140,676],[83,97,140,486,487],[97,140,510],[97,140,512,627],[97,140,684],[97,140,599],[97,140,581,599],[83,97,140,478],[83,97,140,488],[97,140,489,490],[83,97,140,599],[83,97,140,479,492],[97,140,492,493],[83,97,140,477,906],[83,97,140,495,863,905],[97,140,907,908],[97,140,906],[83,97,140,685,711,713],[97,140,477,708,910],[83,97,140,912],[83,97,140,476],[83,97,140,865,912],[97,140,913,914],[83,97,140,477,599,677,780,781],[83,97,140,477,677],[83,97,140,477,754,917],[83,97,140,752],[97,140,917,918],[83,97,140,496],[83,97,140,496,497,498],[83,97,140,499],[97,140,496,497,498,499],[97,140,609],[83,97,140,477,504,513,921],[97,140,688,922],[97,140,920],[97,140,571,599,616],[83,97,140,788,792],[97,140,793,794,795],[83,97,140,924],[83,97,140,477,496,685,712,800,801,902],[83,97,140,797,802],[83,97,140,731],[83,97,140,732,733],[83,97,140,734],[97,140,731,732,734],[97,140,571,599],[97,140,852],[83,97,140,496,805,806],[97,140,806,807],[97,140,929,938],[83,97,140,477,938],[97,140,937,938,939],[83,97,140,496,681,865,936,937],[83,97,140,491,500,537,676,681,689,691,693,713,715,751,755,757,766,772,778,779,782,792,796,802,808,809,812,822,823,824,841,850,855,859,862,863,865,873,876,880,882,898,899],[97,140,496],[83,97,140,496,500,778,899,900,901],[97,140,477,504,518,685,690,691,902],[97,140,477,496,513,518,685,689,902],[97,140,477,518,685,688,690,691,692,902],[97,140,692],[97,140,614,615],[97,140,571,599,614],[97,140,599,611,612,613],[83,97,140,476,810,811],[83,97,140,488,820],[83,97,140,819,820,821],[83,97,140,497,691,752],[83,97,140,512,679,751],[97,140,752,753],[83,97,140,599,613,627],[83,97,140,477,823],[83,97,140,477,496],[83,97,140,824],[83,97,140,824,943,944,945],[97,140,946],[83,97,140,681,691,782],[83,97,140,503,532,535,537,684,948],[83,97,140,684],[83,97,140,496,503,530,531,532,535,536,684,902],[83,97,140,519,537,538,682,683],[83,97,140,532,684],[83,97,140,532,535,681],[83,97,140,503],[97,140,530,535],[97,140,536],[97,140,503,537,684,949,950,951,952],[97,140,503,534],[83,97,140,476,477],[97,140,532,851,1046],[83,97,140,959,960],[83,97,140,957],[97,140,476,477,479,491,494,681,689,691,693,713,715,735,751,754,755,757,766,772,775,782,792,796,801,802,808,809,812,822,823,824,841,850,852,855,859,862,865,873,876,880,882,897,898,902,909,911,915,916,919,923,925,926,940,941,942,947,953,961,963,968,971,978,979,984,987,992,993,995,1005,1010,1015,1017,1019,1022,1024,1031,1037,1039,1040,1044,1045],[83,97,140,496,685,849,902],[97,140,635],[97,140,599,611],[97,140,825,832,833,834,835,840],[83,97,140,496,685,826,831,902],[83,97,140,496,685,902],[83,97,140,832],[97,140,571,599,611],[83,97,140,496,685,832,839,902],[97,140,745,962],[83,97,140,855],[83,97,140,755,757,852,853,854],[83,97,140,503,692,693,694,714,716,759,766,772,776,777],[97,140,778],[83,97,140,477,685,856,858,902],[83,97,140,743,744,746,747,748,749,750],[97,140,736],[83,97,140,743,744,745,746],[97,140,902],[83,97,140,743],[83,97,140,744],[83,97,140,495,966,967],[83,97,140,495,965],[83,97,140,495],[97,140,903],[97,140,860,861,903,904,905],[83,97,140,476,486,499,902],[83,97,140,903],[83,97,140,485,903],[83,97,140,904],[83,97,140,863,969,970],[83,97,140,863,965],[83,97,140,863],[97,140,714],[83,97,140,698,713],[83,97,140,499,678,681,716],[83,97,140,715],[83,97,140,678,681,864],[83,97,140,865],[97,140,599,613,627],[97,140,774],[83,97,140,978],[83,97,140,778,977],[83,97,140,980],[97,140,980,981,982,983],[83,97,140,496,731,732,734],[83,97,140,732,980],[83,97,140,986],[83,97,140,496,994],[83,97,140,477,496,685,708,709,711,712,902],[97,140,612],[83,97,140,996],[97,140,1004],[83,97,140,997,998,999,1000,1001,1002,1003],[83,97,140,477,681,870,872],[83,97,140,496,902],[83,97,140,496,874,875],[97,140,1041,1042,1043],[83,97,140,1041],[83,97,140,1006,1007],[97,140,1007,1008,1009],[83,97,140,487,1006],[83,97,140,1013,1014],[97,140,571,599,613],[97,140,571,599,676],[83,97,140,1016],[97,140,477,759],[83,97,140,477,759,877],[97,140,730,758,759,877,879],[83,97,140,476,477,681,719,730,735,754,755,756,758],[97,140,477,496,730,757,759],[97,140,730,756,759,877,878],[83,97,140,496,783,788,790,791],[83,97,140,785],[83,97,140,477,488,677,881],[83,97,140,571,593,676],[97,140,571,594,676,1018,1046],[83,97,140,578],[97,140,600,601,602,603,604,605,606,607,608,610,616,617,618,619,620,621,622,623,624,625,626,628,629,630,631,632,633,634,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673],[97,140,579,591,674],[97,140,477,571,572,573,578,579,674,675],[97,140,572,573,574,575,576,577],[97,140,572],[97,140,571,591,592,594,595,596,597,598,676],[97,140,571,594,676],[97,140,581,586,591,676],[83,97,140,477,518,685,688,690],[97,140,1020,1021],[83,97,140,1020],[83,97,140,477],[83,97,140,477,539,540,677,678,679,680],[83,97,140,681],[83,97,140,766,1023],[83,97,140,765],[83,97,140,766],[83,97,140,685,767,769,770,771],[83,97,140,767,768,772],[83,97,140,767,769,772],[83,97,140,902],[83,97,140,477,496,685,711,712,888,892,895,897,902],[97,140,599,669],[83,97,140,883,894,895],[97,140,883,894,895,896],[83,97,140,883,894],[83,97,140,681,839,1025],[97,140,1025,1027,1028,1029,1030],[83,97,140,1026],[83,97,140,776,1035],[97,140,776,1035,1036],[83,97,140,773,775],[83,97,140,776,1034],[97,140,1038],[97,140,7230],[83,97,140,486,7283],[97,140,512,7181],[97,140,7239],[97,140,7153],[97,140,581,7153],[83,97,140,7319],[83,97,140,7284],[97,140,7285,7286],[83,97,140,7153],[83,97,140,7320,7321],[97,140,7321,7322],[83,97,140,7134,7329],[83,97,140,7324,7327,7328],[97,140,7330,7331],[97,140,7329],[83,97,140,711,7240,7247],[97,140,708,7134,7333],[83,97,140,7335],[83,97,140,7135],[83,97,140,7335,7338],[97,140,7336,7339],[83,97,140,7134,7153,7231,7288,7289],[83,97,140,7134,7231],[83,97,140,7134,7265,7342],[83,97,140,7263],[97,140,7342,7343],[83,97,140,6678],[83,97,140,6678,6679,6680],[83,97,140,6681],[97,140,6678,6679,6680,6681],[97,140,7163],[83,97,140,504,513,7134,7346],[97,140,688,7347],[97,140,7345],[97,140,571,7153,7170],[83,97,140,788,7292],[97,140,7293,7294,7295],[83,97,140,800,6678,7134,7240,7246,7297,7457],[83,97,140,797,7298],[83,97,140,7251,7252],[83,97,140,7253],[97,140,731,7251,7253],[97,140,571,7153],[97,140,7450],[83,97,140,805,6678,7299],[97,140,7299,7300],[97,140,929,7352],[83,97,140,7134,7352],[97,140,7351,7352,7353],[83,97,140,936,6678,7235,7338,7351],[83,97,140,6677,6682,7133,7230,7235,7241,7244,7247,7249,7262,7266,7270,7276,7281,7282,7287,7290,7292,7296,7298,7301,7302,7305,7307,7308,7309,7316,7317,7328,7338,7372,7378,7403,7406,7417,7419,7430,7453,7454,7458],[97,140,6678],[83,97,140,6678,7133,7281,7454,7455,7456],[97,140,504,518,6682,7134,7240,7242,7457],[97,140,513,518,6678,7134,7240,7241,7457],[97,140,518,688,6682,7134,7240,7242,7243,7457],[97,140,7243],[97,140,7168,7169],[97,140,571,7153,7168],[97,140,7153,7165,7166,7167],[83,97,140,7135,7303,7304],[83,97,140,820,7284],[83,97,140,819,820,7306],[83,97,140,6679,6682,7263],[83,97,140,512,7233,7262],[97,140,7263,7264],[83,97,140,7153,7167,7181],[83,97,140,7134,7308],[83,97,140,6678,7134],[83,97,140,7309],[83,97,140,7309,7357,7358,7359],[97,140,7360],[83,97,140,6682,7235,7290],[83,97,140,503,948,7136,7236,7239,7458],[83,97,140,7239],[83,97,140,503,530,531,6678,7136,7236,7239,7365,7457],[83,97,140,519,7137,7237,7238,7458],[83,97,140,7136,7239],[83,97,140,7136,7235,7236],[97,140,530,7236],[97,140,7365],[97,140,503,7239,7362,7363,7364,7366,7458],[83,97,140,7134,7135],[97,140,7136,7318,7449],[83,97,140,959,7368],[97,140,6677,6682,7134,7135,7235,7241,7244,7247,7249,7254,7262,7265,7266,7270,7276,7278,7287,7290,7292,7296,7297,7298,7301,7302,7305,7307,7308,7309,7316,7317,7320,7323,7332,7334,7338,7340,7341,7344,7348,7349,7350,7354,7355,7356,7361,7367,7369,7371,7372,7375,7378,7381,7382,7383,7388,7389,7390,7391,7392,7402,7403,7406,7411,7412,7413,7417,7419,7421,7424,7426,7429,7430,7437,7440,7442,7443,7447,7448,7450,7453,7457],[83,97,140,849,6678,7240,7457],[97,140,7189],[97,140,7153,7165],[97,140,7310,7311,7312,7313,7314,7315],[83,97,140,826,831,6678,7240,7457],[83,97,140,6678,7240,7457],[83,97,140,7311],[97,140,571,7153,7165],[83,97,140,839,6678,7240,7311,7457],[97,140,7256,7370],[83,97,140,7453],[83,97,140,6677,7266,7450,7451,7452],[83,97,140,503,7243,7244,7245,7248,7250,7269,7270,7276,7279,7280],[97,140,7281],[83,97,140,856,858,7134,7240,7457],[83,97,140,743,7255,7257,7258,7259,7260,7261],[83,97,140,743,7255,7256,7257],[97,140,7457],[83,97,140,7255],[83,97,140,7324,7373,7374],[83,97,140,965,7324],[83,97,140,7324],[97,140,7325],[97,140,7325,7326,7327,7376,7377],[83,97,140,486,6681,7135,7457],[83,97,140,7325],[83,97,140,485,7325],[83,97,140,7326],[83,97,140,7328,7379,7380],[83,97,140,965,7328],[83,97,140,7328],[97,140,7248],[83,97,140,698,7247],[83,97,140,6681,7232,7235,7250],[83,97,140,7249],[83,97,140,7232,7235,7337],[83,97,140,7338],[97,140,7153,7167,7181],[97,140,7277],[83,97,140,7382],[83,97,140,977,7281],[83,97,140,7384],[97,140,7384,7385,7386,7387],[83,97,140,731,6678,7251,7253],[83,97,140,7251,7384],[83,97,140,994,6678],[83,97,140,708,709,711,6678,7134,7240,7246,7457],[97,140,7166],[83,97,140,7393],[97,140,7401],[83,97,140,7394,7395,7396,7397,7398,7399,7400],[83,97,140,870,872,7134,7235],[83,97,140,6678,7457],[83,97,140,6678,7404,7405],[97,140,7444,7445,7446],[83,97,140,7444],[83,97,140,7407,7408],[97,140,7408,7409,7410],[83,97,140,7283,7407],[97,140,571,7153,7167],[97,140,571,7153,7230],[97,140,7134,7269],[83,97,140,7134,7269,7414],[97,140,730,7268,7269,7414,7416],[83,97,140,719,730,7134,7135,7235,7254,7265,7266,7267,7268],[97,140,730,6677,6678,7134,7269],[97,140,730,7267,7269,7414,7415],[83,97,140,783,788,790,6678,7291],[83,97,140,7134,7231,7284,7418],[83,97,140,571,7147,7230],[97,140,571,7148,7230,7420,7449],[83,97,140,7144],[97,140,7154,7155,7156,7157,7158,7159,7160,7161,7162,7164,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7182,7183,7184,7185,7186,7187,7188,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227],[97,140,591,7145,7228],[97,140,571,7134,7138,7139,7144,7145,7228,7229],[97,140,7138,7139,7140,7141,7142,7143],[97,140,7138],[97,140,571,591,7146,7148,7149,7150,7151,7152,7230],[97,140,571,7148,7230],[97,140,581,586,591,7230],[83,97,140,518,688,7134,7240,7242],[97,140,7422,7423],[83,97,140,7422],[83,97,140,7134],[83,97,140,539,540,7134,7231,7232,7233,7234],[83,97,140,7235],[83,97,140,7270,7425],[83,97,140,7270],[83,97,140,7240,7271,7273,7274,7275],[83,97,140,7271,7272,7276],[83,97,140,7271,7273,7276],[83,97,140,7457],[83,97,140,711,888,892,6678,7134,7240,7246,7427,7429,7457],[97,140,7153,7223],[83,97,140,883,894,7427],[97,140,883,894,7427,7428],[83,97,140,839,7235,7431],[97,140,7431,7433,7434,7435,7436],[83,97,140,7432],[83,97,140,7279,7438],[97,140,7279,7438,7439],[83,97,140,773,7278],[83,97,140,1034,7279],[97,140,7441],[97,140,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624],[97,140,6529],[97,140,6528],[97,140,6527,6529],[97,140,687],[97,140,686],[97,140,688,5310,5995],[97,140,688,5310,5994],[97,140,688,5994,5995],[97,140,182,189],[97,140,1272],[97,140,1272,1300],[97,140,1301,1302,1303,1304],[97,140,1272,1277,1300],[97,140,1272,1277],[97,140,1273,1274,1275,1276],[83,97,140,1272],[97,140,1272,1274],[97,140,1272,1273],[97,140,1294,1295,1296,1297],[97,140,1272,1277,1293],[97,140,1293,1298],[97,140,1269,1270,1271],[97,140,1269],[97,140,1270],[97,140,1268,1270],[97,140,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292],[97,140,1272,1279],[97,140,5313,5314],[82,97,140],[97,140,1061,1062,1069],[97,140,1061,1062,1063,1069,1070],[97,140,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081],[97,140,1061,1062,1063,1066,1069],[97,140,1061,1062],[97,140,1065,1069],[97,140,1063,1064,1066,1069],[97,140,1066,1069],[97,140,1063,1066,1068,1082],[97,140,1067,1069],[97,140,1061,1062,1065,1066,1069,1082],[97,140,1065,1066,1069],[97,140,1062,1063,1064,1065,1066,1069,1082],[97,140,1061,1082],[97,140,1061,1066,1069,1082],[97,140,1063,1069,1082],[97,140,1061,1063,1066,1069],[97,140,1061,1069],[97,140,1062,1066,1069],[89,97,140],[97,140,421],[97,140,423,424,425,426],[97,140,428],[97,140,198,212,213,214,216,380],[97,140,198,202,204,205,206,207,208,369,380,382],[97,140,380],[97,140,213,232,349,358,376],[97,140,198],[97,140,195],[97,140,400],[97,140,380,382,399],[97,140,303,346,349,471],[97,140,313,328,358,375],[97,140,263],[97,140,363],[97,140,362,363,364],[97,140,362],[91,97,140,155,195,198,202,205,209,210,211,213,217,225,226,297,359,360,380,417],[97,140,198,215,252,300,380,396,397,471],[97,140,215,471],[97,140,226,300,301,380,471],[97,140,471],[97,140,198,215,216,471],[97,140,209,361,368],[97,140,166,266,376],[97,140,266,376],[83,97,140,266],[83,97,140,266,320],[97,140,243,261,376,454],[97,140,355,448,449,450,451,453],[97,140,266],[97,140,354],[97,140,354,355],[97,140,206,240,241,298],[97,140,242,243,298],[97,140,452],[97,140,243,298],[83,97,140,199,442],[83,97,140,182],[83,97,140,215,250],[83,97,140,215],[97,140,248,253],[83,97,140,249,420],[97,140,6655],[83,87,97,140,155,189,190,191,194,417,463,464],[97,140,155],[97,140,155,202,232,268,287,298,365,366,380,381,471],[97,140,225,367],[97,140,417],[97,140,197],[83,97,140,303,317,327,337,339,375],[97,140,166,303,317,336,337,338,375],[97,140,330,331,332,333,334,335],[97,140,332],[97,140,336],[83,97,140,249,266,420],[83,97,140,266,418,420],[83,97,140,266,420],[97,140,287,372],[97,140,372],[97,140,155,381,420],[97,140,324],[97,139,140,323],[97,140,227,231,238,269,298,310,312,313,314,316,348,375,378,381],[97,140,315],[97,140,227,243,298,310],[97,140,313,375],[97,140,313,320,321,322,324,325,326,327,328,329,340,341,342,343,344,345,375,376,471],[97,140,308],[97,140,155,166,227,231,232,237,239,243,273,287,296,297,348,371,380,381,382,417,471],[97,140,375],[97,139,140,213,231,297,310,311,371,373,374,381],[97,140,313],[97,139,140,237,269,290,304,305,306,307,308,309,312,375,376],[97,140,155,290,291,304,381,382],[97,140,213,287,297,298,310,371,375,381],[97,140,155,380,382],[97,140,155,171,378,381,382],[97,140,155,166,182,195,202,215,227,231,232,238,239,244,268,269,270,272,273,276,277,279,282,283,284,285,286,298,370,371,376,378,380,381,382],[97,140,155,171],[97,140,198,199,200,210,378,379,417,420,471],[97,140,155,171,182,229,398,400,401,402,403,471],[97,140,166,182,195,229,232,269,270,277,287,295,298,371,376,378,383,384,390,396,413,414],[97,140,209,210,225,297,360,371,380],[97,140,155,182,199,202,269,378,380,388],[97,140,302],[97,140,155,410,411,412],[97,140,378,380],[97,140,310,311],[97,140,231,269,370,420],[97,140,155,166,277,287,378,384,390,392,396,413,416],[97,140,155,209,225,396,406],[97,140,198,244,370,380,408],[97,140,155,215,244,380,391,392,404,405,407,409],[91,97,140,227,230,231,417,420],[97,140,155,166,182,202,209,217,225,232,238,239,269,270,272,273,285,287,295,298,370,371,376,377,378,383,384,385,387,389,420],[97,140,155,171,209,378,390,410,415],[97,140,220,221,222,223,224],[97,140,276,278],[97,140,280],[97,140,278],[97,140,280,281],[97,140,155,202,237,381],[97,140,155,166,197,199,227,231,232,238,239,265,267,378,382,417,420],[97,140,155,166,182,201,206,269,377,381],[97,140,304],[97,140,305],[97,140,306],[97,140,376],[97,140,228,235],[97,140,155,202,228,238],[97,140,234,235],[97,140,236],[97,140,228,229],[97,140,228,245],[97,140,228],[97,140,275,276,377],[97,140,274],[97,140,229,376,377],[97,140,271,377],[97,140,229,376],[97,140,348],[97,140,230,233,238,269,298,303,310,317,319,347,378,381],[97,140,243,254,257,258,259,260,261,318],[97,140,357],[97,140,213,230,231,291,298,313,324,328,350,351,352,353,355,356,359,370,375,380],[97,140,243],[97,140,265],[97,140,155,230,238,246,262,264,268,378,417,420],[97,140,243,254,255,256,257,258,259,260,261,418],[97,140,229],[97,140,291,292,295,371],[97,140,155,276,380],[97,140,290,313],[97,140,289],[97,140,285,291],[97,140,288,290,380],[97,140,155,201,291,292,293,294,380,381],[83,97,140,240,242,298],[97,140,299],[83,97,140,199],[83,97,140,376],[83,91,97,140,231,239,417,420],[97,140,199,442,443],[83,97,140,253],[83,97,140,166,182,197,247,249,251,252,420],[97,140,215,376,381],[97,140,376,386],[83,97,140,153,155,166,197,253,300,417,418,419],[83,97,140,190,191,194,417,465],[83,84,85,86,87,97,140],[97,140,145],[97,140,393,394,395],[97,140,393],[83,87,97,140,155,157,166,189,190,191,192,194,195,197,273,336,382,416,420,465],[97,140,430],[97,140,432],[97,140,434],[97,140,6656],[97,140,436],[97,140,438,439,440],[97,140,444],[88,90,97,140,422,427,429,431,433,435,437,441,445,447,456,457,459,469,470,471,472],[97,140,446],[97,140,455],[97,140,249],[97,140,458],[97,139,140,291,292,293,295,327,376,460,461,462,465,466,467,468],[97,140,189],[97,140,1228],[97,140,141,153,171,1226,1227],[97,140,1230],[97,140,1229],[97,140,1254],[97,140,1252,1254],[97,140,1243,1251,1252,1253,1255,1257],[97,140,1241],[97,140,1244,1249,1254,1257],[97,140,1240,1257],[97,140,1244,1245,1248,1249,1250,1257],[97,140,1244,1245,1246,1248,1249,1257],[97,140,1241,1242,1243,1244,1245,1249,1250,1251,1253,1254,1255,1257],[97,140,1257],[97,140,1239,1241,1242,1243,1244,1245,1246,1248,1249,1250,1251,1252,1253,1254,1255,1256],[97,140,1239,1257],[97,140,1244,1246,1247,1249,1250,1257],[97,140,1248,1257],[97,140,1249,1250,1254,1257],[97,140,1242,1252],[83,97,140,511,706,711,797,798],[97,140,797,799],[83,97,140,799],[97,140,799],[83,97,140,803],[83,97,140,803,804],[83,97,140,483],[83,97,140,482],[97,140,483,484,485],[83,97,140,815,816,817,818],[83,97,140,510,816,817],[97,140,819],[83,97,140,511,512,786],[83,97,140,522],[83,97,140,521,522,523,524,525,526,527,528,529],[83,97,140,520,521],[97,140,522],[83,97,140,501,502],[97,140,503],[83,97,140,482,483,954,955,957],[97,140,958],[83,97,140,486,954,958],[83,97,140,954,955,956,958],[97,140,848],[83,97,140,826,828,847],[83,97,140,828],[97,140,828,829,830],[83,97,140,826,827],[83,97,140,828,839,856,857],[97,140,856,858],[83,97,140,736],[97,140,736,737,738,739,740,741,742],[83,97,140,510,736],[83,97,140,505],[83,97,140,506,507],[97,140,505,506,508,509],[83,97,140,964],[97,140,696,697],[83,97,140,695],[83,97,140,696],[97,140,513,515,516,517],[83,97,140,504,512],[83,97,140,513,514],[83,97,140,513],[83,97,140,985],[83,97,140,511,704,705],[83,97,140,706],[97,140,706,707,708,709,710],[83,97,140,709],[83,97,140,705,706,707,708],[83,97,140,866],[83,97,140,866,867],[97,140,870,871],[83,97,140,866,868,869],[97,140,1012,1013],[83,97,140,1011,1013],[83,97,140,1011,1012],[83,97,140,719],[83,97,140,719,722],[83,97,140,720,721],[97,140,717,719,723,724,725,727,728,729],[83,97,140,718],[97,140,719],[83,97,140,719,724],[83,97,140,717,719,723,724,725,726],[83,97,140,719,726,727],[83,97,140,788],[97,140,789],[83,97,140,510,784,785,787],[83,97,140,783,788],[97,140,836,837,838],[83,97,140,828,831,836],[83,97,140,511,512],[97,140,889,890,891],[83,97,140,883],[83,97,140,888],[83,97,140,711,883,887,888,889,890],[97,140,883,888],[83,97,140,883,887],[97,140,883,884,887,893],[83,97,140,704],[83,97,140,883,884,885,886],[83,97,140,773],[97,140,773,1033],[83,97,140,773,1032],[83,97,140,480,481],[83,97,140,700,701],[83,97,140,699,700,702,703],[83,97,140,7114,7115],[97,140,7114,7115,7116,7117,7118],[83,97,140,7114],[97,140,7119],[83,97,140,5279,5280],[83,97,140,5900,5906,5923,5928,5958],[83,97,140,5892,5901,5902,5903,5904,5923,5924,5928],[83,97,140,5928,5950,5951],[83,97,140,5924,5928],[83,97,140,5921,5924,5926,5928],[83,97,140,5905,5907,5911,5928],[83,97,140,5908,5928,5972],[97,140,5926,5928],[83,97,140,5902,5906,5923,5926,5928],[83,97,140,5901,5902,5917],[83,97,140,5886,5902,5917],[83,97,140,5902,5917,5923,5928,5953,5954],[83,97,140,5889,5906,5908,5909,5910,5923,5926,5927,5928],[83,97,140,5924,5926,5928],[83,97,140,5926,5928],[83,97,140,5923,5924,5928],[83,97,140,5928],[83,97,140,5901,5927,5928],[83,97,140,5927,5928],[83,97,140,5887],[83,97,140,5902,5928],[83,97,140,5928,5929,5930,5931],[83,97,140,5888,5889,5926,5927,5928,5930,5933],[97,140,5920,5928],[97,140,5923,5926,5978],[97,140,5884,5885,5886,5889,5901,5902,5905,5906,5907,5908,5909,5911,5912,5922,5925,5928,5929,5932,5934,5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5952,5953,5954,5955,5956,5957,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5977,5978,5979,5980],[83,97,140,5927,5928,5939],[83,97,140,5924,5928,5937],[83,97,140,5926],[83,97,140,5886,5924,5928],[83,97,140,5892,5900,5908,5923,5924,5926,5928,5939],[83,97,140,5892,5928],[97,140,5893,5897,5928],[83,97,140,5893,5897,5923,5924,5925,5928],[97,140,5893,5897],[97,140,5893,5897,5900,5904,5912,5924,5926,5928],[97,140,5893,5897,5928,5929,5932],[97,140,5893,5897,5927,5928],[97,140,5893,5897,5926],[97,140,1300,5893,5897,5917,5926],[97,140,5887,5893,5897,5928],[97,140,5900,5906,5920,5924,5926,5928,5959],[97,140,5892,5893,5894,5898,5899,5900,5904,5913,5914,5915,5916,5918,5919,5920,5922,5924,5926,5927,5928,5981],[83,97,140,5892,5900,5903,5905,5913,5920,5923,5924,5926,5928],[83,97,140,5889,5900,5911,5920,5926,5928],[97,140,5893,5897,5898,5899,5900,5913,5914,5915,5916,5918,5919,5926,5927,5928,5981],[97,140,5888,5889,5893,5897,5926,5928],[97,140,5927,5928],[83,97,140,5905,5928],[97,140,5889,5892,5898,5923,5927,5928],[97,140,5976],[83,97,140,5886,5887,5888,5923,5924,5927],[97,140,5893],[97,140,533],[97,140,7623],[97,140,5353,5363],[83,97,140,5363],[97,140,5354],[83,97,140,5358,5363,7620,7621,7622],[83,97,140,5634],[83,97,140,5356,5363,5370,5631,5632,5633],[83,97,140,5363,5624,5635],[83,97,140,5363,5624,5628,5635],[83,97,140,5328,5363,5370,5624,5625,5626,5627,5628,5629,5630,5634],[97,140,266,5363,5657],[97,140,266,5657],[83,97,140,5363,5657],[83,97,140,5657],[83,97,140,5363,5628,5640,5657,5658],[83,97,140,5363,5370,5628,5634,5635,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656],[97,140,5356,5363],[97,140,5356,5357,5363],[97,140,5363],[83,97,140,5372],[83,97,140,5353,5363,5364,5365,5366,5372,5373,5374],[97,140,5353,5363,5368,5372],[83,97,140,5353,5363],[97,140,5328,5353,5356,5363,5367,5369,5370,5371],[83,97,140,5363,5662,5665,5681],[97,140,266,5681],[83,97,140,5363,5628,5663,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5681],[83,97,140,5664,5665],[83,97,140,5664],[97,140,5328,5363,5370,5628,5634,5663,5664,5665,5679,5680],[83,97,140,5358],[83,97,140,5350,5353,5355,5356,5357,5358,5359,5360,5361,5362],[97,140,5636],[97,140,5659],[97,140,5375],[97,140,5682],[97,140,5344],[97,140,5348],[97,140,5340],[97,140,5340,5350,5622],[97,140,5328,5340,5350,5621],[97,140,5340,5350,5638],[97,140,5328,5340,5350],[97,140,5350],[97,140,5335,5336,5339,5350,5351],[97,140,5339,5350],[97,140,5340,5350,5661],[97,140,5340,5341,5342,5343,5345,5347,5349],[97,140,5346],[97,140,5623],[97,140,5639],[97,140,5638],[97,140,5352],[97,140,5351],[97,140,5662],[97,140,5345],[97,140,5349],[97,140,5343],[97,140,5342],[97,140,5347],[97,140,5338],[97,140,5334,5335],[97,140,5334],[97,140,5334,5335,5336,5337],[97,140,5328,5329,5330,5332,5333],[97,140,5331],[97,140,5329],[97,140,5333],[97,140,5330],[97,140,6935,6936,6937],[83,97,140,6935],[83,97,140,1151,1152,1153,1154],[97,140,1151],[83,97,140,1155],[97,140,1207],[97,140,1206,1207],[97,140,1208,1258],[97,107,111,140,182],[97,107,140,171,182],[97,102,140],[97,104,107,140,179,182],[97,140,160,179],[97,102,140,189],[97,104,107,140,160,182],[97,99,100,103,106,140,152,171,182],[97,107,114,140],[97,99,105,140],[97,107,128,129,140],[97,103,107,140,174,182,189],[97,128,140,189],[97,101,102,140,189],[97,107,140],[97,101,102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,140],[97,107,122,140],[97,107,114,115,140],[97,105,107,115,116,140],[97,106,140],[97,99,102,107,140],[97,107,111,115,116,140],[97,111,140],[97,105,107,110,140,182],[97,99,104,107,114,140],[97,140,171],[97,102,107,128,140,187,189],[97,140,1318,1319,1320,1321,1322,1323,1324,1326,1327,1328,1329,1330,1331,1332,1333],[97,140,1318],[97,140,1318,1325],[97,140,5949],[97,140,5891],[97,140,162,473],[97,140,5460],[83,97,140,905,1046,5269],[97,140,495,863,904,1046],[83,97,140,447,457,1046,1059,4420,5471,7005,7006],[83,97,140,1046,1334,5269,5281,6693,6705,7008,7009,7010],[97,140,7010,7014],[83,97,140,1046,5269],[83,97,140,1046,1060,4417],[83,97,140,1046,5281,6903,7017],[97,140,1046,7032],[83,97,140,433,1046,4417,5269],[97,140,1046,6483,7031],[83,97,140,457,1046,4417,4420,5269,5281,7025,7031],[97,140,457,880,1046,4417,5269,7025,7031],[83,97,140,445,457,1046,4417,7029,7031],[83,97,140,1046,1215,4417,5281,7023,7024,7026,7027,7028,7030],[83,97,140,6753,6902],[83,97,140,1046,5281,7010,7035],[83,97,140,1046,5269,5281,7009],[83,97,140,1082,1083,1334,4420,5473,5474,5475,5511,6690,7040,7041,7067,7079],[83,97,140,1082,1083,5472,5475,5476,5477,5478,5479,5480,5482,5486,5487,5493,5503,5505,5506,5507,5508,5510],[83,97,140,1083],[97,140,470],[83,97,140,1082,1267,1278,5315,5478,5479,5480,5512,5513,5521,6690,7041,7061,7062,7063,7064,7065,7066,7067,7068,7069],[83,97,140,1082,5481],[83,97,140,1082,5478,5479,5480,5512,7041],[83,97,140,1082,5478,5480,5512,5522,7041],[83,97,140,1082,5478,5480,5512,7041],[83,97,140,1082,5479,5480,5512,7041],[83,97,140,1082,5479,5480,5512,5514,7041],[97,140,1082,5479,5480,5512],[83,97,140,1082,5479,5480,5512,6690,7041],[83,97,140,1082,5312,5315,5478,5479,5480,5482,5512,5779,5839,7041],[83,97,140,1082,5478,5479,5480,5512,5515,5521,5523,7041],[83,97,140,1082,5478,5480,5512,5516,7041],[97,140,5512],[97,140,1082,5479],[97,140,1082,5478,5480],[97,140,1082,5478],[97,140,1082,5480],[97,140,1082,5479,5480,5516,5521],[97,140,5520],[97,140,7041,7058],[83,97,140,1046,1083,4420,7042,7044,7045,7047,7048,7050,7051,7053,7059,7060,7070,7078],[83,97,140,1082,7041],[83,97,140,1082,5476,5477,7041,7077],[83,97,140,1082,6690,7041,7052],[97,140,1299],[97,140,1084,1278],[83,97,140,499,1046,5281],[83,97,140,433,1046,1085],[83,97,140,433,1046,1086],[83,97,140,1046,4420,7085],[83,97,140,880,1046,4420,5269,5275,5525,7086],[97,140,880,1046],[83,97,140,457,880,1046,1278,1299,4417,5275,5526,5527],[83,97,140,1046,4417,5281,5839,7088],[83,97,140,688,1046,4417,5281],[83,97,140,1046,1087,5269,7084],[83,97,140,447,457,1046,4417,5528,7006],[83,97,140,457,1046,7120],[83,97,140,433,447,457,1046,4420,5269,5275,5281,5528,6946,7007,7010,7016,7120,7121,7124,7125,7130],[83,97,140,1046,5275,6657],[97,140,1088],[97,140,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112],[83,97,140,445,7010],[83,97,140,841,1046,1092,4420],[83,97,140,1046,1089,4417,5529,7458,7459,7460],[83,97,140,1046,1089,4417],[97,140,433,1046,1089,7461,7462],[83,97,140,1046,1090,7459],[83,97,140,433,1046,1090,7464],[97,140,1046,1091],[83,97,140,433,1091,4417,7466],[83,97,140,457,1046,4420,5281,5530],[97,140,457,1046,4417,5269,5281],[83,97,140,433,1046,4417,5269,5275,5281,7519,7520,7521],[97,140,457,880,1046,4417,5269],[83,97,140,445,1046,5269,5281],[83,97,140,1046,4417,5281],[97,140,447,1046,4417,5281],[83,97,140,880,1046,4420],[97,140,1046,4420],[97,140,1046,1196,4420,7526,7527],[83,97,140,433,688,1046,5598,5599,7124,7522,7523,7524],[83,97,140,1046,1197,5598,5600],[83,97,140,457,1046,4417,5281,7529],[83,97,140,1199,7123],[83,97,140,1046,1198,4417,5269,5601,7122],[83,97,140,1046,1156],[97,140,445,447,1046,4417,5281],[83,97,140,433,1046,4417,5269,5281,6657],[97,140,1046,4420,5602],[83,97,140,1046,1200,5637,7536],[97,140,1046,1200,5660],[83,97,140,457,833,1046,1200,4417,5602,5660],[83,97,140,445,1046,4420],[97,140,457,1046,1200,5269,5683],[97,140,4417],[83,97,140,457,5269],[97,140,880,1046,5603,7542],[83,97,140,433,1046,1201,1209,4417,4420,5603],[83,97,140,880,1046],[83,97,140,1046,5281,5312,6500],[97,140,1046,1201,5603],[97,140,1046,5269],[83,97,140,1204,4420],[83,97,140,433,1046,1203,1356,4420,6018],[83,97,140,1203,4417,7549],[83,97,140,457,1046,1202,1203,1267,1356,4417],[83,97,140,433,1046,1355,4417],[83,97,140,1046,1202,1203,1205,1356,4417,5275,5606,7546],[83,97,140,1046,1203,4420],[97,140,1203,1205,1267,1355],[97,140,1046,1202],[83,97,140,433,1202,1203,5275,5605,6019,7545,7547,7548],[97,140,1046,1208],[83,97,140,1046,1209,4417,4420,5312,5607,6500],[83,97,140,880,1046,1355,4417,4420,5269,5281,7551,7552],[83,97,140,1046,5609,7544],[83,97,140,433,1046,4417,4420,5608,7544,7550,7553,7554,7555],[83,97,140,1046,1210,4417,5269,5610,7557],[83,97,140,1046,5281,7559,7561,7567],[83,97,140,1046,4420,5269,5611,7551],[83,97,140,688,1046,5612,7052,7542,7560],[83,97,140,1046,1211,4417,4420,5275,5604,5613,7560,7563],[83,97,140,1046,1212,4420,5614],[83,97,140,433,880,1046,1209,7500,7543,7555,7556,7558,7562,7564,7565,7566],[83,97,140,1046,4417,5281,7568],[97,140,1046,1213],[83,97,140,1156],[83,97,140,433,457,1046,1213,4417,4420,5269,5615,5616,7571],[83,97,140,457,1046,5281],[97,140,457,1046,4417],[83,97,140,433,457,1046,1156,4417,5269,5281,7023,7516],[83,97,140,1046,5269,5617],[97,140,433,7576],[83,97,140,1046,1278,4417,5269],[97,140,1046,1214,7578],[83,97,140,1046,1214,4417,7578],[83,97,140,447,1046,1214,1278,5269],[83,97,140,433,880,1046,1278,4417,7578,7579,7580,7581],[83,97,140,457,1046,4417,5281],[83,97,140,1046,1156,5269],[97,140,1046,5281,7585,7586,7587,7589],[83,97,140,1046,4417,4420],[97,140,1046,4417],[97,140,145,5549],[97,140,1170,5553],[97,140,1170,5552],[83,97,140,433,1108,1109,4417],[83,97,140,1108],[83,97,140,1046,1110,1278,4417,4420,4424,4425],[83,97,140,433,1278,4424],[83,97,140,433,1046,1107,4420,5585,6683,6715,6716,6717,6720,6905,6929,6932],[83,97,140,1046,1112,4417,4420,5275,5532,5585,6916],[83,97,140,1046,1111,4417,6906,7472],[83,97,140,1046,1113,4417,6692],[83,97,140,1046,1114,4417,5269,6926],[83,97,140,1046,1115,6916],[83,97,140,1046,1115,1158,1385,4417,4420,5410,5585,6906,6917],[83,97,140,433,1046,1116,4417,6920],[83,97,140,1046,1116,4417],[83,97,140,433,1116,4417,6919],[83,97,140,1046,1118,4420],[83,97,140,1118,6906,6915],[83,97,140,433,1117,1158,1385,5585,6914],[83,97,140,433,1046,1120,4417,6925],[83,97,140,1046,1119,4417,5533],[83,97,140,433,1122,4417,6923],[83,97,140,880,1046,1121,1123],[97,140,1121],[83,97,140,433,457,1121,4417,6922],[83,97,140,433,1046,1125,4417,6718],[83,97,140,880,1046,1124,4417,5534],[97,140,1046,1129,4420,5537],[83,97,140,1046,1130,4420,5537],[83,97,140,1101,1126,4420,6707,6708,6711],[83,97,140,433,1127,4420,4427,5315,5557,6684,6708,6713],[83,97,140,1046,1128,1158,4418,4420,5536,5573,5585,6692,6719],[83,97,140,1157,1158,4420,5557,5585,6712,6714],[83,97,140,1046,1132,4420,5585,6706,6707,6711],[83,97,140,433,1135,4420,4427,6685,6706],[97,140,1134],[83,97,140,1136,4420,6711],[83,97,140,433,1046,1137,4420,4427,5315,5538,5585,6684,6704,6708,6710],[97,140,1107],[83,97,140,1046,1138,1158,4418,4420,5539,5573,6692,6719],[97,140,1046,1139,4420],[83,97,140,1046,1140,4417,4420,4426],[83,97,140,1046,1141,1158,4417,4420,5585,6709],[83,97,140,1106,1131,5585,6713,6930,6931],[83,97,140,433,1046,1107,4417,4420,5269,5540,5573,5574,5585,6916,6918],[83,97,140,1046,1143,4417,4420,5541,5585,6753,6902,6903],[83,97,140,1046,1142,4420,5585,6867,6875,6902,6904],[83,97,140,1046,4420,5315,5542,5557,5585,6684,6691,6693],[83,97,140,433,1145,4420,5543,6918,6921,6924,6927],[83,97,140,1106,1144,4420,5551,5585,6912,6913,6928],[83,97,140,1046,1146,1334,4420,5550,5551,5566,5585,6704,6706,6906],[83,97,140,433,1046,1106,1146,4420,5585,6910],[83,97,140,1046,1146,4420,5544,5551,6907,6911],[97,140,1046,1106,1107],[83,97,140,1046,1106,1147,4420,5544,5585,6704],[83,97,140,1148,6704],[97,140,1046,1148,4420],[83,97,140,1046,1148,4417,5551,5585,6908,6909],[83,97,140,1046,1150,6691],[97,140,1046,1159],[97,140,1158],[83,97,140,1046,1160,4417,6691],[97,140,433,1046,1149,6685,6691,6694,6695,6696,6697,6698,6699,6700,6701,6702],[83,97,140,1046,1161,4417,4420,6691],[83,97,140,1046,1162,4417,4420,5545,6691],[83,97,140,1046,1149,4420,6684,6691,6698],[83,97,140,4420],[83,97,140,4417],[83,97,140,1046,1163,4417,4420,5269,5547,5548],[83,97,140,1165,4417,4420,6692],[83,97,140,1164,5689],[83,97,140,1046,1166,4417,4420],[83,97,140,1046,1167,4417,4420],[83,97,140,1046,1168],[97,140,1046,1169,4420,6684],[97,140,1133],[83,97,140,1046,1101,1106,1149,5551,5557,5582,5585,6703],[97,140,1101,1106,1107,1149],[83,97,140,433,1082,1101,1106,1134,1158,4420,5315,5557,5582,5585,6684,6690,6693,6704,6705],[97,140,1106,1107,1133],[83,97,140,1046,1133,1334,4420],[83,97,140,1106],[97,140,1101,1106,1158,5550,5571,5572],[97,140,457,1106,1157,1267],[97,140,1101,1106,1158,5550,5568],[97,140,457],[83,97,140,457,1156,1158,5557,5577,5578,5579,5582,5583,5584],[83,97,140,457,1156,1158,5573,5574,5575,5576],[83,97,140,1171],[83,97,140,688,1101,1106,1156,1158,5557,5572],[83,97,140,1156,1158,5557,5576],[83,97,140,1106,1156,1158,5315,5557,5572,5574,5576,5581],[83,97,140,1106,1156,1158,5557,5572,5576,5581],[97,140,1101,1106,1156,1157],[97,140,1106,5554,5587],[83,97,140,1172,1278,5580],[97,140,1106],[83,97,140,433,457,1046,5585,6677,6682,6933,6934,6938],[97,140,1101],[83,97,140,433,1046,1174,4417,7483],[97,140,1046,1175,4417,4420],[97,140,1173],[97,140,1176,4420],[83,97,140,1046,1173,4420,7481,7482],[83,97,140,433,1046,1178,4417,7485],[97,140,1046,1177],[83,97,140,433,1046,1180,4417,7488],[97,140,1046,1181],[83,97,140,1046,1179,7487],[83,97,140,1046,1182,4417],[83,97,140,1046,1183,4417],[83,97,140,1046,1184,4417],[97,140,1046,1185],[97,140,1046,1186,4417,4420,7490],[97,140,1046,7494],[97,140,7495],[83,97,140,1046,7496],[97,140,433,1046,1188,4417,4420,5591,7491],[83,97,140,1046,1187,4420,5591,7497,7498],[83,97,140,433,457,1046,6939],[97,140,5592,7085],[83,97,140,1046,1189,4420,5593],[97,140,433,437,459],[83,97,140,1046,1190,4417,4420,7094,7101,7104,7105,7110,7113,7463],[83,97,140,447,1046,1191,4420,5594],[83,97,140,447,1046,1192,4417],[97,140,1191,4417,5269],[83,97,140,457,1046,1191,4417,5269,5594,7126],[83,97,140,457,1046,1191,4417,4420,5275,5594,7010,7120,7126,7127,7128,7129],[83,97,140,1046,5281,7010],[83,97,140,1046,5269,5281,6459],[83,97,140,1046,5269,5281,7509],[83,97,140,457,495,1046,5281,5326,6459,7010,7506,7507,7508,7510],[83,97,140,433,1046,1193,4420,5269],[83,97,140,1046,6657],[83,97,140,1046,4420],[83,97,140,5269,5618,7564],[83,97,140,4420,5281],[83,97,140,1046,6486],[97,140,4420,6481,6482],[83,97,140,457,1046,1194,4417,5269],[83,97,140,433],[83,97,140,457,1046,1194,4417,4420,7019],[83,97,140,433,457,1194,5596,7020,7021,7022],[83,97,140,1046,1195,4417,5269],[83,97,140,433,457,1046,1156,4417,5269,5557,5597,7023,7515,7516],[97,140,1046,6500],[97,140,433,880,1046,4417,7513],[83,97,140,759,1046,7500,7514],[97,140,5318],[97,140,457,5363,5376,5619,5637,5660,5683],[83,97,140,457,905,1156,5275,5700,7594,7595],[83,97,140,457,5712,5713,5732,5846],[83,97,140,7594],[83,97,140,5275,5688],[97,140,166,457],[97,140,457,1215,5376],[83,97,140,1156,1278,5320,5700],[97,140,457,5319,5320,5326,5327,5376],[97,140,1156,5702,6938],[97,140,1224,1278],[83,97,140,433,6459,7604,7606,7617],[83,97,140,457,1215,1216,1278,5318,5320,5721,5722],[83,97,140,1215,1278,5318,5722],[83,97,140,457,1215,5320,5723],[97,140,1215,1278],[97,140,1215],[83,97,140,1217,5376,7624],[97,140,1224],[97,140,5320],[97,140,688,5378],[97,140,5379],[97,140,1224,5307],[97,140,5713],[97,140,1224,1334,5320],[97,140,457,688,1046,1223,1224,1334,5310,5312,5315,5317,5318,5319],[97,140,5711,5712],[97,140,5712,5713,5730],[97,140,1156,5712,5731],[83,97,140,1156,1224],[83,97,140,1156,1224,5377,5730,5731],[83,97,140,1156,1224,1278,5703,5730,5733,5734],[83,97,140,5376],[83,97,140,5377],[97,140,145,5549,5558],[97,140,1219,1267],[83,97,140,457,1156,5560,5727],[83,97,140,1156,1267,5558,5559,5560],[97,140,1219,1278],[97,140,1156,1219,5559],[97,140,1224,5728],[97,140,1101,5562,5564,5568],[97,140,1101,5550,5561,5568],[97,140,1101,5562,5563,5564,5565,5566,5567],[97,140,1101,5562,5563,5568],[97,140,1101,5562],[97,140,1101,5550,5561,5562,5568],[97,140,1095,1096,1097,1098,1099,1100],[97,140,1095,1096,1098],[97,140,1098],[97,140,1095,1096,1097],[97,140,1099],[97,140,5827,5828,5829],[97,140,1101,1106,5558,5560,5561,5569,5570],[97,140,1106,5570,5571,5824,5825,5827],[97,140,1101,5586],[97,140,1101,1106,5561,5569],[97,140,1101,1106,5560,5571,5586],[97,140,1093,1094,1102,1103,1104,1105],[97,140,1101,1103],[97,140,1094,1101],[97,140,1093],[97,140,5570],[97,140,1094,1101,1102,1224,5738,5826,5828],[97,140,1101,5561,5568],[97,140,1223,1224,5320,5380],[97,140,445,1046,1106,1223],[97,140,422,433,1046,1278,1300,6026,6654,6657],[97,140,431],[83,97,140,433,457,1046,5269,5281],[83,97,140,433,457,1046,4417,5269,5281],[83,97,140,433,445,457,1046,4420,5275,5660,6946],[83,97,140,433,457,1046,5275,5683,6947],[83,97,140,433,457,1046],[83,97,140,433,457,688,759,1046,4417,5269,5281],[83,97,140,457,1046,5275],[97,140,5376,5561,5830],[83,97,140,1156,5839],[83,97,140,457,1156],[97,140,1334,5410],[97,140,474],[83,97,140,1156,5845,5846],[97,140,5850],[97,140,1046,1259,1260],[97,140,1220,5427,5428],[97,140,1220,5433,5434],[97,140,5427,5428,5433],[97,140,5437],[97,140,1220,5438,5439],[97,140,5427,5428,5437],[97,140,159,162,182,1232,5864,5866],[97,140,1220,1221],[97,140,1220,1221,1232,5865],[97,140,1221],[97,140,1220],[97,140,1232,1235,5424,5425,5868,5870],[97,140,153,162,182,1224],[97,140,141,162,182,1220,5864],[97,140,1222,1224,1225,1232,1234],[97,140,1232,1234,5424,5426],[97,140,1225,1232,1233],[97,140,1232],[97,140,1222,1232,1233,1234,5425],[97,140,1232,5427,5875],[97,140,1222,1232,1234,1235,5868],[97,140,1220,1232,5868,5869],[97,140,1220,1234,1235],[97,140,1236,5326]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"51409be337d5cdf32915ace99a4c49bf62dbc124a49135120dfdff73236b0bad","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b80c6175da9de59bace50a72c2d68490d4ab5b07016ff5367bc7ba33cf2f219","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"08faa97886e71757779428dd4c69a545c32c85fd629d1116d42710b32c6378bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b042aa5d277ad6963e2837179fd2f8fbb01968ac67115b0833c0244e93d1d50","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"23cfd70b42094e54cc3c5dab996d81b97e2b6f38ccb24ead85454b8ddfe2fc4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"c4a806152acbef81593f96cae6f2b04784d776457d97adbe2694478b243fcf03","impliedFormat":1},{"version":"71adf5dbc59568663d252a46179e71e4d544c053978bfc526d11543a3f716f42","impliedFormat":1},{"version":"c60db41f7bee80fb80c0b12819f5e465c8c8b465578da43e36d04f4a4646f57d","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"e184c4b8918ef56c8c9e68bd79f3f3780e2d0d75bf2b8a41da1509a40c2deb46","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b19db3600a17af69d4f33d08cc7076a7d19fb65bb36e442cac58929ec7c9482","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"ba1f814c22fd970255ddd60d61fb7e00c28271c933ab5d5cc19cd3ca66b8f57c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"295f068af94245ee9d780555351bef98adfd58f8baf0b9dadbc31a489b881f8b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"09d479208911ac3ac6a7c2fe86217fc1abe6c4f04e2d52e4890e500699eeab32","affectsGlobalScope":true,"impliedFormat":1},{"version":"27d8987fd22d92efe6560cf0ce11767bf089903ffe26047727debfd1f3bf438b","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"f23dfbb07f71e879e5a23cdd5a1f7f1585c6a8aae8c250b6eba13600956c72dd","impliedFormat":1},{"version":"b2ba94df355e65e967875bf67ea1bbf6d5a0e8dc141a3d36d5b6d7c3c0f234b6","impliedFormat":1},{"version":"115b2ad73fa7d175cd71a5873d984c21593b2a022f1a2036cc39d9f53629e5dc","impliedFormat":1},{"version":"1be330b3a0b00590633f04c3b35db7fa618c9ee079258e2b24c137eb4ffcd728","impliedFormat":1},{"version":"45a9b3079cd70a2668f441b79b4f4356b4e777788c19f29b6f42012a749cfea6","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"7bd32a723a12f78ed756747468f2030bdd55774c68f628de07598dba5b912b14","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"a1d3d6e9718cceaf1e4352845387af0620564d3d2dff02611a5c3276f73c26cb","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"57d6ac03382e30e9213641ff4f18cf9402bb246b77c13c8e848c0b1ca2b7ef92","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"57e47d02e88abef89d214cdf52b478104dc17997015746e288cbb580beaef266","impliedFormat":1},{"version":"b1177acd771acfcc2648a03fc03ad3b3a1b1d2bdfa6769db0f669293b596ca13","impliedFormat":1},{"version":"3494c5bf00c1a40293ee5ff5128334b63d346abbf560c8987202c92dbc5bdc48","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"99d62b942e98f691f508fc752637fec27661970aa3b0f5eb5a1e2775b995c273","impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","impliedFormat":1},{"version":"48d37b90a04e753a925228f50304d02c4f95d57bf682f8bb688621c3cd9d32ec","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"b68c4ed987ef5693d3dccd85222d60769463aca404f2ffca1c4c42781dce388e","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"12b8dfed70961bea1861e5d39e433580e71323abb5d33da6605182ec569db584","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"7e560f533aaf88cf9d3b427dcf6c112dd3f2ee26d610e2587583b6c354c753db","impliedFormat":1},{"version":"71e0082342008e4dfb43202df85ea0986ef8e003c921a1e49999d0234a3019da","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ce41407ff95aad31e28897741dfffb236d966eb38894f7a791c3a575b53f9d02","impliedFormat":1},{"version":"fac1803c07fbc9574815fdb83afddd9d0d4a2ce13f56d4e4cbb4525f8c09ee0a","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"5eef43ef86c9c3945780211c2ce25cb9b66143a102713e56a2bea85163c5c3c7","impliedFormat":1},{"version":"a2a1cdf7273ad6641938a487ecf2fdd38f60abce41907817e44ab39e482e8739","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"4548fac59ea69a3ffd6c0285a4c53e0d736d936937b74297e3b5c4dfcd902419","impliedFormat":1},{"version":"4da246ee3b860278888dd51913e6407a09ca43530db886e7bec2a592c9b9bde6","impliedFormat":1},{"version":"8c05ac9ead787bfc3e144b88bdc7d1ad8c0c7f1cd8412ab58cd3e1208d1990af","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"8bba776476c48b0e319d243f353190f24096057acede3c2f620fee17ff885dba","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"2b2f9dac86b659e6d5cd623bcc21519910a48114fc0cef52d8f86962c48d44e2","impliedFormat":1},{"version":"7e8b76334c75984d57a810a0652c61066ffacede59001dfc5c633565f791ee60","impliedFormat":1},{"version":"72ca9ca89ca15055cbb6ce767b6bf56615be5f1ea6a87ab432ee0603c8d19010","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"cecad464ddaf764e5490018d248a8df1733f3d63435fbddac72941c1f4005b66","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"51b1709e7ad186919a0e30237a8607100143a86d28771b3d3f046359aca1e65c","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"56013416784a6b754f3855f8f2bf6ce132320679b8a435389aca0361bce4df6b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"30f4dab03b4bc54def77049ee3a10137109cf3b4acf2fd0e885c619760cfe694","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c51641ab4bfa31b7a50a0ca37edff67f56fab3149881024345b13f2b48b7d2de","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"52abbd5035a97ebfb4240ec8ade2741229a7c26450c84eb73490dc5ea048b911","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"4360ad4de54de2d5c642c4375d5eab0e7fe94ebe8adca907e6c186bbef75a54d","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"9c9cae45dc94c2192c7d25f80649414fa13c425d0399a2c7cb2b979e4e50af42","impliedFormat":1},{"version":"6c87b6bcf4336b29c837ea49afbdde69cc15a91cbbfd9f20c0af8694927dec08","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"6dd9bcf10678b889842d467706836a0ab42e6c58711e33918ed127073807ee65","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"ef9efc827cdad89c4ee54142164c793f530aa4d844ca9121cc35368310d5fb9c","impliedFormat":1},{"version":"643672ce383e1c58ea665a92c5481f8441edbd3e91db36e535abccbc9035adeb","impliedFormat":1},{"version":"8fa022ea514ce0ea78ac9b7092a9f97f08ead20c839c779891019e110fce8307","impliedFormat":1},{"version":"c93235337600b786fd7d0ff9c71a00f37ca65c4d63e5d695fc75153be2690f09","impliedFormat":1},{"version":"fa45f48f2def181ab2fb107a032c91b6c043ad05a179f3fbaafb8e5411fd01e4","impliedFormat":1},{"version":"a8e493c0355aabdd495e141bf1c4ec93454a0698c8675df466724adc2fcfe630","impliedFormat":1},{"version":"99702c9058170ae70ea72acbf01be3111784f06152dbf478f52c9afe423528bd","impliedFormat":1},{"version":"cf32f58a7ad3498c69c909121772971ffdee176b882f39c78532d0e0ab41a30d","impliedFormat":1},{"version":"e2bbc579a2fda9473e06b2a68d693e56928900f73ccfc03dabea789fe144e8a5","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"d05fb434f4ba073aed74b6c62eff1723c835de2a963dbb091e000a2decb5a691","impliedFormat":1},{"version":"bff8c8bffbf5f302a30ccb1c0557dae477892d50a80eecfe393bd89bac7fb41d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"a58abf1f5c8feb335475097abeddd32fd71c4dc2065a3d28cf15cacabad9654a","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"f0f05149debcf31b3a717ce8dd16e0323a789905cb9e27239167b604153b8885","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"b4f4d239a6632b86b315a6e4cfe0fac4e4bf6c934263bc07dd2bf5c7dbb8e6a5","impliedFormat":1},{"version":"0d44227395ae4a117dd7c8c9a048e18ade1f1f631bc5b883f9d469126e3cedab","impliedFormat":1},{"version":"9e21f8e2c0cfea713a4a372f284b60089c0841eb90bf3610539d89dbcd12d65a","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"a072c5f254d5cbb6522c0d4eeeb7cc4a6ce7f2f8ad84e2593d903bfe3aa44176","impliedFormat":1},{"version":"52b390f86821086a1be50100487faa9f7b23fc04343efb590f304382b4950e04","impliedFormat":1},{"version":"87122b31fe473758a5724388c93826caab566f62be2196aefc2ae8b04b814b52","impliedFormat":1},{"version":"063ab26d3488a665d2c3bc963b18ce220dad7351190629179165bc8c499c6cd9","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"fb400501bee56d86fa9b490e9d8b07d7df163d34d8235fcea27c3f9e8d064d1a","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"794998dc1c5a19ce77a75086fe829fb9c92f2fd07b5631c7d5e0d04fd9bc540c","impliedFormat":1},{"version":"409678793827cdf5814e027b1f9e52a0445acb1c322282311c1c4e0855a0918e","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"3545dc8a9bdbd33db34462af7eed83f703083e4fee9135dadbba7edfe1e7db3c","impliedFormat":1},{"version":"7b5153a9b237898879441e5ddb576ded76ef3ab4c5baee4bb749ca5c72fc395d","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"d5c2934185201f0768fb80d220f0e617cd05aa4c0c791ffcd508646c474b3c44","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"e326c507507d6c6f3df4152e9e132a6189b30e14a262782796c2a627ba5d42cc","impliedFormat":1},{"version":"75efc43fb206f3825eb219c96b1e59fdabf2f2f042f424fa5f96335b99897540","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"ca651584d8d718c1f0655ec4b0c340fbcd967ec1e1758807af3a3f43bc81f81e","impliedFormat":1},{"version":"cfb5f0ab72180f4e0b9ed1534847a63d5394b9a8ee685ae149d25fd53f1aec66","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"f613e4e752659ebd241be4d991c05200248b50e753fcecf50a249d30f4367794","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"de1ccef0cb3623291d55871e39eb7005cb79d8da519cb46959b0ba5e2422184f","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"7cd657e359eac7829db5f02c856993e8945ffccc71999cdfb4ab3bf801a1bbc6","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"f0f3f57e29b40e9cb0c4b155a96de2f61e51700d2c335dd547ef3c85e668c6a8","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"35117a2e59d2eca30c1848c9ff328c75d131d3468f8649c9012ca885c80fe2ce","impliedFormat":1},{"version":"6a76daf108400ca1333e325772f24f40ebdde2120ef68f8c87d7a1adf0257541","impliedFormat":1},{"version":"313698394e61f0343ebf11b64e5cde7e948110eaba98e8dbd7bdd67ee8df2639","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"91357dba2d5a7234ccfae834dc8363b5635e08f373bd18f548a9046b01864619","impliedFormat":1},{"version":"f31bbb122869d8903ff13c1036bdefc1e6a5bac9b2c3c35e42a9de84d43cd04a","impliedFormat":1},{"version":"c7fdbcfa0991e15215e2a5751676115cac943b39289791546c7197d7bb889c51","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"4eac446ac161245bfc6daa95f2cc64d2da4f7844e36a7a5641abfd4771ef0923","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"076527b1c2fd207de3101ba10e0c2b7d155aa8369cc7fe3eed723811e428223d","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"397f568f996f8ffcf12d9156342552b0da42f6571eadba6bce61c99e1651977d","impliedFormat":1},{"version":"ff0c0d446569f8756be0882b520fd94429468de9f922ab6bf9eed4da55eb0187","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"a52674bc98da7979607e0f44d4c015c59c1b1d264c83fc50ec79ff2cfea06723","impliedFormat":1},{"version":"89b3d1b267c4380fbb8e5cadccbb284843b90066f16a2f6e8a5b3a030bb7dcfb","impliedFormat":1},{"version":"f58226e78464f9c85be6cf47c665a8e33b32121ab4cdb2670b66a06f1114a55c","impliedFormat":1},{"version":"9b06ce81ad598c9c6b011cb66182fa66575ad6bd1f8f655830a6a0223a197ab7","impliedFormat":1},{"version":"e108f38a04a607f9386d68a4c6f3fdae1b712960f11f6482c6f1769bab056c2e","impliedFormat":1},{"version":"a3128a84a9568762a2996df79717d92154d18dd894681fc0ab3a098fa7f8ee3b","affectsGlobalScope":true,"impliedFormat":1},{"version":"347791f3792f436950396dd6171d6450234358001ae7c94ca209f1406566ccbf","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"51bf55bb6eb80f11b3aa59fb0a9571565a7ea304a19381f6da5630f4b2e206c4","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"5c96bad5f78466785cdad664c056e9e2802d5482ca5f862ed19ba34ffbb7b3a4","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb0cd7862b72f5eba39909c9889d566e198fcaddf7207c16737d0c2246112678","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"bad68fd0401eb90fe7da408565c8aee9c7a7021c2577aec92fa1382e8876071a","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"fec01479923e169fb52bd4f668dbeef1d7a7ea6e6d491e15617b46f2cacfa37d","impliedFormat":1},{"version":"8a8fb3097ba52f0ae6530ec6ab34e43e316506eb1d9aa29420a4b1e92a81442d","impliedFormat":1},{"version":"44e09c831fefb6fe59b8e65ad8f68a7ecc0e708d152cfcbe7ba6d6080c31c61e","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"4655709c9cb3fd6db2b866cab7c418c40ed9533ce8ea4b66b5f17ec2feea46a9","impliedFormat":1},{"version":"87affad8e2243635d3a191fa72ef896842748d812e973b7510a55c6200b3c2a4","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"22b87e96a61c525464e115db0148593a861e77806fd37ab280e1903019a6e212","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"9a01f12466488eccd8d9eafc8fecb9926c175a4bf4a8f73a07c3bcf8b3363282","impliedFormat":1},{"version":"b80f624162276f24a4ec78b8e86fbee80ca255938e12f8b58e7a8f1a6937120b","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"a61e739f0b2c0165086c77a28d7e4b58a2a8703c646cd1e1641788484afc6ff2","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"9e40365afca304124bc53eb03412643abf074a1580e4dc279a7a16000d11f985","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"ceec3c81b2d81f5e3b855d9367c1d4c664ab5046dff8fd56552df015b7ccbe8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4e18cfe14fa8602c7ff80cbbddb91e31608e5ae20bd361fe7e6a607706cb033c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a1219ee18b9282b4c6a31f1f0bcc9255b425e99363268ba6752a932cf76662f0","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"1d63055b690a582006435ddd3aa9c03aac16a696fac77ce2ed808f3e5a06efab","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"7dea1a8e7f1f9dd9e13ecc19d6b8a3d43d8d14bfdf9c423b67b51b54dfcbd141",{"version":"764fec087122d840f12f9f24e1dc1e4cc2dcb222f3d13d2a498bf332fbe460d7","impliedFormat":1},{"version":"e2fcce840457c1096432ebce06f488efdadca70af969a90106bfad26bbabc1ec","impliedFormat":1},{"version":"05d1a8f963258d75216f13cf313f27108f83a8aa2bff482da356f2bfdfb59ab2","impliedFormat":1},{"version":"dc2e5bfd57f5269508850cba8b2375f5f42976287dbdb2c318f6427cd9d21c73","impliedFormat":1},{"version":"b1fb9f004934ac2ae15d74b329ac7f4c36320ff4ada680a18cc27e632b6baa82","impliedFormat":1},{"version":"f13c5c100055437e4cf58107e8cbd5bb4fa9c15929f7dc97cb487c2e19c1b7f6","impliedFormat":1},{"version":"ee423b86c3e071a3372c29362c2f26adc020a2d65bcbf63763614db49322234e","impliedFormat":1},{"version":"77d30b82131595dbb9a21c0e1e290247672f34216e1af69a586e4b7ad836694e","impliedFormat":1},{"version":"78d486dac53ad714133fc021b2b68201ba693fab2b245fda06a4fc266cead04a","impliedFormat":1},{"version":"06414fbc74231048587dedc22cd8cac5d80702b81cd7a25d060ab0c2f626f5c8","impliedFormat":1},{"version":"b8533e19e7e2e708ac6c7a16ae11c89ffe36190095e1af146d44bb54b2e596a1","impliedFormat":1},{"version":"b5f70f31ef176a91e4a9f46074b763adc321cd0fdb772c16ca57b17266c32d19","impliedFormat":1},{"version":"17de43501223031e8241438822b49eed2a9557efbecd397cb74771f7a8d1d619","impliedFormat":1},{"version":"df787170bf40316bdb5f59e2227e5e6275154bd39f040898e53339d519ecbf33","impliedFormat":1},{"version":"5eaf2e0f6ea59e43507586de0a91d17d0dd5c59f3919e9d12cbab0e5ed9d2d77","impliedFormat":1},{"version":"be97b1340a3f72edf8404d1d717df2aac5055faaff6c99c24f5a2b2694603745","impliedFormat":1},{"version":"1754df61456e51542219ee17301566ac439115b2a1e5da1a0ffb2197e49ccefe","impliedFormat":1},{"version":"2c90cb5d9288d3b624013a9ca40040b99b939c3a090f6bdca3b4cfc6b1445250","impliedFormat":1},{"version":"3c6d4463866f664a5f51963a2849cb844f2203693be570d0638ee609d75fe902","impliedFormat":1},{"version":"61ed06475fa1c5c67ede566d4e71b783ec751ca5e7f25d42f49c8502b14ecbd6","impliedFormat":1},{"version":"e88b42f282b55c669a8f35158449b4f7e6e2bccec31fd0d4adb4278928a57a89","impliedFormat":1},{"version":"2a1ed52adfc72556f4846b003a7e5a92081147beef55f27f99466aa6e2a28060","impliedFormat":1},{"version":"a4cf825c93bb52950c8cdc0b94c5766786c81c8ee427fc6774fafb16d0015035","impliedFormat":1},{"version":"4acc7fae6789948156a2faabc1a1ba36d6e33adb09d53bccf9e80248a605b606","impliedFormat":1},{"version":"fc627448a14f782ce51f8e48961688b695bc8a97efab0aa1faecbfc040e977c8","impliedFormat":1},{"version":"b182e2043a595bca73dd39930020425d55c5ff2aae1719d466dadeadc78273c7","impliedFormat":1},{"version":"5b978a20707f2b3b4fa39ca3ba9d0d12590bf4c4167beb3195bcd1421115256f","impliedFormat":1},{"version":"ed1ee10044d15a302d95b2634e6344b9f630528e3d5d7ce0eacad5958f0976c3","impliedFormat":1},{"version":"d18588312a7634d07e733e7960caf78d5b890985f321683b932d21d8d0d69b7b","impliedFormat":1},{"version":"d1dac573a182cc40c170e38a56eb661182fcd8981e9fdf2ce11df9decb73485d","impliedFormat":1},{"version":"c264198b19a4b9718508b49f61e41b6b17a0f9b8ecbf3752e052ad96e476e446","impliedFormat":1},{"version":"9c488a313b2974a52e05100f8b33829aa3466b2bc83e9a89f79985a59d7e1f95","impliedFormat":1},{"version":"e306488a76352d3dd81d8055abf03c3471e79a2e5f08baede5062fa9dca3451c","impliedFormat":1},{"version":"ad7bdd54cf1f5c9493b88a49dc6cec9bc9598d9e114fcf7701627b5e65429478","impliedFormat":1},{"version":"0d274e2a6f13270348818139fd53316e79b336e8a6cf4a6909997c9cbf47883c","impliedFormat":1},{"version":"78664c8054da9cce6148b4a43724195b59e8a56304e89b2651f808d1b2efb137","impliedFormat":1},{"version":"a0568a423bd8fee69e9713dac434b6fccc5477026cda5a0fc0af59ae0bfd325c","impliedFormat":1},{"version":"2a176a57e9858192d143b7ebdeca0784ee3afdb117596a6ee3136f942abe4a01","impliedFormat":1},{"version":"c8ee4dd539b6b1f7146fa5b2d23bca75084ae3b8b51a029f2714ce8299b8f98e","impliedFormat":1},{"version":"c58f688364402b45a18bd4c272fc17b201e1feddc45d10c86cb7771e0dc98a21","impliedFormat":1},{"version":"2904898efb9f6fabfe8dcbe41697ef9b6df8e2c584d60a248af4558c191ce5cf","impliedFormat":1},{"version":"c13189caa4de435228f582b94fb0aae36234cba2b7107df2c064f6f03fc77c3d","impliedFormat":1},{"version":"c97110dbaa961cf90772e8f4ee41c9105ee7c120cb90b31ac04bb03d0e7f95fb","impliedFormat":1},{"version":"c30864ed20a4c8554e8025a2715ba806799eba20aba0fd9807750e57ee2f838f","impliedFormat":1},{"version":"b182e2043a595bca73dd39930020425d55c5ff2aae1719d466dadeadc78273c7","impliedFormat":1},{"version":"5b978a20707f2b3b4fa39ca3ba9d0d12590bf4c4167beb3195bcd1421115256f","impliedFormat":1},{"version":"ed1ee10044d15a302d95b2634e6344b9f630528e3d5d7ce0eacad5958f0976c3","impliedFormat":1},{"version":"c30864ed20a4c8554e8025a2715ba806799eba20aba0fd9807750e57ee2f838f","impliedFormat":1},{"version":"e0cd55e58a4a210488e9c292cc2fc7937d8fc0768c4a9518645115fe500f3f44","impliedFormat":1},{"version":"d0307177b720b32a05c0bbb921420160cba0d3b6e81b1d961481d9abe4a17f60","impliedFormat":1},{"version":"8c25b00a675743d7a381cf6389ae9fbdce82bdc9069b343cb1985b4cd17b14be","impliedFormat":1},{"version":"e72b4624985bd8541ae1d8bde23614d2c44d784bbe51db25789a96e15bb7107a","impliedFormat":1},{"version":"0fb1449ca2990076278f0f9882aa8bc53318fc1fd7bfcbde89eed58d32ae9e35","impliedFormat":1},{"version":"c2625e4ba5ed1cb7e290c0c9eca7cdc5a7bebab26823f24dd61bf58de0b90ad6","impliedFormat":1},{"version":"a20532d24f25d5e73f05d63ad1868c05b813e9eb64ec5d9456bbe5c98982fd2e","impliedFormat":1},{"version":"d0307177b720b32a05c0bbb921420160cba0d3b6e81b1d961481d9abe4a17f60","impliedFormat":1},{"version":"7a17edfdf23eaaf79058134449c7e1e92c03e2a77b09a25b333a63a14dca17ed","impliedFormat":1},{"version":"e78c5d07684e1bb4bf3e5c42f757f2298f0d8b364682201b5801acf4957e4fad","impliedFormat":99},{"version":"4085598deeaff1b924e347f5b6e18cee128b3b52d6756b3753b16257284ceda7","impliedFormat":99},{"version":"c58272e3570726797e7db5085a8063143170759589f2a5e50387eff774eadc88","impliedFormat":1},{"version":"f0cf7c55e1024f5ad1fc1c70b4f9a87263f22d368aa20474ec42d95bb0919cfc","impliedFormat":1},{"version":"bc3ee6fe6cab0459f4827f982dbe36dcbd16017e52c43fec4e139a91919e0630","impliedFormat":1},{"version":"41e0d68718bf4dc5e0984626f3af12c0a5262a35841a2c30a78242605fa7678e","impliedFormat":1},{"version":"6c747f11c6b2a23c4c0f3f440c7401ee49b5f96a7fe4492290dfd3111418321b","impliedFormat":1},{"version":"a6b6c40086c1809d02eff72929d0fc8ec33313f1c929398c9837d31a3b05c66b","impliedFormat":1},{"version":"cd07ac9b17acb940f243bab85fa6c0682c215983bf9bcc74180ae0f68c88d49c","impliedFormat":1},{"version":"55d70bb1ac14f79caae20d1b02a2ad09440a6b0b633d125446e89d25e7fd157d","impliedFormat":1},{"version":"c27930b3269795039e392a9b27070e6e9ba9e7da03e6185d4d99b47e0b7929bc","impliedFormat":1},{"version":"1c4773f01ab16dc0e728694e31846e004a603da8888f3546bc1a999724fd0539","impliedFormat":1},{"version":"47f30de14aa377b60f0cd43e95402d03166d3723f42043ae654ce0a25bc1b321","impliedFormat":1},{"version":"0edcda97d090708110daea417cfd75d6fd0c72c9963fec0a1471757b14f28ae5","impliedFormat":1},{"version":"f730a314c6e3cb76b667c2c268cd15bde7068b90cb61d1c3ab93d65b878d3e76","impliedFormat":1},{"version":"c60096bf924a5a44f792812982e8b5103c936dd7eec1e144ded38319a282087e","impliedFormat":1},{"version":"f9acf26d0b43ad3903167ac9b5d106e481053d92a1f3ab9fe1a89079e5f16b94","impliedFormat":1},{"version":"014e069a32d3ac6adde90dd1dfdb6e653341595c64b87f5b1b3e8a7851502028","impliedFormat":1},{"version":"ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","impliedFormat":1},{"version":"ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","impliedFormat":1},{"version":"ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","impliedFormat":1},{"version":"ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","impliedFormat":1},{"version":"ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","impliedFormat":1},{"version":"86c8f1a471f03ac5232073884775b77d7673516a1eff3b9c4a866c64a5b1693a","impliedFormat":1},{"version":"5545aa84048e8ae5b22838a2b437abd647c58acc43f2f519933cd313ce84476c","impliedFormat":1},{"version":"0d2af812b3894a2daa900a365b727a58cc3cc3f07eb6c114751f9073c8031610","impliedFormat":1},{"version":"30be069b716d982a2ae943b6a3dab9ae1858aa3d0a7218ab256466577fd7c4ca","impliedFormat":1},{"version":"797b6a8e5e93ab462276eebcdff8281970630771f5d9038d7f14b39933e01209","impliedFormat":1},{"version":"549232dd97130463d39dac754cf7faa95c4c71511d11dd9b1d37c225bf675469","impliedFormat":1},{"version":"747779d60c02112794ca81f1641628387d68c8e406be602b87af9ae755d46fd6","impliedFormat":1},{"version":"0a22c78fc4cbf85f27e592bea1e7ece94aadf3c6bd960086f1eff2b3aedf2490","impliedFormat":1},{"version":"fea1857ed9f8e33be23a5a3638c487b25bb44b21032c6148144883165ad10fb0","impliedFormat":1},{"version":"d0cffd20a0deb57297c2bd8c4cd381ed79de7babf9d81198e28e3f56d9aff0db","impliedFormat":1},{"version":"77876c19517f1a79067a364423ba9e4f3c6169d01011320a6fde85a95e8f8f5c","impliedFormat":1},{"version":"84cf3736a269c74c711546db9a8078ad2baaf12e9edd5b33e30252c6fb59b305","impliedFormat":1},{"version":"8309b403027c438254d78ca2bb8ddd04bfaf70260a9db37219d9a49ad6df5d80","impliedFormat":1},{"version":"6a9d4bd7a551d55e912764633a086af149cc937121e011f60f9be60ee5156107","impliedFormat":1},{"version":"f1cea620ee7e602d798132c1062a0440f9d49a43d7fafdc5bdc303f6d84e3e70","impliedFormat":1},{"version":"5769d77cb83e1f931db5e3f56008a419539a1e02befe99a95858562e77907c59","impliedFormat":1},{"version":"1607892c103374a3dc1f45f277b5362d3cb3340bfe1007eec3a31b80dd0cf798","impliedFormat":1},{"version":"33efc51f2ec51ff93531626fcd8858a6d229ee4a3bbcf96c42e7ffdfed898657","impliedFormat":1},{"version":"220aafeafa992aa95f95017cb6aecea27d4a2b67bb8dd2ce4f5c1181e8d19c21","impliedFormat":1},{"version":"a71dd28388e784bf74a4bc40fd8170fa4535591057730b8e0fef4820cf4b4372","impliedFormat":1},{"version":"6ba4e948766fc8362480965e82d6a5b30ccc4fda4467f1389aba0dcff4137432","impliedFormat":1},{"version":"4e4325429d6a967ef6aa72ca24890a7788a181d28599fe1b3bb6730a6026f048","impliedFormat":1},{"version":"dcbb4c3abdc5529aeda5d6b0a835d8a0883da2a76e9484a4f19e254e58faf3c6","impliedFormat":1},{"version":"0d81307f711468869759758160975dee18876615db6bf2b8f24188a712f1363b","impliedFormat":1},{"version":"22ddd9cd17d33609d95fb66ece3e6dff2e7b21fa5a075c11ef3f814ee9dd35c7","impliedFormat":1},{"version":"cb43ede907c32e48ba75479ca867464cf61a5f962c33712436fee81431d66468","impliedFormat":1},{"version":"549232dd97130463d39dac754cf7faa95c4c71511d11dd9b1d37c225bf675469","impliedFormat":1},{"version":"1e89d5e4c50ca57947247e03f564d916b3b6a823e73cde1ee8aece5df9e55fc9","impliedFormat":1},{"version":"8538eca908e485ccb8b1dd33c144146988a328aaa4ffcc0a907a00349171276e","impliedFormat":1},{"version":"7b878f38e8233e84442f81cc9f7fb5554f8b735aca2d597f7fe8a069559d9082","impliedFormat":1},{"version":"bf7d8edbd07928d61dbab4047f1e47974a985258d265e38a187410243e5a6ab9","impliedFormat":1},{"version":"747779d60c02112794ca81f1641628387d68c8e406be602b87af9ae755d46fd6","impliedFormat":1},{"version":"40b33243bbbddfe84dbdd590e202bdba50a3fe2fbaf138b24b092c078b541434","impliedFormat":1},{"version":"fea1857ed9f8e33be23a5a3638c487b25bb44b21032c6148144883165ad10fb0","impliedFormat":1},{"version":"f21d84106071ae3a54254bcabeaf82174a09b88d258dd32cafb80b521a387d42","impliedFormat":1},{"version":"21129c4f2a3ae3f21f1668adfda1a4103c8bdd4f25339a7d7a91f56a4a0c8374","impliedFormat":1},{"version":"7c4cf13b05d1c64ce1807d2e5c95fd657f7ef92f1eeb02c96262522c5797f862","impliedFormat":1},{"version":"eebe1715446b4f1234ce2549a8c30961256784d863172621eb08ae9bed2e67a3","impliedFormat":1},{"version":"64ad3b6cbeb3e0d579ebe85e6319d7e1a59892dada995820a2685a6083ea9209","impliedFormat":1},{"version":"5ebdc5a83f417627deff3f688789e08e74ad44a760cdc77b2641bb9bb59ddd29","impliedFormat":1},{"version":"a514beab4d3bc0d7afc9d290925c206a9d1b1a6e9aa38516738ce2ff77d66000","impliedFormat":1},{"version":"d80212bdff306ee2e7463f292b5f9105f08315859a3bdc359ba9daaf58bd9213","impliedFormat":1},{"version":"86b534b096a9cc35e90da2d26efbcb7d51bc5a0b2dde488b8c843c21e5c4701b","impliedFormat":1},{"version":"906dc747fd0d44886e81f6070f11bd5ad5ed33c16d3d92bddc9e69aad1bb2a5c","impliedFormat":1},{"version":"e46d7758d8090d9b2c601382610894d71763a9909efb97b1eebbc6272d88d924","impliedFormat":1},{"version":"03af1b2c6ddc2498b14b66c5142a7876a8801fcac9183ae7c35aec097315337a","impliedFormat":1},{"version":"294b7d3c2afc0d8d3a7e42f76f1bac93382cb264318c2139ec313372bbfbde4f","impliedFormat":1},{"version":"a7bc0f0fd721b5da047c9d5a202c16be3f816954ad65ab684f00c9371bc8bac2","impliedFormat":1},{"version":"4bf7b966989eb48c30e0b4e52bfe7673fb7a3fb90747bdc5324637fc51505cd1","impliedFormat":1},{"version":"05590ca2cee1fa8efb08cf7a49756de85686403739e7f8d25ada173e8926e3ee","impliedFormat":1},{"version":"c2d3538fabf7d43abd7599ff74c372800130e67674eb50b371a6c53646d2b977","impliedFormat":1},{"version":"10e006d13225983120773231f9fcc0f747a678056161db5c3c134697d0b4cb60","impliedFormat":1},{"version":"b456eb9cb3ff59d2ad86d53c656a0f07164e9dccbc0f09ac6a6f234dc44714ea","impliedFormat":1},{"version":"f447b1d7ea71014329442db440cf26415680f2e400b1495bf87d8b6a4da3180f","impliedFormat":1},{"version":"8baf3ec31869d4e82684fe062c59864b9d6d012b9105252e5697e64212e38b74","impliedFormat":1},{"version":"36a9827e64fa8e2af7d4fd939bf29e7ae6254fa9353ccebd849c894a4fd63e1b","impliedFormat":1},{"version":"3af8cee96336dd9dc44b27d94db5443061ff8a92839f2c8bbcc165ca3060fa6c","impliedFormat":1},{"version":"85d786a0accda19ef7beb6ae5a04511560110faa9c9298d27eaa4d44778fbf9e","impliedFormat":1},{"version":"7362683317d7deaa754bbf419d0a4561ee1d9b40859001556c6575ce349d95ea","impliedFormat":1},{"version":"408b6e0edb9d02acaf1f2d9f589aa9c6e445838b45c3bfa15b4bb98dc1453dc4","impliedFormat":1},{"version":"f8faa497faf04ffba0dd21cf01077ae07f0db08035d63a2e69838d173ae305bc","impliedFormat":1},{"version":"f8981c8de04809dccb993e59de5ea6a90027fcb9a6918701114aa5323d6d4173","impliedFormat":1},{"version":"7c9c89fd6d89c0ad443f17dc486aa7a86fa6b8d0767e1443c6c63311bdfbd989","impliedFormat":1},{"version":"a3486e635db0a38737d85e26b25d5fda67adef97db22818845e65a809c13c821","impliedFormat":1},{"version":"7c2918947143409b40385ca24adce5cee90a94646176a86de993fcdb732f8941","impliedFormat":1},{"version":"0935d7e3aeee5d588f989534118e6fefc30e538198a61b06e9163f8e8ca8cac5","impliedFormat":1},{"version":"55a36a053bfd464be800af2cd1b3ed83c6751277125786d62870bf159280b280","impliedFormat":1},{"version":"a8e7c075b87fda2dd45aa75d91f3ccb07bec4b3b1840bd4da4a8c60e03575cd2","impliedFormat":1},{"version":"f7b193e858e6c5732efa80f8073f5726dc4be1216450439eb48324939a7dd2be","impliedFormat":1},{"version":"f971e196cdf41219f744e8f435d4b7f8addacd1fbe347c6d7a7d125cd0eaeb99","impliedFormat":1},{"version":"fd38ff4bedf99a1cd2d0301d6ffef4781be7243dfbba1c669132f65869974841","impliedFormat":1},{"version":"e41e32c9fc04b97636e0dc89ecffe428c85d75bfc07e6b70c4a6e5e556fe1d6b","impliedFormat":1},{"version":"3a9522b8ed36c30f018446ec393267e6ce515ca40d5ee2c1c6046ce801c192cd","impliedFormat":1},{"version":"0e781e9e0dcd9300e7d213ce4fdec951900d253e77f448471d1bc749bd7f5f7c","impliedFormat":1},{"version":"bf8ea785d007b56294754879d0c9e7a9d78726c9a1b63478bf0c76e3a4446991","impliedFormat":1},{"version":"dbb439938d2b011e6b5880721d65f51abb80e09a502355af16de4f01e069cd07","impliedFormat":1},{"version":"f94a137a2b7c7613998433ca16fb7f1f47e4883e21cadfb72ff76198c53441a6","impliedFormat":1},{"version":"8296db5bbdc7e56cabc15f94c637502827c49af933a5b7ed0b552728f3fcfba8","impliedFormat":1},{"version":"ad46eedfff7188d19a71c4b8999184d1fb626d0379be2843d7fc20faea63be88","impliedFormat":1},{"version":"9ebac14f8ee9329c52d672aaf369be7b783a9685e8a7ab326cd54a6390c9daa6","impliedFormat":1},{"version":"dee395b372e64bfd6e55df9a76657b136e0ba134a7395e46e3f1489b2355b5b0","impliedFormat":1},{"version":"cf0ce107110a4b7983bacca4483ea8a1eac5e36901fc13c686ebef0ffbcbbacd","impliedFormat":1},{"version":"a4fc04fdc81ff1d4fdc7f5a05a40c999603360fa8c493208ccee968bd56e161f","impliedFormat":1},{"version":"8a2a61161d35afb1f07d10dbef42581e447aaeececc4b8766450c9314b6b4ee7","impliedFormat":1},{"version":"b817f19d56f68613a718e41d3ed545ecfd2c3096a0003d6a8e4f906351b3fb7d","impliedFormat":1},{"version":"bbdf5516dc4d55742ab23e76e0f196f31a038b4022c8aa7944a0964a7d36985e","impliedFormat":1},{"version":"981cca224393ac8f6b42c806429d5c5f3506e65edf963aa74bcef5c40b28f748","impliedFormat":1},{"version":"7239a60aab87af96a51cd8af59c924a55c78911f0ab74aa150e16a9da9a12e4f","impliedFormat":1},{"version":"df395c5c8b9cb35e27ab30163493c45b972237e027816e3887a522427f9a15cf","impliedFormat":1},{"version":"afad3315ce3f3d72f153c4c1d8606425ac951cd9f990766c73bd600911013751","impliedFormat":1},{"version":"95fab99f991a8fb9514b3c9282bfa27ffc4b7391c8b294f2d8bf2ae0a092f120","impliedFormat":1},{"version":"62e46dac4178ba57a474dad97af480545a2d72cd8c0d13734d97e2d1481dbf06","impliedFormat":1},{"version":"3f3bc27ed037f93f75f1b08884581fb3ed4855950eb0dc9be7419d383a135b17","impliedFormat":1},{"version":"55fef00a1213f1648ac2e4becba3bb5758c185bc03902f36150682f57d2481d2","impliedFormat":1},{"version":"6fe2c13736b73e089f2bb5f92751a463c5d3dc6efb33f4494033fbd620185bff","impliedFormat":1},{"version":"6e249a33ce803216870ec65dc34bbd2520718c49b5a2d9afdee7e157b87617a2","impliedFormat":1},{"version":"e58f83151bb84b1c21a37cbc66e1e68f0f1cf60444b970ef3d1247cd9097fd94","impliedFormat":1},{"version":"83e46603ea5c3df5ae2ead2ee7f08dcb60aa071c043444e84675521b0daf496b","impliedFormat":1},{"version":"8baf3ec31869d4e82684fe062c59864b9d6d012b9105252e5697e64212e38b74","impliedFormat":1},{"version":"84de46efa2d75741d9d9bbdfdfe9f214b20f00d3459af52ef574d9f4f0dcc73a","impliedFormat":1},{"version":"fb02e489b353b21e32d32ea8aef49bdbe34d6768864cc40b6fb46727ac9d953a","impliedFormat":1},{"version":"c6ade0291b5eef6bf8a014c45fbac97b24eeae623dbacbe72afeab2b93025aa2","impliedFormat":1},{"version":"2c5e9ca373f23c9712da12f8efa976e70767a81eb3802e82182a2d1a3e4b190e","impliedFormat":1},{"version":"06bac29b70233e8c57e5eb3d2bda515c4bea6c0768416cd914b0336335f7069b","impliedFormat":1},{"version":"fded99673b5936855b8b914c5bdf6ada1f7443c773d5a955fa578ff257a6a70c","impliedFormat":1},{"version":"8e0e4155cdf91f9021f8929d7427f701214f3ba5650f51d8067c76af168a5b99","impliedFormat":1},{"version":"ef344f40acc77eafa0dd7a7a1bc921e0665b8b6fc70aeea7d39e439e9688d731","impliedFormat":1},{"version":"36a1dffdbb2d07df3b65a3ddda70f446eb978a43789c37b81a7de9338daff397","impliedFormat":1},{"version":"bcb2c91f36780ff3a32a4b873e37ebf1544fb5fcc8d6ffac5c0bf79019028dae","impliedFormat":1},{"version":"d13670a68878b76d725a6430f97008614acba46fcac788a660d98f43e9e75ba4","impliedFormat":1},{"version":"7a03333927d3cd3b3c3dd4e916c0359ab2e97de6fd2e14c30f2fb83a9990792e","impliedFormat":1},{"version":"fc6fe6efb6b28eb31216bd2268c1bc5c4c4df3b4bc85013e99cd2f462e30b6fc","impliedFormat":1},{"version":"6cc13aa49738790323a36068f5e59606928457691593d67106117158c6091c2f","impliedFormat":1},{"version":"68255dbc469f2123f64d01bfd51239f8ece8729988eec06cea160d2553bcb049","impliedFormat":1},{"version":"c3bd50e21be767e1186dacbd387a74004e07072e94e2e76df665c3e15e421977","impliedFormat":1},{"version":"3106b08c40971596efc54cc2d31d8248f58ba152c5ec4d741daf96cc0829caea","impliedFormat":1},{"version":"30d6b1194e87f8ffa0471ace5f8ad4bcf03ccd4ef88f72443631302026f99c1d","impliedFormat":1},{"version":"6df4ad74f47da1c7c3445b1dd7c63bd3d01bbc0eb31aaebdea371caa57192ce5","impliedFormat":1},{"version":"dcc26e727c39367a46931d089b13009b63df1e5b1c280b94f4a32409ffd3fa36","impliedFormat":1},{"version":"36979d4a469985635dd7539f25facd607fe1fb302ad1c6c2b3dce036025419e8","impliedFormat":1},{"version":"1df92aa0f1b65f55620787e1b4ade3a7ff5577fd6355fd65dfebd2e72ee629c7","impliedFormat":1},{"version":"7e138dc97e3b2060f77c4b6ab3910b00b7bb3d5f8d8a747668953808694b1938","impliedFormat":1},{"version":"5b6d83c94236cf3e9e19315cc6d62b9787253c73a53faea34ead697863f81447","impliedFormat":1},{"version":"6d448f6bfeeef15718b82fd6ac9ae8871f7843a3082c297339398167f8786b2e","impliedFormat":1},{"version":"55cdcbc0af1398c51f01b48689e3ce503aa076cc57639a9351294e23366a401d","impliedFormat":1},{"version":"7e553f3b746352b0200dd91788b479a2b037a6a7d8d04aa6d002da09259f5687","impliedFormat":1},{"version":"32615eb16e819607b161e2561a2cd75ec17ac6301ba770658d5a960497895197","impliedFormat":1},{"version":"ac14cc1d1823cec0bf4abc1d233a995b91c3365451bf1859d9847279a38f16ee","impliedFormat":1},{"version":"f1142315617ac6a44249877c2405b7acda71a5acb3d4909f4b3cbcc092ebf8bd","impliedFormat":1},{"version":"29010a8e6a528cf90fd60872b5c86833755e937e766788848d021397c3b55e6e","impliedFormat":1},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},{"version":"648ae35c81ab9cb90cb1915ede15527b29160cce0fa1b5e24600977d1ba11543","impliedFormat":1},{"version":"ddc0e8ba97c5ad221cf854999145186b917255b2a9f75d0de892f4d079fa0b5c","impliedFormat":1},{"version":"a9fc166c68c21fd4d4b4d4fb55665611c2196f325e9d912a7867fd67e2c178da","impliedFormat":1},{"version":"e67d5e6d2bb861fd76909dc4a4a19fad459914e513c5af57d1e56bae01bd7192","impliedFormat":1},{"version":"d571fae704d8e4d335e30b9e6cf54bcc33858a60f4cf1f31e81b46cf82added4","impliedFormat":1},{"version":"3343dfbc5e7dd254508b6f11739572b1ad7fc4c2e3c87f9063c9da77c34774d7","impliedFormat":1},{"version":"b9406c40955c0dcf53a275697c4cddd7fe3fca35a423ade2ac750f3ba17bd66d","impliedFormat":1},{"version":"d7eb2711e78d83bc0a2703574bf722d50c76ef02b8dd6f8a8a9770e0a0f7279f","impliedFormat":1},{"version":"323127b2ac397332f21e88cd8e04c797ea6a48dedef19055cbd2fc467a3d8c84","impliedFormat":1},{"version":"f17613239e95ffcfa69fbba3b0c99b741000699db70d5e8feea830ec4bba641d","impliedFormat":1},{"version":"fff6aa61f22d8adb4476adfd8b14473bcdb6d1c9b513e1bfff14fe0c165ced3c","impliedFormat":1},{"version":"bdf97ac70d0b16919f2713613290872be2f3f7918402166571dbf7ce9cdc8df4","impliedFormat":1},{"version":"8667f65577822ab727b102f83fcd65d9048de1bf43ab55f217fbf22792dafafb","impliedFormat":1},{"version":"58f884ab71742b13c59fc941e2d4419aaf60f9cf7c1ab283aa990cb7f7396ec3","impliedFormat":1},{"version":"2c7720260175e2052299fd1ce10aa0a641063ae7d907480be63e8db508e78eb3","impliedFormat":1},{"version":"506823d1acd8978aa95f9106dfe464b65bdcd1e1539a994f4a9272db120fc832","impliedFormat":1},{"version":"d6a30821e37d7b935064a23703c226506f304d8340fa78c23fc7ea1b9dc57436","impliedFormat":1},{"version":"94a8650ade29691f97b9440866b6b1f77d4c1d0f4b7eea4eb7c7e88434ded8c7","impliedFormat":1},{"version":"bf26b847ce0f512536bd1f6d167363a3ae23621da731857828ce813c5cebc0db","impliedFormat":1},{"version":"87af268385a706c869adc8dd8c8a567586949e678ce615165ffcd2c9a45b74e7","impliedFormat":1},{"version":"affad9f315b72a6b5eb0d1e05853fa87c341a760556874da67643066672acdaf","impliedFormat":1},{"version":"6216f92d8119f212550c216e9bc073a4469932c130399368a707efb54f91468c","impliedFormat":1},{"version":"f7d86f9a241c5abf48794b76ac463a33433c97fc3366ce82dfa84a5753de66eb","impliedFormat":1},{"version":"01dab6f0b3b8ab86b120b5dd6a59e05fc70692d5fc96b86e1c5d54699f92989c","impliedFormat":1},{"version":"4ea9bb85a4cf20008ece6db273e3d9f0a2c92d70d18fb82c524967afac7ff892","impliedFormat":1},{"version":"1ca7c8e38d1f5c343ab5ab58e351f6885f4677a325c69bb82d4cba466cdafeda","impliedFormat":1},{"version":"17c9ca339723ded480ca5f25c5706e94d4e96dcd03c9e9e6624130ab199d70e1","impliedFormat":1},{"version":"01aa1b58e576eb2586eedb97bcc008bbe663017cc49f0228da952e890c70319f","impliedFormat":1},{"version":"d57e64f90522b8cedf16ed8ba4785f64c297768ff145b95d3475114574c5b8e2","impliedFormat":1},{"version":"6a37dd9780f837be802142fe7dd70bb3f7279425422c893dd91835c0869cb7ac","impliedFormat":1},{"version":"31ed14faf7039fd7f1b98148385a86de82b0c644598dc92ac05f28a83735bc8e","impliedFormat":1},{"version":"22e1e1b1e1df66f6a1fdb7be8eb6b1dbb3437699e6b0115fbbae778c7782a39f","impliedFormat":1},{"version":"1a47e278052b9364140a6d24ef8251d433d958be9dd1a8a165f68cecea784f39","impliedFormat":1},{"version":"f7af9db645ecfe2a1ead1d675c1ccc3c81af5aa1a2066fe6675cd6573c50a7e3","impliedFormat":1},{"version":"3a9d25dcbb2cdcb7cd202d0d94f2ac8558558e177904cfb6eaff9e09e400c683","impliedFormat":1},{"version":"f65a5aa0e69c20579311e72e188d1df2ef56ca3a507d55ab3cb2b6426632fe9b","impliedFormat":1},{"version":"1144d12482a382de21d37291836a8aca0a427eb1dc383323e1ddbcf7ee829678","impliedFormat":1},{"version":"7a68ca7786ca810eb440ae1a20f5a0bd61f73359569d6faa4794509d720000e6","impliedFormat":1},{"version":"160d478c0aaa2ec41cc4992cb0b03764309c38463c604403be2e98d1181f1f54","impliedFormat":1},{"version":"5e97563ec4a9248074fdf7844640d3c532d6ce4f8969b15ccc23b059ed25a7c4","impliedFormat":1},{"version":"7d67d7bd6308dc2fb892ae1c5dca0cdee44bfcfd0b5db2e66d4b5520c1938518","impliedFormat":1},{"version":"0ba8f23451c2724360edfa9db49897e808fa926efb8c2b114498e018ed88488f","impliedFormat":1},{"version":"3e618bc95ef3958865233615fbb7c8bf7fe23c7f0ae750e571dc7e1fefe87e96","impliedFormat":1},{"version":"b901e1e57b1f9ce2a90b80d0efd820573b377d99337f8419fc46ee629ed07850","impliedFormat":1},{"version":"f720eb538fc2ca3c5525df840585a591a102824af8211ac28e2fd47aaf294480","impliedFormat":1},{"version":"ae9d0fa7c8ba01ea0fda724d40e7f181275c47d64951a13f8c1924ac958797bc","impliedFormat":1},{"version":"346d9528dcd89e77871a2decebd8127000958a756694a32512fe823f8934f145","impliedFormat":1},{"version":"d831ae2d17fd2ff464acbd9408638f06480cb8eb230a52d14e7105065713dca4","impliedFormat":1},{"version":"0a3dec0f968c9463b464a29f9099c1d5ca4cd3093b77a152f9ff0ae369c4d14b","impliedFormat":1},{"version":"a3fda2127b3185d339f80e6ccc041ce7aa85fcb637195b6c28ac6f3eed5d9d79","impliedFormat":1},{"version":"b238a1a5be5fbf8b5b85c087f6eb5817b997b4ce4ce33c471c3167a49524396c","impliedFormat":1},{"version":"ba849c0aba26864f2db0d29589fdcaec09da4ba367f127efdac1fcb4ef007732","impliedFormat":1},{"version":"ed10bc2be0faa78a2d1c8372f8564141c2360532e4567b81158ffe9943b8f070","impliedFormat":1},{"version":"b432f4a1f1d7e7601a870ab2c4cff33787de4aa7721978eb0eef543c5d7fe989","impliedFormat":1},{"version":"3f9d87ee262bd1620eb4fb9cb93ca7dc053b820f07016f03a1a653a5e9458a7a","impliedFormat":1},{"version":"d0a466f314b01b5092db46a94cd5102fee2b9de0b8d753e076e9c1bfe4d6307e","impliedFormat":1},{"version":"de716ad71873d3d56e0d611a3d5c1eae627337c1f88790427c21f3cb47a7b6f7","impliedFormat":1},{"version":"cc07061c93ddbcd010c415a45e45f139a478bd168a9695552ab9fa84e5e56fe2","impliedFormat":1},{"version":"bb6462a8cd1932383404a0a708eb38afc172b4f95105849470b6e7afbffd2887","impliedFormat":1},{"version":"673b1fc746c54e7e16b562f06660ffdae5a00b0796b6b0d4d0aaf1f7507f1720","impliedFormat":1},{"version":"710202fdeb7a95fbf00ce89a67639f43693e05a71f495d104d8fb13133442cbc","impliedFormat":1},{"version":"11754fdc6f8c9c04e721f01d171aad19dac10a211ae0c8234f1d80f6c7accfd4","impliedFormat":1},{"version":"5fdcdbf558dfff85ff35271431bab76826400a513bf2cf6e8c938062fcba0f3e","impliedFormat":1},{"version":"de87b16170fa78c501b95363050394acb75ec50cccadd6594c4b9d9425795569","impliedFormat":1},{"version":"199f93a537e4af657dc6f89617e3384b556ab251a292e038c7a57892a1fa479c","impliedFormat":1},{"version":"ead16b329693e880793fe14af1bbcaf2e41b7dee23a24059f01fdd3605cac344","impliedFormat":1},{"version":"ba14614494bccb80d56b14b229328db0849feb1cbfd6efdc517bc5b0cb21c02f","impliedFormat":1},{"version":"6c3760df827b88767e2a40e7f22ce564bb3e57d799b5932ec867f6f395b17c8f","impliedFormat":1},{"version":"885d19e9f8272f1816266a69d7e4037b1e05095446b71ea45484f97c648a6135","impliedFormat":1},{"version":"afcc443428acd72b171f3eba1c08b1f9dcbba8f1cc2430d68115d12176a78fb0","impliedFormat":1},{"version":"199ae7a196a95542dab5592133e3a9f5b49525e15566d6ba615ce35751d4070a","impliedFormat":1},{"version":"029774092e2d209dbf338eebc52f1163ddf73697a274cfdd9fa7046062b9d2b1","impliedFormat":1},{"version":"594692b6c292195e21efbddd0b1af9bd8f26f2695b9ffc7e9d6437a59905889e","impliedFormat":1},{"version":"092a816537ec14e80de19a33d4172e3679a3782bf0edfd3c137b1d2d603c923e","impliedFormat":1},{"version":"60f0efb13e1769b78bd5258b0991e2bf512d3476a909c5e9fd1ca8ee59d5ef26","impliedFormat":1},{"version":"3cfd46f0c1fe080a1c622742d5220bd1bf47fb659074f52f06c996b541e0fc9b","impliedFormat":1},{"version":"e8d8b23367ad1f5124f3d8403cf2e6d13b511ebb4c728f90ec59ceeb1d907cc1","impliedFormat":1},{"version":"291b182b1e01ded75105515bcefd64dcf675f98508c4ca547a194afd80331823","impliedFormat":1},{"version":"75ddb104faa8f4f84b3c73e587c317d2153fc20d0d712a19f77bea0b97900502","impliedFormat":1},{"version":"135785aa49ae8a82e23a492b5fc459f8a2044588633a124c5b8ff60bbb31b5d4","impliedFormat":1},{"version":"267d5f0f8b20eaeb586158436ba46c3228561a8e5bb5c89f3284940a0a305bd8","impliedFormat":1},{"version":"1d21320d3bf6b17b6caf7e736b78c3b3e26ee08b6ac1d59a8b194039aaaa93ae","impliedFormat":1},{"version":"8b2efbff78e96ddab0b581ecd0e44a68142124444e1ed9475a198f2340fe3ef7","impliedFormat":1},{"version":"6eff0590244c1c9daf80a3ac1e9318f8e8dcd1e31a89983c963bb61be97b981b","impliedFormat":1},{"version":"2088837abfd2b6988826ffffbf972d31eb7a7cd027a0860fbaa4fadb78c3415d","impliedFormat":1},{"version":"a069aef689b78d2131045ae3ecb7d79a0ef2eeab9bc5dff10a653c60494faa79","impliedFormat":1},{"version":"680db60ad1e95bbefbb302b1096b5ad3ce86600c9542179cc52adae8aee60f36","impliedFormat":1},{"version":"5a8b2b6bda4d1667408dcecd6a7e9b6ef7bb9ef4b74b7eec5cb5427e8ea26b24","impliedFormat":1},{"version":"b775bfe85c7774cafc1f9b815c17f233c98908d380ae561748de52ccacc47e17","impliedFormat":1},{"version":"4fb9cc98b019394957dc1260c3d0c0a5ef37b166d2a8336b559d205742ed3949","impliedFormat":1},{"version":"ebe41fb9fe47a2cf7685a1250a56acf903d8593a8776403eca18d793edc0df54","impliedFormat":1},{"version":"4eb2a7789483e5b2e40707f79dcbd533f0871439e2e5be5e74dc0c8b0f8b9a05","impliedFormat":1},{"version":"984dcccd8abcfd2d38984e890f98e3b56de6b1dd91bf05b8d15a076efd7d84c0","impliedFormat":1},{"version":"d9f4968d55ba6925a659947fe4a2be0e58f548b2c46f3d42d9656829c452f35e","impliedFormat":1},{"version":"57fd651cc75edc35e1aa321fd86034616ec0b1bd70f3c157f2e1aee414e031a0","impliedFormat":1},{"version":"97fec1738c122037ca510f69c8396d28b5de670ceb1bd300d4af1782bd069b0b","impliedFormat":1},{"version":"74a16af8bbfaa038357ee4bceb80fad6a28d394a8faaac3c0d0aa0f9e95ea66e","impliedFormat":1},{"version":"044c44c136ae7fb9ff46ac0bb0ca4e7f41732ca3a3991844ba330fa1bfb121a2","impliedFormat":1},{"version":"d47c270ad39a7706c0f5b37a97e41dbaab295b87964c0c2e76b3d7ad68c0d9d6","impliedFormat":1},{"version":"13e6b949e30e37602fdb3ef961fd7902ccdc435552c9ead798d6de71b83fe1e3","impliedFormat":1},{"version":"f7884f326c4a791d259015267a6b2edbeef3b7cb2bc38dd641ce2e4ef76862e7","impliedFormat":1},{"version":"0f51484aff5bbb48a35a3f533be9fdc1eccac65e55b8a37ac32beb3c234f7910","impliedFormat":1},{"version":"b3147dba3a43bb5f5451207fb93e0c9e58fac7c17e972ba659a607d1b071098f","impliedFormat":1},{"version":"f9c2a5019ac238db620f704a77e6e153853de477ecb6e304c625c3be020e36f8","impliedFormat":1},{"version":"e0dbaaf0b294114c547fccf3dbd2fb5c21e2bfdedb349be295830cb98ab72853","impliedFormat":1},{"version":"25db4e7179be81d7b9dbb3fde081050778d35fabcc75ada4e69d7f24eb03ce66","impliedFormat":1},{"version":"43ceb16649b428a65b23d08bfc5df7aaaba0b2d1fee220ba7bc4577e661c38a6","impliedFormat":1},{"version":"f3f2e18b3d273c50a8daa9f96dbc5d087554f47c43e922aa970368c7d5917205","impliedFormat":1},{"version":"c17c4fc020e41ddbe89cd63bed3232890b61f2862dd521a98eb2c4cb843b6a42","impliedFormat":1},{"version":"eb77c432329a1a00aac36b476f31333260cd81a123356a4bf2c562e6ac8dc5a4","impliedFormat":1},{"version":"6d2f991e9405c12b520e035bddb97b5311fed0a8bf82b28f7ef69df7184f36c2","impliedFormat":1},{"version":"8e002fd1fc6f8d77200af3d4b5dd6f4f2439a590bf15e037a289bb528ecc6a12","impliedFormat":1},{"version":"2d0748f645de665ca018f768f0fd8e290cf6ce86876df5fc186e2a547503b403","impliedFormat":1},{"version":"7cd50e4c093d0fe06f2ebe1ae5baeefae64098751fb7fa6ae03022035231cc97","impliedFormat":1},{"version":"334bfc2a6677bc60579dbf929fe1d69ac780a0becd1af812132b394e1f6a3ea6","impliedFormat":1},{"version":"ed8e02a44e1e0ddee029ef3c6804f42870ee2b9e17cecad213e8837f5fcd756b","impliedFormat":1},{"version":"b13b25bbfa55a784ec4ababc70e3d050390347694b128f41b3ae45f0202d5399","impliedFormat":1},{"version":"b9fc71b8e83bcc4b5d8dda7bcf474b156ef2d5372de98ac8c3710cfa2dc96588","impliedFormat":1},{"version":"85587f4466c53be818152cbf7f6be67c8384dcf00860290dca05e0f91d20f28d","impliedFormat":1},{"version":"9d4943145bd78babb9f3deb4fccd09dabd14005118ffe30935175056fa938c2b","impliedFormat":1},{"version":"108397cacfc6e701cd183fccf2631f3fc26115291e06ed81f97c656cd59171d4","impliedFormat":1},{"version":"944fcf2e7415a20278f025b4587fb032d7174b89f7ba9219b8883affa6e7d2e3","impliedFormat":1},{"version":"589b3c977372b6a7ba79b797c3a21e05a6e423008d5b135247492cc929e84f25","impliedFormat":1},{"version":"ab16a687cfc7d148a8ae645ffd232c765a5ed190f76098207c159dc7c86a1c43","impliedFormat":1},{"version":"1aa722dee553fc377e4406c3ec87157e66e4d5ea9466f62b3054118966897957","impliedFormat":1},{"version":"55bf2aecbdc32ea4c60f87ae62e3522ef5413909c9a596d71b6ec4a3fafb8269","impliedFormat":1},{"version":"7832c3a946a38e7232f8231c054f91023c4f747ad0ce6b6bc3b9607d455944f7","impliedFormat":1},{"version":"696d56df9e55afa280df20d55614bb9f0ad6fcac30a49966bb01580e00e3a2d4","impliedFormat":1},{"version":"07e20b0265957b4fd8f8ce3df5e8aea0f665069e1059de5d2c0a21b1e8a7de09","impliedFormat":1},{"version":"08424c1704324a3837a809a52b274d850f6c6e1595073946764078885a3fa608","impliedFormat":1},{"version":"f5d9a7150b0782e13d4ed803ee73cf4dbc04e99b47b0144c9224fd4af3809d4d","impliedFormat":1},{"version":"551d60572f79a01b300e08917205d28f00356c3ee24569c7696bfd27b2e77bd7","impliedFormat":1},{"version":"40b0816e7bafc822522ef6dfe0248193978654295b8c5eab4c5437b631c4b2a4","impliedFormat":1},{"version":"b267c3428adf2b1f6abe436e2e92930d14568f92749fe83296c96983f1a30eb4","impliedFormat":1},{"version":"5a48bc706873ec2578b7e91b268e1f646b11c7792e30fccf03f1edb2f800045e","impliedFormat":1},{"version":"6af34aeed2723766478d8c1177b20207fa6991b1ebd73cbc29958fa752c22f90","impliedFormat":1},{"version":"367a2dbfd74532530c5b2d6b9c87d9e84599e639991151b73d42c720aa548611","impliedFormat":1},{"version":"3df200a7de1b2836c42b3e4843a6c119b4b0e4857a86ebc7cc5a98e084e907f0","impliedFormat":1},{"version":"ae05563905dc09283da42d385ca1125113c9eba83724809621e54ea46309b4e3","impliedFormat":1},{"version":"722fb0b5eff6878e8ad917728fa9977b7eaff7b37c6abb3bd5364cd9a1d7ebc3","impliedFormat":1},{"version":"8d4b70f717f7e997110498e3cfd783773a821cfba257785815b697b45d448e46","impliedFormat":1},{"version":"3735156a254027a2a3b704a06b4094ef7352fa54149ba44dd562c3f56f37b6ca","impliedFormat":1},{"version":"166b65cc6c34d400e0e9fcff96cd29cef35a47d25937a887c87f5305d2cb4cac","impliedFormat":1},{"version":"0c583869411fb8a8e861682fa19130f12079137f656f74a356e9c35b46d6b9c5","impliedFormat":1},{"version":"d17f800659c0b683ea73102ca542ab39009c0a074acf3546321a46c1119faf90","impliedFormat":1},{"version":"9512b9fe902f0bf0b77388755b9694c0e19fc61caf71d08d616c257c3bceebbd","impliedFormat":1},{"version":"f89a15f66cf6ba42bce4819f10f7092cdecbad14bf93984bfb253ffaacf77958","impliedFormat":1},{"version":"822316d43872a628af734e84e450091d101b8b9aa768db8e15058c901d5321e6","impliedFormat":1},{"version":"65d1139b590988aa8f2e94cfb1e6b87b5ff78f431d9fe039f6e5ab46e8998a20","impliedFormat":1},{"version":"40710f91b4b4214bd036f96b3f5f7342be9756f792fbaa0a20c7e0ada888c273","impliedFormat":1},{"version":"16cccc9037b4bab06d3a88b14644aa672bf0985252d782bbf8ff05df1a7241e8","impliedFormat":1},{"version":"0154d805e3f4f5a40d510c7fb363b57bf1305e983edde83ccd330cef2ba49ed0","impliedFormat":1},{"version":"89da9aeab1f9e59e61889fb1a5fdb629e354a914519956dfa3221e2a43361bb2","impliedFormat":1},{"version":"452dee1b4d5cbe73cfd8d936e7392b36d6d3581aeddeca0333105b12e1013e6f","impliedFormat":1},{"version":"5ced0582128ed677df6ef83b93b46bffba4a38ddba5d4e2fb424aa1b2623d1d5","impliedFormat":1},{"version":"f1cc60471b5c7594fa2d4a621f2c3169faa93c5a455367be221db7ca8c9fddb1","impliedFormat":1},{"version":"7d4506ed44aba222c37a7fa86fab67cce7bd18ad88b9eb51948739a73b5482e6","impliedFormat":1},{"version":"2739797a759c3ebcab1cb4eb208155d578ef4898fcfb826324aa52b926558abc","impliedFormat":1},{"version":"33ce098f31987d84eb2dd1d6984f5c1c1cae06cc380cb9ec6b30a457ea03f824","impliedFormat":1},{"version":"59683bee0f65ae714cc3cf5fa0cb5526ca39d5c2c66db8606a1a08ae723262b8","impliedFormat":1},{"version":"bc8eb1da4e1168795480f09646dcb074f961dfe76cd74d40fc1c342240ac7be4","impliedFormat":1},{"version":"202e258fc1b2164242835d1196d9cc1376e3949624b722bbf127b057635063e7","impliedFormat":1},{"version":"08910b002dcfcfd98bcea79a5be9f59b19027209b29ccecf625795ddf7725a4a","impliedFormat":1},{"version":"03b9959bee04c98401c8915227bbaa3181ddc98a548fb4167cd1f7f504b4a1ea","impliedFormat":1},{"version":"2d18b7e666215df5d8becf9ffcfef95e1d12bfe0ac0b07bc8227b970c4d3f487","impliedFormat":1},{"version":"d7ebeb1848cd09a262a09c011c9fa2fc167d0dd6ec57e3101a25460558b2c0e3","impliedFormat":1},{"version":"937a9a69582604d031c18e86c6e8cd0fcf81b73de48ad875c087299b8d9e2472","impliedFormat":1},{"version":"07df5b8be0ba528abc0b3fdc33a29963f58f7ce46ea3f0ccfaf4988d18f43fff","impliedFormat":1},{"version":"b0e19c66907ad996486e6b3a2472f4d31c309da8c41f38694e931d3462958d7f","impliedFormat":1},{"version":"3880b10e678e32fcfd75c37d4ad8873f2680ab50582672896700d050ce3f99b6","impliedFormat":1},{"version":"1a372d53e61534eacd7982f80118b67b37f5740a8e762561cd3451fb21b157ff","impliedFormat":1},{"version":"3784f188208c30c6d523d257e03c605b97bc386d3f08cabe976f0e74cd6a5ee5","impliedFormat":1},{"version":"49586fc10f706f9ebed332618093aaf18d2917cf046e96ea0686abaae85140a6","impliedFormat":1},{"version":"921a87943b3bbe03c5f7cf7d209cc21d01f06bf0d9838eee608dfab39ae7d7f4","impliedFormat":1},{"version":"461a1084ee0487fd522d921b4342d7b83a79453f29105800bd14e65d5adf79c5","impliedFormat":1},{"version":"f0885de71d0dbf6d3e9e206d9a3fce14c1781d5f22bca7747fc0f5959357eeab","impliedFormat":1},{"version":"ddebc0a7aada4953b30b9abf07f735e9fec23d844121755309f7b7091be20b8d","impliedFormat":1},{"version":"6fdc397fc93c2d8770486f6a3e835c188ccbb9efac1a28a3e5494ea793bc427c","impliedFormat":1},{"version":"6bfcc68605806e30e7f0c03d5dd40779f9b24fd0af69144e13d32a279c495781","impliedFormat":1},{"version":"1ba87d786e27f67971ea0d813c948de5347f9f35b20d07c26f36dbe2b21aa1fb","impliedFormat":1},{"version":"b6e4cafbcb84c848dfeffeb9ca7f5906d47ed101a41bc068bb1bb27b75f18782","impliedFormat":1},{"version":"9799e6726908803d43992d21c00601dc339c379efabe5eee9b421dbd20c61679","impliedFormat":1},{"version":"dfa5d54c4a1f8b2a79eaa6ecb93254814060fba8d93c6b239168e3d18906d20e","impliedFormat":1},{"version":"858c71909635cf10935ce09116a251caed3ac7c5af89c75d91536eacb5d51166","impliedFormat":1},{"version":"b3eb56b920afafd8718dc11088a546eeb3adf6aa1cbc991c9956f5a1fe3265b3","impliedFormat":1},{"version":"605940ddc9071be96ec80dfc18ab56521f927140427046806c1cfc0adf410b27","impliedFormat":1},{"version":"5194a7fd715131a3b92668d4992a1ac18c493a81a9a2bb064bcd38affc48f22d","impliedFormat":1},{"version":"21d1f10a78611949ff4f1e3188431aeabb4569877bb8d1f92e7c7426f0f0d029","impliedFormat":1},{"version":"0d7dcf40ed5a67b344df8f9353c5aa8a502e2bbdad53977bc391b36b358a0a1c","impliedFormat":1},{"version":"093ad5bb0746fdb36f1373459f6a8240bc4473829723300254936fc3fdaee111","impliedFormat":1},{"version":"f2367181a67aff75790aa9a4255a35689110f7fb1b0adb08533913762a34f9e6","impliedFormat":1},{"version":"4a1a4800285e8fd30b13cb69142103845c6cb27086101c2950c93ffcd4c52b94","impliedFormat":1},{"version":"687a2f338ee31fcdee36116ed85090e9af07919ab04d4364d39da7cc0e43c195","impliedFormat":1},{"version":"f36db7552ff04dfb918e8ed33ef9d174442df98878a6e4ca567ad32ea1b72959","impliedFormat":1},{"version":"739708e7d4f5aba95d6304a57029dfbabe02cb594cf5d89944fd0fc7d1371c3a","impliedFormat":1},{"version":"22f31306ddc006e2e4a4817d44bf9ac8214caae39f5706d987ade187ecba09e3","impliedFormat":1},{"version":"4237f49cdd6db9e33c32ccc1743d10b01fdd929c74906e7eecd76ce0b6f3688a","impliedFormat":1},{"version":"4ed726e8489a57adcf586687ff50533e7fe446fb48a8791dbc75d8bf77d1d390","impliedFormat":1},{"version":"bbde826b04c01b41434728b45388528a36cc9505fda4aa3cdd9293348e46b451","impliedFormat":1},{"version":"02a432db77a4579267ff0a5d4669b6d02ebc075e4ff55c2ff2a501fc9433a763","impliedFormat":1},{"version":"086b7a1c4fe2a9ef6dfa030214457b027e90fc1577e188c855dff25f8bcf162c","impliedFormat":1},{"version":"68799ca5020829d2dbebfda86ed2207320fbf30812e00ed2443b2d0a035dda52","impliedFormat":1},{"version":"dc7f0f8e24d838dabe9065f7f55c65c4cfe68e3be243211f625fa8c778c9b85c","impliedFormat":1},{"version":"92169f790872f5f28be4fce7e371d2ccf17b0cc84057a651e0547ad63d8bcb68","impliedFormat":1},{"version":"765b8fe4340a1c7ee8750b4b76f080b943d85e770153e78503d263418b420358","impliedFormat":1},{"version":"12d71709190d96db7fbb355f317d50e72b52e16c3451a20dae13f4e78db5c978","impliedFormat":1},{"version":"7367c0d3442165e6164185b7950b8f70ea2be0142b2175748fef7dc23c6d2230","impliedFormat":1},{"version":"d66efc7ed427ca014754343a80cf2b4512ceaa776bc4a9139d06863abf01ac5c","impliedFormat":1},{"version":"4eb32b50394f9bab5e69090c0183a3ad999f5231eb421f1c29919e32d9bcd1ed","impliedFormat":1},{"version":"dbeb4c3a24b95fe4ad6fdff9577455f5868fbb5ad12f7c22c68cb24374d0996d","impliedFormat":1},{"version":"05e9608dfef139336fb2574266412a6352d605857de2f94b2ce454d53e813cd6","impliedFormat":1},{"version":"61152e9dee12c018bac65160d0a27d1421a84c8cfd53e57188c39c450d4c113b","impliedFormat":1},{"version":"bb1c6786ef387ac7a2964ea61adfb76bf9f967bbd802b0494944d7eec31fea2e","impliedFormat":1},{"version":"080ef44f7128b5570245b0da74ccef990b0e542a9cbe168b0fbe7a8159add166","impliedFormat":1},{"version":"ce5c854fbdff970713acdd080e7b3e10a646db8bf6a8187b392e57fd8075816a","impliedFormat":1},{"version":"318957769f5b75529bc378b984dacbd42fbfc0db7481bc69cd1b29de812ad54b","impliedFormat":1},{"version":"410a1e58749c46bb8db9a3c29466183c1ca345c7a2f8e44c79e810b22d9072f7","impliedFormat":1},{"version":"3ee349cda390e8f285b3d861fb5a78e9f69be0d7303607334e08a75ce925928f","impliedFormat":1},{"version":"1efcaa13b1dd8738ba7261f7be898b2d80516e3b9aa091a790b2818179f2cf78","impliedFormat":1},{"version":"111a4c948e8a448d677bfc92166f8a596de03f66045bc1bec50a2f36edb710d2","impliedFormat":1},{"version":"9d7437397cb58f2410f4d64d86a686a6281c5811b17d41b077d6ec0c45d0312e","impliedFormat":1},{"version":"2fdde32fbf21177400da4d10665802c5b7629e2d4012df23d3f9b6e975c52098","impliedFormat":1},{"version":"8c28493e6f020336369eacaf21dc4e6d2ef6896dbb3ae5729891b16d528d71eb","impliedFormat":1},{"version":"bbffb20bab36db95b858d13591b9c09e29f76c4b7521dc9366f89eb2aeead68d","impliedFormat":1},{"version":"61b25ce464888c337df2af9c45ca93dcae014fef5a91e6ecce96ce4e309a3203","impliedFormat":1},{"version":"1ac6ead96cc738705b3cc0ba691ae2c3198a93d6a5eec209337c476646a2bce3","impliedFormat":1},{"version":"d5c89d3342b9a5094b31d5f4a283aa0200edc84b855aba6af1b044d02a9cf3b2","impliedFormat":1},{"version":"9863cfd0e4cda2e3049c66cb9cd6d2fd8891c91be0422b4e1470e3e066405c12","impliedFormat":1},{"version":"c8353709114ef5cdaeea43dde5c75eb8da47d7dce8fbc651465a46876847b411","impliedFormat":1},{"version":"0c55d168d0c377ce0340d219a519d3038dd50f35aaadb21518c8e068cbd9cf5e","impliedFormat":1},{"version":"356da547f3b6061940d823e85e187fc3d79bd1705cb84bd82ebea5e18ad28c9c","impliedFormat":1},{"version":"6ee8db8631030efcdb6ac806355fd321836b490898d8859f9ba882943cb197eb","impliedFormat":1},{"version":"e7afb81b739a7b97b17217ce49a44577cfd9d1de799a16a8fc9835eae8bff767","impliedFormat":1},{"version":"ca7c244766ad374c1e664416ca8cc7cd4e23545d7f452bbe41ec5dc86ba81b76","impliedFormat":1},{"version":"dc6f8725f18ca08fdfc29c3d93b8757676b62579e1c33b84bc0a94f375a56c09","impliedFormat":1},{"version":"61e92305d8e3951cc6692064f222555acf25fe83d5313bc441d13098a3e1b4fe","impliedFormat":1},{"version":"f691685dc20e1cc9579ec82b34e71c3cdccfd31737782aae1f48219a8a7d8435","impliedFormat":1},{"version":"41cf6213c047c4d02d08cdf479fdf1b16bff2734c2f8abbb8bb71e7b542c8a47","impliedFormat":1},{"version":"0c1083e755be3c23e2aab9620dae8282de8a403b643bd9a4e19fe23e51d7b2d3","impliedFormat":1},{"version":"0810e286e8f50b4ead6049d46c6951fe8869d2ea7ee9ea550034d04c14c5d3e2","impliedFormat":1},{"version":"ead36974e944dcbc1cbae1ba8d6de7a1954484006f061c09f05f4a8e606d1556","impliedFormat":1},{"version":"afe05dc77ee5949ccee216b065943280ba15b5e77ac5db89dfc1d22ac32fc74c","impliedFormat":1},{"version":"2030689851bc510df0da38e449e5d6f4146ae7eac9ad2b6c6b2cf6f036b3a1ea","impliedFormat":1},{"version":"25cd596336a09d05d645e1e191ea91fb54f8bfd5a226607e5c0fd0eeeded0e01","impliedFormat":1},{"version":"d95ac12e15167f3b8c7ad2b7fa7f0a528b3941b556a6f79f8f1d57cce8fba317","impliedFormat":1},{"version":"cab5393058fcb0e2067719b320cd9ea9f43e5176c0ba767867c067bc70258ddc","impliedFormat":1},{"version":"c40d5df23b55c953ead2f96646504959193232ab33b4e4ea935f96cebc26dfee","impliedFormat":1},{"version":"cbc868d6efdbe77057597632b37f3ff05223db03ee26eea2136bd7d0f08dafc1","impliedFormat":1},{"version":"a0e027058a6ae83fba027952f6df403e64f7bd72b268022dbb4f274f3c299d12","impliedFormat":1},{"version":"5e5b2064d13ff327ee7b2e982dd7e262501b65943438ed8d1a47c35bc0401419","impliedFormat":1},{"version":"83e8fd527d4d28635b7773780cc95ae462d14889ba7b2791dc842480b439ea0b","impliedFormat":1},{"version":"8f70b054401258b4c2f83c6a5b271cde851f8c8983cbb75596ecf90a275eac32","impliedFormat":1},{"version":"bb2e4d0046fc0271ce7837b9668e7f0e99cc9511d77ffdb890bbf7204aae5e4e","impliedFormat":1},{"version":"2f16367abfbf9b8c79c194ec7269dd3c35874936408b3a776ed6b584705113b6","impliedFormat":1},{"version":"b25e13b5bb9888a5e690bbd875502777239d980b148d9eaa5e44fad9e3c89a7e","impliedFormat":1},{"version":"38af232cb48efae980b56595d7fe537a4580fd79120fc2b5703b96cbbab1b470","impliedFormat":1},{"version":"4c76af0f5c8f955e729c78aaf1120cc5c24129b19c19b572e22e1da559d4908c","impliedFormat":1},{"version":"c27f313229ada4914ab14c49029da41c9fdae437a0da6e27f534ab3bc7db4325","impliedFormat":1},{"version":"ff8a3408444fb94122191cbfa708089a6233b8e031ebd559c92a90cb46d57252","impliedFormat":1},{"version":"8c25b00a675743d7a381cf6389ae9fbdce82bdc9069b343cb1985b4cd17b14be","impliedFormat":1},{"version":"52625e2647ccc13e1258f7e7e55e79aaf22931ffac16bc38117b543442c44550","impliedFormat":1},{"version":"f9ec7b8b285db6b4c51aa183044c85a6e21ea2b28d5c4337c1977e9fe6a88844","impliedFormat":1},{"version":"b4d9fae96173bbd02f2a31ff00b2cb68e2398b1fec5aaab090826e4d02329b38","impliedFormat":1},{"version":"9d0f5034775fb0a6f081f3690925602d01ba16292989bfcac52f6135cf79f56f","impliedFormat":1},{"version":"f5181fff8bba0221f8df77711438a3620f993dd085f994a3aea3f8eaac17ceff","impliedFormat":1},{"version":"9312039b46c4f2eb399e7dd4d70b7cea02d035e64764631175a0d9b92c24ec4b","impliedFormat":1},{"version":"9ddacc94444bfd2e9cc35da628a87ec01a4b2c66b3c120a0161120b899dc7d39","impliedFormat":1},{"version":"a8cb7c1e34db0649edddd53fa5a30f1f6d0e164a6f8ce17ceb130c3689f02b96","impliedFormat":1},{"version":"0aba2a2ff3fc7e0d77aaf6834403166435ab15a1c82a8d791386c93e44e6c6a4","impliedFormat":1},{"version":"c83c86c0fddf1c1d7615be25c24654008ae4f672cff7de2a11cfa40e8c7df533","impliedFormat":1},{"version":"348e5b9c2ee965b99513a09ef9a15aec8914609a018f2e012d0c405969a39a2e","impliedFormat":1},{"version":"49d62a88a20b1dbff8bcf24356a068b816fb2cc2cac94264105a0419b2466b74","impliedFormat":1},{"version":"a04c6362fd99f3702be24412c122c41ed2b3faf3d9042c970610fcd1b1d69555","impliedFormat":1},{"version":"aa6f8f0abe029661655108bc7a0ecd93658bf070ce744b2ffaee87f4c6b51bca","impliedFormat":1},{"version":"5ef75e07b37097e602b73f82e6658b5cbb0683edf35943f811c5b7735ec4a077","impliedFormat":1},{"version":"8c88ce6a3db25803c86dad877ff4213e3f6d26e183d0cde08bc42fbf0a6ddbbe","impliedFormat":1},{"version":"02dabdfe5778f5499df6f18916ff2ebe06725a4c2a13ee7fb09a290b5df4d4b2","impliedFormat":1},{"version":"d67799c6a005603d7e0fd4863263b56eecde8d1957d085bdbbb20c539ad51e8c","impliedFormat":1},{"version":"21af404e03064690ac6d0f91a8c573c87a431ed7b716f840c24e08ea571b7148","impliedFormat":1},{"version":"904f0d5e01e89e207490ca8e7114d9542aefb50977d43263ead389bb2dcec994","impliedFormat":1},{"version":"b75fca19de5056deaa27f8a2445ed6b6e6ceca0f515b6fdf8508efb91bc6398a","impliedFormat":1},{"version":"ce3382d8fdb762031e03fe6f2078d8fbb9124890665e337ad7cd1fa335b0eb4c","impliedFormat":1},{"version":"0fd4f87c1e1fc93b2813f912e814ea9b9dc31363dca62d31829d525a1c21fb1d","impliedFormat":1},{"version":"c58afb303be3d37d9969d6aa046201b89bb5cae34d8bafc085c0444f3d0b0435","impliedFormat":1},{"version":"bdc296495b6f778607884441bd68d8fe60c12fde5f1b16dc61e023897c441684","impliedFormat":1},{"version":"c6ce56f727ab1b7eff8f14a1035058062a2f0f45511de325cf6aa32e1bad0497","impliedFormat":1},{"version":"3e1c36055eeb72af70e6435d1e54cdc9546bb6aa826108ef7fdb76919bc18172","impliedFormat":1},{"version":"e00ca18e9752fbd9aaeedb574e4799d5686732516e84038592dbbe2fa979da3f","impliedFormat":1},{"version":"b8e11b2ffb5825c56f0d71d68d9efa2ea2b62f342a2731467e33ae2fc9870e19","impliedFormat":1},{"version":"1a4e3036112cf0cebac938dcfb840950f9f87d6475c3b71f4a219e0954b6cab4","impliedFormat":1},{"version":"ec4245030ac3af288108add405996081ddf696e4fe8b84b9f4d4eecc9cab08e1","impliedFormat":1},{"version":"6f9d2bd7c485bea5504bc8d95d0654947ea1a2e86bbf977a439719d85c50733f","impliedFormat":1},{"version":"1cb6b6e4e5e9e55ae33def006da6ac297ff6665371671e4335ab5f831dd3e2cd","impliedFormat":1},{"version":"dbd75ef6268810f309c12d247d1161808746b459bb72b96123e7274d89ea9063","impliedFormat":1},{"version":"175e129f494c207dfc1125d8863981ef0c3fb105960d6ec2ea170509663662da","impliedFormat":1},{"version":"5c65d0454be93eecee2bec78e652111766d22062889ab910cbd1cd6e8c44f725","impliedFormat":1},{"version":"f5d58dfc78b32134ba320ec9e5d6cb05ca056c03cb1ce13050e929a5c826a988","impliedFormat":1},{"version":"b1827bed8f3f14b41f42fa57352237c3a2e99f3e4b7d5ca14ec9879582fead0f","impliedFormat":1},{"version":"1d539bc450578c25214e5cc03eaaf51a61e48e00315a42e59305e1cd9d89c229","impliedFormat":1},{"version":"c0ee0c5fe835ba82d9580bff5f1b57f902a5134b617d70c32427aa37706d9ef8","impliedFormat":1},{"version":"738058f72601fffe9cad6fa283c4d7b2919785978bd2e9353c9b31dcc4151a80","impliedFormat":1},{"version":"3c63f1d97de7ec60bc18bebe1ad729f561bd81d04aefd11bd07e69c6ac43e4ad","impliedFormat":1},{"version":"7b8d3f37d267a8a2deb20f5aa359b34570bf8f2856e483dd87d4be7e83f6f75b","impliedFormat":1},{"version":"761745badb654d6ff7a2cd73ff1017bf8a67fdf240d16fbe3e43dca9838027a6","impliedFormat":1},{"version":"e4f33c01cf5b5a8312d6caaad22a5a511883dffceafbb2ee85a7cf105b259fda","impliedFormat":1},{"version":"a661d8f1df52d603de5e199b066e70b7488a06faaf807f7bd956993d9743dc0a","impliedFormat":1},{"version":"5b49365103ad23e1c4f44b9d83ef42ff19eea7a0785c454b6be67e82f935a078","impliedFormat":1},{"version":"a664ab26fe162d26ad3c8f385236a0fde40824007b2c4072d18283b1b33fc833","impliedFormat":1},{"version":"193337c11f45de2f0fc9d8ec2d494965da4ae92382ba1a1d90cc0b04e5eeebde","impliedFormat":1},{"version":"4a119c3d93b46bead2e3108336d83ec0debd9f6453f55a14d7066bf430bb9dca","impliedFormat":1},{"version":"02ba072c61c60c8c2018bba0672f7c6e766a29a323a57a4de828afb2bbbb9d54","impliedFormat":1},{"version":"88fe3740babbaa61402a49bd24ce9efcbe40385b0d7cceb96ac951a02d981610","impliedFormat":1},{"version":"1abe3d916ab50524d25a5fbe840bd7ce2e2537b68956734863273e561f9eb61c","impliedFormat":1},{"version":"2b44bc7e31faab2c26444975b362ece435d49066be89644885341b430e61bb7e","impliedFormat":1},{"version":"06763bb36ab0683801c1fa355731b7e65d84b012f976c2580e23ad60bccbd961","impliedFormat":1},{"version":"6a6791e7863eb25fa187d9f323ac563690b2075e893576762e27f862b8003f30","impliedFormat":1},{"version":"bd90f3a677579a8e767f0c4be7dfdf7155b650fb1293fff897ccada7a74d77ff","impliedFormat":1},{"version":"03eb569fd62a9035cac5ac9fd5d960d73de56a6704b7988c13ce6593bec015d1","impliedFormat":1},{"version":"f77ca1843ec31c769b7190f9aa4913e8888ffdfbc4b41d77256fad4108da2b60","impliedFormat":1},{"version":"2ce435b7150596e688b03430fd8247893013ec27c565cd601bba05ea2b97e99d","impliedFormat":1},{"version":"4ea6ab7f5028bedbbc908ab3085dc33077124372734713e507d3d391744a411b","impliedFormat":1},{"version":"909ecbb1054805e23a71612dd50dff18be871dcfe18664a3bcd40ef88d06e747","impliedFormat":1},{"version":"26309fe37e159fdf8aed5e88e97b1bd66bfd8fe81b1e3d782230790ea04603bd","impliedFormat":1},{"version":"dd0cf98b9e2b961a01657121550b621ecc24b81bbcc71287bed627db8020fe48","impliedFormat":1},{"version":"60b03de5e0f2a6c505b48a5d3a5682f3812c5a92c7c801fb8ffa71d772b6dd96","impliedFormat":1},{"version":"224a259ffa86be13ba61d5a0263d47e313e2bd09090ef69820013b06449a2d85","impliedFormat":1},{"version":"c260695b255841fcfbc6008343dae58b3ea00efdfc16997cc69992141f4728c6","impliedFormat":1},{"version":"c017165fe60c647f2dbd24291c48161a616e0ab220e9bd00334ef54ff8eff79d","impliedFormat":1},{"version":"88f46a47b213f376c765ef54df828835dfbb13214cfd201f635324337ebbe17f","impliedFormat":1},{"version":"3ce1188fd214883b087e7feb7bd95dd4a8ce9c1e148951edd454c17a23d54b41","impliedFormat":1},{"version":"5c59f83061ccd81bcba097aa73cbc2ff86b29f5c2e21c9a3072499448f3f98b8","impliedFormat":1},{"version":"003502d5a8ec5d392a0a3120983c43f073c6d2fd1e823a819f25029ce40271e8","impliedFormat":1},{"version":"1fdbd12a1d02882ef538980a28a9a51d51fd54c434cf233822545f53d84ef9cf","impliedFormat":1},{"version":"419bad1d214faccabfbf52ab24ae4523071fcc61d8cee17b589299171419563c","impliedFormat":1},{"version":"74532476a2d3d4eb8ac23bac785a9f88ca6ce227179e55537d01476b6d4435ea","impliedFormat":1},{"version":"bf33e792a3bc927a6b0d84f428814c35a0a9ca3c0cc8a91246f0b60230da3b6c","impliedFormat":1},{"version":"71c99cd1806cc9e597ff15ca9c90e1b7ad823b38a1327ccbc8ab6125cf70118e","impliedFormat":1},{"version":"6170710f279fffc97a7dd1a10da25a2e9dac4e9fc290a82443728f2e16eb619b","impliedFormat":1},{"version":"3804a3a26e2fd68f99d686840715abc5034aeb8bcbf970e36ad7af8ab69b0461","impliedFormat":1},{"version":"67b395b282b2544f7d71f4a7c560a7225eac113e7f3bcd8e88e5408b8927a63e","impliedFormat":1},{"version":"fe301153d19ddb9e39549f3a5b71c5a94fec01fc8f1bd6b053c4ef42207bef2a","impliedFormat":1},{"version":"4b09036cb89566deddca4d31aead948cf5bdb872508263220582f3be85157551","impliedFormat":1},{"version":"c61d09ae1f70d3eed306dc991c060d57866127365e03de4625497de58a996ffc","impliedFormat":1},{"version":"c1a6eb35cd952ae43b898cc022f39461f7f31360849cdaff12ac56fc5d4cb00d","impliedFormat":1},{"version":"7393dadbd583b53cce10c7644f399d1226e05de29b264985968280614be9e0dd","impliedFormat":1},{"version":"5cd0e12398a8584c4a287978477dab249dc2a490255499a4f075177d1aba0467","impliedFormat":1},{"version":"e60ec884263e7ffcebaf4a45e95a17fc273120a5d474963d4d6d7a574e2e9b97","impliedFormat":1},{"version":"6fd6c4c9eef86c84dd1f09cbd8c10d8feb3ed871724ba8d96a7bd138825a0c1a","impliedFormat":1},{"version":"a420fa988570675d65a6c0570b71bebf0c793f658b4ae20efc4f8e21a1259b54","impliedFormat":1},{"version":"fef614c5c1079a9b5b227e70832184e8cb70e1f3bcbd66a7406edba40ad3bd52","impliedFormat":1},{"version":"39e31b902b6b627350a41b05f9627faf6bb1919ad1d17f0871889e5e6d80663c","impliedFormat":1},{"version":"282fd78a91b8363e120a991d61030e2186167f6610a6df195961dba7285b3f17","impliedFormat":1},{"version":"0ffca55b4ea7ea4dea94a7ddf9c2c6d6e5c8f14120e720b5d6f0c79f72eab49e","impliedFormat":1},{"version":"47008c9a4f168c2490bebc92653f4227accb55fe4b75f06cd0d568bd6370c435","impliedFormat":1},{"version":"b5203823f084dcfaae1f506dfe9bd84bf8ea008a2a834fdd5c5d7d0144418e0b","impliedFormat":1},{"version":"76c2ad2b6e3ec3d09819d8e919ea3e055c9bd73a90c3c6994ba807fd0e12ab15","impliedFormat":1},{"version":"ec571ed174e47dade96ba9157f972937b2e4844a85c399e26957f9aa6d288767","impliedFormat":1},{"version":"f9013e7bcb88571bbc046f9ba0c16ceb64bc78cb24188875da9dd7222062b138","impliedFormat":1},"f976a1445961603ae54225efab9a6550a13f0a20371717c8274c330b72e9b350","b188ad5ed393e1f656c20f2df564c967b29f2f22c7837b1023f2a9223a38a4b4","60fc74e8f7bb43e43a4edd181f9cdae5988ad3df280a43077502564012a1ea6f","69ab693794def1af149b14580871ac0c95e4b9214551bd4f81c2691534c52300","a6e3d0b0ac2c1d93d797b442b52ee84f220bcc40af7e9952f3031643a671f1ac","126d162df395ae118b1ea7b4505a391d18fd8a047f2a43a2ecc9ec843e6fd2f5","e64595b99f32b213abaf20e114a260c71b68df6959e5c862110853a007f77a94","3f4607039d75c9325030d3ac874fa9bcc3d0416c7ebda0534efe5999ed73d137","aead185c98d0baa1b988881738b26deda96bf062d2f434ebb9e7d86e59d11e4e","e9024c33e3a179f2e8c23cf3bead2a57cd06bf2715b5d5a32e3627a218b63d9e","30a8938f9ab858d2b05d34df916203daf21d93d40d30a229caa005fb54f5ceb4","7dea1a8e7f1f9dd9e13ecc19d6b8a3d43d8d14bfdf9c423b67b51b54dfcbd141","61da6ab9d00fbdb81fe573a58ed02535fa25564791abd58054d7c83fe8ee6b84","3a276cd13202f78917303bb6f3639ecaed209ccecdf6af58239c8cbb132db8ad",{"version":"cceffe86f932e121198856a0672ed102f51ee26c4e7d518aafdffe0e6b465293","impliedFormat":1},{"version":"a439f95392e76f70dc45a1b628ae45a19e0b65a3be2a689a0195dce805ecb379","impliedFormat":1},{"version":"a3d54bee0dd32343f8e69a3bea28b69a2d3019d285de3ccc4f7ce8222326a47c","impliedFormat":1},{"version":"e66b54d888e7c4aa706f68cb4f423c9a7e4466c116140b3b751f94b9f6cdefd0","impliedFormat":1},{"version":"713f2c35d90d976f5ca7c9d21468b15fde52992338874314214583f45bae6e54","impliedFormat":1},{"version":"5f38fa2c4106406bea0a2f75317b9ebef57fe30d0695af92a5e14204ce187f53","impliedFormat":1},{"version":"110c1fe5db2c06d16639f7685dc8454852b77550c81e5b83fc97b13ea7f764db","impliedFormat":1},{"version":"250f619e55b8b2a6ef5a45497a06ebdfd7e22f6029f4ccfdf9f4b358fefa12ca","impliedFormat":1},{"version":"8243b4b42011686c366147330752be0fac657cb8462c355ab0587779e0f7a543","impliedFormat":1},{"version":"485a8a5f42752134865a8b7b9204d7a4a45ee93e9fcd5168ec405ce8c30831a8","impliedFormat":1},{"version":"bb5b80d0077c2d28740cf29a350ccd0e392f753f05b23cc1e0afa4c83b5f65f9","impliedFormat":1},{"version":"46a3671b9179394708097450c1a0a3b362ec8599ab8d65ee7d4100120dd52f8a","impliedFormat":1},{"version":"6e959d87b914dafc5ef176d5157f0e83ef78eb88043680611cee3b0e0afba4e3","impliedFormat":1},{"version":"56bbd1661909b6600753fc71ed0243f6e8adcae647ef67fc0b62b60e2675a5b5","impliedFormat":1},{"version":"0f99e68df1ea45629adae539a99c2905fe434028fe6704f167271f4ff4f05264","impliedFormat":1},{"version":"acf4843052bd9022e109055cbe6eb27ebdeb182e0727d10a2d1ba2733b3d6f3f","impliedFormat":1},{"version":"8d43955c94d917e00cd23a36e35d82d2eba6b6fed2191a2f1d297d1b0795180d","impliedFormat":1},{"version":"eb8d61ce7e98f8023e60c9f45710a54a05a3efe6d46043fdd3cb92c5bf2e8acc","impliedFormat":1},{"version":"c322f27d3efe960092e77ed8b8dce71c50c1157078d8f10ff895a808f52c829c","impliedFormat":1},{"version":"0304cf0856f4b1cf03ba95e30e483f5e2d2d4d58bba30f9a639358fa518c6bb9","impliedFormat":1},{"version":"001a42cefa6587b7aa015630ae1912d0be56d027dabbc4ba1ced6ecb6f61be81","impliedFormat":1},{"version":"4efcd19cb6d32bc1a6c502c43dc4751c5bfe9c3dd35dafc48c9788507a848b7f","impliedFormat":1},"90bf54a5a7a2487577507c8be7df17a73ea0518657e3f378a2314f1b52546300","6d12d059caa090e9798ab3f4be52411e6df50069d8d15c9269cf3bcb2a1325a3","f9df05a7226cab25e731022fb71730c7ab7d4db06fe768bfed366a55bca9da91","84e1660f80c8e3c03b1abdd46ad09e491e82f2bf8f1747b9f6bdc2db63c84a30","2df865d4c99ea7d945af29a5c9451468b8b019719433f680d7f001f4c4635080","5da773260fa66694907d18cac65d73b5730d32c95214857074f939e663fee395","867bb97b1d704542850b3fcfb211c3927527e6c1d54dc5212e2dbaf43610c08c","01545352cd50165f0e9acb3bab9ccad3836b900a933f9dfd2f3d8eac85a4e23d","c6b22252fd81fab88777c261294894afb19ed3b650a76ec5e3a4644950bb9f8a","bd07f297d01d69e5865166c50453b4be41ec11f28c4d26feb974b5b3cc22436d","ece7b337b94ce3e3a99adf586e893350034c0a4b7ce084d08afcce191ecf7711","d1cbd63b0c435eb586a12b3e461f2dc01d38b6b88f20e8d4d84e64010d08122a","3ccffe8c0575cfc9c633cb73b1dc3c8b290d41a6aca0105bba6ce27c61c66fe6","41e0e6ea2720e7f873df13477828b85e77f4469a4fc0c5f2c2d4335fcda92d98","bd1224dd9cf2b39e17c1879e1a44705eabb2518020e002e6eec7ca7d662c9e7c","93619f781f9ed0c50abbc64199b3f9bfb45a6b47aabde60b3637267d96d69b77","fff5eb9d77d795101a0482ec74aa5742e40643c933a2efa71169d032ebfdb9ef","6b9e7dd5c0ff17577f7df861f24a4c53622b003981ba7ee889e63296595e8ebe","62f7b9c735d54150cbe76fc470a55cc05246c6411ace0716cac0dc0e9b7c54c5","11781bf4e15c29462b6d40b82455111395f1880709c95b52bd7718ba5ef9444c","30c93469b5e09b2b3647a5c1e301b627473ca8f861c83713a71a6cfb78add1fe","700b58602f109d0c4334c57ceca68f18929a1ad43f7bf3d0aa2f58fcefd65885","42b43ee192f53de2545bbea844444a922ef43a4a8de4685dcaddfd37e68e8662","50a122ec45be2eac438f8c1fd52ee26f3046ac465a958ec0e88fb1a145a856bf","720ddcb843dbece7d4d08d7975d99b3665e405d2bc931327b9bdc889dc7c102c","9abd2c29e8a44caf831529f2b44631f60d5ac4f1d0b90ecc5b4c75e541de8797","1e68e5f1b627547adc7661bd4bc562d2d40f1c12af8b55bcae0340edbbf047ef","92ba52bb1af1e28fbbdad23b96f43a2921054606e3cba5593fb6536fdbd6ed73","87196cc91997e0f1ce0285a912506722944ecb3c7ea9ef48589b2462720361b5","9fb73314cae5a3211bad45987e89fcc6f5413cf45912d89f9c718ddce9fb0013","4590f20c4bfdfad366583489512a69e6184597a84848418bb6f204390787b2c5","fac19c7bafb8a0fee3ea0adb9495b342e81544275c14c7c92d82c901024b924b","f84469c4be7125dfcf7c0fb8c72ddfe7c184cc2e77baf5cd9f3d868c3b4826a9","d0a0304c1f81becd4eacad1f6f566bf802a7dd001570ecb49c84b718959e1d04","9f17e2392aec5d6c9fc86b13a033c830bf5cb3b0854f4748918c4be3310a95fb","321ab62fcb6008df42aa0bb65da82642a00d84cc6a87bf3b1632bae014d59c16","5dcc5229e139b7711c5286928b53e1df0f3619d6b6bd75f31c97a6404f0e40dc","b73cfe37199f0375faa100129c371c0895d2029f6f1b12dabc8c53f44c4a09db","7f6f2b34f67fb41c3a146e0e19542383544278c72792f592c578fb480539a8b3","3aa368e80bb937e6a340f4f4cf2294905817d393e71e34fb52f9ddfb93d3d2f7","9213345e36203d7f4b048dbc58b1da499d5fe600817ad28e65c7f258d04dd294","8101a853e6b2c93d4b34b3bd9a644f2d9a0f99c475f4d869c15e5cf69d9086a8","f5453dec4cdb2eed99c8d38cb7503a4b8be0d3c402ed874e9a43d8231d23fce1","6a20fa4a3f7f3bd56cd3f2ca5a92c8840f50454feedb828b7d65a4b7b453f5cd","36d4733d9488d17e7eda60100668792229697e151090543a1b18f73c89b90fce","c7099bb21135ecec04fa9cdd815063337136cc6fa58260b8e3c19ca6bda2c9dc","124649181a4e8ccf1ba22821e12d153efbd28902fb884b87c633d46650300fb4","52d610ef665b7417cf9232c928eb01c3e44ccb1d367b3e9d2a901b20aeb3bc7a","fa79cc513146c64bf782d6d2de94e449ec52e92cdaef88e64770cc3a0c717763","5d743a7205f8146c06a44cc75eec822586a772624a766dd82d1c53aa22c21651","8aab508ece963bc3b85cdce176939ca5424a837c3fa2bc91239defeedc83bdc2","e5579d0fda40f55bcfcd2eb901f51f3feade044e1a5a0fdca1138b85d5fdd09f","a52e91a07f8c25d727d8a66381382198d7d4dd123b09d2934bfb3f709ad73235","d99de2054142376f90288ff67cc112402b887096acd01c73d630d1e8a5ca2eca","2fc14ed32408d844d2b88a6edb13f81ed28825252e6f10d3c4ae0a03a442bc64","7cac294f7c4330454aed9492687cdf6b57b3a1efd08464f48616ea10b971ca6f","24a28e1babf7ef1f9cdbf10e026e667d5ff97b071251b5b6c6b8f45caedc07c1","1ede9446e0d6e26910af10284dc99a666e689e7800cc7b23ca8aa00ce1dc9c98","211d3d5cd88b33cb0ea62e3c37e9ef6195f8c45eac10d6261086a4e6628e5045","80d67a3a7e4a71dc8e33be863a30e0dd8f82d09ef435fb31704021116456bb27","a0dac3a3151cba5c6d0bd8f11ffb27c4b545c6309375ae4f6310b6f23c64b31d","6439281b871ac0a6f0907ae9c57bac1fbc80bc225d788550f9f30e6103929733","02116882d7b6229d292b9b64a3a75039219493b9b83312311b91aad3a723f8e6","8fb4c466cc575be967bd8a16d20abda0ad3408049241df5d7ba7cc04e7bd9b5f","7ce4fd547fce6bfe8c13fcf31215edb9e5bb64bf87f3ddd7e9f1195669743ac9","800f6223902c0416ca764cdf575a99b889b1e6c158a97148c01c948880a9c1c0","987edb835005fc5e660a38c709538fe21633ffa3cda04bd111dc8d1ebfb9797e","f39f895062f3dc4517528aa4b8cbfa7986612d57416de19a7ecf380edbd11824",{"version":"02b3b77a8d29c9ac409edc1c7a4efa339e2a07e3c5b5e6ea16f108c6eef9e20e","impliedFormat":99},{"version":"b654edb2d27ce30bdf7498a9ce6ecacbf22a27bafc8008b6ccdc86e8fc21beb9","impliedFormat":99},{"version":"d5602055e69da5aaf7dafa987dbf645f608f8c66536c7965680fe65420fed2fe","impliedFormat":99},{"version":"41a5ae482e864a6128e6054e88f1c0e06884793f92aff5c67144fb02d2373079","impliedFormat":1},{"version":"b8f01261ee1417ef9ca6e0e55e4b66ce3eaf79e711f8d165b27f4d211dc9fb24","impliedFormat":99},{"version":"9a0cc8dd19c696a14f3763d614bfb8f38f7cb41ff6679c6d2c321fcc12d3afd5","impliedFormat":99},"67ec96f6d8c5635e6bb170de43b9d5f49ffd35ff5ab4b4c8faa72685f570d635","98da13673a1a5ce55d9c9bafed3cb8ba97ceb6bec30c76d59dae3923b1b8ede5","4c1f77d50f1ee9176839c7ff7557f7068d46b85fc7fd0bb44942b8e51da033d2","ab1e5d2fdc6f565de756c440feec83c6a8537ab7edfa3ab2e167c38cb7657d99","d6b4989f9dfca00843f0d85129226993cb0d46de6bea1ef5e55f0d04ec0b18ee","70bd8f26800f7e79c125769a554da5db989180e02f3e5007516518b2cbca48e8","60e37a3d2228bfbe49e547a60d863beda5bdb4999597254477d3c126b8c59228","4bace03afaa79bb0e94d63329820c853514347379a40dfb2e51f489d177a4a6e","3e12f2360807075a73a04a9da7c1c1e34c8e58f1efc48f561fc14623801ca686","5d24d5e102d247d3c3b425ea1ee07497eabecc06c141a784e22bfb5b2bd20d54","733c73997ead980a6095c99335da031e10eb2aaf805b6d9402a185d2b539624b","7f3e169301aac5e48ead84cf64f9bd26c1aeb7a85f8f003b068e08c8e7dd727f","28617002ce623f5bed672b0df46c1f67909769f4f43b1df82b7cda2390bc8a52","3478a015f812de7f238ae870450e58e63c8df5b115506aa5ef07b9ab22d7d4bb","437f1b602f94683e101af303f41677cdb768a12fe8e0b05bc7bc08cb2a0a4b96","6768e8ae27540e0a8d0e0ef2c69d3bdcc80a363fd43c166ad26cf98c1a69b769","00922ab5dbc74852b6bbbaad3dac6d201763bebf8a9fbd38380f313db17708c5","ab2e5f7721c2e54cab5f05b8d83ed2dc7536a93fcea98c9c7f4b5acf0d305860","62e061d834e5bbea77377f68edf30dd6c6c57530b9a3157c462d044020e94f71","5061293c1d486fcf1dc7a4b03b925c4da070974a858f07e0bbbf7baebfbae6cd","00c8b4df9995ea05c4f39dc8afaa927b7cb9936d1cbe8d321131d83db9b9bafa","6e029dda98f0a43a9e1eb9621d0c44a863e8072d3322956563588bc539ae64f3","ec41aaa4b5564a5cdc142aaeb67dc4adc28862e8da6925abe9ba11f3e4086c5d","dccba7f0532e3ca53aa3be596565a58b7006a6b303586e35e147cc721af7cd89","6425e3d68ff94fd72d379dbf4fe1a98734cd478c209308791dcf0300f245a4da","9c633da9a78727b003cbf28a6fc31457a62b46494d963df7d63b5619891457b1","23d65d52b91fa8ce2a163df23dcfc8f03db36bd1be350c6ac34b7fa5cce1743e","9b1eb29e84cf09eb739db25d165b8c4130fe94dbfea1856a61b12082efebcd93","fb3f06d079303085b14a8fd7a558da800fdf372f54d98cd4cc5f1159693cf05f","9e4ec3cafd44813023fb986662ff46c7cfb1862aeefac9a96b1c022c2bbceeb7","df0e6c27c52e81bae3e53c878d5c2624d2cca64e827824c1422a647ff683c2db","cfeed107be3dc7dff19c41287c21f433d165811de555351659210a450cbb2fac","65eccb8f5fbb2acffb62aaae4f142af0feecb5c684cb7f17ec3e45aa807d9249","f9636a06cc9fa094ebd591406ed8080c665a7d12078068882364f84ec8fb8ffd","96ef7d7fa439c3f281b5452dc210525feb5544ce972278c34986dae972c3627c","17ba2151c1b98964debcd7a791f6ef294b59e818fef2c59a94826edd5be9ba9f","fb80ec61399a11262ca24da9290f0ca2d51fd2c7fb56fe7e684d60901a2499e8","877a82f5cdfdf550ec70a32600d218740ea4ae23b595e598168041cd0f69f873","823bcca25e5895d738091b85c9a9efb738efdb0d76d79d902ba49ada6871cbf0","abcc6d9a6d9114276891187bffda08af2580464148036fa24f89dc7068cf9d7c","bb3fee2b4f5b2da276cd206304e5f31be4de8df5005dea896200e9904dea3a9a","a9b58c1ee0631a8d3ffc2f52d07e7fcc4a874ee395c302ccb473efb348a0f7f5","5ad40a00c9118f4b1e11ff06577221403928905eec08483f5fd45e820cb7b2dd","3d17a3d7e1be7e678dab9026bef775d00c57f9025ac2347670247b397c715fc8","2be50d64073b887e29f5e899439a73278df42ba3a62b9f3c4944c96ac81c157e","dad54b527b7dfed20c43389aa6552e1cce91dca77802553bab7258cc84f57b30","0b78c823df7acc6216c6399cbbc1699872c6f2a008c00c3c6af9b2361be96b6e","d947e72f500d0076c7388d86a3fee430909980fd035ca9a1a61edd05a08abeeb","c1d623dcee823a3060150dbc6d4a2f26d7effde202cb9c1e00d9d7cfdd36d5a6",{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},"71ad1ec45771f7aae057d239fd1b9f8e81f8966509de674f7d414c0fbde99e09","308e9a864c6bb61536de1d0c306874a45261bcb400dfcbb06eb83300f015f85e","2f7c636e3a37c00c438922cdf9511cbce160b138254372360eac40cb4942210a","cab0466c71f8d9d85182a86571fe17d4285a0156393916fd870a35121a151bcd","cc6785b773b81f98683a0a10e932ab7fe4491e1123b582d968ecca520e176955","5aba5fe8ea7c78725da4aa86d8db576d845330c5075805a02fda6b71d4057b37",{"version":"6837a6daf6dfbcc1628e7005aa1a21965befce194d9a165459a975c264cf116a","impliedFormat":1},"7036801e4ca5f9876f981938feccac9b5ab077848fc7724f2288e566e2a234b0","f69d477871c130d27b0cbec1b8dc3655b2ed2bd2360f82f47a2613a239f652d5","c8cb9982999b636708acf1b0a924d5453a48ab93fa44623aeaaad3c80c3753b8","b5fcbf0ee049497f38a54b9cb2606d180feba715b55b9c760d968ce5e6ec3d6b","d3bd53038be48061a94ac951c0b4f965e4c14e6fdfdfddbb1f7902be6b6bd193","8ec3f9f1d700eabc945822f70850d24e684187e55bee1d2ff4d0735cadb9c7a7","e66d1c61f0e0ea09c67dc043c743eb0094c430bc4517ea81c87416a746d0697d","8a590683fd54a6b35a2890c02ee8969497d618be2f7a12ecc0dc9528e5aa394e","509a5957c712dbd2f397206886bbbbaa6610149f2339dff2ff1ad463ba92bd3a","12abeffcfef0d9d102774f92c764a1111503f47d7191b86d11c1e973d005df0d",{"version":"e27b7ea88d3795a698ae3454516e785c58a100d2da74d58e82ca6c3f173a5607","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"a7589d618b8b27dc24d61eaf0b66e3e02f0a53982c25fe2727c9d95a6db7cf0e","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"4f637cf7453d34b6cecdc2cf281198177c08644e8cad9490b8d0d366b051d2ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},"5ac3325eb59e2b5c2f8acd27171feffe188794cbbbae88b82332cbe520d81626","0008338afed0893ea5109e48e391ebeccd64cbc8eeb01e46bdbd15c6840f9c88","098ff54eccc5cff52a8cdf15a4cd1c50ef4fd2c8e7c4a157696c7fb8c411873b","3c0e6271c47ade73afbb9efd86c29c9e981426df0c61ffc42686e7077960e071","4f3bece4ae675e15c198b533029d0386c8bfe243057c959407d141dcf7fddef4","728dfa3b2436172e6a362d458bc38ddc90a1e4e55ca3e5c571c4fb4c85d1c35b",{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},{"version":"2745a59bbee61b6323e2a48a74176f809195fb9749ede3b28d254f804f8dd278","impliedFormat":1},"54fd3d82dad928895381f6e0cd0923593f4b2fe1b1b062cec0b0d709e4b48c8a","3310aa99451062679be495e284742d3d22abe1e27cd9ef7359897ba94663a85f","68176547145efdde770b6ee7bd458bb245c5ae484f243f82e644dbe62bb0507c","7a910e284359f2547f15e0c8fffa7caf89530d12d00f86afeb8e29223d4e13ad","b95c6cc6a6ef5b814741131786fd2027ce3b446d11812a1e8dd416b26f4c7012","e225378ad58fbbeedb444efea11a120034bf23ca498f6abc47f2e68b1145c8cb",{"version":"37ffe3c12813b6a6d512f7c27b71f3388d03dafa10555ad5094cea393ed3d1f6","impliedFormat":1},{"version":"7e78d892463fedf71952f2476d53eb874d3ddd85dafef67f17f249fa769d48a5","impliedFormat":99},{"version":"fce8fc3270f9ca57bbaafa85c874ebdb56467f283f1c7af0ab1642745dad34da","impliedFormat":99},{"version":"bc1d9cf49ddbc7c4de8ed62d598e52109ccbda19ae421bbebea6512a5b6aa8a8","impliedFormat":99},{"version":"a77de3d536866c603794061a04b219dc4268946f2c7c728a7fed33600f05e8fe","impliedFormat":99},{"version":"40db523fa785a3b46bd70b1a25a695c27d46ab166ee776702fabb179a147822b","impliedFormat":99},{"version":"6309b212d11255199800461e71b9739211ce20f22de754cecf0aca9176a6f72b","impliedFormat":99},{"version":"50875ff16ada1ff33d8e18733603003776bab2a16335ed9cc809326bc6c61b43","impliedFormat":99},{"version":"e645540c570c2e1046691874adc1b7376aea883755ccf9aa48a654065684882c","impliedFormat":99},{"version":"aba4a3c7faa69d25a40e7600c4fc2db23f0488a2fa951dfb4827db5aa38ebff1","impliedFormat":99},{"version":"0e053682370a25a792dc16878e2af8657a444cf97c12618274db74eabb0f9010","impliedFormat":99},{"version":"867ecd736f6f31716faadf9a3574a6694f987128388edfa4e687eb5e89a67065","impliedFormat":99},{"version":"245a6d49a8c543c8224fc8e936e5cdfe9f8031397a0baca21df7875d3e1c0793","impliedFormat":99},{"version":"56277c308ec8aeb151402bbe00936244f731912bd52bbe404f9861a1ac56ce38","impliedFormat":99},{"version":"a65e2b08014c58503f4736c4d2acf8bd0fa9bf8bb26594661e5589878fa12777","impliedFormat":99},{"version":"a97b6028bf8b97761ab449f213794a7df511c5294c63c1da723bcce4e4359237","impliedFormat":99},{"version":"ab35d635fbc9525840a47c7ae869682a34e237e7693163dcd905f512e5754c60","impliedFormat":99},{"version":"ee7a1f5f7f64294940b5de9e1f2176b32283466e7deb7e2b59c285226cd91e11","impliedFormat":99},{"version":"b659e5187910757fde10ae751a7daf1d5223b5ede3e7da4fd8a6802377a8c066","impliedFormat":99},{"version":"e3f1c29c7d361320939a701c19344515ef1ece81679fd93b05d23068f82d5af8","impliedFormat":99},{"version":"b864648301753313ece820ecba983f75d24fd41d557b0251bb1d3d80aefdf71a","impliedFormat":99},{"version":"0b30c7a5def9f7dc3e903ec849471f6fa4f53e4eea9d93f8e6c5f6506f0343ff","impliedFormat":99},{"version":"0a044cb626f8ca7f5150d9c545b92b67d1ce65a0f0c06af1c310bdfe79adf9ed","impliedFormat":99},{"version":"7a34bc48c16e36599d2557e0c3551c02c2d2c65786d636fa4642dddb7861ef01","impliedFormat":99},{"version":"074aca4e6e82a8965426ec5e5926ca3aa10240a3815b77b40307a9be3ddd15a8","impliedFormat":99},{"version":"b092c5b5d580b68d779275cb451b3f7dc07efe4f6bb33fb704fa93ec10175dc2","impliedFormat":99},{"version":"d084de09e030e1af6f242f4a52d0c5fbd68bde6d32920e01a684bec2d3453852","impliedFormat":99},{"version":"b7933efc957e83aec2f30c831212adbd4d15215f756d7ab33fb9e3ebf856fdad","impliedFormat":99},{"version":"949eb33fa405ee20dca30f39f9b9056fa9c1feb9b71a3ef0e8ef22cdc5925c62","impliedFormat":99},{"version":"a3bd0fcb5f2725be426dd059489112c116078fab537ed46b0ef30240dd5fefa9","impliedFormat":99},{"version":"d50c869a1403f37e2afdb439ed434112a5f21f51d9b2f9df2c42a7aee183a4ce","impliedFormat":99},{"version":"1f699f13de7568a6d155915f6df922d37d28c21385d8870c5d0b39631114f2ec","impliedFormat":99},{"version":"c9c5c1285ed64b9d73561bab43177b87dbff5d70763bf9a0a94fb5db6877ce00","impliedFormat":99},{"version":"07cbc706c24fa086bcc20daee910b9afa5dc5294e14771355861686c9d5235fd","impliedFormat":1},{"version":"51e9ea953a31fe319457ddba13afeddaf7068e16c4c2936a0907a3c9a08af446","impliedFormat":99},{"version":"aa6e7182b82376aaa7419457ce5a6d3868a570a69538c047567260acce0abddd","impliedFormat":99},{"version":"6a6981689493f77ba07b195882b126480cdadcd3aaf6aa9ac744479c67b424a0","impliedFormat":99},{"version":"5c845719505c5a3a16789efa30fdab2a613b1f04fb75f94dd53698c700f413e5","impliedFormat":99},{"version":"7c5dd7ed77ef7f36972da2b55e77f5125624b01440ca2e3c64914736571d8577","impliedFormat":99},"e67341c0db2164f7db0e741aae2b9dca4e6aed80be4dd6dddb380f8c5c59e179","a24b2f4b8b921c5260ca30983b6f5d6d85ca8921bd667b72468b6153d9203add","8f0a4a442c4ae363aa69df35f0d583ab38f7bf1d6b325faa8726491bee58d105","3d9cabb23f705ca001990d64ae9381cfaabad76770b4b8c85030f8b5076ed702","6ce2a7bf525849bf87f47a33d6a788330b84c3a1641be70b0c9b15635c7d3b4c","c446e47fdc730f835615ef5cf24c0b753557b81244f4c8d0c97b3e2f63df5ffd","37801cea4254503bd6b646f5433d12e689a1e33578e1f680298896b441c129dc","e76dafd9be33cefccc16ccfd91e02a0ac8246c9616ff233932c872a3a6f7f05c",{"version":"46205888dcd3e428a7f256d866f9270dea1d36bab949bf3adefd6d39479df8ad","impliedFormat":99},"fb58343229db81ddfc85fe5a20d1b1875396b7b07ebe150388492eb2fc2a8986","14253d9142b751318be75d213ec47d89acff13eeb728c0f1d4df2f6319e9372c","d54597601ad689b2164a4337c1b42908f34666573f55896c5b7291af3c5a872c",{"version":"cff399d99c68e4fafdd5835d443a980622267a39ac6f3f59b9e3d60d60c4f133","impliedFormat":99},{"version":"6ada175c0c585e89569e8feb8ff6fc9fc443d7f9ca6340b456e0f94cbef559bf","impliedFormat":99},{"version":"e56e4d95fad615c97eb0ae39c329a4cda9c0af178273a9173676cc9b14b58520","impliedFormat":99},{"version":"73e8dfd5e7d2abc18bdb5c5873e64dbdd1082408dd1921cad6ff7130d8339334","impliedFormat":99},{"version":"fc820b2f0c21501f51f79b58a21d3fa7ae5659fc1812784dbfbb72af147659ee","impliedFormat":99},{"version":"4f041ef66167b5f9c73101e5fd8468774b09429932067926f9b2960cc3e4f99d","impliedFormat":99},{"version":"31501b8fc4279e78f6a05ca35e365e73c0b0c57d06dbe8faecb10c7254ce7714","impliedFormat":99},{"version":"7bc76e7d4bbe3764abaf054aed3a622c5cdbac694e474050d71ce9d4ab93ea4b","impliedFormat":99},{"version":"ff4e9db3eb1e95d7ba4b5765e4dc7f512b90fb3b588adfd5ca9b0d9d7a56a1ae","impliedFormat":99},{"version":"f205fd03cd15ea054f7006b7ef8378ef29c315149da0726f4928d291e7dce7b9","impliedFormat":99},{"version":"d683908557d53abeb1b94747e764b3bd6b6226273514b96a942340e9ce4b7be7","impliedFormat":99},{"version":"7c6d5704e2f236fddaf8dbe9131d998a4f5132609ef795b78c3b63f46317f88a","impliedFormat":99},{"version":"d05bd4d28c12545827349b0ac3a79c50658d68147dad38d13e97e22353544496","impliedFormat":99},{"version":"b6436d90a5487d9b3c3916b939f68e43f7eaca4b0bb305d897d5124180a122b9","impliedFormat":99},{"version":"04ace6bedd6f59c30ea6df1f0f8d432c728c8bc5c5fd0c5c1c80242d3ab51977","impliedFormat":99},{"version":"57a8a7772769c35ba7b4b1ba125f0812deec5c7102a0d04d9e15b1d22880c9e8","impliedFormat":99},{"version":"badcc9d59770b91987e962f8e3ddfa1e06671b0e4c5e2738bbd002255cad3f38","impliedFormat":99},"f64cca34a4dd93120dccb5b8a6794a3d3a354c9a9a0ecf72cb15f789b206a32d","944ea819ebc57e63bf9999b757037e6469e9924487038c325025c31ba6d4887c","4bec8a103326be1a8e2e57c27766b0f7b7b063d2d4e4dd8aae9ad13b01c644b3","9b6160e981d29df3d3682a7e2c650b8a71424b45b946d683bea063de6022a09b","c9200471f6a48f7029c607f2287abd6ad229c61c361eec1c54772ba08704a835","008e8639ab1a2cd41fe4efe2a805559390c82aaa6035d3e8d6dc761e919b5422","12a32cc9f722c7c8d44b0aeb30321c6108b193fa9ec5ece1824a72173603b7f8","7dab566192eb251ab82f2534787f3dff14b69ae0196e1a4a0671685a33f159e2","35b9af3d917dd2d632f198041d4cb82947725a5165082862b97e778c65d09e49","c242a3a1149051839c5e99bc85d00554ac4e7650544dab4f6f9d1e57a91c6673","8fd105eea761caf80e42ff4be3eb2abdca3e8e02bc25de0f61382de6f894f8af","5fbede959072aec34a251a891bfe9fc5ade0ced48525d55a840aeddc6c054f99","316c1cbca3a4a766160abc5fc3218978597212e6b53430c77a6a1cbab0e08868","63f7b6a4456a09138ad95165dd97cadea16dd8e8e687c4f1d3df51ba5fdabf1a","756d642c3a4dd1f61caa27ff5c48e6d318e689761a1ee3025d8350f3bb723a3e","b1b2422649eb6bfaff429b7868af2957000bf7e4d3dea189c4c820d32ad9e11c","1cf88aa389a30f7639d9aedbd2a702a41eafc3fb14eec7a8ccc8d1094b423d70","8fa8d58da4f855f92b6f0edee411aff9fb65ea0f285a2b96a9afa62bfdb03e10","c5f028c811701587bd56ba8ce34336bca8d8017f71887342d32c842d4d59c158","8608b9baa8ac73b8af6d63e9cb7bce2dff4618822eef2cdc56ccdc05414dbddc","7bcf0439780bfe6713f4a2bbf375c84734f7c274883a01222deb7703cec32b48","ef1d85ec225ce3a7c2e835a7f8479651adbd6329b824d21ea4e418f21d9ec183","d8bb05b142a744ef0cda691ebdc4705a661f1e0014bbbb3d29451a7b1741650c","1b47a993b2c0dd856cb22326a29f9b5fb1a4c94c64bf3fbad39ed9af9f6b0ef2","bdc9b394dacdfed4b33dae8963cebc98d3ee1293f91b8dc85a94027d114c3487","692cd93257cbefbd674ffd8b72ea8e455f22521feda05c07a2a0168ef99e46ac","20e4ef535121824841e8bfd0f0f2de0c975ea4fa8711b4a29016d52a76febbcb","69c2fe2001fb3553a8958353ec1038cb0e93e58a4fd7666450d98ce6cf730cf8","2168e9a33428555bfb9019e4b42419d1d78cfc6151e16aa36a410f4b69f00af7","add3bc9591db99d9058a1e6697ecd432d9b8ec7b1428da05025719142ee611b8","7c8ac3064301db340fd7e809a10d06f2a787e3b220e4ab7e8bc065df51fb7106","ed3b14b099fcc654967c4c384d919513e6cafddf657ab56762a511a927690341","82544ff11f51a285936497d0ddabedf354421a70a735564b28b5a6a6a513a0e8","6abb6ce3c2908e45fc356308005d4220c82b7c70387db8523ad53b6e91a99189","c70bcdf0774d90947668cef69ac2b829fcf99518333ea6093151270d2db17480","551317e8513a518f5f0aaffe52df58b234d94b7ee9583ad30bcac33581d838fd","1665eb6625fcd76229fa26ad7ba996f38319a6973ae47e0e8a6829078fdcc923",{"version":"7220461ab7f6d600b313ce621346c315c3a0ebc65b5c6f268488c5c55b68d319","impliedFormat":1},{"version":"14023790f163c23f368c45160053ae62dd085370c57afb3606293278fbf312e2","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"b88749bdb18fc1398370e33aa72bc4f88274118f4960e61ce26605f9b33c5ba2","impliedFormat":1},{"version":"0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"c66ecd83ad8b9f67a983516d544cfee5b4b1266141b69b293080ef19683c36dd","impliedFormat":1},"914ab0950d00e7c5aa2ae73eb638d7ba8031fdad1dce0b31d1eef24b08bd0ccc",{"version":"8de5bf5a26e967191d40de27df9be18ba82841f88664a73654d20d9cd05fc041","impliedFormat":99},{"version":"bbe0f8b7ea086b27f00960f897eec4b8077d9feb313e79aaae0e53e6ee7c7f73","impliedFormat":99},{"version":"87811c6c4813091299c878366b6b27452529f63ab70351c8a4a9e703590417f8","impliedFormat":99},{"version":"fe4247a5161969bc7ee06e7655d96f118f6b10b2cb681ebdf332c7d4da84f5af","impliedFormat":99},{"version":"0b0604c013afc1fcf9e5b5185d913402863b9be554b155ccd13b343fb6d5af6c","impliedFormat":99},{"version":"d26ae4cbfa2957baee8a6f2987a82e597f18ad98e8d08f5b6c627e2abc5e2630","impliedFormat":99},{"version":"b640c9b2090fd42bd34d877b4da63b984f77151e8492d804a26353258e28b7ca","impliedFormat":99},{"version":"c36739f58aadbf09f620712c3531a0bdf944b16b9edcd16a6c1f3d7d935f3f5c","impliedFormat":99},{"version":"94617f973c27753e95a3f78cfa2298ec16fa4c1873360124b3fb135f94d203e9","impliedFormat":99},{"version":"949107fa4b339e34b9fca78611d63776cf5952927e500d72bf108fdef03d3a42","impliedFormat":99},{"version":"5a76d9a6dd9260f407a8dd8657179d972640b1f6736744ff397921ba891d8d99","impliedFormat":99},{"version":"309757128a194184868dbda49a9583104e10d5f8ec0b144b5adea8faac559446","impliedFormat":99},{"version":"d22ca62641feb3cc9320464b4f1599d02791ae81c96b1d62d52cb58589a8aeb1","impliedFormat":99},{"version":"5edb6bbdd99524132182d829a58beca3da66609cf5d4ffcc79798a293b77b41b","impliedFormat":99},{"version":"3dea506a24fccaa833a3b7b154751904398ab945f7507de0e99563509a0bd886","impliedFormat":99},{"version":"44674355dd062213ce67cfd3ef343c59835748de456b5cd2b13ad92531ab5dac","impliedFormat":99},{"version":"a851a0369c9c4ee56abe7ecbf3b73841f4731da108192887bc74e3a9eb3289f2","impliedFormat":99},{"version":"9760ba531aa6e82a8e9a60d101b65ddae9d398e2f91770595d9f1c5f77931e9c","impliedFormat":99},{"version":"e2b27cc682a1368bfe175961bac462ac908de1dfb49590eea5550fd5bf9a6f29","impliedFormat":99},{"version":"49b088cac71a031ab09cc6d68aaba7b57e373693c72ea56dbcca094493a543e3","impliedFormat":99},{"version":"e546f06410e5259e513d9c85f3ffad6074634c223dfedbcc6fcce144176303bd","impliedFormat":99},{"version":"c049f4fe2068d1f7954e4fed057623cb870969eaf5a71bc77b5a677bf5af3f24","impliedFormat":99},{"version":"76cf68162903a40eddf28199107e921b9c08c033eac1c07efd4dc979fd4884e2","impliedFormat":99},{"version":"41c111ea5e8946726775a71c224438a7a7009329d1b6119b1c8dae82e433f6dd","impliedFormat":99},{"version":"305af9c2a8c308a4f430c3f2b81d68119f4920ae5942c3109d1178d879a028ac","impliedFormat":99},{"version":"d0f0427311a816aed0f31eca5bed01d2c720ef0c104f8b6b62c86101556f716b","impliedFormat":99},{"version":"a5bd6ae20ff492c2ec9a0eed17d73cc2a722c09d12a8cdf321d74c40de279686","impliedFormat":99},{"version":"ac25bb824a57d31b55be466a44ebe002841d19291da64cd6ae7ce6525b7a7b04","impliedFormat":99},{"version":"1c51722bdcb3e6bdbfd301fbaf546638dcebae9e6a02716e21373343096851b9","impliedFormat":99},{"version":"49cb95b8f3503bf3bc2481d747603e5ef2d541466b96c4b349c2296def086882","impliedFormat":99},{"version":"cefd620019820a3980cd72b3e41af68a97e42e095026f50cf95e6304307cfe48","impliedFormat":99},{"version":"ed2be494a8b56779518444accb7e616f85dbcbb19043a5adfe2b2ce9d92b52dd","impliedFormat":99},{"version":"79fbdd164ed7ef0ee1d9bdb3f65ae228d6c66aa915a46154912164717a97b96c","impliedFormat":99},{"version":"c542323dc44c3c36a1576c347164ad2167b4fc8c13da9610c7cb866786637c18","impliedFormat":99},{"version":"55b13f885a41b6ae500f75d5c588d05f78bfdb471d9b04cce391aaa9a3f9f05b","impliedFormat":99},{"version":"4c62dee16a75c9b0ee2b7ad080a8778c8ed8392e5297c9e07f001148b59f5ca0","impliedFormat":99},{"version":"48eb9347a1f264669519d10aaa422de9a6053b41b3fe84911ea8898a942b922b","impliedFormat":99},{"version":"afc496c3b64cd9d58d63640845132e08e48e05a29ddf2f1aa23cd46bfac3a584","impliedFormat":99},{"version":"05c8ef07d5dfb84772cedee2faca46c8ca54d151c16871a6643ede5e208daf05","impliedFormat":99},{"version":"24ffd8a17ccccb3e56570ca53ddd02e772f0b6a4ad3c5616ae642a7e508b7cbb","impliedFormat":99},{"version":"fbd75ba9061b448f015dc71a9ea3891ea17d361e6106ac1356aee358420a8562","impliedFormat":99},{"version":"4ee579b9d37f6198fbc1d3eae2aacda3b7ec6ede001f455e6ce12aef07d5ec59","impliedFormat":99},{"version":"3d4a999e994018e2440e6dd37afecaa4154d616052df8a28e2f1a2259f19b81c","impliedFormat":99},{"version":"db1521b3a21573cf7a452af203effa3482cf0a5b8454e2af4a1f484306a64974","impliedFormat":99},{"version":"45c4a138c13303d5fcfbab589251b7869887f7eff622a2efb7925e2ed7797420","impliedFormat":99},{"version":"1b14568ba50dc5776828b4c6e1be1e7b3aaba855680eb3ac9b07c8a00414373d","impliedFormat":99},{"version":"34091b6bb864d275a0c9080bb1e72065a616d176d3eb00d0402326bf83e206ff","impliedFormat":99},{"version":"11b55793b4507c2cc763198427e11a0bd5e931aee36e265bbbf21632dbd4872a","impliedFormat":99},{"version":"e831709cb7f77e60ebdad8982c5751ba745a77573cda6f44f4ab8d4027ae88be","impliedFormat":99},{"version":"c0defffbf81eedd1d7e9f54b434866942c2ab6c5381f8cc6d5022dca5888d07f","impliedFormat":99},{"version":"e8b639c2a91e047787f660a9dd3895a2ce1200fcda7560841d5637f9583c8db2","impliedFormat":99},{"version":"767e0b38fc031fdf1ba7fa253f264912774e67d1d52ce4e852eae8c3985ba6f1","impliedFormat":99},{"version":"8d37af9291a8ac73663132c067ffb65e649254333a9dc86a1b22361fb88cf7fb","impliedFormat":99},{"version":"8cbcd14fda4ed21695f26c27018361772c9d5f754c702620f42436f0f542c1dc","impliedFormat":99},{"version":"90d4a3535371f8c168b88ab0da2562f754810e26455c95698e98b15f11da22b0","impliedFormat":99},{"version":"12df154d3dd79dc0a4b71fc1e3c5d5fbdbb6a5dfd99c68783020e56743fd4776","impliedFormat":99},{"version":"4f99756bda4a08559be8508b7e83a5be0a93dcaab68790310abc4fa09b93a849","impliedFormat":99},{"version":"2349b5b7d1a01add8c3f99286cefad821143f1df1aae0867cf813f02237a1728","impliedFormat":99},{"version":"09e449359562a9ccee76260902e48260ea75ece6e8d17abe9e7593d900a320eb","impliedFormat":99},{"version":"a6a33dc9ae9532283825868ee5af9118ebc26978ced995fcbfdf90ff7c5e2f0f","impliedFormat":99},{"version":"dd4de144ff9e9db9fd3dbca7e1fb7f639b39ef953f2b3c49240c7f2a9736fdc8","impliedFormat":99},{"version":"a0f9aae8392286dc83d0712328a0c066ff43594158ff67606b8f9c1aeb69a823","impliedFormat":99},{"version":"4c9dca53c43c6cde0627e9851dd56d958d6ae68562e2913cc3abd1ef73f9a00b","impliedFormat":99},{"version":"6914eb2bebd7fda4f9fe8db98ee09f5554a1ced9684847b3e27dbefbdb87b1dc","impliedFormat":99},{"version":"dd21f9d9947f9e4a773809cc37b0b094607afdc83cd0e79f2d97250c4501b6c7","impliedFormat":99},{"version":"2066f78e539fc3e9b9a756cddea61af372d9f35be7ffa9497c6704da56c9e61c","impliedFormat":99},{"version":"3d3fa0b2c95631d01e1291b98adf0423f2a74a87db32df8fe0c062b6db6eabff","impliedFormat":99},{"version":"bab5341c5fbc115a91a38bc1dd18a3b8f9e9f6601f898eed8bf6b56d2469b823","impliedFormat":99},{"version":"0d1fd7906b3767ccf874e84b76817b71c81836b02f9c5fae2daade6fc26f1b2b","impliedFormat":99},{"version":"828d97f23443ff54c85832f7fe1bd2aa204cc761193f2fdb95391c3af2eddb4d","impliedFormat":99},{"version":"47aa55962c8eb1bf8f46e84aacd04d89296bb9ca3a2978382cb81bc4f1c726c9","impliedFormat":99},{"version":"6df68fc4f79f293f1ab2d25951f191161ba0b13ab2c06b9f0dbba5513c5a0e1e","impliedFormat":99},{"version":"cb6bfbb5f55783ddb18adfce848dd24bcf85bb777bf77a0d71dd773cc7b62c22","impliedFormat":99},{"version":"286f368d27af276cb55d1130452b98b9956bd59d142a62b514ee6f1f98395271","impliedFormat":99},{"version":"b046da4f4d04ae2789837a9c1c32896d2d99256655b4377e1e47c0945288f9c1","impliedFormat":99},{"version":"0397b33949bba44c603a8919b1cec9428bbf84ee3c90819b080dfbc764e01724","impliedFormat":99},{"version":"7f971c8a26679b60b7765f1a9da29b987a93795909acea2896b2da567b2429bd","impliedFormat":99},{"version":"55db20deb5ce62732518b1fab73d5b3609113c027f58658c1f3104f8c9073e8d","impliedFormat":99},{"version":"279792abef7ddfc2566cf92e89447f0f2fbf3c5e1ce8e01a2325d6b56e513317","impliedFormat":99},{"version":"4d1276fa5da13705e9e23f77bf97aa8686c37670d3dbd6e85d5975387da6e9c4","impliedFormat":99},{"version":"4d43f7782e2ae2d5be0449e202e894dfdf0b5e8fcd8fea275b1b1795045ea3a7","impliedFormat":99},{"version":"4c7e9a01365d12cc787fa964cb28503b4bad69cc773e25f883ff53fcd049237e","impliedFormat":99},{"version":"791d109b55c4589a49c89729aa8df87d88ad546a322a4364ee3770a845f93a0c","impliedFormat":99},{"version":"ad2aadb0857cbc6b0a1177ec6b8944b734f5c6c9481baf77d7f3b2c0fcc5b2f0","impliedFormat":99},{"version":"319d7c7aabd2bacb683985cadfe402cf1ce13185241638ae98ef2467c111717f","impliedFormat":99},{"version":"1d8c74c5747df6706dece004ea4c537ed5080e95b90d1a1620bdaf46bb8d180b","impliedFormat":99},{"version":"2e0fbb883f847aa1bcb15d265757653f79d19fe679c2b84adc5b12a1b83371f6","impliedFormat":99},{"version":"e62d894e8ccc27d596235f8cc055ce0d27772eb13b310577ad7c2bc4e2f2b23c","impliedFormat":99},{"version":"bbb48c9b123ebf986aecbdc2085387b279b9db9822a99075135c164d4bc12c99","impliedFormat":99},{"version":"f46ed0abe3275015dac23dfc2f7c0d7aba8d7378f9dec9a0dea5f9565bd6f582","impliedFormat":99},{"version":"0dd3e4ae8e0f3470f2e5dc1fd95600e2f0753112d3a7e0f61225a81e8389a6c8","impliedFormat":99},{"version":"8fb8660a87df46177ea76db4338c4475b8b8e7e42e36bf124195489cb6fc9ae2","impliedFormat":99},{"version":"55f0aea7d8e5668fd2b74231106be4dd6c75563e8e794a76b8539c5320a3b41d","impliedFormat":99},{"version":"f42f470b9934ca024afac9c220e5c57b5b70de2383a821e3e7d58b5de29f6646","impliedFormat":99},{"version":"22f011193d780d619a9a4dc9fd0307bfc0c7869d496e371245d50b72a0e1d0fa","impliedFormat":99},{"version":"acbdb315c0433c6832fb64027dd421c1d193551e20b5da391cdb20c6b8f95dc8","impliedFormat":99},{"version":"d7ac7a29f5fc29b2b157fd2ab7738946597a29b5670c2290d4b81aada8fbf6bd","impliedFormat":99},{"version":"7f85382c44340cc8c380bfc3dd2e5c69c280308538044601788e2f1ae3e55a9a","impliedFormat":99},{"version":"7d7e9f13134199ed1b0cf6c8775a614c1bf4341ae74edade456500546ab2776d","impliedFormat":99},{"version":"f57d7c9fb29a389e44af09d54c57d9be1a130b80537af035334f9a8f2e55fa76","impliedFormat":99},{"version":"0f76779994fafbeee4d135c21fb87d35b81c6fa913ef85e5b6bccb3ffcbd57db","impliedFormat":99},{"version":"64c4f811d9ace920e8df2522f72905cdeafa7812166416efdd51a9350d361628","impliedFormat":99},{"version":"cdd9d75a5e91d288b1f009ed8d885e29dd61d04cd12fe66645a69e9364fc2fd8","impliedFormat":99},{"version":"c81859d7edd8ea8016c3ef669bde80a68a0a8e85440307d6c07c0e47e6e70a7d","impliedFormat":99},{"version":"a1d72f11de9816b4776ecadea48d9c2a8c486cd8b465b674647557653a151a0f","impliedFormat":99},{"version":"33b8b6eca734548828961d9ecc9c21f729f08bab8c2c9d95c9ce772db6431f94","impliedFormat":99},{"version":"1861836a3156845df6c43d92e7634515050e349eb569d5ee523e25a2ce6dbc55","impliedFormat":99},{"version":"4dade3290736a203b3e191085b91bc93c9a51dfe608211d314ce688a7d1915c7","impliedFormat":99},{"version":"558b4eb69385b53bb4f76dfb9944da2b324c97f4cc915f8a57ffe12adc08bfc2","impliedFormat":99},{"version":"57b6feaf806b2ba926d3000f59436460462d6b551397322dd983bca10cb82083","impliedFormat":99},{"version":"9a599074752221456c6ff3fab0a9e5e42318e610bb21a23c1364d12b0669d01d","impliedFormat":99},{"version":"17854000164e5e5ef1318f5f542b770d80b0374fa95ac023e01a91440d93de35","impliedFormat":99},{"version":"fcaf10eebf077d5a0e4be81424fcc296905533359c46ba1198c41e98e957d70a","impliedFormat":99},{"version":"71d9bf57ae0b6685fa69e800f44a0e040d1418f74737bb590d71374f02a14f5d","impliedFormat":99},{"version":"a3e8df36aeafd3a63629f85cf72f46be39de7f350af3cbc40bc7917f41b36861","impliedFormat":99},{"version":"86fbc8e6592abc2775bafd3c2b2eb5cfd0e37c4d57e0893523dea6d67c19f05f","impliedFormat":99},{"version":"14a976b28005d68fda91658eec498db736406afdd383a6a4e674ba2528815348","impliedFormat":99},{"version":"e6acc224ffaf9707ce0d3914ce46ed083c7b6469a0f195543fa7cf64b648d4fa","impliedFormat":99},{"version":"8ec434028fb805c17f244b68ccc992391ff8ec6ba0c4bed1d04e51741f344e90","impliedFormat":99},{"version":"e2a0a09c2e1fab39ea345ec351a93f93ce425d2c6234606e705b3a6c84b8b46c","impliedFormat":99},{"version":"e036c82ae9c6a656dc591ddd4f68f70377e6900e7e4042769d4cea7d215bca3f","impliedFormat":99},{"version":"248ec4811949f314a09307eae53df10b95aa35546a9e3dc6363a2916b02195c7","impliedFormat":99},{"version":"e435436a95eb581e852b35d6f5eaaa62be7a8bc6da288254ac3394c60511e5d0","impliedFormat":99},{"version":"5cc46f1e20556b157f798a8043e6447c88f118859810d55d9b845e245b17f2b9","impliedFormat":99},{"version":"20fa43bd305c2a0f27590ffb829d5897db5160044136e1c216239a8fb91cfc60","impliedFormat":99},{"version":"3c9a0663746013d1a7f2085ca9fd23d4a1d81831d105f55d83499643db339a6f","impliedFormat":99},{"version":"cbf9bfc5883bd84a49685342affdab376d54622d075c360c1e9ee0cb1a52176e","impliedFormat":99},{"version":"b67eedd415da9341688bfc4897f67951e6f6544130d339d631c578d9ce5179d4","impliedFormat":99},{"version":"74dfe23f35f7f780bc43517662cf6bf54e2340fba8c96499a9345f5c54310765","impliedFormat":99},{"version":"216e481f8b352b3381c3ca193245c9e70eb988f13b11c90560fce7f58046d9e4","impliedFormat":99},{"version":"442f979c95b63bc7545f20a9dbfacf969a8bf8d50f38ff5e8647883af962ea90","impliedFormat":99},{"version":"7ccf30591af329e39435375251583e00f458be6e9412ca78457fd618c3ed3219","impliedFormat":99},{"version":"0e4023053e2d67cb1875fd3fccb3d9719dd35aa7ed8dac2f8f0a6b83eac1c619","impliedFormat":99},{"version":"121d72cd64ce108c997080ae85d77526c0bf92cbabd595e85b22cc5b2eb5356d","impliedFormat":99},{"version":"2e58e0a3705c2c5e2f8990d9fe54a987140eb6b07d39969667fb5a61e0012164","impliedFormat":99},{"version":"0ac60f7dd28ae5fd26af8a26038bff0a0860f2a934bc3eff3508b9ea606100ee","impliedFormat":99},{"version":"23e86961cc70c48457a30b54d2a7cb321db04ec37a2ce709a558935874ef5980","impliedFormat":99},{"version":"813924ffc37d482abc63f7809402b6d04bf10ced84ceb0ce5b593f93000b0738","impliedFormat":99},{"version":"d39f8d34fef31f645d4a5036d21b6d76f1de2fcb002cd976c7efae530249d79d","impliedFormat":99},{"version":"3dde9915cefa4b06bdd06d0afacb2008400eee07fedb70cd4fe895be5d7c37a1","impliedFormat":99},{"version":"6fa7984697bbae60ab189ff7930691b20d214c1fb68ed6098cef5f616ac8d3d5","impliedFormat":99},{"version":"49cb62a7fa903a66787723065158a23455550d938649544b9afa0fddf13da5a4","impliedFormat":99},{"version":"8093af89ce523d6325f01b1502b431dea33dee468ea0b207f3ecb6b8e8c869fb","impliedFormat":99},{"version":"1fd777885f679efef7156857398a8e40a65f48f9d4b53b22188593e5d9a67f7d","impliedFormat":99},{"version":"381f82f83cfc6930ccbc008af3091f09a75242ae15d2e04632db7fc4e44c0080","impliedFormat":99},{"version":"fbca59f60b22cd0db89922e7f057c713b027aaa1e2c2818632fea718f8200632","impliedFormat":99},{"version":"1bd895f3a629b01cf0ce259e989e8091ef945cb39e29bc4f5dbb35ab66718b91","impliedFormat":99},{"version":"ba8d03eb92363477a46ccd739f48b8a87432bc39a4e0ccadb1bf336c290b103a","impliedFormat":99},{"version":"6ec0dc970053f2d727d22210393569ebedb4ec3a53c0a5e4ac0cbfa179814ef3","impliedFormat":99},{"version":"4220374c20d714335b11a60a1b0392dcf3c0ac82f0773466b731c3ff758a1fa0","impliedFormat":99},{"version":"ddbd6bec7bf000be900df2f6ad03461580cb94c02a2b237d601f091c7f749ee7","impliedFormat":99},{"version":"a4e2ebf51e2314ddbd330380d53527e3acbae6d1fb4919c35f6e6ec534eeca88","impliedFormat":99},{"version":"8aadedc389b7ce3087eb1ef11b85a79ab2b15a418ca0d469159091f33359096a","impliedFormat":99},{"version":"351223dcd7cc1c134826feb03e21e9d40d39497e4641f6640b5b5f118c731cc4","impliedFormat":99},{"version":"3b112575da3840ac278f8edb8898acb94b9c79df94b041b4eb17e3fe1263a643","impliedFormat":99},{"version":"902151bc4db55dd270dc9f38cba4f06c2d5fae54c519677cc3e1197335c58581","impliedFormat":99},{"version":"0b82763f479497a1517786b27d8826d3640d15af245804d322eff12710c5a652","impliedFormat":99},{"version":"c1109b59c4c5033695016057e596c8d34abf048a3e2c1b28169c21b22cba56b3","impliedFormat":99},{"version":"8a35fefe86f688f467c8bef9bf7b465e9be8e5b3476504096076e535127ae3c9","impliedFormat":99},{"version":"00040c315b5da891b7368217aa2d92cc5333f92ea0272ef70806aa5a16d642f1","impliedFormat":99},{"version":"d32d0644afaa7ab25fab4ba7f0c30e194cf211463a9100bf406c24f67573babe","impliedFormat":99},{"version":"9fac0a75a13381632fc5bd29ba84c5f6706c11c447adf8f6628a9ca519c2914c","impliedFormat":99},{"version":"986204e16e3297bca5e64b327e52f9fc4c65bc34497227f63b1a48bfcb333dec","impliedFormat":99},{"version":"824b4ef28c193ed47adf80450a0b8738313561707fe300eebac14ea2405eeb04","impliedFormat":99},{"version":"b634c2e561e3bf8efbf1b79060a9bd5b26022a71574900c3e124a14bb4c4c71a","impliedFormat":99},{"version":"76b8eeff48c0605828e2037ed6bf67d25675860a2f6a8fa1848d3930c2ae871f","impliedFormat":99},{"version":"d7ffc3f3fb6c878d49a92e0e90b737cb09642f7044d6ce3bf53f5698580d8066","impliedFormat":99},{"version":"5ffc2c7cc0be96e71688f7a0062f2e85c6e68b21e605d073a5a6c6a1f3a2a5fe","impliedFormat":99},{"version":"8eae28b0fd19d123cc1b99840528bb1cdf76ba7f0b15034da949d73aacb9702f","impliedFormat":99},{"version":"9b4cc49d65c87c5c38ac19676dc14aa914b13b66ab2f8c93c53a65272e0486a6","impliedFormat":99},{"version":"21c521798aeb2a82dac296829f7450a791b6f154b8a8208f77c0f7370d5f34a4","impliedFormat":99},{"version":"a383c2d014291b0810ebc39adec74792c53ac0fdbd1ec39c87779a8d07e7ec9c","impliedFormat":99},{"version":"635d4c2bbb40d953dac16ebcf52b123b4bc86e58bf6564d0dec062a4c489ee21","impliedFormat":99},{"version":"eb420edce35fac3ff390bbb9d2d98325db9c11a2cd60e0cbdfc1b118b62cf1df","impliedFormat":99},{"version":"f4d93034f0661b40ba9cf90d7d3474d5c0be65fb7f4f3a1d5e9c34210aadb6aa","impliedFormat":99},{"version":"1ebee1d844f9cfa95e5315d90140f87eb1519c8739e7a51111142d3838ce31c4","impliedFormat":99},{"version":"4f8e5dda56f05c96d1f567bb96f32e81039d21ac9af5b4d5fec500f090f21388","impliedFormat":99},{"version":"6f74bde7fdc1ca03aafef483d4f1b0ca50489094b0ce52ce5741c71635494d8c","impliedFormat":99},{"version":"189a993d40cf154596f0becfce65d93b0e3d8c62a1852b9506d86d68b3702d88","impliedFormat":99},{"version":"c1d358eb44c209b7b5ad87abd6d889e28513718dabb6802de8844e517a89730f","impliedFormat":99},{"version":"dfce10bb8fb7c37e9625e889e27519567aa36329ef0b42094dfeac141dd45793","impliedFormat":99},{"version":"dae38b8a375a2e3f8820861c302e675fdeb6981276fab61ad1668c7596e7deab","impliedFormat":99},{"version":"4967ae99536846dd5ac9f3af41ad296b9c36d611a52d7b00ad686304bd23d71d","impliedFormat":99},{"version":"e053193d1742f8702be0bdfa544ad435927557f7ffe67a23ef92b176e60a7657","impliedFormat":99},{"version":"4f1c51f422685db98ead37cf10e723379d21cf990db0d6fb8000b48ea6c254ec","impliedFormat":99},{"version":"951543da1d33a4ed5c53714a1f4ec35b51f8a1c61107649c5ba6d9a1d2146103","impliedFormat":99},{"version":"d763c971f8591a21a1f01c101ee8a769e52e412fe7b1a455a9ea71dc88a758c4","impliedFormat":99},{"version":"b4d7cd9d4092923da05ed18680138dfc72f236181f5618553d75e0ab06f67964","impliedFormat":99},{"version":"2784337e4229d64fcfceb6c4ffebec4d7fee7ac312a316f8eac1a4f760ae20b3","impliedFormat":99},{"version":"63db0b6285f515f8ae6397e307d3b26a56a5249fd80bdf7569ab4b87aa87ca55","impliedFormat":99},{"version":"7ba72b7633d2d2e507f07a59027e24505577797753965b575416ce8e89a04270","impliedFormat":99},{"version":"1762e04cb04fc69364160a0e3d121c63b85945f842575f5e3abc0392acbdaf81","impliedFormat":99},{"version":"b96cdad7e7b0fd253213617c6f76f79444e6c151415584d9195266a9203b4206","impliedFormat":99},{"version":"71663fef9e157f5257a31408ef5aa7fb4774f245de27cd9c618d4f45db01f19a","impliedFormat":99},{"version":"ff8a53256414952562c88aba30a7a2492b86575686c997815b307b1f10bdf784","impliedFormat":99},{"version":"279b59c01e2739e252d3609d4408cd1e67ab977df56f9547923496681f600450","impliedFormat":99},{"version":"d50c4d520094e034e1cf9f4ca262a856b53c67dda3a1959057278317206e5f86","impliedFormat":99},{"version":"39637b145df70dc01000bcffbce1990f85327b9e429d5d0be455e7e1efb235a4","impliedFormat":99},{"version":"afe91c616fc7ef7f8e212efb62c66d8ddefd1b8de2582997f98ac57a4d0a7655","impliedFormat":99},{"version":"7326c8eb2ed751b126ca6b25e9d8e9db67556cb40d5ea485afd7518db9657ba3","impliedFormat":99},{"version":"6ff130b441bf073004bb7fdbf5513fa7bededeb5ee9add10e0e395738eb5f4f7","impliedFormat":99},{"version":"272e5e5ad2298abd3852b0f5bf896ee1284a60bbd9e4e45c961d66fdaf309655","impliedFormat":99},{"version":"02ba9c57dfa46d5673abe376a9c35d03f3f4100b4d9c5f9355e0a62bfe8c16cd","impliedFormat":99},{"version":"35a603a9a038aa340a6cfe26b59a9ec2d984da2c5e63a3c46c40113db6635ed5","impliedFormat":99},{"version":"670c15b05a76b37a6ccc1d2e381c7a1780d1288b50751a037c3809c7d4d433f0","impliedFormat":99},{"version":"fdf5d761568f1bb4a318f8ec9f33e99d1f6fe3d7d1a1f573605f29a03b4bc002","impliedFormat":99},{"version":"ae8bef1c3edc4eceaae9df6bf6a046c52bc4838d2344e2bcfd55b84a5c4714c7","impliedFormat":99},{"version":"358b82dd6de9956c92e1f6aaedc4432bde6a8cf4a9b2cc18e6cff0ba2787cb20","impliedFormat":99},{"version":"15811478ecd27a7b1369df74b7135e8ad8a8352c35dbb13035cd5ab2352fa0a7","impliedFormat":99},{"version":"c0ce7088c30ff91f0ff8d514b7f8dcace90b65c554b8a3027cf864f558c4cd80","impliedFormat":99},{"version":"4b49f46b98cf981e1d9f0e75056c458f0c242ee7661f1da3e6cd8eba7b599bcc","impliedFormat":99},{"version":"d7033cf81e6636c20362085d87152a2478c2529db0fcc1eb3b1c0ef152caa132","impliedFormat":99},{"version":"95417c140dd26defda52f7a4bc43500a0915d931308c85866136f829d7d8c88a","impliedFormat":99},{"version":"c2668c0b8cb8bde3d7e6901aa6eba98963785e887668eebe974e8df49a44cdc5","impliedFormat":99},{"version":"bf028ae34f02d5604c337ad4fcc8541ce14e977c3bcb3e7f43bc396af5721494","impliedFormat":99},{"version":"fa1ef591870037b5eb045e5d01902f9015ac8553622a8c18dce178cda3f981a3","impliedFormat":99},{"version":"8a14c1e4557c91f4ca586e0762f423f699e6b97ee5916f548c68966624ed0a0d","impliedFormat":99},{"version":"ebf000b79f4b3d3f8fe4c1d1dee01b12bb82262750598e382444c2f4c6cb6e13","impliedFormat":99},{"version":"df0211c66f5be54737f0d9f4f9b60261365caa812962343f8d4af61c62ffce56","impliedFormat":99},{"version":"2e6b186c28e363aa0f3144864f74bb0bbcad508f91e4f2dd7b652aa32abed04d","impliedFormat":99},{"version":"0593c7918b3a884cbaae040e5c53c8534d0b7cb2dfbeb923a3b6af15cf597690","impliedFormat":99},{"version":"103d7201704781b7503ddeaf536ae71aaf9005d861e9f9f00ba2d5b7c9131946","impliedFormat":99},{"version":"6d39e1758a21b9b1f7a33aa4068bd2fcf9d83f202be716bf03891f04cd11e607","impliedFormat":99},{"version":"4661c14dd9c9cea4b7ec3577adba9b05c554732cd21e51a9a8d67d55cd923035","impliedFormat":99},{"version":"cb7d54e8e4fb0979f0a528e1a40ee833ecf3f2b40cf9db8df5987576359c9a89","impliedFormat":99},{"version":"b3803db7a72c9399c5285a136497140d15618995742f06081d9c2eb52c607b68","impliedFormat":99},{"version":"2a01ae25af7e6725d8d5489fa2aac7e2c521ad4c072fb58f1c6e3bbddf4d913f","impliedFormat":99},{"version":"720a99ab213d49587ddb67dd0cfe541b0cc1b5f6e53ee916b75319bfec2f3ebd","impliedFormat":99},{"version":"81e828965aa9c2efa7403a7a4a533c51e22b618912a03d035a042eb82d1313f8","impliedFormat":99},{"version":"168489d5da3a1925ee759c4ad8d031581cf887a2d305602b4a658cc23ae44106","impliedFormat":99},{"version":"6be5fca571daf55f2f6f44aa9b1497ebacbf3e03e6708e51733a6d84575754e9","impliedFormat":99},{"version":"a623e124420520aaf6077ebf64567f3bee65a6dc3773a1332f0ed513f7f49ce0","impliedFormat":99},{"version":"4d75c7f4eb68d365da1731fa1fa0170895aac801cf21a292dd0503763994f3b7","impliedFormat":99},{"version":"06fe4e250c71760eae5020c88f85742299af8f53530ad9ab937469d5cccd7255","impliedFormat":99},{"version":"0adabfced9aa978628b37783f1e59aa42249a0b7b3fa7b09312c7b866fa3328a","impliedFormat":99},{"version":"7f2cdc3709d66f6004bd77cf9359b467811dd37cb22c00c8af408ab74375769d","impliedFormat":99},{"version":"adbfbc12814060b647c81470c08f3420d89fc93dd1c45c422a10561e3bb6f13c","impliedFormat":99},{"version":"5f1614f54f178ef74d4b33e5871b7a7dec7d330e5d94b28321dd9d32546dae05","impliedFormat":99},{"version":"9f741273f89ff4d1ca8586715c40eeaeb7784d30a9c8324a1dfd39a06371be97","impliedFormat":99},{"version":"9885942ed0ad172b90b45bb4af647ff107a867529534e991f0a112d900d0f215","impliedFormat":99},{"version":"0c262fca6a1199175283b61213d6c6b0646de8584ba0602722eb95b9ad9dfd1b","impliedFormat":99},{"version":"39c1c529a708d276e7f9009b6620063290c18e4c916fc3093d308f32317208d3","impliedFormat":99},{"version":"f2b5e36f2402b53b809e2f64b8e020c6a7637ebce13b95fdac9c26e1a14d7b74","impliedFormat":99},{"version":"8680096ad4dea123f9c49cb0a5deb1fe7a625c93f1a50c4516610925749c03c7","impliedFormat":99},{"version":"0f619545bd7f204050fbe17ab02fd6133ff926467eceda17b430eff646d72ffe","impliedFormat":99},{"version":"923fa583f765c8c013082e64f937b199f980b1b15c40bc3f583b95530e7d2d33","impliedFormat":99},{"version":"505e2b29b7aff97d5cfa06b644a73af595cbb2ad62514705354111eb4a9d25d4","impliedFormat":99},{"version":"0626be91af9b502263c02d30f54462d3b3d441a317caa2fe6c690ab8bae67897","impliedFormat":99},{"version":"0282f7c04ffba8d50df82954017daa8a653cc71c2fd37ccbb87c64105176ce32","impliedFormat":99},{"version":"32d95fa1add10335cf6d98c640a47ebdae0e542b4b2d8c0a302455933810ff54","impliedFormat":99},{"version":"18da6199a28384e4287fbd4035fb4e3602a144975228b436c40371b3a31fd0a3","impliedFormat":99},{"version":"22ff98edd221e6aed5bc9ef9f6a1f090ecb34a1cc465e5b2f7c6b71789238447","impliedFormat":99},{"version":"bcf15f71abb2654e027aa15e6cc2c6b1a56e2a015a4bda6b1215b780b9cce61e","impliedFormat":99},{"version":"b390b5480af1df51fbb3b9bf2140ca51fb96cd6b577ab53de8afe932c1029951","impliedFormat":99},{"version":"449439716e67042af43d9c9290ed4c49bc46854b77273874f7e7f4860b52bdd2","impliedFormat":99},{"version":"a3eeb212864f2cbe7a7e7946425365b0b1bfa25f93e975f622d760738f72cf5d","impliedFormat":99},{"version":"326be804404a38c9b39ef236e45fc4822c4287a337b5d4d2162b7e5577489ee3","impliedFormat":99},{"version":"46d6be7f5084b138f83944e3550fa72591935fed3679ffff9447e2c4c64c5d82","impliedFormat":99},{"version":"b1a7f35702d8f723354d2d69d8f778ef8ceab7f690ddc7fc7ddeea2524c5075b","impliedFormat":99},{"version":"770e7572cfd883ddb4d296572cc49e4183a9299fbdddadaa3f15d9e1643154a5","impliedFormat":99},{"version":"0a0f7ac30acd0ee10988b7fca9c3829610f98b53f83b7e5c7ade6572fd4e4849","impliedFormat":99},{"version":"153bfb6e514f8d63ad14385ebea4a499d36c0385ee58dae66f9dac2337291d2f","impliedFormat":99},{"version":"5d7fb9ed27493c65389f521ca859506d10a6b7e6bbcbdfffb84ae993918037da","impliedFormat":99},{"version":"5bb4df6cdd57a24e32fbd69fb6adf79c3dcbbc4b802a8f3d893a5aca37d3004e","impliedFormat":99},{"version":"21fa1d6be54130de54330ff4c1437ee0baa70d8dcfff4d1c4a85e558875a8c89","impliedFormat":99},{"version":"46439b4d9e8742c3de2c32b1ef4962af91612d83db8a2d77733a21883cb6d976","impliedFormat":99},{"version":"2813b5d86a9e0a9986104fdf4a2a37cbe868a6e17c5e6e3a1abcdcbe1cfc93b8","impliedFormat":99},{"version":"d9450d1102d1179b0faf3baab898c89596c1078885278f94a1aadc4f70049312","impliedFormat":99},{"version":"0f76b54c6dce2b5f193c87e6caa0cd7289ac10781ae342ee6bb7af0ce36cc32a","impliedFormat":99},{"version":"2867f05c20a2225b4c1c8ffb1b5240d30064527fb7a5b1750bd41a89d6c4c8d7","impliedFormat":99},{"version":"1fc856f4fc93907ee59c01efd8edc6b5d49043e3766cec4bea5fa2c2f2f4edaa","impliedFormat":99},{"version":"b864f5118eb5e45345fbd0656be02c88fdb5358c589ad6b5c66ec19f4f0e71a8","impliedFormat":99},{"version":"aac54061ec7558135b4f676212c89b82c969b069342a42f1d5ba6d30f743cb6e","impliedFormat":99},{"version":"d84163e6c4bab8b697bf1c8b0c0908f404df2384b47da63914679f90c0a56bb9","impliedFormat":99},{"version":"ef519ebcf62f2c37cd54485272e42e21bb966b2c203b3565fd265ffee1054a7a","impliedFormat":99},{"version":"fcd2b3eb9f11f2bae710fa4d7a596dadbf1a465b8585f05db63a28d93079b838","impliedFormat":99},{"version":"1d8ab77f40c29a333fbba3585751b384005ced7d895d2c947f146a95413e9951","impliedFormat":99},{"version":"809337f529d322c198398ab84513d7b4dafedeab24179221b6b2f1dbf0f05065","impliedFormat":99},{"version":"60548d44220d4767d7ab2ad9461d664d9aa71afc9e44e03056ad380ddeaa1d66","impliedFormat":99},{"version":"2187909b7da18743b0dacba6e2390825cd20362ff44068e0d47427a607eb22ab","impliedFormat":99},{"version":"962cfde9b7e05989a758aec98703ed75159c40e212df5cec74381eaff82aba98","impliedFormat":99},{"version":"72ffd8535e8e7025b7969c8461c2cc456d23ff175103df046b4fc55a61a38211","impliedFormat":99},{"version":"c890c291338418ad77c86cdce322a8f750bd9b4cd9a456b6363da72549a7a94c","impliedFormat":99},{"version":"df2768213ab37da8fc9ee6cc9f24f4a32c62e874d28625277b6b12f944d4382a","impliedFormat":99},{"version":"effcca1c88335a4448160c1dc7bfe98663f38a67796ee11a04d7bf9c568c8373","impliedFormat":99},{"version":"cde28c7dfb93f6c7f8afb49e6d3a8f8bb577803c7eaa2ab4f02a722d1453086f","impliedFormat":99},{"version":"b05aee7d890773c66fe01f130ee432755c5e0b0e9857e87deac88beea7a57577","impliedFormat":99},{"version":"071091ebb5656ceaca89be5827e45d3367dd7e5f2b51589f5cee241116f33028","impliedFormat":99},{"version":"6324f22adfec34e153717b6d0f416464b8bed2086a7f301fb187cce198e582bc","impliedFormat":99},{"version":"882daca29017e753f72dc0ed60ced6c7ef8c9455bb865f95ce6728e8a7b405d9","impliedFormat":99},{"version":"85cc6f0801e8718042f3116924db65682fc16ef48165136fe136f39d42cf097e","impliedFormat":99},{"version":"61a82094c65a52eff9ff1986c6082e361b0485bfc9eef3c44341f26fe53d1453","impliedFormat":99},{"version":"3b03dfcac351c5c9e0362f081676d3adde495b3d07a8a29f4642bc261091898f","impliedFormat":99},{"version":"909ac7b41961cd1fef0ac5d31d2765c72cc82b4de3a184154b48bc0247edcdc9","impliedFormat":99},{"version":"20fec64d6a21097265323e83c04be9b68e07c26624ba30f05ce53de89fb01571","impliedFormat":99},{"version":"a6d376714411e99706294f4288fa3310d14aa3e211040580102c99fe8c87262d","impliedFormat":99},{"version":"2646752b05b717bd2900551d822735156de24591a2ac17d2ecbf713b5b13f90f","impliedFormat":99},{"version":"ac0ebd6f1cd412a64edaefafc74d7dfb6ce12d03ed88850025622c3e2fa2821d","impliedFormat":99},{"version":"fab8951025c1480a7956466501e4547fa69afacd8a86b6079e1d1a7bfe7c43d5","impliedFormat":99},{"version":"ddd2c8020e0d3e479bd12e739744dd4eddfd512706ee6fc8b0d65b58e234af38","impliedFormat":99},{"version":"027d9c5e810e507c637cb8022c9d44445bd5e3a3c84c5cf55bb2fe67d3bcfa23","impliedFormat":99},{"version":"3679e5a37ccea0b56e73b6d42a36ddbca0a6fcc4119dcb34e652b0e2cb7189c0","impliedFormat":99},{"version":"9e4b60c3965c575a33156eeed8b5f8d5de378793aa1b976189aab25e6ab48ec5","impliedFormat":99},{"version":"73ed3cefe0c0aeb059cf27bafb51e843918087c843ff457a871ed3a074c9aa5a","impliedFormat":99},{"version":"d35344448dcd8a37ee1e2a467f8e9d26c388b712ee3d24a3aa4900585b5545dd","impliedFormat":99},{"version":"3ef76317f676e81cb18eab1fb7e6a1ac60015a57fd679430ed8d1257a911ff89","impliedFormat":99},{"version":"45eee0eb80e0b7604390ddc34fe455d0fc04603d9e4829549272f48c8942c7b9","impliedFormat":99},{"version":"fabe29b682338fa7914d62f21609e4dcbaee9f93ef91adf6db64de244e8140f9","impliedFormat":99},{"version":"bdf0099507aaae26031e61ece1c443799bd090bc99c6e42baad4cf7e9611afea","impliedFormat":99},{"version":"f24ce130c62b7f407a3cea55bd46eb78282ae1e03a5a980a7bf73628e3a25dea","impliedFormat":99},{"version":"cd6e7a1b92dbfdeb233611cb452d8eed24b949cb029f97bef483a5fa3fc7298f","impliedFormat":99},{"version":"09edc5752759a8d4d1fafcbaaa9fad6bc6f1b3ce1a422262ffbd0644f8cf5f30","impliedFormat":99},{"version":"3cd21ebde7071845559b76ee05ad428c5325f788c1fe22e9de4d81e77631fac1","impliedFormat":99},{"version":"542ae7a098c4b7d9ee35b2ded57786de1210bb12845b23605221030b17e04f55","impliedFormat":99},{"version":"8401ff0d8b9f30a8a341ec7269f234d7152177d6a4131e0600e7bdf489233917","impliedFormat":99},{"version":"66a26a0d221fe38994b72cbae8515a91afd5928e40d2f64107ce6bb8fc81375b","impliedFormat":99},{"version":"50594b654ca71c8e7c09bbf175cd34d5efdab5ac423fcb19fd8288456c0eaddc","impliedFormat":99},{"version":"c18cb17ebe4e2417dd2a31a2a4979cfcc72338fde7c9f32768023139c41ee521","impliedFormat":99},{"version":"28d23dbc2c8d8dd21e9b397ae08f5109cbab3a0599df0248190b0cb396c5990e","impliedFormat":99},{"version":"fedffc2d00ff968dc10e3e076f5cdbc5d7ba1e8bda6158bf0ab4286711e1ac27","impliedFormat":99},{"version":"93212dfc3cd9457c7ebde8ed4500164a895d15b55c9f10aa4ac46ffb455c2499","impliedFormat":99},{"version":"f0ab96c940eb748ddfb6f3b1442393759257e624d92034ca6e9698b41a06b2b7","impliedFormat":99},{"version":"823f37edf2f78ed8fd17a59f0837ffefc4b53cc7a0560bcee95bc58626fb9b6b","impliedFormat":99},{"version":"f6439fe717e31e5d222d7e91c5c1082d280f9bf9209474fd7542c4da31b69d7f","impliedFormat":99},{"version":"49126f1c0cd14332be63c13677cbd1543c09362488732b7cd926c8be1fa5a5b3","impliedFormat":99},{"version":"17fd67f8069c954e24fb5ef02e4c97fb2c7b8e5368982ef018232ed2b16b9e9f","impliedFormat":99},{"version":"45be37950ed5f5d4e489a93c3a278811e6685f423d552c33f1518df9c339b5b6","impliedFormat":99},{"version":"0b8f5565dbf8ac71e1f0e36cdf6af9d5e595bac817b1cb49029a387f77a97f35","impliedFormat":99},{"version":"1abd78da038403165528314141ebc823a6adf229febe585828be06e2888b8b52","impliedFormat":99},{"version":"4b068760205754ede438631a83b74443ca9221c47fb5c1026e488a6ff7154dc3","impliedFormat":99},{"version":"10e52fe23fd22927554a0f6637c2f3814aa50f4b449837e84d7c3849c5ace8bc","impliedFormat":99},{"version":"9a695b27f81d8dcf4f4c1ace9362bbf86da55a561333ec22b028567cb77ad167","impliedFormat":99},{"version":"69fa3b563bb3060113c7d4962a0da9fc7d0c1981c1781bfbd776d06761ba7afa","impliedFormat":99},{"version":"45adca51ef386ec97e2b6adeb30bb5bdde8fcacc9b4e6bd7d36b293acb3f0037","impliedFormat":99},{"version":"edfbb6fe54cdaa69a492cc37a4ba702f9352324cda30260ba2dbacc1bc60bf49","impliedFormat":99},{"version":"1648015d9dca4246be02ed5099672f2fc3d2e1f96c4bf38cf312d52a9a36f821","impliedFormat":99},{"version":"f018e038cb0609449172a9ad1130578c92e65939b70374c0847681ce9eea5a53","impliedFormat":99},{"version":"63ed53d5a157ed6749e873d0a4dca4338b86aefc123a605924e4ecc31fc7d3e0","impliedFormat":99},{"version":"602490794c1c63022ff8f03a43b9e3c9464df0e23b2cbfb9a917fc94f4e1239a","impliedFormat":99},{"version":"790d855ffaab4826fab11919a2424117f1df2263cea00515db5d9da27c712f4a","impliedFormat":99},{"version":"b16a21c46be0065ba851366ed933110e7fcc047cd619859cee6fe6043f57eb5b","impliedFormat":99},{"version":"973bd4ce6836a2b7be4281e63be46a02c73c7cfe0f739ec66fba5f64fee42172","impliedFormat":99},{"version":"c95df61205ddee55c0f36488d45eb36923536d1ee7fd2c123765920d0170b903","impliedFormat":99},{"version":"921bc19e17c9b55643dd6bd629c1821a17b9113ed445720c10fe375513aee2de","impliedFormat":99},{"version":"2a596c7487235cc254faeab8d49e084d61d53ca89e00f86da42a5eac0e702cc5","impliedFormat":99},{"version":"063ca493742dae520916addb5eca31c3e0bf6c58cd0f10f5ed8da071d8cc3e58","impliedFormat":99},{"version":"de562ae720d5251cdb274522070f5f5f89a4ce3862043eed99d9456e63a212d4","impliedFormat":99},{"version":"8bc9b778acf6bf5388bea5499cd5b0f4bd7d4c8ed85928dcab7e77038b1edef5","impliedFormat":99},{"version":"17f91aa1a354b537cf970a819537ce1e7a2b2dafca7d4b1b4d0894995c804b2a","impliedFormat":99},{"version":"048f232a281458a0159f024678c5c8651274885d45f86b0b21ca75f5b5ee6c53","impliedFormat":99},{"version":"1bceba42b5425ed2aa158afe916e36e88ee0de33e2f98b390247cfe045061f12","impliedFormat":99},{"version":"e32e2962a30e289b4da7cdc87eb2a79d0102b9abeb37b302b433554faa32721f","impliedFormat":99},{"version":"dfbf0fe6cdc27050ac69f83fe64bfb387dc40cc653a0b559f3ba5185e1e78472","impliedFormat":99},{"version":"f7bcd657a6dafb80e582d43f4bdd33a83b58376734faa9e20cfa9b6030c7a2d9","impliedFormat":99},{"version":"25357858ef183078a99a52e14622266027cd95e2f8a81fd280d539aed447eac6","impliedFormat":99},{"version":"e3b6ecd2f0ec008a7c2f8471bef625c49277dca2a6173a8cffaf920b2b1bf9a0","impliedFormat":99},{"version":"d446c4afecf40dfb4ba6b32a7ed85b5767c145e1e223d17d11fb6a8df9919d30","impliedFormat":99},{"version":"a2c036eefd32f7c0634e1f8615c4b485341d4f1f6fdca5040e62f943972013d9","impliedFormat":99},{"version":"5f3e074edd23169f519bb36e6acaf261a3a5c33af12a8a7e2794b68255bff5e5","impliedFormat":99},{"version":"fc11706b5365ebd58c9434fd9529a100a3d24165e4b04488608b5d55a77d6472","impliedFormat":99},{"version":"909469ed8952f1951373d3294706b50e94d25389326856fd7591557a88ded44b","impliedFormat":99},{"version":"28c160c147c1227df8f46faf50c70dd8ddf0870604250af9eec7f52302b9acf2","impliedFormat":99},{"version":"27a08c3aabe4b415d824042ad958ad9d3d0160c4d8ee43aa8e4a1aece2b921a9","impliedFormat":99},{"version":"4a802c8b0235155d9e45dcaa4d37e46e0eaaab68ef94eeffda6267963267a272","impliedFormat":99},{"version":"5aa4a3727ffa52d1a593b24d6f6e0fd5d3ce859d8ed9bf2367203343f79c0f26","impliedFormat":99},{"version":"964d27f5310297b03bf276d28ba974f3b7c972b532421108378a00cb97fbfe5d","impliedFormat":99},{"version":"315c0551400e653c864fd689e86cd344e9d39de0e1dec74e73b21c6d3602c775","impliedFormat":99},{"version":"5a9636f37a8cfd40dbd97ba1b222f59f085137d574bb90047e77ee853578bda4","impliedFormat":99},{"version":"8b21ec05d818baeb23822106dc371592d197782c61ad6c867bd00482420dee3a","impliedFormat":99},{"version":"3b515b15b0dfe6f511f280d2a66e6f5ec4518d4bbe43699ddd2ae5803ffc2644","impliedFormat":99},{"version":"5cee626e1c97f9c9f634a90e71286bbd32bc84d4391e06286ef7161dce6f8d74","impliedFormat":99},{"version":"77d5d4fa63a5492d5eb299f89ff6440eed60228e4ae45e4675491f1117f95634","impliedFormat":99},{"version":"9caca9e0d06aa45891b2cefe548acf95759cce8be9ba6288d3473ad9a79cfa9f","impliedFormat":99},{"version":"1601c9e2d2fbc602e8ea3cb856609e5dec0eba0f0b4a4190bd1aca8d7e48fd60","impliedFormat":99},{"version":"874f6ab7330b8e05a42d56afd3f77c1758c2d1027e3dbc607956412d503517e0","impliedFormat":99},{"version":"bbc8bbb97a2d014f591b7ef7f12ebf08f8efbdaff154339b89917e20ce586381","impliedFormat":99},{"version":"9ddf9e6cf065d0114a2e03ad2f24db6e2a0b7e0495fb830189fc2b5ef45943d3","impliedFormat":99},{"version":"34392d1d35edd9eefd7aed8c7300e7bd79a486f93a536c641d6369d9de4b7845","impliedFormat":99},{"version":"6ed5d4d4bf431b0b5f10140a0f9e5c91385edca2cf0ba86d6666d966b327bc93","impliedFormat":99},{"version":"e53d7929979440f295425147feebb4fd29ca12b76fa8eededb805974327afacc","impliedFormat":99},{"version":"6ea1298ca33b3ddea4e9fcdb064e1e6d9b3914a243a016b5450ac9fffecaea4f","impliedFormat":99},{"version":"0a613e62ad948843eda4f5becaf2ab18f6edcfd1de024355c74dc28a08a5a101","impliedFormat":99},{"version":"6c21383843396d5d6d1e9fdb594b7f27b1960eaef2e6111d25819b906307eaa3","impliedFormat":99},{"version":"1c0f7aeb0da8e115b03abf334d85d6a3cae1c5f10fa294d6cec1e68109bd9aaf","impliedFormat":99},{"version":"2ad7bd84e41f4ce032f286215e8c9ef109d0c56940423797ab899a69a55dd002","impliedFormat":99},{"version":"aa38b4ba91620fceb0b7c8052a5ca30c5edbb6369ca6953076f394008391a0d6","impliedFormat":99},{"version":"8c9828ec8c751df4156fcc16f2ca81c496563b63439fab6c930dc0a6bcbf01bc","impliedFormat":99},{"version":"398667a797fbed20361065e368e68f5338e88095338c7ef350ab43b52d82cce6","impliedFormat":99},{"version":"06671d26d8a24d55257e7ab611d40db8cdf9da156d53141c13eddf8d22292b67","impliedFormat":99},{"version":"62acc211029559045b264cd8e14413f3bb6c3d197d73ca9919f28def1c0bfaea","impliedFormat":99},{"version":"49ba58fc3f7ea72d435a44695e789d55e9d3b75688a6a5c94da5b65311e965a1","impliedFormat":99},{"version":"56df491b603cb98cc0feee1786f0ccc67cd7044cbaeba753e4a06be0a3dbcf15","impliedFormat":99},{"version":"e789c4c4f3767a04d475ff841044794cab5cce1b464beec3c4764d27c6336ef3","impliedFormat":99},{"version":"c3bf0b45bee7f76574762527d9e8d2b5ccd6b71bc924a4959f566a0e080cc718","impliedFormat":99},{"version":"17730b23f90142bc9bbba78a8ae3e810424683d70fe6868430172bde298cac7f","impliedFormat":99},{"version":"36b0961fdd22011c8b57ad05992a5e786c10a0f7247226df011c9250dfd7dcac","impliedFormat":99},{"version":"012519723b27b0b7d34316bbaefc82b2bbc7b5f09b29f9420b25e7f7f98e330a","impliedFormat":99},{"version":"26b153c6fd0a13b446ddb463c54b8b89391d66e99a883e0d0a5b2a3bdfd4b4cd","impliedFormat":99},{"version":"cf8e9163683d25c0653dd6383d1cb61527ffc680341cd70f2ef82428d174cdf2","impliedFormat":99},{"version":"6eedd556ff92351a9c0837b704da3249fcaa65b249c360f02537e2468cabfd94","impliedFormat":99},{"version":"d7a754e661206c750697768311597e3d333418f1da4546786b2ca315f884b00f","impliedFormat":99},{"version":"0bc0d9c8e623b0adfc5b0f70e52fdc623fe19cf05d76fa28513c04e0e99f2f18","impliedFormat":99},{"version":"8aff0190bd76f107c999b35145ca236977f5c75a6a0b93b3e25185de07a762f1","impliedFormat":99},{"version":"94e5221e731a382af91ce0ed2dbfd0c6c0cade705ba4708937d2d8e7a81c308f","impliedFormat":99},{"version":"0b861aa0e40121348cd97555739762407c59cf6d4d55ff921d02626a5557f951","impliedFormat":99},{"version":"313da5d83029860437f6c9f4a6bd5589d410d10cb73caa89f465f0b92a092dc1","impliedFormat":99},{"version":"1ca3de4ccaf5b8e3b0281ffeb987418b8797cdd38e6f2efcdac6d53be08d2c70","impliedFormat":99},{"version":"3733f99c5ab34d7f5fc2ae62b2cecd43aae1dfe513f1f198a6f23198ec85a9ab","impliedFormat":99},{"version":"c8f01915efe59d2e3b89262ca71462a2ef267a46d85e64d423b7eba5e56fa806","impliedFormat":99},{"version":"0ea8152fddaebfc02cae376261b581493403faa3315b561b7b28c2c9adb8870f","impliedFormat":99},{"version":"366feb5801697dadf2242184050cedb892219e5ad944d958b9f48c1a21bebd5b","impliedFormat":99},{"version":"18e1dbf93c92d56dd99b4feffb6b5f4bab3942a22f9581fe2fb01b6ef98a3127","impliedFormat":99},{"version":"af66f338f282f6a5b65afba57694316e83ffc482b8e43c2157053d2786f5ccbc","impliedFormat":99},{"version":"e5c1db417653c4d348ff6759b3b669721e2293b6123ccf2ac5aaac850727ebc8","impliedFormat":99},{"version":"3d254354637d43b0c1487e8051c4c362db794ca2b3aed7521aad0c4069531af8","impliedFormat":99},{"version":"a164aa58fd0a25722fc159f19636c34df5fe7e606c306459378005a38aa08621","impliedFormat":99},{"version":"1a341bdbf910ac2f80d1787942c77826b17f4e530cfc238a882a2e2eb0e49e42","impliedFormat":99},{"version":"cf4003a33c1a404f35f5c9854f26586497799eb9a7c8212f734852fbee9dfc2d","impliedFormat":99},{"version":"7c24222292e3d201b8b69b2ce466790a5c0abae9de3cc58f7bbeb0678d9909cd","impliedFormat":99},{"version":"7f06d04b0e1a40fd6541852620024acd484fdd7d7652f92debbd27b9540a662a","impliedFormat":99},{"version":"aa440a5a66fbfed7018a245b23f1200cdcffece6fb06d4f6e3b8e47997eddc02","impliedFormat":99},{"version":"e392dfcd88e18a82ba1195eba06545123e53b56f7d1a646f0d47aa2db930dd18","impliedFormat":99},{"version":"271dfa798f98be4ac49dfd6a28cc486f999f3dd7a9bb6f5f23262c64a65cf50c","impliedFormat":99},{"version":"82afb43c3ca6e0891d0c2c78e8cfb622ac3e69c1505dc73e40b3f5946e5a5de4","impliedFormat":99},{"version":"a45a9e50aa41d0939c42d3e02758b105128e57f9eab790e173090273a8c511a0","impliedFormat":99},{"version":"e3a3604500700c4855a5051e5c49caa41df1ec83b30262c1ccc8e34a1cb1471b","impliedFormat":99},{"version":"b5cd0fcbbedb59e0647a66888abca5ca4507f885ff3b286e0c50b842eaed1e98","impliedFormat":99},{"version":"84226fff98bdf61e7b9ae1f51b39fdf4d909393523764457aa2834d50aa91ec9","impliedFormat":99},{"version":"9fdbe407376b7917e668f04ce8d7c23cc952ca60eff05f055d161121d7ca4d4e","impliedFormat":99},{"version":"586e40af8284984647509e8bc2316ed15eb9fc471a5fdb5a1d7324fd0cf8cbc2","impliedFormat":99},{"version":"78b9ad684d80469986ed95aeefc63c0a897a625d9c30281b60a6c67eee314983","impliedFormat":99},{"version":"99a49d4c4a5ecfe3d02d1c9678741b48144d60db675105428cab22623e805fbf","impliedFormat":99},{"version":"c7b9f04d2e9d9c104e124c812cd95e35f6b9e96208cc7261e3fb8cd6341db30f","impliedFormat":99},{"version":"d59ca233e5c37a734e7ddeb14073c661b571a005b65d291bcc7a70c578bc3483","impliedFormat":99},{"version":"f7e93f9af1676ed9f0a505df3218f62b0cde1e898a9f5020fde159b2bce4ec22","impliedFormat":99},{"version":"99a9e52464f5d435e1291dd0cc343d2650e1aeea2faf8c45da0069b79983b189","impliedFormat":99},{"version":"5b182efb3a0328d1185ffd4b234079624ffc3642ac2bdca05f2d2a39f489cf6a","impliedFormat":99},{"version":"3e051f1ac9abb757eba36a1c653079c05f8e73d47f468d2013e5cf91155edbf9","impliedFormat":99},{"version":"50deb81f9a86d6dbc990a3d2e21ed9e95c7053b4f602cece0eb8a66108db32ca","impliedFormat":99},{"version":"5437c62288e1d84f352d1336b2c791e514164f4b76df2b54b9b80b021d14144e","impliedFormat":99},{"version":"3cfaf2c2f604b6e0c3331d6e10cc12a4c2ba9004edd3edc4f34830c12a00de76","impliedFormat":99},{"version":"1bbffc55483a2466f7ed17d1ada9eb309510ad7ddbda8b9052bc0c4439466c98","impliedFormat":99},{"version":"1637d9794d76d852553adec7dab806e435c1d15742c74b55e7f77c6b3f0b4d99","impliedFormat":99},{"version":"94b752027cd750dfd3114ae4bc354e3136af339314e3c0f910df7fbbcc282193","impliedFormat":99},{"version":"f754f4a9815940934f1b958bbf2d2fd8b1463fd16a2e3cbf01a488867a20d21f","impliedFormat":99},{"version":"4ee3b34d2261742bf67c8b5e5b3bf826391e22edb5ce1336d6a8c431b30dfa87","impliedFormat":99},{"version":"09129fe38056fdcc77ac298e218f9e6175608c088d01154047e0066d38285004","impliedFormat":99},{"version":"32a703d65ddcc443c10d404684ee4078f615c02fe7a2dcbe3cd9c27515359905","impliedFormat":99},{"version":"05facbc54c07763ce59d8ecfb9e7236a2490393c772c99a534fc06d300510a28","impliedFormat":99},{"version":"29fd1f159df8bd374aebb398067eecf5daf749d2d07f736e7c7287dea11f4a33","impliedFormat":99},{"version":"2f38b4fbba29ea39481bfc318cf7a1b42d50a1690465a446650948c20650df5b","impliedFormat":99},{"version":"058107de646aab069d38c35d68161a2d4547c6e78c3a3998338b9768ed1b7022","impliedFormat":99},{"version":"65e05ffb34f0189582043596cd28453d050b8b47d89b466ef61953134f7b46d0","impliedFormat":99},{"version":"e08f74569060491151e951498fa46e391320fe652c887b3a1e387bface179f11","impliedFormat":99},{"version":"25abdc000f2be90eccb17eace14443091a8791d79ec423e4e3d06954b0a3e50d","impliedFormat":99},{"version":"95a479f1804f59bcd6cdc1d097157b402f3b9f56923aab18fe4911817d3008b3","impliedFormat":99},{"version":"93d9b928e4b32600406d7a4c854f009799e805da06573fcf481d5377c1759d60","impliedFormat":99},{"version":"24d8c68f8bc95ddbef68bc3dbc659876fc18a15c34859c4c21e002483c0d22e0","impliedFormat":99},{"version":"c9646244df7474905bdadac34ffabeca395850d5415e13bec0cff6884a3a1bd0","impliedFormat":99},{"version":"91bfd8b9c1596dc378f4a21ae2915dfe7f7b99cc4b48042e91d6f473259a50f6","impliedFormat":99},{"version":"40d8306d908ea3ac5af2e34093c8c589d22481d89e60b7ad6360e4ae418b42f6","impliedFormat":99},{"version":"96aadc567cda6bfe77accf7107137390f03b3f3e2968b06f881beebe8efd81d6","impliedFormat":99},{"version":"1231da3d8a3ab8b836808da1363b33f1064eacdce90f6ce1d8dad2a378f2946e","impliedFormat":99},{"version":"c3edc858676c0fb57372e7fb39a8367636c7cfbd532b9882a722b27bc901d0e9","impliedFormat":99},{"version":"2018b6f0e2061de5d0127ea5ea55594657870b0551d6763c47b5947add29c7ae","impliedFormat":99},{"version":"98feee5573bce5dcfeb11863da1463b0e5e4c088ff76d0010676cc297399aa33","impliedFormat":99},{"version":"9c7e6ee655cd3e2c3db15050e51cf28350e020ce2b5ca030f885165bac4afdfe","impliedFormat":99},{"version":"ea7570613b458b3b741acfb597f2ef75c646fc5b8de31f24f3e11e9ecc3e2626","impliedFormat":99},{"version":"6a8bb162513430ef154922525aea4d9c9e0e300d33b7e6c7dfdc21f1267e285e","impliedFormat":99},{"version":"5e756b34bf673b63c88b52377d9341a86e5b85bc15edcfd25926f18ab7562fca","impliedFormat":99},{"version":"8e978604cbc7a505aea54c40a6a824035d019de1a9ea073a8d89056d6e75d004","impliedFormat":99},{"version":"88a6d094de07d3bedda43a507010a4e496f83f898c8b30d51d1d66147317d389","impliedFormat":99},{"version":"0247e5036245f425410b138acb7eca8eff452e90b60ce15a6d14a79254dca3be","impliedFormat":99},{"version":"a917a6578721f88084be79236f3c3c6c8d0626d27b9d29eb8c7b40336d24a665","impliedFormat":99},{"version":"7d4d7cda987e76d83992b3099170e72f1238abde39b07086f2ce1c047fa5305c","impliedFormat":99},{"version":"7a6e19fb0b63f9a7f010e254376097051865a6970c698e0c4700840ffd88e646","impliedFormat":99},{"version":"c1214f047a9cc3b256a6babdaa062b1cc112f9e11c3276a585607b4c034177bf","impliedFormat":99},{"version":"645cd29e13ee8b379c92b7e016f80f020d596c0e329122fb89bbe857596b7fb5","impliedFormat":99},{"version":"85aa829c49948a7745bc9fe8349bdb83bba19763c3a8d6b30129498714c4a81e","impliedFormat":99},{"version":"0883b415bc4b8364115b3a74c2c5d14bb6852a1a9810d051ff426c51b7865e3f","impliedFormat":99},{"version":"57bcaba92379c398572ceea17e80cb9be80b0915bf2022fe99f360875e3ebbb6","impliedFormat":99},{"version":"e19c31cd2a5d8e14a56d40d9f8bb4819f70ee3290c71fef47d753cedbe1b8403","impliedFormat":99},{"version":"7867d743e0710c8233955855dd1c8143c76bd169d31e1b81835dd849d53f78e9","impliedFormat":99},{"version":"d953795eecf54315d23cf13cfef3aaabd521a305b71a67d5939487d9f8f781d9","impliedFormat":99},{"version":"8632c3b1a88dea3b5c07133a969658ade0bc8b0add4a160ecd12b2e8ff73f147","impliedFormat":99},{"version":"bbb8f4a3cd8286ed8d4615d7f6c0cbf4753c761e1d3ec18a20a161d276b6f617","impliedFormat":99},{"version":"9643da030e1fa23447dacfec5a005dc51f0f7f651dfb0c063d4195eefc8a098c","impliedFormat":99},{"version":"f78f0984c1045c759eca17c87d9892519813d7ccb07cb9f10bab6239274ab3bd","impliedFormat":99},{"version":"8db95a03e8ba40f5fd72926a7df034c42c083b264fdf948382eb2281cc3aaa81","impliedFormat":99},{"version":"a004f52364ed07ec22dfdd34041dce156046b1fd1d9170ca99748e7ebfca1b9b","impliedFormat":99},{"version":"dbff933905f07dbe803238031f124892e8ada74efd4b284287bfc75d2409e3e9","impliedFormat":99},{"version":"0941bf71e7631df878e29025c83b35ecf2b4fc730f61b008590fb0f937aa63a4","impliedFormat":99},{"version":"3e8837d71c58e3ddce51b55e29ad7691eb15aed51dffec5fb7bc968898abf6b5","impliedFormat":99},{"version":"6e58caca3025448230faecb5efda0951424ba15b071ba13b00f3e7f1cc6bdd29","impliedFormat":99},{"version":"b3a3f55260b2e4384b00a7bfc5720e9866074ac18f715f3e505c7593aabce3f7","impliedFormat":99},{"version":"3f8c206a53bb5a8370f094ff77ea9e95ee8c3661e248a1b9c0334bb71b641907","impliedFormat":99},{"version":"99853f693260e3d76256576888c7cdc5515e50e399fd3111afc514f0ec9e16a4","impliedFormat":99},{"version":"480cc4f99dfc33fbe523f155018e66bed504bfce061031bc04f5c47b7dd2ce05","impliedFormat":99},{"version":"bb0cbdbfe7201cc8dbe28f10d4577316d63a633b746f9e9ea9ed16a0400a0347","impliedFormat":99},{"version":"6bc725824b4ba929f44f3973aba69c3bf4c9b8c667d6c5bd257524584bcf6112","impliedFormat":99},{"version":"1f2a20e400e1df467ced60364324445d04e36184a2fb9bd39f32f85058d72b50","impliedFormat":99},{"version":"83c5f92d12a9677cb376404aeeb89f910efa2ceec8fb200bbfe59c508a5c86a0","impliedFormat":99},{"version":"91236eb27c0c580c803b9581bddfe4dd45623093b8638c8cf39148d193b185dc","impliedFormat":99},{"version":"ba41d9506bcc55e2043d0a9290c38a4c1fb4ef82fb2562fc2039d55ee0a80a72","impliedFormat":99},{"version":"214c9af465ad68b1750670de18e62b8f3e7749257aae5ab0d7170b994e9c7e5e","impliedFormat":99},{"version":"62e8d8503a51a24c9f0947d88edb5837357f4149c5103fb304bd31f8b5d4f4f9","impliedFormat":99},{"version":"5dad46254873e5e5c4b8b80f6776dac8bcc96b059cf6ceafd9be54d24faa3dc8","impliedFormat":99},{"version":"88ece1d1c523d9eaa48c8c3e0c4cd359e9df8a542ba6eaab5dd3c523d5fa9826","impliedFormat":99},{"version":"109ad0355918e4fad1bb9d849f8b72a6894b83d20ca6ad72e73124fa380a6c64","impliedFormat":99},{"version":"70b68b3ac7d6b03ae36e80766d62a666c407f455476283ae6ff219e49f0eaee6","impliedFormat":99},{"version":"bb72571132bf5160ef9af164b82f13fc74c332d11c3325e4953ede73627bda0b","impliedFormat":99},{"version":"e4101333a36a93829170c6e0c66ed47c648571502b484d22e4629317197a6bc3","impliedFormat":99},{"version":"f0e5a05eebeae29b22dd7b3747fdd6503bcf7ad42df8ccb0a8129e98ea112408","impliedFormat":99},{"version":"658adb3d7d4017bf38ba1d1eded9dd36c5be121eaeaf469abc11c2494c13e12b","impliedFormat":99},{"version":"f0c39b43f5d2619c66118d2441976b4f1fcd100e55be80bd55d8279b2776a082","impliedFormat":99},{"version":"1c116a992389ab12f4612dd3cc9b4d888eef454eed3794c1f515cd76d3b17cab","impliedFormat":99},{"version":"0d9ba4647605be41ae36c09439b623c174e7227c8943d15b1aad049c5932c2f6","impliedFormat":99},{"version":"ea8f99323ac76484ca97cddd57ed916dacd4ff2805c446a69da9e728ca8c9b43","impliedFormat":99},{"version":"18e80e1593efac104d1fdf3fe5c02023be9f3dce93ce3a95df75ce1c17b98332","impliedFormat":99},{"version":"68a5340b5cb05677b52fe5032e5b8ffaa3d02a98baa991ee161e318e17d0e74d","impliedFormat":99},{"version":"7a1457e43136d0a005af395929abb59ce7ea3712b1b4091040fe700c4386ff6c","impliedFormat":99},{"version":"8aafd0a8486f554718b22d02cb662b9964fd6b6346ac7c46573182ed3102e9b0","impliedFormat":99},{"version":"ab0f538caa8913de60351b4d993393ba30d485461dfed416b11fce206820974a","impliedFormat":99},{"version":"7d703f987cf71538d9b4e0388c4744fe91db9b4bf5fc0b5ec2120e523ff036ec","impliedFormat":99},{"version":"779e6f8af772f3f63982b2d907c662ca37acb84e7ce1fad4de9c8417142504d1","impliedFormat":99},{"version":"e1ad3c3b80b5bf0ba59c3b33878afb16a906c09840f8d1b072af14e587360f6c","impliedFormat":99},{"version":"51cda3a044b658d58c693647e19ecf16c29f5ae67caa0f1c619c7c76b93f1af3","impliedFormat":99},{"version":"e6b27342fc513672b2fcc831ed5d48627817ae0b26b3a487643b61785c52cecf","impliedFormat":99},{"version":"582d84dd785b99a7180701aad4fdfbe3fcb26cc07fc693032361070ed0369759","impliedFormat":99},{"version":"eb5888375a2ecdd0d3502cec0f77e1e42eeb2169c76b79b61add3ea0bc95ba4a","impliedFormat":99},{"version":"ca5f212e869dedebaa7bf73bea3c6e8ee886ba2f0601d7e789ce38e2db189600","impliedFormat":99},{"version":"d21865e1111bd2be2ee973598343a324713e31f1aa2e6184286e1a8f077366fb","impliedFormat":99},{"version":"3df99ade0e19a8fe6c989688eb5743baf8b02b4cb678018dbdcdabe00fc42879","impliedFormat":99},{"version":"785eab4c4a6166680180ba4e9bf06e6c205862a3c83323fcdeac61e6a76adf8b","impliedFormat":99},{"version":"c1686f9d62d0b94c43faf794bffd8cc24ac1475fc6d536aec3b4480128660322","impliedFormat":99},{"version":"3e050baa6d458a74a769e3fb50ff1051723dcfccfa8a31b7ac9ed0c990d5dbd6","impliedFormat":99},{"version":"bbc4cd67ab91a186d1a4aa1f65a7971ac31bc2d8c63fd2bfdf02e031a85be7f3","impliedFormat":99},{"version":"6c09c2fd7f6c0512ce2ad6e17a0d9f9203f47afd3b83742d4cb4db2d3ea821d2","impliedFormat":99},{"version":"16e3734500cb5fbe0cf27f4b61cafd7954db45c3facff516d8819bd63482a8f9","impliedFormat":99},{"version":"352036160d597fb56e03591325761d86221f6b4facdb0c7df4b790c4891f4f18","impliedFormat":99},{"version":"f93375427ab3f9a598bc14d9bef5a2ebf68c4755bcf3a68b794e131dba637d8f","impliedFormat":99},{"version":"798b8feb569f4b4c521cbcdb9651d0fe799ffad794284dce8a4e0d9dbaea95ca","impliedFormat":99},{"version":"3deb173189f9a8232ce9fc11ce610c27435f5e6b86e507f9c04d5fa275974101","impliedFormat":99},{"version":"de8156baa4157a698a1bda8e6b4ba62b8bef4972808f7450698017219f539475","impliedFormat":99},{"version":"65c089d5dadc1d26c81c374f00a8e11b7178900040dd7db065d8cdc405c65e15","impliedFormat":99},{"version":"66003617c7bd48b01253f0f0ae9218f15adbfd66a04a74d04235f28f9ffb830d","impliedFormat":99},{"version":"8733c82576758e483eaa077a95d1b2d1715353ee0d8f148d06a5f979fb71f22d","impliedFormat":99},{"version":"0dd5e215565f19d57d88f9c32cd365fd451207bdef48519c47b14dd4ddb301df","impliedFormat":99},{"version":"8b86136891f48d0e82f8fdcd623268b036b2a8ddc22241a1202576792af0b63c","impliedFormat":99},{"version":"1a080e2c42f4a16b339bc45067ecce29ce25040cb5db37f5f3f19413aca07e09","impliedFormat":99},{"version":"55f8158fc3e7d4ba4ab62820d32f236a5723af9c721e63879cb9c184292a718f","impliedFormat":99},{"version":"170f5fbca91c30969467442f813678c86d2d38d10aa3ef8e5fb388bab833fba9","impliedFormat":99},{"version":"224347dccdcf08e3e862699dc9e35f6ae1f9388f56e14db2357bb79b75c1c814","impliedFormat":99},{"version":"c6426d9201d8e27551ba9a0b5f4d9103dbc2b2057801a621098116a042b03b92","impliedFormat":99},{"version":"af11c67bbdf99195a89aa5233d8641f6e1d2f7ff712e941c773e16f602e7f96e","impliedFormat":99},{"version":"1dcc9bb3542020790409937565639ac7c3bb8b239ff49c65ee20d5244ced1fce","impliedFormat":99},{"version":"64fbdfda1827a333790a0cbcd36e40bbdab461df37fccbf8a2c12eb0a6450b19","impliedFormat":99},{"version":"9f40ebfa8a6cca16447d13bc9265e7b463b1d4e7265336e287d2ed2867af60b9","impliedFormat":99},{"version":"cd77f74ca7acac465b9b6ffc244a574cafbf16ef35bbc834c98314d1603f6b52","impliedFormat":99},{"version":"6a3fb20abadf78d08de29baaea62889070d505f35ff5140642e8074db0f5b7e9","impliedFormat":99},{"version":"75b2e385d7de8d6d714ff9aa6635bc494a6f90a6f33d2c5c7710bc71ac19d9d1","impliedFormat":99},{"version":"f5e7ffabb3a1e6d3c0c5039912c8a4ea8d753722c9a1e602911c100b7ec155ac","impliedFormat":99},{"version":"09757c18f7d7af16d89b75b643ea4b3a0e195d67a63c03755a07dae726e1148c","impliedFormat":99},{"version":"3b2b48dbb70d48112b34b4a73280990bdf75147d75659cd5280e846513abc75e","impliedFormat":99},{"version":"e6f905bb9525a266c16e4350cc4d4020689a588f2eb6d6b64fcea6d037a05977","impliedFormat":99},{"version":"4a988db19eb645816e40e48b945226f76de53f1299131003aabd37a013c22590","impliedFormat":99},{"version":"9b7dce8b944c33e20355a272f156582fe0198bcfa395d7082e6a66eefbe9ce57","impliedFormat":99},{"version":"13aa72dbe072780b3f936dea5d1c3094af3b6c186c24bb30d404540ec447b3d5","impliedFormat":99},{"version":"a280303c82a34689c9cc178068e6c012c6f582f80cbb6a75530bf552313090fe","impliedFormat":99},{"version":"715ae11614ac2209e2b5f3efb19b270603f8dbf20db559b76b02a47d6f3fd77d","impliedFormat":99},{"version":"d337b0c28c6f35442c1f88ff8071bcf9ef2ff381aa37fc30d323c6ac25e23708","impliedFormat":99},{"version":"425e7209aad5daaeeb4df06a718f8f177db5f0322c5fa94573ec739aa7f02deb","impliedFormat":99},{"version":"cab30bc9301ed991270375c5a0a011c897307e0e2158578e96f93b497121a3c5","impliedFormat":99},{"version":"00e136dc2bf5a5dd51fa6c5e9c02a7aff6ce4bd111e74b0f0d59c87494af51dc","impliedFormat":99},{"version":"4933c98fcc77ebbf6166152f65916cfbfd8f494bd14e6d8eca45ee231f1f2926","impliedFormat":99},{"version":"55b7f086a4ce7f130df29adbac36981bd64051263686af3271c604cd9591f62a","impliedFormat":99},{"version":"7d8fa714edcff481c66fcbd1c29b0856edb5591d085096c98613e9b701f55676","impliedFormat":99},{"version":"879e9c1b88c533389580e7178497ea55a36c95876fe1d94c6bf73883b6d29fdf","impliedFormat":99},{"version":"7c22b12c9c17dcc2317d52b83d8662c538fb337adc8c1ce69ebcd8f8394e2064","impliedFormat":99},{"version":"199e6d1a80d19524ea70d143488d72ef5e8ffcf6bbfe82dbed7f03d603948d18","impliedFormat":99},{"version":"691ca73f83cfe3262081875b1096744b1314860e6e216de3d242b4c76f8c1972","impliedFormat":99},{"version":"e43105a7b869d2963215dbbad1da3ba79108c3d5361df4e11d6c1bd967890bd4","impliedFormat":99},{"version":"c3d4d0c0dc57d5fed5a7af5ec433a3fac319c640aeee9ebd648066535cf9ff51","impliedFormat":99},{"version":"6c7d9793b68ed844870b77a5d4e6c92dc5d3b10d3c09007bb54b4baae99eab62","impliedFormat":99},{"version":"98a99b89bfbc2d9b7c3df85ee85f5fee6e9eb7309dc0e8b08b77b34ccb85957e","impliedFormat":99},{"version":"026567c73d9d23ce133aa2f27da3ee815b724f52548bf5579746f41c60723fcf","impliedFormat":99},{"version":"df6f1df7a3ae263e071615559e198d94c6fec45d33140fc3403eda6f57c5f8e0","impliedFormat":99},{"version":"5208ac9b4aead07702be291e7b6b2aa5936ed9ab8b21de6227cf351292246f6a","impliedFormat":99},{"version":"8d04cf9b77d2bff28760b0126105d3d5a34a1a1e8cc2b4966a9e1859bc55ba71","impliedFormat":99},{"version":"e7925d61f7792610f43a39d58dd58b804bf43d6071a09439d44063e35e5ac244","impliedFormat":99},{"version":"4768ed15015abc1826477096caf3c770ff266bee8136ebec5cebb929d6b9cdaf","impliedFormat":99},{"version":"7ab6049d6f98dba00f3e379c0bb149eae6d2bd3f8ead7de9238bdf65bfd5d791","impliedFormat":99},{"version":"b50f3a41e80fe4e8218a7f6c70257ccac4c3f360d318da72779ae1dcd0e787c5","impliedFormat":99},{"version":"a7b7342414754d0fc6a9560c08e5add2eaccb9570cd39c53a5155f368e695f14","impliedFormat":99},{"version":"e574749d4ad0f5b989632484891d00a6ef6104b3b014e9eb9bfd1f3c811b4a3c","impliedFormat":99},{"version":"e5352486d0919edaf6b57caf289859980db09607e225f70d21ac9b06ac1ef04e","impliedFormat":99},{"version":"23c0a2c86cdcfcbdfc95f11c89611f04cce0f593b5140a2e64d20556af3f159b","impliedFormat":99},{"version":"3cda756ee1dfe94744ff3eb6a11b7e5d41f502d0f8c46aae5338bc82cb929602","impliedFormat":99},{"version":"5a2db3c589431fd671ed605ecf0725decd9acf0e239966bd6d91eb2cb115a0ef","impliedFormat":99},{"version":"eb63ec99b754ca1947a7fbae5d7f461f8179f647bd0f665f6008443b7fc8fa14","impliedFormat":99},{"version":"5d4e4b5cb1a17707244dc479b464e537237ea4139b4235d703ea83a4a9287840","impliedFormat":99},{"version":"97bf370e78bc695d758542bbd2ecde489a61db5d678c07c85bffa91459343c37","impliedFormat":99},{"version":"e7789e4369b2c26d9a8a1150141b146932565ead086e2b4e32ef145325a8894f","impliedFormat":99},{"version":"0cd7b61de09c45306ffca7ca80fe784e56623cbfc99e1fa4aeee7ec924353d47","impliedFormat":99},{"version":"9862a6e0ad83a3b3faa226fc86fb1940b3a9183c0c29f5bddaa9b2c5cb813a05","impliedFormat":99},{"version":"d85d1d741211343158b4f64b4fc7d0ab347a643a3bb8f5a7c80fee1cd71ddb91","impliedFormat":99},{"version":"b30ca3d58261de8bfe7b599e9806d710700b58d7f7c7c1ebec13838bb1c36d76","impliedFormat":99},{"version":"19c817e65f0d10c305c29e01d8fb6defa09291fd67bd13034223cfcccc14f8fd","impliedFormat":99},{"version":"d72ed5882015b367986f5ec7b1cd58bb50bd1c51e941ff06729b67ab66d4342e","impliedFormat":99},{"version":"8e395378f1ac56cf2bcc7a2533cfccd2f431e45b91340418148c99e16eb58c6f","impliedFormat":99},{"version":"cbc884601dbfb8d72c8f8877a11179ab41a9bfa0b8c8b345184b835d09a29354","impliedFormat":99},{"version":"b3be68eab5f7e270ac467749dd01ca3203c572cfc511da099e028a930e933416","impliedFormat":99},{"version":"ff1f6fda8fed4820f48b922caecbcb6f74b81ef984908ca213d09463f9f7f937","impliedFormat":99},{"version":"e8c989cbc67a55209e74d695ff91a888e229d67f0cbbd8b49544cc07382c877e","impliedFormat":99},{"version":"838930a4a3fb335a78cb1d3c4d5b825ee7ef1a7ee2136315ba38346aae1683a1","impliedFormat":99},{"version":"883985e0a6918e642e1f416c6afd0d0e6e8033f3b29ea5a49cd808c88874b7cd","impliedFormat":99},{"version":"f126c52fb0b87a45252fb6397c2326e3f8c3947d01370c2b4d9b1d4d9196f046","impliedFormat":99},{"version":"99e693a698fe25a9924783102421e87d02ed7204369d0c499b207f4fe872f168","impliedFormat":99},{"version":"a70e24984ec50f9c0e02dad3f4b5bac149f10165420d266ba199e50fe45662cc","impliedFormat":99},{"version":"633e63e5fee829801ddef23112e30073ea34d9caf5f464d478fddee93e627475","impliedFormat":99},{"version":"0bba6e8d47afded79ee770ec90c46fec57cbdf69767306b86aa9b32e6f4dab11","impliedFormat":99},{"version":"66b7c3956758bcbad1eb7c0d4fb0d779323a825b8adccdf35ea7946eab476b20","impliedFormat":99},{"version":"16a1a5d4825dbf2991c5a8a2090dd84d8290b19cf541e93a7c4995b8037a627a","impliedFormat":99},{"version":"35f172c558295a38b28a149069d619f658efbc69ba9b672e6c853a489ba23457","impliedFormat":99},{"version":"3b2112cd844c32dbf3dfdfdf05e14b396f46ba6e61bb15d82374cc8aea2f272d","impliedFormat":99},{"version":"17e59b4b305bd2ad32bfaf62350c305bb45fbacfe5a4b0547369259d17775e40","impliedFormat":99},{"version":"c11ab5f4ec79d50b9741fe66527fd19c09cddde5efc4cd39b5a60df69c38b604","impliedFormat":99},{"version":"5530eedb6ac3365bfe20f117de0db075971955dd763eed8b9757ecb5b5a3e57b","impliedFormat":99},{"version":"fe847d09c50c98d93de932ab711c1569cccf7100c0c7ea59e4feaadde30ea048","impliedFormat":99},{"version":"a691ed743148b3133ff53977947c447c5951382aa75ff41926502195592854c3","impliedFormat":99},{"version":"00387baba842e4e7cf442edb72abe67bf2dc4c48b02a44175ec2d82a88847e88","impliedFormat":99},{"version":"b9f3a62b5a7b9cc2308ff957f2f9400431a484d44dd02b7518abcb08b387528c","impliedFormat":99},{"version":"1fd1e1b625fe20a8a1a133bde76da9140312d4fd0da1c18b27d23002d4d62243","impliedFormat":99},{"version":"38d0d481e741ca7daa25fd987f3443ffe351cd0a9c0b4bacd5e008c51f24850a","impliedFormat":99},{"version":"c07fe65c3f45091dba97d40b4ac07c390ff625a0dd92295d76051f0998618d80","impliedFormat":99},{"version":"b27a05e307131d13c3ed496e07dea2b79331aa1ac9571524fbdf16cfb3ebb1f5","impliedFormat":99},{"version":"0dc1ba6bb0e4fd00bae62403c87047bc5be4ab5943ebfacd5348ecf74c9b0328","impliedFormat":99},{"version":"ef60c0d7cd61055e5f06a6b76cdfdfe317460d5ce787efb48f35b3618bb68608","impliedFormat":99},{"version":"8ec7a6d53714b3c8d7a5e1eeb36108ea511cfc7fa4d7dd08229dc906568548ea","impliedFormat":99},{"version":"f84ef63eb5e13857e20ead0977940fbc9cb65da0e3705c04f0f4fc4326937c1d","impliedFormat":99},{"version":"827f0625ef8bbfa8997f91b8832626a4be0742fe3c9c6309cdca802c6edda8bc","impliedFormat":99},{"version":"1a535ae8a6cad0882e7c7189b21f2986dcfd5c2efd9950b5b04cae15179b27ce","impliedFormat":99},{"version":"47d40b96045ac0f52537cc2076f9ec1404fc444861191043c348d8afa0c6bd73","impliedFormat":99},{"version":"58b86a43ef8dd9649a6b67dbeb512f01f934ad78518ac89683927afed03b1de3","impliedFormat":99},{"version":"47c563c296e93315d38204ff70b2a3cd6788fdab9ba388791fa1c82987794d42","impliedFormat":99},{"version":"69ba23cb263a0916bc35457477b88e05eb35809c58a17449974d174a2aac6059","impliedFormat":99},{"version":"b1e445ab4f7d5c6d5094c3d6560539f641987a9acf82a0784b320e01c803af90","impliedFormat":99},{"version":"9e4c32ab790364ad67b078d569d273225d28a3cc5ee1b683e096fafdd0372745","impliedFormat":99},{"version":"3b9cf1e4cae113f06b84bcdb48dfd99a04b8708e4e4f48712ab94b7e1d11c884","impliedFormat":99},{"version":"52fd16e0b3f6582c3b545957606e1e82e8e7f666745a2c0a077eb5b534246109","impliedFormat":99},{"version":"28782dad7cc918112ee88ba23ac97f11a56c7e8cdaffa0978ca83751ba49b741","impliedFormat":99},{"version":"d707632c2500c4d4c503dcff2794e15c9102624ce70c9ad1662e396169290a46","impliedFormat":99},{"version":"798d2a4e66eb3726f8e07b6d94341a008ee974b8f86b8b98550f79b3b0e43390","impliedFormat":99},{"version":"6e36459dc4168e7f2c37a9f9e0971c3aa8840e753519781d1410c659c1fc525f","impliedFormat":99},{"version":"686a3bb7e54b8b622ec5bedaf1ec597633a9e75dba1261e4017e2e8e8ae47314","impliedFormat":99},{"version":"220ffd58c0b38bddd8d79d16b48aa3c71be8a0e8d01d45ad65396b453f6f5ad8","impliedFormat":99},{"version":"9fb07cf95a99e80c1c0462eadfb2b5d9434dd20817ef143ff67def7742b9760a","impliedFormat":99},{"version":"c70bfcb0d36b6e0d59a413e23016e402ad1d5afe2e5a74c1da3b52d271e4d4b6","impliedFormat":99},{"version":"55712f6dbd9fe2bccb9cad293fa37c294dd8bd9067566bcfab17e5596aa77bca","impliedFormat":99},{"version":"50f6da711079ff42be35995fa2dd810a629acee19248c4476ffbe1bdb324b7d0","impliedFormat":99},{"version":"be3455c8c848814f4b4f8602a1088411fed507bdff9a6cc9ffd176b9092ac401","impliedFormat":99},{"version":"16cec8c852d6b1cc27c107593c3087c901ce3e1f949b3560729d9702e26da2a5","impliedFormat":99},{"version":"1f0351b420afd408a267f3c3f578c788245d29d71da0809221f2f9b3dce475d8","impliedFormat":99},{"version":"b79b1fe1036d51b099e6ac6b3fbfb4eb36562c783e473e40c6cd2ec65991ecb5","impliedFormat":99},{"version":"b6964ec91330fd27e71660b777624e9342a2919c08655a7a65833324dc9797cf","impliedFormat":99},{"version":"5bb8a642d5b1f469421f30108f24d5443a83b2d59a385191e93ca650a9dede54","impliedFormat":99},{"version":"b76f9204bb26386bedaa9e14a23b3d9b1c6fae28c86f7fc484df7e5b74ae3844","impliedFormat":99},{"version":"8c1eea73430f19085f52a279f92371409f9c3c1f1cbc6187e474d0ff158b6b98","impliedFormat":99},{"version":"b288dcb1d03d232ba58b61e94124feafceb0d411013f603ddb2068702e5a13f8","impliedFormat":99},{"version":"a9ef5666ecbff227e17ce51d833b7c8822189565799aa860a60efa8a4f02ff00","impliedFormat":99},{"version":"29670032e04e02ef8a2172d3d637ef989b2896718852dc0d6735d47b1d8dbea7","impliedFormat":99},{"version":"c6308f587ff90713ac3832efae5b7aac09d6b067c2bdfac9637583a668d470c5","impliedFormat":99},{"version":"45c053bd25f8463d059c805283437436b640af4a28f9e10811bf1cd122d03790","impliedFormat":99},{"version":"bd4186ec52ee4bb1e07d27a1534eaad966bc9ba6cd65a58a63ff6a45632348b2","impliedFormat":99},{"version":"742c77f3420abf97cf51c552d99d0d935808b33c612e530ab54d115c513692e2","impliedFormat":99},{"version":"1b9af93c3bb53108e109446a0127b8dd6b9ff7c5096319fb6c4d63b9dbc8ec75","impliedFormat":99},{"version":"5cd660965157b9211c61f131ecd876143129cdd528e49099fc4610da0e7c04d8","impliedFormat":99},{"version":"a5664583622519fd735a5b89bde8040e93d11015e1559270008ec3722f546188","impliedFormat":99},{"version":"290d2e6293e262efd3aee13536268f8e96f31794800a1b68e392f27cdad9bc13","impliedFormat":99},{"version":"6c5e7e9f0c8361569abb01b323d939288ab7d2a16ec74962dd0981496a3e7ba0","impliedFormat":99},{"version":"386cf4e0b737544dfd42761ebb6159bc987b0747faff23af0b73b9003e00ee27","impliedFormat":99},{"version":"d7c7b4ae623b52e885e1aa716cbc22bad409d36b7204dec4004ed9c55133933d","impliedFormat":99},{"version":"dd0645217ad10dc8360c7d83bd6c6f36750b7df44c48116c883024dc8e125329","impliedFormat":99},{"version":"516294ca25dddf7d44af05033e856e5bae0fa1cd7a9bf255e601fb77b5b9f597","impliedFormat":99},{"version":"8e4735e0c080d09cc800cd41f646de9d759167292ef7cbd76a0eb57f8c4a00d2","impliedFormat":99},{"version":"0cdf249a81c98a3c6d79dbd0c1a65ff377d6879658aa3aeb8704a1b2158f2230","impliedFormat":99},{"version":"fcac8bc31559ac91ae0a65ffbf43779dae8a9c585f0e3c188fee07eba5444ca2","impliedFormat":99},{"version":"b37597091430552997625ea0f386da6b0ad725704274564c17282a06d77eb585","impliedFormat":99},{"version":"3aed368622022abff04f6298dcb1236b389a26af3a380ee8f06256850a3d99f3","impliedFormat":99},{"version":"be4068251ea5a2a50fb0e075ebd0b2cfc773bbf3f974b97b110011736b50efee","impliedFormat":99},{"version":"9223c5f0109bcc0868650998613d670c302abebde0cd2fc806e42a4b0bb5c9e8","impliedFormat":99},{"version":"0571ff9f961401db433c7c248b16bb2bfe65c0f09dc68543745c16f2176bc8ff","impliedFormat":99},{"version":"05626dcdef717ded5ea6fec10e3c6a6c7acabe92bbf36573470212d5d858ae62","impliedFormat":99},{"version":"64b324dd74b6cd0073181992870983522182d33cf0b9b3c1b6d503e4ba854b79","impliedFormat":99},{"version":"9e6970fc8d80d18a58c0189f4900317554e328e624da3bc78a954ea08b166599","impliedFormat":99},{"version":"cc1dc46db20468ef6189aa7cf4a8f4240897709753b2895e5400d20b6e4cd554","impliedFormat":99},{"version":"30986d936b4fb9b78344bba08e72ce06e731d10862061c2848b019d74ddb7eee","impliedFormat":99},{"version":"12dba10fdfe2dafe7f69c960da3f694723d82f2856ccade9926f5d04ce16e975","impliedFormat":99},{"version":"06a1c3af923cd00e69142a78418edb82c211cba3e72a91be52ae12bd845550d7","impliedFormat":99},{"version":"13405921db76cd2ca52f50b8dc8819884bb0fdbec7feaa8b0e5256fff635b007","impliedFormat":99},{"version":"474fe5758f25fa31f93293163386bc120cb3a859628146216c27d20f9fb4e11b","impliedFormat":99},{"version":"797a5c56e7b68fa7ddaa736ea0f84903a0280b3e24f7edc81dc65d59397c1dbc","impliedFormat":99},{"version":"13144ada8c1a653103674ae05cc08441800d8db5ba8efa624158528eede15884","impliedFormat":99},{"version":"42bbc0317d36df458e7e5cac3fe51a5747aefab3abc5cb3f238a944d5e32a91f","impliedFormat":99},{"version":"678842cc3c2c69a8c2fae8353656a1e5337828124b7b53ddf41689876b70c57d","impliedFormat":99},{"version":"f0e3459d79ea7a69f7a334151c38ca830c4541a030204e44b680bb47cb357bdf","impliedFormat":99},{"version":"9ab46babfc3d98ac7a31ad70b4212562ad36311d9fa235871dada95e3379fd09","impliedFormat":99},{"version":"92e6d6a927ad3d48d91b7fd3f31dda6e078cf03880e0bbe9cf56abb5919efab7","impliedFormat":99},{"version":"5b61720af63c370f28be29a1e6b60eb3d3cb6df1c169e467ef4241f9abe68272","impliedFormat":99},{"version":"f622b88d462a91a84c41747a8c097347cb08cdc26250ee5c86bec180d4587ed1","impliedFormat":99},{"version":"b9688f18464d0182fce970cf89c623191997178076478d5bf5604724a73dbcf4","impliedFormat":99},{"version":"811068496ebe65d79774a99796223a0ba3efe04be587f6ad9fb2c71865d5fd75","impliedFormat":99},{"version":"1a42ecff9998af3ec2d7465bedcf10aa76420768fd31143fcf0808dc7a3630dc","impliedFormat":99},{"version":"0ff2355b4074c3eaee36f435bcbbfdbcba07ddfb4aee5a2c37a2eb077fd024fa","impliedFormat":99},{"version":"ee053e4fb378dc43221a892e05dd65c664cea6947e5c3819ae41742643d70743","impliedFormat":99},{"version":"eb1359bae2c2ff3dce1258094f234a8de89b7b5afe89bd73e725a46558fc6aa3","impliedFormat":99},{"version":"73c08893e5e403971e0b2dff8f14d9ce3543b1a821c0d2fb8e5ac807a5d14603","impliedFormat":99},{"version":"b886342183fcbfc5fa59216cf405970b992eda93bc8a89094e1d40906dcd399f","impliedFormat":99},{"version":"5170f383ccc3d8431414b298aa1b9fd8f88f9f6ad0f6b40e4f78b5ed98d0f12d","impliedFormat":99},{"version":"a3915cd0ac9bf5441edd5b60f3937d89dafddacd7c8d5f323a279f0647e95712","impliedFormat":99},{"version":"77fd5aedd61211bb0978c3e3763876b18c55b73df2da0d7e17e43a13b3a1a617","impliedFormat":99},{"version":"0138f7ea01346ce60e52fa324df54ddfd6c9c31495fe74ca071bc44674287f26","impliedFormat":99},{"version":"95299ea6874a7330630d89d2ccc3aee12945d0ad632c72a168513f491ad465b0","impliedFormat":99},{"version":"8e11782e3f5c78b28558dd617d0d2a94a524b5106e0e8a6826dd71964cf2b172","impliedFormat":99},{"version":"7238edd71a373627b2d4980472114a75a861fdc5a66efba81e6e61fcb40d3c3b","impliedFormat":99},{"version":"02c11188c7c7ce94d6dce4fdb002d717a9b672ea1293b59dfbf9b54345ea9dc6","impliedFormat":99},{"version":"3cc667806444c6727c1a8106fdaf37c897c25d6a0747fea8cfd817c275309494","impliedFormat":99},{"version":"ed78cb361de97e537cca46c234c5f0bcbbea8a77f88d3270142ed0993373c159","impliedFormat":99},{"version":"e15f2519cc04d4a30a0543a349ce4d4ed10a8cef76e8bb226a624d75b7b24a7a","impliedFormat":99},{"version":"a8de68a1e6c0c3405cff69a6a82dc596d576b967c9b925c494ba30f8782193f7","impliedFormat":99},{"version":"7c6055ad026fda59ef8ac871f9aebcb080cc4ee084af8feb3dab392e603fb9dd","impliedFormat":99},{"version":"3227e142b26a6ea9e1493c950c238446a8d0297b093c8c95261d4f3e63312237","impliedFormat":99},{"version":"8fa71f3316151cd87f46e0f50aecbf39ba424790904b6dfaaec6fb3ad9226c8c","impliedFormat":99},{"version":"f2bafaf9d83cefd7f55bc2a480d1b5ec302e7615b30642bb00bfbf58b567a61e","impliedFormat":99},{"version":"a605659c69bb74a59b480f20bfee716dca83d289a814ff696273f71aea4c4abc","impliedFormat":99},{"version":"5886ca453462c07e9a2a6a835172a5f2149bc2b713b618fe452a94a126eeb36b","impliedFormat":99},{"version":"9f1b4ed0bcf465a6390e7c3760e0bb339f3d61c28e78c95024a3afd3ed81fdcd","impliedFormat":99},{"version":"5ef95b011a154332189243cfcf622787a41f3c646b0e3efeb347006064b91197","impliedFormat":99},{"version":"e6eeef06ce02234a927acdd50fcf396b8dfd8e8ca34c082cccd253193b4102f9","impliedFormat":99},{"version":"a5c6769e0465426998fb1ccba6db4a008cd9fa4a477a8bbfecf5b130c4031734","impliedFormat":99},{"version":"d29f65daae852c87855413712c3e9e81abc8577579cd40aa28789910c149c8cc","impliedFormat":99},{"version":"d4c7c425aa0d74cb74b92a6ccfa740431b48d3240ac7a2219556720a107ded33","impliedFormat":99},{"version":"4de384bb706f41f1515883a6d30cd1eb5d149729a79b1524e1bfe86acd103d68","impliedFormat":99},{"version":"b8f2296cdc94fe0a235c1c73a2f97d394050ca3d74b6b45b07b563a0c2892dcc","impliedFormat":99},{"version":"0ff56c8f9f2749a7c23c130450f0045a19ebdeab9f94f9b6f051e2cad105a1b8","impliedFormat":99},{"version":"e5aeb2f888cf51e86a5dbf26f710608140d6f85847f935b5dd218fc9b865d820","impliedFormat":99},{"version":"f111b5055f9e48983310817bd14978fe8b44600383b2fe0f0f8f82c501034f96","impliedFormat":99},{"version":"d0b4fe6473d64b2505e3b842592c6fef0491b2ec29d3d43c74289428e5649997","impliedFormat":99},{"version":"83e50a8f0a133458f603dcfc3aded3d8e6da48ea71d3a1aa5383c71bd12dfa51","impliedFormat":99},{"version":"4ee9650128cc8493c1cf7d0923004c0c5e6ef374f838dfbbb5f510eb9eff21d5","impliedFormat":99},{"version":"9ffc8307fa2cf2c934da7979c96884df4a36b92b54ca97325494ab2be78fd8d9","impliedFormat":99},{"version":"6c71102ccf27db42765e5a9369c36c4aacd83a78883df87ee103d11be3d951c5","impliedFormat":99},{"version":"57ae79de0948c54c7a75ca0d72d0c360906c1dcf8e6c31f0da121e5a9d382717","impliedFormat":99},{"version":"55cc4ba04c0965890e2e46a092c7b76e92cc9812a12a10d510e75047e5c2edcc","impliedFormat":99},{"version":"977c1704104f936a37c41eb6b0d24cb413e20e62337f7e2be588d3ba55aeebba","impliedFormat":99},{"version":"c75bfc4a6eb3b39957d05a6b9535b424a98bff9f27518e39a7dd4830ceff4eb1","impliedFormat":99},{"version":"f8b79f53b95079b96f81ce308a927651d791c2c3e5f32c103e90fd61fd58d3c2","impliedFormat":99},{"version":"46f6e8a12611611d782904154ebda6e4b6596cd026b7c09e2c145e418fc8a2b0","impliedFormat":99},{"version":"a4560c1de64d671a8d837a6f0313669a7aac4ad7d0efa2be1dfba29f8d61c5f9","impliedFormat":99},{"version":"f193467f1cad8f2384912bbadceea4cdece962b9033488994a7405c29a623d8c","impliedFormat":99},{"version":"a846eff5c1eccb86a3ccda935896a80eaa2beab68c64e68c244908c86ed87906","impliedFormat":99},{"version":"a97588cd01375653ed51d1dd9bdfbd30467b130ad60bb5b6f981ab2170feed3d","impliedFormat":99},{"version":"584115df5500463c3fb9102a3a74bb4cc6a75a9bf6300701e1edf81da292ae57","impliedFormat":99},{"version":"4428ab19274a44693215f4f4195800c8221e1ac8a5a388ea534c4e405fac5f25","impliedFormat":99},{"version":"5ea28a5de3f28607387d210754f9d62d2cacc86684e89df9e74d412bac974348","impliedFormat":99},{"version":"a496ace7d44a315f014ae2711927ff48fd4e3583f4a1e42df356c37b2c890ba5","impliedFormat":99},{"version":"814ac5e9d9bc60c105e022e08d3a7590a5a76c93fce1572bdcc574f25e6dd68d","impliedFormat":99},{"version":"3eaaf422f4a8fd066e5c0717382129da90b5699a86f3326057a2ff4abee0c40a","impliedFormat":99},{"version":"8ec41716dce70226a7069735300ac20691513226c614b03b1b1aa7bf4ba3b2df","impliedFormat":99},{"version":"1ce271cba70878af1e987d3a93fa539c9e35facd9b70580f738242059416c010","impliedFormat":99},{"version":"9be30526f3d636f4b421d3e06983744be0b4fe245025887ba5a032cac68c2e37","impliedFormat":99},{"version":"990e4693b03502adc4038f04ec6a3db2458fa1a998edb9edac75141fe6e8f9d4","impliedFormat":99},{"version":"59507e67ece04e5a994907e68042d704641ae844108f8af9edd82350fc52dc02","impliedFormat":99},{"version":"a36d1226856f16d243adff16b2f5603ea245f505af5a85d5485ab275ca946b1d","impliedFormat":99},{"version":"0baefe65a675b833470b248451ae56f35697581018bdcd2880e4031cdc0cd6e0","impliedFormat":99},{"version":"2ab5a9dab4e1c3780ee8c7ba280aceae11c699371178c253cf5a36341a864af2","impliedFormat":99},{"version":"a80518638f84ea8a15c155eb5841341688ec6dc8a04c5693281632dfe555c3ef","impliedFormat":99},{"version":"27ba80c04731d0ea2f37d6b6f5020e45e60396f5c2f4666e57b03238ef0a676c","impliedFormat":99},{"version":"26ad6385782d8b51674e22f236866e7e08119f50a131cf5a091c8c576202f9e6","impliedFormat":99},{"version":"b8ebaa198a03eea15385326815ff31a01cb63c08bf69517e3ba4e1c8296fd14a","impliedFormat":99},{"version":"42e3bbbb7255cc27270fa12d31aca9f11abb56e985d30c1bde3f978dc01d15b5","impliedFormat":99},{"version":"5cd09527c5bd0e6a9df18ee2a8ca39e1a1af60658e50adfa3b2155c09f731a13","impliedFormat":99},{"version":"1e470d86477091005bc41203654b0f310ca7d45bc0c7952f8f93edc6d0613397","impliedFormat":99},{"version":"d09c441b12602fffde7cc009f9e815eda2e8c85a7ae1fb9dc9add975a935a4f8","impliedFormat":99},{"version":"f3590539d69e5d3c824a3dbb93015c58fdc8d6b90abe7496c770a32f20c559e6","impliedFormat":99},{"version":"4fae33c695361a6438082ebde9374a3779df07ea561b1ce08ae4f514bc6520f5","impliedFormat":99},{"version":"88a1b15f496a6c998663e6486b78ebba1c2abda9e220fd8e377c11dff3e4e836","impliedFormat":99},{"version":"654c457deece232e59f6d73733254cb78bf6b043d9d3c43abf0fcccdb245838f","impliedFormat":99},{"version":"45a99b02acd1f5580b93e48b5c610a60ebbbcb075928cf80cdc9316cce1bf840","impliedFormat":99},{"version":"ddad6719d075ea89cf7434c7a318b69d9bf26c330465ad1315c8ac4d059f7270","impliedFormat":99},{"version":"8c867515406eda8230bc6c852eff20073178ceb2ce94d6b9d0f5678ed13c0b8a","impliedFormat":99},{"version":"b430de30fb510ddbcead861351793cc62ea9d97ca3093dd202d349ee96ced493","impliedFormat":99},{"version":"f4080510cd7e9c65ceccc843f98f68a31fa74443ab7154515308c104c8433a14","impliedFormat":99},{"version":"535919c7119b5e3da3211594c3542946e1b9e5102d78614359cc5d90a78c6a06","impliedFormat":99},{"version":"ef7e1df5f97be321ccccbc8d0cad38c301bf55be0e5528d20d4e4479ec7021ad","impliedFormat":99},{"version":"994bb550d4082528038ce02c9c9e63ea278a31094dd526d91e559990b3ad17cb","impliedFormat":99},{"version":"df03f5b8e177d1c904928545a74d3831c90bbf653fbfdc29241b3ae20a5be486","impliedFormat":99},{"version":"a7d3f59a29ca31f40ea37349c44a7441eb10f1bed068a011760f1204dadd7a23","impliedFormat":99},{"version":"1e7d696c473c1e054caf2a8cd2759d09f442fac69473293ab665d6f8c714b774","impliedFormat":99},{"version":"df9f8f3d97d404cc47e4407b1a5c21c223b30fb6f1f74af05da01effa0cb56d5","impliedFormat":99},{"version":"5e923de3cf0d71e5d9a5ad4e90d4643490c5ac5b3f58ae66bb95f21dc04d6831","impliedFormat":99},{"version":"b486e2e5a4b514d179bb1503178694bf9560ef6b7660a027328b9eed5e73a627","impliedFormat":99},{"version":"d53dfd573a2464c977c298816c36231a62ae3dc27553e27a3c71f6665b269baa","impliedFormat":99},{"version":"6fd3ac9e256753431d1dda6b26de5e0822aa85eec20bc6c14436a177f4279be8","impliedFormat":99},{"version":"a6817b104cff6630183738048e9e2e5ab6c5bbed9d46bb528f80258b0c4ff757","impliedFormat":99},{"version":"40319f136f28e2db970e46b7e72b7bfd5a772a0df98eec5405c47bd6c9917c9f","impliedFormat":99},{"version":"21baccbad8315ef36c9d7f50048abd08ba81a3afa0712ef258fa6c061110e0e6","impliedFormat":99},{"version":"a4705cf973f4d37ce92c052828e2513fa023ccb452f94544931ba2f917b95f56","impliedFormat":99},{"version":"02cb56c5871a710fbb3f0080324577411609df19bc17200156e46a44fdf8d27a","impliedFormat":99},{"version":"57dba29ff984d0c81bb177bdfa07ab0e57dda6dcaea83067ad911eda34caf8b4","impliedFormat":99},{"version":"e576d9071ca12c411674ca573eb789590fb5604ae8037a2572886cfc293282d3","impliedFormat":99},{"version":"4d818da244b409a389c73e3eb75824fc0381b6e16ddaf80a8d15870c597a0195","impliedFormat":99},{"version":"f66b41b72c893a7d90bb8c6399a737e3965292488394040e509496a366edd1a4","impliedFormat":99},{"version":"e1b15aaae981aabbe7a8df2826f4c6f31aa0afdde1e23d15434e2b221a851887","impliedFormat":99},{"version":"10e6b4bb2c98b99ad66f1be41b2597076ada2dca513547292346b211caa31f4f","impliedFormat":99},{"version":"93abea381fd60a80fd3fa282b931d3522bd1e4caabd7dba49152f8f365106d82","impliedFormat":99},{"version":"b771ec60b06611363dd783f8e323f87d9c9432aca465f3cd3d39a6a4bcd79ade","impliedFormat":99},{"version":"baee3182e5624f4bbe9bbdb3512544bd77d07a08e803f36b898c292cc4650de6","impliedFormat":99},{"version":"028de137173a15dd541f16c8fe03c3da3f11a27d0fa1c58c336be102c440db89","impliedFormat":99},{"version":"be06143be469d3d0d5ce6a2ef95e368ae8454bd498d0c0b0be43aa4a6ecc88de","impliedFormat":99},{"version":"6b39082cbf46f9c0e56e73efefea459d85e9431ada4122755e51c4fdb35688cd","impliedFormat":99},{"version":"35ffeb76a74f42b609dba599cc110ff974c04d7382fc86d903fb5eb08787cab2","impliedFormat":99},{"version":"71ebf7cfd3b6d1e628450c875307a3c2b69aa9e94687237bb775a57f25cf1361","impliedFormat":99},{"version":"c0bb78950621e72b06d7e288280b6109885c5f7be8b583659d65e49d9af011fc","impliedFormat":99},{"version":"c6fea1f34d6a312a51ead56d2d9dd487cfe2ed243885b2da89cf51c1f4a3d811","impliedFormat":99},{"version":"9789a429c5349144946f1aeb7578a9cf517555e7bd2a5f8fa6889e8d58a8847f","impliedFormat":99},{"version":"e8388203c62a6cc3e00a4497fdf292b96954c99aed9621197aa7ad3a9845e3b8","impliedFormat":99},{"version":"0e7e5b08261dfe5ccdc9d9cf8b2aea22fa5345f96c317f03f5a0977acbb99e32","impliedFormat":99},{"version":"db4157be7d269a6daab5481918c15fbb5136765c3b8bb49489d3ee9626491b4c","impliedFormat":99},{"version":"b3fbadc1bc66794f535b892f5523ff3ae360d65ad72806bd24ef4602ba81c2f6","impliedFormat":99},{"version":"1f24cff6fb79847abba14795c5778f4cb1f137efb4e353e0a3fb1945e725290a","impliedFormat":99},{"version":"1056e3bf6369fe009b40647744c8402df6d0ba1f2d3a462a2aeffc0c83027934","impliedFormat":99},{"version":"b0da0c17082d1fcd42ba9a147e0002ce2f8e7fe8d7d1e2e9810b14331ca10cf7","impliedFormat":99},{"version":"f8a0dada5366f74f29291c9e6eeea48d81bf3b6dd7fed6aba386e60ecfaf2057","impliedFormat":99},{"version":"c8e93478ba85d6a953b7950a530a3228fd2b0663e76a42551fcf29599e5ae269","impliedFormat":99},{"version":"4e4a901be180e8174ebd0115037bee49eb8d0a5123e81f3a57b1b230f2fd7bb0","impliedFormat":99},{"version":"f4fe5a6412f5c4c2ce54119325f77804a5ff523d5e5d935e8a3c34c2d55e3a6f","impliedFormat":99},{"version":"da16b5d7e423e5e0096fce83b5703fd052ecadbd39573985baeae406a3ff406f","impliedFormat":99},{"version":"fd214d4558f949dc7cd55d2657db975a9272ad99a0a02f31af2100df72b0099f","impliedFormat":99},{"version":"ed2438ea4315e3db2767e79082e0066845c46ba040724ecb49b82d0597057987","impliedFormat":99},{"version":"e086358dcd0e44204dd616f050029b80e85d3df4e454d772ffc1580d2c42205c","impliedFormat":99},{"version":"b992f4b97e7284088fe8cd40efae6ceac1271fb8644173ff6015fd970d916818","impliedFormat":99},{"version":"cdcd99a7a4fcb0aa03586e374cc03c29edf192d79210d46ef2bd97a4e2ef6bcd","impliedFormat":99},{"version":"dd1a8059730f96916cceb5d6c734f59239cdc7aa6f5b0ee70fddbdcde89b1da8","impliedFormat":99},{"version":"82d3606bbaa51acea77cdfdc2e3199c4686ec2c6f71927972ea30ad6fc7b4a62","impliedFormat":99},{"version":"7588bf02783961f2b6871ecc6e9c60363ac79a0ea63ddfe4fffdbdf98a628a8b","impliedFormat":99},{"version":"f4ec160ed91e9bc5654099b8c9fa3c549e731c7a3f0de8d2cf14982dd126d1eb","impliedFormat":99},{"version":"330874360097f09e8cc4ab9c19d0c29ceb099ae500ab5d6461c9297b8c3cf0f7","impliedFormat":99},{"version":"1c4da43c55f396f8fba432a8827eee9fac8acf6c1494a57ef48177b57795abe0","impliedFormat":99},{"version":"1ce9891c6838a553f39b2ddc6f83075f3850a512475af31beef974f6f7cb292e","impliedFormat":99},{"version":"7911c13a1992969635e30dbc94eee146269dcfdd3e07e0e265daf5caadbd5f0a","impliedFormat":99},{"version":"6701c151b37be87bf02126312f18e65b3d91a2c20a7377833d33d919fd6df9c6","impliedFormat":99},{"version":"2a2283d33979c27b027ebc07e65a8f09d2f307f7a9efd1e07f0b29d88f787aa9","impliedFormat":99},{"version":"3c97002cb68bd560118a6c8cbba6ff2509bd73d87dd713edb3acd83e66bf4e35","impliedFormat":99},{"version":"664417e248d43d27f8a04b9ae5e1f3ddeab5aa6d9b41284ffd366705f18f4885","impliedFormat":99},{"version":"019210cf7ccaf627a430edae894d25b312db658fc0f2c282c36d04920b3f5ae1","impliedFormat":99},{"version":"a2ffa2e737e5b56c638654d4cf91fa6724b1b95c7be50a82b7478dea04ea8a7d","impliedFormat":99},{"version":"09abbe2cca1bd3d538def48c19a2fe62293bdf1f97504a52e26d40a3898144c3","impliedFormat":99},{"version":"3649547b460e5c107b12f6f29be60d9a81a59fb3034ef197979a694c687e77f1","impliedFormat":99},{"version":"f15d3906d25d611062b5c89d3145dd4a2ac60bf68f6f5e7f4d48d1189e474f46","impliedFormat":99},{"version":"6661f2e5e07a92e4267191cc689ad3930ebcc316cf44221ae8eb951e3d4612de","impliedFormat":99},{"version":"076c0467d216ed21904db5ac256da6a4fc1115cb870857be9905446da9e81341","impliedFormat":99},{"version":"1f659ae61eb9ef9148eafa4ec4171525da55c35a298b720f215ab0a89c045b8e","impliedFormat":99},{"version":"91753dc66ca2ba7e922513c6d73c9dbd3d6336ae1ba310e2d0520c99b93b99cf","impliedFormat":99},{"version":"ba087ea4f7c6bd22a19cb28e433a592ade91ebdfaf0d37f053051b81b3fd194c","impliedFormat":99},{"version":"490f6527eb1504768f00b4026ece4d21edd1949d5eca11bb76132330b5a8a55c","impliedFormat":99},{"version":"30c18c79997adc72842a146fef84249191bd8ee28f3456605c014b1e316dd7b3","impliedFormat":99},{"version":"fbd2d2f4374aad855367713ffce22d19c87e9483da420533084c0c734df1523b","impliedFormat":99},{"version":"b0e8320ce37a2a4f1cabd3d9c3e7c72065b847fba43562fa7680e436bdebea3e","impliedFormat":99},{"version":"9a6cd826888b63061bda7c34e6bdb871e7c0b01c344f15fcc3330cf5c0f99594","impliedFormat":99},{"version":"36101c7781871da39fcd8939e8faf083c606a896553fdcd7eb4b2f7c6ec47a43","impliedFormat":99},{"version":"ec266fef2d1fe9b7c49ae608b3ac60c4713d8d1cd2073c92f5db1a73a39556cd","impliedFormat":99},{"version":"34bc73c461e18692931c22a7afb38d308f7deaad9f21de13ea54dba0ca4336fd","impliedFormat":99},{"version":"574f30981211d1f1fdce83fad7c9b093ce986124480ce09ca871633ba6a17489","impliedFormat":99},{"version":"2083cc805a15babbf2d0abdf9d702fa6f75711590bae3fceb699ac26a4c76621","impliedFormat":99},{"version":"c51825d37dab66cb975c5442706fe6451b9213e098e3ff5f846e5a77539a7421","impliedFormat":99},{"version":"9068ab90549e1a5c0f165b9798650d60bd38e7f8615c05862edcc7d6dd10d5df","impliedFormat":99},{"version":"9def60b8c5edd45e81d01f89c7717c92584cb821b0fb14fbd025aa10b0ab3bf2","impliedFormat":99},{"version":"c7a0c488560b1dc8baa8c7f399cc474a221f7cc7b7380d0fe6014cb35f807840","impliedFormat":99},{"version":"81393d54e070aa48685972683871a707f160f408622954ede5d2a2f34ad332df","impliedFormat":99},{"version":"238e9e20c91fc4ccc94d52291ecef44762188d515f649095ed0ac99d59ff4fc4","impliedFormat":99},{"version":"77da76559d39664d9f60942ae9c12082b4fe475a67773bdae73073fd11b3888d","impliedFormat":99},{"version":"cf1189bc5bf2286b630f33be24872477888ba5d270b763e8f240a20e0fc5957d","impliedFormat":99},{"version":"f8081297cbe7510cabcd2142cc09294c076194a782ea5422c1fa5aa02bb662b6","impliedFormat":99},{"version":"1426f595ea21e6da826b69bd69c046e7443a77bf7a4434a9183297f46aabe509","impliedFormat":99},{"version":"79a74245aa7b853b8b5b0c249243529340426691807c11697106ed49d8c96381","impliedFormat":99},{"version":"e849d81b6db10ba5f8b89b25ebe91fbc005fb531b8cb417b6dda49b5263bf485","impliedFormat":99},{"version":"b19fe3a95a628557bca5b5ba33377870602b9c24bfb4eef0085fa0f04bd8f7cb","impliedFormat":99},{"version":"ebc64c6ca9a2f7942c0aaa51bac5d44d5d714e562693415a158dd409c2959de4","impliedFormat":99},{"version":"fdc0a465ffda280fc5c52ef5862816082f737f07f24086d1899b3b90ee03581a","impliedFormat":99},{"version":"e15e7ff9e28153e0c1c0589f35d82929e7918cbd60436c837c5604288f1572aa","impliedFormat":99},{"version":"1466a57f95e268e08d94cf92a030e469d4e6f8c180951d9c0fa453ab0a38e1da","impliedFormat":99},{"version":"d234d63170c7f6c82460feb9e8e7df14e38a694e90bb780f5054081847e8a971","impliedFormat":99},{"version":"5a353f55cd755eacd87196e6d14e8e8cfaaed147b08b19fe7e8721e3cff7e4e6","impliedFormat":99},{"version":"ef65b08cb958fa2bd14dac358334d8f500a3583fdb0f5d0d36eff66c6d2926b2","impliedFormat":99},{"version":"bc23a8c1d5732b76eee7581bb2757a98cf02048426f3a6f94632ad25547848a7","impliedFormat":99},{"version":"37820ebe50ca6e567034fba5022c1b2b35fc2dd748ffdab1f6a267696e041729","impliedFormat":99},{"version":"b7f56968a5aca1b41d82fd99d0859c366bb1e24c21610573ac69717c6c69cfcf","impliedFormat":99},{"version":"90889a47a83550ef4d6bb79f61a46f790318a5810874848df91ab1ce83bfa5e1","impliedFormat":99},{"version":"09ac02d7d979b4bfdd333f1133c60731f8e02f77ede93a58eee7c2e2894f8ed0","impliedFormat":99},{"version":"3a9e9b5c7ccef9aa106e8d38d624fc1ef7b61023f1cc99e49e0d34d806717aa2","impliedFormat":99},{"version":"280ca67f0276359a04f91526e7904723c634b8307f36e88b8ed1d55174d65646","impliedFormat":99},{"version":"56380192c5502ce3cbdaab811c03293ae0a3477dfec5ad999e0561c7a55cc049","impliedFormat":99},{"version":"a75dbe057fa7121e02effb45fab47e3c12d43063707c633be18c92b0a863a37f","impliedFormat":99},{"version":"813ecfd69412e80b3dd7bbf45217ed1f76d70a939457bc4213a38db216bb6e4c","impliedFormat":99},{"version":"8f4accfb1ff30808a2aec06f15c493e88683a576c5ef4871388ce7cf0dc80da8","impliedFormat":99},{"version":"1cfb8467bd39e186a94ead6da6a9549de18583c998a3d6ca7a7bf92922b7cfe5","impliedFormat":99},{"version":"095a8f6c16d323c4f1899434f895179bf3a318302fbbde8e25a0caed37832c41","impliedFormat":99},{"version":"e68ac7298d9feab31b040212b8c81d47146c89e2f0b044078413ab84dfabe024","impliedFormat":99},{"version":"669aa01bd96f92b0fa1f9f5dfdd7b974b8823e876d690d2aec1c480b70d2d178","impliedFormat":99},{"version":"1ad942280beb8fd7cb99508d5ec9ba3c0034523bd9ac8cb6059cbe9545194977","impliedFormat":99},{"version":"4429304845afb8cb868836562673380e3926380bd4600fa7a0a3ca8ef546cb7b","impliedFormat":99},{"version":"55d10877f0755054ab010faa6273fd064165339b9ff24e9f26a9a57b68a24c3e","impliedFormat":99},{"version":"510ec596cd8c9dc087ba99465428d24b027f504df7d399d97fc971d0aeb961c8","impliedFormat":99},{"version":"59cd0cdf1fa93bed733d6d84b0d5147501d87bfae8ce4668b4b093c22e16c563","impliedFormat":99},{"version":"854a4ed2d2ce9680a275cefab3ff654fd76627503ee311d19c0e2a25069627f8","impliedFormat":99},{"version":"edc84564b1feb469da3da5b7e1efcd6f48fa2e04f006f07aeef4c6a5659c03e0","impliedFormat":99},{"version":"b076daa179dc64180ee9538fafa4fa6e5796a3a81539eb3349737ed08d57e2c6","impliedFormat":99},{"version":"80c166471e9529f02214e75d8bb590870f822fba82a3f32cae59795e26d660a0","impliedFormat":99},{"version":"25aa189f1265f4674b7fcaa43004d7c7cbc46b6e1f3460fc413f3cac61c77da1","impliedFormat":99},{"version":"97b2bc30456543136698a248328f804aeeae10ff3211f5368e96bb9ddf532272","impliedFormat":99},{"version":"c9f27874d3107b39c845a4380551ffcdd721246db1c82bcf43cad86d66ea1249","impliedFormat":99},{"version":"451418c8195f8533477ee9f08c4642f7a8ffc9813d73a747d77fa70eeb66a79b","impliedFormat":99},{"version":"e768ad0e15d014a0a09e47dfb4c3d6c9d5247b186ec2887f07e984eceeeadeed","impliedFormat":99},{"version":"77d3636c84e22e5692cea961ba0957d687aecd776ca48cfa5f1c38f3fef6ce26","impliedFormat":99},{"version":"119c30d96ef567d5eb44ecf9caeeccdfe4b4af9321fe687d10b238f64a1f16c7","impliedFormat":99},{"version":"a4191368ca3082ba97bc919f8de837e29cedd508f11c20d559421ed90f5648c3","impliedFormat":99},{"version":"7424fdb26b9156029a3d0282191a16576bb1656f7e77c1da961b9e44e9fb502f","impliedFormat":99},{"version":"94e8a85d1d6ca2a4fe056f231dca96691acbefb9b0273ee551109bf69ce53f11","impliedFormat":99},{"version":"b78d4a5e2cbc7f6b244155da9fbd30d6016d225739abe750b47d443ad0057289","impliedFormat":99},{"version":"289db195422725ce6e021fcd4ef250c4702248355515ca1648227723a98d618c","impliedFormat":99},{"version":"41f3b546b4f1810ad4ae11e8a32664e70ec2b118d72e7d6cf04c85ae29d8a43a","impliedFormat":99},{"version":"ede452edea60a6ba0214f4201f5b959d57e7c26a743a5936a05f182a4bc55930","impliedFormat":99},{"version":"0a52552297c1d0af3470ecaa85e504b3f87af7fb327da36b5ef63ba06f135e20","impliedFormat":99},{"version":"ea7dbb28b1ebb092c8f974336a33caee5b29145b699ac1e8ce765979790bbb35","impliedFormat":99},{"version":"acc64e8177b7e4fe1a2545bbdf2875a89852ca5b042471fb05901c5e2a6d8fca","impliedFormat":99},{"version":"eea6ac739630bfb73b2e59bdd90d6f278a7ef0228f09525fd6adaf09d90f7280","impliedFormat":99},{"version":"d60137c38ec70f4d3495e2cf71ed73bf75f405f78c5c8644165bdfb0d9eef528","impliedFormat":99},{"version":"b437a4e1ad5b26d9c0d740ce71f956181c74bb283abb0d2510360ff065b0ff3c","impliedFormat":99},{"version":"7639369a2b3ad9cb82a464144871c8f90990443f92320c1fd3fd777c2ff5bdc3","impliedFormat":99},{"version":"c058887683e283e99658518eafc8ec08754f5b16792662b09a638d5a317a7719","impliedFormat":99},{"version":"1dee7843ead6b1135839649de81ec125fa95b5c7c80c52b8a08d8fb7c40ece9e","impliedFormat":99},{"version":"e3d7986bd6b3e8949cf921f9a50fd955da64d399dbd817f5394f772f7d52b6d6","impliedFormat":99},{"version":"4115d25268a762ed4b047dd9d5e29f46687ba84049cff9fb4c68b18d60e910d9","impliedFormat":99},{"version":"1ed9ce51e9bcac81f9d2c4d27ac2704c0a2267917fbd3dc6d207413cd7a6b272","impliedFormat":99},{"version":"f13cd5883699bdc863db77c15ba94050548e23e98fa5a5b26455fa105fd15549","impliedFormat":99},{"version":"008f7e03cecd8c3a12015053fb8714b8d738d35a35ed1bfe4c4b02be0116b89e","impliedFormat":99},{"version":"d86f6bbbc83f4d8944ffba72ebf5b486afa462fd26b9e04fbb199b4d2dd920c2","impliedFormat":99},{"version":"4bd9c7cecc7b653a34f633729cc1a5a954f95320f2dae63c48e8416a625b36de","impliedFormat":99},{"version":"765f3ebb07e1f7568ef6ca14d2e7f80900ac5dbab6dd25872f16e23fe5ef4d34","impliedFormat":99},{"version":"6cc361c360c6fe2723b28810e8725b894d9c88e4c4cbc197a8a6ae304452ceb1","impliedFormat":99},{"version":"386d783e5c235fc03eb9d3be33a41ed3a3744708c6f184fe9618a25b6caf9a58","impliedFormat":99},{"version":"fae4c4fcfb20aa2860f880aa7807d8d8102abda026c539c261e4da53997d9659","impliedFormat":99},{"version":"a4a256ff9f03798c49a001a0d4bc708e96a20be188d80d3f4d6f45e1d2480b91","impliedFormat":99},{"version":"80cc57ed8b2f7b94ac5d6b61ffa975eac13e39cc55ed9d32f2a4c03b07c9ce2c","impliedFormat":99},{"version":"6a1c4cb49ef0a86d4985496e9250de9fb38f286fa7bba5c2556855398e24d98c","impliedFormat":99},{"version":"94613cc30b4c60bc7b5e41f0014f5afc1f70238a9f3112400e2ed802b9edc2e5","impliedFormat":99},{"version":"81b5b7d4670aab0d1999b8480d483e3b0d12a8ef6a47238737bdbca5cc5b3af4","impliedFormat":99},{"version":"0a75c44f704965ede175c60995e6ef37943ace985c82b37ec004a02a23d6f54f","impliedFormat":99},{"version":"dc6fb79c45f464f758e0e2b6a09c34e0e88c980e3573c04333639d1061479dff","impliedFormat":99},{"version":"1d49ef9a4c8784be6dd7d91afb621b78c0fc8017769b9dd846ca63232e905467","impliedFormat":99},{"version":"db18fc8ed779ede2de97ba0e9bc61d13d1e971711bb85fa085d2be02376203dc","impliedFormat":99},{"version":"d92de62f96a0cf43b1625552f278468e06061453105a5b60ff78c6f09c30ad8b","impliedFormat":99},{"version":"4a0b017378d2a33ab5c70d2d885b9db3c10846e1f0f9b685e3be5edb59ea3eac","impliedFormat":99},{"version":"1296c3ac64a45bb17d8c90629bd2241c5942ec6ec51a4013ba540f2aab85eb07","impliedFormat":99},{"version":"7ace98c6830758e1f8e22def1defa1b77ccdebfd07d3508a1fc455cf098a62a8","impliedFormat":99},{"version":"e7f716b3a0ff08e8d289109d49b76e90644247d65a80cbaae2f476d3ca954bf3","impliedFormat":99},{"version":"5f5f47b68b781eb477da7e844badb481b34489a6e8686c1ba155bbcf2e7a133b","impliedFormat":99},{"version":"d863e0158ab6d1a5e8f315f879c255c7c64a4e45e5a980c2739c73c8ef9b1813","impliedFormat":99},{"version":"bffcf294ab82808982b50b77c7ed624a48b51b362e5108c98e3dacdd6b96605f","impliedFormat":99},{"version":"9ead7db9d2f12cb8ba534475698fa8d5cf6422e6ea0e77584b31e59ecf25eb63","impliedFormat":99},{"version":"1e2c2fc640fe117bc83f6320e5fd181f6e51a86a7eee232d510ed0c8b2909091","impliedFormat":99},{"version":"fe6441d144419863eae6218ec1ab1fb52af6c4f2f2c9993980038501ddb392e7","impliedFormat":99},{"version":"f928aeb71d76a99ebad7fc109e96135e497989ddb0c0ee16465e35de24f0cfc1","impliedFormat":99},{"version":"c883c7b209cf3e51a693023de37186e199d7e2342cd41f1f0b8ab9ca34851cf6","impliedFormat":99},{"version":"0fbe381899728959b9f565371a95921f76e4255dc9813ca95a423c7a81cf157b","impliedFormat":99},{"version":"b1dffe769906190c61aa2de29ba423c0d9764f05aea7ebbeea97f8323f6bab95","impliedFormat":99},{"version":"5f697a3ca1e2ce84e63f5c6fefd55ee00f4608a450aa765c923abc907f0032fb","impliedFormat":99},{"version":"6c8bedda58d1dcd5cade3495643fd5a1d1e6af75f50b961922b4214003c34daf","impliedFormat":99},{"version":"3d8ca129295708074c35d06f4e9b40e11e9ef3233df0dca6ae1aae5007bc1235","impliedFormat":99},{"version":"310790a0b20dca6d4fa1884837f48775ac1a7b711dab75bb25e203544c82a46f","impliedFormat":99},{"version":"03889f2863e44d756e96e03ec365dc1a299653897025ea1ded75e99f4183026d","impliedFormat":99},{"version":"66d50cba2ce96e5ff08affeb25d1ac3e6206887585a650ebf6cd712935c7bdfb","impliedFormat":99},{"version":"f72510666ed2d0ac50c3999c90e6a628ccfddeb123783759aedf8b64afc472c7","impliedFormat":99},{"version":"82d2796cae92487b15c2ce8bbc220d9d6ce8e6dbbe521b08f1d52eeddd83627d","impliedFormat":99},{"version":"66b417c8ef1aad8f6f4c2185673d0a3702aae2bee03885edd91a8df598d087ce","impliedFormat":99},{"version":"a7b40cfee10f0cde9d2d0d368e143a879af2fb8eda8dd86d722010b37d67fc22","impliedFormat":99},{"version":"584c9a3408fa4608c3f267c88f9942b23f3ff65a14daadf3eb1d24e1109a34e7","impliedFormat":99},{"version":"3933b9179508da74e2466ed5af41790695e53bef479533eef408ab34c08c3805","impliedFormat":99},{"version":"50aa52ceb6b51e337f65deb87aa418a7c24794fc0f9eabe41357461fa3106dd5","impliedFormat":99},{"version":"f6867a201454c8b60a78672c53367fa9dbc1aba247db27156c3e5a2fb3cbfb55","impliedFormat":99},{"version":"2bb7ed42f0bb306c77fa17ee006759f2f3cc6b6817fc4337d729ce010e7f8fa9","impliedFormat":99},{"version":"05c7c9e1d12cf2e7ec37dd86fcca61e4b1b4a2fff3fdf3648ac7210b5c09d944","impliedFormat":99},{"version":"8acc21ead62f0be0b6f6415e6dcf89ca2089d262a5d9da84f4688c9a37a9397b","impliedFormat":99},{"version":"e6b5b68af5046e3d64bbff45d3b41e0fa5da06f85efda33a07aef32c2fa4b54e","impliedFormat":99},{"version":"bb3b6049fb550829d304ff7024150cd4acf3650c11d9230e52d194caab19393b","impliedFormat":99},{"version":"bb119081db62488bf65a9563919a80d270201a1aca45d8ebd25a6eda85af1b78","impliedFormat":99},{"version":"abb85df073721c70450b1af3713cef5ab1025a36cc1566c31cf39475c512e842","impliedFormat":99},{"version":"8407d00275c737789e3e526a2f63542d43240d39cc813e0f391d0791e796751e","impliedFormat":99},{"version":"678b7873a38230d98a4ef8879f1b84b658b01506519e05a0291e887b914a4924","impliedFormat":99},{"version":"f474bc9e506a7690f97b073c4c93f16a67fe1859a7610cb08b54513b62f076e9","impliedFormat":99},{"version":"ce2b604e7fedfa087e8fc68f7d850a2208f2b0e5393db59a4fc7e21ebf04fa60","impliedFormat":99},{"version":"286b74c5381464962234a6e6fb7e41b56434a0466c0b8072f7762d102941e4e8","impliedFormat":99},{"version":"781a8c3f0fd5a7bb5c73ef1a804a09167ee6e72031be68af06d09a85d38003e5","impliedFormat":99},{"version":"d514bd8b93d377b46f889857af29d5a56246697136b3640514b376e15c88d9d5","impliedFormat":99},{"version":"e8e5d7cd52764357a339835c34327ebb8634c5cb932d2709f93c152f2abc3129","impliedFormat":99},{"version":"79583eda9e4c9b3807c71fac738a25625b11fa7ed587b2d1b5be69341219365d","impliedFormat":99},{"version":"e839194cdc481038bd67ed3c1566f5d29390c2af98f6b580115e7515ff3120e0","impliedFormat":99},{"version":"f347639fa958762371b8408e36bb5342a58affa28768131a834797c2a9ed07ad","impliedFormat":99},{"version":"053994ec3f7884ddb63bec643bf2276a4da93210bd12926ce4ea51cdd2f1af00","impliedFormat":99},{"version":"38bcc4a561e59c0a0e6304fcf9ed28df9a18471a06f7d25d4d839aa0f273b4e3","impliedFormat":99},{"version":"fa83e95a170c109f9e52f892a28a59973a8454979a2cc4161c765173e67f86ab","impliedFormat":99},{"version":"08a5be336a00293970580fdaf71e1197054ef2c9cd87769b19f7461cb3c617a5","impliedFormat":99},{"version":"ce1ec8f1a46ac13b31b36828b903ddc8b5f0a4f1cd59d6a1b122221fd0da4164","impliedFormat":99},{"version":"361fdf24d40b6d7f3250dac622b9d37becb257e4f855f85f0a30dd6558d50e99","impliedFormat":99},{"version":"1758b1f8898f121a176226b62e39461eef854bd33ed0552991c64cfcfd237826","impliedFormat":99},{"version":"7ef114c434371bf0bb373d8afb5e7cfdc5e1b2678683b92b89588a359bc01d46","impliedFormat":99},{"version":"56ec6bb075d116568daeb44a00ad710e9645b9e383fb61d83078a9e0d59ddac2","impliedFormat":99},{"version":"4d62e78223979185bf0fcea9a50e9eeb81e20e4df1f924511efaba42333d39da","impliedFormat":99},{"version":"170475025a9322720723114bb937bfacc4e5096666073e99d7f1df897cfaa46f","impliedFormat":99},{"version":"9dc2f4660f991088c1df79af054f451e7763b592b83911b2f55865282e5ffeea","impliedFormat":99},{"version":"3efbb5dbfabf41264c36e3e8c154ca2ec5a28dbc3dae87eb299ce826cec00eb5","impliedFormat":99},{"version":"ce0d485a733403bf3c9a552234e183b2f6b4f2a9f392ce8593ee52d09a7b4227","impliedFormat":99},{"version":"21d7d9fe27f34102a480656861392bd4fd37ca27837f9dca3542854bab35ed92","impliedFormat":99},{"version":"c0561d3440cc84a4e1a289b392dbde82e307d89eea71449c3a41b609daa9715a","impliedFormat":99},{"version":"ba519b143a14fee5242e9e8e549c5944bc6e6361af1162363c8336bb83289708","impliedFormat":99},{"version":"ddba8d73eee6f39c8a1458c244b9bf5cc54749f9d96b3e4c020bc27587afc05a","impliedFormat":99},{"version":"abf16ed784c74fd46c656cac5f5f7128a8fc9ce72bde1377d83333b32e160824","impliedFormat":99},{"version":"297f7c98f8447d6d8171c2c830a5769ac5d815ffb1a41b31ceba551b1869f91d","impliedFormat":99},{"version":"73bbe80f02235433340e10426a1a30e4862f302d8a4773d391544c47f6c44a59","impliedFormat":99},{"version":"091f41ba847167078b84a31ad0ff781613e22926b1aeb2bb9c5a5b81829e950a","impliedFormat":99},{"version":"fd8c79b9432d4c75dc3a776ca5cfa6c0cb01579667604ab7d3b564adfe02a1cb","impliedFormat":99},{"version":"a474af2d3c46c4ffb9ac67c35794d3188c99d0a9e29ebb851c925e966376d867","impliedFormat":99},{"version":"43f3124b51d65427823ac7ac1a77ddcf9d1aaffcafa199307c8359f96579d956","impliedFormat":99},{"version":"8b5edc0c16524d7ce61e374614f7be58eaf72aa31779e7995d75a48d8d321153","impliedFormat":99},{"version":"833d94d5f9ba3c0a0e0a9d98c79f4ee0ee099ef6f1aa6c594f98e9a503eb20bd","impliedFormat":99},{"version":"1073447c7d241622e16b03261a5a35e1ab9511a726fe2e9d9472a98531e08ebe","impliedFormat":99},{"version":"678498cea62d90c7b6f6fe6d77d6913a498207292fc5ac085c3ca6673e1ac390","impliedFormat":99},{"version":"07ce6472819a84a9553d35477e08e843adc1c4e06f706c32aaa6bf660573abe8","impliedFormat":99},{"version":"b49acee84c7c1e58e404d674f3fe8a72a73bea8f21a3384739ffac376dbc4d9d","impliedFormat":99},{"version":"e05f80fd2fd9766d62e58ca19f342980594df24b67d046b2407bdbbc642c20fc","impliedFormat":99},{"version":"31150f240226c796b061e96be00586546e8691604f5e8e074b6eaa1cf7ccbda8","impliedFormat":99},{"version":"bc4051bf149154816a313aeaafccd606224c7dcb5797faaf1461c7eb7b9dd32a","impliedFormat":99},{"version":"8384d125cdbde45b18b143511eecb4cb1a630393b20e0f384da7ce53ad500200","impliedFormat":99},{"version":"bd1bf0a339f399d23c42b3c71077411fa0516521cf650f2a979b6b3ba1bd5776","impliedFormat":99},{"version":"7382c0c8f0db3389d4c2deb5555a6a13510cb2f3b1299a5be434c78959065adb","impliedFormat":99},{"version":"28d190c786629e69bd4663183c7f6cdc6f6d95661abb33c4acf8e864bb17d6c2","impliedFormat":99},{"version":"f7dc29a70b2c22eb0ee37c58fa13b92c56a03cb8d07e517e50745fb8f3180fd0","impliedFormat":99},{"version":"2f7ff4d8be24993c494c9174d6d0d567a2f777d47ae605bdcd1f369561d3b1b9","impliedFormat":99},{"version":"3c5011b14981547a762a9a4b23494d3bc56000e016c61cf288cc282cab4565a9","impliedFormat":99},{"version":"31d6f6e05ea3be94b6d0958fe20585c624e37139efb2714c6d4716ee2e83e39c","impliedFormat":99},{"version":"46380cbf7064fd9f0c68902243e97e6c50d044c1c2075c728f9ec710b3d4764a","impliedFormat":99},{"version":"ad56ff5c498ae19096bea2f2e48a483496a69e7f882378ec702d0dab3431adbc","impliedFormat":99},{"version":"33ac964aaec5d03a7f2bdf85235133d8f8a542ee8cd53cdb6370cf12a5fbca1d","impliedFormat":99},{"version":"cb525b94462aaffa1953f40ca64f30af02c056ddf190a005c9372140edfb1520","impliedFormat":99},{"version":"f9c4cad499989bc9e52fb20fb79ddf145e74f0bbf658c11e632ff27784df8d67","impliedFormat":99},{"version":"8b2416a382ec4e4d165f2eb918be0656e116328a89517376a344e155f1f20574","impliedFormat":99},{"version":"c2b0b8ab0839ebf444fb041be8baa98073cf24e7d34e9d7b025283bcc19e4f6f","impliedFormat":99},{"version":"6b83038103737e8a2a62c32a504cb51ec0ae8c290245392b1ed3ae6422dd92ad","impliedFormat":99},{"version":"b8c56895889493917c83e010b52a20503a577fb619bd2dbf93dfc96194d1507e","impliedFormat":99},{"version":"a346e366f5b0bc3b7ed1246b37970ed4cf285ae542a9322fa570461ecab1ce50","impliedFormat":99},{"version":"ac08e7ce22f77cb1c3e394319bf6c5e91765260cfc1592fe4ec98d7b6dfce063","impliedFormat":99},{"version":"936087f474e826b32d78e7207349207d340d684a888366348c4f21e588b80af1","impliedFormat":99},{"version":"7a62127857134b78a06fa3eaf7c5cb640aaeb4c5f68b286dde92530b0d91439a","impliedFormat":99},{"version":"d68366828b46684cdec1e5167d55a37eb12ba413a8dfa7a9f3bcba9b0eedda79","impliedFormat":99},{"version":"1e29f487dba82fe1e01581eaa5452778335c8e8035dc7bc897a08438349e015a","impliedFormat":99},{"version":"436e04e198949a9de4d12437e9a0e22a635cd572f6a1e7569c69367aebd564a1","impliedFormat":99},{"version":"2de8f43486975db9345e8671658af70b6732714b921338efeee75332fc9d2b9d","impliedFormat":99},{"version":"a6042f5361a7d639267a950bfe7b8071c8fac0a22c3460516aa57132e5e8d783","impliedFormat":99},{"version":"994706f0de0e7cdc500fe2df830df39e8673b95e21052b860833bafa47e3b3e9","impliedFormat":99},{"version":"eceeb11208e29be4ee959d8601d44a160e5891acfaa2890ad3381d9ca4552a3a","impliedFormat":99},{"version":"1d4ca5e0f18a48b4c9bb13d191acf780c72d6364f53bdd5cccaae3da8dc75ec9","impliedFormat":99},{"version":"9ce599bdf3ac0d33b85546886643ef3826894f290a8fdccc09f34673a773d585","impliedFormat":99},{"version":"1aded17d799608c0ba976d9c017b71b552428923ae175c4ce2d03c6c251fc293","impliedFormat":99},{"version":"110a028c72500ec8975f8fe8e9c58bc3c53ad1b8cecedfdcc9b13d01c82f9fc6","impliedFormat":99},{"version":"0f28079d1c3a5b121158ca2992b65c9b39ea578d10f9a660edf19f0a3df74d72","impliedFormat":99},{"version":"6c543b666c02de0cb90fba1b177ad2e0f38c024b2d35baf7866d88a772335013","impliedFormat":99},{"version":"22ec74740daba4895b82f71ee7a81e8d84ebf8ca87d750a9cb7eebfb53715cb5","impliedFormat":99},{"version":"a99162f184a2eacda687014590c6cdb127b309361ca893876df04e6f42899933","impliedFormat":99},{"version":"a2e7959cfc8d0b1e2a8fea12946fdcee9d3d39ec83f9f69fd4fd3019dd729b1c","impliedFormat":99},{"version":"f75cefd211302ed3f67f21cca8fcec37a261f61aa74c8506818a594d63987c50","impliedFormat":99},{"version":"0bc6eaa27ee3b289d58fd31f9597fb3786fc5109a6fd247f2d18025cd8bdbfdd","impliedFormat":99},{"version":"2c0c57f8d531e350d0bee50b45fd4979073ad3e6770fcc82ee5d9434d33f01be","impliedFormat":99},{"version":"657ac562004aa622ba5adf699048ec590ad1b4c0c47c77ad86b8d3f491c068ba","impliedFormat":99},{"version":"b95426b6a6ef360b38ca32ed9a16d827079eb9f9c2e018be263a6f9a6d4dc62e","impliedFormat":99},{"version":"9c7501860d6585a6fb5d1021c57a33bb953398da637c5dec0effcd7877a52bfd","impliedFormat":99},{"version":"618c2d571eeea05cb19350eb01fd25e3362faf19fba3465eda421d8ee393bdf3","impliedFormat":99},{"version":"55430d53d77e54aeb57496d12b469c03d1970776db91e2ffebb9746f67f49db3","impliedFormat":99},{"version":"7aeb98df985447d55fe2c79d236a8ac5d9298828f5f64eed23943e28c91aeb1c","impliedFormat":99},{"version":"724c015bd6ca5e48308f10bee2f034ab5e0a5b13452e36bf05fb5f455a1e9ef9","impliedFormat":99},{"version":"8637d71c11793ae5cdd3171517ab0453ddaa84a916f6069cc7d21756f01c9a13","impliedFormat":99},{"version":"7b564c8ffe25811dd0300e0fa16d9e1bdb57307300a569aa4442a39c794b38da","impliedFormat":99},{"version":"b9aca9e3eae5ace3397362e7093655ed2f2000a3299003a0be3ba63fcd8a1cf7","impliedFormat":99},{"version":"1e06d6137283a011ec689e6ec5e76df3dd46abd938745d363a260adb54b0b6e3","impliedFormat":99},{"version":"9e0bc78a0cf6afc736a142062ad0186d496b8ef9dd72b5a3d2847508ac9281f2","impliedFormat":99},{"version":"12f6a1fc30cc21367b7bd024a1f234f1c87c2694e5123791c4c1336008a97ae0","impliedFormat":99},{"version":"62a82040362407115b58a948e8f2cfd6a8c277a2d549c18fc06d21de2c3931fa","impliedFormat":99},{"version":"1d5cd62166fb45b821f6292a748f772620525688c4844ed81ddca13253ffe99f","impliedFormat":99},{"version":"b6007d32fa2029a0a1aaa3c405900ede8b00d3ab717af0a1ce3e681bbdd7cbd2","impliedFormat":99},{"version":"d430e252cb220478232cf6783dac71b221875110f508ed3ffb4dd58a93cd3bcd","impliedFormat":99},{"version":"0ad363f8072fbe9e4f6a5b90a870ff30f962eee48c5fdb543445f709675250bf","impliedFormat":99},{"version":"5dd81b737d6f72e731aaac4678c763af0ea6897d7fd8196f04e5477757db3e16","impliedFormat":99},{"version":"c9de554ffd41dc88473b51f8a726f8e6752ba4f8afa12100fe24b9f18ce2794c","impliedFormat":99},{"version":"f7f004f03df753e513625d261669f87c49d92bc2ffff624b809d5c8c8068806b","impliedFormat":99},{"version":"651cbda75a78fdf3da54f3a7eb5de87652390a44a34140303fecc2de9983040f","impliedFormat":99},{"version":"200120eafe59da37d180ceea37b342957849377c7215d2efa9294edf537e745c","impliedFormat":99},{"version":"54b641ae9f41f8d05b6141e6a02acda77b0743e1c3b0bef93e689f890981b1eb","impliedFormat":99},{"version":"b231fa6be4cec8a6b90f98071335cb22a6196b64724af56b1e851851fce48bed","impliedFormat":99},{"version":"f9f8a5c8b56a99c29943ba345f03102f159330ee4984ac0c06a4b93f3f9d6c1a","impliedFormat":99},{"version":"2cfe431d866a5dc7a23dcb1cd896aeb995dd1416a668591c79d7c0548b2bc8e4","impliedFormat":99},{"version":"8def9a68149edf17ea5df2669bde45acd5cb3f5d28ad79042a428e830a24af1f","impliedFormat":99},{"version":"a00a6157f232a7d36c78bdd7c85d34c8c9e8dd7bd11cf2540748f5fb9030330e","impliedFormat":99},{"version":"2b08bc4a87ef16bf7f587f074bb9194c112b69462fda07d5410476c8513f9a7f","impliedFormat":99},{"version":"615607b6a29e3f697222ea2b0109a513d0c7a961969eaf9498917d36db55ebbc","impliedFormat":99},{"version":"343987d6dae8f8ec43e2eb17aabb2bc5a15be8e7c797d37c74792e4bd43ca839","impliedFormat":99},{"version":"a80b7bb7f5c675ece7f1e73bbf4f4f9632ea8e919c1170ed9bae7cc6fb707e77","impliedFormat":99},{"version":"c27b0fbf9267c8beebf4ce5b1696934e7bc08847f28b2c9249659441a94b9da3","impliedFormat":99},{"version":"24ae591b2f12be72a4a9fe993b92135d6bb3e5e1bdb13cc8097625651404c4be","impliedFormat":99},{"version":"0a1a4813f7ecee0d0c39fcd50583dac3b63d408a95072905ba16d469919985ae","impliedFormat":99},{"version":"7dfa35a959b024bf2fa0483f2488ea6ed893ba1277ccc075e018a1730270d544","impliedFormat":99},{"version":"c0e98150595af80066480e9583f89e6370693cd0827fc89b68ecabfa5cdf4a72","impliedFormat":99},{"version":"10134fdfdf255c70e3e1838ad9ef47047677383aa6978883c15eb0f5c17c3563","impliedFormat":99},{"version":"39056f5033d13f6d66c2980c3e0e20bf84ceb64d51567156451695773148ab1b","impliedFormat":99},{"version":"4d79b57384b19b721f29cc120ccd4c8aee6c2351d8626a6bc3c43e1e7dd555fd","impliedFormat":99},{"version":"ec110162f200873cca9707c8be48a53fb509377db99e916b839b1a36332a655e","impliedFormat":99},{"version":"77f67d567cba48115ebc24484cbd0ae510dcd1e41f9508ee1f5bedfc0a925520","impliedFormat":99},{"version":"45c5df088d0b2fd4aaebabae4ac3e69f05ead369aa0e146067dc7f553b0a8279","impliedFormat":99},{"version":"6428679bceeae2bc835cf15366c8219a9f4a3baf9133cd2004dac51a87ebde8c","impliedFormat":99},{"version":"163555f7f6c6ec766b30dd054fab8fa69f5184d82698c4f5e7457b4f22710fab","impliedFormat":99},{"version":"8a92621a4d723e1c2f868b18f4ffba76739a0c93e8437850f99f5009499b8848","impliedFormat":99},{"version":"2bbde324e159d9f59ab56a4c77128737958704e9c4331caf646b075c93d58ea8","impliedFormat":99},{"version":"b7c30808b1e0801ebc2929e8112cbc6471473f227d25fa3c338ddf8b4f2cc972","impliedFormat":99},{"version":"a5e0dbdd3c5ebcc3561c493df20fb1c35094444b67e5cdf894d5ca83455f0dc4","impliedFormat":99},{"version":"bd0ba36a4dc087b698b83e8f210c57b5b8cb29c4e7cf09f52b9c53cfc8527508","impliedFormat":99},{"version":"40b46bcc69563ffbeaad0e7a9be85f7ece978902c7e17481874d3e40b6f30baa","impliedFormat":99},{"version":"24fec85fbf17a72b387916cb73ac60273753eb2f75bdba89fd9d8373d2f8e823","impliedFormat":99},{"version":"0fda2c7354705f8e3c7e88495fc14af255e1e4fc6ab5fd2510b0ded969550128","impliedFormat":99},{"version":"8364b396dccb914a0fdd1a43ac72eab807e2285c023aabdceb4a90175ea1fcaf","impliedFormat":99},{"version":"267fce2a9d770603e7497ff4d2ebabd4ccf6b6c40b379574fab6e7bf16df3635","impliedFormat":99},{"version":"6a92542761d442813efe8c992d14ecdb9f0f88d29128ababad72d5372d377a41","impliedFormat":99},{"version":"a913e963331c6b05ee3b833b505855f555b1632bb7784fe97933f01569b64221","impliedFormat":99},{"version":"a96a6cc809d8f09952880373df55104b7869b601c45b58be80ea50ad46bbb0db","impliedFormat":99},{"version":"6f13100cf876318d0f1e8f3600beafb1622b52c8ecad388f82d5c8a7ec5c3982","impliedFormat":99},{"version":"12d6a24ab50e258055b79b5620e1ab58fe1d5e53f816d7d24bf63b2bd41399af","impliedFormat":99},{"version":"4d71c3f2950cceeea5a198a49f9548d4c1744b2e08e799026b2c01e26c30ad84","impliedFormat":99},{"version":"56e5330e3c63f36f57cf87db4674dc0da3e84c9745431e3ee4eea014372e6ae3","impliedFormat":99},{"version":"06454590fb020d26332487e466caa15be9d4ab476cd1f2b502d041df6e73ace4","impliedFormat":99},{"version":"0af1d04da71458d3b24e9d4fccebd327335f147e0b822871151c6fd74d8a945d","impliedFormat":99},{"version":"0a65f24484673f5ff0ffbf09d8970f509a4c7140cf4a92fb94f4ea8be759b150","impliedFormat":99},{"version":"c3ef829e6159fc25cbb3ffb2392cdc65fa0bee0de45d1905eef39ce72a30b223","impliedFormat":99},{"version":"1a2dd1a4760aed2479369e605adde150d3425e1081be79753e3a1e4238bbd4d3","impliedFormat":99},{"version":"8a580ca7dfe72e5393d3e68f966e9a6770a0a67ed31a06783a0fc2d5f1bf41aa","impliedFormat":99},{"version":"dc5c180e2c2ecfb91687fa245c0ef789abb2f258925c53a46c40b5be5cc06d7b","impliedFormat":99},{"version":"2e03d78647e74bdec38e689f32471393ec37f477b75305ca299fe7afb378a900","impliedFormat":99},{"version":"d7d10dd270b953176d3633315fdacf90cf2c3fdefc7980b948e7d242e1f83d20","impliedFormat":99},{"version":"5e2880e69e0b2f69713a7b5c8595d08353d8129e62f14fbeac5e3a7a2f350111","impliedFormat":99},{"version":"26541ee839fa2672a9aee147d1bd77c92304c07c9c794f4e70d98fca4ac4d5d8","impliedFormat":99},{"version":"e6e906f2106464f4ff8ff9d653ab434dd57d14f1a86ac364f0d764633cbd4fc1","impliedFormat":99},{"version":"2dfff976aaa4c0efbfb0694bc9a0115b3d745473b9ce80949fa02f249df466c1","impliedFormat":99},{"version":"4eb1912637486f1b4a360658f7b1899aafc2b07761ed99f60617d11f596ea58f","impliedFormat":99},{"version":"be1378176c12ced525f5dfb672356dcb44c3ed826b76f1ed7c2e14c17e698690","impliedFormat":99},{"version":"6bf5d30cc1060528895d2db6fc2039c65606d2871c575667913cc67f28a8e2c4","impliedFormat":99},{"version":"a6cdbac42ca8870acf70615c430f50664236917dbadda4829b2ca85e22f65dc2","impliedFormat":99},{"version":"1a35594e8294b60a08ca90d0712772b851d3bd3343fc3f40c517e8f91118ae81","impliedFormat":99},{"version":"bc992f34d8a1ea9b6bf76ce99de74c427f5c578c36d40f0f47627d7edefd1396","impliedFormat":99},{"version":"239c64046bfc03eaddf462ca3bbf31f3f629f47c42292681eb8174ab4a1bf080","impliedFormat":99},{"version":"e9922a0bd88d88458bd8e1b59629942989a4606cdc73104549b1d975e11c716d","impliedFormat":99},{"version":"fa4277a5b715291925ee253e3d5f4ace6858e30527cfce7c981dc3d910b282f6","impliedFormat":99},{"version":"32e62dcf57f473fe959c8e55c05b85fc6f2c41bcede76f192462688214ac52af","impliedFormat":99},{"version":"fb4d45a4a5a2d6bd3e55a9bac0c06fdfcfc437364122611b4eba92331b550764","impliedFormat":99},{"version":"fdd44bceea44c6b6bbfdcc60b21a749ece00c3c9ca39effd76728769abdbd3e7","impliedFormat":99},{"version":"5c3e3cb494f815df8289e573e275f5af22b90f65ea4f84ccc02db71cfda44c10","impliedFormat":99},{"version":"6156ec87a3211fab0e201ac49e23bfa7b305e4e144bd3096e6fe134d7b89b608","impliedFormat":99},{"version":"bd18b9e00a08f52ed006cecd5278e09636c9a8f554a53cab6980436f6ddb930e","impliedFormat":99},{"version":"76f6f91c693dddac2959f67e0dd1694cafe5a60d648308ba37a8b553157e08cd","impliedFormat":99},{"version":"dc9283c141dbfa236f0cc44a80455f03127d43f9f099a347d577499131bbf0d1","impliedFormat":99},{"version":"2408d8663c9b5598c32539ce5a2e63e61d3a9c783981441be2ba91c59a214bfd","impliedFormat":99},{"version":"c54b3671ac0947ccb76b538e9ad5c2c7bba2d6b4e2facfe90ed3883e5fc870c4","impliedFormat":99},{"version":"acb187dcbf37d298e9aa2188723266fd52bc691c21368f7ffad1f5cf5efc8f23","impliedFormat":99},{"version":"f844308a48c568900f8e3618cf117fc82ed6a6436b0ac3d2965af03d14c6b096","impliedFormat":99},{"version":"b0f5047634786f8ca1ed076ef456eecfb357a7bae8696f02608d996ad8afc52a","impliedFormat":99},{"version":"4dbd3281bbe8fa74971a802b8c1e1a0747d2e70762b9a4814f7ff442d3244230","impliedFormat":99},{"version":"c364b9476c21321d77f63075ede02113e60943fbbde14b86cc910d7891a5218a","impliedFormat":99},{"version":"653fdee1ae608312fce98873672eab205ac9c27b23de1b2791031a0f6d2b98a7","impliedFormat":99},{"version":"e4fd76ab9cce4eb4f61d7288e26bb8a5cafffc80954c3ff18fb27b89204d3442","impliedFormat":99},{"version":"ecd553fb6353dc1c393f596ef37cc74ef38fc0be23e07e780ff49a39bd448ed2","impliedFormat":99},{"version":"0e06ba8ad31c92c97ff790a2bf54d322d8b926d7a7a086ee0982e955a7399bf0","impliedFormat":99},{"version":"1a9e58fb9dba9bd5f06eeefec5c2f8d5292781b06972fb9c9fb1bbd8f15ad5f9","impliedFormat":99},{"version":"1dc595c305bbf9c102977fb7970e0374d1912357e17b3a95148580c6ab46b5cd","impliedFormat":99},{"version":"af4ded8d2788d0228df353955c9a0ad6c24ef0cef8d63b589629cebdf3e5c0dc","impliedFormat":99},{"version":"d64e5c26af45311b8642ff27d05c49d8b94b9828d353540ec1c0084b92e2963b","impliedFormat":99},{"version":"ea52f5796671ac35eb62145531a9d9b33e18624c7ea907b2ba054425865ef23a","impliedFormat":99},{"version":"63ddc0222be4dfbe4edab975080455c6753b18fde348d060a6d3ed93e0097cb0","impliedFormat":99},{"version":"79cd6112cda96ee5a62a7c4ff9f7b08651af15fe45205751655cd4b4c2d1b58e","impliedFormat":99},{"version":"2fafc95d1afc4b30891cfae6447b0547fb21a4eaef4e7b6f47b789eb07698cf4","impliedFormat":99},{"version":"cecd28c55bb2e5f66e02fa64c5eea751f9273c8515918820ca2409cbb90c802a","impliedFormat":99},{"version":"4e0d0aa02da405ab61975064bfff8a927b493239e7c2694b091ce3a87512b802","impliedFormat":99},{"version":"0bce1056c3ad5ae75512bffd21985a8107b6c7520bf073e4d1fac19ef1970c4b","impliedFormat":99},{"version":"dea629ac95fc8d6abde0a2486299c3f3c7e6ddfe7c14c3ce1302ec17c025a021","impliedFormat":99},{"version":"e6ccd8091551b224ce7989079751cbeff03207986bc77aee9e1d50c0d4eaa6e7","impliedFormat":99},{"version":"7d209a3d160e8412a320568c8343f4aa5e2a216e019f1e382f3d4c6b1069295e","impliedFormat":99},{"version":"aecc37bca58dc791685b01ce18238f8d2a03fdeffd4ec2f316e37f5b7307334c","impliedFormat":99},{"version":"7b8bfb125f9de5a4ba30f5d81b5f671772cf76987d880147f786e33fa878a5b3","impliedFormat":99},{"version":"d57d9fbf2673c403c6bfcc61ab70c16c4984a6880e647dc46c51333b1f812833","impliedFormat":99},{"version":"f3354264b00ad46c7f3949220e00ff70955bb67889e0a23e0d055153966b6294","impliedFormat":99},{"version":"7fa9b40a7f202ccd3c9a22a5777f02e50d0c009f633d23c8d8cc7877e95c89d0","impliedFormat":99},{"version":"1186f9e84db92d299247dbb5a283311055f82de1f8808dfb048566d1207fdb82","impliedFormat":99},{"version":"c30f1892b9de9bd083512b9fb5858cb5787481ecdad8920d7ff75586cc88d432","impliedFormat":99},{"version":"e43ce675a68782c430c60de48267f8268bdd682697cc38e54eb9d03f53b7791a","impliedFormat":99},{"version":"df1d3cca4a0197138ca725503c85ae59e06cc21e1dba64dcae94b8e8c2b1fffa","impliedFormat":99},{"version":"6d74fdf0a7ce758f316a2b2c8960ffc50235320727326a35f580612c0d593a4a","impliedFormat":99},{"version":"ff77c6d5963b87d427ccfe6509756ef01de1aedd685d186e177603ed741c93c4","impliedFormat":99},{"version":"62c3d6cc07f01164ab6b94b1daff72afbdea44a42efa750673e7c65739b85816","impliedFormat":99},{"version":"f9aa7dd2db630e9ad51214d9d0e14da672a82322684d908e361d1bae4bf64e01","impliedFormat":99},{"version":"eca2962342ba258932717a7431741e432d275beae879d6e655eea3cddd69ca91","impliedFormat":99},{"version":"807091b6bb063571171ba50d3d7da2daf4e718de25a32b4d168d9b2854b16979","impliedFormat":99},{"version":"2256e03055dc0cfcb237da2751a763b4c695f6c6c82003cf0d36851cfe77384f","impliedFormat":99},{"version":"af7cc8267b8302c517bd0a7367642bb1cfe2e516b00bd855ef85f2bfdba59c60","impliedFormat":99},{"version":"fc490848f97ceb21a52dd6afe32a9b98cb1cb2e6320806b5fb9c24757a1ca769","impliedFormat":99},{"version":"c06313963ee23643e32bb4a0deab3d69453115fc1aa59eb2e9699516fd9883bb","impliedFormat":99},{"version":"31ed9dbe091c55243ca0d95c7d3796448367091cb1e958033c3830cb58d873dd","impliedFormat":99},{"version":"ef436a3aff282493c3ca803abc5dcb5f678be8c2345cacb3a0356a47c6bad708","impliedFormat":99},{"version":"75c0e4d715175affceaf29516d4f46316bd757d2e30945ccce722aed9aa91ec4","impliedFormat":99},{"version":"cc7ff6ad94cae8f1b6b73cb0f3694e1bfaaaeb7db708efb3aa63d657d453cd05","impliedFormat":99},{"version":"4dea994dff6f8f13a75aac0d5fd62f867790c72af9c49f2153b48f1fbe94a545","impliedFormat":99},{"version":"c119857e4642cdd774d2a84d9547ea6daecc225b2273cc6e57035bd422f5ae1e","impliedFormat":99},{"version":"04127fb55c6a3db066777ec0efa8196f461e779ae5f25be1460c5b77bc6fffe9","impliedFormat":99},{"version":"0c11f88d9828efad354c4cee7152ee7eaec74fe59ae13ae29eaa68c1e65521a0","impliedFormat":99},{"version":"df3e033a605c7e31ac7a6e7517c422dbba4a940c8aaefbb8a64730bbcdbbd199","impliedFormat":99},{"version":"738ca31cb07d20afdee107364e270214da052479973e0b08a9a886f8f90d2803","impliedFormat":99},{"version":"bd034d73f41f90d3cfce994b51a759b887632bded1cb36f1dbe2773973a1ddf5","impliedFormat":99},{"version":"35a17e3fc0e53518707795ed24bd428633c45a4e8fcd4657eea2963b42366eb2","impliedFormat":99},{"version":"b3fd4b12bc1b4f73f1a110ccd99ffea459864afb8e682768d641de1be3508bc7","impliedFormat":99},{"version":"d1dcfea8733aec727e00c133901efd6974a9f7601c4c19ccf9c2e99616efc104","impliedFormat":99},{"version":"eb0b20ca60a2a2ee1daba9b78bfe8ae99487de57223aa6f0f6b99252b0cf9363","impliedFormat":99},{"version":"8c868f22cbfa1cd301a05eeef770dbc4453dc42f065fce267945674b4d82f3c0","impliedFormat":99},{"version":"e6ef6469aa806b0907c02b67207a86bdfc8a9291c5e63f3ee0a72437df56c055","impliedFormat":99},{"version":"85c677f795a09a5134768fc909906713afa46536fb7c178a58a2dbc8f981ee41","impliedFormat":99},{"version":"97ba6fc4a6c7975f53b16bc72ff0ca05d41104ef2a605f07f219ff23ba6643fc","impliedFormat":99},{"version":"59e5e42bd98ddb731aee619aa16b1d7403e598e54bf75d2daff25c57495a13d6","impliedFormat":99},{"version":"54e79ba20e85bc05dbf39eb24f94c0bf485ff76b096654420eb32dbd7a616c53","impliedFormat":99},{"version":"80a960337c67f64bddaea4ac2fd437ff09dcd64c50ebef0ad0e5abed981c862f","impliedFormat":99},{"version":"98590ff94f0c45c9da700bf9c972714e4367cee30842aa130ab501f463574bbe","impliedFormat":99},{"version":"7d4539a233361ed71d335793db13085aeafbc1e28920a9784b01a8b2d461d354","impliedFormat":99},{"version":"a00c3e3e9475eb832c523f41734a7ebef312b1ac1d6ecb68d22df37798e18c02","impliedFormat":99},{"version":"275d39d59a9a5c7ad2d13757bb35bd190f487cf5fe221b8a556be2117ce6c2a3","impliedFormat":99},{"version":"072c8a4438ecf5be5f093ca727bd03874fdcf7ea8b810a5f3d5b5e9a1a158646","impliedFormat":99},{"version":"6808d7d909f594bc5e0695b09e9f663f79b08573e3d95b837c1f15294481516f","impliedFormat":99},{"version":"1c699544448121e8a6521399e2b9e709c9561b768bdc3249b035be0ff5a458ed","impliedFormat":99},{"version":"c0f9d148738c7f952a6e0075e7f7528e67fe813e5473741b6ae2d7bd1c701727","impliedFormat":99},{"version":"9594f39327c3776aa4083e472770ceffc14d45e669998536b60b5de5b1006143","impliedFormat":99},{"version":"4830175a6be86164822a5b2f7fef7a97fee781b33a52453ac8d8b50e3ec91830","impliedFormat":99},{"version":"d82b5aaf44272f7e153a3a469db46739c306b5c173e0382cebea70bf469d3a52","impliedFormat":99},{"version":"65d1b54d95e8712f8bfec843cfdffcbaaf6d92d0a69abb7345ba55f3f5712017","impliedFormat":99},{"version":"80464d99a301e3db960da2a7b010ada29874dd6dbc5f24731473a2641cee217c","impliedFormat":99},{"version":"3834d1fff358eaf5b52078c27881964e31e54fd1b5be8cb097a2ca75c2d97b7c","impliedFormat":99},{"version":"3fb4902f08c9b5a77956e9a6856505e00a7fe476a586e832571c3d4f83ddba31","impliedFormat":99},{"version":"93c8e1d9bdc1cfd856abb2ddb43c31da1adb5bb23a3172422ac3426d80687f97","impliedFormat":99},{"version":"82dc653116ac560acfa8623cd3fb7de40ac5f2e3d65991ce36070364b4f1bb07","impliedFormat":99},{"version":"ed6c38e10a8ef5ff290aa185177153ad1e0a85c7d867047532d33a6b1bbf2c4c","impliedFormat":99},{"version":"bab1312d15063c1685b8aa51252669c1c5843f3f7c3568674dce1a342cd1f7a3","impliedFormat":99},{"version":"023a397566c9c9ba724750a017783ce78006b04d52f96322f42ec104daa1f776","impliedFormat":99},{"version":"10fc62a7f653cff767df362868a121e6d5fe9d872fa4c0fe3de8b1acd4324f0a","impliedFormat":99},{"version":"05346e4aa851fc01eef2d4ccd77b5c8e5ef306ad044ecbc8594aeb7d753e1d33","impliedFormat":99},{"version":"05e97bc0985fe092ec1fa0204a4ba209902419231941be9d7109e759992af3a4","impliedFormat":99},{"version":"d7baa0aaffbdb80eb363c76f5c062841441281757037ed9a740d2e8ab9cdc391","impliedFormat":99},{"version":"cfc54c8c0b1974dab7994739dc901c13fc8cef6ed11cc0ca2777dc0eb1751f40","impliedFormat":99},{"version":"9815136c848202c8b0705c8e56a6546d2052cd0abee889fc0a14a08c8a13dc0b","impliedFormat":99},{"version":"4b77dd1d6d600b721c6b475b9479455233e7a189c1e8db14a53a8e34726d2f55","impliedFormat":99},{"version":"132c03d02eced90fa294ae08f814348ab056e1bb6e041a4802aab72deb61db78","impliedFormat":99},{"version":"3bbe7954dae9f4355f7da44a99dddcabe92ec11239e38a0c3c89da998156d9f4","impliedFormat":99},{"version":"3531151069b2a08dee7b82bf7c3437f707048c682395003a49fd630968f5ce15","impliedFormat":99},{"version":"51a2a1e0465147c66d3b3ba8b6776caa67e473db9aa5ba771a7fd5f661d994f9","impliedFormat":99},{"version":"616fc8cf7d4a11d695eb0e309522f1facee105a1c740e74fee5f710dc745bb40","impliedFormat":99},{"version":"c14a02a41bbdce485e6b9fb0a70c91a354a2044b55e2563e6731d51a3b3ead5e","impliedFormat":99},{"version":"bcdc75c3befba305fa771f51762f600ef3c7f60e12ff9b0ed6eddb3b11da3792","impliedFormat":99},{"version":"9b681badef747116e902328e3ca5bcfcdebb16259a8b8419a7e95132977e9e60","impliedFormat":99},{"version":"fbb328355422560a1393277f37065465dc36c25c5afb716c6dbbb4107f2c3adf","impliedFormat":99},{"version":"f9c5a5df867ff31c79e8dc2e7bcaafdca06d8a8adc28a099d8d05a1a4efae2b3","impliedFormat":99},{"version":"2e3ae086adbdd8ee059a46739badcbc7f46ce88b16dbc2afe2b669b9130a1fb2","impliedFormat":99},{"version":"fddbed7f42a61dd91910d468774ab7aece510e4bfc8acc8d6dee2f0b2cc3024a","impliedFormat":99},{"version":"d0c25a9039e1b56414c154cc2c3e22e84c8be8855c9780f4c1ff793f9e551589","impliedFormat":99},{"version":"1f700fe107041685043548d72a01cd21bd31d658a5a4d6d230367840ce65b389","impliedFormat":99},{"version":"c08f35285d1267946e19663f7c121f6d3e16cc03004a76506abc9f9f8bdc8b6c","impliedFormat":99},{"version":"021902fc642e31e811caed40c5ad07e0b105d7e269f609226b6447fcfbf62733","impliedFormat":99},{"version":"0a45d152162e8a7803ad6b0644e9f2098e28281f6e5ac08f21f14587564f568b","impliedFormat":99},{"version":"5b85b4c8d575c506088c9e77dce0607988506e12ad1a011f7068c9a35e5abdf4","impliedFormat":99},{"version":"d64b38d73752d637905e2ee9f39f7f82e2102dc96171adba9ec6454e396e0319","impliedFormat":99},{"version":"119acee61f07781e3ac933bf590854365e8117c31c896bf4bf1b9e3f399ef492","impliedFormat":99},{"version":"95be4119f87bdda94d4302cc6e6c1e2d1b849d170c5f187815224eadf7b1bcfd","impliedFormat":99},{"version":"ddcec9094b6fe3c92c6758cd338292672416b7d58ee807483dc8ddf629d699d4","impliedFormat":99},{"version":"283daf40cfa9417647d1b581cb734366581a803620bd20c60d92bdb7bb807beb","impliedFormat":99},{"version":"94d19f12b5d52237ee39b35048a1b7aca7c0b8fbfda6457c2dfd83414a6ecb89","impliedFormat":99},{"version":"7b14ae6939622c3fea912933aac786f88fb39c20f115eb7496ef890eadaab2f0","impliedFormat":99},{"version":"1023d9d72029b02a767d59537342fa1be3f3a33d901b52d7e0d47d42269f0215","impliedFormat":99},{"version":"a594453ed8c004df6b340bda0226e7cfe94ee67698d1c0dc1b9207d1e20e0ff6","impliedFormat":99},{"version":"4c3c179bd19a0c96c14749c9095714c9b150fc6ff2506c81b877d25644045630","impliedFormat":99},{"version":"21d8b3b7300ed19f41050d3fd6317f5b7c65dec299e1698502fb6767ac30d839","impliedFormat":99},{"version":"a6a5c59f2cf45d5ab475340ae96ebeca495094d15d72102b7bff05b7f0bf7383","impliedFormat":99},{"version":"eb7628d3567bcd483094fc2688ceb5305ece0563463787cca7035efce9f43c2f","impliedFormat":99},{"version":"6d79ded4df43562c8062badc829bace67925c70d18a7b72c09b7d23797cd0891","impliedFormat":99},{"version":"d25e9a88e761b13dd58628d2d41641195ad79ae927bb268387082656673ebe0e","impliedFormat":99},{"version":"b161e27190a5249c6e5660288e014bcdcb1e5bcc2733f848351b027e0d772ff4","impliedFormat":99},{"version":"ef547825b57ce9440a18bbd170125b89cc5bb8ce7504dfa6cd528a3dc4489e76","impliedFormat":99},{"version":"e74cf49b55f4550883d9d46173dc10ba5fd38d55f69f8617ca147b6d39c8a811","impliedFormat":99},{"version":"339e68b5bb386ddf9129bb3370d01f22f8919cd0e40ca71e06f881f69e02af66","impliedFormat":99},{"version":"8c65681a3636770c9b9b2b52d14ee4d59b48092175ae3124c044a2637fc84153","impliedFormat":99},{"version":"c6bd0b212d354956e2c5edc8e0249adb3c0e9c942e7e1794e23fe9f0dc721828","impliedFormat":99},{"version":"5e3b5745889dc9efc2e6f5515ae5bcb8135f2a8412d4a1facf374e09176f7cb0","impliedFormat":99},{"version":"f0576bc1e933fdc38f0f182775c24efab54f2a7a9b4a1953abe77a620346b9de","impliedFormat":99},{"version":"f061956ca6ce7bd52bf726d2e87e620aa928807f3ae526d3d432742d1da6e2e5","impliedFormat":99},{"version":"39b7dda3a4bd1ebfe126c67d3df5ec230681097b54a4f5a7abbd841cb321c003","impliedFormat":99},{"version":"532cdefa9aa613089dbd91804d4d9de824ed6e9f44980db04a14465e19a9e4e7","impliedFormat":99},{"version":"d0682d488ea0a7deeefc809d65c42e09f339dde50dec54f901104ba35c70f5d5","impliedFormat":99},{"version":"d4bf07baf86b8e6fbefb578d8a630db479bd8feae8a9932175c4d412c21f27f7","impliedFormat":99},{"version":"f76ccf2e0dc0bdbd29cde0b9054b0d510719730e6455db17e98f2b10646eaa59","impliedFormat":99},{"version":"f8dc3be04418be55ab97a46357ad0f6102a118b63e756f0fad0de94be2094d3f","impliedFormat":99},{"version":"3c0ebcc673f72499ae0ed99b0fddd52a60fcda51d50b11d1adc046e5985916a2","impliedFormat":99},{"version":"5395a87aca9a065a768051b7a6c66d3cef55e097ac2ad6ab917e27c3c92c4e49","impliedFormat":99},{"version":"79bcdbfebd96644cd9e93ca0b53ad0dfd398e0382c03e58f3135474ece45ca13","impliedFormat":99},{"version":"a134f53667b920e6ec7095c1c3cf0bcaa95008cd43000d3bdab1e570ac70cafc","impliedFormat":99},{"version":"116808caf097e8bf31ce1cccf1bf4060608cb7d91bc426b92abd97f7287de047","impliedFormat":99},{"version":"bf7b4bbe862d400269c378a2f744a5a94df5467cd18c805ee3a5ad741766ca40","impliedFormat":99},{"version":"2bb9ec2ead61f07ae6d8277af9318e37205b49abc9271604597844346ed3959c","impliedFormat":99},{"version":"d75af40a0b511d0633157556a35141a834d084094b01a8908d78dec2dd80fc64","impliedFormat":99},{"version":"ec2ca88bd0a13a87374a11d5bfacadc96b55810aae7a008cc44279b7757839b1","impliedFormat":99},{"version":"83551e90c20424cc93773db3ed94f8c43b39635830bf5548455d0836deb96393","impliedFormat":99},{"version":"945b49df2cc8667365e20dd3c1f8de64447e0b32f1d91c23ad06b07b0aae44ea","impliedFormat":99},{"version":"d6dcc687d0baf6635c1808c740aba4db6e37a3b5526f2655f0c291accec0decc","impliedFormat":99},{"version":"1dde80f3943e6bb56df526b77bc7a41dbc234d4393f1b8f19cc6672171ead575","impliedFormat":99},{"version":"7811c9c49dcddf09a7b307acaeb6f3c9b4d1d1b97961d87cc94670c46ea0362e","impliedFormat":99},{"version":"25c965403446cdcc5417d13db187a7f0394f7106cd1a45e1b9cd3a2c08aec4b2","impliedFormat":99},{"version":"1dc95a1964076bc1aeb6731a17ae5f7163846f248f60db0e0961ced43db22c6c","impliedFormat":99},{"version":"63482e1d5b8a0f3a669807bfa5355d3a9790856b120f512b4bc40a0dc65c78b6","impliedFormat":99},{"version":"7755b72611ef60e8cb35ce5e7ad393577e7389c485d4683570751e88177b1bc6","impliedFormat":99},{"version":"5445c1b45a4b24cb793cea4f1f8678912f2a7eda127afa72c48614aceb3059db","impliedFormat":99},{"version":"b600d5e621219860f2f6f9e1aa25d777c6b6c469a9048839b0bc256f16e65cb8","impliedFormat":99},{"version":"ed89af0e95cfc3c3aa05ab7f10f39252e304864be96702d3002e3a0b5314b058","impliedFormat":99},{"version":"6329a32dffec51eeb23377ccaead107d1ae30efe84e019e70d92a529df7e48bd","impliedFormat":99},{"version":"05650f29c7b38c2cf78950caa7386acbc7936a7cb08711bd1975cd4818c5cb09","impliedFormat":99},{"version":"12ccebd398ecb9ff4452279fc72aa34c70ff770926652dbdc7d34ad21777f466","impliedFormat":99},{"version":"1c4b858e912db3388433ea26a3b99b2c0ef72048da6946614463596b00298c5b","impliedFormat":99},{"version":"dd531d326e40577dadb38f2a931264139865f767bdd762af1e81f316b0c03a45","impliedFormat":99},{"version":"e8d0fd2600751d9b4abcb81e3067f1a6823763a25322401cc8a0578747692bf5","impliedFormat":99},{"version":"63964d043dc01122a1db457afec463743918a5c71c4beed6e2906f509e015a4f","impliedFormat":99},{"version":"4247f6bd3d537c2f7ee7a31067c7e95b70327bfd55a379fd96a42e9f2aa6d46f","impliedFormat":99},{"version":"e2ebacb3dd831a48a1beb9915bff463005845a398d999214a0bfba620602b741","impliedFormat":99},{"version":"5bf7ca566fde86fd0469836409db26264d98380002545a6b8ad048de46f47489","impliedFormat":99},{"version":"e860b60d342ee8666f83bf61339fa74fe7613f2ac7ed599f0f802ef3d85778a0","impliedFormat":99},{"version":"130de79e5e21aa52d0ac67eaa51182d90dc0354eac7c35a542a56426e93062cc","impliedFormat":99},{"version":"d590eeb146c65796d33043d08e48449c205b37033ac4157af8984bf1019928d6","impliedFormat":99},{"version":"68b3f5d095283a725fed296ee8cd36c1373a2476aec8cd9d8c953de792161248","impliedFormat":99},{"version":"55804c2d006cf28fa308eb3b608e5673ee4ef0e3d9999e532efcb9d703ceb522","impliedFormat":99},{"version":"e1dae322a476b97875adaa6cff6aeca7b3273e2a0fad1e175e329c4ce3d02542","impliedFormat":99},{"version":"36334b90aee2fe5d6f2971f05af58a15c68059aaa806e9a94652b324ea630e18","impliedFormat":99},{"version":"9e5ea08cabcd47ef88501f69a76fd8bcaae5149e6f92251e612e544af3f58a00","impliedFormat":99},{"version":"390b90167c23bdcaaa56041c620b04d9e85957f79d103a0b8a4f40f1159a486c","impliedFormat":99},{"version":"b97b7f29234eac44f2395e36457abffc93f7b709d599821df52bef118009a959","impliedFormat":99},{"version":"d8a29ab9ec8a59aa4f7a46217dd76da3fe9b98cea738f0a3031595e7e3633106","impliedFormat":99},{"version":"1efa9583067ef597f832bca0ebdb5a1e2c940d4b67fcbbbf4679528843e38834","impliedFormat":99},{"version":"ac9e0128567c5676b83e5364abc4230a6610fb9bbc698392b5ed197b99d95278","impliedFormat":99},{"version":"d8250e45341b1e98b42e3008bae572623c2690e331950ba0a7b6c0ce6cd59d50","impliedFormat":99},{"version":"7ff384e556272b468d2710a54ddc17eea161d98dd44485d0c0d4161ac7e7da85","impliedFormat":99},{"version":"1388631fa8cdd249a9812333f0c2ce35490055ad8013972eb920e123bc5eb8e2","impliedFormat":99},{"version":"ee6b73c727bb809d7f5e6e22b4a668f466a5ab65ee1b8f214f8ccc3e311a2451","impliedFormat":99},{"version":"35fb1d611af3bdd39f5d5402847167af43f150716a477de3796c7c4ed071f004","impliedFormat":99},{"version":"708088bfcef2939f193d1ec862b1e576a9f345638600a9e82e398ea6f2e006d6","impliedFormat":99},{"version":"e66d27a7e54d9cd5e3bf7acb28838419aed6cf78c8ef567b9ec1427fac774f56","impliedFormat":99},{"version":"d19cd315889739ab3e1956053ded5eb062348ba8cb9891a661d0186b91770f21","impliedFormat":99},{"version":"a0eab628c5edf5340163c01613f55ac9fdfd5186c52d96372528c576152f3795","impliedFormat":99},{"version":"619c675e7f67b1343992c6f35c4ec9a52fda78bb025ff72519089a6da62d1a47","impliedFormat":99},{"version":"e190626bea4b1e20d7b3e830606a43aadc25815806fa1527d527e961a35e8bcb","impliedFormat":99},{"version":"94df71ff0eea0e304a2ef7722ab413d75adc8a98e0c741a0107643276560c7dc","impliedFormat":99},{"version":"1a6e320abcdea25b8489b6e39cb4a4d8c90d0f0ba9f597231e95420c723b9dd3","impliedFormat":99},{"version":"2f838725d0b114c8aba336f110037c0b00b6248958227a74d80fb62946ee5b18","impliedFormat":99},{"version":"c9dcdbf46d97fb2df29586c68cd5ae6748c081a0c53fc37a6132ffa27f6955fb","impliedFormat":99},{"version":"8f430a46820c2649bc2d07c6febccbec75be9bfaddf35bf264590f8191e94373","impliedFormat":99},{"version":"9b110210c3df13bd4e53db3576f4416c4f56142d50b986f46e39450c88c6b780","impliedFormat":99},{"version":"c2d231b90096f0d5dfce494e54bf81666758316e087781f14bb6da1aff9e8700","impliedFormat":99},{"version":"1e1dade75405e843690120e917bf189f5a1a8dcbe60caa2815d949dfa4b5d5be","impliedFormat":99},{"version":"e7c7954921e22f5f8945230f89cb777668b059a7354b350e0e357987aa0417a0","impliedFormat":99},{"version":"3267519b49ae97bae8a7bcc12936ebb116209c6aecdc9f15234b0160ae66300f","impliedFormat":99},{"version":"8d5680d71ff8394d96be70eb3e03ed4332e1b7e5191502aff1576900c120ca16","impliedFormat":99},{"version":"60aa61caeda93417fe0d1c238def5ac44869ad867bc779a82be7c9a1c06d4734","impliedFormat":99},{"version":"2709edab013c18a69f6bd497d4abddf8368a14e0baf1bb30ad5d0df59bf42693","impliedFormat":99},{"version":"c5c079a529300647828ea61619a49261b416ae65f46f968511519c5f8a79489c","impliedFormat":99},{"version":"a746fb3152e96412346ce01d24d5ed2817daed4ea188016d4aad0eb486d193f8","impliedFormat":99},{"version":"9b5dec24186dbc05171cb3f9e4f1e191154d3d4b7f187dde95ed0b08bd38c32d","impliedFormat":99},{"version":"c21c62c5f7e9448de7e9b0fa9f240d5febe46ef3f170ba4f976b24b4d2270cc9","impliedFormat":99},{"version":"b0f482d75e79e076a84d8f83abe57cf80d75bfe4f64faf96e0a6c965ca6e2a6f","impliedFormat":99},{"version":"2d72fb98ce4a52674d73af8bb2afe471cc480afe5de81e4e1fa40fb576169bb7","impliedFormat":99},{"version":"5ad98fb3cfd67c6c38af8bd2761a605f9d911d6e03955fddb0c7fb7cf824c694","impliedFormat":99},{"version":"67f46739541c08dc52bdfdfc8b77534dd9443e7fb4bc31467a211acc699a02de","impliedFormat":99},{"version":"7d8515bfa58add7868c423b29c77598203e0c7696b7345d933f4dc8b04c5aec7","impliedFormat":99},{"version":"6bf2b0fdef53d2460e7f49b6e7272a25b74ea474c052275a9215f645b60b0f64","impliedFormat":99},{"version":"94b181dbd37f644090e1ef29852d9dd6368d8874cf2f4c0ae0a298feaf991eaf","impliedFormat":99},{"version":"2d74c63d20d7eca1904f26dddb4d8b8d8fca12529bebe4bda7d2d14d24bde067","impliedFormat":99},{"version":"eefefc2f2dfa29e2572a60421e45dcf8530a34b17c3a6d43c5799a5ef0550686","impliedFormat":99},{"version":"8e6551df9921ce8c6a3b4fb520d007e28353a0d3d8a1d06f6778c6f1486207f3","impliedFormat":99},{"version":"68954597f1d7f67b99005951e94ca60a3a62bf3913362f2cc7cc653de3f19496","impliedFormat":99},{"version":"4773ec8c467186c29116dc3c3cbb7927437de3311a09b052687c3dfe067c16d7","impliedFormat":99},{"version":"0c710c1c886c67727bb7deb8197d009a9146b1f5afaff62b7342acc76b73f279","impliedFormat":99},{"version":"4d62901366dbbd759da77f66c16897747f70a2d8dfdacecbf8606e668cc6c301","impliedFormat":99},{"version":"60b81bc5977f284d06c8c89cc04b8cddb45ade80758d1a0455c30161b34b437b","impliedFormat":99},{"version":"56e436146023b114fb661baf70bfce2041d5806721935746699df3d1331fc6af","impliedFormat":99},{"version":"7cd4bc26d96221eb7fe5fa0c1b503386377fbcc6757d26ec50014e176a61b7d8","impliedFormat":99},{"version":"bde451f81ffba547053111934cd0ae75bdde203ddefae30976b77033136de1f1","impliedFormat":99},{"version":"775d6a8112d08a9c5fa5d2cb8aa97881ca81cd2344f6e9e158dc81efab171b07","impliedFormat":99},{"version":"4cd295e5f329970c707fb48b9d88d15b32faa9f760fcc977ee10eb160f4e4a6f","impliedFormat":99},{"version":"fc4038d8a91384abffe294d3df8c3a06e3df7073bcc2251272fb31d912e6fe2c","impliedFormat":99},{"version":"22bf99ca0b3d239d88d6d8e6e2bf155afb30b4aca7fc09335087938467543a09","impliedFormat":99},{"version":"cd3682274f378c2462bc4fbb41ccb5300d71cc5c008c12fa9d35ccc54b34cbca","impliedFormat":99},{"version":"67dc58c0b812bd006ecabbd29e8f9d762c41b0549910fa6991411c16e95bbb59","impliedFormat":99},{"version":"2bc40ddafd68113f9625ab18be76b9d69d8622534674ba26e32123e74fc8667f","impliedFormat":99},{"version":"9c099d02e2e82d484012f3713a164cf55c7f63e5cd9c2fda4dc4076648ab862a","impliedFormat":99},{"version":"48b3074e05dbe986b0228044afa1ab2b130f562920e20ad6199c3219b2629d17","impliedFormat":99},{"version":"c9829c5ebf26778156e33b866eacf467eef9beda248f32cfa5042cd2ede8de50","impliedFormat":99},{"version":"658ee70a53b7a4f30af822940b5863208e367769715698fff58d0f38939ce858","impliedFormat":99},{"version":"ca1bca6d1b00d79b032c2dbb48ff021fa7eaed6b0aacc796ef5d0873933891ce","impliedFormat":99},{"version":"bdde7f266379e321a38646d74c7da791308d1de89073299a9d98e356634f7c08","impliedFormat":99},{"version":"dc3b92eb315796d2568e17de9dbbcf25796565d440e63805642fda5cb68b9baf","impliedFormat":99},{"version":"d486d1fb1ab86280b3f8d730a0770d5843cbaee267a13748c210a49d5d8701e7","impliedFormat":99},{"version":"6a1edff3f864b17879bd05bdf8dbff682d14d2b701892256b74da0693616e06e","impliedFormat":99},{"version":"1c3a5421df2a1a0f71e86ff5aabc804934ae48ab0495acb257324b713d2e5c3a","impliedFormat":99},{"version":"6d604fdd569f7e30ff284c132db9b5185c8f9c80fe405d23e2b07c0e663f6278","impliedFormat":99},{"version":"91e3013fbc9ab4ae9415de1dfabd24b20eb1a448a8aa1227f8a1206975626585","impliedFormat":99},{"version":"e811d3bfe878fb14b09ee7746624751e7f861369ab6301d6e3b340f6c5209873","impliedFormat":99},{"version":"c181f4ed01c4d578e7cbfc15121db9d1e53d3292e0e674e89b8def9afc33f2de","impliedFormat":99},{"version":"3aaa8b4924cfba7d4dcec41271cd848ea987093376caf1da8cba263b1a8f604c","impliedFormat":99},{"version":"5c28b10c7829e6f8961a9a03a600e3037ad4d9e005ba3a177ce88c76cad419c1","impliedFormat":99},{"version":"c93bbc1a968312df22be64d3fa283d9a8794e1619f5413b134d7543884a26481","impliedFormat":99},{"version":"3367c741cb20d44594a33c81189e92fb6312ef1ad80e731e8c3782ea7cdc3b50","impliedFormat":99},{"version":"57da5fcf4facb95e01fdebff97414e51417d12d61948324cb1a504959055efe7","impliedFormat":99},{"version":"b9171a4741909269fe324049b8a2c560aa829a95c1d1770be18c9d137f820304","impliedFormat":99},{"version":"f05eaa4c4151749a5994f68172bae0b621e4000e6763eda011b802f5c675871a","impliedFormat":99},{"version":"d59306afb4025cddcefbb888fe9b5e530f36c13dae04f045d783591db4a09af1","impliedFormat":99},{"version":"a5cefa0fba77455d5ae3fe0b49edaeebee2ab7a02eb1fc3f2c1d1ef0f89e80a0","impliedFormat":99},{"version":"06dce6f582073c6fd71ea95e87fc30681c363f0136aa26aaf01b5072f8a747ee","impliedFormat":99},{"version":"7f39fb5640073a2c8292f58c332b8ea1dc40e6771e82485353ff5c01de3004e2","impliedFormat":99},{"version":"eec3d5956e9cdbf258c3052d1da1be6a5414ce9b925adadfbc69772a0f560ea5","impliedFormat":99},{"version":"ca904be0ecc01a5c6db3cd367b323989c367ec5a1b8fc8b290d566030350af63","impliedFormat":99},{"version":"71be24f0406ad4969187a22b62d5a5bca07a9e69fd4695332b823ba50b7221f7","impliedFormat":99},{"version":"dba595f82dfed85bbf4e39b50e27b9c9f52c20a48c72036dfc2ad8658f835bc2","impliedFormat":99},{"version":"81d42dccaf051e8d599b1d70281c410a8a501ac6ba6462dd95b66e06bc2086fd","impliedFormat":99},{"version":"2ce213f1fa2a9d38a4320272de78bb70e7ed1285090783732457d42064a66ed5","impliedFormat":99},{"version":"bba6e7d4458c3bc24b69f68a5152963eb6e9dd72d38618f83b3698153f635d45","impliedFormat":99},{"version":"0e7650ed5439e7d872df4e6bef9d75606da9c73a0682782f52c700936088eaf4","impliedFormat":99},{"version":"f101801894b206a26d61f2b84d1bd5587441e47557bd946f7d651fe0c6ee1f94","impliedFormat":99},{"version":"f2c1d36ed7cb9f429874c7865ae1d193bb27bf0669829e50bccf4bcb2c6ef300","impliedFormat":99},{"version":"d90c065d25c7043fd9b8d3d44cbc3f082b048a641d491ce27812b97eb5545a29","impliedFormat":99},{"version":"6a81e1ba677caa156e6624eb2ef502cf5b3e87cc259656ce649ec39e9ee97606","impliedFormat":99},{"version":"dce3724933c25a776d212550af0a1da5655035339daddc4ff9d4e3eb22ef13a1","impliedFormat":99},{"version":"7fab59a9579956454a09e5ac8001fd78365e650db43364f6aec5be52ae8711e5","impliedFormat":99},{"version":"b2fccbb91f9a6c85e91da363c4304c76f8a7b26db84f7f1bf8dbe5ffb2d49e50","impliedFormat":99},{"version":"bf890587b717c5562425aa385b021ba18900eaa0f176e3e57f0d1016b647d32f","impliedFormat":99},{"version":"3428eb55e4db8b21337d9bbee986cb297e3bd788e2405f02adcb37ad371811b8","impliedFormat":99},{"version":"abd06f3aee8945b159cf67d05a92ca23d2b35a1163773eef91f7cc2618915ee0","impliedFormat":99},{"version":"c6ec8754b8ce679004c28bf2cb0f2eaeaa8de0acff94ba5082fe16ce642ba92c","impliedFormat":99},{"version":"a3005d619de5f9e5d0208596083fc7110aec861b8dfa18f681395c216cc95fd5","impliedFormat":99},{"version":"5c3ba312c2cef70f54aff90e59fba9b61101e1e941c2b3970c1353c453f25155","impliedFormat":99},{"version":"cc8d78d412e3ae3997d0075078dd2787d842b6023bed13a6d9f3e07bb1e7d073","impliedFormat":99},{"version":"eefb675743146703d1c5a1b3e8171b4b95ae65c41120425312846f90c0132017","impliedFormat":99},{"version":"5928755ef02a97a3831fe4c85f9b32aa157d499acc21b3724c911b7733804c89","impliedFormat":99},{"version":"8627e628c30fc555b119326c656a5101e92548b05ceccbf38d6b5916062fb976","impliedFormat":99},{"version":"184c2412e3d88d7acfe70bddecff9004f4610afc87eebe042272f2fb7e0d3c89","impliedFormat":99},{"version":"6f9b9e4b4f44fef1d0b98eb1bb602345f0e22e0a137ef40a615503d4e8b35bd2","impliedFormat":99},{"version":"cacf616e3fb3ea7c2880cf4d1feef47a3dbed29b0bf248b0bdd47fcd8c8b5945","impliedFormat":99},{"version":"48eb53c96dcd4745c4c8bee4d1104ecaa6a877eefb8a5b57af0f7ddded949a4d","impliedFormat":99},{"version":"e0e35716709f99220dee1be057e8f7f08e1d8134c94ad414129b79cdd9b41f8e","impliedFormat":99},{"version":"ea544bfc5e4ff015c70ef62acaf356dfcbf1f39f10f07ca3f414278094e56b56","impliedFormat":99},{"version":"7d439735b74cc5a3de2a8855fa941341dff0628d1fb2b5f2dadc10a5bb6d9fad","impliedFormat":99},{"version":"e12142b93d24c7c67fca041df35d357f21d3751eae8b2afc5684d49630d12d37","impliedFormat":99},{"version":"b1bb63b43bc374799ca0e916542b0e71a7c8bb06d6c8e5f94848a8969536c933","impliedFormat":99},{"version":"d714669ac93d063f5ac5a0dc8136e796545c6b1358554ab423d07fdcca0bc7b2","impliedFormat":99},{"version":"208dfef5e3aa4e176a5112b91b5d1ca082c28d2eb33bceb82c0261ebdeee74bc","impliedFormat":99},{"version":"8361e095def6c5f9fe7303b341c4b3249e82354f78f8ac9602a076fc5a04e3db","impliedFormat":99},{"version":"e047505265ecef24ac538e166898c74fe4ddde9a208446b298ea9805a1337ebc","impliedFormat":99},{"version":"13a9d63fe4bcf62c0115da6fce6ff28caed592d7cf3718bdf2852616a9318304","impliedFormat":99},{"version":"5dbc1632a49ae9232d2006a9283086c23676a72c2869348fab07a92ad25894fa","impliedFormat":99},{"version":"3b24a42d6ff7eb9fbdaeb74d38c2bae20b455d9ecea76759c3bed2c9a70d3b9f","impliedFormat":99},{"version":"ab15374738d77b8203d5054b306e883bc12ae980f3de59b9bb2ab3c299eee15f","impliedFormat":99},{"version":"7fd8a28b8373c1ae0a9690ea4ad8ee96da351b2ddf9fff8f0fc33ba81bd49615","impliedFormat":99},{"version":"0dbf9eb173a832b643337fab8eb3153f2f82d40648cd9d0b654f37e469dde44b","impliedFormat":99},{"version":"a69420221cdbd10d0e9298b3b94d53a633606634ad0357da5cc541ff814d8c5f","impliedFormat":99},{"version":"e706e16bc6c83d4a60da03d7a423048f244423ed55064134d0db9a0a5d1a31ef","impliedFormat":99},{"version":"b11860ace9980039b9a876c8aa763228cd2eb7dc1ff1d4e4b6791fefa8270271","impliedFormat":99},{"version":"a5f1e4c5671abc235aac21bd99603fd151232360064d2622f6d21b592fde4cc0","impliedFormat":99},{"version":"a026df81b303bd8a8256705e4ba7f7845096a35a20885403143ecc25482fb5c6","impliedFormat":99},{"version":"3ad573ea6506a5b47d89fb43f6e7b3e24c9af3dad66408349bfdbea4d0ec9762","impliedFormat":99},{"version":"f08d5516ded9072f6ef4a9bd95d4301b7f168afb484dfcdc3f9fa0032fff1406","impliedFormat":99},{"version":"3532ffeb99fb16886cad07caf0feb76a19cc1fa14a648ce6e6558b04ba91bdcb","impliedFormat":99},{"version":"825a2b8b6cac11eb3228d4cf75487a3c4ed7daad1dcc1fb01c2f67dc75fa6e2c","impliedFormat":99},{"version":"f6976b6c4bfa0dd945409221c74e8adb9ac21110e43e6de6e5564d71a4faa010","impliedFormat":99},{"version":"3ba19528d73345e791808428a0ac7f251f3a03075f73b89393d5b7df828001bf","impliedFormat":99},{"version":"ed4fe0fdd2dd66de8ce064556270713b73bb71126c016db3a755a1b9ddb2b079","impliedFormat":99},{"version":"94535dcbd25f61962f2b2c9a36098001f0529186fcd9aaefd804bc7c3008e0e6","impliedFormat":99},{"version":"a3394d25f46ed8a6ede20cf2ebb07cad72e0928987c437dbe0a80799177268a2","impliedFormat":99},{"version":"979b1767dec45cc88bf49235cc88b3bf84f9072e0cadcaccabc3f51f37dfb4ba","impliedFormat":99},{"version":"53538d2fe5ed0d17a8fb3ed894b35590af1478a2864273f64ea153dc931f5137","impliedFormat":99},{"version":"ceed655ca8647e687782de09d86aa52aaeb71a04db53f7317b294afd98e745ec","impliedFormat":99},{"version":"a19f58bc593383ee611214b5aff06db6ec0c9abff34fbde4e937d56db230fe2d","impliedFormat":99},{"version":"12f07c1ca64c24a16c6b863a1b39053ba466391a42fb48fcdc731b5fbac19c2f","impliedFormat":99},{"version":"8fa98834033c5bd66d016570ad710aaeae12014b87799f57d8c107931308da75","impliedFormat":99},{"version":"5540adb5ed9f7b2a3b93cbae6ba4cc15c9c5aa0230f0b2c4ea65df9fb2d35ade","impliedFormat":99},{"version":"237549157534b24eb1486ad6338a5b11ad017da0b2a433597ca0d62c3978c166","impliedFormat":99},{"version":"14f449fd97d14b30b7d7e74ccb5dc52065397f5a159f109a81de462cbc2ee735","impliedFormat":99},{"version":"1da1c5e42d173cdb28539057403afbdcdba7ba70d1ca88131d478a3461146631","impliedFormat":99},{"version":"84e2defcc0264038c29dc40ffcb934623cf2906e721546276a11749645d650a9","impliedFormat":99},{"version":"981a6d13fdb1a917808b2c0021adf15df76b77d15ce32942f2567dacaa636818","impliedFormat":99},{"version":"8f2f419e0fefd82149f1bee26ef5962d27a2bd1c0ef5652f4558d603debd0cd0","impliedFormat":99},{"version":"20d839e1a5bd43ca94fc3855594dddfb4b04051ca87a6c0f61dee0d2135afed4","impliedFormat":99},{"version":"1327881b3a0726661b36d1d011b4722b301f6dd1d428b82d78f1bf94d7c5a1be","impliedFormat":99},{"version":"3776840bb69fac8d6715b70c236bd06b99ecdd2c0784a2cf0be7899fb7be13a3","impliedFormat":99},{"version":"ff224ec5ccda457a52bdf0747d643ad6029bc7ac8cf898f94047361fde72291c","impliedFormat":99},{"version":"b58c384659075652971d0c6cd25ad07ae6f193ee37820bd8daee6e3436a8aaa2","impliedFormat":99},{"version":"daecca2dbb88b1b1d759e2172245e8187180d777c2066296762811a33703db67","impliedFormat":99},{"version":"caf1e76335a50ba27f655209a1089e342e44c10410c834436308266cae1a0ed5","impliedFormat":99},{"version":"a89c789678be1cf65bb4125b15b5f74e25e34c138543438d57f288d988bd80a0","impliedFormat":99},{"version":"d26ae4cbfa2957baee8a6f2987a82e597f18ad98e8d08f5b6c627e2abc5e2630","impliedFormat":99},{"version":"b640c9b2090fd42bd34d877b4da63b984f77151e8492d804a26353258e28b7ca","impliedFormat":99},{"version":"c36739f58aadbf09f620712c3531a0bdf944b16b9edcd16a6c1f3d7d935f3f5c","impliedFormat":99},{"version":"94617f973c27753e95a3f78cfa2298ec16fa4c1873360124b3fb135f94d203e9","impliedFormat":99},{"version":"949107fa4b339e34b9fca78611d63776cf5952927e500d72bf108fdef03d3a42","impliedFormat":99},{"version":"5a76d9a6dd9260f407a8dd8657179d972640b1f6736744ff397921ba891d8d99","impliedFormat":99},{"version":"309757128a194184868dbda49a9583104e10d5f8ec0b144b5adea8faac559446","impliedFormat":99},{"version":"d22ca62641feb3cc9320464b4f1599d02791ae81c96b1d62d52cb58589a8aeb1","impliedFormat":99},{"version":"5edb6bbdd99524132182d829a58beca3da66609cf5d4ffcc79798a293b77b41b","impliedFormat":99},{"version":"3dea506a24fccaa833a3b7b154751904398ab945f7507de0e99563509a0bd886","impliedFormat":99},{"version":"44674355dd062213ce67cfd3ef343c59835748de456b5cd2b13ad92531ab5dac","impliedFormat":99},{"version":"a851a0369c9c4ee56abe7ecbf3b73841f4731da108192887bc74e3a9eb3289f2","impliedFormat":99},{"version":"9760ba531aa6e82a8e9a60d101b65ddae9d398e2f91770595d9f1c5f77931e9c","impliedFormat":99},{"version":"e2b27cc682a1368bfe175961bac462ac908de1dfb49590eea5550fd5bf9a6f29","impliedFormat":99},{"version":"49b088cac71a031ab09cc6d68aaba7b57e373693c72ea56dbcca094493a543e3","impliedFormat":99},{"version":"e546f06410e5259e513d9c85f3ffad6074634c223dfedbcc6fcce144176303bd","impliedFormat":99},{"version":"c049f4fe2068d1f7954e4fed057623cb870969eaf5a71bc77b5a677bf5af3f24","impliedFormat":99},{"version":"76cf68162903a40eddf28199107e921b9c08c033eac1c07efd4dc979fd4884e2","impliedFormat":99},{"version":"41c111ea5e8946726775a71c224438a7a7009329d1b6119b1c8dae82e433f6dd","impliedFormat":99},{"version":"305af9c2a8c308a4f430c3f2b81d68119f4920ae5942c3109d1178d879a028ac","impliedFormat":99},{"version":"d0f0427311a816aed0f31eca5bed01d2c720ef0c104f8b6b62c86101556f716b","impliedFormat":99},{"version":"a5bd6ae20ff492c2ec9a0eed17d73cc2a722c09d12a8cdf321d74c40de279686","impliedFormat":99},{"version":"ac25bb824a57d31b55be466a44ebe002841d19291da64cd6ae7ce6525b7a7b04","impliedFormat":99},{"version":"1c51722bdcb3e6bdbfd301fbaf546638dcebae9e6a02716e21373343096851b9","impliedFormat":99},{"version":"49cb95b8f3503bf3bc2481d747603e5ef2d541466b96c4b349c2296def086882","impliedFormat":99},{"version":"cefd620019820a3980cd72b3e41af68a97e42e095026f50cf95e6304307cfe48","impliedFormat":99},{"version":"ed2be494a8b56779518444accb7e616f85dbcbb19043a5adfe2b2ce9d92b52dd","impliedFormat":99},{"version":"79fbdd164ed7ef0ee1d9bdb3f65ae228d6c66aa915a46154912164717a97b96c","impliedFormat":99},{"version":"c542323dc44c3c36a1576c347164ad2167b4fc8c13da9610c7cb866786637c18","impliedFormat":99},{"version":"55b13f885a41b6ae500f75d5c588d05f78bfdb471d9b04cce391aaa9a3f9f05b","impliedFormat":99},{"version":"4c62dee16a75c9b0ee2b7ad080a8778c8ed8392e5297c9e07f001148b59f5ca0","impliedFormat":99},{"version":"48eb9347a1f264669519d10aaa422de9a6053b41b3fe84911ea8898a942b922b","impliedFormat":99},{"version":"afc496c3b64cd9d58d63640845132e08e48e05a29ddf2f1aa23cd46bfac3a584","impliedFormat":99},{"version":"05c8ef07d5dfb84772cedee2faca46c8ca54d151c16871a6643ede5e208daf05","impliedFormat":99},{"version":"24ffd8a17ccccb3e56570ca53ddd02e772f0b6a4ad3c5616ae642a7e508b7cbb","impliedFormat":99},{"version":"fbd75ba9061b448f015dc71a9ea3891ea17d361e6106ac1356aee358420a8562","impliedFormat":99},{"version":"4ee579b9d37f6198fbc1d3eae2aacda3b7ec6ede001f455e6ce12aef07d5ec59","impliedFormat":99},{"version":"3d4a999e994018e2440e6dd37afecaa4154d616052df8a28e2f1a2259f19b81c","impliedFormat":99},{"version":"db1521b3a21573cf7a452af203effa3482cf0a5b8454e2af4a1f484306a64974","impliedFormat":99},{"version":"45c4a138c13303d5fcfbab589251b7869887f7eff622a2efb7925e2ed7797420","impliedFormat":99},{"version":"1b14568ba50dc5776828b4c6e1be1e7b3aaba855680eb3ac9b07c8a00414373d","impliedFormat":99},{"version":"34091b6bb864d275a0c9080bb1e72065a616d176d3eb00d0402326bf83e206ff","impliedFormat":99},{"version":"11b55793b4507c2cc763198427e11a0bd5e931aee36e265bbbf21632dbd4872a","impliedFormat":99},{"version":"e831709cb7f77e60ebdad8982c5751ba745a77573cda6f44f4ab8d4027ae88be","impliedFormat":99},{"version":"c0defffbf81eedd1d7e9f54b434866942c2ab6c5381f8cc6d5022dca5888d07f","impliedFormat":99},{"version":"e8b639c2a91e047787f660a9dd3895a2ce1200fcda7560841d5637f9583c8db2","impliedFormat":99},{"version":"767e0b38fc031fdf1ba7fa253f264912774e67d1d52ce4e852eae8c3985ba6f1","impliedFormat":99},{"version":"8d37af9291a8ac73663132c067ffb65e649254333a9dc86a1b22361fb88cf7fb","impliedFormat":99},{"version":"8cbcd14fda4ed21695f26c27018361772c9d5f754c702620f42436f0f542c1dc","impliedFormat":99},{"version":"90d4a3535371f8c168b88ab0da2562f754810e26455c95698e98b15f11da22b0","impliedFormat":99},{"version":"12df154d3dd79dc0a4b71fc1e3c5d5fbdbb6a5dfd99c68783020e56743fd4776","impliedFormat":99},{"version":"4f99756bda4a08559be8508b7e83a5be0a93dcaab68790310abc4fa09b93a849","impliedFormat":99},{"version":"2349b5b7d1a01add8c3f99286cefad821143f1df1aae0867cf813f02237a1728","impliedFormat":99},{"version":"09e449359562a9ccee76260902e48260ea75ece6e8d17abe9e7593d900a320eb","impliedFormat":99},{"version":"a6a33dc9ae9532283825868ee5af9118ebc26978ced995fcbfdf90ff7c5e2f0f","impliedFormat":99},{"version":"dd4de144ff9e9db9fd3dbca7e1fb7f639b39ef953f2b3c49240c7f2a9736fdc8","impliedFormat":99},{"version":"a0f9aae8392286dc83d0712328a0c066ff43594158ff67606b8f9c1aeb69a823","impliedFormat":99},{"version":"4c9dca53c43c6cde0627e9851dd56d958d6ae68562e2913cc3abd1ef73f9a00b","impliedFormat":99},{"version":"6914eb2bebd7fda4f9fe8db98ee09f5554a1ced9684847b3e27dbefbdb87b1dc","impliedFormat":99},{"version":"dd21f9d9947f9e4a773809cc37b0b094607afdc83cd0e79f2d97250c4501b6c7","impliedFormat":99},{"version":"2066f78e539fc3e9b9a756cddea61af372d9f35be7ffa9497c6704da56c9e61c","impliedFormat":99},{"version":"3d3fa0b2c95631d01e1291b98adf0423f2a74a87db32df8fe0c062b6db6eabff","impliedFormat":99},{"version":"bab5341c5fbc115a91a38bc1dd18a3b8f9e9f6601f898eed8bf6b56d2469b823","impliedFormat":99},{"version":"0d1fd7906b3767ccf874e84b76817b71c81836b02f9c5fae2daade6fc26f1b2b","impliedFormat":99},{"version":"828d97f23443ff54c85832f7fe1bd2aa204cc761193f2fdb95391c3af2eddb4d","impliedFormat":99},{"version":"47aa55962c8eb1bf8f46e84aacd04d89296bb9ca3a2978382cb81bc4f1c726c9","impliedFormat":99},{"version":"6df68fc4f79f293f1ab2d25951f191161ba0b13ab2c06b9f0dbba5513c5a0e1e","impliedFormat":99},{"version":"cb6bfbb5f55783ddb18adfce848dd24bcf85bb777bf77a0d71dd773cc7b62c22","impliedFormat":99},{"version":"286f368d27af276cb55d1130452b98b9956bd59d142a62b514ee6f1f98395271","impliedFormat":99},{"version":"b046da4f4d04ae2789837a9c1c32896d2d99256655b4377e1e47c0945288f9c1","impliedFormat":99},{"version":"0397b33949bba44c603a8919b1cec9428bbf84ee3c90819b080dfbc764e01724","impliedFormat":99},{"version":"7f971c8a26679b60b7765f1a9da29b987a93795909acea2896b2da567b2429bd","impliedFormat":99},{"version":"55db20deb5ce62732518b1fab73d5b3609113c027f58658c1f3104f8c9073e8d","impliedFormat":99},{"version":"279792abef7ddfc2566cf92e89447f0f2fbf3c5e1ce8e01a2325d6b56e513317","impliedFormat":99},{"version":"4d1276fa5da13705e9e23f77bf97aa8686c37670d3dbd6e85d5975387da6e9c4","impliedFormat":99},{"version":"4d43f7782e2ae2d5be0449e202e894dfdf0b5e8fcd8fea275b1b1795045ea3a7","impliedFormat":99},{"version":"4c7e9a01365d12cc787fa964cb28503b4bad69cc773e25f883ff53fcd049237e","impliedFormat":99},{"version":"791d109b55c4589a49c89729aa8df87d88ad546a322a4364ee3770a845f93a0c","impliedFormat":99},{"version":"ad2aadb0857cbc6b0a1177ec6b8944b734f5c6c9481baf77d7f3b2c0fcc5b2f0","impliedFormat":99},{"version":"319d7c7aabd2bacb683985cadfe402cf1ce13185241638ae98ef2467c111717f","impliedFormat":99},{"version":"1d8c74c5747df6706dece004ea4c537ed5080e95b90d1a1620bdaf46bb8d180b","impliedFormat":99},{"version":"2e0fbb883f847aa1bcb15d265757653f79d19fe679c2b84adc5b12a1b83371f6","impliedFormat":99},{"version":"e62d894e8ccc27d596235f8cc055ce0d27772eb13b310577ad7c2bc4e2f2b23c","impliedFormat":99},{"version":"bbb48c9b123ebf986aecbdc2085387b279b9db9822a99075135c164d4bc12c99","impliedFormat":99},{"version":"f46ed0abe3275015dac23dfc2f7c0d7aba8d7378f9dec9a0dea5f9565bd6f582","impliedFormat":99},{"version":"0dd3e4ae8e0f3470f2e5dc1fd95600e2f0753112d3a7e0f61225a81e8389a6c8","impliedFormat":99},{"version":"8fb8660a87df46177ea76db4338c4475b8b8e7e42e36bf124195489cb6fc9ae2","impliedFormat":99},{"version":"55f0aea7d8e5668fd2b74231106be4dd6c75563e8e794a76b8539c5320a3b41d","impliedFormat":99},{"version":"f42f470b9934ca024afac9c220e5c57b5b70de2383a821e3e7d58b5de29f6646","impliedFormat":99},{"version":"22f011193d780d619a9a4dc9fd0307bfc0c7869d496e371245d50b72a0e1d0fa","impliedFormat":99},{"version":"acbdb315c0433c6832fb64027dd421c1d193551e20b5da391cdb20c6b8f95dc8","impliedFormat":99},{"version":"d7ac7a29f5fc29b2b157fd2ab7738946597a29b5670c2290d4b81aada8fbf6bd","impliedFormat":99},{"version":"7f85382c44340cc8c380bfc3dd2e5c69c280308538044601788e2f1ae3e55a9a","impliedFormat":99},{"version":"7d7e9f13134199ed1b0cf6c8775a614c1bf4341ae74edade456500546ab2776d","impliedFormat":99},{"version":"f57d7c9fb29a389e44af09d54c57d9be1a130b80537af035334f9a8f2e55fa76","impliedFormat":99},{"version":"0f76779994fafbeee4d135c21fb87d35b81c6fa913ef85e5b6bccb3ffcbd57db","impliedFormat":99},{"version":"64c4f811d9ace920e8df2522f72905cdeafa7812166416efdd51a9350d361628","impliedFormat":99},{"version":"cdd9d75a5e91d288b1f009ed8d885e29dd61d04cd12fe66645a69e9364fc2fd8","impliedFormat":99},{"version":"c81859d7edd8ea8016c3ef669bde80a68a0a8e85440307d6c07c0e47e6e70a7d","impliedFormat":99},{"version":"a1d72f11de9816b4776ecadea48d9c2a8c486cd8b465b674647557653a151a0f","impliedFormat":99},{"version":"33b8b6eca734548828961d9ecc9c21f729f08bab8c2c9d95c9ce772db6431f94","impliedFormat":99},{"version":"1861836a3156845df6c43d92e7634515050e349eb569d5ee523e25a2ce6dbc55","impliedFormat":99},{"version":"4dade3290736a203b3e191085b91bc93c9a51dfe608211d314ce688a7d1915c7","impliedFormat":99},{"version":"558b4eb69385b53bb4f76dfb9944da2b324c97f4cc915f8a57ffe12adc08bfc2","impliedFormat":99},{"version":"57b6feaf806b2ba926d3000f59436460462d6b551397322dd983bca10cb82083","impliedFormat":99},{"version":"9a599074752221456c6ff3fab0a9e5e42318e610bb21a23c1364d12b0669d01d","impliedFormat":99},{"version":"17854000164e5e5ef1318f5f542b770d80b0374fa95ac023e01a91440d93de35","impliedFormat":99},{"version":"fcaf10eebf077d5a0e4be81424fcc296905533359c46ba1198c41e98e957d70a","impliedFormat":99},{"version":"71d9bf57ae0b6685fa69e800f44a0e040d1418f74737bb590d71374f02a14f5d","impliedFormat":99},{"version":"a3e8df36aeafd3a63629f85cf72f46be39de7f350af3cbc40bc7917f41b36861","impliedFormat":99},{"version":"86fbc8e6592abc2775bafd3c2b2eb5cfd0e37c4d57e0893523dea6d67c19f05f","impliedFormat":99},{"version":"14a976b28005d68fda91658eec498db736406afdd383a6a4e674ba2528815348","impliedFormat":99},{"version":"e6acc224ffaf9707ce0d3914ce46ed083c7b6469a0f195543fa7cf64b648d4fa","impliedFormat":99},{"version":"8ec434028fb805c17f244b68ccc992391ff8ec6ba0c4bed1d04e51741f344e90","impliedFormat":99},{"version":"e2a0a09c2e1fab39ea345ec351a93f93ce425d2c6234606e705b3a6c84b8b46c","impliedFormat":99},{"version":"e036c82ae9c6a656dc591ddd4f68f70377e6900e7e4042769d4cea7d215bca3f","impliedFormat":99},{"version":"248ec4811949f314a09307eae53df10b95aa35546a9e3dc6363a2916b02195c7","impliedFormat":99},{"version":"e435436a95eb581e852b35d6f5eaaa62be7a8bc6da288254ac3394c60511e5d0","impliedFormat":99},{"version":"5cc46f1e20556b157f798a8043e6447c88f118859810d55d9b845e245b17f2b9","impliedFormat":99},{"version":"20fa43bd305c2a0f27590ffb829d5897db5160044136e1c216239a8fb91cfc60","impliedFormat":99},{"version":"3c9a0663746013d1a7f2085ca9fd23d4a1d81831d105f55d83499643db339a6f","impliedFormat":99},{"version":"cbf9bfc5883bd84a49685342affdab376d54622d075c360c1e9ee0cb1a52176e","impliedFormat":99},{"version":"b67eedd415da9341688bfc4897f67951e6f6544130d339d631c578d9ce5179d4","impliedFormat":99},{"version":"74dfe23f35f7f780bc43517662cf6bf54e2340fba8c96499a9345f5c54310765","impliedFormat":99},{"version":"216e481f8b352b3381c3ca193245c9e70eb988f13b11c90560fce7f58046d9e4","impliedFormat":99},{"version":"442f979c95b63bc7545f20a9dbfacf969a8bf8d50f38ff5e8647883af962ea90","impliedFormat":99},{"version":"7ccf30591af329e39435375251583e00f458be6e9412ca78457fd618c3ed3219","impliedFormat":99},{"version":"0e4023053e2d67cb1875fd3fccb3d9719dd35aa7ed8dac2f8f0a6b83eac1c619","impliedFormat":99},{"version":"121d72cd64ce108c997080ae85d77526c0bf92cbabd595e85b22cc5b2eb5356d","impliedFormat":99},{"version":"2e58e0a3705c2c5e2f8990d9fe54a987140eb6b07d39969667fb5a61e0012164","impliedFormat":99},{"version":"0ac60f7dd28ae5fd26af8a26038bff0a0860f2a934bc3eff3508b9ea606100ee","impliedFormat":99},{"version":"23e86961cc70c48457a30b54d2a7cb321db04ec37a2ce709a558935874ef5980","impliedFormat":99},{"version":"813924ffc37d482abc63f7809402b6d04bf10ced84ceb0ce5b593f93000b0738","impliedFormat":99},{"version":"d39f8d34fef31f645d4a5036d21b6d76f1de2fcb002cd976c7efae530249d79d","impliedFormat":99},{"version":"3dde9915cefa4b06bdd06d0afacb2008400eee07fedb70cd4fe895be5d7c37a1","impliedFormat":99},{"version":"6fa7984697bbae60ab189ff7930691b20d214c1fb68ed6098cef5f616ac8d3d5","impliedFormat":99},{"version":"49cb62a7fa903a66787723065158a23455550d938649544b9afa0fddf13da5a4","impliedFormat":99},{"version":"8093af89ce523d6325f01b1502b431dea33dee468ea0b207f3ecb6b8e8c869fb","impliedFormat":99},{"version":"1fd777885f679efef7156857398a8e40a65f48f9d4b53b22188593e5d9a67f7d","impliedFormat":99},{"version":"381f82f83cfc6930ccbc008af3091f09a75242ae15d2e04632db7fc4e44c0080","impliedFormat":99},{"version":"fbca59f60b22cd0db89922e7f057c713b027aaa1e2c2818632fea718f8200632","impliedFormat":99},{"version":"1bd895f3a629b01cf0ce259e989e8091ef945cb39e29bc4f5dbb35ab66718b91","impliedFormat":99},{"version":"ba8d03eb92363477a46ccd739f48b8a87432bc39a4e0ccadb1bf336c290b103a","impliedFormat":99},{"version":"6ec0dc970053f2d727d22210393569ebedb4ec3a53c0a5e4ac0cbfa179814ef3","impliedFormat":99},{"version":"4220374c20d714335b11a60a1b0392dcf3c0ac82f0773466b731c3ff758a1fa0","impliedFormat":99},{"version":"ddbd6bec7bf000be900df2f6ad03461580cb94c02a2b237d601f091c7f749ee7","impliedFormat":99},{"version":"a4e2ebf51e2314ddbd330380d53527e3acbae6d1fb4919c35f6e6ec534eeca88","impliedFormat":99},{"version":"8aadedc389b7ce3087eb1ef11b85a79ab2b15a418ca0d469159091f33359096a","impliedFormat":99},{"version":"351223dcd7cc1c134826feb03e21e9d40d39497e4641f6640b5b5f118c731cc4","impliedFormat":99},{"version":"3b112575da3840ac278f8edb8898acb94b9c79df94b041b4eb17e3fe1263a643","impliedFormat":99},{"version":"902151bc4db55dd270dc9f38cba4f06c2d5fae54c519677cc3e1197335c58581","impliedFormat":99},{"version":"0b82763f479497a1517786b27d8826d3640d15af245804d322eff12710c5a652","impliedFormat":99},{"version":"c1109b59c4c5033695016057e596c8d34abf048a3e2c1b28169c21b22cba56b3","impliedFormat":99},{"version":"8a35fefe86f688f467c8bef9bf7b465e9be8e5b3476504096076e535127ae3c9","impliedFormat":99},{"version":"00040c315b5da891b7368217aa2d92cc5333f92ea0272ef70806aa5a16d642f1","impliedFormat":99},{"version":"d32d0644afaa7ab25fab4ba7f0c30e194cf211463a9100bf406c24f67573babe","impliedFormat":99},{"version":"9fac0a75a13381632fc5bd29ba84c5f6706c11c447adf8f6628a9ca519c2914c","impliedFormat":99},{"version":"986204e16e3297bca5e64b327e52f9fc4c65bc34497227f63b1a48bfcb333dec","impliedFormat":99},{"version":"824b4ef28c193ed47adf80450a0b8738313561707fe300eebac14ea2405eeb04","impliedFormat":99},{"version":"b634c2e561e3bf8efbf1b79060a9bd5b26022a71574900c3e124a14bb4c4c71a","impliedFormat":99},{"version":"76b8eeff48c0605828e2037ed6bf67d25675860a2f6a8fa1848d3930c2ae871f","impliedFormat":99},{"version":"d7ffc3f3fb6c878d49a92e0e90b737cb09642f7044d6ce3bf53f5698580d8066","impliedFormat":99},{"version":"5ffc2c7cc0be96e71688f7a0062f2e85c6e68b21e605d073a5a6c6a1f3a2a5fe","impliedFormat":99},{"version":"8eae28b0fd19d123cc1b99840528bb1cdf76ba7f0b15034da949d73aacb9702f","impliedFormat":99},{"version":"9b4cc49d65c87c5c38ac19676dc14aa914b13b66ab2f8c93c53a65272e0486a6","impliedFormat":99},{"version":"21c521798aeb2a82dac296829f7450a791b6f154b8a8208f77c0f7370d5f34a4","impliedFormat":99},{"version":"a383c2d014291b0810ebc39adec74792c53ac0fdbd1ec39c87779a8d07e7ec9c","impliedFormat":99},{"version":"635d4c2bbb40d953dac16ebcf52b123b4bc86e58bf6564d0dec062a4c489ee21","impliedFormat":99},{"version":"eb420edce35fac3ff390bbb9d2d98325db9c11a2cd60e0cbdfc1b118b62cf1df","impliedFormat":99},{"version":"f4d93034f0661b40ba9cf90d7d3474d5c0be65fb7f4f3a1d5e9c34210aadb6aa","impliedFormat":99},{"version":"1ebee1d844f9cfa95e5315d90140f87eb1519c8739e7a51111142d3838ce31c4","impliedFormat":99},{"version":"4f8e5dda56f05c96d1f567bb96f32e81039d21ac9af5b4d5fec500f090f21388","impliedFormat":99},{"version":"6f74bde7fdc1ca03aafef483d4f1b0ca50489094b0ce52ce5741c71635494d8c","impliedFormat":99},{"version":"189a993d40cf154596f0becfce65d93b0e3d8c62a1852b9506d86d68b3702d88","impliedFormat":99},{"version":"c1d358eb44c209b7b5ad87abd6d889e28513718dabb6802de8844e517a89730f","impliedFormat":99},{"version":"dfce10bb8fb7c37e9625e889e27519567aa36329ef0b42094dfeac141dd45793","impliedFormat":99},{"version":"dae38b8a375a2e3f8820861c302e675fdeb6981276fab61ad1668c7596e7deab","impliedFormat":99},{"version":"4967ae99536846dd5ac9f3af41ad296b9c36d611a52d7b00ad686304bd23d71d","impliedFormat":99},{"version":"e053193d1742f8702be0bdfa544ad435927557f7ffe67a23ef92b176e60a7657","impliedFormat":99},{"version":"4f1c51f422685db98ead37cf10e723379d21cf990db0d6fb8000b48ea6c254ec","impliedFormat":99},{"version":"951543da1d33a4ed5c53714a1f4ec35b51f8a1c61107649c5ba6d9a1d2146103","impliedFormat":99},{"version":"d763c971f8591a21a1f01c101ee8a769e52e412fe7b1a455a9ea71dc88a758c4","impliedFormat":99},{"version":"b4d7cd9d4092923da05ed18680138dfc72f236181f5618553d75e0ab06f67964","impliedFormat":99},{"version":"2784337e4229d64fcfceb6c4ffebec4d7fee7ac312a316f8eac1a4f760ae20b3","impliedFormat":99},{"version":"63db0b6285f515f8ae6397e307d3b26a56a5249fd80bdf7569ab4b87aa87ca55","impliedFormat":99},{"version":"7ba72b7633d2d2e507f07a59027e24505577797753965b575416ce8e89a04270","impliedFormat":99},{"version":"1762e04cb04fc69364160a0e3d121c63b85945f842575f5e3abc0392acbdaf81","impliedFormat":99},{"version":"b96cdad7e7b0fd253213617c6f76f79444e6c151415584d9195266a9203b4206","impliedFormat":99},{"version":"71663fef9e157f5257a31408ef5aa7fb4774f245de27cd9c618d4f45db01f19a","impliedFormat":99},{"version":"ff8a53256414952562c88aba30a7a2492b86575686c997815b307b1f10bdf784","impliedFormat":99},{"version":"279b59c01e2739e252d3609d4408cd1e67ab977df56f9547923496681f600450","impliedFormat":99},{"version":"d50c4d520094e034e1cf9f4ca262a856b53c67dda3a1959057278317206e5f86","impliedFormat":99},{"version":"39637b145df70dc01000bcffbce1990f85327b9e429d5d0be455e7e1efb235a4","impliedFormat":99},{"version":"afe91c616fc7ef7f8e212efb62c66d8ddefd1b8de2582997f98ac57a4d0a7655","impliedFormat":99},{"version":"7326c8eb2ed751b126ca6b25e9d8e9db67556cb40d5ea485afd7518db9657ba3","impliedFormat":99},{"version":"6ff130b441bf073004bb7fdbf5513fa7bededeb5ee9add10e0e395738eb5f4f7","impliedFormat":99},{"version":"272e5e5ad2298abd3852b0f5bf896ee1284a60bbd9e4e45c961d66fdaf309655","impliedFormat":99},{"version":"02ba9c57dfa46d5673abe376a9c35d03f3f4100b4d9c5f9355e0a62bfe8c16cd","impliedFormat":99},{"version":"35a603a9a038aa340a6cfe26b59a9ec2d984da2c5e63a3c46c40113db6635ed5","impliedFormat":99},{"version":"670c15b05a76b37a6ccc1d2e381c7a1780d1288b50751a037c3809c7d4d433f0","impliedFormat":99},{"version":"fdf5d761568f1bb4a318f8ec9f33e99d1f6fe3d7d1a1f573605f29a03b4bc002","impliedFormat":99},{"version":"ae8bef1c3edc4eceaae9df6bf6a046c52bc4838d2344e2bcfd55b84a5c4714c7","impliedFormat":99},{"version":"358b82dd6de9956c92e1f6aaedc4432bde6a8cf4a9b2cc18e6cff0ba2787cb20","impliedFormat":99},{"version":"15811478ecd27a7b1369df74b7135e8ad8a8352c35dbb13035cd5ab2352fa0a7","impliedFormat":99},{"version":"c0ce7088c30ff91f0ff8d514b7f8dcace90b65c554b8a3027cf864f558c4cd80","impliedFormat":99},{"version":"4b49f46b98cf981e1d9f0e75056c458f0c242ee7661f1da3e6cd8eba7b599bcc","impliedFormat":99},{"version":"d7033cf81e6636c20362085d87152a2478c2529db0fcc1eb3b1c0ef152caa132","impliedFormat":99},{"version":"95417c140dd26defda52f7a4bc43500a0915d931308c85866136f829d7d8c88a","impliedFormat":99},{"version":"c2668c0b8cb8bde3d7e6901aa6eba98963785e887668eebe974e8df49a44cdc5","impliedFormat":99},{"version":"bf028ae34f02d5604c337ad4fcc8541ce14e977c3bcb3e7f43bc396af5721494","impliedFormat":99},{"version":"fa1ef591870037b5eb045e5d01902f9015ac8553622a8c18dce178cda3f981a3","impliedFormat":99},{"version":"8a14c1e4557c91f4ca586e0762f423f699e6b97ee5916f548c68966624ed0a0d","impliedFormat":99},{"version":"ebf000b79f4b3d3f8fe4c1d1dee01b12bb82262750598e382444c2f4c6cb6e13","impliedFormat":99},{"version":"df0211c66f5be54737f0d9f4f9b60261365caa812962343f8d4af61c62ffce56","impliedFormat":99},{"version":"2e6b186c28e363aa0f3144864f74bb0bbcad508f91e4f2dd7b652aa32abed04d","impliedFormat":99},{"version":"0593c7918b3a884cbaae040e5c53c8534d0b7cb2dfbeb923a3b6af15cf597690","impliedFormat":99},{"version":"103d7201704781b7503ddeaf536ae71aaf9005d861e9f9f00ba2d5b7c9131946","impliedFormat":99},{"version":"6d39e1758a21b9b1f7a33aa4068bd2fcf9d83f202be716bf03891f04cd11e607","impliedFormat":99},{"version":"4661c14dd9c9cea4b7ec3577adba9b05c554732cd21e51a9a8d67d55cd923035","impliedFormat":99},{"version":"cb7d54e8e4fb0979f0a528e1a40ee833ecf3f2b40cf9db8df5987576359c9a89","impliedFormat":99},{"version":"b3803db7a72c9399c5285a136497140d15618995742f06081d9c2eb52c607b68","impliedFormat":99},{"version":"2a01ae25af7e6725d8d5489fa2aac7e2c521ad4c072fb58f1c6e3bbddf4d913f","impliedFormat":99},{"version":"720a99ab213d49587ddb67dd0cfe541b0cc1b5f6e53ee916b75319bfec2f3ebd","impliedFormat":99},{"version":"81e828965aa9c2efa7403a7a4a533c51e22b618912a03d035a042eb82d1313f8","impliedFormat":99},{"version":"168489d5da3a1925ee759c4ad8d031581cf887a2d305602b4a658cc23ae44106","impliedFormat":99},{"version":"6be5fca571daf55f2f6f44aa9b1497ebacbf3e03e6708e51733a6d84575754e9","impliedFormat":99},{"version":"a623e124420520aaf6077ebf64567f3bee65a6dc3773a1332f0ed513f7f49ce0","impliedFormat":99},{"version":"4d75c7f4eb68d365da1731fa1fa0170895aac801cf21a292dd0503763994f3b7","impliedFormat":99},{"version":"06fe4e250c71760eae5020c88f85742299af8f53530ad9ab937469d5cccd7255","impliedFormat":99},{"version":"0adabfced9aa978628b37783f1e59aa42249a0b7b3fa7b09312c7b866fa3328a","impliedFormat":99},{"version":"7f2cdc3709d66f6004bd77cf9359b467811dd37cb22c00c8af408ab74375769d","impliedFormat":99},{"version":"adbfbc12814060b647c81470c08f3420d89fc93dd1c45c422a10561e3bb6f13c","impliedFormat":99},{"version":"5f1614f54f178ef74d4b33e5871b7a7dec7d330e5d94b28321dd9d32546dae05","impliedFormat":99},{"version":"9f741273f89ff4d1ca8586715c40eeaeb7784d30a9c8324a1dfd39a06371be97","impliedFormat":99},{"version":"9885942ed0ad172b90b45bb4af647ff107a867529534e991f0a112d900d0f215","impliedFormat":99},{"version":"0c262fca6a1199175283b61213d6c6b0646de8584ba0602722eb95b9ad9dfd1b","impliedFormat":99},{"version":"39c1c529a708d276e7f9009b6620063290c18e4c916fc3093d308f32317208d3","impliedFormat":99},{"version":"f2b5e36f2402b53b809e2f64b8e020c6a7637ebce13b95fdac9c26e1a14d7b74","impliedFormat":99},{"version":"8680096ad4dea123f9c49cb0a5deb1fe7a625c93f1a50c4516610925749c03c7","impliedFormat":99},{"version":"0f619545bd7f204050fbe17ab02fd6133ff926467eceda17b430eff646d72ffe","impliedFormat":99},{"version":"923fa583f765c8c013082e64f937b199f980b1b15c40bc3f583b95530e7d2d33","impliedFormat":99},{"version":"505e2b29b7aff97d5cfa06b644a73af595cbb2ad62514705354111eb4a9d25d4","impliedFormat":99},{"version":"0626be91af9b502263c02d30f54462d3b3d441a317caa2fe6c690ab8bae67897","impliedFormat":99},{"version":"0282f7c04ffba8d50df82954017daa8a653cc71c2fd37ccbb87c64105176ce32","impliedFormat":99},{"version":"32d95fa1add10335cf6d98c640a47ebdae0e542b4b2d8c0a302455933810ff54","impliedFormat":99},{"version":"18da6199a28384e4287fbd4035fb4e3602a144975228b436c40371b3a31fd0a3","impliedFormat":99},{"version":"22ff98edd221e6aed5bc9ef9f6a1f090ecb34a1cc465e5b2f7c6b71789238447","impliedFormat":99},{"version":"bcf15f71abb2654e027aa15e6cc2c6b1a56e2a015a4bda6b1215b780b9cce61e","impliedFormat":99},{"version":"b390b5480af1df51fbb3b9bf2140ca51fb96cd6b577ab53de8afe932c1029951","impliedFormat":99},{"version":"449439716e67042af43d9c9290ed4c49bc46854b77273874f7e7f4860b52bdd2","impliedFormat":99},{"version":"a3eeb212864f2cbe7a7e7946425365b0b1bfa25f93e975f622d760738f72cf5d","impliedFormat":99},{"version":"326be804404a38c9b39ef236e45fc4822c4287a337b5d4d2162b7e5577489ee3","impliedFormat":99},{"version":"46d6be7f5084b138f83944e3550fa72591935fed3679ffff9447e2c4c64c5d82","impliedFormat":99},{"version":"b1a7f35702d8f723354d2d69d8f778ef8ceab7f690ddc7fc7ddeea2524c5075b","impliedFormat":99},{"version":"770e7572cfd883ddb4d296572cc49e4183a9299fbdddadaa3f15d9e1643154a5","impliedFormat":99},{"version":"0a0f7ac30acd0ee10988b7fca9c3829610f98b53f83b7e5c7ade6572fd4e4849","impliedFormat":99},{"version":"153bfb6e514f8d63ad14385ebea4a499d36c0385ee58dae66f9dac2337291d2f","impliedFormat":99},{"version":"5d7fb9ed27493c65389f521ca859506d10a6b7e6bbcbdfffb84ae993918037da","impliedFormat":99},{"version":"5bb4df6cdd57a24e32fbd69fb6adf79c3dcbbc4b802a8f3d893a5aca37d3004e","impliedFormat":99},{"version":"21fa1d6be54130de54330ff4c1437ee0baa70d8dcfff4d1c4a85e558875a8c89","impliedFormat":99},{"version":"46439b4d9e8742c3de2c32b1ef4962af91612d83db8a2d77733a21883cb6d976","impliedFormat":99},{"version":"2813b5d86a9e0a9986104fdf4a2a37cbe868a6e17c5e6e3a1abcdcbe1cfc93b8","impliedFormat":99},{"version":"d9450d1102d1179b0faf3baab898c89596c1078885278f94a1aadc4f70049312","impliedFormat":99},{"version":"0f76b54c6dce2b5f193c87e6caa0cd7289ac10781ae342ee6bb7af0ce36cc32a","impliedFormat":99},{"version":"2867f05c20a2225b4c1c8ffb1b5240d30064527fb7a5b1750bd41a89d6c4c8d7","impliedFormat":99},{"version":"1fc856f4fc93907ee59c01efd8edc6b5d49043e3766cec4bea5fa2c2f2f4edaa","impliedFormat":99},{"version":"b864f5118eb5e45345fbd0656be02c88fdb5358c589ad6b5c66ec19f4f0e71a8","impliedFormat":99},{"version":"aac54061ec7558135b4f676212c89b82c969b069342a42f1d5ba6d30f743cb6e","impliedFormat":99},{"version":"d84163e6c4bab8b697bf1c8b0c0908f404df2384b47da63914679f90c0a56bb9","impliedFormat":99},{"version":"ef519ebcf62f2c37cd54485272e42e21bb966b2c203b3565fd265ffee1054a7a","impliedFormat":99},{"version":"fcd2b3eb9f11f2bae710fa4d7a596dadbf1a465b8585f05db63a28d93079b838","impliedFormat":99},{"version":"1d8ab77f40c29a333fbba3585751b384005ced7d895d2c947f146a95413e9951","impliedFormat":99},{"version":"809337f529d322c198398ab84513d7b4dafedeab24179221b6b2f1dbf0f05065","impliedFormat":99},{"version":"60548d44220d4767d7ab2ad9461d664d9aa71afc9e44e03056ad380ddeaa1d66","impliedFormat":99},{"version":"2187909b7da18743b0dacba6e2390825cd20362ff44068e0d47427a607eb22ab","impliedFormat":99},{"version":"962cfde9b7e05989a758aec98703ed75159c40e212df5cec74381eaff82aba98","impliedFormat":99},{"version":"72ffd8535e8e7025b7969c8461c2cc456d23ff175103df046b4fc55a61a38211","impliedFormat":99},{"version":"c890c291338418ad77c86cdce322a8f750bd9b4cd9a456b6363da72549a7a94c","impliedFormat":99},{"version":"df2768213ab37da8fc9ee6cc9f24f4a32c62e874d28625277b6b12f944d4382a","impliedFormat":99},{"version":"effcca1c88335a4448160c1dc7bfe98663f38a67796ee11a04d7bf9c568c8373","impliedFormat":99},{"version":"cde28c7dfb93f6c7f8afb49e6d3a8f8bb577803c7eaa2ab4f02a722d1453086f","impliedFormat":99},{"version":"b05aee7d890773c66fe01f130ee432755c5e0b0e9857e87deac88beea7a57577","impliedFormat":99},{"version":"071091ebb5656ceaca89be5827e45d3367dd7e5f2b51589f5cee241116f33028","impliedFormat":99},{"version":"6324f22adfec34e153717b6d0f416464b8bed2086a7f301fb187cce198e582bc","impliedFormat":99},{"version":"882daca29017e753f72dc0ed60ced6c7ef8c9455bb865f95ce6728e8a7b405d9","impliedFormat":99},{"version":"85cc6f0801e8718042f3116924db65682fc16ef48165136fe136f39d42cf097e","impliedFormat":99},{"version":"61a82094c65a52eff9ff1986c6082e361b0485bfc9eef3c44341f26fe53d1453","impliedFormat":99},{"version":"3b03dfcac351c5c9e0362f081676d3adde495b3d07a8a29f4642bc261091898f","impliedFormat":99},{"version":"909ac7b41961cd1fef0ac5d31d2765c72cc82b4de3a184154b48bc0247edcdc9","impliedFormat":99},{"version":"20fec64d6a21097265323e83c04be9b68e07c26624ba30f05ce53de89fb01571","impliedFormat":99},{"version":"a6d376714411e99706294f4288fa3310d14aa3e211040580102c99fe8c87262d","impliedFormat":99},{"version":"2646752b05b717bd2900551d822735156de24591a2ac17d2ecbf713b5b13f90f","impliedFormat":99},{"version":"ac0ebd6f1cd412a64edaefafc74d7dfb6ce12d03ed88850025622c3e2fa2821d","impliedFormat":99},{"version":"fab8951025c1480a7956466501e4547fa69afacd8a86b6079e1d1a7bfe7c43d5","impliedFormat":99},{"version":"ddd2c8020e0d3e479bd12e739744dd4eddfd512706ee6fc8b0d65b58e234af38","impliedFormat":99},{"version":"027d9c5e810e507c637cb8022c9d44445bd5e3a3c84c5cf55bb2fe67d3bcfa23","impliedFormat":99},{"version":"3679e5a37ccea0b56e73b6d42a36ddbca0a6fcc4119dcb34e652b0e2cb7189c0","impliedFormat":99},{"version":"9e4b60c3965c575a33156eeed8b5f8d5de378793aa1b976189aab25e6ab48ec5","impliedFormat":99},{"version":"73ed3cefe0c0aeb059cf27bafb51e843918087c843ff457a871ed3a074c9aa5a","impliedFormat":99},{"version":"d35344448dcd8a37ee1e2a467f8e9d26c388b712ee3d24a3aa4900585b5545dd","impliedFormat":99},{"version":"3ef76317f676e81cb18eab1fb7e6a1ac60015a57fd679430ed8d1257a911ff89","impliedFormat":99},{"version":"45eee0eb80e0b7604390ddc34fe455d0fc04603d9e4829549272f48c8942c7b9","impliedFormat":99},{"version":"fabe29b682338fa7914d62f21609e4dcbaee9f93ef91adf6db64de244e8140f9","impliedFormat":99},{"version":"bdf0099507aaae26031e61ece1c443799bd090bc99c6e42baad4cf7e9611afea","impliedFormat":99},{"version":"f24ce130c62b7f407a3cea55bd46eb78282ae1e03a5a980a7bf73628e3a25dea","impliedFormat":99},{"version":"cd6e7a1b92dbfdeb233611cb452d8eed24b949cb029f97bef483a5fa3fc7298f","impliedFormat":99},{"version":"09edc5752759a8d4d1fafcbaaa9fad6bc6f1b3ce1a422262ffbd0644f8cf5f30","impliedFormat":99},{"version":"3cd21ebde7071845559b76ee05ad428c5325f788c1fe22e9de4d81e77631fac1","impliedFormat":99},{"version":"542ae7a098c4b7d9ee35b2ded57786de1210bb12845b23605221030b17e04f55","impliedFormat":99},{"version":"8401ff0d8b9f30a8a341ec7269f234d7152177d6a4131e0600e7bdf489233917","impliedFormat":99},{"version":"66a26a0d221fe38994b72cbae8515a91afd5928e40d2f64107ce6bb8fc81375b","impliedFormat":99},{"version":"50594b654ca71c8e7c09bbf175cd34d5efdab5ac423fcb19fd8288456c0eaddc","impliedFormat":99},{"version":"c18cb17ebe4e2417dd2a31a2a4979cfcc72338fde7c9f32768023139c41ee521","impliedFormat":99},{"version":"28d23dbc2c8d8dd21e9b397ae08f5109cbab3a0599df0248190b0cb396c5990e","impliedFormat":99},{"version":"fedffc2d00ff968dc10e3e076f5cdbc5d7ba1e8bda6158bf0ab4286711e1ac27","impliedFormat":99},{"version":"93212dfc3cd9457c7ebde8ed4500164a895d15b55c9f10aa4ac46ffb455c2499","impliedFormat":99},{"version":"f0ab96c940eb748ddfb6f3b1442393759257e624d92034ca6e9698b41a06b2b7","impliedFormat":99},{"version":"823f37edf2f78ed8fd17a59f0837ffefc4b53cc7a0560bcee95bc58626fb9b6b","impliedFormat":99},{"version":"f6439fe717e31e5d222d7e91c5c1082d280f9bf9209474fd7542c4da31b69d7f","impliedFormat":99},{"version":"49126f1c0cd14332be63c13677cbd1543c09362488732b7cd926c8be1fa5a5b3","impliedFormat":99},{"version":"17fd67f8069c954e24fb5ef02e4c97fb2c7b8e5368982ef018232ed2b16b9e9f","impliedFormat":99},{"version":"45be37950ed5f5d4e489a93c3a278811e6685f423d552c33f1518df9c339b5b6","impliedFormat":99},{"version":"0b8f5565dbf8ac71e1f0e36cdf6af9d5e595bac817b1cb49029a387f77a97f35","impliedFormat":99},{"version":"1abd78da038403165528314141ebc823a6adf229febe585828be06e2888b8b52","impliedFormat":99},{"version":"4b068760205754ede438631a83b74443ca9221c47fb5c1026e488a6ff7154dc3","impliedFormat":99},{"version":"10e52fe23fd22927554a0f6637c2f3814aa50f4b449837e84d7c3849c5ace8bc","impliedFormat":99},{"version":"9a695b27f81d8dcf4f4c1ace9362bbf86da55a561333ec22b028567cb77ad167","impliedFormat":99},{"version":"69fa3b563bb3060113c7d4962a0da9fc7d0c1981c1781bfbd776d06761ba7afa","impliedFormat":99},{"version":"45adca51ef386ec97e2b6adeb30bb5bdde8fcacc9b4e6bd7d36b293acb3f0037","impliedFormat":99},{"version":"edfbb6fe54cdaa69a492cc37a4ba702f9352324cda30260ba2dbacc1bc60bf49","impliedFormat":99},{"version":"1648015d9dca4246be02ed5099672f2fc3d2e1f96c4bf38cf312d52a9a36f821","impliedFormat":99},{"version":"f018e038cb0609449172a9ad1130578c92e65939b70374c0847681ce9eea5a53","impliedFormat":99},{"version":"63ed53d5a157ed6749e873d0a4dca4338b86aefc123a605924e4ecc31fc7d3e0","impliedFormat":99},{"version":"602490794c1c63022ff8f03a43b9e3c9464df0e23b2cbfb9a917fc94f4e1239a","impliedFormat":99},{"version":"790d855ffaab4826fab11919a2424117f1df2263cea00515db5d9da27c712f4a","impliedFormat":99},{"version":"b16a21c46be0065ba851366ed933110e7fcc047cd619859cee6fe6043f57eb5b","impliedFormat":99},{"version":"973bd4ce6836a2b7be4281e63be46a02c73c7cfe0f739ec66fba5f64fee42172","impliedFormat":99},{"version":"c95df61205ddee55c0f36488d45eb36923536d1ee7fd2c123765920d0170b903","impliedFormat":99},{"version":"921bc19e17c9b55643dd6bd629c1821a17b9113ed445720c10fe375513aee2de","impliedFormat":99},{"version":"2a596c7487235cc254faeab8d49e084d61d53ca89e00f86da42a5eac0e702cc5","impliedFormat":99},{"version":"063ca493742dae520916addb5eca31c3e0bf6c58cd0f10f5ed8da071d8cc3e58","impliedFormat":99},{"version":"de562ae720d5251cdb274522070f5f5f89a4ce3862043eed99d9456e63a212d4","impliedFormat":99},{"version":"8bc9b778acf6bf5388bea5499cd5b0f4bd7d4c8ed85928dcab7e77038b1edef5","impliedFormat":99},{"version":"17f91aa1a354b537cf970a819537ce1e7a2b2dafca7d4b1b4d0894995c804b2a","impliedFormat":99},{"version":"048f232a281458a0159f024678c5c8651274885d45f86b0b21ca75f5b5ee6c53","impliedFormat":99},{"version":"1bceba42b5425ed2aa158afe916e36e88ee0de33e2f98b390247cfe045061f12","impliedFormat":99},{"version":"e32e2962a30e289b4da7cdc87eb2a79d0102b9abeb37b302b433554faa32721f","impliedFormat":99},{"version":"dfbf0fe6cdc27050ac69f83fe64bfb387dc40cc653a0b559f3ba5185e1e78472","impliedFormat":99},{"version":"f7bcd657a6dafb80e582d43f4bdd33a83b58376734faa9e20cfa9b6030c7a2d9","impliedFormat":99},{"version":"25357858ef183078a99a52e14622266027cd95e2f8a81fd280d539aed447eac6","impliedFormat":99},{"version":"e3b6ecd2f0ec008a7c2f8471bef625c49277dca2a6173a8cffaf920b2b1bf9a0","impliedFormat":99},{"version":"d446c4afecf40dfb4ba6b32a7ed85b5767c145e1e223d17d11fb6a8df9919d30","impliedFormat":99},{"version":"a2c036eefd32f7c0634e1f8615c4b485341d4f1f6fdca5040e62f943972013d9","impliedFormat":99},{"version":"5f3e074edd23169f519bb36e6acaf261a3a5c33af12a8a7e2794b68255bff5e5","impliedFormat":99},{"version":"fc11706b5365ebd58c9434fd9529a100a3d24165e4b04488608b5d55a77d6472","impliedFormat":99},{"version":"909469ed8952f1951373d3294706b50e94d25389326856fd7591557a88ded44b","impliedFormat":99},{"version":"28c160c147c1227df8f46faf50c70dd8ddf0870604250af9eec7f52302b9acf2","impliedFormat":99},{"version":"27a08c3aabe4b415d824042ad958ad9d3d0160c4d8ee43aa8e4a1aece2b921a9","impliedFormat":99},{"version":"4a802c8b0235155d9e45dcaa4d37e46e0eaaab68ef94eeffda6267963267a272","impliedFormat":99},{"version":"5aa4a3727ffa52d1a593b24d6f6e0fd5d3ce859d8ed9bf2367203343f79c0f26","impliedFormat":99},{"version":"964d27f5310297b03bf276d28ba974f3b7c972b532421108378a00cb97fbfe5d","impliedFormat":99},{"version":"315c0551400e653c864fd689e86cd344e9d39de0e1dec74e73b21c6d3602c775","impliedFormat":99},{"version":"5a9636f37a8cfd40dbd97ba1b222f59f085137d574bb90047e77ee853578bda4","impliedFormat":99},{"version":"8b21ec05d818baeb23822106dc371592d197782c61ad6c867bd00482420dee3a","impliedFormat":99},{"version":"3b515b15b0dfe6f511f280d2a66e6f5ec4518d4bbe43699ddd2ae5803ffc2644","impliedFormat":99},{"version":"5cee626e1c97f9c9f634a90e71286bbd32bc84d4391e06286ef7161dce6f8d74","impliedFormat":99},{"version":"77d5d4fa63a5492d5eb299f89ff6440eed60228e4ae45e4675491f1117f95634","impliedFormat":99},{"version":"9caca9e0d06aa45891b2cefe548acf95759cce8be9ba6288d3473ad9a79cfa9f","impliedFormat":99},{"version":"1601c9e2d2fbc602e8ea3cb856609e5dec0eba0f0b4a4190bd1aca8d7e48fd60","impliedFormat":99},{"version":"874f6ab7330b8e05a42d56afd3f77c1758c2d1027e3dbc607956412d503517e0","impliedFormat":99},{"version":"bbc8bbb97a2d014f591b7ef7f12ebf08f8efbdaff154339b89917e20ce586381","impliedFormat":99},{"version":"9ddf9e6cf065d0114a2e03ad2f24db6e2a0b7e0495fb830189fc2b5ef45943d3","impliedFormat":99},{"version":"34392d1d35edd9eefd7aed8c7300e7bd79a486f93a536c641d6369d9de4b7845","impliedFormat":99},{"version":"6ed5d4d4bf431b0b5f10140a0f9e5c91385edca2cf0ba86d6666d966b327bc93","impliedFormat":99},{"version":"e53d7929979440f295425147feebb4fd29ca12b76fa8eededb805974327afacc","impliedFormat":99},{"version":"6ea1298ca33b3ddea4e9fcdb064e1e6d9b3914a243a016b5450ac9fffecaea4f","impliedFormat":99},{"version":"0a613e62ad948843eda4f5becaf2ab18f6edcfd1de024355c74dc28a08a5a101","impliedFormat":99},{"version":"6c21383843396d5d6d1e9fdb594b7f27b1960eaef2e6111d25819b906307eaa3","impliedFormat":99},{"version":"1c0f7aeb0da8e115b03abf334d85d6a3cae1c5f10fa294d6cec1e68109bd9aaf","impliedFormat":99},{"version":"2ad7bd84e41f4ce032f286215e8c9ef109d0c56940423797ab899a69a55dd002","impliedFormat":99},{"version":"aa38b4ba91620fceb0b7c8052a5ca30c5edbb6369ca6953076f394008391a0d6","impliedFormat":99},{"version":"8c9828ec8c751df4156fcc16f2ca81c496563b63439fab6c930dc0a6bcbf01bc","impliedFormat":99},{"version":"398667a797fbed20361065e368e68f5338e88095338c7ef350ab43b52d82cce6","impliedFormat":99},{"version":"06671d26d8a24d55257e7ab611d40db8cdf9da156d53141c13eddf8d22292b67","impliedFormat":99},{"version":"62acc211029559045b264cd8e14413f3bb6c3d197d73ca9919f28def1c0bfaea","impliedFormat":99},{"version":"49ba58fc3f7ea72d435a44695e789d55e9d3b75688a6a5c94da5b65311e965a1","impliedFormat":99},{"version":"56df491b603cb98cc0feee1786f0ccc67cd7044cbaeba753e4a06be0a3dbcf15","impliedFormat":99},{"version":"e789c4c4f3767a04d475ff841044794cab5cce1b464beec3c4764d27c6336ef3","impliedFormat":99},{"version":"c3bf0b45bee7f76574762527d9e8d2b5ccd6b71bc924a4959f566a0e080cc718","impliedFormat":99},{"version":"17730b23f90142bc9bbba78a8ae3e810424683d70fe6868430172bde298cac7f","impliedFormat":99},{"version":"36b0961fdd22011c8b57ad05992a5e786c10a0f7247226df011c9250dfd7dcac","impliedFormat":99},{"version":"012519723b27b0b7d34316bbaefc82b2bbc7b5f09b29f9420b25e7f7f98e330a","impliedFormat":99},{"version":"26b153c6fd0a13b446ddb463c54b8b89391d66e99a883e0d0a5b2a3bdfd4b4cd","impliedFormat":99},{"version":"cf8e9163683d25c0653dd6383d1cb61527ffc680341cd70f2ef82428d174cdf2","impliedFormat":99},{"version":"6eedd556ff92351a9c0837b704da3249fcaa65b249c360f02537e2468cabfd94","impliedFormat":99},{"version":"d7a754e661206c750697768311597e3d333418f1da4546786b2ca315f884b00f","impliedFormat":99},{"version":"0bc0d9c8e623b0adfc5b0f70e52fdc623fe19cf05d76fa28513c04e0e99f2f18","impliedFormat":99},{"version":"8aff0190bd76f107c999b35145ca236977f5c75a6a0b93b3e25185de07a762f1","impliedFormat":99},{"version":"94e5221e731a382af91ce0ed2dbfd0c6c0cade705ba4708937d2d8e7a81c308f","impliedFormat":99},{"version":"0b861aa0e40121348cd97555739762407c59cf6d4d55ff921d02626a5557f951","impliedFormat":99},{"version":"313da5d83029860437f6c9f4a6bd5589d410d10cb73caa89f465f0b92a092dc1","impliedFormat":99},{"version":"1ca3de4ccaf5b8e3b0281ffeb987418b8797cdd38e6f2efcdac6d53be08d2c70","impliedFormat":99},{"version":"3733f99c5ab34d7f5fc2ae62b2cecd43aae1dfe513f1f198a6f23198ec85a9ab","impliedFormat":99},{"version":"c8f01915efe59d2e3b89262ca71462a2ef267a46d85e64d423b7eba5e56fa806","impliedFormat":99},{"version":"0ea8152fddaebfc02cae376261b581493403faa3315b561b7b28c2c9adb8870f","impliedFormat":99},{"version":"366feb5801697dadf2242184050cedb892219e5ad944d958b9f48c1a21bebd5b","impliedFormat":99},{"version":"18e1dbf93c92d56dd99b4feffb6b5f4bab3942a22f9581fe2fb01b6ef98a3127","impliedFormat":99},{"version":"af66f338f282f6a5b65afba57694316e83ffc482b8e43c2157053d2786f5ccbc","impliedFormat":99},{"version":"e5c1db417653c4d348ff6759b3b669721e2293b6123ccf2ac5aaac850727ebc8","impliedFormat":99},{"version":"3d254354637d43b0c1487e8051c4c362db794ca2b3aed7521aad0c4069531af8","impliedFormat":99},{"version":"a164aa58fd0a25722fc159f19636c34df5fe7e606c306459378005a38aa08621","impliedFormat":99},{"version":"1a341bdbf910ac2f80d1787942c77826b17f4e530cfc238a882a2e2eb0e49e42","impliedFormat":99},{"version":"cf4003a33c1a404f35f5c9854f26586497799eb9a7c8212f734852fbee9dfc2d","impliedFormat":99},{"version":"7c24222292e3d201b8b69b2ce466790a5c0abae9de3cc58f7bbeb0678d9909cd","impliedFormat":99},{"version":"7f06d04b0e1a40fd6541852620024acd484fdd7d7652f92debbd27b9540a662a","impliedFormat":99},{"version":"aa440a5a66fbfed7018a245b23f1200cdcffece6fb06d4f6e3b8e47997eddc02","impliedFormat":99},{"version":"e392dfcd88e18a82ba1195eba06545123e53b56f7d1a646f0d47aa2db930dd18","impliedFormat":99},{"version":"271dfa798f98be4ac49dfd6a28cc486f999f3dd7a9bb6f5f23262c64a65cf50c","impliedFormat":99},{"version":"82afb43c3ca6e0891d0c2c78e8cfb622ac3e69c1505dc73e40b3f5946e5a5de4","impliedFormat":99},{"version":"a45a9e50aa41d0939c42d3e02758b105128e57f9eab790e173090273a8c511a0","impliedFormat":99},{"version":"e3a3604500700c4855a5051e5c49caa41df1ec83b30262c1ccc8e34a1cb1471b","impliedFormat":99},{"version":"b5cd0fcbbedb59e0647a66888abca5ca4507f885ff3b286e0c50b842eaed1e98","impliedFormat":99},{"version":"84226fff98bdf61e7b9ae1f51b39fdf4d909393523764457aa2834d50aa91ec9","impliedFormat":99},{"version":"9fdbe407376b7917e668f04ce8d7c23cc952ca60eff05f055d161121d7ca4d4e","impliedFormat":99},{"version":"586e40af8284984647509e8bc2316ed15eb9fc471a5fdb5a1d7324fd0cf8cbc2","impliedFormat":99},{"version":"78b9ad684d80469986ed95aeefc63c0a897a625d9c30281b60a6c67eee314983","impliedFormat":99},{"version":"99a49d4c4a5ecfe3d02d1c9678741b48144d60db675105428cab22623e805fbf","impliedFormat":99},{"version":"c7b9f04d2e9d9c104e124c812cd95e35f6b9e96208cc7261e3fb8cd6341db30f","impliedFormat":99},{"version":"d59ca233e5c37a734e7ddeb14073c661b571a005b65d291bcc7a70c578bc3483","impliedFormat":99},{"version":"f7e93f9af1676ed9f0a505df3218f62b0cde1e898a9f5020fde159b2bce4ec22","impliedFormat":99},{"version":"99a9e52464f5d435e1291dd0cc343d2650e1aeea2faf8c45da0069b79983b189","impliedFormat":99},{"version":"5b182efb3a0328d1185ffd4b234079624ffc3642ac2bdca05f2d2a39f489cf6a","impliedFormat":99},{"version":"3e051f1ac9abb757eba36a1c653079c05f8e73d47f468d2013e5cf91155edbf9","impliedFormat":99},{"version":"50deb81f9a86d6dbc990a3d2e21ed9e95c7053b4f602cece0eb8a66108db32ca","impliedFormat":99},{"version":"5437c62288e1d84f352d1336b2c791e514164f4b76df2b54b9b80b021d14144e","impliedFormat":99},{"version":"3cfaf2c2f604b6e0c3331d6e10cc12a4c2ba9004edd3edc4f34830c12a00de76","impliedFormat":99},{"version":"1bbffc55483a2466f7ed17d1ada9eb309510ad7ddbda8b9052bc0c4439466c98","impliedFormat":99},{"version":"1637d9794d76d852553adec7dab806e435c1d15742c74b55e7f77c6b3f0b4d99","impliedFormat":99},{"version":"94b752027cd750dfd3114ae4bc354e3136af339314e3c0f910df7fbbcc282193","impliedFormat":99},{"version":"f754f4a9815940934f1b958bbf2d2fd8b1463fd16a2e3cbf01a488867a20d21f","impliedFormat":99},{"version":"4ee3b34d2261742bf67c8b5e5b3bf826391e22edb5ce1336d6a8c431b30dfa87","impliedFormat":99},{"version":"09129fe38056fdcc77ac298e218f9e6175608c088d01154047e0066d38285004","impliedFormat":99},{"version":"32a703d65ddcc443c10d404684ee4078f615c02fe7a2dcbe3cd9c27515359905","impliedFormat":99},{"version":"05facbc54c07763ce59d8ecfb9e7236a2490393c772c99a534fc06d300510a28","impliedFormat":99},{"version":"29fd1f159df8bd374aebb398067eecf5daf749d2d07f736e7c7287dea11f4a33","impliedFormat":99},{"version":"2f38b4fbba29ea39481bfc318cf7a1b42d50a1690465a446650948c20650df5b","impliedFormat":99},{"version":"058107de646aab069d38c35d68161a2d4547c6e78c3a3998338b9768ed1b7022","impliedFormat":99},{"version":"65e05ffb34f0189582043596cd28453d050b8b47d89b466ef61953134f7b46d0","impliedFormat":99},{"version":"e08f74569060491151e951498fa46e391320fe652c887b3a1e387bface179f11","impliedFormat":99},{"version":"25abdc000f2be90eccb17eace14443091a8791d79ec423e4e3d06954b0a3e50d","impliedFormat":99},{"version":"95a479f1804f59bcd6cdc1d097157b402f3b9f56923aab18fe4911817d3008b3","impliedFormat":99},{"version":"93d9b928e4b32600406d7a4c854f009799e805da06573fcf481d5377c1759d60","impliedFormat":99},{"version":"24d8c68f8bc95ddbef68bc3dbc659876fc18a15c34859c4c21e002483c0d22e0","impliedFormat":99},{"version":"c9646244df7474905bdadac34ffabeca395850d5415e13bec0cff6884a3a1bd0","impliedFormat":99},{"version":"91bfd8b9c1596dc378f4a21ae2915dfe7f7b99cc4b48042e91d6f473259a50f6","impliedFormat":99},{"version":"40d8306d908ea3ac5af2e34093c8c589d22481d89e60b7ad6360e4ae418b42f6","impliedFormat":99},{"version":"96aadc567cda6bfe77accf7107137390f03b3f3e2968b06f881beebe8efd81d6","impliedFormat":99},{"version":"1231da3d8a3ab8b836808da1363b33f1064eacdce90f6ce1d8dad2a378f2946e","impliedFormat":99},{"version":"c3edc858676c0fb57372e7fb39a8367636c7cfbd532b9882a722b27bc901d0e9","impliedFormat":99},{"version":"2018b6f0e2061de5d0127ea5ea55594657870b0551d6763c47b5947add29c7ae","impliedFormat":99},{"version":"98feee5573bce5dcfeb11863da1463b0e5e4c088ff76d0010676cc297399aa33","impliedFormat":99},{"version":"9c7e6ee655cd3e2c3db15050e51cf28350e020ce2b5ca030f885165bac4afdfe","impliedFormat":99},{"version":"ea7570613b458b3b741acfb597f2ef75c646fc5b8de31f24f3e11e9ecc3e2626","impliedFormat":99},{"version":"6a8bb162513430ef154922525aea4d9c9e0e300d33b7e6c7dfdc21f1267e285e","impliedFormat":99},{"version":"5e756b34bf673b63c88b52377d9341a86e5b85bc15edcfd25926f18ab7562fca","impliedFormat":99},{"version":"8e978604cbc7a505aea54c40a6a824035d019de1a9ea073a8d89056d6e75d004","impliedFormat":99},{"version":"88a6d094de07d3bedda43a507010a4e496f83f898c8b30d51d1d66147317d389","impliedFormat":99},{"version":"0247e5036245f425410b138acb7eca8eff452e90b60ce15a6d14a79254dca3be","impliedFormat":99},{"version":"a917a6578721f88084be79236f3c3c6c8d0626d27b9d29eb8c7b40336d24a665","impliedFormat":99},{"version":"7d4d7cda987e76d83992b3099170e72f1238abde39b07086f2ce1c047fa5305c","impliedFormat":99},{"version":"7a6e19fb0b63f9a7f010e254376097051865a6970c698e0c4700840ffd88e646","impliedFormat":99},{"version":"c1214f047a9cc3b256a6babdaa062b1cc112f9e11c3276a585607b4c034177bf","impliedFormat":99},{"version":"645cd29e13ee8b379c92b7e016f80f020d596c0e329122fb89bbe857596b7fb5","impliedFormat":99},{"version":"85aa829c49948a7745bc9fe8349bdb83bba19763c3a8d6b30129498714c4a81e","impliedFormat":99},{"version":"0883b415bc4b8364115b3a74c2c5d14bb6852a1a9810d051ff426c51b7865e3f","impliedFormat":99},{"version":"57bcaba92379c398572ceea17e80cb9be80b0915bf2022fe99f360875e3ebbb6","impliedFormat":99},{"version":"e19c31cd2a5d8e14a56d40d9f8bb4819f70ee3290c71fef47d753cedbe1b8403","impliedFormat":99},{"version":"7867d743e0710c8233955855dd1c8143c76bd169d31e1b81835dd849d53f78e9","impliedFormat":99},{"version":"d953795eecf54315d23cf13cfef3aaabd521a305b71a67d5939487d9f8f781d9","impliedFormat":99},{"version":"8632c3b1a88dea3b5c07133a969658ade0bc8b0add4a160ecd12b2e8ff73f147","impliedFormat":99},{"version":"bbb8f4a3cd8286ed8d4615d7f6c0cbf4753c761e1d3ec18a20a161d276b6f617","impliedFormat":99},{"version":"9643da030e1fa23447dacfec5a005dc51f0f7f651dfb0c063d4195eefc8a098c","impliedFormat":99},{"version":"f78f0984c1045c759eca17c87d9892519813d7ccb07cb9f10bab6239274ab3bd","impliedFormat":99},{"version":"8db95a03e8ba40f5fd72926a7df034c42c083b264fdf948382eb2281cc3aaa81","impliedFormat":99},{"version":"a004f52364ed07ec22dfdd34041dce156046b1fd1d9170ca99748e7ebfca1b9b","impliedFormat":99},{"version":"dbff933905f07dbe803238031f124892e8ada74efd4b284287bfc75d2409e3e9","impliedFormat":99},{"version":"0941bf71e7631df878e29025c83b35ecf2b4fc730f61b008590fb0f937aa63a4","impliedFormat":99},{"version":"3e8837d71c58e3ddce51b55e29ad7691eb15aed51dffec5fb7bc968898abf6b5","impliedFormat":99},{"version":"6e58caca3025448230faecb5efda0951424ba15b071ba13b00f3e7f1cc6bdd29","impliedFormat":99},{"version":"b3a3f55260b2e4384b00a7bfc5720e9866074ac18f715f3e505c7593aabce3f7","impliedFormat":99},{"version":"3f8c206a53bb5a8370f094ff77ea9e95ee8c3661e248a1b9c0334bb71b641907","impliedFormat":99},{"version":"99853f693260e3d76256576888c7cdc5515e50e399fd3111afc514f0ec9e16a4","impliedFormat":99},{"version":"480cc4f99dfc33fbe523f155018e66bed504bfce061031bc04f5c47b7dd2ce05","impliedFormat":99},{"version":"bb0cbdbfe7201cc8dbe28f10d4577316d63a633b746f9e9ea9ed16a0400a0347","impliedFormat":99},{"version":"6bc725824b4ba929f44f3973aba69c3bf4c9b8c667d6c5bd257524584bcf6112","impliedFormat":99},{"version":"1f2a20e400e1df467ced60364324445d04e36184a2fb9bd39f32f85058d72b50","impliedFormat":99},{"version":"83c5f92d12a9677cb376404aeeb89f910efa2ceec8fb200bbfe59c508a5c86a0","impliedFormat":99},{"version":"91236eb27c0c580c803b9581bddfe4dd45623093b8638c8cf39148d193b185dc","impliedFormat":99},{"version":"ba41d9506bcc55e2043d0a9290c38a4c1fb4ef82fb2562fc2039d55ee0a80a72","impliedFormat":99},{"version":"214c9af465ad68b1750670de18e62b8f3e7749257aae5ab0d7170b994e9c7e5e","impliedFormat":99},{"version":"62e8d8503a51a24c9f0947d88edb5837357f4149c5103fb304bd31f8b5d4f4f9","impliedFormat":99},{"version":"5dad46254873e5e5c4b8b80f6776dac8bcc96b059cf6ceafd9be54d24faa3dc8","impliedFormat":99},{"version":"88ece1d1c523d9eaa48c8c3e0c4cd359e9df8a542ba6eaab5dd3c523d5fa9826","impliedFormat":99},{"version":"109ad0355918e4fad1bb9d849f8b72a6894b83d20ca6ad72e73124fa380a6c64","impliedFormat":99},{"version":"70b68b3ac7d6b03ae36e80766d62a666c407f455476283ae6ff219e49f0eaee6","impliedFormat":99},{"version":"bb72571132bf5160ef9af164b82f13fc74c332d11c3325e4953ede73627bda0b","impliedFormat":99},{"version":"e4101333a36a93829170c6e0c66ed47c648571502b484d22e4629317197a6bc3","impliedFormat":99},{"version":"f0e5a05eebeae29b22dd7b3747fdd6503bcf7ad42df8ccb0a8129e98ea112408","impliedFormat":99},{"version":"658adb3d7d4017bf38ba1d1eded9dd36c5be121eaeaf469abc11c2494c13e12b","impliedFormat":99},{"version":"f0c39b43f5d2619c66118d2441976b4f1fcd100e55be80bd55d8279b2776a082","impliedFormat":99},{"version":"1c116a992389ab12f4612dd3cc9b4d888eef454eed3794c1f515cd76d3b17cab","impliedFormat":99},{"version":"0d9ba4647605be41ae36c09439b623c174e7227c8943d15b1aad049c5932c2f6","impliedFormat":99},{"version":"ea8f99323ac76484ca97cddd57ed916dacd4ff2805c446a69da9e728ca8c9b43","impliedFormat":99},{"version":"18e80e1593efac104d1fdf3fe5c02023be9f3dce93ce3a95df75ce1c17b98332","impliedFormat":99},{"version":"68a5340b5cb05677b52fe5032e5b8ffaa3d02a98baa991ee161e318e17d0e74d","impliedFormat":99},{"version":"7a1457e43136d0a005af395929abb59ce7ea3712b1b4091040fe700c4386ff6c","impliedFormat":99},{"version":"8aafd0a8486f554718b22d02cb662b9964fd6b6346ac7c46573182ed3102e9b0","impliedFormat":99},{"version":"ab0f538caa8913de60351b4d993393ba30d485461dfed416b11fce206820974a","impliedFormat":99},{"version":"7d703f987cf71538d9b4e0388c4744fe91db9b4bf5fc0b5ec2120e523ff036ec","impliedFormat":99},{"version":"779e6f8af772f3f63982b2d907c662ca37acb84e7ce1fad4de9c8417142504d1","impliedFormat":99},{"version":"e1ad3c3b80b5bf0ba59c3b33878afb16a906c09840f8d1b072af14e587360f6c","impliedFormat":99},{"version":"51cda3a044b658d58c693647e19ecf16c29f5ae67caa0f1c619c7c76b93f1af3","impliedFormat":99},{"version":"e6b27342fc513672b2fcc831ed5d48627817ae0b26b3a487643b61785c52cecf","impliedFormat":99},{"version":"582d84dd785b99a7180701aad4fdfbe3fcb26cc07fc693032361070ed0369759","impliedFormat":99},{"version":"eb5888375a2ecdd0d3502cec0f77e1e42eeb2169c76b79b61add3ea0bc95ba4a","impliedFormat":99},{"version":"ca5f212e869dedebaa7bf73bea3c6e8ee886ba2f0601d7e789ce38e2db189600","impliedFormat":99},{"version":"d21865e1111bd2be2ee973598343a324713e31f1aa2e6184286e1a8f077366fb","impliedFormat":99},{"version":"3df99ade0e19a8fe6c989688eb5743baf8b02b4cb678018dbdcdabe00fc42879","impliedFormat":99},{"version":"785eab4c4a6166680180ba4e9bf06e6c205862a3c83323fcdeac61e6a76adf8b","impliedFormat":99},{"version":"c1686f9d62d0b94c43faf794bffd8cc24ac1475fc6d536aec3b4480128660322","impliedFormat":99},{"version":"3e050baa6d458a74a769e3fb50ff1051723dcfccfa8a31b7ac9ed0c990d5dbd6","impliedFormat":99},{"version":"bbc4cd67ab91a186d1a4aa1f65a7971ac31bc2d8c63fd2bfdf02e031a85be7f3","impliedFormat":99},{"version":"6c09c2fd7f6c0512ce2ad6e17a0d9f9203f47afd3b83742d4cb4db2d3ea821d2","impliedFormat":99},{"version":"16e3734500cb5fbe0cf27f4b61cafd7954db45c3facff516d8819bd63482a8f9","impliedFormat":99},{"version":"352036160d597fb56e03591325761d86221f6b4facdb0c7df4b790c4891f4f18","impliedFormat":99},{"version":"f93375427ab3f9a598bc14d9bef5a2ebf68c4755bcf3a68b794e131dba637d8f","impliedFormat":99},{"version":"798b8feb569f4b4c521cbcdb9651d0fe799ffad794284dce8a4e0d9dbaea95ca","impliedFormat":99},{"version":"3deb173189f9a8232ce9fc11ce610c27435f5e6b86e507f9c04d5fa275974101","impliedFormat":99},{"version":"de8156baa4157a698a1bda8e6b4ba62b8bef4972808f7450698017219f539475","impliedFormat":99},{"version":"65c089d5dadc1d26c81c374f00a8e11b7178900040dd7db065d8cdc405c65e15","impliedFormat":99},{"version":"66003617c7bd48b01253f0f0ae9218f15adbfd66a04a74d04235f28f9ffb830d","impliedFormat":99},{"version":"8733c82576758e483eaa077a95d1b2d1715353ee0d8f148d06a5f979fb71f22d","impliedFormat":99},{"version":"0dd5e215565f19d57d88f9c32cd365fd451207bdef48519c47b14dd4ddb301df","impliedFormat":99},{"version":"8b86136891f48d0e82f8fdcd623268b036b2a8ddc22241a1202576792af0b63c","impliedFormat":99},{"version":"1a080e2c42f4a16b339bc45067ecce29ce25040cb5db37f5f3f19413aca07e09","impliedFormat":99},{"version":"55f8158fc3e7d4ba4ab62820d32f236a5723af9c721e63879cb9c184292a718f","impliedFormat":99},{"version":"170f5fbca91c30969467442f813678c86d2d38d10aa3ef8e5fb388bab833fba9","impliedFormat":99},{"version":"224347dccdcf08e3e862699dc9e35f6ae1f9388f56e14db2357bb79b75c1c814","impliedFormat":99},{"version":"c6426d9201d8e27551ba9a0b5f4d9103dbc2b2057801a621098116a042b03b92","impliedFormat":99},{"version":"af11c67bbdf99195a89aa5233d8641f6e1d2f7ff712e941c773e16f602e7f96e","impliedFormat":99},{"version":"1dcc9bb3542020790409937565639ac7c3bb8b239ff49c65ee20d5244ced1fce","impliedFormat":99},{"version":"64fbdfda1827a333790a0cbcd36e40bbdab461df37fccbf8a2c12eb0a6450b19","impliedFormat":99},{"version":"9f40ebfa8a6cca16447d13bc9265e7b463b1d4e7265336e287d2ed2867af60b9","impliedFormat":99},{"version":"cd77f74ca7acac465b9b6ffc244a574cafbf16ef35bbc834c98314d1603f6b52","impliedFormat":99},{"version":"6a3fb20abadf78d08de29baaea62889070d505f35ff5140642e8074db0f5b7e9","impliedFormat":99},{"version":"75b2e385d7de8d6d714ff9aa6635bc494a6f90a6f33d2c5c7710bc71ac19d9d1","impliedFormat":99},{"version":"f5e7ffabb3a1e6d3c0c5039912c8a4ea8d753722c9a1e602911c100b7ec155ac","impliedFormat":99},{"version":"09757c18f7d7af16d89b75b643ea4b3a0e195d67a63c03755a07dae726e1148c","impliedFormat":99},{"version":"3b2b48dbb70d48112b34b4a73280990bdf75147d75659cd5280e846513abc75e","impliedFormat":99},{"version":"e6f905bb9525a266c16e4350cc4d4020689a588f2eb6d6b64fcea6d037a05977","impliedFormat":99},{"version":"4a988db19eb645816e40e48b945226f76de53f1299131003aabd37a013c22590","impliedFormat":99},{"version":"9b7dce8b944c33e20355a272f156582fe0198bcfa395d7082e6a66eefbe9ce57","impliedFormat":99},{"version":"13aa72dbe072780b3f936dea5d1c3094af3b6c186c24bb30d404540ec447b3d5","impliedFormat":99},{"version":"a280303c82a34689c9cc178068e6c012c6f582f80cbb6a75530bf552313090fe","impliedFormat":99},{"version":"715ae11614ac2209e2b5f3efb19b270603f8dbf20db559b76b02a47d6f3fd77d","impliedFormat":99},{"version":"d337b0c28c6f35442c1f88ff8071bcf9ef2ff381aa37fc30d323c6ac25e23708","impliedFormat":99},{"version":"425e7209aad5daaeeb4df06a718f8f177db5f0322c5fa94573ec739aa7f02deb","impliedFormat":99},{"version":"cab30bc9301ed991270375c5a0a011c897307e0e2158578e96f93b497121a3c5","impliedFormat":99},{"version":"00e136dc2bf5a5dd51fa6c5e9c02a7aff6ce4bd111e74b0f0d59c87494af51dc","impliedFormat":99},{"version":"4933c98fcc77ebbf6166152f65916cfbfd8f494bd14e6d8eca45ee231f1f2926","impliedFormat":99},{"version":"55b7f086a4ce7f130df29adbac36981bd64051263686af3271c604cd9591f62a","impliedFormat":99},{"version":"7d8fa714edcff481c66fcbd1c29b0856edb5591d085096c98613e9b701f55676","impliedFormat":99},{"version":"879e9c1b88c533389580e7178497ea55a36c95876fe1d94c6bf73883b6d29fdf","impliedFormat":99},{"version":"7c22b12c9c17dcc2317d52b83d8662c538fb337adc8c1ce69ebcd8f8394e2064","impliedFormat":99},{"version":"199e6d1a80d19524ea70d143488d72ef5e8ffcf6bbfe82dbed7f03d603948d18","impliedFormat":99},{"version":"691ca73f83cfe3262081875b1096744b1314860e6e216de3d242b4c76f8c1972","impliedFormat":99},{"version":"e43105a7b869d2963215dbbad1da3ba79108c3d5361df4e11d6c1bd967890bd4","impliedFormat":99},{"version":"c3d4d0c0dc57d5fed5a7af5ec433a3fac319c640aeee9ebd648066535cf9ff51","impliedFormat":99},{"version":"6c7d9793b68ed844870b77a5d4e6c92dc5d3b10d3c09007bb54b4baae99eab62","impliedFormat":99},{"version":"98a99b89bfbc2d9b7c3df85ee85f5fee6e9eb7309dc0e8b08b77b34ccb85957e","impliedFormat":99},{"version":"026567c73d9d23ce133aa2f27da3ee815b724f52548bf5579746f41c60723fcf","impliedFormat":99},{"version":"df6f1df7a3ae263e071615559e198d94c6fec45d33140fc3403eda6f57c5f8e0","impliedFormat":99},{"version":"5208ac9b4aead07702be291e7b6b2aa5936ed9ab8b21de6227cf351292246f6a","impliedFormat":99},{"version":"8d04cf9b77d2bff28760b0126105d3d5a34a1a1e8cc2b4966a9e1859bc55ba71","impliedFormat":99},{"version":"e7925d61f7792610f43a39d58dd58b804bf43d6071a09439d44063e35e5ac244","impliedFormat":99},{"version":"4768ed15015abc1826477096caf3c770ff266bee8136ebec5cebb929d6b9cdaf","impliedFormat":99},{"version":"7ab6049d6f98dba00f3e379c0bb149eae6d2bd3f8ead7de9238bdf65bfd5d791","impliedFormat":99},{"version":"b50f3a41e80fe4e8218a7f6c70257ccac4c3f360d318da72779ae1dcd0e787c5","impliedFormat":99},{"version":"a7b7342414754d0fc6a9560c08e5add2eaccb9570cd39c53a5155f368e695f14","impliedFormat":99},{"version":"e574749d4ad0f5b989632484891d00a6ef6104b3b014e9eb9bfd1f3c811b4a3c","impliedFormat":99},{"version":"e5352486d0919edaf6b57caf289859980db09607e225f70d21ac9b06ac1ef04e","impliedFormat":99},{"version":"23c0a2c86cdcfcbdfc95f11c89611f04cce0f593b5140a2e64d20556af3f159b","impliedFormat":99},{"version":"3cda756ee1dfe94744ff3eb6a11b7e5d41f502d0f8c46aae5338bc82cb929602","impliedFormat":99},{"version":"5a2db3c589431fd671ed605ecf0725decd9acf0e239966bd6d91eb2cb115a0ef","impliedFormat":99},{"version":"eb63ec99b754ca1947a7fbae5d7f461f8179f647bd0f665f6008443b7fc8fa14","impliedFormat":99},{"version":"5d4e4b5cb1a17707244dc479b464e537237ea4139b4235d703ea83a4a9287840","impliedFormat":99},{"version":"97bf370e78bc695d758542bbd2ecde489a61db5d678c07c85bffa91459343c37","impliedFormat":99},{"version":"e7789e4369b2c26d9a8a1150141b146932565ead086e2b4e32ef145325a8894f","impliedFormat":99},{"version":"0cd7b61de09c45306ffca7ca80fe784e56623cbfc99e1fa4aeee7ec924353d47","impliedFormat":99},{"version":"9862a6e0ad83a3b3faa226fc86fb1940b3a9183c0c29f5bddaa9b2c5cb813a05","impliedFormat":99},{"version":"d85d1d741211343158b4f64b4fc7d0ab347a643a3bb8f5a7c80fee1cd71ddb91","impliedFormat":99},{"version":"b30ca3d58261de8bfe7b599e9806d710700b58d7f7c7c1ebec13838bb1c36d76","impliedFormat":99},{"version":"19c817e65f0d10c305c29e01d8fb6defa09291fd67bd13034223cfcccc14f8fd","impliedFormat":99},{"version":"d72ed5882015b367986f5ec7b1cd58bb50bd1c51e941ff06729b67ab66d4342e","impliedFormat":99},{"version":"8e395378f1ac56cf2bcc7a2533cfccd2f431e45b91340418148c99e16eb58c6f","impliedFormat":99},{"version":"cbc884601dbfb8d72c8f8877a11179ab41a9bfa0b8c8b345184b835d09a29354","impliedFormat":99},{"version":"b3be68eab5f7e270ac467749dd01ca3203c572cfc511da099e028a930e933416","impliedFormat":99},{"version":"ff1f6fda8fed4820f48b922caecbcb6f74b81ef984908ca213d09463f9f7f937","impliedFormat":99},{"version":"e8c989cbc67a55209e74d695ff91a888e229d67f0cbbd8b49544cc07382c877e","impliedFormat":99},{"version":"838930a4a3fb335a78cb1d3c4d5b825ee7ef1a7ee2136315ba38346aae1683a1","impliedFormat":99},{"version":"883985e0a6918e642e1f416c6afd0d0e6e8033f3b29ea5a49cd808c88874b7cd","impliedFormat":99},{"version":"f126c52fb0b87a45252fb6397c2326e3f8c3947d01370c2b4d9b1d4d9196f046","impliedFormat":99},{"version":"99e693a698fe25a9924783102421e87d02ed7204369d0c499b207f4fe872f168","impliedFormat":99},{"version":"a70e24984ec50f9c0e02dad3f4b5bac149f10165420d266ba199e50fe45662cc","impliedFormat":99},{"version":"633e63e5fee829801ddef23112e30073ea34d9caf5f464d478fddee93e627475","impliedFormat":99},{"version":"0bba6e8d47afded79ee770ec90c46fec57cbdf69767306b86aa9b32e6f4dab11","impliedFormat":99},{"version":"66b7c3956758bcbad1eb7c0d4fb0d779323a825b8adccdf35ea7946eab476b20","impliedFormat":99},{"version":"16a1a5d4825dbf2991c5a8a2090dd84d8290b19cf541e93a7c4995b8037a627a","impliedFormat":99},{"version":"35f172c558295a38b28a149069d619f658efbc69ba9b672e6c853a489ba23457","impliedFormat":99},{"version":"3b2112cd844c32dbf3dfdfdf05e14b396f46ba6e61bb15d82374cc8aea2f272d","impliedFormat":99},{"version":"17e59b4b305bd2ad32bfaf62350c305bb45fbacfe5a4b0547369259d17775e40","impliedFormat":99},{"version":"c11ab5f4ec79d50b9741fe66527fd19c09cddde5efc4cd39b5a60df69c38b604","impliedFormat":99},{"version":"5530eedb6ac3365bfe20f117de0db075971955dd763eed8b9757ecb5b5a3e57b","impliedFormat":99},{"version":"fe847d09c50c98d93de932ab711c1569cccf7100c0c7ea59e4feaadde30ea048","impliedFormat":99},{"version":"a691ed743148b3133ff53977947c447c5951382aa75ff41926502195592854c3","impliedFormat":99},{"version":"00387baba842e4e7cf442edb72abe67bf2dc4c48b02a44175ec2d82a88847e88","impliedFormat":99},{"version":"b9f3a62b5a7b9cc2308ff957f2f9400431a484d44dd02b7518abcb08b387528c","impliedFormat":99},{"version":"1fd1e1b625fe20a8a1a133bde76da9140312d4fd0da1c18b27d23002d4d62243","impliedFormat":99},{"version":"38d0d481e741ca7daa25fd987f3443ffe351cd0a9c0b4bacd5e008c51f24850a","impliedFormat":99},{"version":"c07fe65c3f45091dba97d40b4ac07c390ff625a0dd92295d76051f0998618d80","impliedFormat":99},{"version":"b27a05e307131d13c3ed496e07dea2b79331aa1ac9571524fbdf16cfb3ebb1f5","impliedFormat":99},{"version":"0dc1ba6bb0e4fd00bae62403c87047bc5be4ab5943ebfacd5348ecf74c9b0328","impliedFormat":99},{"version":"ef60c0d7cd61055e5f06a6b76cdfdfe317460d5ce787efb48f35b3618bb68608","impliedFormat":99},{"version":"8ec7a6d53714b3c8d7a5e1eeb36108ea511cfc7fa4d7dd08229dc906568548ea","impliedFormat":99},{"version":"f84ef63eb5e13857e20ead0977940fbc9cb65da0e3705c04f0f4fc4326937c1d","impliedFormat":99},{"version":"827f0625ef8bbfa8997f91b8832626a4be0742fe3c9c6309cdca802c6edda8bc","impliedFormat":99},{"version":"1a535ae8a6cad0882e7c7189b21f2986dcfd5c2efd9950b5b04cae15179b27ce","impliedFormat":99},{"version":"47d40b96045ac0f52537cc2076f9ec1404fc444861191043c348d8afa0c6bd73","impliedFormat":99},{"version":"58b86a43ef8dd9649a6b67dbeb512f01f934ad78518ac89683927afed03b1de3","impliedFormat":99},{"version":"47c563c296e93315d38204ff70b2a3cd6788fdab9ba388791fa1c82987794d42","impliedFormat":99},{"version":"69ba23cb263a0916bc35457477b88e05eb35809c58a17449974d174a2aac6059","impliedFormat":99},{"version":"b1e445ab4f7d5c6d5094c3d6560539f641987a9acf82a0784b320e01c803af90","impliedFormat":99},{"version":"9e4c32ab790364ad67b078d569d273225d28a3cc5ee1b683e096fafdd0372745","impliedFormat":99},{"version":"3b9cf1e4cae113f06b84bcdb48dfd99a04b8708e4e4f48712ab94b7e1d11c884","impliedFormat":99},{"version":"52fd16e0b3f6582c3b545957606e1e82e8e7f666745a2c0a077eb5b534246109","impliedFormat":99},{"version":"28782dad7cc918112ee88ba23ac97f11a56c7e8cdaffa0978ca83751ba49b741","impliedFormat":99},{"version":"d707632c2500c4d4c503dcff2794e15c9102624ce70c9ad1662e396169290a46","impliedFormat":99},{"version":"798d2a4e66eb3726f8e07b6d94341a008ee974b8f86b8b98550f79b3b0e43390","impliedFormat":99},{"version":"6e36459dc4168e7f2c37a9f9e0971c3aa8840e753519781d1410c659c1fc525f","impliedFormat":99},{"version":"686a3bb7e54b8b622ec5bedaf1ec597633a9e75dba1261e4017e2e8e8ae47314","impliedFormat":99},{"version":"220ffd58c0b38bddd8d79d16b48aa3c71be8a0e8d01d45ad65396b453f6f5ad8","impliedFormat":99},{"version":"9fb07cf95a99e80c1c0462eadfb2b5d9434dd20817ef143ff67def7742b9760a","impliedFormat":99},{"version":"c70bfcb0d36b6e0d59a413e23016e402ad1d5afe2e5a74c1da3b52d271e4d4b6","impliedFormat":99},{"version":"55712f6dbd9fe2bccb9cad293fa37c294dd8bd9067566bcfab17e5596aa77bca","impliedFormat":99},{"version":"50f6da711079ff42be35995fa2dd810a629acee19248c4476ffbe1bdb324b7d0","impliedFormat":99},{"version":"be3455c8c848814f4b4f8602a1088411fed507bdff9a6cc9ffd176b9092ac401","impliedFormat":99},{"version":"16cec8c852d6b1cc27c107593c3087c901ce3e1f949b3560729d9702e26da2a5","impliedFormat":99},{"version":"1f0351b420afd408a267f3c3f578c788245d29d71da0809221f2f9b3dce475d8","impliedFormat":99},{"version":"b79b1fe1036d51b099e6ac6b3fbfb4eb36562c783e473e40c6cd2ec65991ecb5","impliedFormat":99},{"version":"b6964ec91330fd27e71660b777624e9342a2919c08655a7a65833324dc9797cf","impliedFormat":99},{"version":"5bb8a642d5b1f469421f30108f24d5443a83b2d59a385191e93ca650a9dede54","impliedFormat":99},{"version":"b76f9204bb26386bedaa9e14a23b3d9b1c6fae28c86f7fc484df7e5b74ae3844","impliedFormat":99},{"version":"8c1eea73430f19085f52a279f92371409f9c3c1f1cbc6187e474d0ff158b6b98","impliedFormat":99},{"version":"b288dcb1d03d232ba58b61e94124feafceb0d411013f603ddb2068702e5a13f8","impliedFormat":99},{"version":"a9ef5666ecbff227e17ce51d833b7c8822189565799aa860a60efa8a4f02ff00","impliedFormat":99},{"version":"29670032e04e02ef8a2172d3d637ef989b2896718852dc0d6735d47b1d8dbea7","impliedFormat":99},{"version":"c6308f587ff90713ac3832efae5b7aac09d6b067c2bdfac9637583a668d470c5","impliedFormat":99},{"version":"45c053bd25f8463d059c805283437436b640af4a28f9e10811bf1cd122d03790","impliedFormat":99},{"version":"bd4186ec52ee4bb1e07d27a1534eaad966bc9ba6cd65a58a63ff6a45632348b2","impliedFormat":99},{"version":"742c77f3420abf97cf51c552d99d0d935808b33c612e530ab54d115c513692e2","impliedFormat":99},{"version":"1b9af93c3bb53108e109446a0127b8dd6b9ff7c5096319fb6c4d63b9dbc8ec75","impliedFormat":99},{"version":"5cd660965157b9211c61f131ecd876143129cdd528e49099fc4610da0e7c04d8","impliedFormat":99},{"version":"a5664583622519fd735a5b89bde8040e93d11015e1559270008ec3722f546188","impliedFormat":99},{"version":"290d2e6293e262efd3aee13536268f8e96f31794800a1b68e392f27cdad9bc13","impliedFormat":99},{"version":"6c5e7e9f0c8361569abb01b323d939288ab7d2a16ec74962dd0981496a3e7ba0","impliedFormat":99},{"version":"386cf4e0b737544dfd42761ebb6159bc987b0747faff23af0b73b9003e00ee27","impliedFormat":99},{"version":"d7c7b4ae623b52e885e1aa716cbc22bad409d36b7204dec4004ed9c55133933d","impliedFormat":99},{"version":"dd0645217ad10dc8360c7d83bd6c6f36750b7df44c48116c883024dc8e125329","impliedFormat":99},{"version":"516294ca25dddf7d44af05033e856e5bae0fa1cd7a9bf255e601fb77b5b9f597","impliedFormat":99},{"version":"8e4735e0c080d09cc800cd41f646de9d759167292ef7cbd76a0eb57f8c4a00d2","impliedFormat":99},{"version":"0cdf249a81c98a3c6d79dbd0c1a65ff377d6879658aa3aeb8704a1b2158f2230","impliedFormat":99},{"version":"fcac8bc31559ac91ae0a65ffbf43779dae8a9c585f0e3c188fee07eba5444ca2","impliedFormat":99},{"version":"b37597091430552997625ea0f386da6b0ad725704274564c17282a06d77eb585","impliedFormat":99},{"version":"3aed368622022abff04f6298dcb1236b389a26af3a380ee8f06256850a3d99f3","impliedFormat":99},{"version":"be4068251ea5a2a50fb0e075ebd0b2cfc773bbf3f974b97b110011736b50efee","impliedFormat":99},{"version":"9223c5f0109bcc0868650998613d670c302abebde0cd2fc806e42a4b0bb5c9e8","impliedFormat":99},{"version":"0571ff9f961401db433c7c248b16bb2bfe65c0f09dc68543745c16f2176bc8ff","impliedFormat":99},{"version":"05626dcdef717ded5ea6fec10e3c6a6c7acabe92bbf36573470212d5d858ae62","impliedFormat":99},{"version":"64b324dd74b6cd0073181992870983522182d33cf0b9b3c1b6d503e4ba854b79","impliedFormat":99},{"version":"9e6970fc8d80d18a58c0189f4900317554e328e624da3bc78a954ea08b166599","impliedFormat":99},{"version":"cc1dc46db20468ef6189aa7cf4a8f4240897709753b2895e5400d20b6e4cd554","impliedFormat":99},{"version":"30986d936b4fb9b78344bba08e72ce06e731d10862061c2848b019d74ddb7eee","impliedFormat":99},{"version":"12dba10fdfe2dafe7f69c960da3f694723d82f2856ccade9926f5d04ce16e975","impliedFormat":99},{"version":"06a1c3af923cd00e69142a78418edb82c211cba3e72a91be52ae12bd845550d7","impliedFormat":99},{"version":"13405921db76cd2ca52f50b8dc8819884bb0fdbec7feaa8b0e5256fff635b007","impliedFormat":99},{"version":"474fe5758f25fa31f93293163386bc120cb3a859628146216c27d20f9fb4e11b","impliedFormat":99},{"version":"797a5c56e7b68fa7ddaa736ea0f84903a0280b3e24f7edc81dc65d59397c1dbc","impliedFormat":99},{"version":"13144ada8c1a653103674ae05cc08441800d8db5ba8efa624158528eede15884","impliedFormat":99},{"version":"42bbc0317d36df458e7e5cac3fe51a5747aefab3abc5cb3f238a944d5e32a91f","impliedFormat":99},{"version":"678842cc3c2c69a8c2fae8353656a1e5337828124b7b53ddf41689876b70c57d","impliedFormat":99},{"version":"f0e3459d79ea7a69f7a334151c38ca830c4541a030204e44b680bb47cb357bdf","impliedFormat":99},{"version":"9ab46babfc3d98ac7a31ad70b4212562ad36311d9fa235871dada95e3379fd09","impliedFormat":99},{"version":"92e6d6a927ad3d48d91b7fd3f31dda6e078cf03880e0bbe9cf56abb5919efab7","impliedFormat":99},{"version":"5b61720af63c370f28be29a1e6b60eb3d3cb6df1c169e467ef4241f9abe68272","impliedFormat":99},{"version":"f622b88d462a91a84c41747a8c097347cb08cdc26250ee5c86bec180d4587ed1","impliedFormat":99},{"version":"b9688f18464d0182fce970cf89c623191997178076478d5bf5604724a73dbcf4","impliedFormat":99},{"version":"811068496ebe65d79774a99796223a0ba3efe04be587f6ad9fb2c71865d5fd75","impliedFormat":99},{"version":"1a42ecff9998af3ec2d7465bedcf10aa76420768fd31143fcf0808dc7a3630dc","impliedFormat":99},{"version":"0ff2355b4074c3eaee36f435bcbbfdbcba07ddfb4aee5a2c37a2eb077fd024fa","impliedFormat":99},{"version":"ee053e4fb378dc43221a892e05dd65c664cea6947e5c3819ae41742643d70743","impliedFormat":99},{"version":"eb1359bae2c2ff3dce1258094f234a8de89b7b5afe89bd73e725a46558fc6aa3","impliedFormat":99},{"version":"73c08893e5e403971e0b2dff8f14d9ce3543b1a821c0d2fb8e5ac807a5d14603","impliedFormat":99},{"version":"b886342183fcbfc5fa59216cf405970b992eda93bc8a89094e1d40906dcd399f","impliedFormat":99},{"version":"5170f383ccc3d8431414b298aa1b9fd8f88f9f6ad0f6b40e4f78b5ed98d0f12d","impliedFormat":99},{"version":"a3915cd0ac9bf5441edd5b60f3937d89dafddacd7c8d5f323a279f0647e95712","impliedFormat":99},{"version":"77fd5aedd61211bb0978c3e3763876b18c55b73df2da0d7e17e43a13b3a1a617","impliedFormat":99},{"version":"0138f7ea01346ce60e52fa324df54ddfd6c9c31495fe74ca071bc44674287f26","impliedFormat":99},{"version":"95299ea6874a7330630d89d2ccc3aee12945d0ad632c72a168513f491ad465b0","impliedFormat":99},{"version":"8e11782e3f5c78b28558dd617d0d2a94a524b5106e0e8a6826dd71964cf2b172","impliedFormat":99},{"version":"7238edd71a373627b2d4980472114a75a861fdc5a66efba81e6e61fcb40d3c3b","impliedFormat":99},{"version":"02c11188c7c7ce94d6dce4fdb002d717a9b672ea1293b59dfbf9b54345ea9dc6","impliedFormat":99},{"version":"3cc667806444c6727c1a8106fdaf37c897c25d6a0747fea8cfd817c275309494","impliedFormat":99},{"version":"ed78cb361de97e537cca46c234c5f0bcbbea8a77f88d3270142ed0993373c159","impliedFormat":99},{"version":"e15f2519cc04d4a30a0543a349ce4d4ed10a8cef76e8bb226a624d75b7b24a7a","impliedFormat":99},{"version":"a8de68a1e6c0c3405cff69a6a82dc596d576b967c9b925c494ba30f8782193f7","impliedFormat":99},{"version":"7c6055ad026fda59ef8ac871f9aebcb080cc4ee084af8feb3dab392e603fb9dd","impliedFormat":99},{"version":"3227e142b26a6ea9e1493c950c238446a8d0297b093c8c95261d4f3e63312237","impliedFormat":99},{"version":"8fa71f3316151cd87f46e0f50aecbf39ba424790904b6dfaaec6fb3ad9226c8c","impliedFormat":99},{"version":"f2bafaf9d83cefd7f55bc2a480d1b5ec302e7615b30642bb00bfbf58b567a61e","impliedFormat":99},{"version":"a605659c69bb74a59b480f20bfee716dca83d289a814ff696273f71aea4c4abc","impliedFormat":99},{"version":"5886ca453462c07e9a2a6a835172a5f2149bc2b713b618fe452a94a126eeb36b","impliedFormat":99},{"version":"9f1b4ed0bcf465a6390e7c3760e0bb339f3d61c28e78c95024a3afd3ed81fdcd","impliedFormat":99},{"version":"5ef95b011a154332189243cfcf622787a41f3c646b0e3efeb347006064b91197","impliedFormat":99},{"version":"e6eeef06ce02234a927acdd50fcf396b8dfd8e8ca34c082cccd253193b4102f9","impliedFormat":99},{"version":"a5c6769e0465426998fb1ccba6db4a008cd9fa4a477a8bbfecf5b130c4031734","impliedFormat":99},{"version":"d29f65daae852c87855413712c3e9e81abc8577579cd40aa28789910c149c8cc","impliedFormat":99},{"version":"d4c7c425aa0d74cb74b92a6ccfa740431b48d3240ac7a2219556720a107ded33","impliedFormat":99},{"version":"4de384bb706f41f1515883a6d30cd1eb5d149729a79b1524e1bfe86acd103d68","impliedFormat":99},{"version":"b8f2296cdc94fe0a235c1c73a2f97d394050ca3d74b6b45b07b563a0c2892dcc","impliedFormat":99},{"version":"0ff56c8f9f2749a7c23c130450f0045a19ebdeab9f94f9b6f051e2cad105a1b8","impliedFormat":99},{"version":"e5aeb2f888cf51e86a5dbf26f710608140d6f85847f935b5dd218fc9b865d820","impliedFormat":99},{"version":"f111b5055f9e48983310817bd14978fe8b44600383b2fe0f0f8f82c501034f96","impliedFormat":99},{"version":"d0b4fe6473d64b2505e3b842592c6fef0491b2ec29d3d43c74289428e5649997","impliedFormat":99},{"version":"83e50a8f0a133458f603dcfc3aded3d8e6da48ea71d3a1aa5383c71bd12dfa51","impliedFormat":99},{"version":"4ee9650128cc8493c1cf7d0923004c0c5e6ef374f838dfbbb5f510eb9eff21d5","impliedFormat":99},{"version":"9ffc8307fa2cf2c934da7979c96884df4a36b92b54ca97325494ab2be78fd8d9","impliedFormat":99},{"version":"6c71102ccf27db42765e5a9369c36c4aacd83a78883df87ee103d11be3d951c5","impliedFormat":99},{"version":"57ae79de0948c54c7a75ca0d72d0c360906c1dcf8e6c31f0da121e5a9d382717","impliedFormat":99},{"version":"55cc4ba04c0965890e2e46a092c7b76e92cc9812a12a10d510e75047e5c2edcc","impliedFormat":99},{"version":"977c1704104f936a37c41eb6b0d24cb413e20e62337f7e2be588d3ba55aeebba","impliedFormat":99},{"version":"c75bfc4a6eb3b39957d05a6b9535b424a98bff9f27518e39a7dd4830ceff4eb1","impliedFormat":99},{"version":"f8b79f53b95079b96f81ce308a927651d791c2c3e5f32c103e90fd61fd58d3c2","impliedFormat":99},{"version":"46f6e8a12611611d782904154ebda6e4b6596cd026b7c09e2c145e418fc8a2b0","impliedFormat":99},{"version":"a4560c1de64d671a8d837a6f0313669a7aac4ad7d0efa2be1dfba29f8d61c5f9","impliedFormat":99},{"version":"f193467f1cad8f2384912bbadceea4cdece962b9033488994a7405c29a623d8c","impliedFormat":99},{"version":"a846eff5c1eccb86a3ccda935896a80eaa2beab68c64e68c244908c86ed87906","impliedFormat":99},{"version":"a97588cd01375653ed51d1dd9bdfbd30467b130ad60bb5b6f981ab2170feed3d","impliedFormat":99},{"version":"584115df5500463c3fb9102a3a74bb4cc6a75a9bf6300701e1edf81da292ae57","impliedFormat":99},{"version":"4428ab19274a44693215f4f4195800c8221e1ac8a5a388ea534c4e405fac5f25","impliedFormat":99},{"version":"5ea28a5de3f28607387d210754f9d62d2cacc86684e89df9e74d412bac974348","impliedFormat":99},{"version":"a496ace7d44a315f014ae2711927ff48fd4e3583f4a1e42df356c37b2c890ba5","impliedFormat":99},{"version":"814ac5e9d9bc60c105e022e08d3a7590a5a76c93fce1572bdcc574f25e6dd68d","impliedFormat":99},{"version":"3eaaf422f4a8fd066e5c0717382129da90b5699a86f3326057a2ff4abee0c40a","impliedFormat":99},{"version":"8ec41716dce70226a7069735300ac20691513226c614b03b1b1aa7bf4ba3b2df","impliedFormat":99},{"version":"1ce271cba70878af1e987d3a93fa539c9e35facd9b70580f738242059416c010","impliedFormat":99},{"version":"9be30526f3d636f4b421d3e06983744be0b4fe245025887ba5a032cac68c2e37","impliedFormat":99},{"version":"990e4693b03502adc4038f04ec6a3db2458fa1a998edb9edac75141fe6e8f9d4","impliedFormat":99},{"version":"59507e67ece04e5a994907e68042d704641ae844108f8af9edd82350fc52dc02","impliedFormat":99},{"version":"a36d1226856f16d243adff16b2f5603ea245f505af5a85d5485ab275ca946b1d","impliedFormat":99},{"version":"0baefe65a675b833470b248451ae56f35697581018bdcd2880e4031cdc0cd6e0","impliedFormat":99},{"version":"2ab5a9dab4e1c3780ee8c7ba280aceae11c699371178c253cf5a36341a864af2","impliedFormat":99},{"version":"a80518638f84ea8a15c155eb5841341688ec6dc8a04c5693281632dfe555c3ef","impliedFormat":99},{"version":"27ba80c04731d0ea2f37d6b6f5020e45e60396f5c2f4666e57b03238ef0a676c","impliedFormat":99},{"version":"26ad6385782d8b51674e22f236866e7e08119f50a131cf5a091c8c576202f9e6","impliedFormat":99},{"version":"b8ebaa198a03eea15385326815ff31a01cb63c08bf69517e3ba4e1c8296fd14a","impliedFormat":99},{"version":"42e3bbbb7255cc27270fa12d31aca9f11abb56e985d30c1bde3f978dc01d15b5","impliedFormat":99},{"version":"5cd09527c5bd0e6a9df18ee2a8ca39e1a1af60658e50adfa3b2155c09f731a13","impliedFormat":99},{"version":"1e470d86477091005bc41203654b0f310ca7d45bc0c7952f8f93edc6d0613397","impliedFormat":99},{"version":"d09c441b12602fffde7cc009f9e815eda2e8c85a7ae1fb9dc9add975a935a4f8","impliedFormat":99},{"version":"f3590539d69e5d3c824a3dbb93015c58fdc8d6b90abe7496c770a32f20c559e6","impliedFormat":99},{"version":"4fae33c695361a6438082ebde9374a3779df07ea561b1ce08ae4f514bc6520f5","impliedFormat":99},{"version":"88a1b15f496a6c998663e6486b78ebba1c2abda9e220fd8e377c11dff3e4e836","impliedFormat":99},{"version":"654c457deece232e59f6d73733254cb78bf6b043d9d3c43abf0fcccdb245838f","impliedFormat":99},{"version":"45a99b02acd1f5580b93e48b5c610a60ebbbcb075928cf80cdc9316cce1bf840","impliedFormat":99},{"version":"ddad6719d075ea89cf7434c7a318b69d9bf26c330465ad1315c8ac4d059f7270","impliedFormat":99},{"version":"8c867515406eda8230bc6c852eff20073178ceb2ce94d6b9d0f5678ed13c0b8a","impliedFormat":99},{"version":"b430de30fb510ddbcead861351793cc62ea9d97ca3093dd202d349ee96ced493","impliedFormat":99},{"version":"f4080510cd7e9c65ceccc843f98f68a31fa74443ab7154515308c104c8433a14","impliedFormat":99},{"version":"535919c7119b5e3da3211594c3542946e1b9e5102d78614359cc5d90a78c6a06","impliedFormat":99},{"version":"ef7e1df5f97be321ccccbc8d0cad38c301bf55be0e5528d20d4e4479ec7021ad","impliedFormat":99},{"version":"994bb550d4082528038ce02c9c9e63ea278a31094dd526d91e559990b3ad17cb","impliedFormat":99},{"version":"df03f5b8e177d1c904928545a74d3831c90bbf653fbfdc29241b3ae20a5be486","impliedFormat":99},{"version":"a7d3f59a29ca31f40ea37349c44a7441eb10f1bed068a011760f1204dadd7a23","impliedFormat":99},{"version":"1e7d696c473c1e054caf2a8cd2759d09f442fac69473293ab665d6f8c714b774","impliedFormat":99},{"version":"df9f8f3d97d404cc47e4407b1a5c21c223b30fb6f1f74af05da01effa0cb56d5","impliedFormat":99},{"version":"5e923de3cf0d71e5d9a5ad4e90d4643490c5ac5b3f58ae66bb95f21dc04d6831","impliedFormat":99},{"version":"b486e2e5a4b514d179bb1503178694bf9560ef6b7660a027328b9eed5e73a627","impliedFormat":99},{"version":"d53dfd573a2464c977c298816c36231a62ae3dc27553e27a3c71f6665b269baa","impliedFormat":99},{"version":"6fd3ac9e256753431d1dda6b26de5e0822aa85eec20bc6c14436a177f4279be8","impliedFormat":99},{"version":"a6817b104cff6630183738048e9e2e5ab6c5bbed9d46bb528f80258b0c4ff757","impliedFormat":99},{"version":"40319f136f28e2db970e46b7e72b7bfd5a772a0df98eec5405c47bd6c9917c9f","impliedFormat":99},{"version":"21baccbad8315ef36c9d7f50048abd08ba81a3afa0712ef258fa6c061110e0e6","impliedFormat":99},{"version":"a4705cf973f4d37ce92c052828e2513fa023ccb452f94544931ba2f917b95f56","impliedFormat":99},{"version":"02cb56c5871a710fbb3f0080324577411609df19bc17200156e46a44fdf8d27a","impliedFormat":99},{"version":"57dba29ff984d0c81bb177bdfa07ab0e57dda6dcaea83067ad911eda34caf8b4","impliedFormat":99},{"version":"e576d9071ca12c411674ca573eb789590fb5604ae8037a2572886cfc293282d3","impliedFormat":99},{"version":"4d818da244b409a389c73e3eb75824fc0381b6e16ddaf80a8d15870c597a0195","impliedFormat":99},{"version":"f66b41b72c893a7d90bb8c6399a737e3965292488394040e509496a366edd1a4","impliedFormat":99},{"version":"e1b15aaae981aabbe7a8df2826f4c6f31aa0afdde1e23d15434e2b221a851887","impliedFormat":99},{"version":"10e6b4bb2c98b99ad66f1be41b2597076ada2dca513547292346b211caa31f4f","impliedFormat":99},{"version":"93abea381fd60a80fd3fa282b931d3522bd1e4caabd7dba49152f8f365106d82","impliedFormat":99},{"version":"b771ec60b06611363dd783f8e323f87d9c9432aca465f3cd3d39a6a4bcd79ade","impliedFormat":99},{"version":"baee3182e5624f4bbe9bbdb3512544bd77d07a08e803f36b898c292cc4650de6","impliedFormat":99},{"version":"028de137173a15dd541f16c8fe03c3da3f11a27d0fa1c58c336be102c440db89","impliedFormat":99},{"version":"be06143be469d3d0d5ce6a2ef95e368ae8454bd498d0c0b0be43aa4a6ecc88de","impliedFormat":99},{"version":"6b39082cbf46f9c0e56e73efefea459d85e9431ada4122755e51c4fdb35688cd","impliedFormat":99},{"version":"35ffeb76a74f42b609dba599cc110ff974c04d7382fc86d903fb5eb08787cab2","impliedFormat":99},{"version":"71ebf7cfd3b6d1e628450c875307a3c2b69aa9e94687237bb775a57f25cf1361","impliedFormat":99},{"version":"c0bb78950621e72b06d7e288280b6109885c5f7be8b583659d65e49d9af011fc","impliedFormat":99},{"version":"c6fea1f34d6a312a51ead56d2d9dd487cfe2ed243885b2da89cf51c1f4a3d811","impliedFormat":99},{"version":"9789a429c5349144946f1aeb7578a9cf517555e7bd2a5f8fa6889e8d58a8847f","impliedFormat":99},{"version":"e8388203c62a6cc3e00a4497fdf292b96954c99aed9621197aa7ad3a9845e3b8","impliedFormat":99},{"version":"0e7e5b08261dfe5ccdc9d9cf8b2aea22fa5345f96c317f03f5a0977acbb99e32","impliedFormat":99},{"version":"db4157be7d269a6daab5481918c15fbb5136765c3b8bb49489d3ee9626491b4c","impliedFormat":99},{"version":"b3fbadc1bc66794f535b892f5523ff3ae360d65ad72806bd24ef4602ba81c2f6","impliedFormat":99},{"version":"1f24cff6fb79847abba14795c5778f4cb1f137efb4e353e0a3fb1945e725290a","impliedFormat":99},{"version":"1056e3bf6369fe009b40647744c8402df6d0ba1f2d3a462a2aeffc0c83027934","impliedFormat":99},{"version":"b0da0c17082d1fcd42ba9a147e0002ce2f8e7fe8d7d1e2e9810b14331ca10cf7","impliedFormat":99},{"version":"f8a0dada5366f74f29291c9e6eeea48d81bf3b6dd7fed6aba386e60ecfaf2057","impliedFormat":99},{"version":"c8e93478ba85d6a953b7950a530a3228fd2b0663e76a42551fcf29599e5ae269","impliedFormat":99},{"version":"4e4a901be180e8174ebd0115037bee49eb8d0a5123e81f3a57b1b230f2fd7bb0","impliedFormat":99},{"version":"f4fe5a6412f5c4c2ce54119325f77804a5ff523d5e5d935e8a3c34c2d55e3a6f","impliedFormat":99},{"version":"da16b5d7e423e5e0096fce83b5703fd052ecadbd39573985baeae406a3ff406f","impliedFormat":99},{"version":"fd214d4558f949dc7cd55d2657db975a9272ad99a0a02f31af2100df72b0099f","impliedFormat":99},{"version":"ed2438ea4315e3db2767e79082e0066845c46ba040724ecb49b82d0597057987","impliedFormat":99},{"version":"e086358dcd0e44204dd616f050029b80e85d3df4e454d772ffc1580d2c42205c","impliedFormat":99},{"version":"b992f4b97e7284088fe8cd40efae6ceac1271fb8644173ff6015fd970d916818","impliedFormat":99},{"version":"cdcd99a7a4fcb0aa03586e374cc03c29edf192d79210d46ef2bd97a4e2ef6bcd","impliedFormat":99},{"version":"dd1a8059730f96916cceb5d6c734f59239cdc7aa6f5b0ee70fddbdcde89b1da8","impliedFormat":99},{"version":"82d3606bbaa51acea77cdfdc2e3199c4686ec2c6f71927972ea30ad6fc7b4a62","impliedFormat":99},{"version":"7588bf02783961f2b6871ecc6e9c60363ac79a0ea63ddfe4fffdbdf98a628a8b","impliedFormat":99},{"version":"f4ec160ed91e9bc5654099b8c9fa3c549e731c7a3f0de8d2cf14982dd126d1eb","impliedFormat":99},{"version":"330874360097f09e8cc4ab9c19d0c29ceb099ae500ab5d6461c9297b8c3cf0f7","impliedFormat":99},{"version":"1c4da43c55f396f8fba432a8827eee9fac8acf6c1494a57ef48177b57795abe0","impliedFormat":99},{"version":"1ce9891c6838a553f39b2ddc6f83075f3850a512475af31beef974f6f7cb292e","impliedFormat":99},{"version":"7911c13a1992969635e30dbc94eee146269dcfdd3e07e0e265daf5caadbd5f0a","impliedFormat":99},{"version":"6701c151b37be87bf02126312f18e65b3d91a2c20a7377833d33d919fd6df9c6","impliedFormat":99},{"version":"2a2283d33979c27b027ebc07e65a8f09d2f307f7a9efd1e07f0b29d88f787aa9","impliedFormat":99},{"version":"3c97002cb68bd560118a6c8cbba6ff2509bd73d87dd713edb3acd83e66bf4e35","impliedFormat":99},{"version":"664417e248d43d27f8a04b9ae5e1f3ddeab5aa6d9b41284ffd366705f18f4885","impliedFormat":99},{"version":"019210cf7ccaf627a430edae894d25b312db658fc0f2c282c36d04920b3f5ae1","impliedFormat":99},{"version":"a2ffa2e737e5b56c638654d4cf91fa6724b1b95c7be50a82b7478dea04ea8a7d","impliedFormat":99},{"version":"09abbe2cca1bd3d538def48c19a2fe62293bdf1f97504a52e26d40a3898144c3","impliedFormat":99},{"version":"3649547b460e5c107b12f6f29be60d9a81a59fb3034ef197979a694c687e77f1","impliedFormat":99},{"version":"f15d3906d25d611062b5c89d3145dd4a2ac60bf68f6f5e7f4d48d1189e474f46","impliedFormat":99},{"version":"6661f2e5e07a92e4267191cc689ad3930ebcc316cf44221ae8eb951e3d4612de","impliedFormat":99},{"version":"076c0467d216ed21904db5ac256da6a4fc1115cb870857be9905446da9e81341","impliedFormat":99},{"version":"1f659ae61eb9ef9148eafa4ec4171525da55c35a298b720f215ab0a89c045b8e","impliedFormat":99},{"version":"91753dc66ca2ba7e922513c6d73c9dbd3d6336ae1ba310e2d0520c99b93b99cf","impliedFormat":99},{"version":"ba087ea4f7c6bd22a19cb28e433a592ade91ebdfaf0d37f053051b81b3fd194c","impliedFormat":99},{"version":"490f6527eb1504768f00b4026ece4d21edd1949d5eca11bb76132330b5a8a55c","impliedFormat":99},{"version":"30c18c79997adc72842a146fef84249191bd8ee28f3456605c014b1e316dd7b3","impliedFormat":99},{"version":"fbd2d2f4374aad855367713ffce22d19c87e9483da420533084c0c734df1523b","impliedFormat":99},{"version":"b0e8320ce37a2a4f1cabd3d9c3e7c72065b847fba43562fa7680e436bdebea3e","impliedFormat":99},{"version":"9a6cd826888b63061bda7c34e6bdb871e7c0b01c344f15fcc3330cf5c0f99594","impliedFormat":99},{"version":"36101c7781871da39fcd8939e8faf083c606a896553fdcd7eb4b2f7c6ec47a43","impliedFormat":99},{"version":"ec266fef2d1fe9b7c49ae608b3ac60c4713d8d1cd2073c92f5db1a73a39556cd","impliedFormat":99},{"version":"34bc73c461e18692931c22a7afb38d308f7deaad9f21de13ea54dba0ca4336fd","impliedFormat":99},{"version":"574f30981211d1f1fdce83fad7c9b093ce986124480ce09ca871633ba6a17489","impliedFormat":99},{"version":"2083cc805a15babbf2d0abdf9d702fa6f75711590bae3fceb699ac26a4c76621","impliedFormat":99},{"version":"c51825d37dab66cb975c5442706fe6451b9213e098e3ff5f846e5a77539a7421","impliedFormat":99},{"version":"9068ab90549e1a5c0f165b9798650d60bd38e7f8615c05862edcc7d6dd10d5df","impliedFormat":99},{"version":"9def60b8c5edd45e81d01f89c7717c92584cb821b0fb14fbd025aa10b0ab3bf2","impliedFormat":99},{"version":"c7a0c488560b1dc8baa8c7f399cc474a221f7cc7b7380d0fe6014cb35f807840","impliedFormat":99},{"version":"81393d54e070aa48685972683871a707f160f408622954ede5d2a2f34ad332df","impliedFormat":99},{"version":"238e9e20c91fc4ccc94d52291ecef44762188d515f649095ed0ac99d59ff4fc4","impliedFormat":99},{"version":"77da76559d39664d9f60942ae9c12082b4fe475a67773bdae73073fd11b3888d","impliedFormat":99},{"version":"cf1189bc5bf2286b630f33be24872477888ba5d270b763e8f240a20e0fc5957d","impliedFormat":99},{"version":"f8081297cbe7510cabcd2142cc09294c076194a782ea5422c1fa5aa02bb662b6","impliedFormat":99},{"version":"1426f595ea21e6da826b69bd69c046e7443a77bf7a4434a9183297f46aabe509","impliedFormat":99},{"version":"79a74245aa7b853b8b5b0c249243529340426691807c11697106ed49d8c96381","impliedFormat":99},{"version":"e849d81b6db10ba5f8b89b25ebe91fbc005fb531b8cb417b6dda49b5263bf485","impliedFormat":99},{"version":"b19fe3a95a628557bca5b5ba33377870602b9c24bfb4eef0085fa0f04bd8f7cb","impliedFormat":99},{"version":"ebc64c6ca9a2f7942c0aaa51bac5d44d5d714e562693415a158dd409c2959de4","impliedFormat":99},{"version":"fdc0a465ffda280fc5c52ef5862816082f737f07f24086d1899b3b90ee03581a","impliedFormat":99},{"version":"e15e7ff9e28153e0c1c0589f35d82929e7918cbd60436c837c5604288f1572aa","impliedFormat":99},{"version":"1466a57f95e268e08d94cf92a030e469d4e6f8c180951d9c0fa453ab0a38e1da","impliedFormat":99},{"version":"d234d63170c7f6c82460feb9e8e7df14e38a694e90bb780f5054081847e8a971","impliedFormat":99},{"version":"5a353f55cd755eacd87196e6d14e8e8cfaaed147b08b19fe7e8721e3cff7e4e6","impliedFormat":99},{"version":"ef65b08cb958fa2bd14dac358334d8f500a3583fdb0f5d0d36eff66c6d2926b2","impliedFormat":99},{"version":"bc23a8c1d5732b76eee7581bb2757a98cf02048426f3a6f94632ad25547848a7","impliedFormat":99},{"version":"37820ebe50ca6e567034fba5022c1b2b35fc2dd748ffdab1f6a267696e041729","impliedFormat":99},{"version":"b7f56968a5aca1b41d82fd99d0859c366bb1e24c21610573ac69717c6c69cfcf","impliedFormat":99},{"version":"90889a47a83550ef4d6bb79f61a46f790318a5810874848df91ab1ce83bfa5e1","impliedFormat":99},{"version":"09ac02d7d979b4bfdd333f1133c60731f8e02f77ede93a58eee7c2e2894f8ed0","impliedFormat":99},{"version":"3a9e9b5c7ccef9aa106e8d38d624fc1ef7b61023f1cc99e49e0d34d806717aa2","impliedFormat":99},{"version":"280ca67f0276359a04f91526e7904723c634b8307f36e88b8ed1d55174d65646","impliedFormat":99},{"version":"56380192c5502ce3cbdaab811c03293ae0a3477dfec5ad999e0561c7a55cc049","impliedFormat":99},{"version":"a75dbe057fa7121e02effb45fab47e3c12d43063707c633be18c92b0a863a37f","impliedFormat":99},{"version":"813ecfd69412e80b3dd7bbf45217ed1f76d70a939457bc4213a38db216bb6e4c","impliedFormat":99},{"version":"8f4accfb1ff30808a2aec06f15c493e88683a576c5ef4871388ce7cf0dc80da8","impliedFormat":99},{"version":"1cfb8467bd39e186a94ead6da6a9549de18583c998a3d6ca7a7bf92922b7cfe5","impliedFormat":99},{"version":"095a8f6c16d323c4f1899434f895179bf3a318302fbbde8e25a0caed37832c41","impliedFormat":99},{"version":"e68ac7298d9feab31b040212b8c81d47146c89e2f0b044078413ab84dfabe024","impliedFormat":99},{"version":"669aa01bd96f92b0fa1f9f5dfdd7b974b8823e876d690d2aec1c480b70d2d178","impliedFormat":99},{"version":"1ad942280beb8fd7cb99508d5ec9ba3c0034523bd9ac8cb6059cbe9545194977","impliedFormat":99},{"version":"4429304845afb8cb868836562673380e3926380bd4600fa7a0a3ca8ef546cb7b","impliedFormat":99},{"version":"55d10877f0755054ab010faa6273fd064165339b9ff24e9f26a9a57b68a24c3e","impliedFormat":99},{"version":"510ec596cd8c9dc087ba99465428d24b027f504df7d399d97fc971d0aeb961c8","impliedFormat":99},{"version":"59cd0cdf1fa93bed733d6d84b0d5147501d87bfae8ce4668b4b093c22e16c563","impliedFormat":99},{"version":"854a4ed2d2ce9680a275cefab3ff654fd76627503ee311d19c0e2a25069627f8","impliedFormat":99},{"version":"edc84564b1feb469da3da5b7e1efcd6f48fa2e04f006f07aeef4c6a5659c03e0","impliedFormat":99},{"version":"b076daa179dc64180ee9538fafa4fa6e5796a3a81539eb3349737ed08d57e2c6","impliedFormat":99},{"version":"80c166471e9529f02214e75d8bb590870f822fba82a3f32cae59795e26d660a0","impliedFormat":99},{"version":"25aa189f1265f4674b7fcaa43004d7c7cbc46b6e1f3460fc413f3cac61c77da1","impliedFormat":99},{"version":"97b2bc30456543136698a248328f804aeeae10ff3211f5368e96bb9ddf532272","impliedFormat":99},{"version":"c9f27874d3107b39c845a4380551ffcdd721246db1c82bcf43cad86d66ea1249","impliedFormat":99},{"version":"451418c8195f8533477ee9f08c4642f7a8ffc9813d73a747d77fa70eeb66a79b","impliedFormat":99},{"version":"e768ad0e15d014a0a09e47dfb4c3d6c9d5247b186ec2887f07e984eceeeadeed","impliedFormat":99},{"version":"77d3636c84e22e5692cea961ba0957d687aecd776ca48cfa5f1c38f3fef6ce26","impliedFormat":99},{"version":"119c30d96ef567d5eb44ecf9caeeccdfe4b4af9321fe687d10b238f64a1f16c7","impliedFormat":99},{"version":"a4191368ca3082ba97bc919f8de837e29cedd508f11c20d559421ed90f5648c3","impliedFormat":99},{"version":"7424fdb26b9156029a3d0282191a16576bb1656f7e77c1da961b9e44e9fb502f","impliedFormat":99},{"version":"94e8a85d1d6ca2a4fe056f231dca96691acbefb9b0273ee551109bf69ce53f11","impliedFormat":99},{"version":"b78d4a5e2cbc7f6b244155da9fbd30d6016d225739abe750b47d443ad0057289","impliedFormat":99},{"version":"289db195422725ce6e021fcd4ef250c4702248355515ca1648227723a98d618c","impliedFormat":99},{"version":"41f3b546b4f1810ad4ae11e8a32664e70ec2b118d72e7d6cf04c85ae29d8a43a","impliedFormat":99},{"version":"ede452edea60a6ba0214f4201f5b959d57e7c26a743a5936a05f182a4bc55930","impliedFormat":99},{"version":"0a52552297c1d0af3470ecaa85e504b3f87af7fb327da36b5ef63ba06f135e20","impliedFormat":99},{"version":"ea7dbb28b1ebb092c8f974336a33caee5b29145b699ac1e8ce765979790bbb35","impliedFormat":99},{"version":"acc64e8177b7e4fe1a2545bbdf2875a89852ca5b042471fb05901c5e2a6d8fca","impliedFormat":99},{"version":"eea6ac739630bfb73b2e59bdd90d6f278a7ef0228f09525fd6adaf09d90f7280","impliedFormat":99},{"version":"d60137c38ec70f4d3495e2cf71ed73bf75f405f78c5c8644165bdfb0d9eef528","impliedFormat":99},{"version":"b437a4e1ad5b26d9c0d740ce71f956181c74bb283abb0d2510360ff065b0ff3c","impliedFormat":99},{"version":"7639369a2b3ad9cb82a464144871c8f90990443f92320c1fd3fd777c2ff5bdc3","impliedFormat":99},{"version":"c058887683e283e99658518eafc8ec08754f5b16792662b09a638d5a317a7719","impliedFormat":99},{"version":"1dee7843ead6b1135839649de81ec125fa95b5c7c80c52b8a08d8fb7c40ece9e","impliedFormat":99},{"version":"e3d7986bd6b3e8949cf921f9a50fd955da64d399dbd817f5394f772f7d52b6d6","impliedFormat":99},{"version":"4115d25268a762ed4b047dd9d5e29f46687ba84049cff9fb4c68b18d60e910d9","impliedFormat":99},{"version":"1ed9ce51e9bcac81f9d2c4d27ac2704c0a2267917fbd3dc6d207413cd7a6b272","impliedFormat":99},{"version":"f13cd5883699bdc863db77c15ba94050548e23e98fa5a5b26455fa105fd15549","impliedFormat":99},{"version":"008f7e03cecd8c3a12015053fb8714b8d738d35a35ed1bfe4c4b02be0116b89e","impliedFormat":99},{"version":"d86f6bbbc83f4d8944ffba72ebf5b486afa462fd26b9e04fbb199b4d2dd920c2","impliedFormat":99},{"version":"4bd9c7cecc7b653a34f633729cc1a5a954f95320f2dae63c48e8416a625b36de","impliedFormat":99},{"version":"765f3ebb07e1f7568ef6ca14d2e7f80900ac5dbab6dd25872f16e23fe5ef4d34","impliedFormat":99},{"version":"6cc361c360c6fe2723b28810e8725b894d9c88e4c4cbc197a8a6ae304452ceb1","impliedFormat":99},{"version":"386d783e5c235fc03eb9d3be33a41ed3a3744708c6f184fe9618a25b6caf9a58","impliedFormat":99},{"version":"fae4c4fcfb20aa2860f880aa7807d8d8102abda026c539c261e4da53997d9659","impliedFormat":99},{"version":"a4a256ff9f03798c49a001a0d4bc708e96a20be188d80d3f4d6f45e1d2480b91","impliedFormat":99},{"version":"80cc57ed8b2f7b94ac5d6b61ffa975eac13e39cc55ed9d32f2a4c03b07c9ce2c","impliedFormat":99},{"version":"6a1c4cb49ef0a86d4985496e9250de9fb38f286fa7bba5c2556855398e24d98c","impliedFormat":99},{"version":"94613cc30b4c60bc7b5e41f0014f5afc1f70238a9f3112400e2ed802b9edc2e5","impliedFormat":99},{"version":"81b5b7d4670aab0d1999b8480d483e3b0d12a8ef6a47238737bdbca5cc5b3af4","impliedFormat":99},{"version":"0a75c44f704965ede175c60995e6ef37943ace985c82b37ec004a02a23d6f54f","impliedFormat":99},{"version":"dc6fb79c45f464f758e0e2b6a09c34e0e88c980e3573c04333639d1061479dff","impliedFormat":99},{"version":"1d49ef9a4c8784be6dd7d91afb621b78c0fc8017769b9dd846ca63232e905467","impliedFormat":99},{"version":"db18fc8ed779ede2de97ba0e9bc61d13d1e971711bb85fa085d2be02376203dc","impliedFormat":99},{"version":"d92de62f96a0cf43b1625552f278468e06061453105a5b60ff78c6f09c30ad8b","impliedFormat":99},{"version":"4a0b017378d2a33ab5c70d2d885b9db3c10846e1f0f9b685e3be5edb59ea3eac","impliedFormat":99},{"version":"1296c3ac64a45bb17d8c90629bd2241c5942ec6ec51a4013ba540f2aab85eb07","impliedFormat":99},{"version":"7ace98c6830758e1f8e22def1defa1b77ccdebfd07d3508a1fc455cf098a62a8","impliedFormat":99},{"version":"e7f716b3a0ff08e8d289109d49b76e90644247d65a80cbaae2f476d3ca954bf3","impliedFormat":99},{"version":"5f5f47b68b781eb477da7e844badb481b34489a6e8686c1ba155bbcf2e7a133b","impliedFormat":99},{"version":"d863e0158ab6d1a5e8f315f879c255c7c64a4e45e5a980c2739c73c8ef9b1813","impliedFormat":99},{"version":"bffcf294ab82808982b50b77c7ed624a48b51b362e5108c98e3dacdd6b96605f","impliedFormat":99},{"version":"9ead7db9d2f12cb8ba534475698fa8d5cf6422e6ea0e77584b31e59ecf25eb63","impliedFormat":99},{"version":"1e2c2fc640fe117bc83f6320e5fd181f6e51a86a7eee232d510ed0c8b2909091","impliedFormat":99},{"version":"fe6441d144419863eae6218ec1ab1fb52af6c4f2f2c9993980038501ddb392e7","impliedFormat":99},{"version":"f928aeb71d76a99ebad7fc109e96135e497989ddb0c0ee16465e35de24f0cfc1","impliedFormat":99},{"version":"c883c7b209cf3e51a693023de37186e199d7e2342cd41f1f0b8ab9ca34851cf6","impliedFormat":99},{"version":"0fbe381899728959b9f565371a95921f76e4255dc9813ca95a423c7a81cf157b","impliedFormat":99},{"version":"b1dffe769906190c61aa2de29ba423c0d9764f05aea7ebbeea97f8323f6bab95","impliedFormat":99},{"version":"5f697a3ca1e2ce84e63f5c6fefd55ee00f4608a450aa765c923abc907f0032fb","impliedFormat":99},{"version":"6c8bedda58d1dcd5cade3495643fd5a1d1e6af75f50b961922b4214003c34daf","impliedFormat":99},{"version":"3d8ca129295708074c35d06f4e9b40e11e9ef3233df0dca6ae1aae5007bc1235","impliedFormat":99},{"version":"310790a0b20dca6d4fa1884837f48775ac1a7b711dab75bb25e203544c82a46f","impliedFormat":99},{"version":"03889f2863e44d756e96e03ec365dc1a299653897025ea1ded75e99f4183026d","impliedFormat":99},{"version":"66d50cba2ce96e5ff08affeb25d1ac3e6206887585a650ebf6cd712935c7bdfb","impliedFormat":99},{"version":"f72510666ed2d0ac50c3999c90e6a628ccfddeb123783759aedf8b64afc472c7","impliedFormat":99},{"version":"82d2796cae92487b15c2ce8bbc220d9d6ce8e6dbbe521b08f1d52eeddd83627d","impliedFormat":99},{"version":"66b417c8ef1aad8f6f4c2185673d0a3702aae2bee03885edd91a8df598d087ce","impliedFormat":99},{"version":"a7b40cfee10f0cde9d2d0d368e143a879af2fb8eda8dd86d722010b37d67fc22","impliedFormat":99},{"version":"584c9a3408fa4608c3f267c88f9942b23f3ff65a14daadf3eb1d24e1109a34e7","impliedFormat":99},{"version":"3933b9179508da74e2466ed5af41790695e53bef479533eef408ab34c08c3805","impliedFormat":99},{"version":"50aa52ceb6b51e337f65deb87aa418a7c24794fc0f9eabe41357461fa3106dd5","impliedFormat":99},{"version":"f6867a201454c8b60a78672c53367fa9dbc1aba247db27156c3e5a2fb3cbfb55","impliedFormat":99},{"version":"2bb7ed42f0bb306c77fa17ee006759f2f3cc6b6817fc4337d729ce010e7f8fa9","impliedFormat":99},{"version":"05c7c9e1d12cf2e7ec37dd86fcca61e4b1b4a2fff3fdf3648ac7210b5c09d944","impliedFormat":99},{"version":"8acc21ead62f0be0b6f6415e6dcf89ca2089d262a5d9da84f4688c9a37a9397b","impliedFormat":99},{"version":"e6b5b68af5046e3d64bbff45d3b41e0fa5da06f85efda33a07aef32c2fa4b54e","impliedFormat":99},{"version":"bb3b6049fb550829d304ff7024150cd4acf3650c11d9230e52d194caab19393b","impliedFormat":99},{"version":"bb119081db62488bf65a9563919a80d270201a1aca45d8ebd25a6eda85af1b78","impliedFormat":99},{"version":"abb85df073721c70450b1af3713cef5ab1025a36cc1566c31cf39475c512e842","impliedFormat":99},{"version":"8407d00275c737789e3e526a2f63542d43240d39cc813e0f391d0791e796751e","impliedFormat":99},{"version":"678b7873a38230d98a4ef8879f1b84b658b01506519e05a0291e887b914a4924","impliedFormat":99},{"version":"f474bc9e506a7690f97b073c4c93f16a67fe1859a7610cb08b54513b62f076e9","impliedFormat":99},{"version":"ce2b604e7fedfa087e8fc68f7d850a2208f2b0e5393db59a4fc7e21ebf04fa60","impliedFormat":99},{"version":"286b74c5381464962234a6e6fb7e41b56434a0466c0b8072f7762d102941e4e8","impliedFormat":99},{"version":"781a8c3f0fd5a7bb5c73ef1a804a09167ee6e72031be68af06d09a85d38003e5","impliedFormat":99},{"version":"d514bd8b93d377b46f889857af29d5a56246697136b3640514b376e15c88d9d5","impliedFormat":99},{"version":"e8e5d7cd52764357a339835c34327ebb8634c5cb932d2709f93c152f2abc3129","impliedFormat":99},{"version":"79583eda9e4c9b3807c71fac738a25625b11fa7ed587b2d1b5be69341219365d","impliedFormat":99},{"version":"e839194cdc481038bd67ed3c1566f5d29390c2af98f6b580115e7515ff3120e0","impliedFormat":99},{"version":"f347639fa958762371b8408e36bb5342a58affa28768131a834797c2a9ed07ad","impliedFormat":99},{"version":"053994ec3f7884ddb63bec643bf2276a4da93210bd12926ce4ea51cdd2f1af00","impliedFormat":99},{"version":"38bcc4a561e59c0a0e6304fcf9ed28df9a18471a06f7d25d4d839aa0f273b4e3","impliedFormat":99},{"version":"fa83e95a170c109f9e52f892a28a59973a8454979a2cc4161c765173e67f86ab","impliedFormat":99},{"version":"08a5be336a00293970580fdaf71e1197054ef2c9cd87769b19f7461cb3c617a5","impliedFormat":99},{"version":"ce1ec8f1a46ac13b31b36828b903ddc8b5f0a4f1cd59d6a1b122221fd0da4164","impliedFormat":99},{"version":"361fdf24d40b6d7f3250dac622b9d37becb257e4f855f85f0a30dd6558d50e99","impliedFormat":99},{"version":"1758b1f8898f121a176226b62e39461eef854bd33ed0552991c64cfcfd237826","impliedFormat":99},{"version":"7ef114c434371bf0bb373d8afb5e7cfdc5e1b2678683b92b89588a359bc01d46","impliedFormat":99},{"version":"56ec6bb075d116568daeb44a00ad710e9645b9e383fb61d83078a9e0d59ddac2","impliedFormat":99},{"version":"4d62e78223979185bf0fcea9a50e9eeb81e20e4df1f924511efaba42333d39da","impliedFormat":99},{"version":"170475025a9322720723114bb937bfacc4e5096666073e99d7f1df897cfaa46f","impliedFormat":99},{"version":"9dc2f4660f991088c1df79af054f451e7763b592b83911b2f55865282e5ffeea","impliedFormat":99},{"version":"3efbb5dbfabf41264c36e3e8c154ca2ec5a28dbc3dae87eb299ce826cec00eb5","impliedFormat":99},{"version":"ce0d485a733403bf3c9a552234e183b2f6b4f2a9f392ce8593ee52d09a7b4227","impliedFormat":99},{"version":"21d7d9fe27f34102a480656861392bd4fd37ca27837f9dca3542854bab35ed92","impliedFormat":99},{"version":"c0561d3440cc84a4e1a289b392dbde82e307d89eea71449c3a41b609daa9715a","impliedFormat":99},{"version":"ba519b143a14fee5242e9e8e549c5944bc6e6361af1162363c8336bb83289708","impliedFormat":99},{"version":"ddba8d73eee6f39c8a1458c244b9bf5cc54749f9d96b3e4c020bc27587afc05a","impliedFormat":99},{"version":"abf16ed784c74fd46c656cac5f5f7128a8fc9ce72bde1377d83333b32e160824","impliedFormat":99},{"version":"297f7c98f8447d6d8171c2c830a5769ac5d815ffb1a41b31ceba551b1869f91d","impliedFormat":99},{"version":"73bbe80f02235433340e10426a1a30e4862f302d8a4773d391544c47f6c44a59","impliedFormat":99},{"version":"091f41ba847167078b84a31ad0ff781613e22926b1aeb2bb9c5a5b81829e950a","impliedFormat":99},{"version":"fd8c79b9432d4c75dc3a776ca5cfa6c0cb01579667604ab7d3b564adfe02a1cb","impliedFormat":99},{"version":"a474af2d3c46c4ffb9ac67c35794d3188c99d0a9e29ebb851c925e966376d867","impliedFormat":99},{"version":"43f3124b51d65427823ac7ac1a77ddcf9d1aaffcafa199307c8359f96579d956","impliedFormat":99},{"version":"8b5edc0c16524d7ce61e374614f7be58eaf72aa31779e7995d75a48d8d321153","impliedFormat":99},{"version":"833d94d5f9ba3c0a0e0a9d98c79f4ee0ee099ef6f1aa6c594f98e9a503eb20bd","impliedFormat":99},{"version":"1073447c7d241622e16b03261a5a35e1ab9511a726fe2e9d9472a98531e08ebe","impliedFormat":99},{"version":"678498cea62d90c7b6f6fe6d77d6913a498207292fc5ac085c3ca6673e1ac390","impliedFormat":99},{"version":"07ce6472819a84a9553d35477e08e843adc1c4e06f706c32aaa6bf660573abe8","impliedFormat":99},{"version":"b49acee84c7c1e58e404d674f3fe8a72a73bea8f21a3384739ffac376dbc4d9d","impliedFormat":99},{"version":"e05f80fd2fd9766d62e58ca19f342980594df24b67d046b2407bdbbc642c20fc","impliedFormat":99},{"version":"31150f240226c796b061e96be00586546e8691604f5e8e074b6eaa1cf7ccbda8","impliedFormat":99},{"version":"bc4051bf149154816a313aeaafccd606224c7dcb5797faaf1461c7eb7b9dd32a","impliedFormat":99},{"version":"8384d125cdbde45b18b143511eecb4cb1a630393b20e0f384da7ce53ad500200","impliedFormat":99},{"version":"bd1bf0a339f399d23c42b3c71077411fa0516521cf650f2a979b6b3ba1bd5776","impliedFormat":99},{"version":"7382c0c8f0db3389d4c2deb5555a6a13510cb2f3b1299a5be434c78959065adb","impliedFormat":99},{"version":"28d190c786629e69bd4663183c7f6cdc6f6d95661abb33c4acf8e864bb17d6c2","impliedFormat":99},{"version":"f7dc29a70b2c22eb0ee37c58fa13b92c56a03cb8d07e517e50745fb8f3180fd0","impliedFormat":99},{"version":"2f7ff4d8be24993c494c9174d6d0d567a2f777d47ae605bdcd1f369561d3b1b9","impliedFormat":99},{"version":"3c5011b14981547a762a9a4b23494d3bc56000e016c61cf288cc282cab4565a9","impliedFormat":99},{"version":"31d6f6e05ea3be94b6d0958fe20585c624e37139efb2714c6d4716ee2e83e39c","impliedFormat":99},{"version":"46380cbf7064fd9f0c68902243e97e6c50d044c1c2075c728f9ec710b3d4764a","impliedFormat":99},{"version":"ad56ff5c498ae19096bea2f2e48a483496a69e7f882378ec702d0dab3431adbc","impliedFormat":99},{"version":"33ac964aaec5d03a7f2bdf85235133d8f8a542ee8cd53cdb6370cf12a5fbca1d","impliedFormat":99},{"version":"cb525b94462aaffa1953f40ca64f30af02c056ddf190a005c9372140edfb1520","impliedFormat":99},{"version":"f9c4cad499989bc9e52fb20fb79ddf145e74f0bbf658c11e632ff27784df8d67","impliedFormat":99},{"version":"8b2416a382ec4e4d165f2eb918be0656e116328a89517376a344e155f1f20574","impliedFormat":99},{"version":"c2b0b8ab0839ebf444fb041be8baa98073cf24e7d34e9d7b025283bcc19e4f6f","impliedFormat":99},{"version":"6b83038103737e8a2a62c32a504cb51ec0ae8c290245392b1ed3ae6422dd92ad","impliedFormat":99},{"version":"b8c56895889493917c83e010b52a20503a577fb619bd2dbf93dfc96194d1507e","impliedFormat":99},{"version":"a346e366f5b0bc3b7ed1246b37970ed4cf285ae542a9322fa570461ecab1ce50","impliedFormat":99},{"version":"ac08e7ce22f77cb1c3e394319bf6c5e91765260cfc1592fe4ec98d7b6dfce063","impliedFormat":99},{"version":"936087f474e826b32d78e7207349207d340d684a888366348c4f21e588b80af1","impliedFormat":99},{"version":"7a62127857134b78a06fa3eaf7c5cb640aaeb4c5f68b286dde92530b0d91439a","impliedFormat":99},{"version":"d68366828b46684cdec1e5167d55a37eb12ba413a8dfa7a9f3bcba9b0eedda79","impliedFormat":99},{"version":"1e29f487dba82fe1e01581eaa5452778335c8e8035dc7bc897a08438349e015a","impliedFormat":99},{"version":"436e04e198949a9de4d12437e9a0e22a635cd572f6a1e7569c69367aebd564a1","impliedFormat":99},{"version":"2de8f43486975db9345e8671658af70b6732714b921338efeee75332fc9d2b9d","impliedFormat":99},{"version":"a6042f5361a7d639267a950bfe7b8071c8fac0a22c3460516aa57132e5e8d783","impliedFormat":99},{"version":"994706f0de0e7cdc500fe2df830df39e8673b95e21052b860833bafa47e3b3e9","impliedFormat":99},{"version":"eceeb11208e29be4ee959d8601d44a160e5891acfaa2890ad3381d9ca4552a3a","impliedFormat":99},{"version":"1d4ca5e0f18a48b4c9bb13d191acf780c72d6364f53bdd5cccaae3da8dc75ec9","impliedFormat":99},{"version":"9ce599bdf3ac0d33b85546886643ef3826894f290a8fdccc09f34673a773d585","impliedFormat":99},{"version":"1aded17d799608c0ba976d9c017b71b552428923ae175c4ce2d03c6c251fc293","impliedFormat":99},{"version":"110a028c72500ec8975f8fe8e9c58bc3c53ad1b8cecedfdcc9b13d01c82f9fc6","impliedFormat":99},{"version":"0f28079d1c3a5b121158ca2992b65c9b39ea578d10f9a660edf19f0a3df74d72","impliedFormat":99},{"version":"6c543b666c02de0cb90fba1b177ad2e0f38c024b2d35baf7866d88a772335013","impliedFormat":99},{"version":"22ec74740daba4895b82f71ee7a81e8d84ebf8ca87d750a9cb7eebfb53715cb5","impliedFormat":99},{"version":"a99162f184a2eacda687014590c6cdb127b309361ca893876df04e6f42899933","impliedFormat":99},{"version":"a2e7959cfc8d0b1e2a8fea12946fdcee9d3d39ec83f9f69fd4fd3019dd729b1c","impliedFormat":99},{"version":"f75cefd211302ed3f67f21cca8fcec37a261f61aa74c8506818a594d63987c50","impliedFormat":99},{"version":"0bc6eaa27ee3b289d58fd31f9597fb3786fc5109a6fd247f2d18025cd8bdbfdd","impliedFormat":99},{"version":"2c0c57f8d531e350d0bee50b45fd4979073ad3e6770fcc82ee5d9434d33f01be","impliedFormat":99},{"version":"657ac562004aa622ba5adf699048ec590ad1b4c0c47c77ad86b8d3f491c068ba","impliedFormat":99},{"version":"b95426b6a6ef360b38ca32ed9a16d827079eb9f9c2e018be263a6f9a6d4dc62e","impliedFormat":99},{"version":"9c7501860d6585a6fb5d1021c57a33bb953398da637c5dec0effcd7877a52bfd","impliedFormat":99},{"version":"618c2d571eeea05cb19350eb01fd25e3362faf19fba3465eda421d8ee393bdf3","impliedFormat":99},{"version":"55430d53d77e54aeb57496d12b469c03d1970776db91e2ffebb9746f67f49db3","impliedFormat":99},{"version":"7aeb98df985447d55fe2c79d236a8ac5d9298828f5f64eed23943e28c91aeb1c","impliedFormat":99},{"version":"724c015bd6ca5e48308f10bee2f034ab5e0a5b13452e36bf05fb5f455a1e9ef9","impliedFormat":99},{"version":"8637d71c11793ae5cdd3171517ab0453ddaa84a916f6069cc7d21756f01c9a13","impliedFormat":99},{"version":"7b564c8ffe25811dd0300e0fa16d9e1bdb57307300a569aa4442a39c794b38da","impliedFormat":99},{"version":"b9aca9e3eae5ace3397362e7093655ed2f2000a3299003a0be3ba63fcd8a1cf7","impliedFormat":99},{"version":"1e06d6137283a011ec689e6ec5e76df3dd46abd938745d363a260adb54b0b6e3","impliedFormat":99},{"version":"9e0bc78a0cf6afc736a142062ad0186d496b8ef9dd72b5a3d2847508ac9281f2","impliedFormat":99},{"version":"12f6a1fc30cc21367b7bd024a1f234f1c87c2694e5123791c4c1336008a97ae0","impliedFormat":99},{"version":"62a82040362407115b58a948e8f2cfd6a8c277a2d549c18fc06d21de2c3931fa","impliedFormat":99},{"version":"1d5cd62166fb45b821f6292a748f772620525688c4844ed81ddca13253ffe99f","impliedFormat":99},{"version":"b6007d32fa2029a0a1aaa3c405900ede8b00d3ab717af0a1ce3e681bbdd7cbd2","impliedFormat":99},{"version":"d430e252cb220478232cf6783dac71b221875110f508ed3ffb4dd58a93cd3bcd","impliedFormat":99},{"version":"0ad363f8072fbe9e4f6a5b90a870ff30f962eee48c5fdb543445f709675250bf","impliedFormat":99},{"version":"5dd81b737d6f72e731aaac4678c763af0ea6897d7fd8196f04e5477757db3e16","impliedFormat":99},{"version":"c9de554ffd41dc88473b51f8a726f8e6752ba4f8afa12100fe24b9f18ce2794c","impliedFormat":99},{"version":"f7f004f03df753e513625d261669f87c49d92bc2ffff624b809d5c8c8068806b","impliedFormat":99},{"version":"651cbda75a78fdf3da54f3a7eb5de87652390a44a34140303fecc2de9983040f","impliedFormat":99},{"version":"200120eafe59da37d180ceea37b342957849377c7215d2efa9294edf537e745c","impliedFormat":99},{"version":"54b641ae9f41f8d05b6141e6a02acda77b0743e1c3b0bef93e689f890981b1eb","impliedFormat":99},{"version":"b231fa6be4cec8a6b90f98071335cb22a6196b64724af56b1e851851fce48bed","impliedFormat":99},{"version":"f9f8a5c8b56a99c29943ba345f03102f159330ee4984ac0c06a4b93f3f9d6c1a","impliedFormat":99},{"version":"2cfe431d866a5dc7a23dcb1cd896aeb995dd1416a668591c79d7c0548b2bc8e4","impliedFormat":99},{"version":"8def9a68149edf17ea5df2669bde45acd5cb3f5d28ad79042a428e830a24af1f","impliedFormat":99},{"version":"a00a6157f232a7d36c78bdd7c85d34c8c9e8dd7bd11cf2540748f5fb9030330e","impliedFormat":99},{"version":"2b08bc4a87ef16bf7f587f074bb9194c112b69462fda07d5410476c8513f9a7f","impliedFormat":99},{"version":"615607b6a29e3f697222ea2b0109a513d0c7a961969eaf9498917d36db55ebbc","impliedFormat":99},{"version":"343987d6dae8f8ec43e2eb17aabb2bc5a15be8e7c797d37c74792e4bd43ca839","impliedFormat":99},{"version":"a80b7bb7f5c675ece7f1e73bbf4f4f9632ea8e919c1170ed9bae7cc6fb707e77","impliedFormat":99},{"version":"c27b0fbf9267c8beebf4ce5b1696934e7bc08847f28b2c9249659441a94b9da3","impliedFormat":99},{"version":"24ae591b2f12be72a4a9fe993b92135d6bb3e5e1bdb13cc8097625651404c4be","impliedFormat":99},{"version":"0a1a4813f7ecee0d0c39fcd50583dac3b63d408a95072905ba16d469919985ae","impliedFormat":99},{"version":"7dfa35a959b024bf2fa0483f2488ea6ed893ba1277ccc075e018a1730270d544","impliedFormat":99},{"version":"c0e98150595af80066480e9583f89e6370693cd0827fc89b68ecabfa5cdf4a72","impliedFormat":99},{"version":"10134fdfdf255c70e3e1838ad9ef47047677383aa6978883c15eb0f5c17c3563","impliedFormat":99},{"version":"39056f5033d13f6d66c2980c3e0e20bf84ceb64d51567156451695773148ab1b","impliedFormat":99},{"version":"4d79b57384b19b721f29cc120ccd4c8aee6c2351d8626a6bc3c43e1e7dd555fd","impliedFormat":99},{"version":"ec110162f200873cca9707c8be48a53fb509377db99e916b839b1a36332a655e","impliedFormat":99},{"version":"77f67d567cba48115ebc24484cbd0ae510dcd1e41f9508ee1f5bedfc0a925520","impliedFormat":99},{"version":"45c5df088d0b2fd4aaebabae4ac3e69f05ead369aa0e146067dc7f553b0a8279","impliedFormat":99},{"version":"6428679bceeae2bc835cf15366c8219a9f4a3baf9133cd2004dac51a87ebde8c","impliedFormat":99},{"version":"163555f7f6c6ec766b30dd054fab8fa69f5184d82698c4f5e7457b4f22710fab","impliedFormat":99},{"version":"8a92621a4d723e1c2f868b18f4ffba76739a0c93e8437850f99f5009499b8848","impliedFormat":99},{"version":"2bbde324e159d9f59ab56a4c77128737958704e9c4331caf646b075c93d58ea8","impliedFormat":99},{"version":"b7c30808b1e0801ebc2929e8112cbc6471473f227d25fa3c338ddf8b4f2cc972","impliedFormat":99},{"version":"a5e0dbdd3c5ebcc3561c493df20fb1c35094444b67e5cdf894d5ca83455f0dc4","impliedFormat":99},{"version":"bd0ba36a4dc087b698b83e8f210c57b5b8cb29c4e7cf09f52b9c53cfc8527508","impliedFormat":99},{"version":"40b46bcc69563ffbeaad0e7a9be85f7ece978902c7e17481874d3e40b6f30baa","impliedFormat":99},{"version":"24fec85fbf17a72b387916cb73ac60273753eb2f75bdba89fd9d8373d2f8e823","impliedFormat":99},{"version":"0fda2c7354705f8e3c7e88495fc14af255e1e4fc6ab5fd2510b0ded969550128","impliedFormat":99},{"version":"8364b396dccb914a0fdd1a43ac72eab807e2285c023aabdceb4a90175ea1fcaf","impliedFormat":99},{"version":"267fce2a9d770603e7497ff4d2ebabd4ccf6b6c40b379574fab6e7bf16df3635","impliedFormat":99},{"version":"6a92542761d442813efe8c992d14ecdb9f0f88d29128ababad72d5372d377a41","impliedFormat":99},{"version":"a913e963331c6b05ee3b833b505855f555b1632bb7784fe97933f01569b64221","impliedFormat":99},{"version":"a96a6cc809d8f09952880373df55104b7869b601c45b58be80ea50ad46bbb0db","impliedFormat":99},{"version":"6f13100cf876318d0f1e8f3600beafb1622b52c8ecad388f82d5c8a7ec5c3982","impliedFormat":99},{"version":"12d6a24ab50e258055b79b5620e1ab58fe1d5e53f816d7d24bf63b2bd41399af","impliedFormat":99},{"version":"4d71c3f2950cceeea5a198a49f9548d4c1744b2e08e799026b2c01e26c30ad84","impliedFormat":99},{"version":"56e5330e3c63f36f57cf87db4674dc0da3e84c9745431e3ee4eea014372e6ae3","impliedFormat":99},{"version":"06454590fb020d26332487e466caa15be9d4ab476cd1f2b502d041df6e73ace4","impliedFormat":99},{"version":"0af1d04da71458d3b24e9d4fccebd327335f147e0b822871151c6fd74d8a945d","impliedFormat":99},{"version":"0a65f24484673f5ff0ffbf09d8970f509a4c7140cf4a92fb94f4ea8be759b150","impliedFormat":99},{"version":"c3ef829e6159fc25cbb3ffb2392cdc65fa0bee0de45d1905eef39ce72a30b223","impliedFormat":99},{"version":"1a2dd1a4760aed2479369e605adde150d3425e1081be79753e3a1e4238bbd4d3","impliedFormat":99},{"version":"8a580ca7dfe72e5393d3e68f966e9a6770a0a67ed31a06783a0fc2d5f1bf41aa","impliedFormat":99},{"version":"dc5c180e2c2ecfb91687fa245c0ef789abb2f258925c53a46c40b5be5cc06d7b","impliedFormat":99},{"version":"2e03d78647e74bdec38e689f32471393ec37f477b75305ca299fe7afb378a900","impliedFormat":99},{"version":"d7d10dd270b953176d3633315fdacf90cf2c3fdefc7980b948e7d242e1f83d20","impliedFormat":99},{"version":"5e2880e69e0b2f69713a7b5c8595d08353d8129e62f14fbeac5e3a7a2f350111","impliedFormat":99},{"version":"26541ee839fa2672a9aee147d1bd77c92304c07c9c794f4e70d98fca4ac4d5d8","impliedFormat":99},{"version":"e6e906f2106464f4ff8ff9d653ab434dd57d14f1a86ac364f0d764633cbd4fc1","impliedFormat":99},{"version":"2dfff976aaa4c0efbfb0694bc9a0115b3d745473b9ce80949fa02f249df466c1","impliedFormat":99},{"version":"4eb1912637486f1b4a360658f7b1899aafc2b07761ed99f60617d11f596ea58f","impliedFormat":99},{"version":"be1378176c12ced525f5dfb672356dcb44c3ed826b76f1ed7c2e14c17e698690","impliedFormat":99},{"version":"6bf5d30cc1060528895d2db6fc2039c65606d2871c575667913cc67f28a8e2c4","impliedFormat":99},{"version":"a6cdbac42ca8870acf70615c430f50664236917dbadda4829b2ca85e22f65dc2","impliedFormat":99},{"version":"1a35594e8294b60a08ca90d0712772b851d3bd3343fc3f40c517e8f91118ae81","impliedFormat":99},{"version":"bc992f34d8a1ea9b6bf76ce99de74c427f5c578c36d40f0f47627d7edefd1396","impliedFormat":99},{"version":"239c64046bfc03eaddf462ca3bbf31f3f629f47c42292681eb8174ab4a1bf080","impliedFormat":99},{"version":"e9922a0bd88d88458bd8e1b59629942989a4606cdc73104549b1d975e11c716d","impliedFormat":99},{"version":"fa4277a5b715291925ee253e3d5f4ace6858e30527cfce7c981dc3d910b282f6","impliedFormat":99},{"version":"32e62dcf57f473fe959c8e55c05b85fc6f2c41bcede76f192462688214ac52af","impliedFormat":99},{"version":"fb4d45a4a5a2d6bd3e55a9bac0c06fdfcfc437364122611b4eba92331b550764","impliedFormat":99},{"version":"fdd44bceea44c6b6bbfdcc60b21a749ece00c3c9ca39effd76728769abdbd3e7","impliedFormat":99},{"version":"5c3e3cb494f815df8289e573e275f5af22b90f65ea4f84ccc02db71cfda44c10","impliedFormat":99},{"version":"6156ec87a3211fab0e201ac49e23bfa7b305e4e144bd3096e6fe134d7b89b608","impliedFormat":99},{"version":"bd18b9e00a08f52ed006cecd5278e09636c9a8f554a53cab6980436f6ddb930e","impliedFormat":99},{"version":"76f6f91c693dddac2959f67e0dd1694cafe5a60d648308ba37a8b553157e08cd","impliedFormat":99},{"version":"dc9283c141dbfa236f0cc44a80455f03127d43f9f099a347d577499131bbf0d1","impliedFormat":99},{"version":"2408d8663c9b5598c32539ce5a2e63e61d3a9c783981441be2ba91c59a214bfd","impliedFormat":99},{"version":"c54b3671ac0947ccb76b538e9ad5c2c7bba2d6b4e2facfe90ed3883e5fc870c4","impliedFormat":99},{"version":"acb187dcbf37d298e9aa2188723266fd52bc691c21368f7ffad1f5cf5efc8f23","impliedFormat":99},{"version":"f844308a48c568900f8e3618cf117fc82ed6a6436b0ac3d2965af03d14c6b096","impliedFormat":99},{"version":"b0f5047634786f8ca1ed076ef456eecfb357a7bae8696f02608d996ad8afc52a","impliedFormat":99},{"version":"4dbd3281bbe8fa74971a802b8c1e1a0747d2e70762b9a4814f7ff442d3244230","impliedFormat":99},{"version":"c364b9476c21321d77f63075ede02113e60943fbbde14b86cc910d7891a5218a","impliedFormat":99},{"version":"653fdee1ae608312fce98873672eab205ac9c27b23de1b2791031a0f6d2b98a7","impliedFormat":99},{"version":"e4fd76ab9cce4eb4f61d7288e26bb8a5cafffc80954c3ff18fb27b89204d3442","impliedFormat":99},{"version":"ecd553fb6353dc1c393f596ef37cc74ef38fc0be23e07e780ff49a39bd448ed2","impliedFormat":99},{"version":"0e06ba8ad31c92c97ff790a2bf54d322d8b926d7a7a086ee0982e955a7399bf0","impliedFormat":99},{"version":"1a9e58fb9dba9bd5f06eeefec5c2f8d5292781b06972fb9c9fb1bbd8f15ad5f9","impliedFormat":99},{"version":"1dc595c305bbf9c102977fb7970e0374d1912357e17b3a95148580c6ab46b5cd","impliedFormat":99},{"version":"af4ded8d2788d0228df353955c9a0ad6c24ef0cef8d63b589629cebdf3e5c0dc","impliedFormat":99},{"version":"d64e5c26af45311b8642ff27d05c49d8b94b9828d353540ec1c0084b92e2963b","impliedFormat":99},{"version":"ea52f5796671ac35eb62145531a9d9b33e18624c7ea907b2ba054425865ef23a","impliedFormat":99},{"version":"63ddc0222be4dfbe4edab975080455c6753b18fde348d060a6d3ed93e0097cb0","impliedFormat":99},{"version":"79cd6112cda96ee5a62a7c4ff9f7b08651af15fe45205751655cd4b4c2d1b58e","impliedFormat":99},{"version":"2fafc95d1afc4b30891cfae6447b0547fb21a4eaef4e7b6f47b789eb07698cf4","impliedFormat":99},{"version":"cecd28c55bb2e5f66e02fa64c5eea751f9273c8515918820ca2409cbb90c802a","impliedFormat":99},{"version":"4e0d0aa02da405ab61975064bfff8a927b493239e7c2694b091ce3a87512b802","impliedFormat":99},{"version":"0bce1056c3ad5ae75512bffd21985a8107b6c7520bf073e4d1fac19ef1970c4b","impliedFormat":99},{"version":"dea629ac95fc8d6abde0a2486299c3f3c7e6ddfe7c14c3ce1302ec17c025a021","impliedFormat":99},{"version":"e6ccd8091551b224ce7989079751cbeff03207986bc77aee9e1d50c0d4eaa6e7","impliedFormat":99},{"version":"7d209a3d160e8412a320568c8343f4aa5e2a216e019f1e382f3d4c6b1069295e","impliedFormat":99},{"version":"aecc37bca58dc791685b01ce18238f8d2a03fdeffd4ec2f316e37f5b7307334c","impliedFormat":99},{"version":"7b8bfb125f9de5a4ba30f5d81b5f671772cf76987d880147f786e33fa878a5b3","impliedFormat":99},{"version":"d57d9fbf2673c403c6bfcc61ab70c16c4984a6880e647dc46c51333b1f812833","impliedFormat":99},{"version":"f3354264b00ad46c7f3949220e00ff70955bb67889e0a23e0d055153966b6294","impliedFormat":99},{"version":"7fa9b40a7f202ccd3c9a22a5777f02e50d0c009f633d23c8d8cc7877e95c89d0","impliedFormat":99},{"version":"1186f9e84db92d299247dbb5a283311055f82de1f8808dfb048566d1207fdb82","impliedFormat":99},{"version":"c30f1892b9de9bd083512b9fb5858cb5787481ecdad8920d7ff75586cc88d432","impliedFormat":99},{"version":"e43ce675a68782c430c60de48267f8268bdd682697cc38e54eb9d03f53b7791a","impliedFormat":99},{"version":"df1d3cca4a0197138ca725503c85ae59e06cc21e1dba64dcae94b8e8c2b1fffa","impliedFormat":99},{"version":"6d74fdf0a7ce758f316a2b2c8960ffc50235320727326a35f580612c0d593a4a","impliedFormat":99},{"version":"ff77c6d5963b87d427ccfe6509756ef01de1aedd685d186e177603ed741c93c4","impliedFormat":99},{"version":"62c3d6cc07f01164ab6b94b1daff72afbdea44a42efa750673e7c65739b85816","impliedFormat":99},{"version":"f9aa7dd2db630e9ad51214d9d0e14da672a82322684d908e361d1bae4bf64e01","impliedFormat":99},{"version":"eca2962342ba258932717a7431741e432d275beae879d6e655eea3cddd69ca91","impliedFormat":99},{"version":"807091b6bb063571171ba50d3d7da2daf4e718de25a32b4d168d9b2854b16979","impliedFormat":99},{"version":"2256e03055dc0cfcb237da2751a763b4c695f6c6c82003cf0d36851cfe77384f","impliedFormat":99},{"version":"af7cc8267b8302c517bd0a7367642bb1cfe2e516b00bd855ef85f2bfdba59c60","impliedFormat":99},{"version":"fc490848f97ceb21a52dd6afe32a9b98cb1cb2e6320806b5fb9c24757a1ca769","impliedFormat":99},{"version":"c06313963ee23643e32bb4a0deab3d69453115fc1aa59eb2e9699516fd9883bb","impliedFormat":99},{"version":"31ed9dbe091c55243ca0d95c7d3796448367091cb1e958033c3830cb58d873dd","impliedFormat":99},{"version":"ef436a3aff282493c3ca803abc5dcb5f678be8c2345cacb3a0356a47c6bad708","impliedFormat":99},{"version":"75c0e4d715175affceaf29516d4f46316bd757d2e30945ccce722aed9aa91ec4","impliedFormat":99},{"version":"cc7ff6ad94cae8f1b6b73cb0f3694e1bfaaaeb7db708efb3aa63d657d453cd05","impliedFormat":99},{"version":"4dea994dff6f8f13a75aac0d5fd62f867790c72af9c49f2153b48f1fbe94a545","impliedFormat":99},{"version":"c119857e4642cdd774d2a84d9547ea6daecc225b2273cc6e57035bd422f5ae1e","impliedFormat":99},{"version":"04127fb55c6a3db066777ec0efa8196f461e779ae5f25be1460c5b77bc6fffe9","impliedFormat":99},{"version":"0c11f88d9828efad354c4cee7152ee7eaec74fe59ae13ae29eaa68c1e65521a0","impliedFormat":99},{"version":"df3e033a605c7e31ac7a6e7517c422dbba4a940c8aaefbb8a64730bbcdbbd199","impliedFormat":99},{"version":"738ca31cb07d20afdee107364e270214da052479973e0b08a9a886f8f90d2803","impliedFormat":99},{"version":"bd034d73f41f90d3cfce994b51a759b887632bded1cb36f1dbe2773973a1ddf5","impliedFormat":99},{"version":"35a17e3fc0e53518707795ed24bd428633c45a4e8fcd4657eea2963b42366eb2","impliedFormat":99},{"version":"b3fd4b12bc1b4f73f1a110ccd99ffea459864afb8e682768d641de1be3508bc7","impliedFormat":99},{"version":"d1dcfea8733aec727e00c133901efd6974a9f7601c4c19ccf9c2e99616efc104","impliedFormat":99},{"version":"eb0b20ca60a2a2ee1daba9b78bfe8ae99487de57223aa6f0f6b99252b0cf9363","impliedFormat":99},{"version":"8c868f22cbfa1cd301a05eeef770dbc4453dc42f065fce267945674b4d82f3c0","impliedFormat":99},{"version":"e6ef6469aa806b0907c02b67207a86bdfc8a9291c5e63f3ee0a72437df56c055","impliedFormat":99},{"version":"85c677f795a09a5134768fc909906713afa46536fb7c178a58a2dbc8f981ee41","impliedFormat":99},{"version":"97ba6fc4a6c7975f53b16bc72ff0ca05d41104ef2a605f07f219ff23ba6643fc","impliedFormat":99},{"version":"59e5e42bd98ddb731aee619aa16b1d7403e598e54bf75d2daff25c57495a13d6","impliedFormat":99},{"version":"54e79ba20e85bc05dbf39eb24f94c0bf485ff76b096654420eb32dbd7a616c53","impliedFormat":99},{"version":"80a960337c67f64bddaea4ac2fd437ff09dcd64c50ebef0ad0e5abed981c862f","impliedFormat":99},{"version":"98590ff94f0c45c9da700bf9c972714e4367cee30842aa130ab501f463574bbe","impliedFormat":99},{"version":"7d4539a233361ed71d335793db13085aeafbc1e28920a9784b01a8b2d461d354","impliedFormat":99},{"version":"a00c3e3e9475eb832c523f41734a7ebef312b1ac1d6ecb68d22df37798e18c02","impliedFormat":99},{"version":"275d39d59a9a5c7ad2d13757bb35bd190f487cf5fe221b8a556be2117ce6c2a3","impliedFormat":99},{"version":"072c8a4438ecf5be5f093ca727bd03874fdcf7ea8b810a5f3d5b5e9a1a158646","impliedFormat":99},{"version":"6808d7d909f594bc5e0695b09e9f663f79b08573e3d95b837c1f15294481516f","impliedFormat":99},{"version":"1c699544448121e8a6521399e2b9e709c9561b768bdc3249b035be0ff5a458ed","impliedFormat":99},{"version":"c0f9d148738c7f952a6e0075e7f7528e67fe813e5473741b6ae2d7bd1c701727","impliedFormat":99},{"version":"9594f39327c3776aa4083e472770ceffc14d45e669998536b60b5de5b1006143","impliedFormat":99},{"version":"4830175a6be86164822a5b2f7fef7a97fee781b33a52453ac8d8b50e3ec91830","impliedFormat":99},{"version":"d82b5aaf44272f7e153a3a469db46739c306b5c173e0382cebea70bf469d3a52","impliedFormat":99},{"version":"65d1b54d95e8712f8bfec843cfdffcbaaf6d92d0a69abb7345ba55f3f5712017","impliedFormat":99},{"version":"80464d99a301e3db960da2a7b010ada29874dd6dbc5f24731473a2641cee217c","impliedFormat":99},{"version":"3834d1fff358eaf5b52078c27881964e31e54fd1b5be8cb097a2ca75c2d97b7c","impliedFormat":99},{"version":"3fb4902f08c9b5a77956e9a6856505e00a7fe476a586e832571c3d4f83ddba31","impliedFormat":99},{"version":"93c8e1d9bdc1cfd856abb2ddb43c31da1adb5bb23a3172422ac3426d80687f97","impliedFormat":99},{"version":"82dc653116ac560acfa8623cd3fb7de40ac5f2e3d65991ce36070364b4f1bb07","impliedFormat":99},{"version":"ed6c38e10a8ef5ff290aa185177153ad1e0a85c7d867047532d33a6b1bbf2c4c","impliedFormat":99},{"version":"bab1312d15063c1685b8aa51252669c1c5843f3f7c3568674dce1a342cd1f7a3","impliedFormat":99},{"version":"023a397566c9c9ba724750a017783ce78006b04d52f96322f42ec104daa1f776","impliedFormat":99},{"version":"10fc62a7f653cff767df362868a121e6d5fe9d872fa4c0fe3de8b1acd4324f0a","impliedFormat":99},{"version":"05346e4aa851fc01eef2d4ccd77b5c8e5ef306ad044ecbc8594aeb7d753e1d33","impliedFormat":99},{"version":"05e97bc0985fe092ec1fa0204a4ba209902419231941be9d7109e759992af3a4","impliedFormat":99},{"version":"d7baa0aaffbdb80eb363c76f5c062841441281757037ed9a740d2e8ab9cdc391","impliedFormat":99},{"version":"cfc54c8c0b1974dab7994739dc901c13fc8cef6ed11cc0ca2777dc0eb1751f40","impliedFormat":99},{"version":"9815136c848202c8b0705c8e56a6546d2052cd0abee889fc0a14a08c8a13dc0b","impliedFormat":99},{"version":"4b77dd1d6d600b721c6b475b9479455233e7a189c1e8db14a53a8e34726d2f55","impliedFormat":99},{"version":"132c03d02eced90fa294ae08f814348ab056e1bb6e041a4802aab72deb61db78","impliedFormat":99},{"version":"3bbe7954dae9f4355f7da44a99dddcabe92ec11239e38a0c3c89da998156d9f4","impliedFormat":99},{"version":"3531151069b2a08dee7b82bf7c3437f707048c682395003a49fd630968f5ce15","impliedFormat":99},{"version":"51a2a1e0465147c66d3b3ba8b6776caa67e473db9aa5ba771a7fd5f661d994f9","impliedFormat":99},{"version":"616fc8cf7d4a11d695eb0e309522f1facee105a1c740e74fee5f710dc745bb40","impliedFormat":99},{"version":"c14a02a41bbdce485e6b9fb0a70c91a354a2044b55e2563e6731d51a3b3ead5e","impliedFormat":99},{"version":"bcdc75c3befba305fa771f51762f600ef3c7f60e12ff9b0ed6eddb3b11da3792","impliedFormat":99},{"version":"9b681badef747116e902328e3ca5bcfcdebb16259a8b8419a7e95132977e9e60","impliedFormat":99},{"version":"fbb328355422560a1393277f37065465dc36c25c5afb716c6dbbb4107f2c3adf","impliedFormat":99},{"version":"f9c5a5df867ff31c79e8dc2e7bcaafdca06d8a8adc28a099d8d05a1a4efae2b3","impliedFormat":99},{"version":"2e3ae086adbdd8ee059a46739badcbc7f46ce88b16dbc2afe2b669b9130a1fb2","impliedFormat":99},{"version":"fddbed7f42a61dd91910d468774ab7aece510e4bfc8acc8d6dee2f0b2cc3024a","impliedFormat":99},{"version":"d0c25a9039e1b56414c154cc2c3e22e84c8be8855c9780f4c1ff793f9e551589","impliedFormat":99},{"version":"1f700fe107041685043548d72a01cd21bd31d658a5a4d6d230367840ce65b389","impliedFormat":99},{"version":"c08f35285d1267946e19663f7c121f6d3e16cc03004a76506abc9f9f8bdc8b6c","impliedFormat":99},{"version":"021902fc642e31e811caed40c5ad07e0b105d7e269f609226b6447fcfbf62733","impliedFormat":99},{"version":"0a45d152162e8a7803ad6b0644e9f2098e28281f6e5ac08f21f14587564f568b","impliedFormat":99},{"version":"5b85b4c8d575c506088c9e77dce0607988506e12ad1a011f7068c9a35e5abdf4","impliedFormat":99},{"version":"d64b38d73752d637905e2ee9f39f7f82e2102dc96171adba9ec6454e396e0319","impliedFormat":99},{"version":"119acee61f07781e3ac933bf590854365e8117c31c896bf4bf1b9e3f399ef492","impliedFormat":99},{"version":"95be4119f87bdda94d4302cc6e6c1e2d1b849d170c5f187815224eadf7b1bcfd","impliedFormat":99},{"version":"ddcec9094b6fe3c92c6758cd338292672416b7d58ee807483dc8ddf629d699d4","impliedFormat":99},{"version":"283daf40cfa9417647d1b581cb734366581a803620bd20c60d92bdb7bb807beb","impliedFormat":99},{"version":"94d19f12b5d52237ee39b35048a1b7aca7c0b8fbfda6457c2dfd83414a6ecb89","impliedFormat":99},{"version":"7b14ae6939622c3fea912933aac786f88fb39c20f115eb7496ef890eadaab2f0","impliedFormat":99},{"version":"1023d9d72029b02a767d59537342fa1be3f3a33d901b52d7e0d47d42269f0215","impliedFormat":99},{"version":"a594453ed8c004df6b340bda0226e7cfe94ee67698d1c0dc1b9207d1e20e0ff6","impliedFormat":99},{"version":"4c3c179bd19a0c96c14749c9095714c9b150fc6ff2506c81b877d25644045630","impliedFormat":99},{"version":"21d8b3b7300ed19f41050d3fd6317f5b7c65dec299e1698502fb6767ac30d839","impliedFormat":99},{"version":"a6a5c59f2cf45d5ab475340ae96ebeca495094d15d72102b7bff05b7f0bf7383","impliedFormat":99},{"version":"eb7628d3567bcd483094fc2688ceb5305ece0563463787cca7035efce9f43c2f","impliedFormat":99},{"version":"6d79ded4df43562c8062badc829bace67925c70d18a7b72c09b7d23797cd0891","impliedFormat":99},{"version":"d25e9a88e761b13dd58628d2d41641195ad79ae927bb268387082656673ebe0e","impliedFormat":99},{"version":"b161e27190a5249c6e5660288e014bcdcb1e5bcc2733f848351b027e0d772ff4","impliedFormat":99},{"version":"ef547825b57ce9440a18bbd170125b89cc5bb8ce7504dfa6cd528a3dc4489e76","impliedFormat":99},{"version":"e74cf49b55f4550883d9d46173dc10ba5fd38d55f69f8617ca147b6d39c8a811","impliedFormat":99},{"version":"339e68b5bb386ddf9129bb3370d01f22f8919cd0e40ca71e06f881f69e02af66","impliedFormat":99},{"version":"8c65681a3636770c9b9b2b52d14ee4d59b48092175ae3124c044a2637fc84153","impliedFormat":99},{"version":"c6bd0b212d354956e2c5edc8e0249adb3c0e9c942e7e1794e23fe9f0dc721828","impliedFormat":99},{"version":"5e3b5745889dc9efc2e6f5515ae5bcb8135f2a8412d4a1facf374e09176f7cb0","impliedFormat":99},{"version":"f0576bc1e933fdc38f0f182775c24efab54f2a7a9b4a1953abe77a620346b9de","impliedFormat":99},{"version":"f061956ca6ce7bd52bf726d2e87e620aa928807f3ae526d3d432742d1da6e2e5","impliedFormat":99},{"version":"39b7dda3a4bd1ebfe126c67d3df5ec230681097b54a4f5a7abbd841cb321c003","impliedFormat":99},{"version":"532cdefa9aa613089dbd91804d4d9de824ed6e9f44980db04a14465e19a9e4e7","impliedFormat":99},{"version":"d0682d488ea0a7deeefc809d65c42e09f339dde50dec54f901104ba35c70f5d5","impliedFormat":99},{"version":"d4bf07baf86b8e6fbefb578d8a630db479bd8feae8a9932175c4d412c21f27f7","impliedFormat":99},{"version":"f76ccf2e0dc0bdbd29cde0b9054b0d510719730e6455db17e98f2b10646eaa59","impliedFormat":99},{"version":"f8dc3be04418be55ab97a46357ad0f6102a118b63e756f0fad0de94be2094d3f","impliedFormat":99},{"version":"3c0ebcc673f72499ae0ed99b0fddd52a60fcda51d50b11d1adc046e5985916a2","impliedFormat":99},{"version":"5395a87aca9a065a768051b7a6c66d3cef55e097ac2ad6ab917e27c3c92c4e49","impliedFormat":99},{"version":"79bcdbfebd96644cd9e93ca0b53ad0dfd398e0382c03e58f3135474ece45ca13","impliedFormat":99},{"version":"a134f53667b920e6ec7095c1c3cf0bcaa95008cd43000d3bdab1e570ac70cafc","impliedFormat":99},{"version":"116808caf097e8bf31ce1cccf1bf4060608cb7d91bc426b92abd97f7287de047","impliedFormat":99},{"version":"bf7b4bbe862d400269c378a2f744a5a94df5467cd18c805ee3a5ad741766ca40","impliedFormat":99},{"version":"2bb9ec2ead61f07ae6d8277af9318e37205b49abc9271604597844346ed3959c","impliedFormat":99},{"version":"d75af40a0b511d0633157556a35141a834d084094b01a8908d78dec2dd80fc64","impliedFormat":99},{"version":"ec2ca88bd0a13a87374a11d5bfacadc96b55810aae7a008cc44279b7757839b1","impliedFormat":99},{"version":"83551e90c20424cc93773db3ed94f8c43b39635830bf5548455d0836deb96393","impliedFormat":99},{"version":"945b49df2cc8667365e20dd3c1f8de64447e0b32f1d91c23ad06b07b0aae44ea","impliedFormat":99},{"version":"d6dcc687d0baf6635c1808c740aba4db6e37a3b5526f2655f0c291accec0decc","impliedFormat":99},{"version":"1dde80f3943e6bb56df526b77bc7a41dbc234d4393f1b8f19cc6672171ead575","impliedFormat":99},{"version":"7811c9c49dcddf09a7b307acaeb6f3c9b4d1d1b97961d87cc94670c46ea0362e","impliedFormat":99},{"version":"25c965403446cdcc5417d13db187a7f0394f7106cd1a45e1b9cd3a2c08aec4b2","impliedFormat":99},{"version":"1dc95a1964076bc1aeb6731a17ae5f7163846f248f60db0e0961ced43db22c6c","impliedFormat":99},{"version":"63482e1d5b8a0f3a669807bfa5355d3a9790856b120f512b4bc40a0dc65c78b6","impliedFormat":99},{"version":"7755b72611ef60e8cb35ce5e7ad393577e7389c485d4683570751e88177b1bc6","impliedFormat":99},{"version":"5445c1b45a4b24cb793cea4f1f8678912f2a7eda127afa72c48614aceb3059db","impliedFormat":99},{"version":"b600d5e621219860f2f6f9e1aa25d777c6b6c469a9048839b0bc256f16e65cb8","impliedFormat":99},{"version":"ed89af0e95cfc3c3aa05ab7f10f39252e304864be96702d3002e3a0b5314b058","impliedFormat":99},{"version":"6329a32dffec51eeb23377ccaead107d1ae30efe84e019e70d92a529df7e48bd","impliedFormat":99},{"version":"05650f29c7b38c2cf78950caa7386acbc7936a7cb08711bd1975cd4818c5cb09","impliedFormat":99},{"version":"12ccebd398ecb9ff4452279fc72aa34c70ff770926652dbdc7d34ad21777f466","impliedFormat":99},{"version":"1c4b858e912db3388433ea26a3b99b2c0ef72048da6946614463596b00298c5b","impliedFormat":99},{"version":"dd531d326e40577dadb38f2a931264139865f767bdd762af1e81f316b0c03a45","impliedFormat":99},{"version":"e8d0fd2600751d9b4abcb81e3067f1a6823763a25322401cc8a0578747692bf5","impliedFormat":99},{"version":"63964d043dc01122a1db457afec463743918a5c71c4beed6e2906f509e015a4f","impliedFormat":99},{"version":"4247f6bd3d537c2f7ee7a31067c7e95b70327bfd55a379fd96a42e9f2aa6d46f","impliedFormat":99},{"version":"e2ebacb3dd831a48a1beb9915bff463005845a398d999214a0bfba620602b741","impliedFormat":99},{"version":"5bf7ca566fde86fd0469836409db26264d98380002545a6b8ad048de46f47489","impliedFormat":99},{"version":"e860b60d342ee8666f83bf61339fa74fe7613f2ac7ed599f0f802ef3d85778a0","impliedFormat":99},{"version":"130de79e5e21aa52d0ac67eaa51182d90dc0354eac7c35a542a56426e93062cc","impliedFormat":99},{"version":"d590eeb146c65796d33043d08e48449c205b37033ac4157af8984bf1019928d6","impliedFormat":99},{"version":"68b3f5d095283a725fed296ee8cd36c1373a2476aec8cd9d8c953de792161248","impliedFormat":99},{"version":"55804c2d006cf28fa308eb3b608e5673ee4ef0e3d9999e532efcb9d703ceb522","impliedFormat":99},{"version":"e1dae322a476b97875adaa6cff6aeca7b3273e2a0fad1e175e329c4ce3d02542","impliedFormat":99},{"version":"36334b90aee2fe5d6f2971f05af58a15c68059aaa806e9a94652b324ea630e18","impliedFormat":99},{"version":"9e5ea08cabcd47ef88501f69a76fd8bcaae5149e6f92251e612e544af3f58a00","impliedFormat":99},{"version":"390b90167c23bdcaaa56041c620b04d9e85957f79d103a0b8a4f40f1159a486c","impliedFormat":99},{"version":"b97b7f29234eac44f2395e36457abffc93f7b709d599821df52bef118009a959","impliedFormat":99},{"version":"d8a29ab9ec8a59aa4f7a46217dd76da3fe9b98cea738f0a3031595e7e3633106","impliedFormat":99},{"version":"1efa9583067ef597f832bca0ebdb5a1e2c940d4b67fcbbbf4679528843e38834","impliedFormat":99},{"version":"ac9e0128567c5676b83e5364abc4230a6610fb9bbc698392b5ed197b99d95278","impliedFormat":99},{"version":"d8250e45341b1e98b42e3008bae572623c2690e331950ba0a7b6c0ce6cd59d50","impliedFormat":99},{"version":"7ff384e556272b468d2710a54ddc17eea161d98dd44485d0c0d4161ac7e7da85","impliedFormat":99},{"version":"1388631fa8cdd249a9812333f0c2ce35490055ad8013972eb920e123bc5eb8e2","impliedFormat":99},{"version":"ee6b73c727bb809d7f5e6e22b4a668f466a5ab65ee1b8f214f8ccc3e311a2451","impliedFormat":99},{"version":"35fb1d611af3bdd39f5d5402847167af43f150716a477de3796c7c4ed071f004","impliedFormat":99},{"version":"708088bfcef2939f193d1ec862b1e576a9f345638600a9e82e398ea6f2e006d6","impliedFormat":99},{"version":"e66d27a7e54d9cd5e3bf7acb28838419aed6cf78c8ef567b9ec1427fac774f56","impliedFormat":99},{"version":"d19cd315889739ab3e1956053ded5eb062348ba8cb9891a661d0186b91770f21","impliedFormat":99},{"version":"a0eab628c5edf5340163c01613f55ac9fdfd5186c52d96372528c576152f3795","impliedFormat":99},{"version":"619c675e7f67b1343992c6f35c4ec9a52fda78bb025ff72519089a6da62d1a47","impliedFormat":99},{"version":"e190626bea4b1e20d7b3e830606a43aadc25815806fa1527d527e961a35e8bcb","impliedFormat":99},{"version":"94df71ff0eea0e304a2ef7722ab413d75adc8a98e0c741a0107643276560c7dc","impliedFormat":99},{"version":"1a6e320abcdea25b8489b6e39cb4a4d8c90d0f0ba9f597231e95420c723b9dd3","impliedFormat":99},{"version":"2f838725d0b114c8aba336f110037c0b00b6248958227a74d80fb62946ee5b18","impliedFormat":99},{"version":"c9dcdbf46d97fb2df29586c68cd5ae6748c081a0c53fc37a6132ffa27f6955fb","impliedFormat":99},{"version":"8f430a46820c2649bc2d07c6febccbec75be9bfaddf35bf264590f8191e94373","impliedFormat":99},{"version":"9b110210c3df13bd4e53db3576f4416c4f56142d50b986f46e39450c88c6b780","impliedFormat":99},{"version":"c2d231b90096f0d5dfce494e54bf81666758316e087781f14bb6da1aff9e8700","impliedFormat":99},{"version":"1e1dade75405e843690120e917bf189f5a1a8dcbe60caa2815d949dfa4b5d5be","impliedFormat":99},{"version":"e7c7954921e22f5f8945230f89cb777668b059a7354b350e0e357987aa0417a0","impliedFormat":99},{"version":"3267519b49ae97bae8a7bcc12936ebb116209c6aecdc9f15234b0160ae66300f","impliedFormat":99},{"version":"8d5680d71ff8394d96be70eb3e03ed4332e1b7e5191502aff1576900c120ca16","impliedFormat":99},{"version":"60aa61caeda93417fe0d1c238def5ac44869ad867bc779a82be7c9a1c06d4734","impliedFormat":99},{"version":"2709edab013c18a69f6bd497d4abddf8368a14e0baf1bb30ad5d0df59bf42693","impliedFormat":99},{"version":"c5c079a529300647828ea61619a49261b416ae65f46f968511519c5f8a79489c","impliedFormat":99},{"version":"a746fb3152e96412346ce01d24d5ed2817daed4ea188016d4aad0eb486d193f8","impliedFormat":99},{"version":"9b5dec24186dbc05171cb3f9e4f1e191154d3d4b7f187dde95ed0b08bd38c32d","impliedFormat":99},{"version":"c21c62c5f7e9448de7e9b0fa9f240d5febe46ef3f170ba4f976b24b4d2270cc9","impliedFormat":99},{"version":"b0f482d75e79e076a84d8f83abe57cf80d75bfe4f64faf96e0a6c965ca6e2a6f","impliedFormat":99},{"version":"2d72fb98ce4a52674d73af8bb2afe471cc480afe5de81e4e1fa40fb576169bb7","impliedFormat":99},{"version":"5ad98fb3cfd67c6c38af8bd2761a605f9d911d6e03955fddb0c7fb7cf824c694","impliedFormat":99},{"version":"67f46739541c08dc52bdfdfc8b77534dd9443e7fb4bc31467a211acc699a02de","impliedFormat":99},{"version":"7d8515bfa58add7868c423b29c77598203e0c7696b7345d933f4dc8b04c5aec7","impliedFormat":99},{"version":"6bf2b0fdef53d2460e7f49b6e7272a25b74ea474c052275a9215f645b60b0f64","impliedFormat":99},{"version":"94b181dbd37f644090e1ef29852d9dd6368d8874cf2f4c0ae0a298feaf991eaf","impliedFormat":99},{"version":"2d74c63d20d7eca1904f26dddb4d8b8d8fca12529bebe4bda7d2d14d24bde067","impliedFormat":99},{"version":"eefefc2f2dfa29e2572a60421e45dcf8530a34b17c3a6d43c5799a5ef0550686","impliedFormat":99},{"version":"8e6551df9921ce8c6a3b4fb520d007e28353a0d3d8a1d06f6778c6f1486207f3","impliedFormat":99},{"version":"68954597f1d7f67b99005951e94ca60a3a62bf3913362f2cc7cc653de3f19496","impliedFormat":99},{"version":"4773ec8c467186c29116dc3c3cbb7927437de3311a09b052687c3dfe067c16d7","impliedFormat":99},{"version":"0c710c1c886c67727bb7deb8197d009a9146b1f5afaff62b7342acc76b73f279","impliedFormat":99},{"version":"4d62901366dbbd759da77f66c16897747f70a2d8dfdacecbf8606e668cc6c301","impliedFormat":99},{"version":"60b81bc5977f284d06c8c89cc04b8cddb45ade80758d1a0455c30161b34b437b","impliedFormat":99},{"version":"56e436146023b114fb661baf70bfce2041d5806721935746699df3d1331fc6af","impliedFormat":99},{"version":"7cd4bc26d96221eb7fe5fa0c1b503386377fbcc6757d26ec50014e176a61b7d8","impliedFormat":99},{"version":"bde451f81ffba547053111934cd0ae75bdde203ddefae30976b77033136de1f1","impliedFormat":99},{"version":"775d6a8112d08a9c5fa5d2cb8aa97881ca81cd2344f6e9e158dc81efab171b07","impliedFormat":99},{"version":"4cd295e5f329970c707fb48b9d88d15b32faa9f760fcc977ee10eb160f4e4a6f","impliedFormat":99},{"version":"fc4038d8a91384abffe294d3df8c3a06e3df7073bcc2251272fb31d912e6fe2c","impliedFormat":99},{"version":"22bf99ca0b3d239d88d6d8e6e2bf155afb30b4aca7fc09335087938467543a09","impliedFormat":99},{"version":"cd3682274f378c2462bc4fbb41ccb5300d71cc5c008c12fa9d35ccc54b34cbca","impliedFormat":99},{"version":"67dc58c0b812bd006ecabbd29e8f9d762c41b0549910fa6991411c16e95bbb59","impliedFormat":99},{"version":"2bc40ddafd68113f9625ab18be76b9d69d8622534674ba26e32123e74fc8667f","impliedFormat":99},{"version":"9c099d02e2e82d484012f3713a164cf55c7f63e5cd9c2fda4dc4076648ab862a","impliedFormat":99},{"version":"48b3074e05dbe986b0228044afa1ab2b130f562920e20ad6199c3219b2629d17","impliedFormat":99},{"version":"c9829c5ebf26778156e33b866eacf467eef9beda248f32cfa5042cd2ede8de50","impliedFormat":99},{"version":"658ee70a53b7a4f30af822940b5863208e367769715698fff58d0f38939ce858","impliedFormat":99},{"version":"ca1bca6d1b00d79b032c2dbb48ff021fa7eaed6b0aacc796ef5d0873933891ce","impliedFormat":99},{"version":"bdde7f266379e321a38646d74c7da791308d1de89073299a9d98e356634f7c08","impliedFormat":99},{"version":"dc3b92eb315796d2568e17de9dbbcf25796565d440e63805642fda5cb68b9baf","impliedFormat":99},{"version":"d486d1fb1ab86280b3f8d730a0770d5843cbaee267a13748c210a49d5d8701e7","impliedFormat":99},{"version":"6a1edff3f864b17879bd05bdf8dbff682d14d2b701892256b74da0693616e06e","impliedFormat":99},{"version":"1c3a5421df2a1a0f71e86ff5aabc804934ae48ab0495acb257324b713d2e5c3a","impliedFormat":99},{"version":"6d604fdd569f7e30ff284c132db9b5185c8f9c80fe405d23e2b07c0e663f6278","impliedFormat":99},{"version":"91e3013fbc9ab4ae9415de1dfabd24b20eb1a448a8aa1227f8a1206975626585","impliedFormat":99},{"version":"e811d3bfe878fb14b09ee7746624751e7f861369ab6301d6e3b340f6c5209873","impliedFormat":99},{"version":"c181f4ed01c4d578e7cbfc15121db9d1e53d3292e0e674e89b8def9afc33f2de","impliedFormat":99},{"version":"3aaa8b4924cfba7d4dcec41271cd848ea987093376caf1da8cba263b1a8f604c","impliedFormat":99},{"version":"5c28b10c7829e6f8961a9a03a600e3037ad4d9e005ba3a177ce88c76cad419c1","impliedFormat":99},{"version":"c93bbc1a968312df22be64d3fa283d9a8794e1619f5413b134d7543884a26481","impliedFormat":99},{"version":"3367c741cb20d44594a33c81189e92fb6312ef1ad80e731e8c3782ea7cdc3b50","impliedFormat":99},{"version":"57da5fcf4facb95e01fdebff97414e51417d12d61948324cb1a504959055efe7","impliedFormat":99},{"version":"b9171a4741909269fe324049b8a2c560aa829a95c1d1770be18c9d137f820304","impliedFormat":99},{"version":"f05eaa4c4151749a5994f68172bae0b621e4000e6763eda011b802f5c675871a","impliedFormat":99},{"version":"d59306afb4025cddcefbb888fe9b5e530f36c13dae04f045d783591db4a09af1","impliedFormat":99},{"version":"a5cefa0fba77455d5ae3fe0b49edaeebee2ab7a02eb1fc3f2c1d1ef0f89e80a0","impliedFormat":99},{"version":"06dce6f582073c6fd71ea95e87fc30681c363f0136aa26aaf01b5072f8a747ee","impliedFormat":99},{"version":"7f39fb5640073a2c8292f58c332b8ea1dc40e6771e82485353ff5c01de3004e2","impliedFormat":99},{"version":"eec3d5956e9cdbf258c3052d1da1be6a5414ce9b925adadfbc69772a0f560ea5","impliedFormat":99},{"version":"ca904be0ecc01a5c6db3cd367b323989c367ec5a1b8fc8b290d566030350af63","impliedFormat":99},{"version":"71be24f0406ad4969187a22b62d5a5bca07a9e69fd4695332b823ba50b7221f7","impliedFormat":99},{"version":"dba595f82dfed85bbf4e39b50e27b9c9f52c20a48c72036dfc2ad8658f835bc2","impliedFormat":99},{"version":"81d42dccaf051e8d599b1d70281c410a8a501ac6ba6462dd95b66e06bc2086fd","impliedFormat":99},{"version":"2ce213f1fa2a9d38a4320272de78bb70e7ed1285090783732457d42064a66ed5","impliedFormat":99},{"version":"bba6e7d4458c3bc24b69f68a5152963eb6e9dd72d38618f83b3698153f635d45","impliedFormat":99},{"version":"0e7650ed5439e7d872df4e6bef9d75606da9c73a0682782f52c700936088eaf4","impliedFormat":99},{"version":"f101801894b206a26d61f2b84d1bd5587441e47557bd946f7d651fe0c6ee1f94","impliedFormat":99},{"version":"f2c1d36ed7cb9f429874c7865ae1d193bb27bf0669829e50bccf4bcb2c6ef300","impliedFormat":99},{"version":"d90c065d25c7043fd9b8d3d44cbc3f082b048a641d491ce27812b97eb5545a29","impliedFormat":99},{"version":"6a81e1ba677caa156e6624eb2ef502cf5b3e87cc259656ce649ec39e9ee97606","impliedFormat":99},{"version":"dce3724933c25a776d212550af0a1da5655035339daddc4ff9d4e3eb22ef13a1","impliedFormat":99},{"version":"7fab59a9579956454a09e5ac8001fd78365e650db43364f6aec5be52ae8711e5","impliedFormat":99},{"version":"b2fccbb91f9a6c85e91da363c4304c76f8a7b26db84f7f1bf8dbe5ffb2d49e50","impliedFormat":99},{"version":"bf890587b717c5562425aa385b021ba18900eaa0f176e3e57f0d1016b647d32f","impliedFormat":99},{"version":"3428eb55e4db8b21337d9bbee986cb297e3bd788e2405f02adcb37ad371811b8","impliedFormat":99},{"version":"abd06f3aee8945b159cf67d05a92ca23d2b35a1163773eef91f7cc2618915ee0","impliedFormat":99},{"version":"c6ec8754b8ce679004c28bf2cb0f2eaeaa8de0acff94ba5082fe16ce642ba92c","impliedFormat":99},{"version":"a3005d619de5f9e5d0208596083fc7110aec861b8dfa18f681395c216cc95fd5","impliedFormat":99},{"version":"5c3ba312c2cef70f54aff90e59fba9b61101e1e941c2b3970c1353c453f25155","impliedFormat":99},{"version":"cc8d78d412e3ae3997d0075078dd2787d842b6023bed13a6d9f3e07bb1e7d073","impliedFormat":99},{"version":"eefb675743146703d1c5a1b3e8171b4b95ae65c41120425312846f90c0132017","impliedFormat":99},{"version":"5928755ef02a97a3831fe4c85f9b32aa157d499acc21b3724c911b7733804c89","impliedFormat":99},{"version":"8627e628c30fc555b119326c656a5101e92548b05ceccbf38d6b5916062fb976","impliedFormat":99},{"version":"184c2412e3d88d7acfe70bddecff9004f4610afc87eebe042272f2fb7e0d3c89","impliedFormat":99},{"version":"6f9b9e4b4f44fef1d0b98eb1bb602345f0e22e0a137ef40a615503d4e8b35bd2","impliedFormat":99},{"version":"cacf616e3fb3ea7c2880cf4d1feef47a3dbed29b0bf248b0bdd47fcd8c8b5945","impliedFormat":99},{"version":"48eb53c96dcd4745c4c8bee4d1104ecaa6a877eefb8a5b57af0f7ddded949a4d","impliedFormat":99},{"version":"e0e35716709f99220dee1be057e8f7f08e1d8134c94ad414129b79cdd9b41f8e","impliedFormat":99},{"version":"ea544bfc5e4ff015c70ef62acaf356dfcbf1f39f10f07ca3f414278094e56b56","impliedFormat":99},{"version":"7d439735b74cc5a3de2a8855fa941341dff0628d1fb2b5f2dadc10a5bb6d9fad","impliedFormat":99},{"version":"e12142b93d24c7c67fca041df35d357f21d3751eae8b2afc5684d49630d12d37","impliedFormat":99},{"version":"b1bb63b43bc374799ca0e916542b0e71a7c8bb06d6c8e5f94848a8969536c933","impliedFormat":99},{"version":"d714669ac93d063f5ac5a0dc8136e796545c6b1358554ab423d07fdcca0bc7b2","impliedFormat":99},{"version":"208dfef5e3aa4e176a5112b91b5d1ca082c28d2eb33bceb82c0261ebdeee74bc","impliedFormat":99},{"version":"8361e095def6c5f9fe7303b341c4b3249e82354f78f8ac9602a076fc5a04e3db","impliedFormat":99},{"version":"e047505265ecef24ac538e166898c74fe4ddde9a208446b298ea9805a1337ebc","impliedFormat":99},{"version":"13a9d63fe4bcf62c0115da6fce6ff28caed592d7cf3718bdf2852616a9318304","impliedFormat":99},{"version":"5dbc1632a49ae9232d2006a9283086c23676a72c2869348fab07a92ad25894fa","impliedFormat":99},{"version":"3b24a42d6ff7eb9fbdaeb74d38c2bae20b455d9ecea76759c3bed2c9a70d3b9f","impliedFormat":99},{"version":"ab15374738d77b8203d5054b306e883bc12ae980f3de59b9bb2ab3c299eee15f","impliedFormat":99},{"version":"7fd8a28b8373c1ae0a9690ea4ad8ee96da351b2ddf9fff8f0fc33ba81bd49615","impliedFormat":99},{"version":"0dbf9eb173a832b643337fab8eb3153f2f82d40648cd9d0b654f37e469dde44b","impliedFormat":99},{"version":"a69420221cdbd10d0e9298b3b94d53a633606634ad0357da5cc541ff814d8c5f","impliedFormat":99},{"version":"e706e16bc6c83d4a60da03d7a423048f244423ed55064134d0db9a0a5d1a31ef","impliedFormat":99},{"version":"b11860ace9980039b9a876c8aa763228cd2eb7dc1ff1d4e4b6791fefa8270271","impliedFormat":99},{"version":"a5f1e4c5671abc235aac21bd99603fd151232360064d2622f6d21b592fde4cc0","impliedFormat":99},{"version":"a026df81b303bd8a8256705e4ba7f7845096a35a20885403143ecc25482fb5c6","impliedFormat":99},{"version":"3ad573ea6506a5b47d89fb43f6e7b3e24c9af3dad66408349bfdbea4d0ec9762","impliedFormat":99},{"version":"f08d5516ded9072f6ef4a9bd95d4301b7f168afb484dfcdc3f9fa0032fff1406","impliedFormat":99},{"version":"3532ffeb99fb16886cad07caf0feb76a19cc1fa14a648ce6e6558b04ba91bdcb","impliedFormat":99},{"version":"825a2b8b6cac11eb3228d4cf75487a3c4ed7daad1dcc1fb01c2f67dc75fa6e2c","impliedFormat":99},{"version":"f6976b6c4bfa0dd945409221c74e8adb9ac21110e43e6de6e5564d71a4faa010","impliedFormat":99},{"version":"3ba19528d73345e791808428a0ac7f251f3a03075f73b89393d5b7df828001bf","impliedFormat":99},{"version":"ed4fe0fdd2dd66de8ce064556270713b73bb71126c016db3a755a1b9ddb2b079","impliedFormat":99},{"version":"94535dcbd25f61962f2b2c9a36098001f0529186fcd9aaefd804bc7c3008e0e6","impliedFormat":99},{"version":"a3394d25f46ed8a6ede20cf2ebb07cad72e0928987c437dbe0a80799177268a2","impliedFormat":99},{"version":"979b1767dec45cc88bf49235cc88b3bf84f9072e0cadcaccabc3f51f37dfb4ba","impliedFormat":99},{"version":"53538d2fe5ed0d17a8fb3ed894b35590af1478a2864273f64ea153dc931f5137","impliedFormat":99},{"version":"ceed655ca8647e687782de09d86aa52aaeb71a04db53f7317b294afd98e745ec","impliedFormat":99},{"version":"a19f58bc593383ee611214b5aff06db6ec0c9abff34fbde4e937d56db230fe2d","impliedFormat":99},{"version":"12f07c1ca64c24a16c6b863a1b39053ba466391a42fb48fcdc731b5fbac19c2f","impliedFormat":99},{"version":"8fa98834033c5bd66d016570ad710aaeae12014b87799f57d8c107931308da75","impliedFormat":99},{"version":"5540adb5ed9f7b2a3b93cbae6ba4cc15c9c5aa0230f0b2c4ea65df9fb2d35ade","impliedFormat":99},{"version":"237549157534b24eb1486ad6338a5b11ad017da0b2a433597ca0d62c3978c166","impliedFormat":99},{"version":"14f449fd97d14b30b7d7e74ccb5dc52065397f5a159f109a81de462cbc2ee735","impliedFormat":99},{"version":"1da1c5e42d173cdb28539057403afbdcdba7ba70d1ca88131d478a3461146631","impliedFormat":99},{"version":"84e2defcc0264038c29dc40ffcb934623cf2906e721546276a11749645d650a9","impliedFormat":99},{"version":"981a6d13fdb1a917808b2c0021adf15df76b77d15ce32942f2567dacaa636818","impliedFormat":99},{"version":"8f2f419e0fefd82149f1bee26ef5962d27a2bd1c0ef5652f4558d603debd0cd0","impliedFormat":99},{"version":"20d839e1a5bd43ca94fc3855594dddfb4b04051ca87a6c0f61dee0d2135afed4","impliedFormat":99},{"version":"1327881b3a0726661b36d1d011b4722b301f6dd1d428b82d78f1bf94d7c5a1be","impliedFormat":99},{"version":"3776840bb69fac8d6715b70c236bd06b99ecdd2c0784a2cf0be7899fb7be13a3","impliedFormat":99},{"version":"ff224ec5ccda457a52bdf0747d643ad6029bc7ac8cf898f94047361fde72291c","impliedFormat":99},{"version":"b58c384659075652971d0c6cd25ad07ae6f193ee37820bd8daee6e3436a8aaa2","impliedFormat":99},{"version":"daecca2dbb88b1b1d759e2172245e8187180d777c2066296762811a33703db67","impliedFormat":99},{"version":"caf1e76335a50ba27f655209a1089e342e44c10410c834436308266cae1a0ed5","impliedFormat":99},{"version":"ce73f579eac2b41a8f1539d870ab294efc1b4e0a5680b57e027d2d69464bc5d4","impliedFormat":99},"bfd8ddc632a6e9d1f0447212e2cf70b8d0865a13acf94dba9b11d7fb2d1a2fc9","7d300b78b73470e4f2783a9960c34fe5f7b8eeadb35aacb20fec43fecf980c4a",{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},"76b037635834d4a94bc3df74aad5f003f02d3e41074cc8aab3feacd2976ca54f","f4d665d28333ebe14134563af6435c1876d905f8591be3c30177a5feca553394","ef62b940c764910f408e555ab34cc2d387fba738a4e0ed3a1f39d6d3d28efa0a","f74274a2898ec4e06e23d9d162bbb0df3426e7f0ce51c23268239f72cd65c647","a8d0448a524740fe8da10af8c482d7fba1f239213cd9261b97f51f2d233a28dd","1e509ee68bad4dedb7c68f6ae9ab406d64a7c80884a5137f4a67dbf860929494","bd17d24e717a6aef9309093a21fe45d14e91d89a4dcca164f051105ff63f0b48","63f11c7ee819d7dcc69d50be69b0c27281ec5ed82ea71a0fae9cb5f8eafc4bea","4d6d2f383076af9701a3c255890bc153a381f08501531984eb28b7448ebd764f","cae133178523b59f6a114c4b7c1268c72bdf5540479fc5e295e6329cdc1982a0","b01db7fc57e5f960d7f40d8bb87c1c5ff63a1f66656416e97e41c6fc0f49cb99","e2e1f3f72c0b898b7b0af9fe9c54047bd59f4f14d8268156875144aee8dd9148","474478769e635ae22dee34fe2636973ddf27c862b86aef98ba4aa1bae1aee16c","dcf22a9572b63bf71e7b85fca38c179b6e2a3f6cb2f4385af65c286e4cd930d4",{"version":"b07047a60f37f65427574e262a781e6936af9036cf92b540311e033956fd49be","impliedFormat":1},{"version":"25ba804522003eb8212efb1e6a4c2d114662a894b479351c36bd9c7491ceb04f","impliedFormat":1},{"version":"6445fe8e47b350b2460b465d7df81a08b75b984a87ee594caf4a57510f6ec02e","impliedFormat":1},{"version":"425e1299147c67205df40ce396f52ff012c1bf501dcfbf1c7123bbd11f027ab0","impliedFormat":1},{"version":"3abf6b0a561eed97d2f2b58f2d647487ba33191c0ecb96764cc12be4c3dd6b55","impliedFormat":1},{"version":"01cc05d0db041f1733a41beec0ddaeea416e10950f47e6336b3be26070346720","impliedFormat":1},{"version":"e21813719193807d4ca53bb158f1e7581df8aa6401a6a006727b56720b62b139","impliedFormat":1},{"version":"f4f9ca492b1a0306dcb34aa46d84ca3870623db46a669c2b7e5403a4c5bcbbd6","impliedFormat":1},{"version":"492d38565cf9cce8a4f239d36353c94b24ef46a43462d3d411e90c8bef2f8503","impliedFormat":1},{"version":"9f94dc8fb29d482f80aec57af2d982858a1820a8c8872910f89ae2f7fd9bee7f","impliedFormat":1},{"version":"a23f14db3212d53b6c76c346caca80c3627bf900362ce7a896229675a67ae49b","impliedFormat":1},{"version":"f317cf0107576c3e70d3fc9040d767272e4eb5940a1a22666cc81ae491b69d12","impliedFormat":1},{"version":"f317cf0107576c3e70d3fc9040d767272e4eb5940a1a22666cc81ae491b69d12","impliedFormat":1},{"version":"eedb957064af583258d82b6fd845c4df7d0806868cb18cbc2c6a8b0b51eb00bd","impliedFormat":1},{"version":"b6967a67f087fd77eb1980a8abb701ad040679404ed62bd4d6b40406a621fc45","impliedFormat":1},{"version":"092f99777813f42f32abf6f2e4ef1649b6e74cd94db499f2df64fc78d3f969e4","impliedFormat":1},{"version":"3d86c7feb4ee3862d71fe42e3fc120131decf6aa4a21bdf8b3bb9f8c5228aed2","impliedFormat":1},{"version":"ab70ea5d6d02c8631da210783199dc0f6c51ac5dfbc4265fdb8f1526fa0fdc7f","impliedFormat":1},{"version":"427acaa3bbea7c0b1f57d7d9190bedbbb49c147ef36b9088f8f43d1c57974d6e","impliedFormat":1},{"version":"bbd32da0338c47c74e40436d262d787e9a61c11de6d70d431b830babe79aa679","impliedFormat":1},{"version":"cb852ce7eb0ab4281cd3c5a1710d819f54f58fba0f0e9d4b797195416f254883","impliedFormat":1},{"version":"34465f88f94a4b0748055fa5702528e54ef9937c039e29a6bcde810deefd73d0","impliedFormat":1},{"version":"c451606558ca4e1e71e38396f94778b7c9a553a3b33f376ab5e4991dd3633e28","impliedFormat":1},{"version":"22986fb5b95b473335e2bbcc62a9438e8a242ca3d1b28c220d8b99e0d5874678","impliedFormat":1},{"version":"838dc2c15fe68509985a94d1853e96b1e519992a711a7a0cd8568dfd36bf757e","impliedFormat":1},{"version":"bb894fb593532cd9819c43f747cc7b0901136a93758e78482a9f675563beacdf","impliedFormat":1},{"version":"9575c608269abe4889b7c1382762c09deb7493812284bde0a429789fa963838b","impliedFormat":1},{"version":"c8c57e8f7e28927748918e0420c0d6dd55734a200d38d560e16dc99858710f2b","impliedFormat":1},{"version":"64903d7216ed30f8511f03812db3333152f3418de6d422c00bde966045885fb7","impliedFormat":1},{"version":"8ff3e2f7d218a5c4498a2a657956f0ca000352074b46dbaf4e0e0475e05a1b12","impliedFormat":1},{"version":"498f87ea2a046a47910a04cf457a1b05d52d31e986a090b9abc569142f0d4260","impliedFormat":1},{"version":"5ac05c0f6855db16afa699dccfd9e3bd3a7a5160e83d7dce0b23b21d3c7353b9","impliedFormat":1},{"version":"7e792c18f8e4ac8b17c2b786e90f9e2e26cf967145ad615f5c1d09ab0303241f","impliedFormat":1},{"version":"a528a860066cc462a9f0bddc9dbe314739d5f8232b2b49934f84a0ce3a86de81","impliedFormat":1},{"version":"81760466a2f14607fcacf84be44e75ef9dcc7f7267a266d97094895a5c37cbac","impliedFormat":1},{"version":"ee05b32eccbf91646cb264de32701b48a37143708065b74ed0116199d4774e86","impliedFormat":1},{"version":"60f3443b1c23d4956fb9b239e20d31859ea57670cd9f5b827f1cd0cac24c9297","impliedFormat":1},{"version":"648eacd046cfe3e9cba80da0cf2dc69c68aa749be900d7ee4b25ce28099ffa72","impliedFormat":1},{"version":"6a69d5ec5a4ed88455753431cf4d72411d210f04bce62475f9f1a97c4cf4294e","impliedFormat":1},{"version":"11fb88d11384bea44dc08b42b7341a39e36719a68a6be5fed5da575cdaeb1ad8","impliedFormat":1},{"version":"2936dcfaf4b4d1585b73c5ae7ac6395f143e136474bc091cc95033aface47e5e","impliedFormat":1},{"version":"4719ef9fe00fb18f2c3844a1939111ebca55e64f1fa93b14ddcea050865b63f0","impliedFormat":1},{"version":"86edb0b4f12ce79243d5e6ca4bed776bdd7e7a774ce4961578905e775c994ea8","impliedFormat":1},{"version":"b4a4433d4d4601efe2aa677164dee3754e511de644080147421a8cac8d6aae68","impliedFormat":1},{"version":"09a2e34f98a73581d1fd923f2eafaf09bb3ebde6ea730779af09da35dffebbcd","impliedFormat":1},{"version":"f5b5545691bd2e4ca7cf306f99a088ba0ec7e80f3dfca53b87167dbbb44cd836","impliedFormat":1},{"version":"3bd5bd5fabd0b2c646e1413e4d4eb9bbca4bd5a9ffdc53c5375f50078c20c2e2","impliedFormat":1},{"version":"3bd5bd5fabd0b2c646e1413e4d4eb9bbca4bd5a9ffdc53c5375f50078c20c2e2","impliedFormat":1},{"version":"d5003e54842f82de63a808473357de001162f7ca56ab91266e5d790b620f6fdb","impliedFormat":1},{"version":"aa0761c822c96822508e663d9b0ee33ad12a751219565a12471da3e79c38f0ba","impliedFormat":1},{"version":"8338db69b3c23549e39ecf74af0de68417fcea11c98c4185a14f0b3ef833c933","impliedFormat":1},{"version":"85f208946133e169c6a8e57288362151b2072f0256dbed0a4b893bf41aab239a","impliedFormat":1},{"version":"e6957055d9796b6a50d2b942196ffece6a221ec424daf7a3eddcee908e1df7b0","impliedFormat":1},{"version":"e9142ff6ddb6b49da6a1f44171c8974c3cca4b72f06b0bbcaa3ef06721dda7b5","impliedFormat":1},{"version":"3961869af3e875a32e8db4641d118aa3a822642a78f6c6de753aa2dbb4e1ab77","impliedFormat":1},{"version":"4a688c0080652b8dc7d2762491fbc97d8339086877e5fcba74f78f892368e273","impliedFormat":1},{"version":"c81b913615690710c5bcfff0845301e605e7e0e1ebc7b1a9d159b90b0444fccf","impliedFormat":1},{"version":"2ced4431ecdda62fefcf7a2e999783759d08d802962adcff2b0105511f50056d","impliedFormat":1},{"version":"2ced4431ecdda62fefcf7a2e999783759d08d802962adcff2b0105511f50056d","impliedFormat":1},{"version":"e4c6c971ce45aef22b876b7e11d3cd3c64c72fcd6b0b87077197932c85a0d81d","impliedFormat":1},{"version":"7fd1258607eddcc1cf7d1fef9c120a3f224f999bba22da3a0835b25c8321a1d3","impliedFormat":1},{"version":"da3a1963324e9100d88c77ea9bec81385386dbb62acd45db8197d9aeb67284f7","impliedFormat":1},{"version":"f14deef45f1c4c76c96b765e2a7a2410c5e8ae211624fb99fe944d35da2f27c1","impliedFormat":1},{"version":"04dc76c64d88e872fafce2cceb7e25b00daa7180a678600be52c26387486a6d7","impliedFormat":1},{"version":"18c19498e351fb6f0ddbfa499a9c2c845a4d06ed076a976deb4ac28d7c613120","impliedFormat":1},{"version":"5738df287f7e6102687a9549c9b1402941632473e0423ef08bd8af6f394b2662","impliedFormat":1},{"version":"c67e42d11d442babad44a7821e5a18d55548271fdbe9dceb34e3f794e4e2c045","impliedFormat":1},{"version":"407bd942087ec965acd69dfb8f3196838337b07ce9bb3b6939b825bf01f6fb82","impliedFormat":1},{"version":"3d6e4bf3459c87e9cdf6016f51479c5f1e2535ef6b1e9d09ac5826c53d1f849c","impliedFormat":1},{"version":"c583b7e6c874476a42f22fb8afa7474f7ddedac69733e5e28fed9bde08418a3b","impliedFormat":1},{"version":"faf7c4d1fafaed99f524a1dc58b2c3f5602aebfb1a7cac119f279361bae6a0aa","impliedFormat":1},{"version":"d3ded63f1110dc555469fc51ce9873be767c72bff2df976e3afb771c34e91651","impliedFormat":1},{"version":"b0a1098565684d1291020613947d91e7ae92826ffbc3e64f2a829c8200bc6f05","impliedFormat":1},{"version":"1a5bbfae4f953a5552d9fa795efca39883e57b341f0d558466a0bf4868707eb4","impliedFormat":1},{"version":"fe542d91695a73fd82181e8d8898f3f5f3bec296c7480c5ff5e0e170fa50e382","impliedFormat":1},{"version":"891becf92219c25433153d17f9778dec9d76185bc8a86ca5050f6971eaf06a65","impliedFormat":1},{"version":"267f93fbddff4f28c34be3d6773ee8422b60c82f7d31066b6587dffa959a8a6a","impliedFormat":1},{"version":"276d36388f1d029c4543c0ddd5c208606aedcbaed157263f58f9c5016472057e","impliedFormat":1},{"version":"b018759002a9000a881dbb1f9394c6ef59c51fa4867705d00acba9c3245428ea","impliedFormat":1},{"version":"20bbf42534cbacbd0a8e1565d2c885152b7c423a3d4864c75352a8750bb6b52c","impliedFormat":1},{"version":"0ce3dbc76a8a8ed58f0f63868307014160c3c521bc93ed365de4306c85a4df33","impliedFormat":1},{"version":"d9a349eb9160735da163c23b54af6354a3e70229d07bb93d7343a87e1e35fd40","impliedFormat":1},{"version":"9bd17494fcb9407dcc6ace7bde10f4cf3fc06a4c92fe462712853688733c28a3","impliedFormat":1},{"version":"ba540f8efa123096aa3a7b6f01acb2dc81943fa88e5a1adb47d69ed80b949005","impliedFormat":1},{"version":"c6b20a3d20a9766f1dded11397bdba4531ab816fdb15aa5aa65ff94c065419cf","impliedFormat":1},{"version":"91e4a5e8b041f28f73862fb09cd855cfab3f2c7b38abe77089747923f3ad1458","impliedFormat":1},{"version":"2cebda0690ab1dee490774cb062761d520d6fabf80b2bd55346fde6f1f41e25d","impliedFormat":1},{"version":"bcc18e12e24c7eb5b7899b70f118c426889ac1dccfa55595c08427d529cc3ce1","impliedFormat":1},{"version":"6838d107125eeaf659e6fc353b104efd6d033d73cfc1db31224cb652256008f1","impliedFormat":1},{"version":"97b21e38c9273ccc7936946c5099f082778574bbb7a7ab1d9fc7543cbd452fd5","impliedFormat":1},{"version":"ae90b5359bc020cd0681b4cea028bf52b662dff76897f125fa3fe514a0b6727a","impliedFormat":1},{"version":"4596f03c529bd6c342761a19cf6e91221bee47faad3a8c7493abff692c966372","impliedFormat":1},{"version":"6682c8f50bd39495df3042d2d7a848066b63439e902bf8a00a41c3cfc9d7fafa","impliedFormat":1},{"version":"1b111caa0a85bcfd909df65219ecd567424ba17e3219c6847a4f40e71da9810b","impliedFormat":1},{"version":"b8df0a9e1e9c5bd6bcdba2ca39e1847b6a5ca023487785e6909b8039c0c57b16","impliedFormat":1},{"version":"2e26ca8ed836214ad99d54078a7dadec19c9c871a48cb565eaac5900074de31c","impliedFormat":1},{"version":"2b5705d85eb82d90680760b889ebedade29878dbb8cab2e56a206fd32b47e481","impliedFormat":1},{"version":"d131e0261dc711dd6437a69bac59ed3209687025b4e47d424408cf929ca6c17c","impliedFormat":1},{"version":"86c7f05da9abdecf1a1ea777e6172a69f80aec6f9d37c665bd3a761a44ec177b","impliedFormat":1},{"version":"840fe0bc4a365211bae1b83d683bfd94a0818121a76d73674ee38081b0d65454","impliedFormat":1},{"version":"1b6e2a3019f57e4c72998b4ddeea6ee1f637c07cc9199126475b0f17ba5a6c48","impliedFormat":1},{"version":"69920354aa42af33820391f6ec39605c37a944741c36007c1ff317fc255b1272","impliedFormat":1},{"version":"054186ff3657c66e43567635eed91ad9d10a8c590f007ba9eae7182e5042300b","impliedFormat":1},{"version":"1d543a56cb8c953804d7a5572b193c7feb3475f1d1f7045541a227eced6bf265","impliedFormat":1},{"version":"67374297518cf483af96aa68f52f446e2931b7a84fa8982ab85b6dd3fc4accce","impliedFormat":1},{"version":"cf9bfdf581e8998f45f486fdb1422edd7fc05cc9bc39a0bf45c293805176bf7d","impliedFormat":1},{"version":"cf9bfdf581e8998f45f486fdb1422edd7fc05cc9bc39a0bf45c293805176bf7d","impliedFormat":1},{"version":"849d09d5dc6836815767c3f8e2e4c561c8c1986d5398a8e876208aed2cc691c3","impliedFormat":1},{"version":"849d09d5dc6836815767c3f8e2e4c561c8c1986d5398a8e876208aed2cc691c3","impliedFormat":1},{"version":"0dd43d0e8bc78b0c73b1bd20ad29dac4c82163ab92744551bf2ab46512c33b6c","impliedFormat":1},{"version":"0dd43d0e8bc78b0c73b1bd20ad29dac4c82163ab92744551bf2ab46512c33b6c","impliedFormat":1},{"version":"54a527b58cf10aae5525481b5446b81a28b2ae459ce27dc97bd56b13508ea11c","impliedFormat":1},{"version":"54a527b58cf10aae5525481b5446b81a28b2ae459ce27dc97bd56b13508ea11c","impliedFormat":1},{"version":"d1880d157445fdbf521eead6182f47f4b3e5405afd08293ed9e224c01578e26a","impliedFormat":1},{"version":"ed2f74c2566e99295f366f820e54db67d304c3814efcb4389ce791410e9178b0","impliedFormat":1},{"version":"4f7f0dd2d715968cbc88f63784e3323ef0166566fbd121f0ebeb0d07d1ef886b","impliedFormat":1},{"version":"b45e4210d7ffd6339cc7c44484a287bd6578440e4885610067d44d6a084e6719","impliedFormat":1},{"version":"86c931b4aaddf898feee19e37ebdc9f29715bc71e39717138a8dbfb7b56e964d","impliedFormat":1},{"version":"b23d3623bbd2371f16961b7a8ab48f827ee14a0fc9e64aace665e4fc92e0fabe","impliedFormat":1},{"version":"95742365fd6f187354ad59aa45ec521f276b19acfb3636a065bc53728ede2aa6","impliedFormat":1},{"version":"4ac7cb98cbdde71287119827a1ec79c75e4b31847e18b7522cc8ff613f37d0d7","impliedFormat":1},{"version":"ae46812138452a8bf885321878a4f3f66060843b136322cf00e5bdd291596f5a","impliedFormat":1},{"version":"dd708604a523a1f60485ff5273811ff5a2581c0f9d0ccaa9dd7788b598c3e4cb","impliedFormat":1},{"version":"dbdd0616bc8801c73ded285458dddbc468bbae511e55a2b93db71a6fca9fc8fa","impliedFormat":1},{"version":"7682d3f8f04441f516ce74f85733583138039097779b0ac008785e4ecd440ca3","impliedFormat":1},{"version":"7619775d1c3f0bf6c49df7f1cf46bb0729b2f217e84c05e452ce4bb4c50347ba","impliedFormat":1},{"version":"2bd5ad36a78749bf88e7405712ad6cec774fd7646458612e80992a023f3a4da2","impliedFormat":1},{"version":"29a9495b4092f60dd5f079e664be6be1b967b8c2d600bfbf3986104e1d936e77","impliedFormat":1},{"version":"b966a1ceb3c4e8cc5a195ea43a962a6383d55d528ed3c33e97e65e14d2926e8e","impliedFormat":1},{"version":"524138093155f10c138b3ee9cc07284697bf6ba6d90a072106a1f0f7a23f8bea","impliedFormat":1},{"version":"4d44be7af68c7b5a537781bd4f28d48f2262dfd846ff5167f67f665aa93c342b","impliedFormat":1},{"version":"b5534cd11582a3025fb774fbda25a5bfb3a310befb36df425a954b23e2f1872a","impliedFormat":1},{"version":"1eb50ff7cef891bb6f7970802d061dbeb460bde39aef2690937e4e5dbadd74f7","impliedFormat":1},{"version":"b65353223b43764d9ac3a5b3f6bc80ac69b4bb53dfb733dca5dbe580cb2c95ee","impliedFormat":1},{"version":"a843a1a722ebd9a53aeb0823d40190907bde19df318bd3b0911d2876482bd9fa","impliedFormat":1},{"version":"c587631255497ef0d8af1ed82867bfbafaab2d141b84eb67d88b8c4365b0c652","impliedFormat":1},{"version":"b6d3cd9024ab465ec8dd620aeb7d859e323a119ec1d8f70797921566d2c6ac20","impliedFormat":1},{"version":"c5ccf24c3c3229a2d8d15085c0c5289a2bd6a16cb782faadf70d12fddcd672ff","impliedFormat":1},{"version":"a7fc49e0bee3c7ecdcd5c86bc5b680bfad77d0c4f922d4a2361a9aa01f447483","impliedFormat":1},{"version":"3dab449a3c849381e5edb24331596c46442ad46995d5d430c980d7388b158cf8","impliedFormat":1},{"version":"5886a079613cbf07cf7047db32f4561f342b200a384163e0a5586d278842b98e","impliedFormat":1},{"version":"9dae0e7895da154bdc9f677945c3b12c5cc7071946f3237a413bbaa47be5eaa3","impliedFormat":1},{"version":"2d9f27cd0e3331a9c879ea3563b6ad071e1cf255f6b0348f2a5783abe4ec57fb","impliedFormat":1},{"version":"8e6039bba2448ceddd14dafcefd507b4d32df96a8a95ca311be7c87d1ea04644","impliedFormat":1},{"version":"9466d70d95144bf164cd2f0b249153e0875b8db1d6b101d27dce790fd3844faf","impliedFormat":1},{"version":"223ff122c0af20e8025151f11100e3274c1e27234915f75f355881a5aa996480","impliedFormat":1},{"version":"e89a09b50458d1a1ef9992d4c1952d5b9f49f8cfdf82cada3feb4f906d290681","impliedFormat":1},{"version":"2d46726ef0883e699242f2f429b09605beb94ec2ed90d4cccdee650cfd38e9bf","impliedFormat":1},{"version":"a5d3817a1198f3c0f05501d3c23c37e384172bc5a67eaaccbf8b22e7068b607e","impliedFormat":1},{"version":"4ff787695e6ab16b1516e7045d9e8ecf6041c543b7fbed27e26d5222ee86dc7b","impliedFormat":1},{"version":"2b04c4f7b22dfa427973fa1ae55e676cbef3b24bd13e80266cf9e908d1911ce4","impliedFormat":1},{"version":"e89136e2df173f909cb13cdffbc5241b269f24721fe7582e825738dbb44fd113","impliedFormat":1},{"version":"88cf175787ba17012d6808745d3a66b6e48a82bb10d0f192f7795e9e3b38bee0","impliedFormat":1},{"version":"415f027720b1fd2ef33e1076d1a152321acb27fd838d4609508e60280b47ad74","impliedFormat":1},{"version":"1b4034b0a074f5736ae3ec4bf6a13a87ec399779db129f324e08e7fff5b303f2","impliedFormat":1},{"version":"dcd22923b72f9a979a1cea97be236b10fc1fa3ba592c587807bfe3e10d53dbb2","impliedFormat":1},{"version":"dcd22923b72f9a979a1cea97be236b10fc1fa3ba592c587807bfe3e10d53dbb2","impliedFormat":1},{"version":"f34f40704ea9f38ee0c7e1d8f28dfde5a2720577bfdfcd5c6566df140dbe0f7a","impliedFormat":1},{"version":"ea4034d0a7d4878f0710457807ae81cc00529a5f343594bc6e5fe3337561960a","impliedFormat":1},{"version":"2d3dbed1071ac8188a9d210ec745547bc4df0a6c7f4271ac28a36865bb76ee18","impliedFormat":1},{"version":"f71430f4f235cf6fe3ab8f30b763853fe711d186fc9dc1a5f4e11ba84f2000ad","impliedFormat":1},{"version":"5c4dac355c9c745a43de2b296ec350af4ee5548639728f238996df8e4c209b68","impliedFormat":1},{"version":"e8f5dbeb59708cde836d76b5bc1ff2fff301f9374782ffd300a0d35f68dce758","impliedFormat":1},{"version":"04967e55a48ca84841da10c51d6df29f4c8fa1d5e9bd87dec6f66bb9d2830fac","impliedFormat":1},{"version":"22f5e1d0db609c82d53de417d0e4ee71795841131ad00bbd2e0bd18af1c17753","impliedFormat":1},{"version":"afd5a92d81974c5534c78c516e554ed272313a7861e0667240df802c2a11f380","impliedFormat":1},{"version":"d29b6618f255156c4e5b804640aec4863aa22c1e45e7bd71a03d7913ab14e9e2","impliedFormat":1},{"version":"3f8ac93d4f705777ac6bb059bbe759b641f57ae4b04c8b6d286324992cb426e8","impliedFormat":1},{"version":"ba151c6709816360064659d1adfc0123a89370232aead063f643edf4f9318556","impliedFormat":1},{"version":"7957745f950830ecd78ec6b0327d03f3368cfb6059f40f6cdfc087a2c8ade5c0","impliedFormat":1},{"version":"e864f9e69daecb21ce034a7c205cbea7dfc572f596b79bcd67daab646f96722a","impliedFormat":1},{"version":"ebfba0226d310d2ef2a5bc1e0b4c2bc47d545a13d7b10a46a6820e085bc8bcb2","impliedFormat":1},{"version":"dac79c8b6ab4beefba51a4d5f690b5735404f1b051ba31cd871da83405e7c322","impliedFormat":1},{"version":"1ec85583b56036da212d6d65e401a1ae45ae8866b554a65e98429646b8ba9f61","impliedFormat":1},{"version":"8a9c1e79d0d23d769863b1a1f3327d562cec0273e561fd8c503134b4387c391a","impliedFormat":1},{"version":"b274fdc8446e4900e8a64f918906ba3317aafe0c99dba2705947bab9ec433258","impliedFormat":1},{"version":"ecf8e87c10c59a57109f2893bf3ac5968e497519645c2866fbd0f0fda61804b8","impliedFormat":1},{"version":"fe27166cc321657b623da754ca733d2f8a9f56290190f74cc72caad5cb5ef56f","impliedFormat":1},{"version":"74f527519447d41a8b1518fbbc1aca5986e1d99018e8fcd85b08a20dc4daa2e1","impliedFormat":1},{"version":"63017fb1cfc05ccf0998661ec01a9c777e66d29f2809592d7c3ea1cb5dab7d78","impliedFormat":1},{"version":"d08a2d27ab3a89d06590047e1902ee63ca797f58408405729d73fc559253bbc0","impliedFormat":1},{"version":"30dc37fb1af1f77b2a0f6ea9c25b5dc9f501a1b58a8aae301daa8808e9003cf6","impliedFormat":1},{"version":"2e03022de1d40b39f44e2e14c182e54a72121bd96f9c360e1254b21931807053","impliedFormat":1},{"version":"c1563332a909140e521a3c1937472e6c2dda2bb5d0261b79ed0b2340242bdd7b","impliedFormat":1},{"version":"4f297b1208dd0a27348c2027f3254b702b0d020736e8be3a8d2c047f6aa894dd","impliedFormat":1},{"version":"db4d4a309f81d357711b3f988fb3a559eaa86c693cc0beca4c8186d791d167d2","impliedFormat":1},{"version":"67cd15fcb70bc0ee60319d128609ecf383db530e8ae7bab6f30bd42af316c52c","impliedFormat":1},{"version":"c9ecba6a0b84fd4c221eb18dfbae6f0cbf5869377a9a7f0751754da5765e9d3f","impliedFormat":1},{"version":"394a9a1186723be54a2db482d596fd7e46690bda5efc1b97a873f614367c5cea","impliedFormat":1},{"version":"4fb9545dbfaa84b5511cb254aa4fdc13e46aaaba28ddc4137fed3e23b1ae669a","impliedFormat":1},{"version":"b265ebd7aac3bc93ba4eab7e00671240ca281faefddd0f53daefac10cb522d39","impliedFormat":1},{"version":"feadb8e0d2c452da67507eb9353482a963ac3d69924f72e65ef04842aa4d5c2e","impliedFormat":1},{"version":"46beac4ebdcb4e52c2bb4f289ba679a0e60a1305f5085696fd46e8a314d32ce6","impliedFormat":1},{"version":"1bf6f348b6a9ff48d97e53245bb9d0455bc2375d48169207c7fc81880c5273d6","impliedFormat":1},{"version":"1b5c2c982f14a0e4153cbf5c314b8ba760e1cd6b3a27c784a4d3484f6468a098","impliedFormat":1},{"version":"894ce0e7a4cfe5d8c7d39fab698da847e2da40650e94a76229608cb7787d19e6","impliedFormat":1},{"version":"7453cc8b51ffd0883d98cba9fbb31cd84a058e96b2113837191c66099d3bb5a6","impliedFormat":1},{"version":"25f5fafbff6c845b22a3af76af090ddfc90e2defccca0aa41d0956b75fe14b90","impliedFormat":1},{"version":"41e3ec4b576a2830ff017112178e8d5056d09f186f4b44e1fa676c984f1cb84e","impliedFormat":1},{"version":"5617b31769e0275c6f93a14e14774398152d6d03cc8e40e8c821051ef270340e","impliedFormat":1},{"version":"60f19b2df1ca4df468fae1bf70df3c92579b99241e2e92bc6552dfb9d690b440","impliedFormat":1},{"version":"52cac457332357a1e9ea0d5c6e910b867ca1801b31e3463b1dcbaa0d939c4775","impliedFormat":1},{"version":"cf08008f1a9e30cd2f8a73bc1e362cad4c123bd827058f5dffed978b1aa41885","impliedFormat":1},{"version":"582bf54f4a355529a69c3bb4e995697ff5d9e7f36acfddba454f69487b028c66","impliedFormat":1},{"version":"d342554d650b595f2e64cb71e179b7b6112823b5b82fbadf30941be62f7a3e61","impliedFormat":1},{"version":"f7bfc25261dd1b50f2a1301fc68e180ac42a285da188868e6745b5c9f4ca7c8a","impliedFormat":1},{"version":"61d841329328554af2cfa378a3e8490712de88818f8580bde81f62d9b9c4bf67","impliedFormat":1},{"version":"be76374981d71d960c34053c73d618cad540b144b379a462a660ff8fbc81eabe","impliedFormat":1},{"version":"8d9629610c997948d3cfe823e8e74822123a4ef73f4ceda9d1e00452b9b6bbf3","impliedFormat":1},{"version":"0c15ca71d3f3f34ebf6027cf68c8d8acae7e578bb6cc7c70de90d940340bf9bd","impliedFormat":1},{"version":"e5d0a608dca46a22288adac256ec7404b22b6b63514a38acab459bf633e258e0","impliedFormat":1},{"version":"c6660b6ccec7356778f18045f64d88068959ec601230bab39d2ad8b310655f99","impliedFormat":1},{"version":"aaca412f82da34fb0fd6751cea6bbf415401f6bb4aed46416593f7fcfaf32cb5","impliedFormat":1},{"version":"5e283ec6c1867adf73635f1c05e89ee3883ba1c45d2d6b50e39076e0b27f7cd9","impliedFormat":1},{"version":"2712654a78ad0736783e46e97ce91210470b701c916a932d2018a22054ee9751","impliedFormat":1},{"version":"347872376770cb6222066957f9b1ab45083552d415687f92c8b91cb246fd5268","impliedFormat":1},{"version":"24ecb13ea03a8baa20da7df564b4ba48505b396cd746cd0fe64b1f891574a0c9","impliedFormat":1},{"version":"1ded976e25a882defb5c44c3cf0d86f6157aadc85ff86b3f1d6b0796d842e861","impliedFormat":1},{"version":"c15bc8c0b0d3c15dec944d1f8171f6db924cc63bc42a32bc67fbde04cf783b5f","impliedFormat":1},{"version":"5b0c4c470bd3189ea2421901b27a7447c755879ba2fd617ab96feefa2b854ba5","impliedFormat":1},{"version":"08299cc986c8199aeb9916f023c0f9e80c2b1360a3ab64634291f6ff2a6837b1","impliedFormat":1},{"version":"1c49adea5ebea9fbf8e9b28b71e5b5420bf27fee4bf2f30db6dfa980fdad8b07","impliedFormat":1},{"version":"24a741caee10040806ab1ad7cf007531464f22f6697260c19d54ea14a4b3b244","impliedFormat":1},{"version":"b08dfe9e6da10dd03e81829f099ae983095f77c0b6d07ffdd4e0eaf3887af17e","impliedFormat":1},{"version":"40bd28334947aab91205e557963d02c371c02dc76a03967c04ae8451c3702344","impliedFormat":1},{"version":"62e9943dc2f067bda73b19fe8bcf20b81459b489b4f0158170dd9f3b38c68d30","impliedFormat":1},{"version":"267c58ef692839390c97bbb578bdd64f8a162760b4afbd3f73eacacf77d6ea6e","impliedFormat":1},{"version":"6d2496f03c865b5883deee9deda63b98d41f26d60b925204044cd4b78f0f8596","impliedFormat":1},{"version":"02988c4a472902b6ec5cb00809ef193c8a81ffde90b1759dfc34eb18674e0b02","impliedFormat":1},{"version":"7b2b386bb8e6842a4406164027fb53ab4bfef3fbc0eca440f741555dc212d0e8","impliedFormat":1},{"version":"35d669220fc1b97204dc5675e124932294d45b021feb425a9aa16888df44716d","impliedFormat":1},{"version":"bb7b865996627537dbaba9f2fd2f4195003370b02022937cd9eb57c0a0e461d0","impliedFormat":1},{"version":"28a2b8c6566e5a25119829e96a0ac0f0720df78ff55553f1a7529fbce5a87749","impliedFormat":1},{"version":"a1bb9a53774db78ea94042f996663ccac2ba1a1f695dd3e9931ff8ee898cbd06","impliedFormat":1},{"version":"0875537e7be2600acd9e872204840dcfadcc1fe4092a08bd0172a1b766019513","impliedFormat":1},{"version":"4227776f77e27c7d441fd5b8777d16b527928a7b62a0ef86ab8b9c67014cb81c","impliedFormat":1},{"version":"fbf3b2da9b15b5636cbc84578e26ce32e09ddbbac273d1af0313134858ada13e","impliedFormat":1},{"version":"af6f476584c7f0cc7840d26bd53b8f2cb2d297fdfbbce545f054f6098c156760","impliedFormat":1},{"version":"e0dcee233f86aa9a287c8e5021568a9d141faf5f312f348742d77e0a3e57e57d","impliedFormat":1},{"version":"feb50e2e786d7ffebe305337c5fcfe0a8cb2e9eb86542eafffaaf765526075c3","impliedFormat":1},{"version":"154c7aa0bb4266ec1ba8cbc132a6d6f4f5a501c6f557e42fab1551f12d7aadb4","impliedFormat":1},{"version":"ff580bb5932bafb0e88770659100ebb12da80897ed6cc7ffbdf3687048e46555","impliedFormat":1},{"version":"ef2c75a07f97f5214fb2da7bf59bbe82cbaeb6b9cc081e39b674aed5ebdf7905","impliedFormat":1},{"version":"d0c05fadcba345577656a05bf79d4b39a1f00acf76f22c8e4cf18ff30467750e","impliedFormat":1},{"version":"d0c05fadcba345577656a05bf79d4b39a1f00acf76f22c8e4cf18ff30467750e","impliedFormat":1},{"version":"7014093354b80dd4a938ea58d26de184454c4a08bd0500ae00e80eb9a4c19739","impliedFormat":1},{"version":"d06d271d2c714876d2e99a3e91426ed486ef86e92a46d7bd6183bd7849495162","impliedFormat":1},{"version":"da0fb569b713681bfa283495f9f53de3da5a0934fd1794baa99d83686f0eb243","impliedFormat":1},{"version":"1af351fa79e3f56d6ad665ffcd9c19e13d66a76e6d87e1889047729411c34105","impliedFormat":1},{"version":"97b738457d2e1311435022a93b7fa0105d54d3cab2a9557da6df6c3578b9cbdb","impliedFormat":1},{"version":"4cd82c54df6351d625a16e533463ed589155ca392257d5d5d29908be9f6c6ab0","impliedFormat":1},{"version":"c1a3b064d216c0d2503265a68444cd07638b9894575ebcd28fb3ed87ef401641","impliedFormat":1},{"version":"11ddb81d72d7c1e9b70bdec8d887f5d6737c78448477f34b0e66b9d38c5fe960","impliedFormat":1},{"version":"7f2db8b69950287573e65133460d6d0c55afcf99d415f18b00024bd5f55c4941","impliedFormat":1},{"version":"f279cd82f0d7a8c257e9750beafdd375085419733539e6d5ede1ab242de8957f","impliedFormat":1},{"version":"3bd004b8e866ef11ced618495781fd2c936a2a5989927137bdebb3e4755741fd","impliedFormat":1},{"version":"6d34100e5393cbee1869db0f370436d583045f3120c85c7c20bf52377ab6d548","impliedFormat":1},{"version":"92d7ba36531ea86b2be88729546129e1a1d08e571d9d389b859f0867cf26432a","impliedFormat":1},{"version":"f3a6050138891f2cdfdeacf7f0da8da64afc3f2fc834668daf4c0b53425876fb","impliedFormat":1},{"version":"9f260829b83fa9bce26e1a5d3cbb87eef87d8b3db3e298e4ea411a4a0e54f1f5","impliedFormat":1},{"version":"1c23a5cd8c1e82ded17793c8610ca7743344600290cedaf6b387d3518226455b","impliedFormat":1},{"version":"152d05b7e36aac1557821d5e60905bff014fcfe9750911b9cf9c2945cac3df8d","impliedFormat":1},{"version":"6670f4292fc616f2e38c425a5d65d92afc9fb1de51ea391825fa6d173315299a","impliedFormat":1},{"version":"c61a39a1539862fbd48212ba355b5b7f8fe879117fd57db0086a5cbb6acc6285","impliedFormat":1},{"version":"ae9d88113c68896d77b2b51a9912664633887943b465cd80c4153a38267bf70b","impliedFormat":1},{"version":"5d2c41dad1cb904e5f7ae24b796148a08c28ce2d848146d1cdf3a3a8278e35b8","impliedFormat":1},{"version":"b900fa4a5ff019d04e6b779aef9275a26b05794cf060e7d663c0ba7365c2f8db","impliedFormat":1},{"version":"5b7afd1734a1afc68b97cc4649e0eb8d8e45ee3b0ccb4b6f0060592070d05b6d","impliedFormat":1},{"version":"0c83c39f23d669bcb3446ce179a3ba70942b95ef53f7ba4ce497468714b38b8c","impliedFormat":1},{"version":"e9113e322bd102340f125a23a26d1ccf412f55390ae2d6f8170e2e602e2ae61b","impliedFormat":1},{"version":"456308ee785a3c069ec42836d58681fe5897d7a4552576311dd0c34923c883be","impliedFormat":1},{"version":"31e7a65d3e792f2d79a15b60b659806151d6b78eb49cb5fc716c1e338eb819b5","impliedFormat":1},{"version":"a9902721e542fd2f4f58490f228efdad02ebafa732f61e27bb322dbd3c3a5add","impliedFormat":1},{"version":"6e846536a0747aa1e5db6eafec2b3f80f589df21eea932c87297b03e9979d4bf","impliedFormat":1},{"version":"8bd87605aca1cb62caeca63fa442590d4fc14173aa27316ff522f1db984c5d37","impliedFormat":1},{"version":"0ecce2ac996dc29c06ed8e455e9b5c4c7535c177dbfa6137532770d44f975953","impliedFormat":1},{"version":"e2ddd4c484b5c1a1072540b5378b8f8dd8a456b4f2fdd577b0e4a359a09f1a5a","impliedFormat":1},{"version":"db335cb8d7e7390f1d6f2c4ca03f4d2adc7fc6a7537548821948394482e60304","impliedFormat":1},{"version":"b8beb2b272c7b4ee9da75c23065126b8c89d764f8edc3406a8578e6e5b4583b2","impliedFormat":1},{"version":"71e50d029b1100c9f91801f39fd02d32e7e2d63c7961ecb53ed17548d73c150f","impliedFormat":1},{"version":"9af2013e20b53a733dd8052aa05d430d8c7e0c0a5d821a4f4be2d4b672ec22ae","impliedFormat":1},{"version":"8fbe1bc4365212d10f188649f6f8cc17afb5bb3ff12336eb1a9bd5f966d23ad2","impliedFormat":1},{"version":"8fbe1bc4365212d10f188649f6f8cc17afb5bb3ff12336eb1a9bd5f966d23ad2","impliedFormat":1},{"version":"7c2ad9924e9d856fbefbe4ada292bfbf8ffa9b75c419934ad54c7480ef974255","impliedFormat":1},{"version":"7c2ad9924e9d856fbefbe4ada292bfbf8ffa9b75c419934ad54c7480ef974255","impliedFormat":1},{"version":"8033abdbffc86e6d598c589e440ab1e941c2edf53da8e18b84a2bef8769f0f31","impliedFormat":1},{"version":"e88eb1d18b59684cd8261aa4cdef847d739192e46eab8ea05de4e59038401a19","impliedFormat":1},{"version":"834c394b6fdac7cdfe925443170ecdc2c7336ba5323aa38a67aaaf0b3fd8c303","impliedFormat":1},{"version":"831124f3dd3968ebd5fac3ede3c087279acb5c287f808767c3478035b63d8870","impliedFormat":1},{"version":"21d06468c64dba97ef6ee1ccffb718408164b0685d1bff5e4aadd61fcc038655","impliedFormat":1},{"version":"967e26dd598db7de16c9e0533126e624da94bd6c883fd48fbccc92c86e1163c5","impliedFormat":1},{"version":"e2bb71f5110046586149930b330c56f2e1057df69602f8051e11475e9e0adcb0","impliedFormat":1},{"version":"54d718265b1257a8fa8ebf8abe89f899e9a7ae55c2bbeb3fbe93a9ee63c27c08","impliedFormat":1},{"version":"52d09b2ffcfe8a291d70dd6ec8c301e75aff365b891241e5df9943a5bd2cd579","impliedFormat":1},{"version":"c4c282bd73a1a8944112ec3501b7aed380a17a1e950955bb7e67f3ef2ae3eacd","impliedFormat":1},{"version":"b68bffb8ec0c31f104751b7783ea3fca54a27e5562dc6a36467a59af2b9f45d0","impliedFormat":1},{"version":"5f5befc12e7070c00db287c98ebff95b1978d57c94e5eb7f1dc2cdc4351a132a","impliedFormat":1},{"version":"a1fb885801e6a1b76618c7db3dd88d547d696c34b54afb37c6188fdc5c552495","impliedFormat":1},{"version":"d72c555ebec376d349d016576506f1dc171a136206fe75ef8ee36efe0671d5c3","impliedFormat":1},{"version":"e48eda19a17d77b15d627b032d2c82c16dbe7a8714ea7a136919c6fd187a87e9","impliedFormat":1},{"version":"64f38f3e656034d61f6617bff57f6fce983d33b96017a6b1d7c13f310f12a949","impliedFormat":1},{"version":"044028281a4a777b67073a9226b3a3a5f6720083bb7b7bab8b0eeafe70ccf569","impliedFormat":1},{"version":"0dac330041ba1c056fe7bacd7912de9aebec6e3926ff482195b848c4cef64f1c","impliedFormat":1},{"version":"302de1a362e9241903e4ebf78f09133bc064ee3c080a4eda399f6586644dab87","impliedFormat":1},{"version":"940851ac1f3de81e46ea0e643fc8f8401d0d8e7f37ea94c0301bb6d4d9c88b58","impliedFormat":1},{"version":"afab51b01220571ecff8e1cb07f1922d2f6007bfa9e79dc6d2d8eea21e808629","impliedFormat":1},{"version":"0a22b9a7f9417349f39e9b75fb1e1442a4545f4ed51835c554ac025c4230ac95","impliedFormat":1},{"version":"11b8a00dbb655b33666ed4718a504a8c2bf6e86a37573717529eb2c3c9b913ad","impliedFormat":1},{"version":"c4f529f3b69dfcec1eed08479d7aa2b5e82d4ab6665daa78ada044a4a36638c2","impliedFormat":1},{"version":"56fb9431fdb234f604d6429889d99e1fec1c9b74f69b1e42a9485399fd8e9c68","impliedFormat":1},{"version":"1abfd55d146ec3bfa839ccba089245660f30b685b4fdfd464d2e17e9372f3edc","impliedFormat":1},{"version":"5ea23729bee3c921c25cd99589c8df1f88768cfaf47d6d850556cf20ec5afca8","impliedFormat":1},{"version":"0def6b14343fb4659d86c60d8edb412094d176c9730dc8491ce4adabdbe6703a","impliedFormat":1},{"version":"7871d8a4808eab42ceb28bc7edefa2052da07c5c82124fb8e98e3b2c0b483d6c","impliedFormat":1},{"version":"f7e0da46977f2f044ec06fd0089d2537ff44ceb204f687800741547056b2752f","impliedFormat":1},{"version":"586e954d44d5c634998586b9d822f96310321ee971219416227fc4269ea1cdaf","impliedFormat":1},{"version":"33a7a07bc3b4c26441fa544f84403b1321579293d6950070e7daeee0ed0699d8","impliedFormat":1},{"version":"4d000e850d001c9e0616fd8e7cc6968d94171d41267c703bd413619f649bd12a","impliedFormat":1},{"version":"a2d30f0ed971676999c2c69f9f7178965ecbe5c891f6f05bc9cbcd9246eda025","impliedFormat":1},{"version":"f94f93ce2edf775e2eeb43bc62c755f65fb15a404c0507936cc4a64c2a9b2244","impliedFormat":1},{"version":"b4275488913e1befb217560d484ca3f3bf12903a46ade488f3947e0848003473","impliedFormat":1},{"version":"b173f8a2bd54cee0ae0d63a42ca59a2150dce59c828649fc6434178b0905bc05","impliedFormat":1},{"version":"613afe0af900bad8ecb48d9d9f97f47c0759aaebd7975aab74591f5fe30cf887","impliedFormat":1},{"version":"7c43dd250932457013546c3d0ed6270bfe4b9d2800c9a52ad32ece15fc834ef4","impliedFormat":1},{"version":"d0875863f16a9c18b75ef7eab23a1cf93c2c36677c9bb450307b1fa5b7521746","impliedFormat":1},{"version":"37154c245da711d32d653ad43888aac64c93d6f32a8392b0d4635d38dd852e57","impliedFormat":1},{"version":"9be1d0f32a53f6979f12bf7d2b6032e4c55e21fdfb0d03cb58ba7986001187c1","impliedFormat":1},{"version":"6575f516755b10eb5ff65a5c125ab993c2d328e31a9af8bb2de739b180f1dabc","impliedFormat":1},{"version":"5580c4cc99b4fc0485694e0c2ffc3eddfb32b29a9d64bba2ba4ad258f29866bc","impliedFormat":1},{"version":"3217967a9d3d1e4762a2680891978415ee527f9b8ee3325941f979a06f80cd7b","impliedFormat":1},{"version":"430c5818b89acea539e1006499ed5250475fdda473305828a4bb950ada68b8bd","impliedFormat":1},{"version":"a8e3230eab879c9e34f9b8adee0acec5e169ea6e6332bc3c7a0355a65fbf6317","impliedFormat":1},{"version":"62563289e50fd9b9cf4f8d5c8a4a3239b826add45cfb0c90445b94b8ca8a8e46","impliedFormat":1},{"version":"e1f6516caf86d48fd690663b0fd5df8cf3adf232b07be61b4d1c5ba706260a56","impliedFormat":1},{"version":"c5fd755dac77788acc74a11934f225711e49014dd749f1786b812e3e40864072","impliedFormat":1},{"version":"672ed5d0ebc1e6a76437a0b3726cb8c3f9dd8885d8a47f0789e99025cfb5480d","impliedFormat":1},{"version":"e15305776c9a6d9aac03f8e678008f9f1b9cb3828a8fc51e6529d94df35f5f54","impliedFormat":1},{"version":"4da18bcf08c7b05b5266b2e1a2ac67a3b8223d73c12ee94cfa8dd5adf5fdcd5e","impliedFormat":1},{"version":"a4e14c24595a343a04635aff2e39572e46ae1df9b948cc84554730a22f3fc7a3","impliedFormat":1},{"version":"0f604aef146af876c69714386156b8071cdb831cb380811ed6749f0b456026bd","impliedFormat":1},{"version":"4868c0fb6c030a7533deb8819c9351a1201b146a046b2b1f5e50a136e5e35667","impliedFormat":1},{"version":"8a1cfeb14ca88225a95d8638ee58f357fc97b803fe12d10c8b52d07387103ff1","impliedFormat":1},{"version":"fac0f34a32af6ff4d4e96cd425e8fefb0c65339c4cb24022b27eb5f13377531f","impliedFormat":1},{"version":"7ec5a106f7a6de5a44eac318bb47cdece896e37b69650dd9e394b18132281714","impliedFormat":1},{"version":"a015f74e916643f2fd9fa41829dea6d8a7bedbb740fe2e567a210f216ac4dcad","impliedFormat":1},{"version":"4dbabbde1b07ee303db99222ef778a6c2af8362bc5ce185996c4dc91cba6b197","impliedFormat":1},{"version":"0873baae7b37627c77a36f8ead0ab3eb950848023c9e8a60318f4de659e04d54","impliedFormat":1},{"version":"dc7d167f4582a21e20ac5979cb0a9f58a0541d468b406fd22c739b92cd9f5eec","impliedFormat":1},{"version":"edeec378c31a644e8fa29cfcb90f3434a20db6e13ae65df8298163163865186f","impliedFormat":1},{"version":"12300e3a7ca6c3a71773c5299e0bca92e2e116517ab335ab8e82837260a04db7","impliedFormat":1},{"version":"2e6128893be82a1cbe26798df48fcfb050d94c9879d0a9c2edece4be23f99d9f","impliedFormat":1},{"version":"2819f355f57307c7e5a4d89715156750712ea15badcb9fbf6844c9151282a2b8","impliedFormat":1},{"version":"4e433094ed847239c14ae88ca6ddaa6067cb36d3e95edd3626cec09e809abc3b","impliedFormat":1},{"version":"7c592f0856a59c78dbfa856c8c98ba082f4dafb9f9e8cdd4aac16c0b608aaacd","impliedFormat":1},{"version":"9fb90c7b900cee6a576f1a1d20b2ef0ed222d76370bc74c1de41ea090224d05d","impliedFormat":1},{"version":"c94cfa7c0933700be94c2e0da753c6d0cf60569e30d434c3d0df4a279df7a470","impliedFormat":1},{"version":"b208e4729b03a250bc017f1231a27776db6e5396104c4a5cfe40a8de4d3ab33e","impliedFormat":1},{"version":"b208e4729b03a250bc017f1231a27776db6e5396104c4a5cfe40a8de4d3ab33e","impliedFormat":1},{"version":"83624214a41f105a6dd1fef1e8ebfcd2780dd2841ce37b84d36d6ae304cba74e","impliedFormat":1},{"version":"bc63f711ce6d1745bb9737e55093128f8012d67a9735c958aaaf1945225c4f1d","impliedFormat":1},{"version":"951404d7300f1a479a7e70bca4469ea5f90807db9d3adc293b57742b3c692173","impliedFormat":1},{"version":"e93bba957a27b85afb83b2387e03a0d8b237c02c85209fde7d807c2496f20d41","impliedFormat":1},{"version":"4537c199f28f3cd75ab9d57b21858267c201e48a90009484ef37e9321b9c8dbb","impliedFormat":1},{"version":"faae84acef05342e6009f3fa68a2e58e538ef668c7173d0fc2eacac0ad56beef","impliedFormat":1},{"version":"7e19092d64b042f55f4d7b057629159a8167ee319d4cccc4b4bdd12d74018a6c","impliedFormat":1},{"version":"39196b72ec09bdc29508c8f29705ce8bd9787117863ca1bcf015a628bed0f031","impliedFormat":1},{"version":"3f727217522dabc9aee8e9b08fccf9d67f65a85f8231c0a8dbcc66cf4c4f3b8d","impliedFormat":1},{"version":"bbeb72612b2d3014ce99b3601313b2e1a1f5e3ce7fdcd8a4b68ff728e047ffcd","impliedFormat":1},{"version":"c89cc13bad706b67c7ca6fca7b0bb88c7c6fa3bd014732f8fc9faa7096a3fad8","impliedFormat":1},{"version":"2272a72f13a836d0d6290f88759078ec25c535ec664e5dabc33d3557c1587335","impliedFormat":1},{"version":"1074e128c62c48b5b1801d1a9aeebac6f34df7eafa66e876486fbb40a919f31a","impliedFormat":1},{"version":"87bba2e1de16d3acb02070b54f13af1cb8b7e082e02bdfe716cb9b167e99383b","impliedFormat":1},{"version":"a2e3a26679c100fb4621248defda6b5ce2da72943da9afefccaf8c24c912c1cb","impliedFormat":1},{"version":"3ee7668b22592cc98820c0cf48ad7de48c2ad99255addb4e7d735af455e80b47","impliedFormat":1},{"version":"643e9615c85c77bc5110f34c9b8d88bce6f27c54963f3724ab3051e403026d05","impliedFormat":1},{"version":"35c13baa8f1f22894c1599f1b2b509bdeb35f7d4da12619b838d79c6f72564bb","impliedFormat":1},{"version":"7d001913c9bf95dbdc0d4a14ffacf796dbc6405794938fc2658a79a363f43f65","impliedFormat":1},{"version":"9906fbdb7d8e18b0105f61569701a07c8aaa7ea0ef6dc63f8f9fbba7de8e044e","impliedFormat":1},{"version":"9906fbdb7d8e18b0105f61569701a07c8aaa7ea0ef6dc63f8f9fbba7de8e044e","impliedFormat":1},{"version":"6a0840f6ab3f97f9348098b3946941a7ca67beb47a6f2a75417376015bde3d62","impliedFormat":1},{"version":"24c75bd8d8ba4660a4026b89abc5457037ed709759ca1e9e26bd68c610817069","impliedFormat":1},{"version":"8cc6185d8186c7fefa97462c6dd9915df9a9542bd97f220b564b3400cdf3ad82","impliedFormat":1},{"version":"2cad19f3eae8e3a9176bf34b9cffa640d55a3c73b69c78b0b80808130d5120c6","impliedFormat":1},{"version":"a140d8799bc197466ac82feef5a8f1f074efc1bb5f02c514200269601279a6ff","impliedFormat":1},{"version":"48bda2797d1005604d21de42a41af85dfe7688391d28f02b90c90c06f6604781","impliedFormat":1},{"version":"1454f42954c53c719ae3f166a71c2a8c4fbc95ee8a5c9ddba3ec15b792054a3d","impliedFormat":1},{"version":"ae4890722031fcaa66eed85d5ce06f0fc795f21dedbe4c7c53f777c79caf01dd","impliedFormat":1},{"version":"1a6ff336c6c59fa7b44cf01dc0db00baa1592d7280be70932110fe173c3a3ed6","impliedFormat":1},{"version":"95fa82863f56a7b924814921beeab97aa064d9e2c6547eb87492a3495533be0f","impliedFormat":1},{"version":"248cdafd23df89eee20f1ef00daef4f508850cfcbad9db399b64cdb1c3530c06","impliedFormat":1},{"version":"936579eb15fe5cf878d90bddaf083a5dce9e8ca7d2222c2d96a2e55b8022e562","impliedFormat":1},{"version":"1bd19890e78429873f6eb45f6bd3b802743120c2464b717462ec4c9668ce7b89","impliedFormat":1},{"version":"756c0802bc098388018b4f245a15457083aee847ebcd89beb545d58ccbf29a9f","impliedFormat":1},{"version":"8e00226014fc83b74b47868bfac6919b2ca51e1dc612ea3f396a581ba7da8fdd","impliedFormat":1},{"version":"27930087468a6afd3d42fd75c37d8cc7df6a695f3182eb6230fcea02fce46635","impliedFormat":1},{"version":"b6d0a876f84484d9087e8eadde589e25b3f1975d32a11d188f6da0bc5dcf1d1d","impliedFormat":1},{"version":"5a282b327e397cf1637717c454d71f5dff2af2514d7f3766562bd51721d5eaab","impliedFormat":1},{"version":"fba971f62ec18b0de02357aba23b11c19aeb512eb525b9867f6cc2495d3a9403","impliedFormat":1},{"version":"69334948e4bc7c2b5516ed02225eaf645c6d97d1c636b1ef6b7c9cfc3d3df230","impliedFormat":1},{"version":"4231544515c7ce9251e34db9d0e3f74fc38365e635c8f246f2d8b39461093dea","impliedFormat":1},{"version":"963d469b265ce3069e9b91c6807b4132c1e1d214169cf1b43c26bfbcb829b666","impliedFormat":1},{"version":"387616651414051e1dd73daf82d6106bbaefcbad21867f43628bd7cbe498992f","impliedFormat":1},{"version":"f3b6f646291c8ddfc232209a44310df6b4f2c345c7a847107b1b8bbde3d0060a","impliedFormat":1},{"version":"8fbbfbd7d5617c6f6306ffb94a1d48ca6fa2e8108c759329830c63ff051320e1","impliedFormat":1},{"version":"9912be1b33a6dfc3e1aaa3ad5460ee63a71262713f1629a86c9858470f94967d","impliedFormat":1},{"version":"57c32282724655f62bff2f182ce90934d83dc7ed14b4ac3f17081873d49ec15b","impliedFormat":1},{"version":"fabb2dcbe4a45ca45247dece4f024b954e2e1aada1b6ba4297d7465fac5f7fb3","impliedFormat":1},{"version":"449fa612f2861c3db22e394d1ad33a9544fe725326e09ec1c72a4d9e0a85ccf1","impliedFormat":1},{"version":"5e80786f1a47a61be5afde06ebd2eae0d1f980a069d34cea2519f41e518b31e8","impliedFormat":1},{"version":"565fbcf5374afdcb53e1bf48a4dd72db5c201551ec1cdf408aab9943fec4f525","impliedFormat":1},{"version":"8334934b3c4b83da15be9025d15b61fdada52adfb6b3c81e24bf61e33e4a8f56","impliedFormat":1},{"version":"0bf7ddc236561ac7e5dcd04bcbb9ac34ea66d1e54542f349dc027c08de120504","impliedFormat":1},{"version":"329b4b6fb23f225306f6a64f0af065bc7d5858024b2b04f46b482d238abe01ef","impliedFormat":1},{"version":"c70a7411a384063543b9703d072d38cfec64c54d9bdcc0916a24fcb7945907c3","impliedFormat":1},{"version":"d74eccab1a21737b12e17a94bacff23954496ccad820ee1bd4769353825ea1f0","impliedFormat":1},{"version":"5a169268ac5488e3555a333964a538ce27a8702b91fffa7f2f900b67bf943352","impliedFormat":1},{"version":"85931e79bdd6b16953de2303cebbe16ba1d66375f302ffe6c85b1630c64d4751","impliedFormat":1},{"version":"ad9da00aa581dca2f09a6fec43f0d03eff7801c0c3496613d0eb1d752abf44d9","impliedFormat":1},{"version":"28ea9e12e665d059b80a8f5424e53aa0dd8af739da7f751cc885f30440b64a7f","impliedFormat":1},{"version":"cdc22634df9ab0cd1e1ab5a32e382d034bba97afd7c12db7862b9079e5e3c4c0","impliedFormat":1},{"version":"73940b704df78d02da631af2f5f253222821da6482c21cd96f64e90141b34d38","impliedFormat":1},{"version":"76e64c191fe381ecbbb91a3132eaf16b54e33144aee0e00728d4f8ba9d3be3c1","impliedFormat":1},{"version":"de49fed066a921f1897ca031e5a3d3c754663b9a877b01362cc08fb6a250a8b6","impliedFormat":1},{"version":"833b691a43b7b18f4251fdb305babad29234dd6c228cf5b931118301c922283d","impliedFormat":1},{"version":"a5f925f6ad83aa535869fb4174e7ef99c465e5c01939d2e393b6f8c0def6d95e","impliedFormat":1},{"version":"db80344e9c5463e4fb49c496b05e313b3ebcc1b9c24e9bcd97f3e34429530302","impliedFormat":1},{"version":"f69e0962918f4391e8e5e50a1b3eb1e3fd40f63ed082da8242b34dda16c519ba","impliedFormat":1},{"version":"012dcd1847240a35fd1de3132d11afab38bb63e99ce1ca2679c2376567f5ef74","impliedFormat":1},{"version":"c4e34c7b331584cd9018fb2d51d602d38cf9f2aeec0bad092b61dd10ff602bd5","impliedFormat":1},{"version":"06675fa918f0abfe5632adbfae821517a34af861cadab135d4240f0b0fd975a5","impliedFormat":1},{"version":"a4919817b89aadcc8fb7121d41c3924a30448d017454cb3d1e3570f8413f74a6","impliedFormat":1},{"version":"2a37bd0673e5f0b487f05880d143883abcbdc9682d0ed54d550eb44e775dab46","impliedFormat":1},{"version":"8ed0765cafa7e4b10224672c29056e8ee4a9936df65ba4ea3ffd841c47aa2393","impliedFormat":1},{"version":"a38694615d4482f8b6556f6b0915374bbf167c3e92e182ae909f5e1046ebbc97","impliedFormat":1},{"version":"a0ff175b270170dd3444ee37fdd71e824b934dcdae77583d4cdea674349f980e","impliedFormat":1},{"version":"99391c62be7c4a7dc23d4a94954973e5f1c1ca0c33fdd8f6bb75c1ddc7ffc3ad","impliedFormat":1},{"version":"ea58d165e86c3e2e27cf07e94175c60d1672810f873e344f7bc85ad4ebe00cef","impliedFormat":1},{"version":"85c8e99f8cd30d3a742c4c0fe5500db8561e0028b8153dc60c3d1e64ef2a507f","impliedFormat":1},{"version":"e272f75b77cffbfbb88ba377d7892d55e49f67378a8ffa7bddce1be53634ca3b","impliedFormat":1},{"version":"67448f432a710a322eac4b9a56fd8145d0033c65206e90fca834d9ed6601a978","impliedFormat":1},{"version":"7a319bad5a59153a92e455bebcfce1c8bc6e6e80f8e6cc3b20dd7465662c9c8e","impliedFormat":1},{"version":"2d7bed8ff2044b202f9bd6c35bf3bda6f8baad9e0f136a9c0f33523252de4388","impliedFormat":1},{"version":"308786774814d57fc58f04109b9300f663cf74bd251567a01dc4d77e04c1cdc1","impliedFormat":1},{"version":"68af14958b6a2faf118853f3ecb5c0dbee770bd1e0eb6c2ef54244b68cecf027","impliedFormat":1},{"version":"1255747e5c6808391a8300476bdb88924b13f32287270084ebd7649737b41a6e","impliedFormat":1},{"version":"37b6feaa304b392841b97c22617b43f9faa1d97a10a3c6d6160ca1ea599d53ce","impliedFormat":1},{"version":"79adb3a92d650c166699bb01a7b02316ea456acc4c0fd6d3a88cdd591f1849b0","impliedFormat":1},{"version":"0dc547b11ab9604c7a2a9ca7bf29521f4018a14605cc39838394b3d4b1fbaf6d","impliedFormat":1},{"version":"31fedd478a3a7f343ee5df78f1135363d004521d8edf88cd91b91d5b57d92319","impliedFormat":1},{"version":"88b7ed7312f01063f327c5d435224e137c6a2f9009175530e7f4b744c1e8957f","impliedFormat":1},{"version":"3cf0c7a66940943decbf30a670ab6077a44e9895e7aea48033110a5b58e86d64","impliedFormat":1},{"version":"11776f5fa09779862e18ff381e4c3cb14432dd188d30d9e347dfc6d0bda757a8","impliedFormat":1},{"version":"a7c12ec0d02212110795c86bd68131c3e771b1a3f4980000ec06753eb652a5c4","impliedFormat":1},{"version":"8d6b33e4d153c1cc264f6d1bb194010221907b83463ad2aaaa936653f18bfc49","impliedFormat":1},{"version":"4e0537c4cd42225517a5cdec0aea71fdaaacbf535c42050011f1b80eda596bbd","impliedFormat":1},{"version":"cf2ada4c8b0e9aa9277bfac0e9d08df0d3d5fb0c0714f931d6cac3a41369ee07","impliedFormat":1},{"version":"3bdbf003167e4dffbb41f00ddca82bb657544bc992ef307ed2c60c322f43e423","impliedFormat":1},{"version":"9d62d820685dfbed3d1da3c5d9707ae629eac65ee42eeae249e6444271a43f79","impliedFormat":1},{"version":"9fc1d71181edb6028002b0757a4de17f505fb538c8b86da2dabb2c58618e9495","impliedFormat":1},{"version":"895c35a7b8bdd940bda4d9c709acfc4dd72d302cc618ec2fd76ae2b8cd9fd534","impliedFormat":1},{"version":"e7eb43e86a2dfcb8a8158b2cc4eff93ff736cfec1f3bf776c2c8fb320b344730","impliedFormat":1},{"version":"7d2f0645903a36fe4f96d547a75ea14863955b8e08511734931bd76f5bbc6466","impliedFormat":1},{"version":"4d88daa298c032f09bc2453facf917d848fcd73b9814b55c7553c3bf0036ac3d","impliedFormat":1},{"version":"7e46cd381a3ac5dbb328d4630db9bf0d76aae653083fc351718efba4bd4bf3b3","impliedFormat":1},{"version":"23cca6a0c124bd1b5864a74b0b2a9ab12130594543593dc58180c5b1873a3d16","impliedFormat":1},{"version":"286c428c74606deaa69e10660c1654b9334842ef9579fbfbb9690c3a3fd3d8c5","impliedFormat":1},{"version":"e838976838d7aa954c3c586cd8efc7f8810ec44623a1de18d6c4f0e1bc58a2b6","impliedFormat":1},{"version":"fe7b3e4b7b62b6f3457f246aa5b26181da0c24dc5fc3a3b4f1e93f66c41d819f","impliedFormat":1},{"version":"ea15abd31f5884334fa04683b322618f1f4526a23f6f77839b446dbeee8eb9a1","impliedFormat":1},{"version":"e55b5d8322642dda29ae2dea9534464e4261cb8aa719fe8cec26ce2d70753db5","impliedFormat":1},{"version":"6074dbe82ec2c1325ecda241075fa8d814e6e5195a6c1f6315aa5a582f8eb4cf","impliedFormat":1},{"version":"c044c7f653a4aff233adfdee4c3d4e05da4fc071dfb6f8f32f5a8cd30e8aacaa","impliedFormat":1},{"version":"2f5f95be086b3c700fe1c0f1b20a5ff18a26a15ae9924b495231555a3bed7f05","impliedFormat":1},{"version":"fb4de4bc74a1997282181648fecd3ec5bb19d39cdb0ff3a4fb8ac134b2e03eb8","impliedFormat":1},{"version":"ada6919a8c3d26712dac8469dbe297980d97258fd7927aa4b4f68d8a0efeb20b","impliedFormat":1},{"version":"b1f2367947cf2dfba2cd6cc0d1ed3c49e55059f4ee0e648590daafecd1b49e63","impliedFormat":1},{"version":"e7aee498fe1438535033fdfe126a12f06874e3608cd77d8710ff9542ebb7ba60","impliedFormat":1},{"version":"0017e3bbd2f7b139daf97c0f27bef8531a6f44572ba9387f5451e417b62ecd55","impliedFormat":1},{"version":"91dda5226ec658c3c71dfb8689231f6bfea4d559d08f27237d0d02f4eb3e4aa6","impliedFormat":1},{"version":"e1e2ee6fc32ea03e5e8b419d430ea236b20f22d393ba01cc9021b157727e1c59","impliedFormat":1},{"version":"8adfd735c00b78c24933596cd64c44072689ac113001445a7c35727cb9717f49","impliedFormat":1},{"version":"999bfcbaae834b8d00121c28de9448c72f24767d3562fc388751a5574c88bd45","impliedFormat":1},{"version":"110a52db87a91246f9097f284329ad1eedd88ff8c34d3260dcb7f4f731955761","impliedFormat":1},{"version":"8929df495a85b4cc158d584946f6a83bf9284572b428bb2147cc1b1f30ee5881","impliedFormat":1},{"version":"22c869750c8452121f92a511ef00898cc02d941109e159a0393a1346348c144a","impliedFormat":1},{"version":"d96e2ff73f69bc352844885f264d1dfc1289b4840d1719057f711afac357d13e","impliedFormat":1},{"version":"a01928da03f46c245f2173ced91efd9a2b3f04a1a34a46bc242442083babaab9","impliedFormat":1},{"version":"c175f6dd4abdfac371b1a0c35ebeaf01c745dffbf3561b3a5ecc968e755a718b","impliedFormat":1},{"version":"d3531db68a46747aee3fa41531926e6c43435b59cd79ccdbcb1697b619726e47","impliedFormat":1},{"version":"c1771980c6bcd097876fe8b78a787e28163008e3d6d46885e9506483ac6b9226","impliedFormat":1},{"version":"8c2cc0d0b9b8650ef75f186f6c3aeeb3c18695e3cd3d0342cf8ef1d6aea27997","impliedFormat":1},{"version":"0a9bcf65e6abc0497fffcb66be835e066533e5623e32262b7620f1091b98776b","impliedFormat":1},{"version":"235a1b88a060bd56a1fc38777e95b5dda9c68ecb42507960ec6999e8a2d159cc","impliedFormat":1},{"version":"dde6b3b63eb35c0d4e7cc8d59a126959a50651855fd753feceab3bbad1e8000a","impliedFormat":1},{"version":"1f80185133b25e1020cc883e6eeadd44abb67780175dc2e21c603b8062a86681","impliedFormat":1},{"version":"f4abdeb3e97536bc85f5a0b1cced295722d6f3fd0ef1dd59762fe8a0d194f602","impliedFormat":1},{"version":"9de5968f7244f12c0f75a105a79813539657df96fb33ea1dafa8d9c573a5001a","impliedFormat":1},{"version":"87ab1102c5f7fe3cffbbe00b9690694cba911699115f29a1e067052bb898155d","impliedFormat":1},{"version":"a5841bf09a0e29fdde1c93b97e9a411ba7c7f9608f0794cbb7cf30c6dcd84000","impliedFormat":1},{"version":"e9282e83efd5ab0937b318b751baac2690fc3a79634e7c034f6c7c4865b635b4","impliedFormat":1},{"version":"7469203511675b1cfb8c377df00c6691f2666afb1a30c0568146a332e3188cb3","impliedFormat":1},{"version":"86854a16385679c4451c12f00774d76e719d083333f474970de51b1fd4aeaa9a","impliedFormat":1},{"version":"eb948bd45504f08e641467880383a9d033221c92d5e5f9057a952bbb688af0f2","impliedFormat":1},{"version":"8ad3462b51ab1a76a049b9161e2343a56a903235a87a7b6fb7ed5df6fc3a7482","impliedFormat":1},{"version":"c5e3f5a8e311c1be603fca2ab0af315bb27b02e53cd42edc81c349ffb7471c7e","impliedFormat":1},{"version":"0785979b4c5059cde6095760bc402d936837cbdeaa2ce891abe42ebcc1be5141","impliedFormat":1},{"version":"224881bef60ae5cd6bcc05b56d7790e057f3f9d9eacf0ecd1b1fc6f02088df70","impliedFormat":1},{"version":"3d336a7e01d9326604b97a23d5461d48b87a6acf129616465e4de829344f3d88","impliedFormat":1},{"version":"27ae5474c2c9b8a160c2179f2ec89d9d7694f073bdfc7d50b32e961ef4464bf0","impliedFormat":1},{"version":"e5772c3a61ac515bdcbb21d8e7db7982327bca088484bf0efdc12d9e114ec4c4","impliedFormat":1},{"version":"37d515e173e580693d0fdb023035c8fb1a95259671af936ea0922397494999f1","impliedFormat":1},{"version":"9b75d00f49e437827beeec0ecd652f0e1f8923ff101c33a0643ce6bed7c71ce1","impliedFormat":1},{"version":"bca71e6fb60fb9b72072a65039a51039ac67ea28fd8ce9ffd3144b074f42e067","impliedFormat":1},{"version":"d9b3329d515ac9c8f3760557a44cbca614ad68ad6cf03995af643438fa6b1faa","impliedFormat":1},{"version":"66492516a8932a548f468705a0063189a406b772317f347e70b92658d891a48d","impliedFormat":1},{"version":"20ecc73297ec37a688d805463c5e9d2e9f107bf6b9a1360d1c44a2b365c0657b","impliedFormat":1},{"version":"8e5805f4aab86c828b7fa15be3820c795c67b26e1a451608a27f3e1a797d2bf0","impliedFormat":1},{"version":"bb841b0b3c3980f91594de12fdc4939bb47f954e501bd8e495b51a1237f269d6","impliedFormat":1},{"version":"c40a182c4231696bd4ea7ed0ce5782fc3d920697866a2d4049cf48a2823195cc","impliedFormat":1},{"version":"c2f1079984820437380eba543febfb3d77e533382cbc8c691e8ec7216c1632ae","impliedFormat":1},{"version":"8737160dbb0d29b3a8ea25529b8eca781885345adb5295aa777b2f0c79f4a43f","impliedFormat":1},{"version":"78c5ee6b2e6838b6cbda03917276dc239c4735761696bf279cea8fc6f57ab9b7","impliedFormat":1},{"version":"11f3e363dd67c504e7ac9c720e0ddee8eebca10212effe75558266b304200954","impliedFormat":1},{"version":"ca53a918dbe8b860e60fec27608a83d6d1db2a460ad13f2ffc583b6628be4c5c","impliedFormat":1},{"version":"b278ba14ce1ea93dd643cd5ad4e49269945e7faf344840ecdf3e5843432dc385","impliedFormat":1},{"version":"f590aedb4ab4a8fa99d5a20d3fce122f71ceb6a6ba42a5703ea57873e0b32b19","impliedFormat":1},{"version":"1b94fcec898a08ad0b7431b4b86742d1a68440fa4bc1cd51c0da5d1faaf8fda4","impliedFormat":1},{"version":"a6ca409cb4a4fb0921805038d02a29c7e6f914913de74ab7dc02604e744820f7","impliedFormat":1},{"version":"9e938bdb31700c1329362e2246192b3cd2fac25a688a2d9e7811d7a65b57cd48","impliedFormat":1},{"version":"22ab05103d6c1b0c7e6fd0d35d0b9561f2931614c67c91ba55e2d60d741af1aa","impliedFormat":1},{"version":"aeebcee8599e95eb96cf15e1b0046024354cc32045f7e6ec03a74dcb235097ec","impliedFormat":1},{"version":"6813230ae8fba431d73a653d3de3ed2dcf3a4b2e965ca529a1d7fefdfd2bfc05","impliedFormat":1},{"version":"2111a7f02e31dd161d7c62537a24ddcbd17b8a8de7a88436cb55cd237a1098b2","impliedFormat":1},{"version":"dcac554319421fbc60da5f4401c4b4849ec0c92260e33a812cd8265a28b66a50","impliedFormat":1},{"version":"69e79a58498dbd57c42bc70c6e6096b782f4c53430e1dc329326da37a83f534d","impliedFormat":1},{"version":"6f327fc6d6ffcf68338708b36a8a2516090e8518542e20bb7217e2227842c851","impliedFormat":1},{"version":"5d770e4cc5df14482c7561e05b953865c2fdd5375c01d9d31e944b911308b13a","impliedFormat":1},{"version":"80ad25f193466f8945f41e0e97b012e1dafe1bd31b98f2d5c6c69a5a97504c75","impliedFormat":1},{"version":"30e75a9da9cd1ff426edcf88a73c6932e0ef26f8cbe61eed608e64e2ec511b6c","impliedFormat":1},{"version":"9ee91f8325ece4840e74d01b0f0e24a4c9b9ec90eeca698a6884b73c0151aa11","impliedFormat":1},{"version":"7c3d6e13ac7868d6ff1641406e535fde89ebef163f0c1237c5be21e705ed4a92","impliedFormat":1},{"version":"13f2f82a4570688610db179b0d178f1a038b17403b3a8c80eaa89dbdc74ddfd6","impliedFormat":1},{"version":"f805bae240625c8af6d84ac0b9e3cf43c5a3574c632e48a990bcec6de75234fb","impliedFormat":1},{"version":"fa3ce6af18df2e1d3adca877a3fe814393917b2f59452a405028d3c008726393","impliedFormat":1},{"version":"274b8ce7763b1a086a8821b68a82587f2cb1e08020920ae9ec8e28db0a88cd24","impliedFormat":1},{"version":"ea5e168745ac57b4ee29d953a42dc8252d3644ad3b6dab9d2f0c556f93ce05b4","impliedFormat":1},{"version":"830020b6fe24d742c1c3951e09b8b10401a0e753b5e659a3cbdea7f1348daeac","impliedFormat":1},{"version":"b1f68144e6659b378f0e02218f3bd8dfa71311c2e27814ab176365ed104d445a","impliedFormat":1},{"version":"a7a375e4436286bc6e68ce61d680ffeb431dc87f951f6c175547308d24d9d7ab","impliedFormat":1},{"version":"e41845dbc0909b2f555e7bcb1ebc55321982c446d58264485ca87e71bf7704a8","impliedFormat":1},{"version":"546291fd95c3a93e1fc0acd24350c95430d842898fc838d8df9ba40fdc653d6a","impliedFormat":1},{"version":"a6e898c90498c82f5d4fd59740cb6eb64412b39e12ffeca57851c44fa7700ed4","impliedFormat":1},{"version":"c8fb0d7a81dac8e68673279a3879bee6059bf667941694de802c06695f3a62a9","impliedFormat":1},{"version":"0a0a0bf13b17a7418578abea1ddb82bf83406f6e5e24f4f74b4ffbab9582321f","impliedFormat":1},{"version":"c4ea3ac40fbbd06739e8b681c45a4d40eb291c46407c04d17a375c4f4b99d72c","impliedFormat":1},{"version":"0f65b5f6688a530d965a8822609e3927e69e17d053c875c8b2ff2aecc3cd3bf6","impliedFormat":1},{"version":"443e39ba1fa1206345a8b5d0c41decfe703b7cdab02c52b220d1d3d8d675be6f","impliedFormat":1},{"version":"eaf7a238913b3f959db67fe7b3ea76cd1f2eedc5120c3ba45af8c76c5a3b70ad","impliedFormat":1},{"version":"8638625d1375bbb588f97a830684980b7b103d953c28efffa01bd5b1b5f775d2","impliedFormat":1},{"version":"ee77e7073de8ddc79acf0a3e8c1a1c4f6c3d11164e19eb725fa353ce936a93b0","impliedFormat":1},{"version":"ac39c31661d41f20ca8ef9c831c6962dc8bccbfca8ad4793325637c6f69207a3","impliedFormat":1},{"version":"80d98332b76035499ccce75a1526adcf4a9d455219f33f4b5a2e074e18f343fe","impliedFormat":1},{"version":"0490b6e27352ca7187944d738400e1e0ccb8ad8cc2fb6a939980cec527f4a3f9","impliedFormat":1},{"version":"7759aad02ab8c1499f2b689b9df97c08a33da2cb5001fbf6aed790aa41606f48","impliedFormat":1},{"version":"cb3c2b54a3eb8364f9078cfbe5a3340fa582b14965266c84336ab83fa933f3c7","impliedFormat":1},{"version":"7bc5668328a4a22c3824974628d76957332e653f42928354e5ac95f4cd00664d","impliedFormat":1},{"version":"b1905e68299346cc9ea9d156efb298d85cdb31a74cef5dbb39fda0ba677d8cfc","impliedFormat":1},{"version":"3ab80817857677b976b89c91cd700738fc623f5d0c800c5e1d08f21ac2a61f2a","impliedFormat":1},{"version":"cab9fb386ad8f6b439d1e125653e9113f82646712d5ba5b1b9fd1424aa31650c","impliedFormat":1},{"version":"20af956da2baefb99392218a474114007f8f6763f235ae7c6aae129e7d009cb6","impliedFormat":1},{"version":"6bfc9175ea3ade8c3dce6796456f106eb6ddc6ac446c41a71534a4cdce92777a","impliedFormat":1},{"version":"c8290d0b597260fd0e55016690b70823501170e8db01991785a43d7e1e18435f","impliedFormat":1},{"version":"002dfb1c48a9aa8de9d2cbe4d0b74edd85b9e0c1b77c865dcfcacd734c47dd40","impliedFormat":1},{"version":"17638e7a71f068c258a1502bd2c62cd6562e773c9c8649be283d924dc5d3bada","impliedFormat":1},{"version":"4b5e02a4d0b8f5ab0e81927c23b3533778000d6f8dfe0c2d23f93b55f0dcf62e","impliedFormat":1},{"version":"7bcdcafce502819733dc4e9fbbd97b2e392c29ae058bd44273941966314e46b1","impliedFormat":1},{"version":"39fefe9a886121c86979946858e5d28e801245c58f64f2ae4b79c01ffe858664","impliedFormat":1},{"version":"e68ec97e9e9340128260e57ef7d0d876a6b42d8873bfa1500ddead2bef28c71a","impliedFormat":1},{"version":"b944068d6efd24f3e064d341c63161297dc7a6ebe71fd033144891370b664e6d","impliedFormat":1},{"version":"9aee6c3a933af38de188f46937bdc5f875e10b016136c4709a3df6a8ce7ce01d","impliedFormat":1},{"version":"c0f4cd570839560ba29091ce66e35147908526f429fcc1a4f7c895a79bbbc902","impliedFormat":1},{"version":"3d44d824b1d25e86fb24a1be0c2b4d102b14740e8f10d9f3a320a4c863d0acad","impliedFormat":1},{"version":"f80511b23e419a4ba794d3c5dadea7f17c86934fa7a9ac118adc71b01ad290e3","impliedFormat":1},{"version":"633eabeec387c19b9ad140a1254448928804887581e2f0460f991edb2b37f231","impliedFormat":1},{"version":"f7083bbe258f85d7b7b8524dd12e0c3ee8af56a43e72111c568c9912453173a6","impliedFormat":1},{"version":"067a32d6f333784d2aff45019e36d0fc96fff17931bb2813b9108f6d54a6f247","impliedFormat":1},{"version":"0c85a6e84e5e646a3e473d18f7cd8b3373b30d3b3080394faee8997ad50c0457","impliedFormat":1},{"version":"f554099b0cfd1002cbacf24969437fabec98d717756344734fbae48fb454b799","impliedFormat":1},{"version":"1c39be289d87da293d21110f82a31139d5c6030e7a738bdf6eb835b304664fdd","impliedFormat":1},{"version":"5e9da3344309ac5aa7b64276ea17820de87695e533c177f690a66d9219f78a1e","impliedFormat":1},{"version":"1d4258f658eda95ee39cd978a00299d8161c4fef8e3ceb9d5221dac0d7798242","impliedFormat":1},{"version":"7df3bac8f280e1a3366ecf6e7688b7f9bbc1a652eb6ad8c62c3690cc444932e3","impliedFormat":1},{"version":"816c71bf50425c02608c516df18dfcb2ed0fca6baef0dbb30931c4b93fb6ab28","impliedFormat":1},{"version":"a32e227cdf4c5338506e23f71d5464e892416ef6f936bafa911000f98b4f6285","impliedFormat":1},{"version":"215474b938cc87665c20fe984755e5d6857374627953428c783d0456149c4bda","impliedFormat":1},{"version":"6b4915d3c74438a424e04cd4645b13b8b74733d6da8e9403f90e2c2775501f49","impliedFormat":1},{"version":"780c26fecbc481a3ef0009349147859b8bd22df6947990d4563626a38b9598b8","impliedFormat":1},{"version":"41a87a15fdf586ff0815281cccfb87c5f8a47d0d5913eed6a3504dc28e60d588","impliedFormat":1},{"version":"0973d91f2e6c5e62a642685913f03ab9cb314f7090db789f2ed22c3df2117273","impliedFormat":1},{"version":"082b8f847d1e765685159f8fe4e7812850c30ab9c6bd59d3b032c2c8be172e29","impliedFormat":1},{"version":"63033aacc38308d6a07919ef6d5a2a62073f2c4eb9cd84d535cdb7a0ab986278","impliedFormat":1},{"version":"f30f24d34853a57aed37ad873cbabf07b93aff2d29a0dd2466649127f2a905ff","impliedFormat":1},{"version":"1828d9ea4868ea824046076bde3adfd5325d30c4749835379a731b74e1388c2a","impliedFormat":1},{"version":"4ac7ee4f70260e796b7a58e8ea394df1eaa932cdaf778aa54ef412d9b17fe51a","impliedFormat":1},{"version":"9ddbe84084a2b5a20dd14ca2c78b5a1f86a328662b11d506b9f22963415e7e8d","impliedFormat":1},{"version":"871e5cd964fafda0cd5736e757ba6f2465fd0f08b9ae27b08d0913ea9b18bea1","impliedFormat":1},{"version":"95b61511b685d6510b15c6f2f200d436161d462d768a7d61082bfba4a6b21f24","impliedFormat":1},{"version":"3a0f071c1c982b7a7e5f9aaea73791665b865f830b1ea7be795bc0d1fb11a65e","impliedFormat":1},{"version":"6fcdac5e4f572c04b1b9ff5d4dace84e7b0dcccf3d12f4f08d296db34c2c6ea7","impliedFormat":1},{"version":"04381d40188f648371f9583e3f72a466e36e940bd03c21e0fcf96c59170032f8","impliedFormat":1},{"version":"5b249815b2ab6fdfe06b99dc1b2a939065d6c08c6acf83f2f51983a2deabebce","impliedFormat":1},{"version":"93333bd511c70dc88cc8a458ee781b48d72f468a755fd2090d73f6998197d6d4","impliedFormat":1},{"version":"1f64a238917b7e245930c4d32d708703dcbd8997487c726fcbadaa706ebd45dc","impliedFormat":1},{"version":"17d463fd5e7535eecc4f4a8fd65f7b25b820959e918d1b7478178115b4878de0","impliedFormat":1},{"version":"10d5b512f0eeab3e815a58758d40abe1979b420b463f69e8acccbb8b8d6ef376","impliedFormat":1},{"version":"e3c6af799b71db2de29cf7513ec58d179af51c7aef539968b057b43f5830da06","impliedFormat":1},{"version":"fbd151883aa8bb8c7ea9c5d0a323662662e026419e335a0c3bd53772bd767ec5","impliedFormat":1},{"version":"7b55d29011568662da4e570f3a87f61b8238024bc82f5c14ae7a7d977dbd42b6","impliedFormat":1},{"version":"1a693131491bf438a4b2f5303f4c5e1761973ca20b224e5e9dcd4db77c45f09b","impliedFormat":1},{"version":"09181ba5e7efec5094c82be1eb7914a8fc81780d7e77f365812182307745d94f","impliedFormat":1},{"version":"fb5a59f40321ec0c04a23faa9cf0a0640e8b5de7f91408fb2ecaaec34d6b9caf","impliedFormat":1},{"version":"0e2578d08d1c0139ba788d05ef1a62aa50373e0540fd1cad3b1c0a0c13107362","impliedFormat":1},{"version":"65f22fbb80df4ffdd06b9616ec27887d25b30fd346d971ced3ab6e35d459e201","impliedFormat":1},{"version":"adf56fbfbd48d96ff2525dae160ad28bcb304d2145d23c19f7c5ba0d28d1c0cf","impliedFormat":1},{"version":"e972d127886b4ba51a40ef3fa3864f744645a7eaeb4452cb23a4895ccde4943e","impliedFormat":1},{"version":"5af6ea9946b587557f4d164a2c937bb3b383211fef5d5fd33980dc5b91d31927","impliedFormat":1},{"version":"bffa47537197a5462836b3bb95f567236fa144752f4b09c9fa53b2bf0ac4e39a","impliedFormat":1},{"version":"76e485bb46a79126e76c8c40487497f5831c5faa8d990a31182ad5bf9487409c","impliedFormat":1},{"version":"34c367f253d9f9f247a4d0af9c3cfcfaabb900e24db79917704cd2d48375d74c","impliedFormat":1},{"version":"1b7b16cceca67082cd6f10eeaf1845514def524c2bc293498ba491009b678df3","impliedFormat":1},{"version":"81ad399f8c6e85270b05682461ea97e3c3138f7233d81ddbe4010b09e485fce0","impliedFormat":1},{"version":"8baaf66fecb2a385e480f785a8509ac3723c1061ca3d038b80828e672891cccf","impliedFormat":1},{"version":"6ed1f646454dff5d7e5ce7bc5e9234d4e2b956a7573ef0d9b664412e0d82b83e","impliedFormat":1},{"version":"6777b3a04a9ff554b3e20c4cb106b8eb974caad374a3d2651d138f7166202f59","impliedFormat":1},{"version":"cc2a85161dab1f8b55134792706ecf2cf2813ad248048e6495f72e74ecb2462c","impliedFormat":1},{"version":"c994de814eca4580bfad6aeec3cbe0d5d910ae7a455ff2823b2d6dce1bbb1b46","impliedFormat":1},{"version":"a8fdd65c83f0a8bdfe393cf30b7596968ba2b6db83236332649817810cc095b6","impliedFormat":1},{"version":"2cc71c110752712ff13cea7fb5d9af9f5b8cfd6c1b299533eeaf200d870c25db","impliedFormat":1},{"version":"07047dd47ed22aec9867d241eed00bccb19a4de4a9e309c2d4c1efb03152722f","impliedFormat":1},{"version":"ce8f3cd9fd2507d87d944d8cdb2ba970359ea74821798eee65fd20e76877d204","impliedFormat":1},{"version":"5e63289e02fb09d73791ae06e9a36bf8e9b8b7471485f6169a2103cb57272803","impliedFormat":1},{"version":"16496edeb3f8f0358f2a9460202d7b841488b7b8f2049a294afcba8b1fce98f7","impliedFormat":1},{"version":"5f4931a81fac0f2f5b99f97936eb7a93e6286367b0991957ccd2aa0a86ce67e8","impliedFormat":1},{"version":"0c81c0048b48ba7b579b09ea739848f11582a6002f00c66fde4920c436754511","impliedFormat":1},{"version":"2a9efc08880e301d05e31f876eb43feb4f96fa409ec91cd0f454afddbedade99","impliedFormat":1},{"version":"8b84db0f190e26aeed913f2b6f7e6ec43fb7aeec40bf7447404db696bb10a1aa","impliedFormat":1},{"version":"3faa4463234d22b90d546925c128ad8e02b614227fb4bceb491f4169426a6496","impliedFormat":1},{"version":"83dc14a31138985c30d2b8bdf6b2510f17d9c1cd567f7aadd4cbfd793bd320b8","impliedFormat":1},{"version":"4c21526acf3a205b96962c5e0dc8fa73adbce05dd66a5b3960e71527f0fb8022","impliedFormat":1},{"version":"8de35ab4fcd11681a8a7dae4c4c25a1c98e9f66fbd597998ca3cea58012801a8","impliedFormat":1},{"version":"40a50581f3fa685fda5bbd869f6951272e64ccb973a07d75a6babf5ad8a7ec51","impliedFormat":1},{"version":"5575fd41771e3ff65a19744105d7fed575d45f9a570a64e3f1357fe47180e2a2","impliedFormat":1},{"version":"ea94b0150a7529c409871f6143436ead5939187d0c4ec1c15e0363468c1025cc","impliedFormat":1},{"version":"b8deddcf64481b14aa88489617e5708fcb64d4f64db914f10abbd755c8deb548","impliedFormat":1},{"version":"e2e932518d27e7c23070a8bbd6f367102a00107b7efdd4101c9906ac2c52c3f3","impliedFormat":1},{"version":"1a1a8889de2d1c898d4e786b8edf97a33b8778c2bb81f79bcf8b9446b01663dd","impliedFormat":1},{"version":"bb66806363baa6551bd61dd79941a3f620f64d4166148be8c708bf6f998c980b","impliedFormat":1},{"version":"23b58237fc8fbbcb111e7eb10e487303f5614e0e8715ec2a90d2f3a21fd1b1c0","impliedFormat":1},{"version":"c63bb5b72efbb8557fb731dc72705f1470284093652eca986621c392d6d273ab","impliedFormat":1},{"version":"9495b9e35a57c9bfec88bfb56d3d5995d32b681317449ad2f7d9f6fc72877fd0","impliedFormat":1},{"version":"8974fe4b0f39020e105e3f70ab8375a179896410c0b55ca87c6671e84dec6887","impliedFormat":1},{"version":"7f76d6eef38a5e8c7e59c7620b4b99205905f855f7481cb36a18b4fdef58926d","impliedFormat":1},{"version":"a74437aba4dd5f607ea08d9988146cee831b05e2d62942f85a04d5ad89d1a57a","impliedFormat":1},{"version":"65faea365a560d6cadac8dbf33953474ea5e1ef20ee3d8ff71f016b8d1d8eb7c","impliedFormat":1},{"version":"1d30c65c095214469a2cfa1fd40e881f8943d20352a5933aa1ed96e53118ca7e","impliedFormat":1},{"version":"342e05e460b6d55bfbbe2cf832a169d9987162535b4127c9f21eaf9b4d06578b","impliedFormat":1},{"version":"8bfced5b1cd8441ba225c7cbb2a85557f1cc49449051f0f71843bbb34399bbea","impliedFormat":1},{"version":"9388132f0cb90e5f0a44a5255f4293b384c6a79b0c9206249b3bcf49ff988659","impliedFormat":1},{"version":"a7e8f748de2465278f4698fe8656dd1891e49f9f81e719d6fc3eaf53b4df87ce","impliedFormat":1},{"version":"1ef1dcd20772be36891fd4038ad11c8e644fe91df42e4ccdbc5a5a4d0cfddf13","impliedFormat":1},{"version":"3e77ee3d425a8d762c12bb85fe879d7bc93a0a7ea2030f104653c631807c5b2e","impliedFormat":1},{"version":"e76004b4d4ce5ad970862190c3ef3ab96e8c4db211b0e680e55a61950183ff16","impliedFormat":1},{"version":"b959e66e49bfb7ff4ce79e73411ebc686e3c66b6b51bf7b3f369cc06814095f7","impliedFormat":1},{"version":"3e39e5b385a2e15183fc01c1f1d388beca6f56cd1259d3fe7c3024304b5fd7aa","impliedFormat":1},{"version":"3a4560b216670712294747d0bb4e6b391ca49271628514a1fe57d455258803db","impliedFormat":1},{"version":"f9458d81561e721f66bd4d91fb2d4351d6116e0f36c41459ad68fdbb0db30e0a","impliedFormat":1},{"version":"c7d36ae7ed49be7463825d42216648d2fb71831b48eb191bea324717ba0a7e59","impliedFormat":1},{"version":"5a1ae4a5e568072f2e45c2eed8bd9b9fceeb20b94e21fb3b1cec8b937ea56540","impliedFormat":1},{"version":"acbbea204ba808da0806b92039c87ae46f08c7277f9a32bf691c174cb791ddff","impliedFormat":1},{"version":"055489a2a42b6ece1cb9666e3d68de3b52ed95c7f6d02be3069cc3a6c84c428c","impliedFormat":1},{"version":"3038efd75c0661c7b3ff41d901447711c1363ef4aef4485f374847a8a2fcb921","impliedFormat":1},{"version":"0022901e655f49011384f960d6b67c5d225e84e2ea66aa4aae1576974a4e9b40","impliedFormat":1},{"version":"0022901e655f49011384f960d6b67c5d225e84e2ea66aa4aae1576974a4e9b40","impliedFormat":1},{"version":"9d2106024e848eccaeaa6bd9e0fd78742a0c542f2fbc8e3bb3ab29e88ece73a9","impliedFormat":1},{"version":"668a9d5803e4afcd23cd0a930886afdf161faa004f533e47a3c9508218df7ecd","impliedFormat":1},{"version":"dd769708426135f5f07cd5e218ac43bf5bcf03473c7cbf35f507e291c27161e7","impliedFormat":1},{"version":"6067f7620f896d6acb874d5cc2c4a97f1aa89d42b89bd597d6d640d947daefb8","impliedFormat":1},{"version":"8fd3454aaa1b0e0697667729d7c653076cf079180ef93f5515aabc012063e2c1","impliedFormat":1},{"version":"f13786f9349b7afc35d82e287c68fa9b298beb1be24daa100e1f346e213ca870","impliedFormat":1},{"version":"5e9f0e652f497c3b96749ed3e481d6fab67a3131f9de0a5ff01404b793799de4","impliedFormat":1},{"version":"1ad85c92299611b7cd621c9968b6346909bc571ea0135a3f2c7d0df04858c942","impliedFormat":1},{"version":"08ef30c7a3064a4296471363d4306337b044839b5d8c793db77d3b8beefbce5d","impliedFormat":1},{"version":"b700f2b2a2083253b82da74e01cac2aa9efd42ba3b3041b825f91f467fa1e532","impliedFormat":1},{"version":"0edbad572cdd86ec40e1f27f3a337b82574a8b1df277a466a4e83a90a2d62e76","impliedFormat":1},{"version":"cc2930e8215efe63048efb7ff3954df91eca64eab6bb596740dceb1ad959b9d4","impliedFormat":1},{"version":"1cf8615b4f02bbabb030a656aa1c7b7619b30da7a07d57e49b6e1f7864df995f","impliedFormat":1},{"version":"2cbd0adfb60e3fed2667e738eba35d9312ab61c46dbc6700a8babed2266ddcf2","impliedFormat":1},{"version":"bed2e48fefb5a30e82f176e79c8bd95d59915d3ae19f68e8e6f3a6df3719503f","impliedFormat":1},{"version":"032a6c17ee79d48039e97e8edb242fe2bd4fc86d53307a10248c2eda47dbd11d","impliedFormat":1},{"version":"83b28226a0b5697872ea7db24c4a1de91bbf046815b81deaa572b960a189702a","impliedFormat":1},{"version":"8c08bc40a514c6730c5e13e065905e9da7346a09d314d09acc832a6c4da73192","impliedFormat":1},{"version":"b95a07e367ec719ecc96922d863ab13cce18a35dde3400194ba2c4baccfafdc0","impliedFormat":1},{"version":"36e86973743ca5b4c8a08633ef077baf9ba47038002b8bbe1ac0a54a3554c53e","impliedFormat":1},{"version":"b8c19863be74de48ff0b5d806d3b51dc51c80bcf78902a828eb27c260b64e9f1","impliedFormat":1},{"version":"3555db94117fb741753ef5c37ffdb79f1b3e64e9f24652eecb5f00f1e0b1941c","impliedFormat":1},{"version":"52b3bc9c614a193402af641bee64a85783cd2988a46a09bdfe4bddd33410d1b8","impliedFormat":1},{"version":"52b3bc9c614a193402af641bee64a85783cd2988a46a09bdfe4bddd33410d1b8","impliedFormat":1},{"version":"deb25b0ec046c31b288ad7f4942c83ad29e5e10374bdb8af9a01e669df33d59d","impliedFormat":1},{"version":"deb25b0ec046c31b288ad7f4942c83ad29e5e10374bdb8af9a01e669df33d59d","impliedFormat":1},{"version":"a3eb808480fe13c0466917415aa067f695c102b00df00c4996525f1c9e847e4f","impliedFormat":1},{"version":"5d5e54ce407a53ac52fd481f08c29695a3d38f776fc5349ab69976d007b3198e","impliedFormat":1},{"version":"6f796d66834f2c70dd13cfd7c4746327754a806169505c7b21845f3d1cabd80a","impliedFormat":1},{"version":"bde869609f3f4f88d949dc94b55b6f44955a17b8b0c582cdef8113e0015523fa","impliedFormat":1},{"version":"9c16e682b23a335013941640433544800c225dc8ad4be7c0c74be357482603d5","impliedFormat":1},{"version":"622abbfd1bb206b8ea1131bb379ec1f0d7e9047eddefcfbe104e235bfc084926","impliedFormat":1},{"version":"3e5f94b435e7a57e4c176a9dc613cd4fb8fad9a647d69a3e9b77d469cdcdd611","impliedFormat":1},{"version":"f00c110b9e44555c0add02ccd23d2773e0208e8ceb8e124b10888be27473872d","impliedFormat":1},{"version":"0be282634869c94b20838acba1ac7b7fee09762dbed938bf8de7a264ba7c6856","impliedFormat":1},{"version":"a640827fd747f949c3e519742d15976d07da5e4d4ce6c2213f8e0dac12e9be6c","impliedFormat":1},{"version":"56dee4cdfa23843048dc72c3d86868bf81279dbf5acf917497e9f14f999de091","impliedFormat":1},{"version":"7890136a58cd9a38ac4d554830c6afd3a3fbff65a92d39ab9d1ef9ab9148c966","impliedFormat":1},{"version":"9ebd2b45f52de301defb043b3a09ee0dd698fc5867e539955a0174810b5bdf75","impliedFormat":1},{"version":"cbad726f60c617d0e5acb13aa12c34a42dc272889ac1e29b8cb2ae142c5257b5","impliedFormat":1},{"version":"009022c683276077897955237ca6cb866a2dfa2fe4c47fadcf9106bc9f393ae4","impliedFormat":1},{"version":"b03e6b5f2218fd844b35e2b6669541c8ad59066e1427f4f29b061f98b79aceeb","impliedFormat":1},{"version":"8451b7c29351c3be99ec247186bb17c8bde43871568488d8eb2739acab645635","impliedFormat":1},{"version":"2c2e64c339be849033f557267e98bd5130d9cb16d0dccada07048b03ac9bbc79","impliedFormat":1},{"version":"39c6cc52fed82f7208a47737a262916fbe0d9883d92556bd586559c94ef03486","impliedFormat":1},{"version":"5c467e74171c2d82381bb9c975a5d4b9185c78006c3f5da03e368ea8c1c3a32e","impliedFormat":1},{"version":"ef1e298d4ff9312d023336e6089a93ee1a35d7846be90b5f874ddd478185eac6","impliedFormat":1},{"version":"d829e88b60117a6bc2ca644f25b6f8bbaa40fc8998217536dbbbfd760677ae60","impliedFormat":1},{"version":"e922987ed23d56084ec8cce2d677352355b4afb372a4c7e36f6e507995811c43","impliedFormat":1},{"version":"9cca233ee9942aaafcf19a8d1f2929fed21299d836f489623c9abfb157b8cd87","impliedFormat":1},{"version":"0dc1aac5e460ea012fe8c67d885e875dbdc5bf38d6cb9addf3f2a0cc3558a670","impliedFormat":1},{"version":"1e350495bd8b33f251c59539c7aef25287ea4907feb08dab5651b78a989a2e6a","impliedFormat":1},{"version":"1e350495bd8b33f251c59539c7aef25287ea4907feb08dab5651b78a989a2e6a","impliedFormat":1},{"version":"4181ed429a8aac8124ea36bfc716d9360f49374eb36f1cc8872dcbbf545969eb","impliedFormat":1},{"version":"948b77bdc160db8025bf63cc0e53661f27c5c5244165505cc48024a388a9f003","impliedFormat":1},{"version":"b3ae4b9b7ec83e0630ce00728a9db6c8bb7909c59608d48cded3534d8ed8fa47","impliedFormat":1},{"version":"c2fa2cba39fcabec0be6d2163b8bc76d78ebe45972a098cca404b1a853aa5184","impliedFormat":1},{"version":"f98232fe7507f6c70831a27ddd5b4d759d6c17c948ed6635247a373b3cfee79e","impliedFormat":1},{"version":"61db0df9acc950cc1ac82897e6f24b6ab077f374059a37f9973bf5f2848cfa56","impliedFormat":1},{"version":"c185ceb3a4cd31153e213375f175e7b3f44f8c848f73faf8338a03fffb17f12b","impliedFormat":1},{"version":"bfa04fde894ce3277a5e99b3a8bec59f49dde8caaaa7fb69d2b72080b56aedbd","impliedFormat":1},{"version":"f4405ec08057cd8002910f210922de51c9273f577f456381aeb8671b678653c9","impliedFormat":1},{"version":"631f50cc97049c071368bf25e269380fad54314ce67722072d78219bff768e92","impliedFormat":1},{"version":"c88a192e6d7ec5545ad530112a595c34b2181acd91b2873f40135a0a2547b779","impliedFormat":1},{"version":"ddcb839b5b893c67e9cc75eacf49b2d4425518cfe0e9ebc818f558505c085f47","impliedFormat":1},{"version":"d962bdaac968c264a4fe36e6a4f658606a541c82a4a33fe3506e2c3511d3e40a","impliedFormat":1},{"version":"549daccede3355c1ed522e733f7ab19a458b3b11fb8055761b01df072584130a","impliedFormat":1},{"version":"2852612c7ca733311fe9443e38417fab3618d1aac9ba414ad32d0c7eced70005","impliedFormat":1},{"version":"f86a58fa606fec7ee8e2a079f6ff68b44b6ea68042eb4a8f5241a77116fbd166","impliedFormat":1},{"version":"434b612696740efb83d03dd244cb3426425cf9902f805f329b5ff66a91125f29","impliedFormat":1},{"version":"e6edb14c8330ab18bdd8d6f7110e6ff60e5d0a463aac2af32630d311dd5c1600","impliedFormat":1},{"version":"f5e8edbedcf04f12df6d55dc839c389c37740aa3acaa88b4fd9741402f155934","impliedFormat":1},{"version":"794d44962d68ae737d5fc8607c4c8447955fc953f99e9e0629cac557e4baf215","impliedFormat":1},{"version":"8d1fd96e52bc5e5b3b8d638a23060ef53f4c4f9e9e752aba64e1982fae5585fa","impliedFormat":1},{"version":"4881c78bd0526b6e865fcf38e174014645e098ac115cacd46b40be01ac85f384","impliedFormat":1},{"version":"56e5e78ff2acc23ad1524fc50579780bc2a9058024793f7674ec834759efc9de","impliedFormat":1},{"version":"13b9d386e5ee49b2f5caff5e7ed25b99135610dcda45638027c5a194cc463e27","impliedFormat":1},{"version":"631634948d2178785c3a707d5567ae0250a75bf531439381492fc26ef57d6e7f","impliedFormat":1},{"version":"1058b9b3ba92dd408e70dd8ea75cdde72557204a8224f29a6e4a8e8354da9773","impliedFormat":1},{"version":"997c112040764089156e67bab2b847d09af823cc494fe09e429cef375ef03af9","impliedFormat":1},{"version":"9ddf7550e43329fa373a0694316ddc3d423ae9bffa93d84b7b3bb66cf821dfae","impliedFormat":1},{"version":"fdb2517484c7860d404ba1adb1e97a82e890ba0941f50a850f1f4e34cfd6b735","impliedFormat":1},{"version":"5116b61c4784252a73847f6216fdbff5afa03faaab5ff110d9d7812dff5ddc3f","impliedFormat":1},{"version":"f68c1ecd47627db8041410fcb35b5327220b3b35287d2a3fcca9bf4274761e69","impliedFormat":1},{"version":"9d1726afaf9e34a7f31f3be543710d37b1854f40f635e351a63d47a74ceef774","impliedFormat":1},{"version":"a3a805ec9621188f85f9d3dda03b87b47cd31a92b76d2732eba540cc2af9612d","impliedFormat":1},{"version":"0f9e65ffa38ea63a48cf29eb6702bb4864238989628e039a08d2d7588be4ab15","impliedFormat":1},{"version":"3993a8d6d3068092ed74bb31715d4e1321bf0bbb094db0005e8aa2f7fbab0f93","impliedFormat":1},{"version":"bcc3756f063548f340191869980e14ded6d5cb030b3308875f9e6e0ce52071ed","impliedFormat":1},{"version":"7da3fcacec0dc6c8067601e3f2c39662827d7011ea06b61e06af2d253b55a363","impliedFormat":1},{"version":"d101d3030fb8b29ed44f999d0d03e5ec532f908c58fefb26c4ecd248fe8819c5","impliedFormat":1},{"version":"2898bf44723a97450bf234b9208bce7c524d1e7735a1396d9aabcba0a3f48896","impliedFormat":1},{"version":"3f04902889a4eb04ef34da100820d21b53a0327e9e4a6ef63cd6a9682538dc6f","impliedFormat":1},{"version":"67b0df47d30dad3449ba62d2f4e9c382ee25cb509540eb536ded3f59fb3fdf41","impliedFormat":1},{"version":"526e0604ed8cf5ec53d629c168013d99f06c0673108281e676053f04ee3afc6d","impliedFormat":1},{"version":"79f84d0bccc2f08c62a74cc4fcf445f996ef637579191edfc8c7c5bf351d4bd2","impliedFormat":1},{"version":"26694ee75957b55b34e637e9752742c6eee761155e8b87f8cdec335aee598da4","impliedFormat":1},{"version":"017b4f63bafe1e29d69dc2fecc5c3e1f119e8aa8e3c7a0e82c2f5b572dbc8969","impliedFormat":1},{"version":"74faaea9ae62eea1299cc853c34404ac2113117624060b6f89280f3bc5ed27de","impliedFormat":1},{"version":"3b114825464c5cafc64ffd133b5485aec7df022ec771cc5d985e1c2d03e9b772","impliedFormat":1},{"version":"c6711470bc8e21805a45681f432bf3916e735e167274e788120bcef2a639ebef","impliedFormat":1},{"version":"ad379db2a69abb28bb8aaf09679d24ac59a10b12b1b76d1201a75c51817a3b7c","impliedFormat":1},{"version":"3be0897930eb5a7ce6995bc03fa29ff0a245915975a1ad0b9285cfaa3834c370","impliedFormat":1},{"version":"0d6cf8d44b6c42cd9cd209a966725c5f06956b3c8b653ba395c5a142e96a7b80","impliedFormat":1},{"version":"0242e0818acc4d6b9da05da236279b1d6192f929959ebbd41f2fc899af504449","impliedFormat":1},{"version":"dbf3580e00ea32ec07da17de068f8f9aa63ad02e225bc51057466f1dfed18c32","impliedFormat":1},{"version":"e87ad82343dae2a5183ef77ab7c25e2ac086f0359850af8bfaf31195fb51bebe","impliedFormat":1},{"version":"0659ac04895ce1bfb7231fe37361e628f616eb48336dad0182860c21c8731564","impliedFormat":1},{"version":"627ec421b4dfad81f9f8fcbfe8e063edc2f3b77e7a84f9956583bdd9f9792683","impliedFormat":1},{"version":"d428bae78f42e0a022ca13ad4cdf83cc215357841338c8d4d20a78e100069c49","impliedFormat":1},{"version":"4843347a4d4fc2ebbdf8a1f3c2c5dc66a368271c4bddc0b80032ed849f87d418","impliedFormat":1},{"version":"3e05200e625222d97cf21f15793524b64a8f9d852e1490c4d4f1565a2f61dc4d","impliedFormat":1},{"version":"5d367e88114f344516c440a41c89f6efb85adb953b8cc1174e392c44b2ac06b6","impliedFormat":1},{"version":"22dc8f5847b8642e75b847ba174c24f61068d6ad77db8f0c23f4e46febdb36bb","impliedFormat":1},{"version":"7350c18dd0c7133c8d2ec272b1aa10784a801104d28669efc90071564750da6d","impliedFormat":1},{"version":"45bd73d4cb89c3fb2003257a4579cbce04c01a19b01fda4b5f1a819bcea71a2e","impliedFormat":1},{"version":"6684e81b54855f813639599aa847578f51c78b9933ff7eee306b6ce1b178bc0c","impliedFormat":1},{"version":"36ecc67bce3e36e22ea8af1a17c3bfade5bf1119fb87190f47366a678e823129","impliedFormat":1},{"version":"dbcc536b6bc9365e611989560eb30b81a07140602a9db632cc4761c66228b001","impliedFormat":1},{"version":"cb0b26b99104ec6b125c364fe81991b1e4fb7acdcb0315fff04a1f0c939d5e5d","impliedFormat":1},{"version":"e77adac69fbf0785ad1624a1dbaf02794877f38d75c095facd150bfef9cb0cc5","impliedFormat":1},{"version":"44710cf3db1cc8d826e242d2e251aff0d007fd9736a77d449fbe82b15a931919","impliedFormat":1},{"version":"44710cf3db1cc8d826e242d2e251aff0d007fd9736a77d449fbe82b15a931919","impliedFormat":1},{"version":"0d216597eed091e23091571e8df74ed2cb2813f0c8c2ce6003396a0e2e2ea07d","impliedFormat":1},{"version":"b6a0d16f4580faa215e0f0a6811bdc8403306a306637fc6cc6b47bf7e680dcca","impliedFormat":1},{"version":"9b4b8072aac21a792a2833eb803e6d49fd84043c0fd4996aa8d931c537fe3a36","impliedFormat":1},{"version":"9b4b8072aac21a792a2833eb803e6d49fd84043c0fd4996aa8d931c537fe3a36","impliedFormat":1},{"version":"67bcfdec85f9c235e7feb6faa04e312418e7997cd7341b524fb8d850c5b02888","impliedFormat":1},{"version":"519f452d81a2890c468cca90b9b285742b303a9b9fd1f88f264bb3dda4549430","impliedFormat":1},{"version":"519f452d81a2890c468cca90b9b285742b303a9b9fd1f88f264bb3dda4549430","impliedFormat":1},{"version":"d58d25fa1c781a2e5671e508223bf10a3faf0cde1105bc3f576adf2c31dd8289","impliedFormat":1},{"version":"376bc1793d293b7cd871fe58b7e58c65762db6144524cb022ffc2ced7fcc5d86","impliedFormat":1},{"version":"40bd62bd598ec259b1fa17cf9874618efe892fa3c009a228cb04a792cce425c8","impliedFormat":1},{"version":"8f5ac4753bd52889a1fa42edefab3860a07f198d67b6b7d8ac781f0d8938667b","impliedFormat":1},{"version":"962287ca67eb84fe22656190668a49b3f0f9202ec3bc590b103a249dca296acf","impliedFormat":1},{"version":"3dab1e83f2adb7547c95e0eec0143c4d6c28736490e78015ac50ca0e66e02cb0","impliedFormat":1},{"version":"7f0cfb5861870e909cc45778f5e22a4a1e9ecdec34c31e9d5232e691dd1370c8","impliedFormat":1},{"version":"8c645a4aa022e976b9cedd711b995bcff088ea3f0fb7bc81dcc568f810e3c77a","impliedFormat":1},{"version":"4cc2d393cffad281983daaf1a3022f3c3d36f5c6650325d02286b245705c4de3","impliedFormat":1},{"version":"f0913fc03a814cebb1ca50666fce2c43ef9455d73b838c8951123a8d85f41348","impliedFormat":1},{"version":"a8cfdf77b5434eff8b88b80ccefa27356d65c4e23456e3dd800106c45af07c3c","impliedFormat":1},{"version":"494fdf98dfa2d19b87d99812056417c7649b6c7da377b8e4f6e4e5de0591df1d","impliedFormat":1},{"version":"989034200895a6eaae08b5fd0e0336c91f95197d2975800fc8029df9556103c4","impliedFormat":1},{"version":"0ac4c61bb4d3668436aa3cd54fb82824d689ad42a05da3acb0ca1d9247a24179","impliedFormat":1},{"version":"c889405864afce2e14f1cffd72c0fccddcc3c2371e0a6b894381cc6b292c3d32","impliedFormat":1},{"version":"6d728524e535acd4d13e04d233fb2e4e1ef2793ffa94f6d513550c2567d6d4b4","impliedFormat":1},{"version":"14d6af39980aff7455152e2ebb5eb0ab4841e9c65a9b4297693153695f8610d5","impliedFormat":1},{"version":"44944d3b25469e4c910a9b3b5502b336f021a2f9fe67dd69d33afc30b64133b3","impliedFormat":1},{"version":"7aa71d2fa9dfb6e40bdd2cfa97e9152f4b2bd4898e677a9b9aeb7d703f1ca9ad","impliedFormat":1},{"version":"1f03bc3ba45c2ddca3a335532e2d2d133039f4648f2a1126ff2d03fb410be5dd","impliedFormat":1},{"version":"8b6fadc7df773879c30c0f954a11ec59e9b7430d50823c6bfb36fcc67b59eb42","impliedFormat":1},{"version":"689cb95de8ea23df837129d80a0037fe6fbadba25042199d9bb0c9366ace83b7","impliedFormat":1},"88623e02932b715a58228b31082b3ca936655f427527d824a1e82bf0c4897674","ae0b0d5355a0768e9e894eefda74662fd0669c87965719cbbcbd4b58926c2ed9","7538d6c170af393656809cb460e3fe903425e6c4cc8071c954eabce42899f8a4","75a6ec42b473bf1e2928a5489757a54f7cdcd3c20fb7a228fe2b189d9e8f7256","0907b96881eb54552f5814cb649922fed8ac4a60ad5c8178c9626f2c1f966510",{"version":"4b274728b5d2b682d9ed98f0e7c227bc65ce2b58c6fe3e5437dc09ee5676e995","affectsGlobalScope":true,"impliedFormat":99},"53564bde6fce2d7029c4a388468611f1d81764d17714d7e72761bf8e410c27e9","2b0d562cbd0e887e69ab34b09356c9a213907d8418e1a7e98cf580bba8c98b02","1ae1975a34680c4f2499abe6901d74ef5d25d53725621d3f6793d2a9c23252fa",{"version":"db1b85efd41f64be64d5573206e2d97d835e909048c8f9021fa49165f492a346","impliedFormat":1},{"version":"8916debeee8948d7d755190c77f46a680b13a91f73a80b9cdba0338980ecb221","impliedFormat":1},{"version":"7b86510251e2d2726fd0d7385d6d5027d45b85c5dddfcceb8fae0e7e85993655","affectsGlobalScope":true,"impliedFormat":1},"a6e07fbe229716e1c80989bebc1338a3076aa20990181d53beb713cc38daa585","82b47f92ae97ad956f1a14b541ca3d923972599af61e50a370d3d688328eb26e","639f5729db52ee908db92322853e53da930b987246746d43760b3d7730f8d998","df5a14eee5c412478fea4289f3433388402b309d0af7156c4138f51c0dc6e82d","9cb085c622ae3d17b8dc507470401bb5663d54ae59b425b562fd8039805bb233","133a6704e840190140781138f9383b14e6ec1e2653720c6fee146e1bbcd43eed","7bd6c259b0fe43d6bbd3379c0d24b20e810c3a6e2f55647d6fc09a51fecae72f","3ebe73fc581bd3023e06a1263b44dca91589647f666ceaeef0bf00432451d381","1fedd860fe947d9ab7fda664e64f3609cd2b079ff1f34baa6098878586e78ca3","ad4be3332261b35863e2b669b39e59c272ab261b8867e7e6f419a6ad3687dff6","b1402152d1a6f840d78fb80636bd7e09b690e82c4f2b9886acc54269f6c7a3a9","cbcb94f73d2f013a99f538d2cb2339e1062565460874aa46af4291439abb4b62","139438c04c070a1764d6816d0726b181c590f699b2e4ed96b9f81626c9e4d4db","e9f90e1677651da52ccee231be1b9909cf9d49f9b87da9388212684453ba76d4","f75cf7d13f6def386f05d33282d2f9dadcb539161b18eb5444b928dace4e691d","3e5d0a769ac468bf49ca3bf4f5cd0c16e578e1faa36cdcfead4f2446d96b314c","7ca0ec9f28abf5241fa77f818fc97a94cfbf0be90009e31bb1448dab586c64ab","33b782a5ce78078e1f37d6940cbec98c6a26017897d0a63738ec9a5cf7d7cd7b","a74f00094fe1b4d5c879b3dfec5e181af4a69df921bd02d65621e7bccbb13867",{"version":"add7aa0bb66ff6946508aba8279bfb90bcf6ea71d980f784204015b1b52b593a","affectsGlobalScope":true,"impliedFormat":1},"bb333b243b9190f0388924ed18668f0604fd396f36050dcd23460a9c3b1f8076","e4cc8c0274e311353b19f34e7eae07dbe5f69cf5ac2044071dc00c5e653a8da7","8f6db6644742d21204d5db1366dd3e5b18974a83a5265f57cabffdc6d575fc04","980efcadc8f1b66d1f1eeec15a722bae8292c056a3762a8e88f32d957606d47d","6b5aa7e666a05abcda2cc0e21dedae6a17a5eea9225110b5572e985ba81f697f",{"version":"bd15a9604f3a4d4064818eca97d5b0211068e11328731106a0a60068c3bbbcd9","impliedFormat":1},"27c8d71db8be3924325011546a25b85bcf6f31434d8ec272224308564bf36ded","d268f968c6d01e4161abd86f4df29c054e3616cb8f904aaed8a9ae522821b83d",{"version":"c868f50837eedd81fa9f61bd42de6665f74e7eb7a459135c6a14ac33ddc86798","impliedFormat":1},{"version":"7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","impliedFormat":1},{"version":"95bf7c19205d7a4c92f1699dae58e217bb18f324276dfe06b1c2e312c7c75cf2","impliedFormat":99},{"version":"88a3a6f8c2a1640d8d5fd30d8d86462f8babd86a1e52fab0e8b7f7c141fb348e","impliedFormat":1},{"version":"345f76c854da724803c96f727a3f9c75e26cf95c6e7b8c1064dbc4e7727b74e6","impliedFormat":1},{"version":"ab7b7a15a5d73eb0cfc2b973e580f357f07492bff6608669d7e899e2d49ac9a3","impliedFormat":1},{"version":"868c78a84ad3530fc1b6e03da4611405da111bbfb0f1480abe45e801cde0b995","impliedFormat":1},{"version":"9e5d257542f508ca9dabd0cfd8d95192cf5ed1056829c4a60ab64696d34a3d07","impliedFormat":1},"77886d754106d3adcedfb6edcbe231822f3297fffac5f75321b7fb19c91c83b8","54937ecd0f200b4c5a60b6d424d63b5312e1c8bdc78cadf4ebffd101a7c60737","364ea71343aa8eb41753948b877b9530eea4eb89b26e90af16dc4ebcebceeb6c",{"version":"901f60f74395a0a217bfcbe3195f793ad5e0f586b73792fa968a20162c4cb17b","impliedFormat":1},{"version":"f097e178e62a9adf34b33a8cac0be12412b83b8c97b74e1fda401f33936af4d0","impliedFormat":1},"66f3a8642aa94e1500502a3d3a4eace5c763040f136a660c403da224025d7e76","03ce35ca115eeea68dd7c6d8849132811f351024e803eacd2c08bed15326eaba","1d6163fc08d290e66c84b3ef9f11e7fa40869eff582fe72736779b34b5c8408c",{"version":"dc602ef9638db2163c461ec64133fe76f890f6e03b69b1c96f5c5e59592025e8","impliedFormat":99},{"version":"08906ca4df290e78211120ae722953b460e978096c01ab2d42a682088fd1203e","impliedFormat":1},{"version":"bb37028deafb14ddc698590901e25a8cd93928b6f0d24551e001b8baa7d0c028","impliedFormat":1},{"version":"747fa107a4191c311d1aaf3b1b708aee4ac71345e16cb40c306cd108140efb78","impliedFormat":1},{"version":"4d2c153ca69ffcc20e5fb1398a460a2f732815f3bba4f9f5ac1397a61788c7ef","impliedFormat":1},{"version":"e21694662423ec75756bd396b23cf65f227e088e2106dbe7f79ee93ca386cc5c","impliedFormat":1},{"version":"0f8c6cb63be8775aca5f6e0fcf1814d5637c4bf2f8f48170817d5e5fd67313ae","impliedFormat":1},{"version":"e4f8a07ca0cae516ee45182056e52fd286c0a3d13e20af31d8564f7f68ace148","impliedFormat":1},{"version":"221f5c9d51ec7b278527ce5267174ea8b2d22ad072883bbbbdabc680956055dc","impliedFormat":1},{"version":"75a60ced6c5ed94c1d4f793b47acc73e77f821de57069dc9937e04cf6cf9710c","impliedFormat":1},{"version":"cc15a79629e122609c2a92e5d12bf2aa6ffec023e111e05a623dd36e5ec5174a","impliedFormat":1},{"version":"7e0ccd91433031d82b342dc1b4671629cfd2a6adc0a95f8c09d89c73ff2310d9","impliedFormat":1},{"version":"bfcb51291d02c2824b6e9bf305718f741078fda6d8acff6778d09fb07408f2d8","impliedFormat":1},{"version":"53be0f983ba16e0fa7503af63fe5020be196b4aaa48e3a57496fca80525067d3","impliedFormat":1},{"version":"003dd733890e569eee2543aef9e0a655c2fdc13fda24c4267467fd9f313c8d26","impliedFormat":1},{"version":"2ea8fcb74664e74f4e9f285a3e0e213fd3f48062a5a708678278bd70e49dc1f6","impliedFormat":1},{"version":"b4f793b0ae6bbda36c02fd85cf4bc796df236ab47ab410e76047b3c436577302","impliedFormat":1},{"version":"27f21c10654423223b33e930755f0a19260f45b59808350c5adcc9f5f5ce5247","impliedFormat":1},{"version":"ddb57e7a54d3094ab8bfebadee5e1811ca78381c1a4823961948ce296d1339a9","impliedFormat":1},{"version":"946caa76a947e9c5ad1f6c3a90ee00a91c5bf7e821e75259b515318204b56dd2","impliedFormat":1},{"version":"70e658b997327805edad10d0659e4348e9ca845ab31c5b7af22dde07f9de9cf9","impliedFormat":1},{"version":"11933fa2b74492624b45946f0ba42014fa3f6e2ddda614c546d939f0c643c649","impliedFormat":1},{"version":"9a7a13cad265ed5b51c262501e5adbd493973153773636d528854689a84605d5","impliedFormat":1},{"version":"71aa84ccb1561b26dcea5febb1668bbd7a9d679cd01920cadae15aa817bfdcb8","impliedFormat":1},{"version":"12098a210bcf2886db53a6b37159ac3729b06fe442843c3c63d231ffb3b13d8e","impliedFormat":1},{"version":"ff283c39aa26e773a9be89f62dd92d3825cd2f9acd2741ceba092a48ac07da78","impliedFormat":1},{"version":"427ba67dd02ba03ffabac68a10ce82a2a5d0f8ae36ede62b7b4037aa4c6368a6","impliedFormat":1},{"version":"1db1a00766f7f7e26ce675e8a8933389c21399854f29c52cbabc3302f8b7879a","impliedFormat":1},{"version":"d0a50368d8e7b0ae838c145ea712616303eb15aac2ff26723e78ab7e2a632345","impliedFormat":1},{"version":"4691e1c45d67c43379be624d92b4499cda705e6821046792c1e01630f438018f","impliedFormat":1},{"version":"172e0511eb2d68c0174e034deb4bc105f71aa72945c419acda9e8f1910332d62","impliedFormat":1},{"version":"289e7a8da4ab201907353e9294208931cbf418ffe8c442f8050f03f1ab92019a","impliedFormat":1},{"version":"bfba5ecfd06bd98ae3973a8da708f917f76b683d909849e6c25039d6ccae0cea","impliedFormat":1},{"version":"4116fe61d8df508b91b5658a39ee1ea7edb55749982bb59f45a0b21fd7dc8871","impliedFormat":1},{"version":"131d1c5b9bbb611e2db2b9bb51c0a1cea57d698c66e5415536fdc010d6ec2933","impliedFormat":1},{"version":"2b693a7b1b3a66f2d2d80eb14a2556f36c826a59e0e033c502e3254679b552bf","impliedFormat":1},{"version":"93e81c8dae72eec076078e4ff8942da02004a04ffbb23027f1061c03d15da43c","impliedFormat":1},{"version":"91cabf127c3ad7b091d49c15fce0af432bab2294e2d4306dfe2d07cc4726be2d","impliedFormat":1},{"version":"60cb56bec96dcf794ea725cef44c4a9cd0d07316adf47f14d93c7fead489bf13","impliedFormat":1},{"version":"0490663d16d9958d06464ded02bef9ba85926d3285058a6aa8fe822947a3931e","impliedFormat":1},{"version":"c3ca4b1c1ab4250b9aeb789d086a5764c513910ddae72c578cafba23ef0da439","impliedFormat":1},{"version":"573cef73c2a17538719d22a8742c1a544419e185eaacdf099cc14b97189ad7c4","impliedFormat":1},{"version":"d8caf71481ef0f6d41d40570b6cb45e08cc165a602b8007932cc4be511235d31","impliedFormat":1},{"version":"dece5ee942f7c17ce7df44f9b4997329df0a965e813dcad2ddfbe7a3255b2cb8","impliedFormat":1},{"version":"ed34c34d61402f9e731458b19bb6ac11970d58691acfe892540a55d7e740c2e4","impliedFormat":1},{"version":"f831a9274d0d8b6533087203dc71c09c9dabe59b269f4da20e5390545b024955","impliedFormat":1},{"version":"5a156b674da30bc111a4a681cbda0af0a5ca2a01b54a02265d747f6ae1eea4c6","impliedFormat":1},{"version":"6ac1780dc3ae984e1e46d4444e6e98d849ded0536a7d6229c57a207fe2668ac9","impliedFormat":1},{"version":"1c5c1695f6568cc55e8b6541a4bf35e1179230c6810179d30234f29d7aa8adce","impliedFormat":1},{"version":"9b3d2af1e30920ff646fdb06759bbdcd3da39cffc7b44a8683203061641c053f","impliedFormat":1},{"version":"cffe5e84ad85f2991c9f5073ab4295254f37f079110d70a6b47393e00a1e5e9b","impliedFormat":1},"477c9a227be68f20da72d0b4fab40b1f52acf1c41bc05515df7721d250777c45",{"version":"f9800ee41019d4c7612364fd1eb3862dd535166959e139c8e54c61c421fdb799","impliedFormat":1},"0f281f6b0e25bb9d65ca25162e460ae3fdd0aad1a9a987772519c36b2e3f7879","434ec594ebed2ce29c28522aa781bac2a23cf0040614d208f770efdff3869c1e","a2083c6d9049cd8a068061c69750272c1b0db42fd035495dbb9d58edc46c4b41","6a453681542acac40e06d3ae098d8b772578574d19250b69caa0b2b49ad35a26","ecfd126a79773103751237b94977b450a71f5e02b33ab07d803f185788c9ba9d","5edcb409b9d95d32a5fafe7e0ff0b6c580637a7a8ee6770ef94c42b60a327148","71310d05a3ab3d00330020aa13bc32fe64121f40562e14a97038b097595808b5","b61bd868eb09ca624b6458fb7ab3f58efceb3171eead535e6480fc99359e1d60","284b23c8101ae4d5bebcf4a7e2c9b99fb1f7b185cd8ad9721c58a8f1578fd558","f9c4f95d2a2cfec14ba7e66b6ea7d4b8c51b91909d594646de8ab6e7d334e12c","f70882fc3b372faabeb0afd4f89a71ee9f55063588ad70a77242686cef809b4f","6c8ad81c310137ab65f17d305ce06db2f919c5ba05b526a86cdb2c7b4cc76259","f98bae337b7d0d893da71bd3ae961a7be2f40507a678ae7b06ea08d329d70474","0ef328bc4cf5979c0841d41a049d746bee4e0c5d5c5066ff0cda9241998868f9","ca9f98dcc9c59e05963090cc744e631927fa4fcc04e91e875d198e57a2921953","164858c2ea93c8e5e34ec0c8498c7475d3ec6cc8f505079484f79e78514a4026","41a7bcbd33efda40ca7eccf0cf04e28c70d6738b63f00e5bf61524629ecc9859","5a9c482227b5d9e0e8c88fca74753fc53c4778f4e4690efdd17b365c05c87328","33e7ac5c99810f8f0c1fd11436de21a75e5618c0ebe07a7793994f0867cf66ac","272b55cdf51bd2990c46bfd30723c2b57b8a480cd40343eff47a8edbe65d9bef","2c4a75188dad6d4f471cf399d35561519fcbf05f264bbfe7603833312c50d146","fcbf97aaded79b01210dff59c49f480b12e50c154d93bbed068a4ccae80df478","071ea1e7a8bc7353b823f9b0af8b308e331fe260b090d8e2392782e881f0dcc6","26e81d16a006bd182b3e48d43af0e180529fabeac7e5fbbbb6607f8a8b0cccd1","dae389a8a3432c871b399883f619d171e1451cdcca69009665f71e991d1c6ae5","a8aab70e58d5d095ed776a201d57417f741fef553a99773bfc41060f0c8cbe75","698d4cf616a4c5e800c6e4f48e632952b8622a20cca4bbb88825f25e1d97751d","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","b94b9e7e00b87e5409588b1e7074dfde0ce472c924aa433396e16674adf22861","146d90867aebc587eb7e4ed2bdebd8a042e5a32681598a78544c0372037fe134","6b8879ad22ef9e08494e01c28f37285f2820e722da141c0826fb126d8a6f3552",{"version":"991aace368326d6418dfe58b9176461fb73c8a4ae996f148339f91b0f08b341c","impliedFormat":1},"7211255bb113c706264e74eb5e62fb60875dfac7858ddb02813fa454c2883721","ed9cc866673f27aa91d427eccda172c92d8db61b31103e4e6d7519fa3ee16465","fca082fe17d5ba37158bef659d192fd4dd99b58474a51fd5526de0967d856300","85d92797168b1a827e0fd9b2ab032e8271de626e7884ae3512cd8e2efada86e7",{"version":"ee71e41e8ee7e861dc0ffadce6e97340abb81269168a570b6ce26e402cb83db7","impliedFormat":1},{"version":"9b0e0e8756131143065a76f2e5bbf2a15b1f53e6e40f5aa464c7b1b60dda5ea7","impliedFormat":1},{"version":"ee4260746b62f9459d62204c1cb11b1d8e77c884497b9aa3fea92a537e51730f","impliedFormat":1},"14050a257df8eaf388c676e4dfc26863cb114c3349def3bd64380373526a94cf","febb8a49fad893b3acc9a85093b30754f7bf77886ed93c292588e8909562d031","53bcd3f0c92c60315b612666724bdae9116b980f5856fd30787c662ea6394f5a","b8dc4bba7ede866996677e671d4bc396cf5692c7f224816c44b1ffb0afd826e3","cc9adac2f5150f2996df7be3f3e14ca7c0661e24f2fbe94924973c23d000eedc","aa010c99a78dee5d1f88245b8c76f46d6cb50414676eb6c5f70aff46a79c6d39","4eec1ad9e81e755442c124ab4dab95e85f563a0a022ee68cedf36c5874e4b117","406105b1d6ef99eba169758502c3fb52398e5ed6049d6a3fb76d6b4634a6b249","9dbf5d29c0da136c2714adee0305de7a4af4c3b80ba0ead18af954cc9be3be41","e3990397e75d6d5b553d662291ab47d71f51fda307a1605c8ba3f0c23bc68aad","d367b5660830dd2734f047850b007d806a0198d96cd5ed7f2c903c4fea3d8874","96ce60575129dc7c650740951e98b9b0022b38b354b956ea5ac0be76309ae859","88f55a33af5bda95b3b81c9b52e05eafec2f79af1832ef50dc78fb5cc683ceb6","d2b0a21c1cc973cbdd5edc41b0e449fd5b08d81e91848657c2035b439b6ee3c3","93683350574367270c87430317eb19bcae0937aa240d2fd7dda104a7f24fa301","65b567c82f37a73d1be88c791343369165dfba292c265bebd29b3f3c0c15c0c0","a805db00735118658ffa613f479ee65af7eed8cdaf4e3abef2171ad0e5106d74","6148e3ba8b441d6fd8c1c746fab511a592b488ee211969c6053a1047dbdb148f","36cea6ae4de712f0bdcfc51d930e1fe197b8a868d5f08312f429ef42c274b877","6afe222536b046c1a6a04d4beb08fb9b744ee9f2be78c8e3bd37bf31fb246fc1","d4c319e94c7ade764ce8024a1af15fe5690a58f48d2592fec1eeb2ef2af74d6d","290c7216ac3bbdd75b9f90e19b7126192230bb701abcfb8e5d19f07a49131494","48817af15dbc87fa4fa3faf2cb210132c363beeeca828dbb13162c5b2f1cc5b7","588df9bcd5f4c2ac980cec5a975ea8dd73281cb910677553552542d247498dbe","aa8d0822a607ee90cd41476b2a267270a86e3b72d354e0f69016499b36e359e3","881ca497a4b6eaddf838da524802850e76dbe91eb156f6629970f6505c911056","40d37d488cd0a1e389f7b361659f68ed5d46e187ef76cd4758a0fcdd1d5737ee","c8e433be16c442febff3cd09e1c78db385c5c9aa5d5653c749b2116cdc6c1b65","21d7d9d92b6c015ae63cd823ce73c554b98a67a373ed2c5367cf35734c8287af","b5ec60e6c4fdffef247e493bc7aba0c4f13a77b61af3c7674c57f2306a8d67f1","71b09108ed56e838338809856ca28f8176ebe5018f1b974db92febfcb209ddfc","be1c6bdd377a356d36abd349d6bcae99dcd6fd83370e0441448ecec65bb1dcc9","f4cc015247c076c46dcbcd4d124e912a1360f4bfe2849f19a5e973fa6b0376ee","3636419208ec71152ee55b1165b257af16a440c6a5f0114f6c457f7d3b5b6e8d","71edd55a0d803dc669ae8bb09b005d9eae67bf45096f3a1856503e4052f09d69","f6f050152bd0f0d73fb388b407cce968790a63bb6feff066e2a529e33c0f0f63","6ebd007dd2241f0adb29995ea456a082a43e85599bafdccbb8e8ac92805fb979","e8c651d6b87509c1f5bd8ac0c7503a1215860f57a478939a12dcecfebb7a30f3","4ac82db71f1bc9f0db799c2db650f52019080f61d1757f4b68ff90db64b029d8","777bf63f77b89cc3e4a2aded7357e6456a17972922ccd0d0c73a53a40996293c","a25ca0bd2ab2587ce89f2b713bea16d94afe22d5168216e8c5acd4f6012da8c0","5ae6303201c39d55c112cbe791c13fbaa2041b3aead26c648d80020710ce9fd6",{"version":"35cd69e8415abcc14f1fb0b467de0ca9673e7f5daf52ae66a99467fdb893c0ca","impliedFormat":1},"b7e72ee9790349bd3880e8ca178613a800580a6103c1fffdb723adec829e36de","71485c04fef1e9abac21cbeab5249e8d68df8b497c92d111d1cc1417a81c3576","f998993ae7807022c19c0210d626a0f34dc3fe6aebd461a4f4e08d3b5d4b3f21","3f0ab390c6e44b39aa304385f0e9bb8806e76c4f46e0a045294a63881136335b","831878245e7b8251dd98262ad2bbafb6f246912e239921b5a8d3c91459defda6","4f6294863de28b43fbe140bc319b27eb96936ecd04b0d08413d5b0b630731796","4fbd883d071d20519c32dcf59583fbfb39fa80ef844eb118b7cfc1ffb1537e59","feb6cea20724f8c7b735c815c4534cf820c8a630e784d4c0f318fc13d223c811","5788248cc264ac731cb83ed371550a39ba116e1ea3e41636518545a1b316ce72","bb53a3a23f09decd9c035b419c5257943db03ae2db6220c2bf5ff4b81424f216","55c9da82d8c01e0cf1ab8f68cb631dbff982dc95e6c58942e0fa3694670c6214","1a76bdf82770b82f36a1dcefd924f9c95bca789c65553c13a340ea763b07870e","4944e5f89bee43c33b6c2b58b90d0c2ce0fefe1b3fbaec7b0740fc7fa4a66c6f","c7495fd8e65023b7bbe87d6ee371a58f9fcf10ec939b7a22a7dec3061412ef52",{"version":"2781ebc77a0d1fbb546d1d18a382ace5fbde658b3740d7a9c629ff56469fd21b","impliedFormat":1},"15f93f337824ba2fa017ab4db5446d83d2b2904f17ad96b7a0fc9dfa813bcdc1","09a111ad5a5354a9af2057498d1561bdfad02cb13c18577ce1e7bb869bb2da2a","330e6f2c6bb6607295d5ff81ab262ce647174b78c25955a66eb28d12fe45573d","a33a34751cf0ead9bfab5fb1063043842f39d9648ec2414813bc93bdb78a85e0","f15f7eff09124dacc0fcc8c14ece2095ab0512d73987d3c106975600817b64a4","9c0d1c84cf41ae297df24165799751a745937a88784a191ba0d2ecccac31f4b8","314eb7a146ff551c331b37161953f8657cbbc4da4789d72b0f2c22019d54f72f",{"version":"a841c468fa6683a2f7afa0320fb4adc6acdc63b4c2d20c820d2e2a0253fb37bb","impliedFormat":1},{"version":"ab9db68af736da5a18f38e2b439e9625fcb4e671c231b76c6efcff6488883055","impliedFormat":1},{"version":"fefa15feab8a79803de88e413047ea7c3d26f48fdb4a50fc49ed68c9a5874b29","impliedFormat":1},{"version":"39ac8334f895dff9e965312922f505ef8f82d76684e7f11755fc4eca80fb5e35","impliedFormat":1},{"version":"64969cd507f3cf8cc3a921dfe32ff149cb9afb78de2d357fa6653f789848e134","impliedFormat":1},{"version":"127558e7dc6097fb909c02a6dfb69ff3eebfe47650d4553bed3f39789170b22b","impliedFormat":1},{"version":"7e530acc81f022a93c0f639c4e2e6b0a304338b643c9c228fefa009a8c46ddde","impliedFormat":1},{"version":"e4ba8f098bf50e8d3c239b7b77bc1eb42f99fb660518263e9fba63e364da5cc5","impliedFormat":1},{"version":"84d080fa6d7e2042fa889bed74d9d916ddc41dec3c4ab5795b7979d1c26452c5","impliedFormat":1},{"version":"5a34046f2f97ba150630bb2ec8e8ebe79f1c00f0587aa8b648900f56f0d89d9b","impliedFormat":1},{"version":"344b4e72002b857aa0c53cd1d9292a6f1ccaa24a9f1d343955533d35ad87b14a","impliedFormat":1},{"version":"82f9e99f5d09b9b40fb1e0338051f614f2fba2f0eb6ffb493e9cbe0cdd775858","impliedFormat":1},{"version":"268011eaa3e078d8e8f3cf68270bfaea3d847c02b3a787a557199d242ba6d859","impliedFormat":1},{"version":"116e06ad30ce51f3ddda64ca96da17c9c91763d32391f156fbe257d7d7314ad2","impliedFormat":1},{"version":"0f8a804a7f912f83768aadb08e60153be70037e11c63c34e8fec0352d7f6b128","impliedFormat":1},{"version":"498735c43cb3f8983e983210f04c6ce07b10d31d99c4ac45d5dad8260d3878a3","impliedFormat":1},{"version":"7231e125b797ca135cafc311bd151e347b59860aedd79944084cf8d01ac96a1a","impliedFormat":1},{"version":"f8d24554527f0f8900e55746e35c5c2222e113dbd965002399ac8eba9ee46cb2","impliedFormat":1},{"version":"33436b63f7c6073de5a917147a773a77e8fd58364d25c5faedb74478241c6269","impliedFormat":1},{"version":"78a8d887a071f75e3c050a989ae975bb1d2150fa3c99422c3c51311d1a94e1e9","impliedFormat":1},{"version":"f81a2add7941c9b186369ed78fd3144600de3db9e66dfb684bb16b9e425bdaa0","impliedFormat":1},{"version":"f9f4c9dd4009f598ae0c58cefe5357c543896306f928385f4e051b720cb60d5f","impliedFormat":1},{"version":"d69dce8572e52f2f4bb92436cfd411a6e6fe9d7cecf3a3fde4a0b91c87989bc5","impliedFormat":1},{"version":"6e4f4193c9355dc6698a3878cb16b4e6520af925142f305f76038f3e5c82b5f0","impliedFormat":1},{"version":"76926191a6a3e66ab4bfc3ae08c7df7401738eeb47658bf2dc14dd7ad8ef132d","impliedFormat":1},{"version":"bf4a49f19b1958aaee2ca82da40c0bdce17629dee312ea1f004f9732928195ca","impliedFormat":1},{"version":"41da71ce4e7d2822875601d7adc94656914c4acbdee60dd47b0fe89a717e3f6b","impliedFormat":1},{"version":"fb0bcea176823e32b832b9411914caa0cf7972a56689e02419012f86062144e5","impliedFormat":1},"e72d6f4a2c7ab1f2f9600967f35c73af171ac31db63e6fb8ec1e19cde5d2cce7","70a887196916b345892997cca88bc28d1a8bad617dc2dc7a282bae57f7c3e516","cca8f998bf37a001942dfae90eaa1f16e33b7254a236f6d6db837fb1221f6eb0","96c344bebc8e508ebeabb45c93b6d3a4e77c6fd709beec14b9351be23ba970ac","5880216b93f5fbe3a232d0d2108929609450e898c0cf128c01cf182ada98288c","2dfe6d8e48b68e64e8caf905a319d2ea337357137b4d3b360e899713d0327045","3cf08e808a6f95afe5c98cba66365d27e4901acb73900dde3193853515ebf4b9","fde4aee04647ccf213049afaf63d962a4a629abc1129f9f39887874c7f68d2b8","61af73665f0fb92c3aa7503b2c94b86b34677dd17449884fe3832016358df248",{"version":"e85d04f57b46201ddc8ba238a84322432a4803a5d65e0bbd8b3b4f05345edd51","impliedFormat":1},"b2a43d987fe5b0864e95ef98f62a929c4aced407437c99a0dba862d06886758e","e38cf8c9366f4ab6d7d12f298c0e9fb07fe6f256914205dd9d0c721a2cc8451e","52dce0ad2c748d103510b81236463cb1552700bdac3552645e666ee35f0d4353","9faa86f149ca28b342bd0826a34659b65c407208126ef58d8c77746241e42b0e","206be0e353b83af2acb4096830cff4d2e4424f0dc103b54ddb4dfc5f72a414c9","5d226f37a5fef11cb2f7fcaeab764d418401710ce04b9b9e3529b707a833ad87","b3bf3bc4e561a0493e46e3e9bad0071b9c49e384b21d0235e9f3fc790f520e85","12ab168fd11e6f77ddc0252a23f9cbb85cf47fbde46e1d494299a65bd2ef23bb","da99e936ecfa88a82083951347e21401715b0931bc49120a35d1133f0150f352","be19a3e3865849e398ebe7cad4d8c80f0aa0e6df12a2967e732e055351da28ed","a923bb848d6da603f488956a62adf3c462dd1b568cfa9820e6f3e758b4c9e7b8","afcc86fc5df3b0ac3ea6c4f560354ac07ea4f5ebbc608ea24e89dd5a15feb0d9","896f94ded9ccbf791e00013c6422f8e9440bf57332fa7bf98433c9ddf4d86765","ecc7e9ce9ec0e231e6e630b1775ef0aad323a3db142a5152a5411fee7352c086","4d0990809a0a4ae773344dccd7c0d42f46550f0f36bbb1902dfb6a8567b6cbe6","92eb76b440eef5233e6469918df2078299022cea2481a76d1257ada3c55cb822","392319a6cde8d1d260615ebf8f7e3f0771a49573d9017a894ed9aebdc82e385f","c58fc600231ca8c37e39a3b4c49b2501d789670c741b9a0044322cd1e28d2365","13811ae199a4803f1beb3a1564c48e00dfcc37c03bee213f8a68e804effd5527","f95785be20dac58ef355b09d90bdac95bf1ecb6e797e5aa5f3edb3b92e193243","b968858c285a32dad21d043dbc2bbea8329b175f012b2a573c926bbd0784ec44","43a44c9bb5467e5ab9ea25d10243470899c1413479f674a400e51d797a1a3d29","13811ae199a4803f1beb3a1564c48e00dfcc37c03bee213f8a68e804effd5527","e9d923a122d44efc165de59c40a6d879b5909441faa3b99fecbae59ec253abc9","ddb2d155df125b44f2724a62c8da062cf988178f15a5e8f9ed18b5b42536e158","d17b6246d1adca325b71df1c7575ec5935a9e63eb78fe9409590258cdd2a5439","d756d730d769fc622c52116a5577acf504f415e549293df83b3c38bc73158d40","9189c61f913789d35d6fc6166c32dbcf93400e4f026c7adbc1f3861ee811f751",{"version":"a3a5184b22ea5959aea309f6e4b17fdc02b17067715c229827ecd7bc46e51540","impliedFormat":1},"b50381d7c52f5209a0ab3ff13e15027ce76e8236612d1e01165824421301cfe5","fe075fb0c9505cb2e8e6b6603977efe8fe8e7c57c626a76642227fe8022bbf21","b487c046ccef96e9d82f165b7eccfa10bb60d17cfd9619d5280db53003ece0fa","33fbecc1a39343423c75ec53b749480f9c5ef74d0a8f7bf1c9b84b2151687965","d1b64a5f7eca1187df03c9914f5f91923b6ff21c10764643fd9c7715334d981f","d8ef71d5f48c37f2c9df58315ebd536a6e09c09ce9f28f5140348fd58066fb17","5fb491af50a24ae2d46638df2f0d197f9d980e7d3592f09c5e6dfc3e6dce3adb","b43c4a8b916cab88b7bff3f148797b6127b5a9d37689be0eaafa5ca108aa1a80","184e4246251c3df09a66d053060164842ecf4446f4d10211b5f1ac6e9b4441de","5afbc0fa0a00bc2dad8af7fcdb8ee0928c09928dff5a5bebf09b1362e54a764b","f07bc78d821b6fc1291d998d2f5c84cee768bd20effba3bfce422e9d31f3ef30","ee4a37f50f4c09288c312faa390192a507feb42f0289519941e594c2a2c7bfd6","7ccaff1e779d5cb3f0d5813288bd25c1da8a7d443e49187b46bb77d4f2687539","616f17ca4ee684599aa1888babc855acfbbd989983a0494dc68e70f53d3f838e","5cc7e4c98608be6ff783ae83a16936431dec1201de5d75e26eb938b605dcbcf0","ae82819f3f84bc3761cad6b38a8c23bd737f294e43aa23febc5cc2d180fca733","4f87b79b4cd457a3a6bf02634024c471b8230a3c8a370447c6f97aa3ae03467b","ad9fc1b0a9d4daf2c3743e939277fa46432728fa144a0a188a83fafb50f0dda3","0ae15aa1cdd2c8773f3f203cdc9ffad15b41feb24403389709da801bea934554","52a61a9694aee0b35b0fc1273749937323725d02580ccc887a3fb9ba196b3325","c288618e5f7cb2da6312858bf313dda2f5489ffe3ead68d67f4e2b86b71b3dec","e6d465f874e056e5b718ab8dd7ec700fe5346d0fd9314b687f6d05b7fc8fecd1","eb2ff0286bc3ba30d1dad4f7f694c79c9e3691e9b58021814a0f6c57895ccfca","70e8958b5da0ead8b5f14397bac09da6f067d83c22e1fc127f11f35b4865073d","600234febe8dac208a25d772ce91f592828ffcf1047f9810374e0f3d5d90a2ba","a62b0bc8d96838fbb5c900c0cc5698fa4d5be319344185d9e0168cac0afe5a1c","e00f4786cf8748b0785101fe02dedb027ce3f9eb3cc7d88733b5bce3ae5c251e","30f3656199d628c50c482845468d7d5aad55db56b12656e8daa159570bf9a953","00fc6836899a152ada657656dfb1671be2aa5ef9648f63c778e0091e899aad7e","0281fbd464d68de22a754082c43e850e4113f80aa549e87ca0b7f12e065ada41","94a80e2c8e3c166086807d10244f080397b10c15dc24ee6cca9c3888a285998d","e65f206c350511361aae951b7881702e445307dc5aabda90d697890be7715b91","a857603cfd0ac4c33a976e2803e1f1ce9ae47795ba01f36ea5900ed1d4c2026a","417f69039cf77a6c24ca225d33fb58e11e887da725af7466428484ef418cbf6d","6a1c80f46cef278ae09820ac115e9c8136707e377cdbc4fae0096121e26b3579","5403f405cac6f1e45bbb2ede305b42ba3113650b923deda79076c9297643f8cd","ff91cb4b24813db8f0301670664fddf560bde81832de07c6c58a09f741556889","7249fcde3948ebdd9d04b58f3d24a6721df5453750919197038088dbdc14be36","f7127f39f3064a32a60a04106eead4a8d1e704fd8823ab71394975073291f236","8f556e23464781bffd87283056cd0eccb46673b940ee8410a6797d0137e9ad65","30a0eb06399d5791cb23c66310242e3c51dae3969759f2f09146ee43969876e8","30d63f6a8884efbfac53d9040938b42ee7a99de4ea4daec4a9173fcbcc707c29","0b7511f23aac7b92bc256f1ed174ecd8a64a9a20e2bdafd0f573f46ad8f07b44","048c4a1759dc9a5a00eb852033b233c0ead8dba74086383a2526def4efa78859","45e9c80a45766fb79961c40eaf86f4b86c60199a383696d2f30780d1bb45e2bd","c8de3e06a06f5844650747813193a5728d13d67c09f240a682851cb733b4e3f8","3af4db7e9f0a853b4f1d86a8e3bdcf939f310a371c7897f28ba96af0b967b9a8","5888d8e14eaee335fd0b981232a4ebd81e4dc2c09ddc5ee99d61dcda59115faa","73a6aed866b72895fe653bcf784884b6e95178be1657aa88edda730d0d0d3226","fcce2b6fe4ee3592b2f8d36a779f2597801d3a1dd2af05a9d7968245c0488285","8f1b4a78ad371d1a4d7f82996bef8969d434f8c7d5813eaa4bd9624081381971","6a00ebb3795ddfdde294444f2ad3d408d3bb7d8995e947b6220ea7aa5119cb98","15b8011f4ae19b8c6229499f178613b4c31422bab3d93f69996cbf2f95ff87af","b9be0c807907d37006e36d5d74fc88046e4c45b2d07962b54101d68cab5dc826","947098f7e947ed3126dc3cf5629f8d6a26c84f698b842c14e6fe5f77b05863ce","e8fa3a503151e78fd3b7e90b8ea1c61883f519e1992be1a6d17d5a15b9dd7104","cf7050af2aaadff85d15b065c19ab110fcee35ca80dcc64de9180ff45f5c5c65","c593a5ab735c9765c8f928e351fc467a9784fde21a9762d07885e028f78a0d33","24c350d7a1bf8187fc7e12dd9dbf66ab3a147aae7f8c28c51715d5041749169d","7edffe0d00b10414f741f4f5f5a8585a5401ccc70c6f0f714ba64bceac49ac95","d3c81c0c36574f73d9263eebdbb84e89d0f333e658d1014158f8dfbeea629f3c","f81e0f5742bcf9c55dc188c6ac00b2fcfb920e479fb8ddd90c9badf96a54c54a","5a8190fec8bcc9e2bb9d1c957283958f0b8ffa43007b2a4708272051d310c646","cfcdabc27f976ce62433ff7c15cc181fdd438bf40caaf8cab2e07ad2fb41b11d","602960de29025f638f36b91c96a4858a0e34d99a001ee29b5feefe0d062125d9","43ffc977b05bc6ff896c4f74e83fc7470b407d8c94bab0c9af8e1fadc6b0fa88","045c5bf73bcb12fa03f7f8c97656d4e68504e9cb57067794f88629ef09edc15f","6534203d0e46b1330dd0df05da1564456bd45c1fb121bb404df7c60f70c35279","5e8dda9b163b66292e688b855412f33a9d612562d5ea822732cc431a18242344","e0d6b7faeea7f80e0399b78b3889e15aec7a55536fed8728453312c61e95c1c3","8e6b5b1826b294772d8df11214c55fbe0e047078da3d2ff6344d759f4f43e448",{"version":"8cea0fc84770d5f540e33199f371cc510c3d1861ade7729c2df2fccc08193c5c","impliedFormat":1},{"version":"3b70114ef61093c7524ca3998659090a34754f837ebcab21dc4e0b23429a5f24","impliedFormat":1},{"version":"fbd5ed11ae97c830b5949fd1f43a06be32e0afbcf61e3f0f184e7497c0202414","impliedFormat":1},{"version":"9ff2c1493af0acd8f8d01acda102b02829e87d91a04ee3dd326a8f28b5a2340c","impliedFormat":1},{"version":"fd8c47936212567ecdbae551490946a0bd5a1a2288d50c5849788b6724f85098","impliedFormat":1},{"version":"742c9204b10dddd097272f353569bd95ab4b0917c79a087ddc054214b759177c","impliedFormat":1},{"version":"fe8d1c1fffd224f47bff24551827e048b841f5a67ec73dd8fc10e431fe256101","impliedFormat":1},{"version":"ecf88d193d3cc41b7c353e32b44c20553048da1c6de99e2b18a392d21c2b6d55","impliedFormat":1},{"version":"8e25377dad048b496995f021dbe502a26d033db83efd677a1ecea37454f514f3","impliedFormat":1},{"version":"8da15cd5dac4f4a3db42d1eac2d10f5af07292ec4267330ab74166776350b005","impliedFormat":1},{"version":"d82b5224daf2c7663934b5952b744ed3d2c0e47b2fff05c4197ddc6eabe48706","impliedFormat":1},{"version":"7acc80859700f3589fa0cd5a9fbd00d7b8e2d578bc4289821faf2c17cd916b8e","impliedFormat":1},{"version":"e7954fb507985de17035fe308129faba3bf027d612ff85c83ab19ce2eb2f8df6","impliedFormat":1},{"version":"5438a2443df5e9c87a0495f0250e839893a424b107798962d0aa0a5c35d7f787","impliedFormat":1},{"version":"eac5d57169c05bc520a75c88031940570e0f639c45fa760203ec51bca973cf4e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a28c2b8c7c55198fe9787d2dd151c311bbb7edb5e29a8c410dd967912abc94a","impliedFormat":1},{"version":"bb8fdf5e9c8eb02a7e7f0b18546a5ed7ba5022c933dd87fec66257b68d232d97","impliedFormat":1},{"version":"721351facb547faccd2625c9dbf6154650bade8c950c0166456dd137b6f2a2ae","impliedFormat":1},{"version":"450ab872377c584de6e75103925b641e5e727615a2c7ef3160620f3ecf4f59c8","impliedFormat":1},{"version":"70653359fe240ff5d164cc5ddb621bd72ec63e6de01848b3df345ecd7e60854f","impliedFormat":1},{"version":"c33884d9f1c08904bbaf525cfc646101209eae179737641743c3c7ef0f6d2d81","impliedFormat":1},{"version":"b4e6351aac6432b3c454028328b35c5d7e20ea1e2edbfae6452a34600b3c18d7","impliedFormat":1},{"version":"e6bac1257156fc90c602da9093dd967c88ac823572c2d7e7c83000e49e8329d4","impliedFormat":1},{"version":"166fd074f66e102662acfa0e2b99132dbd718ced98c375abb2a412fc96eeae95","impliedFormat":1},{"version":"129e7a2bcdd8630dcbf779526ca849033f09ed1f2e17f8eabb0ae1eac794e31c","impliedFormat":1},{"version":"12dd9bc8c35c89f27a53d9781cc3d8aa06d52bcc678fefda07b9fb2ddaef5ec8","impliedFormat":1},{"version":"ee25a75ad2cbacc0188900f3216a60506b48f24bab8bcd2d3e3cc040b3b05f8e","impliedFormat":1},{"version":"931ce1b79f01c47a42765a2e178c991d920d5713566e9ad593d0c9989bb7453a","impliedFormat":1},{"version":"0c77b391418bda87ac5910642db363f9a29396eb1031f0a0870795d820265360","impliedFormat":1},{"version":"b68b7a6dbc11a291ca17238803b470002b3c8d8db489ec37bded30b28a108b3b","impliedFormat":1},{"version":"c3eea5f57b39cafa3792a0282a558703c48ba8b8f9e3d34c79bee7c93280c59f","impliedFormat":1},{"version":"f96c2069493b7ddf07f9ba7189d32340d98517a72af9acab98c1d1f0af0f591b","impliedFormat":1},{"version":"116de3a9ef6fb67aa8d82343cfa21f989d774a1c0d329a603e76dda2804c0c69","impliedFormat":1},{"version":"5a110b4d68cbd0d8991526c2f57e8cf56cc075111e919fb56b41cce11655e661","impliedFormat":1},{"version":"1fb10ebf3c839ea466d78f4fd5a7f5fe01ccef71ee61e3c14e4b84da9e708bb0","impliedFormat":1},{"version":"e0ed7c0c89294141789a84b1d4d2f91b0127b2d28729c48784ebdc4537f88a6f","impliedFormat":1},{"version":"9b6dabd2dff9d40f9d8db17d05f3345d293245c22e9a305df12dd64ac5ec389c","impliedFormat":1},{"version":"f4b04b332206dc06c64239bd6aa78ce8c24b4d229ce7f7aad4e129185d6c1afe","impliedFormat":1},{"version":"df37aca0e82508e76ece1c753be20eb8e5cf6150f62b35fcd4756289778068db","impliedFormat":1},{"version":"9aea4f46092dae8caf7cb1c4abad04acfb45be9f193d388083a475d9304a3e58","impliedFormat":1},{"version":"c3f302c4890892f15a902ad1a5f8a80f534c6ce88ced4ed5be3d71ece9ef3e1a","impliedFormat":1},{"version":"07e57696f017ef7dc1d6ac587540a5dc178833c1e53d4bc433fa09241475768f","impliedFormat":1},{"version":"c8f656d5e2f77a7980b3a35a2d9aba73920b565cc8ba361d51af3b147e969b03","impliedFormat":1},{"version":"4e2b37c78a94da80d4c5346638ea31492b73965e645ff7302bf469cb378b9d88","impliedFormat":1},{"version":"261ae6b67a1bd671fbb9e255d5df809ccb38d0dfa0f95427f2e91c2503f9f326","impliedFormat":1},{"version":"a9818cdabccd6ff7f079866c735f5ab7ffe6b74f01fe57dc3c6abbb4dbb3ca64","impliedFormat":1},{"version":"3eba6a736ed2eb2fa05569729f2ec0bc3575888790303687d6d33fe274249402","impliedFormat":1},{"version":"959369ae146b751ec7fcd8d691e6a113b155bd6ec88494e1f6f933e4f5493b07","impliedFormat":1},{"version":"ff8ad72ba2e4be466a0caf50bc5661970a15e51c73e92fcbff92a2262c63decc","impliedFormat":1},{"version":"edb341959c189bcd4963ab575addd66ebd2e4849fa4f6591e7320cde294a76d0","impliedFormat":1},{"version":"e1047ef9bc2c1b6975fd953b03a354ea9b8a9aba09f25bc7dddbcfe03ba0de64","impliedFormat":1},{"version":"2b5fa5f68e7406c5be937246de5ce5195cfe4fdbcc6e8f77b01b7ba4ade4b30b","impliedFormat":1},{"version":"2496f9bbf32a139a181502a76351d379db6cade347a278ed8b76c72cb64d60a4","impliedFormat":1},{"version":"ebc8f5a439221b34ea3baeda0e5fe699e14469da53b96b53878ecd5782341aad","impliedFormat":1},{"version":"bcf87658f2653068209a37441b88dc1940c00b587d4a111c8c579c959b4528a6","impliedFormat":1},{"version":"31d52027e920520e67bffbc27f4f60a2458f8995f71b000ed9021ee608c18071","impliedFormat":1},{"version":"9798c76c201f3a3f4aa25997fff8088a342ffede208525179c126d31b4932dd0","impliedFormat":1},{"version":"d9a6840042be645a323097cce648c8f274a8643b4cf08a9dc71cb1bd2f912334","impliedFormat":1},{"version":"ad5ded73df6209df7bac814ffcbebca7e361770e572b2fe79767b3be1f6112dc","impliedFormat":1},{"version":"30ff23abdf968c258968a05d63e0958190aa5d4e4f0ccdc13c5d110912bd5294","impliedFormat":1},{"version":"7146d36cc4c090c97b94a39dc6030c1d033987209ed16dc1ebcde8103a76cea6","impliedFormat":1},{"version":"56d2c316170bfe04edc8dd7cd09c9579063d2ce06e28e8a15915c0842633ac3c","impliedFormat":1},{"version":"62aa3b35048c2290eb7a9c6537c816edf22a570abcca51eca7197c30fceba497","impliedFormat":1},"6af44db12328e101247bd515bc938e69e94e9d7283474a299f1b544c1fdfc536","e0298892e09af8b6b6f24fbb870e1aa2e7a45b79a331d94283e83bf0fb3009cf","2bb3c5a6c25b0f3c748de7b20e77dea644b0ab45662df13d6b23336433e2622d","a68d3adfda7f8ff2fe874890a8675b4064f8c9012b559ad0e2afcde7ff9cca0a","bfe38b0597a0831c4496448cb4d85638530518afb01241be076a958cd51cb997","a18979959c883f12373c2a28679084b6b6c3e9449579d88342ff887b6be91e8f","e60f078c2c7d6102cce4165d897ccb531db11e155ff631240ae10a3396da644c","2255beabf0d4d979d4dc48a2284caff79571d1e3d11213f9f9ffa3909d97dcd9","69d3168937239d7a6c93c22727ca69cfd557a0ea1991d4abd66219056455dcb6","fe166108a9e233a2ae2d8296f841de45f6a54974470593b8a1f2f453a112c97c","b12dc6e8a9d9ade37555e80d3d8d3a800607fcb1ee507ed0e60872565c573c49","f5db16f82ca135ca621321b160fdef165d2175b9a66d623705d178524ffcd4f5","5c00fc998af272643f4783f499c6ccecbaa70ddec6d6b482d3b1658289fc8cd9","d4da0484a1eb9b3d4c6d496f45855de52ba3f1242ddfd0acb026f1fb712df03b","f73b76d42655549a6df9fd57cb6ad1c87e15347bc9ab5ec9b1f23dd34a6e4924","a72808eccad4f1cc6cf43f4055d6a55735ff4d2feef5db4a59211323aac1f4e3","d30884c93a1c6c50c2f402d1d9f51bf4be2c3cbb7ce93e4a2874cd0254ac15e7","0d4ea2fe055ea804913f6e283c42b58a2e0cf4bbbb6c68228ab0fe3cdb97fd08","5755ca412c9d23cc5f14f9bb28b99a3f207b7cdce62fe6df24db28169abff721","380641f8957b55985d554f4be2be4e022277b6c4b41a0149a74c95b0a38393fd","46bce59ed760d9439ea6e12b14fb55f88da00f01af96e49143e3c1e5c853d2d1","8340a938eeea681b19ce2ecbe73081522b6e689cd0a0cf5c62037fcb744adbf4","5ae1add01976c729c00c73dac42f3bd508deb63f7418f2de5d256db54fc8101f","289cd7d9d2b18b21709d59e7f92bea82792939734f968cf833829079c6aefc49","3bc53e81091dd2eaaea35acb772c08e2109f43a7f74250118f40822a8e68bc1c","4e4e8c5dbb3e8b6a18364dabaf57ba8a8ead8db813d691c0d5be9ade6361f97b","5364a5aa1cb4dc0d1c775fa868a736918c16617dc71fb36e34e64bee3509ad00",{"version":"c9bfbb2c352b1436ea9c3f252246ffd6de8188d73d8b34a21a5cc5df3fd25b92","impliedFormat":99},"d92ddbb176b0a56356e7aea84f0d75b206020001d8efb3e3c42f2dc7eb938719","339babd662149f9368d292f35e03e557a9145c533f90cfb8c8c77d7d9af446a0","4e76648a53e746224a6a9cbc8c07b96011204a313220b6950fb3cc84e223a735","14b78cde6d6e71e7310466da0bd010544a79628082811ad26c406b37943cfd33","428dd90e0fcc2b891443fd4f3f8638086529bc14c1cea9b6785eccec5d580e4b","fa0b4bd59aa821a14b83fc30edcf54b821cb7521099892382e06dac7d700a45c","fec9410f6bde0bb8d33b4293eca5ece1961238a80d2e7e2c01bd3f7a89f73059","8ab7a565d87338a0dd2aa63ae44d067c68435819f8e666386ba95e0c3338369d","a80a96f3fc214434886c411a65ab73a523225e07c81f2dd2937bbcca8f2a89ef","9ac7e4ae4798c742e54dbb77a6258323486789827457f030845edec7e1e7fe84","af0a7aee8c329157a9979e7f41b987dea86e64284abad4ec35a957f5da24762a","f52065fe5fc2aca19b461eb53ba2d9202507314b17be6754cb4a298d0ba24517","3765c088c53eb41bfd8d96b377fdb446531e3edb00da6bba2505574d45a3a1d7","81865bf1b8d448994fa01965f1b98497e17cf4a7d594bbcd39efa7ca17a5eef8","b005ef9ac67df1cb911e2462c44d59ea5e93b75a62d1c471fe62349ba7ed82c1",{"version":"2f7a11106c39bf47193843dd14b088fe481189efd0098b708d4b7c29f48ae69c","affectsGlobalScope":true},"ee0ac8e88cdc205386f8972c5bab8f0103638ce25aedff32e17bb7d341b656f4","9349b6adc3c08c184a7e79417fc7f42eaea5528250399e43976d2804a4dd3608","675b55e600625f2afa98f738c3d6efdbb6e2e3cbf0fe7c1ec7c31104918770c0","e5b34020dda0e3908e4cd7de6ecb327ee3c2cd1eedb325ed31a03d11ca6cf184","12aded20360c5ef6b95329842e0fe6f988662dcdd1ed012ed9a4b48739784588","884e9fb9b81eebcacd30cc361e924b4fa0534aa924a4fedd92f73454514b2cb8","9574a6023189e86e8131ac49213c42b5c5d8b50866d3f26e7b65f43d37bca6c2","06efde787c737534b1fb936ee6c9ec36b651403fa424228e6413b4a03fb45a9a","0f887f462ae6853c103bd608d1b25d9bb809145c6c72e1a62fc7e9b9cf1ff1d5","87c7834df1bd2fa9d6db754803d034fc3259aeef1048ab6ea070859b13e342f3","237ec661cdf1066db7043e585da8ae51b4c8cbafaf95d2b0fa9804b527663b8c",{"version":"a02b7bf8bd796decb97c3ceb336de2a80d1b332a0edfb30663d3cab629526925","impliedFormat":99},{"version":"c68eb17ea7b2ff7f8bcfe1a9e82b8210c3112820d9e74b56b0fbecaab5ce8866","impliedFormat":1},{"version":"2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","impliedFormat":1},{"version":"6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","impliedFormat":1},{"version":"c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","impliedFormat":1},{"version":"2973b1b7857ca144251375b97f98474e9847a890331e27132d5a8b3aea9350a8","impliedFormat":1},{"version":"0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","impliedFormat":1},{"version":"237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","impliedFormat":1},{"version":"cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","impliedFormat":1},{"version":"58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","impliedFormat":1},{"version":"7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","impliedFormat":1},{"version":"a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","impliedFormat":1},{"version":"ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","impliedFormat":1},{"version":"8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","impliedFormat":1},{"version":"a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","impliedFormat":1},{"version":"8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","impliedFormat":1},{"version":"1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","impliedFormat":1},{"version":"5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","impliedFormat":1},{"version":"ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","impliedFormat":1},{"version":"6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","impliedFormat":1},{"version":"dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","impliedFormat":1},{"version":"eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","impliedFormat":1},{"version":"25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","impliedFormat":1},{"version":"62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","impliedFormat":1},{"version":"cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","impliedFormat":1},{"version":"4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","impliedFormat":1},{"version":"360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","impliedFormat":1},{"version":"1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","impliedFormat":1},{"version":"7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","impliedFormat":1},{"version":"b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","impliedFormat":1},{"version":"596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","impliedFormat":1},{"version":"adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","impliedFormat":1},{"version":"d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","impliedFormat":1},{"version":"d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","impliedFormat":1},{"version":"3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","impliedFormat":1},{"version":"423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","impliedFormat":1},{"version":"2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","impliedFormat":1},{"version":"feeb73d48cc41c6dd23d17473521b0af877751504c30c18dc84267c8eeea429a","impliedFormat":1},{"version":"cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","impliedFormat":1},{"version":"3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","impliedFormat":1},{"version":"41b8775befd7ded7245a627e9f4de6110236688ce4c124d2d40c37bc1a3bfe05","impliedFormat":1},{"version":"e0205f04611bea8b5b82168065b8ef1476a8e96236201494eb8c785331c43118","impliedFormat":1},{"version":"62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","impliedFormat":1},{"version":"9941cbf7ca695e95d588f5f1692ab040b078d44a95d231fa9a8f828186b7b77d","impliedFormat":1},{"version":"25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","impliedFormat":1},{"version":"b83139ae818dd20f365118f9999335ca4cd84ae518348619adc5728e7e0372d5","impliedFormat":1},{"version":"706fddf475c77bd45be0aa3537b913951c527be3f9f483f4dcdb13e7315f8955","impliedFormat":1},{"version":"66a5ace456d19768103c1da9df2abafa9cb2e78ff61c938746527ec2524e5d11","impliedFormat":1},{"version":"4454feda195e7ec5c4ead994b192b58138fb7ca8873432e86b46d26de6ae8c34","impliedFormat":99},{"version":"775024159878d7c12458e7bb6be8237e480af873e6fcc70b09efe513e4691656","impliedFormat":99},{"version":"4513917dc834000605eb803c20dd2194ae11423d5348f764c67371b487c121c7","affectsGlobalScope":true,"impliedFormat":99},{"version":"15020d1a60272a3e78d5642405264acb8fe44a5db775ea23bb96837b9d81b6e2","impliedFormat":99},{"version":"5f6cbb11bf8926efbccbf9df52af1ec9b7727a16970a51f1e388152a35382e38","impliedFormat":99},{"version":"c3a70b2eefb56edb51966e05aefdc44a23e1acd0d361443eb6361df2a0da70be","impliedFormat":99},{"version":"3a4835c3496bf5bba45bc4cfe28627719289bdf154945886c922923eec789a89","impliedFormat":99},{"version":"0ef1c6a6f70688ac6a0c804d93e33d2913021573447f859dda41ab5e4b21cccb","impliedFormat":99},{"version":"7096cc0ec238a835e18f38f34fd423337c9ec2d2845be205c5e32b1f633dcdc5","impliedFormat":99},{"version":"4c259bd2c34c5cd88c74484297a395d3deda93d31d833b839bb2a4024d76ffcb","impliedFormat":99},{"version":"f61c5576fda9fc9ad35f916b0f0d7d3d95c8630d011abd66abf623ac166b7bb3","impliedFormat":99},{"version":"f8c19dbe4f36d185c28b4f6ba4e3bdb2935a43c548e3fab23c86daacf509ad45","impliedFormat":99},{"version":"f796e58920ca2266c1148551e4ec91776e468866569a4fc0d15002d66ffa0c9c","impliedFormat":99},{"version":"f4cfe6ee5a8920f86432b79cd87a03f5f6188a5cd6bdabc96e64d650a90cef0b","impliedFormat":99},{"version":"e1626fcfe55dd458933391911b9af9a33fae01d308a1f075036f94d3f884d5ae","impliedFormat":99},{"version":"7ee6c5e82e333cb97acb44a6679e886e5a72b5249d7c4ed9697d9721a92469d4","impliedFormat":99},{"version":"84c2960f37d57cd119405d21d4984abfc2cdbffc36fff2a2015fb761ca103311","impliedFormat":99},{"version":"8008df553e1ac6d74912108aefb7d411493b5f8887d30cf7aecc49770e2104d8","impliedFormat":99},{"version":"2ece4f48aa86dfaa637c78e1b8efcfa0eb34b046490f36e371c18610c5b97f5e","impliedFormat":99},{"version":"2bf883ccdc41b83798ef412dfaffa6f108e3d3d6892189608665b715b6048c7e","impliedFormat":99},{"version":"9508f5d0d25e592e66808d4b409f6ca08da9714cf4693c3e493ef0987402c8e8","impliedFormat":99},{"version":"e66b031d9ca94495651720dcd9176618924cd08d4d5bb662fbf78acdabd227a2","impliedFormat":99},{"version":"222f4417612b71463bd1f2a1d75a01030ef10eed52d0e2716b121315012f985c","impliedFormat":99},{"version":"b3742d792537f016da2f8fd7a76696ddcd1a3cb4ef8e081d44fa1daae52b1aac","impliedFormat":99},{"version":"05a58ec10c4e3a3590873ab03039978f476b78f287a25bc921ec568151e71f0a","impliedFormat":99},{"version":"f6619d55bf3130e3834c3b3c7491fd8921417dcbd3d96bbdd2f5f96d7b6fd97f","impliedFormat":99},{"version":"b8de26fc63ab774d900959fe78c9dac56da58b96f11ceca9960bcb90120e8e6b","impliedFormat":99},{"version":"e0759ab5886e2613dfb547ade1f98c3d1ffd4bef981d9113255f2903373e1b7a","impliedFormat":99},{"version":"286f4285c3a87f20734279fc5f60b514505ed349999dc498afca0eea77ecf82e","impliedFormat":99},{"version":"d46ff02e5e8c41b473fac7a2a4afccd0bb606e837036ec58713212ec64f6d409","impliedFormat":99},{"version":"0b874a41e258026ee0aed15f59bda7f803e7dc82efda6ee2dd341acdc3fde249","impliedFormat":99},{"version":"a9a39f15ecdc5f09974901332674ae807da376558112d28755c7caff72a51c8b","impliedFormat":99},{"version":"76f809aca03b25f81adab0012908b8e800f75ba4bc19dff8edd90dbe4dc05960","impliedFormat":99},{"version":"e07405f56bbe97799f28fd03234746872e9cc1034d960ddab464ca2addafe97a","impliedFormat":99},{"version":"fcf1731e58d749cd5602ef695de1ccef29488d0e1692a1b7ef575e1c7b05a256","impliedFormat":99},{"version":"fb30274713f66bbd3d2b7f13207a5797baf49dc3f8a4800d3b313317eaeaf5a7","impliedFormat":99},{"version":"98fe6880dd0279fe6cb2aabf8a4222754b736bc9a18137fe8580b4f197d5ace3","impliedFormat":99},{"version":"6583c05fd8315e2fc2154b3a5d6d0f0a41190543f8172857aacbd6763f4a83a8","impliedFormat":99},"eeba510d62940b76c44a337bf1e0c8fca80e24e5168e6032effbe4ac85c5422a","72469fc83ee49131a52143ef1dace4826b5dbca6e08783b4baa55ae9090c2861","ba091ea97259f2a032b32954e0077ac48b1fb905c782062ca16cc421d24a1704","408f7321f86889ab6eb024ac94765af0c5fad59ea0f7aeb1f51f4a3a6ab07b2c","165cc11a66f7312b81578f4b022759974f99eccb32f360de7b83588bd358bb36","509f243bc2fc60843898fa4966a994f4da0ac9cc53879d2a2453713da1f6bf13","dc2ab2e46879814c5d670445fe22840e1a5855ac29daae8eea757e847f163853","d8396c33de0875f6d794e6f139cbec5fdb789b059218bb79d7f39e067ea69999","fc870adaf8aa8bda26bbbb47efa31a08bc99e5858fe8228622d0dba07a4892ef","41a78604bb28ba4ded7267f2e93222af7d0cdcdaeb62047e20669bcc7a7c89b0","8a1fb407ac8010a92c29dc1f8aef44e7df92838f7094431622eb7d66307f19de","5f1f5b19a89e11c075b654fde72f6b0cd25c74c95a7055948fccaefd6a1b4094","65425930ac44f63984748105a58ab4b6770ea7032eac4fb866edab589879ed5c","84126d1121c724e789b0a71a86eef6886da958cec20d33fabfe4dc825b2ca319",{"version":"5ebc6dda07cd1112abcba3da894fafc01c04b37f55bc94bc110da3a662236cee","impliedFormat":1},"c9c25a6f6c358d5f4541da1ec793b51cc14ca01b60b03d8b6ed2d9c6411eddb5","3abbd6b8444b0b6f7b16c63acb05c4b34d1d8c3c1d4664cab72ab1544e526382","79b08e74c0c8e8789108b1a46d33eaf5642b211b1e235c6d7cdfa2ea75eea395","e85f36044cc9da429f7eae125efecd593821947a6cb7f37122b1e8669d11e96b","ef5463ae792be418909f30753cef2e645ac66ba69da76c3c00e9c9372e7bab6a","287c288aad65ac2541cac4196736829703cc440b90dbfb37542496c89d285c39","19a1f7a62d5e762a70d59739ea2eb8b0eca8bc99c89d65fa6ed821342e999c30","0cbb8bf772fe26d11e24806435f12c90a4e063f308b1373f336c3b7cceca3022","ccea8bca3784d2c1a05f231df41e2748c53952005ba1a5f57ce1dc3e5f994699","eaee72f2e9967af3d0c68119500e4affa5bc99407060cada612ee1006630a350","62f45b7827e67828cfc7cd5ae548542112146dc7c5948c029741c34db08506d6","83f2f457aa667c95fd6effb3148ebaf03e2fa205f08a8872aa38b6b434694617","f08336c4ea29de4112e593f883c646969bb157496f182f2e27d710aaddb5083a","8c38bfdf4f260a852fb0f4e12d1f4060eaf5cacffe08b63744981cd7d2587618","47eccc5f5f6395d6d43b94e0e781e34d9c855ee7d3ae1014e943b7cb6d1b31b2","fdb7c131969a5dc03f71410d268c2ecc5a4dafdbbf423fc6f15ebf71639fa408","fa3802ac2da70bb4e1f4d5c2e87d74d2a73fd3a88adf7abe18768e859a4e93b5","f9611b99dabca47370447c5bd0dab7d80080cf13f6727c4c84e0617f15382391","6df4eb003f579a65ff5ef10f1706a43b0fb46b3c41539ba3cc77a7fce660e761","c3dd98d3c74d61ff6cbd7774abc5c39ddf5e09e77d25b1986b6b9ff2e4d0f98c","a2828144ef04d74eaaf5476d0d4a18abd80ff51bb15a95279c3707cefe919d16","a3678370d897e0a4327655193a086021d0d0253a422cde486f0b4f1b285bf2f5","4098d19501e19efc4361b226f60fd78885ff1aafaabb3a6c15069a1c5a925cc6","953547814c6b3905a89fca5bd39b2657c4c27d8de9742967d157546ecf752faa",{"version":"f634e4c7d5cdba8e092d98098033b311c8ef304038d815c63ffdb9f78f3f7bb7","impliedFormat":1},"ee4ecc4281b6a2beeac41574ab649dbad74f507610a72ed02b3358ce08f0df9a","6b6be205c2f7c219d8d8321c912cc2b4495f5836c2f1e8d800c99da34d9fb6b1","601fe7a3deedf431b5b95b57c00fa30ca9e23238096b0b22e796b3bcdb8e5762","8640dffaf67d8b104afdfd46973044d189abed4d8908b1d07ac18fbd887802ce","56bce40eb8c373e68c75e66b34f1d150ed9bcf631b432107250eea0d2b90729c","9b677b0632b0c443b9dc9673673d3284b1be8a519aec1fe29c4445641aaef3e9","4a73b01f6f674e9cfe1207e0e493f8399768f0e80c648475dbcb99d6fcc04026","680ce76340ddc980a78ce8ced08228093fd6ad0527e3d5ff690b5f4471a0c901","7fcdbee9a203cba5b9399f8f823bb4645b93cfb5c2657aa2ff43d70396db09dd","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","a1724e8561b1f1cc013a15085623bda8cc7c99e01bf770cb2e116d4197f4e125","bb8169637f881a91bdb5163865115dbfb5fb6976ac57ae25b90534aef8c0b0cb","d3ebf1de32372293184fc36997d3d9ebe50f42ae3706ad66be3e2161c5d3f996","7fe5d461f7d8a6764b36b3564d1dbd6079db976524cb566b7837fb6338c25702","acf8deae49402c28c201f290299d8bddf89170a3a1d9ad922b774659926cce05","820baad9a1615caa4560dafb2e408b3ba2233978486152cf0ee5e94d7b4c4406","08a7e7a20aa0312178f967ac9b08eeeecf2e6d3cdd1ec274845264a394771f7d","c49daf3fa74dd538fb4a07abde393c497ce9399eed506508f056b468750ab5ae","11240a2dec7559a7952a665f0a8f75325baf18eced410fa3e4e1f75773557efe",{"version":"c1424847f8905ee22d15ce094f27ac27a0b33801fec847dbaf9b1239a5c2abd9","impliedFormat":1},{"version":"222ca30f5d8caedf7c691abb6ec681b4fe9d6a6008418f0c5f27ca64ee30e536","impliedFormat":1},{"version":"21317aac25f94069dbcaa54492c014574c7e4d680b3b99423510b51c4e36035f","impliedFormat":1},{"version":"a43e9687b77e09d98cf9922bfe0910bb0ed7e5b910148c796e742764ce7dc773","impliedFormat":1},{"version":"faa03a3b555488b5ce533ce6b0cf46c75a7e1cd8f2af14211f5721ef6ea20c82","impliedFormat":1},{"version":"48972568ae250a945740539909838fed7752c19210dfa7cf6f00dc7a7c43b2c3","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c60b14c297cc569c648ddaea70bc1540903b7f4da416edd46687e88a543515a1","impliedFormat":1},{"version":"f734b58ea162765ff4d4a36f671ee06da898921e985a2064510f4925ec1ed062","affectsGlobalScope":true,"impliedFormat":1},{"version":"37f96daaddc2dd96712b2e86f3901f477ac01a5c2539b1bc07fd609d62039ee1","impliedFormat":1},{"version":"9c5c84c449a3d74e417343410ba9f1bd8bfeb32abd16945a1b3d0592ded31bc8","impliedFormat":1},{"version":"c0bd5112f5e51ab7dfa8660cdd22af3b4385a682f33eefde2a1be35b60d57eb1","impliedFormat":1},{"version":"be5bb7b563c09119bd9f32b3490ab988852ffe10d4016087c094a80ddf6a0e28","impliedFormat":99},{"version":"fd616209421ab545269c9090e824f1563703349ffabe4355696a268495d10f7d","impliedFormat":1},{"version":"2bfa259336f56f58853502396c15e4bf6d874b6d0f8100e169cb0022cf1add17","impliedFormat":1},{"version":"4335f7b123c6cde871898b57ea9c92f681f7b8d974c2b2f5973e97ffd23cf2d6","impliedFormat":1},{"version":"0baa09b7506455c5ba59a9b0f7c35ec1255055b1e78d8d563ffb77f6550182b9","impliedFormat":1},{"version":"6e22046f39d943ade80060444c71d19ca86d46fb459926f694231d20ab2bb0d7","impliedFormat":1},{"version":"5746eec05ed31248906ebb6758ba94b7b9cffffc3d42acffbca78d43692a803b","impliedFormat":1},{"version":"4e62ec1e27c6dd2050cf24b195f22fbe714d5161e49a1916dd29ce592466775b","impliedFormat":1},{"version":"73a944adbebbbe7fbb95633f6dc806d09985f2a12b269261eaf2a39fc37113af","impliedFormat":1},{"version":"62dbdb815ac1a13da9e456b1005d3b9dd5c902702e345b4ed58531e8eeb67368","impliedFormat":1},{"version":"dcade74eb7d6e2d5efc5ffe3332dcca34cbc77deff39f5793e08c3257b0d1d5e","impliedFormat":1},{"version":"b684f529765d7e9c54e855806446b6342deed6fb26b2a45e1732ae795635e3f8","impliedFormat":1},{"version":"4f396ea24b6f3ab6ecef4f0ed0706fd0a9a172ae6305fe3075c3a5918fc8058a","impliedFormat":1},{"version":"9510b8d401c048793959810320907fdc1e48cd5ee9fa89ff817e6ab38f9ec0c7","impliedFormat":1},{"version":"095dcdce7d7ba06be1d3c038d45fe46028df73db09e5d8fa1c8083bdad7f69e9","impliedFormat":1},{"version":"9ff776be4b3620fb03f470d8ef8e058a6745f085e284f4a0b0e18507df8f987c","impliedFormat":1},{"version":"aec8b4f59af523795d78e81546f332d3a4b4354145ae8d62f6ca7e7c5172539e","impliedFormat":1},{"version":"1801a58e8cbd538d216fbea6af3808bd2b25fa01cf8d52dba29b6b8ac93cb70c","impliedFormat":1},{"version":"7f6f1344fb04089214d619835649dfd98846d61afda92172eb40d55ce20bf756","impliedFormat":1},{"version":"b44a6e4b68f36c47e90e5a167691f21d666691bdb34b7ac74d595494858b9be5","impliedFormat":1},{"version":"64843c2f493a1ff3ef8cf8db3cff661598f13b6cb794675fc0b2af5fdb2f3116","impliedFormat":1},{"version":"9a3c99fc44e0965fe4957109e703a0d7850773fb807a33f43ddc096e9bc157a5","impliedFormat":1},{"version":"b85727d1c0b5029836afea40951b76339e21ff22ae9029ab7506312c18a65ae1","impliedFormat":1},{"version":"a9aa522e35cf3ae8277d8fd85db7d37a15ad3e2d6568d9dac84bace8fdfd2f84","impliedFormat":1},{"version":"435bee332ca9754388a97e2dbae5e29977fe9ad617360de02865336c4153c564","impliedFormat":1},{"version":"50a620c81335293fe8ece235ee4a98ac2b57ccafa1fd5fcfa6dd643c78fcf338","impliedFormat":1},{"version":"3fddc045333ddcbcb44409fef45fa29bae3619c1b9476f73398e43e6f8b6023a","impliedFormat":1},{"version":"8887d5fd93809dea41ca8b4eae62be35d1707b1cf7c93806dc02c247e3b2e7bf","impliedFormat":1},{"version":"f69fc4b5a10f950f7de1c5503ca8c7857ec69752db96359682baf83829abeefc","impliedFormat":1},{"version":"c0b8d27014875956cee1fe067d6e2fbbd8b1681431b295ecd3b290463c4956c4","impliedFormat":1},{"version":"bebbcd939b6f10a97ae74fb3c7d87c4f3eb8204900e14d47b62db93e3788fb99","impliedFormat":1},{"version":"8c1a0843a9d238f62ca6238473b50842fde3b2ab8cb8ecb1c27e41045b4faae4","impliedFormat":1},{"version":"4895377d2cb8cb53570f70df5e4b8218af13ab72d02cdd72164e795fff88597e","impliedFormat":1},{"version":"d94b48b06f530d76f97140a7fab39398a26d06a4debb25c8cc3866b8544b826a","impliedFormat":1},{"version":"13b8d0a9b0493191f15d11a5452e7c523f811583a983852c1c8539ab2cfdae7c","impliedFormat":1},{"version":"b8eb98f6f5006ef83036e24c96481dd1f49cbca80601655e08e04710695dc661","impliedFormat":1},{"version":"04411a20d6ff041fbf98ce6c9f999a427fb37802ccba1c68e19d91280a9a8810","impliedFormat":1},{"version":"2fb09c116635d3805b46fc7e1013b0cb46e77766d7bb3dfe7f9b40b95b9a90e0","impliedFormat":1},{"version":"e1e5995390cd83fc10f9fba8b9b1abef55f0f4b3c9f0b68f3288fda025ae5a20","impliedFormat":1},{"version":"33a2af54111b3888415e1d81a7a803d37fada1ed2f419c427413742de3948ff5","impliedFormat":1},{"version":"8a9e15e98d417fd2de2b45b5d9f28562ce4fec827a88ab81765b00db4be764db","impliedFormat":1},{"version":"0d364dcd873ebebc7d9c47c14808e9e179948537e903e76178237483581bbf6c","impliedFormat":1},{"version":"c9009d3036b2536daaab837bcfef8d3a918245c6120a79c49823ce7c912f4c73","impliedFormat":1},{"version":"261e43f8c2714fb0ef81fa7e4ec284babd8eff817bcb91f34061f257fd1ef565","impliedFormat":1},{"version":"8c4224b82437321e1ba75fd34a0c1671e3ddcd8952b5c7bb84a1dead962ff953","impliedFormat":1},{"version":"948ca45b6c5c7288a17fbb7af4b6d3bd12f16d23c31f291490cd50184e12ac82","impliedFormat":1},{"version":"f77739678e73f3386001d749d54ab1fdee7f8cbbe82eeecbe7c625994e7a9798","impliedFormat":1},{"version":"2d8f3f4a4aacc1321cb976d56c57f0ec2ad018219a8fda818d3ffa1f897a522c","impliedFormat":1},{"version":"fed7372413e875dc94b50a2fa3336d8f8bff3d25cac010aa103c597e7a909e1b","impliedFormat":1},{"version":"cd069716f16b91812f3f4666edc5622007c8e8b758c99a8abd11579a74371b17","impliedFormat":1},{"version":"e4a85e3ebc8da3fc945d3bfdd479aae53c8146cc0d3928a4a80f685916fc37c2","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"eb9271b3c585ea9dc7b19b906a921bf93f30f22330408ffec6df6a22057f3296","impliedFormat":1},{"version":"81c4a0e6de3d5674ec3a721e04b3eb3244180bda86a22c4185ecac0e3f051cd8","impliedFormat":1},{"version":"a94d1236db44ab968308129483dbc95bf235bc4a3843004a3b36213e16602348","impliedFormat":1},{"version":"1ecc02aed71e4233105d1274ad42fc919c48d7e0e1f99d0a84d988bee57c126f","impliedFormat":1},{"version":"5fa7ac1819491c0fd5ba687775a9e68d5dfee30cd693c27df0a3d794a8c5b45e","impliedFormat":1},{"version":"da668f6c5ddd25dfd97e466d1594d63b3dbf7027cccf5390a4e9057232a975cd","impliedFormat":1},{"version":"53042c7d88a2044baa05a5cc09a37157bc37d0766725f12564b4336acecf9003","impliedFormat":1},{"version":"5d0f993092fa63ffe9459a6c0ad01a1519718d3d6d530e71a775b99559f37839","impliedFormat":1},{"version":"b2a76d61ec218e26357e48bcf8d7110a03500da9dc77ce561bbdc9af0acd8136","impliedFormat":1},{"version":"13590f9d236c81e57acc2ca71ea97195837c93b56bfa42443bf402bc010852cc","impliedFormat":1},{"version":"94cb247b817a0b7e3ef8e692403c43c82c5d81e988715aeb395657c513b081fe","impliedFormat":1},{"version":"4e8cec3e1789d0fe24376f6251e5cbe40fc5af278c7505d19789963570d9adee","impliedFormat":1},{"version":"7484b1e25cc822d12150f434159299ab2c8673adf5bd2434b54eb761ede22f76","impliedFormat":1},{"version":"9682bab70fa3b7027a9d30fb8ae1ee4e71ecb207b4643b913ba22e0eaf8f9b35","impliedFormat":1},{"version":"7148549c6be689e63af3e46925f64d50c969871242cfe6a339e313048399a540","impliedFormat":1},{"version":"172129f27f1a2820578392de5e81d6314f455e8cf32b1106458e0c47e3f5906f","impliedFormat":1},{"version":"b713dea10b669b9d43a425d38525fc9aa6976eff98906a9491f055b48ee4d617","impliedFormat":1},{"version":"fb0ca8459e1a3c03e7f9b3f56b66df68e191748d6726c059732e79398abb9351","impliedFormat":1},{"version":"f83a4510748339b4157417db922474b9f1f43c0dc8dda5021b5c74923ed9a811","impliedFormat":1},{"version":"3d04566611a1a38f2d2c2fc8e2574c0e1d9d7afd692b4fcd8dc7a8f69ec9cd65","impliedFormat":1},{"version":"0052687c81e533e79a3135232798d3027c5e5afff69cd4b7ccc22be202bbbf4f","impliedFormat":1},{"version":"ba4c1674365362e3a5db7dd5dcca91878e8509609bf9638d27ee318ca7986b0e","impliedFormat":1},{"version":"a49ee6249fff5005c7b7db2b481fc0d75592da0c097af6c3580b67ce85713b8f","impliedFormat":1},{"version":"e48395886907efc36779f7d7398ba0e30b6359d95d7727445c0f1e3d45e736c0","impliedFormat":1},{"version":"fd4a83bdc421c19734cd066e1411dae15348c25484db04a0a2f7029d1a256963","impliedFormat":1},{"version":"92b35e91d9f0e1a7fd4f9d7673576adb174ca7729bad8a5ac1e05ebe8a74447b","impliedFormat":1},{"version":"40683566071340b03c74d0a4ffa84d49fedb181a691ce04c97e11b231a7deee4","impliedFormat":1},{"version":"f63e411a3f75b16462e9995b845d2ba9239f0146b7462cbac8de9d4cc20c0935","impliedFormat":1},{"version":"e885933b92f26fa3204403999eddc61651cd3109faf8bffa4f6b6e558b0ab2fa","impliedFormat":1},{"version":"5ab9d4e2d38a642300f066dc77ca8e249fc7c9fdfdb8fad9c7a382e1c7fa79f9","impliedFormat":1},{"version":"7f8e7dac21c201ca16b339e02a83bfedd78f61dfdbb68e4e8f490afe2196ccf7","impliedFormat":1},{"version":"01ce8da57666b631cb0a931c747c4211d0412d868465619a329399a18aea490e","impliedFormat":1},"213ad373140df0a50f29629fdf76b3452d6622eea13892017fa0900f7deef915","030e5c58236aa7f9bf8198aabe62acd40ea633441dcb03c945e9af50187ea8f3","7f111f151a7e06df08fcdea8c8c7cf07773d5dd4b7c054cb4bc4a68c8183053b","40cdd301a4dd3e16c57dbd2b1eb3ced95bad545c628e20e5447a3b5f889f6612","99041c8d5f6a8ac6bef2ba8d04a1e309d26c44e00f4e16fa6322158593c64664","a932530c7a79b2d9cdae78502cc17ca9ff9a3ab181721fc6d54bb6932e879d7f","9dbc1429ebffe1a654b52f0eba8347e3f70120394abc18e2eca8dcb161657a7d","dbd2cc6fc4ac28b4a0d6b9f42ce39a41989dd55a61b6ecbd0ad7c434bf0ea5b6","da2f7b65ac2a723aeb06596430507eb2938e45686d9bc2c0add6f84a929393dd","76ad78446118739aab074b5968a3e6f72e8dc62a7d0033ca18d9b09ac6996e79","0635f2957c5cedc910e98136c70ddb0db0c9a9dcdc5f5d90f81ce9fb96351016","714c58a9fb0cceb00a7b392c39e1c12931fafdfa4d7bdcabc0969f20958bf3b1",{"version":"112dc31db3c5f45551532c2f0ddd2b55c98762c3cb5fd113f7c255825e6e04b2","impliedFormat":1},{"version":"f684f2969931de8fb9a5164f8c8f51aaea4025f4eede98406a17642a605c2842","impliedFormat":1},{"version":"a5f9563c1315cffbc1e73072d96dcd42332f4eebbdffd7c3e904f545c9e9fe24","impliedFormat":1},"537c60cc939aa9ebe0f132f079c54518800270cf07658aaed062c9c5bf49d89c","24b40f03724af00fc84b40f05d23653b86bfb1148d3d9c68c896c59a75dc126b","057377e80ed9e60458c371a7c418c1ee94aafc61200dc76e0b57509bdb8c39d7","c0f33a9a1fcf7479b22e85bdaec3f3ba298af59fc7ca01c4010b5577c9fbc9de","412234ba91bf26fdea70539e3857a755d4df3dfe89e02c991b777aab277e93d3","f2c633cafe5f267180f33b905efeba31afc34aa28ab993b71f1df88d3d42b889","2fd8da634f6886688c2243bf6a6a4906a5fc7367a4b4f4be3836f4e02d64981a","437084c28cb5167b0a7fff96be62ff003d61014bb5c95b06d09d90469299fdab","f44c08eb82c9597e997ceb18f11cec90c4fe852c7020895bb9b9aa134dbf5782","42d68e6bcb0ed9caa27f0e000cf6b4f1807f9d4f19aaadab96aaebff047a1659","7548b92f1cab9788ce77476e1aa19a75e35878318ab01cf85d94d1b1ca4dd7ea",{"version":"59859bcb84574c0f1bd8a04251054fb54f2e2d2718f1668a148e7e2f48c4980d","impliedFormat":1},"229e51b718ec73fe2ae477dd3e806e4f7c664ef2e4b11992b133cd5e88a62ae7","1b9fb9d3dd602cf2f896f632214761b7166f5418109506088465610c779af49a","cfb9d4c84f88df7696c9f7c322f318fcd7bbca2d2c596ba873d9f1bdf764530a","8b7e231ad7f653663ec73ad26247d0cd5e7d35e3d5b12ce3da6e0aa0e4001053","70f16bfa2175b14ba13ab9ff58dbfdd228cb9b052c9c750391321901f083c5e0","6ce17ee613a50c581a60897768305a180d1d5f6e640088a2f9384337212c7f01","4bd7806f049072088ef648c119d67c376b5344a220a696e57d21e8e4939eef34","50a5b830c27e9fc37b4eb2d005e7f0244b12f670933bbbe0efb0f84dc71ed047","c63c0fc3b08775feada3fd6bf2e1157a003a16ad03dabf5e20039f416b27b04e","4a054814a938c360679e10ea2e1527950ce704e6e23a82c86db4919062eeb572","18d5143c39c2c30c6d61cb8ce3a3cfd4186fc3d20a9c239dcdbe87b2c8ed0e92","6ee2e857dda78c2bc234cb70eb3f518ae34f90d5d12cdcb9cf5b448286c934eb","994613927d0018e8a87a36da90fe511e060a504e73a16145c44ddc379ec75b8b","a7b5366f81ad2f479f8a903134616854c771bdf92d59f07d988ac3d8eed0dcf7","addec90cc46edbf37e12b60fb40cb89e1c399b87115a8db6dc39ba4bf93f6a7a","0668e3ae3d270721445af9af795f22ff2cef360a863cd58879548591d102172a","78153c7c76808d5d052c545a26922b5ba00c18662e28373948553e65b2b0efdb","a0f166e786489be569a8d4f9efbdcc2112b65ec9da62609cf81df5e349f738fe","1b2209633f15373b4bac9004faf57e9b811d76116b2610dcaf62834fb98feb41","ba611ef2d86222e66a3bc198699d2d72d3347bf6a94d5f8fb543daeed3be9e30","708d17f118e3efdd58414efbbf70b82750c63188be576958144374f7ff843807","97be299fafbfe018a8711788ec43f16eda790ddd9b7ea64b7f7283207ba0bf0f","7691cc161d0915884e3424fd9f735ee09c8411408943bae5a1f2416bafe2790b","90230f5eccbadef20c8ef643dd8a2e89cd8281fadfd47e70fcbd88a5001fad8e","2a67a31d69391399295b0f514e2906a77cc0c1ea8c57c9e47ce9b9d240c48c66","a28fc1e484e8896c9fa354ecf64a5d765f4d3949fe1c83eca79b08d8689c54ef","752263159b1f0b63d987e7b51e19296afbcdbbf12f233524b50ac44f7a9c0f9d",{"version":"b755af7e6586f12f733ffb6180fa9d4016a4bdb170c6ab8cde46da2b00c40ab6","impliedFormat":1},{"version":"23901b00275929d1d9ac641fe5b936ae9f713892774cf649ff61c187d5d78834","impliedFormat":1},{"version":"c756eb57917c522e7e71b4092a99ef00392ba2d3679993d2284ce67924ef89bb","impliedFormat":1},{"version":"ef0af68bcc5140982f363952e2b39e334dd0088de6b678882f15cd6b8790f089","impliedFormat":1},{"version":"40d0c5025626e09eec5e22b1e235911406a2bac94de249b32c821a52a3f385fe","impliedFormat":1},{"version":"717a58665fd9fa8b5e692ca22b2cf1a08e88f7092b33f86ad9a6cced9ae2f66b","impliedFormat":1},{"version":"037824942bbafcbc6d8cd04fbd7de34782eb5c9663d1e2b74b14e081580de252","impliedFormat":1},{"version":"0160898eb05ec26605b086e99337f2ae0dd96ac56c50721e49b45f6d660b8fe4","impliedFormat":1},{"version":"08d7cc0514059fc0edaea53b3eaa5b192a9282838a489f9833bfc01016ee82b4","impliedFormat":1},{"version":"f36d4553d39769f8532d4089839d721d60e7cc4172377c881957fc66bf31159c","impliedFormat":1},{"version":"7e8844a6188d46945ba9297ff5b279ad03570100c9829f48841820c3adcd6e7e","impliedFormat":1},{"version":"ba6f3c2c8d60e9c04d6ab1f6cadb15711d110e56d12eea9479ceab8903083ed4","impliedFormat":1},{"version":"b8d2fefde98ec1e59b31a42502fceecc4d175e054fa8d95b579b0ee57f77d2c2","impliedFormat":1},{"version":"ddf2c89c72f74a48ac605ab085117083116d962260d67f2dc5792530818c31d8","impliedFormat":1},{"version":"12d72cb7f5b809d224487ae87d2d94110627167cb9a497bca6870ef289d3fa7d","impliedFormat":1},{"version":"59191b41d52259a0a99de214ff4ece04034d75af21402a0ca2508e4ed5f2038d","impliedFormat":1},{"version":"f66c795ba7a1d4fab1ddee3ca97850434794dc6e87feca980049c5d31b985cb5","impliedFormat":1},{"version":"e625e7c2fb9593239a12781d07a74409b02bc21a60ba8d678c76a43acb4b0bdb","impliedFormat":1},{"version":"d200231788b539bd83b4a87cb1c23ea1a4da5178564481ae550d42809bb79a3d","impliedFormat":1},{"version":"ac777de000b0ecae01ac7b74d6af15c044dafc85affd925d528246a848ae03e9","impliedFormat":1},{"version":"6d8750bc163e97118a3089e56f15c357f190eb48a508f94f434b902046bffc40","impliedFormat":1},{"version":"57dae311d85632146b836618e2f2bc010b6fdb9d9599ebed05218d0f2f42a0c9","impliedFormat":1},{"version":"1dd2397025f702f95641bed6d2f241c9acea1ec52d15bbe3505f21164b4a135c","impliedFormat":1},{"version":"4b3ed5b296b18b500e706b7a40ba85c5f276faa7493e5c70614d7b2f65162878","impliedFormat":1},{"version":"bdf54ddaa4ca9dc032fce1e29053780796ad5f618b28c4853514a79589e10d11","impliedFormat":1},{"version":"12e08f8f71ab7b1586b4ed8ccb91a0dcd26988b740c12a0c3fba654f3c1221cf","impliedFormat":1},{"version":"07d1b2acca3268e6718feac08549686a47a427e9262e8619e78bdaeb42bac499","impliedFormat":1},{"version":"1bb7e8d8bca3a14ce97db0a35b4d6900053f14994940bd671c5b52720e61ed6c","impliedFormat":1},{"version":"58a02f0b17a2fcfce30b8e44ff130dece51a36a51dcdd238b947aab18173d75c","impliedFormat":1},{"version":"aaac8936e739cf3217763c4ede982970ad0d217654a6122d1862ea23fa8455ac","impliedFormat":1},{"version":"0322767b595b4eb5e418439eb4c34f54ce1b86a4b1058bc26cc6c0fb63397215","impliedFormat":1},{"version":"bd9be05e688cdc973b798f2d82fcb32e04a6da2e14cbb0136aa51640bb9e56a3","impliedFormat":1},{"version":"12456fee1f6a0f0cbb2df9b60fe678b9882e04115bd6292245b3bbed4919417b","impliedFormat":1},{"version":"00d285f394120f9a011cae682f339f39b159c2b2cd9547f19c9f2da86091012b","impliedFormat":1},{"version":"d8dc3f16f697de412f06f63843e81990443a4341111b43e014634d0f1e0c0897","impliedFormat":1},{"version":"08a969f3674f4fe7ea484478dbe2fad284bbc5c9d0d866d9a446eb5bb9fa9d04","impliedFormat":1},{"version":"8e1131e46fcf2abcfed9fe98e05b74dcffec6a573613ca8b978c0cdc73aade4f","impliedFormat":1},{"version":"433c3148307f24b918f467435a8d04f7e2bb525266b0ab16497f6c1e7a4511b0","impliedFormat":1},{"version":"ee128e48e1a082dac53353c3ae366ca0c5cacd20b88547083580185e403fb1f8","impliedFormat":1},{"version":"2bb2e7f076c90a609e42727536171065939d2e2b969c53505eec040a076835bc","impliedFormat":1},{"version":"c240edf2000389a24d706f622bbd44b7e2fb9786ff6e4b3cc08961fb77466f3d","impliedFormat":1},{"version":"6b8a126f742ed8fc0d7da914ac14a086653036a6f6449c16b69b98ae65e9e2cd","impliedFormat":1},{"version":"73f01b36b5762bb71acd37d3467761e5b7e3cfdc97fd9c3a0cde3e1a214f9c9e","impliedFormat":1},{"version":"c10c031d54c3f28c652d866025cd667e4196700323a129b1880e9e0c526e4425","impliedFormat":1},{"version":"ac4a6d6fd89de4f7b2f5857e516cb18eee171efcc65f2bd8bcbd873ae500d3f0","impliedFormat":1},{"version":"983fe0b3ad730f9ed6e43a87a94adbf05a4d923c08cb76f398509b2b396c2a34","impliedFormat":1},{"version":"47eda026f91d1cbe95c44407e6790bcd143a049ad7c9374e357844c887e5cfcb","impliedFormat":1},{"version":"eb08ac47a48e7e11aa7d645b7aef7ebd92a31115265390afcb30db695a9dac9a","impliedFormat":1},{"version":"1a6fdeeac2dc1fa757b8401e5818f48fb9fcd7f7301bb2eb65dafe329c1773cc","impliedFormat":1},{"version":"330eecd512c1359396e37b9b2552413e38e62bc32253684f2f3f22b6fde98e99","impliedFormat":1},{"version":"efe2cff9c8b8139e8d6483dab326f76f59719c55eafe03dfdb231d187bc4a769","impliedFormat":1},{"version":"2ad74cb06a3358af357ff5fb6a52dc8a98038760aba767fb0fe31f8292cc4a22","impliedFormat":1},{"version":"8b85c5a1c89abcfffb6e907794ec57c9693bdbcce5204851bd959a348a432c9c","impliedFormat":1},{"version":"71c748a3c636f024e72ad60b42b6b1cf1bd25a40dbf59e9050750f9d32d663d4","impliedFormat":1},{"version":"306ed4fc45fccc30ed61a862e63c51c2dd7b1d072affe0f317caef6d3568ca51","impliedFormat":1},{"version":"512601fb3c0b1df7b8cbedcf17f1822279da81e1bb24dfb6a4a3498323b838e0","impliedFormat":1},{"version":"911f742c603b9e8eb3dabd62af309ea39e07881075ae273b55a788369d306e12","impliedFormat":1},{"version":"2f84f1b0e0a5cde0c3a4534a587643d0ebae73cb30f60acb30db41bce16d872a","impliedFormat":1},{"version":"f9a5a9d0b65368c1c06bb096775a62ee1eb8987f8af1b8822ffcb9068a7e040f","impliedFormat":1},{"version":"72c54e696323cf104e188c0fbad18e1d5259220cb19e6e32af4423da63136e74","impliedFormat":1},{"version":"7f06fa546d14845c034a7d8799af51aeb7b1b6aa32851f404f1181240eed664a","impliedFormat":1},{"version":"4355be72d3dc32bc654599785433ec919f074ccf0aa76e67ca5c856e1e6a6c6f","impliedFormat":1},{"version":"ecfdff1e69924d7532f881214b73f0d2d42e970a23a1b7fdacb2855bb51890f5","impliedFormat":1},{"version":"30e3408dec5c501fc3b3d5cf1aeff8995c6eb920c5dba09c961ef863fa03cecb","impliedFormat":1},{"version":"cd405f4d4f16e27fa035a800f2fb3795237e9a13d66ce3871223f0e9f7b89cd5","impliedFormat":1},{"version":"694858c22bef98ad684473feaedba6407b5050f4b561c682b9eb262dcebb6050","impliedFormat":1},{"version":"c4f511b6d5819c9cf48ed8afe2279021d64b6bd19f45457b1e67b4c77c3e3987","impliedFormat":1},{"version":"dfbd7287b0e7901b1a4ddd9785a1018c150b4d83ff7889f241c8930228720d33","impliedFormat":1},{"version":"8e426d99222fd1a005d056830ca0cfda8855926f4ca36405acdb3e0cc3fa1603","impliedFormat":1},{"version":"069418382cce426d26e8628acb259f9f44bc0a0eee322e23a003718391a01f85","impliedFormat":1},{"version":"809832c2dcfb1b62496c681c621b65496380ef3cce1210a9a182e93761c8e15a","impliedFormat":1},{"version":"32465089ce12fdc4d42c6732a0a9936b03b1df37dfa43fbd43c446616f9bd89e","impliedFormat":1},{"version":"37fe361819bb20bd408ec9469c4fce0cc34de7e1e38ee10b716999afb24b42d1","impliedFormat":1},{"version":"c1dc7b12a68fab0740f0830e06dbc92e157fc54d8f00ae2051c414702c7c2320","impliedFormat":1},{"version":"a965ab22b063aa810b46ef3aee4f22256b99b677dc93cf74648fab47e71e3df5","impliedFormat":1},{"version":"e8fe4948cc2b98faa377118e02340b09bb385ed034ba718169b737ad2c5952f1","impliedFormat":1},{"version":"82cb3b09fd11fd75e4b52b49896dd8fd00bcbcd718a58ee8a5c2a93f728e87c9","impliedFormat":1},{"version":"cfec31c6d46543642f72ad8a4773b5ac312dbdf8009db95e96f8ff909ff363ea","impliedFormat":1},{"version":"3911dce9f32e552733fa7deb843e88812c8326b8ef6d912e4be40a1cec23cb47","impliedFormat":1},{"version":"f8caa66cd73ff876853e225b4942fd7b6a3b83ad6b1e8ab93f92f59c2de10e4f","impliedFormat":1},{"version":"98d3fd370d6d5c39a6dde5d90cb19cdc0e916450c8bb6360591f061e6697d2ef","impliedFormat":1},{"version":"812f296916604f5c21b4d9ee03893f198411242c538e731b485778010476a45f","impliedFormat":1},{"version":"83441ed7a7ba08a4babaaf4e6c14a0e9abac0026593c796efcbee93636f8b016","impliedFormat":1},{"version":"6a7b5bdbc1cd1f6dce4ed78001462da6ece06336da9d9de33ba0d3a6961f627d","impliedFormat":1},{"version":"1aa4909c089e78922fd86d432c7b44da54063c978b7d06475a50ec9cf00065f4","impliedFormat":1},{"version":"51e9912add84b84b95cd1fda6056db88d1dfedddfcb76b21bc3f1b7bab8d7278","impliedFormat":1},{"version":"a9449020023135ac36c6da2f30064aaf0f7f163f268e8c3498c079dd1814c3e3","impliedFormat":1},{"version":"460ffd346377b09b2fb40c76e46dba9fdef9396a30597584ebda23f8a22b87fc","impliedFormat":1},{"version":"b9d588e197263ba9b99667846c0f5df02b36f63a92108026e9dbca7f438dcca6","impliedFormat":1},{"version":"599ee353823ea9990ddb4446dfbdc412cb3931488b09efc9dfa1e063cbdc1774","impliedFormat":1},{"version":"9e805d805bb3da97facc16ca68bc1f514993c2f57cea5e3b56588dc862f882ca","impliedFormat":1},{"version":"259bdce786ee2b01fa1db5da21c1d352725a39247f41bf0447e260829939dba7","impliedFormat":1},{"version":"81b6c06f3a82fd733e687d6a48351f692075c50b6414d0b1d6a75ef9326ee385","impliedFormat":1},{"version":"8cc7153e4e4e0bca031d659f97d5e84baac69c1356d0a0d59d57c892bd3c2ec7","impliedFormat":1},{"version":"ae50e20305aa1b205482a4e8cd1ce708604af9570ace86bd1c562f9bc22cd972","impliedFormat":1},{"version":"61a78c2bf89de4abd29e4ef83532d9700ed0798e09f1923bd97d98d6f56d0e52","impliedFormat":1},{"version":"9aee1aae5aed3a24bf34880bf0d9ac2915e86c7d5635438f8f25967e8513d651","impliedFormat":1},{"version":"bfe6728bf68b9b9c32a110b22ae4488f3eefb97f99533825a95bc0049d9239e9","impliedFormat":1},{"version":"2efea3c14606da0ab5cd8f21267c52bc1ea6268d853478ec20ab8663a99af443","impliedFormat":1},{"version":"84ae3d5b972cb58d0824ea139874adb65fb71d9360de861486b6df8100a02ac6","impliedFormat":1},{"version":"4a03c0c99c635bbc7d03da8a405b9e96565be270d26f96b4bdefc0d3dc4113ce","impliedFormat":1},{"version":"bd52741d902b5e633c1291fe98df8d806c678bebdc8137ce2aa122f61a70f023","impliedFormat":1},{"version":"6b840b6d7fb93dc393ee5da2df281112df8da840431829c675c975c2bf9f6c90","impliedFormat":1},{"version":"369f71b2c501da138f35607180c800a1142bb966b2d9d576f0d73a9bac3de30e","impliedFormat":1},{"version":"5e02c330c99ae35d0331aa5fcde711d5d88c63f85940e1e9a572c47a767d4735","impliedFormat":1},{"version":"7b7836874f4b7b83a50a5ee156c4c07a09ac779816df0b986595b32b7942c806","impliedFormat":1},{"version":"c0aee8a4984eb170ead695fe393f86cdfc8113cb98a373fccbf5ab000879c12e","impliedFormat":1},{"version":"2f7764cef780be407300d78a5e124fe72151cf7aaf98afdab479d7fbaef93f9e","impliedFormat":1},{"version":"088b236b98c7a52d0fcabdb2c3f99a00beb2fb07c6c132663ff43f02ecccf8f7","impliedFormat":1},{"version":"dd3654587fbf684a45bee9ed56cfb3ffed513e43f2685ce2d7f5312fe879919c","impliedFormat":1},{"version":"95747c4d51e248f3a4c1bf3d8af0a156310550bfedad3cfafd98a1f0e8dc41c3","impliedFormat":1},{"version":"ea219824df3236c32b1df7b5138f0e2fc202991c0a8dd1bfbaf8d6294d0fccb5","impliedFormat":1},{"version":"a259aa30a2a790c02a28c9c1b787a399b30ea5929643ad6cc636dbc29d32b238","impliedFormat":1},{"version":"2ee5cd49cda1efec92c9bce5ac75fd40c39cc6e290c586860a44586809bc70ab","impliedFormat":1},{"version":"6a04e63a2cc48b3b3caa50592fd88a0a7cc5bc11266aa727e8b967e34ab620ee","impliedFormat":1},{"version":"37a49b0d8fc98f5ff8ea2adf1dde4c04eeb6077b7d1f846bc0b7cecbbe18fb21","impliedFormat":1},{"version":"4a05bea158985189c5ed63a614f2c1bc654a997c4713407bd56fa17ca6c994d6","impliedFormat":1},{"version":"8cd3164ff31fef2c3cd735ead8126b3c21e17ed50258d24d33933282626bbad9","impliedFormat":1},{"version":"8042de69097e9eb5cc11bbe41afbbfd61a27214e763de3e8e23105cfb3f99d71","impliedFormat":1},{"version":"1bf5ffcd6301672276ed6db0360400c1717f691abc02225c750139b1d79b5d73","impliedFormat":1},{"version":"5e5f85bd22f1d44d029433e6d21848ce2147f87f98e34b91858f5d658213dffc","impliedFormat":1},{"version":"29713346845a44ac1440ec72369b17acb16ac0841618ff143e74de4803cca6eb","impliedFormat":1},{"version":"5083aaa68f2c4d49c7a67b84105e4dcada38b0c20ef9296052f298c965c042ca","impliedFormat":1},{"version":"c38b2d430227660a72bea2392a64d078326b3da9c8d0028e796bfa10ab66ac29","impliedFormat":1},{"version":"9f1291a7c950d063ada723c26aeb67276ab64eeca64961608587c0a7d986f167","impliedFormat":1},{"version":"0e9f4381b359543840b959df050f378b4ee9be685f555f5d83ad178f3a54d7f0","impliedFormat":1},{"version":"765310d31ee527c4b3c74fbed557f646c729cc06a6771c5a1d154027e5e7fb61","impliedFormat":1},{"version":"834a6c9c8f8ad4b91b7cb7ab85f1075c009e3cc71e4b91c72c72a5de400a23e6","impliedFormat":1},{"version":"cee72d95895caf0b0f9669dd75cb38c5ee3ad58a61d04a5b2d831d7abebedb7d","impliedFormat":1},{"version":"00fa26ff70af7c42ec7e7220f3ce178aa38adf38b1bc1a3f882b90dfe3cf4d44","impliedFormat":1},{"version":"f0289d0912a75b603150031a1dbfca882b85332fe36454e3c6636dc50d1ec5bd","impliedFormat":1},{"version":"7be1b6fc521ee5ea539dd44372df6eea072d6d2176226c164c77e1912b40a637","impliedFormat":1},{"version":"3b0a93d62c70dc3526b438305b94e9431a0261cf25e2cb23930c240d19b5bf36","impliedFormat":1},{"version":"47671e93b7d4bcd6c7b01b166e47b69898ee68a432f6187cf28aa9636b07686f","impliedFormat":1},{"version":"10e6932526b838801134a7853afe27f62b8d8c759dcaf5b0fe4dda9503a45205","impliedFormat":1},{"version":"d0ba2ba1f03de162ba71ab4c2860c3944976bbdc653f1545635fcc547dbfa70d","impliedFormat":1},{"version":"60805c3b4b73cadc531df7dfd308fe09d764769f40421f9111e493ba5e7512f0","impliedFormat":1},{"version":"4c35a670a73d73b78d66833971c4515b1e3a344560bc530629b6e666edea824b","impliedFormat":1},{"version":"67edfd56b686a03956aa017b39c5df30c9cea33ecdaed157c15d28b740160cc9","impliedFormat":1},{"version":"587b35a278f570e725d66d542d0aa907c7506c53de909df4573f91783d84bc8d","impliedFormat":1},{"version":"0ff6dfaff2bf8917775eac97f248f2448f5de1520c17582ca8e94eaf7374aee9","impliedFormat":1},{"version":"a16c81cc27f10cdbe0f5410346074672dc9cbca8b6eb4930542aae46ecb29726","impliedFormat":1},{"version":"441aab255084edf0125033d0bc86507037513c52786ebe971b02f2293c3e5005","impliedFormat":1},{"version":"6133f8b1ef013f50192d9b03f591ce140b68da40a8d9f0387f98c6368ff54648","impliedFormat":1},{"version":"35063324f3be05a176fcf9b1d2992e64a2404301ccda6164c39269e9f1479059","impliedFormat":1},{"version":"4ea2690078c9f4efc4973046a4b2078ad0e3d24bc28e9e82b082a11159597ffb","impliedFormat":1},{"version":"748e17dd1562d2ffbd98f91cc62ba42a06ee1217180a01c28bd5c287d4f84297","impliedFormat":1},{"version":"19ffe991b75f5422a68ee404d41518c5db4adfccffdc54560e42c07894286806","impliedFormat":1},{"version":"0b647bca2bfc8c1a6a0c29eaacf72ea8b303bfed2f6b3462fdcf5f7e99bb1904","impliedFormat":1},{"version":"e1a0a13fad17422b41d828404a77f5dad1e6f89716822eefd285b7c951caf87e","impliedFormat":1},{"version":"78f23b71457c4ee54b4f2243bcdbeabba226b08129ac3159d8926d635fe919e3","impliedFormat":1},{"version":"91b243502161ab6abfbb158f56c625f41db7e1c214838fa719cd74632a21f20b","impliedFormat":1},{"version":"0b45f848678808dc286ae748254927c9ba954d481b1b6449741eea74512616d8","impliedFormat":1},{"version":"c2b6904f91baf1b7d7b0889891d0c7c519fa9c339da9cd27809559120722ffbb","impliedFormat":1},{"version":"db5e0909d8d69d3e7e31323c255dc4e102ef60298853be8524d82670b9ceb0a3","impliedFormat":1},{"version":"5e7fc8f2dc6a36d9f9eaa432c1a4df81ee44f3a0086f078ca4ac7371c95c65a6","impliedFormat":1},{"version":"657196fcceb9ffe73b3a7a51144c08fdd390bf832677e766139eb944bdcc62ff","impliedFormat":1},{"version":"75d7ad97219c1ee3d9644375c4b2b264a930954c4bb04981242608cde73d673d","impliedFormat":1},{"version":"51babfbaef89e02a9dd1a097d94d2c315588152292a5e0ff47e8d1b212f4f674","impliedFormat":1},{"version":"c0bd611ff14a86b05d925abd7642e900080c1a319c6fb88b78b5645ed00d896e","impliedFormat":1},{"version":"8db57adefc7f03446f0e423215d98e73c91565cd8329947c673802484fe356b3","impliedFormat":1},{"version":"0bb0499d831040357292f771fbdc58f8547f6fb8a210f745b631cdbc59c7f7f5","impliedFormat":1},{"version":"3d66ec70578a77d6ae1b911f11b699d8824f5a27b60b0a7654c2a4a3f8f63eef","impliedFormat":1},{"version":"958be84f616692d80f91a7068834b3afe971d3169269fa8124e044fc1af85c58","impliedFormat":1},{"version":"3fbd24c6542fe3875a4b8b9b16e3ee85639c3f37cdecc9a1da7cc46d21bec12b","impliedFormat":1},{"version":"3bd25c6340b1ceb28cfefb1f3aa0219255e165fe073bc38d93ce79e30128645a","impliedFormat":1},{"version":"f7ab03eea6362dc98810d98768ea04726f3202b8a333ba57cf11bea2c3b6894b","impliedFormat":1},{"version":"c2baccb4bfab023fa03639a65564c38a6d8b08eff29b2b0e9058c1a996237d84","impliedFormat":1},{"version":"d62fd8a91059d00bf0ff167ec48561b45b82d81e9bf1fb72776a4611a0f65e7c","impliedFormat":1},{"version":"f6f4cc769ff7be0dea84a10ab54309589eac457a7df9134b885f549acc77fc7f","impliedFormat":1},{"version":"1577d7adea2a9ebfa9b93963e1c9c065b7dd2fd0835257b8c81f6a4284c92c03","impliedFormat":1},{"version":"39fc90aea973314d72286a64da97dae8938bb6416567965c9dae1fc0163f9c55","impliedFormat":1},{"version":"001e59ca3b1532d94290429f4829c4c53f321fa5da664516a6aae32db8de0401","impliedFormat":1},{"version":"273524d329ae16fea5f2513cc89c34b138acee383403ad6d970c809b1c92c34d","impliedFormat":1},{"version":"d0884b050f9e8b3886eeb98fc06e9595d4b88f113fe4c745012a7df7bd602ed7","impliedFormat":1},{"version":"490afcc72439be55beeafb1d9255376f84ae39291efff9dcb85c4074244899f0","impliedFormat":1},{"version":"05bd06775fed3f985f6177af0ee69eb61a5e412883095bced0f857c6721051ae","impliedFormat":1},{"version":"46716fa5b84c218ea8d5d74b6e8cb47cd152b9721c39806958d8f7d3fdb51aa5","impliedFormat":1},{"version":"5e375fb01539762d803ee6c3090ed8a66bf6a0aba3aad364a5aed1a29f46a0b3","impliedFormat":1},{"version":"8464bec074e399f11fdd5b53d66721829aad053f950ff717b967bbdb353d8021","impliedFormat":1},{"version":"6e0acdca95efc164525e4413c248798704dcc8f842101834a6dd3f0bac76c695","impliedFormat":1},{"version":"e2c0360001b22eedec5267339665a53ca4eaf9d0b84a18e29cb95fe02afadc3f","impliedFormat":1},{"version":"94a87bc73ae046647dbe02a5644c4d02821b00fcc784ea1ee8b431f3fbd98954","impliedFormat":1},{"version":"5a1a32cb1d8b5ddc6266fb30f1327da71e1e73e427aa733e725d79efc053b543","impliedFormat":1},{"version":"2997b941d09fc255724148c3936d5b6e16855cc90aaeecaa939a4f1f9139f3d8","impliedFormat":1},{"version":"036b9fdf1f25e48598b903289600ffa32db2d74de6b5296620bac80767f9ca83","impliedFormat":1},{"version":"6cd568a22de53e36d58d0b76ac89f225f5f3da83be8084d3261126d25f86a511","impliedFormat":1},{"version":"45aa1054d9692e3e0119de0c9dcd41b9b12a629381f89e7eb8197713ae623b37","impliedFormat":1},{"version":"9ef0145d116d3f4319bb05db267cc3af84e95e1260f6bfa3915edb02ad31c077","impliedFormat":1},{"version":"9b6022cd10ce49129d0e23fcbb9a10485a365e9b8136984f0418aaf48dc7a27f","impliedFormat":1},{"version":"84af0e25a018926338cefbfd646aa5aef7e397bf7859ecd0e655a0cd18cb680e","impliedFormat":1},{"version":"d4036ca334931908c9e83fa66c653c628066fbad5e248d6e5186de2b176d9384","impliedFormat":1},{"version":"8fa98add8a3fd665051325a7b73fd9a5d60f6df748f87cf12a693f45ec2c87e1","impliedFormat":1},{"version":"aa8907c5dadbd2d2a3df6693a699183e51595896198699f531d6e147b9fa59c3","impliedFormat":1},{"version":"974c24d7afdc9a8d62588edcb7a01bb422110a9c187c39cbb6bbf12f01812d30","impliedFormat":1},{"version":"3ff02732e1bff16e072d10337f3284c843ab2e87c1d10d668cbfdf316755dd5d","impliedFormat":1},{"version":"d67a63485acf724cc0973ab9e247e0a64fd0c752c59ebba55163cf69011f5c3e","impliedFormat":1},{"version":"f417187edd7c1084999dc05fc81bf2a1e897436f6ad847fa594c7d25a1646484","impliedFormat":1},{"version":"8fca6962a5cc48898c92cd0d8b52be5a3a5ad71dcd90dddd6b51e00ad24e368e","impliedFormat":1},{"version":"bba5003c132c54ff446103ba375f0ea9b24ffb20af667aa8af8c25459749c69d","impliedFormat":1},{"version":"6f58573cd41b1052d1d87f8db465bd83515939fa1aeeab67fdb9f485a7da086c","impliedFormat":1},{"version":"0a74d0077b169d4a574e8814af1c5d0193d8c9d651bc804bbfecbd4f52b64503","impliedFormat":1},{"version":"82625f6db5c6626bf84d2091fe10716ee287d8a2400eecbaea4e59e0dd4329e5","impliedFormat":1},{"version":"1431716d42fe6bd9851b77b87b02562d83bb7e8f3efc2f43db486aed8e900bee","impliedFormat":1},{"version":"d704494964d0b877d4cdb0d4f1544813e0fd376144db772eb2b8665f3ac7e7d8","impliedFormat":1},{"version":"ddc600fcf08afe23f18162a3420017bf582900d9810fc99842fe2bfe68a846b2","impliedFormat":1},{"version":"c294aebe587fc3bb4cf69801480f043fc5de0d8282160cceda88d70c2f01c35b","impliedFormat":1},{"version":"a12f3793079ca730808a094a9547111583e1ab5da9ba94a24a33fe1f33f33cc5","impliedFormat":1},{"version":"cfeac48afec7d1777c50f3051c19bce2c41d823234905c271405e575d21285dd","impliedFormat":1},{"version":"7b3bb7d03d6ad6525ab33b118f92d3a5b9cd701fc12e00a3aee42218715d2436","impliedFormat":1},{"version":"d1dc5ac5049363568b7d15f60e3042f6d4fc8b124d4cc5ad81d8cf8eee22031a","impliedFormat":1},{"version":"74514767b52a36e3b4d904ee4b7575f43a69dc1bcf0615973d5d6d5c2e50c468","impliedFormat":1},{"version":"fc1356b5cdb46b6e787ac6cc6e41b274c6e25f1f4ca3d904bb9df3c5314a2b6e","impliedFormat":1},{"version":"366d6c286bdf7d12e9353c7d205346e1a753b1c877da0858b5dc5d090a28a1e0","impliedFormat":1},{"version":"f613b7c79534e5e511b920a03546d541d3396fece606469f4337da70ea457934","impliedFormat":1},{"version":"a15bf0c97bb4c79b5ce3164819093d850163b9ab0569c1a9e23bb8575851c466","impliedFormat":1},{"version":"5bde42075f7d7bec85b5d6bfcf203c865990ea5147f360a87c3f595a7ac07086","impliedFormat":1},{"version":"abf9efc08c5505652a33e6d5733b7a5b1dd2914188dc8e3ab0c662d872eea9d6","impliedFormat":1},{"version":"3a6284e2b00cf937a5354263014788f390c75a7880ffb444ae39affa281394ab","impliedFormat":1},{"version":"69316cdeb681622167ddb3dfada8d163e7813f7b4a4e9fb7a090106720c6bc27","impliedFormat":1},{"version":"0b2e37df527c9b2749ca53a04288a2e403b2d874f067887990c6a4e45fcb8fa9","impliedFormat":1},{"version":"ab14752630d74c4d64600b9170efed4eaf9d7aca5f70da58951393b2a1de2ee4","impliedFormat":1},{"version":"205d5cc08ccbb19d3f720b6ca919875e9cd23f8b66c136ea6130ad80a76bac47","impliedFormat":1},{"version":"15dab9d11248b0dd754bf3a2a36f1b5c20ad87ee0726eeecf78dc1b1b497fec6","impliedFormat":1},{"version":"ace5b4f37c5d55f16c2fcd776a788dd986c02a980db9a25f61d6000b97357265","impliedFormat":1},{"version":"b8ae3cdb133fc90e0e11b6f898f7494aefa277f1886703f907f338a3a0fcfed2","impliedFormat":1},{"version":"4f7e8043d88c4dfd6ebda309eac25c84c482ecb62b12c8be11dfa7802ba907e4","impliedFormat":1},{"version":"c185cb2abf88e5eff388c5fb78b3e827fa22b101862f691e3ea4e1e35d6a9f76","impliedFormat":1},{"version":"8ec5cc07ef8658e537c8e1ed362c3fa4ffbd4204e4e2e14b345e0328b6695120","impliedFormat":1},{"version":"e74772b78df150883b5a2b6f434eba72a9fc76046498ddefaad7a60c8bd946ab","impliedFormat":1},{"version":"31206875c07b0b22f0942787352e716c1e58cdcdbc8de1bff305d636cc98a9d5","impliedFormat":1},{"version":"d223f3296684dac7ddc87b32b30e22b519f640dd557be29a69347ea4046a3f4d","impliedFormat":1},{"version":"83f7e39c670cd935da0cd7d26e9643e131c665f959c4870a038eece8bfe6fd5c","impliedFormat":1},{"version":"c8c6d6d2ddb99481c7e4a131d361772298487598dfe5fa58dc58dc86b0a39f46","impliedFormat":1},{"version":"735a03b44e094a2d1a93c5115929b06da54ecfa0a0a8d365317fabc69a56c42c","impliedFormat":1},{"version":"1534c2247a35357e6ab89a4d28deb5241e0c2bb40dcc386019fe4408f3c2fca0","impliedFormat":1},{"version":"cc8c9b63af6f3747d7cf9fb4846984b727399483d60bc8f42a05ae68553dc58b","impliedFormat":1},{"version":"56810790c70f2abd20039375495efd8c79426fc5f39508eb8cac02c3c06dbb97","impliedFormat":1},{"version":"779562b3b7abf08e8edf9b71876b6ed1340b048c08e416191f77b3303999083a","impliedFormat":1},{"version":"6a6a12e75137871a47eb3a2a56b6d6e28cca49561ecd8da616b0af8bc37cf535","impliedFormat":1},{"version":"e95b967fc9953ced2d7b0d812f64031e2dd6dbdfb21fe5808391f90624a1fb84","impliedFormat":1},{"version":"73eaf96d0a0847a8def5de79c4018caf8aedb1df9502ff0fbd10cbc5f9d02f1b","impliedFormat":1},{"version":"b2aa7687f13fa5d274a13ffee377276a21c26baff9e511bc9f61ecd55c213935","impliedFormat":1},{"version":"cf2ab52a73f309fcecce4e323bf066c31899bd553afd8c2c0f842e71778a3e4b","impliedFormat":1},{"version":"130bdd9e5ae42a44ccf089429d52213fd75d71e5361d682e8f015f84e651866d","impliedFormat":1},{"version":"3a17d743cf5f037a6e63d16cd9e74c732e2a2edaa00f8fbbbac7a4605c57ffdb","impliedFormat":1},{"version":"3fa2aee4f114135ed8770aa3fe21a7b543999825d1a7e57dba26a9d94d9f9790","impliedFormat":1},{"version":"d4568449b2a25c5c78b37eed28df6125a4abcd99700b4046b029ec953f650342","impliedFormat":1},{"version":"da72096990ac6f00bb7a19d484805f16373c1b707b6178cf1a0004872b5d3683","impliedFormat":1},{"version":"52c823d6453749401b49a3c3bca8794e3968693823d30739c9b643461cc2e1a3","impliedFormat":1},{"version":"677b0e9fb28cc5d635df92a80bf5df3e79d78db2ab9bffb66ffeaa69430680a6","impliedFormat":1},{"version":"4adc0cfdb772660d2fcebb79175f49be201f6ab5de5eadac0d3faf9139d57d49","impliedFormat":1},{"version":"ee350fdd82de257197168df4292dac7651722f6865bba51e70c8feefaf99cdab","impliedFormat":1},{"version":"e37a02ccbbf1d454474205e757276df580d7e2e454d2c41718ee42016fcc61bb","impliedFormat":1},{"version":"47d2fd739465a8055ef553e0462c0fa80484ae41e948cde1200ff0a3a9135463","impliedFormat":1},{"version":"182a6511c6e15b8fe21313696c95bb90c86a3d93d6dcf03c011b37fe9c6f6762","impliedFormat":1},{"version":"4acaf4178200d4cf5e4168ead74d112b26b63d7d5b9d2bd80e17c0ff15ea27ea","impliedFormat":1},{"version":"48701d7dabdfe99fcde0897bc09a6d50a300659ff9dfee31220fbcb7fd33f700","impliedFormat":1},{"version":"f336b8b9cf1eec342149cdbef2c5f8cc4f478dabd1fd8f9a55163af0aa6095a0","impliedFormat":1},{"version":"6ea7695b7b2d5859553d749f8f4cf4142bcdc12f4a75e33104aab4089118a93b","impliedFormat":1},{"version":"e6e0d65162b9da29104c7f25309566e794c7e8297303e692e59edc7edfddbb16","impliedFormat":1},{"version":"503f598be49dd1447a7db799b130dd1e0fb3ca544c01b460ffaea02b195d2338","impliedFormat":1},{"version":"2967157947a8c016b4c6ca64bcc865d8d03b3b00462b2ae2164f17983d9b4ffc","impliedFormat":1},{"version":"6ee559307abef54d4a86d143c9fe84bce9fe3619639d7a22e450c153b599b7a6","impliedFormat":1},{"version":"579fbb3135d73c24bd6f1528592df5a30d1fe616be07eb095dfb81a570af5a31","impliedFormat":1},{"version":"52a9b8848f7a53e0f7a2c6e31454ff2ff548a92d1272a417c72d2ad86e9250a5","impliedFormat":1},{"version":"9e9495817d173205390b629489d16c207de3fdea48c27a9420dd1eaa19f3dc3b","impliedFormat":1},{"version":"778db8f6f679bc123ec47a1567a5688e55696a8578ea14945726eaa4b445ca5c","impliedFormat":1},{"version":"7f1630ae5a5b8a886d7801ff53f6da8435551763499186d471ba2879bf0fe675","impliedFormat":1},{"version":"6957bbc14e8b5f7ee4e3cc2c8fc0ed8b64f206018b5c898ae19769052e374130","impliedFormat":1},{"version":"63d5baf320286d62f4fe7926d9b3795b0163c9a8193e776b26390f990a1ac85e","impliedFormat":1},{"version":"ed4a499694d207c420cc7a7a5ac0dbb5097f329cb2bfebd646afc47b55310667","impliedFormat":1},{"version":"b11669322a77c4bfbbd7968f3af8defb3204167cf0047ffc28dc64f45b72b679","impliedFormat":1},{"version":"63dcd88ef3e2d2fe335711849d0e5e865b48435a66ac9f6285afbb4378729deb","impliedFormat":1},{"version":"9fbd0e75e7c492bc4ef9f3ee26a64cb6ca7c9f608bd10886540f3f10fab0b93a","impliedFormat":1},{"version":"c117b0544cf41163b6dc7d75b2996dc8e9abc69132ac48fb0845cd52f1ef1ac6","impliedFormat":1},{"version":"cdbf6651951c52c9eb367af5f0878993e1b91302a63309c6e89a9f85ea2fae2a","impliedFormat":1},{"version":"b373f221078fe8d6db1677f3aa8ac1d337fcbdbabe3387edc0c0299f88bdfb04","impliedFormat":1},{"version":"62b93fff08d56f29d946ad6410e84193f841f4e48f835f7cb267d2b624c6073a","impliedFormat":1},{"version":"db999e6cd50c946ab0097871a067da5259b14db007c44c8fca454bb32c30a40b","impliedFormat":1},{"version":"57bfa6b57ef042368e800fc4417bf28ea4d9548a26b3eb9d87e3e6a4ed4cf6e2","impliedFormat":1},{"version":"e73d4a631ae9fe6dbed4cfe77769522ed017b33697a2ac30c1418f88c5efa785","impliedFormat":1},{"version":"70bb237b77fb3c0c3514048d8dbeeea760e79e8e4ec17b12e00774452ec6af51","impliedFormat":1},{"version":"c486d862b6de477d6b0ccec1eb2c0104db69c25a27c8f98fc42869a79c5b6df9","impliedFormat":1},{"version":"4515cfb57bb23650c08acf44a771572f82a2241f3a66dd2f4bf38907c4cebba1","impliedFormat":1},{"version":"a2ab3154d4544fc795056a7d9ab44e8f354f0af3f8099ff447587e88dcf626a1","impliedFormat":1},{"version":"7f5374efae9a92aacd0883febf50746397af5bf88b225450fde1877aec1cf64e","impliedFormat":1},{"version":"090999ebc8827e6671d1f9cafd610981b98e9bd57b073c14d694b2249d105a14","impliedFormat":1},{"version":"7165147f8b33b9340cd6ae0acf8e851f36ec6e2eb0f98ff1393c349f4f99fd65","impliedFormat":1},{"version":"1234aca284fc8d24e63c52ed300bbafe16f49e23024c6a3c2337380708647075","impliedFormat":1},{"version":"6a3d8ea4a7aff4f1798d1e5bcf024f210a5c8e789a9a225222beb0940a3d0f7d","impliedFormat":1},{"version":"c1526f3272a687f841dff10f838b285ec10ab067c63f3f6955577d293e45100e","impliedFormat":1},{"version":"054e9235e7cbfa0a65cab1c0c7e19898ce8c5158aa03ff6e5b9d43cca49ec07e","impliedFormat":1},{"version":"b051d700b7af21d8ed7081a187771b2b3bdfa47faf5ed32f20569801865a4d51","impliedFormat":1},{"version":"896d55dd9e6b7e30b7d077d96f0ce178c48fb3364d65e3422ee2df5ab700a5d3","impliedFormat":1},{"version":"09a345df55d314fdf72471e27b2df0d02a97ec8b440089704c888c0fe298d95c","impliedFormat":1},{"version":"c0d53dc05aff6cfa89bdb60f69c439d8ccf732418c64737ad6818500a4effdf6","impliedFormat":1},{"version":"f221bcc09ee053513ae4dcfdf7bd8360375947f11683457be45fcc89223ae782","impliedFormat":1},{"version":"6f685b2fffed77aed7fece207cdadfffc46328579daf8e62877edd75a4c986b8","impliedFormat":1},{"version":"92700d6c01a5fa49f3193074cf1a38ab2a6b73d20dcf0c1e8634672a3ed83943","impliedFormat":1},{"version":"5e6c52588e0b9273c3aec4aa7b79d7eda8eb02ad7d1dc1195ea70275c08be433","impliedFormat":1},{"version":"c0d606999affe5f8530a29a70d528b58ec825635464a1a6d87eec14a15c9ff83","impliedFormat":1},{"version":"969c63c6284315528abfca1f8297e84817ef7627471e00ae27c41b766099e668","impliedFormat":1},{"version":"7cd1ba37548bd98a3bf786ef3b69183f36464b8e31e95ac7bea6fbebc4510825","impliedFormat":1},{"version":"a318a620282d83242a55061955d3289e43fa46dc50e37468a487a21d9f5b58eb","impliedFormat":1},{"version":"f3a646e28f73a44c78a5ebd6b054307fae92a6444bc2b57dbee89ff9b56ee81b","impliedFormat":1},{"version":"6a367f5a3eb91204f9dfa9564cb8a921abff25482c3bfc46eb45e4c360879e37","impliedFormat":1},{"version":"e409b4bab2e4eb6cb1febde69969695441df492576006e2d016fed178f747752","impliedFormat":1},{"version":"9bf00152ddcda8de4761ac309ed8add1ada926cad1c8f30fa34172087259422b","impliedFormat":1},{"version":"a5a51d144af412b36aadec7843beb9e3dc471f17503aa0691ac69e60627ee824","impliedFormat":1},{"version":"46218f9b49152f9c0816bd9a8384d88f98edb2df93ec48000cf458d5d0bb14fa","impliedFormat":1},{"version":"9d1a948d4ccdfd1ed4345a58eab82c35695085ae72ca4f0ade92faf91d062fff","impliedFormat":1},{"version":"2fceaf2cfaa5de156bed2dfd7f14f8f2e1fce16f44f7dbe34e6bedb6d5d097fa","impliedFormat":1},{"version":"006a783c411522088d146f675a64e3fbd67854dec1e085d3404f19f8007b29cf","impliedFormat":1},{"version":"501f4c80e3d95473ebd9aec7d4c9eb20f145fccd71bdd5f0d66278dff0ac2232","impliedFormat":1},{"version":"36e1c6aeb0be6ff66f4319b1da0edc4b09df897bf4f6487b46ed5fc6a70a2a5f","impliedFormat":1},{"version":"9e8568fc21930279120ab2c27e134edae9feb8b73ea763e1a0dd3cb0a4ce1c7c","impliedFormat":1},{"version":"77ef58cb5bc35373b9f87a405d9fac3249fb87beb73ff91034526abee89a3f87","impliedFormat":1},{"version":"e7fd7fd7a7cca58e24dfc096199893d5613308c701ad82e05cbb240ea4caa570","impliedFormat":1},{"version":"f71394c4c023f909bf7d9750c398a64cf70a118e8da697f3bcef5f825ff04be4","impliedFormat":1},{"version":"639ee4ba826001920509db86d65ee3aa36f994f327966b68b88b12692df40ba3","impliedFormat":1},{"version":"0a53ec6b6019b843faa20ae95134f80abfdbaeea78d249f2eda617ffd9b48727","impliedFormat":1},{"version":"0462abed5c30c73ede45bdb9b7c30e40d532c566d27d92c53daea44bf8a1daa5","impliedFormat":1},{"version":"6a59850e10f43ceee6dc5e24b7613499c18558910d4caab3243fa3ab826ecb23","impliedFormat":1},{"version":"84cd23b308782ea378657d721636080ce2326c49663e3fd680aa76709bbad174","impliedFormat":1},{"version":"be70a3f2af303c8a215ee5d2005b75a2872fc97b3c4cb162daa4f5d259dcb983","impliedFormat":1},{"version":"fdf2fb8cbde766cfaad8fbba67c72400dcc2b122a4d93fc7528c6856271be9c1","impliedFormat":1},{"version":"7f4b94af4c88e3f5df0be4f5f41f2f5d01695a5510d46600775e6893a51a95f6","impliedFormat":1},{"version":"03b286e305ffebc6a86f720119e8e060514e1dee688ac0e4f87e0659a9eb7270","impliedFormat":1},{"version":"a2e50a7f9302368aa0af3151b5c9be5ce741a14f11ed1330f1afab9b53d49b3f","impliedFormat":1},{"version":"a98f25f1306648b80b285811221f620d320fdf12f824e3d9dd9ea32299c58944","impliedFormat":1},{"version":"2f6e2125252470ab985a9c1ef325d20a74593ed1fdd3adb7951aebfdc2a913fe","impliedFormat":1},{"version":"b9f32e168f6673099af0102a0a8ad758d932b564a126d4b96de4f3385ffa4573","impliedFormat":1},{"version":"2cc5b14bf59473af08385418d9432e338d4a23f48a26fa3a899a27aca9e4152f","impliedFormat":1},{"version":"bf526a3947ef13ccd0a4e0e4f37e84231d6e42614da43c2f802c99fb05b00a0d","impliedFormat":1},{"version":"4a3ce75fb3a2148138559480d194440a711d7e0cf32ecbc45de7dc7e4bff7b67","impliedFormat":1},{"version":"8a27fb1f690897d97759a3d660536dba2639d2ebc0cf78e1600d56641b325819","impliedFormat":1},{"version":"1ed99a05aaec522b87ee258c81c7dcac35d961d44f642c8b3521a03a9b00bfad","impliedFormat":1},{"version":"6c500eb0a2dabda8d8b4836a8129c543781ca3cc1db17cd7649f3707679cff38","impliedFormat":1},{"version":"05d09f360eaeef50262fcd13882bd37a08ad4639ccf636836152223d5b47ee64","impliedFormat":1},{"version":"403fecbf6eb8038373c1b125e544ef727aa395b4764b08f09f2879644a9e2db2","impliedFormat":1},{"version":"f0cea477027d173c046f7b3d2bd3b64764aad4e09814635bd6c759135f19cdd2","impliedFormat":1},{"version":"6a7191ada7b6e79bd57b5d1f987d54970b737aecbf598f5fa1bcd8c195003197","impliedFormat":1},{"version":"a013ae38a9cb325447c71a972ee02bdab9b834f668c0807a9ab7805dd6e624c0","impliedFormat":1},{"version":"f2a1764d121edd475bb5fc59d436189ef07e5c303a7425679ddf0a8a5678a709","impliedFormat":1},{"version":"608c20c7cdd198f03061e31479d2bc3df7f35ec293afa085edabd5419c1445a9","impliedFormat":1},{"version":"41fb9dd98b67e694f6da08da6dab2aafa01325085e44698a99a593fb249c6fa2","impliedFormat":1},{"version":"2259ecd64b5d04e77e8746c796517fe250d6f204399449759606330c34ecec69","impliedFormat":1},{"version":"90d9b4c842608dae8886070fc143b48d4bb5f273c1e95ebb2432b99a8fd231fa","impliedFormat":1},{"version":"365e4ef4ce8b033bb38fc405b22758cc471a6a490ca15cfa57431537adcdda4e","impliedFormat":1},{"version":"f930504099418ea2e663fb9789350562f29f24862c85a198e30f449981b8314f","impliedFormat":1},{"version":"ae310e9a667cbf5541e355c9a18e97d7a3347fff4caebf02d22bb3401493d425","impliedFormat":1},{"version":"68aecf442395ef7468594ee891db826564f81da8bde0d0bbc1ba37368fdad433","impliedFormat":1},{"version":"a391c3a7273eb906a99dfbced210b52fac2cb90d4f0d264f42b5ff12cf045157","impliedFormat":1},{"version":"1ddb0ac5532170cc7622408425da9109a808a416d54d6694c02d396bf6710cdf","impliedFormat":1},{"version":"c56462bde5fc14b2875fa75f935fb52390a2205d48313937623e24977d5ade58","impliedFormat":1},{"version":"5e5773bbb70ef5f26e2175b7ce7a2a82e09c6b8c5f7f520731bfe55c0beea1e0","impliedFormat":1},{"version":"ad3e47d868657c10b8f08a0715f5a37c9228f04e8322b6660cbbabb6ceac043a","impliedFormat":1},{"version":"d4c70a9edd6cdd8d2d470cfb561705af907bcd8f562ab7e5dabbb27bcdbabb46","impliedFormat":1},{"version":"703f9b72ccc8258051e04fd0e65dabc5a7bf2a547fc79b992573e7f50b0276c9","impliedFormat":1},{"version":"c8cfef0b7f91393540e826972972e7a8a4f8334dbef5993d2153d758354590c3","impliedFormat":1},{"version":"eead50472ef1f2ac336081df270e10fda0186b72d8a50d56df3306b49d3b88f6","impliedFormat":1},{"version":"596b64406dd56b6c919176261fa2b563d06aec680cffb2d51090fb6420e54597","impliedFormat":1},{"version":"91982d139ec427b23dd8f5f5b2799c4ca308c53fc478d4dc0c024db8cace6de4","impliedFormat":1},{"version":"9d5af15f124fe4857c81f6054a44c30ae44397fc3b6b703f5cab77af3ff11d6b","impliedFormat":1},{"version":"78952cff00aa89f96548d5d4b8a1da824dd1d27354e00d4d96dee69bc28c2661","impliedFormat":1},{"version":"3def56820f388734ad5d473196c7517499a84cd96344576324da5b2ca6e79f1a","impliedFormat":1},{"version":"8162ed93e384f7f8fbfc0026c7ae884e22f251d94c83f2d54e43921677cc10b7","impliedFormat":1},{"version":"a075043ba29f51a910ec21788f264d2d1adc65781b11c151798c42b51456ec68","impliedFormat":1},{"version":"0501b31421ee5d921d26257383d2c7cd0489f48861efc3ef8cd40bc0fb16b4d9","impliedFormat":1},{"version":"5ca10867fc85defb86d2d3ccce0d5d4c5384b78a66cc88f70da01081b8affe02","impliedFormat":1},{"version":"6f391ec2fcdbc08d39680ba3be4d29b2c0e539f8d221657d72b5de53fcb2f9f9","impliedFormat":1},{"version":"12649755f565e8e3d175b7bea89a9059ef5e1e68cad49989a93e75c277167fdd","impliedFormat":1},{"version":"9c05760a539130972d154892efaff2c69b4251dbff08bd9469b3cbdd087edeff","impliedFormat":1},{"version":"c0d1ee30ed4637e2f005c6003735dfdd93a75c426696c1ffb4709481025ae92e","impliedFormat":1},{"version":"3dea4d2ae437782c0d2a5e1ea8f649a02014e9463b7296f935331577cb6d969c","impliedFormat":1},{"version":"7d773975eef09930ba725b82909b3c1e46b1c00233bf38a9ff7e96c5a759762f","impliedFormat":1},{"version":"c8f16033651b00d98f97b0c9be2e45ab20425fc1232b5ed31ff7baab9099bbfe","impliedFormat":1},{"version":"f90eca8bc43cd426901fcc5361e92aea098334614ef538e16605d8147b4b7867","impliedFormat":1},{"version":"86cfe4c289daa639b029fdb39d0f69b5a0eb2e5b55973a07b38730f8abaa2d52","impliedFormat":1},{"version":"fe7b6e6e42b868c299c2617e377181dfcfa13b13df98a88e1a0a090dc6c2e697","impliedFormat":1},{"version":"fde53950d27833d0666af256b612e4717611bbaa148027817703c602ba000b47","impliedFormat":1},{"version":"eb8864334e1d02b9125e08d5e5d510e8347bf42fc54cb3a78a3957edc8618e0b","impliedFormat":1},{"version":"f44a607d9fcf797cd7beffaa587480093dd9220f0dd31a08f63daf9513849ed9","impliedFormat":1},{"version":"a3a59d015f958516827cc26dbbaed179c5370518fb6d9c45c159f25a30d27765","impliedFormat":1},{"version":"69988c03e83f8c9162bed9e222eb934a2ad3d92217791c358bfb9bacfeb51e07","impliedFormat":1},{"version":"d9580d2f2ce16618b9a46c6e02e8483f8e8e1b080beb39722f03bc30cb0219e9","impliedFormat":1},{"version":"2eda194108524794370b63c5372759cb90abcb47e2af650cad9a40660d8ea59c","impliedFormat":1},{"version":"df25317e1b076a63fe6a6ff2b280ce42ddc100c726d2b5bc43650baa9c05999d","impliedFormat":1},{"version":"0bb668805e6021dd9fb19c9f934624b7de5348aabe5eb38824270e329547b3ff","impliedFormat":1},{"version":"1d6bab24459b6dd0ab813fd8bbe30821d8f2c386d67de8ffbeb04da44a8b0e28","impliedFormat":1},{"version":"35d6db4df41d01f870b418dda5ad4f77fdb08cf551f233df9ece5cabfdb73e91","impliedFormat":1},{"version":"761a2bd856f56c5b353210f2323e39e9ac2e3fa282ee4e8e0716be8b1169177b","impliedFormat":1},{"version":"79118e914b1fc0c3320fa88f903c941ff9a895f16c4b6f12612d4eae6086ade1","impliedFormat":1},{"version":"f94cfd9a54d27f54f7eeaa111cf16b0a0b2946f685431707fae31ef34abe5f47","impliedFormat":1},{"version":"4a78322836a5e5b9bd9db7b13514177c6910c429a26edff0216fd9a01d57dd23","impliedFormat":1},{"version":"83d403f38ce8afe9094a6b0c456bbd9b740f322b2d52f2934efac38e44b1bc1d","impliedFormat":1},{"version":"d340e5e1c9dca61524d4fac0d280062e5f12f4f010de041467bfe829cec754a0","impliedFormat":1},{"version":"17c664aba89f30a88b782f79b1cc3478f0f01f4718aae65d0d7eb416728a3e5d","impliedFormat":1},{"version":"83a97fb297d6c0b718c942b2417ce6166313c268221ccabe4f5bea2ccc679d91","impliedFormat":1},{"version":"7561143812fa34b7b5fe23abeb98695813e5381d509e8457af2a249e9a8ddd7f","impliedFormat":1},{"version":"98b5eb5ad47e6f51e12a94455433d45599d3a60626580b13061ee7eee69c72a8","impliedFormat":1},{"version":"f45710da4d43d9a49ff8c1d4fe70ec4ba4370e08113c9baa54b0ec8e661b9d21","impliedFormat":1},{"version":"e6b29da062f5d99ea1824598e403dcb875deff71044b42413c754cf87d15680a","impliedFormat":1},{"version":"2444716abf257b164832951fbd656d76b3590eabf7e3611ab7e3dd92c60e6c05","impliedFormat":1},{"version":"b97078f3f48ed7db25b42185a8660e1c3a93185fe34d3a50bde790527f60ebd3","impliedFormat":1},{"version":"f6913f4725db1477da25dfb6b74a22e5d047ba6e80c0638680d7c9814b2de453","impliedFormat":1},{"version":"fb6587e144ef38c38ab574aba2dfd729e347ae1aa3894c7d6b221ae59510b052","impliedFormat":1},{"version":"45e6dd1085345ceceabd1aa0e08dda3bd01d3d8064d7fca43f649a6b06c70fd1","impliedFormat":1},{"version":"5883a2ec74b66bbd105024761a7562c82d5fbfbaa5cf3e7b35e7fb8d307a5c76","impliedFormat":1},{"version":"ac28c97fef6d15266aadb89264101e36712638dc374fe88c6f00e7542867f1b8","impliedFormat":1},{"version":"101f26241de6126ace1065467b89c0a9fb9714f31109c5479564f5f5d2dd4d86","impliedFormat":1},{"version":"215431f054038e5ff1e63a872213ccf3ed565002cf2db79d2b1102c322fa2d0c","impliedFormat":1},{"version":"8431f46a87f9fadf619666da4b0f1547f9d3e3967d02c0b7bd1ab9cf4c814699","impliedFormat":1},{"version":"0efdfcac693aab67a9923c3bfac1fb19ee22a1301d190e87a978cd27e5eabf32","impliedFormat":1},{"version":"8c6a3e48c1de26030220ee814f9d1deced3e2788fa114205c509200694154c0c","impliedFormat":1},{"version":"d170be1bcd53b337645cd8e1043b2c966723fcfb37f426eeaa2a097177a3c0f2","impliedFormat":1},{"version":"0491ab5cae22450927d8aa14703cd8e5550559765d730d5e9abe316024c560fb","impliedFormat":1},{"version":"a69ae5d70c4ef6b4c41054c3dafe998d2100cb138a9e9921a1819e6ddb46f0e3","impliedFormat":1},{"version":"caa1552e767d0633f0869fec82e70d739df23fa1b20b35d5a57cd6ced412003b","impliedFormat":1},{"version":"b7aa90f9211ef863c28fff5a8f5ebcc0bce6a550d806b5ce1f5657132c4fac13","impliedFormat":1},{"version":"b04c5da1a1fcb8d960e01f5e95eba905a73e43d978cfe3be49710bb58aa27679","impliedFormat":1},{"version":"d85987c6bedebf0fa08119cb94aab19052ddff727686cb59c61e2fb03ebb1ffb","impliedFormat":1},{"version":"555e092e0887ef4a21d2689c926150b8211470def687ae6bf0dad69f3be3747c","impliedFormat":1},"859f28faf4ab36ea5cc515e062e5ac5c1dfe3c9a99a91f3ab47181224b6b21ab","0e54c86b01db1d748f87ee809bfba86a5f8e7f5f366e99ed6c8fa27eb04f705e","84675c0e52f093656e503afb7ec8f9a0dad6bde96dbbb1047d74599f99918d3d","a88c09def9f4eb1c1a78ac6d577158138168f147602f10b8ef856e3ce2254a45","b2e6cb45865f16b391709a381ad22353262298cb54304e358dce73aff324aab4","603000924dac5931dcfab767bc6a209e32c83c9026169a84387bd45acc1b8189","9f5fd6d55799621961a673052fc4f971168ff6f14cf57d9321b1ff69bcbe13b0","24e7efb20b711c83045c147142ed460cd1421bddb3a07cbc47fbbd19ecd53a2f","affdeffee41dc092dd15608de95e55af718abe5774293c11f5b461a7852e50b6","28d3dffce615cacdeb5510fa01d3acafbce5c660fcd227040115e8b09ee7f51a","374007b2492e36b94554445fdfbf202fd082fc61eaddb23bbc84106195fd8a42","7def15e9cbbcba24098d26c50ce1314d48de49ccf46467a1ffa49f35409bde85","3f7b17e0bf6b6438144010c7379c9fccd70f9a44ccc13710ccc09a95115a357c","8cc3fb9ae13cc52c341a13cd89888ec0bf89c6ea221639f0c20decf90ff27a84","0b98a246ced4965dbdc946cf55f02613c62b144221236bf57e934726ea7aa075","9fa12c6852aefdca332ada2dfb10b2db6f888f84466c37789ce24e0bc2c1a2de","6b193d216b90d063ad12f093e9ebec6001efbf49d6f8169a6a2562fb4f10dbdc","746677f7e4f6ab99c024eceb509289787508b5a980003bdc7c30b939a8f3ab2a","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","8539d999696c6c34b3494c340b695aaf77c39cfb2edebaa6de90cd421ec900f6","4978baf9a8a2da603f0c4df6c10fc97fb97adf4748f2e3d314a670e992e4e360","7303e51b17c21c86ab1cf32f9b45d9dfe1110ad1ad6651e3fd2833a04bda54a5","9cac8ac6a854f4ce2ab0da10d7a3a4afcf23264898b3ec93387ebf20bd3d82ee","a34d22dec8fad6e7d9268589261bfc8b5a7b1378b8e83842befbe9d15934f28a","f08bd9375bdf3e93dbcdfdc0bb5b98ddc52378ffa44f09ccf23995e3c925e97d","64b6812f278815b4bf9f02e69697eddf4f03d793e4292ccd13929ffff43429a3","1dfe436e5f726f2ed1da2b70c8054493fd1e3cccfcee66b4aac40f45207dac64","728d1eb0b48868368dc5f407312e512c1149a2ef353be0354767452462f42282","179ae1835916688198a8c26bb205585436576cb533bd25493b60c1090d59b416","23f2217280dde2cd198c2095626f375ff74180b71adf2fc225e4509c1f780f35","71ba95ac6bc7ce9ebe57b2591113bafed188b339942bef7c791a4e7fdcab6b37","4e7e1990f7263064101484dd078bb597604da93a811a1570e1116ac1e9e4b5c8","68f9c06798d946b3b99b7a328a8a9d24df89406840a5fcb87c50faed75ab6473","77ed63abe7208be4b1f531b698e1d07a15638477614f5f5b66436be6d8db54af","0e0d8704ee709e8b77bfd7ce596a9062d2ced47df0b4322b4c316d57ffef66a7","a5c1ffcf0272ae1e2ea9bd176081e702c8a5b549a46203c78fa30fb28855c90d","bd15e1cb0ca172738b723d7530cb00aefe9a1e0f5b90e0bbb20497e5324d6927","e294c1e680395f039e6a73f70b9b713208fd5eb55fd2c2f32316c75e7561b2ff",{"version":"0e5cb10101858f8dc705f436c2910480a0268e1001c4f6d12a9dc179feaa4643","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e5c41e56098ae93bc42a15473acb1a176f28b2ba95c38f3c67820434acd85b6","impliedFormat":1},{"version":"0f263eeea7877199808b1bc220df95b25a72695ec214eb96d740d4b06c7cc868","impliedFormat":1},"7914e0d45889ad4553c11c572598995c0c68b3ae354fd01a64024a9038563160","37940dd1fa35e33c7612ab4bd742856248b3d8929360cc5de779d1cf1c172205","004c5c147707713c05c9bed707677716ef8498e5bc9943f107830c3d87c4b6c3","fe547e813f5e3931e95a8f5e9fdbe40f898f04e1265a85db4fa9b37ec289d75e","2204823f5b6e80647faead5122202896cb298eeb7054aac4d10fb14fb9de893a","ef792307b8b1c75aabc545574e276cbece74beb3f46536c4fd2b98888fd98fc6","5e421d510fd4bdc83869524b06c65a2faabe2372dcadb62a03e22599a74080a7","c4d588a816e27c735c2371409489454c90f594468b8c2fb709c2e3c9c0b1db19","db17081fa9bde919f86929e286da4c401124db57e2bc20caafe195de7d89c429","7db59f5eefda886191d4968305d5fe121c5a7501f9fd2166e4b2ff8c1702ea92","601b0edb644abfa7338e8315351c54fb56bb8a2a70a51ade3e535bb91d78e694","bc48714d22d2d4cf3a5ffaa2a2e3ca18b746d7a51c857821051d5a12f91aece1","c74abf27d2a463afbcfddc72ba71f72ff6c0716faecbc01acac88f7065c14996","043ece685123ccc74837d985889d59f39ff85b0fa4dca6a51b8810a746a951d3","8a407fdf033daa1e85187fb7105393ad4314b369237da9ca760a6f535fc23090","4f2270c5c0186a1c37df6e820a2b90d8a34548c863ae38e1ee30a421549de2d3","c68564ae6188929f091675e4f6077102adaee2368b5130d0691ef26d7df7cb48","b4ced83056c018365bac385dcbf12c0ce5918560ac8822c8e587a9199f637e20","20fb41937bf87d64cae3f2c4a3048833d4b15b9b5ec26e4b9850cb832958f660","57b935171996d2bea905573be8c2ea930b38bec2555d621420c3558177f11e39","eb19fcf0ff508bd229e3571c3addad03a9c72d06b9f298dd8e684b9d6d5b18bf","93ff1585d36d914bcf04cf885395c7a4619efa9c20b5b670a8e72684ebcebb92","6ec4b1570811f4f80a88db0a9e2ea086543b3e5af9263f30d6ace6fb2612d5a0","eddceeaf7d5b317ca9e2927f099b3ef5d277bfbad2fc479da25361ab614f6f73","fcd5c9a4e9872897457b785fc1948ac961db4f9f83fac1f51f8357b600de5fca",{"version":"2f3ec8a345eefed1af66b5975da98ccf3178d13ba9308359d34d2f7f87dd4c9c","impliedFormat":1},{"version":"799003c0ab928582fca04977f47b8d85b43a8de610f4eef0ad2d069fbb9f9399","impliedFormat":1},{"version":"d998eea476c695d8e4ff9d007d5b46d49ca2ffa052f74dc20ca516425abd57b1","impliedFormat":1},{"version":"f4e8f4151c3490cf7b68c685aabe901cbab19f962aaa2f118a97550e22689a76","impliedFormat":1},{"version":"0345bc0b1067588c4ea4c48e34425d3284498c629bc6788ebc481c59949c9037","impliedFormat":1},{"version":"e30f5b5d77c891bc16bd65a2e46cd5384ea57ab3d216c377f482f535db48fc8f","impliedFormat":1},{"version":"f113afe92ee919df8fc29bca91cab6b2ffbdd12e4ac441d2bb56121eb5e7dbe3","impliedFormat":1},{"version":"49d567cc002efb337f437675717c04f207033f7067825b42bb59c9c269313d83","impliedFormat":1},{"version":"1d248f707d02dc76555298a934fba0f337f5028bb1163ce59cd7afb831c9070f","impliedFormat":1},{"version":"5d8debffc9e7b842dc0f17b111673fe0fc0cca65e67655a2b543db2150743385","impliedFormat":1},{"version":"5fccbedc3eb3b23bc6a3a1e44ceb110a1f1a70fa8e76941dce3ae25752caa7a9","impliedFormat":1},{"version":"f4031b95f3bab2b40e1616bd973880fb2f1a97c730bac5491d28d6484fac9560","impliedFormat":1},{"version":"dbe75b3c5ed547812656e7945628f023c4cd0bc1879db0db3f43a57fb8ec0e2b","impliedFormat":1},{"version":"b754718a546a1939399a6d2a99f9022d8a515f2db646bab09f7d2b5bff3cbb82","impliedFormat":1},{"version":"2eef10fb18ed0b4be450accf7a6d5bcce7b7f98e02cac4e6e793b7ad04fc0d79","impliedFormat":1},{"version":"c46f471e172c3be12c0d85d24876fedcc0c334b0dab48060cdb1f0f605f09fed","impliedFormat":1},{"version":"7d6ddeead1d208588586c58c26e4a23f0a826b7a143fb93de62ed094d0056a33","impliedFormat":1},{"version":"7c5782291ff6e7f2a3593295681b9a411c126e3736b83b37848032834832e6b9","impliedFormat":1},{"version":"3a3f09df6258a657dd909d06d4067ee360cd2dccc5f5d41533ae397944a11828","impliedFormat":1},{"version":"ea54615be964503fec7bce04336111a6fa455d3e8d93d44da37b02c863b93eb8","impliedFormat":1},{"version":"2a83694bc3541791b64b0e57766228ea23d92834df5bf0b0fcb93c5bb418069c","impliedFormat":1},{"version":"b5913641d6830e7de0c02366c08b1d26063b5758132d8464c938e78a45355979","impliedFormat":1},{"version":"46c095d39c1887979d9494a824eda7857ec13fb5c20a6d4f7d02c2975309bf45","impliedFormat":1},{"version":"f6e02ca076dc8e624aa38038e3488ebd0091e2faea419082ed764187ba8a6500","impliedFormat":1},{"version":"4d49e8a78aba1d4e0ad32289bf8727ae53bc2def9285dff56151a91e7d770c3e","impliedFormat":1},{"version":"63315cf08117cc728eab8f3eec8801a91d2cd86f91d0ae895d7fd928ab54596d","impliedFormat":1},{"version":"a14a6f3a5636bcaebfe9ec2ccfa9b07dc94deb1f6c30358e9d8ea800a1190d5e","impliedFormat":1},{"version":"21206e7e81876dabf2a7af7aa403f343af1c205bdcf7eff24d9d7f4eee6214c4","impliedFormat":1},{"version":"cd0a9f0ffec2486cad86b7ef1e4da42953ffeb0eb9f79f536e16ff933ec28698","impliedFormat":1},{"version":"f609a6ec6f1ab04dba769e14d6b55411262fd4627a099e333aa8876ea125b822","impliedFormat":1},{"version":"6d8052bb814be030c64cb22ca0e041fe036ad3fc8d66208170f4e90d0167d354","impliedFormat":1},{"version":"851f72a5d3e8a2bf7eeb84a3544da82628f74515c92bdf23c4a40af26dcc1d16","impliedFormat":1},{"version":"59692a7938aab65ea812a8339bbc63c160d64097fe5a457906ea734d6f36bcd4","impliedFormat":1},{"version":"8cb3b95e610c44a9986a7eab94d7b8f8462e5de457d5d10a0b9c6dd16bde563b","impliedFormat":1},{"version":"f571713abd9a676da6237fe1e624d2c6b88c0ca271c9f1acc1b4d8efeea60b66","impliedFormat":1},{"version":"16c5d3637d1517a3d17ed5ebcfbb0524f8a9997a7b60f6100f7c5309b3bb5ac8","impliedFormat":1},{"version":"ca1ec669726352c8e9d897f24899abf27ad15018a6b6bcf9168d5cd1242058ab","impliedFormat":1},{"version":"bffb1b39484facf6d0c5d5feefe6c0736d06b73540b9ce0cf0f12da2edfd8e1d","impliedFormat":1},{"version":"f1663c030754f6171b8bb429096c7d2743282de7733bccd6f67f84a4c588d96e","impliedFormat":1},{"version":"dd09693285e58504057413c3adc84943f52b07d2d2fd455917f50fa2a63c9d69","impliedFormat":1},{"version":"d94c94593d03d44a03810a85186ae6d61ebeb3a17a9b210a995d85f4b584f23d","impliedFormat":1},{"version":"c7c3bf625a8cb5a04b1c0a2fbe8066ecdbb1f383d574ca3ffdabe7571589a935","impliedFormat":1},{"version":"7a2f39a4467b819e873cd672c184f45f548511b18f6a408fe4e826136d0193bb","impliedFormat":1},{"version":"f8a0ae0d3d4993616196619da15da60a6ec5a7dfaf294fe877d274385eb07433","impliedFormat":1},{"version":"2cca80de38c80ef6c26deb4e403ca1ff4efbe3cf12451e26adae5e165421b58d","impliedFormat":1},{"version":"0070d3e17aa5ad697538bf865faaff94c41f064db9304b2b949eb8bcccb62d34","impliedFormat":1},{"version":"53df93f2db5b7eb8415e98242c1c60f6afcac2db44bce4a8830c8f21eee6b1dd","impliedFormat":1},{"version":"d67bf28dc9e6691d165357424c8729c5443290367344263146d99b2f02a72584","impliedFormat":1},{"version":"932557e93fbdf0c36cc29b9e35950f6875425b3ac917fa0d3c7c2a6b4f550078","impliedFormat":1},{"version":"e3dc7ec1597fb61de7959335fb7f8340c17bebf2feb1852ed8167a552d9a4a25","impliedFormat":1},{"version":"b64e15030511c5049542c2e0300f1fe096f926cf612662884f40227267f5cd9f","impliedFormat":1},{"version":"1932796f09c193783801972a05d8fb1bfef941bb46ac76fbe1abb0b3bfb674fa","impliedFormat":1},{"version":"d9575d5787311ee7d61ad503f5061ebcfaf76b531cfecce3dc12afb72bb2d105","impliedFormat":1},{"version":"5b41d96c9a4c2c2d83f1200949f795c3b6a4d2be432b357ad1ab687e0f0de07c","impliedFormat":1},{"version":"38ec829a548e869de4c5e51671245a909644c8fb8e7953259ebb028d36b4dd06","impliedFormat":1},{"version":"20c2c5e44d37dac953b516620b5dba60c9abd062235cdf2c3bfbf722d877a96b","impliedFormat":1},{"version":"875fe6f7103cf87c1b741a0895fda9240fed6353d5e7941c8c8cbfb686f072b4","impliedFormat":1},{"version":"c0ccccf8fbcf5d95f88ed151d0d8ce3015aa88cf98d4fd5e8f75e5f1534ee7ae","impliedFormat":1},{"version":"1b1f4aba21fd956269ced249b00b0e5bfdbd5ebd9e628a2877ab1a2cf493c919","impliedFormat":1},{"version":"939e3299952dff0869330e3324ba16efe42d2cf25456d7721d7f01a43c1b0b34","impliedFormat":1},{"version":"f0a9b52faec508ba22053dedfa4013a61c0425c8b96598cef3dea9e4a22637c6","impliedFormat":1},{"version":"d5b302f50db61181adc6e209af46ae1f27d7ef3d822de5ea808c9f44d7d219fd","impliedFormat":1},{"version":"19131632ba492c83e8eeadf91a481def0e0b39ffc3f155bc20a7f640e0570335","impliedFormat":1},{"version":"4581c03abea21396c3e1bb119e2fd785a4d91408756209cbeed0de7070f0ab5b","impliedFormat":1},{"version":"ebcd3b99e17329e9d542ef2ccdd64fddab7f39bc958ee99bbdb09056c02d6e64","impliedFormat":1},{"version":"4b148999deb1d95b8aedd1a810473a41d9794655af52b40e4894b51a8a4e6a6d","impliedFormat":1},{"version":"1781cc99a0f3b4f11668bb37cca7b8d71f136911e87269e032f15cf5baa339bf","impliedFormat":1},{"version":"33f1b7fa96117d690035a235b60ecd3cd979fb670f5f77b08206e4d8eb2eb521","impliedFormat":1},{"version":"01429b306b94ff0f1f5548ce5331344e4e0f5872b97a4776bd38fd2035ad4764","impliedFormat":1},{"version":"c1bc4f2136de7044943d784e7a18cb8411c558dbb7be4e4b4876d273cbd952af","impliedFormat":1},{"version":"5470f84a69b94643697f0d7ec2c8a54a4bea78838aaa9170189b9e0a6e75d2cf","impliedFormat":1},{"version":"36aaa44ee26b2508e9a6e93cd567e20ec700940b62595caf962249035e95b5e3","impliedFormat":1},{"version":"f8343562f283b7f701f86ad3732d0c7fd000c20fe5dc47fa4ed0073614202b4d","impliedFormat":1},{"version":"a53c572630a78cd99a25b529069c1e1370f8a5d8586d98e798875f9052ad7ad1","impliedFormat":1},{"version":"4ad3451d066711dde1430c544e30e123f39e23c744341b2dfd3859431c186c53","impliedFormat":1},{"version":"8069cbef9efa7445b2f09957ffbc27b5f8946fdbade4358fb68019e23df4c462","impliedFormat":1},{"version":"cd8b4e7ad04ba9d54eb5b28ac088315c07335b837ee6908765436a78d382b4c3","impliedFormat":1},{"version":"d533d8f8e5c80a30c51f0cbfe067b60b89b620f2321d3a581b5ba9ac8ffd7c3a","impliedFormat":1},{"version":"33f49f22fdda67e1ddbacdcba39e62924793937ea7f71f4948ed36e237555de3","impliedFormat":1},{"version":"710c31d7c30437e2b8795854d1aca43b540cb37cefd5900f09cfcd9e5b8540c4","impliedFormat":1},{"version":"b2c03a0e9628273bc26a1a58112c311ffbc7a0d39938f3878837ab14acf3bc41","impliedFormat":1},{"version":"a93beb0aa992c9b6408e355ea3f850c6f41e20328186a8e064173106375876c2","impliedFormat":1},{"version":"efdcba88fcd5421867898b5c0e8ea6331752492bd3547942dea96c7ebcb65194","impliedFormat":1},{"version":"a98e777e7a6c2c32336a017b011ba1419e327320c3556b9139413e48a8460b9a","impliedFormat":1},{"version":"ea44f7f8e1fe490516803c06636c1b33a6b82314366be1bd6ffa4ba89bc09f86","impliedFormat":1},{"version":"c25f22d78cc7f46226179c33bef0e4b29c54912bde47b62e5fdaf9312f22ffcb","impliedFormat":1},{"version":"d57579cfedc5a60fda79be303080e47dfe0c721185a5d95276523612228fcefc","impliedFormat":1},{"version":"a41630012afe0d4a9ff14707f96a7e26e1154266c008ddbd229e3f614e4d1cf7","impliedFormat":1},{"version":"298a858633dfa361bb8306bbd4cfd74f25ab7cc20631997dd9f57164bc2116d1","impliedFormat":1},{"version":"921782c45e09940feb232d8626a0b8edb881be2956520c42c44141d9b1ddb779","impliedFormat":1},{"version":"06117e4cc7399ce1c2b512aa070043464e0561f956bda39ef8971a2fcbcdbf2e","impliedFormat":1},{"version":"daccf332594b304566c7677c2732fed6e8d356da5faac8c5f09e38c2f607a4ab","impliedFormat":1},{"version":"4386051a0b6b072f35a2fc0695fecbe4a7a8a469a1d28c73be514548e95cd558","impliedFormat":1},{"version":"78e41de491fe25947a7fd8eeef7ebc8f1c28c1849a90705d6e33f34b1a083b90","impliedFormat":1},{"version":"3ccd198e0a693dd293ed22e527c8537c76b8fe188e1ebf20923589c7cfb2c270","impliedFormat":1},{"version":"2ebf2ee015d5c8008428493d4987e2af9815a76e4598025dd8c2f138edc1dcae","impliedFormat":1},{"version":"0dcc8f61382c9fcdafd48acc54b6ffda69ca4bb7e872f8ad12fb011672e8b20c","impliedFormat":1},{"version":"9db563287eb527ead0bcb9eb26fbec32f662f225869101af3cabcb6aee9259cf","impliedFormat":1},{"version":"068489bec523be43f12d8e4c5c337be4ff6a7efb4fe8658283673ae5aae14b85","impliedFormat":1},{"version":"838212d0dc5b97f7c5b5e29a89953de3906f72fce13c5ae3c5ade346f561d226","impliedFormat":99},{"version":"2223d68f66fbab4dcff52f2ccf81e8c487392288b2974cb2862721e9dbf9551d","impliedFormat":1},"f698d3c89297cc041590fd2910dcc63b781652cc2a82f2e449f091fe170af776","4b31543e395c748764511cf2d4d53b1b0853101d49610be873eec12e8ab62e38","1d6d5d890bb683b66d3c676470286b120b19c71b5b0981fac35c47dff0e685a8","aff3ed9d55f5ef4a7042d2028585c32e53208f7aeaebb7db8b1649ed67fa2600","75458f4b9688086a183b0404d175dc98150c644e902279f294ebe3876ae6924f","db131cfa6126c9054ef4bfa07288e9b94f2780ae981a9e914814069f83abfd27","4527896d898eabf76cbb821e0f106d81b5046ec3cb7383b8d2762642214ab7f1","bb85fc6b11bb2e4603b6bb45d12c64829ba12d231f55a8ff7085266cfd79e6a1","5799c356252fd098a46d819d9cda8a3aae38efdd8986397690f57a4eac04c6d4","23a777f9cfe85d0d7fefc6fa9970498be9be9e1fac0015a6b8f39fd69b79b9fe","81cae001d7d20b0701b05f4b07307966d9f75baf805fd4308c193b8511a8db92","db3b8b526de6f3ce262f02e582638f83d685c74853e2dcec24592298ecc94908","74c7ec1d600399ae16df83ca3e786042e336f1ad290c9f1136057cbb4a8ec05f","0d1658940ef2c178a6687008adc43896ce64038fc14f505c309b025698f78506","6e0ef1cdb66a16391defdb48b26468c985addd064d22bc62bae66d8bec8c4eb1","97b580029b98e68095ea2181e9cb24d771fae2203d2d4024b8f2362658c0746d","4f0b8d596974c5eade80e09bef128fe8967cb70a5eacb6c7e5e453482e95d730","aadd53ace2984027bac1f95bc0095560154da2e8fc5a2b5a607afa07b3137ece","275ed2c71800ff2e7128962d00dcce73a5daa1416cd2bd5c2ff865fd988bf03a","cdeec36c80126e319ee3378075c0a7f40bc1070cf61fa3f07170a38ab85e8e6c","30490c414e667bf306aa03a10b1b0dca5c42678d0bb2545e238e1a3e095af383","7efdef51cab25ad31d907190ddc0c9762b36441bf56a205234465d7bc8144b18","f2c8b87ba429da546c68b143abf782056977ecb11fd9e94ef375729a985fd1d5","3a393802957a3b93bcd6572faef6c1b6d60d04af0a9cfc7a04bd2974ad648a05","38b1ce2579ddc867203dbb9a18d35ba3413aa68e8edbde36d759a5a169f2bc87","223d990c877005f7e4bc68b7747ca30a1705088531daca72d8eab824919b7e5b","7d9152c4593edbda16091022dcdcb48d4bc09bcf51f041f7af65aa69505e9f25",{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"c60093e32612d44af7042c3eb457c616aec3deee748a5a1eb1a6188e3d837f5c","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},"68ce12aa75e6a6b71964732bbf782a18f19829a306d0d64d71185a85d1179c34","1aa800777b43a50918d883b9cca374f5e2c5e3e2825b04576bbeba0fee07749b","818688f5cfbd79eac807b95b8a2364ad4118a6dedc4f770acb43fbf6fb2fcced","ceea80c486b1ac12b0ef0ca557fb48e92a96ceab015f359d5c1b3be41c10fa10","4e093ab0b7a56551eea4826dbc0f8fe51ff0c6f9885eb595c0003cb3ffb26943","48af4e7fbeefedc16cd8a58fa2375eb5fac20acb9a9acb90e1f1e81b0cb11d71","1be76f9c36e8b09fc17d3eaea7b37a677046600f5032a01b0d42bcc3d1f45b2b","15fef01594868d7781660e96548780bf5775b75d0a6b51316550224f36035523","3933d60ac99b012b9ac7ca6f3d99f7b480110f8644c31afc85cfd4a367071ccc","4dbff72045f4ee2aa8216be4307d80b34a53f3fae341d724fc97d55a54400301","a6a00943f062fb78ca19c7f6a89c6dc9f094999bdd2653d763ec7b4cb2ca2cd3","7ea13d193626b05d3e8a1d059f79ea3e65e91031c22e19f1d0110acfb77b943a","ba25c06268fdcade4ee8a491b3a11ae1591c1855d028392f4a4211143de380de","adcb9361f4a4f5cfe50f0c8587487321d9fea0d26113c5e6f9699c5a400362ac","03c35fc7bf821f2a82df378f1542be63e1a81de1efeea6c007d931daa15cc0bd","2dc0aecd654bfc1d9c98064efedce52e346878dcfc37a2de838766c6a0087482","62294ff3620ae7529713e0901eace15040f65fd65bb3ab6923af765e8373e12e","cea64fcda4b55652a7eeec81314efe482055f5f68257ea548fe1c863b5316185","dbb4ac83344a3b757d8481b912d6130201445488180631127590341f32557214",{"version":"885d19e9f8272f1816266a69d7e4037b1e05095446b71ea45484f97c648a6135","impliedFormat":1},{"version":"e88b42f282b55c669a8f35158449b4f7e6e2bccec31fd0d4adb4278928a57a89","impliedFormat":1},{"version":"2a1ed52adfc72556f4846b003a7e5a92081147beef55f27f99466aa6e2a28060","impliedFormat":1},{"version":"a4cf825c93bb52950c8cdc0b94c5766786c81c8ee427fc6774fafb16d0015035","impliedFormat":1},{"version":"4acc7fae6789948156a2faabc1a1ba36d6e33adb09d53bccf9e80248a605b606","impliedFormat":1},{"version":"a9fc166c68c21fd4d4b4d4fb55665611c2196f325e9d912a7867fd67e2c178da","impliedFormat":1},{"version":"7503f8bbc9c2433bc61d76a7d9e32d25fa50d3d162aa815943b281dee3d8de69","impliedFormat":99},"df081ee91c36ed366f9e90c5e478d1c12bcb1d202e2f80a91e0bed6c959dc2e8","727880410e25de0effd9767f32fcd559f1904eeb255946aff5bff3acee3824e2",{"version":"c7e3dddefad6ce0bdb773ef6995fcfb13a0f1f43274cf57a4a720177649c4c4b","impliedFormat":1},{"version":"c2cbd18637895df1b9b29a4371c98966a25dc31df02065e760894351b132ad26","impliedFormat":1},{"version":"5f07b7754716e444d33c35baa0802a76d83eb5e4d8c544051f78c19c4e649fd0","impliedFormat":1},{"version":"a3e2979e95100f42211b17b1c3df2b467d9e87c5e3930587c590d015c7ded2a1","impliedFormat":1},{"version":"7d172b01cd1640dd6ff6a7ceb0252ffbeae436fa65807f93e6e2fc4e0f3973f0","impliedFormat":1},"cab184e3953fc463bd559c9575562b74076fed7d49ca2b2ba7a294737ee16c96","8c21bcb70f3d2b9b5dcfb0f893886d29cbc1afa0c9824615930164c4e97a6f35","a93b060d5e96f281c92e37caa0d1e5c0e3b24d1410d54416da30d26f199d3d6d","65ad22b43e638159f4eb6028d1c70f6e44bd92ab5baf114cd51c763867cd5c55","b9835cf2feff4127f13a2c6d01702cd340c6d71636c340fca01c7f3815d9717a","bc8604c97cfd94705af8dc7397c8c5e5f8404dba14e9f09648ee8cf9decae414","2116b7bec97f92abc27863a3caf456a60ee9c985267cef6f7fc1c6c66d143805","c51817abb7bc6502b453d939020d567ca0b9d0d6462a40379bc7d242d6cf005d","945ee24cb979bb8b9f973c6b85cabad5df5dc82dcf5b7289224900fea7375a8b","68fcf36f41dc3f126b0302ee7c25f9aa190d475d4eb0d0a3f79ad315dd3e5505","d5c3c73ee2e2b40a7864a1a400449a0e1ba63c3443297cbc7e3d519ea809c47c","c34591420144fd24fe98d92f8e931c2db879e660d7e678c0853145d7b66383ed","f7e6b756752b44cf86a637e92b7b9fd440364ed10f159620295c82ef4c01598e","8accb64efdde9869dbd46b3e269554aa37071cee52427b7b766ce95b68010d08","3742852d00749272428b8c47e43e5a3921ef6c5bc02ea49c8883b9af7419cb80","17143a2f74312378275d61c5963187d18d930052c75c98cd536eebc31c384d39","8329b26e3f6d80178e6cb5b82e2c6d283cefe0af5f76e6653010619941263b44","8beb4dffff457d8c4097439b66d069e93854d33f9fc9edc32c2050c28aaba869","64180c263eb305e631cc2a70e8b103d3203d5a7bb5e2e35cb1d29b3c0fb826c4","2c0ed5ed6dae70f8caa1e3931b67d4515fe33e2c4cb99b06c6d08ec945ff36a7","f51e78909f6f78cdfe76e04c13b8956ffc4c9002aa9fa1075100fbb2e5644443","bf6d9f8abcb2374ed7d4a0d6abb873aede0c5a6dd58d4c6ed5023d94a6bc92fc","a45f51fbaf0b390fee640b0e32f450bd5b1994cf47f957cb82252f417eb71330","0ebf395c43e772e1fbf36f14497db73bddada15d79791068702d562f18c5846e","c281355dd413e135a9ea1e58eaecbabb73cff487831326b6e4df98e1a1e9c731","a16be2ac2ce8d408f21bba190130224b438eb25e85babccfd29a1892e7b32746","92e6d74a16da962ad7e6928c32f853de200b3480865ff74c054e4322fe554b04","760b62ad8bc0b694a0218ce51db7c84cb070d9c986440ddbd01c105e4c7ff078","f40fe4b3638e3425e2c67bc124a0c19493c0b9022835dd987911e2e785b4cc60","803bd82564d3152878816498895b3751952f74d4ec3dc4e07d352c67e326e257",{"version":"dd332252bb45677533cd5553e0c35340cee4c485c90c63360f8e653901286a4f","impliedFormat":1},{"version":"dddde95f3dea44dc49c9095a861298e829122a54a3f56b3b815e615501e2ed16","impliedFormat":1},{"version":"794a88237c94d74302df12ebb02f521cf5389a5bf046a3fdbdd3afb21dc02511","impliedFormat":1},{"version":"66a08d30c55a7aefa847c1f5958924a3ef9bea6cd1c962a8ff1b2548f66a6ce0","impliedFormat":1},{"version":"0790ae78f92ab08c9d7e66b59733a185a9681be5d0dc90bd20ab5d84e54dcb86","impliedFormat":1},{"version":"1046cd42ec19e4fd038c803b4fc1aff31e51e6e48a6b8237a0240a11c1c27792","impliedFormat":1},{"version":"8f93c7e1084de38a142085c7f664b0eb463428601308fb51c68b25cb687e0887","impliedFormat":1},{"version":"83f69c968d32101f8690845f47bcae016cbea049e222a5946889eb3ae37e7582","impliedFormat":1},{"version":"59c3f3ed18de1c7f5927e0eafcdc0e545db88bfae4168695a89e38a85943a86d","impliedFormat":1},{"version":"32e6c27fd3ef2b1ddbf2bf833b2962d282eb07d9d9d3831ca7f4ff63937268e1","impliedFormat":1},{"version":"406ebb72aa8fdd9227bfce7a1b3e390e2c15b27f5da37ea9e3ed19c7fb78d298","impliedFormat":1},{"version":"197109f63a34b5f9379b2d7ba82fc091659d6878db859bd428ea64740cb06669","impliedFormat":1},{"version":"059871a743c0ca4ae511cbd1e356548b4f12e82bc805ab2e1197e15b5588d1c4","impliedFormat":1},{"version":"8ccefe3940a2fcb6fef502cdbc7417bb92a19620a848f81abc6caa146ab963e9","impliedFormat":1},{"version":"44d8ec73d503ae1cb1fd7c64252ffa700243b1b2cc0afe0674cd52fe37104d60","impliedFormat":1},{"version":"67ea5a827a2de267847bb6f1071a56431aa58a4c28f8af9b60d27d5dc87b7289","impliedFormat":1},{"version":"e33bb784508856827448a22947f2cac69e19bc6e9d6ef1c4f42295f7bd4ce293","impliedFormat":1},{"version":"383bb09bfeb8c6ef424c7fbce69ec7dc59b904446f8cfec838b045f0143ce917","impliedFormat":1},{"version":"83508492e3fc5977bc73e63541e92c5a137db076aafc59dcf63e9c6ad34061c7","impliedFormat":1},{"version":"ef064b9a331b7fc9fe0b368499c52623fb85d37d8972d5758edc26064189d14d","impliedFormat":1},{"version":"d64457d06ab06ad5e5f693123ee2f17594f00e6d5481517058569deac326fea0","impliedFormat":1},{"version":"e92ea29d716c5fe1977a34e447866d5cfbd94b3f648e3b9c550603fdae0e94fb","impliedFormat":1},{"version":"3d10f47c6b1e9225c68c140235657a0cdd4fc590c18faf87dcd003fd4e22c67f","impliedFormat":1},{"version":"13989f79ff8749a8756cac50f762f87f153e3fb1c35768cc6df15968ec1adb1a","impliedFormat":1},{"version":"e014c2f91e94855a52dd9fc88867ee641a7d795cfe37e6045840ecf93dab2e6b","impliedFormat":1},{"version":"74b9f867d1cc9f4e6122f81b59c77cbd6ff39f482fb16cffdc96e4cda1b5fdb1","impliedFormat":1},{"version":"7c8574cfc7cb15a86db9bf71a7dc7669593d7f62a68470adc01b05f246bd20ff","impliedFormat":1},{"version":"c8f49d91b2669bf9414dfc47089722168602e5f64e9488dbc2b6fe1a0f6688da","impliedFormat":1},{"version":"3abee758d3d415b3b7b03551f200766c3e5dd98bb1e4ff2c696dc6f0c5f93191","impliedFormat":1},{"version":"79bd7f60a080e7565186cfdfd84eac7781fc4e7b212ab4cd315b9288c93b7dc7","impliedFormat":1},{"version":"4a2f281330a7b5ed71ebc4624111a832cd6835f3f92ad619037d06b944398cf4","impliedFormat":1},{"version":"ea8130014cb8ee30621bf521f58d036bff3b9753b2f6bd090cc88ac15836d33c","impliedFormat":1},{"version":"c740d49c5a0ecc553ddfc14b7c550e6f5a2971be9ed6e4f2280b1f1fa441551d","impliedFormat":1},{"version":"886a56c6252e130f3e4386a6d3340cf543495b54c67522d21384ed6fb80b7241","impliedFormat":1},{"version":"4b7424620432be60792ede80e0763d4b7aab9fe857efc7bbdb374e8180f4092a","impliedFormat":1},{"version":"e407db365f801ee8a693eca5c21b50fefd40acafda5a1fa67f223800319f98a8","impliedFormat":1},{"version":"529660b3de2b5246c257e288557b2cfa5d5b3c8d2240fa55a4f36ba272b57d18","impliedFormat":1},{"version":"0f6646f9aba018d0a48b8df906cb05fa4881dc7f026f27ab21d26118e5aa15de","impliedFormat":1},{"version":"b3620fcf3dd90a0e6a07268553196b65df59a258fe0ec860dfac0169e0f77c52","impliedFormat":1},{"version":"08135e83e8d9e34bab71d0cf35b015c21d0fd930091b09706c6c9c0e766aca28","impliedFormat":1},{"version":"96e14f2fdc1e3a558462ada79368ed49b004efce399f76f084059d50121bb9a9","impliedFormat":1},{"version":"56f2ade178345811f0c6c4e63584696071b1bd207536dc12384494254bc1c386","impliedFormat":1},{"version":"e484786ef14e10d044e4b16b6214179c95741e89122ba80a7c93a7e00bf624b1","impliedFormat":1},{"version":"4763ce202300b838eb045923eaeb32d9cf86092eee956ca2d4e223cef6669b13","impliedFormat":1},{"version":"7cff5fff5d1a92ae954bf587e5c35987f88cacaa006e45331b3164c4e26369de","impliedFormat":1},{"version":"c276acedaadc846336bb51dd6f2031fdf7f299d0fae1ee5936ccba222e1470ef","impliedFormat":1},{"version":"426c3234f768c89ba4810896c1ee4f97708692727cfecba85712c25982e7232b","impliedFormat":1},{"version":"ee12dd75feac91bb075e2cb0760279992a7a8f5cf513b1cffaa935825e3c58be","impliedFormat":1},{"version":"3e51868ea728ceb899bbfd7a4c7b7ad6dd24896b66812ea35893e2301fd3b23f","impliedFormat":1},{"version":"781e8669b80a9de58083ca1f1c6245ef9fb04d98add79667e3ed70bde034dfd5","impliedFormat":1},{"version":"cfd35b460a1e77a73f218ebf7c4cd1e2eeeaf3fa8d0d78a0a314c6514292e626","impliedFormat":1},{"version":"452d635c0302a0e1c5108edebcca06fc704b2f8132123b1e98a5220afa61a965","impliedFormat":1},{"version":"bbe64c26d806764999b94fcd47c69729ba7b8cb0ca839796b9bb4d887f89b367","impliedFormat":1},{"version":"b87d65da85871e6d8c27038146044cffe40defd53e5113dbd198b8bce62c32db","impliedFormat":1},{"version":"c37712451f6a80cbf8abec586510e5ac5911cb168427b08bc276f10480667338","impliedFormat":1},{"version":"ecf02c182eec24a9a449997ccc30b5f1b65da55fd48cbfc2283bcfa8edc19091","impliedFormat":1},{"version":"0b2c6075fc8139b54e8de7bcb0bed655f1f6b4bf552c94c3ee0c1771a78dea73","impliedFormat":1},{"version":"49707726c5b9248c9bac86943fc48326f6ec44fe7895993a82c3e58fb6798751","impliedFormat":1},{"version":"a9679a2147c073267943d90a0a736f271e9171de8fbc9c378803dd4b921f5ed3","impliedFormat":1},{"version":"a8a2529eec61b7639cce291bfaa2dd751cac87a106050c3c599fccb86cc8cf7f","impliedFormat":1},{"version":"bfc46b597ca6b1f6ece27df3004985c84807254753aaebf8afabd6a1a28ed506","impliedFormat":1},{"version":"7fdee9e89b5a38958c6da5a5e03f912ac25b9451dc95d9c5e87a7e1752937f14","impliedFormat":1},{"version":"b8f3eafeaf04ba3057f574a568af391ca808bdcb7b031e35505dd857db13e951","impliedFormat":1},{"version":"30b38ae72b1169c4b0d6d84c91016a7f4c8b817bfe77539817eac099081ce05c","impliedFormat":1},{"version":"c9f17e24cb01635d6969577113be7d5307f7944209205cb7e5ffc000d27a8362","impliedFormat":1},{"version":"685ead6d773e6c63db1df41239c29971a8d053f2524bfabdef49b829ae014b9a","impliedFormat":1},{"version":"b7bdabcd93148ae1aecdc239b6459dfbe35beb86d96c4bd0aca3e63a10680991","impliedFormat":1},{"version":"e83cfc51d3a6d3f4367101bfdb81283222a2a1913b3521108dbaf33e0baf764a","impliedFormat":1},{"version":"95f397d5a1d9946ca89598e67d44a214408e8d88e76cf9e5aecbbd4956802070","impliedFormat":1},{"version":"74042eac50bc369a2ed46afdd7665baf48379cf1a659c080baec52cc4e7c3f13","impliedFormat":1},{"version":"1541765ce91d2d80d16146ca7c7b3978bd696dc790300a4c2a5d48e8f72e4a64","impliedFormat":1},{"version":"ec6acc4492c770e1245ade5d4b6822b3df3ba70cf36263770230eac5927cf479","impliedFormat":1},{"version":"4c39ee6ae1d2aeda104826dd4ce1707d3d54ac34549d6257bea5d55ace844c29","impliedFormat":1},{"version":"deb099454aabad024656e1fc033696d49a9e0994fc3210b56be64c81b59c2b20","impliedFormat":1},{"version":"80eec3c0a549b541de29d3e46f50a3857b0b90552efeeed90c7179aba7215e2f","impliedFormat":1},{"version":"a4153fbd5c9c2f03925575887c4ce96fc2b3d2366a2d80fad5efdb75056e5076","impliedFormat":1},{"version":"6f7c70ca6fa1a224e3407eb308ec7b894cfc58042159168675ccbe8c8d4b3c80","impliedFormat":1},{"version":"4b56181b844219895f36cfb19100c202e4c7322569dcda9d52f5c8e0490583c9","impliedFormat":1},{"version":"5609530206981af90de95236ce25ddb81f10c5a6a346bf347a86e2f5c40ae29b","impliedFormat":1},{"version":"632ce3ee4a6b320a61076aeca3da8432fb2771280719fde0936e077296c988a9","impliedFormat":1},{"version":"8b293d772aff6db4985bd6b33b364d971399993abb7dc3f19ceed0f331262f04","impliedFormat":1},{"version":"4eb7bad32782df05db4ba1c38c6097d029bed58f0cb9cda791b8c104ccfdaa1f","impliedFormat":1},{"version":"c6a8aa80d3dde8461b2d8d03711dbdf40426382923608aac52f1818a3cead189","impliedFormat":1},{"version":"bf5e79170aa7fc005b5bf87f2fe3c28ca8b22a1f7ff970aa2b1103d690593c92","impliedFormat":1},{"version":"ba3c92c785543eba69fbd333642f5f7da0e8bce146dec55f06cfe93b41e7e12f","impliedFormat":1},{"version":"c6d72ececae6067e65c78076a5d4a508f16c806577a3d206259a0d0bfeedc8d1","impliedFormat":1},{"version":"b6429631df099addfcd4a5f33a046cbbde1087e3fc31f75bfbbd7254ef98ea3c","impliedFormat":1},{"version":"4e9cf1b70c0faf6d02f1849c4044368dc734ad005c875fe7957b7df5afe867c9","impliedFormat":1},{"version":"7498b7d83674a020bd6be46aeed3f0717610cb2ae76d8323e560e964eb122d0c","impliedFormat":1},{"version":"b80405e0473b879d933703a335575858b047e38286771609721c6ab1ea242741","impliedFormat":1},{"version":"7193dfd01986cd2da9950af33229f3b7c5f7b1bee0be9743ad2f38ec3042305e","impliedFormat":1},{"version":"1ccb40a5b22a6fb32e28ffb3003dea3656a106dd3ed42f955881858563776d2c","impliedFormat":1},{"version":"8d97d5527f858ae794548d30d7fc78b8b9f6574892717cc7bc06307cc3f19c83","impliedFormat":1},{"version":"ccb4ecdc8f28a4f6644aa4b5ab7337f9d93ff99c120b82b1c109df12915292ac","impliedFormat":1},{"version":"8bbcf9cecabe7a70dcb4555164970cb48ba814945cb186493d38c496f864058f","impliedFormat":1},{"version":"7d57bdfb9d227f8a388524a749f5735910b3f42adfe01bfccca9999dc8cf594c","impliedFormat":1},{"version":"3508810388ea7c6585496ee8d8af3479880aba4f19c6bbd61297b17eb30428f4","impliedFormat":1},{"version":"56931daef761e6bdd586358664ccd37389baabeb5d20fe39025b9af90ea169a5","impliedFormat":1},{"version":"abb48247ab33e8b8f188ef2754dfa578129338c0f2e277bfc5250b14ef1ab7c5","impliedFormat":1},{"version":"beaba1487671ed029cf169a03e6d680540ea9fa8b810050bc94cb95d5e462db2","impliedFormat":1},{"version":"1418ef0ba0a978a148042bc460cf70930cd015f7e6d41e4eb9348c4909f0e16d","impliedFormat":1},{"version":"56be4f89812518a2e4f0551f6ef403ffdeb8158a7c271b681096a946a25227e9","impliedFormat":1},{"version":"bbb0937150b7ab2963a8bc260e86a8f7d2f10dc5ee7ddb1b4976095a678fdaa4","impliedFormat":1},{"version":"862301d178172dc3c6f294a9a04276b30b6a44d5f44302a6e9d7dc1b4145b20b","impliedFormat":1},{"version":"cbf20c7e913c08cb08c4c3f60dae4f190abbabaa3a84506e75e89363459952f0","impliedFormat":1},{"version":"0f3333443f1fea36c7815601af61cb3184842c06116e0426d81436fc23479cb8","impliedFormat":1},{"version":"421d3e78ed21efcbfa86a18e08d5b6b9df5db65340ef618a9948c1f240859cc1","impliedFormat":1},{"version":"b1225bc77c7d2bc3bad15174c4fd1268896a90b9ab3b306c99b1ade2f88cddcc","impliedFormat":1},{"version":"ca46e113e95e7c8d2c659d538b25423eac6348c96e94af3b39382330b3929f2a","impliedFormat":1},{"version":"03ca07dbb8387537b242b3add5deed42c5143b90b5a10a3c51f7135ca645bd63","impliedFormat":1},{"version":"ca936efd902039fda8a9fc3c7e7287801e7e3d5f58dd16bf11523dc848a247d7","impliedFormat":1},{"version":"2c7b3bfa8b39ed4d712a31e24a8f4526b82eeca82abb3828f0e191541f17004c","impliedFormat":1},{"version":"5ffaae8742b1abbe41361441aa9b55a4e42aee109f374f9c710a66835f14a198","impliedFormat":1},{"version":"ecab0f43679211efc9284507075e0b109c5ad024e49b190bb28da4adfe791e49","impliedFormat":1},{"version":"967109d5bc55face1aaa67278fc762ac69c02f57277ab12e5d16b65b9023b04f","impliedFormat":1},{"version":"36d25571c5c35f4ce81c9dcae2bdd6bbaf12e8348d57f75b3ef4e0a92175cd41","impliedFormat":1},{"version":"fde94639a29e3d16b84ea50d5956ee76263f838fa70fe793c04d9fce2e7c85b9","impliedFormat":1},{"version":"5f4c286fea005e44653b760ebfc81162f64aabc3d1712fd4a8b70a982b8a5458","impliedFormat":1},{"version":"e02dabe428d1ffd638eccf04a6b5fba7b2e8fccee984e4ef2437afc4e26f91c2","impliedFormat":1},{"version":"60dc0180bd223aa476f2e6329dca42fb0acaa71b744a39eb3f487ab0f3472e1c","impliedFormat":1},{"version":"b6fdbecf77dcbf1b010e890d1a8d8bfa472aa9396e6c559e0fceee05a3ef572f","impliedFormat":1},{"version":"e1bf9d73576e77e3ae62695273909089dbbb9c44fb52a1471df39262fe518344","impliedFormat":1},{"version":"d2d57df33a7a5ea6db5f393df864e3f8f8b8ee1dfdfe58180fb5d534d617470f","impliedFormat":1},{"version":"fdcd692f0ac95e72a0c6d1e454e13d42349086649828386fe7368ac08c989288","impliedFormat":1},{"version":"5583eef89a59daa4f62dd00179a3aeff4e024db82e1deff2c7ec3014162ea9a2","impliedFormat":1},{"version":"b0641d9de5eaa90bff6645d754517260c3536c925b71c15cb0f189b68c5386b4","impliedFormat":1},{"version":"9899a0434bd02881d19cb08b98ddd0432eb0dafbfe5566fa4226bdd15624b56f","impliedFormat":1},{"version":"4496c81ce10a0a9a2b9cb1dd0e0ddf63169404a3fb116eb65c52b4892a2c91b9","impliedFormat":1},{"version":"ecdb4312822f5595349ec7696136e92ecc7de4c42f1ea61da947807e3f11ebfc","impliedFormat":1},{"version":"42edbfb7198317dd7359ce3e52598815b5dc5ca38af5678be15a4086cccd7744","impliedFormat":1},{"version":"8105321e64143a22ed5411258894fb0ba3ec53816dad6be213571d974542feeb","impliedFormat":1},{"version":"d1b34c4f74d3da4bdf5b29bb930850f79fd5a871f498adafb19691e001c4ea42","impliedFormat":1},{"version":"9a1caf586e868bf47784176a62bf71d4c469ca24734365629d3198ebc80858d7","impliedFormat":1},{"version":"35a443f013255b33d6b5004d6d7e500548536697d3b6ba1937fd788ca4d5d37b","impliedFormat":1},{"version":"b591c69f31d30e46bc0a2b383b713f4b10e63e833ec42ee352531bbad2aadfaa","impliedFormat":1},{"version":"31e686a96831365667cbd0d56e771b19707bad21247d6759f931e43e8d2c797d","impliedFormat":1},{"version":"dfc3b8616bece248bf6cd991987f723f19c0b9484416835a67a8c5055c5960e0","impliedFormat":1},{"version":"03b64b13ecf5eb4e015a48a01bc1e70858565ec105a5639cfb2a9b63db59b8b1","impliedFormat":1},{"version":"c56cc01d91799d39a8c2d61422f4d5df44fab62c584d86c8a4469a5c0675f7c6","impliedFormat":1},{"version":"5205951312e055bc551ed816cbb07e869793e97498ef0f2277f83f1b13e50e03","impliedFormat":1},{"version":"50b1aeef3e7863719038560b323119f9a21f5bd075bb97efe03ee7dec23e9f1b","impliedFormat":1},{"version":"0cc13970d688626da6dce92ae5d32edd7f9eabb926bb336668e5095031833b7c","impliedFormat":1},{"version":"3be9c1368c34165ba541027585f438ed3e12ddc51cdc49af018e4646d175e6a1","impliedFormat":1},{"version":"7d617141eb3f89973b1e58202cdc4ba746ea086ef35cdedf78fb04a8bb9b8236","impliedFormat":1},{"version":"ea6d9d94247fd6d72d146467070fe7fc45e4af6e0f6e046b54438fd20d3bd6a2","impliedFormat":1},{"version":"d584e4046091cdef5df0cb4de600d46ba83ff3a683c64c4d30f5c5a91edc6c6c","impliedFormat":1},{"version":"ce68902c1612e8662a8edde462dff6ee32877ed035f89c2d5e79f8072f96aed0","impliedFormat":1},{"version":"0fdcf43fd0f1d8cacc83da11ba56bda5697fd2be7d3f282141903212169dad34","impliedFormat":1},{"version":"015ba7d990cac24d4ff045d75e5b1e74edd306223bae571e3862c92cec7e6515","impliedFormat":1},{"version":"59cd834d4204f5467061c56e16cd3c68eb2d5ce15e27d2b4c0a30a68a9bbb870","impliedFormat":1},{"version":"a8761b5c12f6b4fdfb6bb5698935397e81df493e15c067752f1193b28ca1aa01","impliedFormat":1},{"version":"760a3050427dc1e3d3228fbcfb17f5e9f9c62b7a21af098da05e5d7f1c110fd6","impliedFormat":1},{"version":"cac3a87600ffc325e1e2bff3830e3e9977de05b66e4384f3625e1378222575bb","impliedFormat":1},{"version":"14826ddd521dfed918eead9e6f65fd33f1d37a1f5723a647c0fcebde5fb2680b","impliedFormat":1},{"version":"5da3fd402befb210af1893188bd9199d8193bbf24cceeb7bb0c5262eae410ab4","impliedFormat":1},{"version":"d48ac7569126b1bc3cd899c3930ef9cf22a72d51cf45b60fc129380ae840c2f2","impliedFormat":1},{"version":"e4f0d7556fda4b2288e19465aa787a57174b93659542e3516fd355d965259712","impliedFormat":1},{"version":"756b471ce6ec8250f0682e4ad9e79c2fddbe40618ba42e84931dbb65d7ac9ab0","impliedFormat":1},{"version":"ce9635a3551490c9acdbcb9a0491991c3d9cd472e04d4847c94099252def0c94","impliedFormat":1},{"version":"b70ee10430cc9081d60eb2dc3bee49c1db48619d1269680e05843fdaba4b2f7a","impliedFormat":1},{"version":"9b78500996870179ab99cbbc02dffbb35e973d90ab22c1fb343ed8958598a36c","impliedFormat":1},{"version":"c6ee8f32bb16015c07b17b397e1054d6906bc916ab6f9cd53a1f9026b7080dbf","impliedFormat":1},{"version":"67e913fa79af629ee2805237c335ea5768ea09b0b541403e8a7eaef253e014d9","impliedFormat":1},{"version":"0b8a688a89097bd4487a78c33e45ca2776f5aedaa855a5ba9bc234612303c40e","impliedFormat":1},{"version":"188e5381ed8c466256937791eab2cc2b08ddcc5e4aaf6b4b43b8786ed1ab5edd","impliedFormat":1},{"version":"8559f8d381f1e801133c61d329df80f7fdab1cbad5c69ebe448b6d3c104a65bd","impliedFormat":1},{"version":"00a271352b854c5d07123587d0bb1e18b54bf2b45918ab0e777d95167fd0cb0b","impliedFormat":1},{"version":"10c4be0feeac95619c52d82e31a24f102b593b4a9eba92088c6d40606f95b85d","impliedFormat":1},{"version":"e1385f59b1421fceba87398c3eb16064544a0ce7a01b3a3f21fa06601dc415dc","impliedFormat":1},{"version":"bacf2c0f8cbfc5537b3c64fc79d3636a228ccbb00d769fb1426b542efe273585","impliedFormat":1},{"version":"3103c479ff634c3fbd7f97a1ccbfb645a82742838cb949fdbcf30dd941aa7c85","impliedFormat":1},{"version":"4b37b3fab0318aaa1d73a6fde1e3d886398345cff4604fe3c49e19e7edd8a50d","impliedFormat":1},{"version":"bf429e19e155685bda115cc7ea394868f02dec99ee51cfad8340521a37a5867a","impliedFormat":1},{"version":"72116c0e0042fd5aa020c2c121e6decfa5414cf35d979f7db939f15bb50d2943","impliedFormat":1},{"version":"20510f581b0ee148a80809122f9bcaa38e4691d3183a4ed585d6d02ffe95a606","impliedFormat":1},{"version":"71f4b56ed57bbdea38e1b12ad6455653a1fbf5b1f1f961d75d182bff544a9723","impliedFormat":1},{"version":"b3e1c5db2737b0b8357981082b7c72fe340edf147b68f949413fee503a5e2408","impliedFormat":1},{"version":"396e64a647f4442a770b08ed23df3c559a3fa7e35ffe2ae0bbb1f000791bda51","impliedFormat":1},{"version":"698551f7709eb21c3ddec78b4b7592531c3e72e22e0312a128c40bb68692a03f","impliedFormat":1},{"version":"662b28f09a4f60e802023b3a00bdd52d09571bc90bf2e5bfbdbc04564731a25e","impliedFormat":1},{"version":"e6b8fb8773eda2c898e414658884c25ff9807d2fce8f3bdb637ab09415c08c3c","impliedFormat":1},{"version":"528288d7682e2383242090f09afe55f1a558e2798ceb34dc92ae8d6381e3504a","impliedFormat":1},"e62b8648dced493ba3d9f27e3e1244c91c8000e18bef0ed41d398c397ea5d2a3","ce59b80fe82f29a129733864b6d11e66e67f2c1e6726b93bdfe1e52dab4b992b","35a4b0592ed84668bdb01bd6d9178886cfebbededc68bb05e15ff79f73c2fe1b","b88ffadb0466cce763bb71c9d28c980a6ce95f13f449e62cdefc6667bd91809a","2c8652fe391da45771e479ec7255e796aeeba958139cd9a5c2ae8272765c356e","1f1d7eb350502e0112b323a231f1625e3c3a73121a3e53325a3b9fa823b59f34","f29119f11c8a5ad0de950956a769b9e44b9d3a3198f6f6911567929bdf24834d","d5f70e5efa4df817d2121ac1aa6a4ae0192272be476107155c0b357cba036ac3","cfae809d4f3ad7232795bad9b3f5b0efa8e55e89e33e5a88ac75c754656bcc43","6cb32b60a86a2ae059ad65e4f626b53574375074e8f1f90640cd1cb1bd244c56","9a5307a752b98dfe071ceb6cbc8493afe45ca0d8f8dc233780989648c2c3d266","e3b1f03903474e6421870d51bbce636b8dc54e1bea2c30f87593d5437075d3d3","e8c4c3cbd1163276e80c2a4a93a807de9f0611c7f72a7f82d3686decb2b52937","49418426fbe7d299cf2a8b76f5079f41ac6b8901a3637471d12eaee485985ceb","acc00789e938dcd164046cdd21777ae9fc5fb3dd55f2c18786ce7b452354a386","7cc38abc8cf9df9881695460c530c4bc1b97f48bb8f00bbb423b8d8bfbda8336","12c31d0288887231238cfc0888bcf0781a92897f1dcb993956ab15d0cb56ef16","2c81deff61ae2896cc36e754429f14a95bfb7330bb631d78a2fbe84671bca45f","f071a16202374bbf53ae298fc6242af34f87e5e41993cfdff14076c466f11209","a458b2b8700bb01f7c1de40afdde8678b1e4b94e47c00ea8fed6c11acf935573","8a63833b5b3441fb64c3bfa81f24d7d5da678fe8eea975222d8f81b419526e74","3b7a57bd680f229177e7e6182a6ef2355bf6ce03f49b8706d0629316065f61c6","9c2c8ea5671649eca5e51434ca09db987cd479067d8746c51cd513c2387ccc8c","3b8e6f1a2974bd61029b4325594df7448a03637f0c9b14dd9dc528408ea53663","73c564af972e9c2b67b4f93aca068a77ced55b180fdb2711a3cac58d1944f774","b823abbe9b22dfc39215e3765612730e870856024cbe80f54ab3d8d895ec8a6f","2e87139b0b77269ceb3b3d96b0de0ac8bbadd50903587cd54473575d01550b36","37a1294b59e8f90023367c3db56f40d30dc839f461f3d2b30ebff322ffb375f0","78aa46555fb5bd5a34a39e7c3569fd0ced452016dbbdbe25fe3cc900c0517db3","4682759210e74d7d5720322a3f7bce841d4ebd12cb3cdb1f43f22cd0b2d3ae0b","6c83eb15f6e81b098a02334f73e740b6f31063b86df42a4e74636e848273c74a","8c199ba51f0ae5d5acbe705c654ac2bdbbc520380f0c6b9d601ff6cc773c6c9a",{"version":"8802b394e2349c9d4460625cbdc6a24f6be2e53be3ceb851593c59c792a01bff","impliedFormat":1},{"version":"a7254515f71dece25604f3452a1506f7f07cbd9677d5ebcee537903a138dfb08","impliedFormat":1},{"version":"490ff2d2c5ccac2edf791584c50ce0e40588d26be687cec88444c46dca42d2f3","impliedFormat":1},{"version":"31869545853db0e0989cb40caf62ce156a1387e9daee3db242e5a75c63b6470e","impliedFormat":1},"11fd8c54072f7e0465119b39082d64a5cda2f7e237cbd4f592959253420ab11e","3c790a4f4b7053abdd8abca207e7f40f2634723f799a8656c1276c123271a573","b76c334e0454a375505397d7fd795abd7ef0121e6967adf883fb706cae5596ba","28d16f15db876c27da3beb6430da453e153014bcabb373632dcadbdc551d6f45","825b49f6622ef9e47476b43d14e56a166780ebae93531f062ec4ff9d2b21f7f5","10f5c2f7183cb26233703380bce25cd0ceb981628996a313aeb4840852002bab","9cf348738d303f7ca95add2548d6f8f7d6928aad18da89e28b96f8a5637e025b","7018780e449c03fa3cbb74bb3e1049bbb6d8a69005479eacef8d155e5b136bb5","ee04f4b8180d0f9badc99a3a6ea58b856d2a088fe5cd67b80773fb1a54538a97","2a15c12b614950bfe57ffa876da9c105008078a283888e6609c6162fe6603e93","42bcdc8de979f97663cdfd552ef926e9ec1c25a54f4ab1c5946452ef39aea7cd","4c8f06c09647144b3486f416f48fdcb20a3cb320f5c41ad5f05fff7625eab4c1","9886138fe5507c185f52254c20121ece3b4bb508d6a41bec4ba7d8b0c00561a6","e5922ad9dd9db5264cd1866e4603b0588dccb7262ed43ec84c3ee40da0ec678b","749996432ebcf6a7fe51c9f4bd674ecb4ad8c8bf05b7013d0e5377b2f1aefa71","88c3630b6bcc967e3693ca4c3d424a6915813ca78be689a74f10497475b5534d","2d3cbceefb5b703b6ad7a340caf667b804db84dc1ecb4f98265a00f2c74016d2","7622f9ec8714a848e91da3148e7a20c6a34b9304bb6f8ffaaa4d6ccc6278e265","f7536c0f2725e95a0c6612384a174051b3c789f412454a25ea04b11fc6fa256d","7553b7f99899d010cc50b230194b89012a1682ca35defdb96c9a48245595d462","b45f7fdc01b41984a2f30211f4e688584433b7b86f716db82171a9644a2631b6","dacdff8ec7f980ad3b40d6805806eb147246421779dad9d87ef7bb532039733e","ebb6bd33bc7abed94dcb9e4f06461b02e2ff294c9da9ecfcdb545670d25e2a6f","1b0ed3e05d0976614e44e87ccbb7eb24dd6cada7ed27e063c5bb8deebd3873ab","2dfac7dcf0847c83eb0cfb4e76643c16df382456ff1d31bf9cf189f1cd17dd09","3264578de9df955a904f9966c0e24f0a962a3b07615938a04e5bb1c7937d4d3f","a4b33bf6cee22d535149df46bb59f24265be7212aad166218efbaced7717c837",{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},"7e812bec116ed5549d86fc048a64d1e6ab95f1f9d439dcf74fb2b221e6fa7cdc","f91b598a172665f693e5642cccf07da43ff85256e5d548f240defb3bb12b295a",{"version":"a33ea06913b712c529662bee7fd75959781267cf8a307902cc7761307fec0337","impliedFormat":1},"436ac46b179cd2fcb01b2a188658acfc30a6f1a73443557aeab3ca6a1273772a","806bfc94b8599b913debcb4032361bce98760718059bf7d39efc58bad3169f4e","61a815ae0f2c239daf451cb3923a98bf04f44ffb4c54a3317d42ba33c24c938a","7ee5909ad7ef87a017745fe0b4657f93c6b231047bb1cbaa5e16a36019aa4590",{"version":"e331054a02adcad184373c783d4b7e087545fd6ef381fd9d7646f53f38aba01d","impliedFormat":1},{"version":"97e1818573679b5d3d697406abd3e5f1e9cd00da1f2783ab236912180462f5be","impliedFormat":99},"7acfc6750688f15578b4cd306cc19f6f43a83f0be97b85abd2d43f54359ee5a5","a0d88ed2cd4b9acf129c8cd4ccecc6736a5a09a21ec64d0b327190d9485eb444","837c461e48f1bb3704aa1c1e5d07c40596bafea797c632af69256b6329a8b27c","06c65f55df421f0fec03101ebb48ab0d9afbe605dd1c97d7a7d4ff2891e3753d","43f9a0ade8a4dcb26278531a8c8ced0902d55b01d05421a737c02f5fb2dcad72","e9f76c09b041fd4ebe65278e1503df51a469fcaef27cd283fa501e222fedfbf3","a20beb787e3ede6d205eafc98083c8314ab6c9653036df594145610eaee323bb","6dc624fbb21db539dc7fb488b3b14be17d0559e58b7b7b3f736c8b22c591eb7f","9c7a2811f38f3bd0904af2928d6b896bf7239e5f6c324f14349696c4cd8ea457","a52a264cd8be9cb8a7e1d4d815e93fe048d8c8dcaf215660d002c96ec57e70c3","07423e94916443b2efef56c2d003271a387feb9b9c7c1f29dbb8da14884e95ac","d56968c935d8b07bb46e9c979457bc25ab1b8c63429bddad8e012f97de4399f7","5b7f178b98b612ab53edee141f5fce386b3b01639f833eaf49e74416006beb11","24aabd78b3392d7143edbf58ee9b71abc4726195b2d904405358205658c6c2d5","dd422492f68ac3e78b70ef5046dc0d96365ed93722ec775f8acd531108f6470a","612ed0b7103915a4b7bef07c7814b44174a1ff38dff04baf22ef929a611d6204","dd019b25e6b0ab63d197f40d14ebe262da43d14248953586cc99761acb5f4a28","b08b36a02076090614d78b77d268f70cc88b1aab252e262b4a2c42283a9dd790","3efba5ae0dccf2cbc499ba6fc9401fe8b6f8ace1d952d4e074e46a2247a5ad42","3f3ef85502457abca182e792fc814c841c7624fe6445065f36ea99f97abd9709",{"version":"3cef134032da5e1bfabba59a03a58d91ed59f302235034279bb25a5a5b65ca62","affectsGlobalScope":true,"impliedFormat":1},"622b12c864253ba2b144a44bd38a8d7a005a5f7bd21e70c976c21582e1025202","5e1649da6691e26a94a405e7e07668225e394bf7c40370131134cd8c1e62b8fb",{"version":"faa4daf16d1dfa12fb5c411e5e10794890f996ddd18e9cb993513d78229f50dd","impliedFormat":1},{"version":"03d4252ad2204675754354a29444973bd01ca5e912b50392b6a224328341a0d4","impliedFormat":1},{"version":"ae0f70be10da6601e0d5cd5af63c263b01186f8aa62aef9fcab283a658a4e2e8","impliedFormat":1},{"version":"0fc4a9267818037c32f7647a60113c5820c51e006947fea7e4ef6fb3e683a55b","impliedFormat":1},{"version":"d5e05630866ef8a6e034b12d73764befb12be951dce252bc3868e0fd38f030b5","impliedFormat":1},{"version":"9d28bfc63fb729c02f435f3f97120959ee88f68cf7f66df752da13ec7f172e35","impliedFormat":1},{"version":"406acebe0cd79d7653449cc7e90536aa80c321d2993d2742bee3c0fd5cf795d0","impliedFormat":1},{"version":"8f7e65bf94b451566ccc763a6747ce12fec95632a5b7fce0004e334ee6bcc39e","impliedFormat":1},{"version":"3064c3fb7ebd55baebfa1c30a721c27d1a40299d83e700864e3bc1d511066e65","impliedFormat":1},{"version":"be9375425de452daa3df406df9aea9894067fe26d271cb976b14721b8ac47d51","impliedFormat":1},{"version":"4c49392780a40b54add2e3e49d5589596b4c63952504ae4d39d1515053db5a39","impliedFormat":1},{"version":"70729025d7a95fea345f6ff9406586fb5f79ddec543bfba261d21c24792373cd","impliedFormat":1},{"version":"1df6d6cb79a4986ebaf0530460384354969bd69876041469c8c6b663acc601dd","impliedFormat":1},{"version":"958cfb1af63c829517a635d0af60f3fb6ad33c8f622f2e97421d4907bbb407a7","impliedFormat":1},{"version":"6717dad91e44ad22d68f1fc0db74e5eb5398c2c06a2943bf06d3a168e8b1ba45","impliedFormat":99},"71bf679a63a007e4c00a7b741b481b6ed0874413cfdd8e3be7ad6f41f0af87a5",{"version":"4ed3d09d151c7df17b4aed08151dcec1b6cf5517efb9317e68255c9f0e87e3a7","impliedFormat":1},{"version":"7a18c5ced1dfa14f66d07e555e2520419e407dd0fbd0c361b9a49293c3c6404e","impliedFormat":1},{"version":"9983214a7be7684a050168f937a4aa0debcb6c36a0b931ab80ae3eaf29d43d15","impliedFormat":1},{"version":"65b6875e601e3b67b4b6ddc2847978e1ee2f5c728bcb2b371d0ad110bd85249d","impliedFormat":1},{"version":"de4c5ca97170bbd073eccb461a279334da29e6c6524a17274fdf6779f6c9f9a2","impliedFormat":1},"e48eaa4b3669076b49ac70c36f8b317a6b757f5da069011d0a74f918ca60362b","835b2d19fe47a43b0146c8f38e8b34e5c654b28b5affb2d212e43b0e9eae03e4","dec08af2dc0bf6704aec54cf44d443742ddb590e0a5ce1c5322b013fd8b15c58","853c13b422f127426e214cf37a7eeb059ab26379102bbd7c515a5027b951e9d3","638e56ad36734356f9b8dabfcfde38d5d42dae38201e8de2f6e423e35c08144b","d31e3d7dd20fb1eb55748b5606666816891f200ff8114906b52251086996303d","e3b7fe50143fa6d977825e3bfc7c8215598fbe825170bd6ffb2058620e79c3d5","2a1744cbe1508dddaf816baf3d89b4053e74257cfb3e7a1a623c2b54a8df8169","11546e190d52bc45067e4826692e42a90f9f94cb7a5a8c88da431d58cdcf5255","758cc8d19804b3dcbbf5dd908e121aaa54abda83525ca38fd78b061514e3b803","bb1b1243d132f869b3206cd410e036cd8b3ba0c2696ea286a5345303353b40a8","2440d764f58af2d4421bdfabe6fa90127e8cdf3f10ce659882445edde9aed8b0",{"version":"bd05f961ddbd7023eb460eda89c425cb75a040e33311bf295dcdeee3ef508cd7","impliedFormat":1},{"version":"31022e9d82f5278e19ad2cb8702efe9fbb3c3fc1fbc34ad6c0650f3957af28f9","impliedFormat":1},{"version":"4b3508e42cb795afaacea89cb0614428bb26be66e7d477125cc0c658ae2ca802","impliedFormat":1},{"version":"dfa501173fcd48021c4e4136813c0af4c8f5551200378eddee2927899e189e9c","impliedFormat":1},{"version":"ec38834d7e9a3082bdaac634d489338d4ef2d21a2dc8ef4f9b1fa8bb83ab3aa0","impliedFormat":1},{"version":"1e2f76a7ef63647e902b3dbce9c9308bf5956d25bd68646a01c0b760307a9bd5","impliedFormat":1},{"version":"58ac9d2789658be4fa523ebab63353f5b1774054bf2df83d52eb7535037f416c","impliedFormat":1},"6f5b22abda59629dc2f2fdadbd90a545faf70b53754dbc51a57d72c3a58b3871","a7d9df91e2bbd23561fbbd83384ca4b6ee2381fc9d97e2f1dd16219c6b8ec4bf","739667dbf0f54f5f245cfe3504e0c65b3b3823bd7809f3e1d10e5b4dd67c74a9","249110420449404e677d690892d08db8d94fbe4a5436e16411a95127308027eb","7bf1b3142d2850e0842032011da57bec05d68692820048c50be1f9c38f7b5081","a88cede224e745dacad4cd5198fe77ec0bd6c7fa5700a70f4011185b13e15e16","194b5e94f72387264026eb133af7ddb5accb0ba1589184a0af6a410749a33c11",{"version":"eee97dd68753c0d9ad318838f0cc538df3c3599a62046df028f799ec13c6de08","impliedFormat":1},"74e05dc1d1d517ae9b0a8c27cc5ac488cca5c29179bc678717411c76183d3a97","1d36b2318e51296c41e4da90c945258ca0fc54bd21515b8b6f6be768ad3a83fe","3fce33fb74beff5aad06658b9a7428620874f7314d761c4083d89562568d9f78","69ca218f8c9fea14ba771ca36a7f921994feaca557c69eb8fbaf054fb92cd717","404398d86e82be41c17f16d663774a6da3bbde6d6b7e94519852e5fc2be47c79","2dc26fe0d3cec7ca8bd4ba2a8455a9b7ee95b65adbfb1ecd2bbe8c14d31d8769","7df8a1f8b16923021bba5a707bf32cb618e720bd0cba03ab9a3d4c9f8deed5d3","1b8850fc391f70a60f8c5b8fa3a6cadf29cd778cb7eddb035549c6891ded0331","2c79d0e39021171b21b738f4fbdefcee738bfa8de77ed508f8899893a42a64b6","63583a320efe24bb0f0b1fd679db077f9e08ac67f0064f77f1f3a6447c13fbbe","4b71af485d3b7f81a5a7e51898d08d16f326fdc523413e77f8697df1eb4317e0","336339bd3ef2afdf9d00ca431b1c7487861c19f9d6712d137a7d5a16e506ce65","d707349a2ec04c1f8f8343a25ba11166e5080e761cbd7020a25d30515742565a","cc9cb79fb2a167676ae8bd360f331aa1c6b1b2a5c9146f00ca0360f858f6b456","4f4fe79244441f68c756d3455cf6f42c31f1fb5bec812f7d855c5bd7ffb8d720","dbf9ffcfa3769f0e36408d45d4d29fc761bd311397546618e69367c11b12ed7c","652ce0b8e00bd2215b63bd9af51dd2a007c0edbbc4a79467303d23b69ad507f9","e4386d6f64631b9a7505745ae53340d1769d96075f6d01f96a2d35d38b273df3","9b7127b58bd02c7fcede60eea5a89e7c4c7ea4e074af14216d1ae94bacc41088","707ea133c2012b5a0fed0bb4402240207507bdcd756633cf2037a1b17582d025","6ead295c7406af6c3f308165cc8a9ec94c2d09036e32f09b455e430654e6fab4","ff557425a049a1c9b3c4f9bed9a5b0dd86bde12fea184bf68d4f523442838316","caa4e1893b30037340aef7015359875d69df3b3e212b26bc5c5d236063619b96","f3f7b327865294e5200d9192ef8dfdcd4ecdaa3ad2e1268fc833540650f23f97","d962c1591952d109a27339d723b3595cc3ab31bbfe452d4e1c348865cb23ae80","a0590e4f0e357d718b2447efc87cb93b59a728305a06ece4ae39599913577d48","fd72287e0fcbc684e7680b567fa070e636d604fce7d92e69e49119c6f358efb8","4d1409ea13e7ff0ed4e7ca182fdb952affbc248709ebaaeef960f51713f2c61e",{"version":"1c8ff6bf81bcb887e327f51e261625f75584a2052fcc4710a77f542aea12303c","impliedFormat":1},{"version":"0dcb288859aaa54d0827010f73bcfbb4354ff644f15b4fb3782213579d0597b4","impliedFormat":1},{"version":"130732ac19879a76e89db5fa3ec75ca665a61e89bac03dcbaa8e97cff042ff9e","impliedFormat":1},{"version":"f568a765b5da538a45256b0df9888bc2baea92e8643c735380ba673ae7840fff","impliedFormat":1},{"version":"8cfc56bf1e712a55ec2e979998f1b0a0cb54e3ee2053009964969085c36dfaae","impliedFormat":1},{"version":"03a4facd4eb2fe452d64718d3a52db39de8ecdf395a0b0d6d57a500f52e88065","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},"d694337aa9eb121b325a786b7f5afa1751f7f4022f090d540ab47797eaae9875","6f08be2b1ea0a34f0e7dd366aa67778b5893325bf8b9e9003519d1839f467553","38dd0f299bfd7e3bc20f793a8b947ec976dcbd66377a7cc793dce8c806de7ce1","028e0f11e73def8349c76a334976e343211b7a0de6b4d93b3ec4772fbb4af0e8","355b9cead6d27588b23a02f3684e9a4d3c921ab813b1e74c15c43c364bda580d","731b6b54d562d1bfc9289476e816c03b03fc8f22fb1b6f1e22ce3ffb5c54c893","f7f3e6f673ee35b8640b2f5f84685b62b9eae080398c0f6dd360dcf05b96a221","420fd5b37b3bff1e375537d0cf0c2507b591f0593a92849e8b9d11558c959b88","d5b1a7ebd9b8ed8af6de461699ea695a2afe237faa8a13403d0e9600b433a07a","64097d6666e2e35e905acd2ac9f901d92d5929b676bc60c5e2f083ceb9705d2a","dd2dad8745e2998fdd2eb2538acedfa92b1de37944aaa686c9f12234083d4809","1594b73229c133c86e31d92bff89895057284d74b25482bb454c32a5b04ba249",{"version":"fc627448a14f782ce51f8e48961688b695bc8a97efab0aa1faecbfc040e977c8","impliedFormat":1},{"version":"e2fcce840457c1096432ebce06f488efdadca70af969a90106bfad26bbabc1ec","impliedFormat":1},{"version":"764fec087122d840f12f9f24e1dc1e4cc2dcb222f3d13d2a498bf332fbe460d7","impliedFormat":1},{"version":"7a17edfdf23eaaf79058134449c7e1e92c03e2a77b09a25b333a63a14dca17ed","impliedFormat":1},{"version":"41e0d68718bf4dc5e0984626f3af12c0a5262a35841a2c30a78242605fa7678e","impliedFormat":1},{"version":"1607892c103374a3dc1f45f277b5362d3cb3340bfe1007eec3a31b80dd0cf798","impliedFormat":1},{"version":"33efc51f2ec51ff93531626fcd8858a6d229ee4a3bbcf96c42e7ffdfed898657","impliedFormat":1},{"version":"220aafeafa992aa95f95017cb6aecea27d4a2b67bb8dd2ce4f5c1181e8d19c21","impliedFormat":1},{"version":"a71dd28388e784bf74a4bc40fd8170fa4535591057730b8e0fef4820cf4b4372","impliedFormat":1},{"version":"6ba4e948766fc8362480965e82d6a5b30ccc4fda4467f1389aba0dcff4137432","impliedFormat":1},{"version":"4e4325429d6a967ef6aa72ca24890a7788a181d28599fe1b3bb6730a6026f048","impliedFormat":1},{"version":"dcbb4c3abdc5529aeda5d6b0a835d8a0883da2a76e9484a4f19e254e58faf3c6","impliedFormat":1},{"version":"0d81307f711468869759758160975dee18876615db6bf2b8f24188a712f1363b","impliedFormat":1},{"version":"7c4cf13b05d1c64ce1807d2e5c95fd657f7ef92f1eeb02c96262522c5797f862","impliedFormat":1},{"version":"eebe1715446b4f1234ce2549a8c30961256784d863172621eb08ae9bed2e67a3","impliedFormat":1},{"version":"64ad3b6cbeb3e0d579ebe85e6319d7e1a59892dada995820a2685a6083ea9209","impliedFormat":1},{"version":"5ebdc5a83f417627deff3f688789e08e74ad44a760cdc77b2641bb9bb59ddd29","impliedFormat":1},{"version":"a514beab4d3bc0d7afc9d290925c206a9d1b1a6e9aa38516738ce2ff77d66000","impliedFormat":1},{"version":"d80212bdff306ee2e7463f292b5f9105f08315859a3bdc359ba9daaf58bd9213","impliedFormat":1},{"version":"86b534b096a9cc35e90da2d26efbcb7d51bc5a0b2dde488b8c843c21e5c4701b","impliedFormat":1},{"version":"906dc747fd0d44886e81f6070f11bd5ad5ed33c16d3d92bddc9e69aad1bb2a5c","impliedFormat":1},{"version":"e46d7758d8090d9b2c601382610894d71763a9909efb97b1eebbc6272d88d924","impliedFormat":1},{"version":"03af1b2c6ddc2498b14b66c5142a7876a8801fcac9183ae7c35aec097315337a","impliedFormat":1},{"version":"294b7d3c2afc0d8d3a7e42f76f1bac93382cb264318c2139ec313372bbfbde4f","impliedFormat":1},{"version":"a7bc0f0fd721b5da047c9d5a202c16be3f816954ad65ab684f00c9371bc8bac2","impliedFormat":1},{"version":"4bf7b966989eb48c30e0b4e52bfe7673fb7a3fb90747bdc5324637fc51505cd1","impliedFormat":1},{"version":"05590ca2cee1fa8efb08cf7a49756de85686403739e7f8d25ada173e8926e3ee","impliedFormat":1},{"version":"c2d3538fabf7d43abd7599ff74c372800130e67674eb50b371a6c53646d2b977","impliedFormat":1},{"version":"10e006d13225983120773231f9fcc0f747a678056161db5c3c134697d0b4cb60","impliedFormat":1},{"version":"b456eb9cb3ff59d2ad86d53c656a0f07164e9dccbc0f09ac6a6f234dc44714ea","impliedFormat":1},{"version":"f447b1d7ea71014329442db440cf26415680f2e400b1495bf87d8b6a4da3180f","impliedFormat":1},{"version":"8baf3ec31869d4e82684fe062c59864b9d6d012b9105252e5697e64212e38b74","impliedFormat":1},{"version":"36a9827e64fa8e2af7d4fd939bf29e7ae6254fa9353ccebd849c894a4fd63e1b","impliedFormat":1},{"version":"3af8cee96336dd9dc44b27d94db5443061ff8a92839f2c8bbcc165ca3060fa6c","impliedFormat":1},{"version":"85d786a0accda19ef7beb6ae5a04511560110faa9c9298d27eaa4d44778fbf9e","impliedFormat":1},{"version":"7362683317d7deaa754bbf419d0a4561ee1d9b40859001556c6575ce349d95ea","impliedFormat":1},{"version":"408b6e0edb9d02acaf1f2d9f589aa9c6e445838b45c3bfa15b4bb98dc1453dc4","impliedFormat":1},{"version":"f8faa497faf04ffba0dd21cf01077ae07f0db08035d63a2e69838d173ae305bc","impliedFormat":1},{"version":"f8981c8de04809dccb993e59de5ea6a90027fcb9a6918701114aa5323d6d4173","impliedFormat":1},{"version":"7c9c89fd6d89c0ad443f17dc486aa7a86fa6b8d0767e1443c6c63311bdfbd989","impliedFormat":1},{"version":"a3486e635db0a38737d85e26b25d5fda67adef97db22818845e65a809c13c821","impliedFormat":1},{"version":"7c2918947143409b40385ca24adce5cee90a94646176a86de993fcdb732f8941","impliedFormat":1},{"version":"0935d7e3aeee5d588f989534118e6fefc30e538198a61b06e9163f8e8ca8cac5","impliedFormat":1},{"version":"55a36a053bfd464be800af2cd1b3ed83c6751277125786d62870bf159280b280","impliedFormat":1},{"version":"a8e7c075b87fda2dd45aa75d91f3ccb07bec4b3b1840bd4da4a8c60e03575cd2","impliedFormat":1},{"version":"f7b193e858e6c5732efa80f8073f5726dc4be1216450439eb48324939a7dd2be","impliedFormat":1},{"version":"f971e196cdf41219f744e8f435d4b7f8addacd1fbe347c6d7a7d125cd0eaeb99","impliedFormat":1},{"version":"fd38ff4bedf99a1cd2d0301d6ffef4781be7243dfbba1c669132f65869974841","impliedFormat":1},{"version":"e41e32c9fc04b97636e0dc89ecffe428c85d75bfc07e6b70c4a6e5e556fe1d6b","impliedFormat":1},{"version":"3a9522b8ed36c30f018446ec393267e6ce515ca40d5ee2c1c6046ce801c192cd","impliedFormat":1},{"version":"0e781e9e0dcd9300e7d213ce4fdec951900d253e77f448471d1bc749bd7f5f7c","impliedFormat":1},{"version":"bf8ea785d007b56294754879d0c9e7a9d78726c9a1b63478bf0c76e3a4446991","impliedFormat":1},{"version":"dbb439938d2b011e6b5880721d65f51abb80e09a502355af16de4f01e069cd07","impliedFormat":1},{"version":"f94a137a2b7c7613998433ca16fb7f1f47e4883e21cadfb72ff76198c53441a6","impliedFormat":1},{"version":"8296db5bbdc7e56cabc15f94c637502827c49af933a5b7ed0b552728f3fcfba8","impliedFormat":1},{"version":"ad46eedfff7188d19a71c4b8999184d1fb626d0379be2843d7fc20faea63be88","impliedFormat":1},{"version":"9ebac14f8ee9329c52d672aaf369be7b783a9685e8a7ab326cd54a6390c9daa6","impliedFormat":1},{"version":"dee395b372e64bfd6e55df9a76657b136e0ba134a7395e46e3f1489b2355b5b0","impliedFormat":1},{"version":"cf0ce107110a4b7983bacca4483ea8a1eac5e36901fc13c686ebef0ffbcbbacd","impliedFormat":1},{"version":"a4fc04fdc81ff1d4fdc7f5a05a40c999603360fa8c493208ccee968bd56e161f","impliedFormat":1},{"version":"8a2a61161d35afb1f07d10dbef42581e447aaeececc4b8766450c9314b6b4ee7","impliedFormat":1},{"version":"b817f19d56f68613a718e41d3ed545ecfd2c3096a0003d6a8e4f906351b3fb7d","impliedFormat":1},{"version":"bbdf5516dc4d55742ab23e76e0f196f31a038b4022c8aa7944a0964a7d36985e","impliedFormat":1},{"version":"981cca224393ac8f6b42c806429d5c5f3506e65edf963aa74bcef5c40b28f748","impliedFormat":1},{"version":"7239a60aab87af96a51cd8af59c924a55c78911f0ab74aa150e16a9da9a12e4f","impliedFormat":1},{"version":"df395c5c8b9cb35e27ab30163493c45b972237e027816e3887a522427f9a15cf","impliedFormat":1},{"version":"afad3315ce3f3d72f153c4c1d8606425ac951cd9f990766c73bd600911013751","impliedFormat":1},{"version":"95fab99f991a8fb9514b3c9282bfa27ffc4b7391c8b294f2d8bf2ae0a092f120","impliedFormat":1},{"version":"62e46dac4178ba57a474dad97af480545a2d72cd8c0d13734d97e2d1481dbf06","impliedFormat":1},{"version":"3f3bc27ed037f93f75f1b08884581fb3ed4855950eb0dc9be7419d383a135b17","impliedFormat":1},{"version":"55fef00a1213f1648ac2e4becba3bb5758c185bc03902f36150682f57d2481d2","impliedFormat":1},{"version":"6fe2c13736b73e089f2bb5f92751a463c5d3dc6efb33f4494033fbd620185bff","impliedFormat":1},{"version":"6e249a33ce803216870ec65dc34bbd2520718c49b5a2d9afdee7e157b87617a2","impliedFormat":1},{"version":"e58f83151bb84b1c21a37cbc66e1e68f0f1cf60444b970ef3d1247cd9097fd94","impliedFormat":1},{"version":"83e46603ea5c3df5ae2ead2ee7f08dcb60aa071c043444e84675521b0daf496b","impliedFormat":1},{"version":"8baf3ec31869d4e82684fe062c59864b9d6d012b9105252e5697e64212e38b74","impliedFormat":1},{"version":"84de46efa2d75741d9d9bbdfdfe9f214b20f00d3459af52ef574d9f4f0dcc73a","impliedFormat":1},{"version":"fb02e489b353b21e32d32ea8aef49bdbe34d6768864cc40b6fb46727ac9d953a","impliedFormat":1},{"version":"c6ade0291b5eef6bf8a014c45fbac97b24eeae623dbacbe72afeab2b93025aa2","impliedFormat":1},{"version":"2c5e9ca373f23c9712da12f8efa976e70767a81eb3802e82182a2d1a3e4b190e","impliedFormat":1},{"version":"06bac29b70233e8c57e5eb3d2bda515c4bea6c0768416cd914b0336335f7069b","impliedFormat":1},{"version":"fded99673b5936855b8b914c5bdf6ada1f7443c773d5a955fa578ff257a6a70c","impliedFormat":1},{"version":"8e0e4155cdf91f9021f8929d7427f701214f3ba5650f51d8067c76af168a5b99","impliedFormat":1},{"version":"ef344f40acc77eafa0dd7a7a1bc921e0665b8b6fc70aeea7d39e439e9688d731","impliedFormat":1},{"version":"36a1dffdbb2d07df3b65a3ddda70f446eb978a43789c37b81a7de9338daff397","impliedFormat":1},{"version":"bcb2c91f36780ff3a32a4b873e37ebf1544fb5fcc8d6ffac5c0bf79019028dae","impliedFormat":1},{"version":"d13670a68878b76d725a6430f97008614acba46fcac788a660d98f43e9e75ba4","impliedFormat":1},{"version":"7a03333927d3cd3b3c3dd4e916c0359ab2e97de6fd2e14c30f2fb83a9990792e","impliedFormat":1},{"version":"fc6fe6efb6b28eb31216bd2268c1bc5c4c4df3b4bc85013e99cd2f462e30b6fc","impliedFormat":1},{"version":"6cc13aa49738790323a36068f5e59606928457691593d67106117158c6091c2f","impliedFormat":1},{"version":"68255dbc469f2123f64d01bfd51239f8ece8729988eec06cea160d2553bcb049","impliedFormat":1},{"version":"c3bd50e21be767e1186dacbd387a74004e07072e94e2e76df665c3e15e421977","impliedFormat":1},{"version":"3106b08c40971596efc54cc2d31d8248f58ba152c5ec4d741daf96cc0829caea","impliedFormat":1},{"version":"30d6b1194e87f8ffa0471ace5f8ad4bcf03ccd4ef88f72443631302026f99c1d","impliedFormat":1},{"version":"6df4ad74f47da1c7c3445b1dd7c63bd3d01bbc0eb31aaebdea371caa57192ce5","impliedFormat":1},{"version":"dcc26e727c39367a46931d089b13009b63df1e5b1c280b94f4a32409ffd3fa36","impliedFormat":1},{"version":"36979d4a469985635dd7539f25facd607fe1fb302ad1c6c2b3dce036025419e8","impliedFormat":1},{"version":"1df92aa0f1b65f55620787e1b4ade3a7ff5577fd6355fd65dfebd2e72ee629c7","impliedFormat":1},{"version":"7e138dc97e3b2060f77c4b6ab3910b00b7bb3d5f8d8a747668953808694b1938","impliedFormat":1},{"version":"5b6d83c94236cf3e9e19315cc6d62b9787253c73a53faea34ead697863f81447","impliedFormat":1},{"version":"6d448f6bfeeef15718b82fd6ac9ae8871f7843a3082c297339398167f8786b2e","impliedFormat":1},{"version":"55cdcbc0af1398c51f01b48689e3ce503aa076cc57639a9351294e23366a401d","impliedFormat":1},{"version":"7e553f3b746352b0200dd91788b479a2b037a6a7d8d04aa6d002da09259f5687","impliedFormat":1},{"version":"c58272e3570726797e7db5085a8063143170759589f2a5e50387eff774eadc88","impliedFormat":1},{"version":"32615eb16e819607b161e2561a2cd75ec17ac6301ba770658d5a960497895197","impliedFormat":1},{"version":"ac14cc1d1823cec0bf4abc1d233a995b91c3365451bf1859d9847279a38f16ee","impliedFormat":1},{"version":"f1142315617ac6a44249877c2405b7acda71a5acb3d4909f4b3cbcc092ebf8bd","impliedFormat":1},{"version":"29010a8e6a528cf90fd60872b5c86833755e937e766788848d021397c3b55e6e","impliedFormat":1},{"version":"648ae35c81ab9cb90cb1915ede15527b29160cce0fa1b5e24600977d1ba11543","impliedFormat":1},{"version":"ddc0e8ba97c5ad221cf854999145186b917255b2a9f75d0de892f4d079fa0b5c","impliedFormat":1},{"version":"e67d5e6d2bb861fd76909dc4a4a19fad459914e513c5af57d1e56bae01bd7192","impliedFormat":1},{"version":"d571fae704d8e4d335e30b9e6cf54bcc33858a60f4cf1f31e81b46cf82added4","impliedFormat":1},{"version":"3343dfbc5e7dd254508b6f11739572b1ad7fc4c2e3c87f9063c9da77c34774d7","impliedFormat":1},{"version":"01dab6f0b3b8ab86b120b5dd6a59e05fc70692d5fc96b86e1c5d54699f92989c","impliedFormat":1},{"version":"4ea9bb85a4cf20008ece6db273e3d9f0a2c92d70d18fb82c524967afac7ff892","impliedFormat":1},{"version":"1ca7c8e38d1f5c343ab5ab58e351f6885f4677a325c69bb82d4cba466cdafeda","impliedFormat":1},{"version":"17c9ca339723ded480ca5f25c5706e94d4e96dcd03c9e9e6624130ab199d70e1","impliedFormat":1},{"version":"01aa1b58e576eb2586eedb97bcc008bbe663017cc49f0228da952e890c70319f","impliedFormat":1},{"version":"b901e1e57b1f9ce2a90b80d0efd820573b377d99337f8419fc46ee629ed07850","impliedFormat":1},{"version":"f720eb538fc2ca3c5525df840585a591a102824af8211ac28e2fd47aaf294480","impliedFormat":1},{"version":"ae9d0fa7c8ba01ea0fda724d40e7f181275c47d64951a13f8c1924ac958797bc","impliedFormat":1},{"version":"346d9528dcd89e77871a2decebd8127000958a756694a32512fe823f8934f145","impliedFormat":1},{"version":"d0a466f314b01b5092db46a94cd5102fee2b9de0b8d753e076e9c1bfe4d6307e","impliedFormat":1},{"version":"de716ad71873d3d56e0d611a3d5c1eae627337c1f88790427c21f3cb47a7b6f7","impliedFormat":1},{"version":"cc07061c93ddbcd010c415a45e45f139a478bd168a9695552ab9fa84e5e56fe2","impliedFormat":1},{"version":"bb6462a8cd1932383404a0a708eb38afc172b4f95105849470b6e7afbffd2887","impliedFormat":1},{"version":"673b1fc746c54e7e16b562f06660ffdae5a00b0796b6b0d4d0aaf1f7507f1720","impliedFormat":1},{"version":"710202fdeb7a95fbf00ce89a67639f43693e05a71f495d104d8fb13133442cbc","impliedFormat":1},{"version":"11754fdc6f8c9c04e721f01d171aad19dac10a211ae0c8234f1d80f6c7accfd4","impliedFormat":1},{"version":"5fdcdbf558dfff85ff35271431bab76826400a513bf2cf6e8c938062fcba0f3e","impliedFormat":1},{"version":"de87b16170fa78c501b95363050394acb75ec50cccadd6594c4b9d9425795569","impliedFormat":1},{"version":"199f93a537e4af657dc6f89617e3384b556ab251a292e038c7a57892a1fa479c","impliedFormat":1},{"version":"ead16b329693e880793fe14af1bbcaf2e41b7dee23a24059f01fdd3605cac344","impliedFormat":1},{"version":"ba14614494bccb80d56b14b229328db0849feb1cbfd6efdc517bc5b0cb21c02f","impliedFormat":1},{"version":"6c3760df827b88767e2a40e7f22ce564bb3e57d799b5932ec867f6f395b17c8f","impliedFormat":1},{"version":"afcc443428acd72b171f3eba1c08b1f9dcbba8f1cc2430d68115d12176a78fb0","impliedFormat":1},{"version":"199ae7a196a95542dab5592133e3a9f5b49525e15566d6ba615ce35751d4070a","impliedFormat":1},{"version":"291b182b1e01ded75105515bcefd64dcf675f98508c4ca547a194afd80331823","impliedFormat":1},{"version":"75ddb104faa8f4f84b3c73e587c317d2153fc20d0d712a19f77bea0b97900502","impliedFormat":1},{"version":"135785aa49ae8a82e23a492b5fc459f8a2044588633a124c5b8ff60bbb31b5d4","impliedFormat":1},{"version":"267d5f0f8b20eaeb586158436ba46c3228561a8e5bb5c89f3284940a0a305bd8","impliedFormat":1},{"version":"1d21320d3bf6b17b6caf7e736b78c3b3e26ee08b6ac1d59a8b194039aaaa93ae","impliedFormat":1},{"version":"8b2efbff78e96ddab0b581ecd0e44a68142124444e1ed9475a198f2340fe3ef7","impliedFormat":1},{"version":"6eff0590244c1c9daf80a3ac1e9318f8e8dcd1e31a89983c963bb61be97b981b","impliedFormat":1},{"version":"a069aef689b78d2131045ae3ecb7d79a0ef2eeab9bc5dff10a653c60494faa79","impliedFormat":1},{"version":"680db60ad1e95bbefbb302b1096b5ad3ce86600c9542179cc52adae8aee60f36","impliedFormat":1},{"version":"5a8b2b6bda4d1667408dcecd6a7e9b6ef7bb9ef4b74b7eec5cb5427e8ea26b24","impliedFormat":1},{"version":"b775bfe85c7774cafc1f9b815c17f233c98908d380ae561748de52ccacc47e17","impliedFormat":1},{"version":"4fb9cc98b019394957dc1260c3d0c0a5ef37b166d2a8336b559d205742ed3949","impliedFormat":1},{"version":"ebe41fb9fe47a2cf7685a1250a56acf903d8593a8776403eca18d793edc0df54","impliedFormat":1},{"version":"b5f70f31ef176a91e4a9f46074b763adc321cd0fdb772c16ca57b17266c32d19","impliedFormat":1},{"version":"17de43501223031e8241438822b49eed2a9557efbecd397cb74771f7a8d1d619","impliedFormat":1},{"version":"df787170bf40316bdb5f59e2227e5e6275154bd39f040898e53339d519ecbf33","impliedFormat":1},{"version":"5eaf2e0f6ea59e43507586de0a91d17d0dd5c59f3919e9d12cbab0e5ed9d2d77","impliedFormat":1},{"version":"be97b1340a3f72edf8404d1d717df2aac5055faaff6c99c24f5a2b2694603745","impliedFormat":1},{"version":"4eb2a7789483e5b2e40707f79dcbd533f0871439e2e5be5e74dc0c8b0f8b9a05","impliedFormat":1},{"version":"984dcccd8abcfd2d38984e890f98e3b56de6b1dd91bf05b8d15a076efd7d84c0","impliedFormat":1},{"version":"d9f4968d55ba6925a659947fe4a2be0e58f548b2c46f3d42d9656829c452f35e","impliedFormat":1},{"version":"b3147dba3a43bb5f5451207fb93e0c9e58fac7c17e972ba659a607d1b071098f","impliedFormat":1},{"version":"f9c2a5019ac238db620f704a77e6e153853de477ecb6e304c625c3be020e36f8","impliedFormat":1},{"version":"e0dbaaf0b294114c547fccf3dbd2fb5c21e2bfdedb349be295830cb98ab72853","impliedFormat":1},{"version":"25db4e7179be81d7b9dbb3fde081050778d35fabcc75ada4e69d7f24eb03ce66","impliedFormat":1},{"version":"43ceb16649b428a65b23d08bfc5df7aaaba0b2d1fee220ba7bc4577e661c38a6","impliedFormat":1},{"version":"f3f2e18b3d273c50a8daa9f96dbc5d087554f47c43e922aa970368c7d5917205","impliedFormat":1},{"version":"2d0748f645de665ca018f768f0fd8e290cf6ce86876df5fc186e2a547503b403","impliedFormat":1},{"version":"7cd50e4c093d0fe06f2ebe1ae5baeefae64098751fb7fa6ae03022035231cc97","impliedFormat":1},{"version":"b9fc71b8e83bcc4b5d8dda7bcf474b156ef2d5372de98ac8c3710cfa2dc96588","impliedFormat":1},{"version":"85587f4466c53be818152cbf7f6be67c8384dcf00860290dca05e0f91d20f28d","impliedFormat":1},{"version":"9d4943145bd78babb9f3deb4fccd09dabd14005118ffe30935175056fa938c2b","impliedFormat":1},{"version":"108397cacfc6e701cd183fccf2631f3fc26115291e06ed81f97c656cd59171d4","impliedFormat":1},{"version":"944fcf2e7415a20278f025b4587fb032d7174b89f7ba9219b8883affa6e7d2e3","impliedFormat":1},{"version":"589b3c977372b6a7ba79b797c3a21e05a6e423008d5b135247492cc929e84f25","impliedFormat":1},{"version":"ab16a687cfc7d148a8ae645ffd232c765a5ed190f76098207c159dc7c86a1c43","impliedFormat":1},{"version":"40b0816e7bafc822522ef6dfe0248193978654295b8c5eab4c5437b631c4b2a4","impliedFormat":1},{"version":"b267c3428adf2b1f6abe436e2e92930d14568f92749fe83296c96983f1a30eb4","impliedFormat":1},{"version":"5a48bc706873ec2578b7e91b268e1f646b11c7792e30fccf03f1edb2f800045e","impliedFormat":1},{"version":"6af34aeed2723766478d8c1177b20207fa6991b1ebd73cbc29958fa752c22f90","impliedFormat":1},{"version":"367a2dbfd74532530c5b2d6b9c87d9e84599e639991151b73d42c720aa548611","impliedFormat":1},{"version":"0c583869411fb8a8e861682fa19130f12079137f656f74a356e9c35b46d6b9c5","impliedFormat":1},{"version":"d17f800659c0b683ea73102ca542ab39009c0a074acf3546321a46c1119faf90","impliedFormat":1},{"version":"9512b9fe902f0bf0b77388755b9694c0e19fc61caf71d08d616c257c3bceebbd","impliedFormat":1},{"version":"f89a15f66cf6ba42bce4819f10f7092cdecbad14bf93984bfb253ffaacf77958","impliedFormat":1},{"version":"0154d805e3f4f5a40d510c7fb363b57bf1305e983edde83ccd330cef2ba49ed0","impliedFormat":1},{"version":"89da9aeab1f9e59e61889fb1a5fdb629e354a914519956dfa3221e2a43361bb2","impliedFormat":1},{"version":"202e258fc1b2164242835d1196d9cc1376e3949624b722bbf127b057635063e7","impliedFormat":1},{"version":"08910b002dcfcfd98bcea79a5be9f59b19027209b29ccecf625795ddf7725a4a","impliedFormat":1},{"version":"05d1a8f963258d75216f13cf313f27108f83a8aa2bff482da356f2bfdfb59ab2","impliedFormat":1},{"version":"dc2e5bfd57f5269508850cba8b2375f5f42976287dbdb2c318f6427cd9d21c73","impliedFormat":1},{"version":"1754df61456e51542219ee17301566ac439115b2a1e5da1a0ffb2197e49ccefe","impliedFormat":1},{"version":"2c90cb5d9288d3b624013a9ca40040b99b939c3a090f6bdca3b4cfc6b1445250","impliedFormat":1},{"version":"3c6d4463866f664a5f51963a2849cb844f2203693be570d0638ee609d75fe902","impliedFormat":1},{"version":"61ed06475fa1c5c67ede566d4e71b783ec751ca5e7f25d42f49c8502b14ecbd6","impliedFormat":1},{"version":"ce5c854fbdff970713acdd080e7b3e10a646db8bf6a8187b392e57fd8075816a","impliedFormat":1},{"version":"318957769f5b75529bc378b984dacbd42fbfc0db7481bc69cd1b29de812ad54b","impliedFormat":1},{"version":"410a1e58749c46bb8db9a3c29466183c1ca345c7a2f8e44c79e810b22d9072f7","impliedFormat":1},{"version":"461a1084ee0487fd522d921b4342d7b83a79453f29105800bd14e65d5adf79c5","impliedFormat":1},{"version":"3ee349cda390e8f285b3d861fb5a78e9f69be0d7303607334e08a75ce925928f","impliedFormat":1},{"version":"1efcaa13b1dd8738ba7261f7be898b2d80516e3b9aa091a790b2818179f2cf78","impliedFormat":1},{"version":"111a4c948e8a448d677bfc92166f8a596de03f66045bc1bec50a2f36edb710d2","impliedFormat":1},{"version":"9d7437397cb58f2410f4d64d86a686a6281c5811b17d41b077d6ec0c45d0312e","impliedFormat":1},{"version":"2fdde32fbf21177400da4d10665802c5b7629e2d4012df23d3f9b6e975c52098","impliedFormat":1},{"version":"8c28493e6f020336369eacaf21dc4e6d2ef6896dbb3ae5729891b16d528d71eb","impliedFormat":1},{"version":"bbffb20bab36db95b858d13591b9c09e29f76c4b7521dc9366f89eb2aeead68d","impliedFormat":1},{"version":"61b25ce464888c337df2af9c45ca93dcae014fef5a91e6ecce96ce4e309a3203","impliedFormat":1},{"version":"f0885de71d0dbf6d3e9e206d9a3fce14c1781d5f22bca7747fc0f5959357eeab","impliedFormat":1},{"version":"ddebc0a7aada4953b30b9abf07f735e9fec23d844121755309f7b7091be20b8d","impliedFormat":1},{"version":"1ac6ead96cc738705b3cc0ba691ae2c3198a93d6a5eec209337c476646a2bce3","impliedFormat":1},{"version":"d5c89d3342b9a5094b31d5f4a283aa0200edc84b855aba6af1b044d02a9cf3b2","impliedFormat":1},{"version":"9863cfd0e4cda2e3049c66cb9cd6d2fd8891c91be0422b4e1470e3e066405c12","impliedFormat":1},{"version":"c8353709114ef5cdaeea43dde5c75eb8da47d7dce8fbc651465a46876847b411","impliedFormat":1},{"version":"0c55d168d0c377ce0340d219a519d3038dd50f35aaadb21518c8e068cbd9cf5e","impliedFormat":1},{"version":"356da547f3b6061940d823e85e187fc3d79bd1705cb84bd82ebea5e18ad28c9c","impliedFormat":1},{"version":"6ee8db8631030efcdb6ac806355fd321836b490898d8859f9ba882943cb197eb","impliedFormat":1},{"version":"e7afb81b739a7b97b17217ce49a44577cfd9d1de799a16a8fc9835eae8bff767","impliedFormat":1},{"version":"ca7c244766ad374c1e664416ca8cc7cd4e23545d7f452bbe41ec5dc86ba81b76","impliedFormat":1},{"version":"dc6f8725f18ca08fdfc29c3d93b8757676b62579e1c33b84bc0a94f375a56c09","impliedFormat":1},{"version":"f691685dc20e1cc9579ec82b34e71c3cdccfd31737782aae1f48219a8a7d8435","impliedFormat":1},{"version":"41cf6213c047c4d02d08cdf479fdf1b16bff2734c2f8abbb8bb71e7b542c8a47","impliedFormat":1},{"version":"a0e027058a6ae83fba027952f6df403e64f7bd72b268022dbb4f274f3c299d12","impliedFormat":1},{"version":"5e5b2064d13ff327ee7b2e982dd7e262501b65943438ed8d1a47c35bc0401419","impliedFormat":1},{"version":"83e8fd527d4d28635b7773780cc95ae462d14889ba7b2791dc842480b439ea0b","impliedFormat":1},{"version":"8f70b054401258b4c2f83c6a5b271cde851f8c8983cbb75596ecf90a275eac32","impliedFormat":1},{"version":"bb2e4d0046fc0271ce7837b9668e7f0e99cc9511d77ffdb890bbf7204aae5e4e","impliedFormat":1},{"version":"2f16367abfbf9b8c79c194ec7269dd3c35874936408b3a776ed6b584705113b6","impliedFormat":1},{"version":"b25e13b5bb9888a5e690bbd875502777239d980b148d9eaa5e44fad9e3c89a7e","impliedFormat":1},{"version":"38af232cb48efae980b56595d7fe537a4580fd79120fc2b5703b96cbbab1b470","impliedFormat":1},{"version":"4c76af0f5c8f955e729c78aaf1120cc5c24129b19c19b572e22e1da559d4908c","impliedFormat":1},{"version":"c27f313229ada4914ab14c49029da41c9fdae437a0da6e27f534ab3bc7db4325","impliedFormat":1},{"version":"ff8a3408444fb94122191cbfa708089a6233b8e031ebd559c92a90cb46d57252","impliedFormat":1},{"version":"52625e2647ccc13e1258f7e7e55e79aaf22931ffac16bc38117b543442c44550","impliedFormat":1},{"version":"f9ec7b8b285db6b4c51aa183044c85a6e21ea2b28d5c4337c1977e9fe6a88844","impliedFormat":1},{"version":"b4d9fae96173bbd02f2a31ff00b2cb68e2398b1fec5aaab090826e4d02329b38","impliedFormat":1},{"version":"f0cf7c55e1024f5ad1fc1c70b4f9a87263f22d368aa20474ec42d95bb0919cfc","impliedFormat":1},{"version":"9d0f5034775fb0a6f081f3690925602d01ba16292989bfcac52f6135cf79f56f","impliedFormat":1},{"version":"f5181fff8bba0221f8df77711438a3620f993dd085f994a3aea3f8eaac17ceff","impliedFormat":1},{"version":"49d62a88a20b1dbff8bcf24356a068b816fb2cc2cac94264105a0419b2466b74","impliedFormat":1},{"version":"a04c6362fd99f3702be24412c122c41ed2b3faf3d9042c970610fcd1b1d69555","impliedFormat":1},{"version":"aa6f8f0abe029661655108bc7a0ecd93658bf070ce744b2ffaee87f4c6b51bca","impliedFormat":1},{"version":"5ef75e07b37097e602b73f82e6658b5cbb0683edf35943f811c5b7735ec4a077","impliedFormat":1},{"version":"1a372d53e61534eacd7982f80118b67b37f5740a8e762561cd3451fb21b157ff","impliedFormat":1},{"version":"d67799c6a005603d7e0fd4863263b56eecde8d1957d085bdbbb20c539ad51e8c","impliedFormat":1},{"version":"21af404e03064690ac6d0f91a8c573c87a431ed7b716f840c24e08ea571b7148","impliedFormat":1},{"version":"904f0d5e01e89e207490ca8e7114d9542aefb50977d43263ead389bb2dcec994","impliedFormat":1},{"version":"3784f188208c30c6d523d257e03c605b97bc386d3f08cabe976f0e74cd6a5ee5","impliedFormat":1},{"version":"49586fc10f706f9ebed332618093aaf18d2917cf046e96ea0686abaae85140a6","impliedFormat":1},{"version":"921a87943b3bbe03c5f7cf7d209cc21d01f06bf0d9838eee608dfab39ae7d7f4","impliedFormat":1},{"version":"b75fca19de5056deaa27f8a2445ed6b6e6ceca0f515b6fdf8508efb91bc6398a","impliedFormat":1},{"version":"ce3382d8fdb762031e03fe6f2078d8fbb9124890665e337ad7cd1fa335b0eb4c","impliedFormat":1},{"version":"0fd4f87c1e1fc93b2813f912e814ea9b9dc31363dca62d31829d525a1c21fb1d","impliedFormat":1},{"version":"1a4e3036112cf0cebac938dcfb840950f9f87d6475c3b71f4a219e0954b6cab4","impliedFormat":1},{"version":"ec4245030ac3af288108add405996081ddf696e4fe8b84b9f4d4eecc9cab08e1","impliedFormat":1},{"version":"6f9d2bd7c485bea5504bc8d95d0654947ea1a2e86bbf977a439719d85c50733f","impliedFormat":1},{"version":"1cb6b6e4e5e9e55ae33def006da6ac297ff6665371671e4335ab5f831dd3e2cd","impliedFormat":1},{"version":"dbd75ef6268810f309c12d247d1161808746b459bb72b96123e7274d89ea9063","impliedFormat":1},{"version":"175e129f494c207dfc1125d8863981ef0c3fb105960d6ec2ea170509663662da","impliedFormat":1},{"version":"5c65d0454be93eecee2bec78e652111766d22062889ab910cbd1cd6e8c44f725","impliedFormat":1},{"version":"1d539bc450578c25214e5cc03eaaf51a61e48e00315a42e59305e1cd9d89c229","impliedFormat":1},{"version":"761745badb654d6ff7a2cd73ff1017bf8a67fdf240d16fbe3e43dca9838027a6","impliedFormat":1},{"version":"e4f33c01cf5b5a8312d6caaad22a5a511883dffceafbb2ee85a7cf105b259fda","impliedFormat":1},{"version":"5b49365103ad23e1c4f44b9d83ef42ff19eea7a0785c454b6be67e82f935a078","impliedFormat":1},{"version":"a664ab26fe162d26ad3c8f385236a0fde40824007b2c4072d18283b1b33fc833","impliedFormat":1},{"version":"193337c11f45de2f0fc9d8ec2d494965da4ae92382ba1a1d90cc0b04e5eeebde","impliedFormat":1},{"version":"4a119c3d93b46bead2e3108336d83ec0debd9f6453f55a14d7066bf430bb9dca","impliedFormat":1},{"version":"02ba072c61c60c8c2018bba0672f7c6e766a29a323a57a4de828afb2bbbb9d54","impliedFormat":1},{"version":"88fe3740babbaa61402a49bd24ce9efcbe40385b0d7cceb96ac951a02d981610","impliedFormat":1},{"version":"1abe3d916ab50524d25a5fbe840bd7ce2e2537b68956734863273e561f9eb61c","impliedFormat":1},{"version":"2b44bc7e31faab2c26444975b362ece435d49066be89644885341b430e61bb7e","impliedFormat":1},{"version":"06763bb36ab0683801c1fa355731b7e65d84b012f976c2580e23ad60bccbd961","impliedFormat":1},{"version":"6a6791e7863eb25fa187d9f323ac563690b2075e893576762e27f862b8003f30","impliedFormat":1},{"version":"bd90f3a677579a8e767f0c4be7dfdf7155b650fb1293fff897ccada7a74d77ff","impliedFormat":1},{"version":"b3eb56b920afafd8718dc11088a546eeb3adf6aa1cbc991c9956f5a1fe3265b3","impliedFormat":1},{"version":"605940ddc9071be96ec80dfc18ab56521f927140427046806c1cfc0adf410b27","impliedFormat":1},{"version":"5194a7fd715131a3b92668d4992a1ac18c493a81a9a2bb064bcd38affc48f22d","impliedFormat":1},{"version":"21d1f10a78611949ff4f1e3188431aeabb4569877bb8d1f92e7c7426f0f0d029","impliedFormat":1},{"version":"03eb569fd62a9035cac5ac9fd5d960d73de56a6704b7988c13ce6593bec015d1","impliedFormat":1},{"version":"f77ca1843ec31c769b7190f9aa4913e8888ffdfbc4b41d77256fad4108da2b60","impliedFormat":1},{"version":"2ce435b7150596e688b03430fd8247893013ec27c565cd601bba05ea2b97e99d","impliedFormat":1},{"version":"4ea6ab7f5028bedbbc908ab3085dc33077124372734713e507d3d391744a411b","impliedFormat":1},{"version":"909ecbb1054805e23a71612dd50dff18be871dcfe18664a3bcd40ef88d06e747","impliedFormat":1},{"version":"c260695b255841fcfbc6008343dae58b3ea00efdfc16997cc69992141f4728c6","impliedFormat":1},{"version":"88f46a47b213f376c765ef54df828835dfbb13214cfd201f635324337ebbe17f","impliedFormat":1},{"version":"0d7dcf40ed5a67b344df8f9353c5aa8a502e2bbdad53977bc391b36b358a0a1c","impliedFormat":1},{"version":"093ad5bb0746fdb36f1373459f6a8240bc4473829723300254936fc3fdaee111","impliedFormat":1},{"version":"f2367181a67aff75790aa9a4255a35689110f7fb1b0adb08533913762a34f9e6","impliedFormat":1},{"version":"4a1a4800285e8fd30b13cb69142103845c6cb27086101c2950c93ffcd4c52b94","impliedFormat":1},{"version":"687a2f338ee31fcdee36116ed85090e9af07919ab04d4364d39da7cc0e43c195","impliedFormat":1},{"version":"f36db7552ff04dfb918e8ed33ef9d174442df98878a6e4ca567ad32ea1b72959","impliedFormat":1},{"version":"3ce1188fd214883b087e7feb7bd95dd4a8ce9c1e148951edd454c17a23d54b41","impliedFormat":1},{"version":"5c59f83061ccd81bcba097aa73cbc2ff86b29f5c2e21c9a3072499448f3f98b8","impliedFormat":1},{"version":"003502d5a8ec5d392a0a3120983c43f073c6d2fd1e823a819f25029ce40271e8","impliedFormat":1},{"version":"1fdbd12a1d02882ef538980a28a9a51d51fd54c434cf233822545f53d84ef9cf","impliedFormat":1},{"version":"419bad1d214faccabfbf52ab24ae4523071fcc61d8cee17b589299171419563c","impliedFormat":1},{"version":"74532476a2d3d4eb8ac23bac785a9f88ca6ce227179e55537d01476b6d4435ea","impliedFormat":1},{"version":"bf33e792a3bc927a6b0d84f428814c35a0a9ca3c0cc8a91246f0b60230da3b6c","impliedFormat":1},{"version":"7367c0d3442165e6164185b7950b8f70ea2be0142b2175748fef7dc23c6d2230","impliedFormat":1},{"version":"d66efc7ed427ca014754343a80cf2b4512ceaa776bc4a9139d06863abf01ac5c","impliedFormat":1},{"version":"4eb32b50394f9bab5e69090c0183a3ad999f5231eb421f1c29919e32d9bcd1ed","impliedFormat":1},{"version":"dbeb4c3a24b95fe4ad6fdff9577455f5868fbb5ad12f7c22c68cb24374d0996d","impliedFormat":1},{"version":"71c99cd1806cc9e597ff15ca9c90e1b7ad823b38a1327ccbc8ab6125cf70118e","impliedFormat":1},{"version":"6170710f279fffc97a7dd1a10da25a2e9dac4e9fc290a82443728f2e16eb619b","impliedFormat":1},{"version":"3804a3a26e2fd68f99d686840715abc5034aeb8bcbf970e36ad7af8ab69b0461","impliedFormat":1},{"version":"67b395b282b2544f7d71f4a7c560a7225eac113e7f3bcd8e88e5408b8927a63e","impliedFormat":1},{"version":"fe301153d19ddb9e39549f3a5b71c5a94fec01fc8f1bd6b053c4ef42207bef2a","impliedFormat":1},{"version":"4b09036cb89566deddca4d31aead948cf5bdb872508263220582f3be85157551","impliedFormat":1},{"version":"c61d09ae1f70d3eed306dc991c060d57866127365e03de4625497de58a996ffc","impliedFormat":1},{"version":"e60ec884263e7ffcebaf4a45e95a17fc273120a5d474963d4d6d7a574e2e9b97","impliedFormat":1},{"version":"6fd6c4c9eef86c84dd1f09cbd8c10d8feb3ed871724ba8d96a7bd138825a0c1a","impliedFormat":1},{"version":"a420fa988570675d65a6c0570b71bebf0c793f658b4ae20efc4f8e21a1259b54","impliedFormat":1},{"version":"fef614c5c1079a9b5b227e70832184e8cb70e1f3bcbd66a7406edba40ad3bd52","impliedFormat":1},{"version":"39e31b902b6b627350a41b05f9627faf6bb1919ad1d17f0871889e5e6d80663c","impliedFormat":1},{"version":"282fd78a91b8363e120a991d61030e2186167f6610a6df195961dba7285b3f17","impliedFormat":1},{"version":"0ffca55b4ea7ea4dea94a7ddf9c2c6d6e5c8f14120e720b5d6f0c79f72eab49e","impliedFormat":1},{"version":"47008c9a4f168c2490bebc92653f4227accb55fe4b75f06cd0d568bd6370c435","impliedFormat":1},{"version":"b5203823f084dcfaae1f506dfe9bd84bf8ea008a2a834fdd5c5d7d0144418e0b","impliedFormat":1},{"version":"76c2ad2b6e3ec3d09819d8e919ea3e055c9bd73a90c3c6994ba807fd0e12ab15","impliedFormat":1},{"version":"ec571ed174e47dade96ba9157f972937b2e4844a85c399e26957f9aa6d288767","impliedFormat":1},{"version":"f9013e7bcb88571bbc046f9ba0c16ceb64bc78cb24188875da9dd7222062b138","impliedFormat":1},{"version":"03b9959bee04c98401c8915227bbaa3181ddc98a548fb4167cd1f7f504b4a1ea","impliedFormat":1},{"version":"2d18b7e666215df5d8becf9ffcfef95e1d12bfe0ac0b07bc8227b970c4d3f487","impliedFormat":1},{"version":"d7ebeb1848cd09a262a09c011c9fa2fc167d0dd6ec57e3101a25460558b2c0e3","impliedFormat":1},{"version":"937a9a69582604d031c18e86c6e8cd0fcf81b73de48ad875c087299b8d9e2472","impliedFormat":1},{"version":"05e9608dfef139336fb2574266412a6352d605857de2f94b2ce454d53e813cd6","impliedFormat":1},{"version":"61152e9dee12c018bac65160d0a27d1421a84c8cfd53e57188c39c450d4c113b","impliedFormat":1},{"version":"bb1c6786ef387ac7a2964ea61adfb76bf9f967bbd802b0494944d7eec31fea2e","impliedFormat":1},{"version":"080ef44f7128b5570245b0da74ccef990b0e542a9cbe168b0fbe7a8159add166","impliedFormat":1},{"version":"bc3ee6fe6cab0459f4827f982dbe36dcbd16017e52c43fec4e139a91919e0630","impliedFormat":1},"e52f6d6976361ff1fc9f39df55aa65c7d643a4dfa6a582dae8cde7a55d9391c0","30dd967af4d70cf680a09532f95b7de2ec92563bfe23f6b9bddc63d69759f28a","45abe32062ba331c04885afaf2ae535fd3271257629d21b6af1d6f2d7770ae27","6365e93bf4cd7655376f90849103adad0627b231305f308bbda0ca19fd46eef9","0a86b8c2d216d29d3abed0eb9ba20ecddac182499819382b482b8989f56fdd8f","7b20ca7080c1834b039bd9d270dc41734532ac6a1a10c2c1a68783c1ab20d702","5efcefb99a64ec4c61420ce4c18d22f1514875713dc65765833d1a4d4b0d0b5b","0b76528debdf17a80335ae129da2d94fde6193d05fc956575f470fc90e7aba35","8797d037bc0e2266c47869ccc1342eed67cc6adf04a9612d063477d2e2c31861","09c9bbc4bb3711bdd017bdbd730c8d9b46b9f6ef5d3fcd7b758e61b0d185294f","23ef61ebe686efdce2efa830426cb2cc15a266187a47791ebb7e11d71d12acbf","bff4bdfe880a0ca13e9f05cac474e9fffa4901180f4709a838c71d9a57e65581","295a8b406a88797bcfa22dd3ba42313869f75a191c1030c412a920d6f8cde337","5ee400969772e9168a2cecbe584cbba6eb11ee2dfd5a4969f6672b2b97ec8d91","0ff4aa0513078abb1374e4f054fa24455d003ea1ff75cf9a8a25c8eafff233b9","0b2ebb57137720a83f0474e673d78d09ec2a8922b800b365ceca4038e277bb80","580dd60e3bd97b1c465dcced8b27567a13b7cb8e9fc4338f6830102fd91c5064","54000c5a92278936b3bed3a42ee68cf217948fa4395df3f69ab0e10f6036164d","ef12cdc908f87d6b77d0ff4481e06c225eaa8d6b325c97b04e5dad8dbe7c06e9","fa06adccbb10278df114e2f1c229487462ca0a8ee60c8dcd4963bc9b353d14c6","082339b93f9e72bf1177c217ecaadce68c8018dd0cf1d0522233692eed4ab1dd","39ef2b3011017388e78b3b5b12000fe6f06e32566731a766bcfc7f0327cd2ae3","e0561b4e4a193f7040eedeff726f9cad8dde682511cd0bed9d8c96d852678d83","daf5af46251f6b5d1ff93c59847cefafef3854b8928c77513f075566ac4d4706","477665c23f6447fc27e7d1295da8cf78b4b8a51f21c5b05463a57a6e4d38b57b","fe9b5e213296bed1db737aa63d52feb50f8fa0c618b9e3ce78e9f79dc1d0855e","7e5ecf451bdd6bf66b4217bbeab2cdf71d8ab5cd33c1bba9d158ea373e5a7990","9863c7d872b85cdd0331851f0abc18f14414caec35926f4bfcb9a9b3533a5235","091614ba4ccadb76034ebad791369cf13558bf9f78978e0e36612e5ade17e9df","4647cb5419a6d251702df48e3d3ff85dc808b18183c53581cd6bd6f4d91e0afd","ef580e06ae9750454af76c754a9a6d1943dfc0dca2bc8aaef77960c55f706108","f91f1416ed432c5bf216c2980d523fe18f8ed9a5531e8fa2ae96cf066f55ceba","eb5aae582ad1624568500382ca8c006e3ab805fc237be8567862caf682029b73","9e6d5e74702c948ef2fe7293928d2268c4dd6a434df6a49cb9528631d634a2b6","51424f5671f5f29c05d45a8d14eb8b9b7503ebd146a9d8f2ca9380afece56329","2043ef5d5e9f34cb8d0d385bec04fff9733a2342adc1b1388d59ba25515fe9c9","1cc5a23c699ccd6817d8e019ec0b8be1eb91482c82125dccdbbe0858bdb874de","4923e89ac0783d0689c879a60aada5ef0d76aa7fa70d1e1a804092570b12a555","7cd11e021c491b7af60e378bf7027f0fe7e04d3321001617d576a6e5671e909f","726d88a0efbd2c1b29d4d6e06bb6db4494c76361886b61e11c0f04f9bfe721b0","d19845b823deaeeaff02e8abe0d21f7b7fe11616522121206bb5414a27bf6b11","2cc7ee7db8a4a9f42f021b4dfcd5d09cd70b14b4c0b164e4853077bb8c7aba68","3b71d8bdc263d362c61a17340b5a37e9f30e3c0ecf0e4e413a7ec2ebca3553ae","5a9c2e70960b0c2091f80771554ffcb630b2dbbad156acbbc59df1ed145db8f2","bde4bf498b0901eab52cbe0fec2ed3d93de4ee00291556828e016e9fb99089be","bdcce7be55cf81b615bf0c2940c034501e4e8ebfe98adb63532917ee9d69a4d9","8f83cf4caf29bd1325eafbbf99096307b9157f3706ab0498c1a5e73fa1fdc4af","53e537f9bf4a65985055bb21b9ef032fc39e96dfa3cfe871f45c28a006e18b59","561c246837df6db769d72d602ff6dfc772b28a2c1a61a76d18fda7c96c92a456","4eafe9003cbcced916a8889f7d492c30fedc387fcb46bf5e4d7872d4bed9e324","f2dcc525d04faa9fef06cc7f7af3a6ce233ebb5fc1a0bd23be45de51af42621f","78cbe14ef98630087b200f27883ebdea469f2995adb06d050f74c34777024e38","9e765931bd40c6e13d5e259e85b8ff1560b8a7b1dbe857ed8806581337de63d6","819608a0045869e0d4e2186611bda817093c588bab7b3dd7b4657b4e8ec2b804","aa706d12f40961bd0a763d5a6042555ffc9dbf921a4a18b0739945a1f978ae98","eaec16dc5eb0eb771087a39b3ecd0b17ddd181249efbc3d824daf18737aa5f9b","bac1e44e607798758b305c3d6c1adcd48d6f2c4781d0ed6d694bec6608eb6a9c","8384da9e3cecef99667bef87e6995c8cf5244edef57cb9f142082af94b35293f","0496ce1cd211587c583a89d1092d93a59e700be17cc7fd215e698ef845b494bd","6e6a664ad09acbc681a857681f52a029c8826aa51935f7a46e16ddffe0da7403","59269e6f037879fa5f5c4f66f8bc8b6f49deb6b5aa9595010c8060cd955f4ba0","fbb2d86ff8e0ba3e428c4ca5b94dfef4523a57616286334b693144a09f9778d8","b630336f7fdd3a8820e7352186a05ab4c5d9f358bc82d5d69797d72a5277794e","618c84a71dde7bbd22117077fcb69e8698b648caa4ecd07e832c81f73a114a8b","cd408b1b17816d5601f26e08e44cf1c434fe868e1c62458d8e21192b74f5bb78","2be007b4ab6c2b48009cc954bf218e3b2e865b5a7923b2b125554e8135267d78","ee048d6d8c3e88c8b37b3a9ff1d337c2ec7cc9ddd3ca1336c2c76df92289d13f","4d475c0648f14a1ea3ce068fcb6e8a6c3f1a20c1bd91eb8e460a241927e44dd9","648acbe32ecdc37b7b0b42c49ebf8fd37ef13492532d972440acc3550294d957","c68ed8d35c0d4d02d700483828591d2f7047d4a6695d5df38dfe2df7a15c3528","6bf10f710ab674bffe724f8917f1757ee60f4133165640051d6ada0b4e4a6d4b","8f907e5977e4da6766933f89cd33b961d91073cfe40f83c03051ed3dfdb7327c","66cd2544daffe31b7ff60d406e433ed9dc0a2c64efdf7184c76356e92274cb44","d61c7a6baa9d98a245ef2b00d976f9902a5734ad1f8a182254aeac772b221808","2370ffa5a437143157a0f246b0ff82371c48c3cb73741f694297f32b13b087e1","d6eacb8182232d2d3e8f84502b70afcd377a4a40e446bc6f6c7c535ec0a78c23","c0e41ac93a8609fc2f1b13654ea33a70500002d9b8509649b58bb8f93c46455f","70c600983321c79bc2460c340f6cf81a8b4bb3a645f1cdf6cc8d7fab10fa9780","42ba464405234e71fb1733b587b8db1e1c0f662ce214e40302dd6e2b1a24c759","3aa346c009158e5e9e2ec7e3eeb0b6e258f22dd99d1c812db70d7f1c876fda26","ff084b23e410a9ef0f13ec0ef1ef6d3cd3db99515c13c364cc41ff143198e4b3","cfac76d88453859e659462eb0ed95601d0d16f641b0f0a556080751afd8613cd","f934145d94ba189110378b06e2b69fb52815a7019d42978f53f2529014a50fd2","464168f332016b2d285e47e36c43104570558a59176459004eaa70cdf3fb1d15","35390cd3df66199f38960e6ec5889351c6edc2a72f1839c97be19b29f5c2006a","0c4267ba64f57306a646774a3d2bf85638ca278cf6490358d21a28002d0dedc0","625eedb2e952354c993c876d4e5014fd544f8b572d1181f77a9aa9c39b48d6fe","1faa64e74eba3acc2c89dffb1a5715748b27183b5f2dfc344b8d4fc4c51e94b3","ca8d346aaf90b36c71a8b4bff395b4d905867e8f24cebf6f3e989be7209c582a","e56d5aab796c3b3f3f1357c5b224b69c12531516894c893b2c24272d2c53ad6c","b1de8a8241458fdc601346e1ae3945c431c7bd3396c76b2f45fcbdc050defa04","89be4c6774b4c4d92352737786651ac852aa3c47a0003075c3ec9cd2072ae7c2","07ee83cbaff22673a47edc6a325a2eb5c1d36840e0d3845139301b026939a72a","c8eeead1e875fd5edd4d42996786f7006cdd2dda04157d487d17bbe9a1992649","96d94217292a87138ce645ff0d5f30f3472dbbbe03af68ecbf882e0500321e08","7eb5e6e5034302c6395c856bdc4cb423e052eb15c84cccdf54f17151950587e2","9175a46cfe4237ebcb826cb1a9895fd430d42eb3438cbfd8a914892f739de0df","8c909488463f212cf22e69a042a9f95e29aec89f1f238a767bac540f3a38cb9d","2c4eea8bc5ae0e500ecb73eecfe892a9f8800beec813dd305c04953f3ce43fa4","5bdb65854bc5f77d27e21004f3827569792287380464dba1b2adcc078886f957","418d4562ff35cfc0afd3256f5d399738e1fb534288f51612b6303d39f9d9ed29","7251482efab40d225d1badcba4843e921546f75d7a04cf9e926a92bf159ab17f","7120ba2fa7ae6dce03c3288a0dd44054204ddb7c8d7400300286a4821fec44d2","808d2c09f459131cc622db125efb4ee1c7635693715d95de183110e98b4684c7","e01739658374a4fc85266f66e8c57d7d64267707433b544d1335ee918b19cd42","b03b972404ce5a5f4f25a7dfc87536e98d66e4716094643592ec5878e2143a49","b50f21ff3af8b54f85976fedcf8e55878dc54451132e2a4a81523202331819ac","1628d122a7212212f77dacacf38c817c30df6b65ee481f98014a41d4ae2134b8","391b789d2c0d82631fc3f57b5636c9bd48185e2c2f4c2d50475084834d7d57a9","a6bff0caacbefb8cccd2868b21f860d36f52481dc367845623cefb2d7df7b6fa","2eaf31a5d338f3d24b09f9f58448ed66a3f2b9632cf995f63807233a33a22860","11d82fa1db62d64db8292e8512a3b833b84356c5c4b10b13d33b265caec6d672","96f3e944281f9937c0cea03ccf543255a8f0b3500f5e48c7f7e5fc0ea41e996d","65529e965be45e6806d2e2c583cd25cf1a08da080236a3c449e312b832d2c881","0ba6bd50816ca560eb1144ec7dd97295300cef5645bca7347f5603105deb0be6","3bd975e35427d529edfe230cc6f913a2e0730496b864e7073b0cdaef1ccca6fc","76b000baadfe84d3626a8b4df74931692e6daf50aa3275beaeed1082385cd647","088907d97700a1799de3065247902b476f47c70e2081696a5472ea4a5e055144","dbe53e4e94c0d27cb7c550922e639543b5e9daf5b694baba30d77aff3bdfe0c6","883568844abc034b5abd3e246865d876d579873d538c6d97f9aaafaceba68d6a","2940b54a4774f1a8c85331267b62e8c99e211d435066582cb7c42bb9b6f455e4","b7053aed1be365a673a5988432a51a1b295dd0e8b61b10335ac93cd650ed5c3b","348d4817aeb8f4f8708662bd7928dbf54b04231a73a8011f0c0aa2264ac16968","eeb26c802c09a7c58d634771478b8f50dd55dd373f1b8233ad2b7fd26ef2a8a4","3595262a5e856785c6ed718136dc0d58811703cc92cc1fb545458be9897ce32a","5318a68feda5bfb305578d4cec1e3056c3213fd834b820eab6b4c20764cea1ae","d46d8e482970fa3bc378b0f82b1ed67d00413807bc5ffcd7b9b65b4292ad7b9f","93ddc0dae90d5eb00ec0449c2f0d635e0acd73720954f2b7c2596358fb23e764","00d478890c8724b7395a1d9ac77cc027ec8eb206246594e7e879feba81975fe5","4f5d48a0a45d1fb351e505d9050d553d6e42c45e1cfa9cfa20415811351af843","0f0d18a0e3e378a1d014a00f7139c04e87a25d8c2ee4e862800a785d39088bb4","6e0d8302fd68301073a3b4560b29be2d08ccc899191e40d2f856d3b98622e7ce","0803eacb171150fb04bc04e7088c188ab5c036893184c692d5878d385e93457d","5457cecdf7af79eda18746ba5ad4afb6861d7367da8307faed0ea0b4acafe08e","3873e58128d1400689543dcef996d18250846d218fb7556704073d3b3b352353","b49dc189d9b1b7a1633b16ebec04d528e467178bdc5a39fc6abc539f045df5f1","c3ca59a1703f7ed2983867ecfb90d27bd624d58cacb89a1aea5de7405e864eb8","18ef82ce3392ed1c128d04a909012e5d4fb066bc8b636d00cdff50fad08d58ed","2abd93ddd2b70ccfd07bc83a2d99ac49da78d7b25763425a6e53903445365663","fead67bb143c50249dda2fa3cef5ca8778edf13dc9ba9a78ee8b5a831268f1e6",{"version":"d9f9348bfcec9960f14706d83fbbdac7262b07bd5a1cb0cdb27562008bf7ada7","impliedFormat":1},{"version":"6edacbfd2c798c583f83be0de7216a1275915a312b31efbf306e3cea9f2952a3","impliedFormat":1},{"version":"897bd53ef52ed858a4a0c62a90c84b01209bb73028692c37d23d5b2cdd7db6f6","impliedFormat":1},{"version":"a6c718e386bd539f2d6b6137006c3d00b5a7b5d3a56db0a64d93c0dbc5afee6c","impliedFormat":1},{"version":"913c47167f91a394bc3cf834dad35fb55bf0d2b1bce506986156a047aaba10ba","impliedFormat":1},{"version":"8ac7787b62a92c6e9208e7f94c327660135034b055659b459234c20c87de0f6e","impliedFormat":1},{"version":"742ed391826d82252ef116a5448e66e3813cd0440e99e26b0a1d6c76b42b615f","impliedFormat":1},{"version":"a6ff0501f5c4b40631e8cc59deeaab41c5d53aff62fe4f34e236536ef8a93115","impliedFormat":1},{"version":"a1f77c9057d7fb67b0821c3fc2d942b785896c4ed80f018f2d5d6e3a44697f37","impliedFormat":1},{"version":"76196c65cacba9f9962c476e9d692c0c433edca9c50f0e531368d0a2b5740db4","impliedFormat":1},{"version":"2c08147699412f78895c69bfbed65a80774a5bdca3453c1e0ed4e92fd03b7c3c","impliedFormat":1},{"version":"266091edaaad527ca212d746139d80589b9936f799351d8f523814c65dc11578","impliedFormat":1},{"version":"449c02e4429900a306f12d6b5acfc51a41d68f3f7b6e443bfd910120e2613ea9","impliedFormat":1},{"version":"b465ecd102a96125bb0de5e4cb895dc2e9235843ced960bef3130635fb56c7d1","impliedFormat":1},{"version":"1b28a97c086b71a8d0bd83f646a95a3f605c42f912e3da372a5372506d95f130","impliedFormat":1},{"version":"11021af779f2e8694432dc8d62209c04c2f679cd242cb6a3e87c7efbf8b078de","impliedFormat":1},{"version":"cbd847a87425205af05cfc1b580e7e08c610772d98c6e04141cf09f3ddf6e4a8","impliedFormat":1},{"version":"8c2d0547b74f92cbe385ebe43c97e5cdf8e200757288bc9093b7253bb7b57766","impliedFormat":1},{"version":"04ec5b9d9feb635eab0fa786f48ce469fc31a387643ca51bd82f18a45cb87333","impliedFormat":1},"74b61e4717f89807917b1db1213f23464fd87903344ded2dcc37859d6c5eded0","f7034d1ab79fb7ecfbd82298d4cf25485a009a18c8e49ece88ef2b3a7061acfc",{"version":"f92cef66f6a7bd6eca888f0318175a524f75d77b54eb5c335e36f3d44b9b76c1","impliedFormat":1},{"version":"cc78001d811441c911311a5406b7eb801d2ef250d0b3dfa3a890ce2a423d7e88","impliedFormat":1},{"version":"a83d8c15d0ab29e132e96630d6cc91e2430f3330084a48d497705a354484ed85","impliedFormat":1},{"version":"f939d80f1aafe887fe05c0827f583facf4781b5f6d01300e836d15456a940fd5","impliedFormat":1},{"version":"2dede7dbdeda7233fd3481f4ef4629d8838ee949adaffad68476c86ce11d6d58","impliedFormat":1},"b64b8ee0c0df23f023050cfc6274965a2e9d430288b7d06906985d46a1967ed4","e2c0de9a54bebfbbf9f872e080ea15a81e49b19213312847c579467af8f25eff","7a6a661abbbe5c15b77d15b8b5f6d4ebdcdf6fdea892f887b3c7684367b37e23","b60123baba649f41d7bf564535b652b0917d7de6a3773056e8c0aa5615a3d9a3","8a9598536a525f1af1e55d406645d3c7140ce88573fb964196528a05d5805dd3"],"root":[475,[1047,1060],[1083,1150],[1157,1205],[1209,1214],[1216,1225],[1233,1238],[1261,1266],[1306,1313],[1315,1317],[1335,1371],1386,4418,4419,[4421,4434],[5270,5274],[5276,5278],[5282,5300],[5302,5306],5308,5309,[5318,5320],[5323,5325],5377,[5379,5409],[5411,5414],[5418,5459],[5461,5474],[5476,5482],[5511,5519],[5521,5548],[5550,5620],[5684,5710],[5712,5738],[5825,5838],[5840,5863],[5865,5883],[5982,5993],[5997,6007],[6009,6035],[6460,6497],[6501,6525],[6627,6653],[6658,6676],6684,6685,[6691,6720],[6903,6934],[6939,6965],7007,[7009,7012],[7015,7034],7036,7037,7053,[7059,7070],[7078,7084],[7086,7113],[7121,7132],[7459,7598],7618,7619,[7625,7629]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":2},"referencedMap":[[475,1],[1238,2],[1263,3],[1264,3],[5880,4],[5881,5],[5882,4],[5883,6],[5986,7],[5988,8],[5987,9],[1265,3],[5879,10],[5982,11],[5983,12],[5984,13],[5985,14],[5989,15],[5990,16],[5991,17],[5993,18],[1266,19],[5997,20],[1354,21],[1357,22],[1352,23],[1358,24],[1353,3],[1359,3],[6017,25],[1360,3],[4423,13],[6031,26],[6032,27],[6003,28],[6007,29],[6021,30],[1362,31],[6034,32],[6010,19],[6015,33],[6016,34],[6012,35],[6013,36],[6014,37],[1361,38],[1364,3],[6023,39],[6009,40],[1363,3],[6024,41],[6027,42],[4430,3],[4431,43],[1365,3],[6025,44],[5999,45],[5998,46],[6006,47],[6004,48],[6005,49],[6002,50],[6000,51],[1048,19],[6001,52],[1047,38],[4419,53],[1366,3],[6020,54],[1367,19],[1368,19],[6022,55],[6028,56],[1369,3],[4429,57],[4428,58],[1371,3],[1386,59],[5273,60],[4433,61],[5270,62],[6035,63],[5271,63],[5272,64],[4434,3],[4432,65],[5274,66],[6029,67],[5276,68],[6030,69],[1370,3],[6033,70],[5277,71],[5878,72],[6465,73],[5278,71],[5283,74],[6470,75],[6468,76],[6480,77],[6469,78],[6471,79],[6472,80],[1050,3],[6467,81],[6477,77],[6478,3],[6479,82],[6474,83],[5282,74],[6473,84],[6476,85],[1049,3],[5284,74],[6484,86],[1051,3],[6485,87],[6488,88],[6495,89],[6489,90],[6490,91],[5288,3],[6491,92],[6492,93],[5289,94],[6493,95],[5287,13],[6518,96],[5286,74],[6496,97],[6519,98],[5285,13],[6524,38],[6525,99],[6628,100],[6629,101],[5297,74],[5298,102],[6630,103],[6501,104],[5296,74],[6633,105],[6503,106],[6631,107],[6632,108],[6504,109],[6502,110],[5295,19],[6505,111],[6506,112],[6507,113],[6508,114],[6511,115],[6510,116],[6634,117],[6509,118],[6635,119],[6460,120],[6636,121],[6637,122],[6461,123],[6494,123],[6462,19],[6464,124],[6463,125],[5292,3],[5293,74],[6497,126],[5294,13],[6515,127],[6516,128],[6512,129],[6513,130],[6514,131],[6517,132],[5291,38],[6627,133],[6638,134],[6641,135],[6639,117],[6640,133],[6642,100],[1056,3],[6643,136],[6651,137],[6644,138],[5299,3],[1054,19],[6645,139],[5300,3],[6647,140],[6648,141],[6646,38],[6650,142],[1055,19],[6649,143],[5290,74],[1052,3],[6520,144],[6521,145],[6475,146],[1053,19],[6522,147],[6523,13],[5302,148],[5323,149],[5324,3],[5325,150],[5388,151],[5387,3],[1338,152],[1346,153],[1316,154],[5390,155],[1315,156],[6653,157],[1347,158],[1343,159],[1345,160],[1317,161],[1313,162],[1351,163],[1336,164],[1340,165],[1341,166],[1344,3],[1342,167],[1339,168],[1312,169],[1306,3],[1335,170],[1350,171],[1337,172],[1349,173],[1348,174],[5389,175],[1311,176],[6011,177],[5391,178],[5392,179],[1308,180],[5382,181],[1309,3],[1307,182],[5386,183],[4422,184],[4421,169],[5383,13],[5385,185],[5384,71],[1310,3],[5393,186],[6652,187],[5394,3],[5304,188],[5303,3],[5305,3],[5306,3],[5397,189],[5400,190],[5401,3],[5402,189],[5395,3],[5403,3],[5404,3],[5399,150],[5396,191],[6659,192],[6661,193],[6667,194],[6669,195],[6671,196],[6670,197],[6672,3],[6673,3],[6674,3],[6676,198],[6941,199],[6943,200],[6945,201],[6665,202],[6948,203],[6950,204],[6951,205],[6663,206],[6953,207],[6954,3],[6956,208],[6960,209],[6958,210],[6962,211],[6963,212],[1057,3],[5405,3],[5408,213],[5407,3],[5406,3],[5411,214],[5412,215],[5409,170],[5413,3],[5414,180],[5419,216],[5418,142],[5420,3],[5421,3],[5423,217],[5422,3],[1262,218],[5430,219],[5432,220],[5436,221],[5441,222],[5443,223],[5445,224],[5446,225],[5448,226],[5449,227],[5447,228],[5451,229],[5453,230],[5454,231],[5457,232],[5456,233],[5455,234],[7605,235],[7606,236],[6240,237],[6242,238],[6436,239],[6222,240],[6241,241],[6244,242],[6435,239],[6431,3],[6245,243],[6130,244],[6246,245],[6247,246],[6248,247],[6340,248],[6249,249],[6250,250],[6341,3],[6143,251],[6251,252],[6252,253],[6144,254],[6342,255],[6253,256],[6254,257],[6255,258],[6256,259],[6258,3],[6257,260],[6259,261],[6344,262],[6345,263],[6260,264],[6261,265],[6191,3],[6262,266],[6346,3],[6192,267],[6263,268],[6147,3],[6433,3],[6339,269],[6239,270],[6338,271],[6150,3],[6151,272],[6264,268],[6281,273],[6156,274],[6157,275],[6282,268],[6411,276],[6408,277],[6410,278],[6401,279],[6406,280],[6409,280],[6396,280],[6404,280],[6398,3],[6400,280],[6397,281],[6405,282],[6283,276],[6399,283],[6402,284],[6403,285],[6412,239],[6284,286],[6285,287],[6126,288],[6125,289],[6127,290],[6146,291],[6225,292],[6234,293],[6235,294],[6138,295],[6286,250],[6145,296],[6131,268],[6227,297],[6236,298],[6132,3],[6287,299],[6349,3],[6288,300],[6371,239],[6348,301],[6161,302],[6381,303],[6372,304],[6374,305],[6375,306],[6226,3],[6368,307],[6369,308],[6167,309],[6164,310],[6166,311],[6165,312],[6367,313],[6364,314],[6360,315],[6350,316],[6362,317],[6361,318],[6373,319],[6366,320],[6365,321],[6376,322],[6289,323],[6276,324],[6434,325],[6265,326],[6266,327],[6267,327],[6382,328],[6269,329],[6196,330],[6290,331],[6291,332],[6292,268],[6383,328],[6198,333],[6158,334],[6293,268],[6197,335],[6438,336],[6271,337],[6458,338],[6294,268],[6142,339],[6437,340],[6377,341],[6277,342],[6275,343],[6162,344],[6274,345],[6389,346],[6393,347],[6390,348],[6391,349],[6163,350],[6386,351],[6380,352],[6379,353],[6378,354],[6385,355],[6384,356],[6392,357],[6295,358],[6184,359],[6296,268],[6388,360],[6272,263],[6279,361],[6278,362],[6387,363],[6280,364],[6178,3],[6172,360],[6228,3],[6128,3],[6168,365],[6204,366],[6180,367],[6170,368],[6229,3],[6297,3],[6298,369],[6159,3],[6299,370],[6440,371],[6230,372],[6300,373],[6186,374],[6224,375],[6173,376],[6185,3],[6203,377],[6208,378],[6209,379],[6129,380],[6220,370],[6210,381],[6216,3],[6223,372],[6149,382],[6301,383],[6302,384],[6231,385],[6303,372],[6123,386],[6212,387],[6304,388],[6160,389],[6213,381],[6270,3],[6171,382],[6394,3],[6243,390],[6305,391],[6370,392],[6347,393],[6306,371],[6152,394],[6202,395],[6174,396],[6139,397],[6124,398],[6307,399],[6308,400],[6217,401],[6218,402],[6219,403],[6137,404],[6175,405],[6309,406],[6182,407],[6456,408],[6310,409],[6183,376],[6181,410],[6232,388],[6441,360],[6211,3],[6430,411],[6187,412],[6343,3],[6206,3],[6207,388],[6179,3],[6136,388],[6238,413],[6237,414],[6459,415],[6311,268],[6312,416],[6395,417],[6221,418],[6313,413],[6314,419],[6133,3],[6457,338],[6315,268],[6316,268],[6317,268],[6318,420],[6319,296],[6134,421],[6320,268],[6321,422],[6418,423],[6201,424],[6413,425],[6414,425],[6420,426],[6169,427],[6233,428],[6193,429],[6322,268],[6323,257],[6419,3],[6194,430],[6416,431],[6415,432],[6189,433],[6190,433],[6188,434],[6325,435],[6324,436],[6326,437],[6199,438],[6200,439],[6327,268],[6195,440],[6154,441],[6215,442],[6214,443],[6328,444],[6421,239],[6176,437],[6329,268],[6422,445],[6177,446],[6268,447],[6330,448],[6331,268],[6332,268],[6273,371],[6442,3],[6443,3],[6205,383],[6444,3],[6445,449],[6446,450],[6455,451],[6447,3],[6449,3],[6450,3],[6448,452],[6451,453],[6452,3],[6135,3],[6453,3],[6148,3],[6454,3],[6141,454],[6333,455],[6140,456],[6334,413],[6335,457],[6336,458],[6432,459],[6352,460],[6353,461],[6351,462],[6355,463],[6407,464],[6363,464],[6424,463],[6354,463],[6357,360],[6358,465],[6356,466],[6359,467],[6423,468],[6155,469],[6425,263],[6153,470],[6337,471],[6428,472],[6426,263],[6427,473],[6439,474],[6417,475],[6429,476],[7609,477],[7612,478],[7614,3],[7607,477],[7608,479],[7610,477],[7611,480],[7615,235],[7616,3],[7613,235],[7617,481],[7600,482],[7604,483],[7603,13],[7601,235],[7602,235],[7599,235],[583,3],[584,3],[585,484],[591,485],[580,486],[581,487],[582,3],[587,488],[589,489],[588,488],[586,490],[590,491],[541,3],[544,492],[547,493],[548,494],[542,495],[560,496],[571,497],[549,498],[551,499],[552,499],[557,500],[550,3],[553,499],[554,499],[555,499],[556,486],[559,501],[561,3],[562,502],[564,503],[563,502],[565,504],[567,505],[545,3],[546,506],[566,504],[558,486],[568,507],[569,507],[543,3],[570,3],[928,508],[929,509],[927,3],[988,3],[991,510],[5268,13],[989,13],[5267,511],[990,3],[4435,512],[4436,512],[4437,512],[4438,512],[4439,512],[4440,512],[4441,512],[4442,512],[4443,512],[4444,512],[4445,512],[4446,512],[4447,512],[4448,512],[4449,512],[4450,512],[4451,512],[4452,512],[4453,512],[4454,512],[4455,512],[4456,512],[4457,512],[4458,512],[4459,512],[4460,512],[4461,512],[4462,512],[4463,512],[4464,512],[4465,512],[4466,512],[4467,512],[4468,512],[4469,512],[4470,512],[4471,512],[4472,512],[4473,512],[4475,512],[4474,512],[4476,512],[4477,512],[4478,512],[4479,512],[4480,512],[4481,512],[4482,512],[4483,512],[4484,512],[4485,512],[4486,512],[4487,512],[4488,512],[4489,512],[4490,512],[4491,512],[4492,512],[4493,512],[4494,512],[4495,512],[4496,512],[4497,512],[4498,512],[4499,512],[4500,512],[4501,512],[4502,512],[4503,512],[4504,512],[4505,512],[4506,512],[4507,512],[4508,512],[4514,512],[4509,512],[4510,512],[4511,512],[4512,512],[4513,512],[4515,512],[4516,512],[4517,512],[4518,512],[4519,512],[4520,512],[4521,512],[4522,512],[4523,512],[4524,512],[4525,512],[4526,512],[4527,512],[4528,512],[4529,512],[4530,512],[4531,512],[4532,512],[4533,512],[4534,512],[4535,512],[4536,512],[4540,512],[4541,512],[4542,512],[4543,512],[4544,512],[4545,512],[4546,512],[4547,512],[4537,512],[4538,512],[4548,512],[4549,512],[4550,512],[4539,512],[4551,512],[4552,512],[4553,512],[4554,512],[4555,512],[4556,512],[4557,512],[4558,512],[4559,512],[4560,512],[4561,512],[4562,512],[4563,512],[4564,512],[4565,512],[4566,512],[4567,512],[4568,512],[4569,512],[4570,512],[4571,512],[4572,512],[4573,512],[4574,512],[4575,512],[4576,512],[4577,512],[4578,512],[4579,512],[4580,512],[4581,512],[4582,512],[4583,512],[4584,512],[4585,512],[4590,512],[4591,512],[4592,512],[4593,512],[4586,512],[4587,512],[4588,512],[4589,512],[4594,512],[4595,512],[4596,512],[4597,512],[4598,512],[4599,512],[4600,512],[4601,512],[4602,512],[4603,512],[4604,512],[4605,512],[4606,512],[4607,512],[4608,512],[4609,512],[4610,512],[4611,512],[4612,512],[4613,512],[4615,512],[4616,512],[4617,512],[4618,512],[4619,512],[4614,512],[4620,512],[4621,512],[4622,512],[4623,512],[4624,512],[4625,512],[4626,512],[4627,512],[4628,512],[4630,512],[4631,512],[4632,512],[4629,512],[4633,512],[4634,512],[4635,512],[4636,512],[4637,512],[4638,512],[4639,512],[4640,512],[4641,512],[4642,512],[4643,512],[4644,512],[4645,512],[4646,512],[4647,512],[4648,512],[4649,512],[4650,512],[4651,512],[4652,512],[4653,512],[4654,512],[4655,512],[4656,512],[4657,512],[4658,512],[4659,512],[4660,512],[4661,512],[4662,512],[4663,512],[4664,512],[4665,512],[4666,512],[4667,512],[4668,512],[4669,512],[4674,512],[4670,512],[4671,512],[4672,512],[4673,512],[4675,512],[4676,512],[4677,512],[4678,512],[4679,512],[4680,512],[4681,512],[4682,512],[4683,512],[4684,512],[4685,512],[4686,512],[4687,512],[4688,512],[4689,512],[4690,512],[4691,512],[4692,512],[4693,512],[4694,512],[4695,512],[4696,512],[4697,512],[4698,512],[4699,512],[4700,512],[4701,512],[4702,512],[4703,512],[4704,512],[4705,512],[4706,512],[4707,512],[4708,512],[4709,512],[4710,512],[4711,512],[4712,512],[4713,512],[4714,512],[4715,512],[4716,512],[4717,512],[4718,512],[4719,512],[4720,512],[4721,512],[4722,512],[4723,512],[4724,512],[4725,512],[4726,512],[4727,512],[4728,512],[4729,512],[4730,512],[4731,512],[4732,512],[4733,512],[4734,512],[4735,512],[4736,512],[4737,512],[4738,512],[4739,512],[4740,512],[4741,512],[4742,512],[4743,512],[4744,512],[4745,512],[4746,512],[4747,512],[4748,512],[4749,512],[4750,512],[4751,512],[4752,512],[4753,512],[4754,512],[4755,512],[4756,512],[4757,512],[4758,512],[4759,512],[4760,512],[4761,512],[4762,512],[4763,512],[4764,512],[4765,512],[4766,512],[4767,512],[4768,512],[4769,512],[4770,512],[4771,512],[4772,512],[4773,512],[4774,512],[4775,512],[4776,512],[4777,512],[4778,512],[4779,512],[4780,512],[4781,512],[4782,512],[4783,512],[4784,512],[4785,512],[4786,512],[4787,512],[4789,512],[4790,512],[4788,512],[4791,512],[4792,512],[4793,512],[4794,512],[4795,512],[4796,512],[4797,512],[4798,512],[4799,512],[4800,512],[4801,512],[4802,512],[4803,512],[4804,512],[4805,512],[4806,512],[4807,512],[4808,512],[4809,512],[4810,512],[4811,512],[4812,512],[4813,512],[4814,512],[4815,512],[4816,512],[4820,512],[4817,512],[4818,512],[4819,512],[4821,512],[4822,512],[4823,512],[4824,512],[4825,512],[4826,512],[4827,512],[4828,512],[4829,512],[4830,512],[4831,512],[4832,512],[4833,512],[4834,512],[4835,512],[4836,512],[4837,512],[4838,512],[4839,512],[4840,512],[4841,512],[4842,512],[4843,512],[4844,512],[4845,512],[4846,512],[4847,512],[4848,512],[4849,512],[4850,512],[4851,512],[4852,512],[4853,512],[4854,512],[4855,512],[4856,512],[4857,512],[5266,513],[4858,512],[4859,512],[4860,512],[4861,512],[4862,512],[4863,512],[4864,512],[4865,512],[4866,512],[4867,512],[4868,512],[4869,512],[4870,512],[4871,512],[4872,512],[4873,512],[4874,512],[4875,512],[4876,512],[4877,512],[4878,512],[4879,512],[4880,512],[4881,512],[4882,512],[4883,512],[4884,512],[4885,512],[4886,512],[4887,512],[4888,512],[4889,512],[4890,512],[4891,512],[4892,512],[4893,512],[4894,512],[4895,512],[4896,512],[4898,512],[4899,512],[4897,512],[4900,512],[4901,512],[4902,512],[4903,512],[4904,512],[4905,512],[4906,512],[4907,512],[4908,512],[4909,512],[4910,512],[4911,512],[4912,512],[4913,512],[4914,512],[4915,512],[4916,512],[4917,512],[4918,512],[4919,512],[4920,512],[4921,512],[4922,512],[4923,512],[4924,512],[4925,512],[4926,512],[4927,512],[4928,512],[4929,512],[4930,512],[4931,512],[4932,512],[4933,512],[4934,512],[4935,512],[4936,512],[4937,512],[4938,512],[4939,512],[4940,512],[4941,512],[4942,512],[4943,512],[4944,512],[4945,512],[4946,512],[4947,512],[4948,512],[4949,512],[4950,512],[4951,512],[4952,512],[4953,512],[4954,512],[4955,512],[4956,512],[4957,512],[4958,512],[4959,512],[4960,512],[4961,512],[4962,512],[4963,512],[4964,512],[4965,512],[4966,512],[4967,512],[4968,512],[4969,512],[4970,512],[4971,512],[4972,512],[4973,512],[4974,512],[4975,512],[4976,512],[4977,512],[4978,512],[4979,512],[4980,512],[4981,512],[4982,512],[4983,512],[4984,512],[4985,512],[4986,512],[4987,512],[4988,512],[4989,512],[4990,512],[4991,512],[4992,512],[4993,512],[4994,512],[4995,512],[4996,512],[4997,512],[4998,512],[4999,512],[5000,512],[5001,512],[5002,512],[5003,512],[5004,512],[5005,512],[5006,512],[5007,512],[5008,512],[5009,512],[5010,512],[5011,512],[5012,512],[5013,512],[5014,512],[5015,512],[5016,512],[5017,512],[5018,512],[5019,512],[5020,512],[5021,512],[5022,512],[5023,512],[5024,512],[5025,512],[5026,512],[5027,512],[5028,512],[5029,512],[5030,512],[5031,512],[5032,512],[5033,512],[5034,512],[5035,512],[5036,512],[5037,512],[5038,512],[5039,512],[5040,512],[5041,512],[5045,512],[5046,512],[5047,512],[5042,512],[5043,512],[5044,512],[5048,512],[5049,512],[5050,512],[5051,512],[5052,512],[5053,512],[5054,512],[5055,512],[5056,512],[5057,512],[5058,512],[5059,512],[5060,512],[5061,512],[5062,512],[5063,512],[5064,512],[5065,512],[5066,512],[5067,512],[5068,512],[5069,512],[5070,512],[5071,512],[5072,512],[5073,512],[5074,512],[5075,512],[5076,512],[5077,512],[5078,512],[5079,512],[5080,512],[5081,512],[5082,512],[5083,512],[5084,512],[5085,512],[5086,512],[5087,512],[5088,512],[5089,512],[5090,512],[5091,512],[5092,512],[5093,512],[5094,512],[5095,512],[5097,512],[5098,512],[5099,512],[5100,512],[5096,512],[5101,512],[5102,512],[5103,512],[5104,512],[5105,512],[5106,512],[5107,512],[5108,512],[5109,512],[5110,512],[5111,512],[5112,512],[5113,512],[5114,512],[5115,512],[5116,512],[5117,512],[5118,512],[5119,512],[5120,512],[5121,512],[5122,512],[5123,512],[5124,512],[5125,512],[5126,512],[5127,512],[5128,512],[5129,512],[5130,512],[5131,512],[5132,512],[5133,512],[5134,512],[5135,512],[5136,512],[5137,512],[5138,512],[5139,512],[5140,512],[5141,512],[5142,512],[5143,512],[5144,512],[5145,512],[5146,512],[5147,512],[5148,512],[5149,512],[5150,512],[5151,512],[5152,512],[5153,512],[5154,512],[5155,512],[5156,512],[5157,512],[5158,512],[5159,512],[5160,512],[5161,512],[5162,512],[5163,512],[5164,512],[5166,512],[5167,512],[5168,512],[5165,512],[5169,512],[5170,512],[5171,512],[5172,512],[5173,512],[5174,512],[5175,512],[5176,512],[5177,512],[5178,512],[5180,512],[5181,512],[5182,512],[5179,512],[5183,512],[5184,512],[5185,512],[5186,512],[5187,512],[5188,512],[5189,512],[5190,512],[5191,512],[5192,512],[5193,512],[5194,512],[5195,512],[5196,512],[5197,512],[5198,512],[5199,512],[5200,512],[5201,512],[5202,512],[5203,512],[5204,512],[5205,512],[5206,512],[5207,512],[5208,512],[5213,512],[5209,512],[5210,512],[5211,512],[5212,512],[5214,512],[5215,512],[5216,512],[5217,512],[5218,512],[5221,512],[5222,512],[5219,512],[5220,512],[5223,512],[5224,512],[5225,512],[5226,512],[5227,512],[5228,512],[5229,512],[5230,512],[5231,512],[5232,512],[5233,512],[5234,512],[5235,512],[5236,512],[5237,512],[5238,512],[5239,512],[5240,512],[5241,512],[5242,512],[5243,512],[5244,512],[5245,512],[5246,512],[5247,512],[5248,512],[5249,512],[5250,512],[5251,512],[5252,512],[5253,512],[5254,512],[5255,512],[5256,512],[5257,512],[5258,512],[5259,512],[5260,512],[5261,512],[5262,512],[5263,512],[5264,512],[5265,512],[5269,514],[924,13],[6654,3],[6809,515],[6811,516],[6810,3],[6812,517],[6813,518],[6808,519],[6843,520],[6844,521],[6842,522],[6846,523],[6849,524],[6845,525],[6847,526],[6848,526],[6850,527],[6851,528],[6856,529],[6853,530],[6852,13],[6855,531],[6854,532],[6860,533],[6859,534],[6857,535],[6858,525],[6861,536],[6862,537],[6866,538],[6864,539],[6863,540],[6865,541],[6801,542],[6783,525],[6784,543],[6786,544],[6800,543],[6787,545],[6789,525],[6788,3],[6790,525],[6791,546],[6798,525],[6792,3],[6793,3],[6794,3],[6795,525],[6796,547],[6797,548],[6785,527],[6799,549],[6867,550],[6840,551],[6841,552],[6839,553],[6777,554],[6775,555],[6776,556],[6774,557],[6773,558],[6770,559],[6769,560],[6763,558],[6765,561],[6764,562],[6772,563],[6771,560],[6766,564],[6767,565],[6768,565],[6804,545],[6802,545],[6805,566],[6807,567],[6806,568],[6803,569],[6754,547],[6755,3],[6778,570],[6782,571],[6779,3],[6780,572],[6781,3],[6757,573],[6758,573],[6761,574],[6762,575],[6760,573],[6759,574],[6756,543],[6814,525],[6815,525],[6816,525],[6817,576],[6838,577],[6826,578],[6825,3],[6818,579],[6821,525],[6819,525],[6822,525],[6824,580],[6823,581],[6820,525],[6834,3],[6827,3],[6828,3],[6829,525],[6830,525],[6831,3],[6832,525],[6833,3],[6837,582],[6835,3],[6836,525],[6868,549],[6875,583],[6871,549],[6869,549],[6870,549],[6872,549],[6873,549],[6874,549],[6882,584],[6881,585],[6885,586],[6886,587],[6883,588],[6884,589],[6902,590],[6894,591],[6893,592],[6892,549],[6887,593],[6891,594],[6888,593],[6889,593],[6890,593],[6877,549],[6876,3],[6880,595],[6878,588],[6879,596],[6895,3],[6896,3],[6897,549],[6901,597],[6898,3],[6899,549],[6900,593],[6731,3],[6733,598],[6734,599],[6732,3],[6735,3],[6736,3],[6739,600],[6737,3],[6738,3],[6740,3],[6741,3],[6742,3],[6743,601],[6744,3],[6745,602],[6730,603],[6721,3],[6722,3],[6724,3],[6723,13],[6725,13],[6726,3],[6727,13],[6728,3],[6729,3],[6753,604],[6751,605],[6746,3],[6747,3],[6748,3],[6749,3],[6750,3],[6752,3],[5484,606],[5483,607],[5485,608],[5486,609],[7055,610],[7057,611],[7056,612],[7054,607],[5505,613],[5504,607],[7046,607],[5506,607],[5490,607],[5491,614],[5493,615],[5488,607],[5489,607],[5492,616],[5510,617],[5509,607],[7040,618],[7039,619],[7038,607],[5507,607],[7042,3],[5475,620],[7041,620],[7044,621],[7045,13],[7047,622],[5508,620],[7048,607],[7050,623],[7051,607],[7058,624],[7043,620],[7049,620],[7077,625],[5487,607],[5503,626],[5494,607],[5495,607],[5499,627],[5498,628],[5500,607],[5501,607],[5496,629],[5497,630],[5502,631],[7071,3],[7072,607],[7076,632],[7073,3],[7074,607],[7075,3],[6690,633],[6686,607],[6687,3],[6688,607],[6689,607],[6499,634],[6500,635],[419,3],[2905,636],[2906,636],[2907,636],[2909,636],[2910,636],[2911,636],[2912,636],[2913,636],[2914,636],[2915,636],[2908,636],[2916,636],[2917,636],[2918,636],[2919,636],[2920,636],[2921,636],[2922,636],[2923,636],[2924,636],[2925,636],[2926,636],[2927,636],[2928,636],[2929,636],[2930,636],[2931,636],[2932,636],[2933,636],[2934,636],[2935,636],[2936,636],[2937,636],[2940,636],[2941,636],[2942,636],[2938,636],[2939,636],[2943,636],[2944,636],[2945,636],[2946,636],[2947,636],[2948,636],[2949,636],[2950,636],[2951,636],[2952,636],[2953,636],[2954,636],[2955,636],[2956,636],[2957,636],[2958,636],[2959,636],[2960,636],[2961,636],[2962,636],[2963,636],[2964,636],[2965,636],[2966,636],[2967,636],[2968,636],[2969,636],[2970,636],[2971,636],[2972,636],[2973,636],[2974,636],[2975,636],[2976,636],[2977,636],[2978,636],[2979,636],[2980,636],[2981,636],[2982,636],[2983,636],[2984,636],[2986,636],[2987,636],[2988,636],[2989,636],[2985,636],[2990,636],[2991,636],[2992,636],[2993,636],[2994,636],[2995,636],[2996,636],[2997,636],[2998,636],[2999,636],[3000,636],[3001,636],[3023,636],[3024,636],[3025,636],[3026,636],[3027,636],[3028,636],[3029,636],[3030,636],[3031,636],[3032,636],[3033,636],[3034,636],[3035,636],[3036,636],[3037,636],[3038,636],[3002,636],[3003,636],[3004,636],[3005,636],[3006,636],[3007,636],[3008,636],[3009,636],[3010,636],[3011,636],[3039,636],[3040,636],[3012,636],[3013,636],[3014,636],[3015,636],[3020,636],[3021,636],[3022,636],[3016,636],[3017,636],[3018,636],[3019,636],[3041,636],[3042,636],[3043,636],[3044,636],[3045,636],[3046,636],[3047,636],[3048,636],[3049,636],[3050,636],[3051,636],[3052,636],[3053,636],[3054,636],[3055,636],[3056,636],[3057,636],[3058,636],[3059,636],[3060,636],[3061,636],[3062,636],[3063,636],[3064,636],[3065,636],[3066,636],[3067,636],[3068,636],[3069,636],[3070,636],[3071,636],[3072,636],[3073,636],[3074,636],[3075,636],[3076,636],[3077,636],[3078,636],[3079,636],[3080,636],[3081,636],[3082,636],[3083,636],[3084,636],[3085,636],[3086,636],[3087,636],[3088,636],[3089,636],[3090,636],[3091,636],[3092,636],[3093,636],[3094,636],[3095,636],[3096,636],[3097,636],[3098,636],[3099,636],[3100,636],[3101,636],[3102,636],[3103,636],[3104,636],[3105,636],[3106,636],[3107,636],[3108,636],[3109,636],[3110,636],[3111,636],[3112,636],[3113,636],[3114,636],[3115,636],[3116,636],[3120,636],[3122,636],[3121,636],[3123,636],[3117,636],[3118,636],[3119,636],[3124,636],[3125,636],[3126,636],[3127,636],[3128,636],[3130,636],[3129,636],[3131,636],[3132,636],[3133,636],[3134,636],[3135,636],[3136,636],[3137,636],[3138,636],[3139,636],[3140,636],[3141,636],[3142,636],[3143,636],[3144,636],[3145,636],[3146,636],[3147,636],[3149,636],[3148,636],[3150,636],[3152,636],[3151,636],[3153,636],[3154,636],[3155,636],[3156,636],[3157,636],[3158,636],[3159,636],[3160,636],[3161,636],[3163,636],[3162,636],[3164,636],[3165,636],[3166,636],[3167,636],[3168,636],[3169,636],[3170,636],[3171,636],[3172,636],[3173,636],[3174,636],[3175,636],[3176,636],[3177,636],[3178,636],[3180,636],[3179,636],[3183,636],[3184,636],[3185,636],[3186,636],[3187,636],[3188,636],[3189,636],[3190,636],[3191,636],[3192,636],[3193,636],[3194,636],[3195,636],[3196,636],[3197,636],[3198,636],[3199,636],[3200,636],[3201,636],[3202,636],[3203,636],[3204,636],[3205,636],[3206,636],[3207,636],[3181,636],[3208,636],[3182,636],[3209,636],[3210,636],[3211,636],[3212,636],[3213,636],[3214,636],[3215,636],[3216,636],[3217,636],[3218,636],[3219,636],[3220,636],[3221,636],[3222,636],[3223,636],[3224,636],[3225,636],[3226,636],[3227,636],[3228,636],[3229,636],[3230,636],[3231,636],[3232,636],[3233,636],[3234,636],[3235,636],[3236,636],[3237,636],[3238,636],[3239,636],[3240,636],[3241,636],[3242,636],[3243,636],[3244,636],[3245,636],[3246,636],[3247,636],[3254,636],[3255,636],[3248,636],[3256,636],[3249,636],[3250,636],[3251,636],[3252,636],[3253,636],[3257,636],[3258,636],[3262,636],[3259,636],[3263,636],[3260,636],[3261,636],[3264,636],[3265,636],[3266,636],[3267,636],[3268,636],[3269,636],[3270,636],[3271,636],[3272,636],[3273,636],[3274,636],[3275,636],[3276,636],[3277,636],[3278,636],[3279,636],[3280,636],[3281,636],[3282,636],[3284,636],[3283,636],[3285,636],[3286,636],[3287,636],[3288,636],[3289,636],[3292,636],[3290,636],[3291,636],[3293,636],[3294,636],[3295,636],[3296,636],[3297,636],[3298,636],[3299,636],[3300,636],[3301,636],[3302,636],[3303,636],[3304,636],[3305,636],[3306,636],[3308,636],[3307,636],[3310,636],[3311,636],[3309,636],[3313,636],[3312,636],[3314,636],[3316,636],[3315,636],[3317,636],[3318,636],[3319,636],[3320,636],[3321,636],[3322,636],[3323,636],[3324,636],[3325,636],[3326,636],[3327,636],[3328,636],[3329,636],[3330,636],[3332,636],[3333,636],[3331,636],[3334,636],[3335,636],[3336,636],[3337,636],[3338,636],[3339,636],[3340,636],[3341,636],[3342,636],[3343,636],[3344,636],[3345,636],[3346,636],[3347,636],[3348,636],[3349,636],[3350,636],[3351,636],[3352,636],[3353,636],[3354,636],[3355,636],[3356,636],[3357,636],[3358,636],[3359,636],[3360,636],[3361,636],[3362,636],[3363,636],[3364,636],[3365,636],[3366,636],[3367,636],[3368,636],[3369,636],[3370,636],[3371,636],[3372,636],[3373,636],[3374,636],[3375,636],[3376,636],[3377,636],[3379,636],[3380,636],[3381,636],[3382,636],[3383,636],[3387,636],[3384,636],[3385,636],[3386,636],[3378,636],[3388,636],[3389,636],[3390,636],[3391,636],[3392,636],[3393,636],[3394,636],[3395,636],[3396,636],[3397,636],[3398,636],[3399,636],[3400,636],[3401,636],[3402,636],[3403,636],[3404,636],[3405,636],[3406,636],[3407,636],[3408,636],[3409,636],[3410,636],[3411,636],[3412,636],[3413,636],[3414,636],[3415,636],[3416,636],[3417,636],[3418,636],[3419,636],[3420,636],[3421,636],[3426,636],[3422,636],[3423,636],[3424,636],[3425,636],[3427,636],[3428,636],[3429,636],[3430,636],[3431,636],[3432,636],[3433,636],[3434,636],[3435,636],[3436,636],[3437,636],[3438,636],[3439,636],[3440,636],[3441,636],[3442,636],[3443,636],[3444,636],[3445,636],[3446,636],[3447,636],[3448,636],[3449,636],[3450,636],[3451,636],[3453,636],[3454,636],[3455,636],[3456,636],[3452,636],[3458,636],[3457,636],[3459,636],[3460,636],[3461,636],[3462,636],[3463,636],[3464,636],[3465,636],[3466,636],[3467,636],[3468,636],[3469,636],[3474,636],[3470,636],[3471,636],[3472,636],[3473,636],[3475,636],[3477,636],[3478,636],[3479,636],[3476,636],[3480,636],[3481,636],[3482,636],[3483,636],[3484,636],[3485,636],[3486,636],[3487,636],[3488,636],[3489,636],[3490,636],[3491,636],[3492,636],[3493,636],[3494,636],[3495,636],[3496,636],[3497,636],[3498,636],[3499,636],[3511,636],[3500,636],[3501,636],[3502,636],[3503,636],[3504,636],[3505,636],[3506,636],[3507,636],[3508,636],[3509,636],[3510,636],[3512,636],[3513,636],[3514,636],[3515,636],[3516,636],[3517,636],[3518,636],[3519,636],[3520,636],[3521,636],[3522,636],[3523,636],[3524,636],[3525,636],[3526,636],[3529,636],[3527,636],[3528,636],[3530,636],[3531,636],[3532,636],[3533,636],[3534,636],[3535,636],[3536,636],[3538,636],[3537,636],[3539,636],[3540,636],[3541,636],[3542,636],[3543,636],[3544,636],[3545,636],[3546,636],[3547,636],[3548,636],[3549,636],[3559,636],[3550,636],[3551,636],[3552,636],[3553,636],[3554,636],[3555,636],[3556,636],[3557,636],[3558,636],[3560,636],[3561,636],[3562,636],[3563,636],[3564,636],[3565,636],[3566,636],[3567,636],[3568,636],[3569,636],[3570,636],[3571,636],[3572,636],[3573,636],[3574,636],[3575,636],[3576,636],[3577,636],[3578,636],[3579,636],[3580,636],[3581,636],[3582,636],[3583,636],[3584,636],[3585,636],[3586,636],[3587,636],[3588,636],[3589,636],[3590,636],[3591,636],[3592,636],[3593,636],[3596,636],[3597,636],[3598,636],[3594,636],[3595,636],[3599,636],[3600,636],[3601,636],[3602,636],[3603,636],[3604,636],[3605,636],[3606,636],[3607,636],[3608,636],[3609,636],[3610,636],[3611,636],[3612,636],[3613,636],[3614,636],[3615,636],[3616,636],[3617,636],[3618,636],[3619,636],[3620,636],[3621,636],[3622,636],[3623,636],[3624,636],[3625,636],[3626,636],[3627,636],[3628,636],[3629,636],[3630,636],[3631,636],[3632,636],[3635,636],[3633,636],[3634,636],[3651,636],[3652,636],[3636,636],[3637,636],[3638,636],[3639,636],[3640,636],[3641,636],[3642,636],[3643,636],[3644,636],[3653,636],[3655,636],[3645,636],[3654,636],[3646,636],[3647,636],[3648,636],[3649,636],[3650,636],[3656,636],[3657,636],[3658,636],[3659,636],[3660,636],[3661,636],[3662,636],[3663,636],[3664,636],[3665,636],[3670,636],[3666,636],[3667,636],[3668,636],[3669,636],[3671,636],[3672,636],[3673,636],[3674,636],[3675,636],[3676,636],[3677,636],[3678,636],[3679,636],[3680,636],[3681,636],[3682,636],[3683,636],[3684,636],[3685,636],[3686,636],[3687,636],[3688,636],[3689,636],[3690,636],[3691,636],[3692,636],[3693,636],[3694,636],[3695,636],[3696,636],[3698,636],[3697,636],[3699,636],[3700,636],[3701,636],[3702,636],[3703,636],[3706,636],[3704,636],[3705,636],[3707,636],[3708,636],[3709,636],[3710,636],[3711,636],[3712,636],[3713,636],[3714,636],[3716,636],[3717,636],[3715,636],[3718,636],[3719,636],[3720,636],[3721,636],[3722,636],[3723,636],[3724,636],[3725,636],[3726,636],[3727,636],[3728,636],[3729,636],[3730,636],[3731,636],[3732,636],[3733,636],[3734,636],[3735,636],[3736,636],[3737,636],[3738,636],[3739,636],[3741,636],[3740,636],[3742,636],[3743,636],[3744,636],[3745,636],[3746,636],[3747,636],[3752,636],[3748,636],[3749,636],[3750,636],[3751,636],[3753,636],[3754,636],[3755,636],[3756,636],[3757,636],[3758,636],[3759,636],[3760,636],[3761,636],[3762,636],[3763,636],[3764,636],[3772,636],[3765,636],[3766,636],[3767,636],[3768,636],[3769,636],[3770,636],[3771,636],[3773,636],[3774,636],[3775,636],[3776,636],[3777,636],[3778,636],[3779,636],[3780,636],[3782,636],[3781,636],[3783,636],[3784,636],[3786,636],[3785,636],[3787,636],[3788,636],[3789,636],[3790,636],[3791,636],[3792,636],[3793,636],[3794,636],[3795,636],[3796,636],[3797,636],[3798,636],[3799,636],[3800,636],[3801,636],[3802,636],[3803,636],[3804,636],[3805,636],[3806,636],[3807,636],[3808,636],[3809,636],[3810,636],[3811,636],[3812,636],[3813,636],[3814,636],[3815,636],[3816,636],[3817,636],[3818,636],[3819,636],[3820,636],[3821,636],[3823,636],[3822,636],[3824,636],[3825,636],[3826,636],[3827,636],[3828,636],[3829,636],[3830,636],[3831,636],[3832,636],[3833,636],[3834,636],[3835,636],[3836,636],[3837,636],[3838,636],[3840,636],[3839,636],[3841,636],[3842,636],[3843,636],[3844,636],[3845,636],[3846,636],[3847,636],[3848,636],[3849,636],[3850,636],[3855,636],[3857,636],[3856,636],[3859,636],[3860,636],[3858,636],[3851,636],[3861,636],[3862,636],[3852,636],[3853,636],[3854,636],[3863,636],[3864,636],[3865,636],[3866,636],[3867,636],[3868,636],[3869,636],[3870,636],[3871,636],[3872,636],[3873,636],[3874,636],[3875,636],[3876,636],[3877,636],[3878,636],[3879,636],[3880,636],[3881,636],[3882,636],[3883,636],[3884,636],[3885,636],[3886,636],[3887,636],[3888,636],[3889,636],[3890,636],[3891,636],[3892,636],[3893,636],[3894,636],[3895,636],[3896,636],[3897,636],[3898,636],[3899,636],[3900,636],[3901,636],[3902,636],[3903,636],[3904,636],[3905,636],[3906,636],[3907,636],[3908,636],[3909,636],[3910,636],[3911,636],[3912,636],[3913,636],[3917,636],[3918,636],[3914,636],[3915,636],[3916,636],[3919,636],[3920,636],[3921,636],[3922,636],[3923,636],[3924,636],[3925,636],[3926,636],[3927,636],[3928,636],[3929,636],[3930,636],[3931,636],[3934,636],[3935,636],[3936,636],[3937,636],[3938,636],[3939,636],[3940,636],[3941,636],[3932,636],[3933,636],[3942,636],[3943,636],[3944,636],[3945,636],[3947,636],[3946,636],[3949,636],[3948,636],[3950,636],[3951,636],[3952,636],[3953,636],[3954,636],[3955,636],[3956,636],[3957,636],[3958,636],[3959,636],[3960,636],[3961,636],[3962,636],[3963,636],[3964,636],[3965,636],[3966,636],[3967,636],[3968,636],[3969,636],[3970,636],[3971,636],[3972,636],[3973,636],[3974,636],[3975,636],[3976,636],[3977,636],[3978,636],[3980,636],[3979,636],[3981,636],[3982,636],[3983,636],[3984,636],[3985,636],[3986,636],[3987,636],[3988,636],[3989,636],[3990,636],[3992,636],[3991,636],[3993,636],[3994,636],[3995,636],[3996,636],[3997,636],[3998,636],[3999,636],[4000,636],[4001,636],[4002,636],[4003,636],[4004,636],[4005,636],[4006,636],[4007,636],[4008,636],[4009,636],[4010,636],[4011,636],[4012,636],[4013,636],[4014,636],[4015,636],[4016,636],[4017,636],[4018,636],[4019,636],[4020,636],[4021,636],[4022,636],[4023,636],[4024,636],[4025,636],[4026,636],[4027,636],[4028,636],[4029,636],[4030,636],[4032,636],[4031,636],[4033,636],[4034,636],[4035,636],[4036,636],[4037,636],[4038,636],[4039,636],[4040,636],[4041,636],[4042,636],[4043,636],[4044,636],[4045,636],[4046,636],[4047,636],[4048,636],[4049,636],[4050,636],[4051,636],[4052,636],[4053,636],[4054,636],[4055,636],[4056,636],[4057,636],[4058,636],[4059,636],[4060,636],[4061,636],[4062,636],[4063,636],[4064,636],[4065,636],[4066,636],[4067,636],[4068,636],[4069,636],[4070,636],[4071,636],[4072,636],[4073,636],[4074,636],[4075,636],[4076,636],[4077,636],[4078,636],[4079,636],[4082,636],[4080,636],[4081,636],[4083,636],[4084,636],[4085,636],[4086,636],[4087,636],[4088,636],[4089,636],[4090,636],[4091,636],[4092,636],[4093,636],[4094,636],[4095,636],[4096,636],[4097,636],[4098,636],[4099,636],[4100,636],[4101,636],[4102,636],[4103,636],[4104,636],[4105,636],[4106,636],[4107,636],[4108,636],[4110,636],[4109,636],[4111,636],[4112,636],[4113,636],[4114,636],[4117,636],[4115,636],[4116,636],[4118,636],[4119,636],[4120,636],[4121,636],[4122,636],[4123,636],[4124,636],[4125,636],[4126,636],[4127,636],[4128,636],[4129,636],[4130,636],[4131,636],[4134,636],[4132,636],[4133,636],[4135,636],[4136,636],[4137,636],[4138,636],[4139,636],[4140,636],[4141,636],[4142,636],[4143,636],[4144,636],[4145,636],[4146,636],[4147,636],[4148,636],[4149,636],[4150,636],[4151,636],[4152,636],[4153,636],[4154,636],[4155,636],[4156,636],[4157,636],[4158,636],[4159,636],[4160,636],[4161,636],[4162,636],[4163,636],[4164,636],[4165,636],[4166,636],[4167,636],[4169,636],[4168,636],[4170,636],[4171,636],[4172,636],[4173,636],[4174,636],[4175,636],[4176,636],[4177,636],[4178,636],[4179,636],[4182,636],[4180,636],[4181,636],[4183,636],[4184,636],[4185,636],[4186,636],[4187,636],[4188,636],[4189,636],[4190,636],[4192,636],[4191,636],[4193,636],[4194,636],[4195,636],[4196,636],[4197,636],[4198,636],[4199,636],[4200,636],[4201,636],[4202,636],[4203,636],[4204,636],[4205,636],[4206,636],[4207,636],[4208,636],[4209,636],[4210,636],[4211,636],[4212,636],[4213,636],[4214,636],[4215,636],[4216,636],[4217,636],[4218,636],[4219,636],[4221,636],[4220,636],[4222,636],[4223,636],[4224,636],[4225,636],[4226,636],[4227,636],[4228,636],[4229,636],[4231,636],[4232,636],[4233,636],[4234,636],[4235,636],[4236,636],[4237,636],[4238,636],[4239,636],[4240,636],[4241,636],[4242,636],[4243,636],[4244,636],[4245,636],[4246,636],[4248,636],[4249,636],[4250,636],[4251,636],[4252,636],[4247,636],[4253,636],[4271,636],[4254,636],[4255,636],[4256,636],[4257,636],[4258,636],[4259,636],[4260,636],[4261,636],[4262,636],[4263,636],[4264,636],[4265,636],[4266,636],[4267,636],[4268,636],[4269,636],[4270,636],[4272,636],[4273,636],[4274,636],[4275,636],[4276,636],[4277,636],[4278,636],[4279,636],[4280,636],[4281,636],[4282,636],[4283,636],[4284,636],[4286,636],[4285,636],[4287,636],[4288,636],[4289,636],[4290,636],[4291,636],[4292,636],[4293,636],[4294,636],[4295,636],[4296,636],[4297,636],[4298,636],[4299,636],[4300,636],[4301,636],[4302,636],[4303,636],[4304,636],[4305,636],[4306,636],[4307,636],[4308,636],[4309,636],[4310,636],[4313,636],[4311,636],[4312,636],[4314,636],[4315,636],[4316,636],[4317,636],[4318,636],[4319,636],[4320,636],[4321,636],[4322,636],[4323,636],[4324,636],[4325,636],[4326,636],[4327,636],[4328,636],[4230,636],[4329,636],[4330,636],[4331,636],[4332,636],[4333,636],[4334,636],[4335,636],[4336,636],[4337,636],[4338,636],[4339,636],[4340,636],[4341,636],[4342,636],[4343,636],[4344,636],[4345,636],[4346,636],[4347,636],[4348,636],[4349,636],[4350,636],[4351,636],[4352,636],[4353,636],[4357,636],[4358,636],[4354,636],[4355,636],[4359,636],[4356,636],[4360,636],[4361,636],[4362,636],[4363,636],[4364,636],[4365,636],[4366,636],[4367,636],[4368,636],[4369,636],[4370,636],[4371,636],[4372,636],[4373,636],[4374,636],[4375,636],[4376,636],[4377,636],[4378,636],[4379,636],[4380,636],[4381,636],[4382,636],[4383,636],[4384,636],[4389,636],[4390,636],[4391,636],[4385,636],[4386,636],[4387,636],[4388,636],[4392,636],[4393,636],[4394,636],[4395,636],[4396,636],[4397,636],[4398,636],[4399,636],[4400,636],[4401,636],[4402,636],[4403,636],[4404,636],[4405,636],[4406,636],[4407,636],[4408,636],[4409,636],[4410,636],[4411,636],[4412,636],[4413,636],[4414,636],[4415,636],[4416,636],[4417,637],[1388,638],[1389,638],[1391,639],[1390,638],[1387,13],[1392,636],[1393,636],[1394,636],[1396,636],[1397,636],[1398,636],[1399,636],[1400,636],[1401,636],[1402,636],[1395,636],[1403,636],[1404,636],[1405,636],[1406,636],[1407,636],[1408,636],[1409,636],[1410,636],[1411,636],[1412,636],[1413,636],[1414,636],[1415,636],[1416,636],[1417,636],[1418,636],[1419,636],[1420,636],[1421,636],[1422,636],[1423,636],[1424,636],[1427,636],[1428,636],[1429,636],[1425,636],[1426,636],[1430,636],[1431,636],[1432,636],[1433,636],[1434,636],[1435,636],[1436,636],[1437,636],[1438,636],[1439,636],[1440,636],[1441,636],[1442,636],[1443,636],[1444,636],[1445,636],[1446,636],[1447,636],[1448,636],[1449,636],[1450,636],[1451,636],[1452,636],[1453,636],[1454,636],[1455,636],[1456,636],[1457,636],[1458,636],[1459,636],[1460,636],[1461,636],[1462,636],[1463,636],[1464,636],[1465,636],[1466,636],[1467,636],[1468,636],[1469,636],[1470,636],[1471,636],[1473,636],[1474,636],[1475,636],[1476,636],[1472,636],[1477,636],[1478,636],[1479,636],[1480,636],[1481,636],[1482,636],[1483,636],[1484,636],[1485,636],[1486,636],[1487,636],[1488,636],[1510,636],[1511,636],[1512,636],[1513,636],[1514,636],[1515,636],[1516,636],[1517,636],[1518,636],[1519,636],[1520,636],[1521,636],[1522,636],[1523,636],[1524,636],[1525,636],[1489,636],[1490,636],[1491,636],[1492,636],[1493,636],[1494,636],[1495,636],[1496,636],[1497,636],[1498,636],[1526,636],[1527,636],[1499,636],[1500,636],[1501,636],[1502,636],[1507,636],[1508,636],[1509,636],[1503,636],[1504,636],[1505,636],[1506,636],[1528,636],[1529,636],[1530,636],[1531,636],[1532,636],[1533,636],[1534,636],[1535,636],[1536,636],[1537,636],[1538,636],[1539,636],[1540,636],[1541,636],[1542,636],[1543,636],[1544,636],[1545,636],[1546,636],[1547,636],[1548,636],[1549,636],[1550,636],[1551,636],[1552,636],[1553,636],[1554,636],[1555,636],[1556,636],[1557,636],[1558,636],[1559,636],[1560,636],[1561,636],[1562,636],[1563,636],[1564,636],[1565,636],[1566,636],[1567,636],[1568,636],[1569,636],[1570,636],[1571,636],[1572,636],[1573,636],[1574,636],[1575,636],[1576,636],[1577,636],[1578,636],[1579,636],[1580,636],[1581,636],[1582,636],[1583,636],[1584,636],[1585,636],[1586,636],[1587,636],[1588,636],[1589,636],[1590,636],[1591,636],[1592,636],[1593,636],[1594,636],[1595,636],[1596,636],[1597,636],[1598,636],[1599,636],[1600,636],[1601,636],[1602,636],[1603,636],[1607,636],[1609,636],[1608,636],[1610,636],[1604,636],[1605,636],[1606,636],[1611,636],[1612,636],[1613,636],[1614,636],[1615,636],[1617,636],[1616,636],[1618,636],[1619,636],[1620,636],[1621,636],[1622,636],[1623,636],[1624,636],[1625,636],[1626,636],[1627,636],[1628,636],[1629,636],[1630,636],[1631,636],[1632,636],[1633,636],[1634,636],[1636,636],[1635,636],[1637,636],[1639,636],[1638,636],[1640,636],[1641,636],[1642,636],[1643,636],[1644,636],[1645,636],[1646,636],[1647,636],[1648,636],[1650,636],[1649,636],[1651,636],[1652,636],[1653,636],[1654,636],[1655,636],[1656,636],[1657,636],[1658,636],[1659,636],[1660,636],[1661,636],[1662,636],[1663,636],[1664,636],[1665,636],[1667,636],[1666,636],[1670,636],[1671,636],[1672,636],[1673,636],[1674,636],[1675,636],[1676,636],[1677,636],[1678,636],[1679,636],[1680,636],[1681,636],[1682,636],[1683,636],[1684,636],[1685,636],[1686,636],[1687,636],[1688,636],[1689,636],[1690,636],[1691,636],[1692,636],[1693,636],[1694,636],[1668,636],[1695,636],[1669,636],[1696,636],[1697,636],[1698,636],[1699,636],[1700,636],[1701,636],[1702,636],[1703,636],[1704,636],[1705,636],[1706,636],[1707,636],[1708,636],[1709,636],[1710,636],[1711,636],[1712,636],[1713,636],[1714,636],[1715,636],[1716,636],[1717,636],[1718,636],[1719,636],[1720,636],[1721,636],[1722,636],[1723,636],[1724,636],[1725,636],[1726,636],[1727,636],[1728,636],[1729,636],[1730,636],[1731,636],[1732,636],[1733,636],[1734,636],[1741,636],[1742,636],[1735,636],[1743,636],[1736,636],[1737,636],[1738,636],[1739,636],[1740,636],[1744,636],[1745,636],[1749,636],[1746,636],[1750,636],[1747,636],[1748,636],[1751,636],[1752,636],[1753,636],[1754,636],[1755,636],[1756,636],[1757,636],[1758,636],[1759,636],[1760,636],[1761,636],[1762,636],[1763,636],[1764,636],[1765,636],[1766,636],[1767,636],[1768,636],[1769,636],[1771,636],[1770,636],[1772,636],[1773,636],[1774,636],[1775,636],[1776,636],[1779,636],[1777,636],[1778,636],[1780,636],[1781,636],[1782,636],[1783,636],[1784,636],[1785,636],[1786,636],[1787,636],[1788,636],[1789,636],[1790,636],[1791,636],[1792,636],[1793,636],[1795,636],[1794,636],[1797,636],[1798,636],[1796,636],[1800,636],[1799,636],[1801,636],[1803,636],[1802,636],[1804,636],[1805,636],[1806,636],[1807,636],[1808,636],[1809,636],[1810,636],[1811,636],[1812,636],[1813,636],[1814,636],[1815,636],[1816,636],[1817,636],[1819,636],[1820,636],[1818,636],[1821,636],[1822,636],[1823,636],[1824,636],[1825,636],[1826,636],[1827,636],[1828,636],[1829,636],[1830,636],[1831,636],[1832,636],[1833,636],[1834,636],[1835,636],[1836,636],[1837,636],[1838,636],[1839,636],[1840,636],[1841,636],[1842,636],[1843,636],[1844,636],[1845,636],[1846,636],[1847,636],[1848,636],[1849,636],[1850,636],[1851,636],[1852,636],[1853,636],[1854,636],[1855,636],[1856,636],[1857,636],[1858,636],[1859,636],[1860,636],[1861,636],[1862,636],[1863,636],[1864,636],[1866,636],[1867,636],[1868,636],[1869,636],[1870,636],[1874,636],[1871,636],[1872,636],[1873,636],[1865,636],[1875,636],[1876,636],[1877,636],[1878,636],[1879,636],[1880,636],[1881,636],[1882,636],[1883,636],[1884,636],[1885,636],[1886,636],[1887,636],[1888,636],[1889,636],[1890,636],[1891,636],[1892,636],[1893,636],[1894,636],[1895,636],[1896,636],[1897,636],[1898,636],[1899,636],[1900,636],[1901,636],[1902,636],[1903,636],[1904,636],[1905,636],[1906,636],[1907,636],[1908,636],[1913,636],[1909,636],[1910,636],[1911,636],[1912,636],[1914,636],[1915,636],[1916,636],[1917,636],[1918,636],[1919,636],[1920,636],[1921,636],[1922,636],[1923,636],[1924,636],[1925,636],[1926,636],[1927,636],[1928,636],[1929,636],[1930,636],[1931,636],[1932,636],[1933,636],[1934,636],[1935,636],[1936,636],[1937,636],[1938,636],[1940,636],[1941,636],[1942,636],[1943,636],[1939,636],[1945,636],[1944,636],[1946,636],[1947,636],[1948,636],[1949,636],[1950,636],[1951,636],[1952,636],[1953,636],[1954,636],[1955,636],[1956,636],[1961,636],[1957,636],[1958,636],[1959,636],[1960,636],[1962,636],[1964,636],[1965,636],[1966,636],[1963,636],[1967,636],[1968,636],[1969,636],[1970,636],[1971,636],[1972,636],[1973,636],[1974,636],[1975,636],[1976,636],[1977,636],[1978,636],[1979,636],[1980,636],[1981,636],[1982,636],[1983,636],[1984,636],[1985,636],[1986,636],[1998,636],[1987,636],[1988,636],[1989,636],[1990,636],[1991,636],[1992,636],[1993,636],[1994,636],[1995,636],[1996,636],[1997,636],[1999,636],[2000,636],[2001,636],[2002,636],[2003,636],[2004,636],[2005,636],[2006,636],[2007,636],[2008,636],[2009,636],[2010,636],[2011,636],[2012,636],[2013,636],[2016,636],[2014,636],[2015,636],[2017,636],[2018,636],[2019,636],[2020,636],[2021,636],[2022,636],[2023,636],[2025,636],[2024,636],[2026,636],[2027,636],[2028,636],[2029,636],[2030,636],[2031,636],[2032,636],[2033,636],[2034,636],[2035,636],[2036,636],[2046,636],[2037,636],[2038,636],[2039,636],[2040,636],[2041,636],[2042,636],[2043,636],[2044,636],[2045,636],[2047,636],[2048,636],[2049,636],[2050,636],[2051,636],[2052,636],[2053,636],[2054,636],[2055,636],[2056,636],[2057,636],[2058,636],[2059,636],[2060,636],[2061,636],[2062,636],[2063,636],[2064,636],[2065,636],[2066,636],[2067,636],[2068,636],[2069,636],[2070,636],[2071,636],[2072,636],[2073,636],[2074,636],[2075,636],[2076,636],[2077,636],[2078,636],[2079,636],[2080,636],[2083,636],[2084,636],[2085,636],[2081,636],[2082,636],[2086,636],[2087,636],[2088,636],[2089,636],[2090,636],[2091,636],[2092,636],[2093,636],[2094,636],[2095,636],[2096,636],[2097,636],[2098,636],[2099,636],[2100,636],[2101,636],[2102,636],[2103,636],[2104,636],[2105,636],[2106,636],[2107,636],[2108,636],[2109,636],[2110,636],[2111,636],[2112,636],[2113,636],[2114,636],[2115,636],[2116,636],[2117,636],[2118,636],[2119,636],[2122,636],[2120,636],[2121,636],[2138,636],[2139,636],[2123,636],[2124,636],[2125,636],[2126,636],[2127,636],[2128,636],[2129,636],[2130,636],[2131,636],[2140,636],[2142,636],[2132,636],[2141,636],[2133,636],[2134,636],[2135,636],[2136,636],[2137,636],[2143,636],[2144,636],[2145,636],[2146,636],[2147,636],[2148,636],[2149,636],[2150,636],[2151,636],[2152,636],[2157,636],[2153,636],[2154,636],[2155,636],[2156,636],[2158,636],[2159,636],[2160,636],[2161,636],[2162,636],[2163,636],[2164,636],[2165,636],[2166,636],[2167,636],[2168,636],[2169,636],[2170,636],[2171,636],[2172,636],[2173,636],[2174,636],[2175,636],[2176,636],[2177,636],[2178,636],[2179,636],[2180,636],[2181,636],[2182,636],[2183,636],[2185,636],[2184,636],[2186,636],[2904,640],[2187,636],[2188,636],[2189,636],[2190,636],[2193,636],[2191,636],[2192,636],[2194,636],[2195,636],[2196,636],[2197,636],[2198,636],[2199,636],[2200,636],[2201,636],[2203,636],[2204,636],[2202,636],[2205,636],[2206,636],[2207,636],[2208,636],[2209,636],[2210,636],[2211,636],[2212,636],[2213,636],[2214,636],[2215,636],[2216,636],[2217,636],[2218,636],[2219,636],[2220,636],[2221,636],[2222,636],[2223,636],[2224,636],[2225,636],[2226,636],[2228,636],[2227,636],[2229,636],[2230,636],[2231,636],[2232,636],[2233,636],[2234,636],[2239,636],[2235,636],[2236,636],[2237,636],[2238,636],[2240,636],[2241,636],[2242,636],[2243,636],[2244,636],[2245,636],[2246,636],[2247,636],[2248,636],[2249,636],[2250,636],[2251,636],[2259,636],[2252,636],[2253,636],[2254,636],[2255,636],[2256,636],[2257,636],[2258,636],[2260,636],[2261,636],[2262,636],[2263,636],[2264,636],[2265,636],[2266,636],[2267,636],[2269,636],[2268,636],[2270,636],[2271,636],[2273,636],[2272,636],[2274,636],[2275,636],[2276,636],[2277,636],[2278,636],[2279,636],[2280,636],[2281,636],[2282,636],[2283,636],[2284,636],[2285,636],[2286,636],[2287,636],[2288,636],[2289,636],[2290,636],[2291,636],[2292,636],[2293,636],[2294,636],[2295,636],[2296,636],[2297,636],[2298,636],[2299,636],[2300,636],[2301,636],[2302,636],[2303,636],[2304,636],[2305,636],[2306,636],[2307,636],[2308,636],[2310,636],[2309,636],[2311,636],[2312,636],[2313,636],[2314,636],[2315,636],[2316,636],[2317,636],[2318,636],[2319,636],[2320,636],[2321,636],[2322,636],[2323,636],[2324,636],[2325,636],[2327,636],[2326,636],[2328,636],[2329,636],[2330,636],[2331,636],[2332,636],[2333,636],[2334,636],[2335,636],[2336,636],[2337,636],[2342,636],[2344,636],[2343,636],[2346,636],[2347,636],[2345,636],[2338,636],[2348,636],[2349,636],[2339,636],[2340,636],[2341,636],[2350,636],[2351,636],[2352,636],[2353,636],[2354,636],[2355,636],[2356,636],[2357,636],[2358,636],[2359,636],[2360,636],[2361,636],[2362,636],[2363,636],[2364,636],[2365,636],[2366,636],[2367,636],[2368,636],[2369,636],[2370,636],[2371,636],[2372,636],[2373,636],[2374,636],[2375,636],[2376,636],[2377,636],[2378,636],[2379,636],[2380,636],[2381,636],[2382,636],[2383,636],[2384,636],[2385,636],[2386,636],[2387,636],[2388,636],[2389,636],[2390,636],[2391,636],[2392,636],[2393,636],[2394,636],[2395,636],[2396,636],[2397,636],[2398,636],[2399,636],[2400,636],[2404,636],[2405,636],[2401,636],[2402,636],[2403,636],[2406,636],[2407,636],[2408,636],[2409,636],[2410,636],[2411,636],[2412,636],[2413,636],[2414,636],[2415,636],[2416,636],[2417,636],[2418,636],[2421,636],[2422,636],[2423,636],[2424,636],[2425,636],[2426,636],[2427,636],[2428,636],[2419,636],[2420,636],[2429,636],[2430,636],[2431,636],[2432,636],[2434,636],[2433,636],[2436,636],[2435,636],[2437,636],[2438,636],[2439,636],[2440,636],[2441,636],[2442,636],[2443,636],[2444,636],[2445,636],[2446,636],[2447,636],[2448,636],[2449,636],[2450,636],[2451,636],[2452,636],[2453,636],[2454,636],[2455,636],[2456,636],[2457,636],[2458,636],[2459,636],[2460,636],[2461,636],[2462,636],[2463,636],[2464,636],[2465,636],[2467,636],[2466,636],[2468,636],[2469,636],[2470,636],[2471,636],[2472,636],[2473,636],[2474,636],[2475,636],[2476,636],[2477,636],[2479,636],[2478,636],[2480,636],[2481,636],[2482,636],[2483,636],[2484,636],[2485,636],[2486,636],[2487,636],[2488,636],[2489,636],[2490,636],[2491,636],[2492,636],[2493,636],[2494,636],[2495,636],[2496,636],[2497,636],[2498,636],[2499,636],[2500,636],[2501,636],[2502,636],[2503,636],[2504,636],[2505,636],[2506,636],[2507,636],[2508,636],[2509,636],[2510,636],[2511,636],[2512,636],[2513,636],[2514,636],[2515,636],[2516,636],[2517,636],[2519,636],[2518,636],[2520,636],[2521,636],[2522,636],[2523,636],[2524,636],[2525,636],[2526,636],[2527,636],[2528,636],[2529,636],[2530,636],[2531,636],[2532,636],[2533,636],[2534,636],[2535,636],[2536,636],[2537,636],[2538,636],[2539,636],[2540,636],[2541,636],[2542,636],[2543,636],[2544,636],[2545,636],[2546,636],[2547,636],[2548,636],[2549,636],[2550,636],[2551,636],[2552,636],[2553,636],[2554,636],[2555,636],[2556,636],[2557,636],[2558,636],[2559,636],[2560,636],[2561,636],[2562,636],[2563,636],[2564,636],[2565,636],[2566,636],[2569,636],[2567,636],[2568,636],[2570,636],[2571,636],[2572,636],[2573,636],[2574,636],[2575,636],[2576,636],[2577,636],[2578,636],[2579,636],[2580,636],[2581,636],[2582,636],[2583,636],[2584,636],[2585,636],[2586,636],[2587,636],[2588,636],[2589,636],[2590,636],[2591,636],[2592,636],[2593,636],[2594,636],[2595,636],[2597,636],[2596,636],[2598,636],[2599,636],[2600,636],[2601,636],[2604,636],[2602,636],[2603,636],[2605,636],[2606,636],[2607,636],[2608,636],[2609,636],[2610,636],[2611,636],[2612,636],[2613,636],[2614,636],[2615,636],[2616,636],[2617,636],[2618,636],[2621,636],[2619,636],[2620,636],[2622,636],[2623,636],[2624,636],[2625,636],[2626,636],[2627,636],[2628,636],[2629,636],[2630,636],[2631,636],[2632,636],[2633,636],[2634,636],[2635,636],[2636,636],[2637,636],[2638,636],[2639,636],[2640,636],[2641,636],[2642,636],[2643,636],[2644,636],[2645,636],[2646,636],[2647,636],[2648,636],[2649,636],[2650,636],[2651,636],[2652,636],[2653,636],[2654,636],[2656,636],[2655,636],[2657,636],[2658,636],[2659,636],[2660,636],[2661,636],[2662,636],[2663,636],[2664,636],[2665,636],[2666,636],[2669,636],[2667,636],[2668,636],[2670,636],[2671,636],[2672,636],[2673,636],[2674,636],[2675,636],[2676,636],[2677,636],[2679,636],[2678,636],[2680,636],[2681,636],[2682,636],[2683,636],[2684,636],[2685,636],[2686,636],[2687,636],[2688,636],[2689,636],[2690,636],[2691,636],[2692,636],[2693,636],[2694,636],[2695,636],[2696,636],[2697,636],[2698,636],[2699,636],[2700,636],[2701,636],[2702,636],[2703,636],[2704,636],[2705,636],[2706,636],[2708,636],[2707,636],[2709,636],[2710,636],[2711,636],[2712,636],[2713,636],[2714,636],[2715,636],[2716,636],[2718,636],[2719,636],[2720,636],[2721,636],[2722,636],[2723,636],[2724,636],[2725,636],[2726,636],[2727,636],[2728,636],[2729,636],[2730,636],[2731,636],[2732,636],[2733,636],[2735,636],[2736,636],[2737,636],[2738,636],[2739,636],[2734,636],[2740,636],[2758,636],[2741,636],[2742,636],[2743,636],[2744,636],[2745,636],[2746,636],[2747,636],[2748,636],[2749,636],[2750,636],[2751,636],[2752,636],[2753,636],[2754,636],[2755,636],[2756,636],[2757,636],[2759,636],[2760,636],[2761,636],[2762,636],[2763,636],[2764,636],[2765,636],[2766,636],[2767,636],[2768,636],[2769,636],[2770,636],[2771,636],[2773,636],[2772,636],[2774,636],[2775,636],[2776,636],[2777,636],[2778,636],[2779,636],[2780,636],[2781,636],[2782,636],[2783,636],[2784,636],[2785,636],[2786,636],[2787,636],[2788,636],[2789,636],[2790,636],[2791,636],[2792,636],[2793,636],[2794,636],[2795,636],[2796,636],[2797,636],[2800,636],[2798,636],[2799,636],[2801,636],[2802,636],[2803,636],[2804,636],[2805,636],[2806,636],[2807,636],[2808,636],[2809,636],[2810,636],[2811,636],[2812,636],[2813,636],[2814,636],[2815,636],[2717,636],[2816,636],[2817,636],[2818,636],[2819,636],[2820,636],[2821,636],[2822,636],[2823,636],[2824,636],[2825,636],[2826,636],[2827,636],[2828,636],[2829,636],[2830,636],[2831,636],[2832,636],[2833,636],[2834,636],[2835,636],[2836,636],[2837,636],[2838,636],[2839,636],[2840,636],[2844,636],[2845,636],[2841,636],[2842,636],[2846,636],[2843,636],[2847,636],[2848,636],[2849,636],[2850,636],[2851,636],[2852,636],[2853,636],[2854,636],[2855,636],[2856,636],[2857,636],[2858,636],[2859,636],[2860,636],[2861,636],[2862,636],[2863,636],[2864,636],[2865,636],[2866,636],[2867,636],[2868,636],[2869,636],[2870,636],[2871,636],[2876,636],[2877,636],[2878,636],[2872,636],[2873,636],[2874,636],[2875,636],[2879,636],[2880,636],[2881,636],[2882,636],[2883,636],[2884,636],[2885,636],[2886,636],[2887,636],[2888,636],[2889,636],[2890,636],[2891,636],[2892,636],[2893,636],[2894,636],[2895,636],[2896,636],[2897,636],[2898,636],[2899,636],[2900,636],[2901,636],[2902,636],[2903,636],[1232,641],[930,642],[934,643],[935,13],[932,644],[933,645],[936,646],[931,647],[726,13],[843,648],[847,649],[842,3],[845,650],[844,648],[846,648],[815,651],[814,3],[813,13],[977,652],[973,653],[972,3],[975,654],[976,654],[974,655],[761,656],[765,657],[763,658],[760,659],[764,660],[762,660],[512,661],[511,662],[5897,663],[5896,3],[5739,3],[5824,664],[5793,665],[5792,666],[5790,667],[5789,668],[5794,669],[5795,670],[5796,3],[5797,670],[5798,670],[5799,670],[5800,3],[5823,671],[5801,3],[5802,3],[5803,3],[5804,3],[5806,672],[5805,670],[5807,670],[5809,673],[5808,674],[5791,675],[5810,670],[5811,670],[5822,676],[5821,677],[5820,670],[5819,670],[5812,670],[5813,670],[5814,3],[5815,675],[5816,670],[5817,670],[5818,670],[5788,678],[5787,3],[6626,679],[5890,3],[5949,680],[5891,681],[5948,3],[7014,682],[7013,3],[5460,3],[5312,683],[5311,3],[5321,684],[7008,684],[1373,685],[1374,686],[1372,687],[1375,688],[1376,689],[1377,690],[1378,691],[1379,692],[1380,693],[1381,694],[1382,695],[1383,696],[5996,684],[1385,684],[1384,697],[5839,684],[5327,684],[5415,684],[5416,684],[5322,684],[5417,684],[5410,684],[137,698],[138,698],[139,699],[97,700],[140,701],[141,702],[142,703],[92,3],[95,704],[93,3],[94,3],[143,705],[144,706],[145,707],[146,708],[147,709],[148,710],[149,710],[151,711],[150,712],[152,713],[153,714],[154,715],[136,716],[96,3],[155,717],[156,718],[157,719],[189,720],[158,721],[159,722],[160,723],[161,724],[162,725],[163,726],[164,727],[165,728],[166,729],[167,730],[168,730],[169,731],[170,3],[171,732],[173,733],[172,734],[174,735],[175,736],[176,737],[177,738],[178,739],[179,740],[180,741],[181,742],[182,743],[183,744],[184,745],[185,746],[186,747],[187,748],[188,749],[5307,750],[5520,3],[5317,751],[193,752],[194,753],[192,13],[7085,13],[7035,754],[6008,13],[190,755],[191,756],[81,3],[83,757],[266,13],[5316,3],[6990,758],[6991,759],[6966,760],[6969,760],[6988,758],[6989,758],[6979,758],[6978,761],[6976,758],[6971,758],[6984,758],[6982,758],[6986,758],[6970,758],[6983,758],[6987,758],[6972,758],[6973,758],[6985,758],[6967,758],[6974,758],[6975,758],[6977,758],[6981,758],[6992,762],[6980,758],[6968,758],[7005,763],[7004,3],[6999,762],[7001,764],[7000,762],[6993,762],[6994,762],[6996,762],[6998,762],[7002,764],[7003,764],[6995,764],[6997,764],[6120,765],[6041,766],[6036,3],[6042,767],[6040,768],[6048,769],[6043,767],[6039,3],[6077,770],[6046,771],[6083,767],[6082,767],[6047,3],[6051,767],[6059,772],[6044,3],[6049,773],[6074,3],[6052,772],[6045,769],[6050,774],[6073,775],[6099,776],[6100,777],[6114,778],[6075,779],[6053,769],[6037,3],[6076,780],[6119,781],[6122,782],[6116,783],[6115,3],[6078,784],[6117,785],[6079,786],[6080,786],[6121,787],[6118,788],[6058,789],[6060,790],[6061,791],[6062,792],[6081,793],[6064,794],[6087,795],[6057,796],[6086,797],[6038,767],[6084,798],[6085,799],[6065,800],[6066,801],[6067,802],[6063,803],[6068,804],[6069,805],[6070,806],[6071,807],[6072,808],[6088,800],[6090,809],[6089,800],[6093,810],[6091,800],[6092,800],[6054,767],[6055,772],[6094,806],[6097,811],[6098,806],[6105,812],[6102,813],[6103,814],[6101,815],[6104,816],[6096,817],[6095,800],[6056,818],[6106,806],[6107,819],[6108,820],[6109,800],[6110,800],[6111,820],[6112,800],[6113,821],[5785,822],[5786,823],[5779,823],[5741,3],[5743,824],[5742,825],[5747,826],[5781,827],[5778,828],[5780,829],[5744,828],[5745,830],[5749,830],[5748,831],[5746,832],[5784,833],[5777,828],[5782,834],[5776,3],[5783,3],[5750,835],[5755,828],[5757,828],[5752,828],[5753,835],[5759,828],[5760,836],[5751,828],[5756,828],[5758,828],[5754,828],[5774,837],[5773,828],[5775,838],[5769,828],[5771,828],[5770,828],[5766,828],[5772,839],[5767,828],[5768,840],[5761,828],[5762,828],[5763,828],[5764,828],[5765,828],[487,13],[677,841],[678,13],[488,842],[712,843],[679,844],[476,3],[685,845],[478,3],[477,13],[500,13],[779,846],[600,847],[479,848],[601,846],[489,849],[490,13],[491,850],[602,851],[493,852],[492,13],[494,853],[603,846],[907,854],[906,855],[909,856],[604,846],[908,857],[910,858],[911,859],[913,860],[912,861],[914,862],[915,863],[605,846],[916,13],[606,846],[782,864],[780,865],[781,13],[607,846],[918,866],[917,867],[919,868],[608,846],[497,869],[499,870],[498,871],[691,872],[610,873],[609,851],[922,874],[923,875],[921,876],[617,877],[793,878],[794,13],[796,879],[795,13],[618,846],[925,880],[619,846],[802,881],[801,882],[620,851],[732,883],[734,884],[733,885],[735,886],[621,887],[926,888],[807,889],[806,13],[808,890],[622,851],[937,891],[939,892],[940,893],[938,894],[623,846],[900,895],[899,13],[901,896],[902,897],[496,13],[1045,13],[692,898],[690,899],[809,900],[920,901],[616,902],[615,903],[614,904],[810,13],[812,905],[811,861],[624,846],[941,869],[625,851],[821,906],[822,907],[626,846],[753,908],[752,909],[754,910],[628,911],[693,13],[629,3],[942,912],[823,913],[630,846],[943,914],[946,915],[944,914],[947,916],[824,917],[945,914],[631,846],[949,918],[950,919],[537,920],[684,921],[538,922],[682,923],[951,924],[536,925],[952,926],[683,919],[953,927],[535,928],[632,851],[532,929],[852,930],[851,861],[633,846],[961,931],[960,932],[634,887],[1046,933],[850,934],[636,935],[635,936],[825,13],[841,937],[832,938],[833,939],[834,940],[835,940],[637,941],[611,846],[840,942],[963,943],[962,13],[745,13],[638,851],[854,944],[855,945],[853,13],[639,851],[778,946],[777,947],[859,948],[640,936],[751,949],[744,950],[747,951],[746,952],[748,13],[749,953],[641,851],[750,954],[968,955],[495,13],[966,956],[642,851],[967,957],[904,958],[862,959],[903,960],[694,3],[860,961],[861,962],[643,851],[905,963],[971,964],[863,849],[969,965],[644,887],[970,966],[755,967],[714,968],[645,936],[715,969],[716,970],[646,846],[865,971],[864,972],[647,973],[775,974],[774,13],[648,846],[979,975],[978,976],[649,846],[981,977],[984,978],[980,979],[982,977],[983,980],[650,846],[987,981],[651,887],[992,512],[652,851],[993,888],[995,982],[653,846],[713,983],[654,984],[612,851],[997,985],[998,985],[996,13],[999,985],[1005,986],[1000,985],[1001,985],[1002,13],[1004,987],[655,846],[1003,13],[873,988],[656,851],[874,989],[875,13],[876,990],[657,846],[757,13],[658,846],[1044,991],[1041,3],[1042,992],[1043,992],[673,846],[1008,993],[1010,994],[1007,995],[659,846],[1009,993],[1006,13],[1015,996],[660,851],[627,997],[613,998],[1017,999],[661,846],[877,1000],[878,1001],[756,1000],[880,1002],[759,1003],[758,1004],[662,846],[879,1005],[792,1006],[663,846],[791,1007],[881,13],[882,1008],[664,851],[594,1009],[1019,1010],[579,1011],[674,1012],[675,1013],[676,1014],[574,3],[575,3],[578,1015],[576,3],[577,3],[572,3],[573,1016],[599,1017],[1018,841],[593,486],[592,3],[595,1018],[597,887],[596,1019],[598,952],[689,1020],[1022,1021],[665,846],[1021,1022],[1020,1023],[681,1024],[680,1025],[666,973],[1024,1026],[766,1027],[1023,1028],[667,973],[772,1029],[767,3],[769,1030],[768,1031],[770,1032],[771,13],[668,846],[898,1033],[670,1034],[896,1035],[897,1036],[669,887],[895,1037],[1026,1038],[1031,1039],[1027,1040],[1028,1040],[671,846],[1029,1040],[1030,1040],[1025,1032],[1036,1041],[1037,1042],[776,1043],[672,846],[1035,1044],[1039,1045],[1038,3],[1040,13],[7283,13],[7231,1046],[7232,13],[7284,1047],[7246,843],[7233,1048],[7135,3],[7240,1049],[7319,3],[7134,13],[7133,13],[7282,1050],[7154,1051],[7320,1052],[7155,1050],[7285,1053],[7286,13],[7287,1054],[7156,1055],[7322,1056],[7321,13],[7323,1057],[7157,1050],[7330,1058],[7329,1059],[7332,1060],[7158,1050],[7331,1061],[7333,1062],[7334,1063],[7336,1064],[7335,1065],[7339,1066],[7340,1067],[7159,1050],[7341,13],[7160,1050],[7290,1068],[7288,1069],[7289,13],[7161,1050],[7343,1070],[7342,1071],[7344,1072],[7162,1050],[6679,1073],[6681,1074],[6680,1075],[6682,1076],[7164,1077],[7163,1055],[7347,1078],[7348,1079],[7346,1080],[7171,1081],[7293,1082],[7294,13],[7296,1083],[7295,13],[7172,1050],[7349,880],[7173,1050],[7298,1084],[7297,1085],[7174,1055],[7251,883],[7253,1086],[7252,1087],[7254,1088],[7175,1089],[7350,1090],[7300,1091],[7299,13],[7301,1092],[7176,1055],[7351,1093],[7353,1094],[7354,1095],[7352,1096],[7177,1050],[7455,1097],[7454,13],[7456,1098],[7457,1099],[6678,13],[7448,13],[7243,1100],[7242,1101],[7302,1102],[7345,1103],[7170,1104],[7169,1105],[7168,1106],[7303,13],[7305,1107],[7304,1065],[7178,1050],[7355,1073],[7179,1055],[7306,1108],[7307,1109],[7180,1050],[7264,1110],[7263,1111],[7265,1112],[7182,1113],[7244,13],[7183,3],[7356,1114],[7308,1115],[7184,1050],[7357,1116],[7360,1117],[7358,1116],[7361,1118],[7309,1119],[7359,1116],[7185,1050],[7362,1120],[7363,1121],[7458,1122],[7239,1123],[7137,1124],[7237,1125],[7364,924],[7365,1126],[7366,1127],[7238,919],[7367,1128],[7236,928],[7186,1055],[7136,1129],[7450,1130],[7318,1065],[7187,1050],[7369,1131],[7368,932],[7188,1089],[7449,1132],[7317,1133],[7190,1134],[7189,1135],[7310,13],[7316,1136],[7311,1137],[7312,1138],[7313,1139],[7314,1139],[7191,1140],[7165,1050],[7315,1141],[7371,1142],[7370,13],[7256,13],[7192,1055],[7452,1143],[7453,1144],[7451,13],[7193,1055],[7281,1145],[7280,1146],[7372,1147],[7194,1135],[7262,1148],[7255,950],[7258,1149],[7257,1150],[7259,13],[7260,953],[7195,1055],[7261,1151],[7375,1152],[7324,13],[7373,1153],[7196,1055],[7374,1154],[7326,1155],[7378,1156],[7325,1157],[7245,3],[7376,1158],[7377,1159],[7197,1055],[7327,1160],[7381,1161],[7328,1053],[7379,1162],[7198,1089],[7380,1163],[7266,1164],[7248,1165],[7199,1135],[7249,1166],[7250,1167],[7200,1050],[7338,1168],[7337,1169],[7201,1170],[7278,1171],[7277,13],[7202,1050],[7383,1172],[7382,1173],[7203,1050],[7385,1174],[7388,1175],[7384,1176],[7386,1174],[7387,1177],[7204,1050],[7389,981],[7205,1089],[7390,512],[7206,1055],[7391,1090],[7392,1178],[7207,1050],[7247,1179],[7208,1180],[7166,851],[7394,1181],[7395,1181],[7393,13],[7396,1181],[7402,1182],[7397,1181],[7398,1181],[7399,13],[7401,1183],[7209,1050],[7400,13],[7403,1184],[7210,1055],[7404,1185],[7405,13],[7406,1186],[7211,1050],[6677,13],[7212,1050],[7447,1187],[7444,3],[7445,1188],[7446,1188],[7227,1050],[7409,1189],[7411,1190],[7408,1191],[7213,1050],[7410,1189],[7407,13],[7412,996],[7214,1055],[7181,1192],[7167,1193],[7413,999],[7215,1050],[7414,1194],[7415,1195],[7267,1194],[7417,1196],[7269,1197],[7268,1198],[7216,1050],[7416,1199],[7292,1200],[7217,1050],[7291,1007],[7418,13],[7419,1201],[7218,1055],[7148,1202],[7421,1203],[7145,1204],[7228,1205],[7229,1206],[7230,1207],[7140,3],[7141,3],[7144,1208],[7142,3],[7143,3],[7138,3],[7139,1209],[7153,1210],[7420,1046],[7147,486],[7146,3],[7149,1211],[7151,1089],[7150,1212],[7152,1150],[7241,1213],[7424,1214],[7219,1050],[7423,1215],[7422,1216],[7235,1217],[7234,1218],[7220,1170],[7426,1219],[7270,1027],[7425,1220],[7221,1170],[7276,1221],[7271,3],[7273,1222],[7272,1223],[7274,1224],[7275,13],[7222,1050],[7430,1225],[7224,1226],[7428,1227],[7429,1228],[7223,1089],[7427,1037],[7432,1229],[7437,1230],[7433,1231],[7434,1231],[7225,1050],[7435,1231],[7436,1231],[7431,1224],[7439,1232],[7440,1233],[7279,1234],[7226,1050],[7438,1235],[7442,1236],[7441,3],[7443,13],[5326,3],[5331,3],[98,3],[4420,3],[533,3],[5301,3],[82,3],[6527,3],[6625,1237],[6530,1238],[6532,1238],[6533,1238],[6534,1238],[6535,1238],[6536,1238],[6531,1238],[6537,1238],[6539,1238],[6538,1238],[6540,1238],[6541,1238],[6542,1238],[6543,1238],[6544,1238],[6545,1238],[6546,1238],[6547,1238],[6549,1238],[6548,1238],[6550,1238],[6551,1238],[6552,1238],[6553,1238],[6554,1238],[6555,1238],[6556,1238],[6557,1238],[6558,1238],[6559,1238],[6560,1238],[6561,1238],[6562,1238],[6563,1238],[6564,1238],[6566,1238],[6567,1238],[6565,1238],[6568,1238],[6569,1238],[6570,1238],[6571,1238],[6572,1238],[6573,1238],[6574,1238],[6575,1238],[6576,1238],[6577,1238],[6578,1238],[6579,1238],[6581,1238],[6580,1238],[6583,1238],[6582,1238],[6584,1238],[6585,1238],[6586,1238],[6587,1238],[6588,1238],[6589,1238],[6590,1238],[6591,1238],[6592,1238],[6593,1238],[6594,1238],[6595,1238],[6596,1238],[6598,1238],[6597,1238],[6599,1238],[6600,1238],[6601,1238],[6603,1238],[6602,1238],[6604,1238],[6605,1238],[6606,1238],[6607,1238],[6608,1238],[6609,1238],[6611,1238],[6610,1238],[6612,1238],[6613,1238],[6614,1238],[6615,1238],[6616,1238],[6529,1239],[6617,1238],[6618,1238],[6620,1238],[6619,1238],[6621,1238],[6622,1238],[6623,1238],[6624,1238],[6528,1240],[688,1241],[687,1242],[686,3],[5378,142],[5994,1243],[5995,1244],[5310,1245],[5976,3],[1154,3],[5864,1246],[1267,3],[5740,3],[1300,3],[1314,1247],[1301,1248],[1305,1249],[1303,1250],[1304,1250],[1302,1248],[1278,1251],[1277,1252],[1273,1253],[1276,1254],[1274,1255],[1275,1255],[1298,1256],[1296,1251],[1297,1251],[1295,1251],[1294,1257],[1299,1258],[1272,1259],[1270,1260],[1268,1261],[1269,1262],[1271,1261],[1293,1263],[1282,1247],[1286,1264],[1292,1247],[1288,1247],[1281,1247],[1291,1247],[1280,1264],[1287,1264],[1279,3],[1284,1247],[1289,1247],[1283,1247],[1285,1247],[1290,1247],[5315,1265],[5313,3],[5314,3],[5279,1266],[1070,1267],[1071,1268],[1082,1269],[1072,1270],[1067,1271],[1066,1272],[1065,1273],[1073,1274],[1069,1275],[1068,1276],[1074,607],[1063,1277],[1075,1278],[1076,1279],[1077,1280],[1078,1281],[1061,1282],[1079,1274],[1080,1283],[1064,1284],[1081,1285],[1062,1283],[7052,13],[6498,3],[90,1286],[422,1287],[427,1288],[429,1289],[215,1290],[370,1291],[397,1292],[226,3],[207,3],[213,3],[359,1293],[294,1294],[214,3],[360,1295],[399,1296],[400,1297],[347,1298],[356,1299],[264,1300],[364,1301],[365,1302],[363,1303],[362,3],[361,1304],[398,1305],[216,1306],[301,3],[302,1307],[211,3],[227,1308],[217,1309],[239,1308],[270,1308],[200,1308],[369,1310],[379,3],[206,3],[325,1311],[326,1312],[320,1313],[450,3],[328,3],[329,1313],[321,1314],[341,13],[455,1315],[454,1316],[449,3],[267,1317],[402,3],[355,1318],[354,3],[448,1319],[322,13],[242,1320],[240,1321],[451,3],[453,1322],[452,3],[241,1323],[443,1324],[446,1325],[251,1326],[250,1327],[249,1328],[458,13],[248,1329],[289,3],[461,3],[6656,1330],[6655,3],[464,3],[463,13],[465,1331],[196,3],[366,1332],[367,1333],[368,1334],[391,3],[205,1335],[195,3],[198,1336],[340,1337],[339,1338],[330,3],[331,3],[338,3],[333,3],[336,1339],[332,3],[334,1340],[337,1341],[335,1340],[212,3],[203,3],[204,1308],[421,1342],[430,1343],[434,1344],[373,1345],[372,3],[285,3],[466,1346],[382,1347],[323,1348],[324,1349],[317,1350],[307,3],[315,3],[316,1351],[345,1352],[308,1353],[346,1354],[343,1355],[342,3],[344,3],[298,1356],[374,1357],[375,1358],[309,1359],[313,1360],[305,1361],[351,1362],[381,1363],[384,1364],[287,1365],[201,1366],[380,1367],[197,1292],[403,3],[404,1368],[415,1369],[401,3],[414,1370],[91,3],[389,1371],[273,3],[303,1372],[385,3],[202,3],[234,3],[413,1373],[210,3],[276,1374],[312,1375],[371,1376],[311,3],[412,3],[406,1377],[407,1378],[208,3],[409,1379],[410,1380],[392,3],[411,1366],[232,1381],[390,1382],[416,1383],[219,3],[222,3],[220,3],[224,3],[221,3],[223,3],[225,1384],[218,3],[279,1385],[278,3],[284,1386],[280,1387],[283,1388],[282,1388],[286,1386],[281,1387],[238,1389],[268,1390],[378,1391],[468,3],[438,1392],[440,1393],[310,3],[439,1394],[376,1357],[467,1395],[327,1357],[209,3],[269,1396],[235,1397],[236,1398],[237,1399],[233,1400],[350,1400],[245,1400],[271,1401],[246,1401],[229,1402],[228,3],[277,1403],[275,1404],[274,1405],[272,1406],[377,1407],[349,1408],[348,1409],[319,1410],[358,1411],[357,1412],[353,1413],[263,1414],[265,1415],[262,1416],[230,1417],[297,3],[426,3],[296,1418],[352,3],[288,1419],[306,1332],[304,1420],[290,1421],[292,1422],[462,3],[291,1423],[293,1423],[424,3],[423,3],[425,3],[460,3],[295,1424],[260,13],[89,3],[243,1425],[252,3],[300,1426],[231,3],[432,13],[442,1427],[259,13],[436,1313],[258,1428],[418,1429],[257,1427],[199,3],[444,1430],[255,13],[256,13],[247,3],[299,3],[254,1431],[253,1432],[244,1433],[314,729],[383,729],[408,3],[387,1434],[386,3],[428,3],[261,13],[318,13],[420,1435],[84,13],[87,1436],[88,1437],[85,13],[86,3],[405,1438],[396,1439],[395,3],[394,1440],[393,3],[417,1441],[431,1442],[433,1443],[435,1444],[6657,1445],[437,1446],[441,1447],[474,1448],[445,1448],[473,1449],[447,1450],[456,1451],[457,1452],[459,1453],[469,1454],[472,1335],[471,3],[470,1455],[1229,1456],[1226,3],[1227,1456],[1228,1457],[1231,1458],[1230,1459],[1255,1460],[1253,1461],[1254,1462],[1242,1463],[1243,1461],[1250,1464],[1241,1465],[1246,1466],[1256,3],[1247,1467],[1252,1468],[1258,1469],[1257,1470],[1240,1471],[1248,1472],[1249,1473],[1244,1474],[1251,1460],[1245,1475],[1215,3],[799,1476],[800,1477],[797,1478],[798,1479],[731,13],[804,1480],[805,1481],[803,662],[485,1482],[484,1482],[483,1483],[486,1484],[819,1485],[816,13],[818,1486],[820,1487],[817,13],[787,1488],[786,3],[523,1489],[527,1489],[525,1489],[526,1489],[530,1490],[522,1491],[524,1489],[528,1489],[520,3],[521,1492],[529,1492],[519,924],[531,924],[948,924],[503,1493],[501,3],[502,1494],[954,13],[958,1495],[959,1496],[956,13],[955,1497],[957,1498],[849,1499],[848,1500],[829,1501],[831,1502],[830,1501],[828,1503],[826,1501],[827,3],[858,1504],[856,13],[857,1505],[741,13],[742,1506],[743,1507],[736,13],[737,1508],[738,1506],[740,1506],[739,1506],[509,13],[506,1509],[508,1510],[510,1511],[505,13],[507,13],[964,13],[965,1512],[698,1513],[696,1514],[695,1515],[697,1515],[504,3],[518,1516],[513,1517],[515,1518],[514,1519],[516,1519],[517,1519],[986,1520],[985,13],[994,13],[706,1521],[710,1522],[711,1523],[705,13],[707,1524],[708,1524],[709,1525],[871,1526],[867,1526],[868,1527],[872,1528],[866,13],[869,13],[870,1529],[1014,1530],[1011,13],[1012,1531],[1013,1532],[1016,13],[717,3],[721,1533],[723,1534],[720,13],[722,1535],[730,1536],[719,1537],[718,3],[724,1538],[725,1539],[727,1540],[728,1538],[729,1541],[783,1542],[790,1543],[788,1544],[784,1545],[785,13],[789,1545],[839,1546],[836,1501],[838,1547],[837,1547],[539,659],[540,1548],[892,1549],[888,1550],[889,1551],[891,1552],[890,1553],[884,1554],[885,13],[894,1555],[883,1556],[886,1550],[887,1557],[893,1550],[1032,1558],[1034,1559],[773,13],[1033,1560],[481,3],[480,13],[482,1561],[699,13],[702,1562],[700,13],[704,1563],[703,13],[701,13],[7116,1564],[7115,13],[7119,1565],[7114,13],[7117,3],[7118,1566],[7120,1567],[5281,1568],[6526,13],[5959,1569],[5905,1570],[5952,1571],[5925,1572],[5922,1573],[5912,1574],[5973,1575],[5921,1576],[5907,1577],[5957,1578],[5956,1579],[5955,1580],[5911,1581],[5953,1582],[5954,1583],[5960,1584],[5968,1585],[5962,1585],[5970,1585],[5974,1585],[5961,1585],[5963,1585],[5966,1585],[5969,1585],[5965,1586],[5967,1585],[5971,1587],[5964,1587],[5888,1588],[5936,13],[5933,1587],[5938,13],[5929,1585],[5889,1585],[5902,1585],[5908,1589],[5932,1590],[5935,13],[5937,13],[5934,1591],[5885,13],[5884,13],[5951,13],[5980,1592],[5979,1593],[5981,1594],[5945,1595],[5944,1596],[5942,1597],[5943,1585],[5946,1598],[5947,1599],[5941,13],[5906,1600],[5886,1585],[5940,1585],[5901,1585],[5939,1585],[5909,1600],[5972,1585],[5899,1601],[5926,1602],[5900,1603],[5913,1604],[5898,1605],[5914,1606],[5915,1607],[5916,1603],[5918,1608],[5919,1609],[5958,1610],[5923,1611],[5904,1612],[5910,1613],[5920,1614],[5927,1615],[5887,1616],[5978,3],[5903,1617],[5924,1618],[5975,3],[5917,3],[5930,3],[5977,1619],[5928,1620],[5931,3],[5895,1621],[5893,3],[5894,3],[534,1622],[388,750],[1239,3],[5549,3],[7624,1623],[5364,1624],[5365,1624],[5366,1624],[5370,13],[7620,1625],[5355,1626],[7623,1627],[5631,1628],[5632,13],[5633,13],[5634,1629],[5625,13],[5626,1630],[5627,1630],[5629,1631],[5630,1631],[5636,1631],[5635,1632],[5641,1633],[5642,1634],[5643,1635],[5644,13],[5645,1636],[5646,1636],[5647,1636],[5648,1636],[5649,1636],[5650,1636],[5651,1636],[5652,1636],[5653,1636],[5654,1636],[5655,1636],[5656,1635],[5659,1637],[5657,1638],[5357,1639],[5368,1640],[5356,1641],[5367,1642],[5375,1643],[5369,1644],[5374,1645],[5373,1642],[5372,1646],[5679,1647],[5680,1648],[5682,1649],[5666,1650],[5667,1650],[5668,1650],[5669,1650],[5670,1650],[5671,1650],[5672,1650],[5673,1650],[5674,1650],[5675,1650],[5665,1651],[5676,1650],[5677,1650],[5678,1650],[5664,13],[5681,1652],[7621,1653],[5358,3],[5363,1654],[7622,1625],[5637,1655],[5660,1656],[5376,1657],[5683,1658],[5328,3],[5345,1659],[5349,1660],[5343,3],[5342,3],[5621,1661],[5623,1662],[5622,1663],[5639,1664],[5638,1665],[5341,1661],[5340,1666],[5352,1667],[5351,1668],[5662,1669],[5661,1663],[5350,1670],[5347,1671],[5624,1672],[5640,1673],[5658,1674],[5353,1675],[5371,1676],[5663,1677],[5628,1666],[5359,1678],[5354,1679],[5360,1680],[5361,1681],[5362,1682],[5339,1683],[5337,1684],[5336,1685],[5335,1685],[5338,1686],[5334,1687],[5329,3],[5333,3],[5332,1688],[5330,3],[5344,1689],[5348,1690],[5346,1691],[6935,180],[6938,1692],[6937,180],[6936,1693],[1153,3],[1151,3],[1155,1694],[1152,1695],[1156,1696],[1260,1697],[1208,1698],[1207,3],[1206,3],[1259,1699],[5280,13],[79,3],[80,3],[13,3],[14,3],[16,3],[15,3],[2,3],[17,3],[18,3],[19,3],[20,3],[21,3],[22,3],[23,3],[24,3],[3,3],[25,3],[26,3],[4,3],[27,3],[31,3],[28,3],[29,3],[30,3],[32,3],[33,3],[34,3],[5,3],[35,3],[36,3],[37,3],[38,3],[6,3],[42,3],[39,3],[40,3],[41,3],[43,3],[7,3],[44,3],[49,3],[50,3],[45,3],[46,3],[47,3],[48,3],[8,3],[54,3],[51,3],[52,3],[53,3],[55,3],[9,3],[56,3],[57,3],[58,3],[60,3],[59,3],[61,3],[62,3],[10,3],[63,3],[64,3],[65,3],[11,3],[66,3],[67,3],[68,3],[69,3],[70,3],[1,3],[71,3],[72,3],[12,3],[76,3],[74,3],[78,3],[73,3],[77,3],[75,3],[114,1700],[124,1701],[113,1700],[134,1702],[105,1703],[104,1704],[133,1455],[127,1705],[132,1706],[107,1707],[121,1708],[106,1709],[130,1710],[102,1711],[101,1455],[131,1712],[103,1713],[108,1714],[109,3],[112,1714],[99,3],[135,1715],[125,1716],[116,1717],[117,1718],[119,1719],[115,1720],[118,1721],[128,1455],[110,1722],[111,1723],[120,1724],[100,1725],[123,1716],[122,1714],[126,3],[129,1726],[6683,3],[5275,13],[1334,1727],[1319,3],[1320,3],[1321,3],[1322,3],[1318,3],[1323,1728],[1324,3],[1326,1729],[1325,1728],[1327,1728],[1328,1729],[1329,1728],[1330,3],[1331,1728],[1332,3],[1333,3],[5711,3],[5950,1730],[5892,1731],[1058,1],[1237,1732],[7006,3],[5458,3],[5459,3],[5461,1733],[5462,3],[5463,3],[5464,1733],[5465,3],[5466,3],[5467,1733],[5468,3],[5469,3],[5470,1733],[6964,111],[6965,1734],[6026,1735],[6486,19],[5471,3],[7007,1736],[1059,13],[7011,1737],[7012,4],[7015,1738],[7009,1739],[7016,1740],[1060,13],[7018,1741],[7033,1742],[7024,1743],[7025,1744],[7026,1745],[7027,111],[7028,111],[7029,1746],[7030,1747],[7031,1748],[7034,1749],[7036,1750],[7037,1751],[5472,3],[7080,1752],[5511,1753],[5473,1754],[5474,1754],[7081,1755],[5481,13],[7070,1756],[5482,1757],[5478,607],[5479,607],[5480,607],[7061,1758],[7062,1759],[7063,1760],[7064,1761],[7065,1762],[5514,1763],[7066,1764],[7067,1765],[7068,1766],[7069,1767],[5513,1768],[5512,3],[5515,1769],[5516,1770],[5517,1771],[5518,1772],[5519,3],[5522,1773],[5523,3],[5521,1774],[7059,1775],[7079,1776],[7060,1777],[5476,607],[5477,607],[7078,1778],[7053,1779],[5524,1780],[7082,1781],[1084,13],[1083,607],[7083,1782],[7084,1783],[1085,19],[5992,1784],[1086,19],[7086,1785],[7087,1786],[5525,102],[7017,38],[5526,102],[5527,1787],[7091,1788],[7089,1789],[7090,1790],[7092,1791],[1087,38],[7125,1792],[5528,74],[7121,1793],[7131,1794],[7010,1795],[7093,1796],[7094,1796],[7095,1796],[7096,1796],[7097,1796],[7098,1796],[7099,1796],[7100,1796],[7101,1796],[7102,1796],[7103,1796],[7104,1796],[7105,1796],[7106,1796],[7107,1796],[7108,1796],[7109,1796],[7110,1796],[1088,3],[7111,1796],[7112,1796],[7113,1797],[7132,1798],[7459,1799],[1092,19],[7461,1800],[7462,4],[5529,3],[7460,1801],[1089,19],[7463,1802],[7464,1803],[1090,19],[7465,1804],[7466,1805],[1091,19],[7467,1806],[5530,3],[7468,1807],[7469,99],[7470,13],[5598,3],[5599,74],[7519,1808],[7522,1809],[7520,1810],[7521,1811],[7523,1812],[7524,1813],[7526,1814],[7527,1815],[7528,1816],[1196,19],[7525,1817],[5600,74],[7535,1818],[1197,19],[7530,1819],[7529,3],[5601,74],[7122,1739],[1199,13],[7124,1820],[7123,1821],[1198,1822],[7531,38],[7532,111],[7533,1823],[7534,1824],[7536,1825],[5602,74],[1200,3],[7537,1826],[7538,1827],[7539,1828],[7540,1829],[7541,1830],[5603,1831],[7566,1832],[7543,1833],[7565,1834],[1201,1835],[5604,3],[7544,1836],[7560,1837],[7557,1739],[7542,1838],[6018,1839],[1204,3],[6019,1840],[7550,1841],[7548,1842],[1355,3],[7546,1843],[5606,3],[1205,3],[7547,1844],[1202,3],[7545,1845],[1356,1846],[1203,1847],[5605,3],[7549,1848],[5607,74],[1209,1849],[7555,1850],[5608,74],[7552,102],[7553,1851],[7554,1852],[7556,1853],[5609,3],[5610,74],[1210,13],[7558,1854],[7562,1855],[5611,74],[7551,38],[7559,1856],[5612,74],[7561,1857],[5613,74],[1211,13],[7564,1858],[5614,74],[1212,13],[7563,1859],[7567,1860],[7569,1861],[7571,1862],[5615,74],[5616,1863],[7572,1864],[1213,13],[7568,1812],[7570,1865],[7032,133],[7573,1866],[7574,1867],[7575,1868],[5617,3],[7576,9],[7577,1869],[7578,19],[7579,1870],[1214,19],[7583,1871],[7580,1872],[7581,1873],[7584,1872],[7582,1874],[7585,77],[7586,108],[7587,1875],[7588,1876],[7590,1877],[7589,108],[7471,77],[6906,1878],[7477,38],[7478,1879],[7479,1815],[1108,38],[5550,1880],[4418,1879],[5551,3],[5552,3],[5554,1881],[1170,3],[5553,1882],[5555,3],[6903,1815],[6692,1883],[1109,1884],[4426,1885],[5531,71],[4424,71],[4425,1886],[1110,38],[6933,1887],[7472,1888],[5532,74],[1112,3],[7473,1889],[1111,19],[6709,1890],[1113,19],[6927,1891],[1114,19],[6917,1892],[6918,1893],[1115,19],[6921,1894],[6919,1895],[1116,19],[6920,1896],[6914,1897],[6916,1898],[1118,13],[6915,1899],[1117,3],[6926,1900],[1120,19],[6925,1901],[5533,74],[1119,19],[6924,1902],[1122,19],[6922,1903],[1123,1904],[6923,1905],[1121,19],[6719,1906],[1125,38],[6718,1907],[5534,74],[1124,19],[6716,1908],[1129,3],[6717,1909],[1130,3],[5537,74],[6712,1910],[1126,3],[6714,1911],[1127,3],[6720,1912],[5536,74],[1128,3],[6715,1913],[5535,74],[6930,1914],[1132,3],[6707,1915],[1135,1916],[6713,1917],[1136,3],[6711,1918],[5538,74],[1137,1919],[6931,1920],[5539,74],[1138,3],[6708,1921],[1139,19],[4427,1922],[1140,3],[6710,1923],[1141,3],[6932,1924],[1131,1919],[6934,1925],[5540,74],[6904,1926],[5541,74],[1143,3],[6905,1927],[1142,1919],[5542,3],[6694,1928],[6928,1929],[5543,74],[1145,1919],[6929,1930],[1144,1919],[6907,1931],[6911,1932],[6912,1933],[5544,74],[1146,1934],[6913,1935],[1147,1919],[6908,1936],[6909,1937],[6910,1938],[1148,1934],[6695,1939],[1150,19],[7474,1940],[1159,1941],[6696,1942],[1160,3],[6703,1943],[6697,1944],[1161,3],[5545,3],[6698,1945],[1162,19],[6699,1946],[5546,3],[6691,1947],[7475,1948],[5547,3],[5548,74],[6705,1949],[1163,19],[6693,1950],[1165,3],[6700,1951],[1164,3],[7476,1952],[1166,3],[6701,1953],[1167,3],[6702,1954],[1168,3],[6685,1955],[1169,1956],[6704,1957],[1149,1958],[6706,1959],[1134,1960],[6684,1961],[1133,1919],[1107,1962],[7480,13],[5556,13],[5573,1963],[5557,1964],[5572,1965],[5574,1941],[5575,1966],[5585,1967],[5577,1968],[5576,1969],[1171,3],[5578,1970],[5579,1971],[5582,1972],[5583,1973],[5584,1971],[1158,1974],[5588,1975],[5581,1976],[5580,71],[1172,1977],[6939,1978],[5589,3],[1157,1979],[7484,1980],[1174,19],[7481,1981],[1175,1982],[7482,1983],[1176,3],[7483,1984],[1173,19],[7486,1985],[1178,19],[7485,1986],[5590,74],[1177,19],[7489,1987],[1180,19],[7487,1988],[1181,3],[7488,1989],[1179,19],[7490,1990],[1182,19],[7491,1991],[1183,19],[7492,1992],[1184,19],[7493,1993],[1185,19],[7494,1994],[1186,3],[7495,1995],[7496,1996],[7497,1997],[7498,1998],[1188,3],[7499,1999],[5591,74],[1187,3],[6940,2000],[6946,205],[7500,2001],[5592,74],[7501,111],[5593,74],[7502,2002],[1189,19],[7503,2003],[6466,1838],[7504,2004],[1190,19],[5594,74],[7126,2005],[7127,2006],[1192,3],[7128,2007],[7129,2008],[7130,2009],[1191,19],[7505,77],[7506,2010],[7507,123],[7508,2011],[7510,2012],[7509,2013],[7511,2014],[1193,19],[7512,2015],[7088,2016],[7591,2016],[5618,74],[7593,2017],[7592,2018],[6487,2019],[6481,2016],[6482,1879],[6483,2020],[5597,74],[7022,2021],[7019,2022],[5595,74],[1194,19],[7020,2023],[7021,2021],[7023,2024],[5596,3],[1195,3],[7518,2025],[7513,2025],[7517,2026],[7516,2027],[7514,2028],[7515,2029],[5619,2030],[5620,3],[5684,2031],[7596,2032],[7597,2033],[7594,205],[5700,13],[7595,2034],[5685,1966],[5686,205],[5687,13],[5689,2035],[5690,13],[5691,38],[5692,13],[5693,13],[5688,13],[5694,13],[5695,13],[5696,2036],[5697,13],[5698,2037],[5699,13],[5701,2038],[5377,2039],[7598,2040],[5702,180],[5703,2041],[5704,2041],[5705,71],[5706,3],[1223,3],[7618,2042],[7619,2043],[5721,3],[5723,2044],[5724,2045],[5722,2046],[1216,2047],[7625,2048],[1217,3],[5398,2049],[5707,2050],[5708,19],[5379,2051],[5380,2052],[5318,3],[5319,19],[5709,3],[5308,2053],[5309,3],[5710,2049],[5714,2054],[5715,2049],[5716,2049],[5717,2055],[5718,3],[5320,2056],[5719,3],[5720,3],[5713,2057],[5731,2058],[5732,2059],[5712,3],[5733,2060],[1218,3],[5734,2061],[5730,180],[7626,2062],[5725,2063],[5726,2064],[5735,3],[5736,2065],[5737,2066],[5728,2067],[5727,2068],[5558,2069],[1219,3],[5560,2070],[5559,180],[5729,2071],[7627,3],[5738,3],[5565,2072],[5566,2073],[5568,2074],[5564,2075],[5567,2075],[5562,1979],[5563,2076],[5569,2077],[1095,3],[1101,2078],[1099,2079],[1100,2080],[1096,3],[1098,2081],[1097,2082],[5830,2083],[5571,2084],[5561,170],[5828,2085],[5831,2086],[5825,2087],[5587,2088],[1106,2089],[1104,2090],[1093,3],[1105,2091],[1103,3],[1102,2091],[1094,2092],[5826,3],[5829,2093],[5570,3],[5832,3],[5827,2094],[5586,2095],[5381,2096],[1224,2097],[5833,3],[5834,3],[6658,2098],[6660,2099],[6666,133],[6668,2100],[6675,2101],[7628,3],[6942,3],[6944,3],[6664,3],[6947,2102],[6949,2103],[6662,3],[6952,3],[6955,2104],[6959,3],[6957,2105],[6961,2106],[5836,3],[5835,2107],[5837,3],[5838,3],[5840,2108],[5841,3],[7629,2109],[5842,3],[5843,2110],[5844,2111],[5845,3],[5847,2112],[5846,3],[5848,3],[5849,3],[5851,2113],[5850,3],[5852,3],[5853,180],[5854,3],[5855,3],[1261,2114],[5856,219],[5429,2115],[5857,220],[5431,2115],[5433,225],[5858,221],[5435,2116],[5434,2117],[5438,2118],[5437,225],[5440,2119],[5859,222],[5439,2120],[5442,2115],[5860,223],[5444,2115],[5861,224],[5450,2115],[5862,229],[5863,230],[5452,2115],[5867,2121],[5865,2122],[5866,2123],[1220,2124],[1221,2125],[5871,2126],[5872,2127],[5873,2128],[5424,2129],[1225,2049],[5427,2130],[5874,3],[1234,2131],[5425,2132],[5426,2133],[1233,2132],[5876,2134],[5875,2132],[1222,3],[5877,2135],[1235,225],[5870,2136],[5869,2137],[5428,2132],[5868,2138],[1236,3]],"semanticDiagnosticsPerFile":[[1224,[{"start":120,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[1307,[{"start":107,"length":13,"messageText":"Cannot find module '../../Types' or its corresponding type declarations.","category":1,"code":2307},{"start":149,"length":25,"messageText":"Cannot find module '../useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307}]],[1308,[{"start":53,"length":13,"messageText":"Cannot find module '../../Types' or its corresponding type declarations.","category":1,"code":2307}]],[1309,[{"start":35,"length":13,"messageText":"Cannot find module '../../Types' or its corresponding type declarations.","category":1,"code":2307}]],[1310,[{"start":30,"length":40,"messageText":"Cannot find module '../../shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":139,"length":13,"messageText":"Cannot find module '../../Types' or its corresponding type declarations.","category":1,"code":2307},{"start":180,"length":24,"messageText":"Cannot find module '../useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[1311,[{"start":64,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":108,"length":13,"messageText":"Cannot find module '../../Types' or its corresponding type declarations.","category":1,"code":2307},{"start":405,"length":24,"messageText":"Cannot find module '../useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[1316,[{"start":224,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'EnrichedEvaluationRun'."}]],[1317,[{"start":189,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":257,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":314,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":362,"length":25,"messageText":"Cannot find module '@/oss/lib/utils/slugify' or its corresponding type declarations.","category":1,"code":2307},{"start":427,"length":61,"messageText":"Cannot find module '@/agenta-oss-common/lib/workers/evalRunner/runMetricsWorker' or its corresponding type declarations.","category":1,"code":2307},{"start":510,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":556,"length":37,"messageText":"Cannot find module '@/oss/services/runMetrics/api/types' or its corresponding type declarations.","category":1,"code":2307}]],[1335,[{"start":62,"length":49,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios/types' or its corresponding type declarations.","category":1,"code":2307}]],[1336,[{"start":102,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":165,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":220,"length":49,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios/types' or its corresponding type declarations.","category":1,"code":2307},{"start":291,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307}]],[1337,[{"start":91,"length":49,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1833,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IInvocationStep'."}]],[1338,[{"start":1176,"length":64,"messageText":"Function lacks ending return statement and return type does not include 'undefined'.","category":1,"code":2366}]],[1339,[{"start":99,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[1340,[{"start":336,"length":48,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/state/urlState' or its corresponding type declarations.","category":1,"code":2307},{"start":1328,"length":2,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{}' is not assignable to parameter of type 'UseEvaluationRunScenarioStepsFetcherResult'.","category":1,"code":2345,"next":[{"messageText":"Type '{}' is missing the following properties from type 'UseEvaluationRunScenarioStepsFetcherResult': steps, annotationSteps, invocationSteps, inputSteps","category":1,"code":2739}]}},{"start":5752,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'IScenario'."},{"start":5799,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'IScenario'."},{"start":7872,"length":4,"messageText":"Property 'view' does not exist on type 'unknown'.","category":1,"code":2339},{"start":7878,"length":10,"messageText":"Property 'scenarioId' does not exist on type 'unknown'.","category":1,"code":2339}]],[1343,[{"start":89,"length":7,"messageText":"Cannot find module 'immer' or its corresponding type declarations.","category":1,"code":2307},{"start":398,"length":18,"messageText":"'\"./runScopedAtoms\"' has no exported member named 'EvaluationRunState'. Did you mean 'evaluationRunStateFamily'?","category":1,"code":2724,"relatedInformation":[{"file":"./ee/src/lib/hooks/useevaluationrundata/assets/atoms/runscopedatoms.ts","start":682,"length":24,"messageText":"'evaluationRunStateFamily' is declared here.","category":3,"code":2728}]},{"start":422,"length":12,"messageText":"Module '\"./runScopedAtoms\"' has no exported member 'LoadingState'.","category":1,"code":2305},{"start":3643,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'EnrichedEvaluationRun'."},{"start":4651,"length":6,"code":2345,"category":1,"messageText":"Argument of type 'unknown' is not assignable to parameter of type 'EvaluationRunState | ((draft: WritableDraft) => void)'."},{"start":5326,"length":6,"code":2345,"category":1,"messageText":"Argument of type 'unknown' is not assignable to parameter of type 'SetStateAction<\"done\" | \"loading\" | \"error\" | \"idle\">'."},{"start":5654,"length":6,"code":2345,"category":1,"messageText":"Argument of type 'unknown' is not assignable to parameter of type 'SetStateAction>'."},{"start":5974,"length":6,"code":2345,"category":1,"messageText":"Argument of type 'unknown' is not assignable to parameter of type '{ isLoadingEvaluation: boolean; isLoadingScenarios: boolean; activeStep: string | null; } | ((draft: WritableDraft<{ isLoadingEvaluation: boolean; isLoadingScenarios: boolean; activeStep: string | null; }>) => void)'."}]],[1345,[{"start":236,"length":52,"messageText":"Cannot find module '@/oss/components/EvalRunDetailsPage/state/evalType' or its corresponding type declarations.","category":1,"code":2307},{"start":1920,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'IScenario'."},{"start":4436,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IInvocationStep'."},{"start":4509,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IAnnotationStep'."},{"start":4577,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IInputStep'."},{"start":4665,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IAnnotationStep'."},{"start":4757,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IAnnotationStep'."},{"start":5212,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IInvocationStep'."},{"start":5285,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IAnnotationStep'."},{"start":5353,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IInputStep'."}]],[1347,[{"start":64,"length":56,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/assets/optimisticUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":1255,"length":27,"messageText":"Module \"./migrationHelper\" has already exported a member named 'bulkStepsCacheAtom'. Consider explicitly re-exporting to resolve the ambiguity.","category":1,"code":2308},{"start":1255,"length":27,"messageText":"Module \"./migrationHelper\" has already exported a member named 'bulkStepsStatusAtom'. Consider explicitly re-exporting to resolve the ambiguity.","category":1,"code":2308},{"start":1309,"length":26,"messageText":"Module \"./migrationHelper\" has already exported a member named 'loadingStateAtom'. Consider explicitly re-exporting to resolve the ambiguity.","category":1,"code":2308},{"start":1360,"length":40,"messageText":"Module \"./migrationHelper\" has already exported a member named 'evaluationRunStateAtom'. Consider explicitly re-exporting to resolve the ambiguity.","category":1,"code":2308},{"start":2340,"length":4,"messageText":"Expected 1 arguments, but got 2.","category":1,"code":2554}]],[1348,[{"start":32,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":100,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":196,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[1349,[{"start":27,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":88,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":151,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":213,"length":45,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":296,"length":61,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/transformToRequestBody' or its corresponding type declarations.","category":1,"code":2307},{"start":393,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":432,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1248,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006}]],[1350,[{"start":41,"length":45,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1876,"length":55,"messageText":"Cannot find module '@/agenta-oss-common/lib/workers/evalRunner/bulkWorker' or its corresponding type declarations.","category":1,"code":2307},{"start":2259,"length":5,"messageText":"Parameter 'chunk' implicitly has an 'any' type.","category":1,"code":7006},{"start":3110,"length":3,"messageText":"Parameter 'val' implicitly has an 'any' type.","category":1,"code":7006},{"start":3115,"length":3,"messageText":"Parameter 'key' implicitly has an 'any' type.","category":1,"code":7006},{"start":3894,"length":5,"code":2739,"category":1,"messageText":"Type '{}' is missing the following properties from type 'WritableDraft': steps, annotationSteps, invocationSteps, inputSteps","canonicalHead":{"code":2322,"messageText":"Type '{}' is not assignable to type 'WritableDraft'."}},{"start":4009,"length":8,"code":7053,"category":1,"messageText":{"messageText":"Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'WritableDraft'.","category":1,"code":7053,"next":[{"messageText":"No index signature with a parameter of type 'string' was found on type 'WritableDraft'.","category":1,"code":7054}]}}]],[1351,[{"start":1231,"length":2,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{}' is not assignable to parameter of type 'UseEvaluationRunScenarioStepsFetcherResult'.","category":1,"code":2345,"next":[{"messageText":"Type '{}' is missing the following properties from type 'UseEvaluationRunScenarioStepsFetcherResult': steps, annotationSteps, invocationSteps, inputSteps","category":1,"code":2739}]}},{"start":4116,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'IScenario'."},{"start":5337,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'IScenario'."}]],[1352,[{"start":28,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":160,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307}]],[1353,[{"start":27,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":96,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":146,"length":31,"messageText":"Cannot find module '@/oss/services/runMetrics/api' or its corresponding type declarations.","category":1,"code":2307},{"start":3001,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3014,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3106,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3119,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3207,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3220,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3300,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3313,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3338,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3352,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3547,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3615,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3675,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3733,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3791,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3846,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":3904,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6228,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6241,"length":1,"messageText":"'v' is of type 'unknown'.","category":1,"code":18046},{"start":6341,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6354,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6453,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6466,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6555,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6568,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6594,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6608,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6680,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6748,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6808,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6866,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6924,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046},{"start":6979,"length":4,"messageText":"'stat' is of type 'unknown'.","category":1,"code":18046}]],[1354,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":216,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":292,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":448,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":652,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307},{"start":733,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":802,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":841,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":903,"length":40,"messageText":"Cannot find module '@/oss/services/evaluations/workerUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":980,"length":31,"messageText":"Cannot find module '@/oss/services/runMetrics/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1362,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":2081,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[1356,[{"start":66,"length":29,"messageText":"Cannot find module '@/oss/lib/helpers/hashUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":150,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":216,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":4065,"length":1,"messageText":"'a' is possibly 'undefined'.","category":1,"code":18048},{"start":4096,"length":1,"messageText":"'b' is possibly 'undefined'.","category":1,"code":18048},{"start":5251,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":5285,"length":5,"code":2339,"category":1,"messageText":"Property 'anyOf' does not exist on type '{}'."},{"start":5708,"length":5,"code":2339,"category":1,"messageText":"Property 'anyOf' does not exist on type '{}'."},{"start":5763,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":5876,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":5928,"length":5,"messageText":"Property 'value' does not exist on type 'unknown'.","category":1,"code":2339},{"start":5935,"length":5,"messageText":"Property 'items' does not exist on type 'unknown'.","category":1,"code":2339},{"start":5945,"length":9,"messageText":"Rest types may only be created from object types.","category":1,"code":2700},{"start":6400,"length":5,"messageText":"Property 'value' does not exist on type 'unknown'.","category":1,"code":2339},{"start":6418,"length":9,"messageText":"Rest types may only be created from object types.","category":1,"code":2700},{"start":6652,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":7241,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":7293,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":7374,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":7418,"length":5,"messageText":"Property 'value' does not exist on type 'unknown'.","category":1,"code":2339},{"start":7425,"length":5,"messageText":"Property 'items' does not exist on type 'unknown'.","category":1,"code":2339},{"start":7435,"length":9,"messageText":"Rest types may only be created from object types.","category":1,"code":2700},{"start":7737,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":7780,"length":4,"messageText":"'prop' is of type 'unknown'.","category":1,"code":18046},{"start":7813,"length":5,"messageText":"Property 'value' does not exist on type 'unknown'.","category":1,"code":2339},{"start":7823,"length":9,"messageText":"Rest types may only be created from object types.","category":1,"code":2700},{"start":14335,"length":4,"code":2339,"category":1,"messageText":"Property 'type' does not exist on type '{}'."},{"start":14355,"length":5,"code":2339,"category":1,"messageText":"Property 'anyOf' does not exist on type '{}'."},{"start":14455,"length":10,"messageText":"'schemaProp' is of type 'unknown'.","category":1,"code":18046},{"start":14512,"length":5,"code":2339,"category":1,"messageText":"Property 'anyOf' does not exist on type '{}'."}]],[1357,[{"start":28,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":116,"length":32,"messageText":"Cannot find module '@/oss/services/annotations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1704,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":4168,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":4365,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[1367,[{"start":60,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307},{"start":141,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[1386,[{"start":65,"length":52,"messageText":"Cannot find module '@/oss/components/EvalRunDetailsPage/state/evalType' or its corresponding type declarations.","category":1,"code":2307},{"start":146,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":248,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":348,"length":22,"messageText":"Cannot find module '@/oss/lib/tableUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":402,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1487,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006},{"start":1490,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006},{"start":3454,"length":1,"messageText":"Parameter 'x' implicitly has an 'any' type.","category":1,"code":7006},{"start":4689,"length":1,"messageText":"Parameter 'x' implicitly has an 'any' type.","category":1,"code":7006}]],[4419,[{"start":266,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useEvalScenarioQueue' or its corresponding type declarations.","category":1,"code":2307},{"start":2270,"length":3,"code":2339,"category":1,"messageText":"Property 'key' does not exist on type 'IInvocationStep'."},{"start":2394,"length":3,"code":2339,"category":1,"messageText":"Property 'key' does not exist on type 'IInvocationStep'."},{"start":2517,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'IInvocationStep'."}]],[4422,[{"start":100,"length":70,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/components/common/renderChatMessages' or its corresponding type declarations.","category":1,"code":2307},{"start":208,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/traceUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":278,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":360,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/migrationHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":463,"length":61,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/useEvalRunScenarioData' or its corresponding type declarations.","category":1,"code":2307}]],[4423,[{"start":58,"length":38,"messageText":"Cannot find module '@/oss/components/Common/ImagePreview' or its corresponding type declarations.","category":1,"code":2307},{"start":130,"length":101,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect' or its corresponding type declarations.","category":1,"code":2307},{"start":257,"length":53,"messageText":"Cannot find module '@/oss/components/Playground/Components/SharedEditor' or its corresponding type declarations.","category":1,"code":2307}]],[4425,[{"start":175,"length":60,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/TraceSidePanel' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":41,"messageText":"Cannot find module '@/oss/lib/helpers/observability_helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":387,"length":32,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations' or its corresponding type declarations.","category":1,"code":2307},{"start":460,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":558,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":738,"length":32,"messageText":"Cannot find module '@/oss/components/GenericDrawer' or its corresponding type declarations.","category":1,"code":2307},{"start":820,"length":58,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/TraceContent' or its corresponding type declarations.","category":1,"code":2307},{"start":924,"length":57,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/TraceHeader' or its corresponding type declarations.","category":1,"code":2307},{"start":1023,"length":55,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/TraceTree' or its corresponding type declarations.","category":1,"code":2307},{"start":1525,"length":4,"messageText":"Parameter 'node' implicitly has an 'any' type.","category":1,"code":7006},{"start":1942,"length":4,"messageText":"Parameter 'node' implicitly has an 'any' type.","category":1,"code":7006},{"start":2976,"length":27,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554},{"start":3103,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '{ open: boolean; onClose: () => void; expandable: true; headerExtra: Element | null; mainContent: Element | null; sideContent: Element | null; extraContent: any; externalKey: string; className: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'open' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":3301,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ activeTrace: any; traces: _AgentaRootsResponse[]; setSelectedTraceId: () => void; activeTraceIndex: number; setIsAnnotationsSectionOpen: Dispatch>; isAnnotationsSectionOpen: boolean; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'activeTrace' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":3839,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ activeTrace: any; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'activeTrace' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":4082,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ activeTrace: _AgentaRootsResponse; selected: string; setSelected: Dispatch>; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'activeTrace' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[4426,[{"start":376,"length":41,"messageText":"Cannot find module '@/oss/lib/helpers/observability_helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":468,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":545,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":620,"length":32,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations' or its corresponding type declarations.","category":1,"code":2307},{"start":1123,"length":4,"messageText":"Parameter 'node' implicitly has an 'any' type.","category":1,"code":7006},{"start":1458,"length":4,"messageText":"Parameter 'node' implicitly has an 'any' type.","category":1,"code":7006}]],[4427,[{"start":177,"length":64,"messageText":"Cannot find module '@/oss/components/pages/observability/components/StatusRenderer' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":38,"messageText":"Cannot find module '@/oss/components/ResultTag/ResultTag' or its corresponding type declarations.","category":1,"code":2307},{"start":365,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":440,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[4428,[{"start":344,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307},{"start":426,"length":31,"messageText":"Cannot find module '@/oss/hooks/useResizeObserver' or its corresponding type declarations.","category":1,"code":2307},{"start":484,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/traceUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":979,"length":53,"messageText":"Cannot find module '@/oss/components/Playground/Components/SharedEditor' or its corresponding type declarations.","category":1,"code":2307},{"start":3329,"length":4,"messageText":"Parameter 'rect' implicitly has an 'any' type.","category":1,"code":7006},{"start":3335,"length":7,"messageText":"Parameter 'element' implicitly has an 'any' type.","category":1,"code":7006},{"start":4149,"length":3,"code":2322,"category":1,"messageText":{"messageText":"Type 'ForwardedRef' is not assignable to type 'Ref | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'RefObject' is not assignable to type 'Ref | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'RefObject' is not assignable to type 'RefObject'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'HTMLDivElement | null'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/index.d.ts","start":9740,"length":3,"messageText":"The expected type comes from property 'ref' which is declared here on type 'DetailedHTMLProps, HTMLDivElement>'","category":3,"code":6500}]},{"start":7390,"length":3,"code":2339,"category":1,"messageText":"Property 'key' does not exist on type 'IInputStep'."},{"start":9750,"length":12,"code":2322,"category":1,"messageText":{"messageText":"Type '{ handleChange: () => void; initialValue: string; editorType: string; placeholder: string; disabled: true; editorClassName: string; editorProps: { enableResize: boolean; }; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'handleChange' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":12065,"length":12,"code":2322,"category":1,"messageText":{"messageText":"Type '{ handleChange: () => void; initialValue: string | object | undefined; editorProps: { codeOnly: boolean; }; editorType: string; disabled: true; editorClassName: string; error: boolean; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'handleChange' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":3078,"length":32,"code":2578,"category":1,"messageText":"Unused '@ts-expect-error' directive."}]],[4429,[{"start":210,"length":30,"messageText":"Cannot find module '@/oss/lib/atoms/virtualTable' or its corresponding type declarations.","category":1,"code":2307},{"start":269,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[4431,[{"start":200,"length":34,"messageText":"Cannot find module '@/oss/lib/constants/statusLabels' or its corresponding type declarations.","category":1,"code":2307}]],[4433,[{"start":64,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/traceUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":162,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":363,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":4682,"length":152,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"The last overload gave the following error.","category":1,"code":2770,"next":[{"messageText":"Argument of type '{ scenarioId: string; result: any; }' is not assignable to parameter of type 'Attributes & Props'.","category":1,"code":2345,"next":[{"messageText":"Property 'runId' is missing in type '{ scenarioId: string; result: any; }' but required in type 'Props'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ scenarioId: string; result: any; }' is not assignable to type 'Props'."}}]}]}]},"relatedInformation":[{"file":"./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/statuscell.tsx","start":190,"length":5,"messageText":"'runId' is declared here.","category":3,"code":2728},{"file":"./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/index.d.ts","start":15936,"length":13,"messageText":"The last overload is declared here.","category":1,"code":2771}]},{"start":12857,"length":1,"messageText":"'c' is of type 'unknown'.","category":1,"code":18046},{"start":12865,"length":1,"messageText":"'c' is of type 'unknown'.","category":1,"code":18046}]],[5270,[{"start":191,"length":36,"messageText":"Cannot find module '@/oss/components/ui/LabelValuePill' or its corresponding type declarations.","category":1,"code":2307},{"start":269,"length":61,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/scenarios' or its corresponding type declarations.","category":1,"code":2307},{"start":2416,"length":12,"messageText":"'loadableData' is of type 'unknown'.","category":1,"code":18046},{"start":2451,"length":12,"messageText":"'loadableData' is of type 'unknown'.","category":1,"code":18046}]],[5271,[{"start":96,"length":76,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":200,"length":36,"messageText":"Cannot find module '@/oss/components/ui/LabelValuePill' or its corresponding type declarations.","category":1,"code":2307},{"start":275,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307}]],[5272,[{"start":164,"length":63,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover' or its corresponding type declarations.","category":1,"code":2307},{"start":288,"length":76,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":424,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307},{"start":1190,"length":18,"messageText":"Property 'hidePrimitiveTable' does not exist on type 'MetricCellProps'.","category":1,"code":2339}]],[5274,[{"start":133,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":279,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307},{"start":379,"length":24,"messageText":"Cannot find module '@/oss/lib/metricSorter' or its corresponding type declarations.","category":1,"code":2307},{"start":472,"length":23,"messageText":"Cannot find module '@/oss/lib/metricUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":1167,"length":52,"messageText":"Cannot find module '@/oss/components/EvalRunDetailsPage/state/evalType' or its corresponding type declarations.","category":1,"code":2307},{"start":1290,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":2301,"length":3,"messageText":"Parameter 'row' implicitly has an 'any' type.","category":1,"code":7006},{"start":5364,"length":9,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '(k: string) => void'.","category":1,"code":2345,"next":[{"messageText":"Type 'Record' provides no match for the signature '(k: string): void'.","category":1,"code":2658}]}},{"start":8537,"length":9,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '(k: string) => void'.","category":1,"code":2345,"next":[{"messageText":"Type 'Record' provides no match for the signature '(k: string): void'.","category":1,"code":2658}]}},{"start":8898,"length":9,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record' is not assignable to parameter of type '(k: string) => void'.","category":1,"code":2345,"next":[{"messageText":"Type 'Record' provides no match for the signature '(k: string): void'.","category":1,"code":2658}]}},{"start":10219,"length":17,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | undefined' is not assignable to type 'string'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'string'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/evaluationcell.tsx","start":144,"length":17,"messageText":"The expected type comes from property 'evaluationRunName' which is declared here on type 'IntrinsicAttributes & { evaluationRunName: string; }'","category":3,"code":6500}]},{"start":10608,"length":10,"code":2741,"category":1,"messageText":"Property 'runId' is missing in type '{ scenarioId: string; result: string | undefined; }' but required in type 'Props'.","relatedInformation":[{"file":"./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/statuscell.tsx","start":190,"length":5,"messageText":"'runId' is declared here.","category":3,"code":2728}],"canonicalHead":{"code":2322,"messageText":"Type '{ scenarioId: string; result: string | undefined; }' is not assignable to type 'Props'."}},{"start":16656,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type 'boolean | undefined' is not assignable to type 'boolean'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'boolean'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./ee/src/components/evalrundetails/components/virtualizedscenariotable/assets/cellcomponents.tsx","start":10717,"length":10,"messageText":"The expected type comes from property 'isSkeleton' which is declared here on type 'IntrinsicAttributes & { isSkeleton: boolean; scenarioId: string; stepKey: string; path: string; runId?: string | undefined; }'","category":3,"code":6500}]},{"start":18539,"length":1,"messageText":"'a' is possibly 'null'.","category":1,"code":18047},{"start":18541,"length":4,"code":2339,"category":1,"messageText":{"messageText":"Property 'name' does not exist on type 'ColumnsType | { render: (_: any, record: TableRow) => Element; width: any; minWidth: any; fixed: string; title: Element; dataIndex: any; key: any; children?: undefined; align?: undefined; } | ... 8 more ... | { ...; }'.","category":1,"code":2339,"next":[{"messageText":"Property 'name' does not exist on type 'ColumnsType'.","category":1,"code":2339}]}},{"start":18561,"length":1,"messageText":"'b' is possibly 'null'.","category":1,"code":18047},{"start":18563,"length":4,"code":2339,"category":1,"messageText":{"messageText":"Property 'name' does not exist on type 'ColumnsType | { render: (_: any, record: TableRow) => Element; width: any; minWidth: any; fixed: string; title: Element; dataIndex: any; key: any; children?: undefined; align?: undefined; } | ... 8 more ... | { ...; }'.","category":1,"code":2339,"next":[{"messageText":"Property 'name' does not exist on type 'ColumnsType'.","category":1,"code":2339}]}}]],[5276,[{"start":330,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":406,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":761,"length":27,"messageText":"Object is of type 'unknown'.","category":1,"code":2571},{"start":992,"length":3,"messageText":"'evs' is of type 'unknown'.","category":1,"code":18046},{"start":1004,"length":3,"messageText":"Parameter 'acc' implicitly has an 'any' type.","category":1,"code":7006},{"start":1009,"length":2,"messageText":"Parameter 'ev' implicitly has an 'any' type.","category":1,"code":7006},{"start":1278,"length":10,"messageText":"'metricInfo' is of type 'unknown'.","category":1,"code":18046}]],[5284,[{"start":83,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5285,[{"start":62,"length":45,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":161,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":204,"length":37,"messageText":"Cannot find module '@/oss/services/runMetrics/api/types' or its corresponding type declarations.","category":1,"code":2307}]],[5286,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5289,[{"start":6390,"length":6,"code":2322,"category":1,"messageText":"Type 'string[]' is not assignable to type 'string'."}]],[5290,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5291,[{"start":127,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":239,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":284,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[5293,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5295,[{"start":50,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5296,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5298,[{"start":26,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5302,[{"start":114,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307}]],[5306,[{"start":45,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":107,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5320,[{"start":291,"length":58,"messageText":"Cannot find module '@/oss/components/Editor/plugins/code/tryParsePartialJson' or its corresponding type declarations.","category":1,"code":2307},{"start":376,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":1169,"length":20,"code":2741,"category":1,"messageText":"Property '[EvaluationType.human]' is missing in type '{ auto_exact_match: string; auto_similarity_match: string; auto_ai_critique: string; human_a_b_testing: string; human_scoring: string; custom_code_run: string; auto_regex_test: string; ... 6 more ...; rag_context_relevancy: string; }' but required in type 'Record'.","canonicalHead":{"code":2322,"messageText":"Type '{ auto_exact_match: string; auto_similarity_match: string; auto_ai_critique: string; human_a_b_testing: string; human_scoring: string; custom_code_run: string; auto_regex_test: string; ... 6 more ...; rag_context_relevancy: string; }' is not assignable to type 'Record'."}}]],[5323,[{"start":562,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":633,"length":64,"messageText":"Cannot find module '@/oss/components/pages/evaluations/cellRenderers/cellRenderers' or its corresponding type declarations.","category":1,"code":2307},{"start":796,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":856,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307}]],[5324,[{"start":181,"length":9,"messageText":"Cannot find module 'blakejs' or its corresponding type declarations.","category":1,"code":2307}]],[5325,[{"start":28,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307}]],[5377,[{"start":204,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":276,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":355,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":409,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307}]],[5381,[{"start":27,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":74,"length":40,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper/dayjs' or its corresponding type declarations.","category":1,"code":2307},{"start":139,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":185,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1677,"length":3,"messageText":"Parameter 'app' implicitly has an 'any' type.","category":1,"code":7006}]],[5382,[{"start":132,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":202,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":808,"length":12,"code":2345,"category":1,"messageText":"Argument of type '(draft: any) => void' is not assignable to parameter of type 'never'."},{"start":809,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006},{"start":1027,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":1338,"length":4,"code":2339,"category":1,"messageText":"Property 'meta' does not exist on type 'ScenarioResponse'."},{"start":1493,"length":12,"code":2345,"category":1,"messageText":"Argument of type '(draft: any) => void' is not assignable to parameter of type 'never'."},{"start":1494,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006},{"start":1683,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006}]],[5383,[{"start":60,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":113,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":166,"length":40,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper/dayjs' or its corresponding type declarations.","category":1,"code":2307},{"start":240,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":354,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307},{"start":434,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":493,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":621,"length":45,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":693,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":758,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":860,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":973,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":4856,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006}]],[5385,[{"start":147,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":208,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":259,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":323,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":376,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":429,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":501,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":554,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":594,"length":25,"messageText":"Cannot find module '@/oss/lib/utils/slugify' or its corresponding type declarations.","category":1,"code":2307},{"start":660,"length":35,"messageText":"Cannot find module '@/oss/services/evaluationRuns/api' or its corresponding type declarations.","category":1,"code":2307},{"start":735,"length":41,"messageText":"Cannot find module '@/oss/services/evaluationRuns/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":803,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":6058,"length":2,"messageText":"Parameter 'tc' implicitly has an 'any' type.","category":1,"code":7006},{"start":6121,"length":3,"messageText":"Parameter '_id' implicitly has an 'any' type.","category":1,"code":7006},{"start":6126,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":12753,"length":8,"messageText":"Property 'repeatId' does not exist on type '{ testcaseId: any; scenarioId: string; hashId: string; }'.","category":1,"code":2339},{"start":12763,"length":12,"messageText":"Property 'retryIdInput' does not exist on type '{ testcaseId: any; scenarioId: string; hashId: string; }'.","category":1,"code":2339},{"start":13497,"length":2,"messageText":"Parameter 'ev' implicitly has an 'any' type.","category":1,"code":7006},{"start":14091,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":14548,"length":3,"messageText":"Parameter 'err' implicitly has an 'any' type.","category":1,"code":7006}]],[5386,[{"start":93,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":149,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":206,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":301,"length":38,"messageText":"Cannot find module '@/oss/services/human-evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":398,"length":38,"messageText":"Cannot find module '@/oss/services/human-evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":494,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":3331,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":3334,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006},{"start":3783,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006},{"start":3791,"length":2,"messageText":"Parameter 'ix' implicitly has an 'any' type.","category":1,"code":7006},{"start":4644,"length":10,"messageText":"Parameter 'evaluation' implicitly has an 'any' type.","category":1,"code":7006},{"start":4964,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":4967,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006},{"start":6608,"length":4,"code":2339,"category":1,"messageText":"Property 'data' does not exist on type 'EnrichedEvaluationRun'."},{"start":6651,"length":4,"messageText":"Parameter 'step' implicitly has an 'any' type.","category":1,"code":7006},{"start":6900,"length":3,"messageText":"Parameter 'run' implicitly has an 'any' type.","category":1,"code":7006},{"start":7194,"length":4,"code":2339,"category":1,"messageText":"Property 'data' does not exist on type 'EnrichedEvaluationRun'."},{"start":7238,"length":4,"messageText":"Parameter 'step' implicitly has an 'any' type.","category":1,"code":7006},{"start":7486,"length":3,"messageText":"Parameter 'run' implicitly has an 'any' type.","category":1,"code":7006},{"start":9055,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":9112,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[5388,[{"start":143,"length":56,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/assets/annotationUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":328,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":384,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":437,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":549,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":684,"length":24,"messageText":"Cannot find module '@/oss/lib/hooks/useJWT' or its corresponding type declarations.","category":1,"code":2307},{"start":740,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":780,"length":25,"messageText":"Cannot find module '@/oss/lib/utils/slugify' or its corresponding type declarations.","category":1,"code":2307},{"start":870,"length":36,"messageText":"Cannot find module '@/oss/lib/workers/evalRunner/types' or its corresponding type declarations.","category":1,"code":2307},{"start":7784,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":7846,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006}]],[5389,[{"start":207,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":258,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":328,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":390,"length":52,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/assets/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":551,"length":38,"messageText":"Cannot find module '@/oss/services/human-evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":617,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":704,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1011,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1071,"length":52,"messageText":"Cannot find module '@/oss/components/EvalRunDetailsPage/state/evalType' or its corresponding type declarations.","category":1,"code":2307},{"start":1520,"length":4,"messageText":"Parameter 'data' implicitly has an 'any' type.","category":1,"code":7006},{"start":3253,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006},{"start":4506,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006},{"start":4843,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006},{"start":5017,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006},{"start":6596,"length":5,"messageText":"Parameter 'draft' implicitly has an 'any' type.","category":1,"code":7006}]],[5391,[{"start":18,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":531,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006}]],[5392,[{"start":92,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":244,"length":31,"messageText":"Cannot find module '@/oss/services/runMetrics/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1371,"length":6,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'string | string[]' is not assignable to parameter of type 'string'.","category":1,"code":2345,"next":[{"messageText":"Type 'string[]' is not assignable to type 'string'.","category":1,"code":2322}]}}]],[5393,[{"start":44,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":114,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":191,"length":31,"messageText":"Cannot find module '@/oss/services/runMetrics/api' or its corresponding type declarations.","category":1,"code":2307},{"start":248,"length":37,"messageText":"Cannot find module '@/oss/services/runMetrics/api/types' or its corresponding type declarations.","category":1,"code":2307}]],[5395,[{"start":257,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":336,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/transformer' or its corresponding type declarations.","category":1,"code":2307},{"start":421,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":488,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":666,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307},{"start":752,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":861,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":954,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":1030,"length":61,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/transformToRequestBody' or its corresponding type declarations.","category":1,"code":2307},{"start":1127,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1223,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":10181,"length":5,"messageText":"Parameter 'param' implicitly has an 'any' type.","category":1,"code":7006},{"start":13632,"length":9,"messageText":"Cannot find name 'TraceData'.","category":1,"code":2304}]],[5396,[{"start":378,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":433,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":634,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307},{"start":5074,"length":2,"messageText":"Parameter 'st' implicitly has an 'any' type.","category":1,"code":7006}]],[5397,[{"start":209,"length":81,"messageText":"Cannot find module '@/agenta-oss-common/lib/hooks/useEvaluationRunData/assets/helpers/buildRunIndex' or its corresponding type declarations.","category":1,"code":2307},{"start":348,"length":67,"messageText":"Cannot find module '@/agenta-oss-common/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307}]],[5399,[{"start":31,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5400,[{"start":243,"length":40,"messageText":"Cannot find module '@/oss/services/evaluations/workerUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":339,"length":31,"messageText":"Cannot find module '@/oss/services/runMetrics/api' or its corresponding type declarations.","category":1,"code":2307},{"start":4216,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":4283,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":4349,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":4418,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":5146,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":5213,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":5279,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":5348,"length":5,"messageText":"'stats' is of type 'unknown'.","category":1,"code":18046},{"start":6788,"length":6,"code":2339,"category":1,"messageText":"Property 'detail' does not exist on type 'BaseResponse'."},{"start":6947,"length":6,"code":2339,"category":1,"messageText":"Property 'detail' does not exist on type '{ version?: string | null | undefined; data: string | { [x: string]: any; }; tree?: { version: string; nodes: any[]; count?: number | null | undefined; } | undefined; trace?: { traceId: string; cost?: number | undefined; latency?: number | undefined; usage: { ...; }; spans?: { ...; }[] | undefined; } | undefined; }'."},{"start":6998,"length":6,"code":2339,"category":1,"messageText":"Property 'detail' does not exist on type '{ version?: string | null | undefined; data: string | { [x: string]: any; }; tree?: { version: string; nodes: any[]; count?: number | null | undefined; } | undefined; trace?: { traceId: string; cost?: number | undefined; latency?: number | undefined; usage: { ...; }; spans?: { ...; }[] | undefined; } | undefined; }'."},{"start":8117,"length":8,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'endpoint' does not exist in type 'ResultMessage'."}]],[5401,[{"start":329,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/casing' or its corresponding type declarations.","category":1,"code":2307},{"start":3719,"length":31,"messageText":"Cannot find module '@/oss/services/runMetrics/api' or its corresponding type declarations.","category":1,"code":2307}]],[5404,[{"start":435,"length":49,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios/types' or its corresponding type declarations.","category":1,"code":2307}]],[5405,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":234,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307}]],[5407,[{"start":27,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":95,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":182,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":454,"length":7,"messageText":"Cannot find name 'testset'. Did you mean 'Testset'?","category":1,"code":2552,"canonicalHead":{"code":2304,"messageText":"Cannot find name 'testset'."}}]],[5408,[{"start":38,"length":78,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms' or its corresponding type declarations.","category":1,"code":2307},{"start":144,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":212,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":279,"length":25,"messageText":"Cannot find module '@/oss/lib/utils/slugify' or its corresponding type declarations.","category":1,"code":2307},{"start":646,"length":4,"code":2339,"category":1,"messageText":"Property 'name' does not exist on type 'Testset'."},{"start":698,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'Testset'."},{"start":829,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'Testset'."},{"start":3754,"length":4,"code":2339,"category":1,"messageText":"Property 'name' does not exist on type 'Testset'."},{"start":3806,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type 'Testset'."}]],[5409,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":111,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5411,[{"start":102,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":153,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":215,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/colors' or its corresponding type declarations.","category":1,"code":2307},{"start":273,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":346,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":565,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":981,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":7288,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":8133,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":9505,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":10138,"length":6,"messageText":"Parameter 'config' implicitly has an 'any' type.","category":1,"code":7006},{"start":10286,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006}]],[5412,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5413,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":163,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":211,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":427,"length":24,"messageText":"Cannot find module '@/oss/lib/transformers' or its corresponding type declarations.","category":1,"code":2307},{"start":608,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1534,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006},{"start":1542,"length":2,"messageText":"Parameter 'ix' implicitly has an 'any' type.","category":1,"code":7006},{"start":1805,"length":10,"messageText":"Parameter 'evaluation' implicitly has an 'any' type.","category":1,"code":7006},{"start":2775,"length":10,"messageText":"Parameter 'evaluation' implicitly has an 'any' type.","category":1,"code":7006},{"start":2831,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":2834,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006},{"start":3208,"length":12,"messageText":"Parameter 'responseData' implicitly has an 'any' type.","category":1,"code":7006},{"start":4112,"length":12,"messageText":"Parameter 'responseData' implicitly has an 'any' type.","category":1,"code":7006}]],[5414,[{"start":100,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":163,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5418,[{"start":49,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":178,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307}]],[5419,[{"start":228,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":279,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":346,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":416,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":547,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307},{"start":1553,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":1559,"length":2,"messageText":"Parameter 'ix' implicitly has an 'any' type.","category":1,"code":7006},{"start":2515,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3545,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3900,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":4909,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[5420,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5423,[{"start":18953,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type 'BasicStats' is not assignable to type 'MetricDistribution'.","category":1,"code":2322,"next":[{"messageText":"Types of property 'distribution' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type '{ value: number; count: number; }[] | undefined' is not assignable to type '{ value: number; count: number; }[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type '{ value: number; count: number; }[]'.","category":1,"code":2322}],"canonicalHead":{"code":2322,"messageText":"Type 'BasicStats' is not assignable to type 'MetricDistribution'."}}]}]}}]],[5424,[{"start":288,"length":62,"messageText":"Cannot find module '../../../../../oss/src/lib/hooks/usePreviewEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1782,"length":3,"messageText":"Parameter 'app' implicitly has an 'any' type.","category":1,"code":7006}]],[5429,[{"start":267,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5431,[{"start":105,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5437,[{"start":52,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":136,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":218,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307}]],[5442,[{"start":290,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5444,[{"start":95,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5446,[{"start":52,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":136,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":218,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307}]],[5450,[{"start":281,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[5452,[{"start":120,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3554,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006}]],[5455,[{"start":327,"length":45,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":408,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5458,[{"start":21,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307}]],[5459,[{"start":21,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307}]],[5465,[{"start":21,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5466,[{"start":21,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5467,[{"start":65,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5468,[{"start":21,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5469,[{"start":21,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5470,[{"start":65,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5474,[{"start":212,"length":10,"messageText":"Property 'skipHandle' does not exist on type 'Pick'.","category":1,"code":2339},{"start":1014,"length":9,"messageText":"'container' is possibly 'null'.","category":1,"code":18047},{"start":1437,"length":9,"messageText":"'container' is possibly 'null'.","category":1,"code":18047},{"start":1501,"length":9,"messageText":"'container' is possibly 'null'.","category":1,"code":18047}]],[5479,[{"start":6643,"length":17,"messageText":"Expected 0 type arguments, but got 1.","category":1,"code":2558}]],[5480,[{"start":1491,"length":7,"messageText":"Property '__index' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[5511,[{"start":1253,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'boolean | undefined' is not assignable to parameter of type 'boolean'.","category":1,"code":2345,"next":[{"messageText":"Type 'undefined' is not assignable to type 'boolean'.","category":1,"code":2322}]}}]],[5513,[{"start":14691,"length":25,"messageText":"Expected 1-2 arguments, but got 4.","category":1,"code":2554},{"start":14706,"length":10,"messageText":"Cannot find name 'jsonString'. Did you mean 'toString'?","category":1,"code":2552,"canonicalHead":{"code":2304,"messageText":"Cannot find name 'jsonString'."},"relatedInformation":[{"file":"./node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","start":1335190,"length":8,"messageText":"'toString' is declared here.","category":3,"code":2728}]}]],[5522,[{"start":3186,"length":24,"messageText":"Expected 4-5 arguments, but got 1.","category":1,"code":2554,"relatedInformation":[{"file":"./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","start":7001,"length":21,"messageText":"An argument for 'highlightType' was not provided.","category":3,"code":6210}]},{"start":3767,"length":24,"messageText":"Expected 4-5 arguments, but got 1.","category":1,"code":2554,"relatedInformation":[{"file":"./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","start":7001,"length":21,"messageText":"An argument for 'highlightType' was not provided.","category":3,"code":6210}]},{"start":5379,"length":1,"messageText":"Parameter 'l' implicitly has an 'any' type.","category":1,"code":7006},{"start":5593,"length":1,"messageText":"Parameter 'l' implicitly has an 'any' type.","category":1,"code":7006},{"start":5830,"length":1,"messageText":"Parameter 'l' implicitly has an 'any' type.","category":1,"code":7006},{"start":5889,"length":1,"messageText":"Parameter 'l' implicitly has an 'any' type.","category":1,"code":7006},{"start":8706,"length":1,"messageText":"Parameter 'l' implicitly has an 'any' type.","category":1,"code":7006},{"start":8709,"length":1,"messageText":"Parameter 'i' implicitly has an 'any' type.","category":1,"code":7006},{"start":11355,"length":24,"messageText":"Expected 4-5 arguments, but got 2.","category":1,"code":2554,"relatedInformation":[{"file":"./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","start":7028,"length":27,"messageText":"An argument for 'hasValidationError' was not provided.","category":3,"code":6210}]}]],[5528,[{"start":101,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":280,"length":9,"messageText":"Property 'themeMode' does not exist on type 'StyleProps'.","category":1,"code":2339},{"start":1343,"length":9,"messageText":"Property 'themeMode' does not exist on type 'StyleProps'.","category":1,"code":2339}]],[5529,[{"start":26,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":91,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":564,"length":35,"code":2322,"category":1,"messageText":"Type 'unknown' is not assignable to type 'string'."}]],[5531,[{"start":53,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307}]],[5532,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5533,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5534,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5535,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5536,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5537,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5538,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5539,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5540,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5541,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5543,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5544,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5548,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5550,[{"start":158,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307}]],[5557,[{"start":99,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":160,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":218,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307}]],[5558,[{"start":70,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":164,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":4512,"length":12,"code":2741,"category":1,"messageText":"Property 'appType' is missing in type '{ variants: never[]; selected: never[]; uri: undefined; dirtyStates: {}; fetching: false; availableRevisions: never[]; appStatus: false; generationData: InitialStateType[\"generationData\"]; }' but required in type 'InitialStateType'.","relatedInformation":[{"file":"./oss/src/lib/hooks/usestatelessvariants/state/types.d.ts","start":1598,"length":7,"messageText":"'appType' is declared here.","category":3,"code":2728}],"canonicalHead":{"code":2322,"messageText":"Type '{ variants: never[]; selected: never[]; uri: undefined; dirtyStates: {}; fetching: false; availableRevisions: never[]; appStatus: false; generationData: InitialStateType[\"generationData\"]; }' is not assignable to type 'InitialStateType'."}}]],[5559,[{"start":68,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":116,"length":40,"messageText":"Cannot find module '@/oss/lib/shared/variant/types/openapi' or its corresponding type declarations.","category":1,"code":2307}]],[5560,[{"start":119,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":164,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":246,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":32,"messageText":"Cannot find module '@/oss/lib/shared/variant/types' or its corresponding type declarations.","category":1,"code":2307}]],[5565,[{"start":2070,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '(StringMetadata | ObjectMetadata | { label: string; value: string; config: { type: string; }; })[]' is not assignable to type 'CompoundOption[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'StringMetadata | ObjectMetadata | { label: string; value: string; config: { type: string; }; }' is not assignable to type 'CompoundOption'.","category":1,"code":2322,"next":[{"messageText":"Type 'StringMetadata' is missing the following properties from type 'CompoundOption': config, value, label","category":1,"code":2739,"canonicalHead":{"code":2322,"messageText":"Type 'StringMetadata' is not assignable to type 'CompoundOption'."}}]}]},"relatedInformation":[{"file":"./oss/src/lib/shared/variant/generictransformer/types/metadata.d.ts","start":1170,"length":7,"messageText":"The expected type comes from property 'options' which is declared here on type 'CompoundMetadata'","category":3,"code":6500}]},{"start":2728,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type '{ title: string | undefined; description: string | undefined; nullable: boolean; isInteger?: boolean | undefined; pattern?: string | undefined; format?: string | undefined; max?: number | undefined; min?: number | undefined; type: \"string\" | ... 4 more ... | \"compound\"; options: SelectOptions | undefined; }' is not assignable to type 'ConfigMetadata'.","category":1,"code":2322,"next":[{"messageText":"Type '{ title: string | undefined; description: string | undefined; nullable: boolean; isInteger?: boolean | undefined; pattern?: string | undefined; format?: string | undefined; max?: number | undefined; min?: number | undefined; type: \"string\" | ... 4 more ... | \"compound\"; options: SelectOptions | undefined; }' is not assignable to type 'NumberMetadata'.","category":1,"code":2322,"next":[{"messageText":"Types of property 'type' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type '\"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"compound\"' is not assignable to type '\"number\"'.","category":1,"code":2322,"next":[{"messageText":"Type '\"string\"' is not assignable to type '\"number\"'.","category":1,"code":2322}],"canonicalHead":{"code":2322,"messageText":"Type '{ title: string | undefined; description: string | undefined; nullable: boolean; isInteger?: boolean | undefined; pattern?: string | undefined; format?: string | undefined; max?: number | undefined; min?: number | undefined; type: \"string\" | ... 4 more ... | \"compound\"; options: SelectOptions | undefined; }' is not assignable to type 'NumberMetadata'."}}]}]}]}},{"start":3661,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ label: string; value: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"compound\"; config: ConfigMetadata; }[]' is not assignable to type 'CompoundOption[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ label: string; value: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"compound\"; config: ConfigMetadata; }' is not assignable to type 'CompoundOption'.","category":1,"code":2322,"next":[{"messageText":"Types of property 'config' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type 'ConfigMetadata' is not assignable to type '{ [key: string]: unknown; type: string; schema?: Record | undefined; }'.","category":1,"code":2322,"next":[{"messageText":"Type 'StringMetadata' is not assignable to type '{ [key: string]: unknown; type: string; schema?: Record | undefined; }'.","category":1,"code":2322,"next":[{"messageText":"Index signature for type 'string' is missing in type 'StringMetadata'.","category":1,"code":2329}]}],"canonicalHead":{"code":2322,"messageText":"Type '{ label: string; value: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"compound\"; config: ConfigMetadata; }' is not assignable to type 'CompoundOption'."}}]}]}]}}]],[5566,[{"start":2265,"length":24,"messageText":"'createObjectFromMetadata' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions.","category":1,"code":7023},{"start":3994,"length":11,"messageText":"'defaultItem' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.","category":1,"code":7022},{"start":4717,"length":15,"messageText":"'selectedPayload' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.","category":1,"code":7022}]],[5568,[{"start":26,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":954,"length":3,"messageText":"Expected 1 arguments, but got 2.","category":1,"code":2554},{"start":5874,"length":14,"messageText":"Function lacks ending return statement and return type does not include 'undefined'.","category":1,"code":2366}]],[5569,[{"start":38,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":3629,"length":4,"code":2322,"category":1,"messageText":"Type '\"function\"' is not assignable to type '\"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"compound\"'.","relatedInformation":[{"file":"./oss/src/lib/shared/variant/generictransformer/types/metadata.d.ts","start":343,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'ConfigMetadata'","category":3,"code":6500}]},{"start":5066,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'enum' does not exist in type 'StringMetadata'."},{"start":5342,"length":8,"code":2322,"category":1,"messageText":"Type 'string[]' is not assignable to type 'boolean | undefined'.","relatedInformation":[{"file":"./oss/src/lib/shared/variant/generictransformer/types/base.d.ts","start":72,"length":8,"messageText":"The expected type comes from property 'required' which is declared here on type 'ConfigMetadata'","category":3,"code":6500}]},{"start":6379,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '(T & object) | (T & null)' is not assignable to type 'EnhancedArrayValue | EnhancedObjectConfig | EnhancedConfigValue'.","category":1,"code":2322,"next":[{"messageText":"Type 'T & object' is not assignable to type 'EnhancedArrayValue | EnhancedObjectConfig | EnhancedConfigValue'.","category":1,"code":2322,"next":[{"messageText":"Type '{}' is missing the following properties from type 'EnhancedConfigValue': value, __id, __metadata","category":1,"code":2739,"canonicalHead":{"code":2322,"messageText":"Type 'T & object' is not assignable to type 'EnhancedConfigValue'."}}]}]}},{"start":7235,"length":6,"code":2322,"category":1,"messageText":"Type 'T' is not assignable to type 'Enhanced'."},{"start":7989,"length":215,"code":2352,"category":1,"messageText":"Conversion of type '{ __id: any; __metadata: any; selected: string; value: EnhancedConfigValue[] | Enhanced | Enhanced | NonNullable; }' to type 'Enhanced' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first."}]],[5571,[{"start":33,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":102,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/assets/hash' or its corresponding type declarations.","category":1,"code":2307},{"start":7567,"length":13,"code":2339,"category":1,"messageText":"Property 'requestSchema' does not exist on type 'EnhancedVariant>'."}]],[5572,[{"start":46,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":121,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":255,"length":60,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/helpers/arrays' or its corresponding type declarations.","category":1,"code":2307},{"start":354,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":445,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/valueHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":1870,"length":10,"code":2339,"category":1,"messageText":{"messageText":"Property '__metadata' does not exist on type 'ConfigMetadata'.","category":1,"code":2339,"next":[{"messageText":"Property '__metadata' does not exist on type 'StringMetadata'.","category":1,"code":2339}]}},{"start":2437,"length":3,"messageText":"Parameter 'opt' implicitly has an 'any' type.","category":1,"code":7006},{"start":3116,"length":10,"code":2339,"category":1,"messageText":"Property '__metadata' does not exist on type 'any[]'."},{"start":5205,"length":3,"messageText":"Parameter 'opt' implicitly has an 'any' type.","category":1,"code":7006},{"start":6029,"length":6,"code":2339,"category":1,"messageText":"Property 'detail' does not exist on type '{ url: string; }'."},{"start":6574,"length":5,"code":2339,"category":1,"messageText":"Property 'value' does not exist on type '{}'."},{"start":6654,"length":10,"code":2339,"category":1,"messageText":"Property '__metadata' does not exist on type '{}'."},{"start":7573,"length":5,"code":2339,"category":1,"messageText":"Property 'value' does not exist on type '{}'."},{"start":7655,"length":10,"code":2339,"category":1,"messageText":{"messageText":"Property '__metadata' does not exist on type 'ConfigMetadata'.","category":1,"code":2339,"next":[{"messageText":"Property '__metadata' does not exist on type 'StringMetadata'.","category":1,"code":2339}]}},{"start":8111,"length":3,"messageText":"Parameter 'opt' implicitly has an 'any' type.","category":1,"code":7006},{"start":9173,"length":4,"code":2339,"category":1,"messageText":{"messageText":"Property '__id' does not exist on type 'string | number | boolean'.","category":1,"code":2339,"next":[{"messageText":"Property '__id' does not exist on type 'string'.","category":1,"code":2339}]}},{"start":9189,"length":10,"code":2339,"category":1,"messageText":{"messageText":"Property '__metadata' does not exist on type 'string | number | boolean'.","category":1,"code":2339,"next":[{"messageText":"Property '__metadata' does not exist on type 'string'.","category":1,"code":2339}]}},{"start":11209,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":11263,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."}]],[5573,[{"start":33,"length":63,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/assets/comparisonHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":127,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":202,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":301,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":366,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":1590,"length":11,"messageText":"'enhancedKey' is of type 'unknown'.","category":1,"code":18046},{"start":4873,"length":12,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'EnhancedObjectConfig' is not assignable to parameter of type 'Record | undefined'.","category":1,"code":2345,"next":[{"messageText":"Type 'EnhancedObjectConfig' is not assignable to type 'Record'.","category":1,"code":2322,"next":[{"messageText":"Index signature for type 'string' is missing in type 'Common & { role: EnhancedConfigValue; content: EnhancedConfigValue | EnhancedArrayValue<...>; name?: EnhancedConfigValue<...> | ... 1 more ... | undefined; toolCalls?: EnhancedConfigValue<...> | ... 1 more ... | undefined; toolCallId?: EnhancedConfigValue<...> | ... 1 more ... | undef...'.","category":1,"code":2329}]}]}},{"start":5908,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":5956,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":6325,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":6369,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."}]],[5574,[{"start":52,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":131,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":212,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":283,"length":40,"messageText":"Cannot find module '@/oss/lib/shared/variant/types/openapi' or its corresponding type declarations.","category":1,"code":2307},{"start":343,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5577,[{"start":158,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":225,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":289,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":361,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":436,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":544,"length":32,"messageText":"Cannot find module '@/oss/lib/shared/variant/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":596,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":2735,"length":7,"code":2339,"category":1,"messageText":"Property 'appType' does not exist on type 'Data'."},{"start":4801,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":7584,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006},{"start":7743,"length":3,"messageText":"Parameter 'msg' implicitly has an 'any' type.","category":1,"code":7006},{"start":8156,"length":19,"messageText":"Binding element '_remainingRevisions' implicitly has an 'any' type.","category":1,"code":7031},{"start":8177,"length":4,"messageText":"Binding element 'spec' implicitly has an 'any' type.","category":1,"code":7031},{"start":8408,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006},{"start":8734,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006},{"start":20100,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":22079,"length":3,"messageText":"Parameter 'err' implicitly has an 'any' type.","category":1,"code":7006}]],[5578,[{"start":134,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/assets/hash' or its corresponding type declarations.","category":1,"code":2307},{"start":210,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":265,"length":63,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/assets/comparisonHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":405,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":473,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":557,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307}]],[5579,[{"start":96,"length":36,"messageText":"Cannot find module '@/oss/components/AppMessageContext' or its corresponding type declarations.","category":1,"code":2307},{"start":159,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/assets/hash' or its corresponding type declarations.","category":1,"code":2307},{"start":235,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":299,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":12019,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006}]],[5582,[{"start":122,"length":36,"messageText":"Cannot find module '@/oss/components/AppMessageContext' or its corresponding type declarations.","category":1,"code":2307},{"start":199,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/assets/hash' or its corresponding type declarations.","category":1,"code":2307},{"start":275,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":336,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":486,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":570,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":635,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":700,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":776,"length":61,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/transformToRequestBody' or its corresponding type declarations.","category":1,"code":2307},{"start":880,"length":31,"messageText":"Cannot find module '@/oss/services/playground/api' or its corresponding type declarations.","category":1,"code":2307},{"start":8318,"length":6,"code":2339,"category":1,"messageText":"Property 'detail' does not exist on type '{}'."},{"start":10280,"length":8,"messageText":"Parameter 'toolCall' implicitly has an 'any' type.","category":1,"code":7006},{"start":13781,"length":38,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record | undefined' is not assignable to parameter of type 'string'.","category":1,"code":2345,"next":[{"messageText":"Type 'undefined' is not assignable to type 'string'.","category":1,"code":2322}]}},{"start":16184,"length":6,"code":2339,"category":1,"messageText":"Property 'detail' does not exist on type '{}'."},{"start":30005,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":30208,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":30211,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006}]],[5583,[{"start":120,"length":36,"messageText":"Cannot find module '@/oss/components/AppMessageContext' or its corresponding type declarations.","category":1,"code":2307},{"start":183,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/assets/hash' or its corresponding type declarations.","category":1,"code":2307},{"start":257,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":324,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":385,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":549,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":628,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":748,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":800,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":876,"length":61,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/transformToRequestBody' or its corresponding type declarations.","category":1,"code":2307},{"start":971,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1010,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":5440,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":5626,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":5629,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006},{"start":10311,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":11313,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":11440,"length":6,"messageText":"Parameter 'newRev' implicitly has an 'any' type.","category":1,"code":7006},{"start":12087,"length":8,"messageText":"Parameter 'revision' implicitly has an 'any' type.","category":1,"code":7006},{"start":14395,"length":6,"messageText":"Parameter 'newRev' implicitly has an 'any' type.","category":1,"code":7006},{"start":15328,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":15412,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":15415,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006}]],[5584,[{"start":108,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307}]],[5585,[{"start":156,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":217,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":1554,"length":3,"messageText":"Parameter 'app' implicitly has an 'any' type.","category":1,"code":7006}]],[5586,[{"start":3306,"length":10,"code":2678,"category":1,"messageText":"Type '\"function\"' is not comparable to type '\"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"compound\"'."},{"start":5344,"length":3,"code":2339,"category":1,"messageText":"Property 'map' does not exist on type '{}'."},{"start":5349,"length":4,"messageText":"Parameter 'tool' implicitly has an 'any' type.","category":1,"code":7006}]],[5587,[{"start":42,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":2919,"length":14,"messageText":"Parameter 'historyMessage' implicitly has an 'any' type.","category":1,"code":7006}]],[5588,[{"start":52,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":123,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":216,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":281,"length":40,"messageText":"Cannot find module '@/oss/lib/shared/variant/types/openapi' or its corresponding type declarations.","category":1,"code":2307}]],[5590,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5591,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5593,[{"start":71,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5594,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5595,[{"start":71,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5597,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5598,[{"start":21,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":75,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":119,"length":33,"messageText":"Cannot find module '@/oss/services/app-selector/api' or its corresponding type declarations.","category":1,"code":2307}]],[5599,[{"start":83,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5600,[{"start":71,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5601,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5602,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5603,[{"start":115,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[5604,[{"start":35,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2287,"length":5,"messageText":"Parameter 'child' implicitly has an 'any' type.","category":1,"code":7006}]],[5605,[{"start":31,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":92,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307}]],[5607,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5608,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5610,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5611,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5612,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5613,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5614,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5615,[{"start":71,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5616,[{"start":96,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307}]],[5618,[{"start":66,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5686,[{"start":117,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307}]],[5690,[{"start":71,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5698,[{"start":198,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":256,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307}]],[5700,[{"start":127,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307},{"start":181,"length":30,"messageText":"Cannot find module '@/oss/hooks/useStateCallback' or its corresponding type declarations.","category":1,"code":2307},{"start":239,"length":48,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/usePostHogAg' or its corresponding type declarations.","category":1,"code":2307},{"start":307,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":352,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1308,"length":7,"messageText":"Parameter 'profile' implicitly has an 'any' type.","category":1,"code":7006},{"start":1444,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006}]],[5701,[{"start":249,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":346,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":471,"length":26,"messageText":"Cannot find module '@/oss/services/vault/api' or its corresponding type declarations.","category":1,"code":2307},{"start":5741,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":6508,"length":6,"messageText":"Parameter 'secret' implicitly has an 'any' type.","category":1,"code":7006},{"start":6664,"length":6,"messageText":"Parameter 'secret' implicitly has an 'any' type.","category":1,"code":7006},{"start":7575,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006}]],[5712,[{"start":53,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5714,[{"start":36,"length":61,"messageText":"Cannot find module '@/oss/components/pages/observability/ObservabilityDashboard' or its corresponding type declarations.","category":1,"code":2307},{"start":178,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2472,"length":5,"messageText":"'value' is of type 'unknown'.","category":1,"code":18046},{"start":2564,"length":5,"messageText":"'value' is of type 'unknown'.","category":1,"code":18046},{"start":2632,"length":5,"messageText":"'value' is of type 'unknown'.","category":1,"code":18046}]],[5717,[{"start":70,"length":40,"messageText":"Cannot find module '@/oss/components/ChatInputs/ChatInputs' or its corresponding type declarations.","category":1,"code":2307}]],[5723,[{"start":135,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":206,"length":39,"messageText":"Cannot find module '@/oss/hooks/useIsomorphicLayoutEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":297,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5727,[{"start":173,"length":21,"messageText":"Cannot find module '@/oss/lib/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":230,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":306,"length":32,"messageText":"Cannot find module '@/oss/lib/shared/variant/types' or its corresponding type declarations.","category":1,"code":2307},{"start":402,"length":32,"messageText":"Cannot find module '@/oss/lib/shared/variant/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":3219,"length":7,"code":2339,"category":1,"messageText":"Property 'appType' does not exist on type 'PlaygroundSWRConfig'."},{"start":4808,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer' or its corresponding type declarations.","category":1,"code":2307},{"start":7902,"length":7,"code":2339,"category":1,"messageText":"Property 'appType' does not exist on type 'PlaygroundSWRConfig'."},{"start":12096,"length":7,"code":2339,"category":1,"messageText":"Property 'appType' does not exist on type 'PlaygroundSWRConfig'."},{"start":12345,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":12434,"length":8,"messageText":"Parameter 'revision' implicitly has an 'any' type.","category":1,"code":7006},{"start":45383,"length":7,"code":2339,"category":1,"messageText":"Property 'appType' does not exist on type 'PlaygroundSWRConfig'."},{"start":45896,"length":12,"messageText":"Parameter 'totalBatches' implicitly has an 'any' type.","category":1,"code":7006},{"start":46336,"length":12,"messageText":"Parameter 'batchResults' implicitly has an 'any' type.","category":1,"code":7006},{"start":46350,"length":4,"messageText":"Parameter 'spec' implicitly has an 'any' type.","category":1,"code":7006},{"start":46356,"length":3,"messageText":"Parameter 'uri' implicitly has an 'any' type.","category":1,"code":7006},{"start":46544,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":49359,"length":9,"messageText":"Binding element 'revisions' implicitly has an 'any' type.","category":1,"code":7031},{"start":49370,"length":4,"messageText":"Binding element 'spec' implicitly has an 'any' type.","category":1,"code":7031},{"start":49376,"length":3,"messageText":"Binding element 'uri' implicitly has an 'any' type.","category":1,"code":7031},{"start":52102,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006}]],[5731,[{"start":24,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":89,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5732,[{"start":51,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":112,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":179,"length":32,"messageText":"Cannot find module '@/oss/services/annotations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":769,"length":10,"messageText":"Parameter 'annotation' implicitly has an 'any' type.","category":1,"code":7006}]],[5733,[{"start":144,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":200,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":262,"length":27,"messageText":"Cannot find module '@/oss/services/evaluators' or its corresponding type declarations.","category":1,"code":2307}]],[5734,[{"start":114,"length":78,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms' or its corresponding type declarations.","category":1,"code":2307},{"start":218,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":293,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":359,"length":27,"messageText":"Cannot find module '@/oss/services/evaluators' or its corresponding type declarations.","category":1,"code":2307}]],[5735,[{"start":27,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/assets/hash' or its corresponding type declarations.","category":1,"code":2307},{"start":117,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":217,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":282,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":351,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":787,"length":6,"messageText":"Parameter 'prompt' implicitly has an 'any' type.","category":1,"code":7006}]],[5737,[{"start":195,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307}]],[5738,[{"start":76,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":127,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":180,"length":31,"messageText":"Cannot find module '@/oss/services/deployment/api' or its corresponding type declarations.","category":1,"code":2307},{"start":251,"length":37,"messageText":"Cannot find module '@/oss/services/promptVersioning/api' or its corresponding type declarations.","category":1,"code":2307},{"start":783,"length":12,"messageText":"Parameter 'environments' implicitly has an 'any' type.","category":1,"code":7006}]],[5825,[{"start":971,"length":8,"code":2551,"category":1,"messageText":"Property 'agConfig' does not exist on type 'VariantParameters'. Did you mean 'ag_config'?","relatedInformation":[{"file":"./oss/src/lib/shared/variant/transformer/types/variant.d.ts","start":756,"length":9,"messageText":"'ag_config' is declared here.","category":3,"code":2728}]},{"start":1064,"length":32,"code":7053,"category":1,"messageText":{"messageText":"Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'VariantParameters'.","category":1,"code":7053,"next":[{"messageText":"No index signature with a parameter of type 'string' was found on type 'VariantParameters'.","category":1,"code":7054}]}},{"start":1118,"length":6,"code":2339,"category":1,"messageText":"Property 'config' does not exist on type 'BaseVariant'."},{"start":1863,"length":18,"code":2322,"category":1,"messageText":{"messageText":"Type 'VariantParameters | AgentaConfig' is not assignable to type 'VariantParameters | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'AgentaConfig' has no properties in common with type 'VariantParameters'.","category":1,"code":2559}]}},{"start":4302,"length":8,"code":2551,"category":1,"messageText":"Property 'agConfig' does not exist on type 'VariantParameters'. Did you mean 'ag_config'?","relatedInformation":[{"file":"./oss/src/lib/shared/variant/transformer/types/variant.d.ts","start":756,"length":9,"messageText":"'ag_config' is declared here.","category":3,"code":2728}]},{"start":4437,"length":6,"code":2339,"category":1,"messageText":"Property 'config' does not exist on type 'EnhancedVariant>'."}]],[5826,[{"start":34,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":116,"length":40,"messageText":"Cannot find module '@/oss/lib/shared/variant/types/openapi' or its corresponding type declarations.","category":1,"code":2307},{"start":184,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5828,[{"start":84,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":138,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307}]],[5829,[{"start":35,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5831,[{"start":26,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307}]],[5832,[{"start":40,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5835,[{"start":107,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":158,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":217,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":270,"length":40,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper/dayjs' or its corresponding type declarations.","category":1,"code":2307},{"start":396,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/openapi_parser' or its corresponding type declarations.","category":1,"code":2307},{"start":472,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":623,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1146,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":6791,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006},{"start":6873,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006},{"start":7616,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006},{"start":7704,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006},{"start":8186,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006},{"start":8292,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006},{"start":9368,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006},{"start":9444,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006},{"start":9840,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006},{"start":9934,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006},{"start":10365,"length":5,"messageText":"Parameter 'param' implicitly has an 'any' type.","category":1,"code":7006},{"start":10784,"length":5,"messageText":"Parameter 'param' implicitly has an 'any' type.","category":1,"code":7006},{"start":10863,"length":5,"messageText":"Parameter 'param' implicitly has an 'any' type.","category":1,"code":7006},{"start":10965,"length":5,"messageText":"Parameter 'param' implicitly has an 'any' type.","category":1,"code":7006}]],[5836,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2108,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006}]],[5837,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5840,[{"start":145,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":203,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307}]],[5841,[{"start":27,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":88,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":139,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":204,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":256,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5842,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":234,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5843,[{"start":102,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":153,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":345,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":390,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":635,"length":21,"messageText":"Cannot find name 'evaluationTransformer'.","category":1,"code":2304},{"start":2593,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3438,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":4810,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":5443,"length":6,"messageText":"Parameter 'config' implicitly has an 'any' type.","category":1,"code":7006},{"start":5591,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006}]],[5844,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":145,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/colors' or its corresponding type declarations.","category":1,"code":2307},{"start":202,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":272,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":333,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":412,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5845,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5846,[{"start":28,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307}]],[5847,[{"start":133,"length":41,"messageText":"Cannot find module '@/oss/lib/helpers/observability_helpers' or its corresponding type declarations.","category":1,"code":2307}]],[5848,[{"start":18,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":139,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5849,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":198,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5851,[{"start":18,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5852,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5853,[{"start":95,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":146,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":211,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":284,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5854,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":211,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":286,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5855,[{"start":32,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":83,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":202,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[5876,[{"start":707,"length":3,"messageText":"Parameter 'use' implicitly has an 'any' type.","category":1,"code":7006},{"start":891,"length":12,"messageText":"Binding element 'sessionState' implicitly has an 'any' type.","category":1,"code":7031},{"start":905,"length":16,"messageText":"Binding element 'useSharedContext' implicitly has an 'any' type.","category":1,"code":7031},{"start":924,"length":3,"messageText":"Parameter 'use' implicitly has an 'any' type.","category":1,"code":7006},{"start":929,"length":8,"messageText":"Parameter 'testInfo' implicitly has an 'any' type.","category":1,"code":7006}]],[5878,[{"start":209,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[5879,[{"start":168,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":364,"length":48,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/state/urlState' or its corresponding type declarations.","category":1,"code":2307}]],[5880,[{"start":164,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/AddButton' or its corresponding type declarations.","category":1,"code":2307},{"start":237,"length":27,"messageText":"Cannot find module '@/oss/hooks/useFocusInput' or its corresponding type declarations.","category":1,"code":2307}]],[5881,[{"start":317,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[5882,[{"start":189,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307}]],[5883,[{"start":275,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":399,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307},{"start":1523,"length":1,"messageText":"Parameter 't' implicitly has an 'any' type.","category":1,"code":7006},{"start":2988,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006}]],[5984,[{"start":70,"length":92,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/ResponsiveMetricChart' or its corresponding type declarations.","category":1,"code":2307},{"start":192,"length":76,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover/assets/utils' or its corresponding type declarations.","category":1,"code":2307}]],[5985,[{"start":1999,"length":6,"code":2739,"category":1,"messageText":"Type 'Record' is missing the following properties from type '{ mean: number; min: number; max: number; }': mean, min, max","relatedInformation":[{"file":"./ee/src/components/autoevalrundetails/components/evaluatormetricschart/assets/barchart.tsx","start":248,"length":6,"messageText":"The expected type comes from property 'metric' which is declared here on type 'IntrinsicAttributes & BarChartProps'","category":3,"code":6500}],"canonicalHead":{"code":2322,"messageText":"Type 'Record' is not assignable to type '{ mean: number; min: number; max: number; }'."}}]],[5986,[{"start":279,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307},{"start":916,"length":6,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 2, '(o: {}): string[]', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type 'unknown' is not assignable to parameter of type '{}'.","category":1,"code":2345}]},{"messageText":"Overload 2 of 2, '(o: object): string[]', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type 'unknown' is not assignable to parameter of type 'object'.","category":1,"code":2345}]}]},"relatedInformation":[]},{"start":1263,"length":6,"code":2322,"category":1,"messageText":"Type 'unknown' is not assignable to type 'Record'.","relatedInformation":[{"file":"./ee/src/components/autoevalrundetails/components/evaluatormetricschart/index.tsx","start":334,"length":6,"messageText":"The expected type comes from property 'metric' which is declared here on type 'IntrinsicAttributes & { className?: string | undefined; name: string; metric: Record; }'","category":3,"code":6500}]}]],[5987,[{"start":124,"length":38,"messageText":"Cannot find module '@/oss/components/Filters/EditColumns' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":14,"messageText":"Member 'setEditColumns' implicitly has an 'any' type.","category":1,"code":7008},{"start":894,"length":4,"messageText":"Parameter 'keys' implicitly has an 'any' type.","category":1,"code":7006}]],[5988,[{"start":162,"length":94,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/hooks/useTableDataSource' or its corresponding type declarations.","category":1,"code":2307},{"start":294,"length":69,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable' or its corresponding type declarations.","category":1,"code":2307},{"start":392,"length":52,"messageText":"Cannot find module '@/oss/components/Filters/EditColumns/assets/helper' or its corresponding type declarations.","category":1,"code":2307}]],[5989,[{"start":294,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[5991,[{"start":110,"length":30,"messageText":"Cannot find module '@/oss/services/billing/types' or its corresponding type declarations.","category":1,"code":2307},{"start":178,"length":106,"messageText":"Cannot find module '@/agenta-oss-common/components/pages/settings/Billing/Modals/PricingModal/assets/SubscriptionPlanDetails' or its corresponding type declarations.","category":1,"code":2307}]],[5997,[{"start":372,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":447,"length":50,"messageText":"Cannot find module '@/oss/components/ResultComponent/ResultComponent' or its corresponding type declarations.","category":1,"code":2307},{"start":534,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3520,"length":41,"messageText":"Cannot find module '@/oss/services/deploymentVersioning/api' or its corresponding type declarations.","category":1,"code":2307},{"start":4263,"length":41,"messageText":"Cannot find module '@/oss/services/deploymentVersioning/api' or its corresponding type declarations.","category":1,"code":2307},{"start":5313,"length":41,"messageText":"Cannot find module '@/oss/services/deploymentVersioning/api' or its corresponding type declarations.","category":1,"code":2307},{"start":6460,"length":41,"messageText":"Cannot find module '@/oss/services/deploymentVersioning/api' or its corresponding type declarations.","category":1,"code":2307},{"start":9690,"length":32,"code":2339,"category":1,"messageText":"Property 'deployed_app_variant_revision_id' does not exist on type 'DeploymentRevisions'."}]],[5999,[{"start":178,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307}]],[6000,[{"start":162,"length":27,"messageText":"Cannot find module '@/oss/hooks/useFocusInput' or its corresponding type declarations.","category":1,"code":2307}]],[6001,[{"start":152,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":209,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":286,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307}]],[6002,[{"start":143,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307},{"start":487,"length":7,"messageText":"Property 'onClick' does not exist on type 'SaveDataButtonProps'.","category":1,"code":2339},{"start":1360,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[6003,[{"start":226,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":280,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":2406,"length":13,"messageText":"Cannot find name 'scenariosAtom'.","category":1,"code":2304},{"start":2426,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":2605,"length":22,"messageText":"Cannot find name 'scenarioMetricsMapAtom'.","category":1,"code":2304},{"start":2654,"length":2,"messageText":"Parameter 'id' implicitly has an 'any' type.","category":1,"code":7006},{"start":2793,"length":8,"messageText":"Parameter 'scenario' implicitly has an 'any' type.","category":1,"code":7006},{"start":5858,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ exportDataset: true; label: string; onClick: () => Promise; rows: any[]; name: string; }' is not assignable to type 'IntrinsicAttributes & SaveDataButtonProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'onClick' does not exist on type 'IntrinsicAttributes & SaveDataButtonProps'.","category":1,"code":2339}]}},{"start":6006,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ label: string; onClick: () => Promise; rows: any[]; }' is not assignable to type 'IntrinsicAttributes & SaveDataButtonProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'onClick' does not exist on type 'IntrinsicAttributes & SaveDataButtonProps'.","category":1,"code":2339}]}}]],[6005,[{"start":143,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":198,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":326,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6006,[{"start":178,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307}]],[6012,[{"start":52,"length":92,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/TextControl' or its corresponding type declarations.","category":1,"code":2307},{"start":769,"length":10,"code":2551,"category":1,"messageText":"Property 'testcaseId' does not exist on type 'IInputStep'. Did you mean 'testcase'?","relatedInformation":[{"file":"./ee/src/lib/hooks/useevaluationrunscenariosteps/types.ts","start":3147,"length":8,"messageText":"'testcase' is declared here.","category":3,"code":2728}]}]],[6013,[{"start":95,"length":91,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundGenerations/assets/GenerationResultUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":220,"length":101,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/SimpleDropdownSelect' or its corresponding type declarations.","category":1,"code":2307},{"start":347,"length":53,"messageText":"Cannot find module '@/oss/components/Playground/Components/SharedEditor' or its corresponding type declarations.","category":1,"code":2307}]],[6016,[{"start":215,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":300,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1550,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006}]],[6017,[{"start":147,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":208,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":955,"length":10,"code":2345,"category":1,"messageText":"Argument of type 'string' is not assignable to parameter of type '{ scenarioId: string; runId: string; }'."},{"start":1388,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":1676,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":1715,"length":9,"messageText":"Parameter 'evaluator' implicitly has an 'any' type.","category":1,"code":7006}]],[6018,[{"start":77,"length":88,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/helpers' or its corresponding type declarations.","category":1,"code":2307}]],[6019,[{"start":208,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":267,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[6020,[{"start":383,"length":78,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms' or its corresponding type declarations.","category":1,"code":2307},{"start":495,"length":73,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/types' or its corresponding type declarations.","category":1,"code":2307},{"start":616,"length":73,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":718,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":796,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":905,"length":53,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarioSteps/types' or its corresponding type declarations.","category":1,"code":2307},{"start":986,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2813,"length":17,"messageText":"'annotationsByStep' is possibly 'undefined'.","category":1,"code":18048},{"start":3282,"length":10,"messageText":"'evaluators' is possibly 'undefined'.","category":1,"code":18048},{"start":3454,"length":10,"messageText":"'evaluators' is possibly 'undefined'.","category":1,"code":18048},{"start":9386,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":9427,"length":7,"messageText":"Parameter 'invStep' implicitly has an 'any' type.","category":1,"code":7006},{"start":9530,"length":3,"messageText":"Binding element 'key' implicitly has an 'any' type.","category":1,"code":7031},{"start":9586,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":9793,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":9995,"length":7,"messageText":"Parameter 'invStep' implicitly has an 'any' type.","category":1,"code":7006}]],[6022,[{"start":133,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6024,[{"start":157,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6025,[{"start":168,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6027,[{"start":348,"length":27,"messageText":"Cannot find module '@/oss/hooks/useFocusInput' or its corresponding type declarations.","category":1,"code":2307},{"start":411,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useEvalScenarioQueue' or its corresponding type declarations.","category":1,"code":2307},{"start":577,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":662,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":1986,"length":8,"messageText":"Parameter 'scenario' implicitly has an 'any' type.","category":1,"code":7006},{"start":2181,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":6697,"length":1,"messageText":"Parameter 's' implicitly has an 'any' type.","category":1,"code":7006},{"start":7276,"length":8,"messageText":"Parameter 'scenario' implicitly has an 'any' type.","category":1,"code":7006}]],[6028,[{"start":341,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6029,[{"start":161,"length":37,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Drawer' or its corresponding type declarations.","category":1,"code":2307},{"start":252,"length":30,"messageText":"Cannot find module '@/oss/lib/atoms/virtualTable' or its corresponding type declarations.","category":1,"code":2307},{"start":311,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6030,[{"start":225,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":512,"length":55,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Table/assets/CustomCells' or its corresponding type declarations.","category":1,"code":2307},{"start":2498,"length":12,"code":2339,"category":1,"messageText":"Property 'offsetHeight' does not exist on type 'Element'."}]],[6031,[{"start":245,"length":63,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover' or its corresponding type declarations.","category":1,"code":2307},{"start":348,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":427,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307}]],[6032,[{"start":197,"length":69,"messageText":"Cannot find module '../../../lib/hooks/useEvaluationRunData/assets/atoms/runScopedAtoms' or its corresponding type declarations.","category":1,"code":2307}]],[6033,[{"start":129,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307}]],[6035,[{"start":102,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307}]],[6460,[{"start":563,"length":32,"messageText":"Cannot find module '@/oss/hooks/useDurationCounter' or its corresponding type declarations.","category":1,"code":2307},{"start":624,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":768,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":4496,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[6461,[{"start":175,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6463,[{"start":273,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6464,[{"start":468,"length":48,"messageText":"Cannot find module '@/oss/components/AgCustomHeader/AgCustomHeader' or its corresponding type declarations.","category":1,"code":2307},{"start":540,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":611,"length":54,"messageText":"Cannot find module '@/oss/components/CompareOutputDiff/CompareOutputDiff' or its corresponding type declarations.","category":1,"code":2307},{"start":692,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":776,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":846,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":898,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":950,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":1027,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/agGrid' or its corresponding type declarations.","category":1,"code":2307},{"start":1079,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":1159,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":1217,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":1299,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":1360,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":1419,"length":33,"messageText":"Cannot find module '@/oss/lib/helpers/variantHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":1529,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1579,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1645,"length":27,"messageText":"Cannot find module '@/oss/services/evaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":4448,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":4455,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":6464,"length":1,"messageText":"Parameter '_' implicitly has an 'any' type.","category":1,"code":7006},{"start":6467,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":8629,"length":6,"messageText":"Parameter 'config' implicitly has an 'any' type.","category":1,"code":7006},{"start":8637,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":8880,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":9763,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":12860,"length":6,"messageText":"Parameter 'column' implicitly has an 'any' type.","category":1,"code":7006},{"start":12946,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":13536,"length":6,"messageText":"Parameter 'params' implicitly has an 'any' type.","category":1,"code":7006},{"start":13982,"length":6,"messageText":"Parameter 'params' implicitly has an 'any' type.","category":1,"code":7006},{"start":19011,"length":6,"messageText":"Parameter 'params' implicitly has an 'any' type.","category":1,"code":7006}]],[6465,[{"start":255,"length":33,"messageText":"Cannot find module '@/oss/components/EvalRunDetails' or its corresponding type declarations.","category":1,"code":2307},{"start":328,"length":61,"messageText":"Cannot find module '@/oss/components/EvaluationTable/SingleModelEvaluationTable' or its corresponding type declarations.","category":1,"code":2307},{"start":423,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData' or its corresponding type declarations.","category":1,"code":2307},{"start":615,"length":51,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms' or its corresponding type declarations.","category":1,"code":2307},{"start":694,"length":55,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/constants' or its corresponding type declarations.","category":1,"code":2307},{"start":809,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":850,"length":34,"messageText":"Cannot find module '@/oss/lib/utils/abortControllers' or its corresponding type declarations.","category":1,"code":2307}]],[6468,[{"start":139,"length":40,"messageText":"Cannot find module '@/oss/components/ChatInputs/ChatInputs' or its corresponding type declarations.","category":1,"code":2307},{"start":204,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":274,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6469,[{"start":132,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":225,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6470,[{"start":90,"length":40,"messageText":"Cannot find module '@/oss/components/EvaluationTable/types' or its corresponding type declarations.","category":1,"code":2307},{"start":170,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1319,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":1940,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[6471,[{"start":198,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6475,[{"start":181,"length":27,"messageText":"Cannot find module '@/oss/hooks/useFocusInput' or its corresponding type declarations.","category":1,"code":2307},{"start":240,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1293,"length":10,"code":2339,"category":1,"messageText":"Property 'input_name' does not exist on type 'string'."},{"start":1320,"length":11,"code":2339,"category":1,"messageText":"Property 'input_value' does not exist on type 'string'."}]],[6479,[{"start":192,"length":40,"messageText":"Cannot find module '@/oss/components/CopyButton/CopyButton' or its corresponding type declarations.","category":1,"code":2307},{"start":258,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":316,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307}]],[6480,[{"start":115,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":856,"length":2,"messageText":"Parameter 'ip' implicitly has an 'any' type.","category":1,"code":7006},{"start":860,"length":2,"messageText":"Parameter 'ix' implicitly has an 'any' type.","category":1,"code":7006}]],[6481,[{"start":121,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":573,"length":3,"messageText":"Parameter 'env' implicitly has an 'any' type.","category":1,"code":7006}]],[6482,[{"start":122,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6483,[{"start":47,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6485,[{"start":452,"length":62,"messageText":"Cannot find module '@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal' or its corresponding type declarations.","category":1,"code":2307},{"start":548,"length":60,"messageText":"Cannot find module '@/oss/components/HumanEvaluationModal/HumanEvaluationModal' or its corresponding type declarations.","category":1,"code":2307},{"start":636,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":694,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":739,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":807,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":876,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":947,"length":33,"messageText":"Cannot find module '@/oss/lib/helpers/variantHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":1026,"length":24,"messageText":"Cannot find module '@/oss/lib/transformers' or its corresponding type declarations.","category":1,"code":2307},{"start":1108,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1222,"length":38,"messageText":"Cannot find module '@/oss/services/human-evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":3860,"length":7,"messageText":"Parameter 'results' implicitly has an 'any' type.","category":1,"code":7006},{"start":4263,"length":3,"messageText":"Parameter 'err' implicitly has an 'any' type.","category":1,"code":7006},{"start":4407,"length":10,"messageText":"Parameter 'evaluation' implicitly has an 'any' type.","category":1,"code":7006},{"start":4500,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":4503,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006}]],[6486,[{"start":77,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/colors' or its corresponding type declarations.","category":1,"code":2307},{"start":130,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[6488,[{"start":185,"length":43,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios' or its corresponding type declarations.","category":1,"code":2307},{"start":260,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6493,[{"start":274,"length":91,"messageText":"Cannot find module '@/oss/components/EvalRunDetails/components/VirtualizedScenarioTable/assets/CellComponents' or its corresponding type declarations.","category":1,"code":2307},{"start":405,"length":67,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunData/assets/atoms/runMetricsCache' or its corresponding type declarations.","category":1,"code":2307},{"start":539,"length":23,"messageText":"Cannot find module '@/oss/lib/metricUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":1719,"length":10,"messageText":"Property 'metricType' does not exist on type 'MetricDetailsPopoverProps'.","category":1,"code":2339},{"start":8887,"length":14,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./ee/src/components/humanevaluations/assets/metricdetailspopover/assets/responsivemetricchart.tsx","start":313,"length":14,"messageText":"The expected type comes from property 'highlightValue' which is declared here on type 'IntrinsicAttributes & ResponsiveMetricChartProps'","category":3,"code":6500}]},{"start":11856,"length":12,"messageText":"Cannot find name 'EvaluatorDto'.","category":1,"code":2304},{"start":12287,"length":3,"messageText":"'map' is of type 'unknown'.","category":1,"code":18046},{"start":17586,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '{ children: Element; metricKey: string; extraDimensions: Record; hidePrimitiveTable: boolean; className: string | undefined; metricType: any; }' is not assignable to type 'IntrinsicAttributes & MetricDetailsPopoverProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'metricType' does not exist on type 'IntrinsicAttributes & MetricDetailsPopoverProps'.","category":1,"code":2339}]}}]],[6494,[{"start":197,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6495,[{"start":204,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":388,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006},{"start":396,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006}]],[6496,[{"start":370,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":431,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":484,"length":49,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios/types' or its corresponding type declarations.","category":1,"code":2307},{"start":561,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":641,"length":31,"messageText":"Cannot find module '@/oss/lib/metricColumnFactory' or its corresponding type declarations.","category":1,"code":2307},{"start":719,"length":25,"messageText":"Cannot find module '@/oss/lib/metrics/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":775,"length":23,"messageText":"Cannot find module '@/oss/lib/metricUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":843,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":886,"length":37,"messageText":"Cannot find module '@/oss/services/runMetrics/api/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1343,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":1408,"length":83,"messageText":"Cannot find module '@/oss/components/Playground/Components/Drawers/TraceDrawer/store/traceDrawerStore' or its corresponding type declarations.","category":1,"code":2307},{"start":10197,"length":2,"messageText":"Parameter 'ts' implicitly has an 'any' type.","category":1,"code":7006},{"start":18279,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":18434,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":18817,"length":11,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'collapsible' does not exist in type 'ColumnGroupType | ColumnType'."},{"start":19410,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006},{"start":19886,"length":13,"code":2322,"category":1,"messageText":{"messageText":"Type 'Record> | undefined' is not assignable to type 'Record'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'Record'.","category":1,"code":2322}]},"relatedInformation":[{"start":5275,"length":13,"messageText":"The expected type comes from property 'runMetricsMap' which is declared here on type '{ runMetricsMap: Record; runMetricKeys: Set; evaluatorSlugs: Set; }'","category":3,"code":6500}]}]],[6501,[{"start":325,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":400,"length":24,"messageText":"Cannot find module '@/oss/lib/transformers' or its corresponding type declarations.","category":1,"code":2307},{"start":2838,"length":13,"messageText":"Object is possibly 'null' or 'undefined'.","category":1,"code":2533},{"start":2897,"length":11,"code":2339,"category":1,"messageText":{"messageText":"Property 'toUpperCase' does not exist on type 'string | number'.","category":1,"code":2339,"next":[{"messageText":"Property 'toUpperCase' does not exist on type 'number'.","category":1,"code":2339}]}}]],[6503,[{"start":311,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":385,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/validators' or its corresponding type declarations.","category":1,"code":2307},{"start":444,"length":24,"messageText":"Cannot find module '@/oss/lib/transformers' or its corresponding type declarations.","category":1,"code":2307},{"start":520,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3736,"length":13,"messageText":"Object is possibly 'null' or 'undefined'.","category":1,"code":2533},{"start":3750,"length":11,"code":2339,"category":1,"messageText":{"messageText":"Property 'toUpperCase' does not exist on type 'string | number'.","category":1,"code":2339,"next":[{"messageText":"Property 'toUpperCase' does not exist on type 'number'.","category":1,"code":2339}]}}]],[6504,[{"start":351,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":395,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":490,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":610,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":820,"length":99,"messageText":"Cannot find module '@/oss/components/pages/evaluations/autoEvaluation/EvaluatorsModal/ConfigureEvaluator/DebugSection' or its corresponding type declarations.","category":1,"code":2307}]],[6505,[{"start":234,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":303,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":357,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307}]],[6506,[{"start":305,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":358,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":444,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3037,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":3389,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":4776,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":5954,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[6507,[{"start":296,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":366,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1951,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3023,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":4001,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":6033,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[6508,[{"start":338,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":398,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":478,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":2909,"length":9,"messageText":"Parameter 'evaluator' implicitly has an 'any' type.","category":1,"code":7006},{"start":5014,"length":3,"messageText":"Parameter 'val' implicitly has an 'any' type.","category":1,"code":7006},{"start":5019,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006}]],[6509,[{"start":212,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6510,[{"start":287,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":350,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3886,"length":3,"messageText":"Parameter 'val' implicitly has an 'any' type.","category":1,"code":7006},{"start":3891,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006}]],[6512,[{"start":296,"length":37,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Drawer' or its corresponding type declarations.","category":1,"code":2307},{"start":366,"length":87,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/AnnotateDrawerTitle' or its corresponding type declarations.","category":1,"code":2307},{"start":482,"length":83,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/CreateEvaluator' or its corresponding type declarations.","category":1,"code":2307},{"start":600,"length":72,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/enum' or its corresponding type declarations.","category":1,"code":2307},{"start":711,"length":78,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms' or its corresponding type declarations.","category":1,"code":2307},{"start":817,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":890,"length":40,"messageText":"Cannot find module '@/oss/lib/hooks/useFetchEvaluatorsData' or its corresponding type declarations.","category":1,"code":2307},{"start":972,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1318,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":9923,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ className: string; title: string; description: string; primaryActionLabel: string; onPrimaryAction: () => void; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'className' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":14093,"length":7,"messageText":"Parameter 'updater' implicitly has an 'any' type.","category":1,"code":7006}]],[6513,[{"start":245,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":302,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":346,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":478,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":2624,"length":7,"messageText":"Parameter 'testset' implicitly has an 'any' type.","category":1,"code":7006},{"start":3948,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ className: string; description: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'className' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[6514,[{"start":173,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":225,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":274,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":334,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":480,"length":43,"messageText":"Cannot find module '@/oss/components/VariantsComponents/Table' or its corresponding type declarations.","category":1,"code":2307},{"start":591,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":1321,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":2690,"length":12,"code":2322,"category":1,"messageText":{"messageText":"Type '{ rowSelection: { type: string; selectedRowKeys: string[]; onChange: (selectedRowKeys: any) => void; }; onRow: (record: any) => { style: { cursor: string; }; onClick: () => void; }; showActionsDropdown: boolean; ... 6 more ...; locale: { ...; }; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'rowSelection' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":2837,"length":15,"messageText":"Parameter 'selectedRowKeys' implicitly has an 'any' type.","category":1,"code":7006},{"start":2982,"length":6,"messageText":"Parameter 'record' implicitly has an 'any' type.","category":1,"code":7006},{"start":3616,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ className: string; description: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'className' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[6515,[{"start":2804,"length":3,"code":2322,"category":1,"messageText":"Type 'number' is not assignable to type 'string'.","relatedInformation":[{"file":"./node_modules/.pnpm/rc-input-number@9.5.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-input-number/es/inputnumber.d.ts","start":797,"length":3,"messageText":"The expected type comes from property 'min' which is declared here on type 'IntrinsicAttributes & InputNumberProps & { children?: ReactNode; } & RefAttributes'","category":3,"code":6500}]}]],[6516,[{"start":236,"length":27,"messageText":"Cannot find module '@/oss/hooks/useFocusInput' or its corresponding type declarations.","category":1,"code":2307},{"start":4080,"length":20,"code":2741,"category":1,"messageText":"Property 'isVariantLoading' is missing in type '{ handlePanelChange: (key: string | string[]) => void; selectedVariantRevisionIds: string[]; setSelectedVariantRevisionIds: Dispatch>; evaluationType: \"auto\" | \"human\"; variants: EnhancedVariant[] | undefined; className: string; }' but required in type 'SelectVariantSectionProps'.","relatedInformation":[{"file":"./ee/src/components/pages/evaluations/newevaluation/types.ts","start":1646,"length":16,"messageText":"'isVariantLoading' is declared here.","category":3,"code":2728}],"canonicalHead":{"code":2322,"messageText":"Type '{ handlePanelChange: (key: string | string[]) => void; selectedVariantRevisionIds: string[]; setSelectedVariantRevisionIds: Dispatch>; evaluationType: \"auto\" | \"human\"; variants: EnhancedVariant[] | undefined; className: string; }' is not assignable to type 'SelectVariantSectionProps'."}}]],[6517,[{"start":175,"length":36,"messageText":"Cannot find module '@/oss/components/AppMessageContext' or its corresponding type declarations.","category":1,"code":2307},{"start":238,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":298,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":350,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":413,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":474,"length":40,"messageText":"Cannot find module '@/oss/lib/hooks/useFetchEvaluatorsData' or its corresponding type declarations.","category":1,"code":2307},{"start":549,"length":39,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations' or its corresponding type declarations.","category":1,"code":2307},{"start":615,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":676,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":749,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":4922,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":5011,"length":2,"messageText":"Parameter 'ts' implicitly has an 'any' type.","category":1,"code":7006},{"start":7083,"length":6,"messageText":"Parameter 'config' implicitly has an 'any' type.","category":1,"code":7006},{"start":7503,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":7771,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":8409,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":8516,"length":5,"messageText":"Parameter 'param' implicitly has an 'any' type.","category":1,"code":7006},{"start":9815,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":9955,"length":7,"messageText":"Parameter 'testset' implicitly has an 'any' type.","category":1,"code":7006},{"start":10149,"length":6,"messageText":"Parameter 'config' implicitly has an 'any' type.","category":1,"code":7006}]],[6518,[{"start":305,"length":64,"messageText":"Cannot find module '@/oss/components/pages/evaluations/cellRenderers/cellRenderers' or its corresponding type declarations.","category":1,"code":2307},{"start":397,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":449,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":501,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":551,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":620,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":701,"length":43,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluationRunScenarios' or its corresponding type declarations.","category":1,"code":2307},{"start":772,"length":32,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluations' or its corresponding type declarations.","category":1,"code":2307},{"start":835,"length":23,"messageText":"Cannot find module '@/oss/lib/metricUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":890,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1249,"length":62,"messageText":"Cannot find module '@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal' or its corresponding type declarations.","category":1,"code":2307},{"start":11184,"length":14,"code":2322,"category":1,"messageText":{"messageText":"Type '{ confirmLoading: boolean; open: boolean; onCancel: () => void; onOk: () => Promise; evaluationType: any; isMultiple: boolean; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'confirmLoading' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[6519,[{"start":204,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":249,"length":32,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluations' or its corresponding type declarations.","category":1,"code":2307},{"start":311,"length":34,"messageText":"Cannot find module '@/oss/lib/hooks/useRunMetricsMap' or its corresponding type declarations.","category":1,"code":2307},{"start":373,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Table' or its corresponding type declarations.","category":1,"code":2307},{"start":1304,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":3808,"length":6,"messageText":"Parameter 'record' implicitly has an 'any' type.","category":1,"code":7006},{"start":4312,"length":6,"messageText":"Parameter 'record' implicitly has an 'any' type.","category":1,"code":7006}]],[6520,[{"start":424,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":484,"length":32,"messageText":"Cannot find module '@/oss/components/Avatar/Avatar' or its corresponding type declarations.","category":1,"code":2307},{"start":542,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":600,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":658,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307},{"start":710,"length":48,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/usePostHogAg' or its corresponding type declarations.","category":1,"code":2307},{"start":783,"length":45,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/useSurvey' or its corresponding type declarations.","category":1,"code":2307},{"start":850,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307},{"start":2493,"length":8,"messageText":"Parameter 'question' implicitly has an 'any' type.","category":1,"code":7006},{"start":2503,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006}]],[6521,[{"start":264,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":339,"length":50,"messageText":"Cannot find module '@/oss/components/ResultComponent/ResultComponent' or its corresponding type declarations.","category":1,"code":2307},{"start":421,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6522,[{"start":153,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307}]],[6523,[{"start":58,"length":59,"messageText":"Cannot find module '@/oss/components/Banners/BillingPlanBanner/FreePlanBanner' or its corresponding type declarations.","category":1,"code":2307},{"start":146,"length":60,"messageText":"Cannot find module '@/oss/components/Banners/BillingPlanBanner/FreeTrialBanner' or its corresponding type declarations.","category":1,"code":2307},{"start":228,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":273,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":325,"length":24,"messageText":"Cannot find module '@/oss/services/billing' or its corresponding type declarations.","category":1,"code":2307}]],[6524,[{"start":130,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":180,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":233,"length":28,"messageText":"Cannot find module '@/oss/services/apiKeys/api' or its corresponding type declarations.","category":1,"code":2307}]],[6525,[{"start":158,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":216,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":272,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1230,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006}]],[6627,[{"start":147,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6628,[{"start":241,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":307,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":361,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":417,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307},{"start":482,"length":34,"messageText":"Cannot find module '@/oss/services/observability/api' or its corresponding type declarations.","category":1,"code":2307},{"start":2171,"length":4,"messageText":"Parameter 'data' implicitly has an 'any' type.","category":1,"code":7006}]],[6629,[{"start":317,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":380,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":449,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":575,"length":63,"messageText":"Cannot find module '@/oss/lib/hooks/usePreviewEvaluations/states/queryFilterAtoms' or its corresponding type declarations.","category":1,"code":2307},{"start":772,"length":38,"messageText":"Cannot find module '@/oss/components/Filters/EditColumns' or its corresponding type declarations.","category":1,"code":2307},{"start":838,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":900,"length":33,"messageText":"Cannot find module '@/oss/lib/helpers/variantHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":980,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1104,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":1188,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":2965,"length":3,"messageText":"Parameter 'acc' implicitly has an 'any' type.","category":1,"code":7006},{"start":2970,"length":4,"messageText":"Parameter 'curr' implicitly has an 'any' type.","category":1,"code":7006},{"start":9233,"length":4,"messageText":"Parameter 'keys' implicitly has an 'any' type.","category":1,"code":7006}]],[6630,[{"start":188,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":256,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":301,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Table' or its corresponding type declarations.","category":1,"code":2307},{"start":432,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":477,"length":32,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluations' or its corresponding type declarations.","category":1,"code":2307},{"start":539,"length":34,"messageText":"Cannot find module '@/oss/lib/hooks/useRunMetricsMap' or its corresponding type declarations.","category":1,"code":2307},{"start":599,"length":48,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":676,"length":52,"messageText":"Cannot find module '@/oss/components/Filters/EditColumns/assets/helper' or its corresponding type declarations.","category":1,"code":2307},{"start":757,"length":41,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":833,"length":62,"messageText":"Cannot find module '@/oss/components/DeleteEvaluationModal/DeleteEvaluationModal' or its corresponding type declarations.","category":1,"code":2307},{"start":1732,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":3615,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":3858,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":3940,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":4150,"length":20,"code":2741,"category":1,"messageText":"Property 'fetchEvaluations' is missing in type '{ selectedRowKeys: Key[]; evaluationList: any; columns: ColumnsType; setHiddenColumns: Dispatch>; setSelectedRowKeys: Dispatch<...>; selectedEvalRecord: any; setIsDeleteEvalModalOpen: Dispatch<...>; }' but required in type 'AutoEvaluationHeaderProps'.","relatedInformation":[{"file":"./ee/src/components/pages/evaluations/autoevaluation/assets/types.ts","start":398,"length":16,"messageText":"'fetchEvaluations' is declared here.","category":3,"code":2728}],"canonicalHead":{"code":2322,"messageText":"Type '{ selectedRowKeys: Key[]; evaluationList: any; columns: ColumnsType; setHiddenColumns: Dispatch>; setSelectedRowKeys: Dispatch<...>; selectedEvalRecord: any; setIsDeleteEvalModalOpen: Dispatch<...>; }' is not assignable to type 'AutoEvaluationHeaderProps'."}},{"start":5230,"length":6,"messageText":"Parameter 'record' implicitly has an 'any' type.","category":1,"code":7006}]],[6631,[{"start":284,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":329,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":2730,"length":1,"messageText":"Parameter '_' implicitly has an 'any' type.","category":1,"code":7006},{"start":2733,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":5252,"length":4,"messageText":"Parameter 'data' implicitly has an 'any' type.","category":1,"code":7006},{"start":5258,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006}]],[6632,[{"start":381,"length":43,"messageText":"Cannot find module '@/oss/components/VariantsComponents/Table' or its corresponding type declarations.","category":1,"code":2307},{"start":472,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3899,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006}]],[6634,[{"start":171,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6635,[{"start":170,"length":64,"messageText":"Cannot find module '@/oss/components/pages/evaluations/cellRenderers/cellRenderers' or its corresponding type declarations.","category":1,"code":2307},{"start":279,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1164,"length":9,"messageText":"Implicit conversion of a 'symbol' to a 'string' will fail at runtime. Consider wrapping this expression in 'String(...)'.","category":1,"code":2731}]],[6636,[{"start":177,"length":32,"messageText":"Cannot find module '@/oss/hooks/useDurationCounter' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6637,[{"start":486,"length":48,"messageText":"Cannot find module '@/oss/components/AgCustomHeader/AgCustomHeader' or its corresponding type declarations.","category":1,"code":2307},{"start":565,"length":54,"messageText":"Cannot find module '@/oss/components/CompareOutputDiff/CompareOutputDiff' or its corresponding type declarations.","category":1,"code":2307},{"start":646,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":720,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":772,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":823,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":875,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":952,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/agGrid' or its corresponding type declarations.","category":1,"code":2307},{"start":1030,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/colors' or its corresponding type declarations.","category":1,"code":2307},{"start":1129,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":1187,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":1269,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":1330,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":1389,"length":33,"messageText":"Cannot find module '@/oss/lib/helpers/variantHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":1506,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1564,"length":32,"messageText":"Cannot find module '@/oss/services/evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":3171,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":4831,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":4968,"length":1,"messageText":"Parameter 'c' implicitly has an 'any' type.","category":1,"code":7006},{"start":5174,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":5452,"length":5,"messageText":"Parameter 'input' implicitly has an 'any' type.","category":1,"code":7006},{"start":5459,"length":2,"messageText":"Parameter 'ix' implicitly has an 'any' type.","category":1,"code":7006},{"start":7393,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":7402,"length":2,"messageText":"Parameter 'vi' implicitly has an 'any' type.","category":1,"code":7006},{"start":10204,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":10569,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":10578,"length":2,"messageText":"Parameter 'vi' implicitly has an 'any' type.","category":1,"code":7006},{"start":10651,"length":6,"messageText":"Binding element 'config' implicitly has an 'any' type.","category":1,"code":7031},{"start":10660,"length":2,"messageText":"Parameter 'ix' implicitly has an 'any' type.","category":1,"code":7006},{"start":11214,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":12366,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":12505,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":13638,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":13785,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":13997,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":14006,"length":2,"messageText":"Parameter 'vi' implicitly has an 'any' type.","category":1,"code":7006},{"start":14745,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":15033,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":15042,"length":2,"messageText":"Parameter 'vi' implicitly has an 'any' type.","category":1,"code":7006},{"start":15809,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":16293,"length":4,"messageText":"Binding element 'rows' implicitly has an 'any' type.","category":1,"code":7031},{"start":16299,"length":7,"messageText":"Binding element 'testset' implicitly has an 'any' type.","category":1,"code":7031},{"start":16308,"length":11,"messageText":"Binding element 'evaluations' implicitly has an 'any' type.","category":1,"code":7031},{"start":16670,"length":6,"messageText":"Parameter 'column' implicitly has an 'any' type.","category":1,"code":7006},{"start":16762,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":17307,"length":3,"messageText":"Parameter 'val' implicitly has an 'any' type.","category":1,"code":7006},{"start":18935,"length":11,"messageText":"Binding element 'variantName' implicitly has an 'any' type.","category":1,"code":7031},{"start":19074,"length":6,"messageText":"Parameter 'params' implicitly has an 'any' type.","category":1,"code":7006},{"start":19168,"length":6,"messageText":"Parameter 'params' implicitly has an 'any' type.","category":1,"code":7006},{"start":26028,"length":6,"messageText":"Parameter 'params' implicitly has an 'any' type.","category":1,"code":7006}]],[6639,[{"start":172,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":223,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307}]],[6640,[{"start":145,"length":77,"messageText":"Cannot find module '@/oss/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters' or its corresponding type declarations.","category":1,"code":2307},{"start":249,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":316,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":368,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":430,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":487,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307}]],[6642,[{"start":230,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":296,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":350,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":406,"length":20,"messageText":"Cannot find module '@/oss/lib/types_ee' or its corresponding type declarations.","category":1,"code":2307},{"start":471,"length":34,"messageText":"Cannot find module '@/oss/services/observability/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1420,"length":4,"messageText":"Parameter 'data' implicitly has an 'any' type.","category":1,"code":7006}]],[6645,[{"start":136,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":241,"length":24,"messageText":"Cannot find module '@/oss/services/billing' or its corresponding type declarations.","category":1,"code":2307}]],[6647,[{"start":103,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3268,"length":5,"messageText":"Parameter 'point' implicitly has an 'any' type.","category":1,"code":7006},{"start":3275,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006}]],[6648,[{"start":114,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307},{"start":164,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":291,"length":24,"messageText":"Cannot find module '@/oss/services/billing' or its corresponding type declarations.","category":1,"code":2307},{"start":342,"length":30,"messageText":"Cannot find module '@/oss/services/billing/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2798,"length":4,"messageText":"Parameter 'plan' implicitly has an 'any' type.","category":1,"code":7006}]],[6649,[{"start":86,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307}]],[6650,[{"start":58,"length":30,"messageText":"Cannot find module '@/oss/services/billing/types' or its corresponding type declarations.","category":1,"code":2307}]],[6651,[{"start":184,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":272,"length":24,"messageText":"Cannot find module '@/oss/services/billing' or its corresponding type declarations.","category":1,"code":2307},{"start":4976,"length":4,"messageText":"'info' is of type 'unknown'.","category":1,"code":18046},{"start":5031,"length":4,"messageText":"'info' is of type 'unknown'.","category":1,"code":18046},{"start":5097,"length":4,"messageText":"'info' is of type 'unknown'.","category":1,"code":18046},{"start":5159,"length":4,"messageText":"'info' is of type 'unknown'.","category":1,"code":18046},{"start":5236,"length":4,"messageText":"'info' is of type 'unknown'.","category":1,"code":18046}]],[6652,[{"start":112,"length":63,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/assets/MetricDetailsPopover' or its corresponding type declarations.","category":1,"code":2307},{"start":283,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":353,"length":24,"messageText":"Cannot find module '@/oss/lib/metricSorter' or its corresponding type declarations.","category":1,"code":2307},{"start":425,"length":23,"messageText":"Cannot find module '@/oss/lib/metricUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":1502,"length":3,"messageText":"Parameter 'row' implicitly has an 'any' type.","category":1,"code":7006}]],[6653,[{"start":1390,"length":6,"code":2339,"category":1,"messageText":"Property 'status' does not exist on type 'EnrichedEvaluationRun'."}]],[6658,[{"start":331,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":414,"length":83,"messageText":"Cannot find module '@/oss/components/Playground/Components/Drawers/TraceDrawer/store/traceDrawerStore' or its corresponding type declarations.","category":1,"code":2307},{"start":524,"length":40,"messageText":"Cannot find module '@/oss/components/Scripts/GlobalScripts' or its corresponding type declarations.","category":1,"code":2307},{"start":596,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":656,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":720,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":788,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":845,"length":25,"messageText":"Cannot find module '@/oss/lib/api/SWRConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":896,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/auth/AuthProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":1072,"length":58,"messageText":"Cannot find module '@/oss/components/NoMobilePageWrapper/NoMobilePageWrapper' or its corresponding type declarations.","category":1,"code":2307},{"start":1214,"length":72,"messageText":"Cannot find module '@/oss/components/Playground/Components/Drawers/TraceDrawer/TraceDrawer' or its corresponding type declarations.","category":1,"code":2307},{"start":1360,"length":47,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/AgPosthogProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":1446,"length":32,"messageText":"Cannot find module '@/oss/components/Layout/Layout' or its corresponding type declarations.","category":1,"code":2307},{"start":1861,"length":21,"code":2322,"category":1,"messageText":{"messageText":"Type '{ children: Element; config: { persistence: string; }; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":2502,"length":6,"code":2559,"category":1,"messageText":"Type '{ children: Element[]; }' has no properties in common with type 'IntrinsicAttributes'."}]],[6664,[{"start":26,"length":39,"messageText":"Cannot find module '@/oss/components/pages/app-management' or its corresponding type declarations.","category":1,"code":2307},{"start":93,"length":48,"messageText":"Cannot find module '@/oss/components/ProtectedRoute/ProtectedRoute' or its corresponding type declarations.","category":1,"code":2307}]],[6670,[{"start":293,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":339,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":515,"length":55,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/AbTestingEvaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":649,"length":57,"messageText":"Cannot find module '@/oss/components/HumanEvaluations/SingleModelEvaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":778,"length":66,"messageText":"Cannot find module '@/oss/components/pages/evaluations/autoEvaluation/AutoEvaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":2569,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type '{ viewType: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'viewType' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":2675,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type '{ viewType: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'viewType' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[6671,[{"start":149,"length":59,"messageText":"Cannot find module '@/oss/components/EvaluationTable/ABTestingEvaluationTable' or its corresponding type declarations.","category":1,"code":2307},{"start":263,"length":28,"messageText":"Cannot find module '@/oss/lib/atoms/evaluation' or its corresponding type declarations.","category":1,"code":2307},{"start":327,"length":27,"messageText":"Cannot find module '@/oss/lib/helpers/testset' or its corresponding type declarations.","category":1,"code":2307},{"start":385,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":431,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":531,"length":38,"messageText":"Cannot find module '@/oss/services/human-evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":597,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":2152,"length":3,"messageText":"Parameter 'obj' implicitly has an 'any' type.","category":1,"code":7006},{"start":2312,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006}]],[6672,[{"start":31,"length":37,"messageText":"Cannot find module '@/oss/components/EvalRunDetailsPage' or its corresponding type declarations.","category":1,"code":2307}]],[6673,[{"start":30,"length":72,"messageText":"Cannot find module '@/oss/components/pages/evaluations/evaluationCompare/EvaluationCompare' or its corresponding type declarations.","category":1,"code":2307}]],[6674,[{"start":31,"length":37,"messageText":"Cannot find module '@/oss/components/EvalRunDetailsPage' or its corresponding type declarations.","category":1,"code":2307}]],[6684,[{"start":166,"length":32,"messageText":"Cannot find module '@/oss/components/Editor/Editor' or its corresponding type declarations.","category":1,"code":2307},{"start":230,"length":30,"messageText":"Cannot find module '@/oss/hooks/useDebounceInput' or its corresponding type declarations.","category":1,"code":2307}]],[6685,[{"start":83,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":450,"length":10,"messageText":"Property 'propertyId' does not exist on type 'TextControlProps'.","category":1,"code":2339},{"start":466,"length":9,"messageText":"Property 'variantId' does not exist on type 'TextControlProps'.","category":1,"code":2339}]],[6692,[{"start":185,"length":72,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/TestsetDrawer/assets/types' or its corresponding type declarations.","category":1,"code":2307},{"start":288,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":493,"length":73,"messageText":"Cannot find module '@/oss/components/pages/observability/drawer/TestsetDrawer/TestsetDrawer' or its corresponding type declarations.","category":1,"code":2307},{"start":3314,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '{ open: boolean; data: TestsetTraceData[]; showSelectedSpanText: boolean; onClose: () => void; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'open' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[6693,[{"start":240,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":1232,"length":5,"messageText":"Parameter 'state' implicitly has an 'any' type.","category":1,"code":7006},{"start":1286,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006}]],[6694,[{"start":181,"length":32,"messageText":"Cannot find module '@/oss/components/Editor/Editor' or its corresponding type declarations.","category":1,"code":2307},{"start":768,"length":5,"messageText":"Binding element 'value' implicitly has an 'any' type.","category":1,"code":7031},{"start":775,"length":8,"messageText":"Binding element 'disabled' implicitly has an 'any' type.","category":1,"code":7031},{"start":785,"length":9,"messageText":"Binding element 'variantId' implicitly has an 'any' type.","category":1,"code":7031},{"start":796,"length":12,"messageText":"Binding element 'baseProperty' implicitly has an 'any' type.","category":1,"code":7031},{"start":2789,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'string | null' is not assignable to parameter of type 'string'.","category":1,"code":2345,"next":[{"messageText":"Type 'null' is not assignable to type 'string'.","category":1,"code":2322}]}},{"start":2882,"length":11,"messageText":"Parameter 'currentName' implicitly has an 'any' type.","category":1,"code":7006},{"start":3124,"length":18,"messageText":"Parameter 'currentDescription' implicitly has an 'any' type.","category":1,"code":7006},{"start":3873,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":7998,"length":27,"code":2739,"category":1,"messageText":"Type '{ className: string; isMessageDeletable: false; disabled: false; minimized: boolean; actions: { deleteMessage: () => void; minimize: () => void; }; }' is missing the following properties from type 'PromptMessageContentOptionsProps': messageId, propertyId, variantId","canonicalHead":{"code":2322,"messageText":"Type '{ className: string; isMessageDeletable: false; disabled: false; minimized: boolean; actions: { deleteMessage: () => void; minimize: () => void; }; }' is not assignable to type 'PromptMessageContentOptionsProps'."}}]],[6696,[{"start":169,"length":30,"messageText":"Cannot find module '@/oss/hooks/useDebounceInput' or its corresponding type declarations.","category":1,"code":2307}]],[6697,[{"start":207,"length":30,"messageText":"Cannot find module '@/oss/hooks/useDebounceInput' or its corresponding type declarations.","category":1,"code":2307}]],[6698,[{"start":3004,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ className: string; value: string | number | DefaultOptionType; label: string | number | bigint | true | ReactElement> | Iterable<...> | Promise<...> | DefaultOptionType; }[] | { ...; }[]' is not assignable to type 'DefaultOptionType[] | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type '{ className: string; value: string | number | DefaultOptionType; label: string | number | bigint | true | ReactElement> | Iterable<...> | Promise<...> | DefaultOptionType; }[]' is not assignable to type 'DefaultOptionType[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ className: string; value: string | number | DefaultOptionType; label: string | number | bigint | true | ReactElement> | Iterable<...> | Promise<...> | DefaultOptionType; }' is not assignable to type 'DefaultOptionType'.","category":1,"code":2322,"next":[{"messageText":"Types of property 'label' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type 'string | number | bigint | true | ReactElement> | Iterable | Promise<...> | DefaultOptionType' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'DefaultOptionType' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'DefaultOptionType' is missing the following properties from type 'ReactPortal': type, props, key","category":1,"code":2739,"canonicalHead":{"code":2322,"messageText":"Type 'DefaultOptionType' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type '{ className: string; value: string | number | DefaultOptionType; label: string | number | bigint | true | ReactElement> | Iterable<...> | Promise<...> | DefaultOptionType; }' is not assignable to type 'DefaultOptionType'."}}]}]}]}]},"relatedInformation":[{"file":"./node_modules/.pnpm/rc-select@14.16.8_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-select/lib/select.d.ts","start":3598,"length":7,"messageText":"The expected type comes from property 'options' which is declared here on type 'IntrinsicAttributes & SelectProps & { children?: ReactNode; } & RefAttributes'","category":3,"code":6500}]}]],[6699,[{"start":202,"length":32,"messageText":"Cannot find module '@/oss/components/Editor/Editor' or its corresponding type declarations.","category":1,"code":2307},{"start":308,"length":71,"messageText":"Cannot find module '@/oss/components/Editor/plugins/code/plugins/RealTimeValidationPlugin' or its corresponding type declarations.","category":1,"code":2307},{"start":414,"length":58,"messageText":"Cannot find module '@/oss/components/Editor/plugins/code/tryParsePartialJson' or its corresponding type declarations.","category":1,"code":2307},{"start":504,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1339,"length":6,"messageText":"Parameter 'option' implicitly has an 'any' type.","category":1,"code":7006},{"start":7063,"length":23,"code":2739,"category":1,"messageText":"Type '{ className?: string | undefined; children: ReactNode; }' is missing the following properties from type '{ withTooltip: boolean; promptName: string; metadata: CompoundMetadata; handleChange: (v: any, event?: any, propertyId?: string | undefined) => void; value: any; }': withTooltip, promptName, metadata, handleChange, value","canonicalHead":{"code":2322,"messageText":"Type '{ className?: string | undefined; children: ReactNode; }' is not assignable to type '{ withTooltip: boolean; promptName: string; metadata: CompoundMetadata; handleChange: (v: any, event?: any, propertyId?: string | undefined) => void; value: any; }'."}}]],[6700,[{"start":61,"length":32,"messageText":"Cannot find module '@/oss/components/Editor/Editor' or its corresponding type declarations.","category":1,"code":2307},{"start":845,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006}]],[6702,[{"start":105,"length":50,"messageText":"Cannot find module '@/oss/components/ModelRegistry/assets/LabelInput' or its corresponding type declarations.","category":1,"code":2307},{"start":187,"length":30,"messageText":"Cannot find module '@/oss/hooks/useDebounceInput' or its corresponding type declarations.","category":1,"code":2307}]],[6703,[{"start":107,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":186,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":929,"length":36,"messageText":"Cannot find module '@/oss/components/SelectLLMProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":4476,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ showGroup: true; showAddProvider: true; showCustomSecretsOnOptions: true; options: any; value: any; onChange: (v: any, event?: any, propertyId?: string | undefined) => void; disabled: boolean | undefined; className: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'showGroup' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":5964,"length":10,"messageText":"Property 'propertyId' does not exist on type '{ baseProperty?: EnhancedObjectConfig | undefined; }'.","category":1,"code":2339},{"start":5976,"length":9,"messageText":"Property 'variantId' does not exist on type '{ baseProperty?: EnhancedObjectConfig | undefined; }'.","category":1,"code":2339},{"start":6001,"length":11,"messageText":"Property 'editorProps' does not exist on type '{ baseProperty?: EnhancedObjectConfig | undefined; }'.","category":1,"code":2339},{"start":10956,"length":4,"code":2339,"category":1,"messageText":"Property 'name' does not exist on type 'ObjectMetadata'."},{"start":11002,"length":14,"code":2741,"category":1,"messageText":"Property 'variantId' is missing in type '{ metadata: ObjectMetadata; value: any; handleChange: (v: any, event?: any, propertyId?: string | undefined) => void; as?: string | undefined; className?: string | undefined; ... 7 more ...; mode?: \"tags\" | ... 1 more ... | undefined; }' but required in type '{ [x: string]: any; value: any; disabled: any; variantId: any; baseProperty: any; }'.","canonicalHead":{"code":2322,"messageText":"Type '{ metadata: ObjectMetadata; value: any; handleChange: (v: any, event?: any, propertyId?: string | undefined) => void; as?: string | undefined; className?: string | undefined; ... 7 more ...; mode?: \"tags\" | ... 1 more ... | undefined; }' is not assignable to type '{ [x: string]: any; value: any; disabled: any; variantId: any; baseProperty: any; }'."}},{"start":13248,"length":23,"code":2741,"category":1,"messageText":"Property 'children' is missing in type '{ metadata: CompoundMetadata; value: any; handleChange: (v: any, event?: any, propertyId?: string | undefined) => void; as?: string | undefined; className?: string | undefined; ... 7 more ...; mode?: \"tags\" | ... 1 more ... | undefined; }' but required in type '{ className?: string | undefined; children: ReactNode; }'.","relatedInformation":[{"file":"./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/playgroundoutputcontrol/index.tsx","start":6904,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}],"canonicalHead":{"code":2322,"messageText":"Type '{ metadata: CompoundMetadata; value: any; handleChange: (v: any, event?: any, propertyId?: string | undefined) => void; as?: string | undefined; className?: string | undefined; ... 7 more ...; mode?: \"tags\" | ... 1 more ... | undefined; }' is not assignable to type '{ className?: string | undefined; children: ReactNode; }'."}}]],[6704,[{"start":100,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307}]],[6705,[{"start":300,"length":38,"messageText":"Cannot find module '@/oss/components/Common/ImagePreview' or its corresponding type declarations.","category":1,"code":2307},{"start":364,"length":38,"messageText":"Cannot find module '@/oss/lib/shared/variant/stringUtils' or its corresponding type declarations.","category":1,"code":2307},{"start":3066,"length":6,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'base64' does not exist in type 'UploadFile'."}]],[6706,[{"start":285,"length":32,"messageText":"Cannot find module '@/oss/components/Editor/Editor' or its corresponding type declarations.","category":1,"code":2307},{"start":349,"length":58,"messageText":"Cannot find module '@/oss/components/Editor/plugins/code/nodes/CodeBlockNode' or its corresponding type declarations.","category":1,"code":2307},{"start":442,"length":58,"messageText":"Cannot find module '@/oss/components/Editor/plugins/code/tryParsePartialJson' or its corresponding type declarations.","category":1,"code":2307},{"start":535,"length":40,"messageText":"Cannot find module '@/oss/components/TooltipWithCopyAction' or its corresponding type declarations.","category":1,"code":2307},{"start":623,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":707,"length":60,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/helpers/arrays' or its corresponding type declarations.","category":1,"code":2307},{"start":791,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":12569,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":13088,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":13790,"length":11,"messageText":"Binding element 'editorState' implicitly has an 'any' type.","category":1,"code":7031},{"start":14062,"length":11,"code":2339,"category":1,"messageText":"Property 'getLanguage' does not exist on type 'LexicalNode'."},{"start":14880,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":14896,"length":9,"code":2339,"category":1,"messageText":"Property 'messageId' does not exist on type '{}'."},{"start":14938,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":15164,"length":7,"code":2339,"category":1,"messageText":"Property 'message' does not exist on type '{}'."},{"start":15231,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":15258,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":15371,"length":8,"code":2339,"category":1,"messageText":"Property 'messages' does not exist on type '{}'."},{"start":15416,"length":8,"code":2339,"category":1,"messageText":"Property 'messages' does not exist on type '{}'."},{"start":15431,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":15523,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":15550,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":19072,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ propertyId: any; variantId: string; rowId: string | undefined; as: \"SimpleInput\"; className: string; disabled: boolean | undefined; placeholder: string; editorProps: { variant: string; }; }' is not assignable to type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'editorProps' does not exist on type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2339}]}},{"start":19710,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ propertyId: any; variantId: string; rowId: string | undefined; as: \"SimpleInput\"; className: string; disabled: boolean | undefined; placeholder: string; editorProps: { variant: string; }; }' is not assignable to type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'editorProps' does not exist on type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2339}]}},{"start":21075,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type '{ propertyId: any; variantId: string; rowId: string | undefined; as: \"SimpleDropdownSelect\"; className: string; disabled: boolean | undefined; runnable: boolean | undefined; resultHashes: string[]; actions: { ...; }; }' is not assignable to type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'runnable' does not exist on type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2339}]}},{"start":27170,"length":23,"messageText":"'imageProperties.length' is possibly 'undefined'.","category":1,"code":18048},{"start":27228,"length":15,"messageText":"'imageProperties' is possibly 'undefined'.","category":1,"code":18048},{"start":27365,"length":8,"messageText":"'property' is possibly 'null'.","category":1,"code":18047},{"start":27476,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ status: \"done\"; thumbUrl: any; } | undefined' is not assignable to type 'UploadFile | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type '{ status: \"done\"; thumbUrl: any; }' is missing the following properties from type 'UploadFile': uid, name","category":1,"code":2739,"canonicalHead":{"code":2322,"messageText":"Type '{ status: \"done\"; thumbUrl: any; }' is not assignable to type 'UploadFile'."}}]},"relatedInformation":[{"file":"./oss/src/components/playground/components/playgroundvariantpropertycontrol/assets/promptimageupload/types.d.ts","start":208,"length":9,"messageText":"The expected type comes from property 'imageFile' which is declared here on type 'IntrinsicAttributes & PromptImageUploadProps'","category":3,"code":6500}]},{"start":28082,"length":6,"code":2339,"category":1,"messageText":"Property 'base64' does not exist on type 'UploadFile'."},{"start":28626,"length":8,"messageText":"'property' is possibly 'null'.","category":1,"code":18047}]],[6707,[{"start":126,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/AddButton' or its corresponding type declarations.","category":1,"code":2307},{"start":195,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/RunButton' or its corresponding type declarations.","category":1,"code":2307},{"start":268,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":381,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":484,"length":71,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/messageHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":595,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":691,"length":41,"messageText":"Cannot find module '@/oss/components/Playground/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":780,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":855,"length":50,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state/types' or its corresponding type declarations.","category":1,"code":2307},{"start":975,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1577,"length":9,"messageText":"Property 'className' does not exist on type 'GenerationChatRowProps'.","category":1,"code":2339},{"start":4993,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":5680,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":6698,"length":11,"messageText":"Parameter 'historyItem' implicitly has an 'any' type.","category":1,"code":7006},{"start":7631,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006},{"start":7842,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":7988,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":8320,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":8466,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":8777,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":9163,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":9301,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":9706,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":10183,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":10523,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006},{"start":10670,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":11794,"length":12,"messageText":"Parameter '_historyItem' implicitly has an 'any' type.","category":1,"code":7006},{"start":12439,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":12567,"length":9,"messageText":"Parameter 'variantId' implicitly has an 'any' type.","category":1,"code":7006},{"start":13144,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":14668,"length":18,"messageText":"Expected 0 arguments, but got 1.","category":1,"code":2554}]],[6710,[{"start":174,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":255,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":331,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":412,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":1441,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006}]],[6711,[{"start":184,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/RunButton' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":63,"messageText":"Cannot find module '@/oss/components/Playground/assets/utilities/utilityFunctions' or its corresponding type declarations.","category":1,"code":2307},{"start":362,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":452,"length":40,"messageText":"Cannot find module '@/oss/components/TooltipWithCopyAction' or its corresponding type declarations.","category":1,"code":2307},{"start":519,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":577,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":658,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":1850,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":2069,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006},{"start":4863,"length":10,"messageText":"Parameter 'variableId' implicitly has an 'any' type.","category":1,"code":7006},{"start":6638,"length":25,"messageText":"This comparison appears to be unintentional because the types '\"single\"' and '\"comparison\"' have no overlap.","category":1,"code":2367},{"start":6726,"length":25,"messageText":"This comparison appears to be unintentional because the types '\"single\"' and '\"comparison\"' have no overlap.","category":1,"code":2367},{"start":8384,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":8393,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":14479,"length":10,"messageText":"Parameter 'variableId' implicitly has an 'any' type.","category":1,"code":7006}]],[6712,[{"start":95,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":180,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":279,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":365,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":1878,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":2657,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":3001,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":3349,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006},{"start":3560,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":3721,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":3934,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":4222,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":4382,"length":1,"messageText":"Parameter 'm' implicitly has an 'any' type.","category":1,"code":7006},{"start":4795,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":4870,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":5743,"length":10,"messageText":"Parameter 'inputRowId' implicitly has an 'any' type.","category":1,"code":7006},{"start":7694,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":7894,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ key: any; message: any; className: string; deleteMessage: (messageId: string) => void; variantId: string; rerunMessage: ((messageId: string) => void) | undefined; rowId: any; resultHash: any; isRunning: any; disabled: boolean; messageProps: { ...; }; }' is not assignable to type 'IntrinsicAttributes & GenerationChatRowProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'className' does not exist on type 'IntrinsicAttributes & GenerationChatRowProps'.","category":1,"code":2339}]}},{"start":9786,"length":9,"messageText":"Parameter 'variantId' implicitly has an 'any' type.","category":1,"code":7006},{"start":9797,"length":12,"messageText":"Parameter 'variantIndex' implicitly has an 'any' type.","category":1,"code":7006}]],[6713,[{"start":82,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/AddButton' or its corresponding type declarations.","category":1,"code":2307},{"start":159,"length":62,"messageText":"Cannot find module '@/oss/components/Playground/assets/utilities/componentLogger' or its corresponding type declarations.","category":1,"code":2307},{"start":248,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":333,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":437,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":523,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":612,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":693,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":1452,"length":3,"messageText":"Parameter 'row' implicitly has an 'any' type.","category":1,"code":7006},{"start":1608,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006},{"start":2655,"length":3,"messageText":"Parameter 'row' implicitly has an 'any' type.","category":1,"code":7006}]],[6714,[{"start":156,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":240,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":330,"length":40,"messageText":"Cannot find module '@/oss/components/TooltipWithCopyAction' or its corresponding type declarations.","category":1,"code":2307},{"start":401,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":4917,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":4926,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":8933,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '{ initialValue: any; handleChange: () => undefined; editorType: \"borderless\"; state: \"filled\"; readOnly: true; test: true; editorProps: { codeOnly: boolean; }; disabled: true; className: string; editorClassName: string; footer: Element; }' is not assignable to type 'IntrinsicAttributes & SharedEditorProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'test' does not exist on type 'IntrinsicAttributes & SharedEditorProps'.","category":1,"code":2339}]}}]],[6717,[{"start":118,"length":44,"messageText":"Cannot find module '@/oss/components/Playground/assets/Version' or its corresponding type declarations.","category":1,"code":2307},{"start":189,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":273,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":748,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006}]],[6718,[{"start":246,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":325,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":382,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":448,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307}]],[6719,[{"start":228,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":308,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":411,"length":71,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/messageHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":517,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":597,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":653,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":772,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":853,"length":39,"messageText":"Cannot find module '@/oss/lib/shared/variant/inputHelpers' or its corresponding type declarations.","category":1,"code":2307},{"start":1484,"length":6,"messageText":"Parameter 'prompt' implicitly has an 'any' type.","category":1,"code":7006},{"start":1558,"length":3,"messageText":"Parameter 'key' implicitly has an 'any' type.","category":1,"code":7006},{"start":2125,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006}]],[6720,[{"start":1660,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":1736,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."},{"start":2361,"length":11,"code":2339,"category":1,"messageText":"Property '__isRunning' does not exist on type '{}'."},{"start":2430,"length":8,"code":2339,"category":1,"messageText":"Property '__result' does not exist on type '{}'."}]],[6904,[{"start":298,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":416,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":477,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":1264,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":1371,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006},{"start":1565,"length":4,"messageText":"Parameter 'hash' implicitly has an 'any' type.","category":1,"code":7006},{"start":2250,"length":3,"messageText":"Parameter 'sum' implicitly has an 'any' type.","category":1,"code":7006},{"start":2255,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[6907,[{"start":151,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":246,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":319,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":401,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1897,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006},{"start":2148,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":2633,"length":4,"messageText":"Parameter 'tool' implicitly has an 'any' type.","category":1,"code":7006},{"start":2943,"length":31,"messageText":"'variantPrompt.llmConfig.tools' is possibly 'undefined'.","category":1,"code":18048},{"start":3000,"length":13,"messageText":"'variantPrompt' is possibly 'undefined'.","category":1,"code":18048},{"start":3000,"length":29,"messageText":"'variantPrompt.llmConfig.tools' is possibly 'undefined'.","category":1,"code":18048},{"start":3068,"length":31,"messageText":"'variantPrompt.llmConfig.tools' is possibly 'undefined'.","category":1,"code":18048},{"start":6431,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006},{"start":6752,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":7269,"length":9,"messageText":"Parameter 'messageId' implicitly has an 'any' type.","category":1,"code":7006},{"start":7737,"length":6,"messageText":"Parameter 'toolId' implicitly has an 'any' type.","category":1,"code":7006},{"start":7990,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '{ key: any; variantId: string; propertyId: any; promptName: any; debug: true; }' is not assignable to type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'promptName' does not exist on type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2339}]}},{"start":9082,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '{ variantId: string; propertyId: any; promptName: any; }' is not assignable to type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'promptName' does not exist on type 'IntrinsicAttributes & PlaygroundVariantPropertyControlProps'.","category":1,"code":2339}]}}]],[6910,[{"start":173,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":235,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1449,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006},{"start":1830,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006},{"start":2768,"length":8,"code":2551,"category":1,"messageText":"Property 'agConfig' does not exist on type 'VariantParameters'. Did you mean 'ag_config'?","relatedInformation":[{"file":"./oss/src/lib/shared/variant/transformer/types/variant.d.ts","start":756,"length":9,"messageText":"'ag_config' is declared here.","category":3,"code":2728}]},{"start":3306,"length":8,"messageText":"Parameter 'property' implicitly has an 'any' type.","category":1,"code":7006}]],[6914,[{"start":164,"length":47,"messageText":"Cannot find module '@/oss/components/Playground/assets/CommitNote' or its corresponding type declarations.","category":1,"code":2307}]],[6915,[{"start":149,"length":36,"messageText":"Cannot find module '@/oss/components/AppMessageContext' or its corresponding type declarations.","category":1,"code":2307},{"start":212,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307}]],[6916,[{"start":349,"length":5,"messageText":"Property 'label' does not exist on type 'NewVariantButtonProps'.","category":1,"code":2339}]],[6917,[{"start":90,"length":27,"messageText":"Cannot find module '@/oss/hooks/useFocusInput' or its corresponding type declarations.","category":1,"code":2307},{"start":1516,"length":9,"code":2322,"category":1,"messageText":{"messageText":"Type '{ className: string; variant: string; type: string; onClick: () => void; label: string; size: string; }' is not assignable to type 'IntrinsicAttributes & NewVariantButtonProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'className' does not exist on type 'IntrinsicAttributes & NewVariantButtonProps'.","category":1,"code":2339}]}}]],[6918,[{"start":286,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":360,"length":72,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus/components/EnvironmentStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":468,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6919,[{"start":172,"length":47,"messageText":"Cannot find module '@/oss/components/Playground/assets/CommitNote' or its corresponding type declarations.","category":1,"code":2307},{"start":240,"length":44,"messageText":"Cannot find module '@/oss/components/Playground/assets/Version' or its corresponding type declarations.","category":1,"code":2307},{"start":311,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":391,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2775,"length":45,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ name: string; type?: \"variant\" | \"version\" | null | undefined; }' is not assignable to parameter of type 'SetStateAction'.","category":1,"code":2345,"next":[{"messageText":"Type '{ name: string; type?: \"variant\" | \"version\" | null | undefined; }' is not assignable to type 'SelectedCommitType'.","category":1,"code":2322,"next":[{"messageText":"Types of property 'type' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type '\"variant\" | \"version\" | null | undefined' is not assignable to type '\"variant\" | \"version\" | null'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type '\"variant\" | \"version\" | null'.","category":1,"code":2322}],"canonicalHead":{"code":2322,"messageText":"Type '{ name: string; type?: \"variant\" | \"version\" | null | undefined; }' is not assignable to type 'SelectedCommitType'."}}]}]}]}}]],[6920,[{"start":160,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":223,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":307,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":382,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1794,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":2194,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":2203,"length":5,"messageText":"Parameter 'state' implicitly has an 'any' type.","category":1,"code":7006},{"start":2304,"length":2,"messageText":"Parameter 'id' implicitly has an 'any' type.","category":1,"code":7006},{"start":2495,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":4024,"length":21,"code":2322,"category":1,"messageText":{"messageText":"Type 'Dispatch>' is not assignable to type 'Dispatch>'.","category":1,"code":2322,"next":[{"messageText":"Type 'SetStateAction' is not assignable to type 'SetStateAction'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'SetStateAction'.","category":1,"code":2322}]}]},"relatedInformation":[{"file":"./oss/src/components/playground/components/modals/commitvariantchangesmodal/assets/types.d.ts","start":889,"length":21,"messageText":"The expected type comes from property 'setSelectedCommitType' which is declared here on type 'IntrinsicAttributes & CommitVariantChangesModalContentProps'","category":3,"code":6500}]}]],[6922,[{"start":150,"length":38,"messageText":"Cannot find module '@/oss/components/EnvironmentTagLabel' or its corresponding type declarations.","category":1,"code":2307},{"start":212,"length":47,"messageText":"Cannot find module '@/oss/components/Playground/assets/CommitNote' or its corresponding type declarations.","category":1,"code":2307},{"start":280,"length":44,"messageText":"Cannot find module '@/oss/components/Playground/assets/Version' or its corresponding type declarations.","category":1,"code":2307},{"start":1061,"length":4,"code":2339,"category":1,"messageText":"Property 'name' does not exist on type 'ExtendedEnvironment'."},{"start":1414,"length":21,"code":2339,"category":1,"messageText":"Property 'deployed_variant_name' does not exist on type 'ExtendedEnvironment'."},{"start":3357,"length":4,"code":2339,"category":1,"messageText":"Property 'name' does not exist on type 'ExtendedEnvironment'."}]],[6923,[{"start":181,"length":36,"messageText":"Cannot find module '@/oss/components/AppMessageContext' or its corresponding type declarations.","category":1,"code":2307},{"start":244,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":308,"length":48,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/usePostHogAg' or its corresponding type declarations.","category":1,"code":2307},{"start":415,"length":31,"messageText":"Cannot find module '@/oss/services/deployment/api' or its corresponding type declarations.","category":1,"code":2307}]],[6924,[{"start":189,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307},{"start":267,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":351,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/types' or its corresponding type declarations.","category":1,"code":2307},{"start":433,"length":32,"messageText":"Cannot find module '@/oss/lib/shared/variant/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":496,"length":49,"messageText":"Cannot find module '@/oss/services/deployment/hooks/useEnvironments' or its corresponding type declarations.","category":1,"code":2307},{"start":1383,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":1666,"length":3,"messageText":"Parameter 'env' implicitly has an 'any' type.","category":1,"code":7006},{"start":1869,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":2382,"length":5,"messageText":"Parameter 'state' implicitly has an 'any' type.","category":1,"code":7006},{"start":2446,"length":3,"messageText":"Parameter 'env' implicitly has an 'any' type.","category":1,"code":7006},{"start":3025,"length":17,"messageText":"Parameter 'availableRevision' implicitly has an 'any' type.","category":1,"code":7006},{"start":3507,"length":8,"messageText":"Parameter 'revision' implicitly has an 'any' type.","category":1,"code":7006}]],[6925,[{"start":145,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":225,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":324,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":978,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":1470,"length":2,"messageText":"Parameter 'id' implicitly has an 'any' type.","category":1,"code":7006}]],[6927,[{"start":254,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":338,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1103,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006}]],[6928,[{"start":121,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":205,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":298,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":384,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":1459,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":2163,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006},{"start":3003,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006}]],[6930,[{"start":125,"length":63,"messageText":"Cannot find module '@/oss/components/Playground/assets/utilities/utilityFunctions' or its corresponding type declarations.","category":1,"code":2307},{"start":228,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":310,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":368,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/state' or its corresponding type declarations.","category":1,"code":2307},{"start":442,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1340,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":1408,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":1592,"length":3,"messageText":"Parameter 'acc' implicitly has an 'any' type.","category":1,"code":7006},{"start":1597,"length":10,"messageText":"Parameter 'messageRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":1796,"length":3,"messageText":"Parameter 'acc' implicitly has an 'any' type.","category":1,"code":7006},{"start":1801,"length":11,"messageText":"Parameter 'historyItem' implicitly has an 'any' type.","category":1,"code":7006},{"start":2884,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":3260,"length":8,"messageText":"Parameter 'inputRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":3374,"length":10,"messageText":"Parameter 'messageRow' implicitly has an 'any' type.","category":1,"code":7006},{"start":3581,"length":7,"messageText":"Parameter 'message' implicitly has an 'any' type.","category":1,"code":7006},{"start":4189,"length":10,"messageText":"Parameter 'inputRowId' implicitly has an 'any' type.","category":1,"code":7006},{"start":5419,"length":9,"messageText":"Parameter 'messageId' implicitly has an 'any' type.","category":1,"code":7006},{"start":6178,"length":9,"messageText":"Parameter 'historyId' implicitly has an 'any' type.","category":1,"code":7006},{"start":6189,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006}]],[6931,[{"start":146,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":226,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":2630,"length":11,"messageText":"Parameter 'clonedState' implicitly has an 'any' type.","category":1,"code":7006}]],[6934,[{"start":279,"length":96,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/CustomWorkflowModal/hooks/useCustomWorkflowConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":402,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":463,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":535,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":610,"length":45,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer' or its corresponding type declarations.","category":1,"code":2307},{"start":7475,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ label: string; size: string; }' is not assignable to type 'IntrinsicAttributes & NewVariantButtonProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & NewVariantButtonProps'.","category":1,"code":2339}]}}]],[6940,[{"start":165,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":221,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6942,[{"start":35,"length":61,"messageText":"Cannot find module '@/oss/components/pages/observability/ObservabilityDashboard' or its corresponding type declarations.","category":1,"code":2307}]],[6944,[{"start":30,"length":37,"messageText":"Cannot find module '@/oss/components/VariantsComponents' or its corresponding type declarations.","category":1,"code":2307}]],[6946,[{"start":152,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":214,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":272,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307}]],[6947,[{"start":446,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":495,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":552,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":617,"length":46,"messageText":"Cannot find module '@/oss/components/pages/auth/PasswordlessAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":713,"length":47,"messageText":"Cannot find module '@/oss/components/pages/auth/EmailPasswordAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":803,"length":40,"messageText":"Cannot find module '@/oss/components/pages/auth/SocialAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":897,"length":37,"messageText":"Cannot find module '@/oss/components/pages/auth/SendOTP' or its corresponding type declarations.","category":1,"code":2307},{"start":991,"length":40,"messageText":"Cannot find module '@/oss/components/pages/auth/SideBanner' or its corresponding type declarations.","category":1,"code":2307},{"start":6173,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ message: AuthErrorMsgType; setMessage: Dispatch; authErrorMsg: (error: any) => void; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'message' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":6473,"length":12,"code":2322,"category":1,"messageText":{"messageText":"Type '{ authErrorMsg: (error: any) => void; disabled: boolean; isLoading: boolean; setIsLoading: Dispatch>; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'authErrorMsg' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":6801,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ email: string; setEmail: Dispatch>; isLoading: boolean; message: AuthErrorMsgType; setIsLoading: Dispatch>; setMessage: Dispatch<...>; authErrorMsg: (error: any) => void; setIsLoginCodeVisible: Dispatch<...>; disabled: boolean; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'email' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":7442,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ message: AuthErrorMsgType; email: string; setMessage: Dispatch; authErrorMsg: (error: any) => void; setIsLoginCodeVisible: Dispatch>; isInvitedUser: boolean; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'message' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[6949,[{"start":288,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":342,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":400,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":462,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":521,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":570,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":627,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6951,[{"start":107,"length":48,"messageText":"Cannot find module '@/oss/components/ProtectedRoute/ProtectedRoute' or its corresponding type declarations.","category":1,"code":2307},{"start":183,"length":41,"messageText":"Cannot find module '@/oss/components/Spinner/ContentSpinner' or its corresponding type declarations.","category":1,"code":2307},{"start":250,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":308,"length":17,"messageText":"Cannot find module '@/oss/lib/enums' or its corresponding type declarations.","category":1,"code":2307},{"start":364,"length":33,"messageText":"Cannot find module '@/oss/lib/helpers/variantHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":435,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":481,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":536,"length":38,"messageText":"Cannot find module '@/oss/services/human-evaluations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1432,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":1762,"length":4,"messageText":"Parameter 'data' implicitly has an 'any' type.","category":1,"code":7006},{"start":1890,"length":10,"messageText":"Parameter 'inputParam' implicitly has an 'any' type.","category":1,"code":7006},{"start":2113,"length":6,"messageText":"Parameter 'result' implicitly has an 'any' type.","category":1,"code":7006}]],[6952,[{"start":35,"length":61,"messageText":"Cannot find module '@/oss/components/pages/observability/ObservabilityDashboard' or its corresponding type declarations.","category":1,"code":2307},{"start":124,"length":48,"messageText":"Cannot find module '@/oss/components/ProtectedRoute/ProtectedRoute' or its corresponding type declarations.","category":1,"code":2307}]],[6954,[{"start":27,"length":48,"messageText":"Cannot find module '@/oss/components/PostSignupForm/PostSignupForm' or its corresponding type declarations.","category":1,"code":2307}]],[6955,[{"start":175,"length":48,"messageText":"Cannot find module '@/oss/components/ProtectedRoute/ProtectedRoute' or its corresponding type declarations.","category":1,"code":2307},{"start":253,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":314,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":375,"length":49,"messageText":"Cannot find module '@/oss/components/pages/settings/Secrets/Secrets' or its corresponding type declarations.","category":1,"code":2307},{"start":498,"length":65,"messageText":"Cannot find module '@/oss/components/pages/settings/WorkspaceManage/WorkspaceManage' or its corresponding type declarations.","category":1,"code":2307},{"start":623,"length":49,"messageText":"Cannot find module '@/oss/components/pages/settings/APIKeys/APIKeys' or its corresponding type declarations.","category":1,"code":2307},{"start":733,"length":41,"messageText":"Cannot find module '@/oss/components/pages/settings/Billing' or its corresponding type declarations.","category":1,"code":2307}]],[6957,[{"start":472,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":547,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":601,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":698,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":750,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":828,"length":39,"messageText":"Cannot find module '@/oss/components/pages/testset/modals' or its corresponding type declarations.","category":1,"code":2307},{"start":928,"length":53,"messageText":"Cannot find module '@/oss/components/pages/testset/modals/DeleteTestset' or its corresponding type declarations.","category":1,"code":2307}]],[6959,[{"start":25,"length":44,"messageText":"Cannot find module '@/oss/components/TestsetTable/TestsetTable' or its corresponding type declarations.","category":1,"code":2307}]],[6961,[{"start":189,"length":48,"messageText":"Cannot find module '@/oss/components/ProtectedRoute/ProtectedRoute' or its corresponding type declarations.","category":1,"code":2307},{"start":265,"length":41,"messageText":"Cannot find module '@/oss/components/Spinner/ContentSpinner' or its corresponding type declarations.","category":1,"code":2307},{"start":332,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":390,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":444,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":506,"length":30,"messageText":"Cannot find module '@/oss/services/workspace/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1652,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[6963,[{"start":72,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":123,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":188,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[6964,[{"start":242,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[6965,[{"start":211,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":273,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/errorHandler' or its corresponding type declarations.","category":1,"code":2307}]],[7007,[{"start":216,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307}]],[7009,[{"start":183,"length":35,"messageText":"Cannot find module '@/oss/lib/helpers/copyToClipboard' or its corresponding type declarations.","category":1,"code":2307}]],[7010,[{"start":242,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":293,"length":43,"messageText":"Cannot find module '@/oss/styles/tokens/antd-themeConfig.json' or its corresponding type declarations.","category":1,"code":2307}]],[7011,[{"start":333,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":407,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3423,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":4123,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":4897,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":6574,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":8518,"length":4,"messageText":"Parameter 'part' implicitly has an 'any' type.","category":1,"code":7006},{"start":11638,"length":3,"messageText":"Parameter 'img' implicitly has an 'any' type.","category":1,"code":7006},{"start":11643,"length":6,"messageText":"Parameter 'imgIdx' implicitly has an 'any' type.","category":1,"code":7006}]],[7012,[{"start":147,"length":134,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantPropertyControl/assets/PromptImageUpload/assets/components/ImageWithFallback' or its corresponding type declarations.","category":1,"code":2307}]],[7016,[{"start":209,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":275,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307}]],[7018,[{"start":171,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":273,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":354,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7019,[{"start":108,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":170,"length":44,"messageText":"Cannot find module '@/oss/lib/hooks/useStatelessVariants/types' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":352,"length":53,"messageText":"Cannot find module '@/oss/components/Playground/Components/SharedEditor' or its corresponding type declarations.","category":1,"code":2307},{"start":1423,"length":7,"messageText":"Parameter 'variant' implicitly has an 'any' type.","category":1,"code":7006},{"start":1981,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ editorProps: { codeOnly: boolean; validationSchema: { type: string; properties: {}; }; }; editorType: string; initialValue: any; value: any; handleChange: (value: string) => void; className: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'editorProps' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[7020,[{"start":241,"length":32,"messageText":"Cannot find module '@/oss/components/Avatar/Avatar' or its corresponding type declarations.","category":1,"code":2307},{"start":306,"length":38,"messageText":"Cannot find module '@/oss/components/EnvironmentTagLabel' or its corresponding type declarations.","category":1,"code":2307},{"start":387,"length":70,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantConfigPrompt' or its corresponding type declarations.","category":1,"code":2307},{"start":504,"length":74,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantCustomProperties' or its corresponding type declarations.","category":1,"code":2307},{"start":605,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":692,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":759,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":1259,"length":5,"messageText":"Parameter 'state' implicitly has an 'any' type.","category":1,"code":7006},{"start":8091,"length":3,"messageText":"Parameter 'env' implicitly has an 'any' type.","category":1,"code":7006},{"start":8096,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006}]],[7021,[{"start":269,"length":107,"messageText":"Cannot find module '@/oss/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton' or its corresponding type declarations.","category":1,"code":2307},{"start":409,"length":93,"messageText":"Cannot find module '@/oss/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton' or its corresponding type declarations.","category":1,"code":2307},{"start":529,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":616,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":686,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":738,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":789,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":838,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":1161,"length":5,"messageText":"Parameter 'state' implicitly has an 'any' type.","category":1,"code":7006},{"start":2075,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006},{"start":8060,"length":10,"messageText":"Binding element 'revisionId' implicitly has an 'any' type.","category":1,"code":7031},{"start":8072,"length":9,"messageText":"Binding element 'variantId' implicitly has an 'any' type.","category":1,"code":7031}]],[7022,[{"start":240,"length":38,"messageText":"Cannot find module '@/oss/components/EnvironmentTagLabel' or its corresponding type declarations.","category":1,"code":2307}]],[7023,[{"start":166,"length":37,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Drawer' or its corresponding type declarations.","category":1,"code":2307},{"start":230,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":314,"length":55,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground/types' or its corresponding type declarations.","category":1,"code":2307},{"start":393,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":444,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":497,"length":49,"messageText":"Cannot find module '@/oss/services/deployment/hooks/useEnvironments' or its corresponding type declarations.","category":1,"code":2307},{"start":2856,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006}]],[7024,[{"start":239,"length":49,"messageText":"Cannot find module '@/oss/code_snippets/endpoints/fetch_config/curl' or its corresponding type declarations.","category":1,"code":2307},{"start":323,"length":51,"messageText":"Cannot find module '@/oss/code_snippets/endpoints/fetch_config/python' or its corresponding type declarations.","category":1,"code":2307},{"start":405,"length":55,"messageText":"Cannot find module '@/oss/code_snippets/endpoints/fetch_config/typescript' or its corresponding type declarations.","category":1,"code":2307},{"start":494,"length":51,"messageText":"Cannot find module '@/oss/code_snippets/endpoints/invoke_llm_app/curl' or its corresponding type declarations.","category":1,"code":2307},{"start":581,"length":53,"messageText":"Cannot find module '@/oss/code_snippets/endpoints/invoke_llm_app/python' or its corresponding type declarations.","category":1,"code":2307},{"start":666,"length":57,"messageText":"Cannot find module '@/oss/code_snippets/endpoints/invoke_llm_app/typescript' or its corresponding type declarations.","category":1,"code":2307},{"start":754,"length":87,"messageText":"Cannot find module '@/oss/components/pages/overview/deployments/DeploymentDrawer/assets/LanguageCodeBlock' or its corresponding type declarations.","category":1,"code":2307},{"start":861,"length":75,"messageText":"Cannot find module '@/oss/components/pages/overview/deployments/DeploymentDrawer/hooks/useURI' or its corresponding type declarations.","category":1,"code":2307},{"start":963,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":1015,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":1068,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1147,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1192,"length":37,"messageText":"Cannot find module '@/oss/pages/apps/[app_id]/endpoints' or its corresponding type declarations.","category":1,"code":2307},{"start":1277,"length":62,"messageText":"Cannot find module '@/oss/components/pages/app-management/components/ApiKeyInput' or its corresponding type declarations.","category":1,"code":2307},{"start":3769,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ apiKeyValue: string; onApiKeyChange: Dispatch>; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'apiKeyValue' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":4574,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ apiKeyValue: string; onApiKeyChange: Dispatch>; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'apiKeyValue' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":5369,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ apiKeyValue: string; onApiKeyChange: Dispatch>; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'apiKeyValue' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[7026,[{"start":405,"length":37,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Drawer' or its corresponding type declarations.","category":1,"code":2307},{"start":466,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":512,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7027,[{"start":235,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":295,"length":47,"messageText":"Cannot find module '@/oss/components/Playground/assets/CommitNote' or its corresponding type declarations.","category":1,"code":2307},{"start":380,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":454,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":522,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7028,[{"start":259,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":322,"length":43,"messageText":"Cannot find module '@/oss/components/VariantsComponents/Table' or its corresponding type declarations.","category":1,"code":2307},{"start":396,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":475,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":516,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3480,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006}]],[7029,[{"start":285,"length":38,"messageText":"Cannot find module '@/oss/components/TruncatedTooltipTag' or its corresponding type declarations.","category":1,"code":2307},{"start":358,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7030,[{"start":231,"length":33,"messageText":"Cannot find module '@/oss/components/EmptyComponent' or its corresponding type declarations.","category":1,"code":2307},{"start":288,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":339,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":396,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7031,[{"start":279,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":330,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":377,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":447,"length":51,"messageText":"Cannot find module '@/oss/lib/shared/variant/genericTransformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":549,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":674,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":715,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":769,"length":31,"messageText":"Cannot find module '@/oss/services/deployment/api' or its corresponding type declarations.","category":1,"code":2307},{"start":848,"length":41,"messageText":"Cannot find module '@/oss/services/deploymentVersioning/api' or its corresponding type declarations.","category":1,"code":2307},{"start":3938,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":3941,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006},{"start":4038,"length":3,"messageText":"Parameter 'rev' implicitly has an 'any' type.","category":1,"code":7006},{"start":4043,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006},{"start":4671,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":9026,"length":15,"code":2322,"category":1,"messageText":{"messageText":"Type '{ revisions: any; setSelectedRevisionRow: Dispatch; handleFetchRevisionConfig: (revisionId: string) => Promise; setIsRevertModalOpen: Dispatch>; setSelectedVariantRevisionIdToRevert: Dispatch<...>; envRevisions: any; setIsSelectDeployVariantModalOpen: Dispatch<...>; setQueryVariant...' is not assignable to type 'IntrinsicAttributes & DeploymentTableProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'setQueryVariant' does not exist on type 'IntrinsicAttributes & DeploymentTableProps'.","category":1,"code":2339}]}}]],[7032,[{"start":145,"length":77,"messageText":"Cannot find module '@/oss/components/VariantsComponents/Drawers/VariantDrawer/assets/Parameters' or its corresponding type declarations.","category":1,"code":2307},{"start":249,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":316,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":368,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":430,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":487,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7033,[{"start":57,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":141,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7037,[{"start":212,"length":45,"messageText":"Cannot find module '@/oss/components/DynamicCodeBlock/CodeBlock' or its corresponding type declarations.","category":1,"code":2307},{"start":285,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7061,[{"start":3145,"length":27,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '(event: KeyboardEvent) => boolean | undefined' is not assignable to parameter of type 'CommandListener'.","category":1,"code":2345,"next":[{"messageText":"Type 'boolean | undefined' is not assignable to type 'boolean'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'boolean'.","category":1,"code":2322}]}]}},{"start":9849,"length":6,"code":2339,"category":1,"messageText":"Property 'anchor' does not exist on type 'BaseSelection'."}]],[7062,[{"start":6342,"length":203,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ lines: string[]; anchorNode: TextNode | ElementNode; anchorOffset: number; currentLine: ElementNode; parentBlock: ElementNode; }' is not assignable to parameter of type '{ lines: string[]; anchorNode: any; anchorOffset: number; currentLine: any; parentBlock: any; beforeNodes: any[]; afterNodes: any[]; beforeContent: string; afterContent: string; followingLines: any[]; insertIndex?: number | ... 1 more ... | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Type '{ lines: string[]; anchorNode: TextNode | ElementNode; anchorOffset: number; currentLine: ElementNode; parentBlock: ElementNode; }' is missing the following properties from type '{ lines: string[]; anchorNode: any; anchorOffset: number; currentLine: any; parentBlock: any; beforeNodes: any[]; afterNodes: any[]; beforeContent: string; afterContent: string; followingLines: any[]; insertIndex?: number | ... 1 more ... | undefined; }': beforeNodes, afterNodes, beforeContent, afterContent, followingLines","category":1,"code":2739}]}}]],[7064,[{"start":12563,"length":11,"code":2339,"category":1,"messageText":"Property 'getChildren' does not exist on type 'LexicalNode'."},{"start":13230,"length":4,"messageText":"Parameter 'node' implicitly has an 'any' type.","category":1,"code":7006},{"start":13303,"length":4,"messageText":"Parameter 'node' implicitly has an 'any' type.","category":1,"code":7006},{"start":13890,"length":14,"code":2339,"category":1,"messageText":"Property 'getTextContent' does not exist on type 'never'."},{"start":14178,"length":6,"code":2339,"category":1,"messageText":"Property 'getKey' does not exist on type 'never'."},{"start":14330,"length":6,"code":2339,"category":1,"messageText":"Property 'getKey' does not exist on type 'never'."},{"start":14529,"length":6,"code":2339,"category":1,"messageText":"Property 'remove' does not exist on type 'never'."},{"start":14754,"length":11,"code":2339,"category":1,"messageText":"Property 'getChildren' does not exist on type 'LexicalNode'."},{"start":16607,"length":11,"code":2339,"category":1,"messageText":"Property 'getChildren' does not exist on type 'LexicalNode'."}]],[7065,[{"start":1745,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type 'ElementNode | null' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322}]}},{"start":3931,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type 'ElementNode | null' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322}]}},{"start":6763,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type 'ElementNode | null' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'null' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322}]}},{"start":9470,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type 'LexicalNode' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'LexicalNode' is missing the following properties from type 'ElementNode': __first, __last, __size, __format, and 53 more.","category":1,"code":2740,"canonicalHead":{"code":2322,"messageText":"Type 'LexicalNode' is not assignable to type 'ElementNode'."}}]}},{"start":10726,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type 'LexicalNode' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'LexicalNode' is missing the following properties from type 'ElementNode': __first, __last, __size, __format, and 53 more.","category":1,"code":2740,"canonicalHead":{"code":2322,"messageText":"Type 'LexicalNode' is not assignable to type 'ElementNode'."}}]}},{"start":11558,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type 'LexicalNode' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'LexicalNode' is missing the following properties from type 'ElementNode': __first, __last, __size, __format, and 53 more.","category":1,"code":2740,"canonicalHead":{"code":2322,"messageText":"Type 'LexicalNode' is not assignable to type 'ElementNode'."}}]}},{"start":12839,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type 'LexicalNode' is not assignable to type 'TextNode | ElementNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'LexicalNode' is missing the following properties from type 'ElementNode': __first, __last, __size, __format, and 53 more.","category":1,"code":2740,"canonicalHead":{"code":2322,"messageText":"Type 'LexicalNode' is not assignable to type 'ElementNode'."}}]}},{"start":22478,"length":6,"code":2339,"category":1,"messageText":"Property 'anchor' does not exist on type 'BaseSelection'."},{"start":22542,"length":6,"code":2339,"category":1,"messageText":"Property 'anchor' does not exist on type 'BaseSelection'."},{"start":22605,"length":5,"code":2339,"category":1,"messageText":"Property 'focus' does not exist on type 'BaseSelection'."},{"start":22667,"length":5,"code":2339,"category":1,"messageText":"Property 'focus' does not exist on type 'BaseSelection'."},{"start":22725,"length":4,"code":2339,"category":1,"messageText":"Property 'type' does not exist on type 'BaseSelection'."}]],[7066,[{"start":1689,"length":27,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '(event: KeyboardEvent) => boolean | undefined' is not assignable to parameter of type 'CommandListener'.","category":1,"code":2345,"next":[{"messageText":"Type 'boolean | undefined' is not assignable to type 'boolean'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'boolean'.","category":1,"code":2322}]}]}},{"start":7948,"length":24,"messageText":"Expected 4-5 arguments, but got 2.","category":1,"code":2554,"relatedInformation":[{"file":"./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","start":7028,"length":27,"messageText":"An argument for 'hasValidationError' was not provided.","category":3,"code":6210}]}]],[7067,[{"start":1815,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3095,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[7068,[{"start":6517,"length":24,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'BaseSelection | undefined' is not assignable to parameter of type 'RangeSelection'.","category":1,"code":2345,"next":[{"messageText":"Type 'undefined' is not assignable to type 'RangeSelection'.","category":1,"code":2322}]}}]],[7070,[{"start":3292,"length":24,"messageText":"Expected 4-5 arguments, but got 1.","category":1,"code":2554,"relatedInformation":[{"file":"./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","start":7001,"length":21,"messageText":"An argument for 'highlightType' was not provided.","category":3,"code":6210}]},{"start":4115,"length":8,"code":2345,"category":1,"messageText":"Argument of type 'string' is not assignable to parameter of type '\"json\" | \"yaml\"'."},{"start":4195,"length":24,"messageText":"Expected 4-5 arguments, but got 1.","category":1,"code":2554,"relatedInformation":[{"file":"./oss/src/components/editor/plugins/code/nodes/codehighlightnode.ts","start":7001,"length":21,"messageText":"An argument for 'highlightType' was not provided.","category":3,"code":6210}]},{"start":11247,"length":5,"messageText":"Parameter 'props' implicitly has an 'any' type.","category":1,"code":7006}]],[7079,[{"start":1516,"length":12,"messageText":"Property 'initialValue' does not exist on type 'EditorPluginsProps'.","category":1,"code":2339}]],[7080,[{"start":7125,"length":12,"code":2322,"category":1,"messageText":{"messageText":"Type '{ autoFocus: boolean; showToolbar: boolean; singleLine: boolean; codeOnly: boolean; enableTokens: boolean; debug: boolean; language: string | undefined; placeholder: string; handleUpdate: (editorState: EditorState, _editor: LexicalEditor) => void; initialValue: string; validationSchema: unknown; }' is not assignable to type 'IntrinsicAttributes & EditorPluginsProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'initialValue' does not exist on type 'IntrinsicAttributes & EditorPluginsProps'.","category":1,"code":2339}]}},{"start":9606,"length":10,"messageText":"Property 'noProvider' does not exist on type 'EditorProps'.","category":1,"code":2339},{"start":9821,"length":10,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'skipHandle' does not exist in type 'Pick'."},{"start":11002,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type '{ width: number; height: number; } | { width: string; maxWidth: string; height: string; }' is not assignable to type '{ width: number; height: number; } | undefined'.","category":1,"code":2322,"next":[{"messageText":"Object literal may only specify known properties, and 'maxWidth' does not exist in type '{ width: number; height: number; }'.","category":1,"code":2353}]},"relatedInformation":[{"file":"./oss/src/components/editor/types.d.ts","start":878,"length":10,"messageText":"The expected type comes from property 'dimensions' which is declared here on type 'IntrinsicAttributes & EditorProps & { children: ReactNode; }'","category":3,"code":6500}]},{"start":12170,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type '{ width: number; height: number; } | { width: string; maxWidth: string; height: string; }' is not assignable to type '{ width: number; height: number; } | undefined'.","category":1,"code":2322,"next":[{"messageText":"Object literal may only specify known properties, and 'maxWidth' does not exist in type '{ width: number; height: number; }'.","category":1,"code":2353}]},"relatedInformation":[{"file":"./oss/src/components/editor/types.d.ts","start":878,"length":10,"messageText":"The expected type comes from property 'dimensions' which is declared here on type 'IntrinsicAttributes & Omit & RefAttributes'","category":3,"code":6500}]}]],[7083,[{"start":216,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7089,[{"start":332,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":391,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7090,[{"start":307,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7091,[{"start":452,"length":21,"messageText":"Cannot find module './state/editColumns' or its corresponding type declarations.","category":1,"code":2307},{"start":3428,"length":6,"messageText":"Type 'ItemType[] | undefined' has no matching index signature for type 'number'.","category":1,"code":2537},{"start":3825,"length":9,"code":2339,"category":1,"messageText":{"messageText":"Property 'dataIndex' does not exist on type 'ColumnGroupType | ColumnType'.","category":1,"code":2339,"next":[{"messageText":"Property 'dataIndex' does not exist on type 'ColumnGroupType'.","category":1,"code":2339}]}},{"start":3911,"length":9,"code":2339,"category":1,"messageText":{"messageText":"Property 'dataIndex' does not exist on type 'ColumnGroupType | ColumnType'.","category":1,"code":2339,"next":[{"messageText":"Property 'dataIndex' does not exist on type 'ColumnGroupType'.","category":1,"code":2339}]}}]],[7113,[{"start":32,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7121,[{"start":189,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/errorHandler' or its corresponding type declarations.","category":1,"code":2307}]],[7122,[{"start":214,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7123,[{"start":238,"length":53,"messageText":"Cannot find module '@/oss/components/Playground/Components/SharedEditor' or its corresponding type declarations.","category":1,"code":2307},{"start":326,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":410,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":465,"length":33,"messageText":"Cannot find module '@/oss/services/app-selector/api' or its corresponding type declarations.","category":1,"code":2307},{"start":2236,"length":2,"code":2339,"category":1,"messageText":"Property 'id' does not exist on type '{}'."},{"start":7125,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006},{"start":9382,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006}]],[7124,[{"start":91,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":149,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":211,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":267,"length":48,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/usePostHogAg' or its corresponding type declarations.","category":1,"code":2307},{"start":342,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":396,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":448,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":512,"length":26,"messageText":"Cannot find module '@/oss/lib/shared/variant' or its corresponding type declarations.","category":1,"code":2307},{"start":589,"length":33,"messageText":"Cannot find module '@/oss/services/app-selector/api' or its corresponding type declarations.","category":1,"code":2307},{"start":2815,"length":6,"messageText":"Parameter 'status' implicitly has an 'any' type.","category":1,"code":7006},{"start":2823,"length":7,"messageText":"Parameter 'details' implicitly has an 'any' type.","category":1,"code":7006},{"start":2832,"length":5,"messageText":"Parameter 'appId' implicitly has an 'any' type.","category":1,"code":7006},{"start":3572,"length":3,"messageText":"Parameter 'app' implicitly has an 'any' type.","category":1,"code":7006}]],[7125,[{"start":651,"length":35,"code":2352,"category":1,"messageText":{"messageText":"Conversion of type '{ themeMode: string; }' to type 'StyleProps' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.","category":1,"code":2352,"next":[{"messageText":"Property 'footerHeight' is missing in type '{ themeMode: string; }' but required in type 'StyleProps'.","category":1,"code":2741}]},"relatedInformation":[{"file":"./oss/src/components/layout/assets/styles.ts","start":177,"length":12,"messageText":"'footerHeight' is declared here.","category":3,"code":2728}]}]],[7127,[{"start":175,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":235,"length":32,"messageText":"Cannot find module '@/oss/components/Avatar/Avatar' or its corresponding type declarations.","category":1,"code":2307},{"start":289,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7128,[{"start":349,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":403,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":455,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307},{"start":505,"length":26,"messageText":"Cannot find module '@/oss/hooks/useCrispChat' or its corresponding type declarations.","category":1,"code":2307},{"start":557,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307},{"start":603,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7129,[{"start":270,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":314,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7130,[{"start":365,"length":32,"messageText":"Cannot find module '@/oss/components/Avatar/Avatar' or its corresponding type declarations.","category":1,"code":2307},{"start":436,"length":41,"messageText":"Cannot find module '@/oss/components/SidePanel/Subscription' or its corresponding type declarations.","category":1,"code":2307},{"start":503,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":561,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":623,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":681,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307}]],[7131,[{"start":570,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":624,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":682,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":777,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":837,"length":48,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/usePostHogAg' or its corresponding type declarations.","category":1,"code":2307},{"start":912,"length":29,"messageText":"Cannot find module '@/oss/lib/hooks/useVariants' or its corresponding type declarations.","category":1,"code":2307},{"start":3634,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006}]],[7461,[{"start":231,"length":36,"messageText":"Cannot find module '@/oss/components/SelectLLMProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":297,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":352,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":419,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":477,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":3879,"length":3,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | symbol' is not assignable to type 'Key | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'symbol' is not assignable to type 'Key | null | undefined'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/index.d.ts","start":7743,"length":3,"messageText":"The expected type comes from property 'key' which is declared here on type 'IntrinsicAttributes & FormItemProps'","category":3,"code":6500}]},{"start":3923,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | symbol' is not assignable to type 'string | (() => string) | (() => symbol) | ((hint: string) => symbol) | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'number' is not assignable to type 'string | (() => string) | (() => symbol) | ((hint: string) => symbol) | undefined'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/.pnpm/rc-field-form@2.7.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/rc-field-form/lib/field.d.ts","start":2027,"length":4,"messageText":"The expected type comes from property 'name' which is declared here on type 'IntrinsicAttributes & FormItemProps'","category":3,"code":6500}]}]],[7463,[{"start":97,"length":37,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Drawer' or its corresponding type declarations.","category":1,"code":2307}]],[7465,[{"start":134,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":200,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307}]],[7467,[{"start":138,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":204,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":259,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307}]],[7468,[{"start":251,"length":31,"messageText":"Cannot find module '@/oss/hooks/useResizeObserver' or its corresponding type declarations.","category":1,"code":2307},{"start":306,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7469,[{"start":137,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7471,[{"start":141,"length":40,"messageText":"Cannot find module '@/oss/components/ChatInputs/ChatInputs' or its corresponding type declarations.","category":1,"code":2307},{"start":212,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":277,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":7077,"length":3,"messageText":"Parameter 'val' implicitly has an 'any' type.","category":1,"code":7006}]],[7477,[{"start":134,"length":24,"messageText":"Cannot find module '@/oss/config/constants' or its corresponding type declarations.","category":1,"code":2307}]],[7479,[{"start":103,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7481,[{"start":170,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/RunButton' or its corresponding type declarations.","category":1,"code":2307}]],[7485,[{"start":65,"length":64,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":157,"length":50,"messageText":"Cannot find module '@/oss/components/Playground/hooks/useDrawerWidth' or its corresponding type declarations.","category":1,"code":2307},{"start":234,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":1041,"length":9,"messageText":"Parameter 'variantId' implicitly has an 'any' type.","category":1,"code":7006}]],[7487,[{"start":60,"length":44,"messageText":"Cannot find module '@/oss/components/Playground/assets/Version' or its corresponding type declarations.","category":1,"code":2307},{"start":144,"length":107,"messageText":"Cannot find module '@/oss/components/Playground/Components/Modals/CommitVariantChangesModal/assets/CommitVariantChangesButton' or its corresponding type declarations.","category":1,"code":2307},{"start":284,"length":93,"messageText":"Cannot find module '@/oss/components/Playground/Components/Modals/DeployVariantModal/assets/DeployVariantButton' or its corresponding type declarations.","category":1,"code":2307}]],[7488,[{"start":106,"length":70,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantConfigPrompt' or its corresponding type declarations.","category":1,"code":2307},{"start":204,"length":50,"messageText":"Cannot find module '@/oss/components/Playground/hooks/useDrawerWidth' or its corresponding type declarations.","category":1,"code":2307},{"start":281,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":361,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":956,"length":6,"messageText":"Parameter 'prompt' implicitly has an 'any' type.","category":1,"code":7006},{"start":1691,"length":8,"messageText":"Parameter 'promptId' implicitly has an 'any' type.","category":1,"code":7006}]],[7496,[{"start":22,"length":46,"messageText":"Cannot find module '@/oss/components/Playground/assets/AddButton' or its corresponding type declarations.","category":1,"code":2307}]],[7498,[{"start":188,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/assets/DeployButton' or its corresponding type declarations.","category":1,"code":2307},{"start":258,"length":44,"messageText":"Cannot find module '@/oss/components/Playground/assets/Version' or its corresponding type declarations.","category":1,"code":2307}]],[7499,[{"start":128,"length":70,"messageText":"Cannot find module '@/oss/components/Playground/Components/PlaygroundVariantConfigPrompt' or its corresponding type declarations.","category":1,"code":2307},{"start":225,"length":49,"messageText":"Cannot find module '@/oss/components/Playground/hooks/usePlayground' or its corresponding type declarations.","category":1,"code":2307},{"start":305,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":931,"length":6,"messageText":"Parameter 'prompt' implicitly has an 'any' type.","category":1,"code":7006},{"start":1865,"length":8,"messageText":"Parameter 'promptId' implicitly has an 'any' type.","category":1,"code":7006}]],[7500,[{"start":71,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7501,[{"start":197,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7503,[{"start":119,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":188,"length":46,"messageText":"Cannot find module '@/oss/components/Scripts/assets/CloudScripts' or its corresponding type declarations.","category":1,"code":2307}]],[7504,[{"start":205,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":262,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":316,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":374,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":2444,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006},{"start":2802,"length":5,"messageText":"Parameter 'group' implicitly has an 'any' type.","category":1,"code":7006},{"start":6361,"length":5,"messageText":"Parameter 'group' implicitly has an 'any' type.","category":1,"code":7006},{"start":6368,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006}]],[7506,[{"start":194,"length":31,"messageText":"Cannot find module '@/oss/hooks/useResizeObserver' or its corresponding type declarations.","category":1,"code":2307},{"start":250,"length":26,"messageText":"Cannot find module '@/oss/lib/helpers/agGrid' or its corresponding type declarations.","category":1,"code":2307},{"start":302,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7510,[{"start":234,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7514,[{"start":168,"length":32,"messageText":"Cannot find module '@/oss/components/Avatar/Avatar' or its corresponding type declarations.","category":1,"code":2307},{"start":233,"length":38,"messageText":"Cannot find module '@/oss/components/TruncatedTooltipTag' or its corresponding type declarations.","category":1,"code":2307},{"start":309,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":399,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":455,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2473,"length":7,"code":2322,"category":1,"messageText":"Type '{}' is not assignable to type 'ReactNode'.","relatedInformation":[{"file":"./node_modules/.pnpm/@types+react@19.0.10/node_modules/@types/react/index.d.ts","start":82613,"length":8,"messageText":"The expected type comes from property 'children' which is declared here on type 'DetailedHTMLProps, HTMLDivElement>'","category":3,"code":6500}]}]],[7515,[{"start":201,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307}]],[7516,[{"start":98,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7519,[{"start":275,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":347,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7520,[{"start":276,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":349,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":411,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7521,[{"start":222,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7522,[{"start":384,"length":48,"messageText":"Cannot find module '@/oss/components/NoResultsFound/NoResultsFound' or its corresponding type declarations.","category":1,"code":2307},{"start":459,"length":27,"messageText":"Cannot find module '@/oss/hooks/usePagination' or its corresponding type declarations.","category":1,"code":2307},{"start":524,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":706,"length":61,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/DeleteAppModal' or its corresponding type declarations.","category":1,"code":2307},{"start":824,"length":59,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/EditAppModal' or its corresponding type declarations.","category":1,"code":2307},{"start":5174,"length":3,"messageText":"Parameter 'app' implicitly has an 'any' type.","category":1,"code":7006}]],[7523,[{"start":242,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7524,[{"start":211,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7525,[{"start":161,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":236,"length":50,"messageText":"Cannot find module '@/oss/components/ResultComponent/ResultComponent' or its corresponding type declarations.","category":1,"code":2307},{"start":313,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":367,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":425,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":487,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":549,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":605,"length":48,"messageText":"Cannot find module '@/oss/lib/helpers/analytics/hooks/usePostHogAg' or its corresponding type declarations.","category":1,"code":2307},{"start":685,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307},{"start":739,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":815,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":865,"length":20,"messageText":"Cannot find module '@/oss/services/api' or its corresponding type declarations.","category":1,"code":2307},{"start":947,"length":33,"messageText":"Cannot find module '@/oss/services/app-selector/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1006,"length":48,"messageText":"Cannot find module '@/oss/services/app-selector/hooks/useTemplates' or its corresponding type declarations.","category":1,"code":2307},{"start":1532,"length":67,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/CreateAppStatusModal' or its corresponding type declarations.","category":1,"code":2307},{"start":1668,"length":70,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/AddAppFromTemplateModal' or its corresponding type declarations.","category":1,"code":2307},{"start":1794,"length":58,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/MaxAppModal' or its corresponding type declarations.","category":1,"code":2307},{"start":1915,"length":64,"messageText":"Cannot find module '@/oss/components/pages/app-management/modals/SetupTracingModal' or its corresponding type declarations.","category":1,"code":2307},{"start":2054,"length":80,"messageText":"Cannot find module '@/oss/components/pages/app-management/components/ObservabilityDashboardSection' or its corresponding type declarations.","category":1,"code":2307},{"start":2202,"length":74,"messageText":"Cannot find module '@/oss/components/pages/app-management/components/DemoApplicationsSection' or its corresponding type declarations.","category":1,"code":2307},{"start":4429,"length":6,"messageText":"Parameter 'status' implicitly has an 'any' type.","category":1,"code":7006},{"start":4437,"length":7,"messageText":"Parameter 'details' implicitly has an 'any' type.","category":1,"code":7006},{"start":4446,"length":5,"messageText":"Parameter 'appId' implicitly has an 'any' type.","category":1,"code":7006},{"start":6352,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":6355,"length":1,"messageText":"Parameter 'b' implicitly has an 'any' type.","category":1,"code":7006},{"start":6497,"length":3,"messageText":"Parameter 'app' implicitly has an 'any' type.","category":1,"code":7006}]],[7527,[{"start":90,"length":53,"messageText":"Cannot find module '@/oss/components/Playground/Components/SharedEditor' or its corresponding type declarations.","category":1,"code":2307}]],[7530,[{"start":274,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/errorHandler' or its corresponding type declarations.","category":1,"code":2307},{"start":345,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7531,[{"start":99,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":155,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":197,"length":33,"messageText":"Cannot find module '@/oss/services/app-selector/api' or its corresponding type declarations.","category":1,"code":2307}]],[7532,[{"start":204,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":259,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":321,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":399,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":445,"length":33,"messageText":"Cannot find module '@/oss/services/app-selector/api' or its corresponding type declarations.","category":1,"code":2307}]],[7533,[{"start":228,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7534,[{"start":388,"length":40,"messageText":"Cannot find module '@/oss/components/CopyButton/CopyButton' or its corresponding type declarations.","category":1,"code":2307},{"start":455,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":513,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307},{"start":565,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":614,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":684,"length":62,"messageText":"Cannot find module '@/oss/components/pages/app-management/components/ApiKeyInput' or its corresponding type declarations.","category":1,"code":2307}]],[7535,[{"start":164,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7537,[{"start":177,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":235,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":297,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307}]],[7538,[{"start":152,"length":53,"messageText":"Cannot find module '@/oss/components/pages/auth/assets/ShowErrorMessage' or its corresponding type declarations.","category":1,"code":2307}]],[7539,[{"start":382,"length":53,"messageText":"Cannot find module '@/oss/components/pages/auth/assets/ShowErrorMessage' or its corresponding type declarations.","category":1,"code":2307},{"start":461,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":515,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":573,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":635,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":694,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":743,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7541,[{"start":265,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/dynamicEnv' or its corresponding type declarations.","category":1,"code":2307}]],[7543,[{"start":113,"length":38,"messageText":"Cannot find module '@/oss/components/ResultTag/ResultTag' or its corresponding type declarations.","category":1,"code":2307},{"start":184,"length":38,"messageText":"Cannot find module '@/oss/components/TruncatedTooltipTag' or its corresponding type declarations.","category":1,"code":2307},{"start":250,"length":36,"messageText":"Cannot find module '@/oss/components/ui/LabelValuePill' or its corresponding type declarations.","category":1,"code":2307},{"start":311,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":408,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":469,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":523,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":598,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7544,[{"start":239,"length":40,"messageText":"Cannot find module '@/oss/components/CopyButton/CopyButton' or its corresponding type declarations.","category":1,"code":2307},{"start":306,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":383,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":432,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7545,[{"start":194,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":649,"length":5,"messageText":"Parameter 'value' implicitly has an 'any' type.","category":1,"code":7006},{"start":1358,"length":2,"messageText":"Parameter 'ev' implicitly has an 'any' type.","category":1,"code":7006},{"start":1382,"length":4,"messageText":"Parameter 'slug' implicitly has an 'any' type.","category":1,"code":7006},{"start":2315,"length":9,"messageText":"Parameter 'evaluator' implicitly has an 'any' type.","category":1,"code":7006}]],[7546,[{"start":276,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":449,"length":86,"messageText":"Cannot find module '@/oss/components/ModelRegistry/Drawers/ConfigureProviderDrawer/assets/ModelNameInput' or its corresponding type declarations.","category":1,"code":2307},{"start":14194,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type '{ onDelete: () => void; placeholder: string; disabled: boolean; onKeyDown: (e: any) => void; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'onDelete' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":14453,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[7547,[{"start":248,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":300,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":362,"length":27,"messageText":"Cannot find module '@/oss/services/evaluators' or its corresponding type declarations.","category":1,"code":2307}]],[7548,[{"start":242,"length":32,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations' or its corresponding type declarations.","category":1,"code":2307},{"start":301,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":360,"length":37,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators/types' or its corresponding type declarations.","category":1,"code":2307},{"start":447,"length":32,"messageText":"Cannot find module '@/oss/services/annotations/api' or its corresponding type declarations.","category":1,"code":2307},{"start":876,"length":38,"messageText":"Cannot find module '@/oss/contexts/observability.context' or its corresponding type declarations.","category":1,"code":2307},{"start":3020,"length":120,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ annotations: AnnotationDto[]; updatedMetrics: UpdatedMetricsType; evaluators: any; }' is not assignable to parameter of type '{ annotations: AnnotationDto[]; updatedMetrics: Record>; evaluators: EvaluatorDto[]; invocationStepKey: string; testsetId?: string | undefined; testcaseId?: string | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'invocationStepKey' is missing in type '{ annotations: AnnotationDto[]; updatedMetrics: UpdatedMetricsType; evaluators: any; }' but required in type '{ annotations: AnnotationDto[]; updatedMetrics: Record>; evaluators: EvaluatorDto[]; invocationStepKey: string; testsetId?: string | undefined; testcaseId?: string | undefined; }'.","category":1,"code":2741}]},"relatedInformation":[{"file":"./oss/src/components/pages/observability/drawer/annotatedrawer/assets/transforms.ts","start":9010,"length":17,"messageText":"'invocationStepKey' is declared here.","category":3,"code":2728}]},{"start":4086,"length":230,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ updatedMetrics: UpdatedMetricsType; selectedEvaluators: string[]; evaluators: EvaluatorDto[]; traceSpanIds: AnnotateDrawerIdsType; }' is not assignable to parameter of type '{ updatedMetrics: Record>; selectedEvaluators: string[]; evaluators: EvaluatorDto[]; traceSpanIds: { traceId: string; spanId: string; }; invocationStepKey: string; testsetId?: string | undefined; testcaseId?: string | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'invocationStepKey' is missing in type '{ updatedMetrics: UpdatedMetricsType; selectedEvaluators: string[]; evaluators: EvaluatorDto[]; traceSpanIds: AnnotateDrawerIdsType; }' but required in type '{ updatedMetrics: Record>; selectedEvaluators: string[]; evaluators: EvaluatorDto[]; traceSpanIds: { traceId: string; spanId: string; }; invocationStepKey: string; testsetId?: string | undefined; testcaseId?: string | undefined; }'.","category":1,"code":2741}]},"relatedInformation":[{"file":"./oss/src/components/pages/observability/drawer/annotatedrawer/assets/transforms.ts","start":12364,"length":17,"messageText":"'invocationStepKey' is declared here.","category":3,"code":2728}]}]],[7549,[{"start":172,"length":37,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Drawer' or its corresponding type declarations.","category":1,"code":2307},{"start":239,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":300,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":365,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":3017,"length":2,"messageText":"Parameter 'ev' implicitly has an 'any' type.","category":1,"code":7006},{"start":3021,"length":3,"messageText":"Parameter 'idx' implicitly has an 'any' type.","category":1,"code":7006}]],[7550,[{"start":145,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307},{"start":327,"length":4,"messageText":"Property 'icon' does not exist on type 'AnnotateDrawerButtonProps'.","category":1,"code":2339}]],[7552,[{"start":69,"length":35,"messageText":"Cannot find module '@/oss/components/ui/CustomAntdTag' or its corresponding type declarations.","category":1,"code":2307},{"start":131,"length":35,"messageText":"Cannot find module '@/oss/components/ui/UserAvatarTag' or its corresponding type declarations.","category":1,"code":2307},{"start":197,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":251,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307}]],[7553,[{"start":346,"length":35,"messageText":"Cannot find module '@/oss/components/ui/CustomAntdTag' or its corresponding type declarations.","category":1,"code":2307},{"start":410,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":475,"length":31,"messageText":"Cannot find module '@/oss/lib/hooks/useEvaluators' or its corresponding type declarations.","category":1,"code":2307},{"start":530,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1743,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006},{"start":4710,"length":12,"messageText":"'record.value' is of type 'unknown'.","category":1,"code":18046},{"start":7517,"length":11,"code":2345,"category":1,"messageText":"Argument of type 'unknown' is not assignable to parameter of type 'AnnotationDto[]'."},{"start":7771,"length":10,"code":2322,"category":1,"messageText":"Type 'unknown' is not assignable to type 'readonly AnnotationDto[] | undefined'.","relatedInformation":[{"file":"./node_modules/.pnpm/antd@5.26.1_date-fns@3.6.0_react-dom@19.0.0_react@19.0.0__react@19.0.0/node_modules/antd/es/table/internaltable.d.ts","start":718,"length":10,"messageText":"The expected type comes from property 'dataSource' which is declared here on type 'IntrinsicAttributes & TableProps & { children?: ReactNode; } & RefAttributes'","category":3,"code":6500}]}]],[7554,[{"start":77,"length":38,"messageText":"Cannot find module '@/oss/components/ResultTag/ResultTag' or its corresponding type declarations.","category":1,"code":2307},{"start":146,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":207,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7555,[{"start":470,"length":40,"messageText":"Cannot find module '@/oss/components/CopyButton/CopyButton' or its corresponding type declarations.","category":1,"code":2307},{"start":537,"length":32,"messageText":"Cannot find module '@/oss/components/GenericDrawer' or its corresponding type declarations.","category":1,"code":2307},{"start":596,"length":46,"messageText":"Cannot find module '@/oss/components/Layout/ThemeContextProvider' or its corresponding type declarations.","category":1,"code":2307},{"start":669,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":727,"length":31,"messageText":"Cannot find module '@/oss/hooks/useResizeObserver' or its corresponding type declarations.","category":1,"code":2307},{"start":814,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":876,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":994,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1503,"length":4,"messageText":"Parameter 'rect' implicitly has an 'any' type.","category":1,"code":7006},{"start":7073,"length":3,"messageText":"Parameter 'key' implicitly has an 'any' type.","category":1,"code":7006}]],[7556,[{"start":269,"length":40,"messageText":"Cannot find module '@/oss/components/TooltipWithCopyAction' or its corresponding type declarations.","category":1,"code":2307},{"start":337,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":391,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7557,[{"start":144,"length":38,"messageText":"Cannot find module '@/oss/contexts/observability.context' or its corresponding type declarations.","category":1,"code":2307},{"start":209,"length":35,"messageText":"Cannot find module '@/oss/services/observability/core' or its corresponding type declarations.","category":1,"code":2307}]],[7558,[{"start":253,"length":40,"messageText":"Cannot find module '@/oss/components/TooltipWithCopyAction' or its corresponding type declarations.","category":1,"code":2307},{"start":329,"length":38,"messageText":"Cannot find module '@/oss/contexts/observability.context' or its corresponding type declarations.","category":1,"code":2307},{"start":403,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7559,[{"start":194,"length":35,"messageText":"Cannot find module '@/oss/components/ui/CustomAntdTag' or its corresponding type declarations.","category":1,"code":2307},{"start":256,"length":35,"messageText":"Cannot find module '@/oss/components/ui/UserAvatarTag' or its corresponding type declarations.","category":1,"code":2307},{"start":322,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":392,"length":47,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/assets/helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":468,"length":38,"messageText":"Cannot find module '@/oss/lib/hooks/useAnnotations/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1251,"length":10,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 2, '(o: { [s: string]: unknown; } | ArrayLike): [string, unknown][]', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type 'unknown' is not assignable to parameter of type '{ [s: string]: unknown; } | ArrayLike'.","category":1,"code":2345}]},{"messageText":"Overload 2 of 2, '(o: {}): [string, any][]', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type 'unknown' is not assignable to parameter of type '{}'.","category":1,"code":2345}]}]},"relatedInformation":[]},{"start":1307,"length":6,"messageText":"'metric' is of type 'unknown'.","category":1,"code":18046},{"start":2921,"length":6,"messageText":"'metric' is of type 'unknown'.","category":1,"code":18046},{"start":3696,"length":6,"messageText":"'metric' is of type 'unknown'.","category":1,"code":18046},{"start":5577,"length":6,"messageText":"'metric' is of type 'unknown'.","category":1,"code":18046}]],[7560,[{"start":52,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7561,[{"start":168,"length":38,"messageText":"Cannot find module '@/oss/components/ResultTag/ResultTag' or its corresponding type declarations.","category":1,"code":2307},{"start":269,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":336,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7562,[{"start":150,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":177,"length":21,"messageText":"Module '\"../../ObservabilityDashboard\"' has no exported member 'TracesWithAnnotations'. Did you mean to use 'import TracesWithAnnotations from \"../../ObservabilityDashboard\"' instead?","category":1,"code":2614}]],[7564,[{"start":322,"length":41,"messageText":"Cannot find module '@/oss/components/ui/CustomTreeComponent' or its corresponding type declarations.","category":1,"code":2307},{"start":426,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":508,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307}]],[7565,[{"start":291,"length":31,"messageText":"Cannot find module '@/oss/components/Filters/Sort' or its corresponding type declarations.","category":1,"code":2307},{"start":350,"length":51,"messageText":"Cannot find module '@/oss/components/Playground/assets/EnhancedButton' or its corresponding type declarations.","category":1,"code":2307},{"start":429,"length":28,"messageText":"Cannot find module '@/oss/contexts/app.context' or its corresponding type declarations.","category":1,"code":2307},{"start":493,"length":38,"messageText":"Cannot find module '@/oss/contexts/observability.context' or its corresponding type declarations.","category":1,"code":2307},{"start":558,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":610,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":685,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":785,"length":30,"messageText":"Cannot find module '@/oss/lib/helpers/formatters' or its corresponding type declarations.","category":1,"code":2307},{"start":842,"length":41,"messageText":"Cannot find module '@/oss/lib/helpers/observability_helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":937,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":1165,"length":38,"messageText":"Cannot find module '@/oss/components/Filters/EditColumns' or its corresponding type declarations.","category":1,"code":2307},{"start":1257,"length":34,"messageText":"Cannot find module '@/oss/components/Filters/Filters' or its corresponding type declarations.","category":1,"code":2307},{"start":1342,"length":31,"messageText":"Cannot find module '@/oss/components/Filters/Sort' or its corresponding type declarations.","category":1,"code":2307},{"start":2687,"length":11,"messageText":"Parameter 'prevFilters' implicitly has an 'any' type.","category":1,"code":7006},{"start":2762,"length":1,"messageText":"Parameter 'f' implicitly has an 'any' type.","category":1,"code":7006},{"start":3150,"length":11,"messageText":"Parameter 'prevFilters' implicitly has an 'any' type.","category":1,"code":7006},{"start":3186,"length":1,"messageText":"Parameter 'f' implicitly has an 'any' type.","category":1,"code":7006},{"start":3590,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3683,"length":11,"messageText":"Parameter 'prevFilters' implicitly has an 'any' type.","category":1,"code":7006},{"start":3719,"length":1,"messageText":"Parameter 'f' implicitly has an 'any' type.","category":1,"code":7006},{"start":3886,"length":1,"messageText":"Parameter 'f' implicitly has an 'any' type.","category":1,"code":7006},{"start":4705,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":4861,"length":11,"messageText":"Parameter 'prevFilters' implicitly has an 'any' type.","category":1,"code":7006},{"start":4897,"length":1,"messageText":"Parameter 'f' implicitly has an 'any' type.","category":1,"code":7006},{"start":5133,"length":1,"messageText":"Parameter 'f' implicitly has an 'any' type.","category":1,"code":7006},{"start":5191,"length":4,"messageText":"Parameter 'prev' implicitly has an 'any' type.","category":1,"code":7006},{"start":7702,"length":5,"messageText":"Parameter 'trace' implicitly has an 'any' type.","category":1,"code":7006},{"start":10285,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '{ filterData: any; columns: { type: string; value: string; label: string; }[]; onApplyFilter: (newFilters: Filter[]) => void; onClearFilter: (filter: Filter[]) => void; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'filterData' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":10532,"length":11,"code":2322,"category":1,"messageText":{"messageText":"Type '{ onSortApply: ({ type, sorted, customRange }: SortResult) => void; defaultSortValue: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'onSortApply' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}},{"start":13957,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type '{ isOpen: boolean; handleOpenChange: Dispatch>; selectedKeys: string[]; columns: ColumnsType; onChange: (key: string) => void; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'isOpen' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],[7566,[{"start":141,"length":33,"messageText":"Cannot find module '@/oss/components/EmptyComponent' or its corresponding type declarations.","category":1,"code":2307},{"start":198,"length":22,"messageText":"Cannot find module '@/oss/hooks/useAppId' or its corresponding type declarations.","category":1,"code":2307}]],[7567,[{"start":212,"length":32,"messageText":"Cannot find module '@/oss/components/GenericDrawer' or its corresponding type declarations.","category":1,"code":2307},{"start":317,"length":38,"messageText":"Cannot find module '@/oss/contexts/observability.context' or its corresponding type declarations.","category":1,"code":2307},{"start":384,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":433,"length":41,"messageText":"Cannot find module '@/oss/lib/helpers/observability_helpers' or its corresponding type declarations.","category":1,"code":2307},{"start":533,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":2227,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006}]],[7568,[{"start":211,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":292,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":368,"length":31,"messageText":"Cannot find module '@/oss/services/deployment/api' or its corresponding type declarations.","category":1,"code":2307}]],[7569,[{"start":244,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":318,"length":72,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus/components/EnvironmentStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":429,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":485,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":566,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7570,[{"start":183,"length":33,"messageText":"Cannot find module '@/oss/components/DeploymentCard' or its corresponding type declarations.","category":1,"code":2307},{"start":247,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":328,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7571,[{"start":56,"length":40,"messageText":"Cannot find module '@/oss/components/CopyButton/CopyButton' or its corresponding type declarations.","category":1,"code":2307},{"start":119,"length":45,"messageText":"Cannot find module '@/oss/components/DynamicCodeBlock/CodeBlock' or its corresponding type declarations.","category":1,"code":2307}]],[7573,[{"start":196,"length":43,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":264,"length":72,"messageText":"Cannot find module '@/oss/components/VariantDetailsWithStatus/components/EnvironmentStatus' or its corresponding type declarations.","category":1,"code":2307},{"start":375,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":431,"length":44,"messageText":"Cannot find module '@/oss/lib/shared/variant/transformer/types' or its corresponding type declarations.","category":1,"code":2307},{"start":502,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7575,[{"start":234,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":300,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":354,"length":24,"messageText":"Cannot find module '@/oss/hooks/useLoading' or its corresponding type declarations.","category":1,"code":2307},{"start":409,"length":35,"messageText":"Cannot find module '@/oss/lib/helpers/copyToClipboard' or its corresponding type declarations.","category":1,"code":2307},{"start":466,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":546,"length":28,"messageText":"Cannot find module '@/oss/services/apiKeys/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1150,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":2322,"length":4,"messageText":"Binding element 'data' implicitly has an 'any' type.","category":1,"code":7031}]],[7576,[{"start":234,"length":27,"messageText":"Cannot find module '@/oss/components/LLMIcons' or its corresponding type declarations.","category":1,"code":2307},{"start":298,"length":64,"messageText":"Cannot find module '@/oss/components/ModelRegistry/Drawers/ConfigureProviderDrawer' or its corresponding type declarations.","category":1,"code":2307},{"start":398,"length":62,"messageText":"Cannot find module '@/oss/components/ModelRegistry/Modals/ConfigureProviderModal' or its corresponding type declarations.","category":1,"code":2307},{"start":493,"length":59,"messageText":"Cannot find module '@/oss/components/ModelRegistry/Modals/DeleteProviderModal' or its corresponding type declarations.","category":1,"code":2307},{"start":582,"length":28,"messageText":"Cannot find module '@/oss/hooks/useVaultSecret' or its corresponding type declarations.","category":1,"code":2307},{"start":635,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":696,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/llmProviders' or its corresponding type declarations.","category":1,"code":2307}]],[7578,[{"start":59,"length":32,"messageText":"Cannot find module '@/oss/components/Avatar/Avatar' or its corresponding type declarations.","category":1,"code":2307}]],[7579,[{"start":301,"length":40,"messageText":"Cannot find module '@/oss/components/AlertPopup/AlertPopup' or its corresponding type declarations.","category":1,"code":2307},{"start":367,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":429,"length":30,"messageText":"Cannot find module '@/oss/lib/atoms/organization' or its corresponding type declarations.","category":1,"code":2307},{"start":501,"length":46,"messageText":"Cannot find module '@/oss/lib/helpers/useSubscriptionDataWrapper' or its corresponding type declarations.","category":1,"code":2307},{"start":583,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":634,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":697,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":837,"length":30,"messageText":"Cannot find module '@/oss/services/workspace/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1502,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":4814,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":4878,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":5446,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":5805,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":6959,"length":4,"messageText":"Parameter 'role' implicitly has an 'any' type.","category":1,"code":7006}]],[7581,[{"start":292,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":347,"length":27,"messageText":"Cannot find module '@/oss/hooks/useLazyEffect' or its corresponding type declarations.","category":1,"code":2307},{"start":408,"length":30,"messageText":"Cannot find module '@/oss/lib/atoms/organization' or its corresponding type declarations.","category":1,"code":2307},{"start":480,"length":46,"messageText":"Cannot find module '@/oss/lib/helpers/useSubscriptionDataWrapper' or its corresponding type declarations.","category":1,"code":2307},{"start":562,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":607,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":657,"length":30,"messageText":"Cannot find module '@/oss/services/workspace/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1241,"length":4,"messageText":"Parameter 'role' implicitly has an 'any' type.","category":1,"code":7006},{"start":1764,"length":9,"messageText":"Parameter 'responses' implicitly has an 'any' type.","category":1,"code":7006},{"start":5346,"length":4,"messageText":"Parameter 'role' implicitly has an 'any' type.","category":1,"code":7006}]],[7582,[{"start":341,"length":28,"messageText":"Cannot find module '@/oss/contexts/org.context' or its corresponding type declarations.","category":1,"code":2307},{"start":399,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":460,"length":22,"messageText":"Cannot find module '@/oss/hooks/useQuery' or its corresponding type declarations.","category":1,"code":2307},{"start":516,"length":30,"messageText":"Cannot find module '@/oss/lib/atoms/organization' or its corresponding type declarations.","category":1,"code":2307},{"start":571,"length":34,"messageText":"Cannot find module '@/oss/lib/helpers/dateTimeHelper' or its corresponding type declarations.","category":1,"code":2307},{"start":649,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":705,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":756,"length":33,"messageText":"Cannot find module '@/oss/services/organization/api' or its corresponding type declarations.","category":1,"code":2307},{"start":844,"length":30,"messageText":"Cannot find module '@/oss/services/workspace/api' or its corresponding type declarations.","category":1,"code":2307},{"start":2468,"length":6,"messageText":"Parameter 'member' implicitly has an 'any' type.","category":1,"code":7006},{"start":7466,"length":4,"messageText":"Parameter 'prev' implicitly has an 'any' type.","category":1,"code":7006}]],[7585,[{"start":98,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7586,[{"start":264,"length":52,"messageText":"Cannot find module '@/oss/code_snippets/testsets/create_with_json/curl' or its corresponding type declarations.","category":1,"code":2307},{"start":340,"length":54,"messageText":"Cannot find module '@/oss/code_snippets/testsets/create_with_json/python' or its corresponding type declarations.","category":1,"code":2307},{"start":414,"length":58,"messageText":"Cannot find module '@/oss/code_snippets/testsets/create_with_json/typescript' or its corresponding type declarations.","category":1,"code":2307},{"start":500,"length":54,"messageText":"Cannot find module '@/oss/code_snippets/testsets/create_with_upload/curl' or its corresponding type declarations.","category":1,"code":2307},{"start":584,"length":56,"messageText":"Cannot find module '@/oss/code_snippets/testsets/create_with_upload/python' or its corresponding type declarations.","category":1,"code":2307},{"start":666,"length":60,"messageText":"Cannot find module '@/oss/code_snippets/testsets/create_with_upload/typescript' or its corresponding type declarations.","category":1,"code":2307},{"start":750,"length":40,"messageText":"Cannot find module '@/oss/components/CopyButton/CopyButton' or its corresponding type declarations.","category":1,"code":2307},{"start":813,"length":45,"messageText":"Cannot find module '@/oss/components/DynamicCodeBlock/CodeBlock' or its corresponding type declarations.","category":1,"code":2307},{"start":889,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":938,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7587,[{"start":293,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":411,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307}]],[7588,[{"start":214,"length":28,"messageText":"Cannot find module '@/oss/lib/helpers/evaluate' or its corresponding type declarations.","category":1,"code":2307},{"start":265,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":312,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307}]],[7589,[{"start":330,"length":32,"messageText":"Cannot find module '@/oss/lib/helpers/errorHandler' or its corresponding type declarations.","category":1,"code":2307},{"start":409,"length":37,"messageText":"Cannot find module '@/oss/lib/helpers/fileManipulations' or its corresponding type declarations.","category":1,"code":2307},{"start":485,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":553,"length":29,"messageText":"Cannot find module '@/oss/services/testsets/api' or its corresponding type declarations.","category":1,"code":2307}]],[7590,[{"start":101,"length":36,"messageText":"Cannot find module '@/oss/components/EnhancedUIs/Modal' or its corresponding type declarations.","category":1,"code":2307},{"start":181,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7591,[{"start":107,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307}]],[7592,[{"start":124,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":173,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]],[7593,[{"start":149,"length":36,"messageText":"Cannot find module '@/oss/services/observability/types' or its corresponding type declarations.","category":1,"code":2307},{"start":3524,"length":5,"messageText":"Parameter 'child' implicitly has an 'any' type.","category":1,"code":7006},{"start":3531,"length":5,"messageText":"Parameter 'index' implicitly has an 'any' type.","category":1,"code":7006}]],[7594,[{"start":170,"length":32,"messageText":"Cannot find module '@/oss/contexts/profile.context' or its corresponding type declarations.","category":1,"code":2307},{"start":228,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307},{"start":282,"length":30,"messageText":"Cannot find module '@/oss/hooks/useStateCallback' or its corresponding type declarations.","category":1,"code":2307},{"start":343,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307},{"start":408,"length":33,"messageText":"Cannot find module '@/oss/services/organization/api' or its corresponding type declarations.","category":1,"code":2307},{"start":1837,"length":4,"messageText":"Parameter 'orgs' implicitly has an 'any' type.","category":1,"code":7006},{"start":1924,"length":5,"messageText":"Parameter 'error' implicitly has an 'any' type.","category":1,"code":7006},{"start":3210,"length":3,"messageText":"Parameter 'org' implicitly has an 'any' type.","category":1,"code":7006},{"start":3341,"length":4,"messageText":"Parameter 'data' implicitly has an 'any' type.","category":1,"code":7006}]],[7595,[{"start":114,"length":24,"messageText":"Cannot find module '@/oss/hooks/useSession' or its corresponding type declarations.","category":1,"code":2307},{"start":168,"length":30,"messageText":"Cannot find module '@/oss/hooks/useStateCallback' or its corresponding type declarations.","category":1,"code":2307},{"start":220,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":277,"length":24,"messageText":"Cannot find module '@/oss/services/project' or its corresponding type declarations.","category":1,"code":2307},{"start":333,"length":30,"messageText":"Cannot find module '@/oss/services/project/types' or its corresponding type declarations.","category":1,"code":2307},{"start":1962,"length":1,"messageText":"Parameter 'p' implicitly has an 'any' type.","category":1,"code":7006}]],[7598,[{"start":113,"length":34,"messageText":"Cannot find module '@/oss/lib/api/assets/axiosConfig' or its corresponding type declarations.","category":1,"code":2307},{"start":453,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":553,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":692,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006},{"start":826,"length":3,"messageText":"Parameter 'res' implicitly has an 'any' type.","category":1,"code":7006}]],[7625,[{"start":162,"length":29,"messageText":"Cannot find module '@/oss/config/frontendConfig' or its corresponding type declarations.","category":1,"code":2307}]],[7628,[{"start":29,"length":35,"messageText":"Cannot find module '@/oss/components/PlaygroundRouter' or its corresponding type declarations.","category":1,"code":2307}]],[7629,[{"start":164,"length":32,"messageText":"Cannot find module '@/oss/contexts/project.context' or its corresponding type declarations.","category":1,"code":2307},{"start":227,"length":25,"messageText":"Cannot find module '@/oss/lib/helpers/utils' or its corresponding type declarations.","category":1,"code":2307},{"start":279,"length":17,"messageText":"Cannot find module '@/oss/lib/Types' or its corresponding type declarations.","category":1,"code":2307}]]],"affectedFilesPendingEmit":[1238,1263,1264,5880,5881,5882,5883,5986,5988,5987,1265,5879,5982,5983,5984,5985,5989,5990,5991,5993,1266,5997,1354,1357,1352,1358,1353,1359,6017,1360,4423,6031,6032,6003,6007,6021,1362,6034,6010,6015,6016,6012,6013,6014,1361,1364,6023,6009,1363,6024,6027,4430,4431,1365,6025,5999,5998,6006,6004,6005,6002,6000,6001,4419,1366,6020,1367,1368,6022,6028,1369,4429,4428,1371,1386,5273,4433,5270,6035,5271,5272,4434,4432,5274,6029,5276,6030,1370,6033,5277,5878,6465,5278,5283,6470,6468,6480,6469,6471,6472,6467,6477,6478,6479,6474,5282,6473,6476,5284,6484,6485,6488,6495,6489,6490,5288,6491,6492,5289,6493,5287,6518,5286,6496,6519,5285,6524,6525,6628,6629,5297,5298,6630,6501,5296,6633,6503,6631,6632,6504,6502,5295,6505,6506,6507,6508,6511,6510,6634,6509,6635,6460,6636,6637,6461,6494,6462,6464,6463,5292,5293,6497,5294,6515,6516,6512,6513,6514,6517,5291,6627,6638,6641,6639,6640,6642,6643,6651,6644,5299,6645,5300,6647,6648,6646,6650,6649,5290,6520,6521,6475,6522,6523,5302,5323,5324,5325,5388,5387,1338,1346,1316,5390,1315,6653,1347,1343,1345,1317,1313,1351,1336,1340,1341,1344,1342,1339,1312,1306,1335,1350,1337,1349,1348,5389,1311,6011,5391,5392,1308,5382,1309,1307,5386,4422,4421,5383,5385,5384,1310,5393,6652,5394,5304,5303,5305,5306,5397,5400,5401,5402,5395,5403,5404,5399,5396,6659,6661,6667,6669,6671,6670,6672,6673,6674,6676,6941,6943,6945,6665,6948,6950,6951,6663,6953,6954,6956,6960,6958,6962,6963,5405,5408,5407,5406,5411,5412,5409,5413,5414,5419,5418,5420,5421,5423,5422,1262,5430,5432,5436,5441,5443,5445,5446,5448,5449,5447,5451,5453,5454,5457,5456,5455,1237,5458,5459,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,6964,6965,6026,6486,5471,7007,7011,7012,7015,7009,7016,7018,7033,7024,7025,7026,7027,7028,7029,7030,7031,7034,7036,7037,5472,7080,5511,5473,5474,7081,5481,7070,5482,5478,5479,5480,7061,7062,7063,7064,7065,5514,7066,7067,7068,7069,5513,5512,5515,5516,5517,5518,5519,5522,5523,5521,7059,7079,7060,5476,5477,7078,7053,5524,7082,7083,7084,5992,7086,7087,5525,7017,5526,5527,7091,7089,7090,7092,7125,5528,7121,7131,7010,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7132,7459,7461,7462,5529,7460,7463,7464,7465,7466,7467,5530,7468,7469,7470,5598,5599,7519,7522,7520,7521,7523,7524,7526,7527,7528,7525,5600,7535,7530,7529,5601,7122,7124,7123,7531,7532,7533,7534,7536,5602,7537,7538,7539,7540,7541,5603,7566,7543,7565,5604,7544,7560,7557,7542,6018,6019,7550,7548,1355,7546,5606,7547,1202,7545,1356,5605,7549,5607,7555,5608,7552,7553,7554,7556,5609,5610,7558,7562,5611,7551,7559,5612,7561,5613,7564,5614,7563,7567,7569,7571,5615,5616,7572,7568,7570,7032,7573,7574,7575,5617,7576,7577,7578,7579,7583,7580,7581,7584,7582,7585,7586,7587,7588,7590,7589,7471,6906,7477,7478,7479,1108,5550,4418,5551,5552,5554,5553,5555,6903,6692,4426,5531,4424,4425,6933,7472,5532,7473,6709,6927,6917,6918,6921,6919,6920,6914,6916,6915,6926,6925,5533,6924,6922,6923,6719,6718,5534,6716,6717,5537,6712,6714,6720,5536,6715,5535,6930,6707,6713,6711,5538,6931,5539,6708,4427,6710,6932,6934,5540,6904,5541,6905,5542,6694,6928,5543,6929,6907,6911,6912,5544,6913,6908,6909,6910,6695,7474,6696,6703,6697,5545,6698,6699,5546,6691,7475,5547,5548,6705,6693,6700,7476,6701,6702,6685,6704,6706,6684,7480,5556,5573,5557,5572,5574,5575,5585,5577,5576,5578,5579,5582,5583,5584,5588,5581,5580,6939,5589,7484,7481,7482,7483,7486,7485,5590,7489,7487,7488,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,5591,6940,6946,7500,5592,7501,5593,7502,7503,6466,7504,5594,7126,7127,7128,7129,7130,7505,7506,7507,7508,7510,7509,7511,7512,7088,7591,5618,7593,7592,6487,6481,6482,6483,5597,7022,7019,5595,7020,7021,7023,5596,7518,7513,7517,7516,7514,7515,5619,5620,5684,7596,7597,7594,5700,7595,5685,5686,5687,5689,5690,5691,5692,5693,5688,5694,5695,5696,5697,5698,5699,5701,5377,7598,5702,5703,5704,5705,5706,1223,7618,7619,5721,5723,5724,5722,7625,5398,5707,5708,5379,5380,5318,5319,5709,5308,5309,5710,5714,5715,5716,5717,5718,5320,5719,5720,5713,5731,5732,5712,5733,5734,5730,7626,5725,5726,5735,5736,5737,5728,5727,5558,5560,5559,5729,7627,5738,5565,5566,5568,5564,5567,5562,5563,5569,5830,5571,5561,5828,5831,5825,5587,5826,5829,5570,5832,5827,5586,5381,1224,5833,5834,6658,6660,6666,6668,6675,7628,6942,6944,6664,6947,6949,6662,6952,6955,6959,6957,6961,5836,5835,5837,5838,5840,5841,7629,5842,5843,5844,5845,5847,5846,5848,5849,5851,5850,5852,5853,5854,5855,1261,5856,5429,5857,5431,5433,5858,5435,5434,5438,5437,5440,5859,5439,5442,5860,5444,5861,5450,5862,5863,5452,5867,5865,5866,1220,5871,5872,5873,5424,5427,5874,1234,5425,5426,5876,5875,5877,5870,5869,5428,5868],"version":"5.8.3"} \ No newline at end of file